aitable-workflow-cli 0.1.20 → 0.1.21-beta.1787897020269

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.
@@ -0,0 +1,15 @@
1
+ import{o as pe,q as ge}from"./chunk-XGHRD4FJ.js";import{a as l}from"./chunk-EI7MMDWY.js";import{createServer as en}from"http";import{stat as Xe,readFile as se,mkdir as ie,writeFile as Ie,rm as tn}from"fs/promises";import{createReadStream as nn,existsSync as et,unlinkSync as on}from"fs";import v from"path";import{fileURLToPath as rn}from"url";import ct from"crypto";import sn from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as an,detectCodingEngines as cn,loadWorkflowTemplate as ln,collectEnvRefs as un,applyConfigSave as dn,ConfigSaveError as pn,runSetupCommand as gn,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Ct,readFile as Y,writeFile as Pt}from"fs/promises";import j from"path";import F from"yaml";import{BotProvisioner as Et,BotProvisionError as Ae,DwsClient as ke,DwsDevRunner as Oe,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as xt,listDwsConversations as At,readState as Ot,resetProfileCache as Ge,runCommand as _t,setupKnowledgeBases as Gt,writeBack as ye,assertPortableId as Nt}from"aitable-workflow-core";import fe from"path";import{closeSync as ht,existsSync as Pe,openSync 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";async function Tt(e,o){let t=await It(e);if(!Pe(t))return{shell:kt(o,{configDir:fe.dirname(t)}),mode:"standalone",bins:{},configPath:t};let n=await St(e),r=n.raw?.toolkit_config?.shell??{};return{shell:bt(n,o),mode:"project",bins:r.bins??{},configPath:t}}l(Tt,"createToolkitForExec");async function me(e,o,t){let n=fe.resolve(t.logFile),r=fe.dirname(n);if(!Pe(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=yt(n,"w"),u;try{return u=Rt({command:s,args:o,stdio:["ignore",i,i]}),await new Promise((d,g)=>{let p=u.child,h=l(I=>g(I),"onError");p.once("error",h),p.once("spawn",()=>{p.removeListener("error",h),d()})}),u.unref(),{pid:u.child.pid,logFile:n}}finally{ht(i)}}l(me,"runDetached");function On(e,o){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u5728\u5B9E\u4F8B\u4E0A\u4E0B\u6587\u4E0B\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\u914D\u7F6E\u4E0D\u5B58\u5728\u65F6\u81EA\u52A8\u56DE\u9000\u65E0\u9879\u76EE\u6A21\u5F0F\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--json | --detach <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",o.defaultConfig).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("--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,n)=>{try{let[r,...s]=t;r||(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 i=n.timeout?Number.parseInt(n.timeout,10):void 0;i!==void 0&&(Number.isNaN(i)||i<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),n.detach&&(n.json||i!==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)),n.json&&vt.setLevel("warn");let u=await Tt(n.config,r);if(u.mode==="standalone"&&console.error("\u26A0\uFE0F \u672A\u627E\u5230\u914D\u7F6E\u6587\u4EF6\uFF0Cexec \u4EE5\u65E0\u9879\u76EE\u6A21\u5F0F\u8FD0\u884C\uFF08\u65E0 bins \u8986\u76D6/.env \u8131\u654F\uFF0C\u8D70\u9ED8\u8BA4\u8D85\u65F6\u4E0E\u9650\u989D\uFF09"),n.detach){let{pid:g,logFile:p}=await me(r,s,{bins:u.bins,logFile:n.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${g}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${p}`),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(n.json){let g=await u.shell.runJson(r,s,{timeoutMs:i});console.log(JSON.stringify(g??{},null,2));return}let d=await u.shell.run(r,s,{timeoutMs:i});d.stdout&&process.stdout.write(d.stdout),d.stderr&&process.stderr.write(d.stderr),d.truncated&&console.error(`
2
+ \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(d.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}l(On,"registerExecCommand");async function Ne(e={}){let o=e.list??At;try{let{conversations:t}=await o({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}l(Ne,"listAdminGroups");async function z(e,o){let t={};try{let u=await _e(e,{lenientEnv:!0});for(let d of u.workflowEntries)try{let p=(await xt(d.templatePath,{envSource:u.envSource})).tracker;if(!p)continue;t[d.id]={baseId:String(p.base_id??"").trim(),tableId:String(p.table_id??"").trim(),...p.label?{label:String(p.label)}:{}}}catch{}}catch{}let n=await Be(o),r=Object.values(t),s=Object.values(n);return{ok:!0,ready:r.length>0?r.every(u=>u.baseId&&u.tableId)&&s.every(u=>u.baseId&&u.tableId):r.some(u=>u.baseId&&u.tableId),trackers:t,configTables:n}}l(z,"readSetupArtifacts");async function Be(e){let o={},t=j.resolve(e,"profile","profile.yml"),n;try{n=F.parse(await Y(t,"utf8"))}catch{return o}let r=R(n)?n.workflows:void 0;if(!R(r))return o;for(let s of Object.values(r)){let i=R(s)?s.steps:void 0;if(R(i)){for(let u of Object.values(i))if(R(u))for(let[d,g]of Object.entries(u)){if(!R(g))continue;let p="baseId"in g||"base_id"in g,h="tableId"in g||"table_id"in g;!p||!h||(o[d]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return o}l(Be,"readProfileConfigTables");var M="wiki/official-aitable-faq";async function Bt(e,o){let t=j.resolve(e,"profile","profile.yml"),n;try{n=F.parse(await Y(t,"utf8"))}catch{return[]}let r=R(n)?n.roles:void 0,s=R(r)?r[o]:void 0,i=R(s)?s.knowledge_scope:void 0,u=R(i)?i.kb_collections:void 0;return Array.isArray(u)?u.map(d=>typeof d=="string"?d:R(d)&&typeof d.collection=="string"?d.collection:null).filter(d=>d!==null):[]}l(Bt,"readRoleCollections");function Ee(e){if(F.isScalar(e))return typeof e.value=="string"?e.value:null;if(F.isMap(e)){let o=e.get("collection",!0);return F.isScalar(o)&&typeof o.value=="string"?o.value:null}return null}l(Ee,"kbEntryValue");async function jt(e,o,t){let n=j.resolve(e,"profile","profile.yml"),r;try{r=await Y(n,"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=F.parseDocument(r),i=s.getIn(["roles",o,"knowledge_scope","kb_collections"],!0);if(!F.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${o}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let u=i.items.map(Ee).filter(p=>p!==null),d=u.includes(M),g=u.find(p=>p!==M)??null;if(t===d)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:u,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:u,changed:!1};if(t)i.add(M);else{let p=i.items.findIndex(h=>Ee(h)===M);p>=0&&i.delete(p)}return await Pt(n,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?[...u,M]:u.filter(p=>p!==M)}}l(jt,"writeOfficialToggle");async function je(e,o,t,n){Nt(t,{label:"roleId"});let r=await jt(o,t,n);if(!r.ok)return{...r,compile:void 0};Ge();let s=n&&r.changed?Ue(e):void 0;return{...r,compile:s}}l(je,"setOfficialKbEnabled");function $e(e){return{ok:!0,...Ue(e)}}l($e,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Ut(e).finally(()=>{we=null}),{started:!0})}l(Ue,"triggerCompile");async function $t(e,o){let t={};for(let n of o){let r=await Ot(e,n);t[n]=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}l($t,"readKbStats");async function Ut(e){try{let o=await _e(e,{lenientEnv:!0}),t=await Gt({settings:o});return{ok:!t.results.some(r=>r.action==="failed"),collections:t.collections,...t.skippedReason?{skippedReason:t.skippedReason}:{}}}catch(o){return{ok:!1,collections:[],skippedReason:o instanceof Error?o.message:String(o)}}}l(Ut,"recompileKb");async function te(e){let o=await Vt(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},groups:[],groupBotsStaging:[],groupTableRef:null};if(!o)return t;let n=Dt(o),r=Lt(o),s=n&&r?"group-qa":null,i=r?await Bt(e,r):[],u=n?B(B(o.workflows)?.[n.workflowId]):void 0,d=n?B(B(u?.event_sources)?.[n.eventSourceName]):void 0,p=(await Be(e)).group_table??null;return{ok:!0,scenario:s,workflowId:n?.workflowId??null,eventSourceName:n?.eventSourceName??null,kbRoleId:r,kb:{userCollection:i.find(h=>h!==M)??null,officialOn:i.includes(M),stats:await $t(e,i)},groups:Qt(d?.conversation_ids),groupBotsStaging:await Ft(e,n?.workflowId??"group-qa"),groupTableRef:p}}l(te,"readConsoleState");function Dt(e){let o=B(e.workflows);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=B(B(n)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if(B(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}l(Dt,"locateGroupQa");function Lt(e){let o=B(e.roles);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=B(B(n)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}l(Lt,"locateKbRole");async function De(e,o,t,n){let r=[...new Set(n.map(d=>d.trim()).filter(Boolean))],s=r.join(`
3
+ `),i=["workflows",o,"event_sources",t],u=j.join("profile","profile.yml");return await ye({type:"yaml",file:u,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ye({type:"yaml",file:u,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),Ge(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}l(De,"writeGroupList");var Le="GROUP_BOTS_STAGING";async function oe(e){let o=await zt(e,Le);if(!o)return[];try{let t=JSON.parse(o);return Array.isArray(t)?t:[]}catch{return[]}}l(oe,"readGroupBotStagingRaw");async function Me(e,o){await ye({type:"env",file:".env",envKey:Le},JSON.stringify(o),e)}l(Me,"writeGroupBotStagingRaw");function Mt(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}l(Mt,"maskBot");async function ve(e,o,t){let n=t.conversationId.trim();if(!n)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await oe(e),s=r.findIndex(d=>d.conversationId===n),i=r[s]??{conversationId:n,title:"",enabled:!0,bot:null},u={conversationId:n,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]=u:r.push(u),await Me(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}l(ve,"saveGroupBotStaging");async function Ft(e,o){return(await oe(e)).map(n=>({...n,bot:Mt(n.bot)}))}l(Ft,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function xe(e){return e instanceof Ae?`${e.guidance}
4
+ \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}l(xe,"provisionErrorMessage");async function Fe(){try{return await new Oe().getCurrentCorpId()}catch{return}}l(Fe,"resolveCurrentCorpId");async function Ke(e,o,t,n={}){let r=n.provision??new Et({runner:new Oe}),s=j.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(d){return{ok:!1,message:xe(d)}}let u=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(d){if(d instanceof Ae&&d.kind==="bot_already_installed")u=!0;else return{ok:!1,message:xe(d)}}return await ve(e,o,{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:u?"\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"}}l(Ke,"addEnterpriseBotToGroup");function Kt(e){let o=[];for(let t of e){if(!t.enabled||!t.bot)continue;let n={\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"?o.push({...n,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):o.push({...n,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return o}l(Kt,"stagingToGroupTableRecords");async function re(e,o,t={}){let n=t.artifacts??await z(e,o),r=n.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 u=l(async()=>{n.ready&&await Me(o,[])},"clearStaging"),d=await oe(o),g=Kt(d);if(g.length===0)return await u(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let p=t.dws??new ke({bin:"dws",timeoutMs:9e4}),h=t.existingGroupIds??(await be(s,i,{dws:p,fields:t.fields})).groups.map(E=>E.groupId),I=g.filter(E=>!h.includes(E.\u7FA4ID??""));if(I.length===0)return await u(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let D=t.fields??await Se(p,s,i),x=new Map(D.map(E=>[E.fieldName,E.fieldId])),X=I.map(E=>{let c={};for(let[a,f]of Object.entries(E)){let m=x.get(a);m&&(c[m]=f)}return{cells:c}});return await p.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await u(),{ok:!0,created:I.length,message:`\u5DF2\u5199\u5165 ${I.length} \u6761\u7FA4\u914D\u7F6E`}}l(re,"writeStagingToGroupTable");var O={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 _(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(_).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""}l(_,"cellToText");function Jt(e){if(e==null||e==="")return!0;let o=_(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(o)||(typeof e=="boolean"?e:!1)}l(Jt,"cellToEnabled");function Wt(e){let o=_(e);if(o.includes("\u5185\u90E8"))return"internal";if(o.includes("\u5916\u90E8"))return"external"}l(Wt,"cellToGroupType");function qt(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}l(qt,"extractConsoleRecords");async function be(e,o,t={}){if(!e||!o)return{ok:!1,baseId:e,tableId:o,groups:[]};let n=t.dws??new ke({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):Se(n,e,o),n.runJson(["aitable","record","query","--base-id",e,"--table-id",o,"--all","--format","json"])]),i=new Map(r.map(g=>[g.fieldName,g.fieldId])),u=l((g,p)=>{if(p in g)return g[p];let h=i.get(p);return h?g[h]:void 0},"readCol"),d=[];for(let g of qt(s)){let p=R(g.cells)?g.cells:{},h=_(u(p,O.groupId));if(!h)continue;let I=_(u(p,O.appSecret)),D=_(u(p,O.webhookSecret)),x=Wt(u(p,O.groupType));d.push({recordId:String(g.recordId??g.id??""),groupId:h,groupName:_(u(p,O.groupName)),...x?{groupType:x}:{},corpId:_(u(p,O.corpId)),inbound:_(u(p,O.inbound)),outbound:_(u(p,O.outbound)),webhookUrl:_(u(p,O.webhookUrl)),webhookSecret:D?"***":"",appKey:_(u(p,O.appKey)),appSecret:I?"***":"",botNick:_(u(p,O.botNick)),enabled:Jt(u(p,O.enabled))})}return{ok:!0,baseId:e,tableId:o,groups:d}}l(be,"readGroupConfigTable");async function Je(e,o,t={}){let n=t.artifacts??await z(e,o),r=n.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,baseId:s,tableId:i,groups:[]};let u=await be(s,i,t);if(u.ok&&u.groups.length===0&&(await oe(o)).length>0){let g=await re(e,o,{...t,artifacts:n,existingGroupIds:[]});g.ok&&g.created>0&&(u=await be(s,i,t))}return u}l(Je,"readGroupConfigTableForConsole");async function We(e,o,t,n,r={}){if(!e||!o||!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,o),u=new Map(i.map(g=>[g.fieldName,g.fieldId])),d={};for(let[g,p]of Object.entries(n)){if(p===void 0)continue;let h=O[g];if(!h)continue;let I=u.get(h)??h;d[I]=p}return Object.keys(d).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",o,"--records",JSON.stringify([{recordId:t,cells:d}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}l(We,"updateGroupConfigRecord");var Ht=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function qe(e){if(!e||typeof e!="object")return null;let o=e;for(let t of Ht)if(typeof o[t]=="boolean")return o[t];for(let t of Object.values(o)){let n=qe(t);if(n!==null)return n}return null}l(qe,"findAuthBoolean");async function He(e={}){let o=e.bin??"dws",t=e.runner??((n,r)=>_t(n,r,{timeoutMs:15e3}));try{let n=await t(o,["auth","status","--format","json"]),r=`${n.stdout}
5
+ ${n.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let i=qe(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)}:n.exitCode===0?{loggedIn:!0}:{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)||"dws auth status \u5931\u8D25"}}catch(n){return{loggedIn:!1,message:n instanceof Error?n.message:String(n)}}}l(He,"checkDwsAuthStatus");var Ye=j.join(".aitable-workflow","dws-login.log"),Yt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function ze(e,o={}){let t=j.resolve(e,Ye);await Ct(j.dirname(t),{recursive:!0});try{return await me(o.bin??"dws",["auth","login","--device","--yes","--no-browser"],{logFile:t}),{ok:!0,logFile:t}}catch(n){return{ok:!1,message:n instanceof Error?n.message:String(n)}}}l(ze,"startDwsDeviceLogin");async function Ve(e){try{return{verifyUrl:(await Y(j.resolve(e,Ye),"utf8")).match(Yt)?.[0]??null}}catch{return{verifyUrl:null}}}l(Ve,"readDwsLoginProgress");async function zt(e,o){let t;try{t=await Y(j.resolve(e,".env"),"utf8")}catch{return null}let n=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^${n}=(.*)$`,"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}l(zt,"readEnvKey");async function Vt(e){try{let o=F.parse(await Y(j.resolve(e,"profile","profile.yml"),"utf8"));return R(o)?o:null}catch{return null}}l(Vt,"readProfileDoc");function B(e){return R(e)?e:void 0}l(B,"asRecord");function Qt(e){return Array.isArray(e)?e.filter(o=>typeof o=="string"):[]}l(Qt,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}l(R,"isRecord");import{spawnManagedProcess as Zt}from"aitable-workflow-core";function Ze(e){let o=Xt(e);try{let t=Zt({...o,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}l(Ze,"openExternalUrl");function Xt(e,o=process.platform){return o==="darwin"?{command:"open",args:[e]}:o==="win32"?{command:"rundll32.exe",args:["url.dll,FileProtocolHandler",e]}:{command:"xdg-open",args:[e]}}l(Xt,"openInvocation");function Qe(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}l(Qe,"printFallback");function nt(e){return e?`workbench/${e}`:"setup"}l(nt,"consoleStartPath");var ot=v.dirname(rn(import.meta.url)),fn={".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"},mn=1800*1e3,P={phase:"idle"},S={status:"idle"},Q=Promise.resolve(),wn=12e4,ne=new Set,U=class extends Error{constructor(t,n){super(n);this.status=t;this.name="TriggerOnceHttpError"}status;static{l(this,"TriggerOnceHttpError")}},Z=class extends Error{constructor(t,n){super(n);this.status=t;this.name="PromotionHttpError"}status;static{l(this,"PromotionHttpError")}},hn=6e4,ae=!1;function yn(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}l(yn,"detectEnvironment");function ut(){let e=v.join(ot,"web");if(et(v.join(e,"index.html")))return e;let o=v.resolve(ot,"..","..","..","web","dist");return et(v.join(o,"index.html"))?o:null}l(ut,"resolveWebRoot");function oo(){return ut()!==null}l(oo,"hasWebRoot");async function dt(e){let{createServer:o}=await import("net");return new Promise((t,n)=>{let r=o();r.listen(e,()=>{let s=r.address(),i=typeof s=="object"&&s?s.port:e;r.close(()=>t(i))}),r.on("error",()=>{e<8800?dt(e+1).then(t,n):n(new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (8788-8800)"))})})}l(dt,"getAvailablePort");var bn=1024*1024,kn=50*1024*1024,pt=v.join(".aitable-workflow","console-access.json");async function gt(e,o){let t=v.join(e,pt);return await ie(v.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(o,null,2)}
6
+ `,"utf8"),t}l(gt,"writeConsoleAccessFile");function Sn(e){try{on(v.join(e,pt))}catch{}}l(Sn,"clearConsoleAccessFile");async function $(e,o=bn){return new Promise((t,n)=>{let r=[],s=0;e.on("data",i=>{if(s+=i.length,s>o){e.destroy(),n(new Error("Request body too large"));return}r.push(i)}),e.on("end",()=>{try{t(JSON.parse(Buffer.concat(r).toString("utf8")))}catch{n(new Error("Invalid JSON body"))}}),e.on("error",n)})}l($,"readJson");function w(e,o,t=200){let n=JSON.stringify(o);e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(n)}),e.end(n)}l(w,"sendJson");function b(e,o,t){w(e,{ok:!1,error:t},o)}l(b,"sendError");function W(e){let o=JSON.parse(JSON.stringify(e));for(let t of o.modules){let n=t.workflows?t.workflows.flatMap(r=>r.items):t.items;for(let r of n)r.sensitive&&r.value!==void 0&&(r.value="***")}return o}l(W,"maskSensitive");async function ro(e){let o=await dt(8788),t=yn(),n=ct.randomUUID(),r=t==="remote"?"0.0.0.0":"127.0.0.1",s=ut(),i=e.mode??"setup",u=e.app;if(i==="runtime"&&!u)throw new Error("runtime \u6A21\u5F0F\u5FC5\u987B\u4F20\u5165 App \u5B9E\u4F8B");if(!s)throw new Error("Web \u8D44\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u542F\u52A8\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");let d=await lt(e.configPath),g=v.dirname(d);P={phase:"idle"},S={status:"idle"},Q=Promise.resolve(),ne.clear();let p=e.assembleApp?{assembleApp:e.assembleApp,commit:l(a=>{u=a,i="runtime",e.onAppAssembled?.(a)},"commit")}:void 0,h="";e.initialRunStatus&&(S=e.initialRunStatus);let I=null,D=new Promise(a=>I=a),x=null,X=l(()=>{x&&clearTimeout(x),x=setTimeout(()=>{console.log(`
7
+ \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),I?.()},mn)},"resetTimeout"),E=en(async(a,f)=>{let m=new URL(a.url??"/",`http://${a.headers.host??"localhost"}`),y=a.headers.origin;if(y){let G=`http://127.0.0.1:${o}`;(y===G||t==="remote")&&f.setHeader("Access-Control-Allow-Origin",y)}if(f.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),f.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),a.method==="OPTIONS"){f.writeHead(204),f.end();return}if(m.pathname.startsWith("/dev/")){if((m.searchParams.get("token")??a.headers.authorization?.replace("Bearer ",""))!==n){b(f,401,"Unauthorized");return}X();try{await vn({url:m,req:a,res:f,configPath:e.configPath,configDir:g,completionResolve:I,setupOptions:e.setupOptions,mode:i,app:u,promotion:p?{...p,access:{configDir:g,url:h,port:o}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(C){let L=C instanceof Error?C.message:String(C);b(f,500,L)}return}if(m.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}Pn(m,f,s)});await new Promise(a=>E.listen(o,r,a)),X();let c=(await te(g).catch(()=>null))?.scenario??null;h=t==="local-gui"?`http://127.0.0.1:${o}/${nt(c)}?token=${n}`:`http://${sn.hostname()}:${o}/${nt(c)}?token=${n}`,await gt(g,{url:h,port:o,mode:i,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Sn(g)),t==="local-gui"?e.open!==!1?(Ze(h),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${h}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${h}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${h}`),console.log(`
8
+ \u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
9
+ ssh -L ${o}:127.0.0.1:${o} <your-host>`),console.log(` \u7136\u540E\u6253\u5F00: http://127.0.0.1:${o}/setup?token=${n}`)),i==="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 D,x&&clearTimeout(x),E.close()}l(ro,"runConfigUI");async function vn(e){let{url:o,req:t,res:n,configPath:r,configDir:s,completionResolve:i,setupOptions:u,mode:d,app:g,promotion:p,exitOnSetupError:h}=e;if(t.method==="GET"&&o.pathname==="/dev/config/check"){let c=await V({configPath:r});w(n,W(c));return}if(t.method==="GET"&&o.pathname==="/dev/config/enriched"){let c=await V({configPath:r}),a=cn(),f=await an(r),m={},y={},G=new Set,C=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let k=await lt(r),A=await se(k,"utf8");for(let K of un([A]))G.add(K)}catch{}try{let k=await se(v.join(s,"profile","profile.yml"),"utf8"),A=Re.parse(k),K=A?.workflows;if(K&&typeof K=="object"&&(y=K),A&&typeof A=="object"){let{workflows:Ce,...q}=A;for(let ee of JSON.stringify(q).matchAll(C))G.add(ee[1])}}catch{}for(let k of f.workflowEntries)try{let A=await ln(k.templatePath),K=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})),q={},ee=new Set,J;try{J=Re.parse(await se(k.templatePath,"utf8"))}catch{}if(J){for(let N of JSON.stringify(J).matchAll(C))ee.add(N[1]);let T=y[k.id];if(T&&typeof T=="object")for(let N of JSON.stringify(T).matchAll(C))ee.add(N[1]);let ft=Array.isArray(J.steps)?J.steps:[];for(let N=0;N<A.steps.length;N++){let le=A.steps[N],H=ft[N];if(H){let ue=JSON.stringify(H),de=new Set;for(let wt of ue.matchAll(C))de.add(wt[1]);de.size>0&&(q[le.id]=[...de])}}let mt=Array.isArray(J.event_sources)?J.event_sources:[];for(let N of mt)if(N){let le=JSON.stringify(N),H=new Set;for(let ue of le.matchAll(C))H.add(ue[1]);H.size>0&&(q.__event_sources__=[...q.__event_sources__??[],...H])}}m[k.id]={steps:K,edges:Ce,stepEnvRefs:q,envRefs:[...ee].sort()}}catch{m[k.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let L=new Set;for(let k of Object.values(m))for(let A of k.envRefs??[])L.add(A);let ce=c.modules.find(k=>k.id==="env");for(let k of ce?.items??[])k.writeTarget?.type==="env"&&!L.has(k.key)&&G.add(k.key);w(n,{config:W(c),engines:{available:a.available.map(k=>({engine:k.engine,cmd:k.cmd,version:k.version})),recommended:a.recommendedEngine},workflowTopology:m,projectEnvRefs:[...G].sort()});return}if(t.method==="POST"&&o.pathname==="/dev/config/save"){let c=await $(t);try{let a=await dn(c,s,r);w(n,{ok:!0,written:a.written,recheck:W(a.recheck)})}catch(a){if(a instanceof pn){b(n,a.status,a.message);return}throw a}return}if(t.method==="POST"&&o.pathname==="/dev/kb/ingest"){let c=await $(t);if(!c.roleId||!c.source){b(n,400,"roleId and source are required");return}try{tt(c.roleId,{label:"roleId"})}catch(G){b(n,400,G instanceof Error?G.message:"roleId \u4E0D\u5408\u6CD5");return}let a=v.resolve(s,"roles",`${c.roleId}.role.yml`),f=await ge(a,c.roleId),m=await pe({source:c.source,collectionName:f,configDir:s}),y=await V({configPath:r});w(n,{ok:m.success,message:m.message,recheck:W(y)});return}if(t.method==="POST"&&o.pathname==="/dev/kb/upload"){let c=await $(t,kn);if(!c.roleId||!Array.isArray(c.files)||c.files.length===0){b(n,400,"roleId and files are required");return}try{tt(c.roleId,{label:"roleId"})}catch(y){b(n,400,y instanceof Error?y.message:"roleId \u4E0D\u5408\u6CD5");return}let a=v.resolve(s,"roles",`${c.roleId}.role.yml`),f=await ge(a,c.roleId),m=v.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ie(m,{recursive:!0});for(let C of c.files){let L;try{L=Te(m,C.relativePath,{allowRoot:!1})}catch{b(n,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${C.relativePath}`);return}let ce=v.dirname(L);await ie(ce,{recursive:!0});let k=C.encoding==="base64"?Buffer.from(C.content,"base64"):Buffer.from(C.content,"utf8");await Ie(L,k)}let y=await pe({source:m,collectionName:f,configDir:s}),G=await V({configPath:r});w(n,{ok:y.success,message:y.message,recheck:W(G)})}finally{await tn(m,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&o.pathname==="/dev/file/read"){let c=o.searchParams.get("path")??"",a=at(c,s);if(!a){b(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${c}`);return}try{let f=await se(a,"utf8");w(n,{ok:!0,path:c,content:f,exists:!0})}catch{w(n,{ok:!0,path:c,content:"",exists:!1})}return}if(t.method==="POST"&&o.pathname==="/dev/file/write"){let c=await $(t),a=typeof c.path=="string"?c.path:"",f=at(a,s);if(!f||typeof c.content!="string"){b(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${a}`);return}let m=Tn(a,c.content);if(m){w(n,{ok:!1,error:m},400);return}await ie(v.dirname(f),{recursive:!0}),await Ie(f,c.content.endsWith(`
14
+ `)?c.content:c.content+`
15
+ `,"utf8");let y=await V({configPath:r});w(n,{ok:!0,recheck:W(y)});return}if(t.method==="POST"&&o.pathname==="/dev/setup/complete"){if(P.phase==="running"){b(n,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}P={phase:"running",logs:[]},w(n,{ok:!0});let c=l(async()=>{try{let a=await re(r,s);a.ok||console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u672A\u5B8C\u6210: ${a.message}`)}catch(a){console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u5F02\u5E38: ${a instanceof Error?a.message:String(a)}`)}},"flushStaging");(async()=>{try{await c(),await gn({config:r,...u??{}}),await c();let a=await z(r,s),f=Cn(a),m={mode:d};if(d==="setup"&&p){let y=await st({configPath:r,...p});m=y.ok?{mode:"runtime"}:{mode:"setup",promotionError:y.error}}P={phase:"done",artifacts:a,baseUrl:f,...m}}catch(a){P={phase:"error",message:a instanceof Error?a.message:String(a)},h&&i?.()}})();return}if(t.method==="GET"&&o.pathname==="/dev/setup/progress"){w(n,P);return}if(t.method==="GET"&&o.pathname==="/dev/setup/artifacts"){w(n,await z(r,s));return}if(t.method==="GET"&&o.pathname==="/dev/console/state"){w(n,await te(s));return}if(t.method==="POST"&&o.pathname==="/dev/console/groups"){let c=await $(t);if(!c.workflowId||!c.eventSourceName||!Array.isArray(c.conversationIds)){b(n,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let a=await De(s,c.workflowId,c.eventSourceName,c.conversationIds),f=await V({configPath:r});w(n,{...a,recheck:W(f)});return}if(t.method==="GET"&&o.pathname==="/dev/console/admin-groups"){w(n,await Ne());return}if(t.method==="GET"&&o.pathname==="/dev/console/dws-auth"){w(n,await He());return}if(t.method==="POST"&&o.pathname==="/dev/console/dws-auth/login"){let c=await ze(s);w(n,c,c.ok?200:400);return}if(t.method==="GET"&&o.pathname==="/dev/console/dws-auth/login"){w(n,await Ve(s));return}let I=o.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&I){let c=decodeURIComponent(I[1]),a=await $(t),f=await te(s),m=await Ke(s,f.workflowId??"group-qa",{conversationId:c,title:a.title??"",...a.groupType?{groupType:a.groupType}:{}});w(n,m,m.ok?200:400);return}let D=o.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&D){let c=decodeURIComponent(D[1]),a=await $(t);if(!a.name||!a.webhook||!a.secret){b(n,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(a.webhook)){b(n,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let f=await te(s),m=await Fe(),y=await ve(s,f.workflowId??"group-qa",{conversationId:c,...a.title!==void 0?{title:a.title}:{},...a.groupType?{groupType:a.groupType}:{},...m?{corpId:m}:{},enabled:!0,bot:{type:"custom",name:a.name,webhookUrl:a.webhook,...a.secret?{webhookSecret:a.secret}:{}}});w(n,y,y.ok?200:400);return}if(t.method==="GET"&&o.pathname==="/dev/console/group-config-table"){try{w(n,await Je(r,s))}catch(c){b(n,502,c instanceof Error?c.message:"\u7FA4\u914D\u7F6E\u8868\u8BFB\u53D6\u5931\u8D25")}return}if(t.method==="POST"&&o.pathname==="/dev/console/group-config-table/flush-staging"){let c=await re(r,s);w(n,c,c.ok?200:400);return}let x=o.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&x){let c=decodeURIComponent(x[1]),a=await $(t),m=(await z(r,s)).configTables.group_table;if(!m?.baseId||!m.tableId){b(n,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let y=await We(m.baseId,m.tableId,c,a);w(n,y,y.ok?200:400)}catch(y){b(n,502,y instanceof Error?y.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&o.pathname==="/dev/kb/official"){let c=await $(t);if(!c.roleId||typeof c.enabled!="boolean"){w(n,{ok:!1,code:"KB_BAD_REQUEST",message:"roleId \u4E0E enabled(boolean) \u5FC5\u586B"},400);return}let a;try{a=await je(r,s,c.roleId,c.enabled)}catch(f){w(n,{ok:!1,code:"KB_TOGGLE_FAILED",message:f instanceof Error?f.message:"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5F00\u5173\u5931\u8D25",collections:[]},400);return}w(n,a,a.ok?200:400);return}if(t.method==="POST"&&o.pathname==="/dev/kb/recompile"){let c=await $e(r);w(n,c);return}if(t.method==="GET"&&o.pathname==="/dev/console/mode"){w(n,{ok:!0,mode:d,promotable:d==="setup"&&!!p});return}if(t.method==="POST"&&o.pathname==="/dev/console/promote"){if(d==="runtime"){w(n,{ok:!0,mode:"runtime"});return}if(!p){b(n,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(P.phase!=="done"){b(n,409,"\u642D\u5EFA\u5C1A\u672A\u5B8C\u6210\uFF0C\u65E0\u6CD5\u8FDB\u5165\u8FD0\u884C\u6A21\u5F0F");return}try{let c=await st({configPath:r,...p});c.ok?w(n,{ok:!0,mode:"runtime"}):w(n,{ok:!1,mode:"setup",error:c.error},c.status)}catch(c){let a=c instanceof Z?c.status:500;b(n,a,c instanceof Error?c.message:String(c))}return}if(t.method==="GET"&&o.pathname==="/dev/run/status"){if(d==="setup"){w(n,{ok:!0,status:"unknown"});return}w(n,{ok:!0,...rt()});return}let E={"/dev/run/start":"start","/dev/run/stop":"stop"}[o.pathname];if(t.method==="POST"&&E){if(d==="setup"){b(n,409,"setup \u6A21\u5F0F\u4E0D\u652F\u6301\u8FD0\u884C\u63A7\u5236\uFF0C\u8BF7\u4F7F\u7528 aitable-workflow start \u547D\u4EE4");return}let c=await In(E,g);w(n,{...c,status:rt()});return}if(t.method==="POST"&&o.pathname==="/dev/workflow/trigger-once"){if(d==="setup"){b(n,409,"setup \u6A21\u5F0F\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684\u5F15\u64CE\uFF0C\u65E0\u6CD5\u89E6\u53D1\u5DE5\u4F5C\u6D41");return}let c;try{c=await $(t)}catch(a){b(n,400,a instanceof Error?a.message:String(a));return}try{let a=await Rn(String(c.workflowId??""),g);w(n,{ok:!0,...a})}catch(a){let f=a instanceof U?a.status:500;b(n,f,a instanceof Error?a.message:String(a))}return}b(n,404,"Unknown endpoint")}l(vn,"handleDevApi");function rt(){return S}l(rt,"getRuntimeRunStatus");async function In(e,o){let t=ct.randomUUID();return e==="start"?S.status==="running"||S.status==="starting"?{ok:!0,action:e,requestId:t}:(S={status:"starting",since:new Date().toISOString(),lastError:null},Q=Q.then(()=>{let n=o.start();S.status==="starting"&&(S={status:"running",since:new Date().toISOString(),lastError:null}),n.catch(r=>{S={status:"error",lastError:r instanceof Error?r.message:String(r)}})}).catch(n=>{S={status:"error",lastError:n instanceof Error?n.message:String(n)}}),{ok:!0,action:e,requestId:t}):e==="stop"?S.status==="stopping"?{ok:!0,action:e,requestId:t}:S.status!=="running"&&S.status!=="starting"?(S={status:"stopped",lastError:null},{ok:!0,action:e,requestId:t}):(S={status:"stopping",lastError:null},Q=Q.then(async()=>{await o.stop(),S={status:"stopped",lastError:null}}).catch(n=>{S={status:"error",lastError:n instanceof Error?n.message:String(n)}}),{ok:!0,action:e,requestId:t}):{ok:!1,action:e,requestId:t}}l(In,"handleRuntimeRunControl");async function Rn(e,o,t={}){if(typeof e!="string"||e.length===0)throw new U(400,"\u7F3A\u5C11 workflowId");if(!o.instances.some(i=>i.id===e)){let i=o.instances.map(u=>u.id).join("\u3001")||"\uFF08\u65E0\uFF09";throw new U(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new U(409,`\u5DE5\u4F5C\u6D41 "${e}" \u6B63\u5728\u89E6\u53D1\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210`);ne.add(e);let n=new AbortController,r=null,s=t.timeoutMs??wn;try{let i=new Promise((d,g)=>{r=setTimeout(()=>{n.abort(),g(new U(504,`\u89E6\u53D1\u8D85\u65F6\uFF08${s}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u6267\u884C`))},s)}),u=await Promise.race([o.triggerWorkflowOnce(e,{signal:n.signal}),i]);return{workflowId:e,...u}}catch(i){throw i instanceof U?i:new U(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}l(Rn,"handleTriggerWorkflowOnce");function so(){ne.clear()}l(so,"resetTriggerOnceForTest");async function st(e,o={}){if(ae)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");ae=!0;let t=o.timeoutMs??hn,n=null;try{let r=new Promise((i,u)=>{n=setTimeout(()=>u(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),S={status:"idle"},e.access)try{await gt(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 u={ok:!1,mode:"setup",status:s,error:i};return it(u),u}finally{n&&clearTimeout(n),ae=!1}}l(st,"handleConsolePromotion");function it(e){if(P.phase==="done")if(e.ok){let{promotionError:o,...t}=P;P={...t,mode:"runtime"}}else P={...P,mode:"setup",promotionError:e.error}}l(it,"applyPromotionToDoneProgress");function io(){S={status:"idle"},Q=Promise.resolve()}l(io,"resetRuntimeRunStatusForTest");function ao(){ae=!1,P={phase:"idle"},S={status:"idle"}}l(ao,"resetPromotionForTest");function co(e){P=e}l(co,"setSetupProgressForTest");function lo(){return P}l(lo,"getSetupProgressForTest");function at(e,o){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Te(o,t,{allowRoot:!1})}catch{return null}}l(at,"resolveInsideConfigDir");function Tn(e,o){try{return/\.json$/i.test(e)?JSON.parse(o):Re.parse(o),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)}`}}l(Tn,"validateStructuredText");function Cn(e){let o=Object.values(e.trackers).find(t=>t.baseId&&t.tableId);return o?.baseId?`https://alidocs.dingtalk.com/i/nodes/${encodeURIComponent(o.baseId)}`:null}l(Cn,"deriveBaseUrl");async function Pn(e,o,t){let n;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";n=Te(t,i,{allowRoot:!1})}catch{o.writeHead(403),o.end("Forbidden");return}try{(await Xe(n)).isDirectory()&&(n=v.join(n,"index.html"))}catch{n=v.join(t,"index.html")}try{await Xe(n)}catch{o.writeHead(404),o.end("Not Found");return}let r=v.extname(n),s=fn[r]??"application/octet-stream";o.writeHead(200,{"Content-Type":s}),nn(n).pipe(o)}l(Pn,"serveStatic");export{On as a,Ze as b,nt as c,U as d,Z as e,yn as f,ut as g,oo as h,pt as i,gt as j,Sn as k,ro as l,rt as m,In as n,Rn as o,so as p,st as q,io as r,ao as s,co as t,lo as u,Pn as v};