aitable-workflow-cli 0.1.18 → 0.1.19

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 ge,q as fe}from"./chunk-XGHRD4FJ.js";import{a as u}from"./chunk-EI7MMDWY.js";import{createServer as on}from"http";import{stat as ot,readFile as ie,mkdir as ae,writeFile as Re,rm as rn}from"fs/promises";import{createReadStream as sn,existsSync as rt,unlinkSync as an}from"fs";import I from"path";import{fileURLToPath as cn}from"url";import dt from"crypto";import ln from"os";import Te from"yaml";import{runCheck as q,resolveConfigPath as pt,loadSettings as un,detectCodingEngines as dn,loadWorkflowTemplate as pn,collectEnvRefs as gn,applyConfigSave as fn,ConfigSaveError as mn,runSetupCommand as wn,resolveInsideRoot as Pe,assertPortableId as st}from"aitable-workflow-core";import{mkdir as xt,readFile as z,writeFile as At}from"fs/promises";import j from"path";import M from"yaml";import{BotProvisioner as Ot,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as _e,fetchFields as Se,loadSettings as Ne,loadWorkflowTemplate as _t,listDwsConversations as Nt,readState as Gt,resetProfileCache as ve,runCommand as Bt,setupKnowledgeBases as jt,writeBack as ne,assertPortableId as $t}from"aitable-workflow-core";import me from"path";import{closeSync as kt,existsSync as Ee,openSync as St}from"fs";import{createExecShellToolkit as vt,createStandaloneExecShellToolkit as It,loadSettings as Rt,logger as Tt,resolveConfigPath as Pt,spawnManagedProcess as Ct}from"aitable-workflow-core";async function Et(e,o){let t=await Pt(e);if(!Ee(t))return{shell:It(o,{configDir:me.dirname(t)}),mode:"standalone",bins:{},configPath:t};let n=await Rt(e),r=n.raw?.toolkit_config?.shell??{};return{shell:vt(n,o),mode:"project",bins:r.bins??{},configPath:t}}u(Et,"createToolkitForExec");async function we(e,o,t){let n=me.resolve(t.logFile),r=me.dirname(n);if(!Ee(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=St(n,"w"),l;try{return l=Ct({command:s,args:o,stdio:["ignore",i,i]}),await new Promise((d,g)=>{let p=l.child,y=u(R=>g(R),"onError");p.once("error",y),p.once("spawn",()=>{p.removeListener("error",y),d()})}),l.unref(),{pid:l.child.pid,logFile:n}}finally{kt(i)}}u(we,"runDetached");function Gn(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&&Tt.setLevel("warn");let l=await Et(n.config,r);if(l.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 we(r,s,{bins:l.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 l.shell.runJson(r,s,{timeoutMs:i});console.log(JSON.stringify(g??{},null,2));return}let d=await l.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)}})}u(Gn,"registerExecCommand");async function Ge(e={}){let o=e.list??Nt;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)}}}u(Ge,"listAdminGroups");async function V(e,o){let t={};try{let l=await Ne(e,{lenientEnv:!0});for(let d of l.workflowEntries)try{let p=(await _t(d.templatePath,{envSource:l.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(l=>l.baseId&&l.tableId)&&s.every(l=>l.baseId&&l.tableId):r.some(l=>l.baseId&&l.tableId),trackers:t,configTables:n}}u(V,"readSetupArtifacts");async function Be(e){let o={},t=j.resolve(e,"profile","profile.yml"),n;try{n=M.parse(await z(t,"utf8"))}catch{return o}let r=v(n)?n.workflows:void 0;if(!v(r))return o;for(let s of Object.values(r)){let i=v(s)?s.steps:void 0;if(v(i)){for(let l of Object.values(i))if(v(l))for(let[d,g]of Object.entries(l)){if(!v(g))continue;let p="baseId"in g||"base_id"in g,y="tableId"in g||"table_id"in g;!p||!y||(o[d]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return o}u(Be,"readProfileConfigTables");var L="wiki/official-aitable-faq";async function Ut(e,o){let t=j.resolve(e,"profile","profile.yml"),n;try{n=M.parse(await z(t,"utf8"))}catch{return[]}let r=v(n)?n.roles:void 0,s=v(r)?r[o]:void 0,i=v(s)?s.knowledge_scope:void 0,l=v(i)?i.kb_collections:void 0;return Array.isArray(l)?l.map(d=>typeof d=="string"?d:v(d)&&typeof d.collection=="string"?d.collection:null).filter(d=>d!==null):[]}u(Ut,"readRoleCollections");function xe(e){if(M.isScalar(e))return typeof e.value=="string"?e.value:null;if(M.isMap(e)){let o=e.get("collection",!0);return M.isScalar(o)&&typeof o.value=="string"?o.value:null}return null}u(xe,"kbEntryValue");async function Dt(e,o,t){let n=j.resolve(e,"profile","profile.yml"),r;try{r=await z(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=M.parseDocument(r),i=s.getIn(["roles",o,"knowledge_scope","kb_collections"],!0);if(!M.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${o}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let l=i.items.map(xe).filter(p=>p!==null),d=l.includes(L),g=l.find(p=>p!==L)??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:l,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:l,changed:!1};if(t)i.add(L);else{let p=i.items.findIndex(y=>xe(y)===L);p>=0&&i.delete(p)}return await At(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?[...l,L]:l.filter(p=>p!==L)}}u(Dt,"writeOfficialToggle");async function je(e,o,t,n){$t(t,{label:"roleId"});let r=await Dt(o,t,n);if(!r.ok)return{...r,compile:void 0};ve();let s=n&&r.changed?Ue(e):void 0;return{...r,compile:s}}u(je,"setOfficialKbEnabled");function $e(e){return{ok:!0,...Ue(e)}}u($e,"recompileKnowledgeBases");var ye=null;function Ue(e){return ye?{started:!1}:(ye=Lt(e).finally(()=>{ye=null}),{started:!0})}u(Ue,"triggerCompile");async function Kt(e,o){let t={};for(let n of o){let r=await Gt(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}u(Kt,"readKbStats");async function Lt(e){try{let o=await Ne(e,{lenientEnv:!0}),t=await jt({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)}}}u(Lt,"recompileKb");async function oe(e){let o=await et(e),t={ok:!0,detected:!1,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},robot:{configured:!1,appKeys:[]},groups:[],groupBotsStaging:[],groupTableRef:null};if(!o)return t;let n=Mt(o),r=Ft(o),s=r?await Ut(e,r):[],i=n?T(T(o.workflows)?.[n.workflowId]):void 0,l=await Wt(e,T(T(i?.toolkit_config)?.messaging)),d=n?T(T(i?.event_sources)?.[n.eventSourceName]):void 0,p=(await Be(e)).group_table??null;return{ok:!0,detected:!!n&&!!r,workflowId:n?.workflowId??null,eventSourceName:n?.eventSourceName??null,kbRoleId:r,kb:{userCollection:s.find(y=>y!==L)??null,officialOn:s.includes(L),stats:await Kt(e,s)},robot:{configured:l.length>0,appKeys:l},groups:en(d?.conversation_ids),groupBotsStaging:await Ht(e,n?.workflowId??"group-qa"),groupTableRef:p}}u(oe,"readConsoleState");function Mt(e){let o=T(e.workflows);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=T(T(n)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if(T(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}u(Mt,"locateGroupQa");function Ft(e){let o=T(e.roles);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=T(T(n)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}u(Ft,"locateKbRole");var Jt=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)\??\}$/;function De(e){let o=e?.robot_creds;return typeof o!="string"?null:o.trim().match(Jt)?.[1]??null}u(De,"robotEnvKey");async function Wt(e,o){let t=o?.robot_creds;if(v(t))return Object.keys(t);let n=De(o);if(!n)return[];let r=await Xe(e,n);if(!r)return[];try{let s=JSON.parse(r);return v(s)?Object.keys(s):[]}catch{return[]}}u(Wt,"readRobotAppKeys");async function Ke(e,o,t){let n={};for(let l of t){let d=l.appKey.trim(),g=l.clientSecret.trim();!d||!g||(n[d]={client_id:l.clientId.trim()||d,client_secret:g})}if(Object.keys(n).length===0)return{ok:!1,message:"\u81F3\u5C11\u9700\u8981\u4E00\u7EC4\u5B8C\u6574\u7684\u673A\u5668\u4EBA\u51ED\u636E\uFF08AppKey + AppSecret\uFF09"};let r=await et(e),s=T(T(r?.workflows)?.[o]),i=De(T(T(s?.toolkit_config)?.messaging));return i?(await ne({type:"env",file:".env",envKey:i},JSON.stringify(n),e),ve(),{ok:!0,message:`\u5DF2\u4FDD\u5B58 ${Object.keys(n).length} \u4E2A\u673A\u5668\u4EBA\u51ED\u636E`}):{ok:!1,message:`profile.workflows.${o}.toolkit_config.messaging.robot_creds \u9700\u8981\u5199\u6210 env \u5F15\u7528\uFF08\u5982 "\${env.DINGTALK_ROBOTS?}"\uFF09\u624D\u80FD\u7531\u672C\u9875\u5199\u5165\u51ED\u636E\uFF1B\u5BC6\u94A5\u4E0D\u843D profile.yml\u3002`}}u(Ke,"writeRobotCreds");async function Le(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],l=j.join("profile","profile.yml");return await ne({type:"yaml",file:l,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ne({type:"yaml",file:l,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),ve(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}u(Le,"writeGroupList");var Me="GROUP_BOTS_STAGING";async function re(e){let o=await Xe(e,Me);if(!o)return[];try{let t=JSON.parse(o);return Array.isArray(t)?t:[]}catch{return[]}}u(re,"readGroupBotStagingRaw");async function Fe(e,o){await ne({type:"env",file:".env",envKey:Me},JSON.stringify(o),e)}u(Fe,"writeGroupBotStagingRaw");function qt(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}u(qt,"maskBot");async function Ie(e,o,t){let n=t.conversationId.trim();if(!n)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await re(e),s=r.findIndex(d=>d.conversationId===n),i=r[s]??{conversationId:n,title:"",enabled:!0,bot:null},l={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]=l:r.push(l),await Fe(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}u(Ie,"saveGroupBotStaging");async function Ht(e,o){return(await re(e)).map(n=>({...n,bot:qt(n.bot)}))}u(Ht,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function Ae(e){return e instanceof Oe?`${e.guidance}
4
- \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}u(Ae,"provisionErrorMessage");async function Je(){try{return await new _e().getCurrentCorpId()}catch{return}}u(Je,"resolveCurrentCorpId");async function We(e,o,t,n={}){let r=n.provision??new Ot({runner:new _e}),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:Ae(d)}}let l=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(d){if(d instanceof Oe&&d.kind==="bot_already_installed")l=!0;else return{ok:!1,message:Ae(d)}}return await Ie(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:l?"\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"}}u(We,"addEnterpriseBotToGroup");function Yt(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}u(Yt,"stagingToGroupTableRecords");async function se(e,o,t={}){let n=t.artifacts??await V(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 l=u(async()=>{n.ready&&await Fe(o,[])},"clearStaging"),d=await re(o),g=Yt(d);if(g.length===0)return await l(),{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}),y=t.existingGroupIds??(await be(s,i,{dws:p,fields:t.fields})).groups.map(x=>x.groupId),R=g.filter(x=>!y.includes(x.\u7FA4ID??""));if(R.length===0)return await l(),{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),A=new Map(D.map(x=>[x.fieldName,x.fieldId])),X=R.map(x=>{let c={};for(let[a,f]of Object.entries(x)){let m=A.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 l(),{ok:!0,created:R.length,message:`\u5DF2\u5199\u5165 ${R.length} \u6761\u7FA4\u914D\u7F6E`}}u(se,"writeStagingToGroupTable");var _={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function N(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(N).filter(Boolean).join(",");if(v(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""}u(N,"cellToText");function zt(e){if(e==null||e==="")return!0;let o=N(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(o)||(typeof e=="boolean"?e:!1)}u(zt,"cellToEnabled");function Vt(e){let o=N(e);if(o.includes("\u5185\u90E8"))return"internal";if(o.includes("\u5916\u90E8"))return"external"}u(Vt,"cellToGroupType");function Zt(e){if(!v(e))return[];let t=(v(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}u(Zt,"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])),l=u((g,p)=>{if(p in g)return g[p];let y=i.get(p);return y?g[y]:void 0},"readCol"),d=[];for(let g of Zt(s)){let p=v(g.cells)?g.cells:{},y=N(l(p,_.groupId));if(!y)continue;let R=N(l(p,_.appSecret)),D=N(l(p,_.webhookSecret)),A=Vt(l(p,_.groupType));d.push({recordId:String(g.recordId??g.id??""),groupId:y,groupName:N(l(p,_.groupName)),...A?{groupType:A}:{},corpId:N(l(p,_.corpId)),inbound:N(l(p,_.inbound)),outbound:N(l(p,_.outbound)),webhookUrl:N(l(p,_.webhookUrl)),webhookSecret:D?"***":"",appKey:N(l(p,_.appKey)),appSecret:R?"***":"",botNick:N(l(p,_.botNick)),enabled:zt(l(p,_.enabled))})}return{ok:!0,baseId:e,tableId:o,groups:d}}u(be,"readGroupConfigTable");async function qe(e,o,t={}){let n=t.artifacts??await V(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 l=await be(s,i,t);if(l.ok&&l.groups.length===0&&(await re(o)).length>0){let g=await se(e,o,{...t,artifacts:n,existingGroupIds:[]});g.ok&&g.created>0&&(l=await be(s,i,t))}return l}u(qe,"readGroupConfigTableForConsole");async function He(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),l=new Map(i.map(g=>[g.fieldName,g.fieldId])),d={};for(let[g,p]of Object.entries(n)){if(p===void 0)continue;let y=_[g];if(!y)continue;let R=l.get(y)??y;d[R]=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"})}u(He,"updateGroupConfigRecord");var Qt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function Ye(e){if(!e||typeof e!="object")return null;let o=e;for(let t of Qt)if(typeof o[t]=="boolean")return o[t];for(let t of Object.values(o)){let n=Ye(t);if(n!==null)return n}return null}u(Ye,"findAuthBoolean");async function ze(e={}){let o=e.bin??"dws",t=e.runner??((n,r)=>Bt(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=Ye(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)}}}u(ze,"checkDwsAuthStatus");var Ve=j.join(".aitable-workflow","dws-login.log"),Xt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function Ze(e,o={}){let t=j.resolve(e,Ve);await xt(j.dirname(t),{recursive:!0});try{return await we(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)}}}u(Ze,"startDwsDeviceLogin");async function Qe(e){try{return{verifyUrl:(await z(j.resolve(e,Ve),"utf8")).match(Xt)?.[0]??null}}catch{return{verifyUrl:null}}}u(Qe,"readDwsLoginProgress");async function Xe(e,o){let t;try{t=await z(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}u(Xe,"readEnvKey");async function et(e){try{let o=M.parse(await z(j.resolve(e,"profile","profile.yml"),"utf8"));return v(o)?o:null}catch{return null}}u(et,"readProfileDoc");function T(e){return v(e)?e:void 0}u(T,"asRecord");function en(e){return Array.isArray(e)?e.filter(o=>typeof o=="string"):[]}u(en,"toStringArray");function v(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}u(v,"isRecord");import{spawnManagedProcess as tn}from"aitable-workflow-core";function nt(e){let o=nn(e);try{let t=tn({...o,stdio:"ignore",detached:!0});t.child.once("error",()=>tt(e)),t.unref()}catch{tt(e)}}u(nt,"openExternalUrl");function nn(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]}}u(nn,"openInvocation");function tt(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}u(tt,"printFallback");var it=I.dirname(cn(import.meta.url)),yn={".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"},hn=1800*1e3,E={phase:"idle"},S={status:"idle"},Z=Promise.resolve(),bn=12e4,te=new Set,U=class extends Error{constructor(t,n){super(n);this.status=t;this.name="TriggerOnceHttpError"}status;static{u(this,"TriggerOnceHttpError")}},Q=class extends Error{constructor(t,n){super(n);this.status=t;this.name="PromotionHttpError"}status;static{u(this,"PromotionHttpError")}},kn=6e4,ce=!1;function Sn(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}u(Sn,"detectEnvironment");function gt(){let e=I.join(it,"web");if(rt(I.join(e,"index.html")))return e;let o=I.resolve(it,"..","..","..","web","dist");return rt(I.join(o,"index.html"))?o:null}u(gt,"resolveWebRoot");function io(){return gt()!==null}u(io,"hasWebRoot");async function ft(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?ft(e+1).then(t,n):n(new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (8788-8800)"))})})}u(ft,"getAvailablePort");var vn=1024*1024,In=50*1024*1024,mt=I.join(".aitable-workflow","console-access.json");async function wt(e,o){let t=I.join(e,mt);return await ae(I.dirname(t),{recursive:!0}),await Re(t,`${JSON.stringify(o,null,2)}
6
- `,"utf8"),t}u(wt,"writeConsoleAccessFile");function Rn(e){try{an(I.join(e,mt))}catch{}}u(Rn,"clearConsoleAccessFile");async function $(e,o=vn){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)})}u($,"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)}u(w,"sendJson");function b(e,o,t){w(e,{ok:!1,error:t},o)}u(b,"sendError");function F(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}u(F,"maskSensitive");async function ao(e){let o=await ft(8788),t=Sn(),n=dt.randomUUID(),r=t==="remote"?"0.0.0.0":"127.0.0.1",s=gt(),i=e.mode??"setup",l=e.app;if(i==="runtime"&&!l)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 pt(e.configPath),g=I.dirname(d);E={phase:"idle"},S={status:"idle"},Z=Promise.resolve(),te.clear();let p=e.assembleApp?{assembleApp:e.assembleApp,commit:u(a=>{l=a,i="runtime",e.onAppAssembled?.(a)},"commit")}:void 0,y="";e.initialRunStatus&&(S=e.initialRunStatus);let R=null,D=new Promise(a=>R=a),A=null,X=u(()=>{A&&clearTimeout(A),A=setTimeout(()=>{console.log(`
7
- \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),R?.()},hn)},"resetTimeout"),x=on(async(a,f)=>{let m=new URL(a.url??"/",`http://${a.headers.host??"localhost"}`),h=a.headers.origin;if(h){let G=`http://127.0.0.1:${o}`;(h===G||t==="remote")&&f.setHeader("Access-Control-Allow-Origin",h)}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 Tn({url:m,req:a,res:f,configPath:e.configPath,configDir:g,completionResolve:R,setupOptions:e.setupOptions,mode:i,app:l,promotion:p?{...p,access:{configDir:g,url:y,port:o}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(C){let K=C instanceof Error?C.message:String(C);b(f,500,K)}return}if(m.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}An(m,f,s)});await new Promise(a=>x.listen(o,r,a)),X();let c=i==="runtime"?"workbench":"setup";y=t==="local-gui"?`http://127.0.0.1:${o}/${c}?token=${n}`:`http://${ln.hostname()}:${o}/${c}?token=${n}`,await wt(g,{url:y,port:o,mode:i,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Rn(g)),t==="local-gui"?e.open!==!1?(nt(y),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${y}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${y}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${y}`),console.log(`
1
+ import{o as ge,q as fe}from"./chunk-XGHRD4FJ.js";import{a as u}from"./chunk-EI7MMDWY.js";import{createServer as rn}from"http";import{stat as ot,readFile as ie,mkdir as ae,writeFile as Re,rm as sn}from"fs/promises";import{createReadStream as an,existsSync as rt,unlinkSync as cn}from"fs";import R from"path";import{fileURLToPath as ln}from"url";import pt from"crypto";import un from"os";import Te from"yaml";import{runCheck as q,resolveConfigPath as gt,loadSettings as dn,detectCodingEngines as pn,loadWorkflowTemplate as gn,collectEnvRefs as fn,applyConfigSave as mn,ConfigSaveError as wn,runSetupCommand as yn,resolveInsideRoot as Ce,assertPortableId as st}from"aitable-workflow-core";import{mkdir as At,readFile as z,writeFile as Ot}from"fs/promises";import $ from"path";import M from"yaml";import{BotProvisioner as _t,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as _e,fetchFields as Se,loadSettings as Ne,loadWorkflowTemplate as Nt,listDwsConversations as Gt,readState as Bt,resetProfileCache as ve,runCommand as $t,setupKnowledgeBases as jt,writeBack as oe,assertPortableId as Ut}from"aitable-workflow-core";import me from"path";import{closeSync as St,existsSync as Ee,openSync as vt}from"fs";import{createExecShellToolkit as It,createStandaloneExecShellToolkit as Rt,loadSettings as Tt,logger as Ct,resolveConfigPath as Pt,spawnManagedProcess as Et}from"aitable-workflow-core";async function xt(e,o){let t=await Pt(e);if(!Ee(t))return{shell:Rt(o,{configDir:me.dirname(t)}),mode:"standalone",bins:{},configPath:t};let n=await Tt(e),r=n.raw?.toolkit_config?.shell??{};return{shell:It(n,o),mode:"project",bins:r.bins??{},configPath:t}}u(xt,"createToolkitForExec");async function we(e,o,t){let n=me.resolve(t.logFile),r=me.dirname(n);if(!Ee(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=vt(n,"w"),l;try{return l=Et({command:s,args:o,stdio:["ignore",i,i]}),await new Promise((d,p)=>{let g=l.child,y=u(v=>p(v),"onError");g.once("error",y),g.once("spawn",()=>{g.removeListener("error",y),d()})}),l.unref(),{pid:l.child.pid,logFile:n}}finally{St(i)}}u(we,"runDetached");function Bn(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&&Ct.setLevel("warn");let l=await xt(n.config,r);if(l.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:p,logFile:g}=await we(r,s,{bins:l.bins,logFile:n.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${p}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${g}`),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 p=await l.shell.runJson(r,s,{timeoutMs:i});console.log(JSON.stringify(p??{},null,2));return}let d=await l.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)}})}u(Bn,"registerExecCommand");async function Ge(e={}){let o=e.list??Gt;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)}}}u(Ge,"listAdminGroups");async function V(e,o){let t={};try{let l=await Ne(e,{lenientEnv:!0});for(let d of l.workflowEntries)try{let g=(await Nt(d.templatePath,{envSource:l.envSource})).tracker;if(!g)continue;t[d.id]={baseId:String(g.base_id??"").trim(),tableId:String(g.table_id??"").trim(),...g.label?{label:String(g.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(l=>l.baseId&&l.tableId)&&s.every(l=>l.baseId&&l.tableId):r.some(l=>l.baseId&&l.tableId),trackers:t,configTables:n}}u(V,"readSetupArtifacts");async function Be(e){let o={},t=$.resolve(e,"profile","profile.yml"),n;try{n=M.parse(await z(t,"utf8"))}catch{return o}let r=I(n)?n.workflows:void 0;if(!I(r))return o;for(let s of Object.values(r)){let i=I(s)?s.steps:void 0;if(I(i)){for(let l of Object.values(i))if(I(l))for(let[d,p]of Object.entries(l)){if(!I(p))continue;let g="baseId"in p||"base_id"in p,y="tableId"in p||"table_id"in p;!g||!y||(o[d]={baseId:String(p.baseId??p.base_id??"").trim(),tableId:String(p.tableId??p.table_id??"").trim()})}}}return o}u(Be,"readProfileConfigTables");var L="wiki/official-aitable-faq";async function Dt(e,o){let t=$.resolve(e,"profile","profile.yml"),n;try{n=M.parse(await z(t,"utf8"))}catch{return[]}let r=I(n)?n.roles:void 0,s=I(r)?r[o]:void 0,i=I(s)?s.knowledge_scope:void 0,l=I(i)?i.kb_collections:void 0;return Array.isArray(l)?l.map(d=>typeof d=="string"?d:I(d)&&typeof d.collection=="string"?d.collection:null).filter(d=>d!==null):[]}u(Dt,"readRoleCollections");function xe(e){if(M.isScalar(e))return typeof e.value=="string"?e.value:null;if(M.isMap(e)){let o=e.get("collection",!0);return M.isScalar(o)&&typeof o.value=="string"?o.value:null}return null}u(xe,"kbEntryValue");async function Kt(e,o,t){let n=$.resolve(e,"profile","profile.yml"),r;try{r=await z(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=M.parseDocument(r),i=s.getIn(["roles",o,"knowledge_scope","kb_collections"],!0);if(!M.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${o}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let l=i.items.map(xe).filter(g=>g!==null),d=l.includes(L),p=l.find(g=>g!==L)??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:l,changed:!1};if(!t&&!p)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:l,changed:!1};if(t)i.add(L);else{let g=i.items.findIndex(y=>xe(y)===L);g>=0&&i.delete(g)}return await Ot(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?[...l,L]:l.filter(g=>g!==L)}}u(Kt,"writeOfficialToggle");async function $e(e,o,t,n){Ut(t,{label:"roleId"});let r=await Kt(o,t,n);if(!r.ok)return{...r,compile:void 0};ve();let s=n&&r.changed?Ue(e):void 0;return{...r,compile:s}}u($e,"setOfficialKbEnabled");function je(e){return{ok:!0,...Ue(e)}}u(je,"recompileKnowledgeBases");var ye=null;function Ue(e){return ye?{started:!1}:(ye=Mt(e).finally(()=>{ye=null}),{started:!0})}u(Ue,"triggerCompile");async function Lt(e,o){let t={};for(let n of o){let r=await Bt(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}u(Lt,"readKbStats");async function Mt(e){try{let o=await Ne(e,{lenientEnv:!0}),t=await jt({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)}}}u(Mt,"recompileKb");async function te(e){let o=await et(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},robot:{configured:!1,appKeys:[]},groups:[],groupBotsStaging:[],groupTableRef:null};if(!o)return t;let n=Ft(o),r=Jt(o),s=n&&r?"group-qa":null,i=r?await Dt(e,r):[],l=n?T(T(o.workflows)?.[n.workflowId]):void 0,d=await qt(e,T(T(l?.toolkit_config)?.messaging)),p=n?T(T(l?.event_sources)?.[n.eventSourceName]):void 0,y=(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(v=>v!==L)??null,officialOn:i.includes(L),stats:await Lt(e,i)},robot:{configured:d.length>0,appKeys:d},groups:tn(p?.conversation_ids),groupBotsStaging:await Yt(e,n?.workflowId??"group-qa"),groupTableRef:y}}u(te,"readConsoleState");function Ft(e){let o=T(e.workflows);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=T(T(n)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if(T(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}u(Ft,"locateGroupQa");function Jt(e){let o=T(e.roles);if(!o)return null;for(let[t,n]of Object.entries(o)){let r=T(T(n)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}u(Jt,"locateKbRole");var Wt=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)\??\}$/;function De(e){let o=e?.robot_creds;return typeof o!="string"?null:o.trim().match(Wt)?.[1]??null}u(De,"robotEnvKey");async function qt(e,o){let t=o?.robot_creds;if(I(t))return Object.keys(t);let n=De(o);if(!n)return[];let r=await Xe(e,n);if(!r)return[];try{let s=JSON.parse(r);return I(s)?Object.keys(s):[]}catch{return[]}}u(qt,"readRobotAppKeys");async function Ke(e,o,t){let n={};for(let l of t){let d=l.appKey.trim(),p=l.clientSecret.trim();!d||!p||(n[d]={client_id:l.clientId.trim()||d,client_secret:p})}if(Object.keys(n).length===0)return{ok:!1,message:"\u81F3\u5C11\u9700\u8981\u4E00\u7EC4\u5B8C\u6574\u7684\u673A\u5668\u4EBA\u51ED\u636E\uFF08AppKey + AppSecret\uFF09"};let r=await et(e),s=T(T(r?.workflows)?.[o]),i=De(T(T(s?.toolkit_config)?.messaging));return i?(await oe({type:"env",file:".env",envKey:i},JSON.stringify(n),e),ve(),{ok:!0,message:`\u5DF2\u4FDD\u5B58 ${Object.keys(n).length} \u4E2A\u673A\u5668\u4EBA\u51ED\u636E`}):{ok:!1,message:`profile.workflows.${o}.toolkit_config.messaging.robot_creds \u9700\u8981\u5199\u6210 env \u5F15\u7528\uFF08\u5982 "\${env.DINGTALK_ROBOTS?}"\uFF09\u624D\u80FD\u7531\u672C\u9875\u5199\u5165\u51ED\u636E\uFF1B\u5BC6\u94A5\u4E0D\u843D profile.yml\u3002`}}u(Ke,"writeRobotCreds");async function Le(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],l=$.join("profile","profile.yml");return await oe({type:"yaml",file:l,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await oe({type:"yaml",file:l,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),ve(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}u(Le,"writeGroupList");var Me="GROUP_BOTS_STAGING";async function re(e){let o=await Xe(e,Me);if(!o)return[];try{let t=JSON.parse(o);return Array.isArray(t)?t:[]}catch{return[]}}u(re,"readGroupBotStagingRaw");async function Fe(e,o){await oe({type:"env",file:".env",envKey:Me},JSON.stringify(o),e)}u(Fe,"writeGroupBotStagingRaw");function Ht(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}u(Ht,"maskBot");async function Ie(e,o,t){let n=t.conversationId.trim();if(!n)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await re(e),s=r.findIndex(d=>d.conversationId===n),i=r[s]??{conversationId:n,title:"",enabled:!0,bot:null},l={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]=l:r.push(l),await Fe(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}u(Ie,"saveGroupBotStaging");async function Yt(e,o){return(await re(e)).map(n=>({...n,bot:Ht(n.bot)}))}u(Yt,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function Ae(e){return e instanceof Oe?`${e.guidance}
4
+ \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}u(Ae,"provisionErrorMessage");async function Je(){try{return await new _e().getCurrentCorpId()}catch{return}}u(Je,"resolveCurrentCorpId");async function We(e,o,t,n={}){let r=n.provision??new _t({runner:new _e}),s=$.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(d){return{ok:!1,message:Ae(d)}}let l=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(d){if(d instanceof Oe&&d.kind==="bot_already_installed")l=!0;else return{ok:!1,message:Ae(d)}}return await Ie(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:l?"\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"}}u(We,"addEnterpriseBotToGroup");function zt(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}u(zt,"stagingToGroupTableRecords");async function se(e,o,t={}){let n=t.artifacts??await V(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 l=u(async()=>{n.ready&&await Fe(o,[])},"clearStaging"),d=await re(o),p=zt(d);if(p.length===0)return await l(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let g=t.dws??new ke({bin:"dws",timeoutMs:9e4}),y=t.existingGroupIds??(await be(s,i,{dws:g,fields:t.fields})).groups.map(x=>x.groupId),v=p.filter(x=>!y.includes(x.\u7FA4ID??""));if(v.length===0)return await l(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let D=t.fields??await Se(g,s,i),A=new Map(D.map(x=>[x.fieldName,x.fieldId])),X=v.map(x=>{let c={};for(let[a,f]of Object.entries(x)){let m=A.get(a);m&&(c[m]=f)}return{cells:c}});return await g.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await l(),{ok:!0,created:v.length,message:`\u5DF2\u5199\u5165 ${v.length} \u6761\u7FA4\u914D\u7F6E`}}u(se,"writeStagingToGroupTable");var _={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function N(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(N).filter(Boolean).join(",");if(I(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""}u(N,"cellToText");function Vt(e){if(e==null||e==="")return!0;let o=N(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(o)||(typeof e=="boolean"?e:!1)}u(Vt,"cellToEnabled");function Zt(e){let o=N(e);if(o.includes("\u5185\u90E8"))return"internal";if(o.includes("\u5916\u90E8"))return"external"}u(Zt,"cellToGroupType");function Qt(e){if(!I(e))return[];let t=(I(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}u(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(p=>[p.fieldName,p.fieldId])),l=u((p,g)=>{if(g in p)return p[g];let y=i.get(g);return y?p[y]:void 0},"readCol"),d=[];for(let p of Qt(s)){let g=I(p.cells)?p.cells:{},y=N(l(g,_.groupId));if(!y)continue;let v=N(l(g,_.appSecret)),D=N(l(g,_.webhookSecret)),A=Zt(l(g,_.groupType));d.push({recordId:String(p.recordId??p.id??""),groupId:y,groupName:N(l(g,_.groupName)),...A?{groupType:A}:{},corpId:N(l(g,_.corpId)),inbound:N(l(g,_.inbound)),outbound:N(l(g,_.outbound)),webhookUrl:N(l(g,_.webhookUrl)),webhookSecret:D?"***":"",appKey:N(l(g,_.appKey)),appSecret:v?"***":"",botNick:N(l(g,_.botNick)),enabled:Vt(l(g,_.enabled))})}return{ok:!0,baseId:e,tableId:o,groups:d}}u(be,"readGroupConfigTable");async function qe(e,o,t={}){let n=t.artifacts??await V(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 l=await be(s,i,t);if(l.ok&&l.groups.length===0&&(await re(o)).length>0){let p=await se(e,o,{...t,artifacts:n,existingGroupIds:[]});p.ok&&p.created>0&&(l=await be(s,i,t))}return l}u(qe,"readGroupConfigTableForConsole");async function He(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),l=new Map(i.map(p=>[p.fieldName,p.fieldId])),d={};for(let[p,g]of Object.entries(n)){if(g===void 0)continue;let y=_[p];if(!y)continue;let v=l.get(y)??y;d[v]=g}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"})}u(He,"updateGroupConfigRecord");var Xt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function Ye(e){if(!e||typeof e!="object")return null;let o=e;for(let t of Xt)if(typeof o[t]=="boolean")return o[t];for(let t of Object.values(o)){let n=Ye(t);if(n!==null)return n}return null}u(Ye,"findAuthBoolean");async function ze(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=Ye(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)}}}u(ze,"checkDwsAuthStatus");var Ve=$.join(".aitable-workflow","dws-login.log"),en=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function Ze(e,o={}){let t=$.resolve(e,Ve);await At($.dirname(t),{recursive:!0});try{return await we(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)}}}u(Ze,"startDwsDeviceLogin");async function Qe(e){try{return{verifyUrl:(await z($.resolve(e,Ve),"utf8")).match(en)?.[0]??null}}catch{return{verifyUrl:null}}}u(Qe,"readDwsLoginProgress");async function Xe(e,o){let t;try{t=await z($.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}u(Xe,"readEnvKey");async function et(e){try{let o=M.parse(await z($.resolve(e,"profile","profile.yml"),"utf8"));return I(o)?o:null}catch{return null}}u(et,"readProfileDoc");function T(e){return I(e)?e:void 0}u(T,"asRecord");function tn(e){return Array.isArray(e)?e.filter(o=>typeof o=="string"):[]}u(tn,"toStringArray");function I(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}u(I,"isRecord");import{spawnManagedProcess as nn}from"aitable-workflow-core";function nt(e){let o=on(e);try{let t=nn({...o,stdio:"ignore",detached:!0});t.child.once("error",()=>tt(e)),t.unref()}catch{tt(e)}}u(nt,"openExternalUrl");function on(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]}}u(on,"openInvocation");function tt(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}u(tt,"printFallback");function it(e){return e?`workbench/${e}`:"setup"}u(it,"consoleStartPath");var at=R.dirname(ln(import.meta.url)),hn={".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"},bn=1800*1e3,E={phase:"idle"},S={status:"idle"},Z=Promise.resolve(),kn=12e4,ne=new Set,U=class extends Error{constructor(t,n){super(n);this.status=t;this.name="TriggerOnceHttpError"}status;static{u(this,"TriggerOnceHttpError")}},Q=class extends Error{constructor(t,n){super(n);this.status=t;this.name="PromotionHttpError"}status;static{u(this,"PromotionHttpError")}},Sn=6e4,ce=!1;function vn(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}u(vn,"detectEnvironment");function ft(){let e=R.join(at,"web");if(rt(R.join(e,"index.html")))return e;let o=R.resolve(at,"..","..","..","web","dist");return rt(R.join(o,"index.html"))?o:null}u(ft,"resolveWebRoot");function ao(){return ft()!==null}u(ao,"hasWebRoot");async function mt(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?mt(e+1).then(t,n):n(new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (8788-8800)"))})})}u(mt,"getAvailablePort");var In=1024*1024,Rn=50*1024*1024,wt=R.join(".aitable-workflow","console-access.json");async function yt(e,o){let t=R.join(e,wt);return await ae(R.dirname(t),{recursive:!0}),await Re(t,`${JSON.stringify(o,null,2)}
6
+ `,"utf8"),t}u(yt,"writeConsoleAccessFile");function Tn(e){try{cn(R.join(e,wt))}catch{}}u(Tn,"clearConsoleAccessFile");async function j(e,o=In){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)})}u(j,"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)}u(w,"sendJson");function b(e,o,t){w(e,{ok:!1,error:t},o)}u(b,"sendError");function F(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}u(F,"maskSensitive");async function co(e){let o=await mt(8788),t=vn(),n=pt.randomUUID(),r=t==="remote"?"0.0.0.0":"127.0.0.1",s=ft(),i=e.mode??"setup",l=e.app;if(i==="runtime"&&!l)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 gt(e.configPath),p=R.dirname(d);E={phase:"idle"},S={status:"idle"},Z=Promise.resolve(),ne.clear();let g=e.assembleApp?{assembleApp:e.assembleApp,commit:u(a=>{l=a,i="runtime",e.onAppAssembled?.(a)},"commit")}:void 0,y="";e.initialRunStatus&&(S=e.initialRunStatus);let v=null,D=new Promise(a=>v=a),A=null,X=u(()=>{A&&clearTimeout(A),A=setTimeout(()=>{console.log(`
7
+ \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),v?.()},bn)},"resetTimeout"),x=rn(async(a,f)=>{let m=new URL(a.url??"/",`http://${a.headers.host??"localhost"}`),h=a.headers.origin;if(h){let G=`http://127.0.0.1:${o}`;(h===G||t==="remote")&&f.setHeader("Access-Control-Allow-Origin",h)}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 Cn({url:m,req:a,res:f,configPath:e.configPath,configDir:p,completionResolve:v,setupOptions:e.setupOptions,mode:i,app:l,promotion:g?{...g,access:{configDir:p,url:y,port:o}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(P){let K=P instanceof Error?P.message:String(P);b(f,500,K)}return}if(m.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}On(m,f,s)});await new Promise(a=>x.listen(o,r,a)),X();let c=(await te(p).catch(()=>null))?.scenario??null;y=t==="local-gui"?`http://127.0.0.1:${o}/${it(c)}?token=${n}`:`http://${un.hostname()}:${o}/${it(c)}?token=${n}`,await yt(p,{url:y,port:o,mode:i,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Tn(p)),t==="local-gui"?e.open!==!1?(nt(y),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${y}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${y}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${y}`),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 ${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
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 D,A&&clearTimeout(A),x.close()}u(ao,"runConfigUI");async function Tn(e){let{url:o,req:t,res:n,configPath:r,configDir:s,completionResolve:i,setupOptions:l,mode:d,app:g,promotion:p,exitOnSetupError:y}=e;if(t.method==="GET"&&o.pathname==="/dev/config/check"){let c=await q({configPath:r});w(n,F(c));return}if(t.method==="GET"&&o.pathname==="/dev/config/enriched"){let c=await q({configPath:r}),a=dn(),f=await un(r),m={},h={},G=new Set,C=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let k=await pt(r),O=await ie(k,"utf8");for(let J of gn([O]))G.add(J)}catch{}try{let k=await ie(I.join(s,"profile","profile.yml"),"utf8"),O=Te.parse(k),J=O?.workflows;if(J&&typeof J=="object"&&(h=J),O&&typeof O=="object"){let{workflows:Ce,...H}=O;for(let ee of JSON.stringify(H).matchAll(C))G.add(ee[1])}}catch{}for(let k of f.workflowEntries)try{let O=await pn(k.templatePath),J=O.steps.map(P=>({id:P.id,name:P.name,recipe:P.recipe,engine:P.engine,auto:P.auto})),Ce=O.edges.filter(P=>P.from!=="__start__"&&P.to!=="__end__").map(P=>({from:P.from,to:P.to,condition:P.condition})),H={},ee=new Set,W;try{W=Te.parse(await ie(k.templatePath,"utf8"))}catch{}if(W){for(let B of JSON.stringify(W).matchAll(C))ee.add(B[1]);let P=h[k.id];if(P&&typeof P=="object")for(let B of JSON.stringify(P).matchAll(C))ee.add(B[1]);let yt=Array.isArray(W.steps)?W.steps:[];for(let B=0;B<O.steps.length;B++){let ue=O.steps[B],Y=yt[B];if(Y){let de=JSON.stringify(Y),pe=new Set;for(let bt of de.matchAll(C))pe.add(bt[1]);pe.size>0&&(H[ue.id]=[...pe])}}let ht=Array.isArray(W.event_sources)?W.event_sources:[];for(let B of ht)if(B){let ue=JSON.stringify(B),Y=new Set;for(let de of ue.matchAll(C))Y.add(de[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}m[k.id]={steps:J,edges:Ce,stepEnvRefs:H,envRefs:[...ee].sort()}}catch{m[k.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let K=new Set;for(let k of Object.values(m))for(let O of k.envRefs??[])K.add(O);let le=c.modules.find(k=>k.id==="env");for(let k of le?.items??[])k.writeTarget?.type==="env"&&!K.has(k.key)&&G.add(k.key);w(n,{config:F(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 fn(c,s,r);w(n,{ok:!0,written:a.written,recheck:F(a.recheck)})}catch(a){if(a instanceof mn){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{st(c.roleId,{label:"roleId"})}catch(G){b(n,400,G instanceof Error?G.message:"roleId \u4E0D\u5408\u6CD5");return}let a=I.resolve(s,"roles",`${c.roleId}.role.yml`),f=await fe(a,c.roleId),m=await ge({source:c.source,collectionName:f,configDir:s}),h=await q({configPath:r});w(n,{ok:m.success,message:m.message,recheck:F(h)});return}if(t.method==="POST"&&o.pathname==="/dev/kb/upload"){let c=await $(t,In);if(!c.roleId||!Array.isArray(c.files)||c.files.length===0){b(n,400,"roleId and files are required");return}try{st(c.roleId,{label:"roleId"})}catch(h){b(n,400,h instanceof Error?h.message:"roleId \u4E0D\u5408\u6CD5");return}let a=I.resolve(s,"roles",`${c.roleId}.role.yml`),f=await fe(a,c.roleId),m=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ae(m,{recursive:!0});for(let C of c.files){let K;try{K=Pe(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 le=I.dirname(K);await ae(le,{recursive:!0});let k=C.encoding==="base64"?Buffer.from(C.content,"base64"):Buffer.from(C.content,"utf8");await Re(K,k)}let h=await ge({source:m,collectionName:f,configDir:s}),G=await q({configPath:r});w(n,{ok:h.success,message:h.message,recheck:F(G)})}finally{await rn(m,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&o.pathname==="/dev/file/read"){let c=o.searchParams.get("path")??"",a=ut(c,s);if(!a){b(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${c}`);return}try{let f=await ie(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=ut(a,s);if(!f||typeof c.content!="string"){b(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${a}`);return}let m=En(a,c.content);if(m){w(n,{ok:!1,error:m},400);return}await ae(I.dirname(f),{recursive:!0}),await Re(f,c.content.endsWith(`
13
+ `)),await D,A&&clearTimeout(A),x.close()}u(co,"runConfigUI");async function Cn(e){let{url:o,req:t,res:n,configPath:r,configDir:s,completionResolve:i,setupOptions:l,mode:d,app:p,promotion:g,exitOnSetupError:y}=e;if(t.method==="GET"&&o.pathname==="/dev/config/check"){let c=await q({configPath:r});w(n,F(c));return}if(t.method==="GET"&&o.pathname==="/dev/config/enriched"){let c=await q({configPath:r}),a=pn(),f=await dn(r),m={},h={},G=new Set,P=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let k=await gt(r),O=await ie(k,"utf8");for(let J of fn([O]))G.add(J)}catch{}try{let k=await ie(R.join(s,"profile","profile.yml"),"utf8"),O=Te.parse(k),J=O?.workflows;if(J&&typeof J=="object"&&(h=J),O&&typeof O=="object"){let{workflows:Pe,...H}=O;for(let ee of JSON.stringify(H).matchAll(P))G.add(ee[1])}}catch{}for(let k of f.workflowEntries)try{let O=await gn(k.templatePath),J=O.steps.map(C=>({id:C.id,name:C.name,recipe:C.recipe,engine:C.engine,auto:C.auto})),Pe=O.edges.filter(C=>C.from!=="__start__"&&C.to!=="__end__").map(C=>({from:C.from,to:C.to,condition:C.condition})),H={},ee=new Set,W;try{W=Te.parse(await ie(k.templatePath,"utf8"))}catch{}if(W){for(let B of JSON.stringify(W).matchAll(P))ee.add(B[1]);let C=h[k.id];if(C&&typeof C=="object")for(let B of JSON.stringify(C).matchAll(P))ee.add(B[1]);let ht=Array.isArray(W.steps)?W.steps:[];for(let B=0;B<O.steps.length;B++){let ue=O.steps[B],Y=ht[B];if(Y){let de=JSON.stringify(Y),pe=new Set;for(let kt of de.matchAll(P))pe.add(kt[1]);pe.size>0&&(H[ue.id]=[...pe])}}let bt=Array.isArray(W.event_sources)?W.event_sources:[];for(let B of bt)if(B){let ue=JSON.stringify(B),Y=new Set;for(let de of ue.matchAll(P))Y.add(de[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}m[k.id]={steps:J,edges:Pe,stepEnvRefs:H,envRefs:[...ee].sort()}}catch{m[k.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let K=new Set;for(let k of Object.values(m))for(let O of k.envRefs??[])K.add(O);let le=c.modules.find(k=>k.id==="env");for(let k of le?.items??[])k.writeTarget?.type==="env"&&!K.has(k.key)&&G.add(k.key);w(n,{config:F(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 j(t);try{let a=await mn(c,s,r);w(n,{ok:!0,written:a.written,recheck:F(a.recheck)})}catch(a){if(a instanceof wn){b(n,a.status,a.message);return}throw a}return}if(t.method==="POST"&&o.pathname==="/dev/kb/ingest"){let c=await j(t);if(!c.roleId||!c.source){b(n,400,"roleId and source are required");return}try{st(c.roleId,{label:"roleId"})}catch(G){b(n,400,G instanceof Error?G.message:"roleId \u4E0D\u5408\u6CD5");return}let a=R.resolve(s,"roles",`${c.roleId}.role.yml`),f=await fe(a,c.roleId),m=await ge({source:c.source,collectionName:f,configDir:s}),h=await q({configPath:r});w(n,{ok:m.success,message:m.message,recheck:F(h)});return}if(t.method==="POST"&&o.pathname==="/dev/kb/upload"){let c=await j(t,Rn);if(!c.roleId||!Array.isArray(c.files)||c.files.length===0){b(n,400,"roleId and files are required");return}try{st(c.roleId,{label:"roleId"})}catch(h){b(n,400,h instanceof Error?h.message:"roleId \u4E0D\u5408\u6CD5");return}let a=R.resolve(s,"roles",`${c.roleId}.role.yml`),f=await fe(a,c.roleId),m=R.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ae(m,{recursive:!0});for(let P of c.files){let K;try{K=Ce(m,P.relativePath,{allowRoot:!1})}catch{b(n,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${P.relativePath}`);return}let le=R.dirname(K);await ae(le,{recursive:!0});let k=P.encoding==="base64"?Buffer.from(P.content,"base64"):Buffer.from(P.content,"utf8");await Re(K,k)}let h=await ge({source:m,collectionName:f,configDir:s}),G=await q({configPath:r});w(n,{ok:h.success,message:h.message,recheck:F(G)})}finally{await sn(m,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&o.pathname==="/dev/file/read"){let c=o.searchParams.get("path")??"",a=dt(c,s);if(!a){b(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${c}`);return}try{let f=await ie(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 j(t),a=typeof c.path=="string"?c.path:"",f=dt(a,s);if(!f||typeof c.content!="string"){b(n,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${a}`);return}let m=xn(a,c.content);if(m){w(n,{ok:!1,error:m},400);return}await ae(R.dirname(f),{recursive:!0}),await Re(f,c.content.endsWith(`
14
14
  `)?c.content:c.content+`
15
- `,"utf8");let h=await q({configPath:r});w(n,{ok:!0,recheck:F(h)});return}if(t.method==="POST"&&o.pathname==="/dev/setup/complete"){if(E.phase==="running"){b(n,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}E={phase:"running",logs:[]},w(n,{ok:!0});let c=u(async()=>{try{let a=await se(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 wn({config:r,...l??{}}),await c();let a=await V(r,s),f=xn(a),m={mode:d};if(d==="setup"&&p){let h=await ct({configPath:r,...p});m=h.ok?{mode:"runtime"}:{mode:"setup",promotionError:h.error}}E={phase:"done",artifacts:a,baseUrl:f,...m}}catch(a){E={phase:"error",message:a instanceof Error?a.message:String(a)},y&&i?.()}})();return}if(t.method==="GET"&&o.pathname==="/dev/setup/progress"){w(n,E);return}if(t.method==="GET"&&o.pathname==="/dev/setup/artifacts"){w(n,await V(r,s));return}if(t.method==="GET"&&o.pathname==="/dev/console/state"){w(n,await oe(s));return}if(t.method==="POST"&&o.pathname==="/dev/console/robot"){let c=await $(t);if(!c.workflowId||!Array.isArray(c.creds)){b(n,400,"workflowId \u4E0E creds \u5FC5\u586B");return}let a=await Ke(s,c.workflowId,c.creds),f=await q({configPath:r});w(n,{...a,recheck:F(f)},a.ok?200:400);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 Le(s,c.workflowId,c.eventSourceName,c.conversationIds),f=await q({configPath:r});w(n,{...a,recheck:F(f)});return}if(t.method==="GET"&&o.pathname==="/dev/console/admin-groups"){w(n,await Ge());return}if(t.method==="GET"&&o.pathname==="/dev/console/dws-auth"){w(n,await ze());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 Qe(s));return}let R=o.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&R){let c=decodeURIComponent(R[1]),a=await $(t),f=await oe(s),m=await We(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 oe(s),m=await Je(),h=await Ie(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,h,h.ok?200:400);return}if(t.method==="GET"&&o.pathname==="/dev/console/group-config-table"){try{w(n,await qe(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 se(r,s);w(n,c,c.ok?200:400);return}let A=o.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&A){let c=decodeURIComponent(A[1]),a=await $(t),m=(await V(r,s)).configTables.group_table;if(!m?.baseId||!m.tableId){b(n,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let h=await He(m.baseId,m.tableId,c,a);w(n,h,h.ok?200:400)}catch(h){b(n,502,h instanceof Error?h.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(E.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 ct({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 Q?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,...at()});return}let x={"/dev/run/start":"start","/dev/run/stop":"stop"}[o.pathname];if(t.method==="POST"&&x){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 Pn(x,g);w(n,{...c,status:at()});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 Cn(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")}u(Tn,"handleDevApi");function at(){return S}u(at,"getRuntimeRunStatus");async function Pn(e,o){let t=dt.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},Z=Z.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},Z=Z.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}}u(Pn,"handleRuntimeRunControl");async function Cn(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(l=>l.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(te.has(e))throw new U(409,`\u5DE5\u4F5C\u6D41 "${e}" \u6B63\u5728\u89E6\u53D1\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210`);te.add(e);let n=new AbortController,r=null,s=t.timeoutMs??bn;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)}),l=await Promise.race([o.triggerWorkflowOnce(e,{signal:n.signal}),i]);return{workflowId:e,...l}}catch(i){throw i instanceof U?i:new U(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),te.delete(e)}}u(Cn,"handleTriggerWorkflowOnce");function co(){te.clear()}u(co,"resetTriggerOnceForTest");async function ct(e,o={}){if(ce)throw new Q(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");ce=!0;let t=o.timeoutMs??kn,n=null;try{let r=new Promise((i,l)=>{n=setTimeout(()=>l(new Q(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 wt(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 lt({ok:!0,mode:"runtime"}),{ok:!0,mode:"runtime"}}catch(r){let s=r instanceof Q?r.status:500,i=r instanceof Error?r.message:String(r);console.error(`[console] setup\u2192runtime \u664B\u5347\u5931\u8D25: ${i}`);let l={ok:!1,mode:"setup",status:s,error:i};return lt(l),l}finally{n&&clearTimeout(n),ce=!1}}u(ct,"handleConsolePromotion");function lt(e){if(E.phase==="done")if(e.ok){let{promotionError:o,...t}=E;E={...t,mode:"runtime"}}else E={...E,mode:"setup",promotionError:e.error}}u(lt,"applyPromotionToDoneProgress");function lo(){S={status:"idle"},Z=Promise.resolve()}u(lo,"resetRuntimeRunStatusForTest");function uo(){ce=!1,E={phase:"idle"},S={status:"idle"}}u(uo,"resetPromotionForTest");function po(e){E=e}u(po,"setSetupProgressForTest");function go(){return E}u(go,"getSetupProgressForTest");function ut(e,o){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Pe(o,t,{allowRoot:!1})}catch{return null}}u(ut,"resolveInsideConfigDir");function En(e,o){try{return/\.json$/i.test(e)?JSON.parse(o):Te.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)}`}}u(En,"validateStructuredText");function xn(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}u(xn,"deriveBaseUrl");async function An(e,o,t){let n;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";n=Pe(t,i,{allowRoot:!1})}catch{o.writeHead(403),o.end("Forbidden");return}try{(await ot(n)).isDirectory()&&(n=I.join(n,"index.html"))}catch{n=I.join(t,"index.html")}try{await ot(n)}catch{o.writeHead(404),o.end("Not Found");return}let r=I.extname(n),s=yn[r]??"application/octet-stream";o.writeHead(200,{"Content-Type":s}),sn(n).pipe(o)}u(An,"serveStatic");export{Gn as a,nt as b,U as c,Q as d,Sn as e,gt as f,io as g,mt as h,wt as i,Rn as j,ao as k,at as l,Pn as m,Cn as n,co as o,ct as p,lo as q,uo as r,po as s,go as t,An as u};
15
+ `,"utf8");let h=await q({configPath:r});w(n,{ok:!0,recheck:F(h)});return}if(t.method==="POST"&&o.pathname==="/dev/setup/complete"){if(E.phase==="running"){b(n,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}E={phase:"running",logs:[]},w(n,{ok:!0});let c=u(async()=>{try{let a=await se(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 yn({config:r,...l??{}}),await c();let a=await V(r,s),f=An(a),m={mode:d};if(d==="setup"&&g){let h=await lt({configPath:r,...g});m=h.ok?{mode:"runtime"}:{mode:"setup",promotionError:h.error}}E={phase:"done",artifacts:a,baseUrl:f,...m}}catch(a){E={phase:"error",message:a instanceof Error?a.message:String(a)},y&&i?.()}})();return}if(t.method==="GET"&&o.pathname==="/dev/setup/progress"){w(n,E);return}if(t.method==="GET"&&o.pathname==="/dev/setup/artifacts"){w(n,await V(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/robot"){let c=await j(t);if(!c.workflowId||!Array.isArray(c.creds)){b(n,400,"workflowId \u4E0E creds \u5FC5\u586B");return}let a=await Ke(s,c.workflowId,c.creds),f=await q({configPath:r});w(n,{...a,recheck:F(f)},a.ok?200:400);return}if(t.method==="POST"&&o.pathname==="/dev/console/groups"){let c=await j(t);if(!c.workflowId||!c.eventSourceName||!Array.isArray(c.conversationIds)){b(n,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let a=await Le(s,c.workflowId,c.eventSourceName,c.conversationIds),f=await q({configPath:r});w(n,{...a,recheck:F(f)});return}if(t.method==="GET"&&o.pathname==="/dev/console/admin-groups"){w(n,await Ge());return}if(t.method==="GET"&&o.pathname==="/dev/console/dws-auth"){w(n,await ze());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 Qe(s));return}let v=o.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&v){let c=decodeURIComponent(v[1]),a=await j(t),f=await te(s),m=await We(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 j(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 Je(),h=await Ie(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,h,h.ok?200:400);return}if(t.method==="GET"&&o.pathname==="/dev/console/group-config-table"){try{w(n,await qe(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 se(r,s);w(n,c,c.ok?200:400);return}let A=o.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&A){let c=decodeURIComponent(A[1]),a=await j(t),m=(await V(r,s)).configTables.group_table;if(!m?.baseId||!m.tableId){b(n,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let h=await He(m.baseId,m.tableId,c,a);w(n,h,h.ok?200:400)}catch(h){b(n,502,h instanceof Error?h.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&o.pathname==="/dev/kb/official"){let c=await j(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 $e(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 je(r);w(n,c);return}if(t.method==="GET"&&o.pathname==="/dev/console/mode"){w(n,{ok:!0,mode:d,promotable:d==="setup"&&!!g});return}if(t.method==="POST"&&o.pathname==="/dev/console/promote"){if(d==="runtime"){w(n,{ok:!0,mode:"runtime"});return}if(!g){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(E.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 lt({configPath:r,...g});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 Q?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,...ct()});return}let x={"/dev/run/start":"start","/dev/run/stop":"stop"}[o.pathname];if(t.method==="POST"&&x){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 Pn(x,p);w(n,{...c,status:ct()});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 j(t)}catch(a){b(n,400,a instanceof Error?a.message:String(a));return}try{let a=await En(String(c.workflowId??""),p);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")}u(Cn,"handleDevApi");function ct(){return S}u(ct,"getRuntimeRunStatus");async function Pn(e,o){let t=pt.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},Z=Z.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},Z=Z.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}}u(Pn,"handleRuntimeRunControl");async function En(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(l=>l.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??kn;try{let i=new Promise((d,p)=>{r=setTimeout(()=>{n.abort(),p(new U(504,`\u89E6\u53D1\u8D85\u65F6\uFF08${s}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u6267\u884C`))},s)}),l=await Promise.race([o.triggerWorkflowOnce(e,{signal:n.signal}),i]);return{workflowId:e,...l}}catch(i){throw i instanceof U?i:new U(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}u(En,"handleTriggerWorkflowOnce");function lo(){ne.clear()}u(lo,"resetTriggerOnceForTest");async function lt(e,o={}){if(ce)throw new Q(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");ce=!0;let t=o.timeoutMs??Sn,n=null;try{let r=new Promise((i,l)=>{n=setTimeout(()=>l(new Q(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 yt(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 ut({ok:!0,mode:"runtime"}),{ok:!0,mode:"runtime"}}catch(r){let s=r instanceof Q?r.status:500,i=r instanceof Error?r.message:String(r);console.error(`[console] setup\u2192runtime \u664B\u5347\u5931\u8D25: ${i}`);let l={ok:!1,mode:"setup",status:s,error:i};return ut(l),l}finally{n&&clearTimeout(n),ce=!1}}u(lt,"handleConsolePromotion");function ut(e){if(E.phase==="done")if(e.ok){let{promotionError:o,...t}=E;E={...t,mode:"runtime"}}else E={...E,mode:"setup",promotionError:e.error}}u(ut,"applyPromotionToDoneProgress");function uo(){S={status:"idle"},Z=Promise.resolve()}u(uo,"resetRuntimeRunStatusForTest");function po(){ce=!1,E={phase:"idle"},S={status:"idle"}}u(po,"resetPromotionForTest");function go(e){E=e}u(go,"setSetupProgressForTest");function fo(){return E}u(fo,"getSetupProgressForTest");function dt(e,o){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Ce(o,t,{allowRoot:!1})}catch{return null}}u(dt,"resolveInsideConfigDir");function xn(e,o){try{return/\.json$/i.test(e)?JSON.parse(o):Te.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)}`}}u(xn,"validateStructuredText");function An(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}u(An,"deriveBaseUrl");async function On(e,o,t){let n;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";n=Ce(t,i,{allowRoot:!1})}catch{o.writeHead(403),o.end("Forbidden");return}try{(await ot(n)).isDirectory()&&(n=R.join(n,"index.html"))}catch{n=R.join(t,"index.html")}try{await ot(n)}catch{o.writeHead(404),o.end("Not Found");return}let r=R.extname(n),s=hn[r]??"application/octet-stream";o.writeHead(200,{"Content-Type":s}),an(n).pipe(o)}u(On,"serveStatic");export{Bn as a,nt as b,it as c,U as d,Q as e,vn as f,ft as g,ao as h,wt as i,yt as j,Tn as k,co as l,ct as m,Pn as n,En as o,lo as p,lt as q,uo as r,po as s,go as t,fo as u,On as v};