aitable-workflow-cli 0.1.25 → 0.1.26-beta.1788916459616

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/chunk-W74OPSPB.js +15 -0
  2. package/dist/cli.js +1 -1
  3. package/dist/{config-ui-server-IUSACAOT.js → config-ui-server-XICILFV7.js} +1 -1
  4. package/package.json +3 -3
  5. package/templates/_shared/aitable-faq/.kb/state.json +11 -9
  6. package/templates/_shared/aitable-faq/.kb/wiki/_compile-report.json +10 -25
  7. package/templates/_shared/aitable-faq/.kb/wiki/_index.md +7 -7
  8. package/templates/_shared/aitable-faq/.kb/wiki/concepts/AI/350/241/250/346/240/274/344/270/211/346/226/271/346/217/222/344/273/266/344/275/277/347/224/250/346/216/210/346/235/203.md +0 -3
  9. package/templates/_shared/aitable-faq/.kb/wiki/concepts/AI/350/241/250/346/240/274/346/216/245Qoder/346/231/272/350/203/275/344/275/223/357/274/232/344/273/216/342/200/234/351/227/256/346/225/260/342/200/235/345/210/260/342/200/234/345/212/236/344/272/213/342/200/235.md +182 -0
  10. package/templates/_shared/aitable-faq/.kb/wiki/concepts/AI/350/241/250/346/240/274/346/217/222/344/273/266-/350/204/232/346/234/254/346/217/222/344/273/266.md +0 -3
  11. package/templates/_shared/aitable-faq/.kb/wiki/concepts/AI/350/241/250/346/240/274/346/217/222/344/273/266-/350/207/252/345/256/232/344/271/211/346/217/222/344/273/266.md +0 -3
  12. package/templates/_shared/aitable-faq/.kb/wiki/concepts/_index.md +4 -3
  13. package/templates/_shared/aitable-faq/.kb/wiki/concepts//346/240/270/345/277/203/347/237/245/350/257/206.md +33 -32
  14. package/templates/_shared/aitable-faq/.kb/wiki/concepts//350/267/250AI/350/241/250/346/240/274/346/225/260/346/215/256/345/220/214/346/255/245.md +1 -0
  15. package/templates/_shared/aitable-faq/.kb/wiki/concepts//351/200/217/350/247/206/350/241/250/350/247/206/345/233/276.md +1 -0
  16. package/templates/_shared/aitable-faq/.kb/wiki/log.md +60 -3
  17. package/templates/_shared/aitable-faq/.kb/wiki/references/AI /350/241/250/346/240/274 AI /345/255/227/346/256/265/345/270/270/350/247/201/346/212/245/351/224/231/350/257/264/346/230/216.md" +4 -0
  18. package/templates/_shared/aitable-faq/.kb/wiki/references/AI/350/241/250/346/240/274 (/345/244/232/347/273/264/350/241/250) OpenAPI /345/270/256/345/212/251/346/226/207/346/241/243.md" +151 -119
  19. package/templates/_shared/aitable-faq/.kb/wiki/references/BarcodeField /346/235/241/347/240/201/345/255/227/346/256/265.md" +2 -0
  20. package/templates/_shared/aitable-faq/.kb/wiki/references/Base /346/250/241/345/235/227.md" +14 -0
  21. package/templates/_shared/aitable-faq/.kb/wiki/references/Field /346/250/241/345/235/227.md" +2 -0
  22. package/templates/_shared/aitable-faq/.kb/wiki/references/Input/346/250/241/345/235/227.md +0 -3
  23. package/templates/_shared/aitable-faq/.kb/wiki/references/Output/346/250/241/345/235/227.md +0 -3
  24. package/templates/_shared/aitable-faq/.kb/wiki/references/Record /346/250/241/345/235/227.md" +2 -0
  25. package/templates/_shared/aitable-faq/.kb/wiki/references/Sheet /346/250/241/345/235/227.md" +7 -0
  26. package/templates/_shared/aitable-faq/.kb/wiki/references/UI /346/250/241/345/235/227.md" +3 -0
  27. package/templates/_shared/aitable-faq/.kb/wiki/references/View /346/250/241/345/235/227.md" +3 -0
  28. package/templates/_shared/aitable-faq/.kb/wiki/references/_index.md +38 -38
  29. package/templates/_shared/aitable-faq/.kb/wiki/references//344/273/252/350/241/250/347/233/230/345/270/270/350/247/201/351/227/256/351/242/230.md +1 -0
  30. package/templates/_shared/aitable-faq/.kb/wiki/references//345/205/266/344/273/226/346/216/245/345/217/243.md +0 -3
  31. package/templates/_shared/aitable-faq/.kb/wiki/references//345/255/227/346/256/265/346/225/260/346/215/256/347/273/223/346/236/204.md +0 -15
  32. package/templates/_shared/aitable-faq/.kb/wiki/references//350/207/252/345/212/250/345/214/226/345/270/270/350/247/201/351/227/256/351/242/230.md +1 -0
  33. package/templates/_shared/aitable-faq/.kb/wiki/references//351/253/230/347/272/247/346/235/203/351/231/220/345/270/270/350/247/201/351/227/256/351/242/230.md +1 -0
  34. package/templates/_shared/aitable-faq/.kb/wiki/topics/6/350/212/202/350/257/276/345/270/246/344/275/240/345/277/253/351/200/237/344/270/212/346/211/213AI/350/241/250/346/240/274.md +1 -0
  35. package/templates/_shared/aitable-faq/.kb/wiki/topics/AI/350/241/250/346/240/274 AI /345/255/227/346/256/265 /345/274/200/345/217/221/346/214/207/345/215/227.md" +4 -0
  36. package/templates/_shared/aitable-faq/.kb/wiki/topics/AI/350/241/250/346/240/274/346/217/222/344/273/266/344/270/255/345/277/203-/344/275/277/347/224/250/346/214/207/345/215/227.md +1 -3
  37. package/templates/_shared/aitable-faq/.kb/wiki/topics/AI/350/241/250/346/240/274/347/232/204/345/257/274/345/207/272.md +1 -0
  38. package/templates/_shared/aitable-faq/.kb/wiki/topics/AI/350/241/250/346/240/274/350/257/257/345/210/240/346/201/242/345/244/215/346/214/207/345/215/227.md +1 -0
  39. package/templates/_shared/aitable-faq/.kb/wiki/topics/Dify/346/231/272/350/203/275/344/275/223.md +1 -3
  40. package/templates/_shared/aitable-faq/.kb/wiki/topics/_index.md +11 -11
  41. package/templates/_shared/aitable-faq/.kb/wiki/topics//344/270/272/350/241/250/346/240/274/346/267/273/345/212/240/345/255/227/346/256/265.md +0 -4
  42. package/templates/_shared/aitable-faq/.kb/wiki/topics//344/275/277/347/224/250AI/350/241/250/346/240/274/344/273/252/350/241/250/347/233/230.md +1 -0
  43. package/templates/_shared/aitable-faq/.kb/wiki/topics//344/275/277/347/224/250AI/350/241/250/346/240/274/350/247/206/345/233/276.md +1 -0
  44. package/templates/_shared/aitable-faq/.kb/wiki/topics//344/275/277/347/224/250AI/350/241/250/346/240/274/351/253/230/347/272/247/346/235/203/351/231/220.md +2 -0
  45. package/templates/_shared/aitable-faq/.kb/wiki/topics//344/275/277/347/224/250/345/205/254/345/274/217/345/255/227/346/256/265.md +1 -0
  46. package/templates/_shared/aitable-faq/.kb/wiki/topics//344/275/277/347/224/250/350/207/252/345/212/250/345/214/226/345/267/245/344/275/234/346/265/201.md +1 -0
  47. package/templates/_shared/aitable-faq/.kb/wiki/topics//346/231/272/350/203/275/344/275/223/351/227/256/346/225/260/344/270/216/344/277/241/346/201/257/346/224/266/351/233/206/357/275/234/345/212/237/350/203/275/350/257/264/346/230/216.md +111 -150
  48. package/templates/_shared/aitable-faq/.kb/wiki/topics//351/222/211/351/222/211AI/350/241/250/346/240/274FAQ.md +5 -0
  49. package/templates/_shared/aitable-faq/.kb/wiki/topics//351/222/211/351/222/211AI/350/241/250/346/240/274/345/277/253/351/200/237/344/270/212/346/211/213.md +1 -0
  50. package/templates/_shared/aitable-faq/.kb/wiki/topics//351/222/211/351/222/211OA/345/256/241/346/211/271/346/225/260/346/215/256/345/220/214/346/255/245.md +1 -0
  51. package/templates/_shared/aitable-faq/AI/350/241/250/346/240/274/346/216/245Qoder/346/231/272/350/203/275/344/275/223/357/274/232/344/273/216/342/200/234/351/227/256/346/225/260/342/200/235/345/210/260/342/200/234/345/212/236/344/272/213/342/200/235.md +181 -0
  52. package/templates/_shared/aitable-faq//351/222/211/351/222/211AI/350/241/250/346/240/274FAQ.md +725 -0
  53. package/dist/chunk-UNPV6DTX.js +0 -15
@@ -0,0 +1,15 @@
1
+ import{o as ge,q as fe}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as no}from"http";import{stat as Xe,readFile as ae,mkdir as ce,writeFile as Ie,rm as ro}from"fs/promises";import{createReadStream as so,existsSync as et,unlinkSync as io}from"fs";import I from"path";import{fileURLToPath as ao}from"url";import ct from"crypto";import co from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as lo,detectCodingEngines as uo,loadWorkflowTemplate as po,collectEnvRefs as go,applyConfigSave as fo,ConfigSaveError as mo,runSetupCommand as wo,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Pt,readFile as q,writeFile as xt}from"fs/promises";import j from"path";import M from"yaml";import{BotProvisioner as Ot,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as At,listDwsConversations as _t,readState as Nt,resetProfileCache as Ne,runDwsCommand as Gt,runCommand as Bt,setupKnowledgeBases as $t,writeBack as ye,assertPortableId as jt}from"aitable-workflow-core";import re from"path";import{closeSync as wt,existsSync as Ee,openSync as ht,readFileSync as yt}from"fs";import{createExecShellToolkit as bt,createStandaloneExecShellToolkit as kt,loadSettings as St,logger as vt,resolveConfigPath as It,spawnManagedProcess as Rt}from"aitable-workflow-core";function Tt(e){let n=yt(re.resolve(e),"utf8").replace(/^\uFEFF/,""),t;try{t=JSON.parse(n)}catch(o){throw new Error(`--argv-file \u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${e}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}if(!Array.isArray(t)||t.length===0||t.some(o=>typeof o!="string"||o.length===0))throw new Error(`--argv-file \u5FC5\u987B\u662F\u975E\u7A7A JSON \u5B57\u7B26\u4E32\u6570\u7EC4\uFF1A${e}`);return t}a(Tt,"readExecArgvFile");function Ct(e){if(!e||typeof e!="object")return;let n=e;if(n.success===!1)return String(n.errorMsg??n.error??n.message??n.errorCode??"\u4E0B\u6E38\u547D\u4EE4\u62A5\u544A\u5931\u8D25");for(let t of["error","errorMsg"]){let o=n[t];if(typeof o=="string"&&o.trim())return o.trim();if(o&&typeof o=="object")return JSON.stringify(o)}if(n.errorCode!==void 0&&n.success!==!0)return String(n.errorCode)}a(Ct,"jsonPayloadError");async function Et(e,n,t={}){let o=await It(e);if(t.standalone||!Ee(o))return{shell:kt(n,{configDir:re.dirname(o)}),mode:"standalone",bins:{},configPath:o};let r=await St(e),s=r.raw?.toolkit_config?.shell??{};return{shell:bt(r,n),mode:"project",bins:s.bins??{},configPath:o}}a(Et,"createToolkitForExec");async function me(e,n,t){let o=re.resolve(t.logFile),r=re.dirname(o);if(!Ee(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=ht(o,"w"),c;try{return c=Rt({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,h=a(b=>g(b),"onError");d.once("error",h),d.once("spawn",()=>{d.removeListener("error",h),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function $o(e,n){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u8BD5\u8DD1\u4E00\u6761\u547D\u4EE4\uFF08\u590D\u7528 shell toolkit \u7684 bins \u89E3\u6790/\u8D85\u65F6/\u8131\u654F\uFF09\uFF0C\u7528\u4E8E dws/git \u547D\u4EE4\u9762 smoke\u3002\u590D\u6742\u53C2\u6570\u53EF\u653E\u5165 UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u6587\u4EF6\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--standalone] [--json | --detach <file>] [--argv-file <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",n.defaultConfig).option("--standalone","\u663E\u5F0F\u65E0\u9879\u76EE\u6A21\u5F0F\uFF1A\u4E0D\u8BFB\u53D6\u9879\u76EE\u914D\u7F6E\uFF0C\u9002\u5408 bootstrap / design \u4EA7\u7269\u751F\u6210\u524D\u63A2\u6D4B dws").option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 runJson \u65B9\u5F0F\u6267\u884C\uFF1A\u8981\u6C42 exit=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u6253\u5370\u89E3\u6790\u540E\u7684\u5BF9\u8C61").option("--argv-file <file>","\u4ECE UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u8BFB\u53D6\u5B8C\u6574\u547D\u4EE4\uFF08\u7B2C\u4E00\u9879 bin\uFF0C\u5176\u4F59\u4E3A\u53C2\u6570\uFF1B\u652F\u6301 BOM\uFF09").option("--detach <file>","\u540E\u53F0\u5206\u79BB\u8FD0\u884C\uFF1A\u547D\u4EE4\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\u8BE5\u6587\u4EF6\u5E76\u7ACB\u5373\u8FD4\u56DE\uFF08\u65E0\u8D85\u65F6/\u91CD\u8BD5\uFF09\u3002\u9002\u5408 dws auth login --device \u7B49\u9700\u5728\u8FD0\u884C\u4E2D\u8BFB\u53D6\u8F93\u51FA\u7684\u6D41\u7A0B").allowUnknownOption().argument("[command...]","\u8981\u6267\u884C\u7684\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u5EFA\u8BAE\u7528 -- \u5206\u9694\uFF09\uFF0C\u5982\uFF1Adws chat group create --name x --format json").action(async(t,o)=>{try{let r=o.argvFile?Tt(o.argvFile):t;if(o.argvFile&&t.length>0)throw new Error("--argv-file \u4E0D\u80FD\u4E0E\u547D\u4EE4\u884C\u547D\u4EE4\u540C\u65F6\u4F7F\u7528");let[s,...i]=r;s||(console.error("\u2717 \u672A\u63D0\u4F9B\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1B\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] -- <bin> <args...>"),process.exit(1));let c=o.timeout?Number.parseInt(o.timeout,10):void 0;c!==void 0&&(Number.isNaN(c)||c<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),o.detach&&(o.json||c!==void 0)&&(console.error("\u2717 --detach \u4E0E --json / --timeout \u4E92\u65A5\uFF08\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E JSON \u8BED\u4E49\uFF09"),process.exit(1)),o.json&&vt.setLevel("warn");let p=await Et(o.config,s,{standalone:o.standalone===!0});if(o.detach){let{pid:d,logFile:h}=await me(s,i,{bins:p.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${d}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${h}`),console.error("\u63D0\u793A\uFF1A\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E\u91CD\u8BD5\u63A7\u5236\uFF0C\u7ED3\u679C\u4EE5\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u4E0E\u5B9E\u9645\u6548\u679C\u4E3A\u51C6\u3002");return}if(o.json){let d=await p.shell.run(s,i,{timeoutMs:c}),h=d.stdout.trim(),b={};if(h!=="")try{b=JSON.parse(h)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),d.stderr&&process.stderr.write(d.stderr),process.exit(1)}let P=Ct(b);if(d.exitCode!==0||P){d.stderr&&process.stderr.write(d.stderr);let G=P?`\uFF1A${P}`:`\uFF08\u9000\u51FA\u7801 ${d.exitCode}\uFF09`;console.error(`\u2717 exec --json \u5931\u8D25${G}`),process.exit(1)}console.log(JSON.stringify(b,null,2));return}let g=await p.shell.run(s,i,{timeoutMs:c});g.stdout&&process.stdout.write(g.stdout),g.stderr&&process.stderr.write(g.stderr),g.truncated&&console.error(`
2
+ \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(g.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}a($o,"registerExecCommand");async function Ge(e={}){let n=e.list??_t;try{let{conversations:t}=await n({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}a(Ge,"listAdminGroups");async function z(e,n){let t={};try{let c=await _e(e,{lenientEnv:!0});for(let p of c.workflowEntries)try{let d=(await At(p.templatePath,{envSource:c.envSource})).tracker;if(!d)continue;t[p.id]={baseId:String(d.base_id??"").trim(),tableId:String(d.table_id??"").trim(),...d.label?{label:String(d.label)}:{}}}catch{}}catch{}let o=await Be(n),r=Object.values(t),s=Object.values(o);return{ok:!0,ready:r.length>0?r.every(c=>c.baseId&&c.tableId)&&s.every(c=>c.baseId&&c.tableId):r.some(c=>c.baseId&&c.tableId),trackers:t,configTables:o}}a(z,"readSetupArtifacts");async function Be(e){let n={},t=j.resolve(e,"profile","profile.yml"),o;try{o=M.parse(await q(t,"utf8"))}catch{return n}let r=R(o)?o.workflows:void 0;if(!R(r))return n;for(let s of Object.values(r)){let i=R(s)?s.steps:void 0;if(R(i)){for(let c of Object.values(i))if(R(c))for(let[p,g]of Object.entries(c)){if(!R(g))continue;let d="baseId"in g||"base_id"in g,h="tableId"in g||"table_id"in g;!d||!h||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var L="wiki/official-aitable-faq";async function Ut(e,n){let t=j.resolve(e,"profile","profile.yml"),o;try{o=M.parse(await q(t,"utf8"))}catch{return[]}let r=R(o)?o.roles:void 0,s=R(r)?r[n]:void 0,i=R(s)?s.knowledge_scope:void 0,c=R(i)?i.kb_collections:void 0;return Array.isArray(c)?c.map(p=>typeof p=="string"?p:R(p)&&typeof p.collection=="string"?p.collection:null).filter(p=>p!==null):[]}a(Ut,"readRoleCollections");function Pe(e){if(M.isScalar(e))return typeof e.value=="string"?e.value:null;if(M.isMap(e)){let n=e.get("collection",!0);return M.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Pe,"kbEntryValue");async function Dt(e,n,t){let o=j.resolve(e,"profile","profile.yml"),r;try{r=await q(o,"utf8")}catch{return{ok:!1,code:"KB_PROFILE_MISSING",message:"profile.yml \u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5207\u6362\u5B98\u65B9\u77E5\u8BC6\u5E93",collections:[],changed:!1}}let s=M.parseDocument(r),i=s.getIn(["roles",n,"knowledge_scope","kb_collections"],!0);if(!M.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Pe).filter(d=>d!==null),p=c.includes(L),g=c.find(d=>d!==L)??null;if(t===p)return{ok:!0,message:t?"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u542F\u7528\u72B6\u6001":"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u5173\u95ED\u72B6\u6001",collections:c,changed:!1};if(!t&&!g)return{ok:!1,code:"KB_LAST_SOURCE",message:"\u5F53\u524D profile \u672A\u58F0\u660E\u7528\u6237\u5E93\uFF0C\u5173\u95ED\u5B98\u65B9\u5E93\u5C06\u5BFC\u81F4\u52A9\u624B\u65E0\u4EFB\u4F55\u77E5\u8BC6\u6765\u6E90",collections:c,changed:!1};if(t)i.add(L);else{let d=i.items.findIndex(h=>Pe(h)===L);d>=0&&i.delete(d)}return await xt(o,s.toString(),"utf8"),{ok:!0,message:t?"\u5DF2\u542F\u7528\u5B98\u65B9\u77E5\u8BC6\u5E93":"\u5DF2\u5173\u95ED\u5B98\u65B9\u77E5\u8BC6\u5E93",changed:!0,collections:t?[...c,L]:c.filter(d=>d!==L)}}a(Dt,"writeOfficialToggle");async function $e(e,n,t,o){jt(t,{label:"roleId"});let r=await Dt(n,t,o);if(!r.ok)return{...r,compile:void 0};Ne();let s=o&&r.changed?Ue(e):void 0;return{...r,compile:s}}a($e,"setOfficialKbEnabled");function je(e){return{ok:!0,...Ue(e)}}a(je,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Lt(e).finally(()=>{we=null}),{started:!0})}a(Ue,"triggerCompile");async function Ft(e,n){let t={};for(let o of n){let r=await Nt(e,o);t[o]=r?{status:r.status,...typeof r.fileCount=="number"?{sourceCount:r.fileCount}:{},...typeof r.compiledCount=="number"?{articleCount:r.compiledCount}:{},...typeof r.finishedAt=="string"?{finishedAt:r.finishedAt}:{}}:{status:"unknown"}}return t}a(Ft,"readKbStats");async function Lt(e){try{let n=await _e(e,{lenientEnv:!0}),t=await $t({settings:n});return{ok:!t.results.some(r=>r.action==="failed"),collections:t.collections,...t.skippedReason?{skippedReason:t.skippedReason}:{}}}catch(n){return{ok:!1,collections:[],skippedReason:n instanceof Error?n.message:String(n)}}}a(Lt,"recompileKb");async function oe(e){let n=await Xt(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},groups:[],groupBotsStaging:[],groupTableRef:null};if(!n)return t;let o=Mt(n),r=Jt(n),s=o&&r?"group-qa":null,i=r?await Ut(e,r):[],c=o?$($(n.workflows)?.[o.workflowId]):void 0,p=o?$($(c?.event_sources)?.[o.eventSourceName]):void 0,d=(await Be(e)).group_table??null;return{ok:!0,scenario:s,workflowId:o?.workflowId??null,eventSourceName:o?.eventSourceName??null,kbRoleId:r,kb:{userCollection:i.find(h=>h!==L)??null,officialOn:i.includes(L),stats:await Ft(e,i)},groups:eo(p?.conversation_ids),groupBotsStaging:await Wt(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function Mt(e){let n=$(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if($(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(Mt,"locateGroupQa");function Jt(e){let n=$(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(Jt,"locateKbRole");async function De(e,n,t,o){let r=[...new Set(o.map(p=>p.trim()).filter(Boolean))],s=r.join(`
3
+ `),i=["workflows",n,"event_sources",t],c=j.join("profile","profile.yml");return await ye({type:"yaml",file:c,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ye({type:"yaml",file:c,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),Ne(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}a(De,"writeGroupList");var Fe="GROUP_BOTS_STAGING";async function se(e){let n=await Zt(e,Fe);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(se,"readGroupBotStagingRaw");async function Le(e,n){await ye({type:"env",file:".env",envKey:Fe},JSON.stringify(n),e)}a(Le,"writeGroupBotStagingRaw");function Kt(e){return e?e.type==="enterprise"?{type:"enterprise",appKey:e.appKey,...e.name?{name:e.name}:{}}:{type:"custom",name:e.name,webhookUrl:e.webhookUrl}:null}a(Kt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await se(e),s=r.findIndex(p=>p.conversationId===o),i=r[s]??{conversationId:o,title:"",enabled:!0,bot:null},c={conversationId:o,title:t.title!==void 0?t.title:i.title,...t.groupType??i.groupType?{groupType:t.groupType??i.groupType}:{},...t.corpId??i.corpId?{corpId:t.corpId??i.corpId}:{},enabled:t.enabled!==void 0?t.enabled:i.enabled,bot:t.bot!==void 0?t.bot:i.bot};return s>=0?r[s]=c:r.push(c),await Le(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Wt(e,n){return(await se(e)).map(o=>({...o,bot:Kt(o.bot)}))}a(Wt,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function xe(e){return e instanceof Oe?`${e.guidance}
4
+ \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}a(xe,"provisionErrorMessage");async function Me(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Me,"resolveCurrentCorpId");async function Je(e,n,t,o={}){let r=o.provision??new Ot({runner:new Ae}),s=j.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(p){return{ok:!1,message:xe(p)}}let c=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(p){if(p instanceof Oe&&p.kind==="bot_already_installed")c=!0;else return{ok:!1,message:xe(p)}}return await ve(e,n,{conversationId:t.conversationId,title:t.title,...t.groupType?{groupType:t.groupType}:{},corpId:i.corpId,enabled:!0,bot:{type:"enterprise",appKey:i.appKey,appSecret:i.appSecret,name:he}}),{ok:!0,message:c?"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF0C\u5DF2\u76F4\u63A5\u8BB0\u5F55\u914D\u7F6E":"\u673A\u5668\u4EBA\u5DF2\u52A0\u5165\u7FA4\u804A"}}a(Je,"addEnterpriseBotToGroup");function Ht(e){let n=[];for(let t of e){if(!t.enabled||!t.bot)continue;let o={\u7FA4ID:t.conversationId,\u7FA4\u540D\u79F0:t.title,...t.groupType?{\u7FA4\u7C7B\u578B:t.groupType==="internal"?"\u5185\u90E8\u7FA4":"\u5916\u90E8\u7FA4"}:{},...t.corpId?{\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId:t.corpId}:{},...t.bot.name?{\u673A\u5668\u4EBA\u6635\u79F0:t.bot.name}:{}};t.bot.type==="enterprise"?n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return n}a(Ht,"stagingToGroupTableRecords");async function ie(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,created:0,message:"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA\uFF08\u7F3A baseId/tableId\uFF09\uFF0C\u6682\u5B58\u4FDD\u7559"};let c=a(async()=>{o.ready&&await Le(n,[])},"clearStaging"),p=await se(n),g=Ht(p);if(g.length===0)return await c(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let d=t.dws??new ke({bin:"dws",timeoutMs:9e4}),h=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(C=>C.groupId),b=g.filter(C=>!h.includes(C.\u7FA4ID??""));if(b.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let P=t.fields??await Se(d,s,i),G=new Map(P.map(C=>[C.fieldName,C.fieldId])),X=b.map(C=>{let l={};for(let[u,m]of Object.entries(C)){let f=G.get(u);f&&(l[f]=m)}return{cells:l}});return await d.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await c(),{ok:!0,created:b.length,message:`\u5DF2\u5199\u5165 ${b.length} \u6761\u7FA4\u914D\u7F6E`}}a(ie,"writeStagingToGroupTable");var _={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function N(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(N).filter(Boolean).join(",");if(R(e)){if(typeof e.name=="string")return e.name.trim();if(typeof e.value=="string")return e.value.trim();if(typeof e.text=="string")return e.text.trim()}return""}a(N,"cellToText");function Yt(e){if(e==null||e==="")return!0;let n=N(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Yt,"cellToEnabled");function qt(e){let n=N(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(qt,"cellToGroupType");function zt(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(zt,"extractConsoleRecords");async function be(e,n,t={}){if(!e||!n)return{ok:!1,baseId:e,tableId:n,groups:[]};let o=t.dws??new ke({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):Se(o,e,n),o.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--all","--format","json"])]),i=new Map(r.map(g=>[g.fieldName,g.fieldId])),c=a((g,d)=>{if(d in g)return g[d];let h=i.get(d);return h?g[h]:void 0},"readCol"),p=[];for(let g of zt(s)){let d=R(g.cells)?g.cells:{},h=N(c(d,_.groupId));if(!h)continue;let b=N(c(d,_.appSecret)),P=N(c(d,_.webhookSecret)),G=qt(c(d,_.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:h,groupName:N(c(d,_.groupName)),...G?{groupType:G}:{},corpId:N(c(d,_.corpId)),inbound:N(c(d,_.inbound)),outbound:N(c(d,_.outbound)),webhookUrl:N(c(d,_.webhookUrl)),webhookSecret:P?"***":"",appKey:N(c(d,_.appKey)),appSecret:b?"***":"",botNick:N(c(d,_.botNick)),enabled:Yt(c(d,_.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Ke(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,baseId:s,tableId:i,groups:[]};let c=await be(s,i,t);if(c.ok&&c.groups.length===0&&(await se(n)).length>0){let g=await ie(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Ke,"readGroupConfigTableForConsole");async function We(e,n,t,o,r={}){if(!e||!n||!t)return{ok:!1,message:"baseId / tableId / recordId \u5FC5\u586B"};let s=r.dws??new ke({bin:"dws",timeoutMs:9e4}),i=r.fields??await Se(s,e,n),c=new Map(i.map(g=>[g.fieldName,g.fieldId])),p={};for(let[g,d]of Object.entries(o)){if(d===void 0)continue;let h=_[g];if(!h)continue;let b=c.get(h)??h;p[b]=d}return Object.keys(p).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",n,"--records",JSON.stringify([{recordId:t,cells:p}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}a(We,"updateGroupConfigRecord");var Vt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Vt)if(typeof n[t]=="boolean")return n[t];for(let t of Object.values(n)){let o=He(t);if(o!==null)return o}return null}a(He,"findAuthBoolean");async function Ye(e={}){let n=e.bin??"dws",t=e.runner??((o,r)=>Bt(o,r,{timeoutMs:15e3}));try{let o=await Gt(n,["auth","status","--format","json"],{runner:t}),r=`${o.stdout}
5
+ ${o.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let i=He(JSON.parse(s));if(i!==null)return{loggedIn:i}}catch{}return/(未登录|登录失效|token\s*(?:is\s*)?(?:invalid|expired)|not\s+(?:logged|authenticated)|unauthenticated)/i.test(r)?{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)}:o.exitCode===0?{loggedIn:!0}:{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)||"dws auth status \u5931\u8D25"}}catch(o){return{loggedIn:!1,message:o instanceof Error?o.message:String(o)}}}a(Ye,"checkDwsAuthStatus");var qe=j.join(".aitable-workflow","dws-login.log"),Qt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function ze(e,n={}){let t=j.resolve(e,qe);await Pt(j.dirname(t),{recursive:!0});try{return await me(n.bin??"dws",["auth","login","--device","--yes","--no-browser"],{logFile:t}),{ok:!0,logFile:t}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}a(ze,"startDwsDeviceLogin");async function Ve(e){try{return{verifyUrl:(await q(j.resolve(e,qe),"utf8")).match(Qt)?.[0]??null}}catch{return{verifyUrl:null}}}a(Ve,"readDwsLoginProgress");async function Zt(e,n){let t;try{t=await q(j.resolve(e,".env"),"utf8")}catch{return null}let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^${o}=(.*)$`,"m"));if(!r)return null;let s=r[1].trim();return s.startsWith("'")&&s.endsWith("'")&&s.length>=2?s=s.slice(1,-1):s.startsWith('"')&&s.endsWith('"')&&s.length>=2&&(s=s.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),s||null}a(Zt,"readEnvKey");async function Xt(e){try{let n=M.parse(await q(j.resolve(e,"profile","profile.yml"),"utf8"));return R(n)?n:null}catch{return null}}a(Xt,"readProfileDoc");function $(e){return R(e)?e:void 0}a($,"asRecord");function eo(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}a(eo,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(R,"isRecord");import{spawnManagedProcess as to}from"aitable-workflow-core";function Ze(e){let n=oo(e);try{let t=to({...n,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}a(Ze,"openExternalUrl");function oo(e,n=process.platform){return n==="darwin"?{command:"open",args:[e]}:n==="win32"?{command:"rundll32.exe",args:["url.dll,FileProtocolHandler",e]}:{command:"xdg-open",args:[e]}}a(oo,"openInvocation");function Qe(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}a(Qe,"printFallback");function ot(e){return e?`workbench/${e}`:"setup"}a(ot,"consoleStartPath");var nt=I.dirname(ao(import.meta.url)),ho={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon"},yo=1800*1e3;function bo(e){let n=null,t=a(()=>{n&&clearTimeout(n),n=null},"clear");return{clear:t,armed:a(()=>n!==null,"armed"),reset:a(()=>{t(),e.isEnabled()&&(n=setTimeout(e.onTimeout,e.timeoutMs))},"reset")}}a(bo,"createIdleTimer");var E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ko=12e4,ne=new Set,F=class extends Error{constructor(t,o){super(o);this.status=t;this.name="TriggerOnceHttpError"}status;static{a(this,"TriggerOnceHttpError")}},Z=class extends Error{constructor(t,o){super(o);this.status=t;this.name="PromotionHttpError"}status;static{a(this,"PromotionHttpError")}},So=6e4,le=!1;function vo(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}a(vo,"detectEnvironment");function ut(){let e=I.join(nt,"web");if(et(I.join(e,"index.html")))return e;let n=I.resolve(nt,"..","..","..","web","dist");return et(I.join(n,"index.html"))?n:null}a(ut,"resolveWebRoot");function ln(){return ut()!==null}a(ln,"hasWebRoot");async function Io(e){let t=e+13-1,{createServer:o}=await import("net"),r=a(s=>new Promise((i,c)=>{let p=o();p.listen(s,()=>{let g=p.address(),d=typeof g=="object"&&g?g.port:s;p.close(()=>i(d))}),p.on("error",()=>{s<t?r(s+1).then(i,c):c(new Error(`\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (${e}-${t})`))})}),"tryListen");return r(e)}a(Io,"getAvailablePort");var Ro=1024*1024,To=50*1024*1024,dt=I.join(".aitable-workflow","console-access.json");async function pt(e,n){let t=I.join(e,dt);return await ce(I.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(n,null,2)}
6
+ `,"utf8"),t}a(pt,"writeConsoleAccessFile");function Co(e){try{io(I.join(e,dt))}catch{}}a(Co,"clearConsoleAccessFile");async function D(e,n=Ro){return new Promise((t,o)=>{let r=[],s=0;e.on("data",i=>{if(s+=i.length,s>n){e.destroy(),o(new Error("Request body too large"));return}r.push(i)}),e.on("end",()=>{try{t(JSON.parse(Buffer.concat(r).toString("utf8")))}catch{o(new Error("Invalid JSON body"))}}),e.on("error",o)})}a(D,"readJson");function w(e,n,t=200){let o=JSON.stringify(n);e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(o)}),e.end(o)}a(w,"sendJson");function k(e,n,t){w(e,{ok:!1,error:t},n)}a(k,"sendError");function W(e){let n=JSON.parse(JSON.stringify(e));for(let t of n.modules){let o=t.workflows?t.workflows.flatMap(r=>r.items):t.items;for(let r of o)r.sensitive&&r.value!==void 0&&(r.value="***")}return n}a(W,"maskSensitive");async function un(e){let n=e.port??8788,t=await Io(n),o=vo(),r=ct.randomUUID(),s=o==="remote"?"0.0.0.0":"127.0.0.1",i=ut(),c=e.mode??"setup",p=e.app;if(c==="runtime"&&!p)throw new Error("runtime \u6A21\u5F0F\u5FC5\u987B\u4F20\u5165 App \u5B9E\u4F8B");if(!i)throw new Error("Web \u8D44\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u542F\u52A8\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");let g=await lt(e.configPath),d=I.dirname(g);E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ne.clear();let h=e.assembleApp?{assembleApp:e.assembleApp,commit:a(m=>{p=m,c="runtime",C(),e.onAppAssembled?.(m)},"commit")}:void 0,b="";e.initialRunStatus&&(v=e.initialRunStatus);let P=null,G=new Promise(m=>P=m),X=bo({timeoutMs:yo,isEnabled:a(()=>c==="setup","isEnabled"),onTimeout:a(()=>{console.log(`
7
+ \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),P?.()},"onTimeout")}),C=a(()=>X.reset(),"resetTimeout"),l=no(async(m,f)=>{let y=new URL(m.url??"/",`http://${m.headers.host??"localhost"}`),O=m.headers.origin;if(O){let x=`http://127.0.0.1:${t}`;(O===x||o==="remote")&&f.setHeader("Access-Control-Allow-Origin",O)}if(f.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),f.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),m.method==="OPTIONS"){f.writeHead(204),f.end();return}if(y.pathname.startsWith("/dev/")){if((y.searchParams.get("token")??m.headers.authorization?.replace("Bearer ",""))!==r){k(f,401,"Unauthorized");return}C();try{await Eo({url:y,req:m,res:f,configPath:e.configPath,configDir:d,completionResolve:P,setupOptions:e.setupOptions,mode:c,app:p,promotion:h?{...h,access:{configDir:d,url:b,port:t}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(U){let ee=U instanceof Error?U.message:String(U);k(f,500,ee)}return}if(y.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}_o(y,f,i)});await new Promise(m=>l.listen(t,s,m)),C();let u=(await oe(d).catch(()=>null))?.scenario??null;b=o==="local-gui"?`http://127.0.0.1:${t}/${ot(u)}?token=${r}`:`http://${co.hostname()}:${t}/${ot(u)}?token=${r}`,await pt(d,{url:b,port:t,mode:c,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Co(d)),o==="local-gui"?e.open!==!1?(Ze(b),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${b}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${b}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${b}`),console.log(`
8
+ \u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
9
+ ssh -L ${t}:127.0.0.1:${t} <your-host>`),console.log(` \u7136\u540E\u6253\u5F00: http://127.0.0.1:${t}/setup?token=${r}`)),c==="runtime"?(console.log(`
10
+ \uFF08\u63A7\u5236\u53F0\u968F start \u8FDB\u7A0B\u4FDD\u6301\u8FD0\u884C\uFF0C\u5173\u95ED\u6D4F\u89C8\u5668\u4E0D\u4F1A\u505C\u6B62\u5DE5\u4F5C\u6D41\uFF09`),console.log(` \uFF08\u6309 Ctrl+C \u505C\u6B62 start \u8FDB\u7A0B | \u63A7\u5236\u53F0\u53EF\u505C\u6B62/\u91CD\u542F\u8FD0\u884C\uFF09
11
+ `)):(console.log(`
12
+ \uFF08\u914D\u7F6E\u53F0\u4F1A\u4FDD\u6301\u8FD0\u884C\uFF0Csetup \u5B8C\u6210\u540E\u53EF\u7EE7\u7EED\u67E5\u770B\u7B54\u7591\u8BB0\u5F55/\u4E13\u5BB6\u914D\u7F6E/\u77E5\u8BC6\u5E93\uFF09`),console.log(` \uFF08\u6309 Ctrl+C \u9000\u51FA | --no-ui \u56DE\u9000\u547D\u4EE4\u884C\u4EA4\u4E92\uFF09
13
+ `)),await G,X.clear(),l.close()}a(un,"runConfigUI");async function Eo(e){let{url:n,req:t,res:o,configPath:r,configDir:s,completionResolve:i,setupOptions:c,mode:p,app:g,promotion:d,exitOnSetupError:h}=e;if(t.method==="GET"&&n.pathname==="/dev/config/check"){let l=await V({configPath:r});w(o,W(l));return}if(t.method==="GET"&&n.pathname==="/dev/config/enriched"){let l=await V({configPath:r}),u=uo(),m=await lo(r),f={},y={},O=new Set,x=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let S=await lt(r),A=await ae(S,"utf8");for(let J of go([A]))O.add(J)}catch{}try{let S=await ae(I.join(s,"profile","profile.yml"),"utf8"),A=Re.parse(S),J=A?.workflows;if(J&&typeof J=="object"&&(y=J),A&&typeof A=="object"){let{workflows:Ce,...H}=A;for(let te of JSON.stringify(H).matchAll(x))O.add(te[1])}}catch{}for(let S of m.workflowEntries)try{let A=await po(S.templatePath),J=A.steps.map(T=>({id:T.id,name:T.name,recipe:T.recipe,engine:T.engine,auto:T.auto})),Ce=A.edges.filter(T=>T.from!=="__start__"&&T.to!=="__end__").map(T=>({from:T.from,to:T.to,condition:T.condition})),H={},te=new Set,K;try{K=Re.parse(await ae(S.templatePath,"utf8"))}catch{}if(K){for(let B of JSON.stringify(K).matchAll(x))te.add(B[1]);let T=y[S.id];if(T&&typeof T=="object")for(let B of JSON.stringify(T).matchAll(x))te.add(B[1]);let gt=Array.isArray(K.steps)?K.steps:[];for(let B=0;B<A.steps.length;B++){let ue=A.steps[B],Y=gt[B];if(Y){let de=JSON.stringify(Y),pe=new Set;for(let mt of de.matchAll(x))pe.add(mt[1]);pe.size>0&&(H[ue.id]=[...pe])}}let ft=Array.isArray(K.event_sources)?K.event_sources:[];for(let B of ft)if(B){let ue=JSON.stringify(B),Y=new Set;for(let de of ue.matchAll(x))Y.add(de[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}f[S.id]={steps:J,edges:Ce,stepEnvRefs:H,envRefs:[...te].sort()}}catch{f[S.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let U=new Set;for(let S of Object.values(f))for(let A of S.envRefs??[])U.add(A);let ee=l.modules.find(S=>S.id==="env");for(let S of ee?.items??[])S.writeTarget?.type==="env"&&!U.has(S.key)&&O.add(S.key);w(o,{config:W(l),engines:{available:u.available.map(S=>({engine:S.engine,cmd:S.cmd,version:S.version})),recommended:u.recommendedEngine},workflowTopology:f,projectEnvRefs:[...O].sort()});return}if(t.method==="POST"&&n.pathname==="/dev/config/save"){let l=await D(t);try{let u=await fo(l,s,r);w(o,{ok:!0,written:u.written,recheck:W(u.recheck)})}catch(u){if(u instanceof mo){k(o,u.status,u.message);return}throw u}return}if(t.method==="POST"&&n.pathname==="/dev/kb/ingest"){let l=await D(t);if(!l.roleId||!l.source){k(o,400,"roleId and source are required");return}try{tt(l.roleId,{label:"roleId"})}catch(O){k(o,400,O instanceof Error?O.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await fe(u,l.roleId),f=await ge({source:l.source,collectionName:m,configDir:s}),y=await V({configPath:r});w(o,{ok:f.success,message:f.message,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/kb/upload"){let l=await D(t,To);if(!l.roleId||!Array.isArray(l.files)||l.files.length===0){k(o,400,"roleId and files are required");return}try{tt(l.roleId,{label:"roleId"})}catch(y){k(o,400,y instanceof Error?y.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await fe(u,l.roleId),f=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ce(f,{recursive:!0});for(let x of l.files){let U;try{U=Te(f,x.relativePath,{allowRoot:!1})}catch{k(o,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${x.relativePath}`);return}let ee=I.dirname(U);await ce(ee,{recursive:!0});let S=x.encoding==="base64"?Buffer.from(x.content,"base64"):Buffer.from(x.content,"utf8");await Ie(U,S)}let y=await ge({source:f,collectionName:m,configDir:s}),O=await V({configPath:r});w(o,{ok:y.success,message:y.message,recheck:W(O)})}finally{await ro(f,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&n.pathname==="/dev/file/read"){let l=n.searchParams.get("path")??"",u=at(l,s);if(!u){k(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${l}`);return}try{let m=await ae(u,"utf8");w(o,{ok:!0,path:l,content:m,exists:!0})}catch{w(o,{ok:!0,path:l,content:"",exists:!1})}return}if(t.method==="POST"&&n.pathname==="/dev/file/write"){let l=await D(t),u=typeof l.path=="string"?l.path:"",m=at(u,s);if(!m||typeof l.content!="string"){k(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${u}`);return}let f=Oo(u,l.content);if(f){w(o,{ok:!1,error:f},400);return}await ce(I.dirname(m),{recursive:!0}),await Ie(m,l.content.endsWith(`
14
+ `)?l.content:l.content+`
15
+ `,"utf8");let y=await V({configPath:r});w(o,{ok:!0,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/setup/complete"){if(E.phase==="running"){k(o,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}E={phase:"running",logs:[]},w(o,{ok:!0});let l=a(async()=>{try{let u=await ie(r,s);u.ok||console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u672A\u5B8C\u6210: ${u.message}`)}catch(u){console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u5F02\u5E38: ${u instanceof Error?u.message:String(u)}`)}},"flushStaging");(async()=>{try{await l(),await wo({config:r,...c??{}}),await l();let u=await z(r,s),m=Ao(u),f={mode:p};if(p==="setup"&&d){let y=await st({configPath:r,...d});f=y.ok?{mode:"runtime"}:{mode:"setup",promotionError:y.error}}E={phase:"done",artifacts:u,baseUrl:m,...f}}catch(u){E={phase:"error",message:u instanceof Error?u.message:String(u)},h&&i?.()}})();return}if(t.method==="GET"&&n.pathname==="/dev/setup/progress"){w(o,E);return}if(t.method==="GET"&&n.pathname==="/dev/setup/artifacts"){w(o,await z(r,s));return}if(t.method==="GET"&&n.pathname==="/dev/console/state"){w(o,await oe(s));return}if(t.method==="POST"&&n.pathname==="/dev/console/groups"){let l=await D(t);if(!l.workflowId||!l.eventSourceName||!Array.isArray(l.conversationIds)){k(o,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await De(s,l.workflowId,l.eventSourceName,l.conversationIds),m=await V({configPath:r});w(o,{...u,recheck:W(m)});return}if(t.method==="GET"&&n.pathname==="/dev/console/admin-groups"){w(o,await Ge());return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth"){w(o,await Ye());return}if(t.method==="POST"&&n.pathname==="/dev/console/dws-auth/login"){let l=await ze(s);w(o,l,l.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth/login"){w(o,await Ve(s));return}let b=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&b){let l=decodeURIComponent(b[1]),u=await D(t),m=await oe(s),f=await Je(s,m.workflowId??"group-qa",{conversationId:l,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(o,f,f.ok?200:400);return}let P=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&P){let l=decodeURIComponent(P[1]),u=await D(t);if(!u.name||!u.webhook||!u.secret){k(o,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){k(o,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let m=await oe(s),f=await Me(),y=await ve(s,m.workflowId??"group-qa",{conversationId:l,...u.title!==void 0?{title:u.title}:{},...u.groupType?{groupType:u.groupType}:{},...f?{corpId:f}:{},enabled:!0,bot:{type:"custom",name:u.name,webhookUrl:u.webhook,...u.secret?{webhookSecret:u.secret}:{}}});w(o,y,y.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/group-config-table"){try{w(o,await Ke(r,s))}catch(l){k(o,502,l instanceof Error?l.message:"\u7FA4\u914D\u7F6E\u8868\u8BFB\u53D6\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/console/group-config-table/flush-staging"){let l=await ie(r,s);w(o,l,l.ok?200:400);return}let G=n.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&G){let l=decodeURIComponent(G[1]),u=await D(t),f=(await z(r,s)).configTables.group_table;if(!f?.baseId||!f.tableId){k(o,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let y=await We(f.baseId,f.tableId,l,u);w(o,y,y.ok?200:400)}catch(y){k(o,502,y instanceof Error?y.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/kb/official"){let l=await D(t);if(!l.roleId||typeof l.enabled!="boolean"){w(o,{ok:!1,code:"KB_BAD_REQUEST",message:"roleId \u4E0E enabled(boolean) \u5FC5\u586B"},400);return}let u;try{u=await $e(r,s,l.roleId,l.enabled)}catch(m){w(o,{ok:!1,code:"KB_TOGGLE_FAILED",message:m instanceof Error?m.message:"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5F00\u5173\u5931\u8D25",collections:[]},400);return}w(o,u,u.ok?200:400);return}if(t.method==="POST"&&n.pathname==="/dev/kb/recompile"){let l=await je(r);w(o,l);return}if(t.method==="GET"&&n.pathname==="/dev/console/mode"){w(o,{ok:!0,mode:p,promotable:p==="setup"&&!!d});return}if(t.method==="POST"&&n.pathname==="/dev/console/promote"){if(p==="runtime"){w(o,{ok:!0,mode:"runtime"});return}if(!d){k(o,409,"\u5F53\u524D\u63A7\u5236\u53F0\u4E0D\u652F\u6301\u5C31\u5730\u664B\u5347\uFF08setup \u547D\u4EE4\u8BF7\u4F7F\u7528 aitable-workflow start\uFF09");return}if(E.phase!=="done"){k(o,409,"\u642D\u5EFA\u5C1A\u672A\u5B8C\u6210\uFF0C\u65E0\u6CD5\u8FDB\u5165\u8FD0\u884C\u6A21\u5F0F");return}try{let l=await st({configPath:r,...d});l.ok?w(o,{ok:!0,mode:"runtime"}):w(o,{ok:!1,mode:"setup",error:l.error},l.status)}catch(l){let u=l instanceof Z?l.status:500;k(o,u,l instanceof Error?l.message:String(l))}return}if(t.method==="GET"&&n.pathname==="/dev/run/status"){if(p==="setup"){w(o,{ok:!0,status:"unknown"});return}w(o,{ok:!0,...rt()});return}let C={"/dev/run/start":"start","/dev/run/stop":"stop"}[n.pathname];if(t.method==="POST"&&C){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u4E0D\u652F\u6301\u8FD0\u884C\u63A7\u5236\uFF0C\u8BF7\u4F7F\u7528 aitable-workflow start \u547D\u4EE4");return}let l=await Po(C,g);w(o,{...l,status:rt()});return}if(t.method==="POST"&&n.pathname==="/dev/workflow/trigger-once"){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684\u5F15\u64CE\uFF0C\u65E0\u6CD5\u89E6\u53D1\u5DE5\u4F5C\u6D41");return}let l;try{l=await D(t)}catch(u){k(o,400,u instanceof Error?u.message:String(u));return}try{let u=await xo(String(l.workflowId??""),g);w(o,{ok:!0,...u})}catch(u){let m=u instanceof F?u.status:500;k(o,m,u instanceof Error?u.message:String(u))}return}k(o,404,"Unknown endpoint")}a(Eo,"handleDevApi");function rt(){return v}a(rt,"getRuntimeRunStatus");async function Po(e,n){let t=ct.randomUUID();return e==="start"?v.status==="running"||v.status==="starting"?{ok:!0,action:e,requestId:t}:(v={status:"starting",since:new Date().toISOString(),lastError:null},Q=Q.then(()=>{let o=n.start();v.status==="starting"&&(v={status:"running",since:new Date().toISOString(),lastError:null}),o.catch(r=>{v={status:"error",lastError:r instanceof Error?r.message:String(r)}})}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):e==="stop"?v.status==="stopping"?{ok:!0,action:e,requestId:t}:v.status!=="running"&&v.status!=="starting"?(v={status:"stopped",lastError:null},{ok:!0,action:e,requestId:t}):(v={status:"stopping",lastError:null},Q=Q.then(async()=>{await n.stop(),v={status:"stopped",lastError:null}}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):{ok:!1,action:e,requestId:t}}a(Po,"handleRuntimeRunControl");async function xo(e,n,t={}){if(typeof e!="string"||e.length===0)throw new F(400,"\u7F3A\u5C11 workflowId");if(!n.instances.some(i=>i.id===e)){let i=n.instances.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09";throw new F(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new F(409,`\u5DE5\u4F5C\u6D41 "${e}" \u6B63\u5728\u89E6\u53D1\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210`);ne.add(e);let o=new AbortController,r=null,s=t.timeoutMs??ko;try{let i=new Promise((p,g)=>{r=setTimeout(()=>{o.abort(),g(new F(504,`\u89E6\u53D1\u8D85\u65F6\uFF08${s}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u6267\u884C`))},s)}),c=await Promise.race([n.triggerWorkflowOnce(e,{signal:o.signal}),i]);return{workflowId:e,...c}}catch(i){throw i instanceof F?i:new F(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}a(xo,"handleTriggerWorkflowOnce");function dn(){ne.clear()}a(dn,"resetTriggerOnceForTest");async function st(e,n={}){if(le)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");le=!0;let t=n.timeoutMs??So,o=null;try{let r=new Promise((i,c)=>{o=setTimeout(()=>c(new Z(504,`\u88C5\u914D\u8D85\u65F6\uFF08${t}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u664B\u5347`)),t)}),s=await Promise.race([e.assembleApp(e.configPath),r]);if(e.commit(s),v={status:"idle"},e.access)try{await pt(e.access.configDir,{url:e.access.url,port:e.access.port,mode:"runtime",pid:process.pid,since:new Date().toISOString()})}catch(i){console.error(`[console] console-access.json \u91CD\u5199\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`)}return it({ok:!0,mode:"runtime"}),{ok:!0,mode:"runtime"}}catch(r){let s=r instanceof Z?r.status:500,i=r instanceof Error?r.message:String(r);console.error(`[console] setup\u2192runtime \u664B\u5347\u5931\u8D25: ${i}`);let c={ok:!1,mode:"setup",status:s,error:i};return it(c),c}finally{o&&clearTimeout(o),le=!1}}a(st,"handleConsolePromotion");function it(e){if(E.phase==="done")if(e.ok){let{promotionError:n,...t}=E;E={...t,mode:"runtime"}}else E={...E,mode:"setup",promotionError:e.error}}a(it,"applyPromotionToDoneProgress");function pn(){v={status:"idle"},Q=Promise.resolve()}a(pn,"resetRuntimeRunStatusForTest");function gn(){le=!1,E={phase:"idle"},v={status:"idle"}}a(gn,"resetPromotionForTest");function fn(e){E=e}a(fn,"setSetupProgressForTest");function mn(){return E}a(mn,"getSetupProgressForTest");function at(e,n){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Te(n,t,{allowRoot:!1})}catch{return null}}a(at,"resolveInsideConfigDir");function Oo(e,n){try{return/\.json$/i.test(e)?JSON.parse(n):Re.parse(n),null}catch(t){return`${/\.json$/i.test(e)?"JSON":"YAML"} \u8BED\u6CD5\u9519\u8BEF\uFF0C\u672A\u4FDD\u5B58: ${t instanceof Error?t.message:String(t)}`}}a(Oo,"validateStructuredText");function Ao(e){let n=Object.values(e.trackers).find(t=>t.baseId&&t.tableId);return n?.baseId?`https://alidocs.dingtalk.com/i/nodes/${encodeURIComponent(n.baseId)}`:null}a(Ao,"deriveBaseUrl");async function _o(e,n,t){let o;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";o=Te(t,i,{allowRoot:!1})}catch{n.writeHead(403),n.end("Forbidden");return}try{(await Xe(o)).isDirectory()&&(o=I.join(o,"index.html"))}catch{o=I.join(t,"index.html")}try{await Xe(o)}catch{n.writeHead(404),n.end("Not Found");return}let r=I.extname(o),s=ho[r]??"application/octet-stream";n.writeHead(200,{"Content-Type":s}),so(o).pipe(n)}a(_o,"serveStatic");export{$o as a,Ze as b,ot as c,bo as d,F as e,Z as f,vo as g,ut as h,ln as i,dt as j,pt as k,Co as l,un as m,rt as n,Po as o,xo as p,dn as q,st as r,pn as s,gn as t,fn as u,mn as v,_o as w};
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as He,b as Je,m as Ve}from"./chunk-UNPV6DTX.js";import"./chunk-4B6V7VHM.js";import{b as X,d as W,e as ke,f as qe,g as Q}from"./chunk-N2ATMPTO.js";import{a}from"./chunk-EI7MMDWY.js";import{config as mn}from"dotenv";import{Command as mi}from"commander";import{logger as pn,activateGlobalDwsOnPath as di,initSlsReport as ui}from"aitable-workflow-core";import{createRequire as fn}from"module";var Ke="aitable-workflow-",hn=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function Ye(){try{return fn(import.meta.url)("../package.json")}catch{return{}}}a(Ye,"loadCliPackageManifest");function be(r){return r.version??"0.0.0"}a(be,"resolveCliVersion");function ze(r){let t=be(r),e={};r.name?.startsWith(Ke)&&(e[r.name]=t);for(let[n,o]of Object.entries(r.dependencies??{}))n.startsWith(Ke)&&(e[n]=hn.test(o)?o:t);return e}a(ze,"resolveMonorepoPackageVersions");import dn from"path";import{fileURLToPath as gi}from"url";var Xe="./aitable-workflow.config.yml";import{runInit as wn,logger as yn}from"aitable-workflow-core";import vn from"path";function Qe(r,t){r.command("init").description("\u4EA4\u4E92\u5F0F\u521D\u59CB\u5316 \u2014 \u9009\u62E9 Coding Agent\u3001\u914D\u7F6E\u5DE5\u4F5C\u76EE\u5F55\u3001\u63CF\u8FF0\u4E1A\u52A1\u573A\u666F\uFF1B\u6216\u7528 --template \u4ECE\u53EF\u7528\u6A21\u677F\u811A\u624B\u67B6").option("-c, --config <path>","\u76EE\u6807\u76EE\u5F55\u6216\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09").option("-f, --force","\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6").option("-y, --yes","\u4F7F\u7528\u9ED8\u8BA4\u503C\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u5411\u5BFC").option("-t, --template <name>","\u4ECE\u5F53\u524D\u53D1\u884C\u5305\u63D0\u4F9B\u7684\u6A21\u677F\u811A\u624B\u67B6\uFF0C\u62F7\u8D1D\u5B8C\u6574\u53EF\u8FD0\u884C\u9879\u76EE\u5230\u76EE\u6807\u76EE\u5F55").option("--profile <name>","\u9009\u5B9A\u6A21\u677F\u4E0B\u7684 profile \u4E1A\u52A1\u5305\uFF0C\u8986\u76D6\u5F0F\u53E0\u52A0\u5230\u5B9E\u4F8B").action(async e=>{try{await wn({config:e.config,force:!!e.force,yes:!!e.yes,template:e.template,profile:e.profile,templatesDir:vn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),yn.error("cli","\u521D\u59CB\u5316\u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}a(Qe,"registerInitCommand");import{runMigrate as kn,logger as bn}from"aitable-workflow-core";import Rn from"path";function Ze(r,t){r.command("migrate").description("\u5347\u7EA7\u9879\u76EE\u76EE\u5F55\u5230\u6700\u65B0\u6A21\u677F\u7248\u672C\uFF0C\u81EA\u52A8\u4FDD\u7559\u7528\u6237\u914D\u7F6E\uFF1B\u6216\u7528 --from/--to \u5728\u4E24\u4E2A\u76EE\u5F55\u95F4\u505A\u5408\u5E76\u8FC1\u79FB").option("-c, --config <path>","\u9879\u76EE\u76EE\u5F55\u8DEF\u5F84",t.defaultConfig).option("--from <dir>","\u6E90\u76EE\u5F55\uFF1A\u4EE5\u8BE5\u76EE\u5F55\u4E3A\u8FC1\u79FB\u57FA\u51C6\uFF08\u4E0D\u6309\u540D scaffold \u6A21\u677F\uFF09\uFF0C\u4E0E --template/--profile \u4E92\u65A5").option("--to <dir>","\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08--config \u7684\u540C\u4E49\u53C2\u6570\uFF0C\u4F18\u5148\u751F\u6548\uFF09").option("--dry-run","\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--no-backup","\u8DF3\u8FC7\u81EA\u52A8\u5907\u4EFD").option("--force","\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A").option("--template <name>","\u6307\u5B9A\u76EE\u6807\u6A21\u677F").option("--profile <name>","\u6307\u5B9A\u76EE\u6807 profile").option("--rollback","\u56DE\u6EDA\u5230\u4E0A\u4E00\u6B21\u8FC1\u79FB\u524D\u7684\u72B6\u6001").option("--list","\u5217\u51FA\u6240\u6709\u5907\u4EFD").action(async e=>{try{await kn({config:e.config,from:e.from,to:e.to,dryRun:e.dryRun,noBackup:e.backup===!1,force:e.force,template:e.template,profile:e.profile,rollback:e.rollback,list:e.list,templatesDir:Rn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),bn.error("cli","migrate \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}a(Ze,"registerMigrateCommand");import{runDesignCommand as Cn,logger as In}from"aitable-workflow-core";function et(r,t){r.command("design").description("\u8BA9 Coding Agent \u6839\u636E\u573A\u666F\u63CF\u8FF0\u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("-y, --yes","\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u8865\u5145\uFF0C\u76F4\u63A5\u4F7F\u7528 config \u4E2D\u7684 scene").option("--skip-questions","\u4E0D\u56DE\u7B54 Agent \u7684\u6F84\u6E05\u63D0\u95EE\uFF08Agent \u6309\u5047\u8BBE\u751F\u6210\u5E76\u5217\u51FA\u5F85\u786E\u8BA4\u9879\uFF09").action(async e=>{try{await Cn(e)}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),In.error("cli","design \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}a(et,"registerDesignCommand");import{runCheck as Sn,runSetupCommand as An,checkMigrateHint as En,logger as xn,reportCliEvent as Z,setReportProject as Tn}from"aitable-workflow-core";import nt from"path";function Re(r){return r.skipConfig||r.skipConfigIfValid&&r.configValid===!0}a(Re,"canSkipSetupConfig");function tt(r){return Re(r)?"setup":r.uiEnabled&&r.webAvailable?"web":"cli"}a(tt,"resolveSetupConfigRoute");function ot(r,t){r.command("setup").description("\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E\uFF0C\u518D\u521D\u59CB\u5316 AI \u8868\u683C\u7ED3\u6784 + \u51C6\u5907\u77E5\u8BC6\u5E93 \u2014 \u4E00\u6B21\u5B8C\u6210 config + \u5EFA\u8868").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("--no-clean","\u4E0D\u6E05\u7406\u7A7A\u767D\u884C").option("--no-kb","\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u51C6\u5907/\u7F16\u8BD1").option("--kb-full","\u5F3A\u5236\u5168\u91CF\u91CD\u7F16\u8BD1\u77E5\u8BC6\u5E93").option("--skip-config","\u8DF3\u8FC7\u524D\u7F6E\u7684\u4EA4\u4E92\u5F0F\u914D\u7F6E\u6821\u9A8C\uFF08CI/\u5DF2\u786E\u8BA4\u914D\u7F6E\u65F6\u4F7F\u7528\uFF09").option("--skip-config-if-valid","\u5148\u6821\u9A8C\u914D\u7F6E\uFF1B\u65E0\u963B\u65AD\u9879\u65F6\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u76F4\u63A5\u5F00\u59CB\u642D\u5EFA").option("--no-ui","\u5F3A\u5236\u4F7F\u7528\u547D\u4EE4\u884C\u4EA4\u4E92\uFF08\u8DF3\u8FC7\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762\uFF09").option("--only <round>","\u53EA\u6267\u884C\u6307\u5B9A\u73AF\u8282\uFF1B\u5F53\u524D\u4EC5\u652F\u6301 automations\uFF08\u6309 profile \u5F00\u5173\u5BF9\u9F50\u81EA\u52A8\u5316\uFF0C\u4E0D\u5EFA\u8868\u3001\u4E0D\u7F16\u77E5\u8BC6\u5E93\uFF09").action(async e=>{e.only!==void 0&&e.only!=="automations"&&(console.error(`\u2717 --only \u4E0D\u652F\u6301\u300C${e.only}\u300D\uFF0C\u5F53\u524D\u552F\u4E00\u5408\u6CD5\u503C\uFF1Aautomations`),process.exit(1));let n=e.only==="automations";Tn(e.config);let o=Date.now();Z("setup.start",{skipConfig:e.skipConfig===!0,clean:e.clean,kb:e.kb,kbFull:e.kbFull===!0,ui:e.ui!==!1,...n?{only:"automations"}:{}});try{if(await En(nt.dirname(nt.resolve(e.config)),t.version),!e.skipConfig&&!n){let i=e.ui!==!1,s=!1;if(e.skipConfigIfValid){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u9879\u76EE\u914D\u7F6E");let c=await Sn({configPath:e.config});if(s=Re({skipConfig:!1,skipConfigIfValid:!0,configValid:c.ok}),s){let l=[];c.summary.warnings>0&&l.push(`${c.summary.warnings} \u9879\u8B66\u544A`),c.summary.suggestions>0&&l.push(`${c.summary.suggestions} \u9879\u5EFA\u8BAE`);let p=l.length>0?`\uFF08${l.join("\uFF0C")}\uFF0C\u5747\u4E0D\u963B\u65AD\uFF09`:"";console.log(`\u2713 \u914D\u7F6E\u65E0\u963B\u65AD\u9879${p}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u7EE7\u7EED\u642D\u5EFA\u3002`)}else console.log(`\u2139 \u68C0\u6D4B\u5230 ${c.summary.errors} \u9879\u963B\u65AD\uFF0C\u8FDB\u5165\u914D\u7F6E\u73AF\u8282\u3002`)}if(!s&&i){let{hasWebRoot:c,runConfigUI:l}=await import("./config-ui-server-IUSACAOT.js");if(tt({skipConfig:!1,skipConfigIfValid:e.skipConfigIfValid===!0,uiEnabled:i,webAvailable:c(),configValid:s})==="web"){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");try{await l({configPath:e.config,setupOptions:{clean:e.clean,kb:e.kb,kbFull:e.kbFull}}),Z("setup.finish",{success:!0,route:"web",durationMs:Date.now()-o});return}catch(m){console.warn(`
2
+ import{a as He,b as Je,m as Ve}from"./chunk-W74OPSPB.js";import"./chunk-4B6V7VHM.js";import{b as X,d as W,e as ke,f as qe,g as Q}from"./chunk-N2ATMPTO.js";import{a}from"./chunk-EI7MMDWY.js";import{config as mn}from"dotenv";import{Command as mi}from"commander";import{logger as pn,activateGlobalDwsOnPath as di,initSlsReport as ui}from"aitable-workflow-core";import{createRequire as fn}from"module";var Ke="aitable-workflow-",hn=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function Ye(){try{return fn(import.meta.url)("../package.json")}catch{return{}}}a(Ye,"loadCliPackageManifest");function be(r){return r.version??"0.0.0"}a(be,"resolveCliVersion");function ze(r){let t=be(r),e={};r.name?.startsWith(Ke)&&(e[r.name]=t);for(let[n,o]of Object.entries(r.dependencies??{}))n.startsWith(Ke)&&(e[n]=hn.test(o)?o:t);return e}a(ze,"resolveMonorepoPackageVersions");import dn from"path";import{fileURLToPath as gi}from"url";var Xe="./aitable-workflow.config.yml";import{runInit as wn,logger as yn}from"aitable-workflow-core";import vn from"path";function Qe(r,t){r.command("init").description("\u4EA4\u4E92\u5F0F\u521D\u59CB\u5316 \u2014 \u9009\u62E9 Coding Agent\u3001\u914D\u7F6E\u5DE5\u4F5C\u76EE\u5F55\u3001\u63CF\u8FF0\u4E1A\u52A1\u573A\u666F\uFF1B\u6216\u7528 --template \u4ECE\u53EF\u7528\u6A21\u677F\u811A\u624B\u67B6").option("-c, --config <path>","\u76EE\u6807\u76EE\u5F55\u6216\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09").option("-f, --force","\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6").option("-y, --yes","\u4F7F\u7528\u9ED8\u8BA4\u503C\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u5411\u5BFC").option("-t, --template <name>","\u4ECE\u5F53\u524D\u53D1\u884C\u5305\u63D0\u4F9B\u7684\u6A21\u677F\u811A\u624B\u67B6\uFF0C\u62F7\u8D1D\u5B8C\u6574\u53EF\u8FD0\u884C\u9879\u76EE\u5230\u76EE\u6807\u76EE\u5F55").option("--profile <name>","\u9009\u5B9A\u6A21\u677F\u4E0B\u7684 profile \u4E1A\u52A1\u5305\uFF0C\u8986\u76D6\u5F0F\u53E0\u52A0\u5230\u5B9E\u4F8B").action(async e=>{try{await wn({config:e.config,force:!!e.force,yes:!!e.yes,template:e.template,profile:e.profile,templatesDir:vn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),yn.error("cli","\u521D\u59CB\u5316\u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}a(Qe,"registerInitCommand");import{runMigrate as kn,logger as bn}from"aitable-workflow-core";import Rn from"path";function Ze(r,t){r.command("migrate").description("\u5347\u7EA7\u9879\u76EE\u76EE\u5F55\u5230\u6700\u65B0\u6A21\u677F\u7248\u672C\uFF0C\u81EA\u52A8\u4FDD\u7559\u7528\u6237\u914D\u7F6E\uFF1B\u6216\u7528 --from/--to \u5728\u4E24\u4E2A\u76EE\u5F55\u95F4\u505A\u5408\u5E76\u8FC1\u79FB").option("-c, --config <path>","\u9879\u76EE\u76EE\u5F55\u8DEF\u5F84",t.defaultConfig).option("--from <dir>","\u6E90\u76EE\u5F55\uFF1A\u4EE5\u8BE5\u76EE\u5F55\u4E3A\u8FC1\u79FB\u57FA\u51C6\uFF08\u4E0D\u6309\u540D scaffold \u6A21\u677F\uFF09\uFF0C\u4E0E --template/--profile \u4E92\u65A5").option("--to <dir>","\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08--config \u7684\u540C\u4E49\u53C2\u6570\uFF0C\u4F18\u5148\u751F\u6548\uFF09").option("--dry-run","\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--no-backup","\u8DF3\u8FC7\u81EA\u52A8\u5907\u4EFD").option("--force","\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A").option("--template <name>","\u6307\u5B9A\u76EE\u6807\u6A21\u677F").option("--profile <name>","\u6307\u5B9A\u76EE\u6807 profile").option("--rollback","\u56DE\u6EDA\u5230\u4E0A\u4E00\u6B21\u8FC1\u79FB\u524D\u7684\u72B6\u6001").option("--list","\u5217\u51FA\u6240\u6709\u5907\u4EFD").action(async e=>{try{await kn({config:e.config,from:e.from,to:e.to,dryRun:e.dryRun,noBackup:e.backup===!1,force:e.force,template:e.template,profile:e.profile,rollback:e.rollback,list:e.list,templatesDir:Rn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),bn.error("cli","migrate \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}a(Ze,"registerMigrateCommand");import{runDesignCommand as Cn,logger as In}from"aitable-workflow-core";function et(r,t){r.command("design").description("\u8BA9 Coding Agent \u6839\u636E\u573A\u666F\u63CF\u8FF0\u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("-y, --yes","\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u8865\u5145\uFF0C\u76F4\u63A5\u4F7F\u7528 config \u4E2D\u7684 scene").option("--skip-questions","\u4E0D\u56DE\u7B54 Agent \u7684\u6F84\u6E05\u63D0\u95EE\uFF08Agent \u6309\u5047\u8BBE\u751F\u6210\u5E76\u5217\u51FA\u5F85\u786E\u8BA4\u9879\uFF09").action(async e=>{try{await Cn(e)}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),In.error("cli","design \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}a(et,"registerDesignCommand");import{runCheck as Sn,runSetupCommand as An,checkMigrateHint as En,logger as xn,reportCliEvent as Z,setReportProject as Tn}from"aitable-workflow-core";import nt from"path";function Re(r){return r.skipConfig||r.skipConfigIfValid&&r.configValid===!0}a(Re,"canSkipSetupConfig");function tt(r){return Re(r)?"setup":r.uiEnabled&&r.webAvailable?"web":"cli"}a(tt,"resolveSetupConfigRoute");function ot(r,t){r.command("setup").description("\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E\uFF0C\u518D\u521D\u59CB\u5316 AI \u8868\u683C\u7ED3\u6784 + \u51C6\u5907\u77E5\u8BC6\u5E93 \u2014 \u4E00\u6B21\u5B8C\u6210 config + \u5EFA\u8868").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("--no-clean","\u4E0D\u6E05\u7406\u7A7A\u767D\u884C").option("--no-kb","\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u51C6\u5907/\u7F16\u8BD1").option("--kb-full","\u5F3A\u5236\u5168\u91CF\u91CD\u7F16\u8BD1\u77E5\u8BC6\u5E93").option("--skip-config","\u8DF3\u8FC7\u524D\u7F6E\u7684\u4EA4\u4E92\u5F0F\u914D\u7F6E\u6821\u9A8C\uFF08CI/\u5DF2\u786E\u8BA4\u914D\u7F6E\u65F6\u4F7F\u7528\uFF09").option("--skip-config-if-valid","\u5148\u6821\u9A8C\u914D\u7F6E\uFF1B\u65E0\u963B\u65AD\u9879\u65F6\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u76F4\u63A5\u5F00\u59CB\u642D\u5EFA").option("--no-ui","\u5F3A\u5236\u4F7F\u7528\u547D\u4EE4\u884C\u4EA4\u4E92\uFF08\u8DF3\u8FC7\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762\uFF09").option("--only <round>","\u53EA\u6267\u884C\u6307\u5B9A\u73AF\u8282\uFF1B\u5F53\u524D\u4EC5\u652F\u6301 automations\uFF08\u6309 profile \u5F00\u5173\u5BF9\u9F50\u81EA\u52A8\u5316\uFF0C\u4E0D\u5EFA\u8868\u3001\u4E0D\u7F16\u77E5\u8BC6\u5E93\uFF09").action(async e=>{e.only!==void 0&&e.only!=="automations"&&(console.error(`\u2717 --only \u4E0D\u652F\u6301\u300C${e.only}\u300D\uFF0C\u5F53\u524D\u552F\u4E00\u5408\u6CD5\u503C\uFF1Aautomations`),process.exit(1));let n=e.only==="automations";Tn(e.config);let o=Date.now();Z("setup.start",{skipConfig:e.skipConfig===!0,clean:e.clean,kb:e.kb,kbFull:e.kbFull===!0,ui:e.ui!==!1,...n?{only:"automations"}:{}});try{if(await En(nt.dirname(nt.resolve(e.config)),t.version),!e.skipConfig&&!n){let i=e.ui!==!1,s=!1;if(e.skipConfigIfValid){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u9879\u76EE\u914D\u7F6E");let c=await Sn({configPath:e.config});if(s=Re({skipConfig:!1,skipConfigIfValid:!0,configValid:c.ok}),s){let l=[];c.summary.warnings>0&&l.push(`${c.summary.warnings} \u9879\u8B66\u544A`),c.summary.suggestions>0&&l.push(`${c.summary.suggestions} \u9879\u5EFA\u8BAE`);let p=l.length>0?`\uFF08${l.join("\uFF0C")}\uFF0C\u5747\u4E0D\u963B\u65AD\uFF09`:"";console.log(`\u2713 \u914D\u7F6E\u65E0\u963B\u65AD\u9879${p}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u7EE7\u7EED\u642D\u5EFA\u3002`)}else console.log(`\u2139 \u68C0\u6D4B\u5230 ${c.summary.errors} \u9879\u963B\u65AD\uFF0C\u8FDB\u5165\u914D\u7F6E\u73AF\u8282\u3002`)}if(!s&&i){let{hasWebRoot:c,runConfigUI:l}=await import("./config-ui-server-XICILFV7.js");if(tt({skipConfig:!1,skipConfigIfValid:e.skipConfigIfValid===!0,uiEnabled:i,webAvailable:c(),configValid:s})==="web"){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");try{await l({configPath:e.config,setupOptions:{clean:e.clean,kb:e.kb,kbFull:e.kbFull}}),Z("setup.finish",{success:!0,route:"web",durationMs:Date.now()-o});return}catch(m){console.warn(`
3
3
  \u26A0 \u53EF\u89C6\u5316\u754C\u9762\u5F02\u5E38\uFF0C\u56DE\u9000\u5230\u547D\u4EE4\u884C\u4EA4\u4E92: ${m instanceof Error?m.message:String(m)}
4
4
  `)}}}if(!s){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E");let{runConfigCommand:c}=await import("./config-command-7ECUJOEU.js");(await c({configPath:e.config,interactive:!0,offerSkipToBuild:!0})).ok||(console.error(`
5
5
  \u2717 \u9879\u76EE\u914D\u7F6E\u4ECD\u4E0D\u5B8C\u6574\uFF0C\u5DF2\u4E2D\u6B62 setup\u3002\u8BF7\u8865\u9F50\u5FC5\u586B\u9879\u540E\u91CD\u8BD5\uFF08\u6216\u7528 --skip-config \u8DF3\u8FC7\uFF09\u3002`),process.exit(1))}console.log(`
@@ -1 +1 @@
1
- import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m,p as n,q as o,r as p,s as q,t as r,u as s,v as t,w as u}from"./chunk-UNPV6DTX.js";import"./chunk-4B6V7VHM.js";import"./chunk-EI7MMDWY.js";export{h as CONSOLE_ACCESS_FILE_REL,d as PromotionHttpError,c as TriggerOnceHttpError,j as clearConsoleAccessFile,a as consoleStartPath,b as createIdleTimer,e as detectEnvironment,l as getRuntimeRunStatus,t as getSetupProgressForTest,p as handleConsolePromotion,m as handleRuntimeRunControl,n as handleTriggerWorkflowOnce,g as hasWebRoot,r as resetPromotionForTest,q as resetRuntimeRunStatusForTest,o as resetTriggerOnceForTest,f as resolveWebRoot,k as runConfigUI,u as serveStatic,s as setSetupProgressForTest,i as writeConsoleAccessFile};
1
+ import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m,p as n,q as o,r as p,s as q,t as r,u as s,v as t,w as u}from"./chunk-W74OPSPB.js";import"./chunk-4B6V7VHM.js";import"./chunk-EI7MMDWY.js";export{h as CONSOLE_ACCESS_FILE_REL,d as PromotionHttpError,c as TriggerOnceHttpError,j as clearConsoleAccessFile,a as consoleStartPath,b as createIdleTimer,e as detectEnvironment,l as getRuntimeRunStatus,t as getSetupProgressForTest,p as handleConsolePromotion,m as handleRuntimeRunControl,n as handleTriggerWorkflowOnce,g as hasWebRoot,r as resetPromotionForTest,q as resetRuntimeRunStatusForTest,o as resetTriggerOnceForTest,f as resolveWebRoot,k as runConfigUI,u as serveStatic,s as setSetupProgressForTest,i as writeConsoleAccessFile};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aitable-workflow-cli",
3
- "version": "0.1.25",
3
+ "version": "0.1.26-beta.1788916459616",
4
4
  "description": "aitable-workflow 命令行工具(cli):init/design/setup/run/serve 等命令;含 relay 本地反连客户端与 daemon 进程管理。bin: aitable-workflow。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,8 +19,8 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "aitable-workflow-core": "0.1.25",
23
- "aitable-workflow-server": "0.1.25",
22
+ "aitable-workflow-core": "0.1.26-beta.1788916459616",
23
+ "aitable-workflow-server": "0.1.26-beta.1788916459616",
24
24
  "@inquirer/prompts": "^8.5.2",
25
25
  "commander": "^14.0.2",
26
26
  "dotenv": "^17.4.2",
@@ -1,13 +1,13 @@
1
1
  {
2
- "collection": "wiki/official-aitable-faq",
3
- "sourceDir": "",
4
- "wikiDir": "",
2
+ "collection": "wiki/faq-support",
3
+ "sourceDir": "/home/admin/workspace/workspace-1-17/support-qa/wiki/faq-support",
4
+ "wikiDir": "/home/admin/workspace/workspace-1-17/support-qa/wiki/faq-support/.kb/wiki",
5
5
  "status": "done",
6
- "startedAt": "2026-08-24T11:03:47.835+08:00",
7
- "finishedAt": "2026-08-24T11:06:47.615+08:00",
8
- "fileCount": 191,
9
- "compiledCount": 177,
10
- "sourceHash": "sha256:9fb09d7eb9faff734413d71a870b259b132966c1523ffd8b2a9b38f75c746706",
6
+ "startedAt": "2026-09-07T16:41:42.340+08:00",
7
+ "finishedAt": "2026-09-07T16:44:09.941+08:00",
8
+ "fileCount": 193,
9
+ "compiledCount": 180,
10
+ "sourceHash": "sha256:20d95db8803058adb2fa01beb86a5e266afdaf64a61671ae1c523522100bf77b",
11
11
  "fileHashes": {
12
12
  "01-快速入门/6节课带你快速上手AI表格.md": "sha256:c32ff134bad1e780",
13
13
  "01-快速入门/AI表格行数说明.md": "sha256:a164b0defd14ae02",
@@ -198,8 +198,10 @@
198
198
  "18-开发者指南/AI表格边栏插件 开发指南/核心知识.md": "sha256:a1db691bd0ebd50d",
199
199
  "18-开发者指南/AI表格边栏插件 开发指南.md": "sha256:8b73fee75efdbba9",
200
200
  "AI表格 (多维表) OpenAPI 帮助文档.md": "sha256:ed1a6fdf1f1e015d",
201
+ "AI表格_(多维表)_OpenAPI_帮助文档.md": "sha256:ed1a6fdf1f1e015d",
202
+ "AI表格接Qoder智能体:从“问数”到“办事”.md": "sha256:1ff0bc115c263854",
201
203
  "智能体问数与信息收集|功能说明.md": "sha256:286b062955fd682d",
202
- "钉钉AI表格FAQ.md": "sha256:fdb9a7855fa3ddc3"
204
+ "钉钉AI表格FAQ.md": "sha256:31699addac3e57c8"
203
205
  },
204
206
  "taxonomyHash": "sha256:d1b07e4acbab1a00",
205
207
  "taxonomyIndexHash": "sha256:9275aa75f6082d35"
@@ -1,45 +1,30 @@
1
1
  {
2
- "collection": "wiki/official-aitable-faq",
3
- "startedAt": "2026-08-24T11:03:47.835+08:00",
4
- "finishedAt": "2026-08-24T11:06:47.615+08:00",
5
- "sourceFileCount": 191,
6
- "articleCount": 177,
2
+ "collection": "wiki/faq-support",
3
+ "startedAt": "2026-09-07T16:41:42.340+08:00",
4
+ "finishedAt": "2026-09-07T16:44:09.941+08:00",
5
+ "sourceFileCount": 193,
6
+ "articleCount": 180,
7
7
  "status": "done",
8
8
  "lint": {
9
9
  "issues": [
10
10
  {
11
11
  "rule": "broken-link",
12
12
  "file": "topics/为表格添加字段.md",
13
- "detail": "失效链接: video/第二节课(1"
13
+ "detail": "失效链接: video/第二节课(1)_xN7GZVOHwk.mp4"
14
14
  },
15
15
  {
16
16
  "rule": "broken-link",
17
- "file": "topics/智能体问数与信息收集|功能说明.md",
18
- "detail": "失效链接: ../references/AI表格%20(多维表"
19
- },
20
- {
21
- "rule": "broken-link",
22
- "file": "topics/钉钉AI表格FAQ.md",
23
- "detail": "失效链接: ../concepts/查找引用.md"
24
- },
25
- {
26
- "rule": "broken-link",
27
- "file": "topics/钉钉AI表格FAQ.md",
28
- "detail": "失效链接: ../concepts/自动化.md"
29
- },
30
- {
31
- "rule": "broken-link",
32
- "file": "topics/钉钉AI表格FAQ.md",
33
- "detail": "失效链接: ../concepts/权限与席位.md"
17
+ "file": "references/_index.md",
18
+ "detail": "索引失效链接: AI表格 (多维表"
34
19
  }
35
20
  ],
36
21
  "counts": {
37
- "broken-link": 5,
22
+ "broken-link": 2,
38
23
  "absolute-path": 0,
39
24
  "invalid-category": 0,
40
25
  "missing-sources": 0,
41
26
  "orphan-page": 0
42
27
  },
43
- "checkedArticles": 177
28
+ "checkedArticles": 180
44
29
  }
45
30
  }
@@ -1,17 +1,17 @@
1
1
  # 知识库索引
2
2
 
3
- > 知识库「wiki/official-aitable-faq」由 wiki-compiler 自动编译。导航:先读本文件定位分类,再读分类 _index.md(含逐篇 Contents 表),最后读具体文章。
3
+ > 知识库「wiki/faq-support」由 wiki-compiler 自动编译。导航:先读本文件定位分类,再读分类 _index.md(含逐篇 Contents 表),最后读具体文章。
4
4
 
5
- Last updated: 2026-08-24
5
+ Last updated: 2026-09-07
6
6
 
7
7
  ## Statistics
8
8
 
9
- - Sources: 191 个原始文档
10
- - Articles: 177 篇 wiki 文章
11
- - Last compiled: 2026-08-24T11:06:47.424+08:00
9
+ - Sources: 193 个原始文档
10
+ - Articles: 180 篇 wiki 文章
11
+ - Last compiled: 2026-09-07T16:44:03.236+08:00
12
12
 
13
13
  ## Quick Navigation
14
14
 
15
- - [概念](concepts/_index.md)(50 篇;具体有界概念)
15
+ - [概念](concepts/_index.md)(52 篇;具体有界概念)
16
16
  - [主题](topics/_index.md)(61 篇;宽泛主题)
17
- - [参考资源](references/_index.md)(66 篇;资源列表/查表型知识)
17
+ - [参考资源](references/_index.md)(67 篇;资源列表/查表型知识)
@@ -31,9 +31,6 @@ summary: 组织管理员可通过钉钉管理后台开启AI表格第三方插件
31
31
  - [AI表格插件-自定义插件](../concepts/AI表格插件-自定义插件.md)
32
32
  - [AI表格插件-脚本插件](../concepts/AI表格插件-脚本插件.md)
33
33
  - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
34
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
35
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
36
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](../topics/AI 表格插件 - 企业内插件发布指南.md))
37
34
 
38
35
  ## Sources
39
36
 
@@ -0,0 +1,182 @@
1
+ ---
2
+ title: AI 表格接 Qoder 智能体:从"问数"到"办事"
3
+ category: concepts
4
+ sources: [AI表格接Qoder智能体:从"问数"到"办事".md]
5
+ original_sources: [https://wolai.dingtalk.com/rtvUzALio9YL9oCiABNz2N]
6
+ created: 2026-09-07
7
+ updated: 2026-09-07
8
+ tags: [AI表格, Qoder智能体, 机器人, 自动化, 任务催办]
9
+ aliases: [AI表格Qoder智能体, AI表格接Qoder, 问数到办事]
10
+ confidence: high
11
+ summary: 介绍 AI 表格如何接入 Qoder 智能体,将表格从"查询工具"升级为"办事助理"。涵盖配置步骤、典型场景(定时催办、数据洞察推送)及常见问题解答。
12
+ ---
13
+
14
+ > AI 表格接入 Qoder 智能体后,查询结果可直接触发催办、归档和推送,实现从"问数得到答案"到"自动跟进办事"的升级。本文介绍配置方法、典型场景与常见问题。
15
+
16
+ ## 核心价值
17
+
18
+ 接入 Qoder 智能体后,AI 表格具备以下能力:
19
+
20
+ - **一句话发起任务**:在钉钉聊天中描述目标即可查询或处理数据,无需打开表格逐层筛选
21
+ - **从答案继续行动**:查到异常后可直接催办负责人、发送通知并更新状态
22
+ - **定时自动运行**:按固定时间检查任务、归档问题或分析数据,满足条件时自动执行后续动作
23
+ - **过程可追踪**:任务进展、执行结果和回写状态均有记录,方便查看和复盘
24
+ - **数据直接变成果**:基于表内真实数据生成分析报告,按需推送给相关人员或群聊
25
+
26
+ ## 使用前与使用后对比
27
+
28
+ | 使用前 | 使用后 |
29
+ | --- | --- |
30
+ | 问数得到答案就结束了,后续的跟进、催办、记录仍需人工串联。 | 钉钉机器人接入 Qoder 智能体——接收消息、识别意图、查询表格、执行任务、回写状态、通知负责人,一条链路自动跑完,办没办、办得怎样随时可查。 |
31
+
32
+ ## 典型使用场景
33
+
34
+ ### 场景一:任务查询并催办,到点自动跟进
35
+
36
+ 把"等人想起来催"变成"到点自动查、未完成才提醒"。
37
+
38
+ **使用前**:维修工单提交后,管理人员需反复打开表格查看是否已派工,未处理的工单还需手动查找负责人并发送提醒,容易遗漏。
39
+
40
+ **使用后**:在群里告诉智能体"如果今天 15:56 工单还没有派工,就在群里通知我",智能体会自动创建定时任务,到时间检查工单状态:
41
+
42
+ - 已完成:提示无需处理
43
+ - 未完成:自动识别异常工单,在群里提醒相关人员
44
+ - 全程无需人工重复查表,任务状态和提醒结果清晰可追踪
45
+
46
+ ![任务查询催办场景示意](https://img.alicdn.com/imgextra/i4/O1CN01id6qpKTxbLI2wHO2_!!6000000003052-2-tps-1448-1086.png)
47
+
48
+ ### 场景二:问题洞察并推送,数据每天主动汇报
49
+
50
+ 把"人工导表做分析"变成"定时自动分析,生成看板并推送"。
51
+
52
+ **使用前**:销售、订单、库存和回款数据分散在 AI 表格中,管理者需定期导出数据、制作图表、整理报告再手动发送,遇到异常时往往已错过最佳处理时间。
53
+
54
+ **使用后**:设置定时任务,让智能体每天或每周自动读取 AI 表格数据,分析指标变化、识别异常问题,生成可视化 HTML 数据分析看板,并自动推送到管理群:
55
+
56
+ - 核心指标变化
57
+ - 异常门店、商品或渠道
58
+ - 可能的问题原因
59
+ - 下一步建议动作
60
+
61
+ ![数据洞察推送场景示意](https://img.alicdn.com/imgextra/i3/O1CN01wwnUU6X3gyC2wHO2_!!6000000004305-2-tps-1448-1086.png)
62
+
63
+ ## 配置步骤
64
+
65
+ ### 第一步:进入智能体配置页面
66
+
67
+ 打开 AI 表格,点击左下角的「智能体」入口。
68
+
69
+ ![智能体入口](https://img.alicdn.com/imgextra/i4/O1CN01XMQKLoH7FcB5y630_!!6000000002202-2-tps-2940-1670.png)
70
+
71
+ ### 第二步:选择 Qoder 智能体并输入令牌
72
+
73
+ 在智能体列表中选择「Qoder 智能体」,进入连接配置页面,输入令牌。
74
+
75
+ ![选择Qoder智能体](https://img.alicdn.com/imgextra/i3/O1CN01TTZce38XMVH3Z3Bi_!!6000000001369-2-tps-1756-990.png)
76
+
77
+ ### 第三步:获取 Qoder 令牌
78
+
79
+ 1. 点击「前往 Qoder」,按页面提示登录;如果没有账号,请先完成注册。
80
+
81
+ ![前往Qoder](https://img.alicdn.com/imgextra/i4/O1CN01hnIMBUhN26B3FPe1_!!6000000007232-2-tps-1600-909.png)
82
+
83
+ 2. 进入 Qoder 的「个人访问令牌」页面,点击「创建」。
84
+
85
+ ![创建令牌入口](https://img.alicdn.com/imgextra/i3/O1CN01r8dVLGMqf5C5y630_!!6000000001978-2-tps-2940-1670.png)
86
+
87
+ 3. 输入便于识别的令牌名称(例如"AI 表格智能体"),按实际使用周期选择到期时间,完成创建。
88
+
89
+ ![令牌名称设置](https://img.alicdn.com/imgextra/i3/O1CN01VSZqY4OFrzC2oyiE_!!6000000003039-2-tps-1390-1064.png)
90
+
91
+ ![令牌创建成功](https://img.alicdn.com/imgextra/i1/O1CN01XBnCIn9wzNC2nDIa_!!6000000004770-2-tps-1376-492.png)
92
+
93
+ > **安全提示**:个人访问令牌相当于账号凭证。请勿将令牌发送给他人,也不要把包含完整令牌的截图发到群聊或公开文档中。如令牌疑似泄露,请立即在 Qoder 中将其撤销并重新创建。
94
+
95
+ ### 第四步:粘贴令牌并完成绑定
96
+
97
+ 复制刚创建的令牌,返回 AI 表格配置页粘贴到输入框,然后使用手机钉钉扫描二维码完成机器人绑定。
98
+
99
+ ![粘贴令牌](https://img.alicdn.com/imgextra/i3/O1CN01o6z4HyBc3KB3RFSW_!!6000000001931-2-tps-1694-1598.png)
100
+
101
+ ![扫码绑定](https://img.alicdn.com/imgextra/i3/O1CN01zzSPfegAsmH1nXOq_!!6000000000499-2-tps-886-1914.png)
102
+
103
+ > **注意**:扫码账号所在组织必须与 AI 表格所在组织一致,否则可能无法正常绑定或使用。
104
+
105
+ ### 第五步:开始使用
106
+
107
+ 绑定机器人后,即可开启对话,或将机器人添加到群内。
108
+
109
+ ![开始对话](https://img.alicdn.com/imgextra/i1/O1CN01vOus9LCMadG3S0Gk_!!6000000004286-2-tps-1700-1530.png)
110
+
111
+ ## 常见问题
112
+
113
+ ### 令牌创建后,打开新表找不到之前令牌了?
114
+
115
+ 令牌跟随组织,同一组织下的令牌同步。
116
+
117
+ ### Qoder 额度怎样查看?
118
+
119
+ 跳转到 [Qoder 可观测页面](https://qoder.cn/cloud/observability/overview) 可查看。
120
+
121
+ ### 怎么收费?
122
+
123
+ 跳转到 [Qoder 付费页面](https://qoder.com.cn/pricing) 查看。
124
+
125
+ ### 为什么无法找到企业的群聊?
126
+
127
+ 需要是群主或管理员,且群必须是内部群。
128
+
129
+ ### 怎么把机器人拉进群内?
130
+
131
+ 在群机器人栏目搜索机器人名称,添加进群。
132
+
133
+ ![添加群机器人](https://img.alicdn.com/imgextra/i2/O1CN019GI03Dhj0YD1tpES_!!6000000003255-2-tps-936-380.png)
134
+
135
+ ### 如何查看和管理群机器人?
136
+
137
+ **查看机器人信息**:进入「群设置 > 群机器人」,可查看群内所有机器人列表,点击某个机器人可查看名称、头像、简介、添加者信息等。
138
+
139
+ **移除群机器人**:
140
+
141
+ - **桌面端**:进入「群设置 > 群机器人 > 机器人管理页」,找到目标机器人,点击进入详情页,点击「移除机器人」。
142
+ - **移动端**:操作路径与桌面端相同,进入管理页后点击机器人详情页中的「移除机器人」。
143
+
144
+ ### 员工无权限查看的文件,机器人是否会回答?
145
+
146
+ 查询 AI 表格的员工必须有查看/下载权限。如果开启了高级权限,员工通过机器人查询/编辑 AI 表格数据的权限受到高级权限约束。
147
+
148
+ ### 员工(非机器人拥有者)能否和机器人单独对话?
149
+
150
+ 需要在机器人后台添加可使用的员工:
151
+
152
+ 1. 通过智能体详情页,进入绑定的机器人后台。
153
+
154
+ ![进入机器人后台](https://img.alicdn.com/imgextra/i1/O1CN01HYO3ye78N0L5y61u_!!6000000007373-2-tps-2940-1602.png)
155
+
156
+ 2. 点击「版本管理与发布」,创建新版本。
157
+
158
+ ![版本管理](https://img.alicdn.com/imgextra/i4/O1CN018HBxnK6iVjH5y61u_!!6000000001195-2-tps-2940-1602.png)
159
+
160
+ 3. 在「应用可用反馈」选择可用员工,点击保存后即可使用。
161
+
162
+ ![设置可用员工](https://img.alicdn.com/imgextra/i3/O1CN01LW7e3obuQvL5y61u_!!6000000004187-2-tps-2940-1602.png)
163
+
164
+ ## 功能使用咨询
165
+
166
+ 扫码加入群聊进行使用咨询:
167
+
168
+ ![咨询群二维码](https://img.alicdn.com/imgextra/i2/O1CN019KJbjciwaEE1OrLs_!!6000000005650-2-tps-690-606.png)
169
+
170
+ 如有处理失败的任务,将 trace_id 复制后在群内反馈:
171
+
172
+ ![trace_id 位置示意](https://img.alicdn.com/imgextra/i3/O1CN01IHMKdXCG7MF2nDEc_!!6000000000648-2-tps-1376-246.png)
173
+
174
+ ## See Also
175
+
176
+ - [AI 表格助理](AI表格助理.md)
177
+ - [AI 表格万能贴使用说明](AI表格万能贴使用说明.md)
178
+ - [使用 AI 表格高级权限](../topics/使用AI表格高级权限.md)
179
+
180
+ ## Sources
181
+
182
+ - AI表格接Qoder智能体:从"问数"到"办事".md
@@ -53,9 +53,6 @@ summary: 脚本插件是AI表格的开放能力,开发者可通过编写JS脚
53
53
  - [AI表格插件中心-使用指南](../topics/AI表格插件中心-使用指南.md)
54
54
  - [AI表格三方插件使用授权](../concepts/AI表格三方插件使用授权.md)
55
55
  - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
56
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
57
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
58
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](../topics/AI 表格插件 - 企业内插件发布指南.md))
59
56
 
60
57
  ## Sources
61
58
 
@@ -57,9 +57,6 @@ summary: 自定义插件是AI表格的开放能力,开发者可构建运行在
57
57
  - [AI表格插件中心-使用指南](../topics/AI表格插件中心-使用指南.md)
58
58
  - [AI表格三方插件使用授权](../concepts/AI表格三方插件使用授权.md)
59
59
  - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
60
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
61
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](<../topics/AI 表格插件 - 企业内插件发布指南.md>))
62
- - [[AI 表格插件 - 企业内插件发布指南|AI表格插件 - 企业内插件发布指南]] ([AI表格插件 - 企业内插件发布指南](../topics/AI 表格插件 - 企业内插件发布指南.md))
63
60
 
64
61
  ## Sources
65
62
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 本目录包含所有「概念」分类的 wiki 文章。分类标准:具体有界概念。
4
4
 
5
- Last updated: 2026-08-24
5
+ Last updated: 2026-09-07
6
6
 
7
7
  ## Contents
8
8
 
@@ -14,6 +14,7 @@ Last updated: 2026-08-24
14
14
  | [AI表格万能贴使用说明.md](AI表格万能贴使用说明.md) | AI表格"万能贴"功能的详细使用说明,支持将剪贴板中的图片(Excel截图、BI报表、PDF报告等)和规则化文本(报名信息、客户清单等)直接粘贴到AI表格中自动识别为结构化数据,仅限桌面端使用。 | AI表格, 万能贴, 智能粘贴 | 2026-07-20 |
15
15
  | [AI表格三方插件使用授权.md](AI表格三方插件使用授权.md) | 组织管理员可通过钉钉管理后台开启AI表格第三方插件使用权限,开启后组织成员可使用插件中心的三方插件,三方插件可通过服务端API读写AI表格数据。 | 插件, 三方插件, 权限授权, 管理后台 | 2026-07-20 |
16
16
  | [AI表格助理.md](AI表格助理.md) | AI表格助理是钉钉AI表格内置的智能助手,支持通过自然语言对话完成表格搭建、自动化工作流生成、数据仪表盘创建,以及AI字段、关联字段、查找引用等复杂字段的配置,实现"对话即操作,想法秒落地"。 | AI表格, AI助理, 智能搭建 | 2026-07-20 |
17
+ | [AI表格接Qoder智能体:从“问数”到“办事”.md](AI表格接Qoder智能体:从“问数”到“办事”.md) | 介绍 AI 表格如何接入 Qoder 智能体,将表格从"查询工具"升级为"办事助理"。涵盖配置步骤、典型场景(定时催办、数据洞察推送)及常见问题解答。 | AI表格, Qoder智能体, 机器人, 自动化, 任务催办 | 2026-09-07 |
17
18
  | [AI表格插件-脚本插件.md](AI表格插件-脚本插件.md) | 脚本插件是AI表格的开放能力,开发者可通过编写JS脚本构建自定义插件并分享给协作者使用,无需进行页面开发和部署,在右侧边栏中即可完成编辑、运行和发布。 | 插件, 脚本插件, 开发者, JavaScript | 2026-07-20 |
18
19
  | [AI表格插件-自定义插件.md](AI表格插件-自定义插件.md) | 自定义插件是AI表格的开放能力,开发者可构建运行在右侧边栏中的插件来扩展功能,采用双页面架构(Web Worker脚本服务 + iframe用户界面),需自行部署服务。 | 插件, 自定义插件, 开发者, 侧边栏 | 2026-07-20 |
19
20
  | [TOP_N分析.md](TOP_N分析.md) | 仪表盘图表的Top N分析功能通过仅展示排名前N或后N的数据,聚焦关键信息,简化复杂数据视图。支持多种图表类型和排名方式。 | 仪表盘, TOP N, 数据分析 | 2026-07-20 |
@@ -35,7 +36,7 @@ Last updated: 2026-08-24
35
36
  | [日历视图.md](日历视图.md) | 日历视图用于以日历形式展示基于时间的记录分布,适用于会议计划、日程管理等场景。支持月/周/日三种时间尺度,可直接在日历上添加和查看记录。 | 视图, 日历, 日程管理 | 2026-07-20 |
36
37
  | [查询页面.md](查询页面.md) | 查询页面是一种特殊视图,用户无需进入AI表格即可对外提供数据查询能力。适用于工资条查询、物流追踪、成绩发布等场景,支持权限控制和自定义配置。 | 视图, 查询页面, 数据查询 | 2026-07-20 |
37
38
  | [标签页.md](标签页.md) | 标签页组件用于在有限空间内组织并展示多个相关但独立的数据视图,通过页签切换实现内容分层,最多支持20个标签页,不支持嵌套标签页或组合布局。 | 应用模式, 组件, 标签页 | 2026-07-20 |
38
- | [核心知识.md](核心知识.md) | 介绍AI表格边栏插件开发中的文档对象模型(DOM),包括 Base、Sheet、View、Field、Record 等核心对象及其层级关系。通过 DingdocsScript.base 获取顶级对象后,可逐层访问数据表、视图、字段、记录并执 | AI表格, 对象模型, 边栏插件, DingdocsScript | 2026-08-24 |
39
+ | [核心知识.md](核心知识.md) | AI 表格文档对象模型的核心概念,阐述 Base、Sheet、View、Field、Record 五大对象的层级关系与获取方式,是边栏插件开发的基础认知。 | 对象模型, Base, Sheet, 边栏插件, 架构 | 2026-07-20 |
39
40
  | [模板中心.md](模板中心.md) | AI表格模板中心提供行业模板一键启用,同时支持用户将表格保存为个人自定义模板或发布到模板中心供全部钉钉用户使用。 | 模板, 最佳实践, 自定义模板 | 2026-07-20 |
40
41
  | [甘特图.md](甘特图.md) | 甘特图视图以横向时间条形式展示任务安排和项目进度,支持里程碑设置、工作日配置和年/季/月/周四种展示维度。广泛应用于项目规划和团队协作。 | 视图, 甘特图, 项目管理 | 2026-07-20 |
41
42
  | [画册视图.md](画册视图.md) | 画册视图用于可视化展示附件字段中的图片、PDF等文件,适合商品展示、门店管理、个人相册等场景。支持选择封面字段和裁剪/适应效果。 | 视图, 画册, 图片展示 | 2026-07-20 |
@@ -48,7 +49,7 @@ Last updated: 2026-08-24
48
49
  | [表单预填默认值.md](表单预填默认值.md) | 通过在表单分享链接中添加 URL 参数,可预填默认值和隐藏特定题目,支持文本、数字、单选、多选类型。常用于门店信息自动带入和提交渠道追溯。 | 表单, 预填值, 默认值, 渠道追溯 | 2026-07-20 |
49
50
  | [表格视图.md](表格视图.md) | 表格视图是AI表格的默认视图,适用于原始数据搭建与录入。支持列级数据类型设置、底部统计、记录层级管理(最多4级子记录),保留传统表格的直观体验。 | 视图, 表格, 基础操作 | 2026-07-20 |
50
51
  | [视图组件.md](视图组件.md) | 视图组件支持在应用中嵌入表格、看板、甘特图、日历和画册五种专业视图,针对不同业务场景构建专业可视化界面,单个页面最多10个视图组件和10个自定义按钮。 | 应用模式, 组件, 视图 | 2026-07-20 |
51
- | [读写AI 表格模型.md](读写AI 表格模型.md) | AI 表格对象模型的整体概念介绍,阐述 Base → Sheet → View/Field/Record 的层级结构关系,以及边栏插件和脚本插件中获取顶级对象的方式。 | AI表格, 对象模型, Base, Sheet, View, Field, Record | 2026-07-20 |
52
+ | [读写AI 表格模型.md](<读写AI 表格模型.md>) | AI 表格对象模型的整体概念介绍,阐述 Base → Sheet → View/Field/Record 的层级结构关系,以及边栏插件和脚本插件中获取顶级对象的方式。 | AI表格, 对象模型, Base, Sheet, View, Field, Record | 2026-07-20 |
52
53
  | [跟随访问者权限统计.md](跟随访问者权限统计.md) | 跟随访问者权限统计是仪表盘高级权限功能之一,开启后仪表盘数据会根据访问者在数据表中的权限范围进行展示,适用于按角色隔离数据的业务场景(企业版及以上)。 | 仪表盘, 权限, 高级权限 | 2026-07-20 |
53
54
  | [跨AI表格数据同步.md](跨AI表格数据同步.md) | 跨AI表格数据同步功能可将不同AI表格的数据同步或汇总至同一表格中,同步数据仅支持查看不可编辑。适用于项目管理和销售数据汇总等场景,企业版及以上可用。 | 数据同步, 跨表, 数据汇总, 数据连接 | 2026-07-20 |
54
55
  | [跨AI表格数据同步调整说明.md](跨AI表格数据同步调整说明.md) | 跨AI表格数据同步功能限时免费于2026年2月2日结束,升级为企业版和旗舰版专享。仅影响AI表格间数据同步,其他数据源同步和历史已建任务不受影响。 | 数据同步, 跨表同步, 公告, 版本权益 | 2026-07-20 |