@sourcegraph/amp 0.0.1772551124-g74cdbd → 0.0.1772554299-gc34377

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 (2) hide show
  1. package/dist/main.js +10 -10
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -5901,11 +5901,11 @@ ${W}`))}},error:(G)=>{if(!F)F=!0,V(Error(`Failed to spawn brew: ${G.message}`))}
5901
5901
  ${W}`;if(X==="pnpm"&&W.includes("Unable to find the global bin directory"))H+=`
5902
5902
 
5903
5903
  Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
5904
- npm install -g @sourcegraph/amp`;V(Error(H))}},error:(G)=>{if(!q)q=!0,V(Error(`Failed to spawn ${X}: ${G.message}`))},complete:()=>{if(!q)q=!0,K()}})})}h0();h0();aA();async function y30(J,Z){let X=`${Z||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,U=new AbortController,K=setTimeout(()=>U.abort(),5000);try{let V=await fetch(X,{signal:U.signal});if(!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let D=await V.json(),z=D.version??D["dist-tags"]?.latest;if(!z)return{hasUpdate:!1,currentVersion:J,source:"npm"};let q=pQ4(J,z),F=q<0,G,W;if(D.time){let H=D.time[J],B=D.time[z],w=Date.now();if(H)G=Math.floor((w-new Date(H).getTime())/3600000);if(B)W=Math.floor((w-new Date(B).getTime())/3600000)}return P.info("NPM version comparison",{currentVersion:J,latestVersion:z,compareResult:q,hasUpdate:F,currentVersionAge:G,latestVersionAge:W}),{hasUpdate:F,latestVersion:z,currentVersion:J,currentVersionAge:G,latestVersionAge:W,source:"npm"}}catch(V){return P.debug("Error checking npm version",{error:V}),{hasUpdate:!1,currentVersion:J,source:"npm"}}finally{clearTimeout(K)}}var Pw5="https://storage.googleapis.com/amp-public-assets-prod-0/cli/cli-version.txt";async function u30(J){let Z=new AbortController,Q=setTimeout(()=>Z.abort(),5000);try{let Y=await fetch(`${Pw5}?t=${Date.now()}`,{signal:Z.signal,cache:"no-store"});if(!Y.ok)return{hasUpdate:!1,currentVersion:J,source:"bin"};let X=(await Y.text()).trim();if(!X||!/^\d+\.\d+\.\d+/.test(X))return{hasUpdate:!1,currentVersion:J,source:"bin"};let U=pQ4(J,X),K=U<0;return P.info("Bin version comparison",{currentVersion:J,latestVersion:X,compareResult:U,hasUpdate:K}),{hasUpdate:K,latestVersion:X,currentVersion:J,source:"bin"}}catch(Y){return P.debug("Error checking bin version",{error:Y}),{hasUpdate:!1,currentVersion:J,source:"bin"}}finally{clearTimeout(Q)}}var Cw5=604800000;function gQ4(J){if(!J)return null;let Z=typeof J==="number"?J:new Date(J).getTime();if(isNaN(Z))return null;let Q=Date.now()-Z;if(Q>Cw5)return{ageMs:Q};return null}function pQ4(J,Z){let Q=(K)=>{let[V,D]=K.split("-");return{parts:V?.split(".").map(Number)||[],label:D}},Y=Q(J),X=Q(Z),U=Math.max(Y.parts.length,X.parts.length);for(let K=0;K<U;K++){let V=Y.parts[K]||0,D=X.parts[K]||0;if(V<D)return-1;if(V>D)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}function ny0(J){try{let Z=J.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Z)return null;let Q=parseInt(Z[1],10)*1000,Y=Z[2],X=Q!==0?VG(Q):void 0;return{sha:Y,age:X}}catch{return null}}W1();function ay0(J,Z,Q={}){let Y=new X4,X=Y.pipe(L6({shouldCountRefs:!1}));return setImmediate(async()=>{let U=new FK().scoped("update"),K=Q.startDelayMs??0;if(K>0)await dK(K);let V=X.subscribe({next:(D)=>{U.debug("emit new state",D)}});try{let D=process.env.AMP_TEST_UPDATE_STATUS;if(D){U.debug("using fake update status for testing",{status:D}),await dK(500),Y.next(D);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){U.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let z=await Z.get("updates.mode");if(z==="disabled"){U.debug("checking disabled");return}let q=await k30(),F=q==="binary"||q==="brew";U.debug("checking",{currentVersion:J,mode:z,packageManager:q,isBinaryDistribution:F});let G=F?await u30(J):await y30(J,WE());if(!(G.latestVersion&&G.hasUpdate)){U.debug("no update available");return}let W=()=>{if(G.currentVersionAge!==void 0&&G.latestVersionAge!==void 0){let H=G.currentVersionAge-G.latestVersionAge,B=0.5;if(Math.abs(H)<0.5)return U.debug("versions too close together, suppressing update warning",{currentVersionAge:G.currentVersionAge,latestVersionAge:G.latestVersionAge,ageDifferenceHours:H}),!0}return!1};if(!z)z=q==="pnpm"?"warn":"auto",U.debug("no configured update mode; selected default based on package manager",{packageManager:q,mode:z});if(q==="brew"){if(!W())Y.next("update-available-brew");return}if(q==="binary"&&process.execPath!==gy0()){if(U.debug("non-standard binary path, showing warning"),!W())Y.next("update-available-unrecognized-path");return}if(z==="warn"){if(!W())Y.next("update-available");return}if(!q){if(U.debug("auto-update not supported, falling back to warn mode"),!W())Y.next("update-available");return}if(q==="binary"&&process.platform==="win32"){if(U.debug("binary auto-update not supported on Windows, falling back to warn mode"),!W())Y.next("update-available");return}try{await Ym(G.latestVersion,q);let H=await gW(G.latestVersion),B={from:G.currentVersion,to:G.latestVersion,...H};if(H.status==="same")U.info("success",B),Y.next("updated");else U.warn("success with warning",B),Y.next("updated-with-warning")}catch(H){Y.next("update-error")}}catch(D){U.debug("check failed",{error:D})}finally{await dK(5000),Y.next("hidden"),V.unsubscribe(),Y.complete()}}),{state:X}}aA();import{stderr as uV}from"node:process";function dQ4(J){let Z=new CW().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await fy0(Y.force||!1,Y.verbose||!1,"0.0.1772551124-g74cdbd"),process.exit()});J.addCommand(Z,{hidden:!0});let Q=new CW("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await Tw5(Y.targetVersion)});J.addCommand(Q)}async function Tw5(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")uV.write(Z1.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5904
+ npm install -g @sourcegraph/amp`;V(Error(H))}},error:(G)=>{if(!q)q=!0,V(Error(`Failed to spawn ${X}: ${G.message}`))},complete:()=>{if(!q)q=!0,K()}})})}h0();h0();aA();async function y30(J,Z){let X=`${Z||"https://registry.npmjs.org"}/@sourcegraph/amp/latest`,U=new AbortController,K=setTimeout(()=>U.abort(),5000);try{let V=await fetch(X,{signal:U.signal});if(!V.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let D=await V.json(),z=D.version??D["dist-tags"]?.latest;if(!z)return{hasUpdate:!1,currentVersion:J,source:"npm"};let q=pQ4(J,z),F=q<0,G,W;if(D.time){let H=D.time[J],B=D.time[z],w=Date.now();if(H)G=Math.floor((w-new Date(H).getTime())/3600000);if(B)W=Math.floor((w-new Date(B).getTime())/3600000)}return P.info("NPM version comparison",{currentVersion:J,latestVersion:z,compareResult:q,hasUpdate:F,currentVersionAge:G,latestVersionAge:W}),{hasUpdate:F,latestVersion:z,currentVersion:J,currentVersionAge:G,latestVersionAge:W,source:"npm"}}catch(V){return P.debug("Error checking npm version",{error:V}),{hasUpdate:!1,currentVersion:J,source:"npm"}}finally{clearTimeout(K)}}var Pw5="https://storage.googleapis.com/amp-public-assets-prod-0/cli/cli-version.txt";async function u30(J){let Z=new AbortController,Q=setTimeout(()=>Z.abort(),5000);try{let Y=await fetch(`${Pw5}?t=${Date.now()}`,{signal:Z.signal,cache:"no-store"});if(!Y.ok)return{hasUpdate:!1,currentVersion:J,source:"bin"};let X=(await Y.text()).trim();if(!X||!/^\d+\.\d+\.\d+/.test(X))return{hasUpdate:!1,currentVersion:J,source:"bin"};let U=pQ4(J,X),K=U<0;return P.info("Bin version comparison",{currentVersion:J,latestVersion:X,compareResult:U,hasUpdate:K}),{hasUpdate:K,latestVersion:X,currentVersion:J,source:"bin"}}catch(Y){return P.debug("Error checking bin version",{error:Y}),{hasUpdate:!1,currentVersion:J,source:"bin"}}finally{clearTimeout(Q)}}var Cw5=604800000;function gQ4(J){if(!J)return null;let Z=typeof J==="number"?J:new Date(J).getTime();if(isNaN(Z))return null;let Q=Date.now()-Z;if(Q>Cw5)return{ageMs:Q};return null}function pQ4(J,Z){let Q=(K)=>{let[V,D]=K.split("-");return{parts:V?.split(".").map(Number)||[],label:D}},Y=Q(J),X=Q(Z),U=Math.max(Y.parts.length,X.parts.length);for(let K=0;K<U;K++){let V=Y.parts[K]||0,D=X.parts[K]||0;if(V<D)return-1;if(V>D)return 1}if(Y.label===X.label)return 0;if(!Y.label&&X.label)return 1;if(Y.label&&!X.label)return-1;if(Y.label&&X.label)return Y.label<X.label?-1:1;return 0}function ny0(J){try{let Z=J.match(/^0\.0\.(\d+)(?:-g?([a-f0-9]+))?/);if(!Z)return null;let Q=parseInt(Z[1],10)*1000,Y=Z[2],X=Q!==0?VG(Q):void 0;return{sha:Y,age:X}}catch{return null}}W1();function ay0(J,Z,Q={}){let Y=new X4,X=Y.pipe(L6({shouldCountRefs:!1}));return setImmediate(async()=>{let U=new FK().scoped("update"),K=Q.startDelayMs??0;if(K>0)await dK(K);let V=X.subscribe({next:(D)=>{U.debug("emit new state",D)}});try{let D=process.env.AMP_TEST_UPDATE_STATUS;if(D){U.debug("using fake update status for testing",{status:D}),await dK(500),Y.next(D);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){U.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let z=await Z.get("updates.mode");if(z==="disabled"){U.debug("checking disabled");return}let q=await k30(),F=q==="binary"||q==="brew";U.debug("checking",{currentVersion:J,mode:z,packageManager:q,isBinaryDistribution:F});let G=F?await u30(J):await y30(J,WE());if(!(G.latestVersion&&G.hasUpdate)){U.debug("no update available");return}let W=()=>{if(G.currentVersionAge!==void 0&&G.latestVersionAge!==void 0){let H=G.currentVersionAge-G.latestVersionAge,B=0.5;if(Math.abs(H)<0.5)return U.debug("versions too close together, suppressing update warning",{currentVersionAge:G.currentVersionAge,latestVersionAge:G.latestVersionAge,ageDifferenceHours:H}),!0}return!1};if(!z)z=q==="pnpm"?"warn":"auto",U.debug("no configured update mode; selected default based on package manager",{packageManager:q,mode:z});if(q==="brew"){if(!W())Y.next("update-available-brew");return}if(q==="binary"&&process.execPath!==gy0()){if(U.debug("non-standard binary path, showing warning"),!W())Y.next("update-available-unrecognized-path");return}if(z==="warn"){if(!W())Y.next("update-available");return}if(!q){if(U.debug("auto-update not supported, falling back to warn mode"),!W())Y.next("update-available");return}if(q==="binary"&&process.platform==="win32"){if(U.debug("binary auto-update not supported on Windows, falling back to warn mode"),!W())Y.next("update-available");return}try{await Ym(G.latestVersion,q);let H=await gW(G.latestVersion),B={from:G.currentVersion,to:G.latestVersion,...H};if(H.status==="same")U.info("success",B),Y.next("updated");else U.warn("success with warning",B),Y.next("updated-with-warning")}catch(H){Y.next("update-error")}}catch(D){U.debug("check failed",{error:D})}finally{await dK(5000),Y.next("hidden"),V.unsubscribe(),Y.complete()}}),{state:X}}aA();import{stderr as uV}from"node:process";function dQ4(J){let Z=new CW().name("install").description("Install required tools like ripgrep to $AMP_HOME/bin").option("--force","Force reinstallation even if already installed").option("--verbose","Show installation progress and results").action(async(Y)=>{await fy0(Y.force||!1,Y.verbose||!1,"0.0.1772554299-gc34377"),process.exit()});J.addCommand(Z,{hidden:!0});let Q=new CW("update").summary("Update Amp CLI").description("Update Amp CLI to the latest version. You can specify a particular version to install, or leave blank to get the latest stable release.").option("--target-version <version>","Update to a specific version").allowUnknownOption(!1).action(async(Y)=>{await Tw5(Y.targetVersion)});J.addCommand(Q)}async function Tw5(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")uV.write(Z1.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
5905
5905
 
5906
5906
  `));try{if(!J){uV.write(Z1.blue(`Checking for updates...
5907
- `));let{hasUpdate:Y,latestVersion:X}=by0()?await u30("0.0.1772551124-g74cdbd"):await y30("0.0.1772551124-g74cdbd",WE());if(!Y){let U=ny0("0.0.1772551124-g74cdbd"),K=U?.age?`released ${U.age} ago`:`built ${VG(new Date("2026-03-03T15:24:13.512Z"))} ago`;uV.write(Z1.green(`✓ Amp is already up to date on version ${"0.0.1772551124-g74cdbd"} (${K})
5908
- `));let V=await gW("0.0.1772551124-g74cdbd");if(V.warning)uV.write(`
5907
+ `));let{hasUpdate:Y,latestVersion:X}=by0()?await u30("0.0.1772554299-gc34377"):await y30("0.0.1772554299-gc34377",WE());if(!Y){let U=ny0("0.0.1772554299-gc34377"),K=U?.age?`released ${U.age} ago`:`built ${VG(new Date("2026-03-03T16:17:01.559Z"))} ago`;uV.write(Z1.green(`✓ Amp is already up to date on version ${"0.0.1772554299-gc34377"} (${K})
5908
+ `));let V=await gW("0.0.1772554299-gc34377");if(V.warning)uV.write(`
5909
5909
  `+Z1.yellow(V.warning)+`
5910
5910
  `);process.exit(0)}if(!X)uV.write(Z1.yellow("[WARN] could not find latest version")),process.exit(0);J=X}uV.write(Z1.blue(`Updating to version ${J}...
5911
5911
  `)),await Ym(J,void 0,(Y)=>{uV.write(Z1.dim(`Running: ${Y}
@@ -6229,7 +6229,7 @@ To fix: Add "amp.mcpTrustedWorkspaces": ["${Z.getWorkspaceRootPath()}"] to ${Y}
6229
6229
  `)}};function zN5(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y&&Y.startsWith("--")){let X=Y.slice(2),U=J[Q+1];if(U&&!U.startsWith("--"))Z[X]=U,Q++}}return Z}function qN5(J){if(J.action==="ask")return 1;if(J.action==="reject")return 2;return 0}async function DY4(J){let Z=J.json?VN5:DN5;try{let Q=zN5(J.remainingArgs),Y=await J.settings.get("permissions",J.scope)??[],X=_F(Y);if(!X.success){let K={success:!1,error:"Invalid permissions configuration",details:X.error.issues.map((V)=>({path:V.path.join("."),message:V.message,code:V.code}))};Z.outputError(J,Q,K),J.exit(1);return}let U=await vM(J.toolName,Q,X.data,J.context,nv,J.threadId,"user");if(!U.matchedEntry)U=await vM(J.toolName,Q,SM,J.context,nv,J.threadId,"built-in");Z.outputResult(J,Q,U),J.exit(qN5(U))}catch(Q){let Y={success:!1,error:Q instanceof Error?Q.message:"Unknown error"};Z.outputError(J,{},Y),J.exit(1)}}function zY4(J,Z){let Q=J.command("permissions").alias("permission").summary("Manage permissions").description(`Configure and test tool permissions to control what actions the AI agent can take.
6230
6230
 
6231
6231
  See ${Z1.underline("https://ampcode.com/manual#permissions")} for more details`).enablePositionalOptions();FN5(Q,Z),GN5(Q,Z),WN5(Q,Z),HN5(Q,Z)}function FN5(J,Z){J.command("list").alias("ls").summary("List permissions").description("List user-configured permissions.").option("--json","output as JSON").option("--builtin","output only builtin permissions").option("-w, --workspace","List workspace permissions instead of global").action(async(Q,Y)=>{let X=await Z(Y),U=Y.optsWithGlobals();await VY4({builtinOnly:U.builtin??!1,settings:X.settings,exit:process.exit.bind(process),json:U.json,stdout:process.stdout,scope:U.workspace?"workspace":"global"})})}function GN5(J,Z){J.command("test").summary("Test permissions").description("Test permissions against configured rules without running the tool.").argument("<tool-name>","Name of the tool to test").option("-c, --context <context>","Execution context (thread or subagent)").option("-t, --thread-id <id>","Thread ID for evaluation").option("--json","output as JSON").option("-q, --quiet","suppress output, only use exit status").option("-w, --workspace","Test against workspace permissions instead of global").allowUnknownOption(!0).action(async(Q,Y,X)=>{let U=await Z(X),K=()=>!1;await DY4({toolName:Q,context:Y.context,threadId:Y.threadId,json:Y.json,settings:U.settings,remainingArgs:X.args,stdout:Y.quiet?{write:K}:process.stdout,stderr:process.stderr,exit:process.exit.bind(process),scope:Y.workspace?"workspace":"global"})}).addHelpText("after",["Example: "," # Test permissions of Amp trying to use bash"," amp permissions test Bash --cmd ls"," # ...when running in a subagent"," amp permissions test --context subagent Bash --cmd ls","","See output of:",""," amp tools show","","for all tool schemas."].join(`
6232
- `))}function WN5(J,Z){J.command("edit").summary("Edit permissions").description("Edit permissions interactively in your $EDITOR or from stdin.").option("-w, --workspace","Edit workspace permissions instead of global").action(async(Q,Y)=>{let X=await Z(Y);await f30({settings:X.settings,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exit:process.exit.bind(process),resolveEditor:rP,scope:Q.workspace?"workspace":"global"})})}function HN5(J,Z){J.command("add").summary("Add permission rule").description("Add a permission rule to the beginning of the list. Rules are evaluated in order, so newer rules take precedence.").argument("<action>","Permission action: allow, reject, ask, or delegate").option("--to <program>","Program to delegate decision to for delegate action").option("--context <type>","Limit to specific context (thread or subagent)").option("-w, --workspace","Add to workspace permissions instead of global").argument("<tool>",'Tool name (supports globs like "mcp__playwright__*")').allowUnknownOption(!0).action(async(Q,Y,X,U)=>{let K=await Z(U);await YY4({args:U.parent?.args.slice(1)??[],settings:K.settings,stderr:process.stderr,exit:process.exit.bind(process),scope:X.workspace?"workspace":"global"})})}h0();import{exec as BN5}from"node:child_process";import{platform as wN5}from"node:os";import{stderr as sP}from"node:process";u9();async function qY4(J,Z,Q){let U=(await(await kJ({configService:Z},Q)).messages.create({model:nK,max_tokens:300,system:"You are a classifier that answers yes/no questions. You must use the provided tool to give your answer with reasoning.",messages:[{role:"user",content:J}],tools:[{name:"answer_question",description:"Provide your answer to the yes/no question with reasoning",input_schema:{type:"object",properties:{probability_yes:{type:"number",description:'Probability that the answer is "yes", from 0 to 1. Use 0 for definitely no, 0.5 for uncertain, 1 for definitely yes.'},reasoning:{type:"string",description:"Brief (2-sentence max) explanation of why you gave this probability."}},required:["probability_yes","reasoning"]}}],tool_choice:{type:"tool",name:"answer_question"}},{headers:{"anthropic-beta":"interleaved-thinking-2025-05-14"}})).content.find((q)=>q.type==="tool_use");if(!U||U.type!=="tool_use")throw Error("Expected tool use response from Claude");let K=U.input,V=K.probability_yes??0.5,D=K.reasoning??"No reasoning provided",z;if(V>=0.8)z="yes";else if(V<0.2)z="no";else z="uncertain";return{result:z,probability:V,reason:D}}class ty0{clientKind="terminal";clientVersion="0.0.1772551124-g74cdbd";showToast=null;appendToThreadHandler=null;showOpenedURLToast=null;showInputDialog=null;showConfirmDialog=null;configService;constructor(J){this.configService=J.configService}async notify(J){if(this.showToast)this.showToast(J);else P.debug("plugin notification (TUI not loaded): %s",J)}async open(J){let Z=wN5(),Q=Z==="darwin"?"open":Z==="win32"?"start":"xdg-open";if(await new Promise((Y,X)=>{BN5(`${Q} ${JSON.stringify(J)}`,(U)=>{if(U)X(U);else Y()})}),this.showOpenedURLToast)this.showOpenedURLToast(J);else sP.write(`
6232
+ `))}function WN5(J,Z){J.command("edit").summary("Edit permissions").description("Edit permissions interactively in your $EDITOR or from stdin.").option("-w, --workspace","Edit workspace permissions instead of global").action(async(Q,Y)=>{let X=await Z(Y);await f30({settings:X.settings,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,exit:process.exit.bind(process),resolveEditor:rP,scope:Q.workspace?"workspace":"global"})})}function HN5(J,Z){J.command("add").summary("Add permission rule").description("Add a permission rule to the beginning of the list. Rules are evaluated in order, so newer rules take precedence.").argument("<action>","Permission action: allow, reject, ask, or delegate").option("--to <program>","Program to delegate decision to for delegate action").option("--context <type>","Limit to specific context (thread or subagent)").option("-w, --workspace","Add to workspace permissions instead of global").argument("<tool>",'Tool name (supports globs like "mcp__playwright__*")').allowUnknownOption(!0).action(async(Q,Y,X,U)=>{let K=await Z(U);await YY4({args:U.parent?.args.slice(1)??[],settings:K.settings,stderr:process.stderr,exit:process.exit.bind(process),scope:X.workspace?"workspace":"global"})})}h0();import{exec as BN5}from"node:child_process";import{platform as wN5}from"node:os";import{stderr as sP}from"node:process";u9();async function qY4(J,Z,Q){let U=(await(await kJ({configService:Z},Q)).messages.create({model:nK,max_tokens:300,system:"You are a classifier that answers yes/no questions. You must use the provided tool to give your answer with reasoning.",messages:[{role:"user",content:J}],tools:[{name:"answer_question",description:"Provide your answer to the yes/no question with reasoning",input_schema:{type:"object",properties:{probability_yes:{type:"number",description:'Probability that the answer is "yes", from 0 to 1. Use 0 for definitely no, 0.5 for uncertain, 1 for definitely yes.'},reasoning:{type:"string",description:"Brief (2-sentence max) explanation of why you gave this probability."}},required:["probability_yes","reasoning"]}}],tool_choice:{type:"tool",name:"answer_question"}},{headers:{"anthropic-beta":"interleaved-thinking-2025-05-14"}})).content.find((q)=>q.type==="tool_use");if(!U||U.type!=="tool_use")throw Error("Expected tool use response from Claude");let K=U.input,V=K.probability_yes??0.5,D=K.reasoning??"No reasoning provided",z;if(V>=0.8)z="yes";else if(V<0.2)z="no";else z="uncertain";return{result:z,probability:V,reason:D}}class ty0{clientKind="terminal";clientVersion="0.0.1772554299-gc34377";showToast=null;appendToThreadHandler=null;showOpenedURLToast=null;showInputDialog=null;showConfirmDialog=null;configService;constructor(J){this.configService=J.configService}async notify(J){if(this.showToast)this.showToast(J);else P.debug("plugin notification (TUI not loaded): %s",J)}async open(J){let Z=wN5(),Q=Z==="darwin"?"open":Z==="win32"?"start":"xdg-open";if(await new Promise((Y,X)=>{BN5(`${Q} ${JSON.stringify(J)}`,(U)=>{if(U)X(U);else Y()})}),this.showOpenedURLToast)this.showOpenedURLToast(J);else sP.write(`
6233
6233
  Opened URL: ${J}
6234
6234
 
6235
6235
  `)}async input(J){if(this.showInputDialog)return this.showInputDialog(J);sP.write(`
@@ -7061,7 +7061,7 @@ Ctrl-X, Y, Z to unlock`;if(G){let f=z.text.replace(/`([^`]+)`/g,"$1")+`
7061
7061
  `),U=[];for(let K=0;K<X.length;K++){let z=X[K].replace(/\b(SELECT|FROM|WHERE|GROUP BY|ORDER BY|HAVING|LIMIT|JOIN|LEFT JOIN|RIGHT JOIN|INNER JOIN|ON|AND|OR|AS|IN|NOT|NULL|IS|BETWEEN|LIKE|EXISTS|UNION|DISTINCT|COUNT|SUM|AVG|MIN|MAX|DATE|TIMESTAMP_TRUNC|TIMESTAMP_SUB|CURRENT_TIMESTAMP|INTERVAL|CASE|WHEN|THEN|ELSE|END|WITH|INSERT|UPDATE|DELETE|SET|VALUES|INTO|CREATE|ALTER|DROP|TRUE|FALSE|ASC|DESC)\b/gi,"\x00$1\x01").split(/(\x00[^\x01]+\x01)/);for(let q of z)if(q.startsWith("\x00")&&q.endsWith("\x01"))U.push(new C(q.slice(1,-1),new b({color:Y.app.keybind,bold:!0})));else U.push(new C(q,new b({color:Q.colorScheme.foreground})));if(K<X.length-1)U.push(new C(`
7062
7062
  `))}return new c0({decoration:{color:Q.colorScheme.background,border:f1.all(new y1(Y.app.keybind,1,"rounded"))},child:new a0({padding:C0.symmetric(0,1),child:new Q0({text:new C(void 0,void 0,U)})})})}}class $m0 extends F2{chartData;highlightIndex;showAxes;colors;constructor({key:J,chartData:Z,highlightIndex:Q=null,showAxes:Y=!0,colors:X=Q20}){super(J?{key:J}:{});this.chartData=Z,this.highlightIndex=Q,this.showAxes=Y,this.colors=X}createRenderObject(){return new th0({chartData:this.chartData,highlightIndex:this.highlightIndex,showAxes:this.showAxes,colors:this.colors})}updateRenderObject(J){let Z=J;Z.chartData=this.chartData,Z.highlightIndex=this.highlightIndex,Z.showAxes=this.showAxes,Z.colors=this.colors,Z.markNeedsLayout()}}function SW4(J,Z,Q,Y,X,U,K){if(U<=0)return null;switch(J){case"horizontal-bar":{let V=Q;return V>=0&&V<U?V:null}case"bar":case"stacked-bar":{let V=K?x8:0,D=Y-V;if(D<=0)return null;let z=Z-V;if(z<0||z>=D)return null;let q=Math.max(1,Math.floor(D/U)),F=Math.floor(z/q);return F>=0&&F<U?F:null}case"line":case"sparkline":case"stacked-area":{let V=K?x8:0,D=Y-V;if(D<=0)return null;let z=Math.max(0,Math.min(D-1,Z-V));if(U===1)return 0;let q=D/(U-1),F=Math.round(z/q);return Math.max(0,Math.min(U-1,F))}default:return null}}function gx5(J,Z,Q,Y,X,U,K,V){if(X<=0||Z<0||Z>=X)return null;let D=2;switch(J){case"horizontal-bar":return{x:Math.floor(Q/2),y:Z};case"bar":case"stacked-bar":{let z=U?x8:0,q=Q-z,F=Y-(U?D:0);if(q<=0||F<=0)return null;let G=Math.max(1,Math.floor(q/X)),W=z+Z*G+Math.floor(G/2),H=V>0?K/V:0,B=Math.round((1-H)*(F-1));return{x:W,y:B}}case"line":case"sparkline":case"stacked-area":{let z=U?x8:0,q=Q-z,F=Y-(U?D:0);if(q<=0||F<=0)return null;let G=X>1?z+Math.round(Z/(X-1)*(q-1)):z+Math.floor(q/2),W=V>0?K/V:0,H=Math.round((1-W)*(F-1));return{x:G,y:H}}default:return null}}function px5(J){let Z=0;for(let Q of J)for(let Y of Q.points)if(Y.value>Z)Z=Y.value;return Z||1}function dx5(J,Z,Q,Y,X){if(Q.length<=1){let V=Y(J.value),D=J.meta?` (${J.meta})`:"";return J.label.length+2+V.length+D.length}let U=J.label.length,K=0;for(let V of Q){let D=V.points[Z];if(!D)continue;K+=D.value;let z=2+V.name.length+2+Y(D.value).length;U=Math.max(U,z)}if(X){let V=9+Y(K).length;U=Math.max(U,V)}return U}function cx5(J,Z,Q,Y,X,U,K){let V;try{let H=R1.of(J),B=x0.of(J);V={foreground:H.colorScheme.foreground,background:H.colorScheme.background,border:B.app.keybind}}catch{V={foreground:{type:"index",value:15},background:{type:"index",value:0},border:{type:"index",value:7}}}let D=new b({color:V.foreground,bold:!0}),z=new b({color:V.foreground}),q=new b({color:V.foreground,dim:!0}),F=[],G=new b({color:V.foreground,underline:!0}),W=(H,B)=>new C(B,G,void 0,i30(H),()=>{U8(J,H)});if(Y.length<=1){if(F.push(new C(`${Z.label}: `,D)),Z.link)F.push(W(Z.link,U(Z.value)));else F.push(new C(U(Z.value),z));if(Z.meta)F.push(new C(` (${Z.meta})`,q))}else{let H=K==="stacked-bar"||K==="stacked-area";F.push(new C(`${Z.label}
7063
7063
  `,D));let B=0;for(let w=0;w<Y.length;w++){let N=Y[w],O=N.points[Q];if(!O)continue;B+=O.value;let E=N.color??X[w%X.length]??V.foreground;if(F.push(new C("● ",new b({color:E}))),F.push(new C(`${N.name}: `,q)),O.link)F.push(W(O.link,U(O.value)));else F.push(new C(U(O.value),z));if(w<Y.length-1||H)F.push(new C(`
7064
- `))}if(H)F.push(new C(" ",q)),F.push(new C("Total: ",q)),F.push(new C(U(B),z))}return new c0({decoration:{color:V.background,border:f1.all(new y1(V.border,1,"rounded"))},child:new Q0({text:new C(void 0,void 0,F)})})}h0();n9();import{execSync as Nf5}from"node:child_process";nM();qJ();O3();s7();jw();LX();L$();CJ();wX();dO();f4();Tu();jv();W1();var AH4=L4(qz(),1);import{writeFile as OH4}from"fs/promises";import EH4 from"path";h0();L$();class Jm0{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Z){this.enabled=J;this.configService=Z;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Z,Q])=>({feature:"cli.command",action:Z,source:{client:"cli",clientVersion:"0.0.1772551124-g74cdbd"},parameters:{metadata:{count:Q}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Z=JSON.stringify(J);await Ss(Z,this.configService)}catch(Z){P.error("Failed to export command telemetry events",Z)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Z=this.commandCounts.get(J)||0;this.commandCounts.set(J,Z+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class CH extends p0{props;constructor(J){super();this.props=J}createState(){return new vW4}}class vW4 extends g0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Z=(Q)=>{this.setState(()=>{this._state=Q(this._state)})};return this.widget.props.builder(J,Z,this._state)}}class kW4 extends g0{controller=new y7;focusNode=new n4({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Z=x0.of(J),{colors:Q,app:Y}=Z,X=this.widget.props.isRequiredArg??!0,U=this.controller.text.trim().length>0,K=!X||U,V=f1.all(new y1(Q.foreground,1,"solid")),D=new l$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(W)=>{let H=W.trim();if(X&&H.length===0)return;this.widget.props.onSubmit(H)},autofocus:!0,style:{textColor:Q.foreground,border:null},maxLines:1}),z=new V1({children:[new c0({decoration:{color:Q.background},child:new Q0({text:new C(">",new b({color:Q.foreground}))})}),new S1({child:D})]}),q=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C("",void 0,[new C("Command: ",new b({color:Q.foreground})),new C(this.widget.props.commandName,new b({color:Y.command,bold:!0}))])})}),F=[];if(K)F.push(new C("Enter",new b({color:Y.keybind}))),F.push(new C(" to submit, ",new b({color:Q.foreground,dim:!0})));F.push(new C("Esc",new b({color:Y.keybind}))),F.push(new C(" to cancel",new b({color:Q.foreground,dim:!0})));let G=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C("",void 0,F)})});return new c0({decoration:{border:V,color:Q.background},padding:C0.all(1),child:new u0({children:[q,new j0({height:1}),z,new Z3,G]})})}}class ng extends p0{props;constructor(J){super();this.props=J}createState(){return new kW4}}import{isDeepStrictEqual as Zm0}from"node:util";var lx5=/[\\/_ +.#"@[({&]/,ix5=/[\\/_ +.#"@[({&]/g,nx5=/[\s-]/,yW4=/[\s-]/g;function U20(J,Z,Q,Y,X,U,K){if(U===Z.length){if(X===J.length)return 1;return 0.99}let V=`${X},${U}`;if(K[V]!==void 0)return K[V];let D=Y.charAt(U),z=Q.indexOf(D,X),q=0,F,G,W,H;while(z>=0){if(F=U20(J,Z,Q,Y,z+1,U+1,K),F>q){if(z===X)F*=1;else if(nx5.test(J.charAt(z-1))){if(F*=0.9,H=J.slice(X,z-1).match(yW4),H&&X>0)F*=0.999**H.length}else if(lx5.test(J.charAt(z-1))){if(F*=0.8,W=J.slice(X,z-1).match(ix5),W&&X>0)F*=0.999**W.length}else if(F*=0.3,X>0)F*=0.999**(z-X);if(J.charAt(z)!==Z.charAt(U))F*=0.9999}if(F<0.1&&(Q.charAt(z-1)===Y.charAt(U+1)||Y.charAt(U+1)===Y.charAt(U)&&Q.charAt(z-1)!==Y.charAt(U))){if(G=U20(J,Z,Q,Y,z+1,U+2,K),G*0.1>F)F=G*0.1}if(F>q)q=F;z=Q.indexOf(D,z+1)}return K[V]=q,q}function X20(J){return J.toLowerCase().replace(yW4," ")}function uW4(J,Z){let Q=U20(J,Z,X20(J),X20(Z),0,0,{}),Y=Z.trim().split(/\s+/);if(Y.length>1){let X=0,U=0;for(let V of Y){let D=U20(J,V,X20(J),X20(V),0,0,{});if(D===0)return Q;X+=D,U+=V.length}let K=X/Y.length*0.95;return Math.max(Q,K)}return Q}class eC{}class $T{}class K20{}class V20{}class xW4 extends p0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new fW4}}class fW4 extends g0{build(J){return this.widget.onContext(J),this.widget.child}}function ax5(J,Z){if(J==="")return{matches:!0,score:1};let Q=uW4(Z,J);return{matches:Q>0.15,score:Q}}class g9 extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new bW4}}class bW4 extends g0{textController;focusNode;scrollController=new o6;selectedIndex=0;itemContexts=[];hasUserInteracted=!1;cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){if(this.scrollController.disableFollowMode(),this.textController=new y7(this.widget.props.controller?.query??""),this.focusNode=new n4({debugLabel:this.widget.debugLabel}),this.textController.addListener(()=>{this.hasUserInteracted=!0,this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let J=this.widget.props.controller;if(J)J.query=this.textController.text;this.syncSelection()}),this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let J=this.cachedFiltered.findIndex((Z)=>Zm0(Z,this.widget.props.controller?.selectedItem));if(J>=0)this.selectedIndex=J}this.clampSelectedIndex(),this.syncSelection(),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!Zm0(J.props.items,this.widget.props.items)){if(this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let Z=this.cachedFiltered.findIndex((Q)=>Zm0(Q,this.widget.props.controller?.selectedItem));if(Z>=0)this.selectedIndex=Z}this.clampSelectedIndex(),this.ensureSelectedItemVisible(),this.syncSelection()}}dispose(){this.widget.props.onSelectionChange?.(null),this.textController.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof eC){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof $T){if(this.getFilteredItems().length>0&&this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof K20){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length){let Q=Z[this.selectedIndex];if(Q){if(!(this.widget.props.isItemDisabled?.(Q)??!1))this.widget.props.onAccept(Q,{hasUserInteracted:this.hasUserInteracted})}}return"handled"}if(J instanceof V20)return this.widget.props.onDismiss?.(),"handled";return"ignored"};syncSelection(){let Z=this.cachedFiltered[this.selectedIndex]??null;if(this.widget.props.controller)this.widget.props.controller.selectedItem=Z;this.widget.props.onSelectionChange?.(Z)}clampSelectedIndex(){let J=this.cachedFiltered.length-1;if(J<0){this.selectedIndex=0;return}this.selectedIndex=Math.max(0,Math.min(this.selectedIndex,J))}recomputeFilteredItems(){let J=this.textController.text,Z=this.widget.props.items,Q=this.widget.props.normalizeQuery?.(J)??J,Y=Z.filter((X)=>!this.widget.props.filterItem||this.widget.props.filterItem(X,J)).map((X)=>({item:X,...ax5(Q,this.widget.props.getLabel(X))})).filter((X)=>X.matches).sort(this.widget.props.sortItems?(X,U)=>this.widget.props.sortItems(X,U,J):(X,U)=>U.score-X.score).map((X)=>X.item);this.cachedQuery=J,this.cachedItemsRef=Z,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.textController.text,Z=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Z)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;lC(J,{top:Q,bottom:Y},{padding:1})}handleScroll=(J)=>{let Z=this.getFilteredItems();if(Z.length===0)return!1;let Q=this.selectedIndex;if(J.direction==="down")if(this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++;else return!1;else if(this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--;else return!1;return this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection(),this.selectedIndex!==Q};handleItemClick=(J,Z)=>{let Q=this.getFilteredItems();if(J>=0&&J<Q.length){let Y=Q[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Z===1)this.hasUserInteracted=!0,this.selectedIndex=J,this.setState(),this.syncSelection();else if(Z===2&&!X){if(Y)this.hasUserInteracted=!0,this.widget.props.onAccept(Y,{hasUserInteracted:this.hasUserInteracted})}}};build(J){let Z=x0.of(J),{colors:Q}=Z,Y=this.getFilteredItems(),X=f1.all(new y1(Q.foreground,1,"solid")),U=this.widget.props.hidePromptWhenLoading&&this.widget.props.isLoading,K=this.widget.props.enabled??!0,V=new l$({controller:this.textController,focusNode:this.focusNode,autofocus:!0,enabled:K,style:{backgroundColor:Q.background,textColor:Q.foreground,cursorColor:Q.cursor,placeholderColor:Q.mutedForeground,border:null},maxLines:1}),D=new B2({shortcuts:new Map([[new $4("ArrowDown"),new eC],[new $4("ArrowUp"),new $T],[new $4("Tab"),new eC],[new $4("Tab",{shift:!0}),new $T],[new $4("n",{ctrl:!0}),new eC],[new $4("p",{ctrl:!0}),new $T],[new $4("Enter"),new K20],[new $4("Escape"),new V20]]),focusNode:this.focusNode,child:V}),z=new A9({actions:new Map([[eC,new o4(this.invoke)],[$T,new o4(this.invoke)],[K20,new o4(this.invoke)],[V20,new o4(this.invoke)]]),child:D}),q=new V1({children:[new c0({decoration:{color:Q.background},child:new Q0({text:new C(">",new b({color:Q.foreground}))})}),new S1({child:z})]});this.itemContexts=[];let F;if(this.widget.props.isLoading){let w=this.widget.props.loadingText??"Loading...";F=new j0({height:10,child:new n1({child:new Q0({text:new C(w,new b({color:Q.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)F=new S1({child:new n1({child:new Q0({text:new C(this.widget.props.emptyStateText,new b({color:Q.foreground,dim:!0}))})})});else{let w=Y.map((N,O)=>{let E=O===this.selectedIndex,L=this.widget.props.isItemDisabled?.(N)??!1,I;if(this.widget.props.renderItem)I=this.widget.props.renderItem(N,E,L,J);else{let M=E?Z.app.selectionBackground:void 0,A=E?Z.app.selectionForeground:Q.foreground;I=new c0({decoration:M?{color:M}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C(this.widget.props.getLabel(N),new b({color:A,dim:L}))})})}return new xW4(new i1({onClick:(M)=>this.handleItemClick(O,M.clickCount),child:I}),(M)=>{this.itemContexts[O]=M})});F=new u0({children:w,crossAxisAlignment:"start"})}let G=new i1({onScroll:this.handleScroll,opaque:!1,child:new N6({controller:this.scrollController,autofocus:!1,child:F})}),W=[];if(this.widget.props.title){let w=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C(this.widget.props.title,new b({color:Z.app.command,bold:!0}))})});W.push(w)}if(!U)W.push(q,new j0({height:1}));if(this.textController.text!==""){let w=Y.length>0?Y[this.selectedIndex]:void 0,N=w&&this.widget.props.buildDisabledReasonWidget?.(w,J);W.push(new S1({child:new u0({mainAxisAlignment:"spaceBetween",children:[new S1({child:G}),new c0({padding:C0.only({top:1}),child:new n1({child:N??new j0({height:1})})})]})}))}else W.push(new S1({child:G}));if(this.widget.props.footer)W.push(this.widget.props.footer);return new c0({decoration:{border:X,color:Q.background},padding:C0.symmetric(1,0),child:new u0({children:W})})}}function hW4(J){let Q=new Date().getTime()-J.getTime(),Y=Math.floor(Q/60000),X=Math.floor(Q/3600000),U=Math.floor(Q/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(U<7)return`${U}d ago`;return J.toLocaleDateString()}class Qm0 extends d1{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Z=[...this.props.entries].sort((X,U)=>U.pubDate.getTime()-X.pubDate.getTime()),Q=Math.max(0,...Z.map((X)=>hW4(X.pubDate).length));return new g9({items:Z,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,U,K,V)=>{let D=x0.of(V),{colors:z}=D,q=D.app,F=U?q.selectionBackground:void 0,G=U?q.selectionForeground:z.foreground,W=z.mutedForeground,H=(B,w)=>new j0({width:w,child:V1.end([new Q0({text:new C(B,new b({color:W}))})])});return new c0({decoration:F?{color:F}:void 0,padding:C0.symmetric(2,0),child:new V1({children:[new S1({child:new Q0({text:new C(X.title,new b({color:G})),overflow:"ellipsis",maxLines:1})}),new j0({width:2}),H(hW4(X.pubDate),Q)]})})}})}}f4();class Ym0 extends p0{createState(){return new mW4}}class mW4 extends g0{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){let Q=x0.of(J).colors;return new Q0({text:new C("●",new b({color:this.isGreen?Q.success:Q.mutedForeground,bold:!0})),maxLines:1})}}var ox5=/\/threads\/(T-[^/?#\s<>]+)/i;function rx5(J){let Z=J.trim(),Y=Z.match(ox5)?.[1];if(Y&&C8(Y))return Y;let X=Z.replace(/^[<("'`]+|[>")'`,.]+$/g,"");if(C8(X))return X;return null}function sx5(J){let Z=new Map,Q=new Map,Y=new Map,X=[];for(let K of J)Z.set(K.id,K);for(let K of J){let V=K.relationships.find((D)=>D.role==="child"&&Z.has(D.threadID)&&(D.type==="fork"||D.type==="handoff"));if(V){Y.set(K.id,V.type);let D=V.threadID,z=Q.get(D)||[];z.push(K),Q.set(D,z)}else X.push(K)}return j90.flatten(X,(K)=>Q.get(K.id)).map((K)=>({...K.item,depth:K.depth,isLast:K.isLast,ancestorsAreLast:K.ancestorsAreLast,relationshipType:Y.get(K.item.id)}))}function Xm0(J,Z,Q){return new Q0({text:new C(`${J}${Z}`,new b({color:Q})),maxLines:1})}function tx5(J,Z,Q,Y){return[Xm0("+",J,Y.success),Z3.horizontal(1),Xm0("~",Z,Y.warning),Z3.horizontal(1),Xm0("-",Q,Y.destructive)]}function ex5(J){return typeof J==="object"&&J!==null&&"then"in J&&typeof J.then==="function"}class D20 extends p0{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}createState(){return new gW4}}class gW4 extends g0{spinner=new L3;spinnerInterval=null;isSwitchingThread=!1;get isBusy(){return this.isSwitchingThread||this.widget.props.isLoading===!0}updateSpinnerAnimation(){if(this.isBusy){if(!this.spinnerInterval)this.spinnerInterval=setInterval(()=>{this.spinner.step(),this.setState(()=>{})},100);return}if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null}setSwitchingThread(J){if(this.isSwitchingThread===J)return;this.setState(()=>{this.isSwitchingThread=J}),this.updateSpinnerAnimation()}initState(){super.initState(),this.updateSpinnerAnimation()}didUpdateWidget(J){this.updateSpinnerAnimation()}dispose(){if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null;super.dispose()}build(J){let{props:Z}=this.widget,Q=this.isBusy,Y=this.isSwitchingThread?"Switching thread...":"Loading threads...",X=`${this.spinner.toBraille()} ${Y}`,U=Z.filterByWorkspace&&Z.currentWorkspaceURI?Z.threads.filter((O)=>O.workspaceURI===Z.currentWorkspaceURI):Z.threads;if(Z.excludeCurrentThread&&Z.currentThreadID)U=U.filter((O)=>O.id!==Z.currentThreadID);let K=Z.recentThreadIDs||[],V=new Set(K),D=Z.currentThreadID,z=[...U].sort((O,E)=>{if(D){if(O.id===D)return-1;if(E.id===D)return 1}let L=K.indexOf(O.id),I=K.indexOf(E.id);if(L!==-1&&I!==-1)return L-I;if(L!==-1)return-1;if(I!==-1)return 1;return 0}),q=sx5(z),F=Math.max(0,...q.map((O)=>O.description.timeAgo.length)),G=x0.of(J),W=new a0({padding:C0.symmetric(0,1),child:new n1({child:new Q0({text:new C("",new b({color:G.colors.foreground,dim:!0}),[new C("Ctrl+T",new b({color:G.colors.primary,dim:!0})),new C(Z.filterByWorkspace?" for all workspaces":" to filter by workspace",new b({color:G.colors.foreground,dim:!0}))])})})}),H="",B=null,w=(O)=>{if(O!==H)H=O,B=rx5(O);return B};return new g9({items:q,getLabel:(O)=>`${O.title} ${O.id}`,filterItem:(O,E)=>{let L=w(E);if(L)return O.id.toLowerCase()===L.toLowerCase();return!0},normalizeQuery:(O)=>w(O)?"":O,onAccept:async(O,E)=>{if(!Z.onSelect||this.isSwitchingThread)return;let L=Z.onSelect(O.id,E);if(!ex5(L))return;this.setSwitchingThread(!0);try{await L}finally{if(this.mounted)this.setSwitchingThread(!1)}},onDismiss:Z.onDismiss,onSelectionChange:(O)=>{if(Z.previewController){if(O)Z.previewController.select(O.id)}},title:Z.title,enabled:!Q,isLoading:Q,hidePromptWhenLoading:!0,loadingText:X,emptyStateText:"No threads match your filter",maxRenderItems:200,footer:Q?void 0:W,renderItem:(O,E,L,I)=>{let M=x0.of(I),{app:A,colors:j}=M,_=E?A.selectionBackground:void 0,S=E?A.selectionForeground:j.foreground,y=j.mutedForeground,h=(e,B0)=>new j0({width:B0,child:V1.end([new Q0({text:new C(e,new b({color:y}))})])}),f=Z.threadViewStates[O.id],k=[],x=O.relationshipType==="handoff",g=new Fg({connectorColor:j.mutedForeground});if(O.depth>0){let e=[],B0=O.ancestorsAreLast.slice(1);for(let K0 of B0)e.push(new C(g.getAncestorPrefix(K0),new b({color:g.connectorColor,dim:g.connectorDim})));let n=O.isLast?g.elbow:g.tee,U0=g.getConnectorText(n);e.push(new C(U0,new b({color:g.connectorColor,dim:g.connectorDim}))),k.push(new Q0({text:new C("",void 0,e)}))}let a=[],m=D===O.id?new C("(current) ",new b({color:j.success})):V.has(O.id)?new C("(visited) ",new b({color:j.foreground,dim:!0})):null;if(m)a.push(new Q0({text:m}));if(FO(f))a.push(new Ym0),a.push(new j0({width:1}));let i=O.title;if(O.relationshipType==="fork"){let e=i.match(/^Forked\((\d+)\): /);if(e)i=i.slice(e[0].length);else while(i.startsWith("Forked: "))i=i.slice(8);a.push(new Q0({text:new C("[fork] ",new b({color:j.primary}))}))}else if(x)a.push(new Q0({text:new C("[handoff] ",new b({color:j.accent}))}));if(a.push(new S1({child:new Q0({text:new C(i,new b({color:S})),overflow:"ellipsis",maxLines:1})})),a.push(new j0({width:2})),O.diffStats&&(O.diffStats.added>0||O.diffStats.changed>0||O.diffStats.deleted>0)){let e=E?{success:y,warning:y,destructive:y}:j;a.push(...tx5(O.diffStats.added,O.diffStats.changed,O.diffStats.deleted,e)),a.push(new j0({width:2}))}return a.push(h(O.description.timeAgo,F)),new c0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new V1({children:[...k,...a]})})}})}}function Um0(J){return 1-(1-J)**3}function Km0(J,Z,Q){return J+(Z-J)*Q}function ag(J,Z){if(!J)return{x:0,y:0};let Q=Z-J.startTime,Y=Math.min(Q/J.durationX,1),X=Math.min(Q/J.durationY,1),U=Um0(Y),K=Um0(X);return{x:Km0(J.startOffset.x,J.targetOffset.x,U),y:Km0(J.startOffset.y,J.targetOffset.y,K)}}var $f5={nodeWidth:3,horizontalSpacing:3};class JT{options;constructor(J={}){this.options={...$f5,...J}}layout(J){let{childrenMap:Z,resolvedParent:Q}=this.buildTree(J),Y=[],X=Z.get(void 0)??[];if(this.options.comparator)X.sort(this.options.comparator);let U=0,K=(V,D)=>{let z=Z.get(V.id)??[];if(this.options.comparator)z.sort(this.options.comparator);let q={...V,parentID:Q.get(V.id)};if(z.length===0){Y.push({node:q,position:{x:U,y:D}});let B=U;return U+=this.options.nodeWidth+this.options.horizontalSpacing,B}let F=[];for(let B of z)F.push(K(B,D+1));let G=Math.min(...F),W=Math.max(...F),H=Math.floor((G+W)/2);return Y.push({node:q,position:{x:H,y:D}}),H};for(let V of X)K(V,0);return Y}buildTree(J){let Z=new Set(J.map((U)=>U.id)),Q=[...J].sort((U,K)=>U.id.localeCompare(K.id)),Y=new Map;for(let U of Q){if(!U.parentID||!Z.has(U.parentID)){Y.set(U.id,void 0);continue}let K=!1,V=U.parentID;while(V){if(V===U.id){K=!0;break}V=Y.get(V)}Y.set(U.id,K?void 0:U.parentID)}let X=new Map;for(let U of J){let K=Y.get(U.id);if(!X.has(K))X.set(K,[]);X.get(K).push(U)}return{childrenMap:X,resolvedParent:Y}}}var Jf5={nodeWidth:3,nodeHeight:2};class ZT{options;constructor(J={}){this.options={...Jf5,...J}}calculate(J){let Z=[],Q=new Map;for(let Y of J)Q.set(Y.node.id,Y);for(let Y of J){if(!Y.node.parentID)continue;let X=Q.get(Y.node.parentID);if(!X)continue;let U=this.calculateConnectorLine(X.position,Y.position);Z.push({points:U,fromNodeID:X.node.id,toNodeID:Y.node.id})}return Z}calculateConnectorLine(J,Z){let Q=Math.floor(this.options.nodeWidth/2),Y=[],X=J.x+Q,U=Z.x+Q,K=J.y*(this.options.nodeHeight+3)+this.options.nodeHeight;Y.push({x:X,y:K});let V=K+1;if(Y.push({x:X,y:V}),X!==U)Y.push({x:U,y:V});let D=Z.y*(this.options.nodeHeight+3)-1;return Y.push({x:U,y:D}),Y}}var Zf5={nodeWidth:3,nodeHeight:2},Qf5={x:0,y:0};class q20{options;constructor(J={}){this.options={...Zf5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Qf5,X,U,K,V){let D=V?x0.of(V):null,z=D?.colors,q=D?.app,F=z?.mutedForeground??z?.foreground;if(J.length===0)return new Q0({text:new C("No nodes",new b({color:F}))});let G=Math.max(...J.map((A)=>A.position.y)),H=Math.max(...J.map((A)=>A.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+3,w=[];for(let A=G;A>=0;A--){let j=J.filter((y)=>y.position.y===A);j.sort((y,h)=>y.position.x-h.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new j0({width:y.position.x-S}));let h=y.node.id===Q,f=K?.(y.node.data)??!1,k=U?.activeFlashOn??!1,x=y.node.id===U?.copyFlashNodeId;_.push(this.renderNode(h,f,k,x,q,z)),S=y.position.x+this.options.nodeWidth}if(w.push(new V1({crossAxisAlignment:"start",children:_})),A>0){let y=J.filter((k)=>k.position.y===A-1),h=j,f=this.renderConnectors(y,h,Z,H,z,q);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(G+1)*B,I=[new j0({width:H,height:L}),new $5({left:O,top:E,child:N})],M=Q?J.find((A)=>A.node.id===Q):void 0;if(M&&X){let A=X(M.node.data),j=G-M.position.y,_=O+M.position.x+this.options.nodeWidth+1,S=E+j*B+1,y=30;if(U?.maxTitleWidthPercent&&U.viewportWidth)y=Math.floor(U.viewportWidth*U.maxTitleWidthPercent/100);I.push(new $5({left:_,top:S,child:this.renderInfoBox(A,y,z,q)}))}return new c0({padding:C0.horizontal(2),child:new aW(new D5({fit:"expand",children:I}))})}renderNode(J,Z,Q,Y,X,U){let K="┌─┐",V="└─┘",D=J?X?.threadGraphNodeSelected??U?.primary??U?.foreground:X?.threadGraphNode??U?.primary??U?.foreground,z=!1;if(Y)D=X?.threadGraphNodeSelected??U?.primary??D,K="┏━┓",V="┗━┛",z=!0;else if(Z&&Q)D=X?.toolSuccess??U?.primary??D,K="┏━┓",V="┗━┛";return new u0({crossAxisAlignment:"start",children:[new Q0({text:new C(K,new b({color:D,bold:z}))}),new Q0({text:new C(V,new b({color:D,bold:z}))})]})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let U of Q){if(U.length>Z)U=U.slice(0,Z-1)+"…";if(X.length===0)X=U;else if(X.length+1+U.length<=Z)X+=" "+U;else Y.push(X),X=U}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q,Y){let X=this.wrapText(J,Z),U=Math.min(Z,Math.max(1,...X.map((G)=>G.length))),K=U+2,V="┌"+"─".repeat(K)+"┐",D="└"+"─".repeat(K)+"┘",z=Q?.border??Y?.threadGraphConnector??Q?.foreground,q=Q?.foreground,F=[new Q0({text:new C(V,new b({color:z}))})];for(let G of X){let W=" ".repeat(U-G.length);F.push(new Q0({text:new C("│ ",new b({color:z}),[new C(G+W,new b({color:q??z})),new C(" │",new b({color:z}))])}))}return F.push(new Q0({text:new C(D,new b({color:z}))})),new u0({crossAxisAlignment:"start",children:F})}renderConnectors(J,Z,Q,Y,X,U){let K=[],V=Math.floor(this.options.nodeWidth/2),D=U?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let G of Z){let W=G.position.x+V;if(W>=0&&W<Y)z[W]="▲"}K.push(new Q0({text:new C(z.join(""),new b({color:D}))}));let q=Array(Y).fill(" ");for(let G of J){let W=Z.filter((O)=>O.node.parentID===G.node.id);if(W.length===0)continue;let H=G.position.x+V,B=W.map((O)=>O.position.x+V),w=Math.min(...B),N=Math.max(...B);for(let O=w;O<=N;O++)if(O>=0&&O<Y){if(O===H)if(W.length===1&&B[0]===H)q[O]="│";else if(O===w)q[O]="└";else if(O===N)q[O]="┘";else q[O]="┬";else if(B.includes(O))if(O===w)q[O]="└";else if(O===N)q[O]="┘";else q[O]="┴";else if(q[O]===" ")q[O]="─"}}K.push(new Q0({text:new C(q.join(""),new b({color:D}))}));let F=Array(Y).fill(" ");for(let G of J){if(Z.filter((B)=>B.node.parentID===G.node.id).length===0)continue;let H=G.position.x+V;if(H>=0&&H<Y)F[H]="│"}return K.push(new Q0({text:new C(F.join(""),new b({color:D}))})),K}}var Yf5={nodeWidth:1,nodeHeight:1,nodeIcon:"□",selectedIcon:"□"},Xf5={x:0,y:0};class Vm0{options;constructor(J={}){this.options={...Yf5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Xf5,X,U,K,V){let D=V?x0.of(V):null,z=D?.colors,q=D?.app,F=z?.mutedForeground??z?.foreground;if(J.length===0)return new Q0({text:new C("No nodes",new b({color:F}))});let G=Math.max(...J.map((A)=>A.position.y)),H=Math.max(...J.map((A)=>A.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+1,w=[];for(let A=G;A>=0;A--){let j=J.filter((y)=>y.position.y===A);j.sort((y,h)=>y.position.x-h.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new j0({width:y.position.x-S}));let h=y.node.id===Q,f=K?.(y.node.data)??!1,k=U?.activeFlashOn??!1;_.push(this.renderNode(h,f,k,q,z)),S=y.position.x+this.options.nodeWidth}if(w.push(new V1({crossAxisAlignment:"start",children:_})),A>0){let y=J.filter((k)=>k.position.y===A-1),h=j,f=this.renderConnectors(y,h,Z,H,z,q);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(G+1)*B,I=[new j0({width:H,height:L}),new $5({left:O,top:E,child:N})],M=Q?J.find((A)=>A.node.id===Q):void 0;if(M&&X){let A=X(M.node.data),j=G-M.position.y,_=O+M.position.x+this.options.nodeWidth+1,S=E+j*B,y=30;if(U?.maxTitleWidthPercent&&U.viewportWidth)y=Math.floor(U.viewportWidth*U.maxTitleWidthPercent/100);I.push(new $5({left:_,top:S,child:this.renderInfoBox(A,y,z)}))}return new c0({padding:C0.horizontal(2),child:new aW(new D5({fit:"expand",children:I}))})}renderNode(J,Z,Q,Y,X){let U=J?this.options.selectedIcon:this.options.nodeIcon,K=J?Y?.threadGraphNodeSelected??X?.primary??X?.foreground:Y?.threadGraphNode??X?.primary??X?.foreground;if(Z&&Q)K=Y?.toolSuccess??X?.primary??K,U="■";return new Q0({text:new C(U,new b({color:K}))})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let U of Q){if(U.length>Z)U=U.slice(0,Z-1)+"…";if(X.length===0)X=U;else if(X.length+1+U.length<=Z)X+=" "+U;else Y.push(X),X=U}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q){let Y=this.wrapText(J,Z),X=Q?.foreground,U=[];for(let K of Y)U.push(new Q0({text:new C(K,new b({color:X??Q?.primary??Q?.foreground}))}));return new u0({crossAxisAlignment:"start",children:U})}renderConnectors(J,Z,Q,Y,X,U){let K=[],V=Math.floor(this.options.nodeWidth/2),D=U?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let q of J){let F=Z.filter((w)=>w.node.parentID===q.node.id);if(F.length===0)continue;let G=q.position.x+V,W=F.map((w)=>w.position.x+V),H=Math.min(...W),B=Math.max(...W);for(let w=H;w<=B;w++)if(w>=0&&w<Y){let N=w===G,O=W.includes(w);if(N&&O)if(F.length===1)z[w]="│";else if(w===H)z[w]="└";else if(w===B)z[w]="┘";else z[w]="┼";else if(N)if(w===H)z[w]="└";else if(w===B)z[w]="┘";else z[w]="┬";else if(O)if(w===H)z[w]="└";else if(w===B)z[w]="┘";else z[w]="┴";else if(z[w]===" ")z[w]="─"}}return K.push(new Q0({text:new C(z.join(""),new b({color:D}))})),K}}class og extends D3{onWidth;onHeight;constructor(J){super(J.child);this.onWidth=J.onWidth,this.onHeight=J.onHeight}createRenderObject(){return new pW4(this.onWidth,this.onHeight)}updateRenderObject(J){J.onWidth=this.onWidth,J.onHeight=this.onHeight}}class pW4 extends w4{onWidth;onHeight;constructor(J,Z){super();this.onWidth=J,this.onHeight=Z}performLayout(){let J=this._lastConstraints,Z=Number.isFinite(J.maxWidth)?J.maxWidth:80,Q=Number.isFinite(J.maxHeight)?J.maxHeight:24;this.onWidth(Z),this.onHeight?.(Q);let Y=this.children[0];if(Y)Y.layout(J),this.setSize(Y.size.width,Y.size.height);else this.setSize(J.minWidth,J.minHeight)}paint(J,Z,Q){for(let Y of this.children)Y.paint(J,Z,Q)}}class ZL extends p0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new lW4}}var dW4=400,cW4=300,Uf5=16;class lW4 extends g0{selectedNodeId=null;positionedNodes=[];dateComparator=(J,Z)=>{let Q=J.data.updatedAt??"",Y=Z.data.updatedAt??"";return Q.localeCompare(Y)};layoutEngine=new JT({nodeWidth:1,horizontalSpacing:1,comparator:this.dateComparator});lineCalculator=new ZT;renderer=new Vm0;animation=null;currentOffset={x:0,y:0};animationTimer=null;viewportWidth=80;viewportHeight=24;activeFlashOn=!0;activeFlashTimer=null;initState(){let{initialSelectedThreadID:J}=this.widget.props;if(J){let Q=this.widget.props.threads.find((Y)=>Y.id===J);if(Q)this.selectedNodeId=Q.id}this.startActiveFlashTimer()}startActiveFlashTimer(){if(!this.widget.props.threads.some((Z)=>Z.isActive))return;this.activeFlashTimer=setInterval(()=>{this.activeFlashOn=!this.activeFlashOn,this.setState()},700)}stopActiveFlashTimer(){if(this.activeFlashTimer)clearInterval(this.activeFlashTimer),this.activeFlashTimer=null}didUpdateWidget(J){let Z=new Set(J.props.threads.map((D)=>D.id)),Q=new Set(this.widget.props.threads.map((D)=>D.id));if(Z.size!==Q.size||[...Z].some((D)=>!Q.has(D)))this.stopAnimation(),this.currentOffset={x:0,y:0};let X=J.props.initialSelectedThreadID,U=this.widget.props.initialSelectedThreadID;if(X!==U&&U){let z=this.widget.props.threads.find((q)=>q.id===U);if(z)this.selectedNodeId=z.id,this.stopAnimation(),this.currentOffset={x:0,y:0}}let K=J.props.threads.some((D)=>D.isActive),V=this.widget.props.threads.some((D)=>D.isActive);if(K!==V){if(this.stopActiveFlashTimer(),V)this.startActiveFlashTimer()}}dispose(){this.stopAnimation(),this.stopActiveFlashTimer()}startAnimation(J){this.stopAnimation(),this.animation={startOffset:{...this.currentOffset},targetOffset:J,startTime:Date.now(),durationX:dW4,durationY:cW4};let Z=Math.max(dW4,cW4);this.animationTimer=setInterval(()=>{let Q=Date.now();if(this.currentOffset=ag(this.animation,Q),this.animation&&Q-this.animation.startTime>=Z)this.currentOffset={...this.animation.targetOffset},this.stopAnimation();this.setState()},Uf5)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null;this.animation=null}calculateCenterOffset(J,Z,Q){let Y=Math.floor(this.renderer.getNodeWidth()/2),U=Math.floor(this.viewportWidth/2)-J-Y,K=Q-Z,V=2,D=Math.floor(this.viewportHeight/2),q=Math.floor(D/2)-K;return{x:U,y:q}}animateToNode(J){let Z=this.positionedNodes.find((Q)=>Q.node.id===J);if(Z){let Q=Math.max(...this.positionedNodes.map((X)=>X.position.y)),Y=this.calculateCenterOffset(Z.position.x,Z.position.y,Q);this.startAnimation(Y)}}toGraphNodes(){return this.widget.props.threads.map((J)=>({id:J.id,parentID:J.parentID,data:{title:J.title,updatedAt:J.updatedAt,isActive:J.isActive}}))}toThreadNode(J){return{id:J.node.id,parentID:J.node.parentID,title:J.node.data.title,updatedAt:J.node.data.updatedAt}}handleKeyEvent=(J)=>{if(!this.selectedNodeId)return"ignored";let Z=this.positionedNodes,Q=Z.find((X)=>X.node.id===this.selectedNodeId);if(!Q)return"ignored";let Y;switch(J.key){case"ArrowUp":{let X=Z.filter((U)=>U.node.parentID===Q.node.id);if(X.length>0){X.sort((K,V)=>K.position.x-V.position.x);let U=Math.floor(X.length/2);Y=X[U]}break}case"ArrowDown":{Y=Z.find((X)=>X.node.id===Q.node.parentID);break}case"ArrowLeft":{let X=Z.filter((U)=>U.position.y===Q.position.y&&U.position.x<Q.position.x);if(X.length>0)X.sort((U,K)=>K.position.x-U.position.x),Y=X[0];break}case"ArrowRight":{let X=Z.filter((U)=>U.position.y===Q.position.y&&U.position.x>Q.position.x);if(X.length>0)X.sort((U,K)=>U.position.x-K.position.x),Y=X[0];break}case"Enter":{if(this.widget.props.onSelect)this.widget.props.onSelect(this.toThreadNode(Q));return"handled"}default:{if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"}}if(Y)return this.selectedNodeId=Y.node.id,this.widget.props.onSelectionChange?.(this.toThreadNode(Y)),this.animateToNode(Y.node.id),"handled";if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"};build(J){let Z=this.toGraphNodes();this.positionedNodes=this.layoutEngine.layout(Z);let Q=this.lineCalculator.calculate(this.positionedNodes);if(!this.animation&&this.currentOffset.x===0&&this.currentOffset.y===0){let q=(this.selectedNodeId?this.positionedNodes.find((F)=>F.node.id===this.selectedNodeId):null)??this.positionedNodes.find((F)=>!F.node.parentID);if(q){let F=Math.max(...this.positionedNodes.map((G)=>G.position.y));this.currentOffset=this.calculateCenterOffset(q.position.x,q.position.y,F)}}let X=this.widget.props.showTitle??!0,U=this.widget.props.offsetY??0,K={x:this.currentOffset.x,y:this.currentOffset.y+U},V=this.renderer.render(this.positionedNodes,Q,this.selectedNodeId??void 0,K,X?(z)=>z.title:void 0,{maxTitleWidthPercent:this.widget.props.maxTitleWidthPercent,viewportWidth:this.viewportWidth,activeFlashOn:this.activeFlashOn},(z)=>z.isActive??!1,J),D=new og({onWidth:(z)=>{if(this.viewportWidth!==z)this.viewportWidth=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},onHeight:(z)=>{if(this.viewportHeight!==z)this.viewportHeight=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},child:V});return new _4({autofocus:this.widget.props.autofocus??!0,onKey:this.handleKeyEvent,debugLabel:"MiniThreadGraph",child:D})}getSelectedNode(){let J=this.positionedNodes.find((Z)=>Z.node.id===this.selectedNodeId);return J?this.toThreadNode(J):null}}class nW4 extends p0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new aW4}}class aW4 extends g0{build(J){return this.widget.onContext(J),this.widget.child}}var iW4=30,Kf5=30;class QT{}class YT{}class F20{}class G20{}class Dm0 extends p0{props;constructor(J){super();this.props=J}createState(){return new oW4}}class oW4 extends g0{highlightedIndex=0;controller=new y7;focusNode;scrollController=new o6;filteredClusters=[];itemContexts=[];initState(){this.focusNode=new n4({debugLabel:"ClusterPicker"}),this.scrollController.disableFollowMode(),this.recomputeFiltered(),this.controller.addListener(()=>{this.highlightedIndex=0,this.recomputeFiltered(),this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()})})}didUpdateWidget(J){if(J.props.clusters!==this.widget.props.clusters){if(this.recomputeFiltered(),this.highlightedIndex>=this.filteredClusters.length)this.highlightedIndex=Math.max(0,this.filteredClusters.length-1)}}ensureSelectedItemVisible(){let J=this.itemContexts[this.highlightedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;lC(J,{top:Q,bottom:Y},{padding:1})}dispose(){this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}recomputeFiltered(){let J=this.controller.text.toLowerCase(),{clusters:Z}=this.widget.props;if(!J)this.filteredClusters=[...Z];else this.filteredClusters=Z.filter((Q)=>Q.label.toLowerCase().includes(J))}invoke=(J)=>{if(J instanceof QT){if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof YT){if(this.highlightedIndex>0)this.highlightedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof F20){let Z=this.filteredClusters[this.highlightedIndex];if(Z)this.widget.props.onAccept(Z);return"handled"}if(J instanceof G20)return this.widget.props.onDismiss(),"handled";return"ignored"};handleItemClick=(J,Z)=>{if(J>=0&&J<this.filteredClusters.length){if(Z===1)this.highlightedIndex=J,this.setState();else if(Z===2){let Q=this.filteredClusters[J];if(Q)this.widget.props.onAccept(Q)}}};handleScroll=(J)=>{if(this.filteredClusters.length===0)return!1;let Z=this.highlightedIndex;if(J.direction==="down")if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++;else return!1;else if(this.highlightedIndex>0)this.highlightedIndex--;else return!1;return this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.highlightedIndex!==Z};build(J){let{currentThreadID:Z}=this.widget.props,Q=x0.of(J),{colors:Y,app:X}=Q,V=o1.of(J).size.width>=Kf5+iW4,D=f1.all(new y1(Y.foreground,1,"solid")),z=this.filteredClusters[this.highlightedIndex]??null,q=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C("Select a cluster",new b({color:X.command,bold:!0}))})}),F=new l$({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),G=new B2({shortcuts:new Map([[new $4("ArrowDown"),new QT],[new $4("ArrowUp"),new YT],[new $4("Tab"),new QT],[new $4("Tab",{shift:!0}),new YT],[new $4("n",{ctrl:!0}),new QT],[new $4("p",{ctrl:!0}),new YT],[new $4("Enter"),new F20],[new $4("Escape"),new G20]]),focusNode:this.focusNode,child:F}),W=new A9({actions:new Map([[QT,new o4(this.invoke)],[YT,new o4(this.invoke)],[F20,new o4(this.invoke)],[G20,new o4(this.invoke)]]),child:G}),H=new V1({children:[new c0({decoration:{color:Y.background},child:new Q0({text:new C(">",new b({color:Y.foreground}))})}),new S1({child:W})]});this.itemContexts=[];let B=this.filteredClusters.map((I,M)=>{let A=M===this.highlightedIndex,j=Z?I.threads.some((h)=>h.id===Z):!1,_=A?X.selectionBackground:void 0,S=A?X.selectionForeground:Y.foreground,y=[new C(I.label,new b({color:S})),new C(` (${I.threads.length})`,new b({color:S,dim:!0}))];if(j)y.push(new C(" (current)",new b({color:A?X.selectionForeground:Y.success})));return new nW4(new i1({onClick:(h)=>this.handleItemClick(M,h.clickCount),child:new c0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C("",void 0,y)})})}),(h)=>{this.itemContexts[M]=h})}),w=new u0({children:B,crossAxisAlignment:"start"}),N=new S1({child:new i1({onScroll:this.handleScroll,child:new N6({controller:this.scrollController,autofocus:!1,child:w})})}),O=z?z.threads.map((I)=>({id:I.id,title:I.title,parentID:I.parentID,updatedAt:I.updatedAt})):[],E=z?new c0({padding:C0.all(1),child:new ZL({threads:O,autofocus:!1,offsetY:2})}):null,L;if(V){let I=E?new S1({child:E}):new j0({width:iW4});L=new V1({crossAxisAlignment:"stretch",mainAxisAlignment:"start",children:[N,I]})}else{let I=[new S1({child:new i1({onScroll:this.handleScroll,child:new N6({controller:this.scrollController,autofocus:!1,child:w})})})];if(E)I.push(new S1({child:E}));L=new u0({crossAxisAlignment:"stretch",children:I})}return new c0({decoration:{border:D,color:Y.background},padding:C0.symmetric(1,0),child:new u0({children:[q,H,new j0({height:1}),new S1({child:L})]})})}}class i${static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!i$._instance)i$._instance=new i$;return i$._instance}get allExpanded(){return this._allExpanded}setAllExpanded(J){if(this._allExpanded===J)return;this._allExpanded=J,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(J){return this._listeners.add(J),()=>this.removeListener(J)}removeListener(J){this._listeners.delete(J)}_notifyListeners(){for(let J of this._listeners)J()}}h0();class rW4 extends g0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){P.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){P.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){let Z=J.trim().toLowerCase();if(Z.length===0)return null;if(Z.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Z))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null&&J.length>0}getAvailableLabels(){let J=this.widget.props.currentLabels||[];return this.labels.filter((Z)=>!J.includes(Z.name))}shouldShowCreateMarker(J){if(J.length===0||this.isLoading)return!1;let Z=J.trim().toLowerCase();if(!this.isValidLabelName(Z))return!1;let Q=this.widget.props.currentLabels||[],Y=this.labels.some((U)=>U.name===Z),X=Q.includes(Z);return!Y&&!X}build(J){let Z=x0.of(J),{app:Q,colors:Y}=Z,X=this.currentQuery.trim().toLowerCase(),U=X.length>0?this.getValidationError(X):null,K=this.getAvailableLabels(),D=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...K];return new g9({title:"Add Label",items:D,getLabel:(z)=>{if("__isCreateMarker"in z)return this.currentQuery.trim().toLowerCase();return z.name},onAccept:(z)=>{if("__isCreateMarker"in z)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(z.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:U||"Type to create a new label",renderItem:(z,q,F,G)=>{let W=q?Q.selectionBackground:void 0,H=q?Q.selectionForeground:Y.foreground;if("__isCreateMarker"in z&&z.__isCreateMarker){let w=this.currentQuery.trim().toLowerCase();return new c0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C("",void 0,[new C("Create new label: ",new b({color:H})),new C(w,new b({color:H,bold:!0}))])})})}return new c0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C(z.name,new b({color:H}))})})},filterItem:(z,q)=>{if(this.currentQuery!==q)this.currentQuery=q,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in z&&z.__isCreateMarker)return this.shouldShowCreateMarker(q);let G=q.trim().toLowerCase();return G.length===0||z.name.includes(G)},sortItems:(z,q,F)=>{let G="__isCreateMarker"in z.item&&z.item.__isCreateMarker,W="__isCreateMarker"in q.item&&q.item.__isCreateMarker;if(G&&!W)return-1;if(!G&&W)return 1;return q.score-z.score}})}}class zm0 extends p0{props;constructor(J){super();this.props=J}createState(){return new rW4}}class TH extends p0{props;constructor(J){super();this.props=J}createState(){return new sW4}}class sW4 extends g0{_spinner=new L3;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Z=x0.of(J),{colors:Q,app:Y}=Z,X=f1.all(new y1(Q.foreground,1,"solid")),U=this._spinner.toBraille(),K=new Q0({textAlign:"center",text:new C("",void 0,[new C(U,new b({color:Y.processing})),new C(" ",void 0),new C(this.widget.props.message,new b({color:Q.foreground}))])}),D=[new S1({child:new u0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[K]})})];if(this.widget.props.onAbort)D.push(new j0({height:2,child:new c0({padding:C0.symmetric(2,0),child:new Q0({text:new C("",new b({dim:!0}),[new C("Press ",new b({color:Q.foreground})),new C("Esc",new b({color:Q.info})),new C(" to cancel",new b({color:Q.foreground}))])})})}));let z=new c0({decoration:new T4(Q.background,X),child:new j0({width:60,height:7,child:new u0({mainAxisAlignment:"start",children:D})})});if(this.widget.props.onAbort)return new _4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(q)=>{if(q.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:z});return z}}class A8 extends p0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:U="█",showTrack:K=!0,thumbColor:V,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=U,this.showTrack=K,this.thumbColor=V,this.trackColor=D}createState(){return new tW4}}class tW4 extends g0{_dragStartY=null;_dragStartOffset=null;_isOverThumb=!1;_isPositionOverThumb(J){let{totalContentHeight:Z,viewportHeight:Q}=this.widget.getScrollInfo(),X=this.context.findRenderObject()?.size.height??0;if(X===0||Z<=Q)return!1;let U=this.widget.getScrollInfo(),K=Math.min(1,Q/Z),V=Math.max(1,X*K),D=Math.max(0,Math.min(1,U.scrollOffset/(Z-Q))),z=X-V,q=Math.max(0,z*D),F=q+V;return J>=q&&J<=F}_handleHover=(J)=>{let Z=this._isOverThumb;if(this._isOverThumb=this._isPositionOverThumb(J.localPosition.y),Z!==this._isOverThumb)this.setState()};_handleDrag=(J)=>{let{totalContentHeight:Z,viewportHeight:Q,scrollOffset:Y}=this.widget.getScrollInfo(),U=this.context.findRenderObject()?.size.height??0;if(U===0||Z<=Q)return;if(this._dragStartY===null)this._dragStartY=J.localPosition.y,this._dragStartOffset=Y;let K=J.localPosition.y-this._dragStartY,V=Math.min(1,Q/Z),D=Math.max(1,U*V),z=U-D;if(z<=0)return;let q=Z-Q,F=z/q,G=K/F,W=Math.max(0,Math.min(q,this._dragStartOffset+G));this.widget.controller.jumpTo(W)};_handleRelease=()=>{this._dragStartY=null,this._dragStartOffset=null};_handleClick=(J)=>{if(J.button!=="left")return;let Z=J.localPosition.y,{totalContentHeight:Q,viewportHeight:Y,scrollOffset:X}=this.widget.getScrollInfo(),K=this.context.findRenderObject()?.size.height??0;if(K===0||Q<=Y)return;let V=Math.min(1,Y/Q),D=Math.max(1,K*V),z=Q-Y,q=K-D,F=Math.max(0,Math.min(1,X/(Q-Y))),G=Math.max(0,q*F),W=G+D;if(Z>=G&&Z<=W)return;if(Z<G)this.widget.controller.animateTo(Math.max(0,X-Y));else this.widget.controller.animateTo(Math.min(z,X+Y))};build(J){return new i1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?H5.POINTER:H5.DEFAULT,child:new eW4({controller:this.widget.controller,getScrollInfo:this.widget.getScrollInfo,thickness:this.widget.thickness,trackChar:this.widget.trackChar,thumbChar:this.widget.thumbChar,showTrack:this.widget.showTrack,thumbColor:this.widget.thumbColor,trackColor:this.widget.trackColor})})}}class eW4 extends QC{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:U="█",showTrack:K=!0,thumbColor:V,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=U,this.showTrack=K,this.thumbColor=V,this.trackColor=D}createRenderObject(){return new $H4(this)}updateRenderObject(J){J.updateWidget(this)}}class $H4 extends w4{_widget;constructor(J){super();this._widget=J}updateWidget(J){this._widget=J,this.markNeedsLayout()}performLayout(){let J=this._lastConstraints;u4(!!J,"performLayout called without constraints");let Z=Math.min(J.maxWidth,this._widget.thickness),Q=J.maxHeight;this.setSize(Z,Q),super.performLayout()}getMinIntrinsicWidth(J){return this._widget.thickness}getMaxIntrinsicWidth(J){return this._widget.thickness}getMinIntrinsicHeight(J){return 0}getMaxIntrinsicHeight(J){return 0}paint(J,Z,Q){let{thumbStartFloat:Y,thumbSizeFloat:X,showScrollbar:U}=this._calculateScrollbarMetrics();if(!U)return;let K=this._widget.trackColor,V=this._widget.thumbColor,D=["▁","▂","▃","▄","▅","▆","▇","█"],z=Y,q=Y+X;for(let F=0;F<this.size.height;F++){let G="█",W=!0;if(F===Math.floor(z)){let H=1-(z-F),B=Math.floor(H*8);G=D[B]||"█",W=!1}else if(F===Math.floor(q)){let H=1-(q-F),B=Math.floor(H*8);G=D[B]||"█"}else if(F>z&&F<q)W=!1;J.setChar(Z,Q+F,G,{fg:V,bg:K,reverse:W},1)}}_calculateScrollbarMetrics(){let{totalContentHeight:J,viewportHeight:Z,scrollOffset:Q}=this._widget.getScrollInfo(),Y=this.size.height;if(J<=Z||Y<=0)return{thumbStartFloat:0,thumbSizeFloat:0,showScrollbar:!1};let X=Math.max(0,Math.min(1,Q/(J-Z))),U=Math.min(1,Z/J),K=Math.max(1,Y*U),V=Y-K;return{thumbStartFloat:Math.max(0,V*X),thumbSizeFloat:K,showScrollbar:!0}}}class QL extends p0{props;constructor(J){super();this.props=J}createState(){return new JH4}}class JH4 extends g0{scrollController=new o6;scrollAreaKey=new T7("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof O2}resolveFooterStyle(J){if(this.isWidgetMessage(J))return J.footerStyle;return"default"}getViewportHeight(){let Z=this.scrollAreaKey.currentElement?.renderObject;if(Z&&"size"in Z){let Q=Z.size;if(typeof Q.height==="number"&&Q.height>0)return this.viewportHeight=Q.height,Q.height}return this.viewportHeight}build(J){let Z=x0.of(J),Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let q=u70(Q);return{title:q.title,type:q.type,description:q.description}})(),X=Y.type==="error"?Z.app.toolError:Z.app.command,U=f1.all(new y1(Z.colors.border,1,"solid")),K=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C(Y.title,new b({color:X,bold:!0}))})}),V=this.isWidgetMessage(Q)?Q.widget:new Q0({text:new C(Y.description,new b({color:Z.colors.foreground})),selectable:!0}),D=new S1({child:new w2({child:new c0({padding:C0.symmetric(1,0),child:new V1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new S1({child:new N6({controller:this.scrollController,autofocus:!0,child:V})}),new A8({controller:this.scrollController,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let q=this.scrollController.maxScrollExtent,F=this.scrollController.offset,G=this.getViewportHeight(),W=q+G;return{totalContentHeight:Math.max(W,0),viewportHeight:Math.max(G,1),scrollOffset:Math.max(F,0)}}})]})})})}),z=new c0({padding:C0.symmetric(1,0),child:new Q0({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new b({color:Z.colors.foreground,dim:!0})),new C("R",new b({color:Z.app.keybind})),new C(" to retry, ",new b({color:Z.colors.foreground,dim:!0})),new C("Esc",new b({color:Z.app.keybind})),new C(" to cancel",new b({color:Z.colors.foreground,dim:!0}))]);let q=this.resolveFooterStyle(this.widget.props.message);if(q==="none")return new C("",new b({color:Z.colors.foreground,dim:!0}));if(q==="help"){let F=new b({color:Z.app.keybind}),G=new b({color:Z.colors.foreground,dim:!0});return new C("",G,[new C("Press ",G),new C("Escape",F),new C(" to close • Use ",G),new C("↑↓",F),new C(" or ",G),new C("j/k",F),new C(" to scroll",G)])}return new C("Press any key to close",new b({color:Z.colors.foreground,dim:!0,italic:!0}))})()})});return new _4({onKey:(q)=>{if(this.widget.props.onRetry&&q.key==="r")return this.widget.props.onRetry(),"handled";if(q.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new c0({decoration:{border:U,color:Z.colors.background},padding:C0.all(1),child:new u0({mainAxisAlignment:"center",children:[K,new j0({height:1}),D,z]})})})}}n9();class ZH4 extends p0{props;constructor(J){super();this.props=J}createState(){return new QH4}}class QH4 extends g0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((J)=>{this.plugins=J,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(J){let Z=J.startsWith("file://")?J.slice(7):J,Q=this.widget.props.cwd;if(Z.startsWith(Q))return Z.slice(Q.length+1);return Z}statusIcon(J){let Z=y8.default(),{colors:Q,app:Y}=Z;switch(J){case"loading":return{icon:"◌",color:Q.warning};case"active":return{icon:"✓",color:Y.toolSuccess};case"error":return{icon:"✗",color:Y.toolError}}}build(J){let Z=x0.of(J),{app:Q}=Z;if(this.plugins.length===0)return new Q0({text:new C("No plugins found.",new b({dim:!0}))});let Y=[],X=this.plugins.length,U=this.plugins.filter((D)=>D.status==="active").length,K=this.plugins.reduce((D,z)=>D+z.registeredCommands.length,0),V=this.plugins.reduce((D,z)=>D+z.registeredTools.length,0);if(Y.push(new C(`${U}/${X} ${g4(X,"plugin")} active`,new b({bold:!0}))),K>0||V>0)Y.push(new C(` (${K} ${g4(K,"command")}, ${V} ${g4(V,"tool")})`,new b({dim:!0})));Y.push(new C(`
7064
+ `))}if(H)F.push(new C(" ",q)),F.push(new C("Total: ",q)),F.push(new C(U(B),z))}return new c0({decoration:{color:V.background,border:f1.all(new y1(V.border,1,"rounded"))},child:new Q0({text:new C(void 0,void 0,F)})})}h0();n9();import{execSync as Nf5}from"node:child_process";nM();qJ();O3();s7();jw();LX();L$();CJ();wX();dO();f4();Tu();jv();W1();var AH4=L4(qz(),1);import{writeFile as OH4}from"fs/promises";import EH4 from"path";h0();L$();class Jm0{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Z){this.enabled=J;this.configService=Z;this.startTimer()}startTimer(){this.timer=setInterval(()=>{this.flushEvents()},this.bufferTimeMs)}async flushEvents(){if(this.commandCounts.size===0||!await this.enabled())return;let J=Array.from(this.commandCounts.entries()).map(([Z,Q])=>({feature:"cli.command",action:Z,source:{client:"cli",clientVersion:"0.0.1772554299-gc34377"},parameters:{metadata:{count:Q}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Z=JSON.stringify(J);await Ss(Z,this.configService)}catch(Z){P.error("Failed to export command telemetry events",Z)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Z=this.commandCounts.get(J)||0;this.commandCounts.set(J,Z+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class CH extends p0{props;constructor(J){super();this.props=J}createState(){return new vW4}}class vW4 extends g0{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Z=(Q)=>{this.setState(()=>{this._state=Q(this._state)})};return this.widget.props.builder(J,Z,this._state)}}class kW4 extends g0{controller=new y7;focusNode=new n4({debugLabel:"CommandArgumentPrompt",onKey:(J)=>{if(J.key==="Escape")return this.widget.props.onDismiss(),"handled";return"ignored"}});_textListener=()=>{this.setState(()=>{})};initState(){this.focusNode.requestFocus(),this.controller.addListener(this._textListener)}dispose(){this.controller.removeListener(this._textListener),this.focusNode.dispose()}build(J){let Z=x0.of(J),{colors:Q,app:Y}=Z,X=this.widget.props.isRequiredArg??!0,U=this.controller.text.trim().length>0,K=!X||U,V=f1.all(new y1(Q.foreground,1,"solid")),D=new l$({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(W)=>{let H=W.trim();if(X&&H.length===0)return;this.widget.props.onSubmit(H)},autofocus:!0,style:{textColor:Q.foreground,border:null},maxLines:1}),z=new V1({children:[new c0({decoration:{color:Q.background},child:new Q0({text:new C(">",new b({color:Q.foreground}))})}),new S1({child:D})]}),q=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C("",void 0,[new C("Command: ",new b({color:Q.foreground})),new C(this.widget.props.commandName,new b({color:Y.command,bold:!0}))])})}),F=[];if(K)F.push(new C("Enter",new b({color:Y.keybind}))),F.push(new C(" to submit, ",new b({color:Q.foreground,dim:!0})));F.push(new C("Esc",new b({color:Y.keybind}))),F.push(new C(" to cancel",new b({color:Q.foreground,dim:!0})));let G=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C("",void 0,F)})});return new c0({decoration:{border:V,color:Q.background},padding:C0.all(1),child:new u0({children:[q,new j0({height:1}),z,new Z3,G]})})}}class ng extends p0{props;constructor(J){super();this.props=J}createState(){return new kW4}}import{isDeepStrictEqual as Zm0}from"node:util";var lx5=/[\\/_ +.#"@[({&]/,ix5=/[\\/_ +.#"@[({&]/g,nx5=/[\s-]/,yW4=/[\s-]/g;function U20(J,Z,Q,Y,X,U,K){if(U===Z.length){if(X===J.length)return 1;return 0.99}let V=`${X},${U}`;if(K[V]!==void 0)return K[V];let D=Y.charAt(U),z=Q.indexOf(D,X),q=0,F,G,W,H;while(z>=0){if(F=U20(J,Z,Q,Y,z+1,U+1,K),F>q){if(z===X)F*=1;else if(nx5.test(J.charAt(z-1))){if(F*=0.9,H=J.slice(X,z-1).match(yW4),H&&X>0)F*=0.999**H.length}else if(lx5.test(J.charAt(z-1))){if(F*=0.8,W=J.slice(X,z-1).match(ix5),W&&X>0)F*=0.999**W.length}else if(F*=0.3,X>0)F*=0.999**(z-X);if(J.charAt(z)!==Z.charAt(U))F*=0.9999}if(F<0.1&&(Q.charAt(z-1)===Y.charAt(U+1)||Y.charAt(U+1)===Y.charAt(U)&&Q.charAt(z-1)!==Y.charAt(U))){if(G=U20(J,Z,Q,Y,z+1,U+2,K),G*0.1>F)F=G*0.1}if(F>q)q=F;z=Q.indexOf(D,z+1)}return K[V]=q,q}function X20(J){return J.toLowerCase().replace(yW4," ")}function uW4(J,Z){let Q=U20(J,Z,X20(J),X20(Z),0,0,{}),Y=Z.trim().split(/\s+/);if(Y.length>1){let X=0,U=0;for(let V of Y){let D=U20(J,V,X20(J),X20(V),0,0,{});if(D===0)return Q;X+=D,U+=V.length}let K=X/Y.length*0.95;return Math.max(Q,K)}return Q}class eC{}class $T{}class K20{}class V20{}class xW4 extends p0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new fW4}}class fW4 extends g0{build(J){return this.widget.onContext(J),this.widget.child}}function ax5(J,Z){if(J==="")return{matches:!0,score:1};let Q=uW4(Z,J);return{matches:Q>0.15,score:Q}}class g9 extends p0{props;debugLabel="FuzzyPicker";constructor(J){super();this.props=J}createState(){return new bW4}}class bW4 extends g0{textController;focusNode;scrollController=new o6;selectedIndex=0;itemContexts=[];hasUserInteracted=!1;cachedQuery="";cachedItemsRef=null;cachedFiltered=[];initState(){if(this.scrollController.disableFollowMode(),this.textController=new y7(this.widget.props.controller?.query??""),this.focusNode=new n4({debugLabel:this.widget.debugLabel}),this.textController.addListener(()=>{this.hasUserInteracted=!0,this.selectedIndex=0,this.recomputeFilteredItems(),this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});let J=this.widget.props.controller;if(J)J.query=this.textController.text;this.syncSelection()}),this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let J=this.cachedFiltered.findIndex((Z)=>Zm0(Z,this.widget.props.controller?.selectedItem));if(J>=0)this.selectedIndex=J}this.clampSelectedIndex(),this.syncSelection(),this.ensureSelectedItemVisible()}didUpdateWidget(J){if(!Zm0(J.props.items,this.widget.props.items)){if(this.recomputeFilteredItems(),this.widget.props.controller?.selectedItem){let Z=this.cachedFiltered.findIndex((Q)=>Zm0(Q,this.widget.props.controller?.selectedItem));if(Z>=0)this.selectedIndex=Z}this.clampSelectedIndex(),this.ensureSelectedItemVisible(),this.syncSelection()}}dispose(){this.widget.props.onSelectionChange?.(null),this.textController.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}invoke=(J)=>{if(J instanceof eC){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof $T){if(this.getFilteredItems().length>0&&this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection();return"handled"}if(J instanceof K20){let Z=this.getFilteredItems();if(Z.length>0&&this.selectedIndex<Z.length){let Q=Z[this.selectedIndex];if(Q){if(!(this.widget.props.isItemDisabled?.(Q)??!1))this.widget.props.onAccept(Q,{hasUserInteracted:this.hasUserInteracted})}}return"handled"}if(J instanceof V20)return this.widget.props.onDismiss?.(),"handled";return"ignored"};syncSelection(){let Z=this.cachedFiltered[this.selectedIndex]??null;if(this.widget.props.controller)this.widget.props.controller.selectedItem=Z;this.widget.props.onSelectionChange?.(Z)}clampSelectedIndex(){let J=this.cachedFiltered.length-1;if(J<0){this.selectedIndex=0;return}this.selectedIndex=Math.max(0,Math.min(this.selectedIndex,J))}recomputeFilteredItems(){let J=this.textController.text,Z=this.widget.props.items,Q=this.widget.props.normalizeQuery?.(J)??J,Y=Z.filter((X)=>!this.widget.props.filterItem||this.widget.props.filterItem(X,J)).map((X)=>({item:X,...ax5(Q,this.widget.props.getLabel(X))})).filter((X)=>X.matches).sort(this.widget.props.sortItems?(X,U)=>this.widget.props.sortItems(X,U,J):(X,U)=>U.score-X.score).map((X)=>X.item);this.cachedQuery=J,this.cachedItemsRef=Z,this.cachedFiltered=this.widget.props.maxRenderItems?Y.slice(0,this.widget.props.maxRenderItems):Y}getFilteredItems(){let J=this.textController.text,Z=this.widget.props.items;if(this.cachedQuery===J&&this.cachedItemsRef===Z)return this.cachedFiltered;return this.recomputeFilteredItems(),this.cachedFiltered}ensureSelectedItemVisible(){let J=this.itemContexts[this.selectedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;lC(J,{top:Q,bottom:Y},{padding:1})}handleScroll=(J)=>{let Z=this.getFilteredItems();if(Z.length===0)return!1;let Q=this.selectedIndex;if(J.direction==="down")if(this.selectedIndex<Z.length-1)this.hasUserInteracted=!0,this.selectedIndex++;else return!1;else if(this.selectedIndex>0)this.hasUserInteracted=!0,this.selectedIndex--;else return!1;return this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.syncSelection(),this.selectedIndex!==Q};handleItemClick=(J,Z)=>{let Q=this.getFilteredItems();if(J>=0&&J<Q.length){let Y=Q[J],X=Y?this.widget.props.isItemDisabled?.(Y)??!1:!1;if(Z===1)this.hasUserInteracted=!0,this.selectedIndex=J,this.setState(),this.syncSelection();else if(Z===2&&!X){if(Y)this.hasUserInteracted=!0,this.widget.props.onAccept(Y,{hasUserInteracted:this.hasUserInteracted})}}};build(J){let Z=x0.of(J),{colors:Q}=Z,Y=this.getFilteredItems(),X=f1.all(new y1(Q.foreground,1,"solid")),U=this.widget.props.hidePromptWhenLoading&&this.widget.props.isLoading,K=this.widget.props.enabled??!0,V=new l$({controller:this.textController,focusNode:this.focusNode,autofocus:!0,enabled:K,style:{backgroundColor:Q.background,textColor:Q.foreground,cursorColor:Q.cursor,placeholderColor:Q.mutedForeground,border:null},maxLines:1}),D=new B2({shortcuts:new Map([[new $4("ArrowDown"),new eC],[new $4("ArrowUp"),new $T],[new $4("Tab"),new eC],[new $4("Tab",{shift:!0}),new $T],[new $4("n",{ctrl:!0}),new eC],[new $4("p",{ctrl:!0}),new $T],[new $4("Enter"),new K20],[new $4("Escape"),new V20]]),focusNode:this.focusNode,child:V}),z=new A9({actions:new Map([[eC,new o4(this.invoke)],[$T,new o4(this.invoke)],[K20,new o4(this.invoke)],[V20,new o4(this.invoke)]]),child:D}),q=new V1({children:[new c0({decoration:{color:Q.background},child:new Q0({text:new C(">",new b({color:Q.foreground}))})}),new S1({child:z})]});this.itemContexts=[];let F;if(this.widget.props.isLoading){let w=this.widget.props.loadingText??"Loading...";F=new j0({height:10,child:new n1({child:new Q0({text:new C(w,new b({color:Q.foreground}))})})})}else if(Y.length===0&&this.widget.props.emptyStateText)F=new S1({child:new n1({child:new Q0({text:new C(this.widget.props.emptyStateText,new b({color:Q.foreground,dim:!0}))})})});else{let w=Y.map((N,O)=>{let E=O===this.selectedIndex,L=this.widget.props.isItemDisabled?.(N)??!1,I;if(this.widget.props.renderItem)I=this.widget.props.renderItem(N,E,L,J);else{let M=E?Z.app.selectionBackground:void 0,A=E?Z.app.selectionForeground:Q.foreground;I=new c0({decoration:M?{color:M}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C(this.widget.props.getLabel(N),new b({color:A,dim:L}))})})}return new xW4(new i1({onClick:(M)=>this.handleItemClick(O,M.clickCount),child:I}),(M)=>{this.itemContexts[O]=M})});F=new u0({children:w,crossAxisAlignment:"start"})}let G=new i1({onScroll:this.handleScroll,opaque:!1,child:new N6({controller:this.scrollController,autofocus:!1,child:F})}),W=[];if(this.widget.props.title){let w=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C(this.widget.props.title,new b({color:Z.app.command,bold:!0}))})});W.push(w)}if(!U)W.push(q,new j0({height:1}));if(this.textController.text!==""){let w=Y.length>0?Y[this.selectedIndex]:void 0,N=w&&this.widget.props.buildDisabledReasonWidget?.(w,J);W.push(new S1({child:new u0({mainAxisAlignment:"spaceBetween",children:[new S1({child:G}),new c0({padding:C0.only({top:1}),child:new n1({child:N??new j0({height:1})})})]})}))}else W.push(new S1({child:G}));if(this.widget.props.footer)W.push(this.widget.props.footer);return new c0({decoration:{border:X,color:Q.background},padding:C0.symmetric(1,0),child:new u0({children:W})})}}function hW4(J){let Q=new Date().getTime()-J.getTime(),Y=Math.floor(Q/60000),X=Math.floor(Q/3600000),U=Math.floor(Q/86400000);if(Y<1)return"just now";if(Y<60)return`${Y}m ago`;if(X<24)return`${X}h ago`;if(U<7)return`${U}d ago`;return J.toLocaleDateString()}class Qm0 extends d1{props;debugLabel="NewsFeedPicker";constructor(J){super();this.props=J}build(J){let Z=[...this.props.entries].sort((X,U)=>U.pubDate.getTime()-X.pubDate.getTime()),Q=Math.max(0,...Z.map((X)=>hW4(X.pubDate).length));return new g9({items:Z,getLabel:(X)=>X.title,onAccept:(X)=>this.props.onSelect?.(X),onDismiss:this.props.onDismiss,title:this.props.title,emptyStateText:"No news entries available",maxRenderItems:100,renderItem:(X,U,K,V)=>{let D=x0.of(V),{colors:z}=D,q=D.app,F=U?q.selectionBackground:void 0,G=U?q.selectionForeground:z.foreground,W=z.mutedForeground,H=(B,w)=>new j0({width:w,child:V1.end([new Q0({text:new C(B,new b({color:W}))})])});return new c0({decoration:F?{color:F}:void 0,padding:C0.symmetric(2,0),child:new V1({children:[new S1({child:new Q0({text:new C(X.title,new b({color:G})),overflow:"ellipsis",maxLines:1})}),new j0({width:2}),H(hW4(X.pubDate),Q)]})})}})}}f4();class Ym0 extends p0{createState(){return new mW4}}class mW4 extends g0{isGreen=!0;timer;initState(){this.timer=setInterval(()=>{this.isGreen=!this.isGreen,this.setState()},700)}dispose(){if(this.timer)clearInterval(this.timer);super.dispose()}build(J){let Q=x0.of(J).colors;return new Q0({text:new C("●",new b({color:this.isGreen?Q.success:Q.mutedForeground,bold:!0})),maxLines:1})}}var ox5=/\/threads\/(T-[^/?#\s<>]+)/i;function rx5(J){let Z=J.trim(),Y=Z.match(ox5)?.[1];if(Y&&C8(Y))return Y;let X=Z.replace(/^[<("'`]+|[>")'`,.]+$/g,"");if(C8(X))return X;return null}function sx5(J){let Z=new Map,Q=new Map,Y=new Map,X=[];for(let K of J)Z.set(K.id,K);for(let K of J){let V=K.relationships.find((D)=>D.role==="child"&&Z.has(D.threadID)&&(D.type==="fork"||D.type==="handoff"));if(V){Y.set(K.id,V.type);let D=V.threadID,z=Q.get(D)||[];z.push(K),Q.set(D,z)}else X.push(K)}return j90.flatten(X,(K)=>Q.get(K.id)).map((K)=>({...K.item,depth:K.depth,isLast:K.isLast,ancestorsAreLast:K.ancestorsAreLast,relationshipType:Y.get(K.item.id)}))}function Xm0(J,Z,Q){return new Q0({text:new C(`${J}${Z}`,new b({color:Q})),maxLines:1})}function tx5(J,Z,Q,Y){return[Xm0("+",J,Y.success),Z3.horizontal(1),Xm0("~",Z,Y.warning),Z3.horizontal(1),Xm0("-",Q,Y.destructive)]}function ex5(J){return typeof J==="object"&&J!==null&&"then"in J&&typeof J.then==="function"}class D20 extends p0{props;debugLabel="ThreadContinuationPicker";constructor(J){super();this.props=J}createState(){return new gW4}}class gW4 extends g0{spinner=new L3;spinnerInterval=null;isSwitchingThread=!1;get isBusy(){return this.isSwitchingThread||this.widget.props.isLoading===!0}updateSpinnerAnimation(){if(this.isBusy){if(!this.spinnerInterval)this.spinnerInterval=setInterval(()=>{this.spinner.step(),this.setState(()=>{})},100);return}if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null}setSwitchingThread(J){if(this.isSwitchingThread===J)return;this.setState(()=>{this.isSwitchingThread=J}),this.updateSpinnerAnimation()}initState(){super.initState(),this.updateSpinnerAnimation()}didUpdateWidget(J){this.updateSpinnerAnimation()}dispose(){if(this.spinnerInterval)clearInterval(this.spinnerInterval),this.spinnerInterval=null;super.dispose()}build(J){let{props:Z}=this.widget,Q=this.isBusy,Y=this.isSwitchingThread?"Switching thread...":"Loading threads...",X=`${this.spinner.toBraille()} ${Y}`,U=Z.filterByWorkspace&&Z.currentWorkspaceURI?Z.threads.filter((O)=>O.workspaceURI===Z.currentWorkspaceURI):Z.threads;if(Z.excludeCurrentThread&&Z.currentThreadID)U=U.filter((O)=>O.id!==Z.currentThreadID);let K=Z.recentThreadIDs||[],V=new Set(K),D=Z.currentThreadID,z=[...U].sort((O,E)=>{if(D){if(O.id===D)return-1;if(E.id===D)return 1}let L=K.indexOf(O.id),I=K.indexOf(E.id);if(L!==-1&&I!==-1)return L-I;if(L!==-1)return-1;if(I!==-1)return 1;return 0}),q=sx5(z),F=Math.max(0,...q.map((O)=>O.description.timeAgo.length)),G=x0.of(J),W=new a0({padding:C0.symmetric(0,1),child:new n1({child:new Q0({text:new C("",new b({color:G.colors.foreground,dim:!0}),[new C("Ctrl+T",new b({color:G.colors.primary,dim:!0})),new C(Z.filterByWorkspace?" for all workspaces":" to filter by workspace",new b({color:G.colors.foreground,dim:!0}))])})})}),H="",B=null,w=(O)=>{if(O!==H)H=O,B=rx5(O);return B};return new g9({items:q,getLabel:(O)=>`${O.title} ${O.id}`,filterItem:(O,E)=>{let L=w(E);if(L)return O.id.toLowerCase()===L.toLowerCase();return!0},normalizeQuery:(O)=>w(O)?"":O,onAccept:async(O,E)=>{if(!Z.onSelect||this.isSwitchingThread)return;let L=Z.onSelect(O.id,E);if(!ex5(L))return;this.setSwitchingThread(!0);try{await L}finally{if(this.mounted)this.setSwitchingThread(!1)}},onDismiss:Z.onDismiss,onSelectionChange:(O)=>{if(Z.previewController){if(O)Z.previewController.select(O.id)}},title:Z.title,enabled:!Q,isLoading:Q,hidePromptWhenLoading:!0,loadingText:X,emptyStateText:"No threads match your filter",maxRenderItems:200,footer:Q?void 0:W,renderItem:(O,E,L,I)=>{let M=x0.of(I),{app:A,colors:j}=M,_=E?A.selectionBackground:void 0,S=E?A.selectionForeground:j.foreground,y=j.mutedForeground,h=(e,B0)=>new j0({width:B0,child:V1.end([new Q0({text:new C(e,new b({color:y}))})])}),f=Z.threadViewStates[O.id],k=[],x=O.relationshipType==="handoff",g=new Fg({connectorColor:j.mutedForeground});if(O.depth>0){let e=[],B0=O.ancestorsAreLast.slice(1);for(let K0 of B0)e.push(new C(g.getAncestorPrefix(K0),new b({color:g.connectorColor,dim:g.connectorDim})));let n=O.isLast?g.elbow:g.tee,U0=g.getConnectorText(n);e.push(new C(U0,new b({color:g.connectorColor,dim:g.connectorDim}))),k.push(new Q0({text:new C("",void 0,e)}))}let a=[],m=D===O.id?new C("(current) ",new b({color:j.success})):V.has(O.id)?new C("(visited) ",new b({color:j.foreground,dim:!0})):null;if(m)a.push(new Q0({text:m}));if(FO(f))a.push(new Ym0),a.push(new j0({width:1}));let i=O.title;if(O.relationshipType==="fork"){let e=i.match(/^Forked\((\d+)\): /);if(e)i=i.slice(e[0].length);else while(i.startsWith("Forked: "))i=i.slice(8);a.push(new Q0({text:new C("[fork] ",new b({color:j.primary}))}))}else if(x)a.push(new Q0({text:new C("[handoff] ",new b({color:j.accent}))}));if(a.push(new S1({child:new Q0({text:new C(i,new b({color:S})),overflow:"ellipsis",maxLines:1})})),a.push(new j0({width:2})),O.diffStats&&(O.diffStats.added>0||O.diffStats.changed>0||O.diffStats.deleted>0)){let e=E?{success:y,warning:y,destructive:y}:j;a.push(...tx5(O.diffStats.added,O.diffStats.changed,O.diffStats.deleted,e)),a.push(new j0({width:2}))}return a.push(h(O.description.timeAgo,F)),new c0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new V1({children:[...k,...a]})})}})}}function Um0(J){return 1-(1-J)**3}function Km0(J,Z,Q){return J+(Z-J)*Q}function ag(J,Z){if(!J)return{x:0,y:0};let Q=Z-J.startTime,Y=Math.min(Q/J.durationX,1),X=Math.min(Q/J.durationY,1),U=Um0(Y),K=Um0(X);return{x:Km0(J.startOffset.x,J.targetOffset.x,U),y:Km0(J.startOffset.y,J.targetOffset.y,K)}}var $f5={nodeWidth:3,horizontalSpacing:3};class JT{options;constructor(J={}){this.options={...$f5,...J}}layout(J){let{childrenMap:Z,resolvedParent:Q}=this.buildTree(J),Y=[],X=Z.get(void 0)??[];if(this.options.comparator)X.sort(this.options.comparator);let U=0,K=(V,D)=>{let z=Z.get(V.id)??[];if(this.options.comparator)z.sort(this.options.comparator);let q={...V,parentID:Q.get(V.id)};if(z.length===0){Y.push({node:q,position:{x:U,y:D}});let B=U;return U+=this.options.nodeWidth+this.options.horizontalSpacing,B}let F=[];for(let B of z)F.push(K(B,D+1));let G=Math.min(...F),W=Math.max(...F),H=Math.floor((G+W)/2);return Y.push({node:q,position:{x:H,y:D}}),H};for(let V of X)K(V,0);return Y}buildTree(J){let Z=new Set(J.map((U)=>U.id)),Q=[...J].sort((U,K)=>U.id.localeCompare(K.id)),Y=new Map;for(let U of Q){if(!U.parentID||!Z.has(U.parentID)){Y.set(U.id,void 0);continue}let K=!1,V=U.parentID;while(V){if(V===U.id){K=!0;break}V=Y.get(V)}Y.set(U.id,K?void 0:U.parentID)}let X=new Map;for(let U of J){let K=Y.get(U.id);if(!X.has(K))X.set(K,[]);X.get(K).push(U)}return{childrenMap:X,resolvedParent:Y}}}var Jf5={nodeWidth:3,nodeHeight:2};class ZT{options;constructor(J={}){this.options={...Jf5,...J}}calculate(J){let Z=[],Q=new Map;for(let Y of J)Q.set(Y.node.id,Y);for(let Y of J){if(!Y.node.parentID)continue;let X=Q.get(Y.node.parentID);if(!X)continue;let U=this.calculateConnectorLine(X.position,Y.position);Z.push({points:U,fromNodeID:X.node.id,toNodeID:Y.node.id})}return Z}calculateConnectorLine(J,Z){let Q=Math.floor(this.options.nodeWidth/2),Y=[],X=J.x+Q,U=Z.x+Q,K=J.y*(this.options.nodeHeight+3)+this.options.nodeHeight;Y.push({x:X,y:K});let V=K+1;if(Y.push({x:X,y:V}),X!==U)Y.push({x:U,y:V});let D=Z.y*(this.options.nodeHeight+3)-1;return Y.push({x:U,y:D}),Y}}var Zf5={nodeWidth:3,nodeHeight:2},Qf5={x:0,y:0};class q20{options;constructor(J={}){this.options={...Zf5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Qf5,X,U,K,V){let D=V?x0.of(V):null,z=D?.colors,q=D?.app,F=z?.mutedForeground??z?.foreground;if(J.length===0)return new Q0({text:new C("No nodes",new b({color:F}))});let G=Math.max(...J.map((A)=>A.position.y)),H=Math.max(...J.map((A)=>A.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+3,w=[];for(let A=G;A>=0;A--){let j=J.filter((y)=>y.position.y===A);j.sort((y,h)=>y.position.x-h.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new j0({width:y.position.x-S}));let h=y.node.id===Q,f=K?.(y.node.data)??!1,k=U?.activeFlashOn??!1,x=y.node.id===U?.copyFlashNodeId;_.push(this.renderNode(h,f,k,x,q,z)),S=y.position.x+this.options.nodeWidth}if(w.push(new V1({crossAxisAlignment:"start",children:_})),A>0){let y=J.filter((k)=>k.position.y===A-1),h=j,f=this.renderConnectors(y,h,Z,H,z,q);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(G+1)*B,I=[new j0({width:H,height:L}),new $5({left:O,top:E,child:N})],M=Q?J.find((A)=>A.node.id===Q):void 0;if(M&&X){let A=X(M.node.data),j=G-M.position.y,_=O+M.position.x+this.options.nodeWidth+1,S=E+j*B+1,y=30;if(U?.maxTitleWidthPercent&&U.viewportWidth)y=Math.floor(U.viewportWidth*U.maxTitleWidthPercent/100);I.push(new $5({left:_,top:S,child:this.renderInfoBox(A,y,z,q)}))}return new c0({padding:C0.horizontal(2),child:new aW(new D5({fit:"expand",children:I}))})}renderNode(J,Z,Q,Y,X,U){let K="┌─┐",V="└─┘",D=J?X?.threadGraphNodeSelected??U?.primary??U?.foreground:X?.threadGraphNode??U?.primary??U?.foreground,z=!1;if(Y)D=X?.threadGraphNodeSelected??U?.primary??D,K="┏━┓",V="┗━┛",z=!0;else if(Z&&Q)D=X?.toolSuccess??U?.primary??D,K="┏━┓",V="┗━┛";return new u0({crossAxisAlignment:"start",children:[new Q0({text:new C(K,new b({color:D,bold:z}))}),new Q0({text:new C(V,new b({color:D,bold:z}))})]})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let U of Q){if(U.length>Z)U=U.slice(0,Z-1)+"…";if(X.length===0)X=U;else if(X.length+1+U.length<=Z)X+=" "+U;else Y.push(X),X=U}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q,Y){let X=this.wrapText(J,Z),U=Math.min(Z,Math.max(1,...X.map((G)=>G.length))),K=U+2,V="┌"+"─".repeat(K)+"┐",D="└"+"─".repeat(K)+"┘",z=Q?.border??Y?.threadGraphConnector??Q?.foreground,q=Q?.foreground,F=[new Q0({text:new C(V,new b({color:z}))})];for(let G of X){let W=" ".repeat(U-G.length);F.push(new Q0({text:new C("│ ",new b({color:z}),[new C(G+W,new b({color:q??z})),new C(" │",new b({color:z}))])}))}return F.push(new Q0({text:new C(D,new b({color:z}))})),new u0({crossAxisAlignment:"start",children:F})}renderConnectors(J,Z,Q,Y,X,U){let K=[],V=Math.floor(this.options.nodeWidth/2),D=U?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let G of Z){let W=G.position.x+V;if(W>=0&&W<Y)z[W]="▲"}K.push(new Q0({text:new C(z.join(""),new b({color:D}))}));let q=Array(Y).fill(" ");for(let G of J){let W=Z.filter((O)=>O.node.parentID===G.node.id);if(W.length===0)continue;let H=G.position.x+V,B=W.map((O)=>O.position.x+V),w=Math.min(...B),N=Math.max(...B);for(let O=w;O<=N;O++)if(O>=0&&O<Y){if(O===H)if(W.length===1&&B[0]===H)q[O]="│";else if(O===w)q[O]="└";else if(O===N)q[O]="┘";else q[O]="┬";else if(B.includes(O))if(O===w)q[O]="└";else if(O===N)q[O]="┘";else q[O]="┴";else if(q[O]===" ")q[O]="─"}}K.push(new Q0({text:new C(q.join(""),new b({color:D}))}));let F=Array(Y).fill(" ");for(let G of J){if(Z.filter((B)=>B.node.parentID===G.node.id).length===0)continue;let H=G.position.x+V;if(H>=0&&H<Y)F[H]="│"}return K.push(new Q0({text:new C(F.join(""),new b({color:D}))})),K}}var Yf5={nodeWidth:1,nodeHeight:1,nodeIcon:"□",selectedIcon:"□"},Xf5={x:0,y:0};class Vm0{options;constructor(J={}){this.options={...Yf5,...J}}getNodeWidth(){return this.options.nodeWidth}render(J,Z,Q,Y=Xf5,X,U,K,V){let D=V?x0.of(V):null,z=D?.colors,q=D?.app,F=z?.mutedForeground??z?.foreground;if(J.length===0)return new Q0({text:new C("No nodes",new b({color:F}))});let G=Math.max(...J.map((A)=>A.position.y)),H=Math.max(...J.map((A)=>A.position.x))+this.options.nodeWidth+3,B=this.options.nodeHeight+1,w=[];for(let A=G;A>=0;A--){let j=J.filter((y)=>y.position.y===A);j.sort((y,h)=>y.position.x-h.position.x);let _=[],S=0;for(let y of j){if(y.position.x>S)_.push(new j0({width:y.position.x-S}));let h=y.node.id===Q,f=K?.(y.node.data)??!1,k=U?.activeFlashOn??!1;_.push(this.renderNode(h,f,k,q,z)),S=y.position.x+this.options.nodeWidth}if(w.push(new V1({crossAxisAlignment:"start",children:_})),A>0){let y=J.filter((k)=>k.position.y===A-1),h=j,f=this.renderConnectors(y,h,Z,H,z,q);w.push(...f)}}let N=new u0({crossAxisAlignment:"start",children:w}),O=Math.round(Y.x),E=Math.round(Y.y*B),L=(G+1)*B,I=[new j0({width:H,height:L}),new $5({left:O,top:E,child:N})],M=Q?J.find((A)=>A.node.id===Q):void 0;if(M&&X){let A=X(M.node.data),j=G-M.position.y,_=O+M.position.x+this.options.nodeWidth+1,S=E+j*B,y=30;if(U?.maxTitleWidthPercent&&U.viewportWidth)y=Math.floor(U.viewportWidth*U.maxTitleWidthPercent/100);I.push(new $5({left:_,top:S,child:this.renderInfoBox(A,y,z)}))}return new c0({padding:C0.horizontal(2),child:new aW(new D5({fit:"expand",children:I}))})}renderNode(J,Z,Q,Y,X){let U=J?this.options.selectedIcon:this.options.nodeIcon,K=J?Y?.threadGraphNodeSelected??X?.primary??X?.foreground:Y?.threadGraphNode??X?.primary??X?.foreground;if(Z&&Q)K=Y?.toolSuccess??X?.primary??K,U="■";return new Q0({text:new C(U,new b({color:K}))})}wrapText(J,Z){let Q=J.split(" "),Y=[],X="";for(let U of Q){if(U.length>Z)U=U.slice(0,Z-1)+"…";if(X.length===0)X=U;else if(X.length+1+U.length<=Z)X+=" "+U;else Y.push(X),X=U}if(X.length>0)Y.push(X);return Y}renderInfoBox(J,Z=30,Q){let Y=this.wrapText(J,Z),X=Q?.foreground,U=[];for(let K of Y)U.push(new Q0({text:new C(K,new b({color:X??Q?.primary??Q?.foreground}))}));return new u0({crossAxisAlignment:"start",children:U})}renderConnectors(J,Z,Q,Y,X,U){let K=[],V=Math.floor(this.options.nodeWidth/2),D=U?.threadGraphConnector??X?.primary??X?.foreground,z=Array(Y).fill(" ");for(let q of J){let F=Z.filter((w)=>w.node.parentID===q.node.id);if(F.length===0)continue;let G=q.position.x+V,W=F.map((w)=>w.position.x+V),H=Math.min(...W),B=Math.max(...W);for(let w=H;w<=B;w++)if(w>=0&&w<Y){let N=w===G,O=W.includes(w);if(N&&O)if(F.length===1)z[w]="│";else if(w===H)z[w]="└";else if(w===B)z[w]="┘";else z[w]="┼";else if(N)if(w===H)z[w]="└";else if(w===B)z[w]="┘";else z[w]="┬";else if(O)if(w===H)z[w]="└";else if(w===B)z[w]="┘";else z[w]="┴";else if(z[w]===" ")z[w]="─"}}return K.push(new Q0({text:new C(z.join(""),new b({color:D}))})),K}}class og extends D3{onWidth;onHeight;constructor(J){super(J.child);this.onWidth=J.onWidth,this.onHeight=J.onHeight}createRenderObject(){return new pW4(this.onWidth,this.onHeight)}updateRenderObject(J){J.onWidth=this.onWidth,J.onHeight=this.onHeight}}class pW4 extends w4{onWidth;onHeight;constructor(J,Z){super();this.onWidth=J,this.onHeight=Z}performLayout(){let J=this._lastConstraints,Z=Number.isFinite(J.maxWidth)?J.maxWidth:80,Q=Number.isFinite(J.maxHeight)?J.maxHeight:24;this.onWidth(Z),this.onHeight?.(Q);let Y=this.children[0];if(Y)Y.layout(J),this.setSize(Y.size.width,Y.size.height);else this.setSize(J.minWidth,J.minHeight)}paint(J,Z,Q){for(let Y of this.children)Y.paint(J,Z,Q)}}class ZL extends p0{props;constructor(J){super({key:J.key});this.props=J}createState(){return new lW4}}var dW4=400,cW4=300,Uf5=16;class lW4 extends g0{selectedNodeId=null;positionedNodes=[];dateComparator=(J,Z)=>{let Q=J.data.updatedAt??"",Y=Z.data.updatedAt??"";return Q.localeCompare(Y)};layoutEngine=new JT({nodeWidth:1,horizontalSpacing:1,comparator:this.dateComparator});lineCalculator=new ZT;renderer=new Vm0;animation=null;currentOffset={x:0,y:0};animationTimer=null;viewportWidth=80;viewportHeight=24;activeFlashOn=!0;activeFlashTimer=null;initState(){let{initialSelectedThreadID:J}=this.widget.props;if(J){let Q=this.widget.props.threads.find((Y)=>Y.id===J);if(Q)this.selectedNodeId=Q.id}this.startActiveFlashTimer()}startActiveFlashTimer(){if(!this.widget.props.threads.some((Z)=>Z.isActive))return;this.activeFlashTimer=setInterval(()=>{this.activeFlashOn=!this.activeFlashOn,this.setState()},700)}stopActiveFlashTimer(){if(this.activeFlashTimer)clearInterval(this.activeFlashTimer),this.activeFlashTimer=null}didUpdateWidget(J){let Z=new Set(J.props.threads.map((D)=>D.id)),Q=new Set(this.widget.props.threads.map((D)=>D.id));if(Z.size!==Q.size||[...Z].some((D)=>!Q.has(D)))this.stopAnimation(),this.currentOffset={x:0,y:0};let X=J.props.initialSelectedThreadID,U=this.widget.props.initialSelectedThreadID;if(X!==U&&U){let z=this.widget.props.threads.find((q)=>q.id===U);if(z)this.selectedNodeId=z.id,this.stopAnimation(),this.currentOffset={x:0,y:0}}let K=J.props.threads.some((D)=>D.isActive),V=this.widget.props.threads.some((D)=>D.isActive);if(K!==V){if(this.stopActiveFlashTimer(),V)this.startActiveFlashTimer()}}dispose(){this.stopAnimation(),this.stopActiveFlashTimer()}startAnimation(J){this.stopAnimation(),this.animation={startOffset:{...this.currentOffset},targetOffset:J,startTime:Date.now(),durationX:dW4,durationY:cW4};let Z=Math.max(dW4,cW4);this.animationTimer=setInterval(()=>{let Q=Date.now();if(this.currentOffset=ag(this.animation,Q),this.animation&&Q-this.animation.startTime>=Z)this.currentOffset={...this.animation.targetOffset},this.stopAnimation();this.setState()},Uf5)}stopAnimation(){if(this.animationTimer)clearInterval(this.animationTimer),this.animationTimer=null;this.animation=null}calculateCenterOffset(J,Z,Q){let Y=Math.floor(this.renderer.getNodeWidth()/2),U=Math.floor(this.viewportWidth/2)-J-Y,K=Q-Z,V=2,D=Math.floor(this.viewportHeight/2),q=Math.floor(D/2)-K;return{x:U,y:q}}animateToNode(J){let Z=this.positionedNodes.find((Q)=>Q.node.id===J);if(Z){let Q=Math.max(...this.positionedNodes.map((X)=>X.position.y)),Y=this.calculateCenterOffset(Z.position.x,Z.position.y,Q);this.startAnimation(Y)}}toGraphNodes(){return this.widget.props.threads.map((J)=>({id:J.id,parentID:J.parentID,data:{title:J.title,updatedAt:J.updatedAt,isActive:J.isActive}}))}toThreadNode(J){return{id:J.node.id,parentID:J.node.parentID,title:J.node.data.title,updatedAt:J.node.data.updatedAt}}handleKeyEvent=(J)=>{if(!this.selectedNodeId)return"ignored";let Z=this.positionedNodes,Q=Z.find((X)=>X.node.id===this.selectedNodeId);if(!Q)return"ignored";let Y;switch(J.key){case"ArrowUp":{let X=Z.filter((U)=>U.node.parentID===Q.node.id);if(X.length>0){X.sort((K,V)=>K.position.x-V.position.x);let U=Math.floor(X.length/2);Y=X[U]}break}case"ArrowDown":{Y=Z.find((X)=>X.node.id===Q.node.parentID);break}case"ArrowLeft":{let X=Z.filter((U)=>U.position.y===Q.position.y&&U.position.x<Q.position.x);if(X.length>0)X.sort((U,K)=>K.position.x-U.position.x),Y=X[0];break}case"ArrowRight":{let X=Z.filter((U)=>U.position.y===Q.position.y&&U.position.x>Q.position.x);if(X.length>0)X.sort((U,K)=>U.position.x-K.position.x),Y=X[0];break}case"Enter":{if(this.widget.props.onSelect)this.widget.props.onSelect(this.toThreadNode(Q));return"handled"}default:{if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"}}if(Y)return this.selectedNodeId=Y.node.id,this.widget.props.onSelectionChange?.(this.toThreadNode(Y)),this.animateToNode(Y.node.id),"handled";if(this.widget.props.onKey)return this.widget.props.onKey(J);return"ignored"};build(J){let Z=this.toGraphNodes();this.positionedNodes=this.layoutEngine.layout(Z);let Q=this.lineCalculator.calculate(this.positionedNodes);if(!this.animation&&this.currentOffset.x===0&&this.currentOffset.y===0){let q=(this.selectedNodeId?this.positionedNodes.find((F)=>F.node.id===this.selectedNodeId):null)??this.positionedNodes.find((F)=>!F.node.parentID);if(q){let F=Math.max(...this.positionedNodes.map((G)=>G.position.y));this.currentOffset=this.calculateCenterOffset(q.position.x,q.position.y,F)}}let X=this.widget.props.showTitle??!0,U=this.widget.props.offsetY??0,K={x:this.currentOffset.x,y:this.currentOffset.y+U},V=this.renderer.render(this.positionedNodes,Q,this.selectedNodeId??void 0,K,X?(z)=>z.title:void 0,{maxTitleWidthPercent:this.widget.props.maxTitleWidthPercent,viewportWidth:this.viewportWidth,activeFlashOn:this.activeFlashOn},(z)=>z.isActive??!1,J),D=new og({onWidth:(z)=>{if(this.viewportWidth!==z)this.viewportWidth=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},onHeight:(z)=>{if(this.viewportHeight!==z)this.viewportHeight=z,this.stopAnimation(),this.currentOffset={x:0,y:0},this.setState()},child:V});return new _4({autofocus:this.widget.props.autofocus??!0,onKey:this.handleKeyEvent,debugLabel:"MiniThreadGraph",child:D})}getSelectedNode(){let J=this.positionedNodes.find((Z)=>Z.node.id===this.selectedNodeId);return J?this.toThreadNode(J):null}}class nW4 extends p0{child;onContext;constructor(J,Z){super();this.child=J;this.onContext=Z}createState(){return new aW4}}class aW4 extends g0{build(J){return this.widget.onContext(J),this.widget.child}}var iW4=30,Kf5=30;class QT{}class YT{}class F20{}class G20{}class Dm0 extends p0{props;constructor(J){super();this.props=J}createState(){return new oW4}}class oW4 extends g0{highlightedIndex=0;controller=new y7;focusNode;scrollController=new o6;filteredClusters=[];itemContexts=[];initState(){this.focusNode=new n4({debugLabel:"ClusterPicker"}),this.scrollController.disableFollowMode(),this.recomputeFiltered(),this.controller.addListener(()=>{this.highlightedIndex=0,this.recomputeFiltered(),this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()})})}didUpdateWidget(J){if(J.props.clusters!==this.widget.props.clusters){if(this.recomputeFiltered(),this.highlightedIndex>=this.filteredClusters.length)this.highlightedIndex=Math.max(0,this.filteredClusters.length-1)}}ensureSelectedItemVisible(){let J=this.itemContexts[this.highlightedIndex];if(!J)return;let Z=J.findRenderObject();if(!Z)return;let Q=0,Y=Z.size.height;lC(J,{top:Q,bottom:Y},{padding:1})}dispose(){this.controller.dispose(),this.focusNode.dispose(),this.scrollController.dispose()}recomputeFiltered(){let J=this.controller.text.toLowerCase(),{clusters:Z}=this.widget.props;if(!J)this.filteredClusters=[...Z];else this.filteredClusters=Z.filter((Q)=>Q.label.toLowerCase().includes(J))}invoke=(J)=>{if(J instanceof QT){if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof YT){if(this.highlightedIndex>0)this.highlightedIndex--,this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()});return"handled"}if(J instanceof F20){let Z=this.filteredClusters[this.highlightedIndex];if(Z)this.widget.props.onAccept(Z);return"handled"}if(J instanceof G20)return this.widget.props.onDismiss(),"handled";return"ignored"};handleItemClick=(J,Z)=>{if(J>=0&&J<this.filteredClusters.length){if(Z===1)this.highlightedIndex=J,this.setState();else if(Z===2){let Q=this.filteredClusters[J];if(Q)this.widget.props.onAccept(Q)}}};handleScroll=(J)=>{if(this.filteredClusters.length===0)return!1;let Z=this.highlightedIndex;if(J.direction==="down")if(this.highlightedIndex<this.filteredClusters.length-1)this.highlightedIndex++;else return!1;else if(this.highlightedIndex>0)this.highlightedIndex--;else return!1;return this.setState(),q6.instance.addPostFrameCallback(()=>{this.ensureSelectedItemVisible()}),this.highlightedIndex!==Z};build(J){let{currentThreadID:Z}=this.widget.props,Q=x0.of(J),{colors:Y,app:X}=Q,V=o1.of(J).size.width>=Kf5+iW4,D=f1.all(new y1(Y.foreground,1,"solid")),z=this.filteredClusters[this.highlightedIndex]??null,q=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C("Select a cluster",new b({color:X.command,bold:!0}))})}),F=new l$({controller:this.controller,focusNode:this.focusNode,autofocus:!0,enabled:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),G=new B2({shortcuts:new Map([[new $4("ArrowDown"),new QT],[new $4("ArrowUp"),new YT],[new $4("Tab"),new QT],[new $4("Tab",{shift:!0}),new YT],[new $4("n",{ctrl:!0}),new QT],[new $4("p",{ctrl:!0}),new YT],[new $4("Enter"),new F20],[new $4("Escape"),new G20]]),focusNode:this.focusNode,child:F}),W=new A9({actions:new Map([[QT,new o4(this.invoke)],[YT,new o4(this.invoke)],[F20,new o4(this.invoke)],[G20,new o4(this.invoke)]]),child:G}),H=new V1({children:[new c0({decoration:{color:Y.background},child:new Q0({text:new C(">",new b({color:Y.foreground}))})}),new S1({child:W})]});this.itemContexts=[];let B=this.filteredClusters.map((I,M)=>{let A=M===this.highlightedIndex,j=Z?I.threads.some((h)=>h.id===Z):!1,_=A?X.selectionBackground:void 0,S=A?X.selectionForeground:Y.foreground,y=[new C(I.label,new b({color:S})),new C(` (${I.threads.length})`,new b({color:S,dim:!0}))];if(j)y.push(new C(" (current)",new b({color:A?X.selectionForeground:Y.success})));return new nW4(new i1({onClick:(h)=>this.handleItemClick(M,h.clickCount),child:new c0({decoration:_?{color:_}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C("",void 0,y)})})}),(h)=>{this.itemContexts[M]=h})}),w=new u0({children:B,crossAxisAlignment:"start"}),N=new S1({child:new i1({onScroll:this.handleScroll,child:new N6({controller:this.scrollController,autofocus:!1,child:w})})}),O=z?z.threads.map((I)=>({id:I.id,title:I.title,parentID:I.parentID,updatedAt:I.updatedAt})):[],E=z?new c0({padding:C0.all(1),child:new ZL({threads:O,autofocus:!1,offsetY:2})}):null,L;if(V){let I=E?new S1({child:E}):new j0({width:iW4});L=new V1({crossAxisAlignment:"stretch",mainAxisAlignment:"start",children:[N,I]})}else{let I=[new S1({child:new i1({onScroll:this.handleScroll,child:new N6({controller:this.scrollController,autofocus:!1,child:w})})})];if(E)I.push(new S1({child:E}));L=new u0({crossAxisAlignment:"stretch",children:I})}return new c0({decoration:{border:D,color:Y.background},padding:C0.symmetric(1,0),child:new u0({children:[q,H,new j0({height:1}),new S1({child:L})]})})}}class i${static _instance=null;_allExpanded=!1;_listeners=new Set;static get instance(){if(!i$._instance)i$._instance=new i$;return i$._instance}get allExpanded(){return this._allExpanded}setAllExpanded(J){if(this._allExpanded===J)return;this._allExpanded=J,this._notifyListeners()}toggleAll(){this.setAllExpanded(!this._allExpanded)}addListener(J){return this._listeners.add(J),()=>this.removeListener(J)}removeListener(J){this._listeners.delete(J)}_notifyListeners(){for(let J of this._listeners)J()}}h0();class rW4 extends g0{labels=[];isLoading=!0;currentQuery="";initState(){this.loadLabels()}async loadLabels(){try{let J=await this.widget.props.internalAPIClient.getUserLabels({query:""},{config:this.widget.props.configService});if(!J.ok){P.error("Failed to load labels",J.error),this.isLoading=!1,this.labels=[],this.setState();return}this.labels=J.result,this.isLoading=!1,this.setState()}catch(J){P.error("Failed to load labels",J),this.isLoading=!1,this.labels=[],this.setState()}}getValidationError(J){let Z=J.trim().toLowerCase();if(Z.length===0)return null;if(Z.length>32)return"Label name cannot exceed 32 characters";if(!/^[a-z0-9][a-z0-9-]*$/.test(Z))return"Label must be alphanumeric with hyphens, starting with a letter or number";return null}isValidLabelName(J){return this.getValidationError(J)===null&&J.length>0}getAvailableLabels(){let J=this.widget.props.currentLabels||[];return this.labels.filter((Z)=>!J.includes(Z.name))}shouldShowCreateMarker(J){if(J.length===0||this.isLoading)return!1;let Z=J.trim().toLowerCase();if(!this.isValidLabelName(Z))return!1;let Q=this.widget.props.currentLabels||[],Y=this.labels.some((U)=>U.name===Z),X=Q.includes(Z);return!Y&&!X}build(J){let Z=x0.of(J),{app:Q,colors:Y}=Z,X=this.currentQuery.trim().toLowerCase(),U=X.length>0?this.getValidationError(X):null,K=this.getAvailableLabels(),D=[{id:"__create__",name:"__create_placeholder__",createdAt:"",__isCreateMarker:!0},...K];return new g9({title:"Add Label",items:D,getLabel:(z)=>{if("__isCreateMarker"in z)return this.currentQuery.trim().toLowerCase();return z.name},onAccept:(z)=>{if("__isCreateMarker"in z)this.widget.props.onSelect(this.currentQuery.trim().toLowerCase());else this.widget.props.onSelect(z.name)},onDismiss:this.widget.props.onDismiss,isLoading:this.isLoading,loadingText:"Loading labels...",emptyStateText:U||"Type to create a new label",renderItem:(z,q,F,G)=>{let W=q?Q.selectionBackground:void 0,H=q?Q.selectionForeground:Y.foreground;if("__isCreateMarker"in z&&z.__isCreateMarker){let w=this.currentQuery.trim().toLowerCase();return new c0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C("",void 0,[new C("Create new label: ",new b({color:H})),new C(w,new b({color:H,bold:!0}))])})})}return new c0({decoration:W?{color:W}:void 0,padding:C0.symmetric(2,0),child:new Q0({text:new C(z.name,new b({color:H}))})})},filterItem:(z,q)=>{if(this.currentQuery!==q)this.currentQuery=q,setTimeout(()=>this.setState(),0);if("__isCreateMarker"in z&&z.__isCreateMarker)return this.shouldShowCreateMarker(q);let G=q.trim().toLowerCase();return G.length===0||z.name.includes(G)},sortItems:(z,q,F)=>{let G="__isCreateMarker"in z.item&&z.item.__isCreateMarker,W="__isCreateMarker"in q.item&&q.item.__isCreateMarker;if(G&&!W)return-1;if(!G&&W)return 1;return q.score-z.score}})}}class zm0 extends p0{props;constructor(J){super();this.props=J}createState(){return new rW4}}class TH extends p0{props;constructor(J){super();this.props=J}createState(){return new sW4}}class sW4 extends g0{_spinner=new L3;animationInterval=null;initState(){super.initState(),this.animationInterval=setInterval(()=>{this._spinner.step(),this.setState(()=>{})},100)}dispose(){if(this.animationInterval)clearInterval(this.animationInterval),this.animationInterval=null;super.dispose()}build(J){let Z=x0.of(J),{colors:Q,app:Y}=Z,X=f1.all(new y1(Q.foreground,1,"solid")),U=this._spinner.toBraille(),K=new Q0({textAlign:"center",text:new C("",void 0,[new C(U,new b({color:Y.processing})),new C(" ",void 0),new C(this.widget.props.message,new b({color:Q.foreground}))])}),D=[new S1({child:new u0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[K]})})];if(this.widget.props.onAbort)D.push(new j0({height:2,child:new c0({padding:C0.symmetric(2,0),child:new Q0({text:new C("",new b({dim:!0}),[new C("Press ",new b({color:Q.foreground})),new C("Esc",new b({color:Q.info})),new C(" to cancel",new b({color:Q.foreground}))])})})}));let z=new c0({decoration:new T4(Q.background,X),child:new j0({width:60,height:7,child:new u0({mainAxisAlignment:"start",children:D})})});if(this.widget.props.onAbort)return new _4({debugLabel:"LoadingDialog",autofocus:!0,onKey:(q)=>{if(q.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:z});return z}}class A8 extends p0{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:U="█",showTrack:K=!0,thumbColor:V,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=U,this.showTrack=K,this.thumbColor=V,this.trackColor=D}createState(){return new tW4}}class tW4 extends g0{_dragStartY=null;_dragStartOffset=null;_isOverThumb=!1;_isPositionOverThumb(J){let{totalContentHeight:Z,viewportHeight:Q}=this.widget.getScrollInfo(),X=this.context.findRenderObject()?.size.height??0;if(X===0||Z<=Q)return!1;let U=this.widget.getScrollInfo(),K=Math.min(1,Q/Z),V=Math.max(1,X*K),D=Math.max(0,Math.min(1,U.scrollOffset/(Z-Q))),z=X-V,q=Math.max(0,z*D),F=q+V;return J>=q&&J<=F}_handleHover=(J)=>{let Z=this._isOverThumb;if(this._isOverThumb=this._isPositionOverThumb(J.localPosition.y),Z!==this._isOverThumb)this.setState()};_handleDrag=(J)=>{let{totalContentHeight:Z,viewportHeight:Q,scrollOffset:Y}=this.widget.getScrollInfo(),U=this.context.findRenderObject()?.size.height??0;if(U===0||Z<=Q)return;if(this._dragStartY===null)this._dragStartY=J.localPosition.y,this._dragStartOffset=Y;let K=J.localPosition.y-this._dragStartY,V=Math.min(1,Q/Z),D=Math.max(1,U*V),z=U-D;if(z<=0)return;let q=Z-Q,F=z/q,G=K/F,W=Math.max(0,Math.min(q,this._dragStartOffset+G));this.widget.controller.jumpTo(W)};_handleRelease=()=>{this._dragStartY=null,this._dragStartOffset=null};_handleClick=(J)=>{if(J.button!=="left")return;let Z=J.localPosition.y,{totalContentHeight:Q,viewportHeight:Y,scrollOffset:X}=this.widget.getScrollInfo(),K=this.context.findRenderObject()?.size.height??0;if(K===0||Q<=Y)return;let V=Math.min(1,Y/Q),D=Math.max(1,K*V),z=Q-Y,q=K-D,F=Math.max(0,Math.min(1,X/(Q-Y))),G=Math.max(0,q*F),W=G+D;if(Z>=G&&Z<=W)return;if(Z<G)this.widget.controller.animateTo(Math.max(0,X-Y));else this.widget.controller.animateTo(Math.min(z,X+Y))};build(J){return new i1({onClick:this._handleClick,onHover:this._handleHover,onDrag:this._handleDrag,onRelease:this._handleRelease,cursor:this._isOverThumb?H5.POINTER:H5.DEFAULT,child:new eW4({controller:this.widget.controller,getScrollInfo:this.widget.getScrollInfo,thickness:this.widget.thickness,trackChar:this.widget.trackChar,thumbChar:this.widget.thumbChar,showTrack:this.widget.showTrack,thumbColor:this.widget.thumbColor,trackColor:this.widget.trackColor})})}}class eW4 extends QC{controller;getScrollInfo;thickness;trackChar;thumbChar;showTrack;thumbColor;trackColor;constructor({key:J,controller:Z,getScrollInfo:Q,thickness:Y=1,trackChar:X="█",thumbChar:U="█",showTrack:K=!0,thumbColor:V,trackColor:D}){super(J?{key:J}:{});this.controller=Z,this.getScrollInfo=Q,this.thickness=Y,this.trackChar=X,this.thumbChar=U,this.showTrack=K,this.thumbColor=V,this.trackColor=D}createRenderObject(){return new $H4(this)}updateRenderObject(J){J.updateWidget(this)}}class $H4 extends w4{_widget;constructor(J){super();this._widget=J}updateWidget(J){this._widget=J,this.markNeedsLayout()}performLayout(){let J=this._lastConstraints;u4(!!J,"performLayout called without constraints");let Z=Math.min(J.maxWidth,this._widget.thickness),Q=J.maxHeight;this.setSize(Z,Q),super.performLayout()}getMinIntrinsicWidth(J){return this._widget.thickness}getMaxIntrinsicWidth(J){return this._widget.thickness}getMinIntrinsicHeight(J){return 0}getMaxIntrinsicHeight(J){return 0}paint(J,Z,Q){let{thumbStartFloat:Y,thumbSizeFloat:X,showScrollbar:U}=this._calculateScrollbarMetrics();if(!U)return;let K=this._widget.trackColor,V=this._widget.thumbColor,D=["▁","▂","▃","▄","▅","▆","▇","█"],z=Y,q=Y+X;for(let F=0;F<this.size.height;F++){let G="█",W=!0;if(F===Math.floor(z)){let H=1-(z-F),B=Math.floor(H*8);G=D[B]||"█",W=!1}else if(F===Math.floor(q)){let H=1-(q-F),B=Math.floor(H*8);G=D[B]||"█"}else if(F>z&&F<q)W=!1;J.setChar(Z,Q+F,G,{fg:V,bg:K,reverse:W},1)}}_calculateScrollbarMetrics(){let{totalContentHeight:J,viewportHeight:Z,scrollOffset:Q}=this._widget.getScrollInfo(),Y=this.size.height;if(J<=Z||Y<=0)return{thumbStartFloat:0,thumbSizeFloat:0,showScrollbar:!1};let X=Math.max(0,Math.min(1,Q/(J-Z))),U=Math.min(1,Z/J),K=Math.max(1,Y*U),V=Y-K;return{thumbStartFloat:Math.max(0,V*X),thumbSizeFloat:K,showScrollbar:!0}}}class QL extends p0{props;constructor(J){super();this.props=J}createState(){return new JH4}}class JH4 extends g0{scrollController=new o6;scrollAreaKey=new T7("message-dialog-scroll-area");viewportHeight=20;initState(){super.initState(),this.scrollController.followMode=!1,this.scrollController.addListener(()=>{this.setState()})}dispose(){this.scrollController.dispose(),super.dispose()}isWidgetMessage(J){return J instanceof O2}resolveFooterStyle(J){if(this.isWidgetMessage(J))return J.footerStyle;return"default"}getViewportHeight(){let Z=this.scrollAreaKey.currentElement?.renderObject;if(Z&&"size"in Z){let Q=Z.size;if(typeof Q.height==="number"&&Q.height>0)return this.viewportHeight=Q.height,Q.height}return this.viewportHeight}build(J){let Z=x0.of(J),Q=this.widget.props.message,Y=(()=>{if(this.isWidgetMessage(Q))return{title:Q.title,type:Q.type};if(Q instanceof Error&&Q.name==="CommandCancelledError")return{title:"Cancelled",type:"info",description:Q.message};if(Q instanceof Error&&Q.name==="CommandTimeoutError")return{title:"Timeout",type:"error",description:Q.message};let q=u70(Q);return{title:q.title,type:q.type,description:q.description}})(),X=Y.type==="error"?Z.app.toolError:Z.app.command,U=f1.all(new y1(Z.colors.border,1,"solid")),K=new c0({padding:C0.symmetric(1,0),child:new Q0({text:new C(Y.title,new b({color:X,bold:!0}))})}),V=this.isWidgetMessage(Q)?Q.widget:new Q0({text:new C(Y.description,new b({color:Z.colors.foreground})),selectable:!0}),D=new S1({child:new w2({child:new c0({padding:C0.symmetric(1,0),child:new V1({key:this.scrollAreaKey,crossAxisAlignment:"stretch",children:[new S1({child:new N6({controller:this.scrollController,autofocus:!0,child:V})}),new A8({controller:this.scrollController,thumbColor:Z.app.scrollbarThumb,trackColor:Z.app.scrollbarTrack,getScrollInfo:()=>{let q=this.scrollController.maxScrollExtent,F=this.scrollController.offset,G=this.getViewportHeight(),W=q+G;return{totalContentHeight:Math.max(W,0),viewportHeight:Math.max(G,1),scrollOffset:Math.max(F,0)}}})]})})})}),z=new c0({padding:C0.symmetric(1,0),child:new Q0({text:(()=>{if(this.widget.props.onRetry)return new C("",void 0,[new C("Press ",new b({color:Z.colors.foreground,dim:!0})),new C("R",new b({color:Z.app.keybind})),new C(" to retry, ",new b({color:Z.colors.foreground,dim:!0})),new C("Esc",new b({color:Z.app.keybind})),new C(" to cancel",new b({color:Z.colors.foreground,dim:!0}))]);let q=this.resolveFooterStyle(this.widget.props.message);if(q==="none")return new C("",new b({color:Z.colors.foreground,dim:!0}));if(q==="help"){let F=new b({color:Z.app.keybind}),G=new b({color:Z.colors.foreground,dim:!0});return new C("",G,[new C("Press ",G),new C("Escape",F),new C(" to close • Use ",G),new C("↑↓",F),new C(" or ",G),new C("j/k",F),new C(" to scroll",G)])}return new C("Press any key to close",new b({color:Z.colors.foreground,dim:!0,italic:!0}))})()})});return new _4({onKey:(q)=>{if(this.widget.props.onRetry&&q.key==="r")return this.widget.props.onRetry(),"handled";if(q.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!1,child:new c0({decoration:{border:U,color:Z.colors.background},padding:C0.all(1),child:new u0({mainAxisAlignment:"center",children:[K,new j0({height:1}),D,z]})})})}}n9();class ZH4 extends p0{props;constructor(J){super();this.props=J}createState(){return new QH4}}class QH4 extends g0{plugins=[];subscription=null;initState(){this.subscription=this.widget.props.pluginService.plugins.subscribe((J)=>{this.plugins=J,this.setState(()=>{})})}dispose(){this.subscription?.unsubscribe(),super.dispose()}getRelativePath(J){let Z=J.startsWith("file://")?J.slice(7):J,Q=this.widget.props.cwd;if(Z.startsWith(Q))return Z.slice(Q.length+1);return Z}statusIcon(J){let Z=y8.default(),{colors:Q,app:Y}=Z;switch(J){case"loading":return{icon:"◌",color:Q.warning};case"active":return{icon:"✓",color:Y.toolSuccess};case"error":return{icon:"✗",color:Y.toolError}}}build(J){let Z=x0.of(J),{app:Q}=Z;if(this.plugins.length===0)return new Q0({text:new C("No plugins found.",new b({dim:!0}))});let Y=[],X=this.plugins.length,U=this.plugins.filter((D)=>D.status==="active").length,K=this.plugins.reduce((D,z)=>D+z.registeredCommands.length,0),V=this.plugins.reduce((D,z)=>D+z.registeredTools.length,0);if(Y.push(new C(`${U}/${X} ${g4(X,"plugin")} active`,new b({bold:!0}))),K>0||V>0)Y.push(new C(` (${K} ${g4(K,"command")}, ${V} ${g4(V,"tool")})`,new b({dim:!0})));Y.push(new C(`
7065
7065
 
7066
7066
  `));for(let D of this.plugins){let{icon:z,color:q}=this.statusIcon(D.status),F=this.getRelativePath(D.uri.toString());if(Y.push(new C(`${z} `,new b({color:q}))),Y.push(new C(F,new b({bold:!0}))),Y.push(new C(` ${D.status}`,new b({dim:!0}))),Y.push(new C(`
7067
7067
  `)),D.status==="active"&&D.registeredEvents.length>0)Y.push(new C(" Events: ",new b({dim:!0}))),Y.push(new C(D.registeredEvents.join(", "),new b({color:Q.link}))),Y.push(new C(`
@@ -7282,7 +7282,7 @@ ${r.content||""}`:r.content||"",G1=[],I1=r.baseDir.startsWith("file://")?s20(r.b
7282
7282
  `)}function yN4(J,Z){J.command("usage").description("Show your current Amp usage and credit balance").action(async(Q,Y)=>{let X=Y.optsWithGlobals(),U=await Z(X),K=await U.settings.get("proxy"),V=FM1({settings:{url:U.ampURL,proxy:K},secrets:{getToken:(z,q)=>U.secrets.get(z,q)}}),D=await T6.userDisplayBalanceInfo({},{config:V});if(!D.ok){if(D.error.code==="auth-required")process.stderr.write(Z1.red("Error: ")+"You must be logged in to view usage. Run `amp login` first.\n"),process.exit(1);process.stderr.write(Z1.red("Error: ")+D.error.message+`
7283
7283
  `),process.exit(1)}process.stdout.write(await vg5(D.result.displayText)+`
7284
7284
  `),process.exit(0)})}var tl5=bp.join(NZ,"logs","headless.log"),vd0=bp.join(nP,"device-id.json");function el5(){return cD.some((J)=>J.listConfigs().length>0)}try{if(process.platform==="win32")await Promise.resolve().then(() => L4(_T(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){q7.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
7285
- `)}function $i5(J){process.emitWarning=(Z,Q,Y,X)=>{let U=typeof Z==="string"?Z:Z.message||String(Z),K=Q||"Warning",V=!1;J.warn(U,{name:K,code:Y})}}function m7(J,Z){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")N7("dangerouslyAllowAll",Z.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")N7("experimental.agentMode",Z.mode)}function KI4(J,Z){if(J.getOptionValueSourceWithGlobals("sp")==="cli"&&Z.sp)return Z.sp;if(J.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Z.systemPrompt)return Z.systemPrompt;return}async function Ji5(J){try{return await UI4(J,"utf-8")}catch{return J}}async function kd0(J,Z,Q){let Y=KI4(J,Z);if(!Y)return;let X=T5(Q)?Q.features:[],U=T5(Q)?Q.user.email:void 0;if(!X.some((V)=>V.name===IX.HARNESS_SYSTEM_PROMPT&&V.enabled)&&!VI4(U))throw new F4("You are not allowed to do this.",1);N7("systemPrompt",await Ji5(Y))}function VI4(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}function yd0(J,Z){if(typeof J==="boolean")return J;if(!T5(Z))return!1;return gQ(Z.user.email)}function ud0(J){if(!T5(J))return null;return{...J.user,features:J.features??[],team:J.workspace??void 0}}function Zi5(J){try{let Z=new URL(J);return Z.hostname==="localhost"||Z.hostname==="127.0.0.1"}catch{return J.includes("localhost")||J.includes("127.0.0.1")}}function xd0(J){let Y=Zi5(J)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new F4(`Couldn't connect to the Amp server at ${J}.`,1,Y)}var JI4=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??PY,description:`Custom settings file path (overrides the default location ${PY})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(P).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${UE})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:m9(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"mode",long:"mode",short:"m",type:"option",default:EK.SMART.key,description:`Set the agent mode (${xQ().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:xQ().map((J)=>J.mode).concat("large","deep")},{name:"dtw",long:"dtw",type:"flag",description:"Use the DTW-backed thread provider in the TUI (experimental)",hidden:!0,aliases:["deliver-me-to-agg"]},{name:"headless",long:"headless",type:"optional-option",description:"Run headless DTW harness (no TUI). Optionally provide a thread ID to connect as executor.",hidden:!0},{name:"apiKey",long:"api-key",type:"option",description:"API key for internal DTW commands (overrides AMP_API_KEY)",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0}],ZI4=(J)=>("deprecated"in J)&&J.deprecated===!0,Qi5=(J)=>("hidden"in J)&&J.hidden===!0,Yi5=(J)=>("default"in J),Xi5=(J)=>("default"in J)?J.default:void 0,DI4=[{name:"toggle-skills-count",entryPoint:ey0}];function Ui5(J,Z){let Q=Z.args[0],Y=Z.commands.map((U)=>U.name());if(Q&&!Q.includes(" ")&&Q.length<30&&!/[./\\]/.test(Q)){let U=Y.filter((V)=>Q.includes(V)||V.includes(Q)),K="Run amp --help for a list of available commands.";if(U.length>0)K=`Did you mean: ${U.join(", ")}? Or run amp --help for all commands.`;throw new F4(X8.unknownCommand(Q),1,K)}}async function bd0(J){return{...J,getThreadEnvironment:dJ,threadSyncService:J.threadSyncService,osFileSystem:J.fileSystem,skillService:J.skillService,fileChangeTrackerStorage:new hX(J.fileSystem),generateThreadTitle:U00,deleteThread:(Z)=>J.threadService.delete(Z),getServerStatus:()=>TJ(J.configService),pluginService:J.pluginService}}function zI4(J){return{toolService:J.toolService,configService:J.configService,skillService:J.skillService,getThreadEnvironment:dJ,filesystem:J.fileSystem,threadService:J.threadService}}var g$0=q1.file(sl5.homedir()),fd0=process.env.XDG_CONFIG_HOME?q1.file(process.env.XDG_CONFIG_HOME):X1.joinPath(g$0,".config");function Ki5(J){return M84({playNotificationSound:async(Z)=>{if(J.useNotificationsForService){I84(Z);let Q=e30(),Y=Iu0();if((!Q||Y||_Y4())&&J.config.settings["notifications.system.enabled"]!==!1){if(Z==="idle")process.stdout.write(Yq("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Z==="requires-user-input")process.stdout.write(Yq("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(e30()),threadService:J.threadService,configService:J.configService,threadViewStates$:J.threadViewStates$})}function Vi5(){return{sync:async()=>{},uploadThread:async()=>{},discoverThreads:async()=>[],initialSyncComplete:Promise.resolve(),updateThreadMeta:async()=>{},threadSyncInfo:()=>v0.of({}),flushPendingSyncs:async()=>{},dispose:()=>{}}}async function c9(J,Z,Q){let Y=Q?.deferAuth??!1;XM1("0.0.1772551124-g74cdbd");let X=No({storage:J.settings,secretStorage:J.secrets,workspaceRoots:v0.of([q1.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:g$0,userConfigDir:fd0});jY4(X);let U=await X.getLatest();P.debug("Global configuration initialized",{settingsKeys:Object.keys(U.settings)});let{toolService:K,dispose:V}=w84({configService:X}),D=new Map,z=()=>D.clear(),q=new NE0(X,J.settings.getWorkspaceRootPath()),F=Db1({configService:X,filesystem:t6}),G=vk1({configService:X,trustStore:q,skillMCPServers:F.skillMCPServers,createOAuthProvider:async(i,d,e)=>{let B0=`${i}:${d}`,n=D.get(B0);if(n)return P.debug("Reusing existing OAuth provider for server",{serverName:i,serverUrl:d}),n;P.debug("Creating OAuth provider for server",{serverName:i,serverUrl:d});let U0=(async()=>{let K0=new YN(J.secrets),N0=await K0.getClientInfo(i,d),X0=e?.scopes??N0?.scopes,W0=hZ4();P.info("OAuth headless mode check",{useHeadless:W0,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:r6.isTTY});let l;if(W0)l=J.executeMode?bZ4():fZ4(i);let s=new fO0({storage:K0,serverName:i,serverUrl:d,clientId:e?.clientId??N0?.clientId,clientSecret:e?.clientSecret??N0?.clientSecret,authUrl:e?.authUrl??N0?.authUrl,tokenUrl:e?.tokenUrl??N0?.tokenUrl,scopes:X0,headlessAuthHandler:l});return P.debug("OAuth provider created",{serverName:i,serverUrl:d,hasManualClientId:!!(e?.clientId??N0?.clientId),willUseDCR:!(e?.clientId??N0?.clientId),scopes:X0,headlessMode:W0,executeMode:J.executeMode}),s})();return D.set(B0,U0),U0}}),W=FS0({configService:X,filesystem:t6,spawn:n60}),H;if(J.executeMode){let i=await y64({toolService:K,providers:[G,W],initialTimeout:15000});H=i.registrations;for(let[d,e]of i.initErrors)P.warn(`${d} provider initialization slow or failed:`,e)}else H=WS0({toolService:K,providers:[G,W]});if(Z.jetbrains)uw("JetBrains");else if(Z.ide&&LQ4())uw("VS Code");else if(Z.ide&&IQ4())uw("Neovim");else if(Z.ide&&el5()){let i=cD.find((d)=>d.listConfigs().length>0);if(i){let d=Io(i.ideName);if(d)uw(d)}}if(J.executeMode)UM1(!0);let B,w=_8.status.pipe(B1((i)=>Boolean(i.connected&&i.authenticated&&i.ideName&&IM1(i.ideName))),I4()).subscribe((i)=>{if(i){if(!B)B=K.registerTool(k64)}else B?.dispose(),B=void 0}),N;if(!J.executeMode){let i=await J.settings.get("fuzzy.alwaysIncludePaths")??[];N=new N30(process.cwd(),{alwaysIncludePaths:i},!0)}else N=new class extends N30{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let O=!1;{let i=await J.secrets.get("apiKey",J.ampURL);if(O=Boolean(i),P.info("API key lookup before login",{found:Boolean(i),ampURL:J.ampURL,deferAuth:Y}),!i)if(Y)P.info("No API key found, continuing startup with deferred auth");else{r6.write(`No API key found. Starting login flow...
7285
+ `)}function $i5(J){process.emitWarning=(Z,Q,Y,X)=>{let U=typeof Z==="string"?Z:Z.message||String(Z),K=Q||"Warning",V=!1;J.warn(U,{name:K,code:Y})}}function m7(J,Z){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")N7("dangerouslyAllowAll",Z.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")N7("experimental.agentMode",Z.mode)}function KI4(J,Z){if(J.getOptionValueSourceWithGlobals("sp")==="cli"&&Z.sp)return Z.sp;if(J.getOptionValueSourceWithGlobals("systemPrompt")==="cli"&&Z.systemPrompt)return Z.systemPrompt;return}async function Ji5(J){try{return await UI4(J,"utf-8")}catch{return J}}async function kd0(J,Z,Q){let Y=KI4(J,Z);if(!Y)return;let X=T5(Q)?Q.features:[],U=T5(Q)?Q.user.email:void 0;if(!X.some((V)=>V.name===IX.HARNESS_SYSTEM_PROMPT&&V.enabled)&&!VI4(U))throw new F4("You are not allowed to do this.",1);N7("systemPrompt",await Ji5(Y))}function VI4(J){return!!(J&&(J.endsWith("@sourcegraph.com")||J.endsWith("@ampcode.com")||J==="auth-bypass-user@example.com"))}function yd0(J,Z){if(typeof J==="boolean")return J;if(!T5(Z))return!1;return gQ(Z.user.email)}function ud0(J){if(!T5(J))return null;return{...J.user,features:J.features??[],team:J.workspace??void 0}}function Zi5(J){try{let Z=new URL(J);return Z.hostname==="localhost"||Z.hostname==="127.0.0.1"}catch{return J.includes("localhost")||J.includes("127.0.0.1")}}function xd0(J){let Y=Zi5(J)?"Run `pnpm dev` to start the local server, then try again.":"Check your network connection or the server URL and try again.";return new F4(`Couldn't connect to the Amp server at ${J}.`,1,Y)}var JI4=[{name:"notifications",long:"notifications",type:"flag",description:(J)=>`${J?"Enable":"Disable"} sound notifications (enabled by default when not in execute mode)`},{name:"color",long:"color",type:"flag",description:(J)=>`${J?"Enable":"Disable"} color output (enabled by default if stdout and stderr are sent to a TTY)`},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??PY,description:`Custom settings file path (overrides the default location ${PY})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(P).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${UE})`},{name:"format",long:"format",type:"option",description:"output using the standard or new-ui. Options: `ui`, `new-ui`",choices:["ui","jsonl","new-ui"],hidden:!0,deprecated:!0},{name:"dangerouslyAllowAll",long:"dangerously-allow-all",type:"switch",default:!1,description:"Disable all command confirmation prompts (agent will execute all commands without asking)"},{name:"jetbrains",long:"jetbrains",type:"flag",default:m9(),description:(J)=>J?"Enable JetBrains integration. When enabled, Amp automatically includes your open JetBrains file and text selection with every message.":"Disable JetBrains integration"},{name:"ide",long:"ide",type:"flag",default:!0,description:(J)=>J?"Enable IDE connection (default). When enabled, Amp automatically includes your open IDE's file and text selection with every message.":"Disable IDE connection"},{name:"interactive",long:"interactive",type:"flag",description:(J)=>J?"Enable interactive mode. This will enable the interactive UI.":"Disable interactive mode. This will disable the interactive UI.",hidden:!0,deprecated:!0},{name:"mcpConfig",long:"mcp-config",type:"option",description:"JSON configuration or file path for MCP servers to merge with existing settings"},{name:"mode",long:"mode",short:"m",type:"option",default:EK.SMART.key,description:`Set the agent mode (${xQ().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:xQ().map((J)=>J.mode).concat("large","deep")},{name:"dtw",long:"dtw",type:"flag",description:"Use the DTW-backed thread provider in the TUI (experimental)",hidden:!0,aliases:["deliver-me-to-agg"]},{name:"headless",long:"headless",type:"optional-option",description:"Run headless DTW harness (no TUI). Optionally provide a thread ID to connect as executor.",hidden:!0},{name:"apiKey",long:"api-key",type:"option",description:"API key for internal DTW commands (overrides AMP_API_KEY)",hidden:!0},{name:"sp",long:"sp",type:"option",description:"Custom system prompt text or file path",hidden:!0},{name:"systemPrompt",long:"system-prompt",type:"option",description:"Custom system prompt text",hidden:!0}],ZI4=(J)=>("deprecated"in J)&&J.deprecated===!0,Qi5=(J)=>("hidden"in J)&&J.hidden===!0,Yi5=(J)=>("default"in J),Xi5=(J)=>("default"in J)?J.default:void 0,DI4=[{name:"toggle-skills-count",entryPoint:ey0}];function Ui5(J,Z){let Q=Z.args[0],Y=Z.commands.map((U)=>U.name());if(Q&&!Q.includes(" ")&&Q.length<30&&!/[./\\]/.test(Q)){let U=Y.filter((V)=>Q.includes(V)||V.includes(Q)),K="Run amp --help for a list of available commands.";if(U.length>0)K=`Did you mean: ${U.join(", ")}? Or run amp --help for all commands.`;throw new F4(X8.unknownCommand(Q),1,K)}}async function bd0(J){return{...J,getThreadEnvironment:dJ,threadSyncService:J.threadSyncService,osFileSystem:J.fileSystem,skillService:J.skillService,fileChangeTrackerStorage:new hX(J.fileSystem),generateThreadTitle:U00,deleteThread:(Z)=>J.threadService.delete(Z),getServerStatus:()=>TJ(J.configService),pluginService:J.pluginService}}function zI4(J){return{toolService:J.toolService,configService:J.configService,skillService:J.skillService,getThreadEnvironment:dJ,filesystem:J.fileSystem,threadService:J.threadService}}var g$0=q1.file(sl5.homedir()),fd0=process.env.XDG_CONFIG_HOME?q1.file(process.env.XDG_CONFIG_HOME):X1.joinPath(g$0,".config");function Ki5(J){return M84({playNotificationSound:async(Z)=>{if(J.useNotificationsForService){I84(Z);let Q=e30(),Y=Iu0();if((!Q||Y||_Y4())&&J.config.settings["notifications.system.enabled"]!==!1){if(Z==="idle")process.stdout.write(Yq("\x1B]777;notify;Amp;Agent is ready\x1B\\"));else if(Z==="requires-user-input")process.stdout.write(Yq("\x1B]777;notify;Amp;Waiting for approval\x1B\\"))}}},windowFocused:()=>Promise.resolve(e30()),threadService:J.threadService,configService:J.configService,threadViewStates$:J.threadViewStates$})}function Vi5(){return{sync:async()=>{},uploadThread:async()=>{},discoverThreads:async()=>[],initialSyncComplete:Promise.resolve(),updateThreadMeta:async()=>{},threadSyncInfo:()=>v0.of({}),flushPendingSyncs:async()=>{},dispose:()=>{}}}async function c9(J,Z,Q){let Y=Q?.deferAuth??!1;XM1("0.0.1772554299-gc34377");let X=No({storage:J.settings,secretStorage:J.secrets,workspaceRoots:v0.of([q1.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:g$0,userConfigDir:fd0});jY4(X);let U=await X.getLatest();P.debug("Global configuration initialized",{settingsKeys:Object.keys(U.settings)});let{toolService:K,dispose:V}=w84({configService:X}),D=new Map,z=()=>D.clear(),q=new NE0(X,J.settings.getWorkspaceRootPath()),F=Db1({configService:X,filesystem:t6}),G=vk1({configService:X,trustStore:q,skillMCPServers:F.skillMCPServers,createOAuthProvider:async(i,d,e)=>{let B0=`${i}:${d}`,n=D.get(B0);if(n)return P.debug("Reusing existing OAuth provider for server",{serverName:i,serverUrl:d}),n;P.debug("Creating OAuth provider for server",{serverName:i,serverUrl:d});let U0=(async()=>{let K0=new YN(J.secrets),N0=await K0.getClientInfo(i,d),X0=e?.scopes??N0?.scopes,W0=hZ4();P.info("OAuth headless mode check",{useHeadless:W0,executeMode:J.executeMode,envVar:process.env.AMP_HEADLESS_OAUTH,isTTY:r6.isTTY});let l;if(W0)l=J.executeMode?bZ4():fZ4(i);let s=new fO0({storage:K0,serverName:i,serverUrl:d,clientId:e?.clientId??N0?.clientId,clientSecret:e?.clientSecret??N0?.clientSecret,authUrl:e?.authUrl??N0?.authUrl,tokenUrl:e?.tokenUrl??N0?.tokenUrl,scopes:X0,headlessAuthHandler:l});return P.debug("OAuth provider created",{serverName:i,serverUrl:d,hasManualClientId:!!(e?.clientId??N0?.clientId),willUseDCR:!(e?.clientId??N0?.clientId),scopes:X0,headlessMode:W0,executeMode:J.executeMode}),s})();return D.set(B0,U0),U0}}),W=FS0({configService:X,filesystem:t6,spawn:n60}),H;if(J.executeMode){let i=await y64({toolService:K,providers:[G,W],initialTimeout:15000});H=i.registrations;for(let[d,e]of i.initErrors)P.warn(`${d} provider initialization slow or failed:`,e)}else H=WS0({toolService:K,providers:[G,W]});if(Z.jetbrains)uw("JetBrains");else if(Z.ide&&LQ4())uw("VS Code");else if(Z.ide&&IQ4())uw("Neovim");else if(Z.ide&&el5()){let i=cD.find((d)=>d.listConfigs().length>0);if(i){let d=Io(i.ideName);if(d)uw(d)}}if(J.executeMode)UM1(!0);let B,w=_8.status.pipe(B1((i)=>Boolean(i.connected&&i.authenticated&&i.ideName&&IM1(i.ideName))),I4()).subscribe((i)=>{if(i){if(!B)B=K.registerTool(k64)}else B?.dispose(),B=void 0}),N;if(!J.executeMode){let i=await J.settings.get("fuzzy.alwaysIncludePaths")??[];N=new N30(process.cwd(),{alwaysIncludePaths:i},!0)}else N=new class extends N30{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};let O=!1;{let i=await J.secrets.get("apiKey",J.ampURL);if(O=Boolean(i),P.info("API key lookup before login",{found:Boolean(i),ampURL:J.ampURL,deferAuth:Y}),!i)if(Y)P.info("No API key found, continuing startup with deferred auth");else{r6.write(`No API key found. Starting login flow...
7286
7286
  `);let d=await Di5(J),e=await J.secrets.get("apiKey",J.ampURL);if(P.info("Login flow completed",{success:d,storedKeyPresent:Boolean(e),ampURL:J.ampURL}),!d)await $q(),process.exit(1);O=!0}}{let i=await X.getLatest(),d=i.settings.url,e=i.secrets.isSet?.[d];P.info("Config secrets state after login",{configURL:d,apiKeySet:e?.apiKey??!1})}let E=L1(TJ(X).pipe(k5((i)=>i!=="pending"))),L=await Hb1({isDevelopment:!1}),I=Y?"pending":await E;if(!Y)P.info("Server status resolved",{status:"ready",isAuthenticated:T5(I),isError:KG(I),errorMessage:KG(I)?I.error.message:void 0});let M=new RM0(L,X),A=new NI0(L,{lazy:!0,maxThreads:200});P.info("Starting Amp background services");let j=yd0(Z.dtw,I),_=Boolean(j||Z.headless);if(_)P.info("DTW mode enabled: thread sync service disabled");let S=_?Vi5():ph1({threadService:M,threadHistoryService:A,configService:X,isExtensionDevelopment:!1}),y;_8.status.subscribe((i)=>{y=i});let h=new uH0({workspaceRoots:[q1.file(process.cwd())],fileSystem:Z.jetbrains||Z.ide?fs:t6,getCurrentFile:()=>{if(!y?.openFile)return;try{return q1.parse(y.openFile)}catch(i){P.warn("Failed to parse current file URI",{uri:y.openFile,error:i});return}},getOpenFiles:()=>{if(!y?.visibleFiles?.length)return[];let i=y.openFile;return y.visibleFiles.filter((d)=>d!==i).map((d)=>{try{return q1.parse(d)}catch(e){return P.warn("Failed to parse visible file URI",{uri:d,error:e}),null}}).filter((d)=>d!==null)}}),f=new ju0,k=process.env.PLUGINS??"off",x=new ty0({configService:X}),g=XI0({configService:X,fileSystem:Z.jetbrains||Z.ide?fs:t6,platform:x,internalPlugins:DI4,pluginFilter:k}),a=_f1({pluginService:g,toolService:K}),m={codebaseContextService:h,configService:X,toolService:K,mcpService:G,skillService:F,toolboxService:W,trustStore:q,threadService:M,threadHistoryService:A,threadSyncService:S,threadStorage:L,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:N,fileSystem:Z.jetbrains||Z.ide?fs:t6,terminal:f,pluginService:g,pluginPlatform:x,serverStatus:I,serverStatusPromise:E,hasAPIKeyAtStartup:O};return{...m,async asyncDispose(){if(m.mcpService.hasAuthenticatingClients())P.info("Waiting for OAuth authentication to complete before exit..."),await m.mcpService.waitForAuthentication();for(let i of H.values())i.dispose();await m.mcpService.dispose(),z(),await m.threadService.asyncDispose(),m.configService.unsubscribe(),V(),m.fuzzyServer.dispose(),m.threadSyncService.dispose(),m.settingsStorage[Symbol.dispose](),w.unsubscribe(),B?.dispose(),a.dispose(),m.pluginService.dispose()}}}async function Di5(J){if(!J.executeMode){if(!await ry0("Would you like to log in to Amp? [(y)es, (n)o]: "))return r6.write(`Login cancelled. Run the command again to retry.
7287
7287
  `),!1}return await qI4(J)}async function qI4(J){let Z=al5(32).toString("hex"),Q=await oP(J.ampURL,Z),Y=new AbortController;try{await OX(Q,Y.signal)}catch(U){P.error("Error opening browser",{error:U})}let X=await oP(J.ampURL,Z,!1);r6.write(`If your browser does not open automatically, visit:
7288
7288
 
@@ -7290,7 +7290,7 @@ ${Z1.blue.bold(X)}
7290
7290
 
7291
7291
  `);try{return await lQ4(J.ampURL,Z,J.secrets,Y),r6.write("\nLogin successful! Run `amp` to get started.\n"),!0}catch(U){return P.error("Login failed",{error:U}),q7.write(`
7292
7292
  Login failed: ${U instanceof Error?U.message:String(U)}
7293
- `),!1}}function zi5(){let J=new CW().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)VE(),process.exit(0);let B=H.originalError??H;$Z4(B)}),J.option("-V, --version","Print the version number and exit",()=>{let B;try{B=`, ${VG(new Date("2026-03-03T15:24:13.512Z"))} ago`}catch{}r6.write(`0.0.1772551124-g74cdbd (released 2026-03-03T15:24:13.512Z${B??""})
7293
+ `),!1}}function zi5(){let J=new CW().name("amp").description("AI-powered coding assistant").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").configureOutput({writeErr:()=>{}});J.exitOverride((H)=>{if(H.code==="commander.help"||H.code==="commander.version"||H.exitCode===0)VE(),process.exit(0);let B=H.originalError??H;$Z4(B)}),J.option("-V, --version","Print the version number and exit",()=>{let B;try{B=`, ${VG(new Date("2026-03-03T16:17:01.559Z"))} ago`}catch{}r6.write(`0.0.1772554299-gc34377 (released 2026-03-03T16:17:01.559Z${B??""})
7294
7294
  `),process.exit(0)}),J.addHelpText("after",NQ4()),J.configureHelp({formatHelp:OQ4}),J.command("logout").description("Log out by removing stored API key").action(async(H,B)=>{let w=B.optsWithGlobals(),N=await M3(w);await wi5(N)}),J.command("login").description("Log in to Amp").addHelpText("after","If AMP_URL is set during login, it will be persisted to global settings for future CLI invocations, though AMP_URL will continue to take precedence.").action(async(H,B)=>{let w=B.optsWithGlobals(),N=await M3(w);await Bi5(N,await _y0(w,N.settings))}),J.command("git-credential-helper [action]",{hidden:!0}).summary("Git credential helper for GitHub").description("Internal: implements the git credential helper protocol. Used inside sandboxes to authenticate git operations with GitHub.").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await AZ4(H??"get",O.ampURL,O.secrets),process.exit(process.exitCode??0)}),J.command("sign-commit",{hidden:!0}).summary("Git commit signing helper").description("Internal: implements the gpg signing interface for git commit signing. Used inside sandboxes as gpg.program.").allowUnknownOption().action(async(H,B)=>{let w=B.optsWithGlobals(),N=await M3(w);await jZ4(N.ampURL,N.secrets),process.exit(process.exitCode??0)}),J.command("dtw-curl [threadId] [action] [message...]",{hidden:!0}).summary("DTW helper").description("Internal: helper for DTW one-shot commands.").addHelpText("after",`
7295
7295
  Actions:
7296
7296
  add-message <message> Send a user message and wait for message_added
@@ -7334,7 +7334,7 @@ See: https://ampcode.com/news/stick-a-fork-in-it
7334
7334
  amp threads handoff T-xxx --goal "Continue working on the auth feature"
7335
7335
  amp threads handoff --goal "Fix the remaining tests" # Uses last thread
7336
7336
 
7337
- By default, opens the new thread in the TUI. Use --print to just print the thread ID.`).option("-g, --goal <goal>","Goal/prompt for the handoff (alternative to stdin)").option("-p, --print","Print the thread ID instead of opening the TUI").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await Ai5(N,O,H??null,B.goal,!B.print,w)}),Q.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await Li5(N,O,H,w)}),Q.command("export <threadId>",{hidden:!0}).summary("Export a thread as JSON").description("Export a thread as JSON. This outputs the full thread payload.").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await Ii5(N,O,H,w)}),D94(Q,M3,m7,c9,hd0,oH,q3),jX4(J,async(H,B)=>{let w=await M3(B);m7(H,B);let N=await c9(w,B);return{context:w,mcpService:N.mcpService,toolService:N.toolService,toolServices:N.toolService,skillService:N.skillService,threadService:N.threadService,fileSystem:N.fileSystem,getThreadEnvironment:dJ,serverStatus:N.serverStatus,toolboxService:N.toolboxService,configService:N.configService,cleanupTerminal:VE,asyncDispose:N.asyncDispose.bind(N)}}),GY4(J,async(H)=>{let B=H.optsWithGlobals(),w=await M3(B);m7(H,B);let N=No({storage:w.settings,secretStorage:w.secrets,workspaceRoots:v0.of([q1.file(process.cwd())]),defaultAmpURL:w.ampURL,homeDir:g$0,userConfigDir:fd0});return{pluginService:XI0({configService:N,fileSystem:t6,platform:{clientKind:"terminal",clientVersion:"0.0.1772551124-g74cdbd",async notify(L){P.debug("plugin notification (TUI not loaded): %s",L)},async open(L){q7.write(`
7337
+ By default, opens the new thread in the TUI. Use --print to just print the thread ID.`).option("-g, --goal <goal>","Goal/prompt for the handoff (alternative to stdin)").option("-p, --print","Print the thread ID instead of opening the TUI").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await Ai5(N,O,H??null,B.goal,!B.print,w)}),Q.command("markdown <threadId>").alias("md").summary("Render thread as markdown").description("Render a thread as markdown. This outputs the entire conversation history in a readable markdown format.").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await Li5(N,O,H,w)}),Q.command("export <threadId>",{hidden:!0}).summary("Export a thread as JSON").description("Export a thread as JSON. This outputs the full thread payload.").action(async(H,B,w)=>{let N=w.optsWithGlobals(),O=await M3(N);await Ii5(N,O,H,w)}),D94(Q,M3,m7,c9,hd0,oH,q3),jX4(J,async(H,B)=>{let w=await M3(B);m7(H,B);let N=await c9(w,B);return{context:w,mcpService:N.mcpService,toolService:N.toolService,toolServices:N.toolService,skillService:N.skillService,threadService:N.threadService,fileSystem:N.fileSystem,getThreadEnvironment:dJ,serverStatus:N.serverStatus,toolboxService:N.toolboxService,configService:N.configService,cleanupTerminal:VE,asyncDispose:N.asyncDispose.bind(N)}}),GY4(J,async(H)=>{let B=H.optsWithGlobals(),w=await M3(B);m7(H,B);let N=No({storage:w.settings,secretStorage:w.secrets,workspaceRoots:v0.of([q1.file(process.cwd())]),defaultAmpURL:w.ampURL,homeDir:g$0,userConfigDir:fd0});return{pluginService:XI0({configService:N,fileSystem:t6,platform:{clientKind:"terminal",clientVersion:"0.0.1772554299-gc34377",async notify(L){P.debug("plugin notification (TUI not loaded): %s",L)},async open(L){q7.write(`
7338
7338
  ${L}
7339
7339
 
7340
7340
  `)},async input(){return},async confirm(){return!1},async ask(){return{result:"uncertain",probability:0.5,reason:"AI not available"}}},internalPlugins:DI4,emitSessionStart:!1,pluginFilter:process.env.PLUGINS??"off"}),asyncDispose:async()=>{}}}),NY4(J,async(H)=>{let B=H.optsWithGlobals(),w=await M3(B);m7(H,B);let N=await c9(w,B);return{toolService:N.toolService,mcpService:N.mcpService,configService:N.configService,skillService:N.skillService,cleanupTerminal:VE,asyncDispose:N.asyncDispose.bind(N)}}),MY4(J,async(H)=>{let B=H.optsWithGlobals(),w=await M3(B);m7(H,B);let N=await c9(w,B);return{settings:w.settings,configService:N.configService,skillService:N.skillService,asyncDispose:N.asyncDispose.bind(N)}}),zY4(J,async(H)=>{let B=H.optsWithGlobals();return await M3(B)}),eQ4(J,async(H)=>{let B=await M3(H);return{settings:B.settings,secretStorage:B.secrets,getThreadDeps:async(w)=>{m7(w,H);let N=await c9(B,H);return{mcpService:N.mcpService,settings:B.settings,asyncDispose:N.asyncDispose.bind(N)}}}}),yN4(J,M3);function U(H,B,w){let O=typeof H.description==="string"?H.description:w===void 0?H.description(!0):H.description(w),E=new zU(B,O),L=Xi5(H);if(L)E.default(L);if(E.hidden=Qi5(H)||ZI4(H),"choices"in H)E.choices([...H.choices]);return E}for(let H of JI4){switch(H.type){case"flag":{J.addOption(U(H,`--${H.long}`)),J.addOption(U(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(U(H,`--${H.long}`,!0));break}case"optional-option":{J.addOption(U(H,`${"short"in H?`-${H.short}, `:""}--${H.long} [value]`));break}default:{J.addOption(U(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}if("aliases"in H&&H.aliases)for(let B of H.aliases){let w=new zU(`--${B}`,H.description);w.hidden=!0,w.implies({[H.name]:!0}),J.addOption(w)}}let K=new zU("-x, --execute [message]","Use execute mode, optionally with user message. In execute mode, agent will execute provided prompt (either as argument, or via stdin). Only last assistant message is printed. Enabled automatically when redirecting stdout.").default(!1);J.addOption(K);let V=new zU("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp(!0);J.addOption(V);let D=new zU("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(D);let z=new zU("--stream-json-thinking","Include thinking blocks in stream JSON output (non-Claude Code extension). Implies --stream-json.").default(!1);J.addOption(z);let q=new zU("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(q);let F=new zU("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);J.addOption(F);let G=new zU("--archive","When used with --execute, archive the thread after the command finishes.").default(!1);J.addOption(G);let W=new zU("-l, --label <label>","When used with --execute, add a label to the thread. Can be used multiple times.").argParser((H,B)=>{if(B===void 0)return[H];return[...B,H]});return J.addOption(W),J.action(async(H,B)=>{let w=H,N=await M3(w);if(Object.keys(w).forEach((O)=>{let E=JI4.find((L)=>L.name===O);if(E&&ZI4(E)&&!Yi5(E))q7.write(Z1.yellow(`Warning: '--${O}' flag is deprecated
@@ -7342,8 +7342,8 @@ ${L}
7342
7342
 
7343
7343
  This thread belongs to a different user and cannot be continued for security reasons. Set AMP_RESUME_OTHER_USER_THREADS_INSECURE=1 to bypass this check.`)}}async function qi5(J){if(!J.userEmail||!gQ(J.userEmail))throw new F4("DTW TUI mode is only available for Amp employees",1);P.info("[createDTWThreadPool] Creating DTW thread pool",{threadId:J.threadId,ampURL:J.ampURL,workerUrl:process.env.AMP_WORKER_URL});try{let Z=new Lm({threadService:J.threadService,configService:J.configService,mcpService:J.mcpService,toolService:J.toolService,skillService:J.skillService,getThreadEnvironment:dJ,osFileSystem:J.fileSystem,fileChangeTrackerStorage:new hX(J.fileSystem),ampURL:J.ampURL});if(J.threadId)await Z.switchThread(J.threadId);else await Z.createThread();return Z}catch(Z){throw P.error("[createDTWThreadPool] Failed to create DTW thread pool",{threadId:J.threadId,error:Z}),Z}}async function Fi5(J){if(J.streamJsonInput)return{userInput:"",stdinInput:null};if(typeof J.execute==="string"){let Z=(await Km()).trimEnd();return{userInput:J.execute,stdinInput:Z||null}}return{userInput:(await Km()).trimEnd(),stdinInput:null}}function Gi5(J,Z,Q){if(J.remote&&!Z)throw new F4("The -r/--remote flag requires --execute mode",1,'Use: amp --remote --execute "your message"');if(J.streamJson&&!Z)throw new F4("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(J.streamJsonInput&&!Z)throw new F4("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(J.streamJsonInput&&!J.streamJson)throw new F4("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if(J.stats&&!Z)throw new F4("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(J.archive&&!Z)throw new F4("The --archive flag requires --execute mode",1,'Use: amp --execute "your message" --archive');if(J.streamJsonInput&&typeof J.execute==="string"&&J.execute.trim()!=="")throw new F4("Do not provide a message argument when using --stream-json-input",1,`Supply messages via stdin JSONL instead: echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"your message"}]}}' | amp --execute --stream-json --stream-json-input`);if(Z&&Q===""&&!J.streamJsonInput&&!J.headless)throw new F4("User message must be provided through stdin or as argument when using execute mode",1,`Either pass a message as an argument: amp --execute "your message"
7344
7344
  Or pipe via stdin: echo "your message" | amp --execute`)}async function p$0(J,Z,Q){let Y=process.hrtime.bigint(),X=(n,U0)=>{let K0=Number(process.hrtime.bigint()-U0)/1e6,N0=F94();P.info("Startup phase",{phase:n,phaseMs:Math.round(K0),sinceMainMs:N0===null?void 0:Math.round(N0)})},{userInput:U,stdinInput:K}=await Fi5(Z),V=!!Z.streamJson||!!Z.streamJsonThinking;Gi5({...Z,streamJson:V},J.executeMode,U),m7(Q,Z);let D=process.hrtime.bigint(),z=Boolean(await J.secrets.get("apiKey",J.ampURL)),q=!J.executeMode&&!Z.headless&&z;P.info("Interactive auth startup mode",{deferInteractiveAuth:q,hasAPIKeyAtStartup:z,executeMode:J.executeMode,headless:Boolean(Z.headless)});let F=await c9(J,Z,{deferAuth:q});X("runMainThread:createThreadDependencies",D),D=process.hrtime.bigint();let G=await bd0(F);X("runMainThread:createWorkerDeps",D);let{serverStatus:W}=F;if(!q&&KG(W)){let n=bh(Error(W.error.message));if(n.message===X8.networkOffline||n.message===X8.networkTimeout)throw xd0(J.ampURL);throw new F4(X8.invalidAPIKey,1)}let H=T5(W)?W:null,B=H?.user.email,w=VI4(B),N=!J.executeMode&&H!==null&&yd0(Z.dtw,H);if(!q)await kd0(Q,Z,W);let O=ud0(W),E=O?.features??[],L=O?.team??null,I=x30(Z,O);if(I instanceof Error)q3(I.message);if((J.executeMode||V)&&R8(Z.mode)&&!w)throw new F4(`Execute mode is not permitted with --mode '${Z.mode}'`,1);if(J.executeMode&&Z.remote)await WY4(U,K,F.configService),await F.asyncDispose(),process.exit(0);if(Z.headless){if(!B||!gQ(B))throw new F4("Headless DTW mode is only available for Amp employees",1);let n=await F.secretStorage.get("apiKey",J.ampURL);if(!n)throw new F4("API key required for headless mode. Please run `amp login` first.",1);let U0=typeof Z.headless==="string"&&Z.headless!=="true"?Z.headless:void 0;if(U0&&!C8(U0))throw new F4(`Invalid thread ID: ${U0}`,1);let K0=U0??await ji5({dependencies:F,visibility:I??void 0}),N0=await dZ4(K0);if(N0.status==="already-running")await F.asyncDispose(),await $q(),process.exit(0);try{await xZ4({ampURL:J.ampURL,apiKey:n,workerUrl:process.env.AMP_WORKER_URL,workspaceRoot:process.cwd(),threadId:K0,configService:F.configService,mcpService:F.mcpService,toolService:F.toolService,skillService:F.skillService,fileSystem:F.fileSystem})}finally{await N0.release(),await F.asyncDispose()}await $q(),process.exit(0)}let M={threadService:F.threadService,workerDeps:G,createThread:async()=>{let n=q?await F.serverStatusPromise:W,U0=await U30(J.settings,process.cwd(),ud0(n),I);if(U0 instanceof Error)q3(U0.message);return yb0(G,{threadMeta:U0?BU(U0):void 0,agentMode:Z.mode,onFirstAssistantMessage:QI4})},validateThreadOwnership:async(n,U0)=>{if(U0?.nonBlockingOwnershipCheck){YI4(n,F.configService).catch((K0)=>{if(K0 instanceof F4){if(U0.onOwnershipError){U0.onOwnershipError(K0,n);return}cP(K0,n);return}P.warn("Failed to validate thread ownership in CLI, allowing to open",{error:K0})});return}try{await YI4(n,F.configService)}catch(K0){if(K0 instanceof F4)throw K0;P.warn("Failed to validate thread ownership in CLI, allowing to open",{error:K0})}},switchThreadVisibility:I,switchThreadAgentMode:Z.mode,onFirstAssistantMessage:QI4},A=async(n,U0)=>{try{if(n==="dtw")return qi5({userEmail:U0?.dtwUserEmail??B,ampURL:J.ampURL,configService:F.configService,threadService:F.threadService,mcpService:F.mcpService,toolService:F.toolService,skillService:F.skillService,fileSystem:F.fileSystem,threadId:Z.threadId});return Xq4(M,Z.threadId,{nonBlockingOwnershipCheck:Z.nonBlockingThreadOwnershipCheck})}catch(K0){if(K0 instanceof F4)throw K0;throw await cP(K0,Z.threadId),Error("handleError should have called process.exit()")}};if(Z.format==="jsonl")q7.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
7345
- `),await $q(),process.exit(1);let j=(async()=>{if(q){P.info("Skipping initial free tier status fetch until auth is complete");return}try{let n=await F.configService.getLatest(),U0=dv(n),K0=await T6.getUserFreeTierStatus({},{config:F.configService,signal:AbortSignal.timeout(U0)});if(K0.ok)return P.info("User free tier status:",K0),K0.result;return}catch(n){P.error("Failed to fetch free tier status:",n);return}})(),S=!J.executeMode?new Tu0:null,y,h=null;if(S)y=S,h=(async()=>{let n=q?await F.serverStatusPromise:F.serverStatus;await kd0(Q,Z,n);let U0=process.hrtime.bigint(),K0=yd0(Z.dtw,n),N0=T5(n)?n.user.email:void 0,X0=await A(K0?"dtw":"worker",{dtwUserEmail:N0});if(X("runMainThread:createThreadPool",U0),S.attach(X0),U){let W0=await L1(X0.threadHandles$);if(!W0)throw new F4("No active thread is available yet.",1);await W0.sendMessage({content:[{type:"text",text:U}]})}})(),h.catch(async(n)=>{let U0=n instanceof Error?n:Error(String(n));S.setInitError(U0),await cP(n,Z.threadId)});else D=process.hrtime.bigint(),y=await A(N?"dtw":"worker"),X("runMainThread:createThreadPool",D);let f=Z.notifications!==void 0?Z.notifications:!J.executeMode;D=process.hrtime.bigint();let k=await F.configService.getLatest();if(X("runMainThread:configService.getLatest",D),D=process.hrtime.bigint(),Ki5({configService:F.configService,threadService:F.threadService,config:k,useNotificationsForService:f,threadViewStates$:()=>y.threadHandles$.pipe(e1((n)=>{if(!n)return v0.of({});return s6(n.thread$,n.threadViewState$).pipe(B1(([U0,K0])=>({[U0.id]:K0})))}))}),X("runMainThread:createCliNotificationService",D),J.executeMode){if(QY4(F.mcpService,J.settings),!(y instanceof RC))throw new F4("Execute mode is not supported with the DTW thread pool",1);let n=y.getWorkerForExecuteMode();if(await DZ4({worker:n,threadID:n.threadID,userInput:U,stdinInput:K,dependencies:F,streamJson:V,streamJsonInput:!!Z.streamJsonInput,streamJsonThinking:!!Z.streamJsonThinking,stats:!!Z.stats,ampURL:J.ampURL,isDogfooding:w,agentMode:Z.mode,labels:Z.label}),Z.archive)await T6.archiveThread({thread:n.threadID,archived:!0},{config:F.configService});await F.asyncDispose(),process.exit(0)}let x=!1,g=!1,a=!1;if(Z.jetbrains||Z.ide){await PM1();let n=mw({jetbrainsOnly:Z.jetbrains});if(n.length===0){if(Z.jetbrains)g=!await F.configService.get("jetbrains.skipInstall")}else if(n.length===1){let U0=n[0];if(U0)_8.selectConfig(U0)}else a=!0}D=process.hrtime.bigint();let m=ay0("0.0.1772551124-g74cdbd",F.settingsStorage,{startDelayMs:3000});X("runMainThread:createUpdateService",D),D=process.hrtime.bigint();let i=new wI0(F.threadStorage);X("runMainThread:createThreadFuzzyIndexer",D),D=process.hrtime.bigint();let d=new sy0(F.mcpService,J.settings.getWorkspaceRootPath());if(X("runMainThread:createMcpTrustHandler",D),U&&J.executeMode){let n=await L1(y.threadHandles$);if(!n)throw new F4("No active thread is available yet.",1);await n.sendMessage({content:[{type:"text",text:U}]})}D=process.hrtime.bigint();let e=await xV();X("runMainThread:loadSessionState",D),P.info("Loaded session state:",e);let B0={...e,launchCount:e.launchCount+1};fV(B0);try{if(D=process.hrtime.bigint(),await GF4({codebaseContextService:F.codebaseContextService,stdout:process.stdout,history:new Hy0,fuzzyServer:F.fuzzyServer,settingsStorage:F.settingsStorage,threadService:F.threadService,threadHistoryService:F.threadHistoryService,threadFuzzyIndexer:i,skillService:F.skillService,configService:F.configService,secretStorage:F.secretStorage,internalAPIClient:T6,initialServerStatus:F.serverStatus,hasAPIKeyAtStartup:F.hasAPIKeyAtStartup,ampURL:J.ampURL,threadPool:y,createSystemPromptDeps:async()=>zI4(F),ideClient:_8,mcpService:F.mcpService,toolboxService:F.toolboxService,mcpTrustHandler:d,showJetBrainsInstaller:g,showIdePicker:x,showIdePickerHint:a,openThreadSwitcher:Z.openThreadSwitcher,updateService:m,inspector:Z.inspector,inspectorPort:Z.inspectorPort,jetbrainsMode:Z.jetbrains,clientId:Z.clientId,sessionState:B0,freeTierStatusPromise:j,workspace:L??null,features:E,isDogfooding:w,initialAgentMode:Q.getOptionValueSourceWithGlobals("mode")==="cli"?Z.mode:void 0,buildTimestamp:"2026-03-03T15:24:13.512Z",pluginPlatform:F.pluginPlatform,pluginService:F.pluginService},(n)=>new Uh0({...n,threadPool:n.threadPool},(U0)=>new Yp0({...U0,threadState:U0.threadState}))),X("runMainThread:mountApp-returned",D),h)await h}finally{}await F.asyncDispose(),X("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function M3(J){if(P.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),J.interactive)q7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7346
- `);let Z=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Q=process.stdout.isTTY&&process.stderr.isTTY;P.info("Execution mode resolved",{executeMode:Z,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:J.streamJson,executeFlag:J.execute});let Y=await bk1({get:async(V)=>{if(V!==by)return;try{let D=await UI4(vd0,"utf-8");return JSON.parse(D).installationID}catch{return}},set:async(V,D)=>{if(V!==by)return;await ol5(bp.dirname(vd0),{recursive:!0}),await rl5(vd0,JSON.stringify({installationID:D},null,2),{mode:384})}},{clientType:"cli",platform:pQ()});KM1(Y);let X=await ZQ4({...J,workspaceTrust:{current:!0,changes:Pv},getHook:process.env.AMP_URL?(V,D)=>{if(V==="url")return Promise.resolve(process.env.AMP_URL);return D()}:void 0});if(J.mcpConfig){let V=await JY4(J.mcpConfig);X=ZY4(X,V)}let U=bp.dirname(X.getSettingsFilePath());L84(nP,U);let K=await X.get("url","global");if(!K)K=o9;if(P.info("Resolved Amp URL",{ampURL:K,settingsFile:X.getSettingsFilePath(),workspaceRoot:X.getWorkspaceRootPath()}),!bF(K))P.info("Targeting custom Amp server",{ampURL:K});return X=rI1(X),{executeMode:Z,isTTY:Q,ampURL:K,settings:X,secrets:OY4(await _y0(J,X))}}function Wi5(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y?.startsWith("--")){let U=Y.slice(2).replace(/-([a-z])/g,(V,D)=>D.toUpperCase()),K=J[Q+1];if(K&&!K.startsWith("--"))Z[U]=K,Q++}}return Z}async function Hi5(){q94();let J=Wi5(process.argv),Z=process.argv.includes("--headless")||process.argv.some((U)=>U.startsWith("--headless="));AJ4({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE||(Z?tl5:void 0)});let Q=process.argv.includes("--no-color"),Y=process.argv.includes("--color"),X=process.stdout.isTTY&&process.stderr.isTTY;if(Q||!Y&&!X)Z1.level=0;if($i5(P),P.info("Starting Amp CLI.",{version:"0.0.1772551124-g74cdbd",buildTimestamp:"2026-03-03T15:24:13.512Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new F4(X8.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await zi5().parseAsync(process.argv)}O84().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Hi5().catch(cP)});async function Bi5(J,Z){let Q=J.ampURL.includes("localhost")||J.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!Q)await J.settings.set("url",process.env.AMP_URL,"global"),r6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7345
+ `),await $q(),process.exit(1);let j=(async()=>{if(q){P.info("Skipping initial free tier status fetch until auth is complete");return}try{let n=await F.configService.getLatest(),U0=dv(n),K0=await T6.getUserFreeTierStatus({},{config:F.configService,signal:AbortSignal.timeout(U0)});if(K0.ok)return P.info("User free tier status:",K0),K0.result;return}catch(n){P.error("Failed to fetch free tier status:",n);return}})(),S=!J.executeMode?new Tu0:null,y,h=null;if(S)y=S,h=(async()=>{let n=q?await F.serverStatusPromise:F.serverStatus;await kd0(Q,Z,n);let U0=process.hrtime.bigint(),K0=yd0(Z.dtw,n),N0=T5(n)?n.user.email:void 0,X0=await A(K0?"dtw":"worker",{dtwUserEmail:N0});if(X("runMainThread:createThreadPool",U0),S.attach(X0),U){let W0=await L1(X0.threadHandles$);if(!W0)throw new F4("No active thread is available yet.",1);await W0.sendMessage({content:[{type:"text",text:U}]})}})(),h.catch(async(n)=>{let U0=n instanceof Error?n:Error(String(n));S.setInitError(U0),await cP(n,Z.threadId)});else D=process.hrtime.bigint(),y=await A(N?"dtw":"worker"),X("runMainThread:createThreadPool",D);let f=Z.notifications!==void 0?Z.notifications:!J.executeMode;D=process.hrtime.bigint();let k=await F.configService.getLatest();if(X("runMainThread:configService.getLatest",D),D=process.hrtime.bigint(),Ki5({configService:F.configService,threadService:F.threadService,config:k,useNotificationsForService:f,threadViewStates$:()=>y.threadHandles$.pipe(e1((n)=>{if(!n)return v0.of({});return s6(n.thread$,n.threadViewState$).pipe(B1(([U0,K0])=>({[U0.id]:K0})))}))}),X("runMainThread:createCliNotificationService",D),J.executeMode){if(QY4(F.mcpService,J.settings),!(y instanceof RC))throw new F4("Execute mode is not supported with the DTW thread pool",1);let n=y.getWorkerForExecuteMode();if(await DZ4({worker:n,threadID:n.threadID,userInput:U,stdinInput:K,dependencies:F,streamJson:V,streamJsonInput:!!Z.streamJsonInput,streamJsonThinking:!!Z.streamJsonThinking,stats:!!Z.stats,ampURL:J.ampURL,isDogfooding:w,agentMode:Z.mode,labels:Z.label}),Z.archive)await T6.archiveThread({thread:n.threadID,archived:!0},{config:F.configService});await F.asyncDispose(),process.exit(0)}let x=!1,g=!1,a=!1;if(Z.jetbrains||Z.ide){await PM1();let n=mw({jetbrainsOnly:Z.jetbrains});if(n.length===0){if(Z.jetbrains)g=!await F.configService.get("jetbrains.skipInstall")}else if(n.length===1){let U0=n[0];if(U0)_8.selectConfig(U0)}else a=!0}D=process.hrtime.bigint();let m=ay0("0.0.1772554299-gc34377",F.settingsStorage,{startDelayMs:3000});X("runMainThread:createUpdateService",D),D=process.hrtime.bigint();let i=new wI0(F.threadStorage);X("runMainThread:createThreadFuzzyIndexer",D),D=process.hrtime.bigint();let d=new sy0(F.mcpService,J.settings.getWorkspaceRootPath());if(X("runMainThread:createMcpTrustHandler",D),U&&J.executeMode){let n=await L1(y.threadHandles$);if(!n)throw new F4("No active thread is available yet.",1);await n.sendMessage({content:[{type:"text",text:U}]})}D=process.hrtime.bigint();let e=await xV();X("runMainThread:loadSessionState",D),P.info("Loaded session state:",e);let B0={...e,launchCount:e.launchCount+1};fV(B0);try{if(D=process.hrtime.bigint(),await GF4({codebaseContextService:F.codebaseContextService,stdout:process.stdout,history:new Hy0,fuzzyServer:F.fuzzyServer,settingsStorage:F.settingsStorage,threadService:F.threadService,threadHistoryService:F.threadHistoryService,threadFuzzyIndexer:i,skillService:F.skillService,configService:F.configService,secretStorage:F.secretStorage,internalAPIClient:T6,initialServerStatus:F.serverStatus,hasAPIKeyAtStartup:F.hasAPIKeyAtStartup,ampURL:J.ampURL,threadPool:y,createSystemPromptDeps:async()=>zI4(F),ideClient:_8,mcpService:F.mcpService,toolboxService:F.toolboxService,mcpTrustHandler:d,showJetBrainsInstaller:g,showIdePicker:x,showIdePickerHint:a,openThreadSwitcher:Z.openThreadSwitcher,updateService:m,inspector:Z.inspector,inspectorPort:Z.inspectorPort,jetbrainsMode:Z.jetbrains,clientId:Z.clientId,sessionState:B0,freeTierStatusPromise:j,workspace:L??null,features:E,isDogfooding:w,initialAgentMode:Q.getOptionValueSourceWithGlobals("mode")==="cli"?Z.mode:void 0,buildTimestamp:"2026-03-03T16:17:01.559Z",pluginPlatform:F.pluginPlatform,pluginService:F.pluginService},(n)=>new Uh0({...n,threadPool:n.threadPool},(U0)=>new Yp0({...U0,threadState:U0.threadState}))),X("runMainThread:mountApp-returned",D),h)await h}finally{}await F.asyncDispose(),X("runMainThread:dependencies.asyncDispose",Y),process.exit(0)}async function M3(J){if(P.info("Initializing CLI context",{argv:process.argv,nodeEnv:"production",hasAmpURL:Boolean(process.env.AMP_URL),hasAmpAPIKey:Boolean(process.env.AMP_API_KEY),hasSettingsFile:Boolean(process.env.AMP_SETTINGS_FILE)}),J.interactive)q7.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
7346
+ `);let Z=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Q=process.stdout.isTTY&&process.stderr.isTTY;P.info("Execution mode resolved",{executeMode:Z,stdoutTTY:process.stdout.isTTY,stderrTTY:process.stderr.isTTY,streamJson:J.streamJson,executeFlag:J.execute});let Y=await bk1({get:async(V)=>{if(V!==by)return;try{let D=await UI4(vd0,"utf-8");return JSON.parse(D).installationID}catch{return}},set:async(V,D)=>{if(V!==by)return;await ol5(bp.dirname(vd0),{recursive:!0}),await rl5(vd0,JSON.stringify({installationID:D},null,2),{mode:384})}},{clientType:"cli",platform:pQ()});KM1(Y);let X=await ZQ4({...J,workspaceTrust:{current:!0,changes:Pv},getHook:process.env.AMP_URL?(V,D)=>{if(V==="url")return Promise.resolve(process.env.AMP_URL);return D()}:void 0});if(J.mcpConfig){let V=await JY4(J.mcpConfig);X=ZY4(X,V)}let U=bp.dirname(X.getSettingsFilePath());L84(nP,U);let K=await X.get("url","global");if(!K)K=o9;if(P.info("Resolved Amp URL",{ampURL:K,settingsFile:X.getSettingsFilePath(),workspaceRoot:X.getWorkspaceRootPath()}),!bF(K))P.info("Targeting custom Amp server",{ampURL:K});return X=rI1(X),{executeMode:Z,isTTY:Q,ampURL:K,settings:X,secrets:OY4(await _y0(J,X))}}function Wi5(J){let Z={};for(let Q=0;Q<J.length;Q++){let Y=J[Q];if(Y?.startsWith("--")){let U=Y.slice(2).replace(/-([a-z])/g,(V,D)=>D.toUpperCase()),K=J[Q+1];if(K&&!K.startsWith("--"))Z[U]=K,Q++}}return Z}async function Hi5(){q94();let J=Wi5(process.argv),Z=process.argv.includes("--headless")||process.argv.some((U)=>U.startsWith("--headless="));AJ4({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE||(Z?tl5:void 0)});let Q=process.argv.includes("--no-color"),Y=process.argv.includes("--color"),X=process.stdout.isTTY&&process.stderr.isTTY;if(Q||!Y&&!X)Z1.level=0;if($i5(P),P.info("Starting Amp CLI.",{version:"0.0.1772554299-gc34377",buildTimestamp:"2026-03-03T16:17:01.559Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new F4(X8.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await zi5().parseAsync(process.argv)}O84().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await Hi5().catch(cP)});async function Bi5(J,Z){let Q=J.ampURL.includes("localhost")||J.ampURL.includes("127.0.0.1");if(process.env.AMP_URL&&!Q)await J.settings.set("url",process.env.AMP_URL,"global"),r6.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
7347
7347
  `);else if(!bF(J.ampURL))r6.write(`Logging in to ${new URL(J.ampURL).hostname}
7348
7348
  `);let Y=process.env.AMP_API_KEY;if(Y)r6.write(`API key found in environment variable, storing...
7349
7349
  `),await Z.set("apiKey",Y,J.ampURL),r6.write(`API key successfully stored.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sourcegraph/amp",
3
- "version": "0.0.1772551124-g74cdbd",
3
+ "version": "0.0.1772554299-gc34377",
4
4
  "description": "CLI for Amp, the frontier coding agent.",
5
5
  "homepage": "https://ampcode.com/",
6
6
  "author": {