@sourcegraph/amp 0.0.1764014485-g58bc07 → 0.0.1764028904-g50ee11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +12 -16
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -2302,12 +2302,10 @@ ${UT.map((J)=>`- **${J.id}** (${J.provider}): ${J.description}`).join(`
|
|
|
2302
2302
|
`),Y=0,X=0,G=0;for(let V of Q){if(V.startsWith("+")&&!V.startsWith("+++"))Y++;if(V.startsWith("-")&&!V.startsWith("---"))X++;if(V.startsWith("@"))G++}let Z=J.reverted,q=J.isNewFile===!0;if(q)Y=J.after.split(`
|
|
2303
2303
|
`).length,X=0,G=0;return{added:Y,removed:X,modified:G,created:q,reverted:Z}}var yf0=G1(()=>{J4();vn()});function vf0(J){let Q=atob(J),Y=new Uint8Array(Q.length);for(let G=0;G<Q.length;G++)Y[G]=Q.charCodeAt(G);return new TextDecoder("utf-8").decode(Y)}function hM(J){if(J.length>rf)return J.slice(0,rf)+as;return J}function Lm4(J){if(typeof J==="string")return hM(J);if(Array.isArray(J)){let Q=0,Y=[];for(let X of J){let G=typeof X==="string"?hM(X):X,Z=typeof G==="string"?G:JSON.stringify(G);if(Q+Z.length>rf){Y.push(as);break}Q+=Z.length,Y.push(G)}return Y}if(typeof J==="object"&&J!==null&&!Array.isArray(J)){let Q={...J};for(let Y of ff0)if(Y in Q&&typeof Q[Y]==="string")Q[Y]=hM(Q[Y]);return Q}return J}function Am4(J){if(J===void 0)return;if(typeof J==="string")return hM(J);if(Array.isArray(J)){if(J.length>0&&typeof J[0]==="string"){let Q=0,Y=[];for(let X of J)if(typeof X==="string"){let G=hM(X);if(Q+G.length>rf){Y.push(as);break}Q+=G.length,Y.push(G)}return Y}if(J.length>0&&typeof J[0]==="object"){let Q=0,Y=[];for(let X of J)if(typeof X==="object"&&X!==null){let G=xf0(X),Z=JSON.stringify(G);if(Q+Z.length>rf){Y.push({truncated:as});break}Q+=Z.length,Y.push(G)}return Y}}if(typeof J==="object"&&J!==null)return xf0(J);return J}function xf0(J){let Q=JSON.parse(JSON.stringify(J)),Y={...Q};for(let X of ff0)if(X in Q&&typeof Q[X]==="string")Y[X]=hM(Q[X]);return Y}function rs(J){let Q=vF(J,(Y)=>{let X=0,G=0;for(let Z of Y.messages)if(Z.role==="user"){if(Z.fileMentions){if(Z.fileMentions=void 0,X++,!Z.content.some((V)=>V.type==="tool_result"||V.type==="image"||V.type==="text"&&V.text.trim().length>0))Z.content.push({type:"text",text:"(file mentions removed)"})}for(let q of Z.content)if(q.type==="tool_result"){if(q.run.status==="done"){let V=q.run.result,K=Lm4(q.run.result);if(V!==K)q.run.result=K,G++}else if(q.run.status==="cancelled"&&q.run.progress)q.run.progress=f8(Am4(q.run.progress));else if(q.run.status==="error"&&q.run.error){let V=q.run.error.message,K=hM(q.run.error.message);if(V!==K)q.run.error.message=K,G++}}}});return x.debug("Truncated thread",{messages:Q.messages}),Q}var rf=2000,as=`
|
|
2304
2304
|
|
|
2305
|
-
[ ... omitted remaining lines to make summarizing use less tokens ... ]`,ff0;var MM1=G1(()=>{HY();H0();ff0=["text","diff","output"]});var hf0;var bf0=G1(()=>{yZ();q4();hf0={spec:{name:KO,description:"Run CI/CD checks (typechecker, linter, formatter, and tests) to validate the changes. Returns the success or failure status, plus the relevant log lines. If tree parameter is provided, checks will be run for that specific repository tree. Otherwise, checks will be run for the tree with the most changes or the first available tree.",inputSchema:{type:"object",properties:{tree:{type:"string",description:'URI of the specific tree/repository to run checks for (e.g., "file:///path/to/repo"). If not provided, will automatically select the most appropriate tree.'}},required:[],additionalProperties:!1},source:"builtin",meta:{disableTimeout:!0}},fn:nF({os:null,github:null,gitlab:null})}});class WJ{systemPrompt;model;scaffold;#J=new AbortController;#Q=new u4;#$=[];#X=[];constructor(J,Q,Y){this.systemPrompt=J;this.model=Q;this.scaffold=Y}dispose(){this.#J.abort()}run(J,Q,Y){return this._run(J,Q,Y).catch((X)=>{this.#Q.next({status:"error","~debug":{conversation:J,inferences:this.#X},message:`Uncaught subagent error: ${X}`})}).finally(()=>{this.#Q.complete()}),this.#Q}async _run(J,Q,Y){this.sendProgressUpdate(J);let X=void 0;while(!0){this.#J.signal.throwIfAborted();let Z=(await W6(Q.tools,this.#J.signal)).map(({spec:O,enabled:M})=>M?O:null).filter((O)=>O!==null).map((O)=>v2(this.model,O));this.#J.signal.throwIfAborted();let q=performance.now(),{result:V,toolUses:K,debugUsage:W}=await this.scaffold.runInference(this.model,this.systemPrompt,J,Z,Y.thread,{configService:Y.configService},this.#J.signal),z=performance.now()-q,U={maxInputTokens:0,inputTokens:0,outputTokens:0,cacheCreationInputTokens:null,cacheReadInputTokens:null,totalInputTokens:0,credits:0};this.#X.push({inferenceTimeMs:z,usage:W??U}),this.#$.push({message:this.scaffold.extractMessage(V),activeTools:new Map(K.map((O)=>[O.id,{tool_name:O.name,status:"queued",input:O.input}]))}),this.#J.signal.throwIfAborted();let B=await Promise.all(K.map((O)=>this.runTool(Q,Y,O)));if(this.scaffold.updateConversation(J,V,B),K.length===0){X=this.scaffold.extractMessage(V),this.scaffold.updateConversation(J,V,[]);break}this.sendProgressUpdate(J)}this.#Q.next({status:"done",message:X??LM1,turns:this.#$,"~debug":{conversation:J,inferences:this.#X}})}async runTool(J,Q,Y){let X=Y.id,G=J.invokeTool(Y.name,{args:Y.input},{...Q,tool:Y.name});return this.setToolUseStatus(X,"in-progress"),await wF(G,this.#J.signal).then((Z)=>{return this.setToolUseStatus(X,"done",Z.status==="done"?Z.result:void 0),{id:X,result:Z}}).catch((Z)=>{if(Z instanceof Error&&Z.name==="AbortError")throw this.setToolUseStatus(X,"cancelled"),Z;return this.setToolUseStatus(X,"error"),{id:X,result:{status:"error",error:String(Z)}}})}setToolUseStatus(J,Q,Y){let X=this.#$.at(-1)?.activeTools.get(J);if(!X)throw Error("Cannot update the status of a tool that does not exist");this.#$.at(-1)?.activeTools.set(J,{...X,status:Q,result:Y})}sendProgressUpdate(J){this.#Q.next({status:"in-progress",turns:this.#$,"~debug":{conversation:J,inferences:this.#X}})}}var LM1="Agent did not produce a response";var VK=G1(()=>{g0();K5()});function wm4(J){return J.content.filter((Q)=>Q.type==="text").map((Q)=>typeof Q==="string"?Q:Q.text||"").join("")}var bM;var os=G1(()=>{g0();_3();GG();VK();K5();bM=class bM extends u4{#J=new AbortController;#Q;#$=[];#X=[];constructor(J,Q,Y,X,G){let Z=T3(X.toolService,J,!1);super();this.#Q=G??yN1,this.start(Z,Q,Y,X).catch((q)=>{this.error(q)}).finally(()=>{this.complete()})}dispose(){this.#J.abort()}async start(J,Q,Y,X){this.#J.signal.throwIfAborted();let G=[{role:"user",content:Y}];while(!0){this.#J.signal.throwIfAborted();let q=(await W6(J.tools,this.#J.signal)).map(({spec:z,enabled:U})=>U?z:null).filter((z)=>z!==null).map((z)=>v2(this.#Q,z));this.#J.signal.throwIfAborted();let V=await this.runInference(G,q,[{type:"text",text:Q}],X.thread,X),K=V.message;if(!K)break;let W=V.message?.content.filter((z)=>z.type==="tool_use")??[];if(this.#$.push({message:wm4(K),activeTools:new Map(W.map((z)=>[z.id,{tool_name:z.name,status:"queued",input:z.input}]))}),this.sendProgressUpdate(),W.length===0)break;this.#J.signal.throwIfAborted();let H=await Promise.all(W.map((z)=>this.runTool(J,X,z)));G.push({role:"assistant",content:K.content},{role:"user",content:H.filter((z)=>z!==void 0)})}this.next({status:"done",message:this.#$.at(-1)?.message??LM1,turns:this.#$,"~debug":{inferences:this.#X,conversation:G}})}async runInference(J,Q,Y,X,G){this.#J.signal.throwIfAborted();let Z=performance.now(),q=crypto.randomUUID(),V=await SP(J,Q,Y,X,{configService:G.configService},this.#Q,this.#J.signal,void 0,q),W=performance.now()-Z,H=await z7(q,G.configService);if(V["~debugUsage"])V["~debugUsage"].credits=H??0;return this.#X.push({inferenceTimeMs:W,usage:V["~debugUsage"]}),V}async runTool(J,Q,Y){let X=Y.id,G=J.invokeTool(Y.name,{args:Y.input},{...Q,tool:Y.name});return this.setToolUseStatus(X,"in-progress"),wF(G,this.#J.signal).then((Z)=>{return this.setToolUseStatus(X,"done",Z.status==="done"?Z.result:void 0),KM(X,Z)}).catch((Z)=>{if(Z instanceof Error&&Z.name==="AbortError")throw this.setToolUseStatus(X,"cancelled"),Z;return this.setToolUseStatus(X,"error"),KM(X,{status:"error",error:{message:"message"in Z?Z.message:String(Z)}})})}setToolUseStatus(J,Q,Y){let X=this.#$.at(-1)?.activeTools.get(J);if(!X)throw Error("Cannot update the status of a tool that does not exist");this.#$.at(-1)?.activeTools.set(J,{...X,status:Q,result:Y}),this.sendProgressUpdate()}sendProgressUpdate(){this.next({status:"in-progress",turns:this.#$.map((J)=>({...J,activeTools:new Map(J.activeTools)}))})}}});function Em4(J){return
|
|
2306
|
-
|
|
2305
|
+
[ ... omitted remaining lines to make summarizing use less tokens ... ]`,ff0;var MM1=G1(()=>{HY();H0();ff0=["text","diff","output"]});var hf0;var bf0=G1(()=>{yZ();q4();hf0={spec:{name:KO,description:"Run CI/CD checks (typechecker, linter, formatter, and tests) to validate the changes. Returns the success or failure status, plus the relevant log lines. If tree parameter is provided, checks will be run for that specific repository tree. Otherwise, checks will be run for the tree with the most changes or the first available tree.",inputSchema:{type:"object",properties:{tree:{type:"string",description:'URI of the specific tree/repository to run checks for (e.g., "file:///path/to/repo"). If not provided, will automatically select the most appropriate tree.'}},required:[],additionalProperties:!1},source:"builtin",meta:{disableTimeout:!0}},fn:nF({os:null,github:null,gitlab:null})}});class WJ{systemPrompt;model;scaffold;#J=new AbortController;#Q=new u4;#$=[];#X=[];constructor(J,Q,Y){this.systemPrompt=J;this.model=Q;this.scaffold=Y}dispose(){this.#J.abort()}run(J,Q,Y){return this._run(J,Q,Y).catch((X)=>{this.#Q.next({status:"error","~debug":{conversation:J,inferences:this.#X},message:`Uncaught subagent error: ${X}`})}).finally(()=>{this.#Q.complete()}),this.#Q}async _run(J,Q,Y){this.sendProgressUpdate(J);let X=void 0;while(!0){this.#J.signal.throwIfAborted();let Z=(await W6(Q.tools,this.#J.signal)).map(({spec:O,enabled:M})=>M?O:null).filter((O)=>O!==null).map((O)=>v2(this.model,O));this.#J.signal.throwIfAborted();let q=performance.now(),{result:V,toolUses:K,debugUsage:W}=await this.scaffold.runInference(this.model,this.systemPrompt,J,Z,Y.thread,{configService:Y.configService},this.#J.signal),z=performance.now()-q,U={maxInputTokens:0,inputTokens:0,outputTokens:0,cacheCreationInputTokens:null,cacheReadInputTokens:null,totalInputTokens:0,credits:0};this.#X.push({inferenceTimeMs:z,usage:W??U}),this.#$.push({message:this.scaffold.extractMessage(V),activeTools:new Map(K.map((O)=>[O.id,{tool_name:O.name,status:"queued",input:O.input}]))}),this.#J.signal.throwIfAborted();let B=await Promise.all(K.map((O)=>this.runTool(Q,Y,O)));if(this.scaffold.updateConversation(J,V,B),K.length===0){X=this.scaffold.extractMessage(V),this.scaffold.updateConversation(J,V,[]);break}this.sendProgressUpdate(J)}this.#Q.next({status:"done",message:X??LM1,turns:this.#$,"~debug":{conversation:J,inferences:this.#X}})}async runTool(J,Q,Y){let X=Y.id,G=J.invokeTool(Y.name,{args:Y.input},{...Q,tool:Y.name});return this.setToolUseStatus(X,"in-progress"),await wF(G,this.#J.signal).then((Z)=>{return this.setToolUseStatus(X,"done",Z.status==="done"?Z.result:void 0),{id:X,result:Z}}).catch((Z)=>{if(Z instanceof Error&&Z.name==="AbortError")throw this.setToolUseStatus(X,"cancelled"),Z;return this.setToolUseStatus(X,"error"),{id:X,result:{status:"error",error:String(Z)}}})}setToolUseStatus(J,Q,Y){let X=this.#$.at(-1)?.activeTools.get(J);if(!X)throw Error("Cannot update the status of a tool that does not exist");this.#$.at(-1)?.activeTools.set(J,{...X,status:Q,result:Y})}sendProgressUpdate(J){this.#Q.next({status:"in-progress",turns:this.#$,"~debug":{conversation:J,inferences:this.#X}})}}var LM1="Agent did not produce a response";var VK=G1(()=>{g0();K5()});function wm4(J){return J.content.filter((Q)=>Q.type==="text").map((Q)=>typeof Q==="string"?Q:Q.text||"").join("")}var bM;var os=G1(()=>{g0();_3();GG();VK();K5();bM=class bM extends u4{#J=new AbortController;#Q;#$=[];#X=[];constructor(J,Q,Y,X,G){let Z=T3(X.toolService,J,!1);super();this.#Q=G??yN1,this.start(Z,Q,Y,X).catch((q)=>{this.error(q)}).finally(()=>{this.complete()})}dispose(){this.#J.abort()}async start(J,Q,Y,X){this.#J.signal.throwIfAborted();let G=[{role:"user",content:Y}];while(!0){this.#J.signal.throwIfAborted();let q=(await W6(J.tools,this.#J.signal)).map(({spec:z,enabled:U})=>U?z:null).filter((z)=>z!==null).map((z)=>v2(this.#Q,z));this.#J.signal.throwIfAborted();let V=await this.runInference(G,q,[{type:"text",text:Q}],X.thread,X),K=V.message;if(!K)break;let W=V.message?.content.filter((z)=>z.type==="tool_use")??[];if(this.#$.push({message:wm4(K),activeTools:new Map(W.map((z)=>[z.id,{tool_name:z.name,status:"queued",input:z.input}]))}),this.sendProgressUpdate(),W.length===0)break;this.#J.signal.throwIfAborted();let H=await Promise.all(W.map((z)=>this.runTool(J,X,z)));G.push({role:"assistant",content:K.content},{role:"user",content:H.filter((z)=>z!==void 0)})}this.next({status:"done",message:this.#$.at(-1)?.message??LM1,turns:this.#$,"~debug":{inferences:this.#X,conversation:G}})}async runInference(J,Q,Y,X,G){this.#J.signal.throwIfAborted();let Z=performance.now(),q=crypto.randomUUID(),V=await SP(J,Q,Y,X,{configService:G.configService},this.#Q,this.#J.signal,void 0,q),W=performance.now()-Z,H=await z7(q,G.configService);if(V["~debugUsage"])V["~debugUsage"].credits=H??0;return this.#X.push({inferenceTimeMs:W,usage:V["~debugUsage"]}),V}async runTool(J,Q,Y){let X=Y.id,G=J.invokeTool(Y.name,{args:Y.input},{...Q,tool:Y.name});return this.setToolUseStatus(X,"in-progress"),wF(G,this.#J.signal).then((Z)=>{return this.setToolUseStatus(X,"done",Z.status==="done"?Z.result:void 0),KM(X,Z)}).catch((Z)=>{if(Z instanceof Error&&Z.name==="AbortError")throw this.setToolUseStatus(X,"cancelled"),Z;return this.setToolUseStatus(X,"error"),KM(X,{status:"error",error:{message:"message"in Z?Z.message:String(Z)}})})}setToolUseStatus(J,Q,Y){let X=this.#$.at(-1)?.activeTools.get(J);if(!X)throw Error("Cannot update the status of a tool that does not exist");this.#$.at(-1)?.activeTools.set(J,{...X,status:Q,result:Y}),this.sendProgressUpdate()}sendProgressUpdate(){this.next({status:"in-progress",turns:this.#$.map((J)=>({...J,activeTools:new Map(J.activeTools)}))})}}});function Em4(J){return`${J.description}
|
|
2307
2306
|
\`\`\`json
|
|
2308
2307
|
${JSON.stringify(J.args)}
|
|
2309
|
-
|
|
2310
|
-
`}function SY(J){return`# Examples
|
|
2308
|
+
\`\`\``}function SY(J){return`# Examples
|
|
2311
2309
|
|
|
2312
2310
|
`+J.map(Em4).join(`
|
|
2313
2311
|
|
|
@@ -2678,9 +2676,7 @@ ${JSON.stringify(ii4)}
|
|
|
2678
2676
|
Replace the body of a function:
|
|
2679
2677
|
${JSON.stringify(ni4)}
|
|
2680
2678
|
|
|
2681
|
-
`,Wp0={spec:{name:"edit_file",description:ai4,inputSchema:j0.toJSONSchema(_e,{}),source:"builtin",executionProfile:{resourceKeys:(J)=>{let{success:Q,data:Y}=_e.safeParse(J);if(Q)return[{key:Y.path,mode:"write"}];return[]}}},fn:Promise.resolve().then(() => (qp0(),Zp0)).then(({nodeEditFileTool:J})=>J)}});var Hp0={};v8(Hp0,{nodeEditFileV3Tool:()=>oi4});var oi4=(J,Q)=>{let{args:Y,userInput:X}=J,{thread:G,filesystem:Z}=Q;return f6(async(q)=>{let V=ke.parse(Y),K=YJ(V.path),W=await cF(K,Z,Q.config.settings);if(W.requiresConsent){if(X&&!X.accepted)return{status:"rejected-by-user",reason:W.reason,toAllow:W.toAllow?[W.toAllow]:void 0};else if(!X?.accepted)return{status:"blocked-on-user",reason:W.reason,toAllow:W.toAllow?[W.toAllow]:void 0}}if(!await Z.isExclusiveWriterFor(K)){let B=BI(K,G.id),O=await Z.getMtime(K,{signal:q});if(B!==void 0&&O&&B<O)return{status:"error",progress:{},error:{message:`The file '${V.path}' has been modified since you last read it. Please use ${b6} to view the current version before making edits.`}}}let H=await Z.readFile(K,{signal:q}),{modifiedContent:z,diff:U}=await Fp0(V.path,H,V.script);return await Z.writeFile(K,z,{signal:q}),{status:"done",progress:{},result:{diff:U},trackFiles:[z6(K)]}})};var zp0=G1(()=>{J4();g0();IO();TO();q4();cA1();AQ()});async function Fp0(J,Q,Y){ei4(Y);let X=await import("node:vm"),G=X.createContext({content:Q}),Z;try{Z=X.runInContext(Y,G,{timeout:5000})}catch(q){throw Error(`Script execution failed: ${q instanceof Error?q.message:String(q)}`)}return Jn4(Q,Z,J)}function ei4(J){if(/\[REDACTED:[a-zA-Z-]+\]/.test(J))throw Error("The edit script contains a redaction marker. Please identify a different edit location that does not contain redacted content.")}function Jn4(J,Q,Y){if(typeof Q!=="string")throw Error(`Script must return a string, but returned ${typeof Q}. Make sure the last expression evaluates to the new file content.`);if(J===Q)throw Error("Edit resulted in no changes");let X=Qn4(J,Q,Y);return{modifiedContent:Q,diff:X}}function Qn4(J,Q,Y="file"){return gF(Y.toString(),Y.toString(),J??"",Q,"original","modified",{ignoreWhitespace:!0})}var ke,si4,ti4,Up0;var cA1=G1(()=>{wk();IV();q4();ke=j0.object({path:j0.string().describe("The absolute path to the file (must be absolute, not relative). File must exist. ALWAYS generate this argument first."),script:j0.string().describe("A JavaScript expression or script that transforms the file content. The original file content is available as the global variable `content`. The script should evaluate to the new file content as a string. Standard JavaScript string methods like `replace()`, `split()`, `slice()`, etc. are available.")}),si4=[{description:"
|
|
2682
|
-
lines.splice(5, 0, 'new line')
|
|
2683
|
-
lines.join('\\n')`}},{description:"Insert a line at the beginning of the About section",args:{path:"/Users/alice/website/README.md",script:"content.replace('# About\\n\\n', '# About\\n\\nMy name is Alice.\\n')"}},{description:'Import "fmt" and use "fmt.Printf" instead of "print"',args:{path:"/home/balthazar/src/github.com/balthazar/galactus/main.go",script:`content.replace('import "os"\\n', 'import (\\n\\t"fmt"\\n\\t"os"\\n)\\n')`}},{description:"Replace the body of a function",args:{path:"/Users/alice/project/utils.rs",script:"content.replace(/(fn calculate\\(x: i32, y: i32\\) -> i32 \\{).+?^\\}/ms, '$1\\n\\tx + y\\n}')"}}],ti4=`Make edits to a text file using a JavaScript script.
|
|
2679
|
+
`,Wp0={spec:{name:"edit_file",description:ai4,inputSchema:j0.toJSONSchema(_e,{}),source:"builtin",executionProfile:{resourceKeys:(J)=>{let{success:Q,data:Y}=_e.safeParse(J);if(Q)return[{key:Y.path,mode:"write"}];return[]}}},fn:Promise.resolve().then(() => (qp0(),Zp0)).then(({nodeEditFileTool:J})=>J)}});var Hp0={};v8(Hp0,{nodeEditFileV3Tool:()=>oi4});var oi4=(J,Q)=>{let{args:Y,userInput:X}=J,{thread:G,filesystem:Z}=Q;return f6(async(q)=>{let V=ke.parse(Y),K=YJ(V.path),W=await cF(K,Z,Q.config.settings);if(W.requiresConsent){if(X&&!X.accepted)return{status:"rejected-by-user",reason:W.reason,toAllow:W.toAllow?[W.toAllow]:void 0};else if(!X?.accepted)return{status:"blocked-on-user",reason:W.reason,toAllow:W.toAllow?[W.toAllow]:void 0}}if(!await Z.isExclusiveWriterFor(K)){let B=BI(K,G.id),O=await Z.getMtime(K,{signal:q});if(B!==void 0&&O&&B<O)return{status:"error",progress:{},error:{message:`The file '${V.path}' has been modified since you last read it. Please use ${b6} to view the current version before making edits.`}}}let H=await Z.readFile(K,{signal:q}),{modifiedContent:z,diff:U}=await Fp0(V.path,H,V.script);return await Z.writeFile(K,z,{signal:q}),{status:"done",progress:{},result:{diff:U},trackFiles:[z6(K)]}})};var zp0=G1(()=>{J4();g0();IO();TO();q4();cA1();AQ()});async function Fp0(J,Q,Y){ei4(Y);let X=await import("node:vm"),G=X.createContext({content:Q}),Z;try{Z=X.runInContext(Y,G,{timeout:5000})}catch(q){throw Error(`Script execution failed: ${q instanceof Error?q.message:String(q)}`)}return Jn4(Q,Z,J)}function ei4(J){if(/\[REDACTED:[a-zA-Z-]+\]/.test(J))throw Error("The edit script contains a redaction marker. Please identify a different edit location that does not contain redacted content.")}function Jn4(J,Q,Y){if(typeof Q!=="string")throw Error(`Script must return a string, but returned ${typeof Q}. Make sure the last expression evaluates to the new file content.`);if(J===Q)throw Error("Edit resulted in no changes");let X=Qn4(J,Q,Y);return{modifiedContent:Q,diff:X}}function Qn4(J,Q,Y="file"){return gF(Y.toString(),Y.toString(),J??"",Q,"original","modified",{ignoreWhitespace:!0})}var ke,si4,ti4,Up0;var cA1=G1(()=>{wk();IV();q4();ke=j0.object({path:j0.string().describe("The absolute path to the file (must be absolute, not relative). File must exist. ALWAYS generate this argument first."),script:j0.string().describe("A JavaScript expression or script that transforms the file content. The original file content is available as the global variable `content`. The script should evaluate to the new file content as a string. Standard JavaScript string methods like `replace()`, `split()`, `slice()`, etc. are available.")}),si4=[{description:"Rename identifier with word boundaries",args:{path:"/Users/alice/project/utils.ts",script:"content.replace(/\\boldName\\b/g, 'newName')"}},{description:"Filter and transform lines",args:{path:"/path/to/log.txt",script:"content.split('\\n').filter(l => !l.includes('DEBUG')).map(l => l.trim()).join('\\n')"}},{description:"Update version number using lookbehind",args:{path:"/Users/alice/project/package.json",script:`content.replace(/(?<="version": ")[\\d.]+/, '2.0.0')`}},{description:"Insert after a heading using `$&`",args:{path:"/Users/alice/docs/README.md",script:"content.replace(/^## Installation\\n/m, '$&\\nRun the following command:\\n')"}},{description:"Replace a string with special characters. Use a function for the second arg to `replace` to avoid special patterns getting replaced.",args:{path:"/Users/bob/src/test.ts",script:`content.replace('"version_$1"', () => '"version_$&"')`}}],ti4=`Make edits to a text file using a JavaScript script.
|
|
2684
2680
|
|
|
2685
2681
|
Runs a JavaScript script that transforms the file content. The original content is available as the global variable \`content\`.
|
|
2686
2682
|
|
|
@@ -4410,11 +4406,11 @@ Actual: ${G}`)}async function eV8(J,Q,Y){let{execSync:X}=await import("node:ch
|
|
|
4410
4406
|
${B}`;if(G==="pnpm"&&B.includes("Unable to find the global bin directory"))O+=`
|
|
4411
4407
|
|
|
4412
4408
|
Hint: Try running "pnpm setup" to configure pnpm global directory, or use npm instead:
|
|
4413
|
-
npm install -g @sourcegraph/amp`;V(Error(O))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}H0();H0();async function Q41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=XK8(J,K),H=W<0,z,U;if(V.time){let B=V.time[J],O=V.time[K],M=Date.now();if(B)z=Math.floor((M-new Date(B).getTime())/3600000);if(O)U=Math.floor((M-new Date(O).getTime())/3600000)}return x.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return x.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function XK8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}g0();function Y41(J,Q){let Y=new u4,X=Y.pipe(d8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new UV().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await _U(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=lL(),W=await Q41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,B=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await J41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await Ru(W.latestVersion,z);let U=await dB(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",B),Y.next("updated");else G.warn("success with warning",B),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await _U(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as CK}from"node:process";function F26(J){let Q=new _L().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(X)=>{await rR1(X.force||!1,X.verbose||!1,"0.0.
|
|
4409
|
+
npm install -g @sourcegraph/amp`;V(Error(O))}},error:(U)=>{if(!H)H=!0,V(Error(`Failed to spawn ${G}: ${U.message}`))},complete:()=>{if(!H)H=!0,q()}})})}H0();H0();async function Q41(J,Q){let X=Q||"https://registry.npmjs.org";try{let G=new AbortController,Z=setTimeout(()=>G.abort(),5000),q=await fetch(`${X}/@sourcegraph/amp`,{signal:G.signal});if(clearTimeout(Z),!q.ok)return{hasUpdate:!1,currentVersion:J,source:"npm"};let V=await q.json(),K=V["dist-tags"]?.latest;if(!K)return{hasUpdate:!1,currentVersion:J,source:"npm"};let W=XK8(J,K),H=W<0,z,U;if(V.time){let B=V.time[J],O=V.time[K],M=Date.now();if(B)z=Math.floor((M-new Date(B).getTime())/3600000);if(O)U=Math.floor((M-new Date(O).getTime())/3600000)}return x.info("NPM version comparison",{currentVersion:J,latestVersion:K,compareResult:W,hasUpdate:H,currentVersionAge:z,latestVersionAge:U}),{hasUpdate:H,latestVersion:K,currentVersion:J,currentVersionAge:z,latestVersionAge:U,source:"npm"}}catch(G){return x.debug("Error checking npm version",{error:G}),{hasUpdate:!1,currentVersion:J,source:"npm"}}}function XK8(J,Q){let Y=(q)=>{let[V,K]=q.split("-");return{parts:V?.split(".").map(Number)||[],label:K}},X=Y(J),G=Y(Q),Z=Math.max(X.parts.length,G.parts.length);for(let q=0;q<Z;q++){let V=X.parts[q]||0,K=G.parts[q]||0;if(V<K)return-1;if(V>K)return 1}if(X.label===G.label)return 0;if(!X.label&&G.label)return 1;if(X.label&&!G.label)return-1;if(X.label&&G.label)return X.label<G.label?-1:1;return 0}g0();function Y41(J,Q){let Y=new u4,X=Y.pipe(d8({shouldCountRefs:!1}));return setImmediate(async()=>{let G=new UV().scoped("update"),Z=X.subscribe({next:(q)=>{G.debug("emit new state",q)}});try{let q=process.env.AMP_TEST_UPDATE_STATUS;if(q){G.debug("using fake update status for testing",{status:q}),await _U(500),Y.next(q);return}if(process.env.AMP_SKIP_UPDATE_CHECK==="1"){G.debug("checking disabled via AMP_SKIP_UPDATE_CHECK environment variable");return}let V=await Q.get("updates.mode");if(V==="disabled"){G.debug("checking disabled");return}G.debug("checking",{currentVersion:J,mode:V});let K=lL(),W=await Q41(J,K);if(!(W.latestVersion&&W.hasUpdate)){G.debug("no update available");return}let H=()=>{if(W.currentVersionAge!==void 0&&W.latestVersionAge!==void 0){let U=W.currentVersionAge-W.latestVersionAge,B=0.5;if(Math.abs(U)<0.5)return G.debug("versions too close together, suppressing update warning",{currentVersionAge:W.currentVersionAge,latestVersionAge:W.latestVersionAge,ageDifferenceHours:U}),!0}return!1},z=await J41();if(!V)V=z==="pnpm"?"warn":"auto",G.debug("no configured update mode; selected default based on package manager",{packageManager:z,mode:V});if(V==="warn"){if(!H())Y.next("update-available");return}if(!z){if(G.debug("auto-update not supported, falling back to warn mode"),!H())Y.next("update-available");return}try{await Ru(W.latestVersion,z);let U=await dB(W.latestVersion),B={from:W.currentVersion,to:W.latestVersion,...U};if(U.status==="same")G.info("success",B),Y.next("updated");else G.warn("success with warning",B),Y.next("updated-with-warning")}catch(U){Y.next("update-error")}}catch(q){G.debug("check failed",{error:q})}finally{await _U(5000),Y.next("hidden"),Z.unsubscribe(),Y.complete()}}),{state:X}}import{stderr as CK}from"node:process";function F26(J){let Q=new _L().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(X)=>{await rR1(X.force||!1,X.verbose||!1,"0.0.1764028904-g50ee11"),process.exit()});J.addCommand(Q,{hidden:!0});let Y=new _L("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(X)=>{await GK8(X.targetVersion)});J.addCommand(Y)}async function GK8(J){if(process.env.AMP_SKIP_UPDATE_CHECK==="1")CK.write(S4.yellow(`Note: AMP_SKIP_UPDATE_CHECK=1 is set, which disables automatic update checking. Manual updates will still work.
|
|
4414
4410
|
|
|
4415
4411
|
`));try{if(!J){CK.write(S4.blue(`Checking for updates...
|
|
4416
|
-
`));let Y=lL(),{hasUpdate:X,latestVersion:G}=await Q41("0.0.
|
|
4417
|
-
`));let Z=await dB("0.0.
|
|
4412
|
+
`));let Y=lL(),{hasUpdate:X,latestVersion:G}=await Q41("0.0.1764028904-g50ee11",Y);if(!X){CK.write(S4.green(`✓ Amp CLI is already up to date.
|
|
4413
|
+
`));let Z=await dB("0.0.1764028904-g50ee11");if(Z.warning)CK.write(`
|
|
4418
4414
|
`+S4.yellow(Z.warning)+`
|
|
4419
4415
|
`);process.exit(0)}if(!G)CK.write(S4.yellow("[WARN] could not find latest version")),process.exit(0);J=G}CK.write(S4.blue(`Updating to version ${J}...
|
|
4420
4416
|
`)),await Ru(J,void 0,(Y)=>{CK.write(S4.dim(`Running: ${Y}
|
|
@@ -5036,7 +5032,7 @@ exit code: ${Z}`,new U1({color:X.foreground,dim:!0,italic:!0})));if(q)V.push(new
|
|
|
5036
5032
|
`,O),...M],E=[new l1({text:new Q1("",void 0,L)})];if(W.url){let P=W.url.replace(/^https?:\/\//,"");E.push(new G4({children:[new l1({text:new Q1("See more: ",O)}),new u3({uri:W.url,text:P,style:new U1({color:Y.secondary,underline:!0})})]}))}let I=new l0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:E});return X8.child(new e0({constraints:new d6(40,120,0,1/0),child:new G4({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[new F4({flex:1,child:new nC1({width:40,height:40,agentMode:this.agentMode,...V&&{primaryColor:{r:100,g:20,b:20},secondaryColor:{r:255,g:60,b:70}},fps:q==="fast"?60:q==="slow"?15:0,...q==="disabled"&&{seed:42,t:3}})}),new N0({width:1}),new F4({flex:2,child:I})]})}))}}H0();K9();q4();K5();K9();g0();function kN8(J,Q){return`${J}:${Q}`}class A_1{threadService;workers=new Map;threadsMap=new Map;subthreadsMap=new Map;mainThreadSubs=new Map;subthreadsSubs=new Map;workerStatusSubs=new Map;subthreadPatchSubs=new Map;mainThreadObservable;subthreadObservable;workerStatusObservable;emitMainThread=null;emitSubthread=null;emitWorkerStatus=null;constructor(J){this.threadService=J;this.mainThreadObservable=new J0((Q)=>{return this.emitMainThread=(Y)=>Q.next(Y),()=>{this.emitMainThread=null}}),this.subthreadObservable=new J0((Q)=>{return this.emitSubthread=(Y)=>Q.next(Y),()=>{this.emitSubthread=null}}),this.workerStatusObservable=new J0((Q)=>{return this.emitWorkerStatus=(Y)=>Q.next(Y),()=>{this.emitWorkerStatus=null}})}registerWorker(J){let Q=J.thread.id;if(this.workers.has(Q))this.unregisterWorker(Q);this.threadsMap.set(Q,J.thread),this.subthreadsMap.set(Q,[]),this.workers.set(Q,{state:"initial"});let Y=this.threadService.observePatches(Q).pipe(zO()).subscribe((Z)=>{this.threadsMap.set(Q,Z);let q=this.subthreadsMap.get(Q)||[],V=this.workers.get(Q)||{state:"initial"};if(this.emitMainThread)this.emitMainThread({threadID:Q,mainThread:Z,subthreads:q,workerStatus:V})});this.mainThreadSubs.set(Q,Y);let X=J.status.subscribe((Z)=>{if(this.workers.set(Q,Z),this.emitWorkerStatus)this.emitWorkerStatus({threadID:Q,status:Z})});this.workerStatusSubs.set(Q,X);let G=J.subthreads.subscribe((Z)=>{this.subthreadsMap.set(Q,Z);for(let q of Z){let V=kN8(Q,q.toolUse.id);if(this.subthreadPatchSubs.has(V))continue;let K=this.threadService.observePatches(q.threadID).pipe(zO()).subscribe((W)=>{if(this.emitSubthread)this.emitSubthread({threadID:Q,thread:W,subthread:q})});this.subthreadPatchSubs.set(V,K)}});this.subthreadsSubs.set(Q,G)}unregisterWorker(J){let Q=this.mainThreadSubs.get(J);if(Q)Q.unsubscribe(),this.mainThreadSubs.delete(J);let Y=this.workerStatusSubs.get(J);if(Y)Y.unsubscribe(),this.workerStatusSubs.delete(J);let X=this.subthreadsSubs.get(J);if(X)X.unsubscribe(),this.subthreadsSubs.delete(J);for(let[G,Z]of this.subthreadPatchSubs.entries())if(G.startsWith(`${J}:`))Z.unsubscribe(),this.subthreadPatchSubs.delete(G);this.workers.delete(J),this.threadsMap.delete(J),this.subthreadsMap.delete(J)}observeThread(J){return{mainThread:new J0((Q)=>{return this.mainThreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),subthreads:new J0((Q)=>{return this.subthreadObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})}),workerStatus:new J0((Q)=>{return this.workerStatusObservable.subscribe((Y)=>{if(Y.threadID===J)Q.next(Y)})})}}get threadViewStates(){let J={};for(let[Q,Y]of this.threadsMap){let X=this.workers.get(Q);if(X)J[Q]=FL(Y,X)}return J}dispose(){for(let J of this.mainThreadSubs.values())J.unsubscribe();for(let J of this.subthreadsSubs.values())J.unsubscribe();for(let J of this.workerStatusSubs.values())J.unsubscribe();for(let J of this.subthreadPatchSubs.values())J.unsubscribe();this.mainThreadSubs.clear(),this.subthreadsSubs.clear(),this.workerStatusSubs.clear(),this.subthreadPatchSubs.clear(),this.workers.clear(),this.threadsMap.clear(),this.subthreadsMap.clear()}}function yN8(J,Q){switch(Q.type){case"subthread-patch":{let{thread:Y,subthread:X}=Q,G=J.subagents[X.threadID];if(!G){if(G={subThreadID:Y.id,parentToolID:X.toolUse.id,taskDescription:X.toolUse.input.description||"Task",isCompleted:!1,agentState:{type:"idle"}},J.mainThread){let W=rJ(J.mainThread);G.isCompleted=xY6(W,X.toolUse.id)}}let Z=vN8(Y,G.agentState),q=G.agentState===Z?G:{...G,agentState:Z},V={...J.tools},K=wC(Y).items.filter((W)=>W.type==="toolResult");for(let W of K)V[W.id]={id:W.id,subthreadID:Y.id,toolRun:W.toolResult.run,toolUse:W.toolUse};return{subagents:{...J.subagents,[X.threadID]:q},tools:V,items:J.items,viewState:J.viewState,todosList:J.todosList,mainThread:J.mainThread}}case"main-thread-patch":{let{thread:Y,subthreads:X,workerStatus:G}=Q,Z=rJ(Y),q={...J.subagents};for(let z of X){let U=q[z.threadID];if(!U)continue;let B=xY6(Z,z.toolUse.id);q[z.threadID]={...U,isCompleted:B}}let{items:V}=wC(Y),K=FL(Y,G),W=tE({messages:Y.messages}),H=Array.isArray(W)?W:[];return{...J,subagents:q,items:V,viewState:K,todosList:H,mainThread:Y}}case"worker-status-change":{if(!J.mainThread)return J;let Y=FL(J.mainThread,Q.workerStatus);if(Y===J.viewState)return J;return{...J,viewState:Y}}default:return J}}function wC(J){let Q=[],Y=new Map,X=new Set;for(let[G,Z]of J.messages.entries()){let q=`${Z.role}-${G}`;switch(Z.role){case"assistant":{let V=Z.state.type==="streaming";for(let W of Z.content)if(W.type==="tool_use"){if(Y.set(W.id,W),V)X.add(W.id)}if(Z.content.some((W)=>W.type==="text"&&W.text.trim()||W.type==="thinking"))Q.push({type:"message",id:q,message:Z});for(let W of Z.content)if(W.type==="tool_use"){let H=!1;for(let z=G+1;z<J.messages.length;z++){let U=J.messages[z];if(U){for(let B of U.content)if(B.type==="tool_result"&&B.toolUseID===W.id){H=!0;break}}if(H)break}if(!H)Q.push({type:"toolResult",id:W.id,toolUse:W,toolResult:{type:"tool_result",toolUseID:W.id,run:{status:V?"in-progress":"queued"}}})}break}case"info":Q.push({type:"message",id:q,message:Z});break;case"user":{if(Z.content.some((K)=>K.type==="text"&&K.text.trim()||K.type==="image"))Q.push({type:"message",id:q,message:Z});for(let K of Z.content)if(K.type==="tool_result"){let W=Y.get(K.toolUseID)??B$(J,K.toolUseID);if(!W)throw Error(`(bug) tool use ${K.toolUseID} not found`);Q.push({type:"toolResult",id:K.toolUseID,toolUse:W,toolResult:K})}break}}}return{items:Q}}function xY6(J,Q){let Y=J.get(Q);return(Y&&q7(Y.run))??!1}function vN8(J,Q){let Y=J.messages.at(-1);if(Y?.content.some((G)=>G.type==="tool_result"&&G.run.status==="blocked-on-user"))return x.info("Subagent status: idle (blocked-on-user)",{threadID:J.id}),{type:"idle"};if(wC(J).items.some((G)=>G.type==="toolResult"&&G.toolResult.run.status==="in-progress")){let G=Q?.type==="running-tools"?Q.startTime:Date.now();return x.info("Subagent status: running-tools",{threadID:J.id,startTime:G,hasStartTime:!!G}),{type:"running-tools",startTime:G}}if(Y&&Y.role==="assistant"&&Y.state.type==="streaming")switch(Y.content.at(-1)?.type){case"text":return x.info("Subagent status: streaming-text",{threadID:J.id}),{type:"streaming-text"};case"thinking":return x.info("Subagent status: streaming-thinking",{threadID:J.id}),{type:"streaming-thinking"};case"tool_use":{let Z=Q?.type==="running-tools"?Q.startTime:Date.now();return x.info("Subagent status: running-tools (streaming tool_use)",{threadID:J.id,startTime:Z,hasStartTime:!!Z}),{type:"running-tools",startTime:Z}}default:return x.info("Subagent status: streaming-text (default)",{threadID:J.id}),{type:"streaming-text"}}return x.info("Subagent status: idle (default)",{threadID:J.id}),{type:"idle"}}class w_1 extends Q6{props;constructor(J){super();this.props=J}createState(){return new fY6}}class fY6 extends J6{state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null};workerController;subscriptions=[];currentWorker;constructor(){super();this.workerController=null,this.currentWorker=null}initState(){let{threadService:J,worker:Q}=this.widget.props;this.workerController=new A_1(J),this.currentWorker=Q,this.setupSubscriptions(Q)}dispose(){this.cleanup()}didUpdateWidget(J){if(J.props.threadService!==this.widget.props.threadService||J.props.worker!==this.widget.props.worker)this.cleanup(),this.setupSubscriptions(this.widget.props.worker)}setupSubscriptions(J){this.workerController.registerWorker(J);let Q=this.workerController.observeThread(J.thread.id),Y=Q.mainThread.subscribe((Z)=>{this.dispatch({type:"main-thread-patch",thread:Z.mainThread,subthreads:Z.subthreads,workerStatus:Z.workerStatus})});this.subscriptions.push(Y);let X=Q.subthreads.subscribe((Z)=>{this.dispatch({type:"subthread-patch",thread:Z.thread,subthread:Z.subthread})});this.subscriptions.push(X);let G=Q.workerStatus.subscribe((Z)=>{this.dispatch({type:"worker-status-change",workerStatus:Z.status})});this.subscriptions.push(G)}cleanup(){this.subscriptions.forEach((J)=>J.unsubscribe()),this.subscriptions=[]}switchWorker(J){this.cleanup(),this.setState(()=>{this.currentWorker=J}),this.setState(()=>{this.state={subagents:{},tools:{},items:[],viewState:{state:"initial",interactionState:!1,toolState:{running:0,blocked:0}},todosList:[],mainThread:null}}),this.setupSubscriptions(J)}dispatch(J){this.setState(()=>{this.state=yN8(this.state,J)})}getThreadData(){let J=Object.values(this.state.tools).map((Z)=>({toolUse:Z.toolUse,toolRun:Z.toolRun,subthreadID:Z.subthreadID})),Q={};for(let Z of Object.values(this.state.subagents)){let q=J.filter((V)=>V.subthreadID===Z.subThreadID);Q[Z.parentToolID]=q}let Y=(Z)=>Z===a5||Z===e8||Z===mE||Z===fF||Z===hF||Z===pE||Z===dE||Z===U$,X=new Map;for(let Z of this.state.items)if(Z.type==="toolResult"&&Y(Z.toolUse.name))X.set(Z.toolUse.id,{toolUseId:Z.toolUse.id,toolName:Z.toolUse.name,toolRun:Z.toolResult.run});let G=Array.from(X.values());for(let{toolUseId:Z,toolRun:q}of G){let V=[],K;if(q.status==="in-progress"||q.status==="done"||q.status==="error"||q.status==="cancelled")K=q.progress;if(K){let W=0;for(let H of K)if(H.tool_uses)for(let z of H.tool_uses){let U=`${Z}:progress:${W++}`;V.push({toolUse:rE(z.tool_name,z.input,U),toolRun:{status:z.status}})}}Q[Z]=V}return{...this.state,subagents:Object.values(this.state.subagents),subagentActiveTools:J,subagentToolsByParentID:Q}}build(J){let Q=this.getThreadData();return this.widget.props.builder(J,Q,this.workerController,(Y)=>this.switchWorker(Y),()=>this.currentWorker)}}class E_1 extends Q6{props;constructor(J){super({key:J.key});this.props=J}createState(){return new hY6}}class hY6 extends J6{build(J){let Y=x6.of(J).colors,{todos:X,title:G="TODOs"}=this.widget.props;if(!Array.isArray(X)||X.length===0)return new N0({width:0,height:0});let Z=X.map((q)=>this.buildTodoItem(q,Y));return new e0({child:new g6({padding:_0.symmetric(1,0),child:new l0({crossAxisAlignment:"stretch",mainAxisSize:"min",children:[new l1({text:new Q1(G,new U1({bold:!0,color:Y.foreground}))}),...Z]})})})}buildTodoItem(J,Q){let Y=this.getStatusIcon(J.status),X=J.status==="completed",G=new U1({bold:J.status==="in-progress",color:Q.foreground,dim:X}),Z=new U1({bold:J.status==="in-progress",strikethrough:J.status==="completed",color:Q.foreground,dim:X});return new G4({crossAxisAlignment:"start",children:[new l1({text:new Q1(Y,G)}),new N0({width:1}),new F4({child:new l1({text:new Q1(J.content,Z)})})]})}getStatusIcon(J){return J==="completed"?"✓":"•"}}class I_1 extends T6{ad;onDismiss;onButtonClick;constructor({key:J,ad:Q,onDismiss:Y,onButtonClick:X}){super({key:J});this.ad=Q,this.onDismiss=Y,this.onButtonClick=X}build(J){let Q=x6.of(J),Y=Q.colors.primary,X=Q.colors.foreground;return new e0({decoration:new T8(void 0,new n4(new j4(Y,1,"rounded"),new j4(Y,1,"rounded"),void 0,new j4(Y,1,"rounded"))),child:new g6({padding:_0.horizontal(1),child:new l0({children:[new G4({crossAxisAlignment:"start",children:[new F4({child:new l1({text:new Q1(this.ad.content,new U1({color:X}))})}),new N0({width:4}),new u3({uri:"https://ampcode.com/free",text:"Ad",style:new U1({color:X,dim:!0}),onError:(G)=>{}})]}),new G4({crossAxisAlignment:"start",children:[new GS1({text:this.ad.buttonLabel,onPressed:()=>this.onButtonClick?.(),padding:_0.horizontal(1),color:Y,reverse:!0}),new N0({width:2}),new l1({text:new Q1(this.ad.destinationUrlHostname,new U1({color:X,dim:!0}))})]})]})})})}}class P_1 extends Q6{props;constructor(J){super();this.props=J}createState(){return new bY6(this.props.autofocus??!0)}}class bY6 extends J6{autofocus;constructor(J){super();this.autofocus=J}build(J){let Q=(V)=>{if(V.key==="Enter"&&this.widget.props.showCopyOption)return this.widget.props.onSelect("copy"),"handled";if(V.ctrlKey&&V.key==="c"||V.key==="Escape")return this.widget.props.onSelect(null),"handled";return"ignored"},Y=V8.sizeOf(J),X=Math.min(60,Y.width-4),G=Y.height-4,Z=[];if(this.widget.props.title)Z.push(new l1({text:new Q1(this.widget.props.title,new U1({bold:!0,color:M1.blue}))}),new N0({height:1}));if(this.widget.props.message)Z.push(new l1({text:new Q1(this.widget.props.message,void 0,void 0,{uri:this.widget.props.message,id:"ad-link"})}));if(this.widget.props.message)Z.push(new N0({height:1}));let q=[];if(this.widget.props.showCopyOption)q.push(new l1({text:new Q1("Enter to copy",new U1({dim:!0}))}));return q.push(new l1({text:new Q1("Escape to close",new U1({dim:!0}))})),Z.push(new G4({children:q.flatMap((V,K)=>K<q.length-1?[V,new N0({width:1}),new l1({text:new Q1("•",new U1({dim:!0}))}),new N0({width:1})]:[V]),mainAxisSize:"min"})),new X8({child:new e0({constraints:new d6(X,X,0,G),decoration:new T8(M1.default(),new n4(new j4(M1.blue,1,"rounded"),new j4(M1.blue,1,"rounded"),new j4(M1.blue,1,"rounded"),new j4(M1.blue,1,"rounded"))),padding:new _0(2,2,2,2),child:new r8({autofocus:this.autofocus,onKey:Q,child:new l0({children:Z,mainAxisSize:"min"})})})})}}class c81 extends Error{constructor(J="Command timed out"){super(J);this.name="CommandTimeoutError",Object.setPrototypeOf(this,c81.prototype)}}class l81 extends Error{constructor(J){let Q=`${J.noun}: ${J.verb} command cancelled`;super(Q);this.name="CommandCancelledError",Object.setPrototypeOf(this,l81.prototype)}}function T_1(J){let Q=J.match(/"([^"]*)"|'([^']*)'|([^\s"']+)/g);if(!Q)return[];return Q.map((Y)=>{if(Y.startsWith('"')&&Y.endsWith('"')||Y.startsWith("'")&&Y.endsWith("'"))return Y.slice(1,-1);return Y})}dF();H0();import{spawn as xN8}from"node:child_process";import{promises as fN8}from"node:fs";function uY6(J){return J.kind==="executable"}function gY6(J){return J.kind==="markdown"}var Uz=50000,mY6=300000;async function R_1(J,Q,Y,X={}){let{timeoutMs:G=mY6,signal:Z,source:q}=X;try{let V=await Y.getCommand(J,q);if(!V)return{success:!1,output:"",error:`Command '${J}' not found`};if(!await Y.isCommandAvailable(J,q))return{success:!1,output:"",error:`Command '${J}' is not available for execution`};if(x.debug("Executing command",{commandName:J,filePath:V.filePath,args:Q}),gY6(V))return await hN8(V,Q);else if(uY6(V))return await bN8(V,Q,G,Z);else return{success:!1,output:"",error:"Unsupported command type"}}catch(V){return x.error("Failed to execute command",{commandName:J,error:V}),{success:!1,output:"",error:V instanceof Error?V.message:"Unknown error occurred"}}}async function hN8(J,Q){try{if(Q.length>0)return{success:!1,output:"",error:"Markdown commands do not accept arguments"};let Y=await fN8.readFile(J.filePath,"utf8");return{success:!0,output:(Y.length>Uz?Y.slice(0,Uz)+`
|
|
5037
5033
|
... (output truncated at ${Uz} characters)`:Y).trim(),exitCode:0}}catch(Y){return{success:!1,output:"",error:Y instanceof Error?Y.message:"Failed to read markdown file"}}}async function bN8(J,Q,Y=mY6,X){return new Promise((G)=>{let[Z,q]=uN8(J,Q);x.debug("Spawning command",{spawnCommand:Z,spawnArgs:q.slice(0,10),filePath:J.filePath,timeoutMs:Y});let V=FD0(X),K=!1,W=setTimeout(()=>{K=!0,V.abort(),x.warn("Command execution timed out",{commandName:J.name,timeoutMs:Y})},Y),H=xN8(Z,q,{stdio:["pipe","pipe","pipe"],signal:V.signal,detached:!0}),z=[],U=[],B=0;H.stdout?.on("data",(O)=>{let M=O.toString();if(B+=M.length,B<=Uz)z.push(M);else{let L=Uz-(B-M.length);if(L>0)z.push(M.slice(0,L))}}),H.stderr?.on("data",(O)=>{let M=O.toString();if(B+=M.length,B<=Uz)U.push(M);else{let L=Uz-(B-M.length);if(L>0)U.push(M.slice(0,L))}}),H.on("close",(O)=>{if(clearTimeout(W),K){G({success:!1,output:z.join(""),error:`Command timed out after ${Y}ms`,exitCode:void 0});return}if(V.signal.aborted){G({success:!1,output:z.join(""),error:"The command was aborted",exitCode:O??void 0});return}let M=O===0||O===1,L=z.join(""),E=U.join(""),I=L;if(!M&&!L.trim()&&E.trim())I=E;else if(E.trim())I+=L?`
|
|
5038
5034
|
${E}`:E;if(B>Uz)I+=`
|
|
5039
|
-
... (output truncated at ${Uz} characters)`;G({success:M,output:I.trim(),error:!M?E.trim()||"Command failed":void 0,exitCode:O??void 0})}),H.on("error",(O)=>{clearTimeout(W);let M=O.message;if(K)M=`Command timed out after ${Y}ms`;else if(O.message.includes("operation was aborted")||O.name==="AbortError")M="The command was aborted";G({success:!1,output:z.join(""),error:M})})})}function uN8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return mN8(Y,X?[...X]:null,G,Q);else return gN8(Y,X?[...X]:null,G,Q)}function gN8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function mN8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}H0();rZ();C5();hW();aZ();nZ();TV();wH();fe();K5();b_();g0();qP();import{writeFile as nY6}from"fs/promises";import aY6 from"path";H0();aZ();class C_1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;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(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.
|
|
5035
|
+
... (output truncated at ${Uz} characters)`;G({success:M,output:I.trim(),error:!M?E.trim()||"Command failed":void 0,exitCode:O??void 0})}),H.on("error",(O)=>{clearTimeout(W);let M=O.message;if(K)M=`Command timed out after ${Y}ms`;else if(O.message.includes("operation was aborted")||O.name==="AbortError")M="The command was aborted";G({success:!1,output:z.join(""),error:M})})})}function uN8(J,Q){let{filePath:Y,interpreter:X,extension:G}=J;if(process.platform==="win32")return mN8(Y,X?[...X]:null,G,Q);else return gN8(Y,X?[...X]:null,G,Q)}function gN8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];else return[J,X]}function mN8(J,Q,Y,X){if(Q&&Q.length>0&&Q[0])return[Q[0],[...Q.slice(1),J,...X]];switch(Y.toLowerCase()){case".bat":case".cmd":return["cmd.exe",["/c",J,...X]];case".ps1":return["powershell.exe",["-ExecutionPolicy","Bypass","-File",J,...X]];case".exe":return[J,X];default:return[J,X]}}H0();rZ();C5();hW();aZ();nZ();TV();wH();fe();K5();b_();g0();qP();import{writeFile as nY6}from"fs/promises";import aY6 from"path";H0();aZ();class C_1{enabled;configService;commandCounts=new Map;timer=null;bufferTimeMs=1e4;constructor(J,Q){this.enabled=J;this.configService=Q;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(([Q,Y])=>({feature:"cli.command",action:Q,source:{client:"cli",clientVersion:"0.0.1764028904-g50ee11"},parameters:{metadata:{count:Y}},timestamp:Date.now()*1000}));this.commandCounts.clear();try{let Q=JSON.stringify(J);await so(Q,this.configService)}catch(Q){x.error("Failed to export command telemetry events",Q)}}async submit(J){if(!await this.enabled()||this.timer===null)return;let Q=this.commandCounts.get(J)||0;this.commandCounts.set(J,Q+1)}async dispose(){if(await this.flushEvents(),this.timer!==null)clearInterval(this.timer),this.timer=null}}class S_1 extends Q6{props;constructor(J){super();this.props=J}createState(){return new pY6}}class pY6 extends J6{_state;initState(){super.initState(),this._state=this.widget.props.initialState}build(J){let Q=(Y)=>{this.setState(()=>{this._state=Y(this._state)})};return this.widget.props.builder(J,Q,this._state)}}class dY6 extends J6{controller=new kG;focusNode=new g8({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 Q=x6.of(J),{colors:Y,app:X}=Q,G=this.widget.props.isRequiredArg??!0,Z=this.controller.text.trim().length>0,q=!G||Z,V=n4.all(new j4(Y.foreground,1,"solid")),K=new QA({controller:this.controller,focusNode:this.focusNode,placeholder:this.widget.props.placeholder??"Enter command argument...",onSubmitted:(B)=>{let O=B.trim();if(G&&O.length===0)return;this.widget.props.onSubmit(O)},autofocus:!0,style:{textColor:Y.foreground,border:null},maxLines:1}),W=new G4({children:[new e0({decoration:{color:M1.default()},child:new l1({text:new Q1(">",new U1({color:Y.foreground}))})}),new F4({child:K})]}),H=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1("",void 0,[new Q1("Command: ",new U1({color:Y.foreground})),new Q1(this.widget.props.commandName,new U1({color:M1.yellow,bold:!0}))])})}),z=[];if(q)z.push(new Q1("Enter",new U1({color:X.keybind}))),z.push(new Q1(" to submit, ",new U1({color:Y.foreground,dim:!0})));z.push(new Q1("Esc",new U1({color:X.keybind}))),z.push(new Q1(" to cancel",new U1({color:Y.foreground,dim:!0})));let U=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1("",void 0,z)})});return new e0({decoration:{border:V,color:M1.default()},padding:_0.all(1),child:new l0({children:[H,new N0({height:1}),W,new m5,U]})})}}class i81 extends Q6{props;constructor(J){super();this.props=J}createState(){return new dY6}}TV();class cY6 extends J6{controller=new kG;imageAttachments=[];imagePaths=[];isConfirmingClearInput=!1;clearInputConfirmTimeout=null;focusNode=new g8({debugLabel:"CommandMultilinePrompt",onKey:(J)=>{if(J.key==="Escape"){if(this.isConfirmingClearInput){if(this.controller.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[],this.imagePaths=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.controller.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return this.widget.props.onDismiss(),"handled"}return"ignored"}});initState(){if(this.widget.props.initialText)this.controller.text=this.widget.props.initialText;if(this.widget.props.initialImages)this.imageAttachments=[...this.widget.props.initialImages];this.focusNode.requestFocus()}_handleInsertImage=(J)=>{if(this.imageAttachments.length>=lF)return!1;let Q=GC(J);if(typeof Q==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Q],this.imagePaths=[...this.imagePaths,J]}),!1;return!1};_handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1),this.imagePaths=this.imagePaths.slice(0,-1)})};dispose(){if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.focusNode.dispose(),this.controller.dispose()}build(J){let Q=x6.of(J),{colors:Y,app:X}=Q,Z=V8.of(J).size.height,q=Math.max(Math.floor(Z*0.5),10),V=new NA({controller:this.controller,triggers:[new GN],completionBuilder:this.widget.props.completionBuilder,ampURL:this.widget.props.ampURL,onSubmitted:(B)=>{this.widget.props.onSubmit(B.trim(),this.imageAttachments)},theme:Y,placeholder:this.widget.props.placeholder||"Enter your message...",enabled:this.widget.props.enabled??!0,autofocus:!0,clipboard:D9.instance.tuiInstance.clipboard,showMenuBelow:!0,onInsertImage:this.widget.props.onInsertImage??this._handleInsertImage,imageAttachments:this.imageAttachments,popImage:this._handlePopImage}),K=new r8({focusNode:this.focusNode,child:V}),W=new e0({constraints:new d6({maxHeight:q}),padding:_0.symmetric(1,0),child:K}),H=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1("",void 0,[new Q1("Command: ",new U1({color:Y.foreground})),new Q1(this.widget.props.commandName,new U1({color:M1.yellow,bold:!0}))])})}),z=new e0({padding:_0.symmetric(1,0),child:new l1({text:this.isConfirmingClearInput?new Q1("",void 0,[new Q1("Esc",new U1({color:X.keybind})),new Q1(" again to clear input",new U1({color:Y.foreground,dim:!0}))]):new Q1("",void 0,[new Q1("Press ",new U1({color:Y.foreground,dim:!0})),new Q1("Enter",new U1({color:X.keybind})),new Q1(" to submit, ",new U1({color:Y.foreground,dim:!0})),new Q1("Esc",new U1({color:X.keybind})),new Q1(" to clear",new U1({color:Y.foreground,dim:!0}))])})}),U=[H,new N0({height:1}),new F4({child:W}),new N0({height:1}),z];return new e0({decoration:{border:n4.all(new j4(Y.foreground,1,"solid")),color:M1.default()},padding:_0.all(1),child:new l0({children:U})})}}class DA extends Q6{props;constructor(J){super();this.props=J}createState(){return new cY6}}class j_1 extends T6{props;constructor(J){super();this.props=J}build(){return new X8({child:new l1({text:new Q1("",void 0,[new Q1(`Forked to new thread:
|
|
5040
5036
|
|
|
5041
5037
|
`,new U1({color:M1.white,dim:!0})),new Q1(`"${this.props.newThreadTitle||"Untitled"}"`,new U1({color:M1.white}))]),textAlign:"center"})})}}class Bz extends Q6{props;constructor(J){super();this.props=J}createState(){return new lY6}}class lY6 extends J6{_spinner=new hK;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 Q=x6.of(J),{colors:Y}=Q,X=n4.all(new j4(Y.foreground,1,"solid")),G=this._spinner.toBraille(),Z=new l1({textAlign:"center",text:new Q1("",void 0,[new Q1(G,new U1({color:M1.yellow})),new Q1(" ",void 0),new Q1(this.widget.props.message,new U1({color:Y.foreground}))])}),V=[new F4({child:new l0({mainAxisAlignment:"center",crossAxisAlignment:"center",children:[Z]})})];if(this.widget.props.onAbort)V.push(new N0({height:2,child:new e0({padding:_0.symmetric(2,0),child:new l1({text:new Q1("",new U1({dim:!0}),[new Q1("Press ",new U1({color:Y.foreground})),new Q1("Esc",new U1({color:Y.info})),new Q1(" to cancel",new U1({color:Y.foreground}))])})})}));let K=new e0({decoration:new T8(M1.default(),X),child:new N0({width:60,height:7,child:new l0({mainAxisAlignment:"start",children:V})})});if(this.widget.props.onAbort)return new r8({debugLabel:"LoadingDialog",autofocus:!0,onKey:(W)=>{if(W.key==="Escape")return this.widget.props.onAbort?.(),"handled";return"ignored"},child:K});return K}}class Nz extends Q6{props;constructor(J){super();this.props=J}createState(){return new iY6}}class iY6 extends J6{dispose(){super.dispose()}isWidgetMessage(J){return J instanceof yK}build(J){let 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 W=t41(Q);return{title:W.title,type:W.type,description:W.description}})(),X=Y.type==="error"?M1.red:M1.yellow,G=n4.all(new j4(M1.default(),1,"solid")),Z=new e0({padding:_0.symmetric(1,0),child:new l1({text:new Q1(Y.title,new U1({color:X,bold:!0}))})}),q=this.isWidgetMessage(Q)?Q.widget:new l1({text:new Q1(Y.description,new U1({color:M1.default()})),selectable:!0}),V=new F4({child:new tL({child:new e0({padding:_0.symmetric(1,0),child:q})})}),K=new e0({padding:_0.symmetric(1,0),child:new l1({text:this.widget.props.onRetry?new Q1("",void 0,[new Q1("Press ",new U1({color:M1.default(),dim:!0})),new Q1("R",new U1({color:M1.yellow})),new Q1(" to retry, ",new U1({color:M1.default(),dim:!0})),new Q1("Esc",new U1({color:M1.yellow})),new Q1(" to cancel",new U1({color:M1.default(),dim:!0}))]):new Q1("Press any key to close",new U1({color:M1.default(),dim:!0,italic:!0}))})});return new r8({onKey:(W)=>{if(this.widget.props.onRetry&&W.key==="r")return this.widget.props.onRetry(),"handled";if(W.key==="Escape")return this.widget.props.onDismiss(),"handled";if(!this.widget.props.onRetry)return this.widget.props.onDismiss(),"handled";return"ignored"},autofocus:!0,child:new e0({decoration:{border:G,color:M1.default()},padding:_0.all(1),child:new l0({mainAxisAlignment:"center",children:[Z,new N0({height:1}),V,K]})})})}}class __1 extends T6{build(){return new X8({child:new l1({text:new Q1("",void 0,[new Q1(`✓ Thread Shared
|
|
5042
5038
|
|
|
@@ -5122,7 +5118,7 @@ https://www.jetbrains.com/help/idea/managing-plugins.html#install_plugin_from_di
|
|
|
5122
5118
|
`)?`${V}...`:G,W=new U1({color:M1.index(8)}),H=[new Q1(K,W)];if(q>0){let z=new U1({color:Y.success});for(let U=1;U<=q;U++)H.push(new Q1(" ")),H.push(new Q1(`[${U}]`,z))}return new g6({padding:_0.only({bottom:0}),child:new G4({crossAxisAlignment:"start",children:[new g6({padding:_0.only({right:1}),child:new l1({text:new Q1("•",new U1({color:M1.index(8)}))})}),new F4({child:new l1({text:new Q1("",void 0,H)})})]})})}}class qk1 extends Q6{createState(){return new m$6}}class m$6 extends J6{_animationTimer;_visible=!0;initState(){super.initState(),this._startAnimation()}dispose(){this._stopAnimation(),super.dispose()}_startAnimation(){this._animationTimer=setInterval(()=>{this.setState(()=>{this._visible=!this._visible})},500)}_stopAnimation(){if(this._animationTimer)clearInterval(this._animationTimer),this._animationTimer=void 0}build(J){let Q=new U1({color:M1.red}),Y=new U1({color:this._visible?M1.red:M1.transparent()});return new G4({children:[new l1({text:new Q1("⏺",Y)}),new N0({width:1}),new l1({text:new Q1("Replay",Q)})]})}}function sD8(J){let Y=new Date().getTime()-J.getTime(),X=Math.floor(Y/3600000),G=Math.floor(X/24),Z=Math.floor(G/7),q=Math.floor(G/30);if(X<1)return"Just now";if(X<24)return`${X}h ago`;if(G<7)return`${G}d ago`;if(Z<=4)return`${Z}w ago`;return`${q}mo ago`}class Vk1{threadHistoryService;constructor(J){this.threadHistoryService=J}async fetchThreadSummaries(J=""){try{return{ok:!0,threads:(await new Promise((G)=>{let Z=this.threadHistoryService.observeThreadList().subscribe((q)=>{Z.unsubscribe(),G(q)})})).filter((G)=>{if(!J.trim())return!0;let Z=G.title?.toLowerCase()||"untitled",q=G.id.toLowerCase(),V=J.toLowerCase();return Z.includes(V)||q.includes(V)}).map((G)=>{let Z=new Date(G.userLastInteractedAt),q=sD8(Z),V=G.id.slice(-8),K=G.env?.initial.trees?.[0]?.uri;return{id:G.id,title:G.title||"Untitled",updatedAt:new Date(G.userLastInteractedAt).toISOString(),description:{timeAgo:q,title:G.title||"Untitled",shortThreadID:V},diffStats:G.summaryStats?.diffStats,workspaceURI:K,parentRelationships:G.parentRelationships}})}}catch(Q){return{ok:!1,errorMsg:Q instanceof Error?Q.message:"An unexpected error occurred"}}}}H0();K9();class Kk1{currentId=null;current=null;subscribeTimer=null;subscription=null;listeners=[];threadService=null;scrollController=new b3;constructor(){}setThreadService(J){this.threadService=J}async select(J){if(!this.threadService){x.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId===J)return;this.cancelTimerAndSubscription(),this.currentId=J;let Q=await this.threadService.get(J);if(Q){if(this.currentId===J)this.current=Q,this.notifyListeners()}this.subscribeTimer=setTimeout(()=>{this.subscribeLive(J)},1000)}clear(){this.cancelTimerAndSubscription(),this.currentId=null,this.current=null,this.notifyListeners()}addListener(J){this.listeners.push(J)}removeListener(J){let Q=this.listeners.indexOf(J);if(Q!==-1)this.listeners.splice(Q,1)}dispose(){this.cancelTimerAndSubscription(),this.scrollController.dispose(),this.listeners=[]}subscribeLive(J){if(!this.threadService){x.error("TUI assert failed: ThreadService used before being set");return}if(this.currentId!==J)return;this.subscription=this.threadService.observePatches(J).pipe(zO()).subscribe((Q)=>{if(this.currentId===J)this.current=Q,this.notifyListeners()})}cancelTimerAndSubscription(){if(this.subscribeTimer)clearTimeout(this.subscribeTimer),this.subscribeTimer=null;if(this.subscription)this.subscription.unsubscribe(),this.subscription=null}notifyListeners(){for(let J of this.listeners)J(this.current)}}function p$6(J,Q){switch(J){case"update-available":return[new Q1("A newer Amp is available. Run ",new U1({color:Q.foreground,dim:!0})),new Q1("amp update",new U1({color:Q.warning}))];case"updated":return null;case"updated-with-warning":return[new Q1("Update complete, run ",new U1({color:Q.foreground,dim:!0})),new Q1("amp update",new U1({color:Q.warning})),new Q1(" to see warnings",new U1({color:Q.foreground,dim:!0}))];case"update-error":return[new Q1("Update failed, run ",new U1({color:Q.foreground,dim:!0})),new Q1("amp update",new U1({color:Q.warning})),new Q1(" to see warnings",new U1({color:Q.foreground,dim:!0}))];case"hidden":return null}}async function YO8(J){return new Promise((Q)=>{eD8("git",["branch","--show-current"],{cwd:J},(Y,X)=>{if(Y){Q(null);return}let G=X.trim();Q(G||null)})})}class i$6 extends Q6{dependencies;constructor(J){super();this.dependencies=J}createState(){return new n$6}}class n$6 extends J6{themeColors=null;themeApp=null;selectionListener=null;ideStatus=null;connectedClientsStatus=null;connectedClientsStatusExpanded=!1;randomAd=null;adSubscription=null;lastAdImpressionId=null;lastUserInteractionTime=Date.now();isConfirmingExit=!1;isExiting=!1;isConfirmingClearInput=!1;isConfirmingCancelProcessing=!1;copyMessageTimer=null;isShowingHelp=!1;isShowingConsoleOverlay=!1;isShowingConfirmationOverlay=!1;isShowingFileChangesOverlay=!1;isShowingCostBreakdownOverlay=!1;confirmationOverlayContent="";exitConfirmTimeout=null;clearInputConfirmTimeout=null;cancelProcessingConfirmTimeout=null;historyIndex=-1;historyDraft=null;bashInvocations=[];dismissedEphemeralErrorKey=null;currentTitle=void 0;currentShellModeStatus=void 0;imageAttachments=[];displayMessage=null;executingCommand=null;isShowingJetBrainsInstaller=!1;isShowingIdePicker=!1;isShowingPalette=!1;threadsForPicker=[];isLoadingThreads=!1;threadPreviewController=new Kk1;previewThread=null;planScrollController=(()=>{let J=new b3;return J.followMode=!1,J})();todoScrollController=(()=>{let J=new b3;return J.followMode=!1,J})();showingSelectionCopiedHint=!1;isShowingStandaloneThreadPicker=!1;filterThreadPickerByWorkspace=!0;agentModePulseSeq=0;currentGitBranch=null;messageViewFocusNode=new g8({debugLabel:"MessageViewFocus"});autocompleteFocusNode=new g8({debugLabel:"AutocompleteFocus"});isTextfieldAndAutocompleteFocused=!1;submitDisabledHint=null;submitDisabledHintTimer=null;showingCannotToggleMessage=null;showImageUnsupportedHint=!1;imageUnsupportedHintTimer=null;adActionModal=null;bottomGridUserHeight=void 0;bottomGridDragStartY=null;bottomGridDragStartHeight=null;pendingMCPServers=[];mcpTrustSubscription=null;agentModeSubscription=null;currentAgentMode="smart";hasToggledAgentMode=!1;inMemoryAgentModeOverride=null;cachedVisibleModes=NG();freeTierStatus=void 0;tryOpus=!1;updateState="hidden";updateServiceSubscription=null;isMessageViewInSelectionMode=!1;threadBackStack=[];threadForwardStack=[];replayDisplayedMessages=[];replayAbortController=new AbortController;replayTypingTimer=null;recordNavigation(J){this.threadBackStack.push(J),this.threadForwardStack=[]}navigateBack=async()=>{if(this.threadBackStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadBackStack.pop();this.threadForwardStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};navigateForward=async()=>{if(this.threadForwardStack.length===0)return;let J=this.widget.dependencies.worker.thread.id,Q=this.threadForwardStack.pop();this.threadBackStack.push(J),await this.switchToExistingThread(Q,{recordInNavigationHistory:!1})};startAndSwitchToNewThread=async()=>{let J=this.widget.dependencies.worker.thread.id;this.recordNavigation(J);let Q=await this.widget.dependencies.startNewThread();return this.widget.dependencies.worker=Q,this.widget.dependencies.threadID=Q.thread.id,this.widget.dependencies.switchWorker(Q),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),Q};async startReplay(){let J=this.widget.dependencies.replayMode;if(!J)return;let{thread:Q,typingEnabled:Y,baseWpm:X}=J,G=Q.messages;for(let Z=0;Z<G.length;Z++){if(this.replayAbortController.signal.aborted)break;let q=G[Z];if(!q)continue;if(Z>0)await this.replaySleep(J.messageDelayMs);if(q.role==="user"&&Y){let W=q.content.filter((H)=>H.type==="text").map((H)=>H.text).join(`
|
|
5123
5119
|
`);if(W)await this.replayTypeMessage(W,X)}if(q.role==="assistant"){let W=q.content.some((U)=>U.type==="tool_use"),H=G[Z+1],z=H?.role==="user"&&H.content.some((U)=>U.type==="tool_result");if(W&&z){let U={...q,state:{type:"streaming"}};this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,U],this.textController.clear()});let B=J.thread.id;this.getMessageScrollController(B).scrollToBottom(),await this.replaySleep(J.toolProgressDelayMs),this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages.slice(0,-1),q]});continue}}this.setState(()=>{this.replayDisplayedMessages=[...this.replayDisplayedMessages,q],this.textController.clear()});let V=J.thread.id;this.getMessageScrollController(V).scrollToBottom()}await this.replaySleep(J.exitDelayMs),D9.instance.stop()}async replayTypeMessage(J,Q){this.textController.clear();let Y=J.split(/(?<=\s)/),X=60000/Q;for(let G of Y){if(this.replayAbortController.signal.aborted)break;let Z=X/G.length;for(let q of G){this.textController.text=this.textController.text+q,this.textController.cursorPosition=this.textController.text.length,this.setState(()=>{});let V=0.8+Math.random()*0.4,K=Z*V;await this.replaySleep(K)}}}replaySleep(J){return new Promise((Q)=>{this.replayTypingTimer=setTimeout(Q,J)})}getEffectiveAgentMode(){return I41(this.widget.dependencies.worker.thread,this.inMemoryAgentModeOverride?{agentMode:this.inMemoryAgentModeOverride}:null,this.freeTierStatus,{"experimental.agentMode":this.currentAgentMode})}isProcessing(){let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return!1;if(J.viewState.state!=="active")return!1;if(Boolean(J.viewState.inferenceState==="running"))return!0;let Y=J.items.filter((Z)=>Z.type==="toolResult").filter((Z)=>Z.toolResult.run.status==="in-progress"||Z.toolResult.run.status==="queued"),X=J.subagentActiveTools.filter((Z)=>Z.toolRun.status==="in-progress"||Z.toolRun.status==="queued");return[...Y,...X].length>0}showSubmitDisabledHint(J){if(this.submitDisabledHintTimer)clearTimeout(this.submitDisabledHintTimer);this.setState(()=>{this.submitDisabledHint=J}),this.submitDisabledHintTimer=setTimeout(()=>{this.setState(()=>{this.submitDisabledHint=null}),this.submitDisabledHintTimer=null},3000)}getUIHint(){let J=this.themeColors?.colorScheme;if(!J)return null;let Q=this.themeApp;if(!Q)return null;if(this.submitDisabledHint)return new Q1(this.submitDisabledHint,new U1({color:J.foreground,dim:!0}));if(this.isExiting)return new Q1("Exiting...",new U1({color:J.foreground,dim:!0}));if(this.isConfirmingExit)return new Q1("",void 0,[new Q1("Ctrl+C",new U1({color:Q.keybind})),new Q1(" again to exit",new U1({color:J.foreground,dim:!0}))]);if(this.isConfirmingClearInput)return new Q1("",void 0,[new Q1("Esc",new U1({color:Q.keybind})),new Q1(" again to clear input",new U1({color:J.foreground,dim:!0}))]);if(this.isShowingHelp)return new Q1("",void 0,[new Q1("Escape",new U1({color:Q.keybind})),new Q1(" to close help",new U1({color:J.foreground,dim:!0}))]);if(this.showImageUnsupportedHint){let G=this.getEffectiveAgentMode(),Z=Fk1(G);return new Q1("",void 0,[new Q1("Images aren't supported in ",new U1({color:J.warning,dim:!1})),new Q1(G,new U1({color:Z})),new Q1(" mode.",new U1({color:J.warning,dim:!1}))])}if(this.isProcessing()||this.bashInvocations.length>0){if(this.isConfirmingCancelProcessing)return new Q1("",void 0,[new Q1("Esc",new U1({color:Q.keybind})),new Q1(" again to cancel",new U1({color:J.foreground,dim:!0}))]);return new Q1("",void 0,[new Q1("Esc",new U1({color:Q.keybind})),new Q1(" to cancel",new U1({color:J.foreground,dim:!0}))])}if(this.showingSelectionCopiedHint)return new Q1("Selection copied to clipboard",new U1({color:J.foreground,dim:!0}));if(this.showingCannotToggleMessage)return new Q1(this.showingCannotToggleMessage,new U1({color:J.warning,dim:!1}));let Y=p$6(this.updateState,J);if(Y)return new Q1("",void 0,Y);let X=this.widget.dependencies.worker.thread;if(X.agentMode==="plan"&&aL(X))return new Q1("",void 0,[new Q1("Ctrl+O",new U1({color:Q.keybind})),new Q1(" → Execute Plan",new U1({color:J.foreground,dim:!0}))]);return null}isTranscriptEmpty(){let{threadState:J}=this.widget.dependencies;return J.items.length===0}handleMessageRestoreSubmit=async(J)=>{let{threadState:Q,worker:Y}=this.widget.dependencies;if(!Q.mainThread?.id)return;let G=Q.mainThread?.messages.findIndex((Z)=>Z===J);if(G===void 0||G===-1)return;try{this.cancelBashInvocations(),await Y.cancel(),await Y.handle({type:"thread:truncate",fromIndex:G}),this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(Z){x.error("Failed to edit message:",Z)}};forkMessage=async(J)=>{let{threadState:Q,workerDeps:Y,threadSyncService:X}=this.widget.dependencies,G=Q.mainThread?.id;if(!G)return;let Z=Q.mainThread?.messages.findIndex((q)=>q===J);if(Z===void 0||Z<=0)return;try{let q=await K3.getOrCreateForThread(Y,G),V=await SR(q,X,Z-1);await this.switchToExistingThread(V)}catch(q){x.error("Failed to fork thread:",q),this.showErrorMessage(`Failed to fork thread: ${q}`)}};handleMessageEditSubmit=async(J,Q)=>{let{threadState:Y,worker:X}=this.widget.dependencies,G=Y.mainThread;if(!G)return;let Z=G.messages.findIndex((q)=>q.messageId!==void 0&&q.messageId===J.messageId);if(Z===-1)return;try{this.cancelBashInvocations(),await X.cancel(),this.widget.dependencies.history.add(Q);let q=sB(Q);if(q)await X.handle({type:"thread:truncate",fromIndex:Z}),this.invokeBashCommand(q.cmd,{visibility:q.visibility});else{let V=[{type:"text",text:Q}];if(this.imageAttachments.length>0)V.push(...this.imageAttachments);let K={content:V,agentMode:G.agentMode},W=Z===0;if(G.agentMode&&!W&&K.agentMode!==G.agentMode){x.error(`Cannot edit message: This thread uses ${G.agentMode} mode. To change mode, create a new thread.`);return}await X.handle({type:"user:message",message:K,index:Z})}this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]})}catch(q){x.error("Failed to edit message:",q)}};getAffectedFiles=async(J)=>{let{worker:Q}=this.widget.dependencies;try{return(await Q.getFilesAffectedByTruncation(J)).map(s3)}catch(Y){return x.error("Failed to get affected files:",Y),[]}};textController=new kG;messageScrollControllers=new Map;getMessageScrollController(J){if(!this.messageScrollControllers.has(J))this.messageScrollControllers.set(J,new b3);return this.messageScrollControllers.get(J)}scrollMessageViewToBottom(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.id;if(!Q)return;this.getMessageScrollController(Q).scrollToBottom()}findElementByKey(J){return this.searchElementTreeByKey(this.context.element,J)}searchElementTreeByKey(J,Q){if(!J)return null;if(J?.widget?.key?.value===Q)return J;if(J?.child){let X=this.searchElementTreeByKey(J.child,Q);if(X)return X}if(J?.children)for(let X of J.children){let G=this.searchElementTreeByKey(X,Q);if(G)return G}return null}setupSelectionListener(){let J=this.findElementByKey("message-view-selection-area");if(J?.state){let Q=J.state;if(Q?.controller&&!this.selectionListener)this.selectionListener=()=>{this.setState(()=>{})},Q.controller.addListener(this.selectionListener),Q.controller.onSelectionCopied=()=>{if(this.copyMessageTimer)clearTimeout(this.copyMessageTimer);this.setState(()=>{this.showingSelectionCopiedHint=!0}),this.copyMessageTimer=setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1}),this.copyMessageTimer=null},2000)}}}updateTerminalTitle(){let{threadState:J}=this.widget.dependencies,Q=J.mainThread?.title;if(Q!==this.currentTitle){this.currentTitle=Q;let Y=process.cwd().replace(process.env.HOME||"","~"),X=Q?`amp - ${Q} - ${Y}`:"";process.stdout.write(WC1(X))}}_handleTextCopy(J){if(J&&J.length>0){if(this.setState(()=>{this.showingSelectionCopiedHint=!0}),this.copyMessageTimer)clearTimeout(this.copyMessageTimer);this.copyMessageTimer=setTimeout(()=>{this.setState(()=>{this.showingSelectionCopiedHint=!1}),this.copyMessageTimer=null},2000)}}textFieldKey=new d2("text-field");ideStatusSubscription=null;ideMessageSubscription=null;ideAppendToPromptSubscription=null;connectedClientsStatusSubscription=null;paletteCommands=null;completionBuilder=null;textChangeListener=()=>{let J=this.textController.text;if(J==="/"){this.showCommandPalette(),this.textController.clear();return}let Y=sB(J)?.visibility;if(Y!==this.currentShellModeStatus)this.currentShellModeStatus=Y,this.setState(()=>{})};navigateHistoryPrevious=()=>{let J=this.widget.dependencies.history.previous();if(J!==null){if(this.historyIndex===-1)this.historyDraft=this.textController.text;this.historyIndex++,this.textController.text=J,this.textController.moveCursorToStart()}};navigateHistoryNext=()=>{let J=this.widget.dependencies.history.next();if(J!==null)this.historyIndex--,this.textController.text=J,this.textController.moveCursorToEnd();else if(this.historyIndex>-1)this.historyIndex=-1,this.textController.text=this.historyDraft||"",this.textController.moveCursorToEnd(),this.historyDraft=null};resetHistory=()=>{this.widget.dependencies.history.reset(),this.historyIndex=-1,this.historyDraft=null};openJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!0})};dismissJetBrainsInstaller=()=>{this.setState(()=>{this.isShowingJetBrainsInstaller=!1})};openIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!0})};dismissIdePicker=()=>{this.setState(()=>{this.isShowingIdePicker=!1}),N9.instance.addPostFrameCallback(()=>{this.autocompleteFocusNode.requestFocus()})};handleIdeSelection=async(J,Q)=>{if(this.widget.dependencies.ideClient.getSelectedConfig()?.pid===J.pid){this.dismissIdePicker();return}try{await this.connectToSelectedIde(J,Q)}catch(Y){let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})}this.widget.dependencies.ideClient.selectConfig(J),this.dismissIdePicker()};async connectToSelectedIde(J,Q){await this.widget.dependencies.ideClient.start(J,!0,Q)}previewControllerListener=(J)=>{this.setState(()=>{this.previewThread=J})};showStandaloneThreadPicker=()=>{this.loadThreadsForPicker(),this.setState(()=>{this.isShowingStandaloneThreadPicker=!0})};dismissStandaloneThreadPicker=()=>{this.exitApplication()};handleStandaloneThreadSelect=async(J)=>{try{await this.switchToExistingThread(J,{recordInNavigationHistory:!1}),this.threadPreviewController.clear(),this.setState(()=>{this.isShowingStandaloneThreadPicker=!1}),N9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker)this.autocompleteFocusNode.requestFocus()})}catch(Q){x.error("Failed to switch thread:",Q),this.showErrorMessage(`Failed to switch thread: ${Q}`)}};toggleThreadPickerWorkspaceFilter=()=>{this.setState(()=>{this.filterThreadPickerByWorkspace=!this.filterThreadPickerByWorkspace})};showCommandPalette(){if(this.setState(()=>{this.isShowingPalette=!this.isShowingPalette}),this.isShowingPalette)this.loadThreadsForPicker()}getPaletteCommands(){if(!this.paletteCommands)this.paletteCommands=new y_1(this.widget.dependencies.configService,this.widget.dependencies.commandRegistry,(J)=>{this.setState(()=>{this.executingCommand=J})},()=>{this.setState(()=>{this.executingCommand=null})},this.widget.dependencies.isDogfooding);return this.paletteCommands}getCompletionBuilder(){if(!this.completionBuilder)this.completionBuilder=new f_1(this.widget.dependencies.fuzzyServer,this.widget.dependencies.threadFuzzyIndexer);return this.completionBuilder}dismissPalette=()=>{this.setState(()=>{this.isShowingPalette=!1})};getCommandPaletteContext=()=>{let{threadState:J}=this.widget.dependencies;if(!J.mainThread)return null;let Q=p0.file(process.cwd()),Y=z6(Q);return{worker:this.widget.dependencies.worker,editorState:this.textController,isProcessing:this.isProcessing(),thread:J.mainThread,ampURL:this.widget.dependencies.ampURL,threadSyncService:this.widget.dependencies.threadSyncService,configService:this.widget.dependencies.configService,openInEditor:this.openInEditor,takeImageAttachments:()=>{let X=this.imageAttachments;return this.setState(()=>{this.imageAttachments=[]}),X},setImageAttachments:(X)=>{this.setState(()=>{this.imageAttachments=X})},editorDispatch:(X)=>{switch(X.type){case"set-input":this.textController.clear(),this.textController.insertText(X.input);break;case"insert-text":this.textController.insertText(X.text);break;case"clear":this.textController.clear();break}},submitMessage:(X)=>{return this.proceedWithUserMessage(X)},exitApp:this.exitApplication,openHelp:()=>{this.setState(()=>{this.isShowingHelp=!0})},settingsStorage:this.widget.dependencies.settingsStorage,clientId:this.widget.dependencies.clientId,connectedClientsService:this.widget.dependencies.connectedClientsService,mcpService:this.widget.dependencies.mcpService,startNewThread:async()=>{await this.startAndSwitchToNewThread()},navigateBack:this.navigateBack,navigateForward:this.navigateForward,canNavigateBack:this.threadBackStack.length>0,canNavigateForward:this.threadForwardStack.length>0,canUseAmpFree:this.widget.dependencies.freeTierStatus?.canUseAmpFree??!1,switchToThread:async(X)=>{return await this.switchToExistingThread(X),this.setState(()=>{this.isMessageViewInSelectionMode=!1}),this.widget.dependencies.worker},generateHandoffPrompt:async(X,G,Z)=>{let q=this.widget.dependencies.threadState.mainThread?.id;if(!q)throw Error("No active thread");let V=setTimeout(()=>{Z.throwIfAborted()},60000);try{let K=await this.widget.dependencies.threadService.generateHandoffPrompt(q,X,G,this.widget.dependencies.configService,Z);return clearTimeout(V),K}catch(K){throw clearTimeout(V),K}},handleHandoff:async(X,G)=>{let{goal:Z,generatedPrompt:q,images:V}=G;if(!Z&&!q)return{ok:!1,error:Error("Either goal or generatedPrompt required")};try{let K=this.widget.dependencies.threadState.mainThread?.id;if(!K)return{ok:!1,error:Error("No active thread")};let W=setTimeout(()=>X.abort(new c81("Handoff took too long and was aborted (timeout: 60s)")),60000);try{let H=await this.widget.dependencies.threadService.createHandoffThread(K,{goal:Z,generatedPrompt:q,images:V},this.widget.dependencies.configService,X.signal);return clearTimeout(W),await this.switchToExistingThread(H),{ok:!0}}catch(H){if(clearTimeout(W),H instanceof Error&&(H.name==="AbortError"||H.message.includes("aborted")))throw X.signal.reason;throw H}}catch(K){return x.error("Failed to create handoff thread",K),{ok:!1,error:K instanceof Error?K:Error(String(K))}}},getGuidanceFiles:async(X)=>{if(!J.mainThread)return[];return(await Zo({filesystem:this.widget.dependencies.worker.fs.fileSystemReader(),configService:this.widget.dependencies.configService,threadService:this.widget.dependencies.threadService},J.mainThread,X)).map((Z)=>({uri:Z.uri,type:Z.type}))},openIdePicker:()=>{this.openIdePicker()},getInMemoryAgentModeOverride:()=>{return this.inMemoryAgentModeOverride},setInMemoryAgentModeOverride:(X)=>{this.setState(()=>{this.inMemoryAgentModeOverride=X,this.hasToggledAgentMode=!0})},toggleAgentMode:this.toggleAgentMode,getEffectiveAgentMode:()=>this.getEffectiveAgentMode(),getEditorText:()=>this.textController.text,workspace:this.widget.dependencies.workspace??null,handleExecutePlan:async()=>{try{let X=J.mainThread?.id;if(!X){this.setState(()=>{this.displayMessage=Error("No active thread")});return}let G=await this.widget.dependencies.threadService.createPlanExecutionThread(X,"smart");await this.switchToExistingThread(G)}catch(X){x.error("Failed to execute plan",X),this.setState(()=>{this.displayMessage=Error(`Failed to execute plan: ${X instanceof Error?X.message:String(X)}`)})}},planFileManager:this.widget.dependencies.planFileManager,completionBuilder:this.getCompletionBuilder(),threads:this.threadsForPicker,previewController:this.threadPreviewController,isLoadingThreads:this.isLoadingThreads,filterByWorkspace:this.filterThreadPickerByWorkspace,currentWorkspace:Y,threadViewStates:this.widget.dependencies.workerController.threadViewStates}};async loadThreadsForPicker(){if(this.isLoadingThreads)return;this.setState(()=>{this.isLoadingThreads=!0});try{let Q=await new Vk1(this.widget.dependencies.threadHistoryService).fetchThreadSummaries();if(Q.ok)this.setState(()=>{this.threadsForPicker=Q.threads})}finally{this.setState(()=>{this.isLoadingThreads=!1})}}updateGitBranch=async()=>{let J=await YO8(process.cwd());this.setState(()=>{this.currentGitBranch=J})};removeBashInvocation=(J)=>{this.setState(()=>{this.bashInvocations=this.bashInvocations.filter((Q)=>Q.id!==J)})};invokeBashCommand=(J,{visibility:Q})=>{let Y=Date.now(),X=`bash-${Y}-${Math.random().toString(36).substring(7)}`,G={cmd:J},Z=new AbortController;this.widget.dependencies.worker.invokeBashTool(G,Z.signal,Q===oB).subscribe({next:(q)=>{this.setState(()=>{if(this.bashInvocations.find((K)=>K.id===X))this.bashInvocations=this.bashInvocations.map((K)=>K.id===X?{...K,toolRun:q}:K);else{let K={id:X,args:G,toolRun:q,startTime:Y,abortController:Z,hidden:Q===oB};this.bashInvocations=[...this.bashInvocations,K]}})},error:()=>this.removeBashInvocation(X),complete:()=>this.removeBashInvocation(X)})};cancelBashInvocations=()=>{let J=this.bashInvocations.find((Q)=>Q.toolRun.status==="in-progress");if(J)J.abortController.abort()};toggleConnectedClientsStatus=()=>{this.setState(()=>{this.connectedClientsStatusExpanded=!this.connectedClientsStatusExpanded})};toggleAgentMode=()=>{let J=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker;if(PZ(J.thread)>0)return;if(this.freeTierStatus?.canUseAmpFree){let X=this.getEffectiveAgentMode(),G=Ib(X,this.cachedVisibleModes);if(G!==X)this.setState(()=>{this.hasToggledAgentMode=!0,this.inMemoryAgentModeOverride=G,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1});return}let Q=this.getEffectiveAgentMode(),Y=Ib(Q,this.cachedVisibleModes);if(Y===Q)return;if(this.setState(()=>{this.hasToggledAgentMode=!0,this.inMemoryAgentModeOverride=Y,this.agentModePulseSeq++,this.showingCannotToggleMessage=null,this.showImageUnsupportedHint=!1}),W5(Y))this.checkAndShowFreeModeModal()};checkAndShowFreeModeModal=()=>{if(this.freeTierStatus?.canUseAmpFree)return;if(this.freeTierStatus){if(!this.freeTierStatus.eligible){this.setState(()=>{this.showingCannotToggleMessage="Amp Free is unavailable. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}else if(!this.freeTierStatus.workspaceAllowsAmpFree){this.setState(()=>{this.showingCannotToggleMessage="Your workspace does not allow Amp Free. Switch to another mode."}),setTimeout(()=>{this.setState(()=>{this.showingCannotToggleMessage=null})},3000);return}}};isInRestrictedFreeMode(){if(this.getEffectiveAgentMode()!=="free")return!1;if(this.freeTierStatus?.canUseAmpFree)return!1;return!0}handleInsertImage=(J)=>{let Q=this.getEffectiveAgentMode();if(!oh(Q)){if(this.imageUnsupportedHintTimer)clearTimeout(this.imageUnsupportedHintTimer);return this.setState(()=>{this.showImageUnsupportedHint=!0}),this.imageUnsupportedHintTimer=setTimeout(()=>{this.setState(()=>{this.showImageUnsupportedHint=!1}),this.imageUnsupportedHintTimer=null},5000),!1}if(this.imageAttachments.length>=lF)return!1;let Y=GC(J);if(typeof Y==="object")return this.setState(()=>{this.imageAttachments=[...this.imageAttachments,Y]}),!1;return this.setState(()=>{this.displayMessage=Error(`Failed to attach image: ${Y}`)}),!1};handlePopImage=()=>{if(this.imageAttachments.length>0)this.setState(()=>{this.imageAttachments=this.imageAttachments.slice(0,-1)})};openInEditor=async(J)=>{let{mkdtemp:Q,readFile:Y,unlink:X,rmdir:G,writeFile:Z}=await import("node:fs/promises"),{tmpdir:q}=await import("node:os"),V=await import("node:path");try{let K=await Q(V.join(q(),"amp-edit-")),W=V.join(K,"message.amp.md");await Z(W,J,"utf-8"),await qz(W);try{let H=await Y(W,"utf-8");this.textController.text=H}catch(H){if(H?.code!=="ENOENT")x.error("Failed to read temporary file",H)}try{await X(W),await G(K)}catch(H){x.warn("Failed to clean up temporary file",H)}}catch(K){x.error("Error opening editor:",K)}};onTextSubmitted=async(J)=>{if(!J.trim())return;let Q=sB(J);if(Q)if(!Q.cmd){this.showSubmitDisabledHint("No command provided");return}else if(this.isProcessing()){this.showSubmitDisabledHint("Unable to use shell mode while agent is active");return}else{this.invokeBashCommand(Q.cmd,{visibility:Q.visibility}),this.widget.dependencies.history.add(J),this.textController.clear(),this.resetHistory();return}this.textController.clear(),this.resetHistory(),await this.updateGitBranch(),await this.sendUserMessage(J)};initState(){if(o$.getInstance().interceptConsole(),this.threadPreviewController.setThreadService(this.widget.dependencies.threadService),this.threadPreviewController.addListener(this.previewControllerListener),this.widget.dependencies.openThreadSwitcher)this.showStandaloneThreadPicker();D9.instance.on("key",()=>{this.lastUserInteractionTime=Date.now()}),D9.instance.on("mouse",()=>{this.lastUserInteractionTime=Date.now()}),D9.instance.on("paste",()=>{this.lastUserInteractionTime=Date.now()}),this.autocompleteFocusNode.addListener((Y)=>{N9.instance.addPostFrameCallback(()=>{this.setState(()=>{this.isTextfieldAndAutocompleteFocused=Y.hasFocus})})}),this.freeTierStatus=this.widget.dependencies.freeTierStatus,W6(this.widget.dependencies.configService.config).then((Y)=>{let X=I41(this.widget.dependencies.worker.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,Y.settings);if(x.info(`[initState] Resolved agentMode: ${X}`),this.widget.dependencies.sessionState?.agentMode)this.setState(()=>{this.inMemoryAgentModeOverride=X})}),this.updateGitBranch(),this.adSubscription=jC1(this.widget.dependencies.internalAPIClient,this.widget.dependencies.configService,()=>{return(this.inMemoryAgentModeOverride&&W5(this.inMemoryAgentModeOverride)||this.randomAd===null)&&SC1(this.lastUserInteractionTime)}).subscribe({next:(Y)=>{if(Y){let X=JO8(16).toString("hex");this.lastAdImpressionId=X,Promise.resolve().then(() => (H91(),W91)).then(({recordAdEvent:G})=>{let Z=this.widget.dependencies.worker.thread,q=Z.messages[Z.messages.length-1];G("viewed",{adId:Y.id,advertiserId:Y.advertiserId,threadId:Z.id,messageId:q?.messageId,impressionId:X,placement:"tui",matchType:Y.metadata?.matchType,matchedPatterns:Y.metadata?.matchedPatterns,candidateAdPoolCount:Y.metadata?.candidateAdPoolCount,clientRegion:Y.metadata?.clientRegion})})}this.setState(()=>{this.randomAd=Y}),N9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})}});let{mcpTrustHandler:J}=this.widget.dependencies;this.mcpTrustSubscription=J.pendingServers$.subscribe((Y)=>{this.setState(()=>{this.pendingMCPServers=Y})}),this.ideStatusSubscription=this.widget.dependencies.ideClient.status.subscribe((Y)=>{this.setState(()=>{this.ideStatus=Y})}),this.ideMessageSubscription=this.widget.dependencies.ideClient.messages.subscribe(async(Y)=>{let X=this.widget.dependencies.getCurrentWorker();if(!X){x.warn("No active thread worker found to handle IDE message");return}await new Promise((G)=>setTimeout(G,50)),await X.handle({type:"user:message",message:{content:[{type:"text",text:Y}]}}),x.debug("Message sent from IDE to agent",{message:Y.slice(0,100)})}),this.ideAppendToPromptSubscription=this.widget.dependencies.ideClient.appendToPrompt.subscribe((Y)=>{this.textController.insertText(Y),x.debug("Appended text to CLI prompt from IDE",{text:Y.slice(0,100)})}),this.connectedClientsStatusSubscription=this.widget.dependencies.connectedClientsService.status.subscribe((Y)=>{this.setState(()=>{this.connectedClientsStatus=Y})}),this.updateServiceSubscription=this.widget.dependencies.updateService.state.subscribe((Y)=>{this.setState(()=>{this.updateState=Y})}),this.agentModeSubscription=this.widget.dependencies.configService.config.subscribe((Y)=>{let X=NG(Y.settings,this.freeTierStatus?.canUseAmpFree);this.setState(()=>{this.cachedVisibleModes=X,this.tryOpus=Y.settings.tryOpus??!1})}),this.textController.addListener(this.textChangeListener),this.updateTerminalTitle();let Q=this.widget.dependencies.ideClient.getSelectedConfig();if(Q)this.connectToSelectedIde(Q,"auto-startup").catch((Y)=>{let X=Y instanceof Error?Y.message:String(Y);this.setState(()=>{this.displayMessage=Error(`Failed to connect to IDE: ${X}`)})});else if(this.widget.dependencies.showIdePicker)this.openIdePicker();else if(this.widget.dependencies.showJetBrainsInstaller)this.openJetBrainsInstaller();if(this.widget.dependencies.replayMode)setTimeout(()=>this.startReplay(),100)}didUpdateWidget(J){super.didUpdateWidget(J),this.setupSelectionListener()}dispose(){if(this.replayAbortController.abort(),this.replayTypingTimer)clearTimeout(this.replayTypingTimer);if(this.ideStatusSubscription)this.ideStatusSubscription.unsubscribe();if(this.ideMessageSubscription)this.ideMessageSubscription.unsubscribe();if(this.ideAppendToPromptSubscription)this.ideAppendToPromptSubscription.unsubscribe();if(this.connectedClientsStatusSubscription)this.connectedClientsStatusSubscription.unsubscribe();if(this.updateServiceSubscription)this.updateServiceSubscription.unsubscribe();if(this.agentModeSubscription)this.agentModeSubscription.unsubscribe();if(this.adSubscription)this.adSubscription.unsubscribe();if(this.mcpTrustSubscription)this.mcpTrustSubscription.unsubscribe();if(this.threadPreviewController.removeListener(this.previewControllerListener),this.threadPreviewController.dispose(),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;if(this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;this.textController.removeListener(this.textChangeListener);for(let J of this.messageScrollControllers.values())J.dispose();if(this.messageScrollControllers.clear(),process.stdout.write(WC1("")),this.shouldUseProgressBar())process.stdout.write(Y76())}getCurrentConfirmation(){let{threadState:J}=this.widget.dependencies,X=[...J.items.filter((V)=>V.type==="toolResult").map((V)=>({toolUse:V.toolUse,toolRun:V.toolResult.run,subthreadID:void 0})),...J.subagentActiveTools].filter((V)=>V.toolRun.status==="blocked-on-user");if(X.length===0)return null;let G=X[0],Z=G.toolRun.status==="blocked-on-user"?G.toolRun.toAllow??[]:[],q=G.toolRun.status==="blocked-on-user"?G.toolRun.reason:void 0;return{type:"tool-use",tools:[{useBlock:G.toolUse,toAllow:Z}],subthreadID:G.subthreadID,reason:q}}shouldUseProgressBar(){return!1}updateProgressBar(){}onConfirmationResponse=async(J)=>{let Q=this.getCurrentConfirmation();if(!Q||Q.type!=="tool-use"){x.error("No current tool confirmation found");return}let Y=Q.tools[0]?.useBlock;if(!Y){x.error("No tool use block found in confirmation");return}if(J==="allow-all-session")hX("dangerouslyAllowAll",!0);if(J==="allow-all-persistent")try{await this.widget.dependencies.settingsStorage.set("dangerouslyAllowAll",!0,"global")}catch(G){if(G&&G instanceof Error)this.setState(()=>{this.displayMessage=G});else x.error("Failed to write dangerouslyAllowAll setting:",G);return}if(J==="always-guarded"){let G=Q.tools[0]?.toAllow??[],Z=await this.widget.dependencies.settingsStorage.get("guardedFiles.allowlist")||[],q=[...G,...Z];await this.widget.dependencies.settingsStorage.set("guardedFiles.allowlist",q,"global")}if(J==="connect-github"){let G=new URL("/settings#code-host-connections",this.widget.dependencies.ampURL).toString();try{await lJ(G)}catch(Z){x.error("Failed to open settings page:",Z),await this.showErrorMessage(`Cannot open browser. Please go to ${G} to connect to GitHub`)}return}if(J==="disable-librarian"){let G=await this.widget.dependencies.settingsStorage.get("tools.disable")??[];if(!G.includes(U$))await this.widget.dependencies.settingsStorage.set("tools.disable",[...G,U$],"global")}let X=J!==null&&["yes","allow-all-session","allow-all-persistent","always-guarded"].includes(J);try{let G={type:"user:tool-input",toolUse:Y.id,value:{accepted:X}};if(Q.subthreadID)await(await K3.getOrCreateForThread(this.widget.dependencies.workerDeps,Q.subthreadID)).handle(G);else await this.widget.dependencies.worker.handle(G)}catch(G){x.error("Failed to send tool confirmation:",G)}};showConfirmationOverlay=(J)=>{this.setState(()=>{this.isShowingConfirmationOverlay=!0,this.confirmationOverlayContent=J})};getErrorKey(J){return`${J.constructor.name}:${J.message}`}getCurrentEphemeralError(){let{threadState:J}=this.widget.dependencies,Q=J.viewState;if(Q.state!=="active"||!Q.ephemeralError)return null;let Y=this.getErrorKey(Q.ephemeralError);if(this.dismissedEphemeralErrorKey===Y)return null;return Q.ephemeralError}handleEphemeralErrorResponse=async(J)=>{let Q=this.getCurrentEphemeralError(),Y=this.widget.dependencies.worker;switch(J){case"retry":this.dismissedEphemeralErrorKey=null,await Y.retry();break;case"dismiss":if(Q)this.dismissedEphemeralErrorKey=this.getErrorKey(Q);break;case"new-thread":{this.setState(()=>{this.dismissedEphemeralErrorKey=null}),await this.startAndSwitchToNewThread();break}case"new-smart-thread":{this.setState(()=>{this.inMemoryAgentModeOverride="smart",this.dismissedEphemeralErrorKey=null}),q41({agentMode:"smart"}),await this.startAndSwitchToNewThread();break}}this.setState(()=>{})};handleDisplayMessageDismiss=()=>{this.setState(()=>{this.displayMessage=null})};handleMCPTrustOpenSettings=async()=>{let{mcpTrustHandler:J,settingsStorage:Q}=this.widget.dependencies;await J.deny();try{await qz(Q.getSettingsFilePath())}catch(Y){let X=Y instanceof Error?Y.message:String(Y);await this.showErrorMessage(`Failed to open settings: ${X}`)}};cancelStreamingMessage=async()=>{await K3.cancel(this.widget.dependencies.threadID)};markLastUserMessageAsInterrupted=async()=>{let J=this.widget.dependencies.threadState.mainThread;if(!J)return;for(let Q=J.messages.length-1;Q>=0;Q--){let Y=J.messages[Q];if(Y?.role==="user"&&!Y.interrupted){await this.widget.dependencies.worker.handle({type:"user:message:interrupt",messageIndex:Q});break}}};switchToExistingThread=async(J,Q={})=>{let{recordInNavigationHistory:Y=!0}=Q;if(Y){let X=this.widget.dependencies.worker.thread.id;if(X!==J)this.recordNavigation(X)}try{x.info(`[switchToExistingThread] Switching to thread: ${J}`);let X=await this.widget.dependencies.switchToThread(J);x.info(`[switchToExistingThread] Got worker for thread ${J}, thread.agentMode: ${X.thread.agentMode}`);let G=await this.widget.dependencies.configService.getLatest(),Z=I41(X.thread,this.widget.dependencies.sessionState??null,this.freeTierStatus,G.settings);if(x.info(`[switchToExistingThread] Thread ${J} resolved agentMode: ${Z}`),this.widget.dependencies.worker=X,this.widget.dependencies.threadID=X.thread.id,this.widget.dependencies.switchWorker(X),this.setState(()=>{x.info("[switchToExistingThread] Clearing inMemoryAgentModeOverride"),this.inMemoryAgentModeOverride=null}),X.thread.draft)if(x.info("[switchToExistingThread] Loading draft content into text controller"),this.textController.clear(),typeof X.thread.draft==="string")this.textController.insertText(X.thread.draft);else{let q=X.thread.draft.filter((W)=>W.type==="text"),V=X.thread.draft.filter((W)=>W.type==="image"),K=q.map((W)=>W.text).join(`
|
|
5124
5120
|
`);if(K)this.textController.insertText(K);if(V.length>0)this.setState(()=>{this.imageAttachments=V})}}catch(X){throw x.error("Failed to switch to thread:",J,X),Error(`Failed to switch to thread: ${J}`)}};sendUserMessage=async(J)=>{await this.proceedWithUserMessage(J)};proceedWithUserMessage=async(J)=>{this.cancelBashInvocations(),this.widget.dependencies.history.add(J);let Q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,Y=PZ(Q.thread)===0,X=this.getEffectiveAgentMode();if(Q.thread.agentMode&&!Y&&X!==Q.thread.agentMode){await this.showErrorMessage(`This thread uses ${Q.thread.agentMode} mode. To change mode, edit the first message or create a new thread.`);return}let G=[{type:"text",text:J}];if(this.imageAttachments.length>0)G.push(...this.imageAttachments);if(await Q.handle({type:"user:message",message:{content:G,agentMode:X}}),Y)q41({agentMode:X});this.scrollMessageViewToBottom(),this.setState(()=>{this.imageAttachments=[]}),N9.instance.addPostFrameCallback(()=>{if(!this.isMessageViewInSelectionMode&&!this.isShowingPalette&&!this.isShowingStandaloneThreadPicker&&!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()})};async showErrorMessage(J){this.setState(()=>{this.displayMessage=Error(J)})}exitApplication=async()=>{this.setState(()=>{this.isExiting=!0});let J=this.widget.dependencies.threadState.mainThread;if(J?.messages.length===0){if(J.relationships?.find((X)=>X.type==="handoff"&&X.role==="child"))await this.widget.dependencies.threadService.discardHandoffThread(J.id).catch(()=>{})}let Q=this.getEffectiveAgentMode();q41({agentMode:Q}).catch((Y)=>{x.warn("Failed to save session state on exit:",Y)}).finally(()=>{D9.instance.stop()})};onExitPressed=()=>{if(this.isConfirmingExit){if(this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout),this.exitConfirmTimeout=null;this.exitApplication()}else{if(this.setState(()=>{this.isConfirmingExit=!0}),this.exitConfirmTimeout)clearTimeout(this.exitConfirmTimeout);this.exitConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingExit=!1}),this.exitConfirmTimeout=null},1000)}};toHomeRelative(J){let Q=QO8();if(J===Q)return"~";if(J.startsWith(Q+Lg.sep))return"~"+J.slice(Q.length);return J}shorten(J){let Q=J.split(Lg.sep).filter(Boolean);if(Q.length<=5)return J;return[Q.slice(0,2).join(Lg.sep),"…",Q.slice(-2).join(Lg.sep)].join(Lg.sep)}build(J){let Q=V8.of(J),Y=x6.of(J),X=Y.base;this.themeColors=X;let{colors:G,app:Z}=Y;this.themeApp=Z;let q=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,V=q.thread.agentMode&&W5(q.thread.agentMode)&&this.randomAd!==null,{threadState:K}=this.widget.dependencies;this.updateTerminalTitle(),this.updateProgressBar();let W=this.getCurrentConfirmation(),H=this.widget.dependencies.replayMode,z=Boolean(H),U=K.items,B=K.mainThread||void 0,O=K.subagentToolsByParentID,M=K.todosList;if(z){let G6={...H.thread,messages:this.replayDisplayedMessages};U=wC(G6).items,B=G6,O={};let o6=tE({messages:this.replayDisplayedMessages});M=Array.isArray(o6)?o6:[]}let L=B?.id,E=B,I=z?this.replayDisplayedMessages.length===0:this.isTranscriptEmpty(),P=(G6)=>new m81({key:new d2(`preview-message-view-${G6.id}`),items:wC(G6).items,controller:this.threadPreviewController.scrollController,autofocus:!1,thread:G6,focusNode:new g8({debugLabel:"PreviewFocus"})}),R=this.previewThread,j=R?R.messages.length>2000?new l0({mainAxisSize:"max",children:[new F4({child:new N0}),new g6({padding:_0.all(2),child:new X8({child:new l1({text:new Q1("Thread too long for preview",new U1({color:G.mutedForeground,dim:!0}))})})})]}):P(R):I?new d81({agentMode:this.getEffectiveAgentMode(),tryOpus:this.tryOpus}):new m81({key:L?new d2(`message-view-${L}`):void 0,items:U,subagentToolsByParentID:O,controller:L?this.getMessageScrollController(L):new b3,autofocus:!1,onCopy:z?void 0:this._handleTextCopy.bind(this),thread:E,onMessageEditSubmit:z?void 0:this.handleMessageEditSubmit,onMessageRestoreSubmit:z?void 0:this.handleMessageRestoreSubmit,onMessageForkSubmit:z?void 0:this.forkMessage,getAffectedFiles:z?void 0:this.getAffectedFiles,focusNode:this.messageViewFocusNode,onDismissFocus:()=>{if(this.setState(()=>{this.isMessageViewInSelectionMode=!1}),!this.isShowingIdePicker)this.autocompleteFocusNode.requestFocus()},isInSelectionMode:this.isMessageViewInSelectionMode}),y=Math.max(Math.floor(Q.size.height*0.4),12),h=this.getCurrentEphemeralError(),g=this.buildBottomWidget(h,W,G,Y,K,M,y,V?this.randomAd:null,z),p=Q.size.width<40,b=K.mainThread?gU0(K.mainThread):void 0,i=new $81({threadViewState:K.viewState,threadTokenUsage:b,threadID:L??null,thread:K.mainThread??void 0,onFileChangesClick:()=>{this.setState(()=>{this.isShowingFileChangesOverlay=!this.isShowingFileChangesOverlay})},onCostBreakdownClick:()=>{this.setState(()=>{this.isShowingCostBreakdownOverlay=!this.isShowingCostBreakdownOverlay})},onShowIdePicker:this.openIdePicker,ideStatus:this.ideStatus,connectedClientsStatus:this.connectedClientsStatus,isNarrow:p,uiHint:this.getUIHint()??void 0,waitingForConfirmation:!!W,showingEphemeralError:Boolean(K.viewState.state==="active"&&K.viewState.ephemeralError),runningBashInvocations:this.bashInvocations.length>0,executingCommand:this.executingCommand?.name??null,executingCommandMessage:this.executingCommand?.statusMessage??null}),t=new Y81({bashInvocations:this.bashInvocations}),r=[],m=this.getEffectiveAgentMode(),s=this.currentShellModeStatus,q1=Fk1(m),H1=!s?m.length+1:0,a=Q.capabilities.animationSupport,o=a==="disabled"?0:a==="slow"?30:60,l=DK(m)?.uiHints?.fasterAnimation?3:1,z1=o>0&&this.agentModePulseSeq>0?new e5({children:[g,new h3({top:0,left:1,right:1,height:1,child:new Xk1({color:q1,trigger:this.agentModePulseSeq,fps:o,speed:l,leftOffset:H1})})]}):g;r.push(new F4({child:j}),t);let j1=new e5({children:[new l0({mainAxisSize:"min",children:[V?new I_1({ad:this.randomAd,onButtonClick:async()=>{let G6=this.randomAd;if(this.lastAdImpressionId)Promise.resolve().then(() => (H91(),W91)).then(({recordAdEvent:o6})=>{let b4=this.widget.dependencies.worker.thread,t4=b4.messages[b4.messages.length-1];o6("clicked",{adId:G6.id,advertiserId:G6.advertiserId,threadId:b4.id,messageId:t4?.messageId,impressionId:this.lastAdImpressionId,placement:"tui",actionType:"link_to",matchType:G6.metadata?.matchType,matchedPatterns:G6.metadata?.matchedPatterns,candidateAdPoolCount:G6.metadata?.candidateAdPoolCount,clientRegion:G6.metadata?.clientRegion})});try{await lJ(G6.shortDestinationUrl)}catch(o6){let t4=D9.instance.tuiInstance.clipboard.isOsc52Supported();this.setState(()=>{this.adActionModal={showCopyOption:t4,url:G6.shortDestinationUrl}})}}}):new N0({height:0}),new e0({constraints:new d6(0,Q.size.width,0,y),child:z1})]}),V?new h3({top:0,left:0,right:0,child:new o$6({userHeight:this.bottomGridUserHeight,maxHeight:y,onInitializeHeight:(G6)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(G6,y)})},onDrag:(G6)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(G6.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let o6=Math.floor(G6.localPosition.y)-this.bottomGridDragStartY,b4=Math.max(4,this.bottomGridDragStartHeight-o6),t4=Math.min(b4,y),c5=Math.floor(t4);if(this.bottomGridUserHeight!==c5)this.setState(()=>{this.bottomGridUserHeight=c5})},onRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null}})}):new N0({height:0})]});r.push(j1,new N0({height:1,child:new g6({padding:_0.horizontal(1),child:i})}));let e=new l0({crossAxisAlignment:"stretch",mainAxisSize:"max",children:r}),y1=z?new e5({children:[e,new h3({top:0,left:0,child:new qk1})]}):e,R1=new a8(()=>{if(this.isShowingPalette)return this.dismissPalette(),"handled";if(this.pendingMCPServers.length>0)return this.widget.dependencies.mcpTrustHandler.deny(),"handled";if(this.getCurrentEphemeralError())return this.handleEphemeralErrorResponse("dismiss"),"handled";if(this.displayMessage)return this.handleDisplayMessageDismiss(),"handled";if(this.isShowingHelp)return this.setState(()=>{this.isShowingHelp=!1}),"handled";if(this.isShowingFileChangesOverlay)return this.setState(()=>{this.isShowingFileChangesOverlay=!1}),"handled";if(this.isShowingCostBreakdownOverlay)return this.setState(()=>{this.isShowingCostBreakdownOverlay=!1}),"handled";if(this.isShowingIdePicker)return this.dismissIdePicker(),"handled";if(this.isShowingJetBrainsInstaller)return this.dismissJetBrainsInstaller(),"handled";if(this.isShowingConfirmationOverlay)return this.setState(()=>{this.isShowingConfirmationOverlay=!1,this.confirmationOverlayContent=""}),"handled";if(this.isShowingConsoleOverlay)return this.setState(()=>{this.isShowingConsoleOverlay=!1}),"handled";if(this.textController.hasSelection)return this.textController.clearSelection(),"handled";if(this.isConfirmingClearInput){if(this.textController.clear(),this.setState(()=>{this.isConfirmingClearInput=!1,this.imageAttachments=[]}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout),this.clearInputConfirmTimeout=null;return"handled"}if(this.isConfirmingCancelProcessing){if(this.bashInvocations.length>0)this.cancelBashInvocations();if(this.isProcessing())this.markLastUserMessageAsInterrupted().catch((o6)=>{x.error("Failed to mark message as interrupted:",o6)}),this.cancelStreamingMessage().catch((o6)=>{x.error("Failed to cancel streaming message:",o6)});if(this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout),this.cancelProcessingConfirmTimeout=null;return"handled"}if(this.executingCommand)return x.info("Canceling executing command:",this.executingCommand.name),this.executingCommand.abortController.abort(),"handled";if(this.bashInvocations.length>0||this.isProcessing()){if(this.setState(()=>{this.isConfirmingCancelProcessing=!0}),this.cancelProcessingConfirmTimeout)clearTimeout(this.cancelProcessingConfirmTimeout);return this.cancelProcessingConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingCancelProcessing=!1}),this.cancelProcessingConfirmTimeout=null},1000),"handled"}if(this.textController.text.trim()!==""||this.imageAttachments.length>0){if(this.setState(()=>{this.isConfirmingClearInput=!0}),this.clearInputConfirmTimeout)clearTimeout(this.clearInputConfirmTimeout);return this.clearInputConfirmTimeout=setTimeout(()=>{this.setState(()=>{this.isConfirmingClearInput=!1}),this.clearInputConfirmTimeout=null},1000),"handled"}return"ignored"}),D0=new a8(()=>{return this.onExitPressed(),"handled"}),T1=new a8(()=>{return this.setState(()=>{this.isShowingConsoleOverlay=!this.isShowingConsoleOverlay}),"handled"}),a1=new a8(()=>{return LJ.instance.toggleAll(),"handled"}),F1=new a8(()=>{return this.widget.dependencies.configService.getLatest().then((G6)=>{hX("internal.showCost",!(G6.settings["internal.showCost"]??!0))}),"handled"}),Y1=new a8(()=>{return D9.instance.toggleFrameStatsOverlay(),"handled"}),O1=new a8(()=>{return D9.instance.tuiInstance.getScreen().markForRefresh(),N9.instance.requestFrame(),"handled"}),L1=new a8(()=>{return this.toggleAgentMode(),"handled"}),w1=new a8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:b4}=this.widget.dependencies,t4=b4.mainThread?.id;return t4?this.getMessageScrollController(t4):null})();if(o6){let b4=Math.max(Math.floor(Q.size.height*0.4),10),t4=Q.size.height-b4;o6.animatePageUp(t4,100)}return"handled"}),A1=new a8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:b4}=this.widget.dependencies,t4=b4.mainThread?.id;return t4?this.getMessageScrollController(t4):null})();if(o6){let b4=Math.max(Math.floor(Q.size.height*0.4),10),t4=Q.size.height-b4;o6.animatePageDown(t4,100)}return"handled"}),u1=new a8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:b4}=this.widget.dependencies,t4=b4.mainThread?.id;return t4?this.getMessageScrollController(t4):null})();if(o6)o6.animateTo(0,100);return"handled"}),v1=new a8(()=>{let o6=this.isShowingPalette&&this.previewThread?this.threadPreviewController.scrollController:(()=>{let{threadState:b4}=this.widget.dependencies,t4=b4.mainThread?.id;return t4?this.getMessageScrollController(t4):null})();if(o6)o6.animateTo(Number.MAX_SAFE_INTEGER,100);return"handled"}),n1=new a8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";let{threadState:G6}=this.widget.dependencies;if(!G6.mainThread?.messages.some((b4)=>b4.role==="user"||sE(b4)))return"ignored";return this.setState(()=>{this.isMessageViewInSelectionMode=!0}),"handled"}),$0=new a8((G6)=>{if(G6.direction==="previous")this.navigateHistoryPrevious();else this.navigateHistoryNext();return"handled"}),Q0=new a8(()=>{if(!this.isTextfieldAndAutocompleteFocused)return"ignored";return s41().then(async(G6)=>{if(G6)try{this.handleInsertImage(G6)}finally{try{let{unlink:o6}=await import("node:fs/promises");await o6(G6)}catch{}}}),"handled"}),A0=new Map([[K4.ctrl("c"),new au],[K4.ctrl("l"),new eu],[K4.ctrl("o"),new m41],[K4.ctrl("v"),new iu],[K4.alt("s"),new qC],[K4.ctrl("s"),new qC],[K4.alt("p"),new tu],[K4.ctrl("r"),new ou],[K4.alt("d"),new su],[K4.ctrl("t"),new Jg],[K4.key("PageUp"),new h41],[K4.key("PageDown"),new b41],[K4.key("Home"),new u41],[K4.key("End"),new g41],[K4.key("Escape"),new nu],[K4.ctrl("p"),new VC("previous")],[K4.ctrl("n"),new VC("next")],[K4.key("Tab"),new Qg]]);if(!m7())A0.set(K4.key("ArrowUp"),new Qg);if(!1)A0.set(K4.alt("c"),new ru);let F6=new a8(()=>{if(this.isShowingStandaloneThreadPicker)return"handled";return this.showCommandPalette(),"handled"}),B4=new a8(()=>{return this.toggleThreadPickerWorkspaceFilter(),"handled"}),h4=new Map([[nu,R1],[eu,O1],[qC,L1],[m41,F6],[iu,Q0],[ru,T1],[ou,a1],[su,F1],[tu,Y1],[Jg,B4],[au,D0],[h41,w1],[b41,A1],[u41,u1],[g41,v1],[Qg,n1],[VC,$0]]),K8=[y1];if(this.isShowingConsoleOverlay)K8.push(new u_1);if(this.isShowingHelp){let G6=this.getPaletteCommands().getAllCommands();K8.push(new p_1({commands:G6}))}if(this.adActionModal)K8.push(new P_1({title:"Failed to open browser",message:this.adActionModal.url,showCopyOption:this.adActionModal.showCopyOption,onSelect:async(G6)=>{let o6=this.adActionModal.url;if(G6==="copy")try{await D9.instance.tuiInstance.clipboard.writeText(o6),this.setState(()=>{this.displayMessage=new QX("Link copied to clipboard")})}catch(b4){x.error("Failed to copy to clipboard",{error:b4}),this.setState(()=>{this.displayMessage=Error("Failed to copy to clipboard")})}this.setState(()=>{this.adActionModal=null})}}));if(this.pendingMCPServers.length>0){let{mcpTrustHandler:G6}=this.widget.dependencies;K8.push(new Gk1({servers:this.pendingMCPServers,onAlwaysTrust:G6.trustAlways.bind(G6),onTrustOnce:G6.trustOnce.bind(G6),onOpenSettings:this.handleMCPTrustOpenSettings,onDismiss:G6.deny.bind(G6)}))}if(this.isShowingFileChangesOverlay)K8.push(new TS1({threadData:K}));if(this.isShowingCostBreakdownOverlay&&K.mainThread)K8.push(new g_1({thread:K.mainThread}));if(this.isShowingConfirmationOverlay)K8.push(new h_1({details:this.confirmationOverlayContent}));let M0=this.getCommandPaletteContext();if(M0&&this.isShowingPalette)K8.push(new X8({child:new e0({constraints:d6.loose(80,20),child:new x_1({commandContext:M0,mainThread:K.mainThread,commands:this.getPaletteCommands(),onDismiss:this.dismissPalette})})}));if(this.isShowingIdePicker)K8.push(new c_1({onCancel:this.dismissIdePicker,onSelect:this.handleIdeSelection,jetbrainsMode:this.widget.dependencies.jetbrainsMode}));if(this.isShowingStandaloneThreadPicker){let G6=p0.file(process.cwd()),o6=z6(G6);K8.push(new X8({child:new e0({constraints:d6.loose(80,20),child:new FC({threads:this.threadsForPicker,title:"Continue Thread",onSelect:this.handleStandaloneThreadSelect,onDismiss:this.dismissStandaloneThreadPicker,previewController:this.threadPreviewController,isLoading:this.isLoadingThreads,currentWorkspaceURI:o6,filterByWorkspace:this.filterThreadPickerByWorkspace,threadViewStates:this.widget.dependencies.workerController.threadViewStates})})}))}let x0=new e5({children:K8});if(this.isShowingJetBrainsInstaller)return new JA({child:new mQ({actions:h4,child:new Lq({shortcuts:A0,debugLabel:"jetbrains-installer-shortcuts",child:new $k1({configService:this.widget.dependencies.configService,ideClient:this.widget.dependencies.ideClient,onExit:()=>process.exit(0),onContinue:this.dismissJetBrainsInstaller})})})});let c6=new tB({onError:(G6)=>{this.showErrorMessage(G6.message)},child:x0});return new JA({child:new mQ({actions:h4,child:new Lq({shortcuts:A0,debugLabel:"main-app-shortcuts",child:c6})})})}buildScrollableTodoList(J,Q,Y){return new a$6({todos:J,enabled:Q,controller:this.todoScrollController,appTheme:Y})}buildBottomWidget(J,Q,Y,X,G,Z,q,V,K){if(J)return new m_1({error:J,ampURL:this.widget.dependencies.ampURL,onResponse:this.handleEphemeralErrorResponse});if(Q){if(this.displayMessage)this.handleDisplayMessageDismiss();return new b_1({confirmationRequest:Q,onResponse:this.onConfirmationResponse,onShowOverlay:this.showConfirmationOverlay})}if(this.displayMessage)return new Zk1({message:this.displayMessage,onDismiss:this.handleDisplayMessageDismiss});let W=X.app,H=Q81(X),z=this.isInRestrictedFreeMode(),U=new NA({key:this.textFieldKey,controller:this.textController,triggers:K?[]:[new GN],completionBuilder:K?void 0:this.getCompletionBuilder(),ampURL:this.widget.dependencies.ampURL,onSubmitted:K?void 0:this.onTextSubmitted,theme:Y,placeholder:K?"Press Ctrl+C to exit":z?"Amp Free is not enabled. Press Ctrl+S to switch modes.":void 0,enabled:this.isTextfieldAndAutocompleteFocused&&!z&&!this.isShowingStandaloneThreadPicker,shellPromptRules:H,focusNode:this.autocompleteFocusNode,autofocus:!this.isMessageViewInSelectionMode&&!this.isShowingStandaloneThreadPicker&&!this.isShowingIdePicker,clipboard:D9.instance.tuiInstance.clipboard,onCopy:this._handleTextCopy.bind(this),onInsertImage:this.handleInsertImage,imageAttachments:this.imageAttachments,popImage:this.handlePopImage}),B=G.mainThread?.queuedMessages??[],O=Array.isArray(Z)&&Z.length>0,M=Array.isArray(B)&&B.length>0,L=G.mainThread?.agentMode==="plan"&&aL(G.mainThread),E,I;if(L){if(E=new rC1(new p81({thread:G.mainThread,onExecute:async()=>{let b=this.getCommandPaletteContext();if(b)await this.getPaletteCommands().execute("execute-plan",b,void 0,new AbortController)},onEdit:async()=>{try{let b=process.env.EDITOR||process.env.VISUAL||"nano",{filePath:i}=await this.widget.dependencies.planFileManager.ensureSync(G.mainThread.id);D9.instance.tuiInstance.suspend();let{execSync:t}=await import("child_process");t(`${b} "${i}"`,{stdio:"inherit"}),D9.instance.tuiInstance.resume()}catch(b){x.error("Failed to edit plan",b),this.setState(()=>{this.displayMessage=Error("Failed to edit plan")})}},controller:this.planScrollController,appTheme:X}),{clipBehavior:"antiAlias"}),M)I=new K91({queuedMessages:B});else if(O)I=this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!z,X)}else E=M?new K91({queuedMessages:B}):void 0,I=O?this.buildScrollableTodoList(Z,this.isTextfieldAndAutocompleteFocused&&!z,X):void 0;let P=[],R=this.currentShellModeStatus;if(R)P.push({text:new Q1(R==="hidden"?"shell mode (incognito)":"shell mode",new U1({color:R==="hidden"?X.app.shellModeHidden:X.app.shellMode})),position:"top-left"});if(!R&&this.cachedVisibleModes.length>1){let b=this.previewThread,i=b?b.agentMode??this.getEffectiveAgentMode():this.getEffectiveAgentMode(),t=Fk1(i);if(b)P.push({text:new Q1(i,new U1({color:t})),position:"top-left",offsetY:0});else{let m=Ib(i,this.cachedVisibleModes)!==i,s=this.widget.dependencies.getCurrentWorker()||this.widget.dependencies.worker,q1=PZ(s.thread)===0,a=z||!this.hasToggledAgentMode&&m&&q1?new Q1("",void 0,[new Q1(i,new U1({color:t})),new Q1(" (click or ",new U1({color:Y.foreground,dim:!0})),new Q1("Ctrl+S",new U1({color:W.keybind})),new Q1(" to switch)",new U1({color:Y.foreground,dim:!0}))]):new Q1(i,new U1({color:t}));P.push({text:a,position:"top-left",offsetY:0,onClick:q1?this.toggleAgentMode:void 0})}}if(this.connectedClientsStatus&&this.connectedClientsStatus.enabled){let b=this.connectedClientsStatus,i=b.mode||"disconnected",t=!!b.errorMessage,r=b.clientID||"unknown",m,s;if(t)m="●",s=M1.red;else if(i==="presence")m="○",s=M1.yellow;else if(i==="connected"&&b.connected)m="●",s=M1.green;else m="○",s=M1.yellow;let q1=this.connectedClientsStatusExpanded?`${r} ${m}`:m;P.push({text:new Q1(q1,new U1({color:s})),position:"top-right",offsetX:-2,offsetY:0,onClick:this.toggleConnectedClientsStatus})}let j=K?this.widget.dependencies.replayMode.thread.env?.initial.trees?.[0]?.uri:G.mainThread?.env?.initial.trees?.[0]?.uri,y;if(j)y=p0.parse(j).fsPath;else y=process.cwd();let h=this.toHomeRelative(y),g=this.shorten(h),p=!K&&this.currentGitBranch?`${g} (${this.currentGitBranch})`:g;return P.push({text:new Q1(p,new U1({color:Y.foreground,dim:!0})),position:"bottom-right"}),new DS1({leftChild:new F4({child:U}),rightChild1:E,rightChild2:I,maxHeight:q,overlayTexts:P,borderColor:z||!this.isTextfieldAndAutocompleteFocused?M1.index(8):void 0,hasBanner:V!==null,userHeight:this.bottomGridUserHeight,onInitializeHeight:(b)=>{this.setState(()=>{this.bottomGridUserHeight=Math.min(b,q)})},onDrag:(b)=>{if(this.bottomGridDragStartY===null)this.bottomGridDragStartY=Math.floor(b.localPosition.y),this.bottomGridDragStartHeight=this.bottomGridUserHeight;let i=Math.floor(b.localPosition.y)-this.bottomGridDragStartY,t=Math.max(4,this.bottomGridDragStartHeight-i),r=Math.min(t,q),m=Math.floor(r);if(this.bottomGridUserHeight!==m)this.setState(()=>{this.bottomGridUserHeight=m})},onDragRelease:()=>{this.bottomGridDragStartY=null,this.bottomGridDragStartHeight=null},enableResize:V===null})}}async function Uk1(J){if((await J.configService.getLatest()).settings["terminal.animation"]===!1)D9.instance.tuiInstance.setOptions({queryOptions:{animationDisabled:!0}});let X=()=>null,Z=!1,q=new Gz(Z,1000,J.inspectorPort),V=J.features?.find((L)=>L.name==="amp-connect")?.enabled??!1,K=new w_1({threadService:J.threadService,worker:J.worker,builder:(L,E,I,P,R)=>{if(X=R,J.threadDependencies&&V)vC1(J.threadDependencies,J.configService,R,P,J.connectedClientsService,J.startNewThread,J.switchToThread,J.clientId).catch((g)=>{x.error("Failed to start automatic presence:",g)});let j=R(),y=j.thread.id,h={...J,worker:j,threadID:y};return new i$6({...h,threadState:E,workerController:I,switchWorker:P,getCurrentWorker:R})}}),W=new wS1({configService:J.configService,child:K}),H=new MS1({configService:J.configService,child:W}),z=new ZS1(H),U=new x6({data:WC.fromBaseTheme(_G.default()),child:z});try{await PC1(U,{onRootElementMounted:(L)=>{if(x.info("TUI input ready for user interaction"),Z)q.start(L)}})}finally{if(Z)q.stop();if(J.threadDependencies&&V){let{stopGlobalSession:L}=await Promise.resolve().then(() => (xC1(),a76));L()}}let O=X()?.thread.id||J.threadID,M=await J.threadService.get(O);if(M&&M.messages.length>0){let L=`${J.ampURL.replace(/\/$/,"")}/threads/${O}`;N36(M,L,J.stdout)}}function Fk1(J){return J==="smart"?M1.rgb(145,119,199):J==="rush"?M1.rgb(228,180,2):W5(J)?M1.rgb(0,184,255):J==="plan"?M1.rgb(153,102,255):$O8(J)}class a$6 extends Q6{props;constructor(J){super();this.props=J}createState(){return new r$6}}class r$6 extends J6{viewportHeight=1;scrollListenerAttached=!1;initState(){if(!this.scrollListenerAttached)this.widget.props.controller.addListener(()=>{this.updateViewportHeight()}),this.scrollListenerAttached=!0}build(J){let{todos:Q,controller:Y,appTheme:X}=this.widget.props;return new G4({crossAxisAlignment:"stretch",children:[new F4({child:new O7({controller:Y,autofocus:!1,child:new E_1({todos:Q})})}),new $X({controller:Y,thumbColor:X.app.scrollbarThumb,trackColor:X.app.scrollbarTrack,getScrollInfo:()=>{let{maxScrollExtent:G,offset:Z}=Y,q=this.viewportHeight,V=G+q;return{totalContentHeight:Math.max(V,0),viewportHeight:Math.max(q,1),scrollOffset:Math.max(Z,0)}}})]})}updateViewportHeight(){let J=this.getViewportHeight();if(J!==this.viewportHeight)this.viewportHeight=J}getViewportHeight(){let J=this.context.findRenderObject();if(!J)return this.viewportHeight;let Q=(X,G=0)=>{if(X&&"size"in X&&"children"in X){let Z=X.children||[];for(let q of Z){if(q&&"size"in q){let K=q.size;if(typeof K?.height==="number"&&K.height>0)return K.height}let V=Q(q,G+1);if(V>0)return V}}return 0},Y=Q(J);if(Y>0)return Y;if("size"in J){let X=J.size;if(typeof X?.height==="number"&&X.height>0)return X.height}return this.viewportHeight}}class o$6 extends T6{props;constructor(J){super();this.props=J}build(J){return new P8({child:new N0({height:1}),cursor:b9.NS_RESIZE,onDrag:(Q)=>{if(this.props.userHeight===void 0){let X=J.findRenderObject()?.size.height??0;if(X>0){this.props.onInitializeHeight(X);return}}this.props.onDrag(Q)},onRelease:this.props.onRelease})}}function $O8(J){let Q=0;for(let G=0;G<J.length;G++){let Z=J.charCodeAt(G);Q=(Q<<5)-Q+Z,Q=Q&Q}let Y=[9,10,11,12,13,14,15,208,209,210,211,212,213,214,215],X=Math.abs(Q)%Y.length;return M1.index(Y[X])}IC1();try{if(process.platform==="win32")await Promise.resolve().then(() => U6(mC(),1))}catch{}if(process.env.AMP_PWD)try{process.chdir(process.env.AMP_PWD),delete process.env.AMP_PWD}catch(J){mG.write(`Failed to change directory to ${process.env.AMP_PWD}: ${J}
|
|
5125
|
-
`)}var dy1=py1.join(Mz0||py1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function Tw8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function Tq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")hX("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")hX("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("tryOpus")==="cli"&&Q.tryOpus)hX("tryOpus",!0);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")hX("model.sonnet",Q.useSonnet)}async function ly1(J){try{await Ew8(py1.dirname(dy1),{recursive:!0}),await Iw8(dy1,J,"utf-8")}catch(Q){x.debug("Failed to save last thread ID",Q)}}async function Rw8(){try{return(await wq6(dy1,"utf-8")).trim()}catch(J){return null}}var Mq6=[{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)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??TG,description:`Custom settings file path (overrides the default location ${TG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(x).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${SR1})`},{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:m7(),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:"useSonnet",long:"use-sonnet",type:"flag",description:(J)=>J?"Use Claude Sonnet 4.5 instead of Gemini 3":"Use default model (Gemini 3)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"Try Claude Opus 4.5 in Amp's smart mode",hidden:!1},{name:"mode",long:"mode",short:"m",type:"option",default:HR.SMART.key,description:`Set the agent mode (${NG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:NG().map((J)=>J.mode)}],Lq6=(J)=>("deprecated"in J)&&J.deprecated===!0,Cw8=(J)=>("hidden"in J)&&J.hidden===!0,Sw8=(J)=>("default"in J),jw8=(J)=>("default"in J)?J.default:void 0;function _w8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new w8(PG.unknownCommand(Y),1,q)}}var Eq6=null;function Zz5(){return Eq6}function dg(J){return{...J,getThreadEnvironment:f61,vfs:xD0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new lh(J.fileSystem),generateThreadTitle:m16,deleteThread:(Q)=>J.threadService.delete(Q)}}var iy1=p0.file(Pw8.homedir()),Iq6=process.env.XDG_CONFIG_HOME?p0.file(process.env.XDG_CONFIG_HOME):t0.joinPath(iy1,".config");async function Rq(J,Q){tU0("0.0.
|
|
5121
|
+
`)}var dy1=py1.join(Mz0||py1.join(process.env.HOME||process.cwd(),".local","state"),"amp","last-thread-id");function Tw8(J){process.emitWarning=function(Q,Y,X,G){let Z=typeof Q==="string"?Q:Q.message||String(Q),q=Y||"Warning",V=!1;J.warn(Z,{name:q,code:X})}}function Tq(J,Q){if(J.getOptionValueSourceWithGlobals("dangerouslyAllowAll")==="cli")hX("dangerouslyAllowAll",Q.dangerouslyAllowAll);if(J.getOptionValueSourceWithGlobals("mode")==="cli")hX("experimental.agentMode",Q.mode);if(J.getOptionValueSourceWithGlobals("tryOpus")==="cli"&&Q.tryOpus)hX("tryOpus",!0);if(J.getOptionValueSourceWithGlobals("useSonnet")==="cli")hX("model.sonnet",Q.useSonnet)}async function ly1(J){try{await Ew8(py1.dirname(dy1),{recursive:!0}),await Iw8(dy1,J,"utf-8")}catch(Q){x.debug("Failed to save last thread ID",Q)}}async function Rw8(){try{return(await wq6(dy1,"utf-8")).trim()}catch(J){return null}}var Mq6=[{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)`,deprecated:!0},{name:"settingsFile",long:"settings-file",type:"option",default:process.env.AMP_SETTINGS_FILE??TG,description:`Custom settings file path (overrides the default location ${TG})`},{name:"logLevel",long:"log-level",type:"option",description:`Set log level (${Object.keys(x).join(", ")})`},{name:"logFile",long:"log-file",type:"option",description:`Set log file location (overrides the default location ${SR1})`},{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:m7(),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:"useSonnet",long:"use-sonnet",type:"flag",description:(J)=>J?"Use Claude Sonnet 4.5 instead of Gemini 3":"Use default model (Gemini 3)"},{name:"tryOpus",long:"try-opus",type:"switch",default:!1,description:"Try Claude Opus 4.5 in Amp's smart mode",hidden:!1},{name:"mode",long:"mode",short:"m",type:"option",default:HR.SMART.key,description:`Set the agent mode (${NG().map((J)=>J.mode).join(", ")}) — controls the model, system prompt, and tool selection`,choices:NG().map((J)=>J.mode)}],Lq6=(J)=>("deprecated"in J)&&J.deprecated===!0,Cw8=(J)=>("hidden"in J)&&J.hidden===!0,Sw8=(J)=>("default"in J),jw8=(J)=>("default"in J)?J.default:void 0;function _w8(J,Q){let Y=Q.args[0],X=Q.commands.map((Z)=>Z.name());if(Y&&!Y.includes(" ")&&Y.length<30&&!/[./\\]/.test(Y)){let Z=X.filter((V)=>Y.includes(V)||V.includes(Y)),q="Run amp --help for a list of available commands.";if(Z.length>0)q=`Did you mean: ${Z.join(", ")}? Or run amp --help for all commands.`;throw new w8(PG.unknownCommand(Y),1,q)}}var Eq6=null;function Zz5(){return Eq6}function dg(J){return{...J,getThreadEnvironment:f61,vfs:xD0({os:J.fileSystem},J.configService.config),fileChangeTrackerStorage:new lh(J.fileSystem),generateThreadTitle:m16,deleteThread:(Q)=>J.threadService.delete(Q)}}var iy1=p0.file(Pw8.homedir()),Iq6=process.env.XDG_CONFIG_HOME?p0.file(process.env.XDG_CONFIG_HOME):t0.joinPath(iy1,".config");async function Rq(J,Q){tU0("0.0.1764028904-g50ee11");let Y=oE1({storage:J.settings,secretStorage:J.secrets,workspaceRoots:J0.of([p0.file(process.cwd())]),defaultAmpURL:J.ampURL,homeDir:iy1,userConfigDir:Iq6}),{initializeCLITelemetry:X}=await Promise.resolve().then(() => (H91(),W91));X(Y);let G=await Y.getLatest();x.debug("Global configuration initialized",{settingsKeys:Object.keys(G.settings)});let Z=new zL({configService:Y}),q=new Map,V=()=>q.clear(),K=new IP1(Y,J.settings.getWorkspaceRootPath()),W=O16({configService:Y,trustStore:K,createOAuthProvider:async(t)=>{let r=q.get(t);if(r)return x.debug("Reusing existing OAuth provider for server",{serverName:t}),r;x.debug("Creating OAuth provider for server",{serverName:t});let m=(async()=>{let s=new SL(J.secrets),q1=await s.getClientInfo(t),H1=new VP1({storage:s,serverName:t,clientId:q1?.clientId,clientSecret:q1?.clientSecret,scopes:q1?.scopes});return x.debug("OAuth provider created",{serverName:t,hasManualClientId:!!q1?.clientId,willUseDCR:!q1?.clientId}),H1})();return q.set(t,m),m}}),H=o11({configService:Y,filesystem:H5,spawn:IL}),{initializeToolProviders:z}=await Promise.resolve().then(() => (Oq6(),Dq6)),{registrations:U,initErrors:B}=await z({toolServices:Z,providers:[W,H],initialTimeout:J.executeMode?15000:5000});for(let[t,r]of B)x.warn(`${t} provider initialization slow or failed:`,r);if(Q.jetbrains)JI("JetBrains");else if(Q.ide&&o56())JI("VS Code");else if(Q.ide&&s56())JI("Neovim");if(J.executeMode)eU0(!0);let O,M=F7.status.pipe(o0((t)=>Boolean(t.connected&&t.authenticated)),P4()).subscribe((t)=>{if(t){if(!O)O=Z.registerTool(OT)}else O?.dispose(),O=void 0}),L;if(!J.executeMode)L=new n61(process.cwd(),{},!0);else L=new class extends n61{async start(){}async query(){return[]}getStats(){return{state:"unstarted",stats:[]}}dispose(){}};if(!await J.secrets.get("apiKey",J.ampURL)){if(d5.write(`No API key found. Starting login flow...
|
|
5126
5122
|
`),!await kw8(J))await dL(),process.exit(1)}let E=await y16({isDevelopment:!1}),I=new jP1(E,Y),P=new RP1(E,{lazy:!0}),R=new PP1(I,(t,r)=>{let m=K3.get(t);if(m)m.handle(r).catch((s)=>{x.error("Failed to apply artifact delta",s)})}),j=Q.notifications!==void 0?Q.notifications:!J.executeMode,y=a16({playNotificationSound:async(t)=>{if(j){n16(t);let r=wC1(),m=EC1();if((!r||m)&&G.settings["notifications.system.enabled"]!==!1){if(t==="idle")process.stdout.write("\x1B]777;notify;Amp;Agent is ready\x1B\\");else if(t==="requires-user-input")process.stdout.write("\x1B]777;notify;Amp;Waiting for approval\x1B\\")}}},windowFocused:()=>Promise.resolve(!1),threadService:I,configService:Y});x.info("Starting Amp background services");let h=d16({threadService:I,threadHistoryService:P,configService:Y,isExtensionDevelopment:!1}),g;F7.status.subscribe((t)=>{g=t});let p=new eX1({workspaceRoots:[p0.file(process.cwd())],getCurrentFile:()=>{if(!g?.openFile)return;try{return p0.parse(g.openFile)}catch(t){x.warn("Failed to parse current file URI",{uri:g.openFile,error:t});return}},getOpenFiles:()=>{if(!g?.visibleFiles?.length)return[];let t=g.openFile;return g.visibleFiles.filter((r)=>r!==t).map((r)=>{try{return p0.parse(r)}catch(m){return x.warn("Failed to parse visible file URI",{uri:r,error:m}),null}}).filter((r)=>r!==null)}}),b=new TC1,i={codebaseContextService:p,configService:Y,toolServices:Z,mcpService:W,trustStore:K,threadService:I,threadHistoryService:P,threadSyncService:h,planFileManager:R,threadStorage:E,secretStorage:J.secrets,settingsStorage:J.settings,fuzzyServer:L,notificationService:y,fileSystem:Q.jetbrains||Q.ide?R16:H5,terminal:b};return{...i,async asyncDispose(){for(let t of U.values())t.dispose();await i.mcpService.dispose(),V(),await i.threadService.asyncDispose(),i.configService.unsubscribe(),i.toolServices.dispose(),i.fuzzyServer.dispose(),i.threadSyncService.dispose(),i.settingsStorage[Symbol.dispose](),M.unsubscribe(),O?.dispose()}}}async function kw8(J){if(!J.executeMode){if(!await JC1("Would you like to log in to Amp? [(y)es, (n)o]: "))return d5.write(`Login cancelled. Run the command again to retry.
|
|
5127
5123
|
`),!1}return await Pq6(J)}async function Pq6(J){let Q=ww8(32).toString("hex"),Y=await eR1(J.ampURL,Q),X=new AbortController;try{await lJ(Y,X.signal)}catch(Z){x.error("Error opening browser",{error:Z})}let G=await eR1(J.ampURL,Q,!1);d5.write(`If your browser does not open automatically, visit:
|
|
5128
5124
|
|
|
@@ -5132,15 +5128,15 @@ ${S4.blue.bold(G)}
|
|
|
5132
5128
|
Login successful! You can now use the Amp CLI.
|
|
5133
5129
|
`),!0}catch(Z){return x.error("Login failed",{error:Z}),mG.write(`
|
|
5134
5130
|
Login failed: ${Z instanceof Error?Z.message:String(Z)}
|
|
5135
|
-
`),!1}}function yw8(){let J=new _L().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)dR(),process.exit(0);let z=H.originalError??H;c96(z)}),J.option("-V, --version","Print the version number and exit",()=>{d5.write(`0.0.
|
|
5131
|
+
`),!1}}function yw8(){let J=new _L().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)dR(),process.exit(0);let z=H.originalError??H;c96(z)}),J.option("-V, --version","Print the version number and exit",()=>{d5.write(`0.0.1764028904-g50ee11 (released 2025-11-25T00:07:01.844Z)
|
|
5136
5132
|
`),process.exit(0)}),J.addHelpText("after",n56()),J.configureHelp({formatHelp:a56}),J.command("logout").description("Log out by removing stored API key").action(async(H,z)=>{let U=z.optsWithGlobals(),B=await rQ(U);await hw8(B)}),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,z)=>{let U=z.optsWithGlobals(),B=await rQ(U);await fw8(B,await pR1(U,B.settings))});let Q=async(H,z,U)=>{oE1({storage:z.settings,secretStorage:z.secrets,workspaceRoots:J0.of([p0.file(process.cwd())]),defaultAmpURL:z.ampURL,homeDir:iy1,userConfigDir:Iq6});let B={...z,executeMode:!1};await cy1(B,{...H,openThreadSwitcher:!0},U)},Y=J.command("threads").alias("t").alias("thread").summary("Manage threads").description("Thread management commands. When no subcommand is provided, defaults to listing threads.").action(async(H,z)=>{let U=z.optsWithGlobals(),B=await rQ(U);await Aq6(U,B,z)});Y.command("new").alias("n").summary("Create a new thread").description("Create a new thread and print its ID. The thread will be empty. You can set the visibility using the --visibility option.").option("--visibility <visibility>","Set thread visibility (private, public, workspace, group)").action(async(H,z)=>{let U=z.optsWithGlobals(),B=await rQ(U);await cw8(U,B,z)}),Y.command("continue [threadId]").alias("c").summary("Continue an existing thread").description("Continue an existing thread by resuming the conversation. By default, shows an interactive picker with the most recently used thread at the top. Use --last to continue the last thread directly without the picker.").option("--last","Continue the last thread directly without showing the picker").option("--pick","Pick a thread interactively from a list (DEPRECATED: picker is now the default)").action(async(H,z,U)=>{let B=U.optsWithGlobals(),O=await rQ(B);if(z.pick)mG.write(`${S4.yellow("Warning:")} The --pick flag is deprecated. The picker is now shown by default.
|
|
5137
5133
|
`);if(z.last||H||O.executeMode)await dw8(B,O,H,U);else await Q(B,O,U)}),Y.command("fork [threadId]").alias("f").summary("Fork an existing thread").description("Create a new thread by forking an existing one. This copies the conversation history up to the current point and creates a new thread where you can explore different directions. If no thread ID is provided, the most recently used thread will be forked.").action(async(H,z,U)=>{let B=U.optsWithGlobals(),O=await rQ(B);await pw8(B,O,H,U)}),Y.command("list").alias("l").alias("ls").summary("List all threads").description("List all your threads with their IDs, names, and last modified times.").action(async(H,z)=>{let U=z.optsWithGlobals(),B=await rQ(U);await Aq6(U,B,z)}),Y.command("share <threadId>").summary("Share a thread").description("Change thread visibility (private, public, unlisted, workspace, group) or share with Amp support for debugging. Use --visibility to change who can access the thread, or --support to share with the Amp team for troubleshooting.").alias("s").option("--visibility <visibility>","Set thread visibility (private, public, unlisted, workspace, group)").option("--support [message]","Share thread with Amp support for debugging").action(async(H,z,U)=>{let B=U.optsWithGlobals(),O=await rQ(B);await mw8(B,O,H,U,z.support)}),Y.command("rename <threadId> <newName>").alias("r").summary("Rename a thread").description('Change the title of a thread. Quote names with spaces: amp threads rename T-123 "New thread name"').action(async(H,z,U,B)=>{let O=B.optsWithGlobals(),M=await rQ(O);await bw8(O,M,H,z,B)}),Y.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,z,U)=>{let B=U.optsWithGlobals(),O=await rQ(B);await uw8(B,O,H,U)}),Y.command("replay <threadId>").alias("p").summary("Replay a thread").description("Replay a thread by downloading it and playing through all interactions. User messages are simulated with variable typing speed.").option("--wpm <wpm>","Typing speed in words per minute (default: 120)","120").option("--no-typing","Disable typing simulation and display messages instantly").option("--message-delay <ms>","Delay between messages in milliseconds (default: 1000)","1000").option("--tool-progress-delay <ms>","Delay to show tool in-progress state in milliseconds (default: 800)","800").option("--exit-delay <seconds>","Delay in seconds before exiting after replay completes (default: 3)","3").option("--no-indicator","Hide the replay progress indicator").action(async(H,z,U)=>{let B=U.optsWithGlobals(),O=await rQ(B);await gw8(B,O,H,z,U)}),d76(J,async(H,z)=>{let U=await rQ(z);Tq(H,z);let B=await Rq(U,z);return{context:U,mcpService:B.mcpService,toolService:B.toolServices,toolServices:B.toolServices,configService:B.configService,cleanupTerminal:dR,asyncDispose:B.asyncDispose.bind(B)}}),_26(J,async(H)=>{let z=H.optsWithGlobals();return await rQ(z)}),A26(J,async(H)=>{let z=await rQ(H);return{settings:z.settings,secretStorage:z.secrets,getThreadDeps:async(U)=>{Tq(U,H);let B=await Rq(z,H);return{mcpService:B.mcpService,settings:z.settings,asyncDispose:B.asyncDispose.bind(B)}}}});function G(H,z,U){let O=typeof H.description==="string"?H.description:U===void 0?H.description(!0):H.description(U),M=new vB(z,O),L=jw8(H);if(L)M.default(L);if(M.hidden=Cw8(H)||Lq6(H),"choices"in H)M.choices([...H.choices]);return M}for(let H of Mq6)switch(H.type){case"flag":{J.addOption(G(H,`--${H.long}`)),J.addOption(G(H,`--no-${H.long}`,!1));break}case"switch":{J.addOption(G(H,`--${H.long}`,!0));break}default:{J.addOption(G(H,`${"short"in H?`-${H.short}, `:""}--${H.long} <value>`));break}}let Z=new vB("-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(Z);let q=new vB("-r, --remote","When used with -x/--execute, execute in an async agent on the Amp server.").default(!1).hideHelp();J.addOption(q);let V=new vB("--stream-json","When used with --execute, output in Claude Code-compatible stream JSON format instead of plain text.").default(!1);J.addOption(V);let K=new vB("--stream-json-input","Read JSON Lines user messages from stdin. Requires both --execute and --stream-json.").default(!1);J.addOption(K);let W=new vB("--stats","When used with --execute, output JSON with both result and token usage data (for /evals).").default(!1).hideHelp(!0);if(J.addOption(W),process.env.AMP_CONNECT==="1"){let H=new vB("--client-id <clientId>","Override the client ID for connect functionality (default: amp-<pid>@<hostname>)");J.addOption(H)}return J.action(async(H,z)=>{let U=H,B=await rQ(U);if(Object.keys(U).forEach((O)=>{let M=Mq6.find((L)=>L.name===O);if(M&&Lq6(M)&&!Sw8(M))mG.write(S4.yellow(`Warning: '--${O}' flag is deprecated
|
|
5138
5134
|
`))}),z.args.length>0)_w8(B,z);await cy1(B,U,z)}),F26(J),J}async function e91(J,Q){let{thread:Y,visibility:X}=Q,G=Y?.id??EZ(),Z=dg(J);if(Y)await J.threadStorage.set(G,Y);let q=await K3.getOrCreateForThread(Z,G),V=await J.threadStorage.get(G);if(Q.agentMode&&!V?.agentMode&&PZ(q.thread)===0)await q.handle({type:"agent-mode",mode:Q.agentMode});if(X)await J.threadSyncService.updateThreadMeta(G,G41(X));let K=J.threadService.observe(G).subscribe(async(W)=>{if(QJ(W,"assistant"))await ly1(G),K.unsubscribe()});return await q.resume(),q}async function cy1(J,Q,Y){let X=X41(Q);if(X instanceof Error)gG(X.message);let G,Z=null;if(Q.streamJsonInput)G="";else if(typeof Q.execute==="string"){G=Q.execute;let i=(await QC1()).trimEnd();if(i)Z=i}else G=(await QC1()).trimEnd();if(Q.remote&&!J.executeMode)throw new w8("The -r/--remote flag currently only works with --execute mode",1,'Use: amp --remote --execute "your message"');if(Q.streamJson&&!J.executeMode)throw new w8("The --stream-json flag requires --execute mode",1,'Use: amp --execute "your message" --stream-json');if(Q.streamJsonInput&&!J.executeMode)throw new w8("The --stream-json-input flag requires --execute mode",1,"Use: amp --execute --stream-json --stream-json-input");if(Q.streamJsonInput&&!Q.streamJson)throw new w8("The --stream-json-input flag requires --stream-json",1,"Use: amp --execute --stream-json --stream-json-input");if((J.executeMode||Q.streamJson)&&W5(Q.mode))throw new w8(`Execute mode is not permitted with --mode '${Q.mode}'`,1);if(Q.stats&&!J.executeMode)throw new w8("The --stats flag requires --execute mode",1,'Use: amp --execute "your message" --stats');if(Q.streamJsonInput&&typeof Q.execute==="string"&&Q.execute.trim()!=="")throw new w8("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(J.executeMode&&G===""&&!Q.streamJsonInput)throw new w8("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"
|
|
5139
5135
|
Or pipe via stdin: echo "your message" | amp --execute`);Tq(Y,Q);let q=await Rq(J,Q);Eq6=q;let V=dg(q),K=async(i)=>{let t=await wq6(i,"utf-8"),r=JSON.parse(t);if(!IZ(r.id))throw new w8(PG.invalidThreadId);return e91(q,{visibility:X,agentMode:Q.mode,thread:r})},W=async(i)=>{if(!IZ(i))throw new w8(PG.invalidThreadId);try{let[r,m]=await Promise.all([M5.getThreadLinkInfo({thread:i},{config:q.configService}),M5.getUserInfo({},{config:q.configService})]);if(r.ok&&m.ok){let s=r.result.creatorUserID,q1=m.result.id;if(s&&s!==q1&&!process.env.AMP_RESUME_OTHER_USER_THREADS_INSECURE)throw new w8(`Cannot resume thread created by another user.
|
|
5140
5136
|
|
|
5141
5137
|
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.`)}}catch(r){if(r instanceof w8)throw r;x.warn("Failed to validate thread ownership in CLI, allowing to open",{error:r})}let t=await q.threadService.get(i)??void 0;return x.info(`[fetchAndStartThread] Loaded thread ${i}, agentMode: ${t?.agentMode??"undefined"}`),e91(q,{visibility:X,agentMode:t?void 0:Q.mode,thread:t})},H=async()=>{try{if(Q.threadId)return W(Q.threadId);else return e91(q,{visibility:X})}catch(i){if(i instanceof w8)throw i;throw await Bu(i,Q.threadId),Error("handleError should have called process.exit()")}},z=async()=>{return e91(q,{visibility:X})};if(Q.format==="jsonl")mG.write(`jsonl format is deprecated. Version "0.0.1752148945-gd8844f" or earlier is required to use jsonl format.
|
|
5142
|
-
`),await dL(),process.exit(1);if(J.executeMode&&Q.remote)await k26(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)I26(q.mcpService,J.settings),await G56(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let B=!1,O=!1;if(Q.jetbrains||Q.ide){await qh0();let i=DT({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)O=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let t=i[0];if(t)F7.selectConfig(t)}else B=!0}let M=Y41("0.0.
|
|
5143
|
-
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await _56({...J,workspaceTrust:{current:!0,changes:g_},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await w26(J.mcpConfig);X=E26(X,Z)}let G=await X.get("url","global");if(!G)G=KY;if(!PF(G))x.info("Targeting custom Amp server",{ampURL:G});return X=OF0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:y26(await pR1(J,X))}}function vw8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function xw8(){let J=vw8(process.argv);if(x96({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),Tw8(x),x.info("Starting Amp CLI.",{version:"0.0.
|
|
5138
|
+
`),await dL(),process.exit(1);if(J.executeMode&&Q.remote)await k26(G,Z,q.configService),await q.asyncDispose(),process.exit(0);let U=await H();if(J.executeMode)I26(q.mcpService,J.settings),await G56(U,U.threadID,G,Z,q,!!Q.streamJson,!!Q.streamJsonInput,!!Q.stats,J.ampURL),await q.asyncDispose(),process.exit(0);let B=!1,O=!1;if(Q.jetbrains||Q.ide){await qh0();let i=DT({jetbrainsOnly:Q.jetbrains});if(i.length===0){if(Q.jetbrains)O=!await q.configService.get("jetbrains.skipInstall")}else if(i.length===1){let t=i[0];if(t)F7.selectConfig(t)}else B=!0}let M=Y41("0.0.1764028904-g50ee11",q.settingsStorage),L=new $61(q.threadStorage),E=J0.of([p0.file(process.cwd())]),I=HG1(void 0,E),P=new $41(q.mcpService,J.settings.getWorkspaceRootPath());if(G)U.handle({type:"user:message",message:{content:[{type:"text",text:G}]}});let R=(async()=>{try{let i=await M5.getUserFreeTierStatus({},{config:q.configService,signal:AbortSignal.timeout(5000)});if(i.ok)return x.info("User free tier status:",i),i.result}catch(i){x.error("Failed to fetch free tier status:",i)}})(),j=(async()=>{try{let i=await M5.getUserInfo({},{config:q.configService});if(i.ok)return i.result}catch(i){x.debug("Failed to fetch user workspace info:",i)}})(),[y,h]=await Promise.all([R,j]),g=h?.email,p=g&&(g.endsWith("@sourcegraph.com")||g.endsWith("@ampcode.com")||g==="auth-bypass-user@example.com");if(p)q.toolServices.registerTool(i16);let b=await f26();x.info("Loaded session state:",b),await Uk1({codebaseContextService:q.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:q.fuzzyServer,settingsStorage:q.settingsStorage,threadService:q.threadService,threadHistoryService:q.threadHistoryService,threadSyncService:q.threadSyncService,planFileManager:q.planFileManager,threadID:U.threadID,threadFuzzyIndexer:L,worker:U,workerDeps:V,configService:q.configService,internalAPIClient:M5,ampURL:J.ampURL,startNewThread:z,switchToThread:W,ideClient:F7,connectedClientsService:new Y01,commandRegistry:I,mcpService:q.mcpService,mcpTrustHandler:P,showJetBrainsInstaller:O,showIdePicker:B,openThreadSwitcher:Q.openThreadSwitcher,updateService:M,inspector:Q.inspector,inspectorPort:Q.inspectorPort,jetbrainsMode:Q.jetbrains,clientId:Q.clientId,sessionState:b,freeTierStatus:y,workspace:h?.team??null,features:h?.features??[],isDogfooding:p||!1,threadDependencies:q}),await q.asyncDispose(),process.exit(0)}async function rQ(J){if(J.interactive)mG.write(`Warning: --interactive flag is deprecated. Interactive mode is now the default unless --execute is used or output is redirected.
|
|
5139
|
+
`);let Q=!!J.execute||!process.stdout.isTTY&&!J.streamJson,Y=process.stdout.isTTY&&process.stderr.isTTY,X=await _56({...J,workspaceTrust:{current:!0,changes:g_},getHook:process.env.AMP_URL?(Z,q)=>{if(Z==="url")return Promise.resolve(process.env.AMP_URL);return q()}:void 0});if(J.mcpConfig){let Z=await w26(J.mcpConfig);X=E26(X,Z)}let G=await X.get("url","global");if(!G)G=KY;if(!PF(G))x.info("Targeting custom Amp server",{ampURL:G});return X=OF0(X),{executeMode:Q,isTTY:Y,ampURL:G,settings:X,secrets:y26(await pR1(J,X))}}function vw8(J){let Q={};for(let Y=0;Y<J.length;Y++){let X=J[Y];if(X?.startsWith("--")){let Z=X.slice(2).replace(/-([a-z])/g,(V,K)=>K.toUpperCase()),q=J[Y+1];if(q&&!q.startsWith("--"))Q[Z]=q,Y++}}return Q}async function xw8(){let J=vw8(process.argv);if(x96({logLevel:J.logLevel||process.env.AMP_LOG_LEVEL,logFile:J.logFile||process.env.AMP_LOG_FILE}),Tw8(x),x.info("Starting Amp CLI.",{version:"0.0.1764028904-g50ee11",buildTimestamp:"2025-11-25T00:07:01.844Z"}),parseInt(process.version.slice(1).split(".")[0]??"")<20)throw new w8(PG.nodeVersion(process.version),1,"Please upgrade your Node.js installation from https://nodejs.org");await yw8().parseAsync(process.argv)}Iw1().startActiveSpan("main",async(J)=>{process.on("exit",()=>J.end()),await xw8().catch(Bu)});async function fw8(J,Q){if(process.env.AMP_URL)await J.settings.set("url",process.env.AMP_URL,"global"),d5.write(`Saving custom server URL to settings: ${process.env.AMP_URL}
|
|
5144
5140
|
`);else if(!PF(J.ampURL))d5.write(`Logging in to ${new URL(J.ampURL).hostname}
|
|
5145
5141
|
`);let Y=process.env.AMP_API_KEY;if(Y)d5.write(`API key found in environment variable, storing...
|
|
5146
5142
|
`),await Q.set("apiKey",Y,J.ampURL),d5.write(`API key successfully stored.
|
|
@@ -5153,7 +5149,7 @@ This thread belongs to a different user and cannot be continued for security rea
|
|
|
5153
5149
|
`);else d5.write(`Successfully logged out from ${new URL(J.ampURL).hostname}.
|
|
5154
5150
|
`);process.exit(0)}async function bw8(J,Q,Y,X,G){Tq(G,J);let Z=await Rq(Q,J);try{let q=J51(Y);if(!q)Q51(Y);let V=q,K=X.trim();if(K.length===0)gG("Thread name cannot be empty");if(K.length>256)gG("Thread name cannot exceed 256 characters");if(!(await pC(V,Z)).messages.length)gG("Cannot rename an empty thread.");let H=dg(Z);await(await K3.getOrCreateForThread(H,V)).handle({type:"title",value:K}),x.info("GOT HERE"),await Z.threadSyncService.sync(),x.info("GOT THERE"),d5.write(S4.green(`✓ Thread ${V} renamed to "${K}"
|
|
5155
5151
|
`)),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose();let V=`Failed to rename thread: ${q instanceof Error?q.message:String(q)}`;gG(V)}}async function uw8(J,Q,Y,X){Tq(X,J);let G=await Rq(Q,J);try{let Z=J51(Y);if(!Z)Q51(Y);let V=await pC(Z,G),K=pT(V);d5.write(K+`
|
|
5156
|
-
`),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;gG(q)}}async function gw8(J,Q,Y,X,G){Tq(G,J);let Z=await Rq(Q,J);try{let q=await ny1(Y),V=await pC(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,B=X.indicator!==!1,O=dg(Z),M=V.id;await Z.threadStorage.set(M,V);let L=await K3.getOrCreateForThread(O,M);await L.resume();let E=Y61.fromWorker(L),I=new $61(Z.threadStorage),P=J0.of([p0.file(process.cwd())]),R=HG1(void 0,P),j=new $41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=Y41("0.0.
|
|
5152
|
+
`),await G.asyncDispose(),process.exit(0)}catch(Z){await G.asyncDispose();let q=`Failed to render thread as markdown: ${Z instanceof Error?Z.message:String(Z)}`;gG(q)}}async function gw8(J,Q,Y,X,G){Tq(G,J);let Z=await Rq(Q,J);try{let q=await ny1(Y),V=await pC(q,Z),K=X.typing!==!1,W=parseInt(X.wpm||"120",10),H=parseInt(X.messageDelay||"1000",10),z=parseInt(X.toolProgressDelay||"800",10),U=parseInt(X.exitDelay||"3",10)*1000,B=X.indicator!==!1,O=dg(Z),M=V.id;await Z.threadStorage.set(M,V);let L=await K3.getOrCreateForThread(O,M);await L.resume();let E=Y61.fromWorker(L),I=new $61(Z.threadStorage),P=J0.of([p0.file(process.cwd())]),R=HG1(void 0,P),j=new $41(Z.mcpService,Q.settings.getWorkspaceRootPath()),y=Y41("0.0.1764028904-g50ee11",Z.settingsStorage);await Uk1({codebaseContextService:Z.codebaseContextService,stdout:process.stdout,history:new g61,fuzzyServer:Z.fuzzyServer,settingsStorage:Z.settingsStorage,threadService:Z.threadService,threadHistoryService:Z.threadHistoryService,threadSyncService:Z.threadSyncService,planFileManager:Z.planFileManager,threadID:M,threadFuzzyIndexer:I,worker:E,workerDeps:O,configService:Z.configService,internalAPIClient:M5,ampURL:Q.ampURL,startNewThread:async()=>E,switchToThread:async()=>E,ideClient:F7,connectedClientsService:new Y01,commandRegistry:R,mcpService:Z.mcpService,mcpTrustHandler:j,showJetBrainsInstaller:!1,updateService:y,isDogfooding:!1,replayMode:{thread:V,typingEnabled:K,baseWpm:W,messageDelayMs:H,toolProgressDelayMs:z,exitDelayMs:U,showIndicator:B}}),await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),await Bu(q,Y)}}async function mw8(J,Q,Y,X,G){Tq(X,J);let Z=await Rq(Q,J);try{let q=J51(Y);if(!q)Q51(Y);let V=q,K=await M5.getUserInfo({},{config:Z.configService}),W=K.ok?K.result:null,H=X41(J,W);if(!H&&!G)gG("Must specify either --visibility or --support");if(H&&G)gG("Cannot specify both --visibility and --support at the same time");if(H instanceof Error)gG(H.message);if(H)await Z.threadSyncService.updateThreadMeta(V,G41(H)),d5.write(S4.green("✓ ")+`Thread ${V} visibility changed to ${H}.
|
|
5157
5153
|
`);if(G){await pC(V,Z);let z=typeof G==="string"?G:void 0;await Gv0(Z.threadService,V,Z.configService,z),d5.write(S4.green("✓ ")+`Thread ${V} has been shared with Amp support. These thread reports will be aggregated and analysed.
|
|
5158
5154
|
`)}await Z.asyncDispose(),process.exit(0)}catch(q){await Z.asyncDispose(),gG(`Failed to update thread: ${q instanceof Error?q.message:String(q)}`)}}async function pw8(J,Q,Y,X){Tq(X,J);let G=await Rq(Q,J),Z=dg(G);try{let q=await ny1(Y),K=(await pC(q,G)).messages.length-1,W=await K3.getOrCreateForThread(Z,q),H=await SR(W,G.threadSyncService,K);await Promise.all([G.threadSyncService.uploadThread(q),G.threadSyncService.uploadThread(H)]),await ly1(H),d5.write(`${H}
|
|
5159
5155
|
`),await G.asyncDispose(),process.exit(0)}catch(q){mG.write(`Error forking thread: ${q instanceof Error?q.message:String(q)}
|