aitable-workflow-cli 0.1.22 → 0.1.23-beta.1788494091108

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.
@@ -1,15 +1,15 @@
1
- import{o as pe,q as ge}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as Xt}from"http";import{stat as Xe,readFile as ie,mkdir as ae,writeFile as Ie,rm as eo}from"fs/promises";import{createReadStream as to,existsSync as et,unlinkSync as oo}from"fs";import I from"path";import{fileURLToPath as no}from"url";import ct from"crypto";import ro from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as so,detectCodingEngines as io,loadWorkflowTemplate as ao,collectEnvRefs as co,applyConfigSave as lo,ConfigSaveError as uo,runSetupCommand as po,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Tt,readFile as q,writeFile as Pt}from"fs/promises";import B from"path";import F from"yaml";import{BotProvisioner as Ct,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as Et,listDwsConversations as xt,readState as Ot,resetProfileCache as Ne,runCommand as At,setupKnowledgeBases as _t,writeBack as ye,assertPortableId as Nt}from"aitable-workflow-core";import fe from"path";import{closeSync as wt,existsSync as Ce,openSync as ht}from"fs";import{createExecShellToolkit as yt,createStandaloneExecShellToolkit as bt,loadSettings as kt,logger as St,resolveConfigPath as vt,spawnManagedProcess as It}from"aitable-workflow-core";async function Rt(e,n){let t=await vt(e);if(!Ce(t))return{shell:bt(n,{configDir:fe.dirname(t)}),mode:"standalone",bins:{},configPath:t};let o=await kt(e),r=o.raw?.toolkit_config?.shell??{};return{shell:yt(o,n),mode:"project",bins:r.bins??{},configPath:t}}a(Rt,"createToolkitForExec");async function me(e,n,t){let o=fe.resolve(t.logFile),r=fe.dirname(o);if(!Ce(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=It({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,y=a(S=>g(S),"onError");d.once("error",y),d.once("spawn",()=>{d.removeListener("error",y),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\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",n.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,o)=>{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=o.timeout?Number.parseInt(o.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)),o.detach&&(o.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)),o.json&&St.setLevel("warn");let c=await Rt(o.config,r);if(o.detach){let{pid:g,logFile:d}=await me(r,s,{bins:c.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${g}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${d}`),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 g=await c.shell.run(r,s,{timeoutMs:i}),d=g.stdout.trim(),y={};if(d!=="")try{y=JSON.parse(d)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),g.stderr&&process.stderr.write(g.stderr),process.exit(1)}console.log(JSON.stringify(y,null,2));return}let p=await c.shell.run(r,s,{timeoutMs:i});p.stdout&&process.stdout.write(p.stdout),p.stderr&&process.stderr.write(p.stderr),p.truncated&&console.error(`
2
- \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(p.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??xt;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 Et(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=B.resolve(e,"profile","profile.yml"),o;try{o=F.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,y="tableId"in g||"table_id"in g;!d||!y||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var M="wiki/official-aitable-faq";async function Gt(e,n){let t=B.resolve(e,"profile","profile.yml"),o;try{o=F.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(Gt,"readRoleCollections");function Ee(e){if(F.isScalar(e))return typeof e.value=="string"?e.value:null;if(F.isMap(e)){let n=e.get("collection",!0);return F.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Ee,"kbEntryValue");async function Bt(e,n,t){let o=B.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=F.parseDocument(r),i=s.getIn(["roles",n,"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.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Ee).filter(d=>d!==null),p=c.includes(M),g=c.find(d=>d!==M)??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(M);else{let d=i.items.findIndex(y=>Ee(y)===M);d>=0&&i.delete(d)}return await Pt(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,M]:c.filter(d=>d!==M)}}a(Bt,"writeOfficialToggle");async function $e(e,n,t,o){Nt(t,{label:"roleId"});let r=await Bt(n,t,o);if(!r.ok)return{...r,compile:void 0};Ne();let s=o&&r.changed?De(e):void 0;return{...r,compile:s}}a($e,"setOfficialKbEnabled");function Ue(e){return{ok:!0,...De(e)}}a(Ue,"recompileKnowledgeBases");var we=null;function De(e){return we?{started:!1}:(we=Ut(e).finally(()=>{we=null}),{started:!0})}a(De,"triggerCompile");async function $t(e,n){let t={};for(let o of n){let r=await Ot(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($t,"readKbStats");async function Ut(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(Ut,"recompileKb");async function oe(e){let n=await zt(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=Dt(n),r=jt(n),s=o&&r?"group-qa":null,i=r?await Gt(e,r):[],c=o?G(G(n.workflows)?.[o.workflowId]):void 0,p=o?G(G(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(y=>y!==M)??null,officialOn:i.includes(M),stats:await $t(e,i)},groups:Vt(p?.conversation_ids),groupBotsStaging:await Mt(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function Dt(e){let n=G(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=G(G(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if(G(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(Dt,"locateGroupQa");function jt(e){let n=G(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=G(G(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(jt,"locateKbRole");async function je(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=B.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(je,"writeGroupList");var Le="GROUP_BOTS_STAGING";async function re(e){let n=await qt(e,Le);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(re,"readGroupBotStagingRaw");async function Me(e,n){await ye({type:"env",file:".env",envKey:Le},JSON.stringify(n),e)}a(Me,"writeGroupBotStagingRaw");function Lt(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(Lt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await re(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 Me(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Mt(e,n){return(await re(e)).map(o=>({...o,bot:Lt(o.bot)}))}a(Mt,"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 Fe(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Fe,"resolveCurrentCorpId");async function Ke(e,n,t,o={}){let r=o.provision??new Ct({runner:new Ae}),s=B.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(Ke,"addEnterpriseBotToGroup");function Ft(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(Ft,"stagingToGroupTableRecords");async function se(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 Me(n,[])},"clearStaging"),p=await re(n),g=Ft(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}),y=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(P=>P.groupId),S=g.filter(P=>!y.includes(P.\u7FA4ID??""));if(S.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let $=t.fields??await Se(d,s,i),j=new Map($.map(P=>[P.fieldName,P.fieldId])),X=S.map(P=>{let l={};for(let[u,m]of Object.entries(P)){let f=j.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:S.length,message:`\u5DF2\u5199\u5165 ${S.length} \u6761\u7FA4\u914D\u7F6E`}}a(se,"writeStagingToGroupTable");var A={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""}a(_,"cellToText");function Kt(e){if(e==null||e==="")return!0;let n=_(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Kt,"cellToEnabled");function Jt(e){let n=_(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(Jt,"cellToGroupType");function Wt(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(Wt,"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 y=i.get(d);return y?g[y]:void 0},"readCol"),p=[];for(let g of Wt(s)){let d=R(g.cells)?g.cells:{},y=_(c(d,A.groupId));if(!y)continue;let S=_(c(d,A.appSecret)),$=_(c(d,A.webhookSecret)),j=Jt(c(d,A.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:y,groupName:_(c(d,A.groupName)),...j?{groupType:j}:{},corpId:_(c(d,A.corpId)),inbound:_(c(d,A.inbound)),outbound:_(c(d,A.outbound)),webhookUrl:_(c(d,A.webhookUrl)),webhookSecret:$?"***":"",appKey:_(c(d,A.appKey)),appSecret:S?"***":"",botNick:_(c(d,A.botNick)),enabled:Kt(c(d,A.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Je(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 re(n)).length>0){let g=await se(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Je,"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 y=A[g];if(!y)continue;let S=c.get(y)??y;p[S]=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 Ht=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Ht)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)=>At(o,r,{timeoutMs:15e3}));try{let o=await t(n,["auth","status","--format","json"]),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=B.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,n={}){let t=B.resolve(e,qe);await Tt(B.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(B.resolve(e,qe),"utf8")).match(Yt)?.[0]??null}}catch{return{verifyUrl:null}}}a(Ve,"readDwsLoginProgress");async function qt(e,n){let t;try{t=await q(B.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(qt,"readEnvKey");async function zt(e){try{let n=F.parse(await q(B.resolve(e,"profile","profile.yml"),"utf8"));return R(n)?n:null}catch{return null}}a(zt,"readProfileDoc");function G(e){return R(e)?e:void 0}a(G,"asRecord");function Vt(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}a(Vt,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(R,"isRecord");import{spawnManagedProcess as Qt}from"aitable-workflow-core";function Ze(e){let n=Zt(e);try{let t=Qt({...n,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}a(Ze,"openExternalUrl");function Zt(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(Zt,"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(no(import.meta.url)),go={".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"},fo=1800*1e3;function mo(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(mo,"createIdleTimer");var C={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),wo=12e4,ne=new Set,L=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")}},ho=6e4,ce=!1;function yo(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}a(yo,"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 rn(){return ut()!==null}a(rn,"hasWebRoot");async function bo(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(bo,"getAvailablePort");var ko=1024*1024,So=50*1024*1024,dt=I.join(".aitable-workflow","console-access.json");async function pt(e,n){let t=I.join(e,dt);return await ae(I.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(n,null,2)}
6
- `,"utf8"),t}a(pt,"writeConsoleAccessFile");function vo(e){try{oo(I.join(e,dt))}catch{}}a(vo,"clearConsoleAccessFile");async function D(e,n=ko){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 b(e,n,t){w(e,{ok:!1,error:t},n)}a(b,"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 sn(e){let n=e.port??8788,t=await bo(n),o=yo(),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);C={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ne.clear();let y=e.assembleApp?{assembleApp:e.assembleApp,commit:a(m=>{p=m,c="runtime",P(),e.onAppAssembled?.(m)},"commit")}:void 0,S="";e.initialRunStatus&&(v=e.initialRunStatus);let $=null,j=new Promise(m=>$=m),X=mo({timeoutMs:fo,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`),$?.()},"onTimeout")}),P=a(()=>X.reset(),"resetTimeout"),l=Xt(async(m,f)=>{let h=new URL(m.url??"/",`http://${m.headers.host??"localhost"}`),x=m.headers.origin;if(x){let E=`http://127.0.0.1:${t}`;(x===E||o==="remote")&&f.setHeader("Access-Control-Allow-Origin",x)}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(h.pathname.startsWith("/dev/")){if((h.searchParams.get("token")??m.headers.authorization?.replace("Bearer ",""))!==r){b(f,401,"Unauthorized");return}P();try{await Io({url:h,req:m,res:f,configPath:e.configPath,configDir:d,completionResolve:$,setupOptions:e.setupOptions,mode:c,app:p,promotion:y?{...y,access:{configDir:d,url:S,port:t}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(U){let ee=U instanceof Error?U.message:String(U);b(f,500,ee)}return}if(h.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}Eo(h,f,i)});await new Promise(m=>l.listen(t,s,m)),P();let u=(await oe(d).catch(()=>null))?.scenario??null;S=o==="local-gui"?`http://127.0.0.1:${t}/${ot(u)}?token=${r}`:`http://${ro.hostname()}:${t}/${ot(u)}?token=${r}`,await pt(d,{url:S,port:t,mode:c,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>vo(d)),o==="local-gui"?e.open!==!1?(Ze(S),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${S}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${S}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${S}`),console.log(`
1
+ import{o as pe,q as ge}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as eo}from"http";import{stat as Xe,readFile as ie,mkdir as ae,writeFile as Ie,rm as to}from"fs/promises";import{createReadStream as oo,existsSync as et,unlinkSync as no}from"fs";import I from"path";import{fileURLToPath as ro}from"url";import ct from"crypto";import so from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as io,detectCodingEngines as ao,loadWorkflowTemplate as co,collectEnvRefs as lo,applyConfigSave as uo,ConfigSaveError as po,runSetupCommand as go,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Tt,readFile as q,writeFile as Ct}from"fs/promises";import B from"path";import F from"yaml";import{BotProvisioner as Pt,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as Et,listDwsConversations as xt,readState as Ot,resetProfileCache as Ne,runDwsCommand as At,runCommand as _t,setupKnowledgeBases as Nt,writeBack as ye,assertPortableId as Gt}from"aitable-workflow-core";import fe from"path";import{closeSync as wt,existsSync as Pe,openSync as ht}from"fs";import{createExecShellToolkit as yt,createStandaloneExecShellToolkit as bt,loadSettings as kt,logger as St,resolveConfigPath as vt,spawnManagedProcess as It}from"aitable-workflow-core";async function Rt(e,n){let t=await vt(e);if(!Pe(t))return{shell:bt(n,{configDir:fe.dirname(t)}),mode:"standalone",bins:{},configPath:t};let o=await kt(e),r=o.raw?.toolkit_config?.shell??{};return{shell:yt(o,n),mode:"project",bins:r.bins??{},configPath:t}}a(Rt,"createToolkitForExec");async function me(e,n,t){let o=fe.resolve(t.logFile),r=fe.dirname(o);if(!Pe(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=It({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,y=a(S=>g(S),"onError");d.once("error",y),d.once("spawn",()=>{d.removeListener("error",y),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function No(e,n){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",n.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,o)=>{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=o.timeout?Number.parseInt(o.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)),o.detach&&(o.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)),o.json&&St.setLevel("warn");let c=await Rt(o.config,r);if(o.detach){let{pid:g,logFile:d}=await me(r,s,{bins:c.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${g}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${d}`),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 g=await c.shell.run(r,s,{timeoutMs:i}),d=g.stdout.trim(),y={};if(d!=="")try{y=JSON.parse(d)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),g.stderr&&process.stderr.write(g.stderr),process.exit(1)}console.log(JSON.stringify(y,null,2));return}let p=await c.shell.run(r,s,{timeoutMs:i});p.stdout&&process.stdout.write(p.stdout),p.stderr&&process.stderr.write(p.stderr),p.truncated&&console.error(`
2
+ \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(p.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}a(No,"registerExecCommand");async function Ge(e={}){let n=e.list??xt;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 Et(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=B.resolve(e,"profile","profile.yml"),o;try{o=F.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,y="tableId"in g||"table_id"in g;!d||!y||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var M="wiki/official-aitable-faq";async function Bt(e,n){let t=B.resolve(e,"profile","profile.yml"),o;try{o=F.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(Bt,"readRoleCollections");function Ee(e){if(F.isScalar(e))return typeof e.value=="string"?e.value:null;if(F.isMap(e)){let n=e.get("collection",!0);return F.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Ee,"kbEntryValue");async function $t(e,n,t){let o=B.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=F.parseDocument(r),i=s.getIn(["roles",n,"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.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Ee).filter(d=>d!==null),p=c.includes(M),g=c.find(d=>d!==M)??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(M);else{let d=i.items.findIndex(y=>Ee(y)===M);d>=0&&i.delete(d)}return await Ct(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,M]:c.filter(d=>d!==M)}}a($t,"writeOfficialToggle");async function $e(e,n,t,o){Gt(t,{label:"roleId"});let r=await $t(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 De(e){return{ok:!0,...Ue(e)}}a(De,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Ut(e).finally(()=>{we=null}),{started:!0})}a(Ue,"triggerCompile");async function Dt(e,n){let t={};for(let o of n){let r=await Ot(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(Dt,"readKbStats");async function Ut(e){try{let n=await _e(e,{lenientEnv:!0}),t=await Nt({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(Ut,"recompileKb");async function oe(e){let n=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(!n)return t;let o=jt(n),r=Lt(n),s=o&&r?"group-qa":null,i=r?await Bt(e,r):[],c=o?G(G(n.workflows)?.[o.workflowId]):void 0,p=o?G(G(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(y=>y!==M)??null,officialOn:i.includes(M),stats:await Dt(e,i)},groups:Qt(p?.conversation_ids),groupBotsStaging:await Ft(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function jt(e){let n=G(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=G(G(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if(G(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(jt,"locateGroupQa");function Lt(e){let n=G(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=G(G(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(Lt,"locateKbRole");async function je(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=B.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(je,"writeGroupList");var Le="GROUP_BOTS_STAGING";async function re(e){let n=await zt(e,Le);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(re,"readGroupBotStagingRaw");async function Me(e,n){await ye({type:"env",file:".env",envKey:Le},JSON.stringify(n),e)}a(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}a(Mt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await re(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 Me(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Ft(e,n){return(await re(e)).map(o=>({...o,bot:Mt(o.bot)}))}a(Ft,"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 Fe(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Fe,"resolveCurrentCorpId");async function Ke(e,n,t,o={}){let r=o.provision??new Pt({runner:new Ae}),s=B.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(Ke,"addEnterpriseBotToGroup");function Kt(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(Kt,"stagingToGroupTableRecords");async function se(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 Me(n,[])},"clearStaging"),p=await re(n),g=Kt(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}),y=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(C=>C.groupId),S=g.filter(C=>!y.includes(C.\u7FA4ID??""));if(S.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let $=t.fields??await Se(d,s,i),j=new Map($.map(C=>[C.fieldName,C.fieldId])),X=S.map(C=>{let l={};for(let[u,m]of Object.entries(C)){let f=j.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:S.length,message:`\u5DF2\u5199\u5165 ${S.length} \u6761\u7FA4\u914D\u7F6E`}}a(se,"writeStagingToGroupTable");var A={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""}a(_,"cellToText");function Jt(e){if(e==null||e==="")return!0;let n=_(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Jt,"cellToEnabled");function Wt(e){let n=_(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(Wt,"cellToGroupType");function Ht(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(Ht,"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 y=i.get(d);return y?g[y]:void 0},"readCol"),p=[];for(let g of Ht(s)){let d=R(g.cells)?g.cells:{},y=_(c(d,A.groupId));if(!y)continue;let S=_(c(d,A.appSecret)),$=_(c(d,A.webhookSecret)),j=Wt(c(d,A.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:y,groupName:_(c(d,A.groupName)),...j?{groupType:j}:{},corpId:_(c(d,A.corpId)),inbound:_(c(d,A.inbound)),outbound:_(c(d,A.outbound)),webhookUrl:_(c(d,A.webhookUrl)),webhookSecret:$?"***":"",appKey:_(c(d,A.appKey)),appSecret:S?"***":"",botNick:_(c(d,A.botNick)),enabled:Jt(c(d,A.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Je(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 re(n)).length>0){let g=await se(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Je,"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 y=A[g];if(!y)continue;let S=c.get(y)??y;p[S]=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 Yt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Yt)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)=>_t(o,r,{timeoutMs:15e3}));try{let o=await At(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=B.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=B.resolve(e,qe);await Tt(B.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(B.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(B.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 Vt(e){try{let n=F.parse(await q(B.resolve(e,"profile","profile.yml"),"utf8"));return R(n)?n:null}catch{return null}}a(Vt,"readProfileDoc");function G(e){return R(e)?e:void 0}a(G,"asRecord");function Qt(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}a(Qt,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(R,"isRecord");import{spawnManagedProcess as Zt}from"aitable-workflow-core";function Ze(e){let n=Xt(e);try{let t=Zt({...n,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}a(Ze,"openExternalUrl");function Xt(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(Xt,"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(ro(import.meta.url)),fo={".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"},mo=1800*1e3;function wo(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(wo,"createIdleTimer");var P={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ho=12e4,ne=new Set,L=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")}},yo=6e4,ce=!1;function bo(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}a(bo,"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 sn(){return ut()!==null}a(sn,"hasWebRoot");async function ko(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(ko,"getAvailablePort");var So=1024*1024,vo=50*1024*1024,dt=I.join(".aitable-workflow","console-access.json");async function pt(e,n){let t=I.join(e,dt);return await ae(I.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(n,null,2)}
6
+ `,"utf8"),t}a(pt,"writeConsoleAccessFile");function Io(e){try{no(I.join(e,dt))}catch{}}a(Io,"clearConsoleAccessFile");async function U(e,n=So){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(U,"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 b(e,n,t){w(e,{ok:!1,error:t},n)}a(b,"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 an(e){let n=e.port??8788,t=await ko(n),o=bo(),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);P={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ne.clear();let y=e.assembleApp?{assembleApp:e.assembleApp,commit:a(m=>{p=m,c="runtime",C(),e.onAppAssembled?.(m)},"commit")}:void 0,S="";e.initialRunStatus&&(v=e.initialRunStatus);let $=null,j=new Promise(m=>$=m),X=wo({timeoutMs:mo,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`),$?.()},"onTimeout")}),C=a(()=>X.reset(),"resetTimeout"),l=eo(async(m,f)=>{let h=new URL(m.url??"/",`http://${m.headers.host??"localhost"}`),x=m.headers.origin;if(x){let E=`http://127.0.0.1:${t}`;(x===E||o==="remote")&&f.setHeader("Access-Control-Allow-Origin",x)}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(h.pathname.startsWith("/dev/")){if((h.searchParams.get("token")??m.headers.authorization?.replace("Bearer ",""))!==r){b(f,401,"Unauthorized");return}C();try{await Ro({url:h,req:m,res:f,configPath:e.configPath,configDir:d,completionResolve:$,setupOptions:e.setupOptions,mode:c,app:p,promotion:y?{...y,access:{configDir:d,url:S,port:t}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(D){let ee=D instanceof Error?D.message:String(D);b(f,500,ee)}return}if(h.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}xo(h,f,i)});await new Promise(m=>l.listen(t,s,m)),C();let u=(await oe(d).catch(()=>null))?.scenario??null;S=o==="local-gui"?`http://127.0.0.1:${t}/${ot(u)}?token=${r}`:`http://${so.hostname()}:${t}/${ot(u)}?token=${r}`,await pt(d,{url:S,port:t,mode:c,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Io(d)),o==="local-gui"?e.open!==!1?(Ze(S),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${S}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${S}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${S}`),console.log(`
8
8
  \u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
9
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
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
11
  `)):(console.log(`
12
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 j,X.clear(),l.close()}a(sn,"runConfigUI");async function Io(e){let{url:n,req:t,res:o,configPath:r,configDir:s,completionResolve:i,setupOptions:c,mode:p,app:g,promotion:d,exitOnSetupError:y}=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=io(),m=await so(r),f={},h={},x=new Set,E=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let k=await lt(r),O=await ie(k,"utf8");for(let K of co([O]))x.add(K)}catch{}try{let k=await ie(I.join(s,"profile","profile.yml"),"utf8"),O=Re.parse(k),K=O?.workflows;if(K&&typeof K=="object"&&(h=K),O&&typeof O=="object"){let{workflows:Pe,...H}=O;for(let te of JSON.stringify(H).matchAll(E))x.add(te[1])}}catch{}for(let k of m.workflowEntries)try{let O=await ao(k.templatePath),K=O.steps.map(T=>({id:T.id,name:T.name,recipe:T.recipe,engine:T.engine,auto:T.auto})),Pe=O.edges.filter(T=>T.from!=="__start__"&&T.to!=="__end__").map(T=>({from:T.from,to:T.to,condition:T.condition})),H={},te=new Set,J;try{J=Re.parse(await ie(k.templatePath,"utf8"))}catch{}if(J){for(let N of JSON.stringify(J).matchAll(E))te.add(N[1]);let T=h[k.id];if(T&&typeof T=="object")for(let N of JSON.stringify(T).matchAll(E))te.add(N[1]);let gt=Array.isArray(J.steps)?J.steps:[];for(let N=0;N<O.steps.length;N++){let le=O.steps[N],Y=gt[N];if(Y){let ue=JSON.stringify(Y),de=new Set;for(let mt of ue.matchAll(E))de.add(mt[1]);de.size>0&&(H[le.id]=[...de])}}let ft=Array.isArray(J.event_sources)?J.event_sources:[];for(let N of ft)if(N){let le=JSON.stringify(N),Y=new Set;for(let ue of le.matchAll(E))Y.add(ue[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}f[k.id]={steps:K,edges:Pe,stepEnvRefs:H,envRefs:[...te].sort()}}catch{f[k.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let U=new Set;for(let k of Object.values(f))for(let O of k.envRefs??[])U.add(O);let ee=l.modules.find(k=>k.id==="env");for(let k of ee?.items??[])k.writeTarget?.type==="env"&&!U.has(k.key)&&x.add(k.key);w(o,{config:W(l),engines:{available:u.available.map(k=>({engine:k.engine,cmd:k.cmd,version:k.version})),recommended:u.recommendedEngine},workflowTopology:f,projectEnvRefs:[...x].sort()});return}if(t.method==="POST"&&n.pathname==="/dev/config/save"){let l=await D(t);try{let u=await lo(l,s,r);w(o,{ok:!0,written:u.written,recheck:W(u.recheck)})}catch(u){if(u instanceof uo){b(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){b(o,400,"roleId and source are required");return}try{tt(l.roleId,{label:"roleId"})}catch(x){b(o,400,x instanceof Error?x.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await ge(u,l.roleId),f=await pe({source:l.source,collectionName:m,configDir:s}),h=await V({configPath:r});w(o,{ok:f.success,message:f.message,recheck:W(h)});return}if(t.method==="POST"&&n.pathname==="/dev/kb/upload"){let l=await D(t,So);if(!l.roleId||!Array.isArray(l.files)||l.files.length===0){b(o,400,"roleId and files are required");return}try{tt(l.roleId,{label:"roleId"})}catch(h){b(o,400,h instanceof Error?h.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await ge(u,l.roleId),f=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ae(f,{recursive:!0});for(let E of l.files){let U;try{U=Te(f,E.relativePath,{allowRoot:!1})}catch{b(o,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${E.relativePath}`);return}let ee=I.dirname(U);await ae(ee,{recursive:!0});let k=E.encoding==="base64"?Buffer.from(E.content,"base64"):Buffer.from(E.content,"utf8");await Ie(U,k)}let h=await pe({source:f,collectionName:m,configDir:s}),x=await V({configPath:r});w(o,{ok:h.success,message:h.message,recheck:W(x)})}finally{await eo(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){b(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${l}`);return}try{let m=await ie(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"){b(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${u}`);return}let f=Po(u,l.content);if(f){w(o,{ok:!1,error:f},400);return}await ae(I.dirname(m),{recursive:!0}),await Ie(m,l.content.endsWith(`
13
+ `)),await j,X.clear(),l.close()}a(an,"runConfigUI");async function Ro(e){let{url:n,req:t,res:o,configPath:r,configDir:s,completionResolve:i,setupOptions:c,mode:p,app:g,promotion:d,exitOnSetupError:y}=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=ao(),m=await io(r),f={},h={},x=new Set,E=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let k=await lt(r),O=await ie(k,"utf8");for(let K of lo([O]))x.add(K)}catch{}try{let k=await ie(I.join(s,"profile","profile.yml"),"utf8"),O=Re.parse(k),K=O?.workflows;if(K&&typeof K=="object"&&(h=K),O&&typeof O=="object"){let{workflows:Ce,...H}=O;for(let te of JSON.stringify(H).matchAll(E))x.add(te[1])}}catch{}for(let k of m.workflowEntries)try{let O=await co(k.templatePath),K=O.steps.map(T=>({id:T.id,name:T.name,recipe:T.recipe,engine:T.engine,auto:T.auto})),Ce=O.edges.filter(T=>T.from!=="__start__"&&T.to!=="__end__").map(T=>({from:T.from,to:T.to,condition:T.condition})),H={},te=new Set,J;try{J=Re.parse(await ie(k.templatePath,"utf8"))}catch{}if(J){for(let N of JSON.stringify(J).matchAll(E))te.add(N[1]);let T=h[k.id];if(T&&typeof T=="object")for(let N of JSON.stringify(T).matchAll(E))te.add(N[1]);let gt=Array.isArray(J.steps)?J.steps:[];for(let N=0;N<O.steps.length;N++){let le=O.steps[N],Y=gt[N];if(Y){let ue=JSON.stringify(Y),de=new Set;for(let mt of ue.matchAll(E))de.add(mt[1]);de.size>0&&(H[le.id]=[...de])}}let ft=Array.isArray(J.event_sources)?J.event_sources:[];for(let N of ft)if(N){let le=JSON.stringify(N),Y=new Set;for(let ue of le.matchAll(E))Y.add(ue[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}f[k.id]={steps:K,edges:Ce,stepEnvRefs:H,envRefs:[...te].sort()}}catch{f[k.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let D=new Set;for(let k of Object.values(f))for(let O of k.envRefs??[])D.add(O);let ee=l.modules.find(k=>k.id==="env");for(let k of ee?.items??[])k.writeTarget?.type==="env"&&!D.has(k.key)&&x.add(k.key);w(o,{config:W(l),engines:{available:u.available.map(k=>({engine:k.engine,cmd:k.cmd,version:k.version})),recommended:u.recommendedEngine},workflowTopology:f,projectEnvRefs:[...x].sort()});return}if(t.method==="POST"&&n.pathname==="/dev/config/save"){let l=await U(t);try{let u=await uo(l,s,r);w(o,{ok:!0,written:u.written,recheck:W(u.recheck)})}catch(u){if(u instanceof po){b(o,u.status,u.message);return}throw u}return}if(t.method==="POST"&&n.pathname==="/dev/kb/ingest"){let l=await U(t);if(!l.roleId||!l.source){b(o,400,"roleId and source are required");return}try{tt(l.roleId,{label:"roleId"})}catch(x){b(o,400,x instanceof Error?x.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await ge(u,l.roleId),f=await pe({source:l.source,collectionName:m,configDir:s}),h=await V({configPath:r});w(o,{ok:f.success,message:f.message,recheck:W(h)});return}if(t.method==="POST"&&n.pathname==="/dev/kb/upload"){let l=await U(t,vo);if(!l.roleId||!Array.isArray(l.files)||l.files.length===0){b(o,400,"roleId and files are required");return}try{tt(l.roleId,{label:"roleId"})}catch(h){b(o,400,h instanceof Error?h.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await ge(u,l.roleId),f=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ae(f,{recursive:!0});for(let E of l.files){let D;try{D=Te(f,E.relativePath,{allowRoot:!1})}catch{b(o,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${E.relativePath}`);return}let ee=I.dirname(D);await ae(ee,{recursive:!0});let k=E.encoding==="base64"?Buffer.from(E.content,"base64"):Buffer.from(E.content,"utf8");await Ie(D,k)}let h=await pe({source:f,collectionName:m,configDir:s}),x=await V({configPath:r});w(o,{ok:h.success,message:h.message,recheck:W(x)})}finally{await to(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){b(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${l}`);return}try{let m=await ie(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 U(t),u=typeof l.path=="string"?l.path:"",m=at(u,s);if(!m||typeof l.content!="string"){b(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${u}`);return}let f=Po(u,l.content);if(f){w(o,{ok:!1,error:f},400);return}await ae(I.dirname(m),{recursive:!0}),await Ie(m,l.content.endsWith(`
14
14
  `)?l.content:l.content+`
15
- `,"utf8");let h=await V({configPath:r});w(o,{ok:!0,recheck:W(h)});return}if(t.method==="POST"&&n.pathname==="/dev/setup/complete"){if(C.phase==="running"){b(o,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}C={phase:"running",logs:[]},w(o,{ok:!0});let l=a(async()=>{try{let u=await se(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 po({config:r,...c??{}}),await l();let u=await z(r,s),m=Co(u),f={mode:p};if(p==="setup"&&d){let h=await st({configPath:r,...d});f=h.ok?{mode:"runtime"}:{mode:"setup",promotionError:h.error}}C={phase:"done",artifacts:u,baseUrl:m,...f}}catch(u){C={phase:"error",message:u instanceof Error?u.message:String(u)},y&&i?.()}})();return}if(t.method==="GET"&&n.pathname==="/dev/setup/progress"){w(o,C);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)){b(o,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await je(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 S=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&S){let l=decodeURIComponent(S[1]),u=await D(t),m=await oe(s),f=await Ke(s,m.workflowId??"group-qa",{conversationId:l,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(o,f,f.ok?200:400);return}let $=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&$){let l=decodeURIComponent($[1]),u=await D(t);if(!u.name||!u.webhook||!u.secret){b(o,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){b(o,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let m=await oe(s),f=await Fe(),h=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,h,h.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/group-config-table"){try{w(o,await Je(r,s))}catch(l){b(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 se(r,s);w(o,l,l.ok?200:400);return}let j=n.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&j){let l=decodeURIComponent(j[1]),u=await D(t),f=(await z(r,s)).configTables.group_table;if(!f?.baseId||!f.tableId){b(o,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let h=await We(f.baseId,f.tableId,l,u);w(o,h,h.ok?200:400)}catch(h){b(o,502,h instanceof Error?h.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 Ue(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){b(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(C.phase!=="done"){b(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;b(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 P={"/dev/run/start":"start","/dev/run/stop":"stop"}[n.pathname];if(t.method==="POST"&&P){if(p==="setup"){b(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 Ro(P,g);w(o,{...l,status:rt()});return}if(t.method==="POST"&&n.pathname==="/dev/workflow/trigger-once"){if(p==="setup"){b(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){b(o,400,u instanceof Error?u.message:String(u));return}try{let u=await To(String(l.workflowId??""),g);w(o,{ok:!0,...u})}catch(u){let m=u instanceof L?u.status:500;b(o,m,u instanceof Error?u.message:String(u))}return}b(o,404,"Unknown endpoint")}a(Io,"handleDevApi");function rt(){return v}a(rt,"getRuntimeRunStatus");async function Ro(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(Ro,"handleRuntimeRunControl");async function To(e,n,t={}){if(typeof e!="string"||e.length===0)throw new L(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 L(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new L(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??wo;try{let i=new Promise((p,g)=>{r=setTimeout(()=>{o.abort(),g(new L(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 L?i:new L(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}a(To,"handleTriggerWorkflowOnce");function an(){ne.clear()}a(an,"resetTriggerOnceForTest");async function st(e,n={}){if(ce)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");ce=!0;let t=n.timeoutMs??ho,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),ce=!1}}a(st,"handleConsolePromotion");function it(e){if(C.phase==="done")if(e.ok){let{promotionError:n,...t}=C;C={...t,mode:"runtime"}}else C={...C,mode:"setup",promotionError:e.error}}a(it,"applyPromotionToDoneProgress");function cn(){v={status:"idle"},Q=Promise.resolve()}a(cn,"resetRuntimeRunStatusForTest");function ln(){ce=!1,C={phase:"idle"},v={status:"idle"}}a(ln,"resetPromotionForTest");function un(e){C=e}a(un,"setSetupProgressForTest");function dn(){return C}a(dn,"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 Po(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(Po,"validateStructuredText");function Co(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(Co,"deriveBaseUrl");async function Eo(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=go[r]??"application/octet-stream";n.writeHead(200,{"Content-Type":s}),to(o).pipe(n)}a(Eo,"serveStatic");export{_o as a,Ze as b,ot as c,mo as d,L as e,Z as f,yo as g,ut as h,rn as i,dt as j,pt as k,vo as l,sn as m,rt as n,Ro as o,To as p,an as q,st as r,cn as s,ln as t,un as u,dn as v,Eo as w};
15
+ `,"utf8");let h=await V({configPath:r});w(o,{ok:!0,recheck:W(h)});return}if(t.method==="POST"&&n.pathname==="/dev/setup/complete"){if(P.phase==="running"){b(o,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}P={phase:"running",logs:[]},w(o,{ok:!0});let l=a(async()=>{try{let u=await se(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 go({config:r,...c??{}}),await l();let u=await z(r,s),m=Eo(u),f={mode:p};if(p==="setup"&&d){let h=await st({configPath:r,...d});f=h.ok?{mode:"runtime"}:{mode:"setup",promotionError:h.error}}P={phase:"done",artifacts:u,baseUrl:m,...f}}catch(u){P={phase:"error",message:u instanceof Error?u.message:String(u)},y&&i?.()}})();return}if(t.method==="GET"&&n.pathname==="/dev/setup/progress"){w(o,P);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 U(t);if(!l.workflowId||!l.eventSourceName||!Array.isArray(l.conversationIds)){b(o,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await je(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 S=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&S){let l=decodeURIComponent(S[1]),u=await U(t),m=await oe(s),f=await Ke(s,m.workflowId??"group-qa",{conversationId:l,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(o,f,f.ok?200:400);return}let $=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&$){let l=decodeURIComponent($[1]),u=await U(t);if(!u.name||!u.webhook||!u.secret){b(o,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){b(o,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let m=await oe(s),f=await Fe(),h=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,h,h.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/group-config-table"){try{w(o,await Je(r,s))}catch(l){b(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 se(r,s);w(o,l,l.ok?200:400);return}let j=n.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&j){let l=decodeURIComponent(j[1]),u=await U(t),f=(await z(r,s)).configTables.group_table;if(!f?.baseId||!f.tableId){b(o,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let h=await We(f.baseId,f.tableId,l,u);w(o,h,h.ok?200:400)}catch(h){b(o,502,h instanceof Error?h.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/kb/official"){let l=await U(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 De(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){b(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(P.phase!=="done"){b(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;b(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"){b(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 To(C,g);w(o,{...l,status:rt()});return}if(t.method==="POST"&&n.pathname==="/dev/workflow/trigger-once"){if(p==="setup"){b(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 U(t)}catch(u){b(o,400,u instanceof Error?u.message:String(u));return}try{let u=await Co(String(l.workflowId??""),g);w(o,{ok:!0,...u})}catch(u){let m=u instanceof L?u.status:500;b(o,m,u instanceof Error?u.message:String(u))}return}b(o,404,"Unknown endpoint")}a(Ro,"handleDevApi");function rt(){return v}a(rt,"getRuntimeRunStatus");async function To(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(To,"handleRuntimeRunControl");async function Co(e,n,t={}){if(typeof e!="string"||e.length===0)throw new L(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 L(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new L(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??ho;try{let i=new Promise((p,g)=>{r=setTimeout(()=>{o.abort(),g(new L(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 L?i:new L(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}a(Co,"handleTriggerWorkflowOnce");function cn(){ne.clear()}a(cn,"resetTriggerOnceForTest");async function st(e,n={}){if(ce)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");ce=!0;let t=n.timeoutMs??yo,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),ce=!1}}a(st,"handleConsolePromotion");function it(e){if(P.phase==="done")if(e.ok){let{promotionError:n,...t}=P;P={...t,mode:"runtime"}}else P={...P,mode:"setup",promotionError:e.error}}a(it,"applyPromotionToDoneProgress");function ln(){v={status:"idle"},Q=Promise.resolve()}a(ln,"resetRuntimeRunStatusForTest");function un(){ce=!1,P={phase:"idle"},v={status:"idle"}}a(un,"resetPromotionForTest");function dn(e){P=e}a(dn,"setSetupProgressForTest");function pn(){return P}a(pn,"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 Po(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(Po,"validateStructuredText");function Eo(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(Eo,"deriveBaseUrl");async function xo(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=fo[r]??"application/octet-stream";n.writeHead(200,{"Content-Type":s}),oo(o).pipe(n)}a(xo,"serveStatic");export{No as a,Ze as b,ot as c,wo as d,L as e,Z as f,bo as g,ut as h,sn as i,dt as j,pt as k,Io as l,an as m,rt as n,To as o,Co as p,cn as q,st as r,ln as s,un as t,dn as u,pn as v,xo as w};