coze-coding-dev-sdk 0.7.18-beta.6 → 0.7.18-beta.9

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.
@@ -70,4 +70,4 @@ Image URL: ${o.data[0].url}`)),e.output)){n.start("Downloading image...");let i=
70
70
  ✓ Result saved to: ${e.output}`)))}catch(e){n.fail(G.red("✗ Video generation failed")),console.error(G.red(`Error: ${e.message}`)),process.exit(1)}}),eK=new g("search").description("Search the web using AI").requiredOption("-q, --query <text>","Search query").option("--type <type>","Search type (web or image)","web").option("--count <number>","Number of results","10").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let n=ev("Searching...").start();try{let i,a=new m.Config,u=eQ(e.header),t=new m.SearchClient(a,u,e.verbose);i="image"===e.type?await t.imageSearch(e.query,parseInt(e.count)):await t.webSearch(e.query,parseInt(e.count)),n.succeed(G.green("Search completed!")),"image"===e.type&&i.image_items?i.image_items.forEach((e,n)=>{console.log(G.cyan(`
71
71
  [${n+1}] ${e.title||"Image"}`)),console.log(G.gray(e.url||"")),console.log(G.yellow(`Image URL: ${e.image.url}`))}):i.web_items&&i.web_items.forEach((e,n)=>{console.log(G.cyan(`
72
72
  [${n+1}] ${e.title}`)),console.log(G.gray(e.url||"")),e.snippet&&console.log(e.snippet)})}catch(e){n.fail(G.red("Search failed")),console.error(G.red(e.message)),process.exit(1)}}),eW=new g("tts").description("Text-to-speech conversion").requiredOption("-t, --text <text>","Text to convert to speech").option("--speaker <speaker>","Speaker voice to use","zh_female_xiaohe_uranus_bigtts").option("--mock","Use mock mode (test run)").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).action(async e=>{let n=ev("Converting text to speech...").start();try{let i=new m.Config,a={},u=eQ(e.header);u&&Object.assign(a,u),e.mock&&(a[eN]=ek,console.log(G.yellow("\uD83E\uDDEA Mock mode enabled (test run)")));let t=new m.TTSClient(i,Object.keys(a).length>0?a:void 0),o=await t.synthesize({uid:"cli-user",text:e.text,speaker:e.speaker});n.succeed(G.green("Text-to-speech conversion completed!")),console.log(G.cyan(`Audio URL: ${o.audioUri}`)),console.log(G.cyan(`Audio Size: ${o.audioSize} bytes`))}catch(e){n.fail(G.red("Text-to-speech conversion failed")),console.error(G.red(e.message)),process.exit(1)}}),eI=new g("asr").description("Automatic speech recognition").option("-u, --url <url>","Audio file URL").option("-f, --file <path>","Local audio file path (will be base64 encoded)").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let n=ev("Recognizing speech...").start();try{e.url||e.file||(n.fail(G.red("Please provide either --url or --file")),process.exit(1));let i=new m.Config,a=eQ(e.header),u=new m.ASRClient(i,a,e.verbose),t=e.url?{url:e.url}:{base64Data:eP.readFileSync(eB.resolve(e.file)).toString("base64")},o=await u.recognize(t);n.succeed(G.green("Speech recognition completed!")),console.log(G.cyan("\nRecognized text:")),console.log(o.text)}catch(e){n.fail(G.red("Speech recognition failed")),console.error(G.red(e.message)),process.exit(1)}}),ej=new g("chat").description("Chat with AI using LLM").requiredOption("-p, --prompt <text>","User prompt").option("-s, --system <text>","System prompt").option("--model <model>","Model to use","doubao-seed-1-6-251015").option("--temperature <number>","Temperature (0-2)","0.7").option("--stream","Enable streaming output",!1).option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{try{let n=new m.Config,i=new m.LLMClient(n),a=eQ(e.header),u=[];e.system&&u.push({role:"system",content:e.system}),u.push({role:"user",content:e.prompt});let t={model:e.model,temperature:parseFloat(e.temperature)};if(e.stream){for await(let e of(console.log(G.cyan("\nAI Response:")),i.stream(u,t,void 0,a)))e.content&&process.stdout.write(e.content.toString());console.log("\n")}else{let e=ev("Generating response...").start(),n=await i.invoke(u,t,void 0,a);e.succeed(G.green("Response generated!")),console.log(G.cyan("\nAI Response:")),console.log(n.content)}}catch(e){console.error(G.red("Chat failed")),console.error(G.red(e.message)),process.exit(1)}}),eU=process.env.COZE_PROJECT_TYPE,ez="wechat_mini_program"===eU,e$="app"===eU,eq=(i=process.cwd(),a="server"===eB.basename(i),ez||e$?a?"src/storage/database/shared/schema.ts":"server/src/storage/database/shared/schema.ts":"src/storage/database/shared/schema.ts"),eV=new g("db").description("Database operations");eV.command("generate-models").description("Generate ORM models from database schema").option("-o, --output <path>","Output file path",eq).option("-v, --verbose","Enable verbose output").action(async e=>{let n=ev("Generating models from database...").start();try{let{generateModels:i}=await Promise.resolve().then(__webpack_require__.bind(__webpack_require__,"./src/database/index.ts")),a=eB.resolve(e.output);await i({outputPath:a,verbose:e.verbose}),n.succeed(G.green(`Models generated at ${a}`))}catch(e){n.fail(G.red("Failed to generate models")),console.error(G.red(e.message)),process.exit(1)}}),eV.command("upgrade").description("Push schema changes to database").option("-s, --schema <path>","Schema file path",eq).option("-p, --project <path>","Project root path",process.cwd()).option("-v, --verbose","Enable verbose output").action(async e=>{let n=ev("Pushing schema to database...").start();try{let{upgrade:i}=await Promise.resolve().then(__webpack_require__.bind(__webpack_require__,"./src/database/index.ts"));await i({schemaPath:e.schema,projectPath:e.project,verbose:e.verbose}),n.succeed(G.green("Database schema updated successfully"))}catch(e){n.fail(G.red("Failed to upgrade database")),console.error(G.red(e.message)),process.exit(1)}});let e0=new g("embedding").description("Generate embeddings for text, images, or videos using AI").option("-t, --text <text>","Text to embed (can be used multiple times)",(e,n)=>n.concat([e]),[]).option("--image-url <url>","Image URL to embed (can be used multiple times)",(e,n)=>n.concat([e]),[]).option("--video-url <url>","Video URL to embed (can be used multiple times)",(e,n)=>n.concat([e]),[]).option("-d, --dimensions <number>","Output embedding dimensions",parseInt).option("--instructions <text>","Instructions for embedding generation").option("--multi-embedding","Enable multi-embedding mode").option("--sparse-embedding","Enable sparse embedding mode").option("-o, --output <path>","Output file path for embedding JSON").option("--mock","Use mock mode (test run)").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let n=e.text&&e.text.length>0,i=e.imageUrl&&e.imageUrl.length>0,a=e.videoUrl&&e.videoUrl.length>0;n||i||a||(console.error(G.red("Error: At least one of --text, --image-url, or --video-url is required")),process.exit(1));let u=ev("Generating embeddings...").start();try{let t=new m.Config,o={},l=eQ(e.header);l&&Object.assign(o,l),e.mock&&(o[eN]=ek,console.log(G.yellow("\uD83E\uDDEA Mock mode enabled (test run)")));let r=new m.EmbeddingClient(t,Object.keys(o).length>0?o:void 0,e.verbose),s=await r.embed(n?e.text:void 0,i?e.imageUrl:void 0,a?e.videoUrl:void 0,{dimensions:e.dimensions,instructions:e.instructions,multiEmbedding:e.multiEmbedding,sparseEmbedding:e.sparseEmbedding});if(u.succeed(G.green("Embeddings generated successfully!")),console.log(G.cyan(`Model: ${s.model}`)),s.data?.embedding&&(console.log(G.cyan(`Embedding dimensions: ${s.data.embedding.length}`)),console.log(G.gray(`First 5 values: [${s.data.embedding.slice(0,5).join(", ")}...]`))),s.data?.multi_embedding&&console.log(G.cyan(`Multi-embedding vectors: ${s.data.multi_embedding.length}`)),s.data?.sparse_embedding&&console.log(G.cyan(`Sparse embedding items: ${s.data.sparse_embedding.length}`)),s.usage&&console.log(G.gray(`Tokens used: ${s.usage.total_tokens}`)),e.output){let n=eB.resolve(e.output);eP.writeFileSync(n,JSON.stringify(s,null,2)),console.log(G.green(`Embedding saved to ${n}`))}}catch(e){u.fail(G.red("Failed to generate embeddings")),console.error(G.red(e.message)),process.exit(1)}}),e1=new g("knowledge").description("Knowledge Base tools");e1.command("search").description("Search for knowledge chunks").requiredOption("-q, --query <text>","Search query").option("-d, --dataset <name>","Dataset names (tables) to search in (can be used multiple times)",(e,n)=>n.concat([e]),[]).option("-k, --top-k <number>","Number of results to return","5").option("-m, --min-score <number>","Minimum similarity score","0.0").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let n=ev("Searching...").start();try{let i=new m.Config,a=eQ(e.header),u=new m.KnowledgeClient(i,a,e.verbose),t=await u.search(e.query,e.dataset.length>0?e.dataset:void 0,parseInt(e.topK),parseFloat(e.minScore));if(0!==t.code)return void n.fail(G.red(`Error ${t.code}: ${t.msg}`));n.succeed(G.green("Search completed!")),console.log(G.bold("\nSearch Results:")),console.log("────────────────────────────────────────────────────────────────────────────────"),0===t.chunks.length&&console.log(G.yellow("No matching chunks found.")),t.chunks.forEach((e,n)=>{console.log(G.cyan(`[${n+1}] Score: ${e.score.toFixed(4)}`)),e.doc_id&&console.log(G.dim(`Doc ID: ${e.doc_id}`)),e.chunk_id&&console.log(G.dim(`Chunk ID: ${e.chunk_id}`)),console.log(G.green("Content:")),console.log(e.content),console.log("────────────────────────────────────────────────────────────────────────────────")})}catch(e){n.fail(G.red("Search failed")),console.error(G.red(e.message)),process.exit(1)}}),e1.command("add").description("Add documents to knowledge base").requiredOption("-d, --dataset <name>","Dataset name (table) to add to").option("-c, --content <text>","Raw text content to add (can be used multiple times)",(e,n)=>n.concat([e]),[]).option("-u, --url <url>","Web URL to add (can be used multiple times)",(e,n)=>n.concat([e]),[]).option("--chunk-separator <char>","Chunk separator","\\n").option("--max-tokens <number>","Max tokens per chunk","500").option("--remove-extra-spaces","Normalize extra spaces",!1).option("--remove-urls-emails","Strip URLs and emails",!1).option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,n)=>n.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let n=ev("Adding documents...").start();try{let i=new m.Config,a=eQ(e.header),u=new m.KnowledgeClient(i,a,e.verbose),t=[];if(e.content&&e.content.forEach(e=>{t.push({source:m.DataSourceType.TEXT,raw_data:e})}),e.url&&e.url.forEach(e=>{t.push({source:m.DataSourceType.URL,url:e})}),0===t.length)return void n.fail(G.red("No content or URL provided to add."));let o={separator:e.chunkSeparator.replace(/\\n/g,"\n"),max_tokens:parseInt(e.maxTokens),remove_extra_spaces:e.removeExtraSpaces,remove_urls_emails:e.removeUrlsEmails},l=await u.addDocuments(t,e.dataset,o);if(0!==l.code)return void n.fail(G.red(`Error ${l.code}: ${l.msg}`));n.succeed(G.green("Documents added successfully!")),l.doc_ids&&l.doc_ids.length>0&&(console.log(G.cyan(`
73
- Added ${l.doc_ids.length} documents.`)),console.log(G.dim(`Doc IDs: ${l.doc_ids.join(", ")}`)))}catch(e){n.fail(G.red("Add documents failed")),console.error(G.red(e.message)),process.exit(1)}});let e2=new g("supabase").description("Supabase 管理命令,包括 Edge Functions、Storage Buckets 和 Auth 配置管理"),e3=e2.command("func").description("Edge Functions(边缘函数)管理命令");e3.command("list").description("列出所有 Edge Functions").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/list")),n&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(n))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({functions:[],mock:!0},null,2));return}let i=ev("Fetching functions...").start();try{let a=new m.Config,u=new m.SupabaseClient(a,n),t=await u.listFunctions();e.verbose&&(i.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),t.code)),0!==t.code&&(i.fail(G.red(`Error: ${t.msg}`)),process.exit(1)),i.succeed(G.green("Functions fetched successfully!")),console.log(JSON.stringify(t.functions,null,2))}catch(e){i.fail(G.red("Failed to fetch functions")),console.error(G.red(e.message)),process.exit(1)}}),e3.command("get").description("获取 Edge Function 详情和源码").argument("<slug>",'函数标识符,即函数的唯一名称(如 "hello-world"),可通过 "func list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/get")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({function:{slug:e},files:[],mock:!0},null,2));return}let a=ev("Fetching function...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.getFunction(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Function fetched successfully!")),console.log(JSON.stringify({function:o.function,files:o.files},null,2))}catch(e){a.fail(G.red("Failed to fetch function")),console.error(G.red(e.message)),process.exit(1)}}),e3.command("deploy").description("部署或更新 Edge Function。如果函数已存在则更新,不存在则创建新函数").argument("<slug>",'函数标识符,只能包含小写字母、数字和连字符(如 "hello-world")').option("-c, --code <code>","函数代码字符串(用于单文件函数),与 --file 二选一").option("-f, --file <items...>","文件名和内容对,格式:--file <文件名> <内容>,可多次使用,例如:--file index.ts 'Deno.serve(...)' --file handler.ts 'export ...'").option("-n, --name <name>","函数显示名称,用于在控制台中展示").option("-e, --entrypoint <path>",'入口文件名称,多文件部署时必需,指定主入口文件(如 "index.ts")').option("--verify-jwt","启用 JWT 验证,调用函数需要携带有效的 JWT token").option("--no-verify-jwt","禁用 JWT 验证").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i,a=n.code;if(n.file&&n.file.length>0){n.file.length%2!=0&&(console.error(G.red("Error: --file requires pairs of <name> <content>")),process.exit(1)),i=[];for(let e=0;e<n.file.length;e+=2)i.push({name:n.file[e],content:n.file[e+1]})}a||i||(console.error(G.red("Error: Either --code or --file is required")),process.exit(1));let u=eQ(n.header),t={code:a,files:i,name:n.name,entrypoint:n.entrypoint,verify_jwt:n.verifyJwt};if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/deploy")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{slug:e,...t,code:a?`${a.substring(0,50)}...`:void 0}),u&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(u))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,slug:e,version:1,mock:!0},null,2));return}let o=ev("Deploying function...").start();try{let i=new m.Config,a=new m.SupabaseClient(i,u),l=await a.deployFunction(e,t);n.verbose&&(o.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),l.code)),0!==l.code&&(o.fail(G.red(`Error: ${l.msg}`)),process.exit(1)),o.succeed(G.green("Function deployed successfully!")),console.log(JSON.stringify({success:l.success,slug:l.slug,version:l.version},null,2))}catch(e){o.fail(G.red("Failed to deploy function")),console.error(G.red(e.message)),process.exit(1)}}),e3.command("delete").description("删除 Edge Function。⚠️ 警告:此操作不可逆,删除后函数将无法恢复").argument("<slug>",'函数标识符,可通过 "func list" 命令查看所有函数的 slug').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/delete")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let a=ev("Deleting function...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.deleteFunction(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Function deleted successfully!")),console.log(JSON.stringify({success:o.success},null,2))}catch(e){a.fail(G.red("Failed to delete function")),console.error(G.red(e.message)),process.exit(1)}});let e8=e2.command("bucket").description("Storage Buckets(存储桶)管理命令");e8.command("list").description("列出所有 Storage Buckets").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/list")),n&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(n))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({buckets:[],mock:!0},null,2));return}let i=ev("Fetching buckets...").start();try{let a=new m.Config,u=new m.SupabaseClient(a,n),t=await u.listBuckets();e.verbose&&(i.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),t.code)),0!==t.code&&(i.fail(G.red(`Error: ${t.msg}`)),process.exit(1)),i.succeed(G.green("Buckets fetched successfully!")),console.log(JSON.stringify(t.buckets,null,2))}catch(e){i.fail(G.red("Failed to fetch buckets")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("get").description("获取 Storage Bucket 详情").argument("<bucket_id>",'存储桶 ID,即存储桶的唯一标识符(如 "avatars"),可通过 "bucket list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/get")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({bucket:{id:e},mock:!0},null,2));return}let a=ev("Fetching bucket...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.getBucket(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Bucket fetched successfully!")),console.log(JSON.stringify(o.bucket,null,2))}catch(e){a.fail(G.red("Failed to fetch bucket")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("create").description("创建新的 Storage Bucket").argument("<bucket_id>",'存储桶 ID,只能包含小写字母、数字和连字符(如 "user-avatars")').option("-n, --name <name>","存储桶显示名称,用于在控制台中展示").option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i,a=eQ(n.header);n.public?i=!0:n.private&&(i=!1);let u=n.allowedMimeTypes?n.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,t={name:n.name,public:i,file_size_limit:n.fileSizeLimit,allowed_mime_types:u};if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/create")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...t}),a&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(a))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,bucket_id:e,mock:!0},null,2));return}let o=ev("Creating bucket...").start();try{let i=new m.Config,u=new m.SupabaseClient(i,a),l=await u.createBucket(e,t);n.verbose&&(o.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),l.code)),0!==l.code&&(o.fail(G.red(`Error: ${l.msg}`)),process.exit(1)),o.succeed(G.green("Bucket created successfully!")),console.log(JSON.stringify({success:l.success,bucket_id:l.bucket_id},null,2))}catch(e){o.fail(G.red("Failed to create bucket")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("update").description("更新 Storage Bucket 配置").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i,a=eQ(n.header);n.public?i=!0:n.private&&(i=!1);let u=n.allowedMimeTypes?n.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,t={public:i,file_size_limit:n.fileSizeLimit,allowed_mime_types:u};if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/update")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...t}),a&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(a))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let o=ev("Updating bucket...").start();try{let i=new m.Config,u=new m.SupabaseClient(i,a),l=await u.updateBucket(e,t);n.verbose&&(o.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),l.code)),0!==l.code&&(o.fail(G.red(`Error: ${l.msg}`)),process.exit(1)),o.succeed(G.green("Bucket updated successfully!")),console.log(JSON.stringify({success:l.success},null,2))}catch(e){o.fail(G.red("Failed to update bucket")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("delete").description("删除 Storage Bucket。⚠️ 警告:此操作不可逆,删除后存储桶及其中的所有文件将无法恢复").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/delete")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let a=ev("Deleting bucket...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.deleteBucket(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Bucket deleted successfully!")),console.log(JSON.stringify({success:o.success},null,2))}catch(e){a.fail(G.red("Failed to delete bucket")),console.error(G.red(e.message)),process.exit(1)}});let e6=e2.command("auth").description("Auth(认证配置)管理命令");e6.command("get-config").description("获取 Auth 认证配置,包括邮箱认证、SMTP 等设置").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/get")),n&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(n))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({config:{},mock:!0},null,2));return}let i=ev("Fetching auth config...").start();try{let a=new m.Config,u=new m.SupabaseClient(a,n),t=await u.getAuthConfigV2();e.verbose&&console.log(G.cyan("\uD83D\uDCE5 Response code:"),t.code),0!==t.code&&(i.fail(G.red(`Error: ${t.msg}`)),process.exit(1)),1===t.status?(i.fail(G.red("Error: Auth 尚未初始化,请先初始化 Supabase")),process.exit(1)):2===t.status?(i.fail(G.red("Error: 当前项目非 Supabase 数据库类型,不支持 Auth 集成配置")),process.exit(1)):4===t.status?(i.fail(G.red("Error: Auth 功能已被禁用")),process.exit(1)):3!==t.status&&(i.fail(G.red(`Error: Auth 状态异常 (status=${t.status})`)),process.exit(1)),i.succeed(G.green("Auth config fetched successfully!"));let o=null;t.config&&(o={status:t.status,config:{project_id:t.config.project_id,icon_url:t.config.icon_url,name:t.config.name,email_config:t.config.email_config||null,phone_config:t.config.phone_config||null}}),console.log(JSON.stringify(o,null,2))}catch(e){i.fail(G.red("Failed to fetch auth config")),console.error(G.red(e.message)),process.exit(1)}}),e6.command("update-config").description("更新 Auth 认证配置(V2)。至少需要提供一个配置项,更新 SMTP 配置后建议测试邮件发送功能").option("--name <name>","项目名称").option("--site-url <url>",'站点 URL,用于邮件中的链接跳转地址(如 "https://myapp.com")').option("--disable-signup","禁用用户自助注册功能").option("--enable-signup","启用用户自助注册功能").option("--external-email-enabled","启用邮箱认证方式").option("--external-email-disabled","禁用邮箱认证方式").option("--mailer-autoconfirm","启用邮箱自动确认(跳过邮件验证)").option("--no-mailer-autoconfirm","禁用邮箱自动确认").option("--double-confirm-changes","启用敏感操作的双重确认").option("--no-double-confirm-changes","禁用敏感操作的双重确认").option("--mailer-secure-email-change-enabled","启用安全邮箱更改流程").option("--mailer-secure-email-change-disabled","禁用安全邮箱更改流程").option("--mailer-otp-exp <seconds>","OTP 验证码过期时间(秒),例如 3600 表示 1 小时",parseInt).option("--password-min-length <length>","用户密码最小长度要求,例如 8",parseInt).option("--password-required-characters <chars>",'密码必需包含的字符类型,例如 "abcABC123"').option("--smtp-host <host>",'SMTP 邮件服务器地址,例如 "smtp.sendgrid.net"').option("--smtp-port <port>","SMTP 邮件服务器端口,例如 587",parseInt).option("--smtp-user <user>","SMTP 认证用户名").option("--smtp-pass <pass>","SMTP 认证密码或 API Key").option("--smtp-admin-email <email>",'发件人邮箱地址,例如 "noreply@myapp.com"').option("--smtp-sender-name <name>",'发件人显示名称,例如 "My App"').option("--smtp-max-frequency <seconds>","同一邮箱的最小发送间隔(秒),用于防止滥用",parseInt).option("--external-phone-enabled","启用手机号认证方式").option("--external-phone-disabled","禁用手机号认证方式").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n={};void 0!==e.name&&(n.name=e.name);let i={};void 0!==e.siteUrl&&(i.site_url=e.siteUrl),e.disableSignup&&(i.disable_signup=!0),e.enableSignup&&(i.disable_signup=!1),e.externalEmailEnabled&&(i.external_email_enabled=!0),e.externalEmailDisabled&&(i.external_email_enabled=!1),void 0!==e.mailerAutoconfirm&&(i.mailer_auto_confirm=e.mailerAutoconfirm),void 0!==e.doubleConfirmChanges&&(i.double_confirm_changes=e.doubleConfirmChanges),e.mailerSecureEmailChangeEnabled&&(i.mailer_secure_email_change_enabled=!0),e.mailerSecureEmailChangeDisabled&&(i.mailer_secure_email_change_enabled=!1),void 0!==e.mailerOtpExp&&(i.mailer_otp_exp=e.mailerOtpExp),void 0!==e.passwordMinLength&&(i.password_min_length=e.passwordMinLength),void 0!==e.passwordRequiredCharacters&&(i.password_required_characters=e.passwordRequiredCharacters),void 0!==e.smtpHost&&(i.smtp_host=e.smtpHost),void 0!==e.smtpPort&&(i.smtp_port=e.smtpPort),void 0!==e.smtpUser&&(i.smtp_user=e.smtpUser),void 0!==e.smtpPass&&(i.smtp_pass=e.smtpPass),void 0!==e.smtpAdminEmail&&(i.smtp_admin_email=e.smtpAdminEmail),void 0!==e.smtpSenderName&&(i.smtp_sender_name=e.smtpSenderName),void 0!==e.smtpMaxFrequency&&(i.smtp_max_frequency=e.smtpMaxFrequency),Object.keys(i).length>0&&(n.email_config=i);let a={};e.externalPhoneEnabled&&(a.external_phone_enabled=!0),e.externalPhoneDisabled&&(a.external_phone_enabled=!1),Object.keys(a).length>0&&(n.phone_config=a),0===Object.keys(n).length&&(console.error(G.red("Error: 至少需要提供一个配置项")),process.exit(1));let u=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/update")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{config:n}),u&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(u))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,should_update_ui:!1,mock:!0},null,2));return}let t=ev("Updating auth config...").start();try{let i=new m.Config,a=new m.SupabaseClient(i,u),o=await a.updateAuthConfigV2(n);e.verbose&&console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code),0!==o.code&&(t.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),t.succeed(G.green("Auth config updated successfully!")),console.log(JSON.stringify({success:o.success,should_update_ui:o.should_update_ui},null,2))}catch(e){t.fail(G.red("Failed to update auth config")),console.error(G.red(e.message)),process.exit(1)}});let e4=new g;e4.name("coze-coding-ai").description("Coze Coding CLI - AI-powered tools for image generation, video generation, search, voice, chat, embedding, knowledge, and supabase management").version("0.3.0"),e4.addCommand(eO),e4.addCommand(eR),e4.addCommand(eK),e4.addCommand(eW),e4.addCommand(eI),e4.addCommand(ej),e4.addCommand(eV),e4.addCommand(e0),e4.addCommand(e1),e4.addCommand(e2),e4.parse(process.argv)})(),__webpack_exports__)exports[__rspack_i]=__webpack_exports__[__rspack_i];Object.defineProperty(exports,"__esModule",{value:!0});
73
+ Added ${l.doc_ids.length} documents.`)),console.log(G.dim(`Doc IDs: ${l.doc_ids.join(", ")}`)))}catch(e){n.fail(G.red("Add documents failed")),console.error(G.red(e.message)),process.exit(1)}});let e2=new g("supabase").description("Supabase 管理命令,包括 Edge Functions、Storage Buckets 和 Auth 配置管理"),e3=e2.command("func").description("Edge Functions(边缘函数)管理命令");e3.command("list").description("列出所有 Edge Functions").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/list")),n&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(n))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({functions:[],mock:!0},null,2));return}let i=ev("Fetching functions...").start();try{let a=new m.Config,u=new m.SupabaseClient(a,n),t=await u.listFunctions();e.verbose&&(i.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),t.code)),0!==t.code&&(i.fail(G.red(`Error: ${t.msg}`)),process.exit(1)),i.succeed(G.green("Functions fetched successfully!")),console.log(JSON.stringify(t.functions,null,2))}catch(e){i.fail(G.red("Failed to fetch functions")),console.error(G.red(e.message)),process.exit(1)}}),e3.command("get").description("获取 Edge Function 详情和源码").argument("<slug>",'函数标识符,即函数的唯一名称(如 "hello-world"),可通过 "func list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/get")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({function:{slug:e},files:[],mock:!0},null,2));return}let a=ev("Fetching function...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.getFunction(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Function fetched successfully!")),console.log(JSON.stringify({function:o.function,files:o.files},null,2))}catch(e){a.fail(G.red("Failed to fetch function")),console.error(G.red(e.message)),process.exit(1)}}),e3.command("deploy").description("部署或更新 Edge Function。如果函数已存在则更新,不存在则创建新函数").argument("<slug>",'函数标识符,只能包含小写字母、数字和连字符(如 "hello-world")').option("-c, --code <code>","函数代码字符串(用于单文件函数),与 --file 二选一").option("-f, --file <items...>","文件名和内容对,格式:--file <文件名> <内容>,可多次使用,例如:--file index.ts 'Deno.serve(...)' --file handler.ts 'export ...'").option("-n, --name <name>","函数显示名称,用于在控制台中展示").option("-e, --entrypoint <path>",'入口文件名称,多文件部署时必需,指定主入口文件(如 "index.ts")').option("--verify-jwt","启用 JWT 验证,调用函数需要携带有效的 JWT token").option("--no-verify-jwt","禁用 JWT 验证").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i,a=n.code;if(n.file&&n.file.length>0){n.file.length%2!=0&&(console.error(G.red("Error: --file requires pairs of <name> <content>")),process.exit(1)),i=[];for(let e=0;e<n.file.length;e+=2)i.push({name:n.file[e],content:n.file[e+1]})}a||i||(console.error(G.red("Error: Either --code or --file is required")),process.exit(1));let u=eQ(n.header),t={code:a,files:i,name:n.name,entrypoint:n.entrypoint,verify_jwt:n.verifyJwt};if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/deploy")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{slug:e,...t,code:a?`${a.substring(0,50)}...`:void 0}),u&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(u))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,slug:e,version:1,mock:!0},null,2));return}let o=ev("Deploying function...").start();try{let i=new m.Config,a=new m.SupabaseClient(i,u),l=await a.deployFunction(e,t);n.verbose&&(o.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),l.code)),0!==l.code&&(o.fail(G.red(`Error: ${l.msg}`)),process.exit(1)),o.succeed(G.green("Function deployed successfully!")),console.log(JSON.stringify({success:l.success,slug:l.slug,version:l.version},null,2))}catch(e){o.fail(G.red("Failed to deploy function")),console.error(G.red(e.message)),process.exit(1)}}),e3.command("delete").description("删除 Edge Function。⚠️ 警告:此操作不可逆,删除后函数将无法恢复").argument("<slug>",'函数标识符,可通过 "func list" 命令查看所有函数的 slug').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/delete")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let a=ev("Deleting function...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.deleteFunction(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Function deleted successfully!")),console.log(JSON.stringify({success:o.success},null,2))}catch(e){a.fail(G.red("Failed to delete function")),console.error(G.red(e.message)),process.exit(1)}});let e8=e2.command("bucket").description("Storage Buckets(存储桶)管理命令");e8.command("list").description("列出所有 Storage Buckets").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/list")),n&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(n))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({buckets:[],mock:!0},null,2));return}let i=ev("Fetching buckets...").start();try{let a=new m.Config,u=new m.SupabaseClient(a,n),t=await u.listBuckets();e.verbose&&(i.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),t.code)),0!==t.code&&(i.fail(G.red(`Error: ${t.msg}`)),process.exit(1)),i.succeed(G.green("Buckets fetched successfully!")),console.log(JSON.stringify(t.buckets,null,2))}catch(e){i.fail(G.red("Failed to fetch buckets")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("get").description("获取 Storage Bucket 详情").argument("<bucket_id>",'存储桶 ID,即存储桶的唯一标识符(如 "avatars"),可通过 "bucket list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/get")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({bucket:{id:e},mock:!0},null,2));return}let a=ev("Fetching bucket...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.getBucket(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Bucket fetched successfully!")),console.log(JSON.stringify(o.bucket,null,2))}catch(e){a.fail(G.red("Failed to fetch bucket")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("create").description("创建新的 Storage Bucket").argument("<bucket_id>",'存储桶 ID,只能包含小写字母、数字和连字符(如 "user-avatars")').option("-n, --name <name>","存储桶显示名称,用于在控制台中展示").option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i,a=eQ(n.header);n.public?i=!0:n.private&&(i=!1);let u=n.allowedMimeTypes?n.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,t={name:n.name,public:i,file_size_limit:n.fileSizeLimit,allowed_mime_types:u};if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/create")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...t}),a&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(a))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,bucket_id:e,mock:!0},null,2));return}let o=ev("Creating bucket...").start();try{let i=new m.Config,u=new m.SupabaseClient(i,a),l=await u.createBucket(e,t);n.verbose&&(o.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),l.code)),0!==l.code&&(o.fail(G.red(`Error: ${l.msg}`)),process.exit(1)),o.succeed(G.green("Bucket created successfully!")),console.log(JSON.stringify({success:l.success,bucket_id:l.bucket_id},null,2))}catch(e){o.fail(G.red("Failed to create bucket")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("update").description("更新 Storage Bucket 配置").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i,a=eQ(n.header);n.public?i=!0:n.private&&(i=!1);let u=n.allowedMimeTypes?n.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,t={public:i,file_size_limit:n.fileSizeLimit,allowed_mime_types:u};if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/update")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...t}),a&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(a))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let o=ev("Updating bucket...").start();try{let i=new m.Config,u=new m.SupabaseClient(i,a),l=await u.updateBucket(e,t);n.verbose&&(o.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),l.code)),0!==l.code&&(o.fail(G.red(`Error: ${l.msg}`)),process.exit(1)),o.succeed(G.green("Bucket updated successfully!")),console.log(JSON.stringify({success:l.success},null,2))}catch(e){o.fail(G.red("Failed to update bucket")),console.error(G.red(e.message)),process.exit(1)}}),e8.command("delete").description("删除 Storage Bucket。⚠️ 警告:此操作不可逆,删除后存储桶及其中的所有文件将无法恢复").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,n)=>{let i=eQ(n.header);if(n.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/delete")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(i))),n.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let a=ev("Deleting bucket...").start();try{let u=new m.Config,t=new m.SupabaseClient(u,i),o=await t.deleteBucket(e);n.verbose&&(a.stop(),console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code)),0!==o.code&&(a.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),a.succeed(G.green("Bucket deleted successfully!")),console.log(JSON.stringify({success:o.success},null,2))}catch(e){a.fail(G.red("Failed to delete bucket")),console.error(G.red(e.message)),process.exit(1)}});let e6=e2.command("auth").description("Auth(认证配置)管理命令");e6.command("get-config-v2").description("获取 Auth 认证配置,包括邮箱认证、SMTP 等设置").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/get")),n&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(n))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({config:{},mock:!0},null,2));return}let i=ev("Fetching auth config...").start();try{let a=new m.Config,u=new m.SupabaseClient(a,n),t=await u.getAuthConfigV2();e.verbose&&console.log(G.cyan("\uD83D\uDCE5 Response code:"),t.code),0!==t.code&&(i.fail(G.red(`Error: ${t.msg}`)),process.exit(1)),1===t.status?(i.fail(G.red("Error: Auth 尚未初始化,请先初始化 Supabase")),process.exit(1)):2===t.status?(i.fail(G.red("Error: 当前项目非 Supabase 数据库类型,不支持 Auth 集成配置")),process.exit(1)):4===t.status?(i.fail(G.red("Error: Auth 功能已被禁用")),process.exit(1)):5===t.status?(i.fail(G.red("Error: 当前项目类型,不支持 Auth 集成配置")),process.exit(1)):3!==t.status&&(i.fail(G.red(`Error: Auth 状态异常 (status=${t.status})`)),process.exit(1)),i.succeed(G.green("Auth config fetched successfully!"));let o=null;t.config&&(o={status:t.status,config:{project_id:t.config.project_id,icon_url:t.config.icon_url,name:t.config.name,email_config:t.config.email_config||null,phone_config:t.config.phone_config||null}}),console.log(JSON.stringify(o,null,2))}catch(e){i.fail(G.red("Failed to fetch auth config")),console.error(G.red(e.message)),process.exit(1)}}),e6.command("update-config").description("更新 Auth 认证配置(V2)。至少需要提供一个配置项,更新 SMTP 配置后建议测试邮件发送功能").option("--name <name>","项目名称").option("--site-url <url>",'站点 URL,用于邮件中的链接跳转地址(如 "https://myapp.com")').option("--disable-signup","禁用用户自助注册功能").option("--enable-signup","启用用户自助注册功能").option("--external-email-enabled","启用邮箱认证方式").option("--external-email-disabled","禁用邮箱认证方式").option("--mailer-autoconfirm","启用邮箱自动确认(跳过邮件验证)").option("--no-mailer-autoconfirm","禁用邮箱自动确认").option("--double-confirm-changes","启用敏感操作的双重确认").option("--no-double-confirm-changes","禁用敏感操作的双重确认").option("--mailer-secure-email-change-enabled","启用安全邮箱更改流程").option("--mailer-secure-email-change-disabled","禁用安全邮箱更改流程").option("--mailer-otp-exp <seconds>","OTP 验证码过期时间(秒),例如 3600 表示 1 小时",parseInt).option("--password-min-length <length>","用户密码最小长度要求,例如 8",parseInt).option("--password-required-characters <chars>",'密码必需包含的字符类型,例如 "abcABC123"').option("--smtp-host <host>",'SMTP 邮件服务器地址,例如 "smtp.sendgrid.net"').option("--smtp-port <port>","SMTP 邮件服务器端口,例如 587",parseInt).option("--smtp-user <user>","SMTP 认证用户名").option("--smtp-pass <pass>","SMTP 认证密码或 API Key").option("--smtp-admin-email <email>",'发件人邮箱地址,例如 "noreply@myapp.com"').option("--smtp-sender-name <name>",'发件人显示名称,例如 "My App"').option("--smtp-max-frequency <seconds>","同一邮箱的最小发送间隔(秒),用于防止滥用",parseInt).option("--external-phone-enabled","启用手机号认证方式").option("--external-phone-disabled","禁用手机号认证方式").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,n)=>n.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let n={};void 0!==e.name&&(n.name=e.name);let i={};void 0!==e.siteUrl&&(i.site_url=e.siteUrl),e.disableSignup&&(i.disable_signup=!0),e.enableSignup&&(i.disable_signup=!1),e.externalEmailEnabled&&(i.external_email_enabled=!0),e.externalEmailDisabled&&(i.external_email_enabled=!1),void 0!==e.mailerAutoconfirm&&(i.mailer_auto_confirm=e.mailerAutoconfirm),void 0!==e.doubleConfirmChanges&&(i.double_confirm_changes=e.doubleConfirmChanges),e.mailerSecureEmailChangeEnabled&&(i.mailer_secure_email_change_enabled=!0),e.mailerSecureEmailChangeDisabled&&(i.mailer_secure_email_change_enabled=!1),void 0!==e.mailerOtpExp&&(i.mailer_otp_exp=e.mailerOtpExp),void 0!==e.passwordMinLength&&(i.password_min_length=e.passwordMinLength),void 0!==e.passwordRequiredCharacters&&(i.password_required_characters=e.passwordRequiredCharacters),void 0!==e.smtpHost&&(i.smtp_host=e.smtpHost),void 0!==e.smtpPort&&(i.smtp_port=e.smtpPort),void 0!==e.smtpUser&&(i.smtp_user=e.smtpUser),void 0!==e.smtpPass&&(i.smtp_pass=e.smtpPass),void 0!==e.smtpAdminEmail&&(i.smtp_admin_email=e.smtpAdminEmail),void 0!==e.smtpSenderName&&(i.smtp_sender_name=e.smtpSenderName),void 0!==e.smtpMaxFrequency&&(i.smtp_max_frequency=e.smtpMaxFrequency),Object.keys(i).length>0&&(n.email_config=i);let a={};e.externalPhoneEnabled&&(a.external_phone_enabled=!0),e.externalPhoneDisabled&&(a.external_phone_enabled=!1),Object.keys(a).length>0&&(n.phone_config=a),0===Object.keys(n).length&&(console.error(G.red("Error: 至少需要提供一个配置项")),process.exit(1));let u=eQ(e.header);if(e.verbose&&(console.log(G.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/update")),console.log(G.cyan("\uD83D\uDCE4 Payload:"),{config:n}),u&&console.log(G.cyan("\uD83D\uDCE4 Headers:"),eG(u))),e.mock){console.log(G.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,should_update_ui:!1,mock:!0},null,2));return}let t=ev("Updating auth config...").start();try{let i=new m.Config,a=new m.SupabaseClient(i,u),o=await a.updateAuthConfigV2(n);e.verbose&&console.log(G.cyan("\uD83D\uDCE5 Response code:"),o.code),0!==o.code&&(t.fail(G.red(`Error: ${o.msg}`)),process.exit(1)),t.succeed(G.green("Auth config updated successfully!")),console.log(JSON.stringify({success:o.success,should_update_ui:o.should_update_ui},null,2))}catch(e){t.fail(G.red("Failed to update auth config")),console.error(G.red(e.message)),process.exit(1)}});let e4=new g;e4.name("coze-coding-ai").description("Coze Coding CLI - AI-powered tools for image generation, video generation, search, voice, chat, embedding, knowledge, and supabase management").version("0.3.0"),e4.addCommand(eO),e4.addCommand(eR),e4.addCommand(eK),e4.addCommand(eW),e4.addCommand(eI),e4.addCommand(ej),e4.addCommand(eV),e4.addCommand(e0),e4.addCommand(e1),e4.addCommand(e2),e4.parse(process.argv)})(),__webpack_exports__)exports[__rspack_i]=__webpack_exports__[__rspack_i];Object.defineProperty(exports,"__esModule",{value:!0});
@@ -25,4 +25,4 @@ Image URL: ${n.data[0].url}`)),e.output)){t.start("Downloading image...");let i=
25
25
  ✓ Result saved to: ${e.output}`)))}catch(e){t.fail(et.red("✗ Video generation failed")),console.error(et.red(`Error: ${e.message}`)),process.exit(1)}}),e2=new A("search").description("Search the web using AI").requiredOption("-q, --query <text>","Search query").option("--type <type>","Search type (web or image)","web").option("--count <number>","Number of results","10").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let t=eK("Searching...").start();try{let i,o=new c,r=eY(e.header),s=new y(o,r,e.verbose);i="image"===e.type?await s.imageSearch(e.query,parseInt(e.count)):await s.webSearch(e.query,parseInt(e.count)),t.succeed(et.green("Search completed!")),"image"===e.type&&i.image_items?i.image_items.forEach((e,t)=>{console.log(et.cyan(`
26
26
  [${t+1}] ${e.title||"Image"}`)),console.log(et.gray(e.url||"")),console.log(et.yellow(`Image URL: ${e.image.url}`))}):i.web_items&&i.web_items.forEach((e,t)=>{console.log(et.cyan(`
27
27
  [${t+1}] ${e.title}`)),console.log(et.gray(e.url||"")),e.snippet&&console.log(e.snippet)})}catch(e){t.fail(et.red("Search failed")),console.error(et.red(e.message)),process.exit(1)}}),e9=new A("tts").description("Text-to-speech conversion").requiredOption("-t, --text <text>","Text to convert to speech").option("--speaker <speaker>","Speaker voice to use","zh_female_xiaohe_uranus_bigtts").option("--mock","Use mock mode (test run)").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).action(async e=>{let t=eK("Converting text to speech...").start();try{let i=new c,o={},r=eY(e.header);r&&Object.assign(o,r),e.mock&&(o[eJ]=ez,console.log(et.yellow("\uD83E\uDDEA Mock mode enabled (test run)")));let s=new m(i,Object.keys(o).length>0?o:void 0),n=await s.synthesize({uid:"cli-user",text:e.text,speaker:e.speaker});t.succeed(et.green("Text-to-speech conversion completed!")),console.log(et.cyan(`Audio URL: ${n.audioUri}`)),console.log(et.cyan(`Audio Size: ${n.audioSize} bytes`))}catch(e){t.fail(et.red("Text-to-speech conversion failed")),console.error(et.red(e.message)),process.exit(1)}}),e8=new A("asr").description("Automatic speech recognition").option("-u, --url <url>","Audio file URL").option("-f, --file <path>","Local audio file path (will be base64 encoded)").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let t=eK("Recognizing speech...").start();try{e.url||e.file||(t.fail(et.red("Please provide either --url or --file")),process.exit(1));let i=new c,o=eY(e.header),r=new g(i,o,e.verbose),s=e.url?{url:e.url}:{base64Data:eZ.readFileSync(eQ.resolve(e.file)).toString("base64")},n=await r.recognize(s);t.succeed(et.green("Speech recognition completed!")),console.log(et.cyan("\nRecognized text:")),console.log(n.text)}catch(e){t.fail(et.red("Speech recognition failed")),console.error(et.red(e.message)),process.exit(1)}}),e3=new A("chat").description("Chat with AI using LLM").requiredOption("-p, --prompt <text>","User prompt").option("-s, --system <text>","System prompt").option("--model <model>","Model to use","doubao-seed-1-6-251015").option("--temperature <number>","Temperature (0-2)","0.7").option("--stream","Enable streaming output",!1).option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{try{let t=new c,i=new _(t),o=eY(e.header),r=[];e.system&&r.push({role:"system",content:e.system}),r.push({role:"user",content:e.prompt});let s={model:e.model,temperature:parseFloat(e.temperature)};if(e.stream){for await(let e of(console.log(et.cyan("\nAI Response:")),i.stream(r,s,void 0,o)))e.content&&process.stdout.write(e.content.toString());console.log("\n")}else{let e=eK("Generating response...").start(),t=await i.invoke(r,s,void 0,o);e.succeed(et.green("Response generated!")),console.log(et.cyan("\nAI Response:")),console.log(t.content)}}catch(e){console.error(et.red("Chat failed")),console.error(et.red(e.message)),process.exit(1)}}),e7=process.env.COZE_PROJECT_TYPE,e4=(i=process.cwd(),o="server"===eQ.basename(i),"wechat_mini_program"===e7||"app"===e7?o?"src/storage/database/shared/schema.ts":"server/src/storage/database/shared/schema.ts":"src/storage/database/shared/schema.ts"),e5=new A("db").description("Database operations");e5.command("generate-models").description("Generate ORM models from database schema").option("-o, --output <path>","Output file path",e4).option("-v, --verbose","Enable verbose output").action(async e=>{let t=eK("Generating models from database...").start();try{let{generateModels:i}=await import("../131.mjs").then(e=>({generateModels:e.generateModels})),o=eQ.resolve(e.output);await i({outputPath:o,verbose:e.verbose}),t.succeed(et.green(`Models generated at ${o}`))}catch(e){t.fail(et.red("Failed to generate models")),console.error(et.red(e.message)),process.exit(1)}}),e5.command("upgrade").description("Push schema changes to database").option("-s, --schema <path>","Schema file path",e4).option("-p, --project <path>","Project root path",process.cwd()).option("-v, --verbose","Enable verbose output").action(async e=>{let t=eK("Pushing schema to database...").start();try{let{upgrade:i}=await import("../131.mjs").then(e=>({upgrade:e.upgrade}));await i({schemaPath:e.schema,projectPath:e.project,verbose:e.verbose}),t.succeed(et.green("Database schema updated successfully"))}catch(e){t.fail(et.red("Failed to upgrade database")),console.error(et.red(e.message)),process.exit(1)}});let e6=new A("embedding").description("Generate embeddings for text, images, or videos using AI").option("-t, --text <text>","Text to embed (can be used multiple times)",(e,t)=>t.concat([e]),[]).option("--image-url <url>","Image URL to embed (can be used multiple times)",(e,t)=>t.concat([e]),[]).option("--video-url <url>","Video URL to embed (can be used multiple times)",(e,t)=>t.concat([e]),[]).option("-d, --dimensions <number>","Output embedding dimensions",parseInt).option("--instructions <text>","Instructions for embedding generation").option("--multi-embedding","Enable multi-embedding mode").option("--sparse-embedding","Enable sparse embedding mode").option("-o, --output <path>","Output file path for embedding JSON").option("--mock","Use mock mode (test run)").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let t=e.text&&e.text.length>0,i=e.imageUrl&&e.imageUrl.length>0,o=e.videoUrl&&e.videoUrl.length>0;t||i||o||(console.error(et.red("Error: At least one of --text, --image-url, or --video-url is required")),process.exit(1));let r=eK("Generating embeddings...").start();try{let s=new c,n={},a=eY(e.header);a&&Object.assign(n,a),e.mock&&(n[eJ]=ez,console.log(et.yellow("\uD83E\uDDEA Mock mode enabled (test run)")));let l=new h(s,Object.keys(n).length>0?n:void 0,e.verbose),u=await l.embed(t?e.text:void 0,i?e.imageUrl:void 0,o?e.videoUrl:void 0,{dimensions:e.dimensions,instructions:e.instructions,multiEmbedding:e.multiEmbedding,sparseEmbedding:e.sparseEmbedding});if(r.succeed(et.green("Embeddings generated successfully!")),console.log(et.cyan(`Model: ${u.model}`)),u.data?.embedding&&(console.log(et.cyan(`Embedding dimensions: ${u.data.embedding.length}`)),console.log(et.gray(`First 5 values: [${u.data.embedding.slice(0,5).join(", ")}...]`))),u.data?.multi_embedding&&console.log(et.cyan(`Multi-embedding vectors: ${u.data.multi_embedding.length}`)),u.data?.sparse_embedding&&console.log(et.cyan(`Sparse embedding items: ${u.data.sparse_embedding.length}`)),u.usage&&console.log(et.gray(`Tokens used: ${u.usage.total_tokens}`)),e.output){let t=eQ.resolve(e.output);eZ.writeFileSync(t,JSON.stringify(u,null,2)),console.log(et.green(`Embedding saved to ${t}`))}}catch(e){r.fail(et.red("Failed to generate embeddings")),console.error(et.red(e.message)),process.exit(1)}}),te=new A("knowledge").description("Knowledge Base tools");te.command("search").description("Search for knowledge chunks").requiredOption("-q, --query <text>","Search query").option("-d, --dataset <name>","Dataset names (tables) to search in (can be used multiple times)",(e,t)=>t.concat([e]),[]).option("-k, --top-k <number>","Number of results to return","5").option("-m, --min-score <number>","Minimum similarity score","0.0").option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let t=eK("Searching...").start();try{let i=new c,o=eY(e.header),r=new b(i,o,e.verbose),s=await r.search(e.query,e.dataset.length>0?e.dataset:void 0,parseInt(e.topK),parseFloat(e.minScore));if(0!==s.code)return void t.fail(et.red(`Error ${s.code}: ${s.msg}`));t.succeed(et.green("Search completed!")),console.log(et.bold("\nSearch Results:")),console.log("────────────────────────────────────────────────────────────────────────────────"),0===s.chunks.length&&console.log(et.yellow("No matching chunks found.")),s.chunks.forEach((e,t)=>{console.log(et.cyan(`[${t+1}] Score: ${e.score.toFixed(4)}`)),e.doc_id&&console.log(et.dim(`Doc ID: ${e.doc_id}`)),e.chunk_id&&console.log(et.dim(`Chunk ID: ${e.chunk_id}`)),console.log(et.green("Content:")),console.log(e.content),console.log("────────────────────────────────────────────────────────────────────────────────")})}catch(e){t.fail(et.red("Search failed")),console.error(et.red(e.message)),process.exit(1)}}),te.command("add").description("Add documents to knowledge base").requiredOption("-d, --dataset <name>","Dataset name (table) to add to").option("-c, --content <text>","Raw text content to add (can be used multiple times)",(e,t)=>t.concat([e]),[]).option("-u, --url <url>","Web URL to add (can be used multiple times)",(e,t)=>t.concat([e]),[]).option("--chunk-separator <char>","Chunk separator","\\n").option("--max-tokens <number>","Max tokens per chunk","500").option("--remove-extra-spaces","Normalize extra spaces",!1).option("--remove-urls-emails","Strip URLs and emails",!1).option("-H, --header <header>",'Custom HTTP header (format: "Key: Value" or "Key=Value", can be used multiple times)',(e,t)=>t.concat([e]),[]).option("--verbose","Enable verbose logging to print HTTP request details",!1).action(async e=>{let t=eK("Adding documents...").start();try{let i=new c,o=eY(e.header),r=new b(i,o,e.verbose),s=[];if(e.content&&e.content.forEach(e=>{s.push({source:v.TEXT,raw_data:e})}),e.url&&e.url.forEach(e=>{s.push({source:v.URL,url:e})}),0===s.length)return void t.fail(et.red("No content or URL provided to add."));let n={separator:e.chunkSeparator.replace(/\\n/g,"\n"),max_tokens:parseInt(e.maxTokens),remove_extra_spaces:e.removeExtraSpaces,remove_urls_emails:e.removeUrlsEmails},a=await r.addDocuments(s,e.dataset,n);if(0!==a.code)return void t.fail(et.red(`Error ${a.code}: ${a.msg}`));t.succeed(et.green("Documents added successfully!")),a.doc_ids&&a.doc_ids.length>0&&(console.log(et.cyan(`
28
- Added ${a.doc_ids.length} documents.`)),console.log(et.dim(`Doc IDs: ${a.doc_ids.join(", ")}`)))}catch(e){t.fail(et.red("Add documents failed")),console.error(et.red(e.message)),process.exit(1)}});let tt=new A("supabase").description("Supabase 管理命令,包括 Edge Functions、Storage Buckets 和 Auth 配置管理"),ti=tt.command("func").description("Edge Functions(边缘函数)管理命令");ti.command("list").description("列出所有 Edge Functions").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/list")),t&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(t))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({functions:[],mock:!0},null,2));return}let i=eK("Fetching functions...").start();try{let o=new c,r=new f(o,t),s=await r.listFunctions();e.verbose&&(i.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),s.code)),0!==s.code&&(i.fail(et.red(`Error: ${s.msg}`)),process.exit(1)),i.succeed(et.green("Functions fetched successfully!")),console.log(JSON.stringify(s.functions,null,2))}catch(e){i.fail(et.red("Failed to fetch functions")),console.error(et.red(e.message)),process.exit(1)}}),ti.command("get").description("获取 Edge Function 详情和源码").argument("<slug>",'函数标识符,即函数的唯一名称(如 "hello-world"),可通过 "func list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/get")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({function:{slug:e},files:[],mock:!0},null,2));return}let o=eK("Fetching function...").start();try{let r=new c,s=new f(r,i),n=await s.getFunction(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Function fetched successfully!")),console.log(JSON.stringify({function:n.function,files:n.files},null,2))}catch(e){o.fail(et.red("Failed to fetch function")),console.error(et.red(e.message)),process.exit(1)}}),ti.command("deploy").description("部署或更新 Edge Function。如果函数已存在则更新,不存在则创建新函数").argument("<slug>",'函数标识符,只能包含小写字母、数字和连字符(如 "hello-world")').option("-c, --code <code>","函数代码字符串(用于单文件函数),与 --file 二选一").option("-f, --file <items...>","文件名和内容对,格式:--file <文件名> <内容>,可多次使用,例如:--file index.ts 'Deno.serve(...)' --file handler.ts 'export ...'").option("-n, --name <name>","函数显示名称,用于在控制台中展示").option("-e, --entrypoint <path>",'入口文件名称,多文件部署时必需,指定主入口文件(如 "index.ts")').option("--verify-jwt","启用 JWT 验证,调用函数需要携带有效的 JWT token").option("--no-verify-jwt","禁用 JWT 验证").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i,o=t.code;if(t.file&&t.file.length>0){t.file.length%2!=0&&(console.error(et.red("Error: --file requires pairs of <name> <content>")),process.exit(1)),i=[];for(let e=0;e<t.file.length;e+=2)i.push({name:t.file[e],content:t.file[e+1]})}o||i||(console.error(et.red("Error: Either --code or --file is required")),process.exit(1));let r=eY(t.header),s={code:o,files:i,name:t.name,entrypoint:t.entrypoint,verify_jwt:t.verifyJwt};if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/deploy")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{slug:e,...s,code:o?`${o.substring(0,50)}...`:void 0}),r&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(r))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,slug:e,version:1,mock:!0},null,2));return}let n=eK("Deploying function...").start();try{let i=new c,o=new f(i,r),a=await o.deployFunction(e,s);t.verbose&&(n.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),a.code)),0!==a.code&&(n.fail(et.red(`Error: ${a.msg}`)),process.exit(1)),n.succeed(et.green("Function deployed successfully!")),console.log(JSON.stringify({success:a.success,slug:a.slug,version:a.version},null,2))}catch(e){n.fail(et.red("Failed to deploy function")),console.error(et.red(e.message)),process.exit(1)}}),ti.command("delete").description("删除 Edge Function。⚠️ 警告:此操作不可逆,删除后函数将无法恢复").argument("<slug>",'函数标识符,可通过 "func list" 命令查看所有函数的 slug').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/delete")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let o=eK("Deleting function...").start();try{let r=new c,s=new f(r,i),n=await s.deleteFunction(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Function deleted successfully!")),console.log(JSON.stringify({success:n.success},null,2))}catch(e){o.fail(et.red("Failed to delete function")),console.error(et.red(e.message)),process.exit(1)}});let to=tt.command("bucket").description("Storage Buckets(存储桶)管理命令");to.command("list").description("列出所有 Storage Buckets").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/list")),t&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(t))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({buckets:[],mock:!0},null,2));return}let i=eK("Fetching buckets...").start();try{let o=new c,r=new f(o,t),s=await r.listBuckets();e.verbose&&(i.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),s.code)),0!==s.code&&(i.fail(et.red(`Error: ${s.msg}`)),process.exit(1)),i.succeed(et.green("Buckets fetched successfully!")),console.log(JSON.stringify(s.buckets,null,2))}catch(e){i.fail(et.red("Failed to fetch buckets")),console.error(et.red(e.message)),process.exit(1)}}),to.command("get").description("获取 Storage Bucket 详情").argument("<bucket_id>",'存储桶 ID,即存储桶的唯一标识符(如 "avatars"),可通过 "bucket list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/get")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({bucket:{id:e},mock:!0},null,2));return}let o=eK("Fetching bucket...").start();try{let r=new c,s=new f(r,i),n=await s.getBucket(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Bucket fetched successfully!")),console.log(JSON.stringify(n.bucket,null,2))}catch(e){o.fail(et.red("Failed to fetch bucket")),console.error(et.red(e.message)),process.exit(1)}}),to.command("create").description("创建新的 Storage Bucket").argument("<bucket_id>",'存储桶 ID,只能包含小写字母、数字和连字符(如 "user-avatars")').option("-n, --name <name>","存储桶显示名称,用于在控制台中展示").option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i,o=eY(t.header);t.public?i=!0:t.private&&(i=!1);let r=t.allowedMimeTypes?t.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,s={name:t.name,public:i,file_size_limit:t.fileSizeLimit,allowed_mime_types:r};if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/create")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...s}),o&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(o))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,bucket_id:e,mock:!0},null,2));return}let n=eK("Creating bucket...").start();try{let i=new c,r=new f(i,o),a=await r.createBucket(e,s);t.verbose&&(n.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),a.code)),0!==a.code&&(n.fail(et.red(`Error: ${a.msg}`)),process.exit(1)),n.succeed(et.green("Bucket created successfully!")),console.log(JSON.stringify({success:a.success,bucket_id:a.bucket_id},null,2))}catch(e){n.fail(et.red("Failed to create bucket")),console.error(et.red(e.message)),process.exit(1)}}),to.command("update").description("更新 Storage Bucket 配置").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i,o=eY(t.header);t.public?i=!0:t.private&&(i=!1);let r=t.allowedMimeTypes?t.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,s={public:i,file_size_limit:t.fileSizeLimit,allowed_mime_types:r};if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/update")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...s}),o&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(o))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let n=eK("Updating bucket...").start();try{let i=new c,r=new f(i,o),a=await r.updateBucket(e,s);t.verbose&&(n.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),a.code)),0!==a.code&&(n.fail(et.red(`Error: ${a.msg}`)),process.exit(1)),n.succeed(et.green("Bucket updated successfully!")),console.log(JSON.stringify({success:a.success},null,2))}catch(e){n.fail(et.red("Failed to update bucket")),console.error(et.red(e.message)),process.exit(1)}}),to.command("delete").description("删除 Storage Bucket。⚠️ 警告:此操作不可逆,删除后存储桶及其中的所有文件将无法恢复").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/delete")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let o=eK("Deleting bucket...").start();try{let r=new c,s=new f(r,i),n=await s.deleteBucket(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Bucket deleted successfully!")),console.log(JSON.stringify({success:n.success},null,2))}catch(e){o.fail(et.red("Failed to delete bucket")),console.error(et.red(e.message)),process.exit(1)}});let tr=tt.command("auth").description("Auth(认证配置)管理命令");tr.command("get-config").description("获取 Auth 认证配置,包括邮箱认证、SMTP 等设置").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/get")),t&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(t))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({config:{},mock:!0},null,2));return}let i=eK("Fetching auth config...").start();try{let o=new c,r=new f(o,t),s=await r.getAuthConfigV2();e.verbose&&console.log(et.cyan("\uD83D\uDCE5 Response code:"),s.code),0!==s.code&&(i.fail(et.red(`Error: ${s.msg}`)),process.exit(1)),1===s.status?(i.fail(et.red("Error: Auth 尚未初始化,请先初始化 Supabase")),process.exit(1)):2===s.status?(i.fail(et.red("Error: 当前项目非 Supabase 数据库类型,不支持 Auth 集成配置")),process.exit(1)):4===s.status?(i.fail(et.red("Error: Auth 功能已被禁用")),process.exit(1)):3!==s.status&&(i.fail(et.red(`Error: Auth 状态异常 (status=${s.status})`)),process.exit(1)),i.succeed(et.green("Auth config fetched successfully!"));let n=null;s.config&&(n={status:s.status,config:{project_id:s.config.project_id,icon_url:s.config.icon_url,name:s.config.name,email_config:s.config.email_config||null,phone_config:s.config.phone_config||null}}),console.log(JSON.stringify(n,null,2))}catch(e){i.fail(et.red("Failed to fetch auth config")),console.error(et.red(e.message)),process.exit(1)}}),tr.command("update-config").description("更新 Auth 认证配置(V2)。至少需要提供一个配置项,更新 SMTP 配置后建议测试邮件发送功能").option("--name <name>","项目名称").option("--site-url <url>",'站点 URL,用于邮件中的链接跳转地址(如 "https://myapp.com")').option("--disable-signup","禁用用户自助注册功能").option("--enable-signup","启用用户自助注册功能").option("--external-email-enabled","启用邮箱认证方式").option("--external-email-disabled","禁用邮箱认证方式").option("--mailer-autoconfirm","启用邮箱自动确认(跳过邮件验证)").option("--no-mailer-autoconfirm","禁用邮箱自动确认").option("--double-confirm-changes","启用敏感操作的双重确认").option("--no-double-confirm-changes","禁用敏感操作的双重确认").option("--mailer-secure-email-change-enabled","启用安全邮箱更改流程").option("--mailer-secure-email-change-disabled","禁用安全邮箱更改流程").option("--mailer-otp-exp <seconds>","OTP 验证码过期时间(秒),例如 3600 表示 1 小时",parseInt).option("--password-min-length <length>","用户密码最小长度要求,例如 8",parseInt).option("--password-required-characters <chars>",'密码必需包含的字符类型,例如 "abcABC123"').option("--smtp-host <host>",'SMTP 邮件服务器地址,例如 "smtp.sendgrid.net"').option("--smtp-port <port>","SMTP 邮件服务器端口,例如 587",parseInt).option("--smtp-user <user>","SMTP 认证用户名").option("--smtp-pass <pass>","SMTP 认证密码或 API Key").option("--smtp-admin-email <email>",'发件人邮箱地址,例如 "noreply@myapp.com"').option("--smtp-sender-name <name>",'发件人显示名称,例如 "My App"').option("--smtp-max-frequency <seconds>","同一邮箱的最小发送间隔(秒),用于防止滥用",parseInt).option("--external-phone-enabled","启用手机号认证方式").option("--external-phone-disabled","禁用手机号认证方式").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t={};void 0!==e.name&&(t.name=e.name);let i={};void 0!==e.siteUrl&&(i.site_url=e.siteUrl),e.disableSignup&&(i.disable_signup=!0),e.enableSignup&&(i.disable_signup=!1),e.externalEmailEnabled&&(i.external_email_enabled=!0),e.externalEmailDisabled&&(i.external_email_enabled=!1),void 0!==e.mailerAutoconfirm&&(i.mailer_auto_confirm=e.mailerAutoconfirm),void 0!==e.doubleConfirmChanges&&(i.double_confirm_changes=e.doubleConfirmChanges),e.mailerSecureEmailChangeEnabled&&(i.mailer_secure_email_change_enabled=!0),e.mailerSecureEmailChangeDisabled&&(i.mailer_secure_email_change_enabled=!1),void 0!==e.mailerOtpExp&&(i.mailer_otp_exp=e.mailerOtpExp),void 0!==e.passwordMinLength&&(i.password_min_length=e.passwordMinLength),void 0!==e.passwordRequiredCharacters&&(i.password_required_characters=e.passwordRequiredCharacters),void 0!==e.smtpHost&&(i.smtp_host=e.smtpHost),void 0!==e.smtpPort&&(i.smtp_port=e.smtpPort),void 0!==e.smtpUser&&(i.smtp_user=e.smtpUser),void 0!==e.smtpPass&&(i.smtp_pass=e.smtpPass),void 0!==e.smtpAdminEmail&&(i.smtp_admin_email=e.smtpAdminEmail),void 0!==e.smtpSenderName&&(i.smtp_sender_name=e.smtpSenderName),void 0!==e.smtpMaxFrequency&&(i.smtp_max_frequency=e.smtpMaxFrequency),Object.keys(i).length>0&&(t.email_config=i);let o={};e.externalPhoneEnabled&&(o.external_phone_enabled=!0),e.externalPhoneDisabled&&(o.external_phone_enabled=!1),Object.keys(o).length>0&&(t.phone_config=o),0===Object.keys(t).length&&(console.error(et.red("Error: 至少需要提供一个配置项")),process.exit(1));let r=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/update")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{config:t}),r&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(r))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,should_update_ui:!1,mock:!0},null,2));return}let s=eK("Updating auth config...").start();try{let i=new c,o=new f(i,r),n=await o.updateAuthConfigV2(t);e.verbose&&console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code),0!==n.code&&(s.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),s.succeed(et.green("Auth config updated successfully!")),console.log(JSON.stringify({success:n.success,should_update_ui:n.should_update_ui},null,2))}catch(e){s.fail(et.red("Failed to update auth config")),console.error(et.red(e.message)),process.exit(1)}});let ts=new A;ts.name("coze-coding-ai").description("Coze Coding CLI - AI-powered tools for image generation, video generation, search, voice, chat, embedding, knowledge, and supabase management").version("0.3.0"),ts.addCommand(e0),ts.addCommand(e1),ts.addCommand(e2),ts.addCommand(e9),ts.addCommand(e8),ts.addCommand(e3),ts.addCommand(e5),ts.addCommand(e6),ts.addCommand(te),ts.addCommand(tt),ts.parse(process.argv);
28
+ Added ${a.doc_ids.length} documents.`)),console.log(et.dim(`Doc IDs: ${a.doc_ids.join(", ")}`)))}catch(e){t.fail(et.red("Add documents failed")),console.error(et.red(e.message)),process.exit(1)}});let tt=new A("supabase").description("Supabase 管理命令,包括 Edge Functions、Storage Buckets 和 Auth 配置管理"),ti=tt.command("func").description("Edge Functions(边缘函数)管理命令");ti.command("list").description("列出所有 Edge Functions").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/list")),t&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(t))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({functions:[],mock:!0},null,2));return}let i=eK("Fetching functions...").start();try{let o=new c,r=new f(o,t),s=await r.listFunctions();e.verbose&&(i.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),s.code)),0!==s.code&&(i.fail(et.red(`Error: ${s.msg}`)),process.exit(1)),i.succeed(et.green("Functions fetched successfully!")),console.log(JSON.stringify(s.functions,null,2))}catch(e){i.fail(et.red("Failed to fetch functions")),console.error(et.red(e.message)),process.exit(1)}}),ti.command("get").description("获取 Edge Function 详情和源码").argument("<slug>",'函数标识符,即函数的唯一名称(如 "hello-world"),可通过 "func list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/get")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({function:{slug:e},files:[],mock:!0},null,2));return}let o=eK("Fetching function...").start();try{let r=new c,s=new f(r,i),n=await s.getFunction(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Function fetched successfully!")),console.log(JSON.stringify({function:n.function,files:n.files},null,2))}catch(e){o.fail(et.red("Failed to fetch function")),console.error(et.red(e.message)),process.exit(1)}}),ti.command("deploy").description("部署或更新 Edge Function。如果函数已存在则更新,不存在则创建新函数").argument("<slug>",'函数标识符,只能包含小写字母、数字和连字符(如 "hello-world")').option("-c, --code <code>","函数代码字符串(用于单文件函数),与 --file 二选一").option("-f, --file <items...>","文件名和内容对,格式:--file <文件名> <内容>,可多次使用,例如:--file index.ts 'Deno.serve(...)' --file handler.ts 'export ...'").option("-n, --name <name>","函数显示名称,用于在控制台中展示").option("-e, --entrypoint <path>",'入口文件名称,多文件部署时必需,指定主入口文件(如 "index.ts")').option("--verify-jwt","启用 JWT 验证,调用函数需要携带有效的 JWT token").option("--no-verify-jwt","禁用 JWT 验证").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i,o=t.code;if(t.file&&t.file.length>0){t.file.length%2!=0&&(console.error(et.red("Error: --file requires pairs of <name> <content>")),process.exit(1)),i=[];for(let e=0;e<t.file.length;e+=2)i.push({name:t.file[e],content:t.file[e+1]})}o||i||(console.error(et.red("Error: Either --code or --file is required")),process.exit(1));let r=eY(t.header),s={code:o,files:i,name:t.name,entrypoint:t.entrypoint,verify_jwt:t.verifyJwt};if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/deploy")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{slug:e,...s,code:o?`${o.substring(0,50)}...`:void 0}),r&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(r))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,slug:e,version:1,mock:!0},null,2));return}let n=eK("Deploying function...").start();try{let i=new c,o=new f(i,r),a=await o.deployFunction(e,s);t.verbose&&(n.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),a.code)),0!==a.code&&(n.fail(et.red(`Error: ${a.msg}`)),process.exit(1)),n.succeed(et.green("Function deployed successfully!")),console.log(JSON.stringify({success:a.success,slug:a.slug,version:a.version},null,2))}catch(e){n.fail(et.red("Failed to deploy function")),console.error(et.red(e.message)),process.exit(1)}}),ti.command("delete").description("删除 Edge Function。⚠️ 警告:此操作不可逆,删除后函数将无法恢复").argument("<slug>",'函数标识符,可通过 "func list" 命令查看所有函数的 slug').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/functions/delete")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{slug:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let o=eK("Deleting function...").start();try{let r=new c,s=new f(r,i),n=await s.deleteFunction(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Function deleted successfully!")),console.log(JSON.stringify({success:n.success},null,2))}catch(e){o.fail(et.red("Failed to delete function")),console.error(et.red(e.message)),process.exit(1)}});let to=tt.command("bucket").description("Storage Buckets(存储桶)管理命令");to.command("list").description("列出所有 Storage Buckets").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/list")),t&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(t))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({buckets:[],mock:!0},null,2));return}let i=eK("Fetching buckets...").start();try{let o=new c,r=new f(o,t),s=await r.listBuckets();e.verbose&&(i.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),s.code)),0!==s.code&&(i.fail(et.red(`Error: ${s.msg}`)),process.exit(1)),i.succeed(et.green("Buckets fetched successfully!")),console.log(JSON.stringify(s.buckets,null,2))}catch(e){i.fail(et.red("Failed to fetch buckets")),console.error(et.red(e.message)),process.exit(1)}}),to.command("get").description("获取 Storage Bucket 详情").argument("<bucket_id>",'存储桶 ID,即存储桶的唯一标识符(如 "avatars"),可通过 "bucket list" 命令查看').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/get")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({bucket:{id:e},mock:!0},null,2));return}let o=eK("Fetching bucket...").start();try{let r=new c,s=new f(r,i),n=await s.getBucket(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Bucket fetched successfully!")),console.log(JSON.stringify(n.bucket,null,2))}catch(e){o.fail(et.red("Failed to fetch bucket")),console.error(et.red(e.message)),process.exit(1)}}),to.command("create").description("创建新的 Storage Bucket").argument("<bucket_id>",'存储桶 ID,只能包含小写字母、数字和连字符(如 "user-avatars")').option("-n, --name <name>","存储桶显示名称,用于在控制台中展示").option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i,o=eY(t.header);t.public?i=!0:t.private&&(i=!1);let r=t.allowedMimeTypes?t.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,s={name:t.name,public:i,file_size_limit:t.fileSizeLimit,allowed_mime_types:r};if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/create")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...s}),o&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(o))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,bucket_id:e,mock:!0},null,2));return}let n=eK("Creating bucket...").start();try{let i=new c,r=new f(i,o),a=await r.createBucket(e,s);t.verbose&&(n.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),a.code)),0!==a.code&&(n.fail(et.red(`Error: ${a.msg}`)),process.exit(1)),n.succeed(et.green("Bucket created successfully!")),console.log(JSON.stringify({success:a.success,bucket_id:a.bucket_id},null,2))}catch(e){n.fail(et.red("Failed to create bucket")),console.error(et.red(e.message)),process.exit(1)}}),to.command("update").description("更新 Storage Bucket 配置").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--public","设置为公开存储桶,允许匿名访问").option("--private","设置为私有存储桶,需要认证才能访问").option("--file-size-limit <bytes>","单个文件大小限制(字节),例如 10485760 表示 10MB",parseInt).option("--allowed-mime-types <types>",'允许上传的文件 MIME 类型(逗号分隔),例如 "image/png,image/jpeg"').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i,o=eY(t.header);t.public?i=!0:t.private&&(i=!1);let r=t.allowedMimeTypes?t.allowedMimeTypes.split(",").map(e=>e.trim()):void 0,s={public:i,file_size_limit:t.fileSizeLimit,allowed_mime_types:r};if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/update")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e,...s}),o&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(o))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let n=eK("Updating bucket...").start();try{let i=new c,r=new f(i,o),a=await r.updateBucket(e,s);t.verbose&&(n.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),a.code)),0!==a.code&&(n.fail(et.red(`Error: ${a.msg}`)),process.exit(1)),n.succeed(et.green("Bucket updated successfully!")),console.log(JSON.stringify({success:a.success},null,2))}catch(e){n.fail(et.red("Failed to update bucket")),console.error(et.red(e.message)),process.exit(1)}}),to.command("delete").description("删除 Storage Bucket。⚠️ 警告:此操作不可逆,删除后存储桶及其中的所有文件将无法恢复").argument("<bucket_id>",'存储桶 ID,可通过 "bucket list" 命令查看所有存储桶的 ID').option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async(e,t)=>{let i=eY(t.header);if(t.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v1/supabase/buckets/delete")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{bucket_id:e}),i&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(i))),t.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,mock:!0},null,2));return}let o=eK("Deleting bucket...").start();try{let r=new c,s=new f(r,i),n=await s.deleteBucket(e);t.verbose&&(o.stop(),console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code)),0!==n.code&&(o.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),o.succeed(et.green("Bucket deleted successfully!")),console.log(JSON.stringify({success:n.success},null,2))}catch(e){o.fail(et.red("Failed to delete bucket")),console.error(et.red(e.message)),process.exit(1)}});let tr=tt.command("auth").description("Auth(认证配置)管理命令");tr.command("get-config-v2").description("获取 Auth 认证配置,包括邮箱认证、SMTP 等设置").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/get")),t&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(t))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({config:{},mock:!0},null,2));return}let i=eK("Fetching auth config...").start();try{let o=new c,r=new f(o,t),s=await r.getAuthConfigV2();e.verbose&&console.log(et.cyan("\uD83D\uDCE5 Response code:"),s.code),0!==s.code&&(i.fail(et.red(`Error: ${s.msg}`)),process.exit(1)),1===s.status?(i.fail(et.red("Error: Auth 尚未初始化,请先初始化 Supabase")),process.exit(1)):2===s.status?(i.fail(et.red("Error: 当前项目非 Supabase 数据库类型,不支持 Auth 集成配置")),process.exit(1)):4===s.status?(i.fail(et.red("Error: Auth 功能已被禁用")),process.exit(1)):5===s.status?(i.fail(et.red("Error: 当前项目类型,不支持 Auth 集成配置")),process.exit(1)):3!==s.status&&(i.fail(et.red(`Error: Auth 状态异常 (status=${s.status})`)),process.exit(1)),i.succeed(et.green("Auth config fetched successfully!"));let n=null;s.config&&(n={status:s.status,config:{project_id:s.config.project_id,icon_url:s.config.icon_url,name:s.config.name,email_config:s.config.email_config||null,phone_config:s.config.phone_config||null}}),console.log(JSON.stringify(n,null,2))}catch(e){i.fail(et.red("Failed to fetch auth config")),console.error(et.red(e.message)),process.exit(1)}}),tr.command("update-config").description("更新 Auth 认证配置(V2)。至少需要提供一个配置项,更新 SMTP 配置后建议测试邮件发送功能").option("--name <name>","项目名称").option("--site-url <url>",'站点 URL,用于邮件中的链接跳转地址(如 "https://myapp.com")').option("--disable-signup","禁用用户自助注册功能").option("--enable-signup","启用用户自助注册功能").option("--external-email-enabled","启用邮箱认证方式").option("--external-email-disabled","禁用邮箱认证方式").option("--mailer-autoconfirm","启用邮箱自动确认(跳过邮件验证)").option("--no-mailer-autoconfirm","禁用邮箱自动确认").option("--double-confirm-changes","启用敏感操作的双重确认").option("--no-double-confirm-changes","禁用敏感操作的双重确认").option("--mailer-secure-email-change-enabled","启用安全邮箱更改流程").option("--mailer-secure-email-change-disabled","禁用安全邮箱更改流程").option("--mailer-otp-exp <seconds>","OTP 验证码过期时间(秒),例如 3600 表示 1 小时",parseInt).option("--password-min-length <length>","用户密码最小长度要求,例如 8",parseInt).option("--password-required-characters <chars>",'密码必需包含的字符类型,例如 "abcABC123"').option("--smtp-host <host>",'SMTP 邮件服务器地址,例如 "smtp.sendgrid.net"').option("--smtp-port <port>","SMTP 邮件服务器端口,例如 587",parseInt).option("--smtp-user <user>","SMTP 认证用户名").option("--smtp-pass <pass>","SMTP 认证密码或 API Key").option("--smtp-admin-email <email>",'发件人邮箱地址,例如 "noreply@myapp.com"').option("--smtp-sender-name <name>",'发件人显示名称,例如 "My App"').option("--smtp-max-frequency <seconds>","同一邮箱的最小发送间隔(秒),用于防止滥用",parseInt).option("--external-phone-enabled","启用手机号认证方式").option("--external-phone-disabled","禁用手机号认证方式").option("--mock","使用 mock 模式(测试运行,不会真正执行操作)").option("-H, --header <header>",'自定义 HTTP 请求头,格式: "Key: Value" 或 "Key=Value",可多次使用',(e,t)=>t.concat([e]),[]).option("--verbose","显示详细的 HTTP 请求和响应日志",!1).action(async e=>{let t={};void 0!==e.name&&(t.name=e.name);let i={};void 0!==e.siteUrl&&(i.site_url=e.siteUrl),e.disableSignup&&(i.disable_signup=!0),e.enableSignup&&(i.disable_signup=!1),e.externalEmailEnabled&&(i.external_email_enabled=!0),e.externalEmailDisabled&&(i.external_email_enabled=!1),void 0!==e.mailerAutoconfirm&&(i.mailer_auto_confirm=e.mailerAutoconfirm),void 0!==e.doubleConfirmChanges&&(i.double_confirm_changes=e.doubleConfirmChanges),e.mailerSecureEmailChangeEnabled&&(i.mailer_secure_email_change_enabled=!0),e.mailerSecureEmailChangeDisabled&&(i.mailer_secure_email_change_enabled=!1),void 0!==e.mailerOtpExp&&(i.mailer_otp_exp=e.mailerOtpExp),void 0!==e.passwordMinLength&&(i.password_min_length=e.passwordMinLength),void 0!==e.passwordRequiredCharacters&&(i.password_required_characters=e.passwordRequiredCharacters),void 0!==e.smtpHost&&(i.smtp_host=e.smtpHost),void 0!==e.smtpPort&&(i.smtp_port=e.smtpPort),void 0!==e.smtpUser&&(i.smtp_user=e.smtpUser),void 0!==e.smtpPass&&(i.smtp_pass=e.smtpPass),void 0!==e.smtpAdminEmail&&(i.smtp_admin_email=e.smtpAdminEmail),void 0!==e.smtpSenderName&&(i.smtp_sender_name=e.smtpSenderName),void 0!==e.smtpMaxFrequency&&(i.smtp_max_frequency=e.smtpMaxFrequency),Object.keys(i).length>0&&(t.email_config=i);let o={};e.externalPhoneEnabled&&(o.external_phone_enabled=!0),e.externalPhoneDisabled&&(o.external_phone_enabled=!1),Object.keys(o).length>0&&(t.phone_config=o),0===Object.keys(t).length&&(console.error(et.red("Error: 至少需要提供一个配置项")),process.exit(1));let r=eY(e.header);if(e.verbose&&(console.log(et.cyan("\uD83D\uDCE4 Request: POST /v2/supabase/auth/config/update")),console.log(et.cyan("\uD83D\uDCE4 Payload:"),{config:t}),r&&console.log(et.cyan("\uD83D\uDCE4 Headers:"),eX(r))),e.mock){console.log(et.yellow("\uD83E\uDDEA Mock mode enabled - skipping actual request")),console.log(JSON.stringify({success:!0,should_update_ui:!1,mock:!0},null,2));return}let s=eK("Updating auth config...").start();try{let i=new c,o=new f(i,r),n=await o.updateAuthConfigV2(t);e.verbose&&console.log(et.cyan("\uD83D\uDCE5 Response code:"),n.code),0!==n.code&&(s.fail(et.red(`Error: ${n.msg}`)),process.exit(1)),s.succeed(et.green("Auth config updated successfully!")),console.log(JSON.stringify({success:n.success,should_update_ui:n.should_update_ui},null,2))}catch(e){s.fail(et.red("Failed to update auth config")),console.error(et.red(e.message)),process.exit(1)}});let ts=new A;ts.name("coze-coding-ai").description("Coze Coding CLI - AI-powered tools for image generation, video generation, search, voice, chat, embedding, knowledge, and supabase management").version("0.3.0"),ts.addCommand(e0),ts.addCommand(e1),ts.addCommand(e2),ts.addCommand(e9),ts.addCommand(e8),ts.addCommand(e3),ts.addCommand(e5),ts.addCommand(e6),ts.addCommand(te),ts.addCommand(tt),ts.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coze-coding-dev-sdk",
3
- "version": "0.7.18-beta.6",
3
+ "version": "0.7.18-beta.9",
4
4
  "description": "Coze Coding Dev SDK - 优雅的多功能 AI SDK,支持图片生成、视频生成、语音合成、语音识别、大语言模型和联网搜索",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.mjs",