makecoder 2.0.91 → 2.0.93

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/coder.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var st=Object.create;var le=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var rt=Object.getPrototypeOf,it=Object.prototype.hasOwnProperty;var m=(h,e)=>()=>(e||h((e={exports:{}}).exports,e),e.exports);var at=(h,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of nt(e))!it.call(h,o)&&o!==t&&le(h,o,{get:()=>e[o],enumerable:!(s=ot(e,o))||s.enumerable});return h};var ct=(h,e,t)=>(t=h!=null?st(rt(h)):{},at(e||!h||!h.__esModule?le(t,"default",{value:h,enumerable:!0}):t,h));var de=m((es,ue)=>{var lt=require("http"),V=class{constructor(e={}){this.port=e.port||9380,this.timeout=e.timeout||300*1e3,this.server=null,this.timeoutId=null}validateTokenFormat(e){if(!e||typeof e!="string")return!1;let t=e.split(".");if(t.length!==2)return!1;let[s,o]=t;return s&&s.length>0&&o&&o.length>0}async waitForCallback(e){return new Promise((t,s)=>{let o=!1;this.server=lt.createServer((n,r)=>{let i=new URL(n.url,`http://localhost:${this.port}`);if(i.pathname==="/callback"){let a=i.searchParams.get("token"),c=i.searchParams.get("state"),l=i.searchParams.get("error");if(l){r.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),r.end(`
2
+ var it=Object.create;var de=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,ut=Object.prototype.hasOwnProperty;var m=(h,e)=>()=>(e||h((e={exports:{}}).exports,e),e.exports);var dt=(h,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ct(e))!ut.call(h,o)&&o!==t&&de(h,o,{get:()=>e[o],enumerable:!(s=at(e,o))||s.enumerable});return h};var ht=(h,e,t)=>(t=h!=null?it(lt(h)):{},dt(e||!h||!h.__esModule?de(t,"default",{value:h,enumerable:!0}):t,h));var ge=m((rs,he)=>{var gt=require("http"),z=class{constructor(e={}){this.port=e.port||9380,this.timeout=e.timeout||300*1e3,this.server=null,this.timeoutId=null}validateTokenFormat(e){if(!e||typeof e!="string")return!1;let t=e.split(".");if(t.length!==2)return!1;let[s,o]=t;return s&&s.length>0&&o&&o.length>0}async waitForCallback(e){return new Promise((t,s)=>{let o=!1;this.server=gt.createServer((r,n)=>{let i=new URL(r.url,`http://localhost:${this.port}`);if(i.pathname==="/callback"){let a=i.searchParams.get("token"),c=i.searchParams.get("state"),l=i.searchParams.get("error");if(l){n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
3
3
  <!DOCTYPE html>
4
4
  <html>
5
5
  <head>
@@ -24,7 +24,7 @@ var st=Object.create;var le=Object.defineProperty;var ot=Object.getOwnPropertyDe
24
24
  </div>
25
25
  </body>
26
26
  </html>
27
- `),o||(o=!0,this.cleanup(),s(new Error(`OAuth error: ${l}`)));return}if(c!==e){r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end(`
27
+ `),o||(o=!0,this.cleanup(),s(new Error(`OAuth error: ${l}`)));return}if(c!==e){n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
28
28
  <!DOCTYPE html>
29
29
  <html>
30
30
  <head>
@@ -46,7 +46,7 @@ var st=Object.create;var le=Object.defineProperty;var ot=Object.getOwnPropertyDe
46
46
  </div>
47
47
  </body>
48
48
  </html>
49
- `),o||(o=!0,this.cleanup(),s(new Error("Invalid state parameter - possible CSRF attack")));return}if(!a){r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end(`
49
+ `),o||(o=!0,this.cleanup(),s(new Error("Invalid state parameter - possible CSRF attack")));return}if(!a){n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
50
50
  <!DOCTYPE html>
51
51
  <html>
52
52
  <head>
@@ -68,7 +68,7 @@ var st=Object.create;var le=Object.defineProperty;var ot=Object.getOwnPropertyDe
68
68
  </div>
69
69
  </body>
70
70
  </html>
71
- `),o||(o=!0,this.cleanup(),s(new Error("No token received from OAuth callback")));return}if(!this.validateTokenFormat(a)){r.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),r.end(`
71
+ `),o||(o=!0,this.cleanup(),s(new Error("No token received from OAuth callback")));return}if(!this.validateTokenFormat(a)){n.writeHead(400,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
72
72
  <!DOCTYPE html>
73
73
  <html>
74
74
  <head>
@@ -92,7 +92,7 @@ var st=Object.create;var le=Object.defineProperty;var ot=Object.getOwnPropertyDe
92
92
  </div>
93
93
  </body>
94
94
  </html>
95
- `),o||(o=!0,this.cleanup(),s(new Error("Invalid token format - expected ak.sk format")));return}let[u,d]=a.split(".");r.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),r.end(`
95
+ `),o||(o=!0,this.cleanup(),s(new Error("Invalid token format - expected ak.sk format")));return}let[u,d]=a.split(".");n.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),n.end(`
96
96
  <!DOCTYPE html>
97
97
  <html>
98
98
  <head>
@@ -124,99 +124,96 @@ var st=Object.create;var le=Object.defineProperty;var ot=Object.getOwnPropertyDe
124
124
  </script>
125
125
  </body>
126
126
  </html>
127
- `),o||(o=!0,this.cleanup(),t({ak:u,sk:d}))}else r.writeHead(404,{"Content-Type":"text/plain"}),r.end("Not Found")}),this.server.on("error",n=>{if(n.code==="EADDRINUSE"){if(this.port++,this.port>9390){o||(o=!0,s(new Error("Could not find available port for OAuth callback server")));return}this.server.close(),this.server.listen(this.port)}else o||(o=!0,this.cleanup(),s(n))}),this.server.listen(this.port,()=>{process.env.CODEV_DEBUG&&console.log(`OAuth callback server listening on port ${this.port}`)}),this.timeoutId=setTimeout(()=>{o||(o=!0,this.cleanup(),s(new Error("OAuth login timeout - no response received within 5 minutes")))},this.timeout)})}getCallbackUrl(){return`http://localhost:${this.port}/callback`}cleanup(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.server&&(this.server.close(),this.server=null)}};ue.exports=V});var ge=m((ts,he)=>{var ut=require("crypto"),dt=de(),K=class{constructor(e={}){this.baseUrl=e.baseUrl||"https://makecoder.com",this.callbackServer=null}generateState(){return ut.randomBytes(16).toString("hex")}buildAuthorizationUrl(e,t){let s=new URLSearchParams({redirect_uri:e,state:t,response_type:"token"});return`${this.baseUrl}/oauth/authorize?${s.toString()}`}async login(){let e=this.generateState();this.callbackServer=new dt;try{let t=this.callbackServer.getCallbackUrl(),s=this.buildAuthorizationUrl(t,e);console.log(`
127
+ `),o||(o=!0,this.cleanup(),t({ak:u,sk:d}))}else n.writeHead(404,{"Content-Type":"text/plain"}),n.end("Not Found")}),this.server.on("error",r=>{if(r.code==="EADDRINUSE"){if(this.port++,this.port>9390){o||(o=!0,s(new Error("Could not find available port for OAuth callback server")));return}this.server.close(),this.server.listen(this.port)}else o||(o=!0,this.cleanup(),s(r))}),this.server.listen(this.port,()=>{process.env.CODEV_DEBUG&&console.log(`OAuth callback server listening on port ${this.port}`)}),this.timeoutId=setTimeout(()=>{o||(o=!0,this.cleanup(),s(new Error("OAuth login timeout - no response received within 5 minutes")))},this.timeout)})}getCallbackUrl(){return`http://localhost:${this.port}/callback`}cleanup(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.server&&(this.server.close(),this.server=null)}};he.exports=z});var fe=m((is,pe)=>{var pt=require("crypto"),ft=ge(),W=class{constructor(e={}){this.baseUrl=e.baseUrl||"https://makecoder.com",this.callbackServer=null}generateState(){return pt.randomBytes(16).toString("hex")}buildAuthorizationUrl(e,t){let s=new URLSearchParams({redirect_uri:e,state:t,response_type:"token"});return`${this.baseUrl}/oauth/authorize?${s.toString()}`}async login(){let e=this.generateState();this.callbackServer=new ft;try{let t=this.callbackServer.getCallbackUrl(),s=this.buildAuthorizationUrl(t,e);console.log(`
128
128
  \u{1F510} \u5F00\u59CB OAuth \u767B\u5F55\u6D41\u7A0B...
129
129
  `),console.log(`\u{1F4CB} \u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u5B8C\u6210\u767B\u5F55
130
130
  `),console.log(`\u{1F310} \u6388\u6743\u5730\u5740: ${s}
131
131
  `),console.log(`\u23F3 \u7B49\u5F85\u60A8\u7684\u6388\u6743...(\u8D85\u65F6\u65F6\u95F4: 5\u5206\u949F)
132
- `);try{let n=(await import("open")).default;await n(s)}catch(n){console.warn("\u26A0\uFE0F \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668,\u8BF7\u624B\u52A8\u590D\u5236\u4E0A\u8FF0\u94FE\u63A5\u5230\u6D4F\u89C8\u5668\u6253\u5F00"),process.env.CODEV_DEBUG&&console.error("Browser open error:",n)}let o=await this.callbackServer.waitForCallback(e);return console.log(`\u2705 API Key \u83B7\u53D6\u6210\u529F!
132
+ `);try{let r=(await import("open")).default;await r(s)}catch(r){console.warn("\u26A0\uFE0F \u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668,\u8BF7\u624B\u52A8\u590D\u5236\u4E0A\u8FF0\u94FE\u63A5\u5230\u6D4F\u89C8\u5668\u6253\u5F00"),process.env.CODEV_DEBUG&&console.error("Browser open error:",r)}let o=await this.callbackServer.waitForCallback(e);return console.log(`\u2705 API Key \u83B7\u53D6\u6210\u529F!
133
133
  `),o}catch(t){throw console.error(`
134
134
  \u274C OAuth \u767B\u5F55\u5931\u8D25: ${t.message}
135
- `),t}finally{this.callbackServer&&this.callbackServer.cleanup()}}cleanup(){this.callbackServer&&this.callbackServer.cleanup()}};he.exports=K});var me=m((ss,pe)=>{var P=require("fs"),fe=require("path"),ht=require("os"),gt=require("readline"),ft=ge(),W=class{constructor(){this.configPath=fe.join(ht.homedir(),".coder","config.json"),this.defaultConfig={agent:"claude",auth:{ak:null,sk:null}}}async promptForAKSK(){let e=gt.createInterface({input:process.stdin,output:process.stdout});return new Promise((t,s)=>{console.log(`
136
- \u{1F510} \u8BF7\u8F93\u5165\u60A8\u7684 API Key\uFF1A`),e.question("\u8BF7\u8F93\u5165 API Key: ",o=>{let n=o.indexOf(".");if(n===-1||n===0||n===o.length-1){e.close(),s(new Error("\u683C\u5F0F\u9519\u8BEF"));return}let r=o.substring(0,n),i=o.substring(n+1);if(!r.trim()||!i.trim()){e.close(),s(new Error("\u683C\u5F0F\u9519\u8BEF"));return}e.close(),t({ak:r.trim(),sk:i.trim()})})})}ensureConfig(){let e=fe.dirname(this.configPath);try{P.existsSync(e)||P.mkdirSync(e,{recursive:!0}),P.existsSync(this.configPath)||P.writeFileSync(this.configPath,JSON.stringify(this.defaultConfig,null,2))}catch(t){return console.warn(`Warning: Could not create config file: ${t.message}`),this.defaultConfig}}loadConfig(){this.ensureConfig();try{let e=P.readFileSync(this.configPath,"utf8");return JSON.parse(e)}catch(e){return console.warn(`Warning: Could not load config, using defaults: ${e.message}`),this.defaultConfig}}async parse(e=process.argv.slice(2)){let t=this.loadConfig(),s={agent:t.agent||"claude",remainingArgs:[]},o=0,n=!1;if(e.length>0&&["claude","gemini","codex"].includes(e[0]))s.agent=e[0],n=!0,o=1;else if(e.length>0&&e[0]==="pub")s.command="pub",o=1;else if(e.length>0&&e[0]==="login")s.command="login",o=1;else if(e.length>0&&e[0]==="update")s.command="update",o=1;else if(e.length>0&&e[0]==="skills"){s.command="skills";let a=e[1];s.skillsSubcommand=a==="--help"||a==="-h"?void 0:a,s.skillsArg=e[2],s.skillsRemainingArgs=e.slice(2),o=e.length}else if(e.length>0&&e[0]==="wiki"){s.command="wiki";let a=e[1];s.wikiSubcommand=a==="--help"||a==="-h"?void 0:a,s.wikiArg=e[2],s.wikiRemainingArgs=e.slice(2),o=e.length}for(;o<e.length;){let a=e[o];if(a==="--agent"){if(n)throw new Error(`Cannot use both subcommand '${s.agent}' and --agent flag. Please use only one method to specify the agent.`);if(o+1>=e.length)throw new Error("--agent requires a value (claude, gemini, or codex)");let c=e[o+1];if(!["claude","gemini","codex"].includes(c))throw new Error(`Invalid agent: ${c}. Must be 'claude', 'gemini', or 'codex'`);s.agent=c,o+=2}else if(a==="--apikey"||a==="--aksk")if(o+1>=e.length||e[o+1].startsWith("--"))s.needAKSKPrompt=!0,o+=1;else{let c=e[o+1],l=c.indexOf(".");if(l===-1)throw new Error("API Key Format error");s.auth_ak=c.substring(0,l),s.auth_sk=c.substring(l+1),o+=2}else if(a==="--save-auth")s.saveAuth=!0,o+=1;else if(a==="--name")o+1>=e.length||e[o+1].startsWith("--")?o+=1:(s.pubName=e[o+1],o+=2);else if(a==="--clear-auth")s.clearAuth=!0,o+=1;else if(a==="--allow-clone")s.allowClone=!0,o+=1;else{s.remainingArgs=e.slice(o);break}}if(s.needAKSKPrompt)try{let{ak:a,sk:c}=await this.promptForAKSK();s.auth_ak=a,s.auth_sk=c,delete s.needAKSKPrompt}catch(a){console.error(`\u274C ${a.message}`),process.exit(1)}if(s.command!=="login"&&(!s.auth_ak&&t.auth&&t.auth.ak&&(s.auth_ak=t.auth.ak),!s.auth_sk&&t.auth&&t.auth.sk&&(s.auth_sk=t.auth.sk),!s.auth_ak&&process.env.CODEV_AUTH_AK&&(s.auth_ak=process.env.CODEV_AUTH_AK),!s.auth_sk&&process.env.CODEV_AUTH_SK&&(s.auth_sk=process.env.CODEV_AUTH_SK)),s.saveAuth&&s.auth_ak&&s.auth_sk){let a=this.saveAuthToConfig(s.auth_ak,s.auth_sk);console.log(a?"\u2705 API Key \u5DF2\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6":"\u274C \u4FDD\u5B58 API Key \u5931\u8D25"),process.exit(0)}if(s.clearAuth){let a=this.clearAuthFromConfig();console.log(a?"\u2705 API Key \u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u6E05\u9664":"\u274C \u6E05\u9664 API Key \u5931\u8D25"),process.exit(0)}let r=s.remainingArgs.includes("--version")||s.remainingArgs.includes("-v"),i=s.remainingArgs.includes("--help")||s.remainingArgs.includes("-h");if(s.command!=="login"&&s.command!=="skills"&&s.command!=="wiki"&&!r&&!i&&(!s.auth_ak||!s.auth_sk))try{console.log(`\u274C \u7F3A\u5C11\u5FC5\u8981\u7684 API Key
135
+ `),t}finally{this.callbackServer&&this.callbackServer.cleanup()}}cleanup(){this.callbackServer&&this.callbackServer.cleanup()}};pe.exports=W});var Ce=m((as,Se)=>{var P=require("fs"),me=require("path"),mt=require("os"),ye=require("readline"),yt=fe(),wt=new Set(["login","skills","wiki"]),we=new Set(["claude","gemini","codex"]),St=new Set(["pub","login","update","skills","wiki"]),J=class{constructor(){this.configPath=me.join(mt.homedir(),".coder","config.json"),this.defaultConfig={agent:"claude",auth:{ak:null,sk:null}}}loadConfig(){let e=me.dirname(this.configPath);try{return P.existsSync(e)||P.mkdirSync(e,{recursive:!0}),P.existsSync(this.configPath)||P.writeFileSync(this.configPath,JSON.stringify(this.defaultConfig,null,2)),JSON.parse(P.readFileSync(this.configPath,"utf8"))}catch{return{...this.defaultConfig}}}saveAuthToConfig(e,t){let s=this.loadConfig();s.auth={...s.auth,ak:e,sk:t};try{return P.writeFileSync(this.configPath,JSON.stringify(s,null,2)),!0}catch{return!1}}clearAuthFromConfig(){let e=this.loadConfig();e.auth&&(e.auth={ak:null,sk:null});try{return P.writeFileSync(this.configPath,JSON.stringify(e,null,2)),!0}catch{return!1}}promptForAKSK(){let e=ye.createInterface({input:process.stdin,output:process.stdout});return new Promise((t,s)=>{console.log(`
136
+ \u{1F510} \u8BF7\u8F93\u5165\u60A8\u7684 API Key\uFF1A`),e.question("\u8BF7\u8F93\u5165 API Key: ",o=>{e.close();let r=o.indexOf(".");if(r<=0||r===o.length-1)return s(new Error("\u683C\u5F0F\u9519\u8BEF"));let n=o.substring(0,r).trim(),i=o.substring(r+1).trim();if(!n||!i)return s(new Error("\u683C\u5F0F\u9519\u8BEF"));t({ak:n,sk:i})})})}promptForName(){let e=ye.createInterface({input:process.stdin,output:process.stdout});return new Promise((t,s)=>{e.question("\u8BF7\u8F93\u5165\u9879\u76EE\u540D\u79F0 (name): ",o=>{e.close();let r=o.trim();if(!r)return s(new Error("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"));if(!/^[a-zA-Z0-9_-]+$/.test(r))return s(new Error("\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"));t(r)})})}async parse(e=process.argv.slice(2)){let t=this.loadConfig(),s={agent:t.agent||"claude",remainingArgs:[]},o=0;if(e.length>0){if(we.has(e[0]))s.agent=e[0],s.agentSetBySubcommand=!0,o=1;else if(St.has(e[0])){if(s.command=e[0],o=1,e[0]==="skills"){let n=e[1];s.skillsSubcommand=n==="--help"||n==="-h"?void 0:n,s.skillsArg=e[2],s.skillsRemainingArgs=e.slice(2),o=e.length}else if(e[0]==="wiki"){let n=e[1];s.wikiSubcommand=n==="--help"||n==="-h"?void 0:n,s.wikiArg=e[2],s.wikiRemainingArgs=e.slice(2),o=e.length}}}for(;o<e.length;){let n=e[o];if(n==="--agent"){if(s.agentSetBySubcommand)throw new Error(`\u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u5B50\u547D\u4EE4 '${s.agent}' \u548C --agent\uFF0C\u8BF7\u9009\u62E9\u5176\u4E00`);let i=e[o+1];if(!i||!we.has(i))throw new Error("--agent \u9700\u8981\u6307\u5B9A\u4EE3\u7406\u7C7B\u578B\uFF08claude|gemini|codex\uFF09");s.agent=i,o+=2}else if(n==="--apikey"||n==="--aksk"){let i=e[o+1];if(!i||i.startsWith("--"))s.needAKSKPrompt=!0,o+=1;else{let a=i.indexOf(".");if(a===-1)throw new Error("API Key \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <ak>.<sk>");s.auth_ak=i.substring(0,a),s.auth_sk=i.substring(a+1),o+=2}}else if(n==="--save-auth")s.saveAuth=!0,o+=1;else if(n==="--clear-auth")s.clearAuth=!0,o+=1;else if(n==="--name"){let i=e[o+1];i&&!i.startsWith("--")?(s.pubName=i,o+=2):o+=1}else if(n==="--allow-clone")s.allowClone=!0,o+=1;else if(n==="--meta-data"){let i=e[o+1];if(!i||i.startsWith("--"))throw new Error("--meta-data \u9700\u8981\u4E00\u4E2A JSON \u5B57\u7B26\u4E32\u503C");try{JSON.parse(i)}catch(a){throw new Error(`--meta-data \u4E0D\u662F\u5408\u6CD5\u7684 JSON\uFF1A${a.message}`)}s.pubMetaData=i,o+=2}else{s.remainingArgs=e.slice(o);break}}if(s.needAKSKPrompt)try{let{ak:n,sk:i}=await this.promptForAKSK();s.auth_ak=n,s.auth_sk=i,delete s.needAKSKPrompt}catch(n){console.error(`\u274C ${n.message}`),process.exit(1)}s.clearAuth&&(console.log(this.clearAuthFromConfig()?"\u2705 API Key \u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u6E05\u9664":"\u274C \u6E05\u9664 API Key \u5931\u8D25"),process.exit(0)),s.saveAuth&&s.auth_ak&&s.auth_sk&&(console.log(this.saveAuthToConfig(s.auth_ak,s.auth_sk)?"\u2705 API Key \u5DF2\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6":"\u274C \u4FDD\u5B58 API Key \u5931\u8D25"),process.exit(0)),s.command!=="login"&&(s.auth_ak||=t.auth?.ak||process.env.CODEV_AUTH_AK,s.auth_sk||=t.auth?.sk||process.env.CODEV_AUTH_SK),s.codevServer=process.env.CODEV_SERVER||t.codevServer||"https://makecoder.com/bigapis/codev/v1";let r=s.remainingArgs.includes("--version")||s.remainingArgs.includes("-v")||s.remainingArgs.includes("--help")||s.remainingArgs.includes("-h");return!wt.has(s.command)&&!r&&(!s.auth_ak||!s.auth_sk)&&await this._oauthLogin(s),s}async _oauthLogin(e){console.log(`\u274C \u7F3A\u5C11\u5FC5\u8981\u7684 API Key
137
137
  `),console.log(`\u{1F510} \u6B63\u5728\u542F\u52A8\u767B\u5F55\u6D41\u7A0B...
138
- `);let c=await new ft({baseUrl:"https://makecoder.com",apiBaseUrl:s.codevServer||"https://makecoder.com/bigapis/codev/v1"}).login();s.auth_ak=c.ak,s.auth_sk=c.sk;let l=this.saveAuthToConfig(c.ak,c.sk);console.log(l?`\u2705 API Key \u5DF2\u81EA\u52A8\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6
139
- `:`\u26A0\uFE0F API Key \u83B7\u53D6\u6210\u529F\u4F46\u672A\u80FD\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6,\u4E0B\u6B21\u4F7F\u7528\u9700\u8981\u91CD\u65B0\u767B\u5F55
140
- `)}catch(a){console.error(`
141
- \u274C \u767B\u5F55\u5931\u8D25: ${a.message}
138
+ `);try{let s=await new yt({baseUrl:"https://makecoder.com",apiBaseUrl:e.codevServer}).login();e.auth_ak=s.ak,e.auth_sk=s.sk,console.log(this.saveAuthToConfig(s.ak,s.sk)?`\u2705 API Key \u5DF2\u81EA\u52A8\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6
139
+ `:`\u26A0\uFE0F API Key \u83B7\u53D6\u6210\u529F\u4F46\u672A\u80FD\u4FDD\u5B58\u5230\u914D\u7F6E\u6587\u4EF6\uFF0C\u4E0B\u6B21\u4F7F\u7528\u9700\u8981\u91CD\u65B0\u767B\u5F55
140
+ `)}catch(t){console.error(`
141
+ \u274C \u767B\u5F55\u5931\u8D25\uFF1A${t.message}
142
142
  `),console.error(`\u{1F4CB} \u60A8\u4E5F\u53EF\u4EE5\u624B\u52A8\u83B7\u53D6 API Key\uFF1A
143
143
  \u8BF7\u8BBF\u95EE\uFF1Ahttps://makecoder.com/my/apikeys
144
144
 
145
145
  \u{1F680} \u624B\u52A8\u4F7F\u7528\u65B9\u5F0F\uFF1A
146
146
  coder --apikey <\u4F60\u7684API Key>
147
147
  \u6216\u8005\uFF1Acoder --apikey \uFF08\u7136\u540E\u5B89\u5168\u8F93\u5165\uFF09
148
- `),process.exit(1)}return process.env.CODEV_SERVER?s.codevServer=process.env.CODEV_SERVER:t.codevServer?s.codevServer=t.codevServer:s.codevServer="https://makecoder.com/bigapis/codev/v1",s}saveAuthToConfig(e,t){let s=this.loadConfig();s.auth||(s.auth={}),s.auth.ak=e,s.auth.sk=t;try{return P.writeFileSync(this.configPath,JSON.stringify(s,null,2)),!0}catch(o){return console.warn(`Warning: Could not save auth to config: ${o.message}`),!1}}clearAuthFromConfig(){let e=this.loadConfig();e.auth&&(e.auth.ak=null,e.auth.sk=null);try{return P.writeFileSync(this.configPath,JSON.stringify(e,null,2)),!0}catch(t){return console.warn(`Warning: Could not clear auth from config: ${t.message}`),!1}}showHelp(){console.log(`
148
+ `),process.exit(1)}}showHelp(){console.log(`
149
149
  Coder AI Agent
150
150
 
151
- USAGE:
152
- coder [--agent <agent>] [agent-args...]
153
- coder <agent> [agent-args...]
151
+ \u7528\u6CD5:
152
+ coder [--agent <\u4EE3\u7406>] [\u4EE3\u7406\u53C2\u6570...]
153
+ coder <\u4EE3\u7406> [\u4EE3\u7406\u53C2\u6570...]
154
154
  coder login [--apikey <API Key>]
155
- coder pub [--name <name>]
155
+ coder pub [--name <\u540D\u79F0>]
156
156
 
157
- AGENTS:
158
- claude Use Claude Code (default)
159
- gemini Use Gemini CLI
160
- codex Use OpenAI Codex CLI
157
+ AI \u4EE3\u7406:
158
+ claude \u4F7F\u7528 Claude Code\uFF08\u9ED8\u8BA4\uFF09
159
+ gemini \u4F7F\u7528 Gemini CLI
160
+ codex \u4F7F\u7528 OpenAI Codex CLI
161
161
 
162
- COMMANDS:
162
+ \u547D\u4EE4:
163
163
  login \u767B\u5F55 MakeCoder\uFF0C\u4FDD\u5B58 API Key \u5230\u672C\u5730\u914D\u7F6E
164
164
  update \u5347\u7EA7 Coder \u5230\u6700\u65B0\u7248\u672C
165
- pub Publish current directory to hosting server
165
+ pub \u53D1\u5E03\u5F53\u524D\u76EE\u5F55\u5230\u6258\u7BA1\u670D\u52A1\u5668
166
166
  skills \u7BA1\u7406 Claude Code skills
167
167
  wiki \u7BA1\u7406 MakeCoder \u77E5\u8BC6\u5E93
168
168
 
169
- EXAMPLES:
170
- coder claude # Launch Claude agent
171
- coder gemini # Launch Gemini agent
172
- coder codex --help # Launch Codex agent
173
- coder --agent claude # Alternative syntax
174
- coder pub --name myproject # Publish current directory as 'myproject'
175
- coder pub # Publish (will prompt for name)
169
+ \u9009\u9879:
170
+ --agent <\u4EE3\u7406> \u6307\u5B9A\u4F7F\u7528\u7684 AI \u4EE3\u7406\uFF08claude|gemini|codex\uFF09
171
+ --version \u663E\u793A\u7248\u672C\u53F7
172
+ --help \u663E\u793A\u5E2E\u52A9\u4FE1\u606F
173
+ --apikey [API Key] \u63D0\u4F9B API Key\uFF1B\u7701\u7565\u5219\u4EA4\u4E92\u5F0F\u5B89\u5168\u8F93\u5165
174
+ \uFF08\u83B7\u53D6\u5730\u5740\uFF1Ahttps://makecoder.com/my/apikeys\uFF09
175
+ --save-auth \u914D\u5408 --apikey \u4F7F\u7528\uFF0C\u4FDD\u5B58 API Key \u5230\u914D\u7F6E\u6587\u4EF6
176
+ --clear-auth \u6E05\u9664\u914D\u7F6E\u6587\u4EF6\u4E2D\u4FDD\u5B58\u7684 API Key
177
+ --name <\u540D\u79F0> \uFF08pub\uFF09\u53D1\u5E03\u65F6\u6307\u5B9A\u9879\u76EE\u540D\u79F0
178
+ --allow-clone \uFF08pub\uFF09\u5C06 Claude Code \u751F\u6210\u8BB0\u5F55\u4E00\u5E76\u6253\u5305\uFF0C\u5141\u8BB8\u4ED6\u4EBA\u514B\u9686
179
+
180
+ \u793A\u4F8B:
181
+ coder claude # \u542F\u52A8 Claude \u4EE3\u7406
182
+ coder gemini # \u542F\u52A8 Gemini \u4EE3\u7406
183
+ coder codex --help # \u67E5\u770B Codex \u5E2E\u52A9
184
+ coder --agent claude # \u7B49\u6548\u5199\u6CD5
185
+ coder pub --name myproject # \u5C06\u5F53\u524D\u76EE\u5F55\u53D1\u5E03\u4E3A 'myproject'
186
+ coder pub # \u53D1\u5E03\uFF08\u4EA4\u4E92\u5F0F\u8F93\u5165\u540D\u79F0\uFF09
176
187
  coder skills --help # \u67E5\u770B skills \u5B50\u547D\u4EE4\u5E2E\u52A9
177
188
  coder wiki --help # \u67E5\u770B wiki \u5B50\u547D\u4EE4\u5E2E\u52A9
178
189
 
179
- OPTIONS:
180
- --agent <agent> Specify which agent to use (claude|gemini|codex)
181
- --version Show version
182
- --help Show this help message
183
- --apikey [API Key] (login) \u63D0\u4F9B API Key\uFF1B\u7701\u7565\u5219\u4EA4\u4E92\u5F0F\u5B89\u5168\u8F93\u5165
184
- (\u83B7\u53D6\u5730\u5740: https://makecoder.com/my/apikeys)
185
- --save-auth (\u517C\u5BB9\u65E7\u7248) \u914D\u5408 --apikey \u4F7F\u7528\uFF0C\u4FDD\u5B58 API Key \u5230\u914D\u7F6E\u6587\u4EF6
186
- --clear-auth Clear saved API Key from config file
187
- --name <name> (pub command) Project name for publishing
188
- --allow-clone (pub command) Include Claude Code generation history for cloning
189
-
190
- CONFIG:
191
- Default configuration is stored in ~/.coder/config.json
192
- Command line --agent overrides the default but doesn't modify the file.
193
- Auth credentials can be stored in config file under "auth" section.
194
- `)}};pe.exports=W});var N=m((os,ye)=>{function pt(h=process.argv.slice(2)){return h.includes("--print")||h.includes("-p")}ye.exports={isPrintMode:pt}});var j=m((ns,Ce)=>{var{spawn:mt}=require("child_process"),M=require("path"),_=require("fs"),we=require("os"),{isPrintMode:Se}=N(),z=class{constructor(e){this.config=e}resloveSettingFilePath(e){return M.join(e,this.config.configDir,"settings.json")}readModelFromSettingsFile(e){try{let t=this.resloveSettingFilePath(e);if(_.existsSync(t)){let s=_.readFileSync(t,"utf8"),o=JSON.parse(s);if(o&&o.model)return o.model}}catch(t){console.warn(e,t.message)}return null}getCurrentModel(e){let t=e.findIndex(o=>o==="--model");if(t!==-1&&t+1<e.length)return e[t+1];let s=this.readModelFromSettingsFile(process.cwd());return s||(s=this.readModelFromSettingsFile(we.homedir()),s)?s:this.config.defaultModel}async ensureConfig(e=0){let t=M.join(we.homedir(),this.config.configDir,this.config.configFile),s=M.dirname(t);if(!_.existsSync(t)){let o=this.config.defaultConfig||{};try{_.existsSync(s)||_.mkdirSync(s,{recursive:!0}),_.writeFileSync(t,JSON.stringify(o,null,2)),e>0&&await new Promise(n=>setTimeout(n,e))}catch(n){console.warn(`Failed to create ${this.config.configFile}: ${n.message}`)}}}findExecutablePath(){let e=M.dirname(require.main.filename);for(let t of this.config.executablePaths){let s=M.resolve(e,t);if(_.existsSync(s))return s}throw new Error(`Could not find executable in any of the configured paths: ${this.config.executablePaths.join(", ")}`)}handleChildMessages(e){process.env.CODEV_DEBUG&&console.log("Child process message handler initialized"),e.connected&&(e.on("message",t=>{this.onChildMessage(t)}),e.on("exit",async(t,s)=>{try{await this.handleChildProcessExit(t,s)}catch(o){console.error("Error in handleChildProcessExit:",o.message)}}),e.on("error",t=>{this.handleChildProcessError(t)}))}onChildMessage(e){process.env.CODEV_DEBUG&&console.log("Received IPC message from child:",e)}handleChildProcessExit(e,t){}handleChildProcessError(e){}async launch(e={}){let{remainingArgs:t=[],codevServer:s,auth_ak:o=null,auth_sk:n=null}=e;try{let r=this.getCurrentModel(t);Se(t)||console.log(`model:\x1B[90m\x1B[3m ${r} (use /model to switch models) \x1B[0m`),await this.ensureConfig(1e3);let i=this.findExecutablePath();return process.env.CODEV_DEBUG&&console.log(`executablePath: ${i}`),new Promise((a,c)=>{let l={...process.env,...this.config.environmentVariables(s)};o&&(l.CODEV_AUTH_AK=o),n&&(l.CODEV_AUTH_SK=n);let u=["--no-warnings"];process.env.CODEV_INSPECT_BRK==="True"&&u.push("--inspect-brk"),u.push(i,...t);let d=mt("node",u,{env:l,stdio:["inherit","inherit","inherit","ipc"]});this.handleChildMessages(d),d.on("error",g=>{console.error(`Failed to start: ${g.message}`),c(g)}),d.on("exit",async(g,C)=>{Se(t)||C&&console.log(`terminated by signal: ${C}`)}),process.on("SIGINT",async()=>{console.log(`
190
+ \u914D\u7F6E\u6587\u4EF6: ~/.coder/config.json
191
+ `)}};Se.exports=J});var R=m((cs,Ee)=>{function Ct(h=process.argv.slice(2)){return h.includes("--print")||h.includes("-p")}Ee.exports={isPrintMode:Ct}});var H=m((ls,Ie)=>{var{spawn:Et}=require("child_process"),M=require("path"),k=require("fs"),ve=require("os"),{isPrintMode:be}=R(),Q=class{constructor(e){this.config=e}resloveSettingFilePath(e){return M.join(e,this.config.configDir,"settings.json")}readModelFromSettingsFile(e){try{let t=this.resloveSettingFilePath(e);if(k.existsSync(t)){let s=k.readFileSync(t,"utf8"),o=JSON.parse(s);if(o&&o.model)return o.model}}catch(t){console.warn(e,t.message)}return null}getCurrentModel(e){let t=e.findIndex(o=>o==="--model");if(t!==-1&&t+1<e.length)return e[t+1];let s=this.readModelFromSettingsFile(process.cwd());return s||(s=this.readModelFromSettingsFile(ve.homedir()),s)?s:this.config.defaultModel}async ensureConfig(e=0){let t=M.join(ve.homedir(),this.config.configDir,this.config.configFile),s=M.dirname(t);if(!k.existsSync(t)){let o=this.config.defaultConfig||{};try{k.existsSync(s)||k.mkdirSync(s,{recursive:!0}),k.writeFileSync(t,JSON.stringify(o,null,2)),e>0&&await new Promise(r=>setTimeout(r,e))}catch(r){console.warn(`Failed to create ${this.config.configFile}: ${r.message}`)}}}findExecutablePath(){let e=M.dirname(require.main.filename);for(let t of this.config.executablePaths){let s=M.resolve(e,t);if(k.existsSync(s))return s}throw new Error(`Could not find executable in any of the configured paths: ${this.config.executablePaths.join(", ")}`)}handleChildMessages(e){process.env.CODEV_DEBUG&&console.log("Child process message handler initialized"),e.connected&&(e.on("message",t=>{this.onChildMessage(t)}),e.on("exit",async(t,s)=>{try{await this.handleChildProcessExit(t,s)}catch(o){console.error("Error in handleChildProcessExit:",o.message)}}),e.on("error",t=>{this.handleChildProcessError(t)}))}onChildMessage(e){process.env.CODEV_DEBUG&&console.log("Received IPC message from child:",e)}handleChildProcessExit(e,t){}handleChildProcessError(e){}async launch(e={}){let{remainingArgs:t=[],codevServer:s,auth_ak:o=null,auth_sk:r=null}=e;try{let n=this.getCurrentModel(t);be(t)||console.log(`model:\x1B[90m\x1B[3m ${n} (use /model to switch models) \x1B[0m`),await this.ensureConfig(1e3);let i=this.findExecutablePath();return process.env.CODEV_DEBUG&&console.log(`executablePath: ${i}`),new Promise((a,c)=>{let l={...process.env,...this.config.environmentVariables(s)};o&&(l.CODEV_AUTH_AK=o),r&&(l.CODEV_AUTH_SK=r);let u=["--no-warnings"];process.env.CODEV_INSPECT_BRK==="True"&&u.push("--inspect-brk"),u.push(i,...t);let d=Et("node",u,{env:l,stdio:["inherit","inherit","inherit","ipc"]});this.handleChildMessages(d),d.on("error",g=>{console.error(`Failed to start: ${g.message}`),c(g)}),d.on("exit",async(g,C)=>{be(t)||C&&console.log(`terminated by signal: ${C}`)}),process.on("SIGINT",async()=>{console.log(`
195
192
  Terminating ...`),d.kill("SIGTERM"),setTimeout(()=>{d.killed||d.kill("SIGKILL")},8e3)}),process.on("SIGTERM",async()=>{console.log(`
196
- Terminating ...`),d.kill("SIGTERM"),setTimeout(()=>{d.killed||d.kill("SIGKILL")},8e3)})})}catch(r){throw r}}};Ce.exports=z});var Ee=m((rs,ve)=>{var f=process.env.CODEV_DEBUG==="True",J=class{constructor(e={}){this.queue=[],this.processing=!1,this.shuttingDown=!1,this.shutdownTimeout=e.shutdownTimeout||5e3,this.maxRetries=e.maxRetries||3,this.retryDelay=e.retryDelay||1e3,this.onProcessMessage=e.onProcessMessage||null,this.shutdownPromise=null,this.currentlyProcessing=null}enqueue(e){if(this.shuttingDown)return f&&console.log("Queue is shutting down, skipping new messages"),null;let t={id:Date.now()+Math.random(),data:e,timestamp:Date.now(),retryCount:0,processing:!1};return this.queue.push(t),f&&console.log(`Message enqueued, queue length: ${this.queue.length}`),this.processQueue(),t.id}dequeue(){let e=this.queue.shift();return f&&e&&console.log(`Message dequeued, remaining queue length: ${this.queue.length}`),e}removeById(e){let t=this.queue.findIndex(s=>s.id===e);return t>-1?(this.queue.splice(t,1),f&&console.log(`Message ${e} removed from queue`),!0):!1}async processQueue(){if(!(this.processing||this.queue.length===0)){this.processing=!0;try{for(;this.queue.length>0&&!this.shuttingDown;){let e=this.queue[0];e.processing=!0;try{this.onProcessMessage&&await this.onProcessMessage(e),this.dequeue()}catch(t){if(f&&console.error(`Failed to process message: ${t.message}`),e.retryCount++,f&&console.log("Start Retry:",e.retryCount,"times..."),e.retryCount>=this.maxRetries)f&&console.error("Message exceeded max retries, removing from queue"),this.dequeue();else{e.processing=!1;let s=this.shuttingDown?100:this.retryDelay*e.retryCount;await new Promise(o=>setTimeout(o,s))}}}}finally{this.processing=!1}}}getQueueSize(){return this.queue.length}clear(){this.queue=[],f&&console.log("Message queue cleared")}setMessageProcessor(e){this.onProcessMessage=e}async waitForProcessingMessages(e=5e3){let t=this.queue.filter(o=>o.processing);if(t.length===0)return;f&&console.log(`Waiting for ${t.length} processing messages to complete (timeout: ${e}ms)`);let s=Date.now();for(;Date.now()-s<e;){if(this.queue.filter(n=>n.processing).length===0){f&&console.log(`All processing messages completed in ${Date.now()-s}ms`);return}await new Promise(n=>setTimeout(n,50))}if(f){let o=this.queue.filter(n=>n.processing);console.log(`Timeout waiting for processing messages. ${o.length} messages still processing`)}}async gracefulShutdown(e={}){if(this.shutdownPromise)return this.shutdownPromise;let{timeoutMs:t=this.shutdownTimeout,batchSize:s=10,fastMode:o=!1}=e;return this.shutdownPromise=new Promise(async n=>{this.shuttingDown=!0,await this.waitForProcessingMessages(Math.min(t*.3,3e3));let r=this.queue.filter(g=>!g.processing),i=r.length;f&&(console.log(`Starting graceful shutdown with ${i} pending messages (${this.queue.length-i} already processing)`),console.log(`Mode: ${o?"fast (parallel)":"sequential"}, timeout: ${t}ms`));let a=Date.now(),c=0,l=0;try{if(o){let g=await this.processAllParallel(t-(Date.now()-a),r);c=g.processed,l=g.failed}else{let g=await this.processInBatches(s,t-(Date.now()-a),r);c=g.processed,l=g.failed}}catch(g){f&&console.error("Error during shutdown processing:",g.message)}let u=Date.now()-a,d=this.queue.length;f&&(console.log(`Shutdown completed in ${u}ms:`),console.log(` - Total: ${i} messages`),console.log(` - Processed: ${c}`),console.log(` - Failed: ${l}`),console.log(` - Remaining: ${d}`)),n({totalMessages:i,processedMessages:c,failedMessages:l,remainingMessages:d,duration:u,allMessagesSent:d===0&&l===0})}),this.shutdownPromise}async processAllParallel(e){if(this.queue.length===0)return{processed:0,failed:0};f&&console.log(`Processing ${this.queue.length} messages in parallel...`);let t=[...this.queue];this.queue=[];let s=t.map(async a=>{try{return this.onProcessMessage&&await this.onProcessMessage(a),{success:!0,messageId:a.id}}catch(c){return f&&console.warn(`Message ${a.id} processing failed: ${c.message}`),{success:!1,messageId:a.id,error:c}}}),o=new Promise(a=>{setTimeout(()=>a({timedOut:!0}),e)}),n=await Promise.race([Promise.allSettled(s).then(a=>({results:a})),o]);if(n.timedOut)return f&&console.log(`Parallel processing timed out after ${e}ms`),{processed:0,failed:t.length};let r=n.results.filter(a=>a.status==="fulfilled"&&a.value?.success).length,i=t.length-r;return{processed:r,failed:i}}async processInBatches(e,t){if(this.queue.length===0)return{processed:0,failed:0};f&&console.log(`Processing ${this.queue.length} messages in batches of ${e}...`);let s=Date.now(),o=0,n=0;for(;this.queue.length>0&&Date.now()-s<t;){let r=this.queue.splice(0,e),i=r.map(async u=>{try{return this.onProcessMessage&&await this.onProcessMessage(u),{success:!0}}catch(d){return f&&console.warn(`Batch message processing failed: ${d.message}`),{success:!1,error:d}}}),c=(await Promise.allSettled(i)).filter(u=>u.status==="fulfilled"&&u.value?.success).length,l=r.length-c;o+=c,n+=l,f&&r.length>0&&console.log(`Batch completed: ${c}/${r.length} successful`),this.queue.length>0&&await new Promise(u=>setTimeout(u,10))}return this.queue.length>0&&(n+=this.queue.length,f&&console.log(`${this.queue.length} messages not processed due to timeout`),this.queue=[]),{processed:o,failed:n}}async forceFlushAndShutdown(e=2e3){this.shuttingDown=!0,await this.waitForProcessingMessages(Math.min(e*.4,1e3));let t=this.queue.filter(a=>!a.processing);f&&console.log(`Force flush: attempting to send ${t.length} pending messages within ${e}ms (${this.queue.length-t.length} already processing)`);let s=Date.now(),o=t.map(async a=>{try{return this.onProcessMessage&&Date.now()-s<e?(await this.onProcessMessage(a),{success:!0,messageId:a.id}):{success:!1,messageId:a.id,reason:"timeout"}}catch(c){return{success:!1,messageId:a.id,error:c.message}}}),n=e-(Date.now()-s),r=new Promise(a=>{setTimeout(()=>a({timedOut:!0}),Math.max(100,n))}),i=await Promise.race([Promise.allSettled(o).then(a=>({results:a})),r]);if(t.forEach(a=>{let c=this.queue.findIndex(l=>l.id===a.id);c>-1&&this.queue.splice(c,1)}),this.processing=!1,i.timedOut)return f&&console.log(`Force flush timed out after ${e}ms`),{success:!1,reason:"timeout",attemptedCount:t.length};{let a=i.results.filter(c=>c.status==="fulfilled"&&c.value.success).length;return f&&console.log(`Force flush completed: ${a}/${t.length} messages sent`),{success:a===t.length,successCount:a,totalCount:t.length,results:i.results}}}forceShutdown(){this.shuttingDown=!0,this.queue=[],this.processing=!1,f&&console.log("Force shutdown: Queue cleared")}};ve.exports=J});var q=m((is,yt)=>{yt.exports={name:"makecoder",version:"2.0.91",description:"MakeCoder: Unified AI agent CLI tool integrating Claude Code, Codex and Gemini CLI",main:"./dist/coder.js",bin:{coder:"./dist/coder.js"},scripts:{test:'echo "Error: no test specified" && exit 1',start:"node ./src/coder.js",build:"node scripts/build.js","build:clean":"node scripts/build.js --clean","build:dev":"node scripts/build.js --no-minify --sourcemap",postinstall:"node scripts/postinstall.js"},keywords:["cli","ai","claude","gemini","codex","agent"],author:"makecoder",license:"MIT",repository:{type:"git",url:"https://github.com/makecoderai/coder.git"},homepage:"https://github.com/makecoderai/coder",dependencies:{"node-fetch":"^3.3.2",open:"^10.1.0",zod:"^3.25.76"},optionalDependencies:{"makecoder-codex-linux-x64":"*","makecoder-codex-darwin-arm64":"*","makecoder-codex-win32-x64":"*"},engines:{node:">=20.0.0"},devDependencies:{chokidar:"^4.0.3"},files:["dist","claude","scripts/postinstall.js"]}});var $e=m((as,xe)=>{var wt=require("http"),St=require("https"),{URL:be}=require("url"),{version:Ct}=q(),Ie=process.env.CODEV_DEBUG==="True",Q=class{constructor(e={}){this.baseUrl=e.baseUrl||"",this.timeout=e.timeout||3e4,this.defaultHeaders={"Content-Type":"application/json","User-Agent":`codev-cli/${Ct}`,...e.headers}}setBaseUrl(e){this.baseUrl=e}setDefaultHeaders(e){this.defaultHeaders={...this.defaultHeaders,...e}}async post(e,t,s={}){let o=this.resolveUrl(e),n={...this.defaultHeaders,...s.headers};return new Promise((r,i)=>{this.validateRequest(o,t,i);let a=this.serializeData(t,i);if(!a)return;n["Content-Length"]=Buffer.byteLength(a);let c=this.buildRequestOptions(o,"POST",n),l=this.getHttpModule(o);Ie&&console.debug(`HTTP POST to ${o} with data length: ${a.length}`);let u=l.request(c,d=>{this.handleResponse(d,r,i)});this.attachErrorHandlers(u,o,i),u.setTimeout(this.timeout),u.write(a),u.end()})}resolveUrl(e){return e.startsWith("http")?e:`${this.baseUrl}${e.startsWith("/")?"":"/"}${e}`}validateRequest(e,t,s){return!e||typeof e!="string"?(s(new Error(`Invalid URL: ${e}`)),!1):t?!0:(s(new Error("No data provided for HTTP POST")),!1)}serializeData(e,t){try{return typeof e=="string"?e:JSON.stringify(e)}catch(s){return t(new Error(`Failed to serialize data: ${s.message}`)),null}}buildRequestOptions(e,t,s){let o=new be(e),n=o.protocol==="https:";return{hostname:o.hostname,port:o.port||(n?443:80),path:o.pathname+o.search,method:t,headers:s}}getHttpModule(e){return new be(e).protocol==="https:"?St:wt}handleResponse(e,t,s){Ie&&console.debug(`HTTP response status: ${e.statusCode}`);let o="";e.on("data",n=>{o+=n}),e.on("end",()=>{e.statusCode>=200&&e.statusCode<300?t({statusCode:e.statusCode,data:o,headers:e.headers}):s(new Error(`HTTP request returned status ${e.statusCode}: ${o}`))})}attachErrorHandlers(e,t,s){e.on("error",o=>{s(new Error(`HTTP POST request failed: ${o.message}`))}),e.on("timeout",()=>{s(new Error(`HTTP POST request timed out for URL: ${t}`)),e.destroy()})}};xe.exports=Q});var De=m((cs,ke)=>{var vt=require("crypto"),{URL:Et}=require("url"),Y=class{static generateSignature(e,t,s,o){try{let n=new Et(e),r=Buffer.from(n.pathname),i=Buffer.from(r),a=t?typeof t=="string"?Buffer.from(t):Buffer.from(JSON.stringify(t)):Buffer.alloc(0),c=Buffer.concat([i,a,Buffer.from(o)]),l=vt.createHmac("sha256",s);return l.update(c),l.digest("hex")}catch(n){throw new Error(`Failed to generate signature: ${n.message}`)}}static validateSignature(e,t,s,o,n){return this.generateSignature(e,t,s,o)===n}static generateTimestamp(){return Date.now().toString()}};ke.exports=Y});var _e=m((ls,Pe)=>{var bt=De(),X=class{constructor(e={}){this.accessKey=null,this.secretKey=null,this.validateCredentials=e.validateCredentials!==!1}setCredentials(e,t){if(this.validateCredentials&&(!e||!t))throw new Error("Both access key and secret key are required");this.accessKey=e,this.secretKey=t}hasCredentials(){return!!(this.accessKey&&this.secretKey)}generateAuthHeaders(e,t=null){if(!this.hasCredentials())return{};try{return{AUTHORIZATION:`Bearer ${this.accessKey}.${this.secretKey}`}}catch(s){throw new Error(`Failed to generate auth headers: ${s.message}`)}}validateAuthHeaders(e,t,s,o){if(!this.hasCredentials())throw new Error("No credentials available for validation");return bt.validateSignature(e,t,this.secretKey,s,o)}clearCredentials(){this.accessKey=null,this.secretKey=null}getCredentials(){return{accessKey:this.accessKey,hasCredentials:this.hasCredentials()}}};Pe.exports=X});var Te=m((us,Oe)=>{var U=process.env.CODEV_DEBUG==="True",Z=class{constructor(e={}){this.currentSessionId=null,this.previousSessionId=null,this.onSessionSwitch=e.onSessionSwitch||null,this.terminateSignal=e.terminateSignal||"CODEV_TERMINATE_SIGNAL"}handleSessionSwitch(e){if(!e)return U&&console.warn("Received empty session ID"),!1;let t=this.previousSessionId!==null&&this.previousSessionId!==e;return t&&(U&&console.log(`Session switch detected: ${this.previousSessionId} -> ${e}`),this.onSessionSwitch&&this.onSessionSwitch({type:this.terminateSignal,reason:"User switch session",agent:"claude",previousSessionId:this.previousSessionId,newSessionId:e})),this.previousSessionId=this.currentSessionId,this.currentSessionId=e,t}getCurrentSessionId(){return this.currentSessionId}getPreviousSessionId(){return this.previousSessionId}hasActiveSession(){return!!this.currentSessionId}terminateCurrentSession(e="Session terminated",t=null,s=null){if(!this.hasActiveSession())return U&&console.log("No active session to terminate"),null;let o={type:this.terminateSignal,reason:s?`terminated by signal: ${s}`:e,code:t,signal:s,timestamp:Date.now(),agent:"claude",sessionId:this.currentSessionId};return U&&console.log("Terminating session:",o),this.previousSessionId=null,this.currentSessionId=null,o}createErrorTermination(e){return this.hasActiveSession()?{type:this.terminateSignal,error:e.message,stack:e.stack,timestamp:Date.now(),agent:"claude",sessionId:this.currentSessionId}:null}reset(){U&&console.log("Resetting session manager"),this.currentSessionId=null,this.previousSessionId=null}setSessionSwitchCallback(e){this.onSessionSwitch=e}getSessionInfo(){return{currentSessionId:this.currentSessionId,previousSessionId:this.previousSessionId,hasActiveSession:this.hasActiveSession()}}};Oe.exports=Z});var Me=m((ds,Ae)=>{var O=require("fs"),A=require("path"),It=require("events"),xt=require("crypto"),w=process.env.CODEV_DEBUG==="True",ee=class extends It{constructor(e={}){super(),this.watchPaths=e.watchPaths||[],this.excludePatterns=e.excludePatterns||[/node_modules/,/\.git/,/\.DS_Store/,/\.tmp/,/\.log$/,/\.swp$/,/codev\.log/],this.includePatterns=e.includePatterns||[/\.(js|jsx|ts|tsx|py|java|c|cpp|h|hpp|go|rs|rb|php|html|css|scss|sass|less|json|xml|yaml|yml|md|txt)$/],this.watchers=new Map,this.isWatching=!1,this.debounceTimeout=e.debounceTimeout||300,this.pendingChanges=new Map,this.fileContentHashes=new Map,this.enableContentComparison=e.enableContentComparison!==!1,this.onFileChange=e.onFileChange||null}calculateFileHash(e){try{let t=O.readFileSync(e,"utf8");return xt.createHash("sha256").update(t).digest("hex")}catch{return null}}hasContentChanged(e){if(!this.enableContentComparison)return!0;let t=this.calculateFileHash(e),s=this.fileContentHashes.get(e);return t===null?s!==void 0?(this.fileContentHashes.delete(e),!0):!1:s===void 0||t!==s?(this.fileContentHashes.set(e,t),!0):!1}preloadFileHashes(e){if(!(!this.enableContentComparison||!O.existsSync(e)))try{let t=O.readdirSync(e,{withFileTypes:!0});for(let s of t){let o=A.join(e,s.name);s.isFile()&&this.shouldWatchFile(o)?(this.calculateFileHash(o),this.fileContentHashes.set(o,this.calculateFileHash(o))):s.isDirectory()&&!this.shouldExcludeDirectory(o)&&this.preloadFileHashes(o)}}catch(t){w&&console.warn(`Failed to preload hashes for ${e}:`,t.message)}}shouldExcludeDirectory(e){let t=e.replace(/\\/g,"/");for(let s of this.excludePatterns)if(s.test(t)||s.test(A.basename(e)))return!0;return!1}startWatching(e=null){if(this.isWatching){w&&console.log("FileWatchService is already watching");return}let t=e||this.watchPaths;if(t.length===0){w&&console.log("No watch paths specified");return}this.isWatching=!0;for(let s of t)this.enableContentComparison&&this.preloadFileHashes(s),this.watchDirectory(s);w&&(console.log(`FileWatchService started watching ${t.length} paths`),this.enableContentComparison&&console.log(`Preloaded hashes for ${this.fileContentHashes.size} files`))}stopWatching(){if(this.isWatching){this.isWatching=!1;for(let[e,t]of this.watchers)try{t.close(),w&&console.log(`Stopped watching: ${e}`)}catch(s){w&&console.error(`Error stopping watcher for ${e}:`,s.message)}this.watchers.clear(),this.pendingChanges.clear(),this.fileContentHashes.clear(),w&&console.log("FileWatchService stopped watching all paths")}}watchDirectory(e){if(!O.existsSync(e)){w&&console.warn(`Watch path does not exist: ${e}`);return}if(!O.statSync(e).isDirectory()){w&&console.warn(`Watch path is not a directory: ${e}`);return}try{let s=O.watch(e,{recursive:!0,persistent:!1},(o,n)=>{if(!n)return;let r=A.join(e,n);this.handleFileChange(o,r,e)});this.watchers.set(e,s),w&&console.log(`Started watching directory: ${e}`),s.on("error",o=>{w&&console.error(`Watcher error for ${e}:`,o.message),this.watchers.delete(e)})}catch(s){w&&console.error(`Failed to start watching ${e}:`,s.message)}}handleFileChange(e,t,s){if(!this.shouldWatchFile(t))return;let o=`${e}:${t}`;this.pendingChanges.has(o)&&clearTimeout(this.pendingChanges.get(o)),this.pendingChanges.set(o,setTimeout(()=>{this.pendingChanges.delete(o),this.processFileChange(e,t,s)},this.debounceTimeout))}processFileChange(e,t,s){if(!this.isWatching)return;let o="modified",n=!1;try{O.statSync(t),n=!0,e==="rename"?o="created":e==="change"&&(o="modified")}catch{e==="rename"&&(o="deleted")}if(n&&(o==="modified"||o==="created")&&!this.hasContentChanged(t)){w&&console.log(`Ignoring false change for: ${A.relative(s,t)}`);return}!n&&o==="deleted"&&this.fileContentHashes.delete(t);let r={type:"CODEV_FILE_CHANGE_DETECTTED",data:{eventType:e,changeType:o,filePath:t,relativePath:A.relative(s,t),watchPath:s,fileExists:n,timestamp:Date.now(),sessionId:process.env.SESSION_ID||"default"}};if(w&&console.log(`File ${o}: ${r.data.relativePath}`),this.emit("fileChange",r),this.onFileChange&&typeof this.onFileChange=="function")try{this.onFileChange(r)}catch(i){w&&console.error("Error in file change callback:",i.message)}}shouldWatchFile(e){let t=A.basename(e),s=e.replace(/\\/g,"/");for(let o of this.excludePatterns)if(o.test(s)||o.test(t))return!1;if(this.includePatterns.length===0)return!0;for(let o of this.includePatterns)if(o.test(s)||o.test(t))return!0;return!1}addWatchPath(e){this.watchPaths.includes(e)||(this.watchPaths.push(e),this.isWatching&&this.watchDirectory(e))}removeWatchPath(e){let t=this.watchPaths.indexOf(e);if(t>-1&&(this.watchPaths.splice(t,1),this.watchers.has(e)))try{this.watchers.get(e).close(),this.watchers.delete(e),w&&console.log(`Removed watch path: ${e}`)}catch(s){w&&console.error(`Error removing watch path ${e}:`,s.message)}}getStatus(){return{isWatching:this.isWatching,watchPaths:[...this.watchPaths],activeWatchers:this.watchers.size,pendingChanges:this.pendingChanges.size}}setFileChangeCallback(e){this.onFileChange=e}};Ae.exports=ee});var Ue=m((fs,qe)=>{var $t=j(),kt=require("path"),hs=require("fs"),gs=require("os"),Dt=Ee(),Pt=$e(),_t=_e(),Ot=Te(),Tt=Me(),y=process.env.CODEV_DEBUG==="True",te=class extends $t{constructor(){super({configDir:".",configFile:".claude.json",defaultModel:"Claude Sonnet 4.5",executablePaths:["cc.mjs","/tmp/claude-code/package/cc.mjs"],environmentVariables:e=>({ANTHROPIC_BASE_URL:`${e}/claude`,ANTHROPIC_API_KEY:"codev",DISABLE_TELEMETRY:!0,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:!0,DISABLE_COST_WARNINGS:!0,DISABLE_NON_ESSENTIAL_MODEL_CALLS:!0,CODEV_SERVER:e,CLAUDE_CODE_ATTRIBUTION_HEADER:"0"}),defaultConfig:{numStartups:1,installMethod:"unknown",autoUpdates:!1,theme:"Coder Dark",customApiKeyResponses:{approved:["codev"]},shiftEnterKeyBindingInstalled:!0,hasCompletedOnboarding:!0,subscriptionNoticeCount:0,hasAvailableSubscription:!0,projects:{}}}),this.fileWatchService=null,this.shutdownInProgress=!1,this.initializeServices()}initializeServices(){this.httpClient=new Pt({timeout:1e4}),this.authService=new _t({validateCredentials:!1}),this.sessionManager=new Ot({onSessionSwitch:e=>{this.sendTerminationMessage(e)}}),this.messageQueue=new Dt({maxRetries:2,retryDelay:500,shutdownTimeout:3e3,onProcessMessage:e=>this.processMessage(e)}),this.initializeFileWatchService()}resloveSettingFilePath(e){return kt.join(e,this.config.configDir,".claude","settings.json")}initializeFileWatchService(){if(!process.env.SESSION_ID){y&&console.log("FileWatchService disabled: SESSION_ID environment variable not found");return}try{this.fileWatchService=new Tt({watchPaths:this.getFileWatchPaths(),onFileChange:e=>this.handleFileChange(e),debounceTimeout:300}),y&&console.log("FileWatchService initialized with SESSION_ID:",process.env.SESSION_ID)}catch(e){y&&console.error("Failed to initialize FileWatchService:",e.message)}}getFileWatchPaths(){let e=[],t=process.cwd();e.push(t);let s=process.env.CODEV_WATCH_PATHS;if(s){let o=s.split(",").map(n=>n.trim());e.push(...o)}return e}handleFileChange(e){if(y&&console.log("File change detected:",e.data.relativePath),this.shutdownInProgress)return;let t={message:e,sessionId:e.data.sessionId||process.env.SESSION_ID};this.messageQueue.enqueue(t)}startFileWatching(){this.fileWatchService&&!this.fileWatchService.isWatching&&(this.fileWatchService.startWatching(),y&&console.log("File watching started"))}stopFileWatching(){this.fileWatchService&&this.fileWatchService.isWatching&&(this.fileWatchService.stopWatching(),y&&console.log("File watching stopped"))}onChildMessage(e){e&&e.type==="claude:send-msg"&&this.handleClaudeSendMessage(e.data),super.onChildMessage(e)}handleClaudeSendMessage(e){if(y&&console.log("Handling claude:send-msg message:",e),!e||typeof e!="object"){console.error(`handleClaudeSendMessage: Invalid message data. Expected object, got: ${typeof e}`);return}if(this.shutdownInProgress){y&&console.log("Shutdown in progress, ignoring new message");return}let t=e.sessionId||process.env.SESSION_ID;this.sessionManager.handleSessionSwitch(t),this.messageQueue.enqueue(e)}async processMessage(e){let t=e.data.message,s=e.data.sessionId||process.env.SESSION_ID;if(!s)throw new Error("No session ID available");let o;try{o=typeof t=="string"?JSON.parse(t):t}catch(i){throw new Error(`Failed to parse message data: ${i.message}`)}let n=`/conversations/${s}/@append?task_type=codev`,r=this.authService.hasCredentials()?this.authService.generateAuthHeaders(`${this.httpClient.baseUrl}${n}`,o):{};y&&(console.debug("Sending message to:",n),console.debug("Send Message: ",JSON.stringify(o))),e.type!=="CODEV_TERMINATE_SIGNAL"&&(this.sessionManager.currentSessionId=s)}sendTerminationMessage(e){let t={message:e,sessionId:e.sessionId||this.sessionManager.getCurrentSessionId()};this.messageQueue.enqueue(t)}async handleChildProcessExit(e,t){y&&console.log(`Child process exited with code: ${e}, signal: ${t}`),this.stopFileWatching();let s=this.messageQueue.getQueueSize(),o=this.sessionManager.terminateCurrentSession("process exited normally",e,t);if(o&&this.sendTerminationMessage(o),s>0||o){y&&console.log("Starting graceful shutdown of message queue...");try{let n=!t||t==="SIGTERM",r=this.messageQueue.getQueueSize(),i={timeoutMs:n?8e3:3e3,batchSize:Math.min(r,15),fastMode:!n||r>30};y&&console.log("Shutdown options:",i);let a=await this.messageQueue.gracefulShutdown(i);y&&console.log("Message queue shutdown completed:",a),a.failedMessages>0&&y&&console.warn(`Shutdown summary: ${a.processedMessages} sent, ${a.failedMessages} failed, ${a.remainingMessages} remaining`)}catch(n){y&&console.error("Error during message queue shutdown:",n.message)}}}handleChildProcessError(e){y&&console.error(`Child process error: ${e.message}`);let t=this.sessionManager.createErrorTermination(e);t&&this.sendTerminationMessage(t)}async forceFlushMessages(e=3e3){if(this.messageQueue.getQueueSize()===0)return{success:!0,message:"No messages to flush"};y&&console.log(`Force flushing ${this.messageQueue.getQueueSize()} messages...`);try{return await this.messageQueue.forceFlushAndShutdown(e)}catch(t){return y&&console.error("Force flush failed:",t.message),{success:!1,error:t.message}}}async launch(e={}){let{codevServer:t,auth_ak:s=null,auth_sk:o=null}=e;return this.httpClient.setBaseUrl(t),s&&o&&this.authService.setCredentials(s,o),this.startFileWatching(),super.launch(e)}};qe.exports=te});var Be=m((ms,Fe)=>{var At=j(),ps=require("path"),se=class extends At{constructor(){super({configDir:".gemini",configFile:"settings.json",defaultModel:"gemini-2.5-pro",executablePaths:["gemini/gemini.js","../dist/gemini/gemini.js"],environmentVariables:e=>({GOOGLE_GEMINI_BASE_URL:`${e}/gemini`,GEMINI_API_KEY:"coder",GOOGLE_API_KEY:"coder",GOOGLE_CLOUD_PROJECT:"coder",GOOGLE_CLOUD_LOCATION:"coder",DISABLE_TELEMETRY:!0,GEMINI_CODE_DISABLE_NONESSENTIAL_TRAFFIC:!0,DISABLE_COST_WARNINGS:!0,DISABLE_NON_ESSENTIAL_MODEL_CALLS:!0,USE_VERTEX:!0}),defaultConfig:{ide:{hasSeenNudge:!0},telemetry:{enabled:!1,logPrompts:!1},privacy:{usageStatisticsEnabled:!1},general:{disableUpdateNag:!0,preferredEditor:"vscode",previewFeatures:!0},ui:{hideBanner:!0,theme:"Default"},security:{auth:{selectedType:"vertex-ai"}}}})}};Fe.exports=se});var Ne=m((ys,Le)=>{var Mt=j(),F=require("path"),$=require("fs"),qt=require("os"),{spawn:Ut}=require("child_process"),R=process.env.CODEV_DEBUG==="True",oe=class extends Mt{constructor(){super({configDir:".codex",configFile:"config.toml",defaultModel:"o4-mini",executablePaths:["codex.mjs","../dist/codex.mjs"],environmentVariables:e=>({OPENAI_BASE_URL:`${e}/codex`,OPENAI_API_KEY:"codev-proxy-key",DEBUG:R?"true":"false",CODEX_QUIET_MODE:"0",OPENAI_DISABLE_TELEMETRY:"true",CODEX_DISABLE_PROJECT_DOC:"0",CODEV_SERVER:e}),defaultConfig:{model:"gpt-5-codex",approvalMode:"suggest",fullAutoErrorMode:"ask-user",notify:[],history:{maxSize:1e3,saveHistory:!0,sensitivePatterns:[],persistence:"save-all"}}})}checkCodexAvailability(){try{let e=this.findExecutablePath();return $.existsSync(e)}catch{return!1}}resloveSettingFilePath(e){return F.join(e,this.config.configDir,"config.toml")}async ensureConfig(e,t=0){let s=F.join(qt.homedir(),this.config.configDir,this.config.configFile),o=F.dirname(s);try{$.existsSync(o)||$.mkdirSync(o,{recursive:!0});let n=`${e}/codex`;if($.existsSync(s)){let r=$.readFileSync(s,"utf8"),i=`openai_base_url = "${n}"`;/^openai_base_url\s*=/m.test(r)?r=r.replace(/^openai_base_url\s*=.*/m,i):r=r.trimEnd()+`
193
+ Terminating ...`),d.kill("SIGTERM"),setTimeout(()=>{d.killed||d.kill("SIGKILL")},8e3)})})}catch(n){throw n}}};Ie.exports=Q});var xe=m((us,$e)=>{var f=process.env.CODEV_DEBUG==="True",Y=class{constructor(e={}){this.queue=[],this.processing=!1,this.shuttingDown=!1,this.shutdownTimeout=e.shutdownTimeout||5e3,this.maxRetries=e.maxRetries||3,this.retryDelay=e.retryDelay||1e3,this.onProcessMessage=e.onProcessMessage||null,this.shutdownPromise=null,this.currentlyProcessing=null}enqueue(e){if(this.shuttingDown)return f&&console.log("Queue is shutting down, skipping new messages"),null;let t={id:Date.now()+Math.random(),data:e,timestamp:Date.now(),retryCount:0,processing:!1};return this.queue.push(t),f&&console.log(`Message enqueued, queue length: ${this.queue.length}`),this.processQueue(),t.id}dequeue(){let e=this.queue.shift();return f&&e&&console.log(`Message dequeued, remaining queue length: ${this.queue.length}`),e}removeById(e){let t=this.queue.findIndex(s=>s.id===e);return t>-1?(this.queue.splice(t,1),f&&console.log(`Message ${e} removed from queue`),!0):!1}async processQueue(){if(!(this.processing||this.queue.length===0)){this.processing=!0;try{for(;this.queue.length>0&&!this.shuttingDown;){let e=this.queue[0];e.processing=!0;try{this.onProcessMessage&&await this.onProcessMessage(e),this.dequeue()}catch(t){if(f&&console.error(`Failed to process message: ${t.message}`),e.retryCount++,f&&console.log("Start Retry:",e.retryCount,"times..."),e.retryCount>=this.maxRetries)f&&console.error("Message exceeded max retries, removing from queue"),this.dequeue();else{e.processing=!1;let s=this.shuttingDown?100:this.retryDelay*e.retryCount;await new Promise(o=>setTimeout(o,s))}}}}finally{this.processing=!1}}}getQueueSize(){return this.queue.length}clear(){this.queue=[],f&&console.log("Message queue cleared")}setMessageProcessor(e){this.onProcessMessage=e}async waitForProcessingMessages(e=5e3){let t=this.queue.filter(o=>o.processing);if(t.length===0)return;f&&console.log(`Waiting for ${t.length} processing messages to complete (timeout: ${e}ms)`);let s=Date.now();for(;Date.now()-s<e;){if(this.queue.filter(r=>r.processing).length===0){f&&console.log(`All processing messages completed in ${Date.now()-s}ms`);return}await new Promise(r=>setTimeout(r,50))}if(f){let o=this.queue.filter(r=>r.processing);console.log(`Timeout waiting for processing messages. ${o.length} messages still processing`)}}async gracefulShutdown(e={}){if(this.shutdownPromise)return this.shutdownPromise;let{timeoutMs:t=this.shutdownTimeout,batchSize:s=10,fastMode:o=!1}=e;return this.shutdownPromise=new Promise(async r=>{this.shuttingDown=!0,await this.waitForProcessingMessages(Math.min(t*.3,3e3));let n=this.queue.filter(g=>!g.processing),i=n.length;f&&(console.log(`Starting graceful shutdown with ${i} pending messages (${this.queue.length-i} already processing)`),console.log(`Mode: ${o?"fast (parallel)":"sequential"}, timeout: ${t}ms`));let a=Date.now(),c=0,l=0;try{if(o){let g=await this.processAllParallel(t-(Date.now()-a),n);c=g.processed,l=g.failed}else{let g=await this.processInBatches(s,t-(Date.now()-a),n);c=g.processed,l=g.failed}}catch(g){f&&console.error("Error during shutdown processing:",g.message)}let u=Date.now()-a,d=this.queue.length;f&&(console.log(`Shutdown completed in ${u}ms:`),console.log(` - Total: ${i} messages`),console.log(` - Processed: ${c}`),console.log(` - Failed: ${l}`),console.log(` - Remaining: ${d}`)),r({totalMessages:i,processedMessages:c,failedMessages:l,remainingMessages:d,duration:u,allMessagesSent:d===0&&l===0})}),this.shutdownPromise}async processAllParallel(e){if(this.queue.length===0)return{processed:0,failed:0};f&&console.log(`Processing ${this.queue.length} messages in parallel...`);let t=[...this.queue];this.queue=[];let s=t.map(async a=>{try{return this.onProcessMessage&&await this.onProcessMessage(a),{success:!0,messageId:a.id}}catch(c){return f&&console.warn(`Message ${a.id} processing failed: ${c.message}`),{success:!1,messageId:a.id,error:c}}}),o=new Promise(a=>{setTimeout(()=>a({timedOut:!0}),e)}),r=await Promise.race([Promise.allSettled(s).then(a=>({results:a})),o]);if(r.timedOut)return f&&console.log(`Parallel processing timed out after ${e}ms`),{processed:0,failed:t.length};let n=r.results.filter(a=>a.status==="fulfilled"&&a.value?.success).length,i=t.length-n;return{processed:n,failed:i}}async processInBatches(e,t){if(this.queue.length===0)return{processed:0,failed:0};f&&console.log(`Processing ${this.queue.length} messages in batches of ${e}...`);let s=Date.now(),o=0,r=0;for(;this.queue.length>0&&Date.now()-s<t;){let n=this.queue.splice(0,e),i=n.map(async u=>{try{return this.onProcessMessage&&await this.onProcessMessage(u),{success:!0}}catch(d){return f&&console.warn(`Batch message processing failed: ${d.message}`),{success:!1,error:d}}}),c=(await Promise.allSettled(i)).filter(u=>u.status==="fulfilled"&&u.value?.success).length,l=n.length-c;o+=c,r+=l,f&&n.length>0&&console.log(`Batch completed: ${c}/${n.length} successful`),this.queue.length>0&&await new Promise(u=>setTimeout(u,10))}return this.queue.length>0&&(r+=this.queue.length,f&&console.log(`${this.queue.length} messages not processed due to timeout`),this.queue=[]),{processed:o,failed:r}}async forceFlushAndShutdown(e=2e3){this.shuttingDown=!0,await this.waitForProcessingMessages(Math.min(e*.4,1e3));let t=this.queue.filter(a=>!a.processing);f&&console.log(`Force flush: attempting to send ${t.length} pending messages within ${e}ms (${this.queue.length-t.length} already processing)`);let s=Date.now(),o=t.map(async a=>{try{return this.onProcessMessage&&Date.now()-s<e?(await this.onProcessMessage(a),{success:!0,messageId:a.id}):{success:!1,messageId:a.id,reason:"timeout"}}catch(c){return{success:!1,messageId:a.id,error:c.message}}}),r=e-(Date.now()-s),n=new Promise(a=>{setTimeout(()=>a({timedOut:!0}),Math.max(100,r))}),i=await Promise.race([Promise.allSettled(o).then(a=>({results:a})),n]);if(t.forEach(a=>{let c=this.queue.findIndex(l=>l.id===a.id);c>-1&&this.queue.splice(c,1)}),this.processing=!1,i.timedOut)return f&&console.log(`Force flush timed out after ${e}ms`),{success:!1,reason:"timeout",attemptedCount:t.length};{let a=i.results.filter(c=>c.status==="fulfilled"&&c.value.success).length;return f&&console.log(`Force flush completed: ${a}/${t.length} messages sent`),{success:a===t.length,successCount:a,totalCount:t.length,results:i.results}}}forceShutdown(){this.shuttingDown=!0,this.queue=[],this.processing=!1,f&&console.log("Force shutdown: Queue cleared")}};$e.exports=Y});var q=m((ds,vt)=>{vt.exports={name:"makecoder",version:"2.0.93",description:"MakeCoder: Unified AI agent CLI tool integrating Claude Code, Codex and Gemini CLI",main:"./dist/coder.js",bin:{coder:"./dist/coder.js"},scripts:{test:'echo "Error: no test specified" && exit 1',start:"node ./src/coder.js",build:"node scripts/build.js","build:clean":"node scripts/build.js --clean","build:dev":"node scripts/build.js --no-minify --sourcemap",postinstall:"node scripts/postinstall.js"},keywords:["cli","ai","claude","gemini","codex","agent"],author:"makecoder",license:"MIT",repository:{type:"git",url:"https://github.com/makecoderai/coder.git"},homepage:"https://github.com/makecoderai/coder",dependencies:{"node-fetch":"^3.3.2",open:"^10.1.0",zod:"^3.25.76"},optionalDependencies:{"makecoder-codex-linux-x64":"*","makecoder-codex-darwin-arm64":"*","makecoder-codex-win32-x64":"*"},engines:{node:">=20.0.0"},devDependencies:{chokidar:"^4.0.3"},files:["dist","claude","scripts/postinstall.js"]}});var _e=m((hs,ke)=>{var bt=require("http"),It=require("https"),{URL:De}=require("url"),{version:$t}=q(),Pe=process.env.CODEV_DEBUG==="True",Z=class{constructor(e={}){this.baseUrl=e.baseUrl||"",this.timeout=e.timeout||3e4,this.defaultHeaders={"Content-Type":"application/json","User-Agent":`codev-cli/${$t}`,...e.headers}}setBaseUrl(e){this.baseUrl=e}setDefaultHeaders(e){this.defaultHeaders={...this.defaultHeaders,...e}}async post(e,t,s={}){let o=this.resolveUrl(e),r={...this.defaultHeaders,...s.headers};return new Promise((n,i)=>{this.validateRequest(o,t,i);let a=this.serializeData(t,i);if(!a)return;r["Content-Length"]=Buffer.byteLength(a);let c=this.buildRequestOptions(o,"POST",r),l=this.getHttpModule(o);Pe&&console.debug(`HTTP POST to ${o} with data length: ${a.length}`);let u=l.request(c,d=>{this.handleResponse(d,n,i)});this.attachErrorHandlers(u,o,i),u.setTimeout(this.timeout),u.write(a),u.end()})}resolveUrl(e){return e.startsWith("http")?e:`${this.baseUrl}${e.startsWith("/")?"":"/"}${e}`}validateRequest(e,t,s){return!e||typeof e!="string"?(s(new Error(`Invalid URL: ${e}`)),!1):t?!0:(s(new Error("No data provided for HTTP POST")),!1)}serializeData(e,t){try{return typeof e=="string"?e:JSON.stringify(e)}catch(s){return t(new Error(`Failed to serialize data: ${s.message}`)),null}}buildRequestOptions(e,t,s){let o=new De(e),r=o.protocol==="https:";return{hostname:o.hostname,port:o.port||(r?443:80),path:o.pathname+o.search,method:t,headers:s}}getHttpModule(e){return new De(e).protocol==="https:"?It:bt}handleResponse(e,t,s){Pe&&console.debug(`HTTP response status: ${e.statusCode}`);let o="";e.on("data",r=>{o+=r}),e.on("end",()=>{e.statusCode>=200&&e.statusCode<300?t({statusCode:e.statusCode,data:o,headers:e.headers}):s(new Error(`HTTP request returned status ${e.statusCode}: ${o}`))})}attachErrorHandlers(e,t,s){e.on("error",o=>{s(new Error(`HTTP POST request failed: ${o.message}`))}),e.on("timeout",()=>{s(new Error(`HTTP POST request timed out for URL: ${t}`)),e.destroy()})}};ke.exports=Z});var Te=m((gs,Oe)=>{var xt=require("crypto"),{URL:Dt}=require("url"),X=class{static generateSignature(e,t,s,o){try{let r=new Dt(e),n=Buffer.from(r.pathname),i=Buffer.from(n),a=t?typeof t=="string"?Buffer.from(t):Buffer.from(JSON.stringify(t)):Buffer.alloc(0),c=Buffer.concat([i,a,Buffer.from(o)]),l=xt.createHmac("sha256",s);return l.update(c),l.digest("hex")}catch(r){throw new Error(`Failed to generate signature: ${r.message}`)}}static validateSignature(e,t,s,o,r){return this.generateSignature(e,t,s,o)===r}static generateTimestamp(){return Date.now().toString()}};Oe.exports=X});var Me=m((ps,Ae)=>{var Pt=Te(),ee=class{constructor(e={}){this.accessKey=null,this.secretKey=null,this.validateCredentials=e.validateCredentials!==!1}setCredentials(e,t){if(this.validateCredentials&&(!e||!t))throw new Error("Both access key and secret key are required");this.accessKey=e,this.secretKey=t}hasCredentials(){return!!(this.accessKey&&this.secretKey)}generateAuthHeaders(e,t=null){if(!this.hasCredentials())return{};try{return{AUTHORIZATION:`Bearer ${this.accessKey}.${this.secretKey}`}}catch(s){throw new Error(`Failed to generate auth headers: ${s.message}`)}}validateAuthHeaders(e,t,s,o){if(!this.hasCredentials())throw new Error("No credentials available for validation");return Pt.validateSignature(e,t,this.secretKey,s,o)}clearCredentials(){this.accessKey=null,this.secretKey=null}getCredentials(){return{accessKey:this.accessKey,hasCredentials:this.hasCredentials()}}};Ae.exports=ee});var Fe=m((fs,qe)=>{var F=process.env.CODEV_DEBUG==="True",te=class{constructor(e={}){this.currentSessionId=null,this.previousSessionId=null,this.onSessionSwitch=e.onSessionSwitch||null,this.terminateSignal=e.terminateSignal||"CODEV_TERMINATE_SIGNAL"}handleSessionSwitch(e){if(!e)return F&&console.warn("Received empty session ID"),!1;let t=this.previousSessionId!==null&&this.previousSessionId!==e;return t&&(F&&console.log(`Session switch detected: ${this.previousSessionId} -> ${e}`),this.onSessionSwitch&&this.onSessionSwitch({type:this.terminateSignal,reason:"User switch session",agent:"claude",previousSessionId:this.previousSessionId,newSessionId:e})),this.previousSessionId=this.currentSessionId,this.currentSessionId=e,t}getCurrentSessionId(){return this.currentSessionId}getPreviousSessionId(){return this.previousSessionId}hasActiveSession(){return!!this.currentSessionId}terminateCurrentSession(e="Session terminated",t=null,s=null){if(!this.hasActiveSession())return F&&console.log("No active session to terminate"),null;let o={type:this.terminateSignal,reason:s?`terminated by signal: ${s}`:e,code:t,signal:s,timestamp:Date.now(),agent:"claude",sessionId:this.currentSessionId};return F&&console.log("Terminating session:",o),this.previousSessionId=null,this.currentSessionId=null,o}createErrorTermination(e){return this.hasActiveSession()?{type:this.terminateSignal,error:e.message,stack:e.stack,timestamp:Date.now(),agent:"claude",sessionId:this.currentSessionId}:null}reset(){F&&console.log("Resetting session manager"),this.currentSessionId=null,this.previousSessionId=null}setSessionSwitchCallback(e){this.onSessionSwitch=e}getSessionInfo(){return{currentSessionId:this.currentSessionId,previousSessionId:this.previousSessionId,hasActiveSession:this.hasActiveSession()}}};qe.exports=te});var Ne=m((ms,Ue)=>{var _=require("fs"),T=require("path"),kt=require("events"),_t=require("crypto"),S=process.env.CODEV_DEBUG==="True",se=class extends kt{constructor(e={}){super(),this.watchPaths=e.watchPaths||[],this.excludePatterns=e.excludePatterns||[/node_modules/,/\.git/,/\.DS_Store/,/\.tmp/,/\.log$/,/\.swp$/,/codev\.log/],this.includePatterns=e.includePatterns||[/\.(js|jsx|ts|tsx|py|java|c|cpp|h|hpp|go|rs|rb|php|html|css|scss|sass|less|json|xml|yaml|yml|md|txt)$/],this.watchers=new Map,this.isWatching=!1,this.debounceTimeout=e.debounceTimeout||300,this.pendingChanges=new Map,this.fileContentHashes=new Map,this.enableContentComparison=e.enableContentComparison!==!1,this.onFileChange=e.onFileChange||null}calculateFileHash(e){try{let t=_.readFileSync(e,"utf8");return _t.createHash("sha256").update(t).digest("hex")}catch{return null}}hasContentChanged(e){if(!this.enableContentComparison)return!0;let t=this.calculateFileHash(e),s=this.fileContentHashes.get(e);return t===null?s!==void 0?(this.fileContentHashes.delete(e),!0):!1:s===void 0||t!==s?(this.fileContentHashes.set(e,t),!0):!1}preloadFileHashes(e){if(!(!this.enableContentComparison||!_.existsSync(e)))try{let t=_.readdirSync(e,{withFileTypes:!0});for(let s of t){let o=T.join(e,s.name);s.isFile()&&this.shouldWatchFile(o)?(this.calculateFileHash(o),this.fileContentHashes.set(o,this.calculateFileHash(o))):s.isDirectory()&&!this.shouldExcludeDirectory(o)&&this.preloadFileHashes(o)}}catch(t){S&&console.warn(`Failed to preload hashes for ${e}:`,t.message)}}shouldExcludeDirectory(e){let t=e.replace(/\\/g,"/");for(let s of this.excludePatterns)if(s.test(t)||s.test(T.basename(e)))return!0;return!1}startWatching(e=null){if(this.isWatching){S&&console.log("FileWatchService is already watching");return}let t=e||this.watchPaths;if(t.length===0){S&&console.log("No watch paths specified");return}this.isWatching=!0;for(let s of t)this.enableContentComparison&&this.preloadFileHashes(s),this.watchDirectory(s);S&&(console.log(`FileWatchService started watching ${t.length} paths`),this.enableContentComparison&&console.log(`Preloaded hashes for ${this.fileContentHashes.size} files`))}stopWatching(){if(this.isWatching){this.isWatching=!1;for(let[e,t]of this.watchers)try{t.close(),S&&console.log(`Stopped watching: ${e}`)}catch(s){S&&console.error(`Error stopping watcher for ${e}:`,s.message)}this.watchers.clear(),this.pendingChanges.clear(),this.fileContentHashes.clear(),S&&console.log("FileWatchService stopped watching all paths")}}watchDirectory(e){if(!_.existsSync(e)){S&&console.warn(`Watch path does not exist: ${e}`);return}if(!_.statSync(e).isDirectory()){S&&console.warn(`Watch path is not a directory: ${e}`);return}try{let s=_.watch(e,{recursive:!0,persistent:!1},(o,r)=>{if(!r)return;let n=T.join(e,r);this.handleFileChange(o,n,e)});this.watchers.set(e,s),S&&console.log(`Started watching directory: ${e}`),s.on("error",o=>{S&&console.error(`Watcher error for ${e}:`,o.message),this.watchers.delete(e)})}catch(s){S&&console.error(`Failed to start watching ${e}:`,s.message)}}handleFileChange(e,t,s){if(!this.shouldWatchFile(t))return;let o=`${e}:${t}`;this.pendingChanges.has(o)&&clearTimeout(this.pendingChanges.get(o)),this.pendingChanges.set(o,setTimeout(()=>{this.pendingChanges.delete(o),this.processFileChange(e,t,s)},this.debounceTimeout))}processFileChange(e,t,s){if(!this.isWatching)return;let o="modified",r=!1;try{_.statSync(t),r=!0,e==="rename"?o="created":e==="change"&&(o="modified")}catch{e==="rename"&&(o="deleted")}if(r&&(o==="modified"||o==="created")&&!this.hasContentChanged(t)){S&&console.log(`Ignoring false change for: ${T.relative(s,t)}`);return}!r&&o==="deleted"&&this.fileContentHashes.delete(t);let n={type:"CODEV_FILE_CHANGE_DETECTTED",data:{eventType:e,changeType:o,filePath:t,relativePath:T.relative(s,t),watchPath:s,fileExists:r,timestamp:Date.now(),sessionId:process.env.SESSION_ID||"default"}};if(S&&console.log(`File ${o}: ${n.data.relativePath}`),this.emit("fileChange",n),this.onFileChange&&typeof this.onFileChange=="function")try{this.onFileChange(n)}catch(i){S&&console.error("Error in file change callback:",i.message)}}shouldWatchFile(e){let t=T.basename(e),s=e.replace(/\\/g,"/");for(let o of this.excludePatterns)if(o.test(s)||o.test(t))return!1;if(this.includePatterns.length===0)return!0;for(let o of this.includePatterns)if(o.test(s)||o.test(t))return!0;return!1}addWatchPath(e){this.watchPaths.includes(e)||(this.watchPaths.push(e),this.isWatching&&this.watchDirectory(e))}removeWatchPath(e){let t=this.watchPaths.indexOf(e);if(t>-1&&(this.watchPaths.splice(t,1),this.watchers.has(e)))try{this.watchers.get(e).close(),this.watchers.delete(e),S&&console.log(`Removed watch path: ${e}`)}catch(s){S&&console.error(`Error removing watch path ${e}:`,s.message)}}getStatus(){return{isWatching:this.isWatching,watchPaths:[...this.watchPaths],activeWatchers:this.watchers.size,pendingChanges:this.pendingChanges.size}}setFileChangeCallback(e){this.onFileChange=e}};Ue.exports=se});var Le=m((Ss,Be)=>{var Ot=H(),Tt=require("path"),ys=require("fs"),ws=require("os"),At=xe(),Mt=_e(),qt=Me(),Ft=Fe(),Ut=Ne(),w=process.env.CODEV_DEBUG==="True",oe=class extends Ot{constructor(){super({configDir:".",configFile:".claude.json",defaultModel:"Claude Sonnet 4.5",executablePaths:["cc.mjs","/tmp/claude-code/package/cc.mjs"],environmentVariables:e=>({ANTHROPIC_BASE_URL:`${e}/claude`,ANTHROPIC_API_KEY:"codev",DISABLE_TELEMETRY:!0,CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:!0,DISABLE_COST_WARNINGS:!0,DISABLE_NON_ESSENTIAL_MODEL_CALLS:!0,CODEV_SERVER:e,CLAUDE_CODE_ATTRIBUTION_HEADER:"0"}),defaultConfig:{numStartups:1,installMethod:"unknown",autoUpdates:!1,theme:"Coder Dark",customApiKeyResponses:{approved:["codev"]},shiftEnterKeyBindingInstalled:!0,hasCompletedOnboarding:!0,subscriptionNoticeCount:0,hasAvailableSubscription:!0,projects:{}}}),this.fileWatchService=null,this.shutdownInProgress=!1,this.initializeServices()}initializeServices(){this.httpClient=new Mt({timeout:1e4}),this.authService=new qt({validateCredentials:!1}),this.sessionManager=new Ft({onSessionSwitch:e=>{this.sendTerminationMessage(e)}}),this.messageQueue=new At({maxRetries:2,retryDelay:500,shutdownTimeout:3e3,onProcessMessage:e=>this.processMessage(e)}),this.initializeFileWatchService()}resloveSettingFilePath(e){return Tt.join(e,this.config.configDir,".claude","settings.json")}initializeFileWatchService(){if(!process.env.SESSION_ID){w&&console.log("FileWatchService disabled: SESSION_ID environment variable not found");return}try{this.fileWatchService=new Ut({watchPaths:this.getFileWatchPaths(),onFileChange:e=>this.handleFileChange(e),debounceTimeout:300}),w&&console.log("FileWatchService initialized with SESSION_ID:",process.env.SESSION_ID)}catch(e){w&&console.error("Failed to initialize FileWatchService:",e.message)}}getFileWatchPaths(){let e=[],t=process.cwd();e.push(t);let s=process.env.CODEV_WATCH_PATHS;if(s){let o=s.split(",").map(r=>r.trim());e.push(...o)}return e}handleFileChange(e){if(w&&console.log("File change detected:",e.data.relativePath),this.shutdownInProgress)return;let t={message:e,sessionId:e.data.sessionId||process.env.SESSION_ID};this.messageQueue.enqueue(t)}startFileWatching(){this.fileWatchService&&!this.fileWatchService.isWatching&&(this.fileWatchService.startWatching(),w&&console.log("File watching started"))}stopFileWatching(){this.fileWatchService&&this.fileWatchService.isWatching&&(this.fileWatchService.stopWatching(),w&&console.log("File watching stopped"))}onChildMessage(e){e&&e.type==="claude:send-msg"&&this.handleClaudeSendMessage(e.data),super.onChildMessage(e)}handleClaudeSendMessage(e){if(w&&console.log("Handling claude:send-msg message:",e),!e||typeof e!="object"){console.error(`handleClaudeSendMessage: Invalid message data. Expected object, got: ${typeof e}`);return}if(this.shutdownInProgress){w&&console.log("Shutdown in progress, ignoring new message");return}let t=e.sessionId||process.env.SESSION_ID;this.sessionManager.handleSessionSwitch(t),this.messageQueue.enqueue(e)}async processMessage(e){let t=e.data.message,s=e.data.sessionId||process.env.SESSION_ID;if(!s)throw new Error("No session ID available");let o;try{o=typeof t=="string"?JSON.parse(t):t}catch(i){throw new Error(`Failed to parse message data: ${i.message}`)}let r=`/conversations/${s}/@append?task_type=codev`,n=this.authService.hasCredentials()?this.authService.generateAuthHeaders(`${this.httpClient.baseUrl}${r}`,o):{};w&&(console.debug("Sending message to:",r),console.debug("Send Message: ",JSON.stringify(o))),e.type!=="CODEV_TERMINATE_SIGNAL"&&(this.sessionManager.currentSessionId=s)}sendTerminationMessage(e){let t={message:e,sessionId:e.sessionId||this.sessionManager.getCurrentSessionId()};this.messageQueue.enqueue(t)}async handleChildProcessExit(e,t){w&&console.log(`Child process exited with code: ${e}, signal: ${t}`),this.stopFileWatching();let s=this.messageQueue.getQueueSize(),o=this.sessionManager.terminateCurrentSession("process exited normally",e,t);if(o&&this.sendTerminationMessage(o),s>0||o){w&&console.log("Starting graceful shutdown of message queue...");try{let r=!t||t==="SIGTERM",n=this.messageQueue.getQueueSize(),i={timeoutMs:r?8e3:3e3,batchSize:Math.min(n,15),fastMode:!r||n>30};w&&console.log("Shutdown options:",i);let a=await this.messageQueue.gracefulShutdown(i);w&&console.log("Message queue shutdown completed:",a),a.failedMessages>0&&w&&console.warn(`Shutdown summary: ${a.processedMessages} sent, ${a.failedMessages} failed, ${a.remainingMessages} remaining`)}catch(r){w&&console.error("Error during message queue shutdown:",r.message)}}}handleChildProcessError(e){w&&console.error(`Child process error: ${e.message}`);let t=this.sessionManager.createErrorTermination(e);t&&this.sendTerminationMessage(t)}async forceFlushMessages(e=3e3){if(this.messageQueue.getQueueSize()===0)return{success:!0,message:"No messages to flush"};w&&console.log(`Force flushing ${this.messageQueue.getQueueSize()} messages...`);try{return await this.messageQueue.forceFlushAndShutdown(e)}catch(t){return w&&console.error("Force flush failed:",t.message),{success:!1,error:t.message}}}async launch(e={}){let{codevServer:t,auth_ak:s=null,auth_sk:o=null}=e;return this.httpClient.setBaseUrl(t),s&&o&&this.authService.setCredentials(s,o),this.startFileWatching(),super.launch(e)}};Be.exports=oe});var Re=m((Es,je)=>{var Nt=H(),Cs=require("path"),ne=class extends Nt{constructor(){super({configDir:".gemini",configFile:"settings.json",defaultModel:"gemini-2.5-pro",executablePaths:["gemini/gemini.js","../dist/gemini/gemini.js"],environmentVariables:e=>({GOOGLE_GEMINI_BASE_URL:`${e}/gemini`,GEMINI_API_KEY:"coder",GOOGLE_API_KEY:"coder",GOOGLE_CLOUD_PROJECT:"coder",GOOGLE_CLOUD_LOCATION:"coder",DISABLE_TELEMETRY:!0,GEMINI_CODE_DISABLE_NONESSENTIAL_TRAFFIC:!0,DISABLE_COST_WARNINGS:!0,DISABLE_NON_ESSENTIAL_MODEL_CALLS:!0,USE_VERTEX:!0}),defaultConfig:{ide:{hasSeenNudge:!0},telemetry:{enabled:!1,logPrompts:!1},privacy:{usageStatisticsEnabled:!1},general:{disableUpdateNag:!0,preferredEditor:"vscode",previewFeatures:!0},ui:{hideBanner:!0,theme:"Default"},security:{auth:{selectedType:"vertex-ai"}}}})}};je.exports=ne});var Ge=m((vs,He)=>{var Bt=H(),U=require("path"),x=require("fs"),Lt=require("os"),{spawn:jt}=require("child_process"),G=process.env.CODEV_DEBUG==="True",re=class extends Bt{constructor(){super({configDir:".codex",configFile:"config.toml",defaultModel:"o4-mini",executablePaths:["codex.mjs","../dist/codex.mjs"],environmentVariables:e=>({OPENAI_BASE_URL:`${e}/codex`,OPENAI_API_KEY:"codev-proxy-key",DEBUG:G?"true":"false",CODEX_QUIET_MODE:"0",OPENAI_DISABLE_TELEMETRY:"true",CODEX_DISABLE_PROJECT_DOC:"0",CODEV_SERVER:e}),defaultConfig:{model:"gpt-5-codex",approvalMode:"suggest",fullAutoErrorMode:"ask-user",notify:[],history:{maxSize:1e3,saveHistory:!0,sensitivePatterns:[],persistence:"save-all"}}})}checkCodexAvailability(){try{let e=this.findExecutablePath();return x.existsSync(e)}catch{return!1}}resloveSettingFilePath(e){return U.join(e,this.config.configDir,"config.toml")}async ensureConfig(e,t=0){let s=U.join(Lt.homedir(),this.config.configDir,this.config.configFile),o=U.dirname(s);try{x.existsSync(o)||x.mkdirSync(o,{recursive:!0});let r=`${e}/codex`;if(x.existsSync(s)){let n=x.readFileSync(s,"utf8"),i=`openai_base_url = "${r}"`;/^openai_base_url\s*=/m.test(n)?n=n.replace(/^openai_base_url\s*=.*/m,i):n=n.trimEnd()+`
197
194
  `+i+`
198
- `,$.writeFileSync(s,r),R&&console.log(`Updated openai_base_url in ${s}`)}else{let r=this.config.defaultConfig||{},i=this.generateTOMLConfig(r,n);$.writeFileSync(s,i),R&&console.log(`Created Codex config file: ${s}`)}t>0&&await new Promise(r=>setTimeout(r,t))}catch(n){console.warn(`Failed to update ${this.config.configFile}: ${n.message}`)}}generateTOMLConfig(e,t){return`model = "${e.model||"gpt-5-codex"}"
195
+ `,x.writeFileSync(s,n),G&&console.log(`Updated openai_base_url in ${s}`)}else{let n=this.config.defaultConfig||{},i=this.generateTOMLConfig(n,r);x.writeFileSync(s,i),G&&console.log(`Created Codex config file: ${s}`)}t>0&&await new Promise(n=>setTimeout(n,t))}catch(r){console.warn(`Failed to update ${this.config.configFile}: ${r.message}`)}}generateTOMLConfig(e,t){return`model = "${e.model||"gpt-5-codex"}"
199
196
  openai_base_url = "${t}"
200
- `}findExecutablePath(){let e=F.dirname(require.main.filename);for(let t of this.config.executablePaths){let s=F.resolve(e,t);if($.existsSync(s))return s}throw new Error(`Could not find Codex executable in any of the configured paths: ${this.config.executablePaths.join(", ")}`)}async launch(e={}){let{remainingArgs:t=[],codevServer:s,auth_ak:o=null,auth_sk:n=null}=e;try{if(!this.checkCodexAvailability())throw new Error("Codex executable not found. Please ensure makecoder is properly installed: npm install -g makecoder@latest");await this.ensureConfig(s,1e3);let r=this.findExecutablePath();return R&&console.log(`executablePath: ${r}`),new Promise((i,a)=>{let c={...process.env,...this.config.environmentVariables(s)};o&&(c.CODEV_AUTH_AK=o),n&&(c.CODEV_AUTH_SK=n);let l=["--no-warnings"];process.env.CODEV_INSPECT_BRK==="True"&&l.push("--inspect-brk"),l.push(r,...t);let u=Ut("node",l,{env:c,stdio:["inherit","inherit","inherit","ipc"]});this.handleChildMessages(u),u.on("error",d=>{console.error(`Failed to start Codex: ${d.message}`),a(d)}),u.on("exit",async(d,g)=>{console.log(g?`terminated by signal: ${g}`:"Goodbye for now! Keep building great things!")}),process.on("SIGINT",async()=>{console.log(`
197
+ `}findExecutablePath(){let e=U.dirname(require.main.filename);for(let t of this.config.executablePaths){let s=U.resolve(e,t);if(x.existsSync(s))return s}throw new Error(`Could not find Codex executable in any of the configured paths: ${this.config.executablePaths.join(", ")}`)}async launch(e={}){let{remainingArgs:t=[],codevServer:s,auth_ak:o=null,auth_sk:r=null}=e;try{if(!this.checkCodexAvailability())throw new Error("Codex executable not found. Please ensure makecoder is properly installed: npm install -g makecoder@latest");await this.ensureConfig(s,1e3);let n=this.findExecutablePath();return G&&console.log(`executablePath: ${n}`),new Promise((i,a)=>{let c={...process.env,...this.config.environmentVariables(s)};o&&(c.CODEV_AUTH_AK=o),r&&(c.CODEV_AUTH_SK=r);let l=["--no-warnings"];process.env.CODEV_INSPECT_BRK==="True"&&l.push("--inspect-brk"),l.push(n,...t);let u=jt("node",l,{env:c,stdio:["inherit","inherit","inherit","ipc"]});this.handleChildMessages(u),u.on("error",d=>{console.error(`Failed to start Codex: ${d.message}`),a(d)}),u.on("exit",async(d,g)=>{console.log(g?`terminated by signal: ${g}`:"Goodbye for now! Keep building great things!")}),process.on("SIGINT",async()=>{console.log(`
201
198
  Terminating ...`),u.kill("SIGTERM"),setTimeout(()=>{u.killed||u.kill("SIGKILL")},8e3)}),process.on("SIGTERM",async()=>{console.log(`
202
- Terminating ...`),u.kill("SIGTERM"),setTimeout(()=>{u.killed||u.kill("SIGKILL")},8e3)})})}catch(r){throw r}}};Le.exports=oe});var Ge=m((ws,He)=>{var B=require("fs"),je=require("path"),{spawn:Re}=require("child_process"),ne=class{constructor(){this.extensionId="codev.codev-background";let e=require.main?je.dirname(require.main.filename):__dirname;this.extensionPath=je.resolve(e,"vendor/claude-code.vsix"),this._codeCommand=null}async resolveCodeCommand(){if(this._codeCommand)return this._codeCommand;if(process.env.IS_AISTUDIO==="True"){let e="/usr/lib/aistudio/lib/vscode/bin/remote-cli/aistudio";if(B.existsSync(e))try{return B.accessSync(e,B.constants.F_OK|B.constants.X_OK),this._codeCommand=e,process.env.CODEV_DEBUG&&console.log(`Using AI Studio VSCode path: ${e}`),this._codeCommand}catch(t){process.env.CODEV_DEBUG&&console.log(`AI Studio path exists but not executable: ${t.message}`)}else process.env.CODEV_DEBUG&&console.log(`AI Studio path not found: ${e}`)}try{let{spawn:e}=require("child_process");return new Promise(t=>{let s=e("which",["code"],{stdio:["ignore","pipe","ignore"]}),o="";s.stdout.on("data",n=>{o+=n.toString().trim()}),s.on("close",n=>{n===0&&o?(this._codeCommand=o,process.env.CODEV_DEBUG&&console.log(`Resolved code command path: ${o}`),t(this._codeCommand)):(this._codeCommand="code",t(this._codeCommand))}),s.on("error",()=>{this._codeCommand="code",t(this._codeCommand)}),setTimeout(()=>{s.kill(),this._codeCommand="code",t(this._codeCommand)},3e3)})}catch{return this._codeCommand="code",this._codeCommand}}async shouldInstallExtension(){try{return process.env.IS_AISTUDIO!=="True"?(process.env.CODEV_DEBUG&&console.log("Not in AI Studio environment (IS_AISTUDIO!=True), skipping extension installation"),!1):await this.isVSCodeAvailable()?await this.isExtensionInstalled()?(process.env.CODEV_DEBUG&&console.log(`Extension ${this.extensionId} already installed`),!1):!!B.existsSync(this.extensionPath):(process.env.CODEV_DEBUG&&console.log("VSCode not available, skipping extension installation"),!1)}catch(e){return process.env.CODEV_DEBUG&&console.error(`Error checking extension installation status: ${e.message}`),!1}}async installExtension(){try{return console.log("Installing Codev VSCode extension..."),await this.executeVSCodeCommand(["--install-extension",this.extensionPath])?(console.log("\u2705 Codev VSCode extension installed successfully"),!0):(console.warn("\u274C Failed to install Codev VSCode extension"),!1)}catch(e){return console.warn(`Error installing VSCode extension: ${e.message}`),!1}}async isVSCodeAvailable(){try{let e=process.env.IS_AISTUDIO==="True"?["--help"]:["--version"],t=await this.executeVSCodeCommand(e,{timeout:1e4});if(process.env.CODEV_DEBUG&&(console.log(`VSCode availability check (${e.join(" ")}): ${t?"available":"unavailable"}`),process.env.IS_AISTUDIO==="True")){let{spawn:s}=require("child_process");try{s("which",["code"],{stdio:["ignore","pipe","ignore"]}).stdout.on("data",n=>{console.log("which code:",n.toString().trim())})}catch(o){console.log("which command failed:",o.message)}}return t}catch(e){return process.env.CODEV_DEBUG&&console.error("VSCode availability check error:",e.message),!1}}async isExtensionInstalled(){let e=await this.resolveCodeCommand();try{return new Promise(t=>{try{let s={stdio:["ignore","pipe","ignore"],shell:!1,env:{...process.env,PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER}};process.env.CODEV_DEBUG&&console.log(`Spawning: ${e} --list-extensions`);let o=Re(e,["--list-extensions"],s),n="";o.stdout.on("data",r=>{n+=r.toString()}),o.on("close",r=>{if(r===0){let i=n.split(`
203
- `).map(a=>a.trim());t(i.includes(this.extensionId))}else t(!1)}),o.on("error",r=>{process.env.CODEV_DEBUG&&(console.error("VSCode list extensions error:",r.message),console.error("Error code:",r.code),console.error("Error errno:",r.errno),console.error("Error syscall:",r.syscall)),t(!1)}),setTimeout(()=>{try{o.kill()}catch{}t(!1)},1e4)}catch(s){process.env.CODEV_DEBUG&&console.error("Failed to spawn VSCode list extensions:",s.message),t(!1)}})}catch{return!1}}async executeVSCodeCommand(e,t={}){let s=await this.resolveCodeCommand();return new Promise(o=>{try{let n={stdio:"ignore",shell:!1,env:{...process.env,PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER}};process.env.CODEV_DEBUG&&console.log(`Spawning: ${s} ${e.join(" ")}`);let r=Re(s,e,n);r.on("close",a=>{o(a===0)}),r.on("error",a=>{process.env.CODEV_DEBUG&&(console.error("VSCode command error:",a.message),console.error("Error code:",a.code),console.error("Error errno:",a.errno),console.error("Error syscall:",a.syscall)),o(!1)});let i=t.timeout||3e4;setTimeout(()=>{try{r.kill()}catch{}o(!1)},i)}catch(n){process.env.CODEV_DEBUG&&console.error("Failed to spawn VSCode command:",n.message),o(!1)}})}async ensureExtensionInstalled(){try{process.env.CODEV_DEBUG&&console.log("VSCode Extension Service: Checking extension status..."),await this.shouldInstallExtension()&&await this.installExtension()}catch(e){process.env.CODEV_DEBUG&&console.error("VSCode Extension Service Error:",e)}}};He.exports=ne});var We=m((Ss,Ke)=>{var E=require("fs"),T=require("path"),Ft=require("readline"),{execSync:H}=require("child_process"),Ve=require("os"),re=class{constructor(){this.serverUrl="https://makecoder.com/bigapis/codev/v1/coderpub"}getClaudeJsonlPath(e,t=!1){let s=e.replace(/[/_]/g,"-"),o=T.join(Ve.homedir(),".claude","projects",s);if(t&&(console.log(`
204
- \u{1F4C2} [allow-clone] \u67E5\u627E JSONL \u6587\u4EF6...`),console.log(` \u9879\u76EE\u76EE\u5F55: ${e}`),console.log(` Claude \u9879\u76EE\u540D: ${s}`),console.log(` Claude \u9879\u76EE\u76EE\u5F55: ${o}`)),!E.existsSync(o))return t&&console.log(" \u274C Claude \u9879\u76EE\u76EE\u5F55\u4E0D\u5B58\u5728"),null;t&&console.log(" \u2713 Claude \u9879\u76EE\u76EE\u5F55\u5B58\u5728");try{let n=E.readdirSync(o).filter(r=>r.endsWith(".jsonl")).map(r=>({name:r,path:T.join(o,r),mtime:E.statSync(T.join(o,r)).mtime,size:E.statSync(T.join(o,r)).size})).sort((r,i)=>i.mtime-r.mtime);return t&&(console.log(` \u627E\u5230 ${n.length} \u4E2A JSONL \u6587\u4EF6:`),n.forEach((r,i)=>{let a=(r.size/1024).toFixed(2),c=r.mtime.toLocaleString(),l=i===0?" <- \u6700\u65B0":"";console.log(` ${i+1}. ${r.name} (${a} KB, ${c})${l}`)})),n.length>0?(t&&console.log(` \u2713 \u9009\u62E9\u6700\u65B0\u6587\u4EF6: ${n[0].name}`),n[0].path):(t&&console.log(" \u274C \u76EE\u5F55\u4E2D\u6CA1\u6709 JSONL \u6587\u4EF6"),null)}catch(n){return t&&console.log(` \u274C \u8BFB\u53D6\u76EE\u5F55\u5931\u8D25: ${n.message}`),null}}async promptForName(){let e=Ft.createInterface({input:process.stdin,output:process.stdout});return new Promise((t,s)=>{e.question("\u8BF7\u8F93\u5165\u9879\u76EE\u540D\u79F0 (name): ",o=>{e.close();let n=o.trim();if(!n){s(new Error("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"));return}if(!/^[a-zA-Z0-9_-]+$/.test(n)){s(new Error("\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"));return}t(n)})})}async createZip(e,t={}){let{allowClone:s=!1}=t,o=Ve.tmpdir(),n=`coder-pub-${Date.now()}.zip`,r=T.join(o,n);try{let i=!1;if(E.existsSync(T.join(e,".git")))try{H(`git archive -o "${r}" HEAD`,{cwd:e,stdio:"pipe"}),console.log("\u{1F4E6} \u4F7F\u7528 git archive \u521B\u5EFA\u538B\u7F29\u5305\uFF08\u5DF2\u6392\u9664 .gitignore \u4E2D\u7684\u6587\u4EF6\uFF09"),i=!0}catch{console.log("\u26A0\uFE0F git archive \u5931\u8D25\uFF0C\u4F7F\u7528\u666E\u901A zip \u547D\u4EE4")}if(!i){let c=[".git/*","node_modules/*",".env",".env.*","*.log",".DS_Store"].map(l=>`-x "${l}"`).join(" ");H(`zip -r "${r}" . ${c}`,{cwd:e,stdio:"pipe"}),console.log("\u{1F4E6} \u5DF2\u521B\u5EFA\u538B\u7F29\u5305")}if(s){console.log(`
205
- \u{1F504} [allow-clone] \u5F00\u59CB\u5904\u7406 AI \u751F\u6210\u8BB0\u5F55...`);let a=this.getClaudeJsonlPath(e,!0);if(a){let c=T.join(o,"coder.pub.jsonl"),u=(E.statSync(a).size/1024).toFixed(2);console.log(`
206
- \u{1F4E6} [allow-clone] \u6253\u5305 JSONL \u6587\u4EF6...`),console.log(` \u6E90\u6587\u4EF6: ${a}`),console.log(` \u6587\u4EF6\u5927\u5C0F: ${u} KB`),console.log(` \u4E34\u65F6\u6587\u4EF6: ${c}`),E.copyFileSync(a,c),console.log(" \u2713 \u5DF2\u590D\u5236\u5230\u4E34\u65F6\u76EE\u5F55"),console.log(` \u76EE\u6807 ZIP: ${r}`),console.log(" \u76EE\u6807\u6587\u4EF6\u540D: coder.pub.jsonl"),H(`zip -j "${r}" "${c}"`,{stdio:"pipe"}),console.log(" \u2713 \u5DF2\u6DFB\u52A0\u5230 ZIP \u5305"),E.unlinkSync(c),console.log(" \u2713 \u5DF2\u6E05\u7406\u4E34\u65F6\u6587\u4EF6"),console.log(`\u{1F4CB} [allow-clone] AI \u751F\u6210\u8BB0\u5F55\u5904\u7406\u5B8C\u6210 (coder.pub.jsonl)
199
+ Terminating ...`),u.kill("SIGTERM"),setTimeout(()=>{u.killed||u.kill("SIGKILL")},8e3)})})}catch(n){throw n}}};He.exports=re});var We=m((bs,ze)=>{var N=require("fs"),Ve=require("path"),{spawn:Ke}=require("child_process"),ie=class{constructor(){this.extensionId="codev.codev-background";let e=require.main?Ve.dirname(require.main.filename):__dirname;this.extensionPath=Ve.resolve(e,"vendor/claude-code.vsix"),this._codeCommand=null}async resolveCodeCommand(){if(this._codeCommand)return this._codeCommand;if(process.env.IS_AISTUDIO==="True"){let e="/usr/lib/aistudio/lib/vscode/bin/remote-cli/aistudio";if(N.existsSync(e))try{return N.accessSync(e,N.constants.F_OK|N.constants.X_OK),this._codeCommand=e,process.env.CODEV_DEBUG&&console.log(`Using AI Studio VSCode path: ${e}`),this._codeCommand}catch(t){process.env.CODEV_DEBUG&&console.log(`AI Studio path exists but not executable: ${t.message}`)}else process.env.CODEV_DEBUG&&console.log(`AI Studio path not found: ${e}`)}try{let{spawn:e}=require("child_process");return new Promise(t=>{let s=e("which",["code"],{stdio:["ignore","pipe","ignore"]}),o="";s.stdout.on("data",r=>{o+=r.toString().trim()}),s.on("close",r=>{r===0&&o?(this._codeCommand=o,process.env.CODEV_DEBUG&&console.log(`Resolved code command path: ${o}`),t(this._codeCommand)):(this._codeCommand="code",t(this._codeCommand))}),s.on("error",()=>{this._codeCommand="code",t(this._codeCommand)}),setTimeout(()=>{s.kill(),this._codeCommand="code",t(this._codeCommand)},3e3)})}catch{return this._codeCommand="code",this._codeCommand}}async shouldInstallExtension(){try{return process.env.IS_AISTUDIO!=="True"?(process.env.CODEV_DEBUG&&console.log("Not in AI Studio environment (IS_AISTUDIO!=True), skipping extension installation"),!1):await this.isVSCodeAvailable()?await this.isExtensionInstalled()?(process.env.CODEV_DEBUG&&console.log(`Extension ${this.extensionId} already installed`),!1):!!N.existsSync(this.extensionPath):(process.env.CODEV_DEBUG&&console.log("VSCode not available, skipping extension installation"),!1)}catch(e){return process.env.CODEV_DEBUG&&console.error(`Error checking extension installation status: ${e.message}`),!1}}async installExtension(){try{return console.log("Installing Codev VSCode extension..."),await this.executeVSCodeCommand(["--install-extension",this.extensionPath])?(console.log("\u2705 Codev VSCode extension installed successfully"),!0):(console.warn("\u274C Failed to install Codev VSCode extension"),!1)}catch(e){return console.warn(`Error installing VSCode extension: ${e.message}`),!1}}async isVSCodeAvailable(){try{let e=process.env.IS_AISTUDIO==="True"?["--help"]:["--version"],t=await this.executeVSCodeCommand(e,{timeout:1e4});if(process.env.CODEV_DEBUG&&(console.log(`VSCode availability check (${e.join(" ")}): ${t?"available":"unavailable"}`),process.env.IS_AISTUDIO==="True")){let{spawn:s}=require("child_process");try{s("which",["code"],{stdio:["ignore","pipe","ignore"]}).stdout.on("data",r=>{console.log("which code:",r.toString().trim())})}catch(o){console.log("which command failed:",o.message)}}return t}catch(e){return process.env.CODEV_DEBUG&&console.error("VSCode availability check error:",e.message),!1}}async isExtensionInstalled(){let e=await this.resolveCodeCommand();try{return new Promise(t=>{try{let s={stdio:["ignore","pipe","ignore"],shell:!1,env:{...process.env,PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER}};process.env.CODEV_DEBUG&&console.log(`Spawning: ${e} --list-extensions`);let o=Ke(e,["--list-extensions"],s),r="";o.stdout.on("data",n=>{r+=n.toString()}),o.on("close",n=>{if(n===0){let i=r.split(`
200
+ `).map(a=>a.trim());t(i.includes(this.extensionId))}else t(!1)}),o.on("error",n=>{process.env.CODEV_DEBUG&&(console.error("VSCode list extensions error:",n.message),console.error("Error code:",n.code),console.error("Error errno:",n.errno),console.error("Error syscall:",n.syscall)),t(!1)}),setTimeout(()=>{try{o.kill()}catch{}t(!1)},1e4)}catch(s){process.env.CODEV_DEBUG&&console.error("Failed to spawn VSCode list extensions:",s.message),t(!1)}})}catch{return!1}}async executeVSCodeCommand(e,t={}){let s=await this.resolveCodeCommand();return new Promise(o=>{try{let r={stdio:"ignore",shell:!1,env:{...process.env,PATH:process.env.PATH,HOME:process.env.HOME,USER:process.env.USER}};process.env.CODEV_DEBUG&&console.log(`Spawning: ${s} ${e.join(" ")}`);let n=Ke(s,e,r);n.on("close",a=>{o(a===0)}),n.on("error",a=>{process.env.CODEV_DEBUG&&(console.error("VSCode command error:",a.message),console.error("Error code:",a.code),console.error("Error errno:",a.errno),console.error("Error syscall:",a.syscall)),o(!1)});let i=t.timeout||3e4;setTimeout(()=>{try{n.kill()}catch{}o(!1)},i)}catch(r){process.env.CODEV_DEBUG&&console.error("Failed to spawn VSCode command:",r.message),o(!1)}})}async ensureExtensionInstalled(){try{process.env.CODEV_DEBUG&&console.log("VSCode Extension Service: Checking extension status..."),await this.shouldInstallExtension()&&await this.installExtension()}catch(e){process.env.CODEV_DEBUG&&console.error("VSCode Extension Service Error:",e)}}};ze.exports=ie});var Ye=m((Is,Qe)=>{var E=require("fs"),O=require("path"),Rt=require("readline"),{execSync:V}=require("child_process"),Je=require("os"),ae=class{constructor(){this.serverUrl="https://makecoder.com/bigapis/codev/v1/coderpub"}getClaudeJsonlPath(e,t=!1){let s=e.replace(/[/_]/g,"-"),o=O.join(Je.homedir(),".claude","projects",s);if(t&&(console.log(`
201
+ \u{1F4C2} [allow-clone] \u67E5\u627E JSONL \u6587\u4EF6...`),console.log(` \u9879\u76EE\u76EE\u5F55: ${e}`),console.log(` Claude \u9879\u76EE\u540D: ${s}`),console.log(` Claude \u9879\u76EE\u76EE\u5F55: ${o}`)),!E.existsSync(o))return t&&console.log(" \u274C Claude \u9879\u76EE\u76EE\u5F55\u4E0D\u5B58\u5728"),null;t&&console.log(" \u2713 Claude \u9879\u76EE\u76EE\u5F55\u5B58\u5728");try{let r=E.readdirSync(o).filter(n=>n.endsWith(".jsonl")).map(n=>({name:n,path:O.join(o,n),mtime:E.statSync(O.join(o,n)).mtime,size:E.statSync(O.join(o,n)).size})).sort((n,i)=>i.mtime-n.mtime);return t&&(console.log(` \u627E\u5230 ${r.length} \u4E2A JSONL \u6587\u4EF6:`),r.forEach((n,i)=>{let a=(n.size/1024).toFixed(2),c=n.mtime.toLocaleString(),l=i===0?" <- \u6700\u65B0":"";console.log(` ${i+1}. ${n.name} (${a} KB, ${c})${l}`)})),r.length>0?(t&&console.log(` \u2713 \u9009\u62E9\u6700\u65B0\u6587\u4EF6: ${r[0].name}`),r[0].path):(t&&console.log(" \u274C \u76EE\u5F55\u4E2D\u6CA1\u6709 JSONL \u6587\u4EF6"),null)}catch(r){return t&&console.log(` \u274C \u8BFB\u53D6\u76EE\u5F55\u5931\u8D25: ${r.message}`),null}}async promptForName(){let e=Rt.createInterface({input:process.stdin,output:process.stdout});return new Promise((t,s)=>{e.question("\u8BF7\u8F93\u5165\u9879\u76EE\u540D\u79F0 (name): ",o=>{e.close();let r=o.trim();if(!r){s(new Error("\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A"));return}if(!/^[a-zA-Z0-9_-]+$/.test(r)){s(new Error("\u9879\u76EE\u540D\u79F0\u53EA\u80FD\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u8FDE\u5B57\u7B26"));return}t(r)})})}async createZip(e,t={}){let{allowClone:s=!1}=t,o=Je.tmpdir(),r=`coder-pub-${Date.now()}.zip`,n=O.join(o,r);try{let i=!1;if(E.existsSync(O.join(e,".git")))try{V(`git archive -o "${n}" HEAD`,{cwd:e,stdio:"pipe"}),console.log("\u{1F4E6} \u4F7F\u7528 git archive \u521B\u5EFA\u538B\u7F29\u5305\uFF08\u5DF2\u6392\u9664 .gitignore \u4E2D\u7684\u6587\u4EF6\uFF09"),i=!0}catch{console.log("\u26A0\uFE0F git archive \u5931\u8D25\uFF0C\u4F7F\u7528\u666E\u901A zip \u547D\u4EE4")}if(!i){let c=[".git/*","node_modules/*",".env",".env.*","*.log",".DS_Store"].map(l=>`-x "${l}"`).join(" ");V(`zip -r "${n}" . ${c}`,{cwd:e,stdio:"pipe"}),console.log("\u{1F4E6} \u5DF2\u521B\u5EFA\u538B\u7F29\u5305")}if(s){console.log(`
202
+ \u{1F504} [allow-clone] \u5F00\u59CB\u5904\u7406 AI \u751F\u6210\u8BB0\u5F55...`);let a=this.getClaudeJsonlPath(e,!0);if(a){let c=O.join(o,"coder.pub.jsonl"),u=(E.statSync(a).size/1024).toFixed(2);console.log(`
203
+ \u{1F4E6} [allow-clone] \u6253\u5305 JSONL \u6587\u4EF6...`),console.log(` \u6E90\u6587\u4EF6: ${a}`),console.log(` \u6587\u4EF6\u5927\u5C0F: ${u} KB`),console.log(` \u4E34\u65F6\u6587\u4EF6: ${c}`),E.copyFileSync(a,c),console.log(" \u2713 \u5DF2\u590D\u5236\u5230\u4E34\u65F6\u76EE\u5F55"),console.log(` \u76EE\u6807 ZIP: ${n}`),console.log(" \u76EE\u6807\u6587\u4EF6\u540D: coder.pub.jsonl"),V(`zip -j "${n}" "${c}"`,{stdio:"pipe"}),console.log(" \u2713 \u5DF2\u6DFB\u52A0\u5230 ZIP \u5305"),E.unlinkSync(c),console.log(" \u2713 \u5DF2\u6E05\u7406\u4E34\u65F6\u6587\u4EF6"),console.log(`\u{1F4CB} [allow-clone] AI \u751F\u6210\u8BB0\u5F55\u5904\u7406\u5B8C\u6210 (coder.pub.jsonl)
207
204
  `)}else console.log(`\u26A0\uFE0F [allow-clone] \u672A\u627E\u5230 Claude Code \u751F\u6210\u8BB0\u5F55
208
- `)}return r}catch(i){throw new Error(`\u521B\u5EFA\u538B\u7F29\u5305\u5931\u8D25: ${i.message}`)}}async upload(e,t,s,o,n,r=!1){let i=n?`${n}/coderpub`:this.serverUrl,a=`${s}.${o}`;console.log("\u{1F4E4} \u6B63\u5728\u4E0A\u4F20\u5230\u670D\u52A1\u5668..."),r&&(console.log(` \u670D\u52A1\u5668\u5730\u5740: ${i}`),console.log(` \u9879\u76EE\u540D\u79F0: ${t}`),console.log(` ZIP \u6587\u4EF6: ${e}`));try{let c=`curl -s -X POST "${i}" -H "Authorization: Bearer ${a}" -F "name=${t}" -F "zip_file=@${e}"`;r&&console.log(" \u6267\u884C\u4E0A\u4F20\u547D\u4EE4...");let l=H(c,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return r&&console.log(" \u2713 \u4E0A\u4F20\u5B8C\u6210\uFF0C\u89E3\u6790\u54CD\u5E94..."),JSON.parse(l)}catch(c){if(c.stdout)try{return JSON.parse(c.stdout)}catch{throw new Error(`\u4E0A\u4F20\u5931\u8D25: ${c.message}`)}throw new Error(`\u4E0A\u4F20\u5931\u8D25: ${c.message}`)}}cleanup(e){try{E.existsSync(e)&&E.unlinkSync(e)}catch{}}async publish(e){let{ak:t,sk:s,serverBaseUrl:o,allowClone:n}=e,{name:r}=e,i=null;try{r||(r=await this.promptForName()),console.log(`
209
- \u{1F680} \u6B63\u5728\u53D1\u5E03\u9879\u76EE: ${r}`),console.log(`\u{1F4C1} \u76EE\u5F55: ${process.cwd()}`),n&&console.log("\u{1F513} allow-clone: \u542F\u7528 (\u5C06\u5305\u542B AI \u751F\u6210\u8BB0\u5F55)"),console.log(),i=await this.createZip(process.cwd(),{allowClone:n});let c=(E.statSync(i).size/(1024*1024)).toFixed(2);console.log(`\u{1F4CA} \u538B\u7F29\u5305\u5927\u5C0F: ${c} MB`),n&&console.log(`
210
- \u{1F310} [allow-clone] \u5F00\u59CB\u4E0A\u4F20\u5230\u670D\u52A1\u5668...`);let l=await this.upload(i,r,t,s,o,n);return l.code===0?(console.log(`
211
- \u2705 \u53D1\u5E03\u6210\u529F!`),console.log(`\u{1F4CC} \u7248\u672C: ${l.data.version}`),console.log(`\u{1F310} \u8BBF\u95EE\u5730\u5740: https://${r}.coder.pub/`),0):(console.error(`
205
+ `)}return n}catch(i){throw new Error(`\u521B\u5EFA\u538B\u7F29\u5305\u5931\u8D25: ${i.message}`)}}async upload(e,t,s,o,r,n=!1){let i=r?`${r}/coderpub`:this.serverUrl,a=`${s}.${o}`;console.log("\u{1F4E4} \u6B63\u5728\u4E0A\u4F20\u5230\u670D\u52A1\u5668..."),n&&(console.log(` \u670D\u52A1\u5668\u5730\u5740: ${i}`),console.log(` \u9879\u76EE\u540D\u79F0: ${t}`),console.log(` ZIP \u6587\u4EF6: ${e}`));try{let c=`curl -s -X POST "${i}" -H "Authorization: Bearer ${a}" -F "name=${t}" -F "zip_file=@${e}"`;n&&console.log(" \u6267\u884C\u4E0A\u4F20\u547D\u4EE4...");let l=V(c,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});return n&&console.log(" \u2713 \u4E0A\u4F20\u5B8C\u6210\uFF0C\u89E3\u6790\u54CD\u5E94..."),JSON.parse(l)}catch(c){if(c.stdout)try{return JSON.parse(c.stdout)}catch{throw new Error(`\u4E0A\u4F20\u5931\u8D25: ${c.message}`)}throw new Error(`\u4E0A\u4F20\u5931\u8D25: ${c.message}`)}}cleanup(e){try{E.existsSync(e)&&E.unlinkSync(e)}catch{}}async publish(e){let{ak:t,sk:s,serverBaseUrl:o,allowClone:r}=e,{name:n}=e,i=null;try{n||(n=await this.promptForName()),console.log(`
206
+ \u{1F680} \u6B63\u5728\u53D1\u5E03\u9879\u76EE: ${n}`),console.log(`\u{1F4C1} \u76EE\u5F55: ${process.cwd()}`),r&&console.log("\u{1F513} allow-clone: \u542F\u7528 (\u5C06\u5305\u542B AI \u751F\u6210\u8BB0\u5F55)"),console.log(),i=await this.createZip(process.cwd(),{allowClone:r});let c=(E.statSync(i).size/(1024*1024)).toFixed(2);console.log(`\u{1F4CA} \u538B\u7F29\u5305\u5927\u5C0F: ${c} MB`),r&&console.log(`
207
+ \u{1F310} [allow-clone] \u5F00\u59CB\u4E0A\u4F20\u5230\u670D\u52A1\u5668...`);let l=await this.upload(i,n,t,s,o,r);return l.code===0?(console.log(`
208
+ \u2705 \u53D1\u5E03\u6210\u529F!`),console.log(`\u{1F4CC} \u7248\u672C: ${l.data.version}`),console.log(`\u{1F310} \u8BBF\u95EE\u5730\u5740: https://${n}.coder.pub/`),0):(console.error(`
212
209
  \u274C \u53D1\u5E03\u5931\u8D25: ${l.message||l.reason}`),1)}catch(a){return console.error(`
213
- \u274C ${a.message}`),1}finally{i&&this.cleanup(i)}}};Ke.exports=re});var Qe=m((Cs,Je)=>{var ze=require("https"),b=require("fs"),I=require("path"),Bt=require("os"),x="https://makecoder.com/skillhub",ie=class{getSkillDirs(){let e=Bt.homedir();return[I.join(e,".claude","skills"),I.join(e,".codex","skills"),I.join(e,".gemini","skills"),I.join(e,".agents","skills")]}fetchWithAuth(e,t){return new Promise((s,o)=>{let n=new URL(e),r={hostname:n.hostname,port:n.port||443,path:n.pathname+n.search,method:"GET",headers:t?{Authorization:`Bearer ${t}`}:{}};ze.get(r,i=>{if(i.statusCode>=300&&i.statusCode<400&&i.headers.location)return this.fetchWithAuth(i.headers.location,t).then(s).catch(o);let a="";i.on("data",c=>{a+=c}),i.on("end",()=>s({status:i.statusCode,body:a}))}).on("error",o)})}async handle({skillsSubcommand:e,skillsArg:t,skillsRemainingArgs:s,auth_ak:o,auth_sk:n}){let{execFileSync:r}=require("child_process");if(!e||e==="--help"||e==="-h")return this.showHelp(),0;if(e==="publish")return await this.publish(s||[],o,n);if(e==="unpublish")return await this.unpublish(t,o,n);if(e==="list")return await this.listMySkills(o,n);if(e==="namespaces")return await this.listNamespaces(o,n);if(t&&e!=="search"&&!/^[@a-zA-Z0-9_\-/.]+$/.test(t))return console.error("\u274C skill \u540D\u79F0\u5305\u542B\u975E\u6CD5\u5B57\u7B26"),1;if(e==="search")return t?await this.search(t):(console.error("\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD"),1);if(e==="remove")return t?this.remove(t):(console.error("\u274C \u8BF7\u6307\u5B9A skill \u540D\u79F0"),1);if((e==="add"||e==="update")&&t&&o&&n)return await this.install(t,`${o}.${n}`);try{let i;if(e==="add"){if(!t)return console.error("\u274C \u8BF7\u6307\u5B9A skill \u540D\u79F0"),1;i=["skills","add",x,"--skill",t,"-g"]}else if(e==="update")i=t?["skills","update","--skill",t,"-g"]:["skills","update","-g"];else return console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),1;return r("npx",i,{stdio:"inherit"}),0}catch(i){return console.error(`\u274C \u6267\u884C\u5931\u8D25: ${i.message}`),1}}async install(e,t){let s=x.replace(/\/$/,"");console.log(`\u{1F50D} \u6B63\u5728\u4ECE ${x} \u67E5\u627E skill...`);let o;try{let c=await this.fetchWithAuth(`${s}/.well-known/agent-skills/index.json`,t);if(c.status!==200)return console.error(`\u274C \u65E0\u6CD5\u83B7\u53D6 skill \u5217\u8868 (HTTP ${c.status})`),1;o=JSON.parse(c.body)}catch(c){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${c.message}`),1}let n=(o.skills||[]).find(c=>c.name.toLowerCase()===e.toLowerCase());if(!n){console.error(`\u274C \u672A\u627E\u5230 skill: ${e}`);for(let c of o.skills||[])console.log(` - ${c.name}`);return 1}let r=Array.from(new Set(["SKILL.md",...n.files||[]])),i=`${s}/.well-known/agent-skills/${n.name}`,a={};for(let c of r)try{let l=await this.fetchWithAuth(`${i}/${c}`,t);if(l.status!==200){console.warn(`\u26A0\uFE0F \u8DF3\u8FC7 ${c} (HTTP ${l.status})`);continue}a[c]=l.body}catch(l){console.warn(`\u26A0\uFE0F \u4E0B\u8F7D ${c} \u5931\u8D25: ${l.message}`)}console.log(`\u{1F4E6} \u6B63\u5728\u5B89\u88C5 ${n.name}...`);for(let c of this.getSkillDirs()){let l=I.join(c,n.name);b.mkdirSync(l,{recursive:!0});for(let[u,d]of Object.entries(a)){let g=I.join(l,u);b.mkdirSync(I.dirname(g),{recursive:!0}),b.writeFileSync(g,d,"utf8")}}return console.log(`\u2705 ${n.name} \u5B89\u88C5\u5B8C\u6210`),0}remove(e){let t=!1;for(let s of this.getSkillDirs()){let o=I.join(s,e);b.existsSync(o)&&(b.rmSync(o,{recursive:!0,force:!0}),console.log(` \u{1F5D1}\uFE0F ${o}`),t=!0)}return t?(console.log(`\u2705 ${e} \u5DF2\u5220\u9664`),0):(console.error(`\u274C \u672A\u627E\u5230\u5DF2\u5B89\u88C5\u7684 skill: ${e}`),1)}async search(e){let t=`${x}/api/web/skills?q=${encodeURIComponent(e)}&sort=relevance&page=0&size=12`;return new Promise(s=>{ze.get(t,o=>{let n="";o.on("data",r=>{n+=r}),o.on("end",()=>{try{let r=JSON.parse(n);if(r.code!==0)return console.error(`\u274C \u67E5\u8BE2\u5931\u8D25: ${r.msg}`),s(1);let i=r.data.items;if(i.length===0)return console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${e}" \u76F8\u5173\u7684 skill`),s(0);console.log(`\u627E\u5230 ${r.data.total} \u4E2A\u7ED3\u679C:
214
- `);for(let a of i)console.log(` ${a.slug.padEnd(20)} ${a.summary}`);s(0)}catch(r){console.error(`\u274C \u89E3\u6790\u54CD\u5E94\u5931\u8D25: ${r.message}`),s(1)}})}).on("error",o=>{console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${o.message}`),s(1)})})}async publish(e,t,s){let{execSync:o}=require("child_process"),n=require("os"),r="global",i="PUBLIC",a=null,c=null,l=null;for(let p=0;p<e.length;p++)if(e[p]==="--namespace"||e[p]==="-n")r=e[++p];else if(e[p]==="--visibility"||e[p]==="-v")i=e[++p];else if(!e[p].startsWith("-")){let S=e[p];b.existsSync(S)&&b.statSync(S).isDirectory()?l=S:a=S}if(!t||!s)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let u=r.startsWith("@")?r.slice(1):r;u==="global"||(i="NAMESPACE_ONLY");let g=["PUBLIC","NAMESPACE_ONLY","PRIVATE"];if(!g.includes(i))return console.error(`\u274C visibility \u5FC5\u987B\u662F: ${g.join(", ")}`),1;if(a){if(!b.existsSync(a))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${a}`),1}else{let p=l?I.resolve(l):process.cwd();c=I.join(n.tmpdir(),`skill-pub-${Date.now()}.zip`),console.log(`\u{1F4E6} \u6B63\u5728\u6253\u5305 ${p}...`);try{b.existsSync(I.join(p,".git"))?(o(`git archive -o "${c}" HEAD`,{cwd:p,stdio:"pipe"}),console.log(" \u4F7F\u7528 git archive\uFF08\u5DF2\u6392\u9664 .gitignore \u6587\u4EF6\uFF09")):o(`zip -r "${c}" . -x ".git/*" -x "node_modules/*" -x ".env" -x "*.log"`,{cwd:p,stdio:"pipe"})}catch(S){return console.error(`\u274C \u6253\u5305\u5931\u8D25: ${S.message}`),1}a=c}let C=`${x}/api/v1/skills/${encodeURIComponent(u)}/publish?visibility=${encodeURIComponent(i)}`,L=`${t}.${s}`;console.log(`\u{1F680} \u6B63\u5728\u53D1\u5E03\u5230 ${x}...`),console.log(` namespace: ${u}`),console.log(` visibility: ${i}`);try{let p=`curl -s -X POST "${C}" -H "Authorization: Bearer ${L}" -F "file=@${a}"`,S=o(p,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),v=JSON.parse(S);if(v.code===0){let D=v.data;return console.log(`
215
- \u2705 \u53D1\u5E03\u6210\u529F!`),console.log(` ${D.namespace}/${D.slug}@${D.version}`),D.status==="PUBLISHED"?console.log(" \u72B6\u6001: \u5DF2\u53D1\u5E03"):console.log(" \u72B6\u6001: \u5F85\u5BA1\u6838"),0}else return console.error(`
216
- \u274C \u53D1\u5E03\u5931\u8D25: ${v.msg||JSON.stringify(v)}`),1}catch(p){let S=p.stdout;if(S)try{let v=JSON.parse(S);return console.error(`
217
- \u274C \u53D1\u5E03\u5931\u8D25: ${v.msg||S}`),1}catch{}return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${p.message}`),1}finally{c&&b.existsSync(c)&&b.unlinkSync(c)}}async unpublish(e,t,s){let{execSync:o}=require("child_process");if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A skill: coder skills unpublish <namespace>/<slug>"),1;if(!t||!s)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let n=e.split("/");if(n.length!==2||!n[0]||!n[1])return console.error("\u274C \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <namespace>/<slug>\uFF0C\u4F8B\u5982: global/my-skill"),1;let[r,i]=n,a=r.startsWith("@")?r.slice(1):r,c=`${x}/api/v1/skills/${encodeURIComponent(a)}/${encodeURIComponent(i)}`,l=`${t}.${s}`;console.log(`\u{1F5D1}\uFE0F \u6B63\u5728\u4E0B\u67B6 ${a}/${i}...`);try{let u=o(`curl -s -X DELETE "${c}" -H "Authorization: Bearer ${l}"`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),d=JSON.parse(u);return d.code===0?(console.log(`\u2705 \u5DF2\u4E0B\u67B6 ${a}/${i}`),0):(console.error(`\u274C \u4E0B\u67B6\u5931\u8D25: ${d.msg||JSON.stringify(d)}`),1)}catch(u){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${u.message}`),1}}async listMySkills(e,t){let{execSync:s}=require("child_process");if(!e||!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let o=`${x}/api/v1/me/skills?size=50`,n=`${e}.${t}`;try{let r=s(`curl -s "${o}" -H "Authorization: Bearer ${n}"`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=JSON.parse(r);if(i.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${i.msg}`),1;let a=i.data?.items||[],c=i.data?.total||0;if(a.length===0)return console.log("\u6682\u65E0\u5DF2\u53D1\u5E03\u7684 skill"),0;console.log(`\u5171 ${c} \u4E2A skill:
218
- `);for(let l of a){let u=`${l.namespace}/${l.slug}`.padEnd(36),d=`\u2B50 ${l.starCount??0}`.padEnd(8),g=`\u2193 ${l.downloadCount??0}`.padEnd(10);console.log(` ${u} ${d} ${g} [${l.status}]`),l.displayName&&l.displayName!==l.slug&&console.log(` ${"".padEnd(36)} ${l.displayName}`)}return 0}catch(r){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${r.message}`),1}}async listNamespaces(e,t){let{execSync:s}=require("child_process");if(!e||!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let o=`${x}/api/v1/me/namespaces`,n=`${e}.${t}`;try{let r=s(`curl -s "${o}" -H "Authorization: Bearer ${n}"`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=JSON.parse(r);if(i.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${i.msg}`),1;let a=i.data||[];if(a.length===0)return console.log("\u6682\u65E0\u547D\u540D\u7A7A\u95F4"),0;console.log(`\u5171 ${a.length} \u4E2A\u547D\u540D\u7A7A\u95F4:
219
- `);for(let c of a){let l=c.type==="GLOBAL"?"\u5168\u5C40":"\u56E2\u961F";console.log(` @${c.slug.padEnd(20)} ${c.displayName.padEnd(20)} [${l}] ${c.status}`)}return 0}catch(r){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${r.message}`),1}}showHelp(){console.log(`
210
+ \u274C ${a.message}`),1}finally{i&&this.cleanup(i)}}};Qe.exports=ae});var et=m(($s,Xe)=>{var Ze=require("https"),v=require("fs"),b=require("path"),Ht=require("os"),$="https://makecoder.com/skillhub",ce=class{getSkillDirs(){let e=Ht.homedir();return[b.join(e,".claude","skills"),b.join(e,".codex","skills"),b.join(e,".gemini","skills"),b.join(e,".agents","skills")]}fetchWithAuth(e,t){return new Promise((s,o)=>{let r=new URL(e),n={hostname:r.hostname,port:r.port||443,path:r.pathname+r.search,method:"GET",headers:t?{Authorization:`Bearer ${t}`}:{}};Ze.get(n,i=>{if(i.statusCode>=300&&i.statusCode<400&&i.headers.location)return this.fetchWithAuth(i.headers.location,t).then(s).catch(o);let a="";i.on("data",c=>{a+=c}),i.on("end",()=>s({status:i.statusCode,body:a}))}).on("error",o)})}async handle({skillsSubcommand:e,skillsArg:t,skillsRemainingArgs:s,auth_ak:o,auth_sk:r}){let{execFileSync:n}=require("child_process");if(!e||e==="--help"||e==="-h")return this.showHelp(),0;if(e==="publish")return await this.publish(s||[],o,r);if(e==="unpublish")return await this.unpublish(t,o,r);if(e==="list")return await this.listMySkills(o,r);if(e==="namespaces")return await this.listNamespaces(o,r);if(t&&e!=="search"&&!/^[@a-zA-Z0-9_\-/.]+$/.test(t))return console.error("\u274C skill \u540D\u79F0\u5305\u542B\u975E\u6CD5\u5B57\u7B26"),1;if(e==="search")return t?await this.search(t):(console.error("\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD"),1);if(e==="remove")return t?this.remove(t):(console.error("\u274C \u8BF7\u6307\u5B9A skill \u540D\u79F0"),1);if((e==="add"||e==="update")&&t&&o&&r)return await this.install(t,`${o}.${r}`);try{let i;if(e==="add"){if(!t)return console.error("\u274C \u8BF7\u6307\u5B9A skill \u540D\u79F0"),1;i=["skills","add",$,"--skill",t,"-g"]}else if(e==="update")i=t?["skills","update","--skill",t,"-g"]:["skills","update","-g"];else return console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),1;return n("npx",i,{stdio:"inherit"}),0}catch(i){return console.error(`\u274C \u6267\u884C\u5931\u8D25: ${i.message}`),1}}async install(e,t){let s=$.replace(/\/$/,"");console.log(`\u{1F50D} \u6B63\u5728\u4ECE ${$} \u67E5\u627E skill...`);let o;try{let c=await this.fetchWithAuth(`${s}/.well-known/agent-skills/index.json`,t);if(c.status!==200)return console.error(`\u274C \u65E0\u6CD5\u83B7\u53D6 skill \u5217\u8868 (HTTP ${c.status})`),1;o=JSON.parse(c.body)}catch(c){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${c.message}`),1}let r=(o.skills||[]).find(c=>c.name.toLowerCase()===e.toLowerCase());if(!r){console.error(`\u274C \u672A\u627E\u5230 skill: ${e}`);for(let c of o.skills||[])console.log(` - ${c.name}`);return 1}let n=Array.from(new Set(["SKILL.md",...r.files||[]])),i=`${s}/.well-known/agent-skills/${r.name}`,a={};for(let c of n)try{let l=await this.fetchWithAuth(`${i}/${c}`,t);if(l.status!==200){console.warn(`\u26A0\uFE0F \u8DF3\u8FC7 ${c} (HTTP ${l.status})`);continue}a[c]=l.body}catch(l){console.warn(`\u26A0\uFE0F \u4E0B\u8F7D ${c} \u5931\u8D25: ${l.message}`)}console.log(`\u{1F4E6} \u6B63\u5728\u5B89\u88C5 ${r.name}...`);for(let c of this.getSkillDirs()){let l=b.join(c,r.name);v.mkdirSync(l,{recursive:!0});for(let[u,d]of Object.entries(a)){let g=b.join(l,u);v.mkdirSync(b.dirname(g),{recursive:!0}),v.writeFileSync(g,d,"utf8")}}return console.log(`\u2705 ${r.name} \u5B89\u88C5\u5B8C\u6210`),0}remove(e){let t=!1;for(let s of this.getSkillDirs()){let o=b.join(s,e);v.existsSync(o)&&(v.rmSync(o,{recursive:!0,force:!0}),console.log(` \u{1F5D1}\uFE0F ${o}`),t=!0)}return t?(console.log(`\u2705 ${e} \u5DF2\u5220\u9664`),0):(console.error(`\u274C \u672A\u627E\u5230\u5DF2\u5B89\u88C5\u7684 skill: ${e}`),1)}async search(e){let t=`${$}/api/web/skills?q=${encodeURIComponent(e)}&sort=relevance&page=0&size=12`;return new Promise(s=>{Ze.get(t,o=>{let r="";o.on("data",n=>{r+=n}),o.on("end",()=>{try{let n=JSON.parse(r);if(n.code!==0)return console.error(`\u274C \u67E5\u8BE2\u5931\u8D25: ${n.msg}`),s(1);let i=n.data.items;if(i.length===0)return console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${e}" \u76F8\u5173\u7684 skill`),s(0);console.log(`\u627E\u5230 ${n.data.total} \u4E2A\u7ED3\u679C:
211
+ `);for(let a of i)console.log(` ${a.slug.padEnd(20)} ${a.summary}`);s(0)}catch(n){console.error(`\u274C \u89E3\u6790\u54CD\u5E94\u5931\u8D25: ${n.message}`),s(1)}})}).on("error",o=>{console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${o.message}`),s(1)})})}async publish(e,t,s){let{execSync:o}=require("child_process"),r=require("os"),n="global",i="PUBLIC",a=null,c=null,l=null,u=null;for(let p=0;p<e.length;p++)if(e[p]==="--namespace"||e[p]==="-n")n=e[++p];else if(e[p]==="--visibility"||e[p]==="-v")i=e[++p];else if(e[p]==="--meta-data"){let y=e[++p];try{JSON.parse(y)}catch(I){return console.error(`\u274C --meta-data \u4E0D\u662F\u5408\u6CD5\u7684 JSON\uFF1A${I.message}`),1}a=y}else if(!e[p].startsWith("-")){let y=e[p];v.existsSync(y)&&v.statSync(y).isDirectory()?u=y:c=y}if(!t||!s)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let d=n.startsWith("@")?n.slice(1):n;d==="global"||(i="NAMESPACE_ONLY");let C=["PUBLIC","NAMESPACE_ONLY","PRIVATE"];if(!C.includes(i))return console.error(`\u274C visibility \u5FC5\u987B\u662F: ${C.join(", ")}`),1;if(c){if(!v.existsSync(c))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${c}`),1}else{let p=u?b.resolve(u):process.cwd();l=b.join(r.tmpdir(),`skill-pub-${Date.now()}.zip`),console.log(`\u{1F4E6} \u6B63\u5728\u6253\u5305 ${p}...`);try{v.existsSync(b.join(p,".git"))?(o(`git archive -o "${l}" HEAD`,{cwd:p,stdio:"pipe"}),console.log(" \u4F7F\u7528 git archive\uFF08\u5DF2\u6392\u9664 .gitignore \u6587\u4EF6\uFF09")):o(`zip -r "${l}" . -x ".git/*" -x "node_modules/*" -x ".env" -x "*.log"`,{cwd:p,stdio:"pipe"})}catch(y){return console.error(`\u274C \u6253\u5305\u5931\u8D25: ${y.message}`),1}c=l}let B=`${$}/api/v1/skills/${encodeURIComponent(d)}/publish?visibility=${encodeURIComponent(i)}`,A=`${t}.${s}`;console.log(`\u{1F680} \u6B63\u5728\u53D1\u5E03\u5230 ${$}...`),console.log(` namespace: ${d}`),console.log(` visibility: ${i}`);try{let p=a?` -F "meta_data=${a.replace(/"/g,'\\"')}"`:"",y=`curl -s -X POST "${B}" -H "Authorization: Bearer ${A}" -F "file=@${c}"${p}`,I=o(y,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),L=JSON.parse(I);if(L.code===0){let j=L.data;return console.log(`
212
+ \u2705 \u53D1\u5E03\u6210\u529F!`),console.log(` ${j.namespace}/${j.slug}@${j.version}`),j.status==="PUBLISHED"?console.log(" \u72B6\u6001: \u5DF2\u53D1\u5E03"):console.log(" \u72B6\u6001: \u5F85\u5BA1\u6838"),0}else return console.error(`
213
+ \u274C \u53D1\u5E03\u5931\u8D25: ${L.msg||JSON.stringify(L)}`),1}catch(p){let y=p.stdout;if(y)try{let I=JSON.parse(y);return console.error(`
214
+ \u274C \u53D1\u5E03\u5931\u8D25: ${I.msg||y}`),1}catch{}return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${p.message}`),1}finally{l&&v.existsSync(l)&&v.unlinkSync(l)}}async unpublish(e,t,s){let{execSync:o}=require("child_process");if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A skill: coder skills unpublish <namespace>/<slug>"),1;if(!t||!s)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let r=e.split("/");if(r.length!==2||!r[0]||!r[1])return console.error("\u274C \u683C\u5F0F\u9519\u8BEF\uFF0C\u5E94\u4E3A <namespace>/<slug>\uFF0C\u4F8B\u5982: global/my-skill"),1;let[n,i]=r,a=n.startsWith("@")?n.slice(1):n,c=`${$}/api/v1/skills/${encodeURIComponent(a)}/${encodeURIComponent(i)}`,l=`${t}.${s}`;console.log(`\u{1F5D1}\uFE0F \u6B63\u5728\u4E0B\u67B6 ${a}/${i}...`);try{let u=o(`curl -s -X DELETE "${c}" -H "Authorization: Bearer ${l}"`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),d=JSON.parse(u);return d.code===0?(console.log(`\u2705 \u5DF2\u4E0B\u67B6 ${a}/${i}`),0):(console.error(`\u274C \u4E0B\u67B6\u5931\u8D25: ${d.msg||JSON.stringify(d)}`),1)}catch(u){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${u.message}`),1}}async listMySkills(e,t){let{execSync:s}=require("child_process");if(!e||!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let o=`${$}/api/v1/me/skills?size=50`,r=`${e}.${t}`;try{let n=s(`curl -s "${o}" -H "Authorization: Bearer ${r}"`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=JSON.parse(n);if(i.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${i.msg}`),1;let a=i.data?.items||[],c=i.data?.total||0;if(a.length===0)return console.log("\u6682\u65E0\u5DF2\u53D1\u5E03\u7684 skill"),0;console.log(`\u5171 ${c} \u4E2A skill:
215
+ `);for(let l of a){let u=`${l.namespace}/${l.slug}`.padEnd(36),d=`\u2B50 ${l.starCount??0}`.padEnd(8),g=`\u2193 ${l.downloadCount??0}`.padEnd(10);console.log(` ${u} ${d} ${g} [${l.status}]`),l.displayName&&l.displayName!==l.slug&&console.log(` ${"".padEnd(36)} ${l.displayName}`)}return 0}catch(n){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${n.message}`),1}}async listNamespaces(e,t){let{execSync:s}=require("child_process");if(!e||!t)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let o=`${$}/api/v1/me/namespaces`,r=`${e}.${t}`;try{let n=s(`curl -s "${o}" -H "Authorization: Bearer ${r}"`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=JSON.parse(n);if(i.code!==0)return console.error(`\u274C \u83B7\u53D6\u5931\u8D25: ${i.msg}`),1;let a=i.data||[];if(a.length===0)return console.log("\u6682\u65E0\u547D\u540D\u7A7A\u95F4"),0;console.log(`\u5171 ${a.length} \u4E2A\u547D\u540D\u7A7A\u95F4:
216
+ `);for(let c of a){let l=c.type==="GLOBAL"?"\u5168\u5C40":"\u56E2\u961F";console.log(` @${c.slug.padEnd(20)} ${c.displayName.padEnd(20)} [${l}] ${c.status}`)}return 0}catch(n){return console.error(`\u274C \u8BF7\u6C42\u5931\u8D25: ${n.message}`),1}}showHelp(){console.log(`
220
217
  coder skills \u2014 \u7BA1\u7406 Claude Code skills
221
218
 
222
219
  USAGE:
@@ -236,6 +233,7 @@ PUBLISH OPTIONS:
236
233
  --namespace <ns> \u76EE\u6807\u547D\u540D\u7A7A\u95F4\uFF08\u9ED8\u8BA4: global\uFF09
237
234
  --visibility <v> \u53EF\u89C1\u6027: PUBLIC | NAMESPACE_ONLY | PRIVATE\uFF08\u9ED8\u8BA4: PUBLIC\uFF09
238
235
  \u975E global \u547D\u540D\u7A7A\u95F4\u65F6\u81EA\u52A8\u9501\u5B9A\u4E3A NAMESPACE_ONLY
236
+ --meta-data <json> \u9644\u52A0\u81EA\u5B9A\u4E49\u5143\u6570\u636E JSON
239
237
 
240
238
  EXAMPLES:
241
239
  coder skills add vue
@@ -244,13 +242,14 @@ EXAMPLES:
244
242
  coder skills publish ./my-skill-dir
245
243
  coder skills publish --namespace myteam ./my-skill-dir
246
244
  coder skills publish --visibility PRIVATE my-skill.zip
245
+ coder skills publish --meta-data '{"category":"tool"}' ./my-skill-dir
247
246
  coder skills unpublish global/my-skill
248
247
  coder skills namespaces
249
- `)}};Je.exports=ie});var Ze=m((vs,Xe)=>{var Lt=require("https"),G="https://makecoder.com/wiki",Nt=`${G}/api`,k=h=>`${G}/doc/${h}`,Ye=h=>`${G}/collection/${h}`,ae=class{getToken(e,t){return e&&t?`${e}.${t}`:null}post(e,t,s){return new Promise((o,n)=>{let r=JSON.stringify(t),i=new URL(`${Nt}/${e}`),a={hostname:i.hostname,port:i.port||443,path:i.pathname,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(r),Authorization:`Bearer ${s}`}},c=Lt.request(a,l=>{let u="";l.on("data",d=>u+=d),l.on("end",()=>o({status:l.statusCode,body:u}))});c.on("error",n),c.write(r),c.end()})}parseJson(e){try{return JSON.parse(e)}catch{return null}}async handle({wikiSubcommand:e,wikiArg:t,wikiRemainingArgs:s,auth_ak:o,auth_sk:n}){if(!e||e==="--help"||e==="-h")return this.showHelp(),0;let r=this.getToken(o,n);if(!r)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let i=s||[];return e==="list"?await this.list(t,i,r):e==="create-collection"?await this.createCollection(i,r):e==="get"?await this.get(t,r):e==="publish"?await this.publish(t,i,r):e==="update"?await this.update(i,r):e==="delete"?await this.delete(t,i,r):e==="move"?await this.move(i,r):e==="archive"?await this.archive(t,r):e==="restore"?await this.restore(t,r):e==="drafts"?await this.drafts(r):e==="recent"?await this.recent(r):e==="search"?t?await this.search([t,...i],r):(console.error("\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD"),1):e==="stars"?await this.stars(r):e==="star"?await this.star(t,i,r):e==="unstar"?await this.unstar(t,r):e==="pins"?await this.pins(t,r):e==="pin"?await this.pin(t,i,r):e==="unpin"?await this.unpin(t,r):e==="comments"?await this.comments(t,r):e==="comment"?await this.comment(t,i,r):(console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),this.showHelp(),1)}async list(e,t,s){let o=t.indexOf("-d"),n=o!==-1?parseInt(t[o+1],10):null;if(!e){let c=await this.post("collections.list",{includeListOnly:!0},s),l=this.parseJson(c.body);if(!l?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",c.body),1;let u=l.data.collections||l.data||[];return u.length?(this.printTable(u.map(d=>({collectionId:d.id,\u76EE\u5F55\u540D\u79F0:d.name,URL:Ye(d.urlId||d.id)}))),0):(console.log("\u6682\u65E0\u76EE\u5F55"),0)}if(n===null){let c=await this.post("documents.list",{collectionId:e,sort:"updatedAt",direction:"DESC"},s),l=this.parseJson(c.body);if(!l?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",c.body),1;let u=l.data.documents||l.data||[];return u.length?(this.printTable(u.map(d=>({docId:d.id,\u6807\u9898:d.title,URL:k(d.urlId||d.id)}))),0):(console.log("\u6682\u65E0\u6587\u6863"),0)}let r=await this.post("collections.documents",{id:e},s),i=this.parseJson(r.body);if(!i?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",r.body),1;let a=n===-1?1/0:n;return this.printTree(i.data,"",a,0),0}printTree(e,t,s,o){if(Array.isArray(e))for(let n=0;n<e.length;n++){let r=e[n],i=n===e.length-1,a=i?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",c=r.url?`${G}${r.url}`:k(r.id);console.log(`${t}${a}${r.title||r.id} \x1B[90m${c}\x1B[0m`),r.children?.length&&o+1<s&&this.printTree(r.children,t+(i?" ":"\u2502 "),s,o+1)}}printTable(e){if(!e.length)return;let t=Object.keys(e[0]),s=i=>[...String(i)].reduce((a,c)=>a+(c.charCodeAt(0)>127?2:1),0),o=(i,a)=>i+" ".repeat(Math.max(0,a-s(i))),n=t.map(i=>Math.max(s(i),...e.map(a=>s(a[i]||"")))),r=n.map(i=>"-".repeat(i)).join("-+-");console.log(t.map((i,a)=>o(i,n[a])).join(" | ")),console.log(r);for(let i of e)console.log(t.map((a,c)=>o(String(i[a]||""),n[c])).join(" | "))}async createCollection(e,t){let s=e[0];if(!s)return console.error("\u274C \u8BF7\u6307\u5B9A\u76EE\u5F55\u540D\u79F0"),1;let o=e.slice(1).join(" "),n=await this.post("collections.create",{name:s,description:o,permission:"read_write",sharing:!0},t),r=this.parseJson(n.body);return r?.data?(console.log(`\u2705 \u76EE\u5F55\u5DF2\u521B\u5EFA: ${r.data.id} \u2014 ${r.data.name}`),0):(console.error("\u274C \u521B\u5EFA\u5931\u8D25:",n.body),1)}async get(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.info",{id:e},t),o=this.parseJson(s.body);if(!o?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let n=o.data;return console.log(`\u6807\u9898: ${n.title}`),console.log(`ID: ${n.id}`),console.log(`\u76EE\u5F55: ${n.collectionId}`),console.log(`\u66F4\u65B0: ${n.updatedAt}`),n.text&&console.log(`
250
- ${n.text}`),0}async publish(e,t,s){let o=require("fs"),n=require("path");if(!e)return console.error(`\u274C \u7528\u6CD5: wiki publish <collectionId> <title> [text]
251
- wiki publish <collectionId> --file <path> [--parent <parentDocId>]`),1;let r,i,a,c=t.indexOf("--file"),l=t.indexOf("--parent");if(l!==-1&&(a=t[l+1]),c!==-1){let S=t[c+1];if(!S)return console.error("\u274C \u8BF7\u6307\u5B9A --file \u8DEF\u5F84"),1;let v=n.resolve(S);if(!o.existsSync(v))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${v}`),1;i=o.readFileSync(v,"utf8");let D=i.match(/^#\s+(.+)/m);if(!D)return console.error("\u274C \u6587\u4EF6\u7F3A\u5C11 H1 \u6807\u9898\uFF08# \u6807\u9898\uFF09\uFF0C\u8BF7\u6DFB\u52A0\u540E\u91CD\u8BD5"),1;r=D[1].trim()}else if(r=t[0],i=t.slice(1).join(" "),!r)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6807\u9898"),1;let u={collectionId:e,title:r,text:"",publish:!0};a&&(u.parentDocumentId=a);let d=await this.post("documents.create",u,s),g=this.parseJson(d.body);if(!g?.data)return console.error("\u274C \u521B\u5EFA\u6587\u6863\u5931\u8D25:",d.body),1;let C=g.data.id;console.log(` \u521B\u5EFA\u6587\u6863: ${C}`);let L=await this.post("documents.update",{id:C,title:r,text:i,publish:!0},s),p=this.parseJson(L.body);return p?.data?(console.log(`\u2705 \u6587\u6863\u5DF2\u53D1\u5E03: ${p.data.title}
252
- ${k(p.data.urlId||C)}`),0):(console.error("\u274C \u66F4\u65B0\u5185\u5BB9\u5931\u8D25:",L.body),1)}async update(e,t){let s=require("fs"),o=require("path"),n=e[0];if(!n)return console.error("\u274C \u7528\u6CD5: wiki update <docId> <title> [text] | <docId> --file <path>"),1;let r,i,a=e.indexOf("--file");if(a!==-1){let d=e[a+1];if(!d)return console.error("\u274C \u8BF7\u6307\u5B9A --file \u8DEF\u5F84"),1;let g=o.resolve(d);if(!s.existsSync(g))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${g}`),1;i=s.readFileSync(g,"utf8");let C=i.match(/^#\s+(.+)/m);if(!C)return console.error("\u274C \u6587\u4EF6\u7F3A\u5C11 H1 \u6807\u9898\uFF08# \u6807\u9898\uFF09\uFF0C\u8BF7\u6DFB\u52A0\u540E\u91CD\u8BD5"),1;r=C[1].trim()}else if(r=e[1],i=e.slice(2).join(" "),!r)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6807\u9898"),1;let c={id:n,title:r,publish:!0};i&&(c.text=i);let l=await this.post("documents.update",c,t),u=this.parseJson(l.body);return u?.data?(console.log(`\u2705 \u6587\u6863\u5DF2\u66F4\u65B0: ${u.data.title}`),0):(console.error("\u274C \u66F4\u65B0\u5931\u8D25:",l.body),1)}async delete(e,t,s){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let o=t.includes("--permanent"),n=await this.post("documents.delete",{id:e,...o?{permanent:!0}:{}},s);return this.parseJson(n.body)?.ok===!1||n.status>=400?(console.error("\u274C \u5220\u9664\u5931\u8D25:",n.body),1):(console.log(`\u2705 \u6587\u6863\u5DF2${o?"\u6C38\u4E45":""}\u5220\u9664`),0)}async move(e,t){let[s,o,n]=e;if(!s||!o)return console.error("\u274C \u7528\u6CD5: wiki move <docId> <collectionId> [parentDocId]"),1;let r={id:s,collectionId:o};n&&(r.parentDocumentId=n);let i=await this.post("documents.move",r,t);return this.parseJson(i.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u79FB\u52A8"),0):(console.error("\u274C \u79FB\u52A8\u5931\u8D25:",i.body),1)}async archive(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.archive",{id:e},t);return this.parseJson(s.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u5F52\u6863"),0):(console.error("\u274C \u5F52\u6863\u5931\u8D25:",s.body),1)}async restore(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.restore",{id:e},t);return this.parseJson(s.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u6062\u590D"),0):(console.error("\u274C \u6062\u590D\u5931\u8D25:",s.body),1)}async drafts(e){let t=await this.post("documents.drafts",{sort:"updatedAt",direction:"DESC"},e),s=this.parseJson(t.body);if(!s?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",t.body),1;let o=s.data.documents||s.data||[];return o.length?(this.printTable(o.map(n=>({ID:n.id,\u6807\u9898:n.title,URL:k(n.urlId||n.id)}))),0):(console.log("\u6682\u65E0\u8349\u7A3F"),0)}async recent(e){let t=await this.post("documents.viewed",{sort:"updatedAt",direction:"DESC"},e),s=this.parseJson(t.body);if(!s?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",t.body),1;let o=s.data.documents||s.data||[];return o.length?(this.printTable(o.map(n=>({ID:n.id,\u6807\u9898:n.title,URL:k(n.urlId||n.id)}))),0):(console.log("\u6682\u65E0\u6D4F\u89C8\u8BB0\u5F55"),0)}async search(e,t){let s=e.join(" "),o=await this.post("documents.search",{query:s,snippetMinWords:20,snippetMaxWords:30},t),n=this.parseJson(o.body);if(!n?.data)return console.error("\u274C \u641C\u7D22\u5931\u8D25:",o.body),1;let r=n.data||[];return r.length?(console.log(`\u627E\u5230 ${r.length} \u4E2A\u7ED3\u679C:
253
- `),this.printTable(r.map(i=>{let a=i.document||i;return{docId:a.id,\u6807\u9898:a.title,URL:k(a.urlId||a.id)}})),0):(console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${s}" \u76F8\u5173\u7684\u6587\u6863`),0)}async stars(e){let t=await this.post("stars.list",{},e),s=this.parseJson(t.body);if(!s?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",t.body),1;let o=s.data.stars||s.data||[];return o.length?(this.printTable(o.map(n=>({starId:n.id,\u6807\u9898:n.document?.title||n.collection?.name||"",URL:n.document?k(n.document.urlId||n.document.id):n.collection?Ye(n.collection.urlId||n.collection.id):""}))),0):(console.log("\u6682\u65E0\u6536\u85CF"),0)}async star(e,t,s){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6216\u76EE\u5F55 ID"),1;let n=t.includes("--collection")?{collectionId:e}:{documentId:e},r=await this.post("stars.create",n,s);return this.parseJson(r.body)?.data?(console.log("\u2705 \u5DF2\u6536\u85CF"),0):(console.error("\u274C \u6536\u85CF\u5931\u8D25:",r.body),1)}async unstar(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6536\u85CF ID"),1;let s=await this.post("stars.delete",{id:e},t);return s.status>=400?(console.error("\u274C \u53D6\u6D88\u6536\u85CF\u5931\u8D25:",s.body),1):(console.log("\u2705 \u5DF2\u53D6\u6D88\u6536\u85CF"),0)}async pins(e,t){let s=e?{collectionId:e}:{},o=await this.post("pins.list",s,t),n=this.parseJson(o.body);if(!n?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",o.body),1;let r=n.data.pins||n.data||[];return r.length?(this.printTable(r.map(i=>({pinId:i.id,\u6807\u9898:i.document?.title||i.documentId,URL:k(i.document?.urlId||i.documentId)}))),0):(console.log("\u6682\u65E0\u7F6E\u9876"),0)}async pin(e,t,s){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let o={documentId:e,...t[0]?{collectionId:t[0]}:{}},n=await this.post("pins.create",o,s),r=this.parseJson(n.body);return r?.data?(console.log(`\u2705 \u5DF2\u7F6E\u9876: ${r.data.id}`),0):(console.error("\u274C \u7F6E\u9876\u5931\u8D25:",n.body),1)}async unpin(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u7F6E\u9876 ID"),1;let s=await this.post("pins.delete",{id:e},t);return s.status>=400?(console.error("\u274C \u53D6\u6D88\u7F6E\u9876\u5931\u8D25:",s.body),1):(console.log("\u2705 \u5DF2\u53D6\u6D88\u7F6E\u9876"),0)}async comments(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("comments.list",{documentId:e,sort:"createdAt",direction:"ASC"},t),o=this.parseJson(s.body);if(!o?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let n=o.data.comments||o.data||[];if(!n.length)return console.log("\u6682\u65E0\u8BC4\u8BBA"),0;for(let r of n){let i=this.extractCommentText(r.data);console.log(` [${r.id}] ${r.createdBy?.name||"?"}: ${i}`)}return 0}async comment(e,t,s){let o=t.join(" ");if(!e||!o)return console.error("\u274C \u7528\u6CD5: wiki comment <docId> <text>"),1;let n={type:"doc",content:[{type:"paragraph",content:[{type:"text",text:o}]}]},r=await this.post("comments.create",{documentId:e,data:n},s),i=this.parseJson(r.body);return i?.data?(console.log(`\u2705 \u8BC4\u8BBA\u5DF2\u53D1\u5E03: ${i.data.id}`),0):(console.error("\u274C \u8BC4\u8BBA\u5931\u8D25:",r.body),1)}extractCommentText(e){return e?.content?e.content.flatMap(t=>t.content||[]).filter(t=>t.type==="text").map(t=>t.text).join(""):""}showHelp(){console.log(`
248
+ `)}};Xe.exports=ce});var ot=m((xs,st)=>{var Gt=require("https"),K="https://makecoder.com/wiki",Vt=`${K}/api`,D=h=>`${K}/doc/${h}`,tt=h=>`${K}/collection/${h}`,le=class{getToken(e,t){return e&&t?`${e}.${t}`:null}post(e,t,s){return new Promise((o,r)=>{let n=JSON.stringify(t),i=new URL(`${Vt}/${e}`),a={hostname:i.hostname,port:i.port||443,path:i.pathname,method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n),Authorization:`Bearer ${s}`}},c=Gt.request(a,l=>{let u="";l.on("data",d=>u+=d),l.on("end",()=>o({status:l.statusCode,body:u}))});c.on("error",r),c.write(n),c.end()})}parseJson(e){try{return JSON.parse(e)}catch{return null}}async handle({wikiSubcommand:e,wikiArg:t,wikiRemainingArgs:s,auth_ak:o,auth_sk:r}){if(!e||e==="--help"||e==="-h")return this.showHelp(),0;let n=this.getToken(o,r);if(!n)return console.error("\u274C \u7F3A\u5C11 API Key\uFF0C\u8BF7\u5148\u767B\u5F55: coder login"),1;let i=s||[];return e==="list"?await this.list(t,i,n):e==="create-collection"?await this.createCollection(i,n):e==="get"?await this.get(t,n):e==="publish"?await this.publish(t,i,n):e==="update"?await this.update(i,n):e==="delete"?await this.delete(t,i,n):e==="move"?await this.move(i,n):e==="archive"?await this.archive(t,n):e==="restore"?await this.restore(t,n):e==="drafts"?await this.drafts(n):e==="recent"?await this.recent(n):e==="search"?t?await this.search([t,...i],n):(console.error("\u274C \u8BF7\u6307\u5B9A\u641C\u7D22\u5173\u952E\u8BCD"),1):e==="stars"?await this.stars(n):e==="star"?await this.star(t,i,n):e==="unstar"?await this.unstar(t,n):e==="pins"?await this.pins(t,n):e==="pin"?await this.pin(t,i,n):e==="unpin"?await this.unpin(t,n):e==="comments"?await this.comments(t,n):e==="comment"?await this.comment(t,i,n):(console.error(`\u274C \u672A\u77E5\u5B50\u547D\u4EE4: ${e}`),this.showHelp(),1)}async list(e,t,s){let o=t.indexOf("-d"),r=o!==-1?parseInt(t[o+1],10):null;if(!e){let c=await this.post("collections.list",{includeListOnly:!0},s),l=this.parseJson(c.body);if(!l?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",c.body),1;let u=l.data.collections||l.data||[];return u.length?(this.printTable(u.map(d=>({collectionId:d.id,\u76EE\u5F55\u540D\u79F0:d.name,URL:tt(d.urlId||d.id)}))),0):(console.log("\u6682\u65E0\u76EE\u5F55"),0)}if(r===null){let c=await this.post("documents.list",{collectionId:e,sort:"updatedAt",direction:"DESC"},s),l=this.parseJson(c.body);if(!l?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",c.body),1;let u=l.data.documents||l.data||[];return u.length?(this.printTable(u.map(d=>({docId:d.id,\u6807\u9898:d.title,URL:D(d.urlId||d.id)}))),0):(console.log("\u6682\u65E0\u6587\u6863"),0)}let n=await this.post("collections.documents",{id:e},s),i=this.parseJson(n.body);if(!i?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",n.body),1;let a=r===-1?1/0:r;return this.printTree(i.data,"",a,0),0}printTree(e,t,s,o){if(Array.isArray(e))for(let r=0;r<e.length;r++){let n=e[r],i=r===e.length-1,a=i?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",c=n.url?`${K}${n.url}`:D(n.id);console.log(`${t}${a}${n.title||n.id} \x1B[90m${c}\x1B[0m`),n.children?.length&&o+1<s&&this.printTree(n.children,t+(i?" ":"\u2502 "),s,o+1)}}printTable(e){if(!e.length)return;let t=Object.keys(e[0]),s=i=>[...String(i)].reduce((a,c)=>a+(c.charCodeAt(0)>127?2:1),0),o=(i,a)=>i+" ".repeat(Math.max(0,a-s(i))),r=t.map(i=>Math.max(s(i),...e.map(a=>s(a[i]||"")))),n=r.map(i=>"-".repeat(i)).join("-+-");console.log(t.map((i,a)=>o(i,r[a])).join(" | ")),console.log(n);for(let i of e)console.log(t.map((a,c)=>o(String(i[a]||""),r[c])).join(" | "))}async createCollection(e,t){let s=e[0];if(!s)return console.error("\u274C \u8BF7\u6307\u5B9A\u76EE\u5F55\u540D\u79F0"),1;let o=e.slice(1).join(" "),r=await this.post("collections.create",{name:s,description:o,permission:"read_write",sharing:!0},t),n=this.parseJson(r.body);return n?.data?(console.log(`\u2705 \u76EE\u5F55\u5DF2\u521B\u5EFA: ${n.data.id} \u2014 ${n.data.name}`),0):(console.error("\u274C \u521B\u5EFA\u5931\u8D25:",r.body),1)}async get(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.info",{id:e},t),o=this.parseJson(s.body);if(!o?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let r=o.data;return console.log(`\u6807\u9898: ${r.title}`),console.log(`ID: ${r.id}`),console.log(`\u76EE\u5F55: ${r.collectionId}`),console.log(`\u66F4\u65B0: ${r.updatedAt}`),r.text&&console.log(`
249
+ ${r.text}`),0}async publish(e,t,s){let o=require("fs"),r=require("path");if(!e)return console.error(`\u274C \u7528\u6CD5: wiki publish <collectionId> <title> [text]
250
+ wiki publish <collectionId> --file <path> [--parent <parentDocId>]`),1;let n,i,a,c=t.indexOf("--file"),l=t.indexOf("--parent");if(l!==-1&&(a=t[l+1]),c!==-1){let p=t[c+1];if(!p)return console.error("\u274C \u8BF7\u6307\u5B9A --file \u8DEF\u5F84"),1;let y=r.resolve(p);if(!o.existsSync(y))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${y}`),1;i=o.readFileSync(y,"utf8");let I=i.match(/^#\s+(.+)/m);if(!I)return console.error("\u274C \u6587\u4EF6\u7F3A\u5C11 H1 \u6807\u9898\uFF08# \u6807\u9898\uFF09\uFF0C\u8BF7\u6DFB\u52A0\u540E\u91CD\u8BD5"),1;n=I[1].trim()}else if(n=t[0],i=t.slice(1).join(" "),!n)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6807\u9898"),1;let u={collectionId:e,title:n,text:"",publish:!0};a&&(u.parentDocumentId=a);let d=await this.post("documents.create",u,s),g=this.parseJson(d.body);if(!g?.data)return console.error("\u274C \u521B\u5EFA\u6587\u6863\u5931\u8D25:",d.body),1;let C=g.data.id;console.log(` \u521B\u5EFA\u6587\u6863: ${C}`);let B=await this.post("documents.update",{id:C,title:n,text:i,publish:!0},s),A=this.parseJson(B.body);return A?.data?(console.log(`\u2705 \u6587\u6863\u5DF2\u53D1\u5E03: ${A.data.title}
251
+ ${D(A.data.urlId||C)}`),0):(console.error("\u274C \u66F4\u65B0\u5185\u5BB9\u5931\u8D25:",B.body),1)}async update(e,t){let s=require("fs"),o=require("path"),r=e[0];if(!r)return console.error("\u274C \u7528\u6CD5: wiki update <docId> <title> [text] | <docId> --file <path>"),1;let n,i,a=e.indexOf("--file");if(a!==-1){let d=e[a+1];if(!d)return console.error("\u274C \u8BF7\u6307\u5B9A --file \u8DEF\u5F84"),1;let g=o.resolve(d);if(!s.existsSync(g))return console.error(`\u274C \u6587\u4EF6\u4E0D\u5B58\u5728: ${g}`),1;i=s.readFileSync(g,"utf8");let C=i.match(/^#\s+(.+)/m);if(!C)return console.error("\u274C \u6587\u4EF6\u7F3A\u5C11 H1 \u6807\u9898\uFF08# \u6807\u9898\uFF09\uFF0C\u8BF7\u6DFB\u52A0\u540E\u91CD\u8BD5"),1;n=C[1].trim()}else if(n=e[1],i=e.slice(2).join(" "),!n)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6807\u9898"),1;let c={id:r,title:n,publish:!0};i&&(c.text=i);let l=await this.post("documents.update",c,t),u=this.parseJson(l.body);return u?.data?(console.log(`\u2705 \u6587\u6863\u5DF2\u66F4\u65B0: ${u.data.title}`),0):(console.error("\u274C \u66F4\u65B0\u5931\u8D25:",l.body),1)}async delete(e,t,s){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let o=t.includes("--permanent"),r=await this.post("documents.delete",{id:e,...o?{permanent:!0}:{}},s);return this.parseJson(r.body)?.ok===!1||r.status>=400?(console.error("\u274C \u5220\u9664\u5931\u8D25:",r.body),1):(console.log(`\u2705 \u6587\u6863\u5DF2${o?"\u6C38\u4E45":""}\u5220\u9664`),0)}async move(e,t){let[s,o,r]=e;if(!s||!o)return console.error("\u274C \u7528\u6CD5: wiki move <docId> <collectionId> [parentDocId]"),1;let n={id:s,collectionId:o};r&&(n.parentDocumentId=r);let i=await this.post("documents.move",n,t);return this.parseJson(i.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u79FB\u52A8"),0):(console.error("\u274C \u79FB\u52A8\u5931\u8D25:",i.body),1)}async archive(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.archive",{id:e},t);return this.parseJson(s.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u5F52\u6863"),0):(console.error("\u274C \u5F52\u6863\u5931\u8D25:",s.body),1)}async restore(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("documents.restore",{id:e},t);return this.parseJson(s.body)?.data?(console.log("\u2705 \u6587\u6863\u5DF2\u6062\u590D"),0):(console.error("\u274C \u6062\u590D\u5931\u8D25:",s.body),1)}async drafts(e){let t=await this.post("documents.drafts",{sort:"updatedAt",direction:"DESC"},e),s=this.parseJson(t.body);if(!s?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",t.body),1;let o=s.data.documents||s.data||[];return o.length?(this.printTable(o.map(r=>({ID:r.id,\u6807\u9898:r.title,URL:D(r.urlId||r.id)}))),0):(console.log("\u6682\u65E0\u8349\u7A3F"),0)}async recent(e){let t=await this.post("documents.viewed",{sort:"updatedAt",direction:"DESC"},e),s=this.parseJson(t.body);if(!s?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",t.body),1;let o=s.data.documents||s.data||[];return o.length?(this.printTable(o.map(r=>({ID:r.id,\u6807\u9898:r.title,URL:D(r.urlId||r.id)}))),0):(console.log("\u6682\u65E0\u6D4F\u89C8\u8BB0\u5F55"),0)}async search(e,t){let s=e.join(" "),o=await this.post("documents.search",{query:s,snippetMinWords:20,snippetMaxWords:30},t),r=this.parseJson(o.body);if(!r?.data)return console.error("\u274C \u641C\u7D22\u5931\u8D25:",o.body),1;let n=r.data||[];return n.length?(console.log(`\u627E\u5230 ${n.length} \u4E2A\u7ED3\u679C:
252
+ `),this.printTable(n.map(i=>{let a=i.document||i;return{docId:a.id,\u6807\u9898:a.title,URL:D(a.urlId||a.id)}})),0):(console.log(`\u6CA1\u6709\u627E\u5230\u4E0E "${s}" \u76F8\u5173\u7684\u6587\u6863`),0)}async stars(e){let t=await this.post("stars.list",{},e),s=this.parseJson(t.body);if(!s?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",t.body),1;let o=s.data.stars||s.data||[];return o.length?(this.printTable(o.map(r=>({starId:r.id,\u6807\u9898:r.document?.title||r.collection?.name||"",URL:r.document?D(r.document.urlId||r.document.id):r.collection?tt(r.collection.urlId||r.collection.id):""}))),0):(console.log("\u6682\u65E0\u6536\u85CF"),0)}async star(e,t,s){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863\u6216\u76EE\u5F55 ID"),1;let r=t.includes("--collection")?{collectionId:e}:{documentId:e},n=await this.post("stars.create",r,s);return this.parseJson(n.body)?.data?(console.log("\u2705 \u5DF2\u6536\u85CF"),0):(console.error("\u274C \u6536\u85CF\u5931\u8D25:",n.body),1)}async unstar(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6536\u85CF ID"),1;let s=await this.post("stars.delete",{id:e},t);return s.status>=400?(console.error("\u274C \u53D6\u6D88\u6536\u85CF\u5931\u8D25:",s.body),1):(console.log("\u2705 \u5DF2\u53D6\u6D88\u6536\u85CF"),0)}async pins(e,t){let s=e?{collectionId:e}:{},o=await this.post("pins.list",s,t),r=this.parseJson(o.body);if(!r?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",o.body),1;let n=r.data.pins||r.data||[];return n.length?(this.printTable(n.map(i=>({pinId:i.id,\u6807\u9898:i.document?.title||i.documentId,URL:D(i.document?.urlId||i.documentId)}))),0):(console.log("\u6682\u65E0\u7F6E\u9876"),0)}async pin(e,t,s){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let o={documentId:e,...t[0]?{collectionId:t[0]}:{}},r=await this.post("pins.create",o,s),n=this.parseJson(r.body);return n?.data?(console.log(`\u2705 \u5DF2\u7F6E\u9876: ${n.data.id}`),0):(console.error("\u274C \u7F6E\u9876\u5931\u8D25:",r.body),1)}async unpin(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u7F6E\u9876 ID"),1;let s=await this.post("pins.delete",{id:e},t);return s.status>=400?(console.error("\u274C \u53D6\u6D88\u7F6E\u9876\u5931\u8D25:",s.body),1):(console.log("\u2705 \u5DF2\u53D6\u6D88\u7F6E\u9876"),0)}async comments(e,t){if(!e)return console.error("\u274C \u8BF7\u6307\u5B9A\u6587\u6863 ID"),1;let s=await this.post("comments.list",{documentId:e,sort:"createdAt",direction:"ASC"},t),o=this.parseJson(s.body);if(!o?.data)return console.error("\u274C \u8BF7\u6C42\u5931\u8D25:",s.body),1;let r=o.data.comments||o.data||[];if(!r.length)return console.log("\u6682\u65E0\u8BC4\u8BBA"),0;for(let n of r){let i=this.extractCommentText(n.data);console.log(` [${n.id}] ${n.createdBy?.name||"?"}: ${i}`)}return 0}async comment(e,t,s){let o=t.join(" ");if(!e||!o)return console.error("\u274C \u7528\u6CD5: wiki comment <docId> <text>"),1;let r={type:"doc",content:[{type:"paragraph",content:[{type:"text",text:o}]}]},n=await this.post("comments.create",{documentId:e,data:r},s),i=this.parseJson(n.body);return i?.data?(console.log(`\u2705 \u8BC4\u8BBA\u5DF2\u53D1\u5E03: ${i.data.id}`),0):(console.error("\u274C \u8BC4\u8BBA\u5931\u8D25:",n.body),1)}extractCommentText(e){return e?.content?e.content.flatMap(t=>t.content||[]).filter(t=>t.type==="text").map(t=>t.text).join(""):""}showHelp(){console.log(`
254
253
  coder wiki \u2014 \u7BA1\u7406 MakeCoder \u77E5\u8BC6\u5E93
255
254
 
256
255
  USAGE:
@@ -292,13 +291,13 @@ EXAMPLES:
292
291
  coder wiki publish <collectionId> --file ./doc.md
293
292
  coder wiki search "\u5173\u952E\u8BCD"
294
293
  coder wiki comment <docId> "\u5F88\u6709\u5E2E\u52A9\uFF01"
295
- `)}};Xe.exports=ae});var tt=m((Es,et)=>{var jt=me(),Rt=Ue(),Ht=Be(),Gt=Ne(),Vt=Ge(),Kt=We(),Wt=Qe(),zt=Ze(),{isPrintMode:Jt}=N(),ce=class{constructor(){this.argParser=new jt,this.claudeLauncher=new Rt,this.geminiLauncher=new Ht,this.codexLauncher=new Gt,this.vscodeExtensionService=new Vt,this.publishService=new Kt,this.skillsService=new Wt,this.wikiService=new zt}async run(e=process.argv.slice(2)){try{try{await this.vscodeExtensionService.ensureExtensionInstalled()}catch(s){process.env.CODEV_DEBUG&&console.error("VSCode Extension Service Error:",s)}if(!e.includes("--agent")&&!e.includes("-a")){let s=e.length>0&&["claude","gemini","codex"].includes(e[0]),o=e.length>0&&["pub","update","skills","wiki"].includes(e[0]);if(!s&&!o&&(e.includes("--help")||e.includes("-h")))return this.argParser.showHelp(),0;if(!s&&!o&&(e.includes("--version")||e.includes("-v")))return this.showVersion(),0}let t=await this.argParser.parse(e);return t.command==="login"?await this.handleLogin(t):t.command==="update"?this.handleUpdate():t.command==="skills"?await this.skillsService.handle(t):t.command==="wiki"?await this.wikiService.handle(t):t.command==="pub"?await this.publishService.publish({name:t.pubName,ak:t.auth_ak,sk:t.auth_sk,serverBaseUrl:t.codevServer,allowClone:t.allowClone}):await this.launchAgent(t)}catch(t){return console.error(`Error: ${t.message}`),process.env.CODEV_DEBUG&&console.error("Stack trace:",t.stack),1}}async launchAgent(e){let{agent:t,remainingArgs:s}=e;return Jt(s)||console.log(`cwd:\x1B[90m\x1B[3m ${process.cwd()} \x1B[0m`),t==="claude"?await this.claudeLauncher.launch(e):t==="gemini"?await this.geminiLauncher.launch(e):t==="codex"?await this.codexLauncher.launch(e):1}async handleLogin(e){let t=e.auth_ak,s=e.auth_sk;if(!t||!s){console.log(`
294
+ `)}};st.exports=le});var rt=m((Ds,nt)=>{var Kt=Ce(),zt=Le(),Wt=Re(),Jt=Ge(),Qt=We(),Yt=Ye(),Zt=et(),Xt=ot(),{isPrintMode:es}=R(),ue=class{constructor(){this.argParser=new Kt,this.claudeLauncher=new zt,this.geminiLauncher=new Wt,this.codexLauncher=new Jt,this.vscodeExtensionService=new Qt,this.publishService=new Yt,this.skillsService=new Zt,this.wikiService=new Xt}async run(e=process.argv.slice(2)){try{try{await this.vscodeExtensionService.ensureExtensionInstalled()}catch(s){process.env.CODEV_DEBUG&&console.error("VSCode Extension Service Error:",s)}if(!e.includes("--agent")&&!e.includes("-a")){let s=e.length>0&&["claude","gemini","codex"].includes(e[0]),o=e.length>0&&["pub","update","skills","wiki"].includes(e[0]);if(!s&&!o&&(e.includes("--help")||e.includes("-h")))return this.argParser.showHelp(),0;if(!s&&!o&&(e.includes("--version")||e.includes("-v")))return this.showVersion(),0}let t=await this.argParser.parse(e);return t.command==="login"?await this.handleLogin(t):t.command==="update"?this.handleUpdate():t.command==="skills"?await this.skillsService.handle(t):t.command==="wiki"?await this.wikiService.handle(t):t.command==="pub"?await this.publishService.publish({name:t.pubName,ak:t.auth_ak,sk:t.auth_sk,serverBaseUrl:t.codevServer,allowClone:t.allowClone}):await this.launchAgent(t)}catch(t){return console.error(`Error: ${t.message}`),process.env.CODEV_DEBUG&&console.error("Stack trace:",t.stack),1}}async launchAgent(e){let{agent:t,remainingArgs:s}=e;return es(s)||console.log(`cwd:\x1B[90m\x1B[3m ${process.cwd()} \x1B[0m`),t==="claude"?await this.claudeLauncher.launch(e):t==="gemini"?await this.geminiLauncher.launch(e):t==="codex"?await this.codexLauncher.launch(e):1}async handleLogin(e){let t=e.auth_ak,s=e.auth_sk;if(!t||!s){console.log(`
296
295
  \u{1F511} \u8BF7\u5148\u5728 MakeCoder \u521B\u5EFA API Key\uFF1A`),console.log(` \u{1F449} https://makecoder.com/my/apikeys
297
- `);try{let n=await this.argParser.promptForAKSK();t=n.ak,s=n.sk}catch(n){return console.error(`\u274C ${n.message}`),1}}if(this.argParser.saveAuthToConfig(t,s))console.log("\u2705 API Key \u5DF2\u4FDD\u5B58\u5230 ~/.coder/config.json"),console.log(" \u73B0\u5728\u53EF\u4EE5\u76F4\u63A5\u8FD0\u884C coder \u5F00\u59CB\u4F7F\u7528\u4E86 \u{1F680}");else return console.error("\u274C \u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 ~/.coder/ \u76EE\u5F55\u7684\u6587\u4EF6\u6743\u9650"),1;return 0}handleUpdate(){let{execSync:e}=require("child_process"),t=q();console.log(`\u5F53\u524D\u7248\u672C: ${t.version}`),console.log(`\u6B63\u5728\u5347\u7EA7 Coder...
296
+ `);try{let r=await this.argParser.promptForAKSK();t=r.ak,s=r.sk}catch(r){return console.error(`\u274C ${r.message}`),1}}if(this.argParser.saveAuthToConfig(t,s))console.log("\u2705 API Key \u5DF2\u4FDD\u5B58\u5230 ~/.coder/config.json"),console.log(" \u73B0\u5728\u53EF\u4EE5\u76F4\u63A5\u8FD0\u884C coder \u5F00\u59CB\u4F7F\u7528\u4E86 \u{1F680}");else return console.error("\u274C \u4FDD\u5B58\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 ~/.coder/ \u76EE\u5F55\u7684\u6587\u4EF6\u6743\u9650"),1;return 0}handleUpdate(){let{execSync:e}=require("child_process"),t=q();console.log(`\u5F53\u524D\u7248\u672C: ${t.version}`),console.log(`\u6B63\u5728\u5347\u7EA7 Coder...
298
297
  `);try{return e("npm install -g makecoder@latest",{stdio:"inherit"}),console.log(`
299
298
  \u2705 \u5347\u7EA7\u6210\u529F`),0}catch(s){return console.error(`
300
299
  \u274C \u5347\u7EA7\u5931\u8D25:`,s.message),1}}showVersion(){let e=q();console.log(`coder version: ${e.version}`)}async shutdown(){console.log(`
301
- Shutting down...`),process.exit(0)}};et.exports=ce});var Qt=tt(),{isPrintMode:Yt}=N();process.on("unhandledRejection",(h,e)=>{console.error("Unhandled Promise Rejection:",h),process.exit(1)});process.on("uncaughtException",h=>{console.error("Uncaught Exception:",h.message),process.env.CODEV_DEBUG&&console.error(h.stack),process.exit(1)});async function Xt(){if(!Yt()){let{version:e}=q();console.log(`Welcome to Coder v${e}!
302
- `)}let h=new Qt;process.on("SIGINT",async()=>{console.log(`
300
+ Shutting down...`),process.exit(0)}};nt.exports=ue});var ts=rt(),{isPrintMode:ss}=R();process.on("unhandledRejection",(h,e)=>{console.error("Unhandled Promise Rejection:",h),process.exit(1)});process.on("uncaughtException",h=>{console.error("Uncaught Exception:",h.message),process.env.CODEV_DEBUG&&console.error(h.stack),process.exit(1)});async function os(){if(!ss()){let{version:e}=q();console.log(`Welcome to Coder v${e}!
301
+ `)}let h=new ts;process.on("SIGINT",async()=>{console.log(`
303
302
  Received SIGINT, shutting down gracefully...`),await h.shutdown()}),process.on("SIGTERM",async()=>{console.log(`
304
- Received SIGTERM, shutting down gracefully...`),await h.shutdown()});try{let e=await h.run();process.exit(e)}catch(e){console.error(`Fatal error: ${e.message}`),process.env.CODEV_DEBUG&&console.error(e.stack),process.exit(1)}}Xt().catch(h=>{console.error(`Startup error: ${h.message}`),process.exit(1)});
303
+ Received SIGTERM, shutting down gracefully...`),await h.shutdown()});try{let e=await h.run();process.exit(e)}catch(e){console.error(`Fatal error: ${e.message}`),process.env.CODEV_DEBUG&&console.error(e.stack),process.exit(1)}}os().catch(h=>{console.error(`Startup error: ${h.message}`),process.exit(1)});