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