aitable-workflow-cli 0.1.27 → 0.1.28-beta.1789525693558

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,8 +1,8 @@
1
- import{o as ge,q as fe}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as no}from"http";import{stat as Xe,readFile as ae,mkdir as ce,writeFile as Ie,rm as ro}from"fs/promises";import{createReadStream as so,existsSync as et,unlinkSync as io}from"fs";import I from"path";import{fileURLToPath as ao}from"url";import ct from"crypto";import co from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as lo,detectCodingEngines as uo,loadWorkflowTemplate as po,collectEnvRefs as go,applyConfigSave as fo,ConfigSaveError as mo,runSetupCommand as wo,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Pt,readFile as q,writeFile as xt}from"fs/promises";import j from"path";import M from"yaml";import{BotProvisioner as Ot,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as At,listDwsConversations as _t,readState as Nt,resetProfileCache as Ne,runDwsCommand as Gt,runCommand as Bt,setupKnowledgeBases as $t,writeBack as ye,assertPortableId as jt}from"aitable-workflow-core";import re from"path";import{closeSync as wt,existsSync as Ee,openSync as ht,readFileSync as yt}from"fs";import{createExecShellToolkit as bt,createStandaloneExecShellToolkit as kt,loadSettings as St,logger as vt,resolveConfigPath as It,spawnManagedProcess as Rt}from"aitable-workflow-core";function Tt(e){let n=yt(re.resolve(e),"utf8").replace(/^\uFEFF/,""),t;try{t=JSON.parse(n)}catch(o){throw new Error(`--argv-file \u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${e}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}if(!Array.isArray(t)||t.length===0||t.some(o=>typeof o!="string"||o.length===0))throw new Error(`--argv-file \u5FC5\u987B\u662F\u975E\u7A7A JSON \u5B57\u7B26\u4E32\u6570\u7EC4\uFF1A${e}`);return t}a(Tt,"readExecArgvFile");function Ct(e){if(!e||typeof e!="object")return;let n=e;if(n.success!==!0){if(n.success===!1)return String(n.errorMsg??n.error??n.message??n.errorCode??"\u4E0B\u6E38\u547D\u4EE4\u62A5\u544A\u5931\u8D25");for(let t of["error","errorMsg"]){let o=n[t];if(typeof o=="string"&&o.trim())return o.trim();if(o&&typeof o=="object")return JSON.stringify(o)}if(n.errorCode!==void 0&&n.success!==!0)return String(n.errorCode)}}a(Ct,"jsonPayloadError");async function Et(e,n,t={}){let o=await It(e);if(t.standalone||!Ee(o))return{shell:kt(n,{configDir:re.dirname(o)}),mode:"standalone",bins:{},configPath:o};let r=await St(e),s=r.raw?.toolkit_config?.shell??{};return{shell:bt(r,n),mode:"project",bins:s.bins??{},configPath:o}}a(Et,"createToolkitForExec");async function me(e,n,t){let o=re.resolve(t.logFile),r=re.dirname(o);if(!Ee(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=ht(o,"w"),c;try{return c=Rt({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,h=a(b=>g(b),"onError");d.once("error",h),d.once("spawn",()=>{d.removeListener("error",h),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function $o(e,n){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u8BD5\u8DD1\u4E00\u6761\u547D\u4EE4\uFF08\u590D\u7528 shell toolkit \u7684 bins \u89E3\u6790/\u8D85\u65F6/\u8131\u654F\uFF09\uFF0C\u7528\u4E8E dws/git \u547D\u4EE4\u9762 smoke\u3002\u590D\u6742\u53C2\u6570\u53EF\u653E\u5165 UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u6587\u4EF6\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--standalone] [--json | --detach <file>] [--argv-file <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",n.defaultConfig).option("--standalone","\u663E\u5F0F\u65E0\u9879\u76EE\u6A21\u5F0F\uFF1A\u4E0D\u8BFB\u53D6\u9879\u76EE\u914D\u7F6E\uFF0C\u9002\u5408 bootstrap / design \u4EA7\u7269\u751F\u6210\u524D\u63A2\u6D4B dws").option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 runJson \u65B9\u5F0F\u6267\u884C\uFF1A\u8981\u6C42 exit=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u6253\u5370\u89E3\u6790\u540E\u7684\u5BF9\u8C61").option("--argv-file <file>","\u4ECE UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u8BFB\u53D6\u5B8C\u6574\u547D\u4EE4\uFF08\u7B2C\u4E00\u9879 bin\uFF0C\u5176\u4F59\u4E3A\u53C2\u6570\uFF1B\u652F\u6301 BOM\uFF09").option("--detach <file>","\u540E\u53F0\u5206\u79BB\u8FD0\u884C\uFF1A\u547D\u4EE4\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\u8BE5\u6587\u4EF6\u5E76\u7ACB\u5373\u8FD4\u56DE\uFF08\u65E0\u8D85\u65F6/\u91CD\u8BD5\uFF09\u3002\u9002\u5408 dws auth login --device \u7B49\u9700\u5728\u8FD0\u884C\u4E2D\u8BFB\u53D6\u8F93\u51FA\u7684\u6D41\u7A0B").allowUnknownOption().argument("[command...]","\u8981\u6267\u884C\u7684\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u5EFA\u8BAE\u7528 -- \u5206\u9694\uFF09\uFF0C\u5982\uFF1Adws chat group create --name x --format json").action(async(t,o)=>{try{let r=o.argvFile?Tt(o.argvFile):t;if(o.argvFile&&t.length>0)throw new Error("--argv-file \u4E0D\u80FD\u4E0E\u547D\u4EE4\u884C\u547D\u4EE4\u540C\u65F6\u4F7F\u7528");let[s,...i]=r;s||(console.error("\u2717 \u672A\u63D0\u4F9B\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1B\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] -- <bin> <args...>"),process.exit(1));let c=o.timeout?Number.parseInt(o.timeout,10):void 0;c!==void 0&&(Number.isNaN(c)||c<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),o.detach&&(o.json||c!==void 0)&&(console.error("\u2717 --detach \u4E0E --json / --timeout \u4E92\u65A5\uFF08\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E JSON \u8BED\u4E49\uFF09"),process.exit(1)),o.json&&vt.setLevel("warn");let p=await Et(o.config,s,{standalone:o.standalone===!0});if(o.detach){let{pid:d,logFile:h}=await me(s,i,{bins:p.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${d}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${h}`),console.error("\u63D0\u793A\uFF1A\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E\u91CD\u8BD5\u63A7\u5236\uFF0C\u7ED3\u679C\u4EE5\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u4E0E\u5B9E\u9645\u6548\u679C\u4E3A\u51C6\u3002");return}if(o.json){let d=await p.shell.run(s,i,{timeoutMs:c}),h=d.stdout.trim(),b={};if(h!=="")try{b=JSON.parse(h)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),d.stderr&&process.stderr.write(d.stderr),process.exit(1)}let P=Ct(b);if(d.exitCode!==0||P){d.stderr&&process.stderr.write(d.stderr);let G=P?`\uFF1A${P}`:`\uFF08\u9000\u51FA\u7801 ${d.exitCode}\uFF09`;console.error(`\u2717 exec --json \u5931\u8D25${G}`),process.exit(1)}console.log(JSON.stringify(b,null,2));return}let g=await p.shell.run(s,i,{timeoutMs:c});g.stdout&&process.stdout.write(g.stdout),g.stderr&&process.stderr.write(g.stderr),g.truncated&&console.error(`
2
- \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(g.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}a($o,"registerExecCommand");async function Ge(e={}){let n=e.list??_t;try{let{conversations:t}=await n({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}a(Ge,"listAdminGroups");async function z(e,n){let t={};try{let c=await _e(e,{lenientEnv:!0});for(let p of c.workflowEntries)try{let d=(await At(p.templatePath,{envSource:c.envSource})).tracker;if(!d)continue;t[p.id]={baseId:String(d.base_id??"").trim(),tableId:String(d.table_id??"").trim(),...d.label?{label:String(d.label)}:{}}}catch{}}catch{}let o=await Be(n),r=Object.values(t),s=Object.values(o);return{ok:!0,ready:r.length>0?r.every(c=>c.baseId&&c.tableId)&&s.every(c=>c.baseId&&c.tableId):r.some(c=>c.baseId&&c.tableId),trackers:t,configTables:o}}a(z,"readSetupArtifacts");async function Be(e){let n={},t=j.resolve(e,"profile","profile.yml"),o;try{o=M.parse(await q(t,"utf8"))}catch{return n}let r=R(o)?o.workflows:void 0;if(!R(r))return n;for(let s of Object.values(r)){let i=R(s)?s.steps:void 0;if(R(i)){for(let c of Object.values(i))if(R(c))for(let[p,g]of Object.entries(c)){if(!R(g))continue;let d="baseId"in g||"base_id"in g,h="tableId"in g||"table_id"in g;!d||!h||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var L="wiki/official-aitable-faq";async function Ut(e,n){let t=j.resolve(e,"profile","profile.yml"),o;try{o=M.parse(await q(t,"utf8"))}catch{return[]}let r=R(o)?o.roles:void 0,s=R(r)?r[n]:void 0,i=R(s)?s.knowledge_scope:void 0,c=R(i)?i.kb_collections:void 0;return Array.isArray(c)?c.map(p=>typeof p=="string"?p:R(p)&&typeof p.collection=="string"?p.collection:null).filter(p=>p!==null):[]}a(Ut,"readRoleCollections");function Pe(e){if(M.isScalar(e))return typeof e.value=="string"?e.value:null;if(M.isMap(e)){let n=e.get("collection",!0);return M.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Pe,"kbEntryValue");async function Dt(e,n,t){let o=j.resolve(e,"profile","profile.yml"),r;try{r=await q(o,"utf8")}catch{return{ok:!1,code:"KB_PROFILE_MISSING",message:"profile.yml \u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5207\u6362\u5B98\u65B9\u77E5\u8BC6\u5E93",collections:[],changed:!1}}let s=M.parseDocument(r),i=s.getIn(["roles",n,"knowledge_scope","kb_collections"],!0);if(!M.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Pe).filter(d=>d!==null),p=c.includes(L),g=c.find(d=>d!==L)??null;if(t===p)return{ok:!0,message:t?"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u542F\u7528\u72B6\u6001":"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5DF2\u5904\u4E8E\u5173\u95ED\u72B6\u6001",collections:c,changed:!1};if(!t&&!g)return{ok:!1,code:"KB_LAST_SOURCE",message:"\u5F53\u524D profile \u672A\u58F0\u660E\u7528\u6237\u5E93\uFF0C\u5173\u95ED\u5B98\u65B9\u5E93\u5C06\u5BFC\u81F4\u52A9\u624B\u65E0\u4EFB\u4F55\u77E5\u8BC6\u6765\u6E90",collections:c,changed:!1};if(t)i.add(L);else{let d=i.items.findIndex(h=>Pe(h)===L);d>=0&&i.delete(d)}return await xt(o,s.toString(),"utf8"),{ok:!0,message:t?"\u5DF2\u542F\u7528\u5B98\u65B9\u77E5\u8BC6\u5E93":"\u5DF2\u5173\u95ED\u5B98\u65B9\u77E5\u8BC6\u5E93",changed:!0,collections:t?[...c,L]:c.filter(d=>d!==L)}}a(Dt,"writeOfficialToggle");async function $e(e,n,t,o){jt(t,{label:"roleId"});let r=await Dt(n,t,o);if(!r.ok)return{...r,compile:void 0};Ne();let s=o&&r.changed?Ue(e):void 0;return{...r,compile:s}}a($e,"setOfficialKbEnabled");function je(e){return{ok:!0,...Ue(e)}}a(je,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Lt(e).finally(()=>{we=null}),{started:!0})}a(Ue,"triggerCompile");async function Ft(e,n){let t={};for(let o of n){let r=await Nt(e,o);t[o]=r?{status:r.status,...typeof r.fileCount=="number"?{sourceCount:r.fileCount}:{},...typeof r.compiledCount=="number"?{articleCount:r.compiledCount}:{},...typeof r.finishedAt=="string"?{finishedAt:r.finishedAt}:{}}:{status:"unknown"}}return t}a(Ft,"readKbStats");async function Lt(e){try{let n=await _e(e,{lenientEnv:!0}),t=await $t({settings:n});return{ok:!t.results.some(r=>r.action==="failed"),collections:t.collections,...t.skippedReason?{skippedReason:t.skippedReason}:{}}}catch(n){return{ok:!1,collections:[],skippedReason:n instanceof Error?n.message:String(n)}}}a(Lt,"recompileKb");async function oe(e){let n=await Xt(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},groups:[],groupBotsStaging:[],groupTableRef:null};if(!n)return t;let o=Mt(n),r=Jt(n),s=o&&r?"group-qa":null,i=r?await Ut(e,r):[],c=o?$($(n.workflows)?.[o.workflowId]):void 0,p=o?$($(c?.event_sources)?.[o.eventSourceName]):void 0,d=(await Be(e)).group_table??null;return{ok:!0,scenario:s,workflowId:o?.workflowId??null,eventSourceName:o?.eventSourceName??null,kbRoleId:r,kb:{userCollection:i.find(h=>h!==L)??null,officialOn:i.includes(L),stats:await Ft(e,i)},groups:eo(p?.conversation_ids),groupBotsStaging:await Wt(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function Mt(e){let n=$(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if($(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(Mt,"locateGroupQa");function Jt(e){let n=$(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(Jt,"locateKbRole");async function De(e,n,t,o){let r=[...new Set(o.map(p=>p.trim()).filter(Boolean))],s=r.join(`
3
- `),i=["workflows",n,"event_sources",t],c=j.join("profile","profile.yml");return await ye({type:"yaml",file:c,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ye({type:"yaml",file:c,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),Ne(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}a(De,"writeGroupList");var Fe="GROUP_BOTS_STAGING";async function se(e){let n=await Zt(e,Fe);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(se,"readGroupBotStagingRaw");async function Le(e,n){await ye({type:"env",file:".env",envKey:Fe},JSON.stringify(n),e)}a(Le,"writeGroupBotStagingRaw");function Kt(e){return e?e.type==="enterprise"?{type:"enterprise",appKey:e.appKey,...e.name?{name:e.name}:{}}:{type:"custom",name:e.name,webhookUrl:e.webhookUrl}:null}a(Kt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await se(e),s=r.findIndex(p=>p.conversationId===o),i=r[s]??{conversationId:o,title:"",enabled:!0,bot:null},c={conversationId:o,title:t.title!==void 0?t.title:i.title,...t.groupType??i.groupType?{groupType:t.groupType??i.groupType}:{},...t.corpId??i.corpId?{corpId:t.corpId??i.corpId}:{},enabled:t.enabled!==void 0?t.enabled:i.enabled,bot:t.bot!==void 0?t.bot:i.bot};return s>=0?r[s]=c:r.push(c),await Le(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Wt(e,n){return(await se(e)).map(o=>({...o,bot:Kt(o.bot)}))}a(Wt,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function xe(e){return e instanceof Oe?`${e.guidance}
4
- \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}a(xe,"provisionErrorMessage");async function Me(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Me,"resolveCurrentCorpId");async function Je(e,n,t,o={}){let r=o.provision??new Ot({runner:new Ae}),s=j.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(p){return{ok:!1,message:xe(p)}}let c=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(p){if(p instanceof Oe&&p.kind==="bot_already_installed")c=!0;else return{ok:!1,message:xe(p)}}return await ve(e,n,{conversationId:t.conversationId,title:t.title,...t.groupType?{groupType:t.groupType}:{},corpId:i.corpId,enabled:!0,bot:{type:"enterprise",appKey:i.appKey,appSecret:i.appSecret,name:he}}),{ok:!0,message:c?"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF0C\u5DF2\u76F4\u63A5\u8BB0\u5F55\u914D\u7F6E":"\u673A\u5668\u4EBA\u5DF2\u52A0\u5165\u7FA4\u804A"}}a(Je,"addEnterpriseBotToGroup");function Ht(e){let n=[];for(let t of e){if(!t.enabled||!t.bot)continue;let o={\u7FA4ID:t.conversationId,\u7FA4\u540D\u79F0:t.title,...t.groupType?{\u7FA4\u7C7B\u578B:t.groupType==="internal"?"\u5185\u90E8\u7FA4":"\u5916\u90E8\u7FA4"}:{},...t.corpId?{\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId:t.corpId}:{},...t.bot.name?{\u673A\u5668\u4EBA\u6635\u79F0:t.bot.name}:{}};t.bot.type==="enterprise"?n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return n}a(Ht,"stagingToGroupTableRecords");async function ie(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,created:0,message:"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA\uFF08\u7F3A baseId/tableId\uFF09\uFF0C\u6682\u5B58\u4FDD\u7559"};let c=a(async()=>{o.ready&&await Le(n,[])},"clearStaging"),p=await se(n),g=Ht(p);if(g.length===0)return await c(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let d=t.dws??new ke({bin:"dws",timeoutMs:9e4}),h=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(C=>C.groupId),b=g.filter(C=>!h.includes(C.\u7FA4ID??""));if(b.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let P=t.fields??await Se(d,s,i),G=new Map(P.map(C=>[C.fieldName,C.fieldId])),X=b.map(C=>{let l={};for(let[u,m]of Object.entries(C)){let f=G.get(u);f&&(l[f]=m)}return{cells:l}});return await d.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await c(),{ok:!0,created:b.length,message:`\u5DF2\u5199\u5165 ${b.length} \u6761\u7FA4\u914D\u7F6E`}}a(ie,"writeStagingToGroupTable");var _={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function N(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(N).filter(Boolean).join(",");if(R(e)){if(typeof e.name=="string")return e.name.trim();if(typeof e.value=="string")return e.value.trim();if(typeof e.text=="string")return e.text.trim()}return""}a(N,"cellToText");function Yt(e){if(e==null||e==="")return!0;let n=N(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Yt,"cellToEnabled");function qt(e){let n=N(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(qt,"cellToGroupType");function zt(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(zt,"extractConsoleRecords");async function be(e,n,t={}){if(!e||!n)return{ok:!1,baseId:e,tableId:n,groups:[]};let o=t.dws??new ke({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):Se(o,e,n),o.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--all","--format","json"])]),i=new Map(r.map(g=>[g.fieldName,g.fieldId])),c=a((g,d)=>{if(d in g)return g[d];let h=i.get(d);return h?g[h]:void 0},"readCol"),p=[];for(let g of zt(s)){let d=R(g.cells)?g.cells:{},h=N(c(d,_.groupId));if(!h)continue;let b=N(c(d,_.appSecret)),P=N(c(d,_.webhookSecret)),G=qt(c(d,_.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:h,groupName:N(c(d,_.groupName)),...G?{groupType:G}:{},corpId:N(c(d,_.corpId)),inbound:N(c(d,_.inbound)),outbound:N(c(d,_.outbound)),webhookUrl:N(c(d,_.webhookUrl)),webhookSecret:P?"***":"",appKey:N(c(d,_.appKey)),appSecret:b?"***":"",botNick:N(c(d,_.botNick)),enabled:Yt(c(d,_.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Ke(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,baseId:s,tableId:i,groups:[]};let c=await be(s,i,t);if(c.ok&&c.groups.length===0&&(await se(n)).length>0){let g=await ie(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Ke,"readGroupConfigTableForConsole");async function We(e,n,t,o,r={}){if(!e||!n||!t)return{ok:!1,message:"baseId / tableId / recordId \u5FC5\u586B"};let s=r.dws??new ke({bin:"dws",timeoutMs:9e4}),i=r.fields??await Se(s,e,n),c=new Map(i.map(g=>[g.fieldName,g.fieldId])),p={};for(let[g,d]of Object.entries(o)){if(d===void 0)continue;let h=_[g];if(!h)continue;let b=c.get(h)??h;p[b]=d}return Object.keys(p).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",n,"--records",JSON.stringify([{recordId:t,cells:p}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}a(We,"updateGroupConfigRecord");var Vt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Vt)if(typeof n[t]=="boolean")return n[t];for(let t of Object.values(n)){let o=He(t);if(o!==null)return o}return null}a(He,"findAuthBoolean");async function Ye(e={}){let n=e.bin??"dws",t=e.runner??((o,r)=>Bt(o,r,{timeoutMs:15e3}));try{let o=await Gt(n,["auth","status","--format","json"],{runner:t}),r=`${o.stdout}
5
- ${o.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let i=He(JSON.parse(s));if(i!==null)return{loggedIn:i}}catch{}return/(未登录|登录失效|token\s*(?:is\s*)?(?:invalid|expired)|not\s+(?:logged|authenticated)|unauthenticated)/i.test(r)?{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)}:o.exitCode===0?{loggedIn:!0}:{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)||"dws auth status \u5931\u8D25"}}catch(o){return{loggedIn:!1,message:o instanceof Error?o.message:String(o)}}}a(Ye,"checkDwsAuthStatus");var qe=j.join(".aitable-workflow","dws-login.log"),Qt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function ze(e,n={}){let t=j.resolve(e,qe);await Pt(j.dirname(t),{recursive:!0});try{return await me(n.bin??"dws",["auth","login","--device","--yes","--no-browser"],{logFile:t}),{ok:!0,logFile:t}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}a(ze,"startDwsDeviceLogin");async function Ve(e){try{return{verifyUrl:(await q(j.resolve(e,qe),"utf8")).match(Qt)?.[0]??null}}catch{return{verifyUrl:null}}}a(Ve,"readDwsLoginProgress");async function Zt(e,n){let t;try{t=await q(j.resolve(e,".env"),"utf8")}catch{return null}let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^${o}=(.*)$`,"m"));if(!r)return null;let s=r[1].trim();return s.startsWith("'")&&s.endsWith("'")&&s.length>=2?s=s.slice(1,-1):s.startsWith('"')&&s.endsWith('"')&&s.length>=2&&(s=s.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),s||null}a(Zt,"readEnvKey");async function Xt(e){try{let n=M.parse(await q(j.resolve(e,"profile","profile.yml"),"utf8"));return R(n)?n:null}catch{return null}}a(Xt,"readProfileDoc");function $(e){return R(e)?e:void 0}a($,"asRecord");function eo(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}a(eo,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(R,"isRecord");import{spawnManagedProcess as to}from"aitable-workflow-core";function Ze(e){let n=oo(e);try{let t=to({...n,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}a(Ze,"openExternalUrl");function oo(e,n=process.platform){return n==="darwin"?{command:"open",args:[e]}:n==="win32"?{command:"rundll32.exe",args:["url.dll,FileProtocolHandler",e]}:{command:"xdg-open",args:[e]}}a(oo,"openInvocation");function Qe(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}a(Qe,"printFallback");function ot(e){return e?`workbench/${e}`:"setup"}a(ot,"consoleStartPath");var nt=I.dirname(ao(import.meta.url)),ho={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon"},yo=1800*1e3;function bo(e){let n=null,t=a(()=>{n&&clearTimeout(n),n=null},"clear");return{clear:t,armed:a(()=>n!==null,"armed"),reset:a(()=>{t(),e.isEnabled()&&(n=setTimeout(e.onTimeout,e.timeoutMs))},"reset")}}a(bo,"createIdleTimer");var E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ko=12e4,ne=new Set,F=class extends Error{constructor(t,o){super(o);this.status=t;this.name="TriggerOnceHttpError"}status;static{a(this,"TriggerOnceHttpError")}},Z=class extends Error{constructor(t,o){super(o);this.status=t;this.name="PromotionHttpError"}status;static{a(this,"PromotionHttpError")}},So=6e4,le=!1;function vo(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}a(vo,"detectEnvironment");function ut(){let e=I.join(nt,"web");if(et(I.join(e,"index.html")))return e;let n=I.resolve(nt,"..","..","..","web","dist");return et(I.join(n,"index.html"))?n:null}a(ut,"resolveWebRoot");function ln(){return ut()!==null}a(ln,"hasWebRoot");async function Io(e){let t=e+13-1,{createServer:o}=await import("net"),r=a(s=>new Promise((i,c)=>{let p=o();p.listen(s,()=>{let g=p.address(),d=typeof g=="object"&&g?g.port:s;p.close(()=>i(d))}),p.on("error",()=>{s<t?r(s+1).then(i,c):c(new Error(`\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (${e}-${t})`))})}),"tryListen");return r(e)}a(Io,"getAvailablePort");var Ro=1024*1024,To=50*1024*1024,dt=I.join(".aitable-workflow","console-access.json");async function pt(e,n){let t=I.join(e,dt);return await ce(I.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(n,null,2)}
1
+ import{o as ge,q as fe}from"./chunk-4B6V7VHM.js";import{a}from"./chunk-EI7MMDWY.js";import{createServer as no}from"http";import{stat as Xe,readFile as ae,mkdir as ce,writeFile as Ie,rm as ro}from"fs/promises";import{createReadStream as so,existsSync as et,unlinkSync as io}from"fs";import I from"path";import{fileURLToPath as ao}from"url";import ct from"crypto";import co from"os";import Re from"yaml";import{runCheck as V,resolveConfigPath as lt,loadSettings as lo,detectCodingEngines as uo,loadWorkflowTemplate as po,collectEnvRefs as go,applyConfigSave as fo,ConfigSaveError as mo,runSetupCommand as wo,resolveInsideRoot as Te,assertPortableId as tt}from"aitable-workflow-core";import{mkdir as Pt,readFile as q,writeFile as xt}from"fs/promises";import j from"path";import L from"yaml";import{BotProvisioner as Ot,BotProvisionError as Oe,DwsClient as ke,DwsDevRunner as Ae,fetchFields as Se,loadSettings as _e,loadWorkflowTemplate as At,listDwsConversations as _t,readState as Nt,resetProfileCache as Ne,runDwsCommand as Gt,runCommand as Bt,setupKnowledgeBases as $t,writeBack as ye,assertPortableId as jt}from"aitable-workflow-core";import re from"path";import{closeSync as wt,existsSync as Ee,openSync as ht,readFileSync as yt}from"fs";import{createExecShellToolkit as bt,createStandaloneExecShellToolkit as kt,loadSettings as St,logger as vt,resolveConfigPath as It,spawnManagedProcess as Rt}from"aitable-workflow-core";function Tt(e){let n=yt(re.resolve(e),"utf8").replace(/^\uFEFF/,""),t;try{t=JSON.parse(n)}catch(o){throw new Error(`--argv-file \u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${e}\uFF08${o instanceof Error?o.message:String(o)}\uFF09`)}if(!Array.isArray(t)||t.length===0||t.some(o=>typeof o!="string"||o.length===0))throw new Error(`--argv-file \u5FC5\u987B\u662F\u975E\u7A7A JSON \u5B57\u7B26\u4E32\u6570\u7EC4\uFF1A${e}`);return t}a(Tt,"readExecArgvFile");function Ct(e){if(!e||typeof e!="object")return;let n=e;if(n.success!==!0){if(n.success===!1)return String(n.errorMsg??n.error??n.message??n.errorCode??"\u4E0B\u6E38\u547D\u4EE4\u62A5\u544A\u5931\u8D25");for(let t of["error","errorMsg"]){let o=n[t];if(typeof o=="string"&&o.trim())return o.trim();if(o&&typeof o=="object")return JSON.stringify(o)}if(n.errorCode!==void 0&&n.success!==!0)return String(n.errorCode)}}a(Ct,"jsonPayloadError");async function Et(e,n,t={}){let o=await It(e);if(t.standalone||!Ee(o))return{shell:kt(n,{configDir:re.dirname(o)}),mode:"standalone",bins:{},configPath:o};let r=await St(e),s=r.raw?.toolkit_config?.shell??{};return{shell:bt(r,n),mode:"project",bins:s.bins??{},configPath:o}}a(Et,"createToolkitForExec");async function me(e,n,t){let o=re.resolve(t.logFile),r=re.dirname(o);if(!Ee(r))throw new Error(`\u65E5\u5FD7\u6587\u4EF6\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`);let s=t.bins?.[e]??e,i=ht(o,"w"),c;try{return c=Rt({command:s,args:n,stdio:["ignore",i,i]}),await new Promise((p,g)=>{let d=c.child,h=a(b=>g(b),"onError");d.once("error",h),d.once("spawn",()=>{d.removeListener("error",h),p()})}),c.unref(),{pid:c.child.pid,logFile:o}}finally{wt(i)}}a(me,"runDetached");function $o(e,n){e.command("exec").description("\u9003\u751F\u8231\uFF1A\u8BD5\u8DD1\u4E00\u6761\u547D\u4EE4\uFF08\u590D\u7528 shell toolkit \u7684 bins \u89E3\u6790/\u8D85\u65F6/\u8131\u654F\uFF09\uFF0C\u7528\u4E8E dws/git \u547D\u4EE4\u9762 smoke\u3002\u590D\u6742\u53C2\u6570\u53EF\u653E\u5165 UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u6587\u4EF6\u3002\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] [--standalone] [--json | --detach <file>] [--argv-file <file>] -- <bin> <args...>").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",n.defaultConfig).option("--standalone","\u663E\u5F0F\u65E0\u9879\u76EE\u6A21\u5F0F\uFF1A\u4E0D\u8BFB\u53D6\u9879\u76EE\u914D\u7F6E\uFF0C\u9002\u5408 bootstrap / design \u4EA7\u7269\u751F\u6210\u524D\u63A2\u6D4B dws").option("--timeout <ms>","\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09").option("--json","\u4EE5 run \u65B9\u5F0F\u6267\u884C\u5E76\u89E3\u6790 stdout JSON\uFF1A\u4E0D\u56E0\u975E\u96F6\u9000\u51FA\u91CD\u8BD5\uFF0Cpayload \u7EA7\u9519\u8BEF\uFF08success/errorMsg\uFF09\u5355\u72EC\u68C0\u6D4B").option("--argv-file <file>","\u4ECE UTF-8 JSON \u5B57\u7B26\u4E32\u6570\u7EC4\u8BFB\u53D6\u5B8C\u6574\u547D\u4EE4\uFF08\u7B2C\u4E00\u9879 bin\uFF0C\u5176\u4F59\u4E3A\u53C2\u6570\uFF1B\u652F\u6301 BOM\uFF09").option("--detach <file>","\u540E\u53F0\u5206\u79BB\u8FD0\u884C\uFF1A\u547D\u4EE4\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\u8BE5\u6587\u4EF6\u5E76\u7ACB\u5373\u8FD4\u56DE\uFF08\u65E0\u8D85\u65F6/\u91CD\u8BD5\uFF09\u3002\u9002\u5408 dws auth login --device \u7B49\u9700\u5728\u8FD0\u884C\u4E2D\u8BFB\u53D6\u8F93\u51FA\u7684\u6D41\u7A0B").allowUnknownOption().argument("[command...]","\u8981\u6267\u884C\u7684\u547D\u4EE4\u53CA\u53C2\u6570\uFF08\u5EFA\u8BAE\u7528 -- \u5206\u9694\uFF09\uFF0C\u5982\uFF1Adws chat group create --name x --format json").action(async(t,o)=>{try{let r=o.argvFile?Tt(o.argvFile):t;if(o.argvFile&&t.length>0)throw new Error("--argv-file \u4E0D\u80FD\u4E0E\u547D\u4EE4\u884C\u547D\u4EE4\u540C\u65F6\u4F7F\u7528");let[s,...i]=r;s||(console.error("\u2717 \u672A\u63D0\u4F9B\u8981\u6267\u884C\u7684\u547D\u4EE4\uFF1B\u7528\u6CD5\uFF1Aaitable-workflow exec [-c <path>] -- <bin> <args...>"),process.exit(1));let c=o.timeout?Number.parseInt(o.timeout,10):void 0;c!==void 0&&(Number.isNaN(c)||c<=0)&&(console.error("\u2717 --timeout \u5FC5\u987B\u662F\u6B63\u6574\u6570\uFF08\u6BEB\u79D2\uFF09"),process.exit(1)),o.detach&&(o.json||c!==void 0)&&(console.error("\u2717 --detach \u4E0E --json / --timeout \u4E92\u65A5\uFF08\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E JSON \u8BED\u4E49\uFF09"),process.exit(1)),o.json&&vt.setLevel("warn");let p=await Et(o.config,s,{standalone:o.standalone===!0});if(o.detach){let{pid:d,logFile:h}=await me(s,i,{bins:p.bins,logFile:o.detach});console.log(`\u2713 \u5DF2\u540E\u53F0\u542F\u52A8\uFF08pid ${d}\uFF09\uFF0C\u8F93\u51FA\u5B9E\u65F6\u5199\u5165\uFF1A${h}`),console.error("\u63D0\u793A\uFF1A\u5206\u79BB\u8FD0\u884C\u65E0\u8D85\u65F6\u4E0E\u91CD\u8BD5\u63A7\u5236\uFF0C\u7ED3\u679C\u4EE5\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u4E0E\u5B9E\u9645\u6548\u679C\u4E3A\u51C6\u3002");return}if(o.json){let d=await p.shell.run(s,i,{timeoutMs:c}),h=d.stdout.trim(),b={};if(h!=="")try{b=JSON.parse(h)}catch{console.error("\u2717 exec --json \u5931\u8D25: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON"),d.stderr&&process.stderr.write(d.stderr),process.exit(1)}let P=Ct(b);if(d.exitCode!==0||P){d.stderr&&process.stderr.write(d.stderr);let G=P?`\uFF1A${P}`:`\uFF08\u9000\u51FA\u7801 ${d.exitCode}\uFF09`;console.error(`\u2717 exec --json \u5931\u8D25${G}`),process.exit(1)}console.log(JSON.stringify(b,null,2));return}let g=await p.shell.run(s,i,{timeoutMs:c});g.stdout&&process.stdout.write(g.stdout),g.stderr&&process.stderr.write(g.stderr),g.truncated&&console.error(`
2
+ \u26A0\uFE0F \u8F93\u51FA\u56E0\u8D85\u8FC7\u4E0A\u9650\u88AB\u622A\u65AD`),process.exit(g.exitCode??0)}catch(r){console.error(`\u2717 exec \u5931\u8D25: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}a($o,"registerExecCommand");async function Ge(e={}){let n=e.list??_t;try{let{conversations:t}=await n({role:"admin"});return{ok:!0,groups:t}}catch(t){return{ok:!1,message:t instanceof Error?t.message:String(t)}}}a(Ge,"listAdminGroups");async function z(e,n){let t={};try{let c=await _e(e,{lenientEnv:!0});for(let p of c.workflowEntries)try{let d=(await At(p.templatePath,{envSource:c.envSource})).tracker;if(!d)continue;t[p.id]={baseId:String(d.base_id??"").trim(),tableId:String(d.table_id??"").trim(),...d.label?{label:String(d.label)}:{}}}catch{}}catch{}let o=await Be(n),r=Object.values(t),s=Object.values(o);return{ok:!0,ready:r.length>0?r.every(c=>c.baseId&&c.tableId)&&s.every(c=>c.baseId&&c.tableId):r.some(c=>c.baseId&&c.tableId),trackers:t,configTables:o}}a(z,"readSetupArtifacts");async function Be(e){let n={},t=j.resolve(e,"profile","profile.yml"),o;try{o=L.parse(await q(t,"utf8"))}catch{return n}let r=R(o)?o.workflows:void 0;if(!R(r))return n;for(let s of Object.values(r)){let i=R(s)?s.steps:void 0;if(R(i)){for(let c of Object.values(i))if(R(c))for(let[p,g]of Object.entries(c)){if(!R(g))continue;let d="baseId"in g||"base_id"in g,h="tableId"in g||"table_id"in g;!d||!h||(n[p]={baseId:String(g.baseId??g.base_id??"").trim(),tableId:String(g.tableId??g.table_id??"").trim()})}}}return n}a(Be,"readProfileConfigTables");var M="wiki/official-aitable-faq";async function Ut(e,n){let t=j.resolve(e,"profile","profile.yml"),o;try{o=L.parse(await q(t,"utf8"))}catch{return[]}let r=R(o)?o.roles:void 0,s=R(r)?r[n]:void 0,i=R(s)?s.knowledge_scope:void 0,c=R(i)?i.kb_collections:void 0;return Array.isArray(c)?c.map(p=>typeof p=="string"?p:R(p)&&typeof p.collection=="string"?p.collection:null).filter(p=>p!==null):[]}a(Ut,"readRoleCollections");function Pe(e){if(L.isScalar(e))return typeof e.value=="string"?e.value:null;if(L.isMap(e)){let n=e.get("collection",!0);return L.isScalar(n)&&typeof n.value=="string"?n.value:null}return null}a(Pe,"kbEntryValue");async function Dt(e,n,t){let o=j.resolve(e,"profile","profile.yml"),r;try{r=await q(o,"utf8")}catch{return{ok:!1,code:"KB_PROFILE_MISSING",message:"profile.yml \u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u5207\u6362\u5B98\u65B9\u77E5\u8BC6\u5E93",collections:[],changed:!1}}let s=L.parseDocument(r),i=s.getIn(["roles",n,"knowledge_scope","kb_collections"],!0);if(!L.isSeq(i))return{ok:!1,code:"KB_ROLE_NOT_FOUND",message:`profile.yml \u4E2D\u672A\u627E\u5230 roles.${n}.knowledge_scope.kb_collections\uFF0C\u65E0\u6CD5\u5207\u6362`,collections:[],changed:!1};let c=i.items.map(Pe).filter(d=>d!==null),p=c.includes(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(h=>Pe(h)===M);d>=0&&i.delete(d)}return await xt(o,s.toString(),"utf8"),{ok:!0,message:t?"\u5DF2\u542F\u7528\u5B98\u65B9\u77E5\u8BC6\u5E93":"\u5DF2\u5173\u95ED\u5B98\u65B9\u77E5\u8BC6\u5E93",changed:!0,collections:t?[...c,M]:c.filter(d=>d!==M)}}a(Dt,"writeOfficialToggle");async function $e(e,n,t,o){jt(t,{label:"roleId"});let r=await Dt(n,t,o);if(!r.ok)return{...r,compile:void 0};Ne();let s=o&&r.changed?Ue(e):void 0;return{...r,compile:s}}a($e,"setOfficialKbEnabled");function je(e){return{ok:!0,...Ue(e)}}a(je,"recompileKnowledgeBases");var we=null;function Ue(e){return we?{started:!1}:(we=Mt(e).finally(()=>{we=null}),{started:!0})}a(Ue,"triggerCompile");async function Ft(e,n){let t={};for(let o of n){let r=await Nt(e,o);t[o]=r?{status:r.status,...typeof r.fileCount=="number"?{sourceCount:r.fileCount}:{},...typeof r.compiledCount=="number"?{articleCount:r.compiledCount}:{},...typeof r.finishedAt=="string"?{finishedAt:r.finishedAt}:{}}:{status:"unknown"}}return t}a(Ft,"readKbStats");async function Mt(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(Mt,"recompileKb");async function oe(e){let n=await Xt(e),t={ok:!0,scenario:null,workflowId:null,eventSourceName:null,kbRoleId:null,kb:{userCollection:null,officialOn:!1,stats:{}},groups:[],groupBotsStaging:[],groupTableRef:null};if(!n)return t;let o=Lt(n),r=Jt(n),s=o&&r?"group-qa":null,i=r?await Ut(e,r):[],c=o?$($(n.workflows)?.[o.workflowId]):void 0,p=o?$($(c?.event_sources)?.[o.eventSourceName]):void 0,d=(await Be(e)).group_table??null;return{ok:!0,scenario:s,workflowId:o?.workflowId??null,eventSourceName:o?.eventSourceName??null,kbRoleId:r,kb:{userCollection:i.find(h=>h!==M)??null,officialOn:i.includes(M),stats:await Ft(e,i)},groups:eo(p?.conversation_ids),groupBotsStaging:await Wt(e,o?.workflowId??"group-qa"),groupTableRef:d}}a(oe,"readConsoleState");function Lt(e){let n=$(e.workflows);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.event_sources);if(r){for(let[s,i]of Object.entries(r))if($(i)&&"conversation_ids"in i)return{workflowId:t,eventSourceName:s}}}return null}a(Lt,"locateGroupQa");function Jt(e){let n=$(e.roles);if(!n)return null;for(let[t,o]of Object.entries(n)){let r=$($(o)?.knowledge_scope);if(Array.isArray(r?.kb_collections)&&r.kb_collections.length>0)return t}return null}a(Jt,"locateKbRole");async function De(e,n,t,o){let r=[...new Set(o.map(p=>p.trim()).filter(Boolean))],s=r.join(`
3
+ `),i=["workflows",n,"event_sources",t],c=j.join("profile","profile.yml");return await ye({type:"yaml",file:c,yamlPath:[...i,"conversation_ids"],valueType:"string[]"},s,e),await ye({type:"yaml",file:c,yamlPath:[...i,"handler_config","conversation_ids"],valueType:"string[]"},s,e),Ne(),{ok:!0,message:r.length>0?`\u5DF2\u4FDD\u5B58 ${r.length} \u4E2A\u7FA4`:"\u5DF2\u6E05\u7A7A\u7FA4\u5217\u8868"}}a(De,"writeGroupList");var Fe="GROUP_BOTS_STAGING";async function se(e){let n=await Zt(e,Fe);if(!n)return[];try{let t=JSON.parse(n);return Array.isArray(t)?t:[]}catch{return[]}}a(se,"readGroupBotStagingRaw");async function Me(e,n){await ye({type:"env",file:".env",envKey:Fe},JSON.stringify(n),e)}a(Me,"writeGroupBotStagingRaw");function Kt(e){return e?e.type==="enterprise"?{type:"enterprise",appKey:e.appKey,...e.name?{name:e.name}:{}}:{type:"custom",name:e.name,webhookUrl:e.webhookUrl}:null}a(Kt,"maskBot");async function ve(e,n,t){let o=t.conversationId.trim();if(!o)return{ok:!1,message:"conversationId \u5FC5\u586B"};let r=await se(e),s=r.findIndex(p=>p.conversationId===o),i=r[s]??{conversationId:o,title:"",enabled:!0,bot:null},c={conversationId:o,title:t.title!==void 0?t.title:i.title,...t.groupType??i.groupType?{groupType:t.groupType??i.groupType}:{},...t.corpId??i.corpId?{corpId:t.corpId??i.corpId}:{},enabled:t.enabled!==void 0?t.enabled:i.enabled,bot:t.bot!==void 0?t.bot:i.bot};return s>=0?r[s]=c:r.push(c),await Me(e,r),{ok:!0,message:"\u5DF2\u4FDD\u5B58"}}a(ve,"saveGroupBotStaging");async function Wt(e,n){return(await se(e)).map(o=>({...o,bot:Kt(o.bot)}))}a(Wt,"readGroupBotStaging");var he="ai\u8868\u683C\u7FA4\u7B54\u7591\u52A9\u624B";function xe(e){return e instanceof Oe?`${e.guidance}
4
+ \uFF08\u539F\u59CB\u9519\u8BEF\uFF1A${e.message}\uFF09`:e instanceof Error?e.message:String(e)}a(xe,"provisionErrorMessage");async function Le(){try{return await new Ae().getCurrentCorpId()}catch{return}}a(Le,"resolveCurrentCorpId");async function Je(e,n,t,o={}){let r=o.provision??new Ot({runner:new Ae}),s=j.join(e,".env"),i;try{i=await r.resolveEnterpriseRobot({name:he,desc:`${he} - aitable-workflow`,envFile:s})}catch(p){return{ok:!1,message:xe(p)}}let c=!1;try{await r.addBotToGroup(i.appKey,t.conversationId)}catch(p){if(p instanceof Oe&&p.kind==="bot_already_installed")c=!0;else return{ok:!1,message:xe(p)}}return await ve(e,n,{conversationId:t.conversationId,title:t.title,...t.groupType?{groupType:t.groupType}:{},corpId:i.corpId,enabled:!0,bot:{type:"enterprise",appKey:i.appKey,appSecret:i.appSecret,name:he}}),{ok:!0,message:c?"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF0C\u5DF2\u76F4\u63A5\u8BB0\u5F55\u914D\u7F6E":"\u673A\u5668\u4EBA\u5DF2\u52A0\u5165\u7FA4\u804A"}}a(Je,"addEnterpriseBotToGroup");function Ht(e){let n=[];for(let t of e){if(!t.enabled||!t.bot)continue;let o={\u7FA4ID:t.conversationId,\u7FA4\u540D\u79F0:t.title,...t.groupType?{\u7FA4\u7C7B\u578B:t.groupType==="internal"?"\u5185\u90E8\u7FA4":"\u5916\u90E8\u7FA4"}:{},...t.corpId?{\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId:t.corpId}:{},...t.bot.name?{\u673A\u5668\u4EBA\u6635\u79F0:t.bot.name}:{}};t.bot.type==="enterprise"?n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"stream",\u51FA\u7AD9\u65B9\u5F0F:"session",appKey:t.bot.appKey,...t.bot.appSecret?{appSecret:t.bot.appSecret}:{}}):n.push({...o,\u5165\u7AD9\u65B9\u5F0F:"dws",\u51FA\u7AD9\u65B9\u5F0F:"webhook",webhookUrl:t.bot.webhookUrl,...t.bot.webhookSecret?{webhookSecret:t.bot.webhookSecret}:{}})}return n}a(Ht,"stagingToGroupTableRecords");async function ie(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,created:0,message:"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA\uFF08\u7F3A baseId/tableId\uFF09\uFF0C\u6682\u5B58\u4FDD\u7559"};let c=a(async()=>{o.ready&&await Me(n,[])},"clearStaging"),p=await se(n),g=Ht(p);if(g.length===0)return await c(),{ok:!0,created:0,message:"\u65E0\u53EF\u5199\u5165\u7684\u7FA4\u673A\u5668\u4EBA\u914D\u7F6E"};let d=t.dws??new ke({bin:"dws",timeoutMs:9e4}),h=t.existingGroupIds??(await be(s,i,{dws:d,fields:t.fields})).groups.map(C=>C.groupId),b=g.filter(C=>!h.includes(C.\u7FA4ID??""));if(b.length===0)return await c(),{ok:!0,created:0,message:"\u6682\u5B58\u5DF2\u5168\u90E8\u5728\u7FA4\u914D\u7F6E\u8868\u4E2D"};let P=t.fields??await Se(d,s,i),G=new Map(P.map(C=>[C.fieldName,C.fieldId])),X=b.map(C=>{let l={};for(let[u,m]of Object.entries(C)){let f=G.get(u);f&&(l[f]=m)}return{cells:l}});return await d.runJson(["aitable","record","create","--base-id",s,"--table-id",i,"--records",JSON.stringify(X),"--yes"]),await c(),{ok:!0,created:b.length,message:`\u5DF2\u5199\u5165 ${b.length} \u6761\u7FA4\u914D\u7F6E`}}a(ie,"writeStagingToGroupTable");var _={groupId:"\u7FA4ID",groupName:"\u7FA4\u540D\u79F0",groupType:"\u7FA4\u7C7B\u578B",corpId:"\u7FA4\u5F52\u5C5E\u4F01\u4E1AcorpId",inbound:"\u5165\u7AD9\u65B9\u5F0F",outbound:"\u51FA\u7AD9\u65B9\u5F0F",webhookUrl:"webhookUrl",webhookSecret:"webhookSecret",appKey:"appKey",appSecret:"appSecret",botNick:"\u673A\u5668\u4EBA\u6635\u79F0",enabled:"\u662F\u5426\u542F\u7528"};function N(e){if(e==null)return"";if(typeof e=="string")return e.trim();if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"true":"";if(Array.isArray(e))return e.map(N).filter(Boolean).join(",");if(R(e)){if(typeof e.name=="string")return e.name.trim();if(typeof e.value=="string")return e.value.trim();if(typeof e.text=="string")return e.text.trim()}return""}a(N,"cellToText");function Yt(e){if(e==null||e==="")return!0;let n=N(e).toLowerCase();return["true","1","yes","on","\u662F","\u5F00\u542F","\u542F\u7528","\u5DF2\u52FE\u9009"].includes(n)||(typeof e=="boolean"?e:!1)}a(Yt,"cellToEnabled");function qt(e){let n=N(e);if(n.includes("\u5185\u90E8"))return"internal";if(n.includes("\u5916\u90E8"))return"external"}a(qt,"cellToGroupType");function zt(e){if(!R(e))return[];let t=(R(e.data)?e.data:e).records;return Array.isArray(t)?t:[]}a(zt,"extractConsoleRecords");async function be(e,n,t={}){if(!e||!n)return{ok:!1,baseId:e,tableId:n,groups:[]};let o=t.dws??new ke({bin:"dws",timeoutMs:9e4}),[r,s]=await Promise.all([t.fields?Promise.resolve(t.fields):Se(o,e,n),o.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--all","--format","json"])]),i=new Map(r.map(g=>[g.fieldName,g.fieldId])),c=a((g,d)=>{if(d in g)return g[d];let h=i.get(d);return h?g[h]:void 0},"readCol"),p=[];for(let g of zt(s)){let d=R(g.cells)?g.cells:{},h=N(c(d,_.groupId));if(!h)continue;let b=N(c(d,_.appSecret)),P=N(c(d,_.webhookSecret)),G=qt(c(d,_.groupType));p.push({recordId:String(g.recordId??g.id??""),groupId:h,groupName:N(c(d,_.groupName)),...G?{groupType:G}:{},corpId:N(c(d,_.corpId)),inbound:N(c(d,_.inbound)),outbound:N(c(d,_.outbound)),webhookUrl:N(c(d,_.webhookUrl)),webhookSecret:P?"***":"",appKey:N(c(d,_.appKey)),appSecret:b?"***":"",botNick:N(c(d,_.botNick)),enabled:Yt(c(d,_.enabled))})}return{ok:!0,baseId:e,tableId:n,groups:p}}a(be,"readGroupConfigTable");async function Ke(e,n,t={}){let o=t.artifacts??await z(e,n),r=o.configTables.group_table,s=r?.baseId?.trim()??"",i=r?.tableId?.trim()??"";if(!s||!i)return{ok:!1,baseId:s,tableId:i,groups:[]};let c=await be(s,i,t);if(c.ok&&c.groups.length===0&&(await se(n)).length>0){let g=await ie(e,n,{...t,artifacts:o,existingGroupIds:[]});g.ok&&g.created>0&&(c=await be(s,i,t))}return c}a(Ke,"readGroupConfigTableForConsole");async function We(e,n,t,o,r={}){if(!e||!n||!t)return{ok:!1,message:"baseId / tableId / recordId \u5FC5\u586B"};let s=r.dws??new ke({bin:"dws",timeoutMs:9e4}),i=r.fields??await Se(s,e,n),c=new Map(i.map(g=>[g.fieldName,g.fieldId])),p={};for(let[g,d]of Object.entries(o)){if(d===void 0)continue;let h=_[g];if(!h)continue;let b=c.get(h)??h;p[b]=d}return Object.keys(p).length===0?{ok:!1,message:"\u65E0\u53EF\u66F4\u65B0\u5B57\u6BB5"}:(await s.runJson(["aitable","record","update","--base-id",e,"--table-id",n,"--records",JSON.stringify([{recordId:t,cells:p}]),"--yes"]),{ok:!0,message:"\u8BB0\u5F55\u5DF2\u66F4\u65B0"})}a(We,"updateGroupConfigRecord");var Vt=["loggedIn","isLoggedIn","isLogin","authenticated","tokenValid","isValid"];function He(e){if(!e||typeof e!="object")return null;let n=e;for(let t of Vt)if(typeof n[t]=="boolean")return n[t];for(let t of Object.values(n)){let o=He(t);if(o!==null)return o}return null}a(He,"findAuthBoolean");async function Ye(e={}){let n=e.bin??"dws",t=e.runner??((o,r)=>Bt(o,r,{timeoutMs:15e3}));try{let o=await Gt(n,["auth","status","--format","json"],{runner:t}),r=`${o.stdout}
5
+ ${o.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let i=He(JSON.parse(s));if(i!==null)return{loggedIn:i}}catch{}return/(未登录|登录失效|token\s*(?:is\s*)?(?:invalid|expired)|not\s+(?:logged|authenticated)|unauthenticated)/i.test(r)?{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)}:o.exitCode===0?{loggedIn:!0}:{loggedIn:!1,message:r.split(/\r?\n/)[0]?.slice(0,200)||"dws auth status \u5931\u8D25"}}catch(o){return{loggedIn:!1,message:o instanceof Error?o.message:String(o)}}}a(Ye,"checkDwsAuthStatus");var qe=j.join(".aitable-workflow","dws-login.log"),Qt=/https:\/\/login\.dingtalk\.com\/oauth2\/device\/verify\.htm\?user_code=[A-Za-z0-9-]+/;async function ze(e,n={}){let t=j.resolve(e,qe);await Pt(j.dirname(t),{recursive:!0});try{return await me(n.bin??"dws",["auth","login","--device","--yes","--no-browser"],{logFile:t}),{ok:!0,logFile:t}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}a(ze,"startDwsDeviceLogin");async function Ve(e){try{return{verifyUrl:(await q(j.resolve(e,qe),"utf8")).match(Qt)?.[0]??null}}catch{return{verifyUrl:null}}}a(Ve,"readDwsLoginProgress");async function Zt(e,n){let t;try{t=await q(j.resolve(e,".env"),"utf8")}catch{return null}let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^${o}=(.*)$`,"m"));if(!r)return null;let s=r[1].trim();return s.startsWith("'")&&s.endsWith("'")&&s.length>=2?s=s.slice(1,-1):s.startsWith('"')&&s.endsWith('"')&&s.length>=2&&(s=s.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")),s||null}a(Zt,"readEnvKey");async function Xt(e){try{let n=L.parse(await q(j.resolve(e,"profile","profile.yml"),"utf8"));return R(n)?n:null}catch{return null}}a(Xt,"readProfileDoc");function $(e){return R(e)?e:void 0}a($,"asRecord");function eo(e){return Array.isArray(e)?e.filter(n=>typeof n=="string"):[]}a(eo,"toStringArray");function R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(R,"isRecord");import{spawnManagedProcess as to}from"aitable-workflow-core";function Ze(e){let n=oo(e);try{let t=to({...n,stdio:"ignore",detached:!0});t.child.once("error",()=>Qe(e)),t.unref()}catch{Qe(e)}}a(Ze,"openExternalUrl");function oo(e,n=process.platform){return n==="darwin"?{command:"open",args:[e]}:n==="win32"?{command:"rundll32.exe",args:["url.dll,FileProtocolHandler",e]}:{command:"xdg-open",args:[e]}}a(oo,"openInvocation");function Qe(e){console.log(`\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00: ${e}`)}a(Qe,"printFallback");function ot(e){return e?`workbench/${e}`:"setup"}a(ot,"consoleStartPath");var nt=I.dirname(ao(import.meta.url)),ho={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".json":"application/json; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon"},yo=1800*1e3;function bo(e){let n=null,t=a(()=>{n&&clearTimeout(n),n=null},"clear");return{clear:t,armed:a(()=>n!==null,"armed"),reset:a(()=>{t(),e.isEnabled()&&(n=setTimeout(e.onTimeout,e.timeoutMs))},"reset")}}a(bo,"createIdleTimer");var E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ko=12e4,ne=new Set,F=class extends Error{constructor(t,o){super(o);this.status=t;this.name="TriggerOnceHttpError"}status;static{a(this,"TriggerOnceHttpError")}},Z=class extends Error{constructor(t,o){super(o);this.status=t;this.name="PromotionHttpError"}status;static{a(this,"PromotionHttpError")}},So=6e4,le=!1;function vo(){return process.platform==="darwin"||process.platform==="win32"||process.env.DISPLAY||process.env.WAYLAND_DISPLAY?"local-gui":"remote"}a(vo,"detectEnvironment");function ut(){let e=I.join(nt,"web");if(et(I.join(e,"index.html")))return e;let n=I.resolve(nt,"..","..","..","web","dist");return et(I.join(n,"index.html"))?n:null}a(ut,"resolveWebRoot");function ln(){return ut()!==null}a(ln,"hasWebRoot");async function Io(e){let t=e+13-1,{createServer:o}=await import("net"),r=a(s=>new Promise((i,c)=>{let p=o();p.listen(s,()=>{let g=p.address(),d=typeof g=="object"&&g?g.port:s;p.close(()=>i(d))}),p.on("error",()=>{s<t?r(s+1).then(i,c):c(new Error(`\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7AEF\u53E3 (${e}-${t})`))})}),"tryListen");return r(e)}a(Io,"getAvailablePort");var Ro=1024*1024,To=50*1024*1024,dt=I.join(".aitable-workflow","console-access.json");async function pt(e,n){let t=I.join(e,dt);return await ce(I.dirname(t),{recursive:!0}),await Ie(t,`${JSON.stringify(n,null,2)}
6
6
  `,"utf8"),t}a(pt,"writeConsoleAccessFile");function Co(e){try{io(I.join(e,dt))}catch{}}a(Co,"clearConsoleAccessFile");async function D(e,n=Ro){return new Promise((t,o)=>{let r=[],s=0;e.on("data",i=>{if(s+=i.length,s>n){e.destroy(),o(new Error("Request body too large"));return}r.push(i)}),e.on("end",()=>{try{t(JSON.parse(Buffer.concat(r).toString("utf8")))}catch{o(new Error("Invalid JSON body"))}}),e.on("error",o)})}a(D,"readJson");function w(e,n,t=200){let o=JSON.stringify(n);e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(o)}),e.end(o)}a(w,"sendJson");function k(e,n,t){w(e,{ok:!1,error:t},n)}a(k,"sendError");function W(e){let n=JSON.parse(JSON.stringify(e));for(let t of n.modules){let o=t.workflows?t.workflows.flatMap(r=>r.items):t.items;for(let r of o)r.sensitive&&r.value!==void 0&&(r.value="***")}return n}a(W,"maskSensitive");async function un(e){let n=e.port??8788,t=await Io(n),o=vo(),r=ct.randomUUID(),s=o==="remote"?"0.0.0.0":"127.0.0.1",i=ut(),c=e.mode??"setup",p=e.app;if(c==="runtime"&&!p)throw new Error("runtime \u6A21\u5F0F\u5FC5\u987B\u4F20\u5165 App \u5B9E\u4F8B");if(!i)throw new Error("Web \u8D44\u6E90\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u542F\u52A8\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");let g=await lt(e.configPath),d=I.dirname(g);E={phase:"idle"},v={status:"idle"},Q=Promise.resolve(),ne.clear();let h=e.assembleApp?{assembleApp:e.assembleApp,commit:a(m=>{p=m,c="runtime",C(),e.onAppAssembled?.(m)},"commit")}:void 0,b="";e.initialRunStatus&&(v=e.initialRunStatus);let P=null,G=new Promise(m=>P=m),X=bo({timeoutMs:yo,isEnabled:a(()=>c==="setup","isEnabled"),onTimeout:a(()=>{console.log(`
7
7
  \u2139 \u914D\u7F6E\u754C\u9762\u8D85\u8FC7 30 \u5206\u949F\u65E0\u6D3B\u52A8\uFF0C\u5DF2\u81EA\u52A8\u5173\u95ED\u3002`),P?.()},"onTimeout")}),C=a(()=>X.reset(),"resetTimeout"),l=no(async(m,f)=>{let y=new URL(m.url??"/",`http://${m.headers.host??"localhost"}`),O=m.headers.origin;if(O){let x=`http://127.0.0.1:${t}`;(O===x||o==="remote")&&f.setHeader("Access-Control-Allow-Origin",O)}if(f.setHeader("Access-Control-Allow-Methods","GET, POST, OPTIONS"),f.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),m.method==="OPTIONS"){f.writeHead(204),f.end();return}if(y.pathname.startsWith("/dev/")){if((y.searchParams.get("token")??m.headers.authorization?.replace("Bearer ",""))!==r){k(f,401,"Unauthorized");return}C();try{await Eo({url:y,req:m,res:f,configPath:e.configPath,configDir:d,completionResolve:P,setupOptions:e.setupOptions,mode:c,app:p,promotion:h?{...h,access:{configDir:d,url:b,port:t}}:void 0,exitOnSetupError:e.exitOnSetupError!==!1})}catch(U){let ee=U instanceof Error?U.message:String(U);k(f,500,ee)}return}if(y.pathname.startsWith("/api/")){w(f,{error:{message:"\u914D\u7F6E\u754C\u9762\u4E0D\u63D0\u4F9B /api \u63A5\u53E3"}},404);return}_o(y,f,i)});await new Promise(m=>l.listen(t,s,m)),C();let u=(await oe(d).catch(()=>null))?.scenario??null;b=o==="local-gui"?`http://127.0.0.1:${t}/${ot(u)}?token=${r}`:`http://${co.hostname()}:${t}/${ot(u)}?token=${r}`,await pt(d,{url:b,port:t,mode:c,pid:process.pid,since:new Date().toISOString()}),process.on("exit",()=>Co(d)),o==="local-gui"?e.open!==!1?(Ze(b),console.log(`\u2139 \u6D4F\u89C8\u5668\u5DF2\u6253\u5F00: ${b}`)):console.log(`\u2139 \u8BF7\u624B\u52A8\u6253\u5F00\u6D4F\u89C8\u5668: ${b}`):(console.log("\u2139 \u914D\u7F6E\u754C\u9762\u5DF2\u542F\u52A8\uFF0C\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00:"),console.log(` ${b}`),console.log(`
8
8
  \u5982\u679C\u65E0\u6CD5\u76F4\u63A5\u8BBF\u95EE\uFF0C\u53EF\u901A\u8FC7 SSH \u7AEF\u53E3\u8F6C\u53D1:
@@ -12,4 +12,4 @@ ${o.stderr}`.trim();for(let s of[r,...r.split(/\r?\n/).reverse()])try{let i=He(J
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
13
  `)),await G,X.clear(),l.close()}a(un,"runConfigUI");async function Eo(e){let{url:n,req:t,res:o,configPath:r,configDir:s,completionResolve:i,setupOptions:c,mode:p,app:g,promotion:d,exitOnSetupError:h}=e;if(t.method==="GET"&&n.pathname==="/dev/config/check"){let l=await V({configPath:r});w(o,W(l));return}if(t.method==="GET"&&n.pathname==="/dev/config/enriched"){let l=await V({configPath:r}),u=uo(),m=await lo(r),f={},y={},O=new Set,x=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g;try{let S=await lt(r),A=await ae(S,"utf8");for(let J of go([A]))O.add(J)}catch{}try{let S=await ae(I.join(s,"profile","profile.yml"),"utf8"),A=Re.parse(S),J=A?.workflows;if(J&&typeof J=="object"&&(y=J),A&&typeof A=="object"){let{workflows:Ce,...H}=A;for(let te of JSON.stringify(H).matchAll(x))O.add(te[1])}}catch{}for(let S of m.workflowEntries)try{let A=await po(S.templatePath),J=A.steps.map(T=>({id:T.id,name:T.name,recipe:T.recipe,engine:T.engine,auto:T.auto})),Ce=A.edges.filter(T=>T.from!=="__start__"&&T.to!=="__end__").map(T=>({from:T.from,to:T.to,condition:T.condition})),H={},te=new Set,K;try{K=Re.parse(await ae(S.templatePath,"utf8"))}catch{}if(K){for(let B of JSON.stringify(K).matchAll(x))te.add(B[1]);let T=y[S.id];if(T&&typeof T=="object")for(let B of JSON.stringify(T).matchAll(x))te.add(B[1]);let gt=Array.isArray(K.steps)?K.steps:[];for(let B=0;B<A.steps.length;B++){let ue=A.steps[B],Y=gt[B];if(Y){let de=JSON.stringify(Y),pe=new Set;for(let mt of de.matchAll(x))pe.add(mt[1]);pe.size>0&&(H[ue.id]=[...pe])}}let ft=Array.isArray(K.event_sources)?K.event_sources:[];for(let B of ft)if(B){let ue=JSON.stringify(B),Y=new Set;for(let de of ue.matchAll(x))Y.add(de[1]);Y.size>0&&(H.__event_sources__=[...H.__event_sources__??[],...Y])}}f[S.id]={steps:J,edges:Ce,stepEnvRefs:H,envRefs:[...te].sort()}}catch{f[S.id]={steps:[],edges:[],stepEnvRefs:{},envRefs:[]}}let U=new Set;for(let S of Object.values(f))for(let A of S.envRefs??[])U.add(A);let ee=l.modules.find(S=>S.id==="env");for(let S of ee?.items??[])S.writeTarget?.type==="env"&&!U.has(S.key)&&O.add(S.key);w(o,{config:W(l),engines:{available:u.available.map(S=>({engine:S.engine,cmd:S.cmd,version:S.version})),recommended:u.recommendedEngine},workflowTopology:f,projectEnvRefs:[...O].sort()});return}if(t.method==="POST"&&n.pathname==="/dev/config/save"){let l=await D(t);try{let u=await fo(l,s,r);w(o,{ok:!0,written:u.written,recheck:W(u.recheck)})}catch(u){if(u instanceof mo){k(o,u.status,u.message);return}throw u}return}if(t.method==="POST"&&n.pathname==="/dev/kb/ingest"){let l=await D(t);if(!l.roleId||!l.source){k(o,400,"roleId and source are required");return}try{tt(l.roleId,{label:"roleId"})}catch(O){k(o,400,O instanceof Error?O.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await fe(u,l.roleId),f=await ge({source:l.source,collectionName:m,configDir:s}),y=await V({configPath:r});w(o,{ok:f.success,message:f.message,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/kb/upload"){let l=await D(t,To);if(!l.roleId||!Array.isArray(l.files)||l.files.length===0){k(o,400,"roleId and files are required");return}try{tt(l.roleId,{label:"roleId"})}catch(y){k(o,400,y instanceof Error?y.message:"roleId \u4E0D\u5408\u6CD5");return}let u=I.resolve(s,"roles",`${l.roleId}.role.yml`),m=await fe(u,l.roleId),f=I.resolve(s,".kb-upload-tmp",`upload-${Date.now()}`);try{await ce(f,{recursive:!0});for(let x of l.files){let U;try{U=Te(f,x.relativePath,{allowRoot:!1})}catch{k(o,400,`\u4E0A\u4F20\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${x.relativePath}`);return}let ee=I.dirname(U);await ce(ee,{recursive:!0});let S=x.encoding==="base64"?Buffer.from(x.content,"base64"):Buffer.from(x.content,"utf8");await Ie(U,S)}let y=await ge({source:f,collectionName:m,configDir:s}),O=await V({configPath:r});w(o,{ok:y.success,message:y.message,recheck:W(O)})}finally{await ro(f,{recursive:!0,force:!0}).catch(()=>{})}return}if(t.method==="GET"&&n.pathname==="/dev/file/read"){let l=n.searchParams.get("path")??"",u=at(l,s);if(!u){k(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${l}`);return}try{let m=await ae(u,"utf8");w(o,{ok:!0,path:l,content:m,exists:!0})}catch{w(o,{ok:!0,path:l,content:"",exists:!1})}return}if(t.method==="POST"&&n.pathname==="/dev/file/write"){let l=await D(t),u=typeof l.path=="string"?l.path:"",m=at(u,s);if(!m||typeof l.content!="string"){k(o,403,`\u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5: ${u}`);return}let f=Oo(u,l.content);if(f){w(o,{ok:!1,error:f},400);return}await ce(I.dirname(m),{recursive:!0}),await Ie(m,l.content.endsWith(`
14
14
  `)?l.content:l.content+`
15
- `,"utf8");let y=await V({configPath:r});w(o,{ok:!0,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/setup/complete"){if(E.phase==="running"){k(o,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}E={phase:"running",logs:[]},w(o,{ok:!0});let l=a(async()=>{try{let u=await ie(r,s);u.ok||console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u672A\u5B8C\u6210: ${u.message}`)}catch(u){console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u5F02\u5E38: ${u instanceof Error?u.message:String(u)}`)}},"flushStaging");(async()=>{try{await l(),await wo({config:r,...c??{}}),await l();let u=await z(r,s),m=Ao(u),f={mode:p};if(p==="setup"&&d){let y=await st({configPath:r,...d});f=y.ok?{mode:"runtime"}:{mode:"setup",promotionError:y.error}}E={phase:"done",artifacts:u,baseUrl:m,...f}}catch(u){E={phase:"error",message:u instanceof Error?u.message:String(u)},h&&i?.()}})();return}if(t.method==="GET"&&n.pathname==="/dev/setup/progress"){w(o,E);return}if(t.method==="GET"&&n.pathname==="/dev/setup/artifacts"){w(o,await z(r,s));return}if(t.method==="GET"&&n.pathname==="/dev/console/state"){w(o,await oe(s));return}if(t.method==="POST"&&n.pathname==="/dev/console/groups"){let l=await D(t);if(!l.workflowId||!l.eventSourceName||!Array.isArray(l.conversationIds)){k(o,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await De(s,l.workflowId,l.eventSourceName,l.conversationIds),m=await V({configPath:r});w(o,{...u,recheck:W(m)});return}if(t.method==="GET"&&n.pathname==="/dev/console/admin-groups"){w(o,await Ge());return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth"){w(o,await Ye());return}if(t.method==="POST"&&n.pathname==="/dev/console/dws-auth/login"){let l=await ze(s);w(o,l,l.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth/login"){w(o,await Ve(s));return}let b=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&b){let l=decodeURIComponent(b[1]),u=await D(t),m=await oe(s),f=await Je(s,m.workflowId??"group-qa",{conversationId:l,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(o,f,f.ok?200:400);return}let P=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&P){let l=decodeURIComponent(P[1]),u=await D(t);if(!u.name||!u.webhook||!u.secret){k(o,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){k(o,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let m=await oe(s),f=await Me(),y=await ve(s,m.workflowId??"group-qa",{conversationId:l,...u.title!==void 0?{title:u.title}:{},...u.groupType?{groupType:u.groupType}:{},...f?{corpId:f}:{},enabled:!0,bot:{type:"custom",name:u.name,webhookUrl:u.webhook,...u.secret?{webhookSecret:u.secret}:{}}});w(o,y,y.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/group-config-table"){try{w(o,await Ke(r,s))}catch(l){k(o,502,l instanceof Error?l.message:"\u7FA4\u914D\u7F6E\u8868\u8BFB\u53D6\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/console/group-config-table/flush-staging"){let l=await ie(r,s);w(o,l,l.ok?200:400);return}let G=n.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&G){let l=decodeURIComponent(G[1]),u=await D(t),f=(await z(r,s)).configTables.group_table;if(!f?.baseId||!f.tableId){k(o,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let y=await We(f.baseId,f.tableId,l,u);w(o,y,y.ok?200:400)}catch(y){k(o,502,y instanceof Error?y.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/kb/official"){let l=await D(t);if(!l.roleId||typeof l.enabled!="boolean"){w(o,{ok:!1,code:"KB_BAD_REQUEST",message:"roleId \u4E0E enabled(boolean) \u5FC5\u586B"},400);return}let u;try{u=await $e(r,s,l.roleId,l.enabled)}catch(m){w(o,{ok:!1,code:"KB_TOGGLE_FAILED",message:m instanceof Error?m.message:"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5F00\u5173\u5931\u8D25",collections:[]},400);return}w(o,u,u.ok?200:400);return}if(t.method==="POST"&&n.pathname==="/dev/kb/recompile"){let l=await je(r);w(o,l);return}if(t.method==="GET"&&n.pathname==="/dev/console/mode"){w(o,{ok:!0,mode:p,promotable:p==="setup"&&!!d});return}if(t.method==="POST"&&n.pathname==="/dev/console/promote"){if(p==="runtime"){w(o,{ok:!0,mode:"runtime"});return}if(!d){k(o,409,"\u5F53\u524D\u63A7\u5236\u53F0\u4E0D\u652F\u6301\u5C31\u5730\u664B\u5347\uFF08setup \u547D\u4EE4\u8BF7\u4F7F\u7528 aitable-workflow start\uFF09");return}if(E.phase!=="done"){k(o,409,"\u642D\u5EFA\u5C1A\u672A\u5B8C\u6210\uFF0C\u65E0\u6CD5\u8FDB\u5165\u8FD0\u884C\u6A21\u5F0F");return}try{let l=await st({configPath:r,...d});l.ok?w(o,{ok:!0,mode:"runtime"}):w(o,{ok:!1,mode:"setup",error:l.error},l.status)}catch(l){let u=l instanceof Z?l.status:500;k(o,u,l instanceof Error?l.message:String(l))}return}if(t.method==="GET"&&n.pathname==="/dev/run/status"){if(p==="setup"){w(o,{ok:!0,status:"unknown"});return}w(o,{ok:!0,...rt()});return}let C={"/dev/run/start":"start","/dev/run/stop":"stop"}[n.pathname];if(t.method==="POST"&&C){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u4E0D\u652F\u6301\u8FD0\u884C\u63A7\u5236\uFF0C\u8BF7\u4F7F\u7528 aitable-workflow start \u547D\u4EE4");return}let l=await Po(C,g);w(o,{...l,status:rt()});return}if(t.method==="POST"&&n.pathname==="/dev/workflow/trigger-once"){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684\u5F15\u64CE\uFF0C\u65E0\u6CD5\u89E6\u53D1\u5DE5\u4F5C\u6D41");return}let l;try{l=await D(t)}catch(u){k(o,400,u instanceof Error?u.message:String(u));return}try{let u=await xo(String(l.workflowId??""),g);w(o,{ok:!0,...u})}catch(u){let m=u instanceof F?u.status:500;k(o,m,u instanceof Error?u.message:String(u))}return}k(o,404,"Unknown endpoint")}a(Eo,"handleDevApi");function rt(){return v}a(rt,"getRuntimeRunStatus");async function Po(e,n){let t=ct.randomUUID();return e==="start"?v.status==="running"||v.status==="starting"?{ok:!0,action:e,requestId:t}:(v={status:"starting",since:new Date().toISOString(),lastError:null},Q=Q.then(()=>{let o=n.start();v.status==="starting"&&(v={status:"running",since:new Date().toISOString(),lastError:null}),o.catch(r=>{v={status:"error",lastError:r instanceof Error?r.message:String(r)}})}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):e==="stop"?v.status==="stopping"?{ok:!0,action:e,requestId:t}:v.status!=="running"&&v.status!=="starting"?(v={status:"stopped",lastError:null},{ok:!0,action:e,requestId:t}):(v={status:"stopping",lastError:null},Q=Q.then(async()=>{await n.stop(),v={status:"stopped",lastError:null}}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):{ok:!1,action:e,requestId:t}}a(Po,"handleRuntimeRunControl");async function xo(e,n,t={}){if(typeof e!="string"||e.length===0)throw new F(400,"\u7F3A\u5C11 workflowId");if(!n.instances.some(i=>i.id===e)){let i=n.instances.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09";throw new F(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new F(409,`\u5DE5\u4F5C\u6D41 "${e}" \u6B63\u5728\u89E6\u53D1\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210`);ne.add(e);let o=new AbortController,r=null,s=t.timeoutMs??ko;try{let i=new Promise((p,g)=>{r=setTimeout(()=>{o.abort(),g(new F(504,`\u89E6\u53D1\u8D85\u65F6\uFF08${s}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u6267\u884C`))},s)}),c=await Promise.race([n.triggerWorkflowOnce(e,{signal:o.signal}),i]);return{workflowId:e,...c}}catch(i){throw i instanceof F?i:new F(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}a(xo,"handleTriggerWorkflowOnce");function dn(){ne.clear()}a(dn,"resetTriggerOnceForTest");async function st(e,n={}){if(le)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");le=!0;let t=n.timeoutMs??So,o=null;try{let r=new Promise((i,c)=>{o=setTimeout(()=>c(new Z(504,`\u88C5\u914D\u8D85\u65F6\uFF08${t}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u664B\u5347`)),t)}),s=await Promise.race([e.assembleApp(e.configPath),r]);if(e.commit(s),v={status:"idle"},e.access)try{await pt(e.access.configDir,{url:e.access.url,port:e.access.port,mode:"runtime",pid:process.pid,since:new Date().toISOString()})}catch(i){console.error(`[console] console-access.json \u91CD\u5199\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`)}return it({ok:!0,mode:"runtime"}),{ok:!0,mode:"runtime"}}catch(r){let s=r instanceof Z?r.status:500,i=r instanceof Error?r.message:String(r);console.error(`[console] setup\u2192runtime \u664B\u5347\u5931\u8D25: ${i}`);let c={ok:!1,mode:"setup",status:s,error:i};return it(c),c}finally{o&&clearTimeout(o),le=!1}}a(st,"handleConsolePromotion");function it(e){if(E.phase==="done")if(e.ok){let{promotionError:n,...t}=E;E={...t,mode:"runtime"}}else E={...E,mode:"setup",promotionError:e.error}}a(it,"applyPromotionToDoneProgress");function pn(){v={status:"idle"},Q=Promise.resolve()}a(pn,"resetRuntimeRunStatusForTest");function gn(){le=!1,E={phase:"idle"},v={status:"idle"}}a(gn,"resetPromotionForTest");function fn(e){E=e}a(fn,"setSetupProgressForTest");function mn(){return E}a(mn,"getSetupProgressForTest");function at(e,n){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Te(n,t,{allowRoot:!1})}catch{return null}}a(at,"resolveInsideConfigDir");function Oo(e,n){try{return/\.json$/i.test(e)?JSON.parse(n):Re.parse(n),null}catch(t){return`${/\.json$/i.test(e)?"JSON":"YAML"} \u8BED\u6CD5\u9519\u8BEF\uFF0C\u672A\u4FDD\u5B58: ${t instanceof Error?t.message:String(t)}`}}a(Oo,"validateStructuredText");function Ao(e){let n=Object.values(e.trackers).find(t=>t.baseId&&t.tableId);return n?.baseId?`https://alidocs.dingtalk.com/i/nodes/${encodeURIComponent(n.baseId)}`:null}a(Ao,"deriveBaseUrl");async function _o(e,n,t){let o;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";o=Te(t,i,{allowRoot:!1})}catch{n.writeHead(403),n.end("Forbidden");return}try{(await Xe(o)).isDirectory()&&(o=I.join(o,"index.html"))}catch{o=I.join(t,"index.html")}try{await Xe(o)}catch{n.writeHead(404),n.end("Not Found");return}let r=I.extname(o),s=ho[r]??"application/octet-stream";n.writeHead(200,{"Content-Type":s}),so(o).pipe(n)}a(_o,"serveStatic");export{$o as a,Ze as b,ot as c,bo as d,F as e,Z as f,vo as g,ut as h,ln as i,dt as j,pt as k,Co as l,un as m,rt as n,Po as o,xo as p,dn as q,st as r,pn as s,gn as t,fn as u,mn as v,_o as w};
15
+ `,"utf8");let y=await V({configPath:r});w(o,{ok:!0,recheck:W(y)});return}if(t.method==="POST"&&n.pathname==="/dev/setup/complete"){if(E.phase==="running"){k(o,409,"setup \u5DF2\u5728\u8FD0\u884C\u4E2D");return}E={phase:"running",logs:[]},w(o,{ok:!0});let l=a(async()=>{try{let u=await ie(r,s);u.ok||console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u672A\u5B8C\u6210: ${u.message}`)}catch(u){console.error(`[group-qa] \u7FA4\u914D\u7F6E\u5199\u5165\u5F02\u5E38: ${u instanceof Error?u.message:String(u)}`)}},"flushStaging");(async()=>{try{await l(),await wo({config:r,...c??{}}),await l();let u=await z(r,s),m=Ao(u),f={mode:p};if(p==="setup"&&d){let y=await st({configPath:r,...d});f=y.ok?{mode:"runtime"}:{mode:"setup",promotionError:y.error}}E={phase:"done",artifacts:u,baseUrl:m,...f}}catch(u){E={phase:"error",message:u instanceof Error?u.message:String(u)},h&&i?.()}})();return}if(t.method==="GET"&&n.pathname==="/dev/setup/progress"){w(o,E);return}if(t.method==="GET"&&n.pathname==="/dev/setup/artifacts"){w(o,await z(r,s));return}if(t.method==="GET"&&n.pathname==="/dev/console/state"){w(o,await oe(s));return}if(t.method==="POST"&&n.pathname==="/dev/console/groups"){let l=await D(t);if(!l.workflowId||!l.eventSourceName||!Array.isArray(l.conversationIds)){k(o,400,"workflowId / eventSourceName / conversationIds \u5FC5\u586B");return}let u=await De(s,l.workflowId,l.eventSourceName,l.conversationIds),m=await V({configPath:r});w(o,{...u,recheck:W(m)});return}if(t.method==="GET"&&n.pathname==="/dev/console/admin-groups"){w(o,await Ge());return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth"){w(o,await Ye());return}if(t.method==="POST"&&n.pathname==="/dev/console/dws-auth/login"){let l=await ze(s);w(o,l,l.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/dws-auth/login"){w(o,await Ve(s));return}let b=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/add-enterprise-bot$/);if(t.method==="POST"&&b){let l=decodeURIComponent(b[1]),u=await D(t),m=await oe(s),f=await Je(s,m.workflowId??"group-qa",{conversationId:l,title:u.title??"",...u.groupType?{groupType:u.groupType}:{}});w(o,f,f.ok?200:400);return}let P=n.pathname.match(/^\/dev\/console\/groups\/([^/]+)\/custom-bot$/);if(t.method==="POST"&&P){let l=decodeURIComponent(P[1]),u=await D(t);if(!u.name||!u.webhook||!u.secret){k(o,400,"name / webhook / secret \u5FC5\u586B");return}if(!/^https?:\/\//.test(u.webhook)){k(o,400,"webhook \u5FC5\u987B\u4EE5 http(s):// \u5F00\u5934");return}let m=await oe(s),f=await Le(),y=await ve(s,m.workflowId??"group-qa",{conversationId:l,...u.title!==void 0?{title:u.title}:{},...u.groupType?{groupType:u.groupType}:{},...f?{corpId:f}:{},enabled:!0,bot:{type:"custom",name:u.name,webhookUrl:u.webhook,...u.secret?{webhookSecret:u.secret}:{}}});w(o,y,y.ok?200:400);return}if(t.method==="GET"&&n.pathname==="/dev/console/group-config-table"){try{w(o,await Ke(r,s))}catch(l){k(o,502,l instanceof Error?l.message:"\u7FA4\u914D\u7F6E\u8868\u8BFB\u53D6\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/console/group-config-table/flush-staging"){let l=await ie(r,s);w(o,l,l.ok?200:400);return}let G=n.pathname.match(/^\/dev\/console\/group-config-table\/([^/]+)$/);if(t.method==="POST"&&G){let l=decodeURIComponent(G[1]),u=await D(t),f=(await z(r,s)).configTables.group_table;if(!f?.baseId||!f.tableId){k(o,400,"\u7FA4\u914D\u7F6E\u8868\u5C1A\u672A\u5C31\u7EEA");return}try{let y=await We(f.baseId,f.tableId,l,u);w(o,y,y.ok?200:400)}catch(y){k(o,502,y instanceof Error?y.message:"\u7FA4\u914D\u7F6E\u8868\u5199\u5165\u5931\u8D25")}return}if(t.method==="POST"&&n.pathname==="/dev/kb/official"){let l=await D(t);if(!l.roleId||typeof l.enabled!="boolean"){w(o,{ok:!1,code:"KB_BAD_REQUEST",message:"roleId \u4E0E enabled(boolean) \u5FC5\u586B"},400);return}let u;try{u=await $e(r,s,l.roleId,l.enabled)}catch(m){w(o,{ok:!1,code:"KB_TOGGLE_FAILED",message:m instanceof Error?m.message:"\u5B98\u65B9\u77E5\u8BC6\u5E93\u5F00\u5173\u5931\u8D25",collections:[]},400);return}w(o,u,u.ok?200:400);return}if(t.method==="POST"&&n.pathname==="/dev/kb/recompile"){let l=await je(r);w(o,l);return}if(t.method==="GET"&&n.pathname==="/dev/console/mode"){w(o,{ok:!0,mode:p,promotable:p==="setup"&&!!d});return}if(t.method==="POST"&&n.pathname==="/dev/console/promote"){if(p==="runtime"){w(o,{ok:!0,mode:"runtime"});return}if(!d){k(o,409,"\u5F53\u524D\u63A7\u5236\u53F0\u4E0D\u652F\u6301\u5C31\u5730\u664B\u5347\uFF08setup \u547D\u4EE4\u8BF7\u4F7F\u7528 aitable-workflow start\uFF09");return}if(E.phase!=="done"){k(o,409,"\u642D\u5EFA\u5C1A\u672A\u5B8C\u6210\uFF0C\u65E0\u6CD5\u8FDB\u5165\u8FD0\u884C\u6A21\u5F0F");return}try{let l=await st({configPath:r,...d});l.ok?w(o,{ok:!0,mode:"runtime"}):w(o,{ok:!1,mode:"setup",error:l.error},l.status)}catch(l){let u=l instanceof Z?l.status:500;k(o,u,l instanceof Error?l.message:String(l))}return}if(t.method==="GET"&&n.pathname==="/dev/run/status"){if(p==="setup"){w(o,{ok:!0,status:"unknown"});return}w(o,{ok:!0,...rt()});return}let C={"/dev/run/start":"start","/dev/run/stop":"stop"}[n.pathname];if(t.method==="POST"&&C){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u4E0D\u652F\u6301\u8FD0\u884C\u63A7\u5236\uFF0C\u8BF7\u4F7F\u7528 aitable-workflow start \u547D\u4EE4");return}let l=await Po(C,g);w(o,{...l,status:rt()});return}if(t.method==="POST"&&n.pathname==="/dev/workflow/trigger-once"){if(p==="setup"){k(o,409,"setup \u6A21\u5F0F\u6CA1\u6709\u8FD0\u884C\u4E2D\u7684\u5F15\u64CE\uFF0C\u65E0\u6CD5\u89E6\u53D1\u5DE5\u4F5C\u6D41");return}let l;try{l=await D(t)}catch(u){k(o,400,u instanceof Error?u.message:String(u));return}try{let u=await xo(String(l.workflowId??""),g);w(o,{ok:!0,...u})}catch(u){let m=u instanceof F?u.status:500;k(o,m,u instanceof Error?u.message:String(u))}return}k(o,404,"Unknown endpoint")}a(Eo,"handleDevApi");function rt(){return v}a(rt,"getRuntimeRunStatus");async function Po(e,n){let t=ct.randomUUID();return e==="start"?v.status==="running"||v.status==="starting"?{ok:!0,action:e,requestId:t}:(v={status:"starting",since:new Date().toISOString(),lastError:null},Q=Q.then(()=>{let o=n.start();v.status==="starting"&&(v={status:"running",since:new Date().toISOString(),lastError:null}),o.catch(r=>{v={status:"error",lastError:r instanceof Error?r.message:String(r)}})}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):e==="stop"?v.status==="stopping"?{ok:!0,action:e,requestId:t}:v.status!=="running"&&v.status!=="starting"?(v={status:"stopped",lastError:null},{ok:!0,action:e,requestId:t}):(v={status:"stopping",lastError:null},Q=Q.then(async()=>{await n.stop(),v={status:"stopped",lastError:null}}).catch(o=>{v={status:"error",lastError:o instanceof Error?o.message:String(o)}}),{ok:!0,action:e,requestId:t}):{ok:!1,action:e,requestId:t}}a(Po,"handleRuntimeRunControl");async function xo(e,n,t={}){if(typeof e!="string"||e.length===0)throw new F(400,"\u7F3A\u5C11 workflowId");if(!n.instances.some(i=>i.id===e)){let i=n.instances.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09";throw new F(400,`\u672A\u77E5\u5DE5\u4F5C\u6D41 "${e}"\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${i}`)}if(ne.has(e))throw new F(409,`\u5DE5\u4F5C\u6D41 "${e}" \u6B63\u5728\u89E6\u53D1\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210`);ne.add(e);let o=new AbortController,r=null,s=t.timeoutMs??ko;try{let i=new Promise((p,g)=>{r=setTimeout(()=>{o.abort(),g(new F(504,`\u89E6\u53D1\u8D85\u65F6\uFF08${s}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u6267\u884C`))},s)}),c=await Promise.race([n.triggerWorkflowOnce(e,{signal:o.signal}),i]);return{workflowId:e,...c}}catch(i){throw i instanceof F?i:new F(500,i instanceof Error?i.message:String(i))}finally{r&&clearTimeout(r),ne.delete(e)}}a(xo,"handleTriggerWorkflowOnce");function dn(){ne.clear()}a(dn,"resetTriggerOnceForTest");async function st(e,n={}){if(le)throw new Z(409,"\u664B\u5347\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7B49\u672C\u6B21\u5B8C\u6210");le=!0;let t=n.timeoutMs??So,o=null;try{let r=new Promise((i,c)=>{o=setTimeout(()=>c(new Z(504,`\u88C5\u914D\u8D85\u65F6\uFF08${t}ms\uFF09\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u664B\u5347`)),t)}),s=await Promise.race([e.assembleApp(e.configPath),r]);if(e.commit(s),v={status:"idle"},e.access)try{await pt(e.access.configDir,{url:e.access.url,port:e.access.port,mode:"runtime",pid:process.pid,since:new Date().toISOString()})}catch(i){console.error(`[console] console-access.json \u91CD\u5199\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`)}return it({ok:!0,mode:"runtime"}),{ok:!0,mode:"runtime"}}catch(r){let s=r instanceof Z?r.status:500,i=r instanceof Error?r.message:String(r);console.error(`[console] setup\u2192runtime \u664B\u5347\u5931\u8D25: ${i}`);let c={ok:!1,mode:"setup",status:s,error:i};return it(c),c}finally{o&&clearTimeout(o),le=!1}}a(st,"handleConsolePromotion");function it(e){if(E.phase==="done")if(e.ok){let{promotionError:n,...t}=E;E={...t,mode:"runtime"}}else E={...E,mode:"setup",promotionError:e.error}}a(it,"applyPromotionToDoneProgress");function pn(){v={status:"idle"},Q=Promise.resolve()}a(pn,"resetRuntimeRunStatusForTest");function gn(){le=!1,E={phase:"idle"},v={status:"idle"}}a(gn,"resetPromotionForTest");function fn(e){E=e}a(fn,"setSetupProgressForTest");function mn(){return E}a(mn,"getSetupProgressForTest");function at(e,n){let t=e.trim();if(!t||!/\.(ya?ml|json)$/i.test(t))return null;try{return Te(n,t,{allowRoot:!1})}catch{return null}}a(at,"resolveInsideConfigDir");function Oo(e,n){try{return/\.json$/i.test(e)?JSON.parse(n):Re.parse(n),null}catch(t){return`${/\.json$/i.test(e)?"JSON":"YAML"} \u8BED\u6CD5\u9519\u8BEF\uFF0C\u672A\u4FDD\u5B58: ${t instanceof Error?t.message:String(t)}`}}a(Oo,"validateStructuredText");function Ao(e){let n=Object.values(e.trackers).find(t=>t.baseId&&t.tableId);return n?.baseId?`https://alidocs.dingtalk.com/i/nodes/${encodeURIComponent(n.baseId)}`:null}a(Ao,"deriveBaseUrl");async function _o(e,n,t){let o;try{let i=decodeURIComponent(e.pathname).replace(/^\/+/,"")||"index.html";o=Te(t,i,{allowRoot:!1})}catch{n.writeHead(403),n.end("Forbidden");return}try{(await Xe(o)).isDirectory()&&(o=I.join(o,"index.html"))}catch{o=I.join(t,"index.html")}try{await Xe(o)}catch{n.writeHead(404),n.end("Not Found");return}let r=I.extname(o),s=ho[r]??"application/octet-stream";n.writeHead(200,{"Content-Type":s}),so(o).pipe(n)}a(_o,"serveStatic");export{$o as a,Ze as b,ot as c,bo as d,F as e,Z as f,vo as g,ut as h,ln as i,dt as j,pt as k,Co as l,un as m,rt as n,Po as o,xo as p,dn as q,st as r,pn as s,gn as t,fn as u,mn as v,_o as w};
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as He,b as Je,m as Ve}from"./chunk-EBWAXFSI.js";import"./chunk-4B6V7VHM.js";import{b as X,d as W,e as ke,f as qe,g as Q}from"./chunk-N2ATMPTO.js";import{a as c}from"./chunk-EI7MMDWY.js";import{config as dn}from"dotenv";import{Command as di}from"commander";import{logger as mn,activateGlobalDwsOnPath as ui,initSlsReport as gi}from"aitable-workflow-core";import{createRequire as hn}from"module";var Ke="aitable-workflow-",wn=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function Ye(){try{return hn(import.meta.url)("../package.json")}catch{return{}}}c(Ye,"loadCliPackageManifest");function be(r){return r.version??"0.0.0"}c(be,"resolveCliVersion");function ze(r){let t=be(r),e={};r.name?.startsWith(Ke)&&(e[r.name]=t);for(let[n,o]of Object.entries(r.dependencies??{}))n.startsWith(Ke)&&(e[n]=wn.test(o)?o:t);return e}c(ze,"resolveMonorepoPackageVersions");import un from"path";import{fileURLToPath as fi}from"url";var Xe="./aitable-workflow.config.yml";import{runInit as yn,logger as vn}from"aitable-workflow-core";import kn from"path";function Qe(r,t){r.command("init").description("\u4EA4\u4E92\u5F0F\u521D\u59CB\u5316 \u2014 \u9009\u62E9 Coding Agent\u3001\u914D\u7F6E\u5DE5\u4F5C\u76EE\u5F55\u3001\u63CF\u8FF0\u4E1A\u52A1\u573A\u666F\uFF1B\u6216\u7528 --template \u4ECE\u53EF\u7528\u6A21\u677F\u811A\u624B\u67B6").option("-c, --config <path>","\u76EE\u6807\u76EE\u5F55\u6216\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09").option("-f, --force","\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6").option("-y, --yes","\u4F7F\u7528\u9ED8\u8BA4\u503C\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u5411\u5BFC").option("-t, --template <name>","\u4ECE\u5F53\u524D\u53D1\u884C\u5305\u63D0\u4F9B\u7684\u6A21\u677F\u811A\u624B\u67B6\uFF0C\u62F7\u8D1D\u5B8C\u6574\u53EF\u8FD0\u884C\u9879\u76EE\u5230\u76EE\u6807\u76EE\u5F55").option("--profile <name>","\u9009\u5B9A\u6A21\u677F\u4E0B\u7684 profile \u4E1A\u52A1\u5305\uFF0C\u8986\u76D6\u5F0F\u53E0\u52A0\u5230\u5B9E\u4F8B").action(async e=>{try{await yn({config:e.config,force:!!e.force,yes:!!e.yes,template:e.template,profile:e.profile,templatesDir:kn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),vn.error("cli","\u521D\u59CB\u5316\u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Qe,"registerInitCommand");import{runMigrate as bn,logger as Rn}from"aitable-workflow-core";import Cn from"path";function Ze(r,t){r.command("migrate").description("\u5347\u7EA7\u9879\u76EE\u76EE\u5F55\u5230\u6700\u65B0\u6A21\u677F\u7248\u672C\uFF0C\u81EA\u52A8\u4FDD\u7559\u7528\u6237\u914D\u7F6E\uFF1B\u6216\u7528 --from/--to \u5728\u4E24\u4E2A\u76EE\u5F55\u95F4\u505A\u5408\u5E76\u8FC1\u79FB").option("-c, --config <path>","\u9879\u76EE\u76EE\u5F55\u8DEF\u5F84",t.defaultConfig).option("--from <dir>","\u6E90\u76EE\u5F55\uFF1A\u4EE5\u8BE5\u76EE\u5F55\u4E3A\u8FC1\u79FB\u57FA\u51C6\uFF08\u4E0D\u6309\u540D scaffold \u6A21\u677F\uFF09\uFF0C\u4E0E --template/--profile \u4E92\u65A5").option("--to <dir>","\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08--config \u7684\u540C\u4E49\u53C2\u6570\uFF0C\u4F18\u5148\u751F\u6548\uFF09").option("--dry-run","\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--no-backup","\u8DF3\u8FC7\u81EA\u52A8\u5907\u4EFD").option("--force","\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A").option("--template <name>","\u6307\u5B9A\u76EE\u6807\u6A21\u677F").option("--profile <name>","\u6307\u5B9A\u76EE\u6807 profile").option("--rollback","\u56DE\u6EDA\u5230\u4E0A\u4E00\u6B21\u8FC1\u79FB\u524D\u7684\u72B6\u6001").option("--list","\u5217\u51FA\u6240\u6709\u5907\u4EFD").action(async e=>{try{await bn({config:e.config,from:e.from,to:e.to,dryRun:e.dryRun,noBackup:e.backup===!1,force:e.force,template:e.template,profile:e.profile,rollback:e.rollback,list:e.list,templatesDir:Cn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Rn.error("cli","migrate \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Ze,"registerMigrateCommand");import{runDesignCommand as In,logger as Sn}from"aitable-workflow-core";function et(r,t){r.command("design").description("\u8BA9 Coding Agent \u6839\u636E\u573A\u666F\u63CF\u8FF0\u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("-y, --yes","\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u8865\u5145\uFF0C\u76F4\u63A5\u4F7F\u7528 config \u4E2D\u7684 scene").option("--skip-questions","\u4E0D\u56DE\u7B54 Agent \u7684\u6F84\u6E05\u63D0\u95EE\uFF08Agent \u6309\u5047\u8BBE\u751F\u6210\u5E76\u5217\u51FA\u5F85\u786E\u8BA4\u9879\uFF09").action(async e=>{try{await In(e)}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Sn.error("cli","design \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(et,"registerDesignCommand");import{runCheck as An,runSetupCommand as En,checkMigrateHint as xn,logger as Tn,reportCliEvent as Z,setReportProject as $n}from"aitable-workflow-core";import nt from"path";function Re(r){return r.skipConfig||r.skipConfigIfValid&&r.configValid===!0}c(Re,"canSkipSetupConfig");function tt(r){return Re(r)?"setup":r.uiEnabled&&r.webAvailable?"web":"cli"}c(tt,"resolveSetupConfigRoute");function ot(r,t){r.command("setup").description("\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E\uFF0C\u518D\u521D\u59CB\u5316 AI \u8868\u683C\u7ED3\u6784 + \u51C6\u5907\u77E5\u8BC6\u5E93 \u2014 \u4E00\u6B21\u5B8C\u6210 config + \u5EFA\u8868").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("--no-clean","\u4E0D\u6E05\u7406\u7A7A\u767D\u884C").option("--no-kb","\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u51C6\u5907/\u7F16\u8BD1").option("--kb-full","\u5F3A\u5236\u5168\u91CF\u91CD\u7F16\u8BD1\u77E5\u8BC6\u5E93").option("--skip-config","\u8DF3\u8FC7\u524D\u7F6E\u7684\u4EA4\u4E92\u5F0F\u914D\u7F6E\u6821\u9A8C\uFF08CI/\u5DF2\u786E\u8BA4\u914D\u7F6E\u65F6\u4F7F\u7528\uFF09").option("--skip-config-if-valid","\u5148\u6821\u9A8C\u914D\u7F6E\uFF1B\u65E0\u963B\u65AD\u9879\u65F6\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u76F4\u63A5\u5F00\u59CB\u642D\u5EFA").option("--no-ui","\u5F3A\u5236\u4F7F\u7528\u547D\u4EE4\u884C\u4EA4\u4E92\uFF08\u8DF3\u8FC7\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762\uFF09").option("--only <round>","\u53EA\u6267\u884C\u6307\u5B9A\u73AF\u8282\uFF1B\u5F53\u524D\u4EC5\u652F\u6301 automations\uFF08\u6309 profile \u5F00\u5173\u5BF9\u9F50\u81EA\u52A8\u5316\uFF0C\u4E0D\u5EFA\u8868\u3001\u4E0D\u7F16\u77E5\u8BC6\u5E93\uFF09").action(async e=>{e.only!==void 0&&e.only!=="automations"&&(console.error(`\u2717 --only \u4E0D\u652F\u6301\u300C${e.only}\u300D\uFF0C\u5F53\u524D\u552F\u4E00\u5408\u6CD5\u503C\uFF1Aautomations`),process.exit(1));let n=e.only==="automations";$n(e.config);let o=Date.now();Z("setup.start",{skipConfig:e.skipConfig===!0,clean:e.clean,kb:e.kb,kbFull:e.kbFull===!0,ui:e.ui!==!1,...n?{only:"automations"}:{}});try{if(await xn(nt.dirname(nt.resolve(e.config)),t.version),!e.skipConfig&&!n){let i=e.ui!==!1,s=!1;if(e.skipConfigIfValid){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u9879\u76EE\u914D\u7F6E");let a=await An({configPath:e.config});if(s=Re({skipConfig:!1,skipConfigIfValid:!0,configValid:a.ok}),s){let l=[];a.summary.warnings>0&&l.push(`${a.summary.warnings} \u9879\u8B66\u544A`),a.summary.suggestions>0&&l.push(`${a.summary.suggestions} \u9879\u5EFA\u8BAE`);let p=l.length>0?`\uFF08${l.join("\uFF0C")}\uFF0C\u5747\u4E0D\u963B\u65AD\uFF09`:"";console.log(`\u2713 \u914D\u7F6E\u65E0\u963B\u65AD\u9879${p}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u7EE7\u7EED\u642D\u5EFA\u3002`)}else console.log(`\u2139 \u68C0\u6D4B\u5230 ${a.summary.errors} \u9879\u963B\u65AD\uFF0C\u8FDB\u5165\u914D\u7F6E\u73AF\u8282\u3002`)}if(!s&&i){let{hasWebRoot:a,runConfigUI:l}=await import("./config-ui-server-XP5PCGCM.js");if(tt({skipConfig:!1,skipConfigIfValid:e.skipConfigIfValid===!0,uiEnabled:i,webAvailable:a(),configValid:s})==="web"){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");try{await l({configPath:e.config,setupOptions:{clean:e.clean,kb:e.kb,kbFull:e.kbFull}}),Z("setup.finish",{success:!0,route:"web",durationMs:Date.now()-o});return}catch(m){console.warn(`
2
+ import{a as He,b as Je,m as Ve}from"./chunk-YDJTCQW4.js";import"./chunk-4B6V7VHM.js";import{b as X,d as W,e as ke,f as qe,g as Q}from"./chunk-N2ATMPTO.js";import{a as c}from"./chunk-EI7MMDWY.js";import{config as dn}from"dotenv";import{Command as di}from"commander";import{logger as mn,activateGlobalDwsOnPath as ui,initSlsReport as gi}from"aitable-workflow-core";import{createRequire as hn}from"module";var Ke="aitable-workflow-",wn=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function Ye(){try{return hn(import.meta.url)("../package.json")}catch{return{}}}c(Ye,"loadCliPackageManifest");function be(r){return r.version??"0.0.0"}c(be,"resolveCliVersion");function ze(r){let t=be(r),e={};r.name?.startsWith(Ke)&&(e[r.name]=t);for(let[n,o]of Object.entries(r.dependencies??{}))n.startsWith(Ke)&&(e[n]=wn.test(o)?o:t);return e}c(ze,"resolveMonorepoPackageVersions");import un from"path";import{fileURLToPath as fi}from"url";var Xe="./aitable-workflow.config.yml";import{runInit as yn,logger as vn}from"aitable-workflow-core";import kn from"path";function Qe(r,t){r.command("init").description("\u4EA4\u4E92\u5F0F\u521D\u59CB\u5316 \u2014 \u9009\u62E9 Coding Agent\u3001\u914D\u7F6E\u5DE5\u4F5C\u76EE\u5F55\u3001\u63CF\u8FF0\u4E1A\u52A1\u573A\u666F\uFF1B\u6216\u7528 --template \u4ECE\u53EF\u7528\u6A21\u677F\u811A\u624B\u67B6").option("-c, --config <path>","\u76EE\u6807\u76EE\u5F55\u6216\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09").option("-f, --force","\u8986\u76D6\u5DF2\u6709\u914D\u7F6E\u6587\u4EF6").option("-y, --yes","\u4F7F\u7528\u9ED8\u8BA4\u503C\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u5411\u5BFC").option("-t, --template <name>","\u4ECE\u5F53\u524D\u53D1\u884C\u5305\u63D0\u4F9B\u7684\u6A21\u677F\u811A\u624B\u67B6\uFF0C\u62F7\u8D1D\u5B8C\u6574\u53EF\u8FD0\u884C\u9879\u76EE\u5230\u76EE\u6807\u76EE\u5F55").option("--profile <name>","\u9009\u5B9A\u6A21\u677F\u4E0B\u7684 profile \u4E1A\u52A1\u5305\uFF0C\u8986\u76D6\u5F0F\u53E0\u52A0\u5230\u5B9E\u4F8B").action(async e=>{try{await yn({config:e.config,force:!!e.force,yes:!!e.yes,template:e.template,profile:e.profile,templatesDir:kn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),vn.error("cli","\u521D\u59CB\u5316\u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Qe,"registerInitCommand");import{runMigrate as bn,logger as Rn}from"aitable-workflow-core";import Cn from"path";function Ze(r,t){r.command("migrate").description("\u5347\u7EA7\u9879\u76EE\u76EE\u5F55\u5230\u6700\u65B0\u6A21\u677F\u7248\u672C\uFF0C\u81EA\u52A8\u4FDD\u7559\u7528\u6237\u914D\u7F6E\uFF1B\u6216\u7528 --from/--to \u5728\u4E24\u4E2A\u76EE\u5F55\u95F4\u505A\u5408\u5E76\u8FC1\u79FB").option("-c, --config <path>","\u9879\u76EE\u76EE\u5F55\u8DEF\u5F84",t.defaultConfig).option("--from <dir>","\u6E90\u76EE\u5F55\uFF1A\u4EE5\u8BE5\u76EE\u5F55\u4E3A\u8FC1\u79FB\u57FA\u51C6\uFF08\u4E0D\u6309\u540D scaffold \u6A21\u677F\uFF09\uFF0C\u4E0E --template/--profile \u4E92\u65A5").option("--to <dir>","\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08--config \u7684\u540C\u4E49\u53C2\u6570\uFF0C\u4F18\u5148\u751F\u6548\uFF09").option("--dry-run","\u4EC5\u9884\u89C8\u53D8\u66F4\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--no-backup","\u8DF3\u8FC7\u81EA\u52A8\u5907\u4EFD").option("--force","\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A").option("--template <name>","\u6307\u5B9A\u76EE\u6807\u6A21\u677F").option("--profile <name>","\u6307\u5B9A\u76EE\u6807 profile").option("--rollback","\u56DE\u6EDA\u5230\u4E0A\u4E00\u6B21\u8FC1\u79FB\u524D\u7684\u72B6\u6001").option("--list","\u5217\u51FA\u6240\u6709\u5907\u4EFD").action(async e=>{try{await bn({config:e.config,from:e.from,to:e.to,dryRun:e.dryRun,noBackup:e.backup===!1,force:e.force,template:e.template,profile:e.profile,rollback:e.rollback,list:e.list,templatesDir:Cn.resolve(t.cliDir,"..","templates"),templatePackageVersions:t.packageVersions,cliVersion:t.version})}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Rn.error("cli","migrate \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(Ze,"registerMigrateCommand");import{runDesignCommand as In,logger as Sn}from"aitable-workflow-core";function et(r,t){r.command("design").description("\u8BA9 Coding Agent \u6839\u636E\u573A\u666F\u63CF\u8FF0\u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("-y, --yes","\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u8865\u5145\uFF0C\u76F4\u63A5\u4F7F\u7528 config \u4E2D\u7684 scene").option("--skip-questions","\u4E0D\u56DE\u7B54 Agent \u7684\u6F84\u6E05\u63D0\u95EE\uFF08Agent \u6309\u5047\u8BBE\u751F\u6210\u5E76\u5217\u51FA\u5F85\u786E\u8BA4\u9879\uFF09").action(async e=>{try{await In(e)}catch(n){n instanceof Error&&n.message.includes("cancelled")&&process.exit(0),Sn.error("cli","design \u5931\u8D25",{error:n instanceof Error?n.message:String(n)}),process.exit(1)}})}c(et,"registerDesignCommand");import{runCheck as An,runSetupCommand as En,checkMigrateHint as xn,logger as Tn,reportCliEvent as Z,setReportProject as $n}from"aitable-workflow-core";import nt from"path";function Re(r){return r.skipConfig||r.skipConfigIfValid&&r.configValid===!0}c(Re,"canSkipSetupConfig");function tt(r){return Re(r)?"setup":r.uiEnabled&&r.webAvailable?"web":"cli"}c(tt,"resolveSetupConfigRoute");function ot(r,t){r.command("setup").description("\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E\uFF0C\u518D\u521D\u59CB\u5316 AI \u8868\u683C\u7ED3\u6784 + \u51C6\u5907\u77E5\u8BC6\u5E93 \u2014 \u4E00\u6B21\u5B8C\u6210 config + \u5EFA\u8868").option("-c, --config <path>","\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84",t.defaultConfig).option("--no-clean","\u4E0D\u6E05\u7406\u7A7A\u767D\u884C").option("--no-kb","\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u51C6\u5907/\u7F16\u8BD1").option("--kb-full","\u5F3A\u5236\u5168\u91CF\u91CD\u7F16\u8BD1\u77E5\u8BC6\u5E93").option("--skip-config","\u8DF3\u8FC7\u524D\u7F6E\u7684\u4EA4\u4E92\u5F0F\u914D\u7F6E\u6821\u9A8C\uFF08CI/\u5DF2\u786E\u8BA4\u914D\u7F6E\u65F6\u4F7F\u7528\uFF09").option("--skip-config-if-valid","\u5148\u6821\u9A8C\u914D\u7F6E\uFF1B\u65E0\u963B\u65AD\u9879\u65F6\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u76F4\u63A5\u5F00\u59CB\u642D\u5EFA").option("--no-ui","\u5F3A\u5236\u4F7F\u7528\u547D\u4EE4\u884C\u4EA4\u4E92\uFF08\u8DF3\u8FC7\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762\uFF09").option("--only <round>","\u53EA\u6267\u884C\u6307\u5B9A\u73AF\u8282\uFF1B\u5F53\u524D\u4EC5\u652F\u6301 automations\uFF08\u6309 profile \u5F00\u5173\u5BF9\u9F50\u81EA\u52A8\u5316\uFF0C\u4E0D\u5EFA\u8868\u3001\u4E0D\u7F16\u77E5\u8BC6\u5E93\uFF09").action(async e=>{e.only!==void 0&&e.only!=="automations"&&(console.error(`\u2717 --only \u4E0D\u652F\u6301\u300C${e.only}\u300D\uFF0C\u5F53\u524D\u552F\u4E00\u5408\u6CD5\u503C\uFF1Aautomations`),process.exit(1));let n=e.only==="automations";$n(e.config);let o=Date.now();Z("setup.start",{skipConfig:e.skipConfig===!0,clean:e.clean,kb:e.kb,kbFull:e.kbFull===!0,ui:e.ui!==!1,...n?{only:"automations"}:{}});try{if(await xn(nt.dirname(nt.resolve(e.config)),t.version),!e.skipConfig&&!n){let i=e.ui!==!1,s=!1;if(e.skipConfigIfValid){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u9879\u76EE\u914D\u7F6E");let a=await An({configPath:e.config});if(s=Re({skipConfig:!1,skipConfigIfValid:!0,configValid:a.ok}),s){let l=[];a.summary.warnings>0&&l.push(`${a.summary.warnings} \u9879\u8B66\u544A`),a.summary.suggestions>0&&l.push(`${a.summary.suggestions} \u9879\u5EFA\u8BAE`);let p=l.length>0?`\uFF08${l.join("\uFF0C")}\uFF0C\u5747\u4E0D\u963B\u65AD\uFF09`:"";console.log(`\u2713 \u914D\u7F6E\u65E0\u963B\u65AD\u9879${p}\uFF0C\u8DF3\u8FC7\u914D\u7F6E\u754C\u9762\u5E76\u7EE7\u7EED\u642D\u5EFA\u3002`)}else console.log(`\u2139 \u68C0\u6D4B\u5230 ${a.summary.errors} \u9879\u963B\u65AD\uFF0C\u8FDB\u5165\u914D\u7F6E\u73AF\u8282\u3002`)}if(!s&&i){let{hasWebRoot:a,runConfigUI:l}=await import("./config-ui-server-4SVD42Z3.js");if(tt({skipConfig:!1,skipConfigIfValid:e.skipConfigIfValid===!0,uiEnabled:i,webAvailable:a(),configValid:s})==="web"){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u53EF\u89C6\u5316\u914D\u7F6E\u754C\u9762");try{await l({configPath:e.config,setupOptions:{clean:e.clean,kb:e.kb,kbFull:e.kbFull}}),Z("setup.finish",{success:!0,route:"web",durationMs:Date.now()-o});return}catch(m){console.warn(`
3
3
  \u26A0 \u53EF\u89C6\u5316\u754C\u9762\u5F02\u5E38\uFF0C\u56DE\u9000\u5230\u547D\u4EE4\u884C\u4EA4\u4E92: ${m instanceof Error?m.message:String(m)}
4
4
  `)}}}if(!s){console.log("\u{1F4CB} \u6B65\u9AA4 1/2\uFF1A\u6821\u9A8C\u5E76\u8865\u9F50\u9879\u76EE\u914D\u7F6E");let{runConfigCommand:a}=await import("./config-command-7ECUJOEU.js");(await a({configPath:e.config,interactive:!0,offerSkipToBuild:!0})).ok||(console.error(`
5
5
  \u2717 \u9879\u76EE\u914D\u7F6E\u4ECD\u4E0D\u5B8C\u6574\uFF0C\u5DF2\u4E2D\u6B62 setup\u3002\u8BF7\u8865\u9F50\u5FC5\u586B\u9879\u540E\u91CD\u8BD5\uFF08\u6216\u7528 --skip-config \u8DF3\u8FC7\uFF09\u3002`),process.exit(1))}console.log(`
@@ -1 +1 @@
1
- import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m,p as n,q as o,r as p,s as q,t as r,u as s,v as t,w as u}from"./chunk-EBWAXFSI.js";import"./chunk-4B6V7VHM.js";import"./chunk-EI7MMDWY.js";export{h as CONSOLE_ACCESS_FILE_REL,d as PromotionHttpError,c as TriggerOnceHttpError,j as clearConsoleAccessFile,a as consoleStartPath,b as createIdleTimer,e as detectEnvironment,l as getRuntimeRunStatus,t as getSetupProgressForTest,p as handleConsolePromotion,m as handleRuntimeRunControl,n as handleTriggerWorkflowOnce,g as hasWebRoot,r as resetPromotionForTest,q as resetRuntimeRunStatusForTest,o as resetTriggerOnceForTest,f as resolveWebRoot,k as runConfigUI,u as serveStatic,s as setSetupProgressForTest,i as writeConsoleAccessFile};
1
+ import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m,p as n,q as o,r as p,s as q,t as r,u as s,v as t,w as u}from"./chunk-YDJTCQW4.js";import"./chunk-4B6V7VHM.js";import"./chunk-EI7MMDWY.js";export{h as CONSOLE_ACCESS_FILE_REL,d as PromotionHttpError,c as TriggerOnceHttpError,j as clearConsoleAccessFile,a as consoleStartPath,b as createIdleTimer,e as detectEnvironment,l as getRuntimeRunStatus,t as getSetupProgressForTest,p as handleConsolePromotion,m as handleRuntimeRunControl,n as handleTriggerWorkflowOnce,g as hasWebRoot,r as resetPromotionForTest,q as resetRuntimeRunStatusForTest,o as resetTriggerOnceForTest,f as resolveWebRoot,k as runConfigUI,u as serveStatic,s as setSetupProgressForTest,i as writeConsoleAccessFile};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aitable-workflow-cli",
3
- "version": "0.1.27",
3
+ "version": "0.1.28-beta.1789525693558",
4
4
  "description": "aitable-workflow 命令行工具(cli):init/design/setup/run/serve 等命令;含 relay 本地反连客户端与 daemon 进程管理。bin: aitable-workflow。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,8 +19,8 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "aitable-workflow-core": "0.1.27",
23
- "aitable-workflow-server": "0.1.27",
22
+ "aitable-workflow-core": "0.1.28-beta.1789525693558",
23
+ "aitable-workflow-server": "0.1.28-beta.1789525693558",
24
24
  "@inquirer/prompts": "^8.5.2",
25
25
  "commander": "^14.0.2",
26
26
  "dotenv": "^17.4.2",