aitable-workflow-core 0.1.28-beta.1789611013733 → 0.1.28-beta.1789632431260

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.
Files changed (2) hide show
  1. package/dist/index.js +40 -40
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -5,9 +5,9 @@ import{a,b as ck,c as lk,d as dk,e as uk,f as fk,g as $a,h as pk,i as gk}from"./
5
5
  `)}}buildEntry(e,n,r,o){let i={ts:le(),level:e,cat:n,env:Or(),msg:r},s=La();if(s?.traceId&&(i.traceId=s.traceId),s?.uid&&(i.uid=s.uid),o!=null&&!Tk(o))i.data=gf(o);else if(o&&Object.keys(o).length>0)try{Object.assign(i,_k(o))}catch{i.data=o}return i}},h=new Wa;function Ak(t){let e=a(n=>(...r)=>{h[n](t,Ik(...r).replace(/\s+$/,""))},"emit");return{debug:e("debug"),info:e("info"),warn:e("warn"),error:e("error")}}a(Ak,"createPrintfLogger");import{createHash as Ek}from"crypto";import jr from"path";var yf=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i,mf=/[<>:"/\\|?*\u0000-\u001f]/g,Dk=/[<>:"/\\|?*\u0000-\u001f]/,ue=class extends Error{constructor(n,r){super(n);this.reason=r;this.name="PathBoundaryError"}reason;static{a(this,"PathBoundaryError")}code="PATH_BOUNDARY_VIOLATION"};function $e(t,e,n={}){let r=$k(n.flavor??"native");if(typeof t!="string"||t.trim()===""||t.includes("\0"))throw new ue("\u6839\u76EE\u5F55\u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26","INVALID_ROOT");if(typeof e!="string"||e.trim()===""||e.includes("\0"))throw new ue("\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26","INVALID_RELATIVE_PATH");if(wf(e))throw new ue(`\u4E0D\u5141\u8BB8\u7EDD\u5BF9\u8DEF\u5F84: ${e}`,"ABSOLUTE_PATH");let o=e.replace(/[\\/]+/g,r.sep),i=r.resolve(t),s=r.resolve(i,o),c=r.relative(i,s);if(c===".."||c.startsWith(`..${r.sep}`)||r.isAbsolute(c))throw new ue(`\u8DEF\u5F84\u8D8A\u51FA\u6839\u76EE\u5F55: ${e}`,"OUTSIDE_ROOT");if(c===""&&n.allowRoot===!1)throw new ue(`\u8DEF\u5F84\u4E0D\u80FD\u6307\u5411\u6839\u76EE\u5F55\u672C\u8EAB: ${e}`,"ROOT_NOT_ALLOWED");return s}a($e,"resolveInsideRoot");function Ba(t,e={}){let n=e.label??"ID",r=e.maxLength??128;if(typeof t!="string"||t.length===0||t.trim()!==t)throw new ue(`${n} \u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B\u9996\u5C3E\u7A7A\u767D`,"INVALID_PORTABLE_ID");if(t.length>r)throw new ue(`${n} \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7 ${r}`,"INVALID_PORTABLE_ID");if(t==="."||t===".."||Dk.test(t))throw new ue(`${n} \u5305\u542B\u4E0D\u53EF\u79FB\u690D\u7684\u6587\u4EF6\u540D\u5B57\u7B26: ${t}`,"INVALID_PORTABLE_ID");if(/[. ]$/.test(t))throw new ue(`${n} \u4E0D\u80FD\u4EE5\u70B9\u6216\u7A7A\u683C\u7ED3\u5C3E: ${t}`,"INVALID_PORTABLE_ID");if(yf.test(t))throw new ue(`${n} \u4F7F\u7528\u4E86 Windows \u4FDD\u7559\u8BBE\u5907\u540D: ${t}`,"INVALID_PORTABLE_ID");return t}a(Ba,"assertPortableId");function Pe(t,e={}){let n=e.fallback??"untitled",r=e.maxLength??120;if(!Number.isInteger(r)||r<16||r>255)throw new RangeError("safeFilename maxLength \u5FC5\u987B\u662F 16..255 \u7684\u6574\u6570");let o=String(t??"").normalize("NFC"),i=o.replace(mf,"-").replace(/\s+/g," ").replace(/-+/g,"-").trim().replace(/[. ]+$/g,""),s=i!==o;if((i===""||i==="."||i==="..")&&(i=n.replace(mf,"-").trim().replace(/[. ]+$/g,"")||"untitled",s=!0),yf.test(i)&&(i=`_${i}`,s=!0),i.length>r&&(s=!0),!s)return i;let c=Ek("sha256").update(o).digest("hex").slice(0,8);return Pk(i,c,r)}a(Pe,"safeFilename");function Fr(t){if(typeof t!="string"||t.trim()===""||t.includes("\0"))throw new ue("\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26","INVALID_RELATIVE_PATH");if(wf(t))throw new ue(`\u4E0D\u5141\u8BB8\u7EDD\u5BF9\u8DEF\u5F84: ${t}`,"ABSOLUTE_PATH");let e=[];for(let n of t.replace(/\\/g,"/").split("/"))if(!(n===""||n===".")){if(n==="..")throw new ue(`\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u5305\u542B ..: ${t}`,"INVALID_RELATIVE_PATH");e.push(n)}if(e.length===0)throw new ue(`\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u6307\u5411\u5F53\u524D\u76EE\u5F55: ${t}`,"INVALID_RELATIVE_PATH");return e.join("/")}a(Fr,"toPortableRelPath");function $k(t){return t==="win32"?jr.win32:t==="posix"?jr.posix:jr}a($k,"selectPathApi");function wf(t){return jr.posix.isAbsolute(t)||jr.win32.isAbsolute(t)||/^[a-zA-Z]:/.test(t)}a(wf,"isAbsoluteOnAnyPlatform");function Pk(t,e,n){let r=t.lastIndexOf("."),o=r>0&&r<t.length-1,i=o?t.slice(r):"",s=o?t.slice(0,r):t,c=`-${e}`;i.length>Math.floor(n/2)&&(i=hf(i,Math.floor(n/2)));let l=Math.max(1,n-c.length-i.length);return s=hf(s,l).replace(/[. ]+$/g,"")||"_",`${s}${c}${i}`}a(Pk,"fitWithHash");function hf(t,e){let n=0,r="";for(let o of t){if(n+o.length>e)break;r+=o,n+=o.length}return r}a(hf,"truncateUtf16");var Ua=class{static{a(this,"Tracer")}traceDir;activeSteps=new Map;seqCounters=new Map;writeQueues=new Map;constructor(e){this.traceDir=e}startStep(e,n,r,o){this.activeSteps.set(e,{itemId:e,stepId:n,stepName:r,inputs:o,startedAt:Date.now(),llmCalls:[]})}async endStep(e,n,r,o,i=[]){let s=this.activeSteps.get(e);s&&(this.activeSteps.delete(e),await this.writeStep(s,n,r,o,i))}recordLLMCall(e,n){this.activeSteps.get(e)?.llmCalls.push(n)}isActive(e){return this.activeSteps.has(e)}async getTraces(e){let n=this.itemTraceDir(e),r;try{r=await za(n)}catch{return[]}let o=r.filter(s=>s.endsWith(".json")).sort(Fk),i=[];for(let s of o)try{let c=await jk(qo.join(n,s),"utf8");i.push(JSON.parse(c))}catch{h.warn("tracer","trace \u6587\u4EF6\u4E0D\u53EF\u8BFB\u6216\u635F\u574F\uFF0C\u5DF2\u8DF3\u8FC7",{file:qo.join(n,s)})}return i}async getLatestTraces(e=10){try{let n=await za(this.traceDir),r=[];for(let o of n){let i=await this.getTraces(o);r.push(...i)}return r.sort((o,i)=>new Date(i.started_at).getTime()-new Date(o.started_at).getTime()),r.slice(0,e)}catch{return[]}}writeStep(e,n,r,o,i=[]){let s=Date.now(),l=(this.writeQueues.get(e.itemId)??Promise.resolve()).then(async()=>{let d=await this.nextSeq(e.itemId),u={step_id:e.stepId,step_name:e.stepName,item_id:e.itemId,seq:d,started_at:le(new Date(e.startedAt)),ended_at:le(new Date(s)),duration_ms:s-e.startedAt,status:n,llm_calls:e.llmCalls,inputs:e.inputs,outputs:r,logs:i,error:o??null};await this.writeTrace(e.itemId,d,e.stepId,u)}).catch(d=>{h.warn("tracer","trace \u5199\u5165\u5931\u8D25",{itemId:e.itemId,stepId:e.stepId,error:d instanceof Error?d.message:String(d)})}).finally(()=>{this.writeQueues.get(e.itemId)===l&&this.writeQueues.delete(e.itemId)});return this.writeQueues.set(e.itemId,l),l}async nextSeq(e){let n=this.seqCounters.get(e),r=n!==void 0?n+1:await this.countTraceFiles(e)+1;return this.seqCounters.set(e,r),r}async countTraceFiles(e){try{return(await za(this.itemTraceDir(e))).filter(r=>r.endsWith(".json")).length}catch{return 0}}async writeTrace(e,n,r,o){let i=this.itemTraceDir(e);await Mk(i,{recursive:!0});let s=le().slice(0,23).replace(/[:.]/g,"-"),c=Pe(r,{fallback:"step",maxLength:80}),l=`${String(n).padStart(3,"0")}-${c}-${s}.json`,d=qo.join(i,l);await Ok(d,JSON.stringify(o,null,2),"utf8"),h.debug("tracer","trace \u5DF2\u5199\u5165",{filepath:d})}itemTraceDir(e){return qo.join(this.traceDir,Pe(e,{fallback:"item",maxLength:100}))}};function Fk(t,e){let n=Number.parseInt(t,10),r=Number.parseInt(e,10);return Number.isNaN(n)||Number.isNaN(r)||n===r?t.localeCompare(e):n-r}a(Fk,"compareBySeq");var Ka=null;function bf(t){return Ka=new Ua(t),Ka}a(bf,"initTracer");function Ho(){return Ka}a(Ho,"getTracer");function Nk(t){let e=t.llm??{provider:"idealab",model:"Qwen3.7-Max-DogFooding"};return{async chat(n,r){let o=r?.model??e.model,i=e.api_key;if(!i)throw new Error("LLM API Key \u672A\u914D\u7F6E\uFF0C\u8BF7\u5728 recipe.llm.api_key \u7528 ${env.XXX} \u4ECE\u73AF\u5883\u6CE8\u5165");return h.debug("llm","chat \u8C03\u7528",{model:o,promptLength:n.length}),await Lk(e.provider,i,{model:o,messages:[...r?.systemPrompt?[{role:"system",content:r.systemPrompt}]:[],{role:"user",content:n}],temperature:r?.temperature,max_tokens:r?.maxTokens},t.itemId)},async chatJSON(n,r,o){let s=r.type==="array",c=[n,"","\u8BF7\u4EE5\u4E25\u683C JSON \u683C\u5F0F\u8F93\u51FA\uFF0C\u7B26\u5408\u4EE5\u4E0B schema\uFF1A","```json",JSON.stringify(r,null,2),"```",s?"\u53EA\u8F93\u51FA JSON \u6570\u7EC4\uFF08\u4EE5 [ \u5F00\u5934\u3001] \u7ED3\u5C3E\uFF09\uFF0C\u4E0D\u8981\u5305\u88F9\u5728\u4EFB\u4F55\u5BF9\u8C61\u4E2D\uFF0C\u4E0D\u8981\u6709\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002":"\u53EA\u8F93\u51FA JSON\uFF0C\u4E0D\u8981\u6709\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002"].join(`
6
6
  `),l=await this.chat(c,o),d=kf(l),u;try{u=JSON.parse(d)}catch{throw new Error(`LLM \u8F93\u51FA\u4E0D\u662F\u6709\u6548 JSON: ${l.slice(0,200)}`)}if(s&&!Array.isArray(u)&&u&&typeof u=="object"){let f=u;for(let p of Object.values(f))if(Array.isArray(p)){u=p;break}}return u},async classify(n,r){let o=[`\u8BF7\u5C06\u4EE5\u4E0B\u6587\u672C\u5206\u7C7B\u5230\u8FD9\u4E9B\u7C7B\u522B\u4E4B\u4E00\uFF1A${r.join("\u3001")}`,"",`\u6587\u672C: ${n}`,"",'\u8BF7\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\uFF1A{"category": "\u7C7B\u522B\u540D", "confidence": 0.95}',"\u53EA\u8F93\u51FA JSON\u3002"].join(`
7
7
  `),i=await this.chat(o,{temperature:0}),s=kf(i);try{let c=JSON.parse(s);return r.includes(c.category)||(c.category=r[0],c.confidence=0),c}catch{return{category:r[0],confidence:0}}}}}a(Nk,"createLLMToolkit");async function Lk(t,e,n,r){let{url:o,headers:i,body:s}=Wk(t,e,n),c=Date.now(),l=await fetch(o,{method:"POST",headers:i,body:JSON.stringify(s)});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`LLM API \u8C03\u7528\u5931\u8D25 (${l.status}): ${g.slice(0,300)}`)}let d=await l.json(),u=Bk(t,d),f=Date.now()-c,p=Ho();if(r&&p?.isActive(r)){let g=n.messages.map(y=>y.content).join(`
8
- `),m={purpose:n.messages[n.messages.length-1]?.content.slice(0,50)??"chat",model:n.model,prompt_summary:g.slice(0,300),response_summary:u.slice(0,500),prompt_tokens_approx:Math.ceil(g.length/4),duration_ms:f};p.recordLLMCall(r,m)}return u}a(Lk,"callLLM");function Wk(t,e,n){switch(t){case"dashscope":return{url:"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:n.model,messages:n.messages,temperature:n.temperature??.7,max_tokens:n.max_tokens??4096}};case"openai":return{url:"https://api.openai.com/v1/chat/completions",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:n.model,messages:n.messages,temperature:n.temperature??.7,max_tokens:n.max_tokens??4096}};case"anthropic":return{url:"https://api.anthropic.com/v1/messages",headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:n.model,max_tokens:n.max_tokens??4096,system:n.messages.find(r=>r.role==="system")?.content,messages:n.messages.filter(r=>r.role!=="system")}};case"idealab":return{url:"https://idealab.alibaba-inc.com/api/openai/v1/chat/completions",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:n.model,messages:n.messages,temperature:n.temperature??.7,max_tokens:n.max_tokens??4096}};default:throw new Error(`\u4E0D\u652F\u6301\u7684 LLM provider: ${t}`)}}a(Wk,"buildRequest");function Bk(t,e){return t==="anthropic"?e.content?.[0]?.text??"":e.choices?.[0]?.message?.content??""}a(Bk,"extractLLMContent");function kf(t){let e=t.trim(),n=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(n?.[1])return n[1].trim();let r=e.match(/(\[[\s\S]*?\])/);return r?.[1]?r[1].trim():e}a(kf,"extractJSON");function zk(t,e){return t??e}a(zk,"resolveApiKey");var Uk=ae.object({model:ae.string().min(1).optional().describe("LLM \u6A21\u578B\u540D,\u5982 qwen-max / claude-opus-4-8"),provider:ae.enum(["dashscope","openai","anthropic","idealab"]).optional().describe("\u6A21\u578B\u670D\u52A1\u5546"),api_key:ae.string().min(1).optional().describe("LLM API Key;\u503C\u7528 ${env.XXX} \u4ECE\u73AF\u5883\u6CE8\u5165(\u52A0\u8F7D\u65F6\u63D2\u503C)")}).strict(),vf=ae.object({model:ae.string().optional().describe("\u6A21\u578B\u8986\u76D6"),temperature:ae.number().optional(),maxTokens:ae.number().optional(),systemPrompt:ae.string().optional()}).describe("LLM \u8C03\u7528\u9009\u9879"),Sf={name:"ai",description:"AI/LLM \u80FD\u529B:\u8F7B\u91CF\u5BF9\u8BDD\u3001\u7ED3\u6784\u5316 JSON \u751F\u6210\u3001\u6587\u672C\u5206\u7C7B(\u7EAF\u8BFB,\u65E0\u526F\u4F5C\u7528)\u3002",configSchema:Uk,methods:[{name:"chat",description:"\u5355\u6B21 LLM \u5BF9\u8BDD",params:ae.object({prompt:ae.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),options:vf.optional()}),output:ae.promise(ae.string())},{name:"chatJSON",description:"\u7ED3\u6784\u5316 JSON \u8F93\u51FA",params:ae.object({prompt:ae.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),schema:ae.record(ae.string(),ae.unknown()).describe("\u671F\u671B\u8F93\u51FA\u7684 JSON Schema"),options:vf.optional()}),output:ae.promise(ae.unknown().describe("\u6309\u4F20\u5165 schema \u89E3\u6790\u51FA\u7684\u5BF9\u8C61"))},{name:"classify",description:"\u6587\u672C\u5206\u7C7B",params:ae.object({text:ae.string().describe("\u5F85\u5206\u7C7B\u6587\u672C"),categories:ae.array(ae.string()).describe("\u5019\u9009\u7C7B\u522B")}),output:ae.promise(ae.object({category:ae.string(),confidence:ae.number()}))}],defaultConfig(t){let e=t.recipe.llm;return{model:e?.model??"qwen-max",provider:e?.provider??"dashscope"}},build(t,e){return Nk({llm:{provider:t.provider,model:t.model,api_key:zk(t.api_key,e.settings.recipe.llm?.api_key)},itemId:e.item.id})}};import{readFile as uv,stat as fv}from"fs/promises";import pv from"path";import{z as $}from"zod";import{existsSync as qk}from"fs";import Go from"os";import If from"path";import{homedir as Kk}from"os";import Vk from"path";var Nr=".qwenworkcn",Va="mcp-adaptor.config";function xf(t=Kk()){return Vk.join(t,Nr,Va)}a(xf,"getQwenworkMcpConfigPath");function qa(t){return t==="win32"?If.win32:If.posix}a(qa,"joinerFor");function hn(t,e=process.platform){let n=qa(e);return e==="win32"?[n.join(t,"dws.cmd"),n.join(t,"dws.exe"),n.join(t,"dws")]:[n.join(t,"bin","dws")]}a(hn,"dwsBinCandidatesUnderPrefix");function Lr(t=Go.homedir(),e=process.platform,n=process.env){let r=qa(e),o=[],i=n.AITABLE_NPM_PREFIX?.trim();if(i&&o.push(...hn(i,e)),e==="win32"){let s=n.LOCALAPPDATA?.trim();s&&o.push(...hn(r.join(s,"aitable-workflow","npm"),e)),o.push(...hn(r.join(t,".local"),e))}else o.push(...hn(r.join(t,".local"),e));return[...new Set(o)]}a(Lr,"dwsBinFallbackCandidates");function yn(t,e=Go.homedir(),n=process.platform,r=process.env){let o=Lr(e,n,r).find(i=>qk(i)&&t(i));return o||(t("dws"),"dws")}a(yn,"resolveDwsBin");function Hk(t=Go.homedir(),e=process.platform){return qa(e).join(t,Nr,"bin")}a(Hk,"qwenworkHostBinDir");function Rf(t=process.env,e=Go.homedir(),n=process.platform){let r=n==="win32"?";":":",o=n==="win32"?Object.keys(t).find(d=>d.toLowerCase()==="path")??"Path":"PATH",i=(t[o]??"").split(r).filter(d=>d.length>0);if(i.length===0)return!1;let s=Hk(e,n),c=n==="win32"?(d,u)=>d.toLowerCase()===u.toLowerCase():(d,u)=>d===u,l=i.filter(d=>!c(d,s));return l.length===i.length?!1:(t[o]=l.join(r),!0)}a(Rf,"stripQwenworkHostBinFromPath");var Jo=["DWS_CHANNEL","DWS_SESSION_ID","DWS_AGENT_HOST","DWS_AGENT_PRODUCT","DWS_AGENT_VER","DINGTALK_DWS_AGENTCODE"],Ha;function Wr(t,e=J){let n=t.trim();if(n!=="dws"||e!==J)return n;if(Ha)return Ha;let r=yn(o=>_t(o,["--version"],{stripEnv:Jo}).ok);return Ha=r,r}a(Wr,"resolveDwsCommandBin");function Hn(t={}){return{...t,stripEnv:[...Jo,...t.stripEnv??[]]}}a(Hn,"dwsCommandOptions");function ne(t,e,n={}){let r=n.runner??J,o=Wr(t,r),{runner:i,...s}=n;return r(o,e,Hn(s))}a(ne,"runDwsCommand");function S(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(S,"isRecord");function zF(t){return typeof t=="string"&&t.trim()!==""?t:typeof t=="number"||typeof t=="boolean"?String(t):null}a(zF,"stringOrNull");function UF(t){return/^[A-Za-z0-9._/:=@+-]+$/.test(t)?t:`'${t.replace(/'/g,`'"'"'`)}'`}a(UF,"shellToken");var Gk=/refresh_token|token exchange failed|authCode\.not|auth expired|not logged in|login first|UNAUTHENTICATED/i;function Br(t){return Gk.test(t)}a(Br,"isDwsAuthFailure");import{AsyncLocalStorage as Cf}from"async_hooks";var Tf=new Cf;function Ga(t,e){return Tf.run(t,e)}a(Ga,"runWithExecutor");function _f(){return Tf.getStore()}a(_f,"getCurrentExecutor");var Af=new Cf,Ef;function JF(t){Ef=t}a(JF,"setGlobalDwsRunner");function ZF(t,e){return Af.run(t,e)}a(ZF,"runWithDwsRunner");function Df(){return Af.getStore()??Ef}a(Df,"getCurrentDwsRunner");var Jk=[300,1e3,2e3];async function wn(t,e){let n=e?.retries??2,r=e?.delaysMs??Jk;for(let o=0;;o++)try{return await t()}catch(i){let s=o>=n,c=e?.shouldRetry?!e.shouldRetry(i):!1;if(s||c)throw i;e?.onRetry?.(i,o+1);let l=r[Math.min(o,r.length-1)]??0;l>0&&await Zk(l)}}a(wn,"withRetry");var Gn=class{constructor(e){this.threshold=e}threshold;static{a(this,"FailureTracker")}counters=new Map;escalated=new Set;fail(e){let n=(this.counters.get(e)??0)+1;this.counters.set(e,n);let r=n>=this.threshold&&!this.escalated.has(e);return r&&this.escalated.add(e),{consecutive:n,escalate:r}}succeed(e){let n=this.escalated.delete(e);return this.counters.delete(e),{recovered:n}}isFailing(e){return this.escalated.has(e)}};function Zk(t){return new Promise(e=>setTimeout(e,t))}a(Zk,"sleep");var Yk=3,ve=class extends Error{static{a(this,"DwsError")}exitCode;stderr;raw;authExpired;constructor(e,n){super(e),this.name="DwsError",this.exitCode=n?.exitCode??null,this.stderr=n?.stderr??"",this.raw=n?.raw??null,this.authExpired=n?.authExpired??!1}};function Qk(t){return Wr(t)}a(Qk,"resolveBareDwsBin");var he=class{static{a(this,"DwsClient")}rawBin;resolvedBin;timeoutMs;runner;failures=new Gn(Yk);constructor(e){this.rawBin=e.bin,this.timeoutMs=e.timeoutMs??3e4,this.runner=e.runner??J}get bin(){return this.runner!==J?this.rawBin:(this.resolvedBin??=Qk(this.rawBin),this.resolvedBin)}async runJson(e,n){let r=Xk(e),o=n?.timeoutMs??this.timeoutMs,i=r.slice(0,3).join(" "),s=Date.now(),c=Df();if(c)return h.info("dws","runJson delegated to relay dws runner",{cmd:i,timeoutMs:o}),c.runJson(r,{timeoutMs:o});let l=a(async()=>{let d;try{d=await ne(this.bin,r,{timeoutMs:o,runner:this.runner})}catch(p){throw nv(p,o)}if(d.exitCode!==0)throw new ve(`dws exited with code ${d.exitCode}`,{exitCode:d.exitCode,stderr:d.stderr,raw:d.stdout});let u=d.stdout.trim();if(u==="")return{};let f;try{f=JSON.parse(u)}catch{throw new ve("dws did not return valid JSON",{exitCode:d.exitCode,stderr:d.stderr,raw:d.stdout})}return ev(f,d.stderr),f},"attempt");try{let d=await wn(l,{shouldRetry:a(f=>!(f instanceof ve&&Br(`${f.message}
9
- ${f.stderr}`)),"shouldRetry"),onRetry:a((f,p)=>{let g={cmd:i,retry:p,error:$f(f)};p>=2?h.warn("dws","runJson transient failure, retrying",g):h.debug("dws","runJson transient failure, retrying",g)},"onRetry")}),{recovered:u}=this.failures.succeed(i);return u&&h.info("dws","runJson recovered after sustained failures",{cmd:i}),d}catch(d){let u=Date.now()-s,{consecutive:f,escalate:p}=this.failures.fail(i),g=tv(d),m={cmd:i,elapsed:u,consecutive:f,error:$f(g),bin:this.bin,stderr:g instanceof ve?g.stderr.slice(0,500):void 0,stdout:g instanceof ve&&typeof g.raw=="string"?g.raw.slice(0,500):void 0};throw p?h.error("dws","runJson sustained failure \u2014 likely real misconfig, not a transient blip",m):g instanceof ve&&g.authExpired?h.warn("dws","runJson failed fast: dws auth expired (no retry)",m):h.warn("dws","runJson failed after retries",m),g}}};function ye(t){return S(t)?"body"in t?t.body:"data"in t?t.data:"result"in t?t.result:S(t.response)?"body"in t.response?t.response.body:"data"in t.response?t.response.data:t.response:t:t}a(ye,"dwsPayload");function Te(t){let e=ye(t),n=Pf(e);if(n)return n;if(S(e))for(let r of Object.values(e)){let o=Pf(r);if(o)return o}return[]}a(Te,"findArrayPayload");function Zo(t){let e=ye(t),n=Mf(e,["nextCursor","next_cursor","cursor"]);return n&&n.trim()!==""?n:null}a(Zo,"findCursor");function Xk(t){return t.includes("--format")||t.includes("-f")?t:[...t,"--format","json"]}a(Xk,"ensureJsonFormat");function ev(t,e){if(!S(t))return;let n=[t];for(let r of["body","data","result","response"]){let o=t[r];S(o)&&n.push(o)}for(let r of n){if(r.success===!1||String(r.success).toLowerCase()==="false")throw new ve("dws response reported success=false",{stderr:e,raw:t});if(r.degraded===!0||String(r.degraded).toLowerCase()==="true"){let o=typeof r.reason=="string"?r.reason:typeof r.message=="string"?r.message:typeof r.error=="string"?r.error:void 0;throw new ve(o?`dws degraded: ${o}`:"dws response reported degraded",{stderr:e,raw:t})}}}a(ev,"assertDwsSuccess");function $f(t){return t instanceof Error?t.message:String(t)}a($f,"errorMessage");function tv(t){if(!(t instanceof ve))return t;let e=`${t.message}
10
- ${t.stderr}`;if(!Br(e))return t;let n="dws \u767B\u5F55\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `dws auth login` \u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5\uFF08\u660E\u7EC6\u89C1\u7EC8\u7AEF\u65E5\u5FD7\uFF09";return new ve(n,{exitCode:t.exitCode,stderr:t.stderr,raw:t.raw,authExpired:!0})}a(tv,"surfaceAuthFailure");function nv(t,e){if(t instanceof ve)return t;let n=t instanceof Error?t.message:String(t);return t instanceof Error&&t.name==="AbortError"?new ve(`dws timed out after ${e}ms: ${n}`):new ve(`dws runner failed: ${n}`)}a(nv,"wrapRunnerError");function Pf(t){if(Array.isArray(t))return t;if(!S(t))return null;for(let e of["records","items","list","rows","results","fields","tables"]){let n=t[e];if(Array.isArray(n))return n}return null}a(Pf,"findKnownArray");function Mf(t,e){if(!S(t))return null;for(let n of e){let r=t[n];if(typeof r=="string")return r}for(let n of Object.values(t))if(S(n)){let r=Mf(n,e);if(r)return r}return null}a(Mf,"findStringByKeys");var rv="alidocs.dingtalk.com",ov=/^v\d+[A-Za-z0-9]+_[A-Za-z0-9]+_[A-Za-z0-9]+$/;function iv(t){return ov.test(t)}a(iv,"isShareFormUuid");function sv(t){return`https://${rv}/notable/share/form/${t}`}a(sv,"buildFormShareUrl");var Of=2,jf=process.env.NODE_ENV==="test"?0:500;async function Ff(t,e,n,r){for(let o=1;o<=Of;o++){try{let i=await t.runJson(["aitable","form","share","get","--base-id",e,"--table-id",n,"--view-id",r]),s=ye(i);if(S(s))return{enabled:s.enabled===!0,uuid:typeof s.shareFormUuid=="string"?s.shareFormUuid:""};h.warn("setup","form share get \u8FD4\u56DE\u4E0D\u53EF\u89E3\u6790",{viewId:r,attempt:o})}catch(i){h.warn("setup","form share get \u5931\u8D25",{viewId:r,attempt:o,error:String(i)})}o<Of&&jf>0&&await new Promise(i=>setTimeout(i,jf))}}a(Ff,"readShareState");function Nf(t,e){if(iv(t))return sv(t);h.warn("setup","shareFormUuid \u5F62\u72B6\u4E0D\u5339\u914D\uFF0C\u4E0D\u62FC\u5206\u4EAB\u94FE\u63A5",{uuid:t,viewId:e})}a(Nf,"shareUrlOf");async function Yo(t,e,n,r,o){let i=await Ff(t,e,n,r);if(i?.enabled&&i.uuid)return Nf(i.uuid,r);if(!o.autoEnable)return;try{await t.runJson(["aitable","form","share","update","--base-id",e,"--table-id",n,"--view-id",r,"--enabled","true"])}catch(c){h.warn("setup","\u5F00\u542F\u8868\u5355\u5206\u4EAB\u5931\u8D25",{baseId:e,tableId:n,viewId:r,error:String(c)});return}let s=await Ff(t,e,n,r);if(!s){h.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u8BFB\u4E0D\u5230\u5206\u4EAB\u914D\u7F6E",{viewId:r});return}if(!s.uuid){h.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u4ECD\u65E0 shareFormUuid",{viewId:r,enabled:s.enabled});return}return Nf(s.uuid,r)}a(Yo,"ensureFormShare");import{mkdtemp as av,rm as cv,writeFile as lv}from"fs/promises";import{tmpdir as dv}from"os";import Lf from"path";async function yt(t,e,n){let r=await av(Lf.join(dv(),"aitable-dws-records-")),o=Lf.join(r,"records.json");try{return await lv(o,JSON.stringify(n),"utf8"),await t.runJson([...e,"--records-file",o])}finally{await cv(r,{recursive:!0,force:!0}).catch(()=>{})}}a(yt,"runDwsRecordsFile");var gv=300*1e3,Wf=80,Ja=new Map;function mv(t){let e=`${t.baseId}/${t.tableId}`;Ja.delete(e)}a(mv,"_clearFieldIdCacheFor");async function Qo(t,e){let n=`${e.baseId}/${e.tableId}`,r=Ja.get(n);if(r&&Date.now()-r.ts<gv)return r.map;let o=await t.runJson(["aitable","field","get","--base-id",e.baseId,"--table-id",e.tableId]),i=Te(o),s=new Map;for(let c of i){if(!S(c))continue;let l=typeof c.fieldId=="string"?c.fieldId:null,d=typeof c.fieldName=="string"?c.fieldName:null;l&&d&&s.set(d,l)}return Ja.set(n,{map:s,ts:Date.now()}),h.debug("table","\u5B57\u6BB5\u6620\u5C04\u5DF2\u52A0\u8F7D",{target:e,count:s.size}),s}a(Qo,"fetchFieldIdMap");function Za(t){return Te(t).map(n=>{let r=ye(n);if(r&&typeof r=="object"&&"recordId"in r)return String(r.recordId);if(n&&typeof n=="object"&&"recordId"in n)return String(n.recordId)}).filter(n=>n!=null)}a(Za,"extractRecordIds");function Xo(t){return Te(t).map(n=>{let r=ye(n),o=r&&typeof r=="object"?r:n,i=String(o.recordId??o.id??""),s=o.cells??o.fields??{};return{recordId:i,fields:s}})}a(Xo,"extractRecords");function hv(t,e){let n=new Map([...e.entries()].map(([r,o])=>[o,r]));return Object.fromEntries(Object.entries(t).map(([r,o])=>[n.get(r)??r,o]))}a(hv,"normalizeRecordFields");async function Bf(t,e,n,r){let o=[...new Map(r.map(l=>[String(l),l])).values()];if(o.length===0)return[];let i=await Qo(t,e),s=i.get(n)??n,c=[];for(let l=0;l<o.length;l+=Wf){let d=o.slice(l,l+Wf),u=d.length===1?{operator:"and",operands:[{operator:"eq",operands:[s,d[0]]}]}:{operator:"or",operands:d.map(p=>({operator:"eq",operands:[s,p]}))},f=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(u),"--limit",String(Math.max(2,d.length))]);for(let p of Xo(f)){let g=hv(p.fields,i);c.push({uniqueValue:g[n],recordId:p.recordId,fields:g})}}return c}a(Bf,"queryRecordsByUniqueValues");function yv(t,e,n,r){return{async readCurrentRow(){let[o]=await t.fetchItemsByIds([e.id]);return o?.fields??e.fields},async updateCurrentRow(o){await t.updateFields(e.id,o),Object.assign(e.fields,o)},async queryRows(o,i){let s=o&&Object.keys(o).length>0,c=s?await t.fetchItemsByFilter(o,i):await t.fetchAllItems();return(!s&&i!==void 0?c.slice(0,i):c).map(d=>d.fields)},async findRowIds(o,i){return!o||Object.keys(o).length===0?[]:(await t.fetchItemsByFilter(o,i)).map(c=>c.id).filter(c=>c.length>0)},async createRecordIn(o,i){ut(n);let s=await yt(n,["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],[{cells:i}]),c=Za(s);if(c.length===0)throw new Error(`createRecordIn: dws \u672A\u8FD4\u56DE recordId\uFF08target=${o.baseId}/${o.tableId}\uFF09`);return h.debug("table","createRecordIn \u6210\u529F",{target:o,recordId:c[0]}),{recordId:c[0]}},async createRecordsIn(o,i){if(ut(n),i.length===0)return{recordIds:[]};let s=await yt(n,["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],i.map(l=>({cells:l}))),c=Za(s);return h.debug("table","createRecordsIn \u6210\u529F",{target:o,count:c.length}),{recordIds:c}},async findRecordsIn(o,i,s){return ut(n),Bf(n,o,i,s)},async findRecordIn(o,i,s){ut(n);let c=(await Bf(n,o,i,[s]))[0];return c?{recordId:c.recordId,fields:c.fields}:null},async upsertRecordIn(o,i,s){ut(n);let c=s[i];if(c===void 0)throw new Error(`upsertRecordIn: fields \u4E2D\u7F3A\u5C11\u552F\u4E00\u952E "${i}"`);return Uf(n,o,i,c,s,0)},async findRecordIdIn(o,i,s){return ut(n),s==null||s===""?null:wv(n,o,i,s)},async readRecordIn(o,i){if(ut(n),!i)throw new Error(`readRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);let s=await n.runJson(["aitable","record","query","--base-id",o.baseId,"--table-id",o.tableId,"--record-ids",i]),c=Xo(s);if(c.length===0)return null;let l=await Qo(n,o),d=new Map;for(let[f,p]of l.entries())d.set(p,f);let u={};for(let[f,p]of Object.entries(c[0].fields)){let g=d.get(f)??f;u[g]=p}return u},async updateRecordsIn(o,i){if(ut(n),i.length!==0){for(let s of i)if(!s.recordId)throw new Error(`updateRecordsIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await yt(n,["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],i.map(s=>({recordId:s.recordId,cells:s.fields}))),h.debug("table","updateRecordsIn \u6210\u529F",{target:o,count:i.length})}},async updateRecordIn(o,i,s){if(ut(n),!i)throw new Error(`updateRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await yt(n,["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],[{recordId:i,cells:s}]),h.debug("table","updateRecordIn \u6210\u529F",{target:o,recordId:i})},async uploadAttachmentToCurrentTable(o,i){if(ut(n),!r)throw new Error("uploadAttachmentToCurrentTable: baseId \u672A\u6CE8\u5165\uFF08\u68C0\u67E5 settings.tracker.base_id\uFF09");let c=(await fv(o)).size;if(c>zf)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08${c} bytes > ${zf}\uFF09\uFF0C\u8DF3\u8FC7\u4E0A\u4F20`);let l=pv.extname(i).toLowerCase(),d=bv[l]??"application/octet-stream",u=await n.runJson(["aitable","attachment","upload","--base-id",r,"--file-name",i,"--size",String(c),"--mime-type",d],{timeoutMs:3e4}),f=ye(u),p=Ya(f,["uploadUrl","upload_url"]),g=Ya(f,["fileToken","file_token"]);if(!p||!g)throw new Error(`uploadAttachmentToCurrentTable: dws \u672A\u8FD4\u56DE uploadUrl/fileToken\uFF08response=${JSON.stringify(f)}\uFF09`);let m=await uv(o),y=await fetch(p,{method:"PUT",headers:{"Content-Type":d},body:m});if(!y.ok)throw new Error(`uploadAttachmentToCurrentTable: OSS PUT \u5931\u8D25\uFF08status=${y.status}\uFF09`);return h.debug("table","uploadAttachmentToCurrentTable \u6210\u529F",{fileName:i,fileToken:g,size:c}),{fileToken:g}},async formShareUrl(o,i){ut(n);let s=o.viewId;if(!s&&o.viewName)try{let l=await n.runJson(["aitable","view","get","--base-id",o.baseId,"--table-id",o.tableId]),u=Te(l).find(f=>S(f)?(typeof f.name=="string"?f.name:typeof f.viewName=="string"?f.viewName:"").trim()===o.viewName.trim():!1);u&&S(u)&&(s=typeof u.viewId=="string"?u.viewId:typeof u.id=="string"?u.id:void 0)}catch(l){return{url:"",reason:`\u83B7\u53D6\u89C6\u56FE\u5217\u8868\u5931\u8D25: ${String(l)}`}}if(!s)return{url:"",reason:`\u672A\u627E\u5230\u89C6\u56FE: ${o.viewName??"(\u672A\u6307\u5B9A)"}`};let c=await Yo(n,o.baseId,o.tableId,s,{autoEnable:i?.autoEnable??!1});return c?{url:c}:{url:"",reason:"\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\u6216\u89E3\u6790\u5931\u8D25"}}}}a(yv,"createTableToolkit");async function wv(t,e,n,r){let s={operator:"and",operands:[{operator:"eq",operands:[(await Qo(t,e)).get(n)??n,r]}]},c=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(s),"--limit","2"]),l=Xo(c);return l.length>0?l[0].recordId:null}a(wv,"doFindRecordIdIn");async function Uf(t,e,n,r,o,i){let l={operator:"and",operands:[{operator:"eq",operands:[(await Qo(t,e)).get(n)??n,r]}]},d=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(l),"--limit","2"]),u=Xo(d);if(u.length>0){let f=u[0].recordId;return await yt(t,["aitable","record","update","--base-id",e.baseId,"--table-id",e.tableId,"--yes"],[{recordId:f,cells:o}]),h.debug("table","upsertRecordIn \u66F4\u65B0",{target:e,recordId:f,uniqueBy:n}),{recordId:f}}try{let f=await yt(t,["aitable","record","create","--base-id",e.baseId,"--table-id",e.tableId,"--yes"],[{cells:o}]),p=Za(f);if(p.length===0)throw new Error("upsertRecordIn: create \u540E dws \u672A\u8FD4\u56DE recordId");return h.debug("table","upsertRecordIn \u65B0\u5EFA",{target:e,recordId:p[0],uniqueBy:n}),{recordId:p[0]}}catch(f){if(i===0)return mv(e),h.debug("table","upsertRecordIn create \u5931\u8D25\uFF0C\u6E05\u9664\u5B57\u6BB5\u7F13\u5B58\u540E\u91CD\u8BD5",{target:e,uniqueBy:n,error:String(f)}),Uf(t,e,n,r,o,1);throw f}}a(Uf,"doUpsertRecordIn");var zf=20*1024*1024,bv={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".md":"text/markdown",".txt":"text/plain",".csv":"text/csv",".json":"application/json",".pdf":"application/pdf",".zip":"application/zip",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};function Ya(t,e){if(!S(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r.trim()}for(let n of Object.values(t)){let r=Ya(n,e);if(r)return r}return null}a(Ya,"findStringInPayload");function ut(t){if(!t)throw new Error("\u591A\u8868\u5199\u5165\u9700\u8981 DwsClient\uFF0C\u4F46 table toolkit \u672A\u6CE8\u5165\uFF08\u68C0\u67E5 toolkit_config.table \u914D\u7F6E\uFF09")}a(ut,"ensureDws");function kv(t){return new he({bin:t.tracker.dws_bin})}a(kv,"createDwsFromSettings");var Kf={name:"table",description:"AI \u8868\u683C\u8BFB\u5199:\u8BFB/\u67E5\u5F53\u524D\u8868\u8BB0\u5F55\u3001\u66F4\u65B0\u5F53\u524D\u884C\u3001\u591A\u8868\u5199\u5165(create/upsert)",configSchema:$.object({}).strict(),build(t,e){let n=kv(e.settings);return yv(e.tracker,e.item,n,e.settings.tracker.base_id)},methods:[{name:"readCurrentRow",description:"\u8BFB\u53D6\u5F53\u524D\u884C\u6570\u636E",output:$.promise($.record($.string(),$.unknown()))},{name:"updateCurrentRow",description:"\u66F4\u65B0\u5F53\u524D\u884C\u5B57\u6BB5",params:$.object({fields:$.record($.string(),$.unknown()).describe("\u8981\u5199\u5165\u7684\u5B57\u6BB5\u952E\u503C")}),output:$.promise($.void())},{name:"queryRows",description:"\u67E5\u8BE2\u5176\u4ED6\u884C",params:$.object({filter:$.record($.string(),$.unknown()).describe("\u67E5\u8BE2\u6761\u4EF6"),limit:$.number().optional().describe("\u8FD4\u56DE\u6761\u6570\u4E0A\u9650")}),output:$.promise($.array($.record($.string(),$.unknown())))},{name:"readRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6309 recordId \u8BFB\u53D6\u4E00\u884C\uFF08\u5B57\u6BB5\u540D\u4E3A\u952E\uFF09",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),recordId:$.string()}),output:$.promise($.record($.string(),$.unknown()).nullable())},{name:"createRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u521B\u5EFA\u4E00\u6761\u8BB0\u5F55",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),fields:$.record($.string(),$.unknown())}),output:$.promise($.object({recordId:$.string()}))},{name:"createRecordsIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6279\u91CF\u521B\u5EFA\u8BB0\u5F55",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),rows:$.array($.record($.string(),$.unknown()))}),output:$.promise($.object({recordIds:$.array($.string())}))},{name:"findRecordsIn",description:"\u6309\u552F\u4E00\u952E\u6279\u91CF\u67E5\u8BE2\u8BB0\u5F55",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),uniqueBy:$.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),uniqueValues:$.array($.unknown()).describe("\u552F\u4E00\u952E\u5B57\u6BB5\u503C\u5217\u8868")}),output:$.promise($.array($.object({uniqueValue:$.unknown(),recordId:$.string(),fields:$.record($.string(),$.unknown())})))},{name:"upsertRecordIn",description:"\u6309\u552F\u4E00\u952E upsert\uFF08\u547D\u4E2D\u5219 update\uFF0C\u672A\u547D\u4E2D\u5219 create\uFF09",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),uniqueBy:$.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),fields:$.record($.string(),$.unknown())}),output:$.promise($.object({recordId:$.string()}))},{name:"uploadAttachmentToCurrentTable",description:"\u4E0A\u4F20\u672C\u5730\u6587\u4EF6\u5230\u5F53\u524D\u8868\u6240\u5728 base \u7684\u9644\u4EF6\u5B58\u50A8\uFF0C\u8FD4\u56DE fileToken",params:$.object({filePath:$.string().describe("\u672C\u5730\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84"),fileName:$.string().describe("\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09")}),output:$.promise($.object({fileToken:$.string()}))},{name:"formShareUrl",description:"\u53D6\u6307\u5B9A\u8868\u5355\u89C6\u56FE\u7684\u5206\u4EAB\u94FE\u63A5\uFF08\u6309 viewName \u6216 viewId \u89E3\u6790\uFF09",params:$.object({target:$.object({baseId:$.string(),tableId:$.string(),viewName:$.string().optional(),viewId:$.string().optional()}),options:$.object({autoEnable:$.boolean().optional()}).optional()}),output:$.promise($.object({url:$.string(),reason:$.string().optional()}))},{name:"updateRecordsIn",description:"\u6309 recordId \u6279\u91CF\u66F4\u65B0\u5B57\u6BB5",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),rows:$.array($.object({recordId:$.string(),fields:$.record($.string(),$.unknown())}))}),output:$.promise($.void())},{name:"updateRecordIn",description:"\u6309 recordId \u66F4\u65B0\u5B57\u6BB5",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),recordId:$.string(),fields:$.record($.string(),$.unknown())}),output:$.promise($.void())}],permissions:[{method:"updateCurrentRow",description:"\u5199\u5165\u8868\u683C\u884C\u6570\u636E(\u9650\u5B9A\u53EF\u5199\u7684\u8868)",scopeSchema:$.array($.string()).describe("\u5141\u8BB8\u5199\u5165\u7684 table_id \u5217\u8868"),check:a((t,e,n)=>{let r=n.settings.tracker?.table_id;return r!=null&&t.includes(r)},"check")}]};import{z as be}from"zod";import Ht from"path";import In from"fs";import{readFile as qv}from"fs/promises";import nc from"path";import{z as re}from"zod";var vv=/^(Error|ERROR|fatal|FATAL|crash|CRASH|panic|PANIC|exception|EXCEPTION)\b/;function wt(t){return vv.test(t)}a(wt,"isStderrError");function we(t){if(!(!t||typeof t!="object"||Array.isArray(t)))return t}a(we,"asRecord");function V(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim().length>0)return r}}a(V,"pickString");function bn(t,e=512){return t.length>e?`${t.slice(0,e)}...`:t}a(bn,"truncateText");var Sv=["content","text","message","delta","output"];function xv(t){let e=t.toLowerCase();return e.includes("permission")?"permission_request":e.includes("thinking")||e.includes("thought")?"thinking":e.includes("tool")&&e.includes("result")?"tool_result":e.includes("tool")?"tool_use":e.includes("error")||e.includes("fatal")||e.includes("exception")?"error":e.includes("result")||e.includes("final")||e.includes("done")||e.includes("complete")?"result":(e.includes("text")||e.includes("message")||e.includes("assistant"),"text")}a(xv,"mapStructuredType");function Iv(t){let e=V(t,["type","event","kind","level"])??"text",n=xv(e),r=V(t,["toolName","tool_name","tool","name"]),o=we(t.toolInput)??we(t.input);return{type:n,content:V(t,Sv),toolName:r,toolInput:typeof t.toolInput=="string"?t.toolInput:void 0,toolInputRaw:o,sessionId:V(t,["sessionId","session_id","conversationId","conversation_id"]),requestId:V(t,["requestId","request_id","id"]),done:!!t.done||n==="result"}}a(Iv,"fromStructuredJson");function Rv(t){let e=t.trim();return e?/^(error|fatal|exception)\b/i.test(e)?{type:"error",content:e,done:!0}:/\bpermission\b/i.test(e)?{type:"permission_request",content:e}:/^(thinking|thought)\b/i.test(e)?{type:"thinking",content:e}:/\btool\b.*\b(result|output|observation)\b/i.test(e)?{type:"tool_result",content:e}:/\b(tool|function)\b.*\b(use|call|invoke|running)\b/i.test(e)||/^tool\s*:/i.test(e)?{type:"tool_use",content:e}:/\b(final answer|done|completed)\b/i.test(e)?{type:"result",content:e,done:!0}:{type:"text",content:e}:{type:"text",content:""}}a(Rv,"fromTextLine");function kn(t){let e=t.trim();if(!e)return{events:[],structured:!1};if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))try{let n=JSON.parse(e);if(n&&typeof n=="object"&&!Array.isArray(n))return{events:[Iv(n)],structured:!0}}catch{}return{events:[Rv(e)],structured:!1}}a(kn,"parseAgentLine");function Cv(t,e){let n=we(e);if(!n)return"";switch(t){case"Read":case"Edit":case"Write":{let o=V(n,["file_path","filePath","path"]);if(o)return o;break}case"Bash":{let o=V(n,["command","cmd"]);if(o)return o;break}case"Grep":case"Glob":{let o=V(n,["pattern","glob_pattern","glob"]);if(o)return o;break}}let r=JSON.stringify(n);return r.length>512?`${r.slice(0,512)}...`:r}a(Cv,"summarizeToolInput");function Tv(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=we(n);if(!r)continue;let o=V(r,["type"])??"";if(o==="text"){let i=V(r,["text"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=V(r,["thinking","text"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"){let i=V(r,["name"])??"unknown";e.push({type:"tool_use",requestId:V(r,["id"]),toolName:i,toolInput:Cv(i,r.input),toolInputRaw:we(r.input)})}else if(o==="tool_result"){let i=V(r,["tool_use_id","id"]),s=typeof r.content=="string"?r.content:void 0,c=!!r.is_error;e.push({type:c?"error":"tool_result",requestId:i,content:s})}}return e}a(Tv,"parseContentBlocks");function _v(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=V(e,["type"])??"",r=V(e,["session_id","sessionId"]),o=a(i=>r?{...i,sessionId:r}:i,"addSession");if(n==="assistant"||n==="user"){let i=we(e.message);return i?Tv(i.content).map(o):[o({type:"text",content:""})]}if(n==="result"){let i=V(e,["result","content"])??"";return[o({type:"result",content:i,done:!0})]}if(n==="system")return r?[o({type:"text",content:""})]:[];if(n==="error"){let i=V(e,["error","message","content"])??"unknown error";return[o({type:"error",content:i,done:!0})]}return null}a(_v,"parseClaudeLine");function Qa(){return(t,e)=>{if(t==="stderr"){let o=e.trim();return o?wt(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=_v(n);return r&&r.length>0?r:kn(n).events}}a(Qa,"createClaudeParser");var Vf={id:"claudecode",name:"Claude Code",bin:"claude",versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];if(o.includes("--output-format")||o.push("--output-format","stream-json"),o.includes("--verbose")||o.push("--verbose"),r.model&&!o.includes("--model")&&o.push("--model",r.model),r.permissionMode==="bypassPermissions"&&(o.includes("--dangerously-skip-permissions")||o.push("--dangerously-skip-permissions")),r.allowedTools&&r.allowedTools.length>0)for(let i of r.allowedTools)o.push("--allowedTools",i);return e&&o.push("--resume",e),o.push("-p",t),o},"buildArgs"),createParser:Qa};function Xa(t){return V(t,["text","content","message","summary"])??""}a(Xa,"extractItemText");function vn(t){if(typeof t=="string")return t.trim().length>0?t:void 0;if(t!=null)try{return JSON.stringify(t)}catch{return String(t)}}a(vn,"stringifyValue");function ec(t,e){let n=we(t.error);return V(t,["message","error","content"])??(n?V(n,["message","error","content"]):void 0)??vn(t.error)??e}a(ec,"extractErrorText");function Av(t){return V(t,["command","query","input","arguments"])??vn(t.arguments)??vn(t.input)??vn(t.changes)}a(Av,"extractToolInput");function Ev(t){let e=V(t,["aggregated_output","output","result","message","text","summary"])??vn(t.output)??vn(t.result)??vn(t.changes);return e||(typeof t.exit_code=="number"?`exit_code=${t.exit_code}`:void 0)}a(Ev,"extractToolResult");function Dv(t,e){if(e!=="mcp_tool_call")return e||"codex_tool";let n=V(t,["server","server_name"]),r=V(t,["tool","tool_name","name"]);return[n,r].filter(Boolean).join(".")||e}a(Dv,"codexToolName");function $v(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=V(e,["type"])??"";if(n==="thread.started"){let r=V(e,["thread_id","threadId","id"]);return r?[{type:"text",content:"",sessionId:r}]:[]}if(n==="turn.completed"||n==="turn.started")return[];if(n==="turn.failed")return[{type:"error",content:ec(e,"Codex turn failed"),done:!0}];if(n==="item.started"||n==="item.updated"||n==="item.completed"){let r=we(e.item);if(!r)return[];let o=V(r,["type"])??"",i=V(r,["id","call_id"]),s=n==="item.completed";if(o==="agent_message"){if(!s)return[];let l=Xa(r);return l?[{type:"result",content:l,requestId:i,done:!0}]:[]}if(o==="reasoning"){if(!s)return[];let l=Xa(r);return l?[{type:"thinking",content:l,requestId:i}]:[]}if(o==="error")return[{type:"error",content:ec(r,"Codex item failed"),requestId:i,done:!0}];let c=Dv(r,o);return n==="item.started"?[{type:"tool_use",toolName:c,toolInput:Av(r),toolInputRaw:r,requestId:i}]:s?[{type:"tool_result",toolName:c,content:Ev(r),requestId:i}]:[]}if(n==="message.delta"){let r=we(e.delta)??we(e.content);if(!r)return[];let o=V(r,["text","content","value"]);return o?(V(r,["role"])??V(e,["role"]))==="system"?[]:[{type:"text",content:o}]:[]}if(n==="message.completed"){let r=we(e.message)??we(e.content);if(!r)return[];let o=Array.isArray(r.content)?r.content.map(i=>{let s=we(i);return s?Xa(s):""}).filter(i=>i.length>0).join(`
8
+ `),m={purpose:n.messages[n.messages.length-1]?.content.slice(0,50)??"chat",model:n.model,prompt_summary:g.slice(0,300),response_summary:u.slice(0,500),prompt_tokens_approx:Math.ceil(g.length/4),duration_ms:f};p.recordLLMCall(r,m)}return u}a(Lk,"callLLM");function Wk(t,e,n){switch(t){case"dashscope":return{url:"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:n.model,messages:n.messages,temperature:n.temperature??.7,max_tokens:n.max_tokens??4096}};case"openai":return{url:"https://api.openai.com/v1/chat/completions",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:n.model,messages:n.messages,temperature:n.temperature??.7,max_tokens:n.max_tokens??4096}};case"anthropic":return{url:"https://api.anthropic.com/v1/messages",headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:n.model,max_tokens:n.max_tokens??4096,system:n.messages.find(r=>r.role==="system")?.content,messages:n.messages.filter(r=>r.role!=="system")}};case"idealab":return{url:"https://idealab.alibaba-inc.com/api/openai/v1/chat/completions",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:n.model,messages:n.messages,temperature:n.temperature??.7,max_tokens:n.max_tokens??4096}};default:throw new Error(`\u4E0D\u652F\u6301\u7684 LLM provider: ${t}`)}}a(Wk,"buildRequest");function Bk(t,e){return t==="anthropic"?e.content?.[0]?.text??"":e.choices?.[0]?.message?.content??""}a(Bk,"extractLLMContent");function kf(t){let e=t.trim(),n=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(n?.[1])return n[1].trim();let r=e.match(/(\[[\s\S]*?\])/);return r?.[1]?r[1].trim():e}a(kf,"extractJSON");function zk(t,e){return t??e}a(zk,"resolveApiKey");var Uk=ae.object({model:ae.string().min(1).optional().describe("LLM \u6A21\u578B\u540D,\u5982 qwen-max / claude-opus-4-8"),provider:ae.enum(["dashscope","openai","anthropic","idealab"]).optional().describe("\u6A21\u578B\u670D\u52A1\u5546"),api_key:ae.string().min(1).optional().describe("LLM API Key;\u503C\u7528 ${env.XXX} \u4ECE\u73AF\u5883\u6CE8\u5165(\u52A0\u8F7D\u65F6\u63D2\u503C)")}).strict(),vf=ae.object({model:ae.string().optional().describe("\u6A21\u578B\u8986\u76D6"),temperature:ae.number().optional(),maxTokens:ae.number().optional(),systemPrompt:ae.string().optional()}).describe("LLM \u8C03\u7528\u9009\u9879"),Sf={name:"ai",description:"AI/LLM \u80FD\u529B:\u8F7B\u91CF\u5BF9\u8BDD\u3001\u7ED3\u6784\u5316 JSON \u751F\u6210\u3001\u6587\u672C\u5206\u7C7B(\u7EAF\u8BFB,\u65E0\u526F\u4F5C\u7528)\u3002",configSchema:Uk,methods:[{name:"chat",description:"\u5355\u6B21 LLM \u5BF9\u8BDD",params:ae.object({prompt:ae.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),options:vf.optional()}),output:ae.promise(ae.string())},{name:"chatJSON",description:"\u7ED3\u6784\u5316 JSON \u8F93\u51FA",params:ae.object({prompt:ae.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),schema:ae.record(ae.string(),ae.unknown()).describe("\u671F\u671B\u8F93\u51FA\u7684 JSON Schema"),options:vf.optional()}),output:ae.promise(ae.unknown().describe("\u6309\u4F20\u5165 schema \u89E3\u6790\u51FA\u7684\u5BF9\u8C61"))},{name:"classify",description:"\u6587\u672C\u5206\u7C7B",params:ae.object({text:ae.string().describe("\u5F85\u5206\u7C7B\u6587\u672C"),categories:ae.array(ae.string()).describe("\u5019\u9009\u7C7B\u522B")}),output:ae.promise(ae.object({category:ae.string(),confidence:ae.number()}))}],defaultConfig(t){let e=t.recipe.llm;return{model:e?.model??"qwen-max",provider:e?.provider??"dashscope"}},build(t,e){return Nk({llm:{provider:t.provider,model:t.model,api_key:zk(t.api_key,e.settings.recipe.llm?.api_key)},itemId:e.item.id})}};import{readFile as uv,stat as fv}from"fs/promises";import pv from"path";import{z as $}from"zod";import{existsSync as qk}from"fs";import Go from"os";import If from"path";import{homedir as Kk}from"os";import Vk from"path";var Nr=".qwenworkcn",Va="mcp-adaptor.config";function xf(t=Kk()){return Vk.join(t,Nr,Va)}a(xf,"getQwenworkMcpConfigPath");function qa(t){return t==="win32"?If.win32:If.posix}a(qa,"joinerFor");function hn(t,e=process.platform){let n=qa(e);return e==="win32"?[n.join(t,"dws.cmd"),n.join(t,"dws.exe"),n.join(t,"dws")]:[n.join(t,"bin","dws")]}a(hn,"dwsBinCandidatesUnderPrefix");function Lr(t=Go.homedir(),e=process.platform,n=process.env){let r=qa(e),o=[],i=n.AITABLE_NPM_PREFIX?.trim();if(i&&o.push(...hn(i,e)),e==="win32"){let s=n.LOCALAPPDATA?.trim();s&&o.push(...hn(r.join(s,"aitable-workflow","npm"),e)),o.push(...hn(r.join(t,".local"),e))}else o.push(...hn(r.join(t,".local"),e));return[...new Set(o)]}a(Lr,"dwsBinFallbackCandidates");function yn(t,e=Go.homedir(),n=process.platform,r=process.env){let o=Lr(e,n,r).find(i=>qk(i)&&t(i));return o||(t("dws"),"dws")}a(yn,"resolveDwsBin");function Hk(t=Go.homedir(),e=process.platform){return qa(e).join(t,Nr,"bin")}a(Hk,"qwenworkHostBinDir");function Rf(t=process.env,e=Go.homedir(),n=process.platform){let r=n==="win32"?";":":",o=n==="win32"?Object.keys(t).find(d=>d.toLowerCase()==="path")??"Path":"PATH",i=(t[o]??"").split(r).filter(d=>d.length>0);if(i.length===0)return!1;let s=Hk(e,n),c=n==="win32"?(d,u)=>d.toLowerCase()===u.toLowerCase():(d,u)=>d===u,l=i.filter(d=>!c(d,s));return l.length===i.length?!1:(t[o]=l.join(r),!0)}a(Rf,"stripQwenworkHostBinFromPath");var Jo=["DWS_CHANNEL","DWS_SESSION_ID","DWS_AGENT_HOST","DWS_AGENT_PRODUCT","DWS_AGENT_VER","DINGTALK_DWS_AGENTCODE"],Ha;function Wr(t,e=J){let n=t.trim();if(n!=="dws"||e!==J)return n;if(Ha)return Ha;let r=yn(o=>_t(o,["--version"],{stripEnv:Jo}).ok);return Ha=r,r}a(Wr,"resolveDwsCommandBin");function Hn(t={}){return{...t,stripEnv:[...Jo,...t.stripEnv??[]]}}a(Hn,"dwsCommandOptions");function ne(t,e,n={}){let r=n.runner??J,o=Wr(t,r),{runner:i,...s}=n;return r(o,e,Hn(s))}a(ne,"runDwsCommand");function v(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(v,"isRecord");function zF(t){return typeof t=="string"&&t.trim()!==""?t:typeof t=="number"||typeof t=="boolean"?String(t):null}a(zF,"stringOrNull");function UF(t){return/^[A-Za-z0-9._/:=@+-]+$/.test(t)?t:`'${t.replace(/'/g,`'"'"'`)}'`}a(UF,"shellToken");var Gk=/refresh_token|token exchange failed|authCode\.not|auth expired|not logged in|login first|UNAUTHENTICATED/i;function Br(t){return Gk.test(t)}a(Br,"isDwsAuthFailure");import{AsyncLocalStorage as Cf}from"async_hooks";var Tf=new Cf;function Ga(t,e){return Tf.run(t,e)}a(Ga,"runWithExecutor");function _f(){return Tf.getStore()}a(_f,"getCurrentExecutor");var Af=new Cf,Ef;function JF(t){Ef=t}a(JF,"setGlobalDwsRunner");function ZF(t,e){return Af.run(t,e)}a(ZF,"runWithDwsRunner");function Df(){return Af.getStore()??Ef}a(Df,"getCurrentDwsRunner");var Jk=[300,1e3,2e3];async function wn(t,e){let n=e?.retries??2,r=e?.delaysMs??Jk;for(let o=0;;o++)try{return await t()}catch(i){let s=o>=n,c=e?.shouldRetry?!e.shouldRetry(i):!1;if(s||c)throw i;e?.onRetry?.(i,o+1);let l=r[Math.min(o,r.length-1)]??0;l>0&&await Zk(l)}}a(wn,"withRetry");var Gn=class{constructor(e){this.threshold=e}threshold;static{a(this,"FailureTracker")}counters=new Map;escalated=new Set;fail(e){let n=(this.counters.get(e)??0)+1;this.counters.set(e,n);let r=n>=this.threshold&&!this.escalated.has(e);return r&&this.escalated.add(e),{consecutive:n,escalate:r}}succeed(e){let n=this.escalated.delete(e);return this.counters.delete(e),{recovered:n}}isFailing(e){return this.escalated.has(e)}};function Zk(t){return new Promise(e=>setTimeout(e,t))}a(Zk,"sleep");var Yk=3,ve=class extends Error{static{a(this,"DwsError")}exitCode;stderr;raw;authExpired;constructor(e,n){super(e),this.name="DwsError",this.exitCode=n?.exitCode??null,this.stderr=n?.stderr??"",this.raw=n?.raw??null,this.authExpired=n?.authExpired??!1}};function Qk(t){return Wr(t)}a(Qk,"resolveBareDwsBin");var he=class{static{a(this,"DwsClient")}rawBin;resolvedBin;timeoutMs;runner;failures=new Gn(Yk);constructor(e){this.rawBin=e.bin,this.timeoutMs=e.timeoutMs??3e4,this.runner=e.runner??J}get bin(){return this.runner!==J?this.rawBin:(this.resolvedBin??=Qk(this.rawBin),this.resolvedBin)}async runJson(e,n){let r=Xk(e),o=n?.timeoutMs??this.timeoutMs,i=r.slice(0,3).join(" "),s=Date.now(),c=Df();if(c)return h.info("dws","runJson delegated to relay dws runner",{cmd:i,timeoutMs:o}),c.runJson(r,{timeoutMs:o});let l=a(async()=>{let d;try{d=await ne(this.bin,r,{timeoutMs:o,runner:this.runner})}catch(p){throw nv(p,o)}if(d.exitCode!==0)throw new ve(`dws exited with code ${d.exitCode}`,{exitCode:d.exitCode,stderr:d.stderr,raw:d.stdout});let u=d.stdout.trim();if(u==="")return{};let f;try{f=JSON.parse(u)}catch{throw new ve("dws did not return valid JSON",{exitCode:d.exitCode,stderr:d.stderr,raw:d.stdout})}return ev(f,d.stderr),f},"attempt");try{let d=await wn(l,{shouldRetry:a(f=>!(f instanceof ve&&Br(`${f.message}
9
+ ${f.stderr}`)),"shouldRetry"),onRetry:a((f,p)=>{let g={cmd:i,retry:p,error:$f(f)};p>=2?h.warn("dws","runJson transient failure, retrying",g):h.debug("dws","runJson transient failure, retrying",g)},"onRetry")}),{recovered:u}=this.failures.succeed(i);return u&&h.info("dws","runJson recovered after sustained failures",{cmd:i}),d}catch(d){let u=Date.now()-s,{consecutive:f,escalate:p}=this.failures.fail(i),g=tv(d),m={cmd:i,elapsed:u,consecutive:f,error:$f(g),bin:this.bin,stderr:g instanceof ve?g.stderr.slice(0,500):void 0,stdout:g instanceof ve&&typeof g.raw=="string"?g.raw.slice(0,500):void 0};throw p?h.error("dws","runJson sustained failure \u2014 likely real misconfig, not a transient blip",m):g instanceof ve&&g.authExpired?h.warn("dws","runJson failed fast: dws auth expired (no retry)",m):h.warn("dws","runJson failed after retries",m),g}}};function ye(t){return v(t)?"body"in t?t.body:"data"in t?t.data:"result"in t?t.result:v(t.response)?"body"in t.response?t.response.body:"data"in t.response?t.response.data:t.response:t:t}a(ye,"dwsPayload");function Te(t){let e=ye(t),n=Pf(e);if(n)return n;if(v(e))for(let r of Object.values(e)){let o=Pf(r);if(o)return o}return[]}a(Te,"findArrayPayload");function Zo(t){let e=ye(t),n=Mf(e,["nextCursor","next_cursor","cursor"]);return n&&n.trim()!==""?n:null}a(Zo,"findCursor");function Xk(t){return t.includes("--format")||t.includes("-f")?t:[...t,"--format","json"]}a(Xk,"ensureJsonFormat");function ev(t,e){if(!v(t))return;let n=[t];for(let r of["body","data","result","response"]){let o=t[r];v(o)&&n.push(o)}for(let r of n){if(r.success===!1||String(r.success).toLowerCase()==="false")throw new ve("dws response reported success=false",{stderr:e,raw:t});if(r.degraded===!0||String(r.degraded).toLowerCase()==="true"){let o=typeof r.reason=="string"?r.reason:typeof r.message=="string"?r.message:typeof r.error=="string"?r.error:void 0;throw new ve(o?`dws degraded: ${o}`:"dws response reported degraded",{stderr:e,raw:t})}}}a(ev,"assertDwsSuccess");function $f(t){return t instanceof Error?t.message:String(t)}a($f,"errorMessage");function tv(t){if(!(t instanceof ve))return t;let e=`${t.message}
10
+ ${t.stderr}`;if(!Br(e))return t;let n="dws \u767B\u5F55\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `dws auth login` \u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5\uFF08\u660E\u7EC6\u89C1\u7EC8\u7AEF\u65E5\u5FD7\uFF09";return new ve(n,{exitCode:t.exitCode,stderr:t.stderr,raw:t.raw,authExpired:!0})}a(tv,"surfaceAuthFailure");function nv(t,e){if(t instanceof ve)return t;let n=t instanceof Error?t.message:String(t);return t instanceof Error&&t.name==="AbortError"?new ve(`dws timed out after ${e}ms: ${n}`):new ve(`dws runner failed: ${n}`)}a(nv,"wrapRunnerError");function Pf(t){if(Array.isArray(t))return t;if(!v(t))return null;for(let e of["records","items","list","rows","results","fields","tables"]){let n=t[e];if(Array.isArray(n))return n}return null}a(Pf,"findKnownArray");function Mf(t,e){if(!v(t))return null;for(let n of e){let r=t[n];if(typeof r=="string")return r}for(let n of Object.values(t))if(v(n)){let r=Mf(n,e);if(r)return r}return null}a(Mf,"findStringByKeys");var rv="alidocs.dingtalk.com",ov=/^v\d+[A-Za-z0-9]+_[A-Za-z0-9]+_[A-Za-z0-9]+$/;function iv(t){return ov.test(t)}a(iv,"isShareFormUuid");function sv(t){return`https://${rv}/notable/share/form/${t}`}a(sv,"buildFormShareUrl");var Of=2,jf=process.env.NODE_ENV==="test"?0:500;async function Ff(t,e,n,r){for(let o=1;o<=Of;o++){try{let i=await t.runJson(["aitable","form","share","get","--base-id",e,"--table-id",n,"--view-id",r]),s=ye(i);if(v(s))return{enabled:s.enabled===!0,uuid:typeof s.shareFormUuid=="string"?s.shareFormUuid:""};h.warn("setup","form share get \u8FD4\u56DE\u4E0D\u53EF\u89E3\u6790",{viewId:r,attempt:o})}catch(i){h.warn("setup","form share get \u5931\u8D25",{viewId:r,attempt:o,error:String(i)})}o<Of&&jf>0&&await new Promise(i=>setTimeout(i,jf))}}a(Ff,"readShareState");function Nf(t,e){if(iv(t))return sv(t);h.warn("setup","shareFormUuid \u5F62\u72B6\u4E0D\u5339\u914D\uFF0C\u4E0D\u62FC\u5206\u4EAB\u94FE\u63A5",{uuid:t,viewId:e})}a(Nf,"shareUrlOf");async function Yo(t,e,n,r,o){let i=await Ff(t,e,n,r);if(i?.enabled&&i.uuid)return Nf(i.uuid,r);if(!o.autoEnable)return;try{await t.runJson(["aitable","form","share","update","--base-id",e,"--table-id",n,"--view-id",r,"--enabled","true"])}catch(c){h.warn("setup","\u5F00\u542F\u8868\u5355\u5206\u4EAB\u5931\u8D25",{baseId:e,tableId:n,viewId:r,error:String(c)});return}let s=await Ff(t,e,n,r);if(!s){h.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u8BFB\u4E0D\u5230\u5206\u4EAB\u914D\u7F6E",{viewId:r});return}if(!s.uuid){h.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u4ECD\u65E0 shareFormUuid",{viewId:r,enabled:s.enabled});return}return Nf(s.uuid,r)}a(Yo,"ensureFormShare");import{mkdtemp as av,rm as cv,writeFile as lv}from"fs/promises";import{tmpdir as dv}from"os";import Lf from"path";async function yt(t,e,n){let r=await av(Lf.join(dv(),"aitable-dws-records-")),o=Lf.join(r,"records.json");try{return await lv(o,JSON.stringify(n),"utf8"),await t.runJson([...e,"--records-file",o])}finally{await cv(r,{recursive:!0,force:!0}).catch(()=>{})}}a(yt,"runDwsRecordsFile");var gv=300*1e3,Wf=80,Ja=new Map;function mv(t){let e=`${t.baseId}/${t.tableId}`;Ja.delete(e)}a(mv,"_clearFieldIdCacheFor");async function Qo(t,e){let n=`${e.baseId}/${e.tableId}`,r=Ja.get(n);if(r&&Date.now()-r.ts<gv)return r.map;let o=await t.runJson(["aitable","field","get","--base-id",e.baseId,"--table-id",e.tableId]),i=Te(o),s=new Map;for(let c of i){if(!v(c))continue;let l=typeof c.fieldId=="string"?c.fieldId:null,d=typeof c.fieldName=="string"?c.fieldName:null;l&&d&&s.set(d,l)}return Ja.set(n,{map:s,ts:Date.now()}),h.debug("table","\u5B57\u6BB5\u6620\u5C04\u5DF2\u52A0\u8F7D",{target:e,count:s.size}),s}a(Qo,"fetchFieldIdMap");function Za(t){return Te(t).map(n=>{let r=ye(n);if(r&&typeof r=="object"&&"recordId"in r)return String(r.recordId);if(n&&typeof n=="object"&&"recordId"in n)return String(n.recordId)}).filter(n=>n!=null)}a(Za,"extractRecordIds");function Xo(t){return Te(t).map(n=>{let r=ye(n),o=r&&typeof r=="object"?r:n,i=String(o.recordId??o.id??""),s=o.cells??o.fields??{};return{recordId:i,fields:s}})}a(Xo,"extractRecords");function hv(t,e){let n=new Map([...e.entries()].map(([r,o])=>[o,r]));return Object.fromEntries(Object.entries(t).map(([r,o])=>[n.get(r)??r,o]))}a(hv,"normalizeRecordFields");async function Bf(t,e,n,r){let o=[...new Map(r.map(l=>[String(l),l])).values()];if(o.length===0)return[];let i=await Qo(t,e),s=i.get(n)??n,c=[];for(let l=0;l<o.length;l+=Wf){let d=o.slice(l,l+Wf),u=d.length===1?{operator:"and",operands:[{operator:"eq",operands:[s,d[0]]}]}:{operator:"or",operands:d.map(p=>({operator:"eq",operands:[s,p]}))},f=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(u),"--limit",String(Math.max(2,d.length))]);for(let p of Xo(f)){let g=hv(p.fields,i);c.push({uniqueValue:g[n],recordId:p.recordId,fields:g})}}return c}a(Bf,"queryRecordsByUniqueValues");function yv(t,e,n,r){return{async readCurrentRow(){let[o]=await t.fetchItemsByIds([e.id]);return o?.fields??e.fields},async updateCurrentRow(o){await t.updateFields(e.id,o),Object.assign(e.fields,o)},async queryRows(o,i){let s=o&&Object.keys(o).length>0,c=s?await t.fetchItemsByFilter(o,i):await t.fetchAllItems();return(!s&&i!==void 0?c.slice(0,i):c).map(d=>d.fields)},async findRowIds(o,i){return!o||Object.keys(o).length===0?[]:(await t.fetchItemsByFilter(o,i)).map(c=>c.id).filter(c=>c.length>0)},async createRecordIn(o,i){ut(n);let s=await yt(n,["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],[{cells:i}]),c=Za(s);if(c.length===0)throw new Error(`createRecordIn: dws \u672A\u8FD4\u56DE recordId\uFF08target=${o.baseId}/${o.tableId}\uFF09`);return h.debug("table","createRecordIn \u6210\u529F",{target:o,recordId:c[0]}),{recordId:c[0]}},async createRecordsIn(o,i){if(ut(n),i.length===0)return{recordIds:[]};let s=await yt(n,["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],i.map(l=>({cells:l}))),c=Za(s);return h.debug("table","createRecordsIn \u6210\u529F",{target:o,count:c.length}),{recordIds:c}},async findRecordsIn(o,i,s){return ut(n),Bf(n,o,i,s)},async findRecordIn(o,i,s){ut(n);let c=(await Bf(n,o,i,[s]))[0];return c?{recordId:c.recordId,fields:c.fields}:null},async upsertRecordIn(o,i,s){ut(n);let c=s[i];if(c===void 0)throw new Error(`upsertRecordIn: fields \u4E2D\u7F3A\u5C11\u552F\u4E00\u952E "${i}"`);return Uf(n,o,i,c,s,0)},async findRecordIdIn(o,i,s){return ut(n),s==null||s===""?null:wv(n,o,i,s)},async readRecordIn(o,i){if(ut(n),!i)throw new Error(`readRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);let s=await n.runJson(["aitable","record","query","--base-id",o.baseId,"--table-id",o.tableId,"--record-ids",i]),c=Xo(s);if(c.length===0)return null;let l=await Qo(n,o),d=new Map;for(let[f,p]of l.entries())d.set(p,f);let u={};for(let[f,p]of Object.entries(c[0].fields)){let g=d.get(f)??f;u[g]=p}return u},async updateRecordsIn(o,i){if(ut(n),i.length!==0){for(let s of i)if(!s.recordId)throw new Error(`updateRecordsIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await yt(n,["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],i.map(s=>({recordId:s.recordId,cells:s.fields}))),h.debug("table","updateRecordsIn \u6210\u529F",{target:o,count:i.length})}},async updateRecordIn(o,i,s){if(ut(n),!i)throw new Error(`updateRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await yt(n,["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--yes"],[{recordId:i,cells:s}]),h.debug("table","updateRecordIn \u6210\u529F",{target:o,recordId:i})},async uploadAttachmentToCurrentTable(o,i){if(ut(n),!r)throw new Error("uploadAttachmentToCurrentTable: baseId \u672A\u6CE8\u5165\uFF08\u68C0\u67E5 settings.tracker.base_id\uFF09");let c=(await fv(o)).size;if(c>zf)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08${c} bytes > ${zf}\uFF09\uFF0C\u8DF3\u8FC7\u4E0A\u4F20`);let l=pv.extname(i).toLowerCase(),d=bv[l]??"application/octet-stream",u=await n.runJson(["aitable","attachment","upload","--base-id",r,"--file-name",i,"--size",String(c),"--mime-type",d],{timeoutMs:3e4}),f=ye(u),p=Ya(f,["uploadUrl","upload_url"]),g=Ya(f,["fileToken","file_token"]);if(!p||!g)throw new Error(`uploadAttachmentToCurrentTable: dws \u672A\u8FD4\u56DE uploadUrl/fileToken\uFF08response=${JSON.stringify(f)}\uFF09`);let m=await uv(o),y=await fetch(p,{method:"PUT",headers:{"Content-Type":d},body:m});if(!y.ok)throw new Error(`uploadAttachmentToCurrentTable: OSS PUT \u5931\u8D25\uFF08status=${y.status}\uFF09`);return h.debug("table","uploadAttachmentToCurrentTable \u6210\u529F",{fileName:i,fileToken:g,size:c}),{fileToken:g}},async formShareUrl(o,i){ut(n);let s=o.viewId;if(!s&&o.viewName)try{let l=await n.runJson(["aitable","view","get","--base-id",o.baseId,"--table-id",o.tableId]),u=Te(l).find(f=>v(f)?(typeof f.name=="string"?f.name:typeof f.viewName=="string"?f.viewName:"").trim()===o.viewName.trim():!1);u&&v(u)&&(s=typeof u.viewId=="string"?u.viewId:typeof u.id=="string"?u.id:void 0)}catch(l){return{url:"",reason:`\u83B7\u53D6\u89C6\u56FE\u5217\u8868\u5931\u8D25: ${String(l)}`}}if(!s)return{url:"",reason:`\u672A\u627E\u5230\u89C6\u56FE: ${o.viewName??"(\u672A\u6307\u5B9A)"}`};let c=await Yo(n,o.baseId,o.tableId,s,{autoEnable:i?.autoEnable??!1});return c?{url:c}:{url:"",reason:"\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\u6216\u89E3\u6790\u5931\u8D25"}}}}a(yv,"createTableToolkit");async function wv(t,e,n,r){let s={operator:"and",operands:[{operator:"eq",operands:[(await Qo(t,e)).get(n)??n,r]}]},c=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(s),"--limit","2"]),l=Xo(c);return l.length>0?l[0].recordId:null}a(wv,"doFindRecordIdIn");async function Uf(t,e,n,r,o,i){let l={operator:"and",operands:[{operator:"eq",operands:[(await Qo(t,e)).get(n)??n,r]}]},d=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(l),"--limit","2"]),u=Xo(d);if(u.length>0){let f=u[0].recordId;return await yt(t,["aitable","record","update","--base-id",e.baseId,"--table-id",e.tableId,"--yes"],[{recordId:f,cells:o}]),h.debug("table","upsertRecordIn \u66F4\u65B0",{target:e,recordId:f,uniqueBy:n}),{recordId:f}}try{let f=await yt(t,["aitable","record","create","--base-id",e.baseId,"--table-id",e.tableId,"--yes"],[{cells:o}]),p=Za(f);if(p.length===0)throw new Error("upsertRecordIn: create \u540E dws \u672A\u8FD4\u56DE recordId");return h.debug("table","upsertRecordIn \u65B0\u5EFA",{target:e,recordId:p[0],uniqueBy:n}),{recordId:p[0]}}catch(f){if(i===0)return mv(e),h.debug("table","upsertRecordIn create \u5931\u8D25\uFF0C\u6E05\u9664\u5B57\u6BB5\u7F13\u5B58\u540E\u91CD\u8BD5",{target:e,uniqueBy:n,error:String(f)}),Uf(t,e,n,r,o,1);throw f}}a(Uf,"doUpsertRecordIn");var zf=20*1024*1024,bv={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".md":"text/markdown",".txt":"text/plain",".csv":"text/csv",".json":"application/json",".pdf":"application/pdf",".zip":"application/zip",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};function Ya(t,e){if(!v(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r.trim()}for(let n of Object.values(t)){let r=Ya(n,e);if(r)return r}return null}a(Ya,"findStringInPayload");function ut(t){if(!t)throw new Error("\u591A\u8868\u5199\u5165\u9700\u8981 DwsClient\uFF0C\u4F46 table toolkit \u672A\u6CE8\u5165\uFF08\u68C0\u67E5 toolkit_config.table \u914D\u7F6E\uFF09")}a(ut,"ensureDws");function kv(t){return new he({bin:t.tracker.dws_bin})}a(kv,"createDwsFromSettings");var Kf={name:"table",description:"AI \u8868\u683C\u8BFB\u5199:\u8BFB/\u67E5\u5F53\u524D\u8868\u8BB0\u5F55\u3001\u66F4\u65B0\u5F53\u524D\u884C\u3001\u591A\u8868\u5199\u5165(create/upsert)",configSchema:$.object({}).strict(),build(t,e){let n=kv(e.settings);return yv(e.tracker,e.item,n,e.settings.tracker.base_id)},methods:[{name:"readCurrentRow",description:"\u8BFB\u53D6\u5F53\u524D\u884C\u6570\u636E",output:$.promise($.record($.string(),$.unknown()))},{name:"updateCurrentRow",description:"\u66F4\u65B0\u5F53\u524D\u884C\u5B57\u6BB5",params:$.object({fields:$.record($.string(),$.unknown()).describe("\u8981\u5199\u5165\u7684\u5B57\u6BB5\u952E\u503C")}),output:$.promise($.void())},{name:"queryRows",description:"\u67E5\u8BE2\u5176\u4ED6\u884C",params:$.object({filter:$.record($.string(),$.unknown()).describe("\u67E5\u8BE2\u6761\u4EF6"),limit:$.number().optional().describe("\u8FD4\u56DE\u6761\u6570\u4E0A\u9650")}),output:$.promise($.array($.record($.string(),$.unknown())))},{name:"readRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6309 recordId \u8BFB\u53D6\u4E00\u884C\uFF08\u5B57\u6BB5\u540D\u4E3A\u952E\uFF09",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),recordId:$.string()}),output:$.promise($.record($.string(),$.unknown()).nullable())},{name:"createRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u521B\u5EFA\u4E00\u6761\u8BB0\u5F55",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),fields:$.record($.string(),$.unknown())}),output:$.promise($.object({recordId:$.string()}))},{name:"createRecordsIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6279\u91CF\u521B\u5EFA\u8BB0\u5F55",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),rows:$.array($.record($.string(),$.unknown()))}),output:$.promise($.object({recordIds:$.array($.string())}))},{name:"findRecordsIn",description:"\u6309\u552F\u4E00\u952E\u6279\u91CF\u67E5\u8BE2\u8BB0\u5F55",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),uniqueBy:$.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),uniqueValues:$.array($.unknown()).describe("\u552F\u4E00\u952E\u5B57\u6BB5\u503C\u5217\u8868")}),output:$.promise($.array($.object({uniqueValue:$.unknown(),recordId:$.string(),fields:$.record($.string(),$.unknown())})))},{name:"upsertRecordIn",description:"\u6309\u552F\u4E00\u952E upsert\uFF08\u547D\u4E2D\u5219 update\uFF0C\u672A\u547D\u4E2D\u5219 create\uFF09",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),uniqueBy:$.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),fields:$.record($.string(),$.unknown())}),output:$.promise($.object({recordId:$.string()}))},{name:"uploadAttachmentToCurrentTable",description:"\u4E0A\u4F20\u672C\u5730\u6587\u4EF6\u5230\u5F53\u524D\u8868\u6240\u5728 base \u7684\u9644\u4EF6\u5B58\u50A8\uFF0C\u8FD4\u56DE fileToken",params:$.object({filePath:$.string().describe("\u672C\u5730\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84"),fileName:$.string().describe("\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09")}),output:$.promise($.object({fileToken:$.string()}))},{name:"formShareUrl",description:"\u53D6\u6307\u5B9A\u8868\u5355\u89C6\u56FE\u7684\u5206\u4EAB\u94FE\u63A5\uFF08\u6309 viewName \u6216 viewId \u89E3\u6790\uFF09",params:$.object({target:$.object({baseId:$.string(),tableId:$.string(),viewName:$.string().optional(),viewId:$.string().optional()}),options:$.object({autoEnable:$.boolean().optional()}).optional()}),output:$.promise($.object({url:$.string(),reason:$.string().optional()}))},{name:"updateRecordsIn",description:"\u6309 recordId \u6279\u91CF\u66F4\u65B0\u5B57\u6BB5",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),rows:$.array($.object({recordId:$.string(),fields:$.record($.string(),$.unknown())}))}),output:$.promise($.void())},{name:"updateRecordIn",description:"\u6309 recordId \u66F4\u65B0\u5B57\u6BB5",params:$.object({target:$.object({baseId:$.string(),tableId:$.string()}),recordId:$.string(),fields:$.record($.string(),$.unknown())}),output:$.promise($.void())}],permissions:[{method:"updateCurrentRow",description:"\u5199\u5165\u8868\u683C\u884C\u6570\u636E(\u9650\u5B9A\u53EF\u5199\u7684\u8868)",scopeSchema:$.array($.string()).describe("\u5141\u8BB8\u5199\u5165\u7684 table_id \u5217\u8868"),check:a((t,e,n)=>{let r=n.settings.tracker?.table_id;return r!=null&&t.includes(r)},"check")}]};import{z as be}from"zod";import Ht from"path";import In from"fs";import{readFile as qv}from"fs/promises";import nc from"path";import{z as re}from"zod";var vv=/^(Error|ERROR|fatal|FATAL|crash|CRASH|panic|PANIC|exception|EXCEPTION)\b/;function wt(t){return vv.test(t)}a(wt,"isStderrError");function we(t){if(!(!t||typeof t!="object"||Array.isArray(t)))return t}a(we,"asRecord");function V(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim().length>0)return r}}a(V,"pickString");function bn(t,e=512){return t.length>e?`${t.slice(0,e)}...`:t}a(bn,"truncateText");var Sv=["content","text","message","delta","output"];function xv(t){let e=t.toLowerCase();return e.includes("permission")?"permission_request":e.includes("thinking")||e.includes("thought")?"thinking":e.includes("tool")&&e.includes("result")?"tool_result":e.includes("tool")?"tool_use":e.includes("error")||e.includes("fatal")||e.includes("exception")?"error":e.includes("result")||e.includes("final")||e.includes("done")||e.includes("complete")?"result":(e.includes("text")||e.includes("message")||e.includes("assistant"),"text")}a(xv,"mapStructuredType");function Iv(t){let e=V(t,["type","event","kind","level"])??"text",n=xv(e),r=V(t,["toolName","tool_name","tool","name"]),o=we(t.toolInput)??we(t.input);return{type:n,content:V(t,Sv),toolName:r,toolInput:typeof t.toolInput=="string"?t.toolInput:void 0,toolInputRaw:o,sessionId:V(t,["sessionId","session_id","conversationId","conversation_id"]),requestId:V(t,["requestId","request_id","id"]),done:!!t.done||n==="result"}}a(Iv,"fromStructuredJson");function Rv(t){let e=t.trim();return e?/^(error|fatal|exception)\b/i.test(e)?{type:"error",content:e,done:!0}:/\bpermission\b/i.test(e)?{type:"permission_request",content:e}:/^(thinking|thought)\b/i.test(e)?{type:"thinking",content:e}:/\btool\b.*\b(result|output|observation)\b/i.test(e)?{type:"tool_result",content:e}:/\b(tool|function)\b.*\b(use|call|invoke|running)\b/i.test(e)||/^tool\s*:/i.test(e)?{type:"tool_use",content:e}:/\b(final answer|done|completed)\b/i.test(e)?{type:"result",content:e,done:!0}:{type:"text",content:e}:{type:"text",content:""}}a(Rv,"fromTextLine");function kn(t){let e=t.trim();if(!e)return{events:[],structured:!1};if(e.startsWith("{")&&e.endsWith("}")||e.startsWith("[")&&e.endsWith("]"))try{let n=JSON.parse(e);if(n&&typeof n=="object"&&!Array.isArray(n))return{events:[Iv(n)],structured:!0}}catch{}return{events:[Rv(e)],structured:!1}}a(kn,"parseAgentLine");function Cv(t,e){let n=we(e);if(!n)return"";switch(t){case"Read":case"Edit":case"Write":{let o=V(n,["file_path","filePath","path"]);if(o)return o;break}case"Bash":{let o=V(n,["command","cmd"]);if(o)return o;break}case"Grep":case"Glob":{let o=V(n,["pattern","glob_pattern","glob"]);if(o)return o;break}}let r=JSON.stringify(n);return r.length>512?`${r.slice(0,512)}...`:r}a(Cv,"summarizeToolInput");function Tv(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=we(n);if(!r)continue;let o=V(r,["type"])??"";if(o==="text"){let i=V(r,["text"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=V(r,["thinking","text"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"){let i=V(r,["name"])??"unknown";e.push({type:"tool_use",requestId:V(r,["id"]),toolName:i,toolInput:Cv(i,r.input),toolInputRaw:we(r.input)})}else if(o==="tool_result"){let i=V(r,["tool_use_id","id"]),s=typeof r.content=="string"?r.content:void 0,c=!!r.is_error;e.push({type:c?"error":"tool_result",requestId:i,content:s})}}return e}a(Tv,"parseContentBlocks");function _v(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=V(e,["type"])??"",r=V(e,["session_id","sessionId"]),o=a(i=>r?{...i,sessionId:r}:i,"addSession");if(n==="assistant"||n==="user"){let i=we(e.message);return i?Tv(i.content).map(o):[o({type:"text",content:""})]}if(n==="result"){let i=V(e,["result","content"])??"";return[o({type:"result",content:i,done:!0})]}if(n==="system")return r?[o({type:"text",content:""})]:[];if(n==="error"){let i=V(e,["error","message","content"])??"unknown error";return[o({type:"error",content:i,done:!0})]}return null}a(_v,"parseClaudeLine");function Qa(){return(t,e)=>{if(t==="stderr"){let o=e.trim();return o?wt(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=_v(n);return r&&r.length>0?r:kn(n).events}}a(Qa,"createClaudeParser");var Vf={id:"claudecode",name:"Claude Code",bin:"claude",versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];if(o.includes("--output-format")||o.push("--output-format","stream-json"),o.includes("--verbose")||o.push("--verbose"),r.model&&!o.includes("--model")&&o.push("--model",r.model),r.permissionMode==="bypassPermissions"&&(o.includes("--dangerously-skip-permissions")||o.push("--dangerously-skip-permissions")),r.allowedTools&&r.allowedTools.length>0)for(let i of r.allowedTools)o.push("--allowedTools",i);return e&&o.push("--resume",e),o.push("-p",t),o},"buildArgs"),createParser:Qa};function Xa(t){return V(t,["text","content","message","summary"])??""}a(Xa,"extractItemText");function vn(t){if(typeof t=="string")return t.trim().length>0?t:void 0;if(t!=null)try{return JSON.stringify(t)}catch{return String(t)}}a(vn,"stringifyValue");function ec(t,e){let n=we(t.error);return V(t,["message","error","content"])??(n?V(n,["message","error","content"]):void 0)??vn(t.error)??e}a(ec,"extractErrorText");function Av(t){return V(t,["command","query","input","arguments"])??vn(t.arguments)??vn(t.input)??vn(t.changes)}a(Av,"extractToolInput");function Ev(t){let e=V(t,["aggregated_output","output","result","message","text","summary"])??vn(t.output)??vn(t.result)??vn(t.changes);return e||(typeof t.exit_code=="number"?`exit_code=${t.exit_code}`:void 0)}a(Ev,"extractToolResult");function Dv(t,e){if(e!=="mcp_tool_call")return e||"codex_tool";let n=V(t,["server","server_name"]),r=V(t,["tool","tool_name","name"]);return[n,r].filter(Boolean).join(".")||e}a(Dv,"codexToolName");function $v(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=V(e,["type"])??"";if(n==="thread.started"){let r=V(e,["thread_id","threadId","id"]);return r?[{type:"text",content:"",sessionId:r}]:[]}if(n==="turn.completed"||n==="turn.started")return[];if(n==="turn.failed")return[{type:"error",content:ec(e,"Codex turn failed"),done:!0}];if(n==="item.started"||n==="item.updated"||n==="item.completed"){let r=we(e.item);if(!r)return[];let o=V(r,["type"])??"",i=V(r,["id","call_id"]),s=n==="item.completed";if(o==="agent_message"){if(!s)return[];let l=Xa(r);return l?[{type:"result",content:l,requestId:i,done:!0}]:[]}if(o==="reasoning"){if(!s)return[];let l=Xa(r);return l?[{type:"thinking",content:l,requestId:i}]:[]}if(o==="error")return[{type:"error",content:ec(r,"Codex item failed"),requestId:i,done:!0}];let c=Dv(r,o);return n==="item.started"?[{type:"tool_use",toolName:c,toolInput:Av(r),toolInputRaw:r,requestId:i}]:s?[{type:"tool_result",toolName:c,content:Ev(r),requestId:i}]:[]}if(n==="message.delta"){let r=we(e.delta)??we(e.content);if(!r)return[];let o=V(r,["text","content","value"]);return o?(V(r,["role"])??V(e,["role"]))==="system"?[]:[{type:"text",content:o}]:[]}if(n==="message.completed"){let r=we(e.message)??we(e.content);if(!r)return[];let o=Array.isArray(r.content)?r.content.map(i=>{let s=we(i);return s?Xa(s):""}).filter(i=>i.length>0).join(`
11
11
  `):V(r,["text","content"])??"";return o?[{type:"result",content:o,done:!0}]:[]}if(n==="tool_use"||n==="function_call"){let r=V(e,["name","tool","toolName"])??"unknown",o=V(e,["input","arguments"]);return[{type:"tool_use",toolName:r,toolInput:o,requestId:V(e,["id","call_id"])}]}return n==="tool_result"||n==="function_result"?[{type:"tool_result",content:V(e,["output","result","content"]),requestId:V(e,["tool_use_id","call_id","id"])}]:n==="error"?[{type:"error",content:ec(e,"unknown error"),done:!0}]:null}a($v,"parseCodexJsonLine");function Pv(){return(t,e)=>{if(t==="stderr"){let o=e.trim();return o?/^\d{4}-\d{2}-\d{2}T\S+\s+WARN\s+codex_core::shell_snapshot:/i.test(o)?[]:wt(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=$v(n);return r!==null?r:kn(n).events}}a(Pv,"createCodexParser");var qf={id:"codex",name:"OpenAI Codex",bin:"codex",versionArgs:["--version"],promptViaStdin:!0,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];e?o.push("exec","resume",e):o.push("exec"),r.ignoreUserConfig&&!o.includes("--ignore-user-config")&&o.push("--ignore-user-config"),o.includes("--json")||o.push("--json"),r.model&&!o.includes("--model")&&o.push("--model",r.model);let i=r.permissionMode==="bypassPermissions"?"yolo":r.mode??"full-auto";o.includes("--full-auto")||o.includes("--dangerously-bypass-approvals-and-sandbox")||(i==="yolo"?o.push("--dangerously-bypass-approvals-and-sandbox"):i==="full-auto"&&o.push("--full-auto"));let c=r.reasoningEffort??"high";if(c&&!o.some(l=>l.includes("model_reasoning_effort"))&&o.push("-c",`model_reasoning_effort="${c}"`),r.search&&!o.includes("--search")&&o.push("--search"),r.addDirs)for(let l of r.addDirs)o.push("--add-dir",l);return o.push("-"),o},"buildArgs"),createParser:Pv};function Mv(t){if(typeof t!="string")return;let e=t.trim();if(!(!e.startsWith("{")||!e.endsWith("}")))try{return we(JSON.parse(e))}catch{return}}a(Mv,"parseRecordString");function ei(t){return we(t)??Mv(t)}a(ei,"parseToolInputRaw");function Ov(t){return(t??"").replace(/[^a-z]/gi,"").toLowerCase()==="askuserquestion"}a(Ov,"isAskUserQuestionTool");function jv(t){let e=ei(t);if(!e)return;let n=Array.isArray(e.questions)?e.questions:[];if(n.length===0)return;let r=[];for(let o of n){let i=we(o);if(!i)continue;let s=V(i,["header","title"]),c=V(i,["question","text","prompt"]),l="";if(s&&c?l=`${s}: ${c}`:l=c??s??"",!l)continue;let d=Array.isArray(i.options)?i.options.map(u=>{let f=we(u);return f?V(f,["label","value","name"])??"":""}).filter(u=>u.length>0):[];d.length>0&&(l=`${l} (options: ${d.join(" / ")})`),r.push(l)}if(r.length!==0)return bn(r.join(" | "))}a(jv,"summarizeAskUserQuestion");function Hf(t,e){if(Ov(t)){let r=jv(e);if(r)return r}if(typeof e=="string"&&e.trim().length>0)return bn(e);let n=ei(e);if(n)return bn(JSON.stringify(n))}a(Hf,"summarizeToolInput");function Fv(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=we(n);if(!r)continue;let o=V(r,["type"])??"";if(o==="text"){let i=V(r,["text","content"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=V(r,["thinking","text","content"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"||o==="tool_call"){let i=V(r,["name","toolName","tool_name","tool"])??"unknown",s=r.input??r.toolInput??r.arguments;e.push({type:"tool_use",requestId:V(r,["id","requestId","request_id"]),toolName:i,toolInput:Hf(i,s),toolInputRaw:ei(s)})}else if(o==="tool_result"||o==="tool_output"){let i=typeof r.content=="string"?r.content:V(r,["output","result"]),s=!!r.is_error;e.push({type:s?"error":"tool_result",requestId:V(r,["tool_use_id","id","requestId","request_id"]),content:i})}}return e}a(Fv,"parseQoderContentBlocks");function Nv(t,e){if(!t.startsWith("{")||!t.endsWith("}"))return null;let n;try{n=JSON.parse(t)}catch{return null}let r=V(n,["messageId","message_id","id"]);if(r&&e.has(r))return[];r&&e.add(r);let o=V(n,["type","event"])??"",i=V(n,["sessionId","session_id"]),s=a(c=>i?{...c,sessionId:i}:c,"addSession");if(o==="system")return[];if(o==="text"){let c=V(n,["content","text","message","delta"]);return c?[s({type:"text",content:c})]:[]}if(o==="assistant"||o==="message"){let c=we(n.message),l=Fv(c?.content??n.content);if(l.length>0)return l.map(s);let d=V(n,["content","text","message","delta"])??(c?V(c,["content","text","message","delta"]):void 0);return d?[s({type:"text",content:d})]:[]}if(o==="thinking"||o==="thought"||o==="reasoning"){let c=V(n,["content","text","thinking"]);return c?[s({type:"thinking",content:c})]:[]}if(o==="tool_use"||o==="tool_call"){let c=V(n,["toolName","tool_name","name","tool"])??"unknown",l=n.toolInput??n.input??n.arguments;return[s({type:"tool_use",toolName:c,toolInput:Hf(c,l),toolInputRaw:ei(l),requestId:V(n,["requestId","request_id","id"])})]}if(o==="tool_result"||o==="tool_output"){let c=V(n,["content","output","result"]);return[s({type:"tool_result",content:c,requestId:V(n,["requestId","request_id","tool_use_id"])})]}if(o==="result"||o==="final"||o==="done"){let c=V(n,["content","result","text"])??"";return[s({type:"result",content:c,done:!0})]}if(o==="error"){let c=V(n,["content","error","message"])??"unknown error";return[s({type:"error",content:c,done:!0})]}return null}a(Nv,"parseQoderJsonLine");function Lv(){let t=new Set,e=!1;return(n,r)=>{if(n==="stderr"){let s=r.trim();return s?wt(s)?[{type:"error",content:s}]:[]:[]}let o=r.trim();if(!o)return[];let i=Nv(o,t);return i&&i.length>0?i:/^Usage:\s+qodercli\b/i.test(o)?(e=!0,[{type:"error",content:"Qoder CLI \u542F\u52A8\u53C2\u6570\u4E0D\u517C\u5BB9\uFF0C\u8F93\u51FA\u4E86 usage/help\uFF0C\u672A\u771F\u6B63\u6267\u884C\u8BBE\u8BA1 Agent\u3002",done:!0}]):e||/^(Arguments|Options|Commands):$/i.test(o)?[]:[]}}a(Lv,"createQoderParser");var Gf={id:"qoder",name:"Qoder",bin:"qodercli",fallbackBins:["qoder"],versionArgs:["--version"],promptViaStdin:!1,stripHostEnv:["QODER_AGENT_SDK_ENTRYPOINT","QODER_CONFIG_DIR"],buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n],i=a((...s)=>o.some(c=>s.includes(c)),"hasFlag");return i("--output-format","-o")||o.push("--output-format","stream-json"),i("--print","-p")||o.push("--print"),r.model&&!i("--model","-m")&&o.push("--model",r.model),r.permissionMode==="bypassPermissions"&&!i("--permission-mode","--dangerously-skip-permissions")&&o.push("--permission-mode","bypass_permissions"),e&&!i("--resume","-r")&&o.push("--resume",e),o.push("--",t),o},"buildArgs"),createParser:Lv};var Jf={id:"codebuddy",name:"Codebuddy Code",bin:"codebuddy",fallbackBins:["cbc"],versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];return o.includes("--output-format")||o.push("--output-format","stream-json"),o.includes("--verbose")||o.push("--verbose"),r.model&&!o.includes("--model")&&o.push("--model",r.model),r.reasoning&&r.reasoning!=="default"&&!o.includes("--effort")&&o.push("--effort",r.reasoning),r.permissionMode==="bypassPermissions"&&!o.includes("--dangerously-skip-permissions")&&o.push("--dangerously-skip-permissions"),e&&!o.includes("--resume")&&o.push("--resume",e),o.push("-p",t),o},"buildArgs"),createParser:Qa};function Kt(){return(t,e)=>{let n=e.trim();return n?t==="stderr"?wt(n)?[{type:"error",content:n}]:[]:kn(n).events:[]}}a(Kt,"createGenericParser");var Zf={id:"opencode",name:"OpenCode",bin:"opencode",versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];return o.includes("run")||o.push("run"),r.model&&!o.includes("-m")&&!o.includes("--model")&&o.push("-m",r.model),e&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e),o.push(t),o},"buildArgs"),createParser:Kt};var Yf={id:"qwen",name:"Qwen Code",bin:"qwen",versionArgs:["--version"],promptViaStdin:!0,buildArgs:a((t,{baseArgs:e,options:n})=>{let r=[...e];return r.includes("--yolo")||r.push("--yolo"),n.model&&n.model!=="default"&&!r.includes("--model")&&r.push("--model",n.model),r},"buildArgs"),createParser:Kt};var Qf={id:"deepseek",name:"DeepSeek",bin:"deepseek",fallbackBins:["codewhale"],versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{baseArgs:e,options:n})=>{let r=[...e];return r.includes("exec")||r.push("exec"),r.includes("--auto")||r.push("--auto"),n.model&&n.model!=="default"&&!r.includes("--model")&&r.push("--model",n.model),r.push(t),r},"buildArgs"),createParser:Kt};var Xf={id:"trae",name:"Trae CLI",bin:"trae-cli",fallbackBins:["traecli","trae"],versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{baseArgs:e,options:n})=>{let r=[...e];return r.includes("run")||r.push("run"),n.model&&n.model!=="default"&&!r.includes("--model")&&r.push("--model",n.model),r.push(t),r},"buildArgs"),createParser:Kt};import{existsSync as Wv}from"fs";var ep=String.raw`#!/usr/bin/env node
12
12
  import fs from 'node:fs';
13
13
  import os from 'node:os';
@@ -266,13 +266,13 @@ ${JSON.stringify(o.error.issues,null,2)}`);return o.data}a(sc,"loadAgentConfig")
266
266
 
267
267
  ---
268
268
 
269
- `),d=o?.workDir??(n?.kbActive?n.kbRootDir:t.workDir);h.info("coding","\u8C03\u7528\u7F16\u7A0B Agent",{agent:i,workDir:d,promptLength:l.length,contextInjected:!!n,kbActive:n?.kbActive??!1});let u=new AbortController,f,p=Date.now();try{let g=await kt(l,{agent:i,configPath:t.configPath,workDir:d,...o?.sessionId?{sessionId:o.sessionId}:{},model:o?.model??t.model,timeoutMs:o?.timeoutMs,signal:u.signal,adapterOptions:{permissionMode:"bypassPermissions",...n?.kbActive?{allowedTools:["Read","Glob","Grep"]}:{},...o?.adapterOptions??{}},onEvent:a(I=>{if(o?.onEvent&&o.onEvent({type:I.type,content:I.content}),!f&&ai(I)){let{question:k}=ci(I);f=k,u.abort()}},"onEvent")});if(f)return{response:`ASK_HUMAN_DETECTED: ${f}`,success:!1,sessionId:g.sessionId};let m=g.events.some(I=>I.type==="error"),w=dc(g.response,g.events)??(g.response.trim()?null:{kind:"empty_response",message:"agent \u672A\u8FD4\u56DE\u4EFB\u4F55\u54CD\u5E94"}),b=!m&&!w,x={agent:i,workDir:d,sessionId:g.sessionId,success:b,durationMs:Date.now()-p,...w?{failureKind:w.kind,failureMessage:w.message}:{}};return b?h.info("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210",x):h.warn("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210(\u6709\u9519\u8BEF)",x),{response:g.response,success:b,sessionId:g.sessionId,...w?{failure:w}:{}}}catch(g){if(f)return{response:`ASK_HUMAN_DETECTED: ${f}`,success:!1,sessionId:void 0};let m=g instanceof Error?g.message:String(g);h.error("coding","Agent \u6267\u884C\u5F02\u5E38",{agent:i,error:m});let y=dc("",[{type:"error",content:m}]);return{response:m,success:!1,sessionId:void 0,failure:y}}},activeAgent(){return e},available(){return e!==void 0}}}a(dS,"createCodingToolkit");function uS(){return{async run(){return{response:"\u5F53\u524D\u6A21\u5F0F\u4E3A llm_only\uFF0C\u65E0\u53EF\u7528\u7F16\u7A0B Agent\u3002\u8BF7\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E agent.engine \u4E3A claude/qoder/codex/qwenwork \u7B49 Coding Agent\u3002",success:!1,sessionId:void 0}},activeAgent(){},available(){return!1}}}a(uS,"createNullCodingToolkit");function Sp(t){return t.name.replace(/[\\/]+$/g,"").split(/[\\/]/).pop()?.trim()||t.slug}a(Sp,"mountName");function fS(t=process.platform){return t==="win32"?"junction":"dir"}a(fS,"wikiDirectoryLinkType");function pS(t,e){try{let n=Ht.join(t,"wiki");In.mkdirSync(n,{recursive:!0});for(let r of e){let o=Ht.join(n,Sp(r));try{let i=In.readlinkSync(o);if(Ht.resolve(Ht.dirname(o),i)===Ht.resolve(r.dir))continue;In.rmSync(o,{force:!0})}catch{In.existsSync(o)&&In.rmSync(o,{recursive:!0,force:!0})}In.symlinkSync(r.dir,o,fS())}return!0}catch(n){return h.warn("coding","workspace wiki \u8F6F\u94FE\u5931\u8D25\uFF0C\u56DE\u9000\u7EDD\u5BF9\u8DEF\u5F84 KB \u5757",{workspaceDir:t,error:n instanceof Error?n.message:String(n)}),!1}}a(pS,"ensureWikiSymlinks");function gS(t){try{return In.mkdirSync(t,{recursive:!0}),t}catch(e){h.warn("coding","\u89D2\u8272 workspace \u76EE\u5F55\u521B\u5EFA\u5931\u8D25\uFF0C\u56DE\u9000\u5230 cwd",{workspaceDir:t,error:e instanceof Error?e.message:String(e)});return}}a(gS,"ensureWorkspaceDir");var mS=be.object({engine:be.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]).optional().describe("\u7F16\u7A0B Agent \u5F15\u64CE;llm_only \u8868\u793A\u4E0D\u542F\u7528 coding agent(\u964D\u7EA7\u4E3A\u4E0D\u53EF\u7528)"),model:be.string().min(1).optional().describe("coding agent \u4F7F\u7528\u7684\u6A21\u578B\u540D"),cwd:be.string().min(1).optional().describe("coding agent \u5DE5\u4F5C\u76EE\u5F55"),workspace_dir:be.string().min(1).optional().describe("agent \u6267\u884C workspace \u76EE\u5F55(\u76F8\u5BF9 configDir)\uFF0C\u7F3A\u7701 workspaces/<role.id>")}).strict(),xp={name:"coding",description:"\u7F16\u7A0B Agent \u80FD\u529B:\u8BA9 recipe \u8C03\u7528 coding agent \u751F\u6210\u4EE3\u7801/\u6587\u4EF6/\u6A21\u677F\u3002",configSchema:mS,methods:[{name:"run",description:"\u53D1\u9001 prompt \u7ED9\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1",params:be.object({prompt:be.string().describe("\u4EFB\u52A1\u63D0\u793A\u8BCD"),options:be.object({agent:be.string().optional().describe("\u8986\u76D6 Agent \u7C7B\u578B(claudecode/codex/qoder/qwenwork \u7B49)"),workDir:be.string().optional(),sessionId:be.string().min(1).optional().describe("\u7EED\u63A5\u540C\u4E00 Agent \u4E0E\u5DE5\u4F5C\u76EE\u5F55\u6B64\u524D\u521B\u5EFA\u7684\u4F1A\u8BDD"),model:be.string().optional(),timeoutMs:be.number().optional()}).optional().describe("\u8FD0\u884C\u9009\u9879")}),output:be.promise(be.object({response:be.string(),success:be.boolean(),sessionId:be.string().optional()}))},{name:"activeAgent",description:"\u8FD4\u56DE\u5F53\u524D\u914D\u7F6E\u7684 Agent \u7C7B\u578B",output:be.string().optional()},{name:"available",description:"\u662F\u5426\u6709\u53EF\u7528\u7684\u7F16\u7A0B Agent",output:be.boolean()}],defaultConfig(t){return{model:t.agent.model,cwd:t.recipeDir}},build(t,e){let n=t.engine??e.settings.agent.engine;if(n==="llm_only")return uS();let r=e.roleContext?.id?.trim(),o=r&&/^[A-Za-z0-9._-]+$/.test(r)?r:void 0,i=t.workspace_dir?Ht.resolve(e.settings.configDir,t.workspace_dir):o?Ht.resolve(e.settings.configDir,"workspaces",o):void 0,s=i?gS(i):void 0,c=e.kbContext?.present===!0,l;if(c&&s&&(e.kbContext?.wikis?.length??0)>0&&pS(s,e.kbContext.wikis)){let u=gi(e.kbContext.wikis,{wikiRootOf:a(f=>`${Ht.posix.join("wiki",Sp(f))}/`,"wikiRootOf")});l=Hr({...e.roleContext?{roleContext:e.roleContext}:{},kbContext:e.kbContext,kbPromptBlock:u,kbRootDir:s})}return l||(l=Hr({...e.roleContext?{roleContext:e.roleContext}:{},...e.kbContext?{kbContext:e.kbContext}:{}})),dS({engine:n,workDir:s??t.cwd,model:t.model,configPath:bt(e.settings.configDir),...l?{injected:l}:{}})},permissions:[{method:"run",description:"\u542F\u52A8\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1(\u9650\u5B9A\u53EF\u7528\u7684 agent \u7C7B\u578B)",scopeSchema:be.array(be.string()).describe("\u5141\u8BB8\u4F7F\u7528\u7684 agent \u7C7B\u578B(\u5982 claudecode/codex/qoder/qwenwork)"),check:a((t,e)=>{let n=t,r=e[1]?.agent;return r==null?n.length>0:n.includes(r)},"check")}]};import{createHmac as ES}from"crypto";import{z as A}from"zod";var hc=class{static{a(this,"SessionWebhookRegistry")}map=new Map;register(e){if(!e.conversationId)return;let n=this.map.get(e.conversationId),r=e.sessionWebhook??n?.sessionWebhook,o=e.sessionWebhookExpiredTime??n?.sessionWebhookExpiredTime,i=e.conversationType??n?.conversationType;this.map.set(e.conversationId,{...e,...r?{sessionWebhook:r}:{},...typeof o=="number"?{sessionWebhookExpiredTime:o}:{},...i?{conversationType:i}:{},registeredAt:Date.now()}),this.prune()}lookup(e){if(!e)return;let n=this.map.get(e);if(n){if(this.isExpired(n)){this.map.delete(e);return}return n}}clear(){this.map.clear()}isExpired(e){let n=Date.now();return typeof e.sessionWebhookExpiredTime=="number"?n>=e.sessionWebhookExpiredTime:n-e.registeredAt>=54e5}prune(){for(let[e,n]of this.map)this.isExpired(n)&&this.map.delete(e)}},Rn=new hc;async function yc(t,e,n){let r=new Array(t.length),o=0,i=Array.from({length:Math.min(e,t.length)},async()=>{for(;o<t.length;){let s=o++;r[s]=await n(t[s])}});return await Promise.all(i),r}a(yc,"mapWithConcurrency");var hS=3600*1e3,yS=300*1e3,wS=1e3,Ip=15e3;function bS(t){if(!t||typeof t!="object")return[];let e=t,n=e.result,r=n&&typeof n=="object"?n.result:void 0,o=e.data&&typeof e.data=="object"?e.data.result:void 0;return(Array.isArray(n)?n:Array.isArray(r)?r:Array.isArray(o)?o:[]).filter(s=>!!s&&typeof s=="object")}a(bS,"contactCandidates");function kS(t,e){return async(n,r)=>{let o=r?.trim(),i=["contact","user","search","--query",n];o&&i.push("--profile",o),i.push("--format","json");let s=await ne(e,i,{timeoutMs:Ip,runner:t});if(s.exitCode!==0)throw new Error(`dws contact user search \u5931\u8D25(exit ${s.exitCode}): ${s.stderr.slice(0,200)}`);return s.stdout.trim()?JSON.parse(s.stdout):{}}}a(kS,"createDwsContactSearch");function mi(t={}){let e=t.now??Date.now,n=t.positiveTtlMs??hS,r=t.negativeTtlMs??yS,o=Math.max(1,Math.floor(t.maxCacheEntries??wS)),i=t.searchContacts??kS(t.runner??J,t.dwsBin??"dws"),s=new Map,c=a(u=>{for(let[f,p]of s)p.expiresAt<=u&&s.delete(f)},"pruneExpired"),l=a((u,f)=>{c(f);let p=s.get(u);if(p)return s.delete(u),s.set(u,p),p},"readCache"),d=a((u,f,p)=>{for(c(p),s.delete(u);s.size>=o;){let g=s.keys().next().value;if(g===void 0)break;s.delete(g)}s.set(u,f)},"writeCache");return async(u,f,p)=>{let g=u.trim();if(!g)return;if(/^\d+$/.test(g))return g;let m=f.trim();if(!m)return;let y=p?.trim()??"",w=`${y}\0${g}\0${m}`,b=e(),x=l(w,b);if(x)return x.userId;try{let I=[...new Set(bS(await i(m,y||void 0)).filter(k=>k.openDingTalkId?.trim()===g).map(k=>k.userId?.trim()??"").filter(Boolean))],v=I.length===1?I[0]:void 0;return d(w,{...v?{userId:v}:{},expiresAt:b+(v?n:r)},b),v}catch{d(w,{expiresAt:b+r},b);return}}}a(mi,"createDingTalkAtUserIdResolver");var vS=mi();function Rp(t,e,n,r){let o=typeof n=="string"&&n.trim()||void 0,i=typeof n=="function"?n:r;return i?mi({searchContacts:i})(t,e,o):vS(t,e,o)}a(Rp,"resolveDingTalkAtUserId");async function NW(t,e={}){let n=e.concurrency??5,r=e.log??(()=>{}),o=e.runner??J,i=e.dwsBin??"dws",s=e.timeoutMs??Ip,c=[],l=await yc(t,n,async u=>{try{let f=await ne(i,["contact","user","get","--ids",u,"--format","json"],{timeoutMs:s,runner:o});if(f.exitCode!==0)throw new Error(`exit ${f.exitCode}: ${f.stderr.slice(0,200)}`);let g=(f.stdout.trim()?JSON.parse(f.stdout):{}).result?.[0]?.orgEmployeeModel?.orgUserName;if(!g)throw new Error("\u672A\u67E5\u8BE2\u5230\u7EC4\u7EC7\u5185\u59D3\u540D");let m=await ne(i,["contact","user","search","--query",g,"--format","json"],{timeoutMs:s,runner:o});if(m.exitCode!==0)throw new Error(`search exit ${m.exitCode}: ${m.stderr.slice(0,200)}`);let w=((m.stdout.trim()?JSON.parse(m.stdout):{}).result??[]).find(b=>b.userId===u);if(w?.openDingTalkId&&w?.nick)return{userId:u,nick:w.nick,openDingTalkId:w.openDingTalkId};throw new Error("\u672A\u67E5\u8BE2\u5230\u5339\u914D\u7684 openDingTalkId/nick")}catch(f){let p=`${u}: ${f instanceof Error?f.message:String(f)}`;return c.push(p),r(`contact \u89E3\u6790\u5931\u8D25 ${p}`),null}}),d=new Map;for(let u of l)u&&d.set(u.userId,u);return{contacts:d,errors:c}}a(NW,"resolveContactsByUserIds");var SS="#007fff";function wc(t){return`<font color="${SS}">@${t}</font>`}a(wc,"formatDingTalkAtPlaceholder");function Cp(t,e){let n=t,r=[];for(let i of e)if(!n.includes(wc(i))){if(n.includes(`@${i}`)){n=n.split(`@${i}`).join(wc(i));continue}r.push(i)}return r.length===0?n:`${r.map(wc).join(" ")} ${n}`}a(Cp,"prependDingTalkAtPlaceholders");var xS="https://api.dingtalk.com",IS=300*1e3,RS=15e3,Tp=6,Et=class{static{a(this,"DingTalkRobotClient")}appKey;appSecret;openApiBase;timeoutMs;fetchImpl;tokenCache=null;tokenInflight=null;constructor(e){if(!e.appKey||!e.appSecret)throw new Error("DingTalkRobotClient \u9700\u8981 appKey/appSecret");this.appKey=e.appKey,this.appSecret=e.appSecret,this.openApiBase=(e.endpoint||xS).replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??RS,this.fetchImpl=e.fetchImpl??globalThis.fetch}async getAccessToken(){let e=Date.now();return this.tokenCache&&e<this.tokenCache.expireAt-IS?this.tokenCache.value:this.tokenInflight?this.tokenInflight:(this.tokenInflight=this.fetchAccessToken().then(n=>(this.tokenCache=n,n.value)).finally(()=>{this.tokenInflight=null}),this.tokenInflight)}async fetchAccessToken(){let e=`${this.openApiBase}/v1.0/oauth2/accessToken`,n=await this.fetchImpl(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appKey:this.appKey,appSecret:this.appSecret}),signal:AbortSignal.timeout(this.timeoutMs)}),r=await n.text().catch(()=>""),o;try{o=r?JSON.parse(r):{}}catch{throw new Error(`\u6362\u53D6 access_token \u5931\u8D25 HTTP ${n.status}: \u54CD\u5E94\u975E JSON: ${r.slice(0,200)}`)}if(!n.ok||!o.accessToken)throw new Error(`\u6362\u53D6 access_token \u5931\u8D25 HTTP ${n.status}: ${r.slice(0,200)}`);let i=(o.expireIn??7200)*1e3;return h.debug("dingtalk-robot-client","access_token refreshed",{expireIn:o.expireIn}),{value:o.accessToken,expireAt:Date.now()+i}}async replyViaSessionWebhook(e,n,r){if(!e)throw new Error("replyViaSessionWebhook \u7F3A\u5C11 sessionWebhook");if(typeof r?.expiredTime=="number"&&Date.now()>r.expiredTime)throw new Error("sessionWebhook \u5DF2\u8FC7\u671F\uFF0C\u8BF7\u964D\u7EA7\u4E3A robot API \u4E3B\u52A8\u63A8\u9001");let o=(r?.atUserStaffIds??[]).map(hi).filter(Boolean),i=o.length>0?CS(n,o):n,s={msgtype:"markdown",markdown:{title:r?.title??TS(n),text:i},at:{isAtAll:r?.atAll??!1,...o.length>0?{atUserIds:o}:{}}};await this.postJson(e,s,void 0,"sessionWebhook")}async sendGroupMarkdown(e,n,r,o){if(!e||!n)throw new Error("sendGroupMarkdown \u7F3A\u5C11 robotCode/openConversationId");let i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:"sampleMarkdown",msgParam:JSON.stringify({title:r,text:o})};await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi")}async sendGroupText(e,n,r){if(!e||!n)throw new Error("sendGroupText \u7F3A\u5C11 robotCode/openConversationId");let o=await this.getAccessToken(),i=`${this.openApiBase}/v1.0/robot/groupMessages/send`,s={robotCode:e,openConversationId:n,msgKey:"sampleText",msgParam:JSON.stringify({content:r})};await this.postJson(i,s,{"x-acs-dingtalk-access-token":o},"robotApi")}async sendGroupActionCard(e,n,r){if(!e||!n)throw new Error("sendGroupActionCard \u7F3A\u5C11 robotCode/openConversationId");let o=_p(r,"sendGroupActionCard"),i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:o.msgKey,msgParam:o.msgParam},l=await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi.actionCard");return l.processQueryKey?{processQueryKey:l.processQueryKey}:{}}async sendActionCardToUsers(e,n,r){if(!e)throw new Error("sendActionCardToUsers \u7F3A\u5C11 robotCode");if(!Array.isArray(n)||n.length===0)throw new Error("sendActionCardToUsers \u7684 userIds \u4E0D\u80FD\u4E3A\u7A7A");let o=n.map(u=>String(u??"").trim());if(o.some(u=>!u))throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u7A7A\u503C");if(new Set(o).size!==o.length)throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u91CD\u590D\u9879");let i=_p(r,"sendActionCardToUsers"),s=await this.getAccessToken(),c=`${this.openApiBase}/v1.0/robot/oToMessages/batchSend`,l={robotCode:e,userIds:o,msgKey:i.msgKey,msgParam:i.msgParam},d=await this.postJson(c,l,{"x-acs-dingtalk-access-token":s},"robotApi.userActionCard");return d.processQueryKey?{processQueryKey:d.processQueryKey}:{}}async replyEmotion(e){await this.sendEmotion("reply",e)}async recallEmotion(e){await this.sendEmotion("recall",e)}async sendEmotion(e,n){if(!n.robotCode||!n.openMsgId||!n.openConversationId||!n.emotionName)throw new Error(`sendEmotion(${e}) \u7F3A\u5C11 robotCode/openMsgId/openConversationId/emotionName`);let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/emotion/${e}`,i={...n,emotionType:1};await this.postJson(o,i,{"x-acs-dingtalk-access-token":r},`emotion.${e}`,!0)}async downloadMessageFile(e,n){if(!e||!n)throw new Error("downloadMessageFile \u7F3A\u5C11 robotCode/downloadCode");let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/messageFiles/download`,i;try{i=await this.fetchImpl(o,{method:"POST",headers:{"Content-Type":"application/json","x-acs-dingtalk-access-token":r},body:JSON.stringify({downloadCode:n,robotCode:e}),signal:AbortSignal.timeout(this.timeoutMs)})}catch(l){let d=l instanceof Error?l.message:String(l);throw h.error("dingtalk-robot-client","\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u8BF7\u6C42\u5931\u8D25",{error:d}),new Error(`\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u8BF7\u6C42\u5931\u8D25: ${d}`)}let s=await i.text().catch(()=>""),c;try{c=s?JSON.parse(s):{}}catch{throw new Error(`\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u5931\u8D25 HTTP ${i.status}: \u54CD\u5E94\u975E JSON: ${s.slice(0,200)}`)}if(!i.ok||!c.downloadUrl)throw h.error("dingtalk-robot-client","\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u5931\u8D25",{status:i.status,errmsg:c.errmsg}),new Error(`\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u5931\u8D25 HTTP ${i.status}: ${c.errmsg??(s.slice(0,200)||"\u65E0 downloadUrl")}`);return c.downloadUrl}async postJson(e,n,r,o,i=!1){let s;try{s=await this.fetchImpl(e,{method:"POST",headers:{"Content-Type":"application/json",...r??{}},body:JSON.stringify(n),signal:AbortSignal.timeout(this.timeoutMs)})}catch(d){let u=d instanceof Error?d.message:String(d);throw h.error("dingtalk-robot-client","\u8BF7\u6C42\u5931\u8D25",{channel:o,error:u}),new Error(`\u9489\u9489\u51FA\u7AD9\u8BF7\u6C42\u5931\u8D25 (${o}): ${u}`)}let c=await s.text().catch(()=>""),l;try{if(i&&!c)throw new Error("empty response");l=c?JSON.parse(c):{}}catch{if(!s.ok)throw new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) HTTP ${s.status}: ${c.slice(0,200)}`);if(i)throw new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}): \u54CD\u5E94\u975E JSON: ${c.slice(0,200)}`);l={}}if(!s.ok)throw h.error("dingtalk-robot-client","HTTP \u975E 2xx",{channel:o,status:s.status,errmsg:l.errmsg}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) HTTP ${s.status}: ${l.errmsg??c.slice(0,200)}`);if(typeof l.errcode=="number"&&l.errcode!==0)throw h.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,errcode:l.errcode,errmsg:l.errmsg}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) errcode=${l.errcode}: ${l.errmsg??""}`);if(l.success===!1)throw h.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}): ${l.message??c.slice(0,200)}`);if(typeof l.code=="string"&&l.code&&l.code!=="0")throw h.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,code:l.code,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) code=${l.code}: ${l.message??""}`);return h.debug("dingtalk-robot-client","sent",{channel:o}),l}};function _p(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length<1||t.buttons.length>5)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u5305\u542B 1\uFF5E5 \u4E2A\u6309\u94AE`);for(let[i,s]of t.buttons.entries())if(!s?.title?.trim()||!s.url?.trim())throw new Error(`${e} \u7684\u7B2C ${i+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`);let n=t.buttons.length,r=t.orientation??(n===2?"horizontal":"vertical");if(r==="horizontal"&&n!==2)throw new Error(`${e} \u4EC5\u53CC\u6309\u94AE\u652F\u6301 horizontal \u6392\u5217`);if(n===1){let[i]=t.buttons;return{msgKey:"sampleActionCard",msgParam:JSON.stringify({title:t.title,text:t.text,singleTitle:i.title,singleURL:i.url})}}if(n===2&&r==="horizontal"){let[i,s]=t.buttons;return{msgKey:"sampleActionCard6",msgParam:JSON.stringify({title:t.title,text:t.text,buttonTitle1:i.title,buttonUrl1:i.url,buttonTitle2:s.title,buttonUrl2:s.url})}}let o={title:t.title,text:t.text};return t.buttons.forEach((i,s)=>{o[`actionTitle${s+1}`]=i.title,o[`actionURL${s+1}`]=i.url}),{msgKey:`sampleActionCard${n}`,msgParam:JSON.stringify(o)}}a(_p,"buildActionCardMessage");function hi(t){let e=String(t??"").trim();return e&&(e.length<Tp?e.padStart(Tp,"0"):e)}a(hi,"padStaffId");function CS(t,e){let n=e.filter(o=>!t.includes(`@${o}`));return n.length===0?t:`${n.map(o=>`@${o}`).join(" ")} ${t}`}a(CS,"prependAtPlaceholders");function TS(t){let e=t.match(/^\s*[【[]([^】\]]{1,20})[】\]]/);return e?.[1]?e[1].trim():(t.split(/\r?\n/).find(o=>o.trim().length>0)??"").replace(/[#*_`>~-]/g,"").trim().slice(0,20).trim()||"\u673A\u5668\u4EBA\u6D88\u606F"}a(TS,"deriveTitle");var _S="1",yi=class{static{a(this,"DingTalkSender")}robotClient;robotCode;registry;constructor(e={},n={}){n.robotClient?this.robotClient=n.robotClient:e.robot?.appKey&&e.robot?.appSecret&&(this.robotClient=new Et({appKey:e.robot.appKey,appSecret:e.robot.appSecret,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})),this.robotCode=e.robotCode??e.robot?.appKey,this.registry=n.registry??Rn}get canReplyInSession(){return!!this.robotClient}async replyToConversation(e,n,r={}){let o=r.entry??this.registry.lookup(e),i=o?.conversationType===_S,s=i||r.mentionSender===!1?"":typeof r.mentionSender=="string"?r.mentionSender.trim():String(o?.senderStaffId??"").trim(),c=i?[]:[...new Set([s,...(r.mentionUserIds??[]).map(u=>u.trim())].filter(Boolean))],l=c.length>0?{atUserIds:c}:{};if(!r.preferWebhook&&this.robotClient&&o?.sessionWebhook)try{return await this.robotClient.replyViaSessionWebhook(o.sessionWebhook,n,{...c.length>0?{atUserStaffIds:c}:{},...typeof o.sessionWebhookExpiredTime=="number"?{expiredTime:o.sessionWebhookExpiredTime}:{},...r.title?{title:r.title}:{}}),{via:"session",...l}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`session \u5931\u8D25: ${f}${g}`}}if(!r.preferWebhook&&this.robotClient&&this.robotCode&&!o?.sessionWebhook)try{let f=(r.senderName?`${r.senderName}
269
+ `),d=o?.workDir??(n?.kbActive?n.kbRootDir:t.workDir);h.info("coding","\u8C03\u7528\u7F16\u7A0B Agent",{agent:i,workDir:d,promptLength:l.length,contextInjected:!!n,kbActive:n?.kbActive??!1});let u=new AbortController,f,p=Date.now();try{let g=await kt(l,{agent:i,configPath:t.configPath,workDir:d,...o?.sessionId?{sessionId:o.sessionId}:{},model:o?.model??t.model,timeoutMs:o?.timeoutMs??t.timeoutMs,signal:u.signal,adapterOptions:{permissionMode:"bypassPermissions",...n?.kbActive?{allowedTools:["Read","Glob","Grep"]}:{},...o?.adapterOptions??{}},onEvent:a(I=>{if(o?.onEvent&&o.onEvent({type:I.type,content:I.content}),!f&&ai(I)){let{question:k}=ci(I);f=k,u.abort()}},"onEvent")});if(f)return{response:`ASK_HUMAN_DETECTED: ${f}`,success:!1,sessionId:g.sessionId};let m=g.events.some(I=>I.type==="error"),w=dc(g.response,g.events)??(g.response.trim()?null:{kind:"empty_response",message:"agent \u672A\u8FD4\u56DE\u4EFB\u4F55\u54CD\u5E94"}),b=!m&&!w,x={agent:i,workDir:d,sessionId:g.sessionId,success:b,durationMs:Date.now()-p,...w?{failureKind:w.kind,failureMessage:w.message}:{}};return b?h.info("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210",x):h.warn("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210(\u6709\u9519\u8BEF)",x),{response:g.response,success:b,sessionId:g.sessionId,...w?{failure:w}:{}}}catch(g){if(f)return{response:`ASK_HUMAN_DETECTED: ${f}`,success:!1,sessionId:void 0};let m=g instanceof Error?g.message:String(g);h.error("coding","Agent \u6267\u884C\u5F02\u5E38",{agent:i,error:m});let y=dc("",[{type:"error",content:m}]);return{response:m,success:!1,sessionId:void 0,failure:y}}},activeAgent(){return e},available(){return e!==void 0}}}a(dS,"createCodingToolkit");function uS(){return{async run(){return{response:"\u5F53\u524D\u6A21\u5F0F\u4E3A llm_only\uFF0C\u65E0\u53EF\u7528\u7F16\u7A0B Agent\u3002\u8BF7\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E agent.engine \u4E3A claude/qoder/codex/qwenwork \u7B49 Coding Agent\u3002",success:!1,sessionId:void 0}},activeAgent(){},available(){return!1}}}a(uS,"createNullCodingToolkit");function Sp(t){return t.name.replace(/[\\/]+$/g,"").split(/[\\/]/).pop()?.trim()||t.slug}a(Sp,"mountName");function fS(t=process.platform){return t==="win32"?"junction":"dir"}a(fS,"wikiDirectoryLinkType");function pS(t,e){try{let n=Ht.join(t,"wiki");In.mkdirSync(n,{recursive:!0});for(let r of e){let o=Ht.join(n,Sp(r));try{let i=In.readlinkSync(o);if(Ht.resolve(Ht.dirname(o),i)===Ht.resolve(r.dir))continue;In.rmSync(o,{force:!0})}catch{In.existsSync(o)&&In.rmSync(o,{recursive:!0,force:!0})}In.symlinkSync(r.dir,o,fS())}return!0}catch(n){return h.warn("coding","workspace wiki \u8F6F\u94FE\u5931\u8D25\uFF0C\u56DE\u9000\u7EDD\u5BF9\u8DEF\u5F84 KB \u5757",{workspaceDir:t,error:n instanceof Error?n.message:String(n)}),!1}}a(pS,"ensureWikiSymlinks");function gS(t){try{return In.mkdirSync(t,{recursive:!0}),t}catch(e){h.warn("coding","\u89D2\u8272 workspace \u76EE\u5F55\u521B\u5EFA\u5931\u8D25\uFF0C\u56DE\u9000\u5230 cwd",{workspaceDir:t,error:e instanceof Error?e.message:String(e)});return}}a(gS,"ensureWorkspaceDir");var mS=be.object({engine:be.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]).optional().describe("\u7F16\u7A0B Agent \u5F15\u64CE;llm_only \u8868\u793A\u4E0D\u542F\u7528 coding agent(\u964D\u7EA7\u4E3A\u4E0D\u53EF\u7528)"),model:be.string().min(1).optional().describe("coding agent \u4F7F\u7528\u7684\u6A21\u578B\u540D"),cwd:be.string().min(1).optional().describe("coding agent \u5DE5\u4F5C\u76EE\u5F55"),workspace_dir:be.string().min(1).optional().describe("agent \u6267\u884C workspace \u76EE\u5F55(\u76F8\u5BF9 configDir)\uFF0C\u7F3A\u7701 workspaces/<role.id>")}).strict(),xp={name:"coding",description:"\u7F16\u7A0B Agent \u80FD\u529B:\u8BA9 recipe \u8C03\u7528 coding agent \u751F\u6210\u4EE3\u7801/\u6587\u4EF6/\u6A21\u677F\u3002",configSchema:mS,methods:[{name:"run",description:"\u53D1\u9001 prompt \u7ED9\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1",params:be.object({prompt:be.string().describe("\u4EFB\u52A1\u63D0\u793A\u8BCD"),options:be.object({agent:be.string().optional().describe("\u8986\u76D6 Agent \u7C7B\u578B(claudecode/codex/qoder/qwenwork \u7B49)"),workDir:be.string().optional(),sessionId:be.string().min(1).optional().describe("\u7EED\u63A5\u540C\u4E00 Agent \u4E0E\u5DE5\u4F5C\u76EE\u5F55\u6B64\u524D\u521B\u5EFA\u7684\u4F1A\u8BDD"),model:be.string().optional(),timeoutMs:be.number().optional()}).optional().describe("\u8FD0\u884C\u9009\u9879")}),output:be.promise(be.object({response:be.string(),success:be.boolean(),sessionId:be.string().optional()}))},{name:"activeAgent",description:"\u8FD4\u56DE\u5F53\u524D\u914D\u7F6E\u7684 Agent \u7C7B\u578B",output:be.string().optional()},{name:"available",description:"\u662F\u5426\u6709\u53EF\u7528\u7684\u7F16\u7A0B Agent",output:be.boolean()}],defaultConfig(t){return{model:t.agent.model,cwd:t.recipeDir}},build(t,e){let n=t.engine??e.settings.agent.engine;if(n==="llm_only")return uS();let r=e.roleContext?.id?.trim(),o=r&&/^[A-Za-z0-9._-]+$/.test(r)?r:void 0,i=t.workspace_dir?Ht.resolve(e.settings.configDir,t.workspace_dir):o?Ht.resolve(e.settings.configDir,"workspaces",o):void 0,s=i?gS(i):void 0,c=e.kbContext?.present===!0,l;if(c&&s&&(e.kbContext?.wikis?.length??0)>0&&pS(s,e.kbContext.wikis)){let u=gi(e.kbContext.wikis,{wikiRootOf:a(f=>`${Ht.posix.join("wiki",Sp(f))}/`,"wikiRootOf")});l=Hr({...e.roleContext?{roleContext:e.roleContext}:{},kbContext:e.kbContext,kbPromptBlock:u,kbRootDir:s})}return l||(l=Hr({...e.roleContext?{roleContext:e.roleContext}:{},...e.kbContext?{kbContext:e.kbContext}:{}})),dS({engine:n,workDir:s??t.cwd,model:t.model,timeoutMs:e.settings.agent.timeout_ms,configPath:bt(e.settings.configDir),...l?{injected:l}:{}})},permissions:[{method:"run",description:"\u542F\u52A8\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1(\u9650\u5B9A\u53EF\u7528\u7684 agent \u7C7B\u578B)",scopeSchema:be.array(be.string()).describe("\u5141\u8BB8\u4F7F\u7528\u7684 agent \u7C7B\u578B(\u5982 claudecode/codex/qoder/qwenwork)"),check:a((t,e)=>{let n=t,r=e[1]?.agent;return r==null?n.length>0:n.includes(r)},"check")}]};import{createHmac as ES}from"crypto";import{z as A}from"zod";var hc=class{static{a(this,"SessionWebhookRegistry")}map=new Map;register(e){if(!e.conversationId)return;let n=this.map.get(e.conversationId),r=e.sessionWebhook??n?.sessionWebhook,o=e.sessionWebhookExpiredTime??n?.sessionWebhookExpiredTime,i=e.conversationType??n?.conversationType;this.map.set(e.conversationId,{...e,...r?{sessionWebhook:r}:{},...typeof o=="number"?{sessionWebhookExpiredTime:o}:{},...i?{conversationType:i}:{},registeredAt:Date.now()}),this.prune()}lookup(e){if(!e)return;let n=this.map.get(e);if(n){if(this.isExpired(n)){this.map.delete(e);return}return n}}clear(){this.map.clear()}isExpired(e){let n=Date.now();return typeof e.sessionWebhookExpiredTime=="number"?n>=e.sessionWebhookExpiredTime:n-e.registeredAt>=54e5}prune(){for(let[e,n]of this.map)this.isExpired(n)&&this.map.delete(e)}},Rn=new hc;async function yc(t,e,n){let r=new Array(t.length),o=0,i=Array.from({length:Math.min(e,t.length)},async()=>{for(;o<t.length;){let s=o++;r[s]=await n(t[s])}});return await Promise.all(i),r}a(yc,"mapWithConcurrency");var hS=3600*1e3,yS=300*1e3,wS=1e3,Ip=15e3;function bS(t){if(!t||typeof t!="object")return[];let e=t,n=e.result,r=n&&typeof n=="object"?n.result:void 0,o=e.data&&typeof e.data=="object"?e.data.result:void 0;return(Array.isArray(n)?n:Array.isArray(r)?r:Array.isArray(o)?o:[]).filter(s=>!!s&&typeof s=="object")}a(bS,"contactCandidates");function kS(t,e){return async(n,r)=>{let o=r?.trim(),i=["contact","user","search","--query",n];o&&i.push("--profile",o),i.push("--format","json");let s=await ne(e,i,{timeoutMs:Ip,runner:t});if(s.exitCode!==0)throw new Error(`dws contact user search \u5931\u8D25(exit ${s.exitCode}): ${s.stderr.slice(0,200)}`);return s.stdout.trim()?JSON.parse(s.stdout):{}}}a(kS,"createDwsContactSearch");function mi(t={}){let e=t.now??Date.now,n=t.positiveTtlMs??hS,r=t.negativeTtlMs??yS,o=Math.max(1,Math.floor(t.maxCacheEntries??wS)),i=t.searchContacts??kS(t.runner??J,t.dwsBin??"dws"),s=new Map,c=a(u=>{for(let[f,p]of s)p.expiresAt<=u&&s.delete(f)},"pruneExpired"),l=a((u,f)=>{c(f);let p=s.get(u);if(p)return s.delete(u),s.set(u,p),p},"readCache"),d=a((u,f,p)=>{for(c(p),s.delete(u);s.size>=o;){let g=s.keys().next().value;if(g===void 0)break;s.delete(g)}s.set(u,f)},"writeCache");return async(u,f,p)=>{let g=u.trim();if(!g)return;if(/^\d+$/.test(g))return g;let m=f.trim();if(!m)return;let y=p?.trim()??"",w=`${y}\0${g}\0${m}`,b=e(),x=l(w,b);if(x)return x.userId;try{let I=[...new Set(bS(await i(m,y||void 0)).filter(k=>k.openDingTalkId?.trim()===g).map(k=>k.userId?.trim()??"").filter(Boolean))],S=I.length===1?I[0]:void 0;return d(w,{...S?{userId:S}:{},expiresAt:b+(S?n:r)},b),S}catch{d(w,{expiresAt:b+r},b);return}}}a(mi,"createDingTalkAtUserIdResolver");var vS=mi();function Rp(t,e,n,r){let o=typeof n=="string"&&n.trim()||void 0,i=typeof n=="function"?n:r;return i?mi({searchContacts:i})(t,e,o):vS(t,e,o)}a(Rp,"resolveDingTalkAtUserId");async function NW(t,e={}){let n=e.concurrency??5,r=e.log??(()=>{}),o=e.runner??J,i=e.dwsBin??"dws",s=e.timeoutMs??Ip,c=[],l=await yc(t,n,async u=>{try{let f=await ne(i,["contact","user","get","--ids",u,"--format","json"],{timeoutMs:s,runner:o});if(f.exitCode!==0)throw new Error(`exit ${f.exitCode}: ${f.stderr.slice(0,200)}`);let g=(f.stdout.trim()?JSON.parse(f.stdout):{}).result?.[0]?.orgEmployeeModel?.orgUserName;if(!g)throw new Error("\u672A\u67E5\u8BE2\u5230\u7EC4\u7EC7\u5185\u59D3\u540D");let m=await ne(i,["contact","user","search","--query",g,"--format","json"],{timeoutMs:s,runner:o});if(m.exitCode!==0)throw new Error(`search exit ${m.exitCode}: ${m.stderr.slice(0,200)}`);let w=((m.stdout.trim()?JSON.parse(m.stdout):{}).result??[]).find(b=>b.userId===u);if(w?.openDingTalkId&&w?.nick)return{userId:u,nick:w.nick,openDingTalkId:w.openDingTalkId};throw new Error("\u672A\u67E5\u8BE2\u5230\u5339\u914D\u7684 openDingTalkId/nick")}catch(f){let p=`${u}: ${f instanceof Error?f.message:String(f)}`;return c.push(p),r(`contact \u89E3\u6790\u5931\u8D25 ${p}`),null}}),d=new Map;for(let u of l)u&&d.set(u.userId,u);return{contacts:d,errors:c}}a(NW,"resolveContactsByUserIds");var SS="#007fff";function wc(t){return`<font color="${SS}">@${t}</font>`}a(wc,"formatDingTalkAtPlaceholder");function Cp(t,e){let n=t,r=[];for(let i of e)if(!n.includes(wc(i))){if(n.includes(`@${i}`)){n=n.split(`@${i}`).join(wc(i));continue}r.push(i)}return r.length===0?n:`${r.map(wc).join(" ")} ${n}`}a(Cp,"prependDingTalkAtPlaceholders");var xS="https://api.dingtalk.com",IS=300*1e3,RS=15e3,Tp=6,Et=class{static{a(this,"DingTalkRobotClient")}appKey;appSecret;openApiBase;timeoutMs;fetchImpl;tokenCache=null;tokenInflight=null;constructor(e){if(!e.appKey||!e.appSecret)throw new Error("DingTalkRobotClient \u9700\u8981 appKey/appSecret");this.appKey=e.appKey,this.appSecret=e.appSecret,this.openApiBase=(e.endpoint||xS).replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??RS,this.fetchImpl=e.fetchImpl??globalThis.fetch}async getAccessToken(){let e=Date.now();return this.tokenCache&&e<this.tokenCache.expireAt-IS?this.tokenCache.value:this.tokenInflight?this.tokenInflight:(this.tokenInflight=this.fetchAccessToken().then(n=>(this.tokenCache=n,n.value)).finally(()=>{this.tokenInflight=null}),this.tokenInflight)}async fetchAccessToken(){let e=`${this.openApiBase}/v1.0/oauth2/accessToken`,n=await this.fetchImpl(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appKey:this.appKey,appSecret:this.appSecret}),signal:AbortSignal.timeout(this.timeoutMs)}),r=await n.text().catch(()=>""),o;try{o=r?JSON.parse(r):{}}catch{throw new Error(`\u6362\u53D6 access_token \u5931\u8D25 HTTP ${n.status}: \u54CD\u5E94\u975E JSON: ${r.slice(0,200)}`)}if(!n.ok||!o.accessToken)throw new Error(`\u6362\u53D6 access_token \u5931\u8D25 HTTP ${n.status}: ${r.slice(0,200)}`);let i=(o.expireIn??7200)*1e3;return h.debug("dingtalk-robot-client","access_token refreshed",{expireIn:o.expireIn}),{value:o.accessToken,expireAt:Date.now()+i}}async replyViaSessionWebhook(e,n,r){if(!e)throw new Error("replyViaSessionWebhook \u7F3A\u5C11 sessionWebhook");if(typeof r?.expiredTime=="number"&&Date.now()>r.expiredTime)throw new Error("sessionWebhook \u5DF2\u8FC7\u671F\uFF0C\u8BF7\u964D\u7EA7\u4E3A robot API \u4E3B\u52A8\u63A8\u9001");let o=(r?.atUserStaffIds??[]).map(hi).filter(Boolean),i=o.length>0?CS(n,o):n,s={msgtype:"markdown",markdown:{title:r?.title??TS(n),text:i},at:{isAtAll:r?.atAll??!1,...o.length>0?{atUserIds:o}:{}}};await this.postJson(e,s,void 0,"sessionWebhook")}async sendGroupMarkdown(e,n,r,o){if(!e||!n)throw new Error("sendGroupMarkdown \u7F3A\u5C11 robotCode/openConversationId");let i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:"sampleMarkdown",msgParam:JSON.stringify({title:r,text:o})};await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi")}async sendGroupText(e,n,r){if(!e||!n)throw new Error("sendGroupText \u7F3A\u5C11 robotCode/openConversationId");let o=await this.getAccessToken(),i=`${this.openApiBase}/v1.0/robot/groupMessages/send`,s={robotCode:e,openConversationId:n,msgKey:"sampleText",msgParam:JSON.stringify({content:r})};await this.postJson(i,s,{"x-acs-dingtalk-access-token":o},"robotApi")}async sendGroupActionCard(e,n,r){if(!e||!n)throw new Error("sendGroupActionCard \u7F3A\u5C11 robotCode/openConversationId");let o=_p(r,"sendGroupActionCard"),i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:o.msgKey,msgParam:o.msgParam},l=await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi.actionCard");return l.processQueryKey?{processQueryKey:l.processQueryKey}:{}}async sendActionCardToUsers(e,n,r){if(!e)throw new Error("sendActionCardToUsers \u7F3A\u5C11 robotCode");if(!Array.isArray(n)||n.length===0)throw new Error("sendActionCardToUsers \u7684 userIds \u4E0D\u80FD\u4E3A\u7A7A");let o=n.map(u=>String(u??"").trim());if(o.some(u=>!u))throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u7A7A\u503C");if(new Set(o).size!==o.length)throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u91CD\u590D\u9879");let i=_p(r,"sendActionCardToUsers"),s=await this.getAccessToken(),c=`${this.openApiBase}/v1.0/robot/oToMessages/batchSend`,l={robotCode:e,userIds:o,msgKey:i.msgKey,msgParam:i.msgParam},d=await this.postJson(c,l,{"x-acs-dingtalk-access-token":s},"robotApi.userActionCard");return d.processQueryKey?{processQueryKey:d.processQueryKey}:{}}async replyEmotion(e){await this.sendEmotion("reply",e)}async recallEmotion(e){await this.sendEmotion("recall",e)}async sendEmotion(e,n){if(!n.robotCode||!n.openMsgId||!n.openConversationId||!n.emotionName)throw new Error(`sendEmotion(${e}) \u7F3A\u5C11 robotCode/openMsgId/openConversationId/emotionName`);let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/emotion/${e}`,i={...n,emotionType:1};await this.postJson(o,i,{"x-acs-dingtalk-access-token":r},`emotion.${e}`,!0)}async downloadMessageFile(e,n){if(!e||!n)throw new Error("downloadMessageFile \u7F3A\u5C11 robotCode/downloadCode");let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/messageFiles/download`,i;try{i=await this.fetchImpl(o,{method:"POST",headers:{"Content-Type":"application/json","x-acs-dingtalk-access-token":r},body:JSON.stringify({downloadCode:n,robotCode:e}),signal:AbortSignal.timeout(this.timeoutMs)})}catch(l){let d=l instanceof Error?l.message:String(l);throw h.error("dingtalk-robot-client","\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u8BF7\u6C42\u5931\u8D25",{error:d}),new Error(`\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u8BF7\u6C42\u5931\u8D25: ${d}`)}let s=await i.text().catch(()=>""),c;try{c=s?JSON.parse(s):{}}catch{throw new Error(`\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u5931\u8D25 HTTP ${i.status}: \u54CD\u5E94\u975E JSON: ${s.slice(0,200)}`)}if(!i.ok||!c.downloadUrl)throw h.error("dingtalk-robot-client","\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u5931\u8D25",{status:i.status,errmsg:c.errmsg}),new Error(`\u4E0B\u8F7D\u6D88\u606F\u6587\u4EF6\u5931\u8D25 HTTP ${i.status}: ${c.errmsg??(s.slice(0,200)||"\u65E0 downloadUrl")}`);return c.downloadUrl}async postJson(e,n,r,o,i=!1){let s;try{s=await this.fetchImpl(e,{method:"POST",headers:{"Content-Type":"application/json",...r??{}},body:JSON.stringify(n),signal:AbortSignal.timeout(this.timeoutMs)})}catch(d){let u=d instanceof Error?d.message:String(d);throw h.error("dingtalk-robot-client","\u8BF7\u6C42\u5931\u8D25",{channel:o,error:u}),new Error(`\u9489\u9489\u51FA\u7AD9\u8BF7\u6C42\u5931\u8D25 (${o}): ${u}`)}let c=await s.text().catch(()=>""),l;try{if(i&&!c)throw new Error("empty response");l=c?JSON.parse(c):{}}catch{if(!s.ok)throw new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) HTTP ${s.status}: ${c.slice(0,200)}`);if(i)throw new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}): \u54CD\u5E94\u975E JSON: ${c.slice(0,200)}`);l={}}if(!s.ok)throw h.error("dingtalk-robot-client","HTTP \u975E 2xx",{channel:o,status:s.status,errmsg:l.errmsg}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) HTTP ${s.status}: ${l.errmsg??c.slice(0,200)}`);if(typeof l.errcode=="number"&&l.errcode!==0)throw h.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,errcode:l.errcode,errmsg:l.errmsg}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) errcode=${l.errcode}: ${l.errmsg??""}`);if(l.success===!1)throw h.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}): ${l.message??c.slice(0,200)}`);if(typeof l.code=="string"&&l.code&&l.code!=="0")throw h.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,code:l.code,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) code=${l.code}: ${l.message??""}`);return h.debug("dingtalk-robot-client","sent",{channel:o}),l}};function _p(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length<1||t.buttons.length>5)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u5305\u542B 1\uFF5E5 \u4E2A\u6309\u94AE`);for(let[i,s]of t.buttons.entries())if(!s?.title?.trim()||!s.url?.trim())throw new Error(`${e} \u7684\u7B2C ${i+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`);let n=t.buttons.length,r=t.orientation??(n===2?"horizontal":"vertical");if(r==="horizontal"&&n!==2)throw new Error(`${e} \u4EC5\u53CC\u6309\u94AE\u652F\u6301 horizontal \u6392\u5217`);if(n===1){let[i]=t.buttons;return{msgKey:"sampleActionCard",msgParam:JSON.stringify({title:t.title,text:t.text,singleTitle:i.title,singleURL:i.url})}}if(n===2&&r==="horizontal"){let[i,s]=t.buttons;return{msgKey:"sampleActionCard6",msgParam:JSON.stringify({title:t.title,text:t.text,buttonTitle1:i.title,buttonUrl1:i.url,buttonTitle2:s.title,buttonUrl2:s.url})}}let o={title:t.title,text:t.text};return t.buttons.forEach((i,s)=>{o[`actionTitle${s+1}`]=i.title,o[`actionURL${s+1}`]=i.url}),{msgKey:`sampleActionCard${n}`,msgParam:JSON.stringify(o)}}a(_p,"buildActionCardMessage");function hi(t){let e=String(t??"").trim();return e&&(e.length<Tp?e.padStart(Tp,"0"):e)}a(hi,"padStaffId");function CS(t,e){let n=e.filter(o=>!t.includes(`@${o}`));return n.length===0?t:`${n.map(o=>`@${o}`).join(" ")} ${t}`}a(CS,"prependAtPlaceholders");function TS(t){let e=t.match(/^\s*[【[]([^】\]]{1,20})[】\]]/);return e?.[1]?e[1].trim():(t.split(/\r?\n/).find(o=>o.trim().length>0)??"").replace(/[#*_`>~-]/g,"").trim().slice(0,20).trim()||"\u673A\u5668\u4EBA\u6D88\u606F"}a(TS,"deriveTitle");var _S="1",yi=class{static{a(this,"DingTalkSender")}robotClient;robotCode;registry;constructor(e={},n={}){n.robotClient?this.robotClient=n.robotClient:e.robot?.appKey&&e.robot?.appSecret&&(this.robotClient=new Et({appKey:e.robot.appKey,appSecret:e.robot.appSecret,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})),this.robotCode=e.robotCode??e.robot?.appKey,this.registry=n.registry??Rn}get canReplyInSession(){return!!this.robotClient}async replyToConversation(e,n,r={}){let o=r.entry??this.registry.lookup(e),i=o?.conversationType===_S,s=i||r.mentionSender===!1?"":typeof r.mentionSender=="string"?r.mentionSender.trim():String(o?.senderStaffId??"").trim(),c=i?[]:[...new Set([s,...(r.mentionUserIds??[]).map(u=>u.trim())].filter(Boolean))],l=c.length>0?{atUserIds:c}:{};if(!r.preferWebhook&&this.robotClient&&o?.sessionWebhook)try{return await this.robotClient.replyViaSessionWebhook(o.sessionWebhook,n,{...c.length>0?{atUserStaffIds:c}:{},...typeof o.sessionWebhookExpiredTime=="number"?{expiredTime:o.sessionWebhookExpiredTime}:{},...r.title?{title:r.title}:{}}),{via:"session",...l}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`session \u5931\u8D25: ${f}${g}`}}if(!r.preferWebhook&&this.robotClient&&this.robotCode&&!o?.sessionWebhook)try{let f=(r.senderName?`${r.senderName}
270
270
 
271
- `:"")+n,p=r.title??f.slice(0,20).replace(/\n/g," ");return await this.robotClient.sendGroupMarkdown(this.robotCode,e,p,f),{via:"robotApi"}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`robotApi \u5931\u8D25: ${f}${g}`}}let d=await this.tryWebhook(n,c,r);return d||{via:"skipped",reason:"\u65E0\u53EF\u7528 sessionWebhook\uFF08\u672A\u914D\u673A\u5668\u4EBA\u6216\u767B\u8BB0\u8868\u672A\u547D\u4E2D\uFF09\uFF0C\u4E14\u672A\u63D0\u4F9B webhookFallback"}}async tryWebhook(e,n,r){if(r.webhookFallback)try{let o=n.map(i=>hi(i)).filter(Boolean);return await r.webhookFallback(e,{...r.title?{title:r.title}:{},...o.length>0?{atUserIds:o}:{}}),{via:"webhook",...n.length>0?{atUserIds:n}:{}}}catch(o){return{via:"skipped",reason:`webhook \u964D\u7EA7\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`}}}};var bc=class{static{a(this,"DingTalkRobotClientPool")}entries=new Map;get(e,n,r){let o=this.entries.get(e);if(o&&o.clientId===n.clientId&&o.clientSecret===n.clientSecret&&o.fetchImpl===r)return o.client;let i=new Et({appKey:n.clientId,appSecret:n.clientSecret,fetchImpl:r});return this.entries.set(e,{...n,fetchImpl:r,client:i}),i}clear(){this.entries.clear()}},Ap=new bc;var kc=["\u601D\u8003","\u4E13\u6CE8","\u7B49\u4E00\u7B49"],vc=class{static{a(this,"DingTalkEmotionFeedbackCoordinator")}states=new Map;begin(e,n){let r=qe(e);if(!r||this.states.get(r.openMsgId))return;let i={robotCode:r.robotCode,openMsgId:r.openMsgId,openConversationId:r.conversationId,emotionName:AS()},s={context:r,emotionContext:i,client:n,delivered:!1,addPromise:Promise.resolve().then(()=>n.replyEmotion(i)).then(()=>(h.debug("dingtalk-emotion-feedback","processing emotion added",{messageId:wi(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName}),!0)).catch(c=>(h.warn("dingtalk-emotion-feedback","add processing emotion failed; workflow continues",{messageId:wi(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName,error:c instanceof Error?c.message:String(c)}),!1))};this.states.set(r.openMsgId,s)}markDelivered(e,n){let r=qe(e);if(!r||n!==r.conversationId)return;let o=this.states.get(r.openMsgId);!o||!Ep(o.context,r)||o.finalizePromise||(o.delivered=!0)}finalize(e,n){let r=qe(e);if(!r)return Promise.resolve();let o=this.states.get(r.openMsgId);return!o||!Ep(o.context,r)?Promise.resolve():this.finalizeState(o,n)}clear(){this.states.clear()}size(){return this.states.size}finalizeState(e,n){if(e.finalizePromise)return e.finalizePromise;let r=e.delivered&&n.completed&&n.recorded;return e.finalizePromise=(async()=>{if(await e.addPromise&&!r)try{await e.client.recallEmotion(e.emotionContext),h.debug("dingtalk-emotion-feedback","processing emotion recalled",{messageId:wi(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName})}catch(i){h.warn("dingtalk-emotion-feedback","recall processing emotion failed; workflow unaffected",{messageId:wi(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName,error:i instanceof Error?i.message:String(i)})}})().finally(()=>{this.states.get(e.context.openMsgId)===e&&this.states.delete(e.context.openMsgId)}),e.finalizePromise}};function Ep(t,e){return t.openMsgId===e.openMsgId&&t.conversationId===e.conversationId&&t.robotCode===e.robotCode&&t.credRef===e.credRef}a(Ep,"sameContext");function wi(t){return t.length<=8?"***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}a(wi,"maskMessageId");function AS(){let t=Math.floor(Math.random()*kc.length);return kc[t]??kc[0]}a(AS,"pickProcessingEmotion");var bi=new vc;var DS=15e3;function $S(t){let e=t.runner??J,n=t.dwsBin,r=t.timeoutMs,o=t.fetchImpl??globalThis.fetch,i=t.emotionFeedbackCoordinator??bi,s=t.robotClientPool??Ap,c=t.atUserIdResolver??Rp;function l(p,g,m){p.length>=2e3&&h.warn("messaging","\u6587\u672C\u8D85\u957F\uFF0C\u53EF\u80FD\u88AB\u9489\u9489\u9759\u9ED8\u4E22\u5F03",{channel:g,targetId:m,contentLen:p.length})}a(l,"warnIfContentTooLong");async function d(p){let g=Date.now(),m=p.slice(0,3).join(" ");h.debug("messaging","dws call",{cmd:m});let y=await ne(n,p,{timeoutMs:r,runner:e}),w=Date.now()-g;if(y.exitCode!==0)throw h.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:m,exitCode:y.exitCode,stderr:y.stderr.slice(0,300),elapsed:w}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (exit ${y.exitCode}): ${y.stderr.slice(0,200)}`);let b=MS(y.stdout);if(b)throw h.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:m,code:b.code,desc:b.desc,elapsed:w}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (${b.code}): ${b.desc}`);h.debug("messaging","dws call completed",{cmd:m,elapsed:w})}a(d,"runDws");let u=new yi({...t.robot?{robot:t.robot}:{},...t.robotCode?{robotCode:t.robotCode}:{},...t.fetchImpl?{fetchImpl:t.fetchImpl}:{}}),f={async sendToUser(p,g){h.info("messaging","sendToUser",{userId:p,contentLen:g.length}),l(g,"user",p),await d(["chat","message","send","--user",p,"--title",Sc(g),"--text",g,"-y"])},async sendToGroup(p,g){h.info("messaging","sendToGroup",{groupId:p,contentLen:g.length}),l(g,"group",p),await d(["chat","message","send","--group",p,"--title",Sc(g),"--text",g,"-y"])},async sendCard(p,g){let m=OS(g);p.type==="user"?await this.sendToUser(p.id,m):await this.sendToGroup(p.id,m)},async sendDingTalkActionCardToGroup(p,g,m){let y=qe(t.eventContext),w=y?.conversationId===p?y:void 0,x=m?.credRef?.trim()||w?.credRef;if(!x)throw new Error("sendDingTalkActionCardToGroup \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF1A\u4E3B\u52A8\u6216\u8DE8\u7FA4\u53D1\u9001\u5FC5\u987B\u63D0\u4F9B options.credRef");let I=t.robots?.[x];if(!I?.client_id||!I.client_secret)throw new Error(`sendDingTalkActionCardToGroup \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${x}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let k=await s.get(x,{clientId:I.client_id,clientSecret:I.client_secret},o).sendGroupActionCard(I.client_id,p,g);return i.markDelivered(t.eventContext,p),h.info("messaging","sendDingTalkActionCardToGroup",{conversationId:p,credRef:x,hasProcessQueryKey:!!k.processQueryKey}),k},async sendDingTalkActionCardToUsers(p,g,m){let y=m?.credRef?.trim();if(!y)throw new Error("sendDingTalkActionCardToUsers \u5FC5\u987B\u63D0\u4F9B options.credRef");let w=t.robots?.[y];if(!w?.client_id||!w.client_secret)throw new Error(`sendDingTalkActionCardToUsers \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${y}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let x=await s.get(y,{clientId:w.client_id,clientSecret:w.client_secret},o).sendActionCardToUsers(w.client_id,p,g);return h.info("messaging","sendDingTalkActionCardToUsers",{credRef:y,userCount:p.length,hasProcessQueryKey:!!x.processQueryKey}),x},async sendDingTalkActionCardByWebhook(p,g){let m=p?.trim();if(!m)throw new Error("sendDingTalkActionCardByWebhook \u7F3A\u5C11 credRef");let y=t.webhookCreds?.[m];if(!y?.url){let I=Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0";throw new Error(`sendDingTalkActionCardByWebhook \u7684 Webhook \u51ED\u636E credRef="${m}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574\uFF08\u53EF\u7528: ${I}\uFF09`)}PS(g,"sendDingTalkActionCardByWebhook");let w=Dp(y.url);h.info("messaging","sendDingTalkActionCardByWebhook",{credRef:m,host:w,signed:!!y.secret});let b={msgtype:"actionCard",actionCard:{title:g.title,text:g.text,btnOrientation:"1",btns:g.buttons.map(I=>({title:I.title,actionURL:I.url}))}},x=y.secret?$p(y.url,y.secret):y.url;await Pp(o,x,b,r,w)},async reply(p){h.warn("messaging","reply called without target context",{contentLen:p.length})},async replyToConversation(p,g,m){let y=m?.credRef?.trim(),w=y?t.webhookCreds?.[y]:void 0,b=y?!w&&!t.robots?.[y]:!1,x=b?`credRef="${y}" \u672A\u547D\u4E2D\u547D\u540D\u96C6(\u53EF\u7528: ${Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0"})`:void 0,I=m?.webhook??w,v=I?.url?(T,_)=>f.sendToGroupByWebhook({url:I.url,...I.secret?{secret:I.secret}:{}},T,_):void 0,k=m?.mentionSender;if(m?.preferWebhook&&m.mentionSender!==!1&&typeof m.mentionSender!="string"){let T=Pr(t.eventContext);if(T?.conversationId===p&&T.corpId)try{k=await c(T.senderOpenDingTalkId,T.senderName,T.corpId)}catch(_){h.warn("messaging","Webhook @\u4EBA\u8EAB\u4EFD\u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u4E0D @ \u4EBA",{conversationId:p,error:_ instanceof Error?_.message:String(_)})}else T?.conversationId===p&&h.warn("messaging","Webhook \u7FA4\u672A\u914D\u7F6E corpId\uFF0C\u8DF3\u8FC7 @\u63D0\u95EE\u8005",{conversationId:p});(typeof k!="string"||!k.trim())&&(k=!1)}let R=await u.replyToConversation(p,g,{...k!==void 0?{mentionSender:k}:{},...m?.mentionUserIds?.length?{mentionUserIds:m.mentionUserIds}:{},...m?.senderName?{senderName:m.senderName}:{},...m?.title?{title:m.title}:{},...m?.preferWebhook?{preferWebhook:m.preferWebhook}:{},...v?{webhookFallback:v}:{}});return x&&(R.reason=R.reason?`${R.reason}; ${x}`:x),R.via==="session"||R.via==="robotApi"||R.via==="webhook"?i.markDelivered(t.eventContext,p):b&&(R.configError=!0),h.info("messaging","replyToConversation",{conversationId:p,via:R.via,atUserIds:R.atUserIds,reason:R.reason}),R},async replyToConversationWithButtons(p,g,m){try{let y=qe(t.eventContext),b=m?.credRef?.trim()||y?.credRef;if(!b)return{via:"skipped",reason:"replyToConversationWithButtons \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF08\u65E0 credRef\uFF09"};let x=t.robots?.[b];if(!x?.client_id||!x.client_secret)return{via:"skipped",reason:`replyToConversationWithButtons credRef="${b}" \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u636E`,configError:!0};let I=Rn.lookup(p),v=I?.conversationType,k=m?.senderStaffId?.trim()||I?.senderStaffId,R={title:g.title,text:g.text,buttons:g.buttons};return v==="1"?k?(await f.sendDingTalkActionCardToUsers([k],R,{credRef:b}),i.markDelivered(t.eventContext,p),{via:"session"}):{via:"skipped",reason:"\u5355\u804A ActionCard \u9700\u8981 senderStaffId \u4F46\u672A\u53D6\u5230"}:(await f.sendDingTalkActionCardToGroup(p,R,{credRef:b}),i.markDelivered(t.eventContext,p),{via:"session"})}catch(y){let w=y instanceof Error?y.message:String(y);return h.warn("messaging","replyToConversationWithButtons \u5931\u8D25",{conversationId:p,reason:w}),{via:"skipped",reason:w}}},beginDingTalkProcessingFeedback(p){let g=qe(p);if(!g)return;let m=t.robots?.[g.credRef];if(!m?.client_id||!m.client_secret){h.warn("messaging","skip processing emotion: credRef \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u8BC1",{credRef:g.credRef,available:Object.keys(t.robots??{})});return}let y=s.get(g.credRef,{clientId:m.client_id,clientSecret:m.client_secret},o);i.begin(p,y)},async sendToGroupByWebhook(p,g,m){let y=p?.url,w=p?.secret;if(!y)throw new Error("sendToGroupByWebhook \u7F3A\u5C11 url");let b=Dp(y);h.info("messaging","sendToGroupByWebhook",{host:b,contentLen:g.length,signed:!!w});let x=m?.title??Sc(g),I=[...m?.atUserIds??[],...m?.atMobiles??[]],v=I.length>0?Cp(g,I):g,k={msgtype:"markdown",markdown:{title:x,text:v},at:{isAtAll:m?.atAll??!1,...m?.atUserIds?.length?{atUserIds:m.atUserIds}:{},...m?.atMobiles?.length?{atMobiles:m.atMobiles}:{}}},R=w?$p(y,w):y;await Pp(o,R,k,r,b)}};return f}a($S,"createMessagingToolkitFromConfig");function PS(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length!==2)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u6070\u597D\u5305\u542B\u4E24\u4E2A\u6309\u94AE`);for(let[n,r]of t.buttons.entries())if(!r?.title?.trim()||!r.url?.trim())throw new Error(`${e} \u7684\u7B2C ${n+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`)}a(PS,"validateDingTalkActionCard");function Dp(t){try{return new URL(t).host}catch{return"webhook"}}a(Dp,"safeHost");function $p(t,e){let n=Date.now(),r=`${n}
271
+ `:"")+n,p=r.title??f.slice(0,20).replace(/\n/g," ");return await this.robotClient.sendGroupMarkdown(this.robotCode,e,p,f),{via:"robotApi"}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`robotApi \u5931\u8D25: ${f}${g}`}}let d=await this.tryWebhook(n,c,r);return d||{via:"skipped",reason:"\u65E0\u53EF\u7528 sessionWebhook\uFF08\u672A\u914D\u673A\u5668\u4EBA\u6216\u767B\u8BB0\u8868\u672A\u547D\u4E2D\uFF09\uFF0C\u4E14\u672A\u63D0\u4F9B webhookFallback"}}async tryWebhook(e,n,r){if(r.webhookFallback)try{let o=n.map(i=>hi(i)).filter(Boolean);return await r.webhookFallback(e,{...r.title?{title:r.title}:{},...o.length>0?{atUserIds:o}:{}}),{via:"webhook",...n.length>0?{atUserIds:n}:{}}}catch(o){return{via:"skipped",reason:`webhook \u964D\u7EA7\u5931\u8D25: ${o instanceof Error?o.message:String(o)}`}}}};var bc=class{static{a(this,"DingTalkRobotClientPool")}entries=new Map;get(e,n,r){let o=this.entries.get(e);if(o&&o.clientId===n.clientId&&o.clientSecret===n.clientSecret&&o.fetchImpl===r)return o.client;let i=new Et({appKey:n.clientId,appSecret:n.clientSecret,fetchImpl:r});return this.entries.set(e,{...n,fetchImpl:r,client:i}),i}clear(){this.entries.clear()}},Ap=new bc;var kc=["\u601D\u8003","\u4E13\u6CE8","\u7B49\u4E00\u7B49"],vc=class{static{a(this,"DingTalkEmotionFeedbackCoordinator")}states=new Map;begin(e,n){let r=qe(e);if(!r||this.states.get(r.openMsgId))return;let i={robotCode:r.robotCode,openMsgId:r.openMsgId,openConversationId:r.conversationId,emotionName:AS()},s={context:r,emotionContext:i,client:n,delivered:!1,addPromise:Promise.resolve().then(()=>n.replyEmotion(i)).then(()=>(h.debug("dingtalk-emotion-feedback","processing emotion added",{messageId:wi(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName}),!0)).catch(c=>(h.warn("dingtalk-emotion-feedback","add processing emotion failed; workflow continues",{messageId:wi(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName,error:c instanceof Error?c.message:String(c)}),!1))};this.states.set(r.openMsgId,s)}markDelivered(e,n){let r=qe(e);if(!r||n!==r.conversationId)return;let o=this.states.get(r.openMsgId);!o||!Ep(o.context,r)||o.finalizePromise||(o.delivered=!0)}finalize(e,n){let r=qe(e);if(!r)return Promise.resolve();let o=this.states.get(r.openMsgId);return!o||!Ep(o.context,r)?Promise.resolve():this.finalizeState(o,n)}clear(){this.states.clear()}size(){return this.states.size}finalizeState(e,n){if(e.finalizePromise)return e.finalizePromise;let r=e.delivered&&n.completed&&n.recorded;return e.finalizePromise=(async()=>{if(await e.addPromise&&!r)try{await e.client.recallEmotion(e.emotionContext),h.debug("dingtalk-emotion-feedback","processing emotion recalled",{messageId:wi(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName})}catch(i){h.warn("dingtalk-emotion-feedback","recall processing emotion failed; workflow unaffected",{messageId:wi(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName,error:i instanceof Error?i.message:String(i)})}})().finally(()=>{this.states.get(e.context.openMsgId)===e&&this.states.delete(e.context.openMsgId)}),e.finalizePromise}};function Ep(t,e){return t.openMsgId===e.openMsgId&&t.conversationId===e.conversationId&&t.robotCode===e.robotCode&&t.credRef===e.credRef}a(Ep,"sameContext");function wi(t){return t.length<=8?"***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}a(wi,"maskMessageId");function AS(){let t=Math.floor(Math.random()*kc.length);return kc[t]??kc[0]}a(AS,"pickProcessingEmotion");var bi=new vc;var DS=15e3;function $S(t){let e=t.runner??J,n=t.dwsBin,r=t.timeoutMs,o=t.fetchImpl??globalThis.fetch,i=t.emotionFeedbackCoordinator??bi,s=t.robotClientPool??Ap,c=t.atUserIdResolver??Rp;function l(p,g,m){p.length>=2e3&&h.warn("messaging","\u6587\u672C\u8D85\u957F\uFF0C\u53EF\u80FD\u88AB\u9489\u9489\u9759\u9ED8\u4E22\u5F03",{channel:g,targetId:m,contentLen:p.length})}a(l,"warnIfContentTooLong");async function d(p){let g=Date.now(),m=p.slice(0,3).join(" ");h.debug("messaging","dws call",{cmd:m});let y=await ne(n,p,{timeoutMs:r,runner:e}),w=Date.now()-g;if(y.exitCode!==0)throw h.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:m,exitCode:y.exitCode,stderr:y.stderr.slice(0,300),elapsed:w}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (exit ${y.exitCode}): ${y.stderr.slice(0,200)}`);let b=MS(y.stdout);if(b)throw h.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:m,code:b.code,desc:b.desc,elapsed:w}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (${b.code}): ${b.desc}`);h.debug("messaging","dws call completed",{cmd:m,elapsed:w})}a(d,"runDws");let u=new yi({...t.robot?{robot:t.robot}:{},...t.robotCode?{robotCode:t.robotCode}:{},...t.fetchImpl?{fetchImpl:t.fetchImpl}:{}}),f={async sendToUser(p,g){h.info("messaging","sendToUser",{userId:p,contentLen:g.length}),l(g,"user",p),await d(["chat","message","send","--user",p,"--title",Sc(g),"--text",g,"-y"])},async sendToGroup(p,g){h.info("messaging","sendToGroup",{groupId:p,contentLen:g.length}),l(g,"group",p),await d(["chat","message","send","--group",p,"--title",Sc(g),"--text",g,"-y"])},async sendCard(p,g){let m=OS(g);p.type==="user"?await this.sendToUser(p.id,m):await this.sendToGroup(p.id,m)},async sendDingTalkActionCardToGroup(p,g,m){let y=qe(t.eventContext),w=y?.conversationId===p?y:void 0,x=m?.credRef?.trim()||w?.credRef;if(!x)throw new Error("sendDingTalkActionCardToGroup \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF1A\u4E3B\u52A8\u6216\u8DE8\u7FA4\u53D1\u9001\u5FC5\u987B\u63D0\u4F9B options.credRef");let I=t.robots?.[x];if(!I?.client_id||!I.client_secret)throw new Error(`sendDingTalkActionCardToGroup \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${x}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let k=await s.get(x,{clientId:I.client_id,clientSecret:I.client_secret},o).sendGroupActionCard(I.client_id,p,g);return i.markDelivered(t.eventContext,p),h.info("messaging","sendDingTalkActionCardToGroup",{conversationId:p,credRef:x,hasProcessQueryKey:!!k.processQueryKey}),k},async sendDingTalkActionCardToUsers(p,g,m){let y=m?.credRef?.trim();if(!y)throw new Error("sendDingTalkActionCardToUsers \u5FC5\u987B\u63D0\u4F9B options.credRef");let w=t.robots?.[y];if(!w?.client_id||!w.client_secret)throw new Error(`sendDingTalkActionCardToUsers \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${y}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let x=await s.get(y,{clientId:w.client_id,clientSecret:w.client_secret},o).sendActionCardToUsers(w.client_id,p,g);return h.info("messaging","sendDingTalkActionCardToUsers",{credRef:y,userCount:p.length,hasProcessQueryKey:!!x.processQueryKey}),x},async sendDingTalkActionCardByWebhook(p,g){let m=p?.trim();if(!m)throw new Error("sendDingTalkActionCardByWebhook \u7F3A\u5C11 credRef");let y=t.webhookCreds?.[m];if(!y?.url){let I=Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0";throw new Error(`sendDingTalkActionCardByWebhook \u7684 Webhook \u51ED\u636E credRef="${m}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574\uFF08\u53EF\u7528: ${I}\uFF09`)}PS(g,"sendDingTalkActionCardByWebhook");let w=Dp(y.url);h.info("messaging","sendDingTalkActionCardByWebhook",{credRef:m,host:w,signed:!!y.secret});let b={msgtype:"actionCard",actionCard:{title:g.title,text:g.text,btnOrientation:"1",btns:g.buttons.map(I=>({title:I.title,actionURL:I.url}))}},x=y.secret?$p(y.url,y.secret):y.url;await Pp(o,x,b,r,w)},async reply(p){h.warn("messaging","reply called without target context",{contentLen:p.length})},async replyToConversation(p,g,m){let y=m?.credRef?.trim(),w=y?t.webhookCreds?.[y]:void 0,b=y?!w&&!t.robots?.[y]:!1,x=b?`credRef="${y}" \u672A\u547D\u4E2D\u547D\u540D\u96C6(\u53EF\u7528: ${Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0"})`:void 0,I=m?.webhook??w,S=I?.url?(T,_)=>f.sendToGroupByWebhook({url:I.url,...I.secret?{secret:I.secret}:{}},T,_):void 0,k=m?.mentionSender;if(m?.preferWebhook&&m.mentionSender!==!1&&typeof m.mentionSender!="string"){let T=Pr(t.eventContext);if(T?.conversationId===p&&T.corpId)try{k=await c(T.senderOpenDingTalkId,T.senderName,T.corpId)}catch(_){h.warn("messaging","Webhook @\u4EBA\u8EAB\u4EFD\u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u4E0D @ \u4EBA",{conversationId:p,error:_ instanceof Error?_.message:String(_)})}else T?.conversationId===p&&h.warn("messaging","Webhook \u7FA4\u672A\u914D\u7F6E corpId\uFF0C\u8DF3\u8FC7 @\u63D0\u95EE\u8005",{conversationId:p});(typeof k!="string"||!k.trim())&&(k=!1)}let R=await u.replyToConversation(p,g,{...k!==void 0?{mentionSender:k}:{},...m?.mentionUserIds?.length?{mentionUserIds:m.mentionUserIds}:{},...m?.senderName?{senderName:m.senderName}:{},...m?.title?{title:m.title}:{},...m?.preferWebhook?{preferWebhook:m.preferWebhook}:{},...S?{webhookFallback:S}:{}});return x&&(R.reason=R.reason?`${R.reason}; ${x}`:x),R.via==="session"||R.via==="robotApi"||R.via==="webhook"?i.markDelivered(t.eventContext,p):b&&(R.configError=!0),h.info("messaging","replyToConversation",{conversationId:p,via:R.via,atUserIds:R.atUserIds,reason:R.reason}),R},async replyToConversationWithButtons(p,g,m){try{let y=qe(t.eventContext),b=m?.credRef?.trim()||y?.credRef;if(!b)return{via:"skipped",reason:"replyToConversationWithButtons \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF08\u65E0 credRef\uFF09"};let x=t.robots?.[b];if(!x?.client_id||!x.client_secret)return{via:"skipped",reason:`replyToConversationWithButtons credRef="${b}" \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u636E`,configError:!0};let I=Rn.lookup(p),S=I?.conversationType,k=m?.senderStaffId?.trim()||I?.senderStaffId,R={title:g.title,text:g.text,buttons:g.buttons};return S==="1"?k?(await f.sendDingTalkActionCardToUsers([k],R,{credRef:b}),i.markDelivered(t.eventContext,p),{via:"session"}):{via:"skipped",reason:"\u5355\u804A ActionCard \u9700\u8981 senderStaffId \u4F46\u672A\u53D6\u5230"}:(await f.sendDingTalkActionCardToGroup(p,R,{credRef:b}),i.markDelivered(t.eventContext,p),{via:"session"})}catch(y){let w=y instanceof Error?y.message:String(y);return h.warn("messaging","replyToConversationWithButtons \u5931\u8D25",{conversationId:p,reason:w}),{via:"skipped",reason:w}}},beginDingTalkProcessingFeedback(p){let g=qe(p);if(!g)return;let m=t.robots?.[g.credRef];if(!m?.client_id||!m.client_secret){h.warn("messaging","skip processing emotion: credRef \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u8BC1",{credRef:g.credRef,available:Object.keys(t.robots??{})});return}let y=s.get(g.credRef,{clientId:m.client_id,clientSecret:m.client_secret},o);i.begin(p,y)},async sendToGroupByWebhook(p,g,m){let y=p?.url,w=p?.secret;if(!y)throw new Error("sendToGroupByWebhook \u7F3A\u5C11 url");let b=Dp(y);h.info("messaging","sendToGroupByWebhook",{host:b,contentLen:g.length,signed:!!w});let x=m?.title??Sc(g),I=[...m?.atUserIds??[],...m?.atMobiles??[]],S=I.length>0?Cp(g,I):g,k={msgtype:"markdown",markdown:{title:x,text:S},at:{isAtAll:m?.atAll??!1,...m?.atUserIds?.length?{atUserIds:m.atUserIds}:{},...m?.atMobiles?.length?{atMobiles:m.atMobiles}:{}}},R=w?$p(y,w):y;await Pp(o,R,k,r,b)}};return f}a($S,"createMessagingToolkitFromConfig");function PS(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length!==2)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u6070\u597D\u5305\u542B\u4E24\u4E2A\u6309\u94AE`);for(let[n,r]of t.buttons.entries())if(!r?.title?.trim()||!r.url?.trim())throw new Error(`${e} \u7684\u7B2C ${n+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`)}a(PS,"validateDingTalkActionCard");function Dp(t){try{return new URL(t).host}catch{return"webhook"}}a(Dp,"safeHost");function $p(t,e){let n=Date.now(),r=`${n}
272
272
  ${e}`,o=ES("sha256",e).update(r,"utf8").digest("base64"),i=t.includes("?")?"&":"?";return`${t}${i}timestamp=${n}&sign=${encodeURIComponent(o)}`}a($p,"signWebhookUrl");async function Pp(t,e,n,r,o){let i;try{i=await t(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n),signal:AbortSignal.timeout(r)})}catch(c){let l=c instanceof Error?c.message:String(c);throw h.error("messaging","webhook \u8BF7\u6C42\u5931\u8D25",{channel:o,error:l}),new Error(`webhook \u8BF7\u6C42\u5931\u8D25 (${o}): ${l}`)}if(!i.ok){let c=await i.text().catch(()=>"");throw h.error("messaging","webhook HTTP \u975E 2xx",{channel:o,status:i.status,body:c.slice(0,200)}),new Error(`webhook \u53D1\u9001\u5931\u8D25 (${o}) HTTP ${i.status}: ${c.slice(0,200)}`)}let s=await i.json().catch(()=>({}));if(s.errcode&&s.errcode!==0)throw h.error("messaging","webhook \u4E1A\u52A1\u5931\u8D25",{channel:o,errcode:s.errcode,errmsg:s.errmsg}),new Error(`webhook \u53D1\u9001\u5931\u8D25 (${o}) errcode=${s.errcode}: ${s.errmsg??""}`)}a(Pp,"postWebhook");function MS(t){let e=t.trim();if(!e)return null;let n;try{n=JSON.parse(e)}catch{return null}if(!n||typeof n!="object")return null;let r=n;if(r.success!==!1)return null;let o=r.data&&typeof r.data=="object"?r.data:{},i=String(r.code??o.code??r.errorCode??"UNKNOWN"),s=String(o.desc??r.errorMessage??r.message??"\u53D1\u9001\u5931\u8D25");return{code:i,desc:s}}a(MS,"parseDwsFailure");function Sc(t){let e=t.match(/^\s*[【\[]([^】\]]{1,20})[】\]]/);return e?.[1]?e[1].trim():(t.split(/\r?\n/).find(i=>i.trim().length>0)??"").replace(/[#*_`>~-]/g,"").trim().slice(0,20).trim()||"\u5DE5\u4F5C\u6D41\u901A\u77E5"}a(Sc,"deriveTitle");function OS(t){let e=[];if(e.push(`**${t.title}**`),e.push(""),e.push(t.content),t.actions&&t.actions.length>0){e.push(""),e.push("---");for(let n of t.actions)e.push(`- [${n.label}]`)}return e.join(`
273
- `)}a(OS,"formatCardAsMarkdown");var Op={session:"\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D(\u53EF @\u63D0\u95EE\u8005)",robotApi:"\u673A\u5668\u4EBA robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u9489\u9489\u9650\u5236\u65E0\u6CD5 @\u4EBA,\u6539\u4E3A\u6B63\u6587\u524D\u7F6E\u79F0\u547C)",webhook:"\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u964D\u7EA7",skipped:"\u65E0\u53EF\u7528\u51FA\u7AD9\u901A\u9053(\u89C1 reason)"},Mp=Object.keys(Op),jp={name:"messaging",description:"IM \u6D88\u606F\u63A8\u9001:\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u6587\u672C\u6216\u5361\u7247\u3001\u7ECF\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u6216\u7528\u6237\u53D1\u9001 ActionCard\u3001\u7ECF\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 Markdown/ActionCard;replyToConversation \u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF(\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D\u5E76 @\u63D0\u95EE\u8005 \u2192 robot API \u4E3B\u52A8\u63A8\u9001 \u2192 webhook \u964D\u7EA7)\u3002",configSchema:A.object({robot_creds:A.record(A.string(),A.object({client_id:A.string(),client_secret:A.string()})).optional(),webhook_creds:A.record(A.string(),A.object({url:A.string(),secret:A.string().optional()})).optional()}).passthrough(),build:a((t,e)=>{let n=t.robot_creds??t.robot_refs,r=jS(e.item.raw),o=qe(r),i=o?n?.[o.credRef]:void 0,s=i?.client_id&&i.client_secret?{appKey:i.client_id,appSecret:i.client_secret}:void 0;if(!s&&!o&&n){let c=Object.keys(n)[0],l=c?n[c]:void 0;l?.client_id&&l.client_secret&&(s={appKey:l.client_id,appSecret:l.client_secret})}return $S({dwsBin:e.settings.tracker.dws_bin,timeoutMs:DS,...s?{robot:s,robotCode:s.appKey}:{},...n?{robots:n}:{},...r?{eventContext:r}:{},...t.webhook_creds?{webhookCreds:t.webhook_creds}:{}})},"build"),methods:[{name:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6587\u672C\u6D88\u606F",params:A.object({userId:A.string().describe("\u63A5\u6536\u7528\u6237 id"),content:A.string().describe("\u6D88\u606F\u6B63\u6587")}),output:A.promise(A.void())},{name:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6587\u672C\u6D88\u606F",params:A.object({groupId:A.string().describe("\u7FA4 cid"),content:A.string().describe("\u6D88\u606F\u6B63\u6587")}),output:A.promise(A.void())},{name:"sendCard",description:"\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u5361\u7247\u6D88\u606F(\u964D\u7EA7\u4E3A\u5BCC\u6587\u672C)",params:A.object({target:A.object({type:A.enum(["user","group"]),id:A.string()}).describe("\u63A5\u6536\u76EE\u6807(user/group + id)"),card:A.object({title:A.string(),content:A.string()}).describe("\u5361\u7247\u6807\u9898/\u5185\u5BB9")}),output:A.promise(A.void())},{name:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1B\u53CC\u6309\u94AE\u9ED8\u8BA4\u6A2A\u5411\uFF0C\u53EF\u901A\u8FC7 orientation \u9009\u62E9\u7AD6\u5411\u3002",params:A.object({conversationId:A.string().describe("\u76EE\u6807\u7FA4 openConversationId"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.array(A.object({title:A.string().min(1),url:A.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:A.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:A.object({credRef:A.string().min(1).optional().describe("\u673A\u5668\u4EBA\u547D\u540D\u51ED\u636E\u5F15\u7528\uFF1B\u5F53\u524D Stream \u5165\u7AD9\u7FA4\u53EF\u7701\u7565")}).optional()}),output:A.promise(A.object({processQueryKey:A.string().optional()}))},{name:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u6279\u91CF\u5411\u7528\u6237\u5355\u804A\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1BuserIds \u4E3A\u9489\u9489 userId\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u4ECE\u914D\u7F6E\u89E3\u6790\u3002",params:A.object({userIds:A.array(A.string().min(1)).min(1).describe("\u63A5\u6536\u4EBA\u7684\u9489\u9489 userId \u5217\u8868"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.array(A.object({title:A.string().min(1),url:A.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:A.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:A.object({credRef:A.string().min(1).describe("messaging.robot_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528")})}),output:A.promise(A.object({processQueryKey:A.string().optional()}))},{name:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u914D\u7F6E\u4E2D\u7684\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u6A2A\u5411\u53CC\u6309\u94AE ActionCard\uFF1B\u53EA\u4F20 credRef\uFF0C\u4E0D\u66B4\u9732 URL \u6216\u52A0\u7B7E secret\u3002",params:A.object({credRef:A.string().min(1).describe("messaging.webhook_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.tuple([A.object({title:A.string().min(1),url:A.string().min(1)}),A.object({title:A.string().min(1),url:A.string().min(1)})]).describe("\u56FA\u5B9A\u4E24\u4E2A\u6A2A\u5411\u8DF3\u8F6C\u6309\u94AE")})}),output:A.promise(A.void())},{name:"reply",description:"\u56DE\u590D\u5F53\u524D\u5DE5\u5355\u5173\u8054\u7684\u6D88\u606F\u6E90(\u9700 ctx \u4E8B\u4EF6\u76EE\u6807,\u5F53\u524D no-op)",params:A.object({content:A.string().describe("\u56DE\u590D\u6B63\u6587")}),output:A.promise(A.void())},{name:"replyToConversation",description:"\u56DE\u590D\u5230\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF:\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D\u5E76 @\u63D0\u95EE\u8005(\u9700\u914D robot) \u2192 robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u65E0 sessionWebhook \u65F6,\u5982 DWS \u8F6E\u8BE2\u5165\u7AD9) \u2192 \u7FA4\u673A\u5668\u4EBA webhook \u964D\u7EA7(\u9700\u914D webhook \u6216 options.webhook) \u2192 skipped;\u6052\u4E0D\u629B\u9519\u8FD4\u56DE {via,atUserIds,reason}\u3002\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA\u82E5\u5F00\u542F\u300C\u52A0\u7B7E\u300D,webhook \u5FC5\u987B url+secret \u6210\u5BF9(options.webhook \u662F {url,secret} \u5BF9\u8C61,\u4E0D\u662F url \u5B57\u7B26\u4E32);\u53EA\u4F20 url \u4F1A\u88AB\u9489\u9489\u62D2\u6536(sign not match)\u3002",params:A.object({conversationId:A.string().describe("\u76EE\u6807\u4F1A\u8BDD id(\u7FA4 cid)"),content:A.string().describe("\u56DE\u590D\u6B63\u6587"),options:A.object({mentionSender:A.union([A.boolean(),A.string()]).optional().describe("\u662F\u5426 @ \u63D0\u95EE\u8005\uFF1A\u7F3A\u7701/true \u81EA\u52A8\u89E3\u6790\uFF0Cfalse \u5173\u95ED\uFF0Cstring \u663E\u5F0F\u6307\u5B9A userId"),mentionUserIds:A.array(A.string()).optional().describe("\u8FFD\u52A0 @ \u7684 userId \u5217\u8868\uFF0C\u4E0E\u63D0\u95EE\u8005\u5408\u5E76\u53BB\u91CD"),senderName:A.string().optional().describe("\u63D0\u95EE\u8005\u59D3\u540D\uFF1B\u4EC5 robotApi \u901A\u9053\u751F\u6548\uFF0C\u6B63\u6587\u524D\u7F6E\u300Cxxx\u300D\u66FF\u4EE3\u65E0\u6CD5 @\u4EBA"),title:A.string().optional().describe("markdown \u6807\u9898"),webhook:A.object({url:A.string(),secret:A.string().optional()}).optional().describe("\u8986\u76D6\u9ED8\u8BA4\u964D\u7EA7 webhook \u76EE\u6807;\u52A0\u7B7E\u7FA4\u5FC5\u987B\u5E26 secret,url \u4E0E secret \u9700\u6210\u5BF9\u6765\u81EA\u540C\u4E00\u914D\u7F6E\u6E90"),credRef:A.string().optional().describe("\u547D\u540D\u51ED\u636E\u5F15\u7528\u540D;\u4F18\u5148\u89E3\u6790 messaging.webhook_creds[credRef] \u4F5C webhook \u964D\u7EA7\u76EE\u6807,\u672A\u547D\u4E2D\u65F6\u5141\u8BB8\u547D\u4E2D messaging.robot_creds[credRef] \u7528\u4E8E\u673A\u5668\u4EBA\u901A\u9053")}).optional().describe("\u9009\u8DEF\u4E0E @ \u9009\u9879")}),output:A.promise(A.object({via:A.enum(Mp).describe(`\u5B9E\u9645\u51FA\u7AD9\u901A\u9053\uFF1A${Object.entries(Op).map(([t,e])=>`${t}=${e}`).join("\uFF1B")}`),atUserIds:A.array(A.string()).optional().describe("\u5B9E\u9645 @ \u7684 userId"),reason:A.string().optional().describe("\u964D\u7EA7/\u8DF3\u8FC7\u539F\u56E0"),configError:A.boolean().optional().describe("\u662F\u5426\u56E0\u914D\u7F6E\u9519\u8BEF\u8DF3\u8FC7(\u91CD\u8BD5\u65E0\u76CA)")}))},{name:"replyToConversationWithButtons",description:"\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u5F62\u5F0F\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\uFF08\u7FA4\u804A\u8D70\u7FA4\u5361\u7247\uFF0C\u5355\u804A\u8D70\u7528\u6237\u5355\u804A\u5361\u7247\uFF09\uFF1B\u8DEF\u7531\u5931\u8D25\u8FD4\u56DE skipped\u3002",params:A.object({conversationId:A.string().describe("\u76EE\u6807\u4F1A\u8BDD id"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.array(A.object({title:A.string().min(1),url:A.string().min(1)})).min(1).max(5).describe("\u8DF3\u8F6C\u6309\u94AE")}),options:A.object({credRef:A.string().optional().describe("\u673A\u5668\u4EBA\u51ED\u636E\u5F15\u7528\uFF1B\u7701\u7565\u65F6\u4ECE\u5F53\u524D Stream \u5165\u7AD9\u4E0A\u4E0B\u6587\u63A8\u65AD"),senderStaffId:A.string().optional().describe("\u5355\u804A\u65F6\u7684\u63A5\u6536\u4EBA userId\uFF1B\u7701\u7565\u65F6\u4ECE session registry \u63A8\u65AD")}).optional()}),output:A.promise(A.object({via:A.enum(Mp),atUserIds:A.array(A.string()).optional(),reason:A.string().optional(),configError:A.boolean().optional()}))},{name:"sendToGroupByWebhook",description:"\u901A\u8FC7\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u7FA4\u6D88\u606F",params:A.object({target:A.object({url:A.string(),secret:A.string().optional()}).describe("\u76EE\u6807 webhook(url + \u53EF\u9009\u52A0\u7B7E secret)"),content:A.string().describe("\u6D88\u606F\u6B63\u6587"),options:A.object({title:A.string().optional(),atAll:A.boolean().optional(),atUserIds:A.array(A.string()).optional(),atMobiles:A.array(A.string()).optional()}).optional().describe("\u6807\u9898\u4E0E @ \u9009\u9879")}),output:A.promise(A.void())}],permissions:[{method:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684 user id)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684 user id \u5217\u8868"),check:a((t,e)=>t.includes(e[0]),"check")},{method:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u7FA4 cid)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684\u7FA4 cid \u5217\u8868"),check:a((t,e)=>t.includes(e[0]),"check")},{method:"sendCard",description:"\u5411\u6307\u5B9A\u7528\u6237/\u7FA4\u53D1\u9001\u5361\u7247\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u76EE\u6807 id)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684 user id \u6216\u7FA4 cid \u5217\u8868"),check:a((t,e)=>t.includes(e[0].id),"check")},{method:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u7FA4 cid\uFF09",scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u7FA4 cid \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")||n.includes(e[0])},"check")},{method:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001\u5355\u804A ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u9489\u9489 userId\uFF09",scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u9489\u9489 userId \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let r=Array.isArray(e[0])?e[0]:[];return r.length>0&&r.every(o=>typeof o=="string"&&n.includes(o.trim()))},"check")},{method:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u7528\u7684 credRef\uFF09",scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u4F7F\u7528\u7684 webhook_creds credRef \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t,r=typeof e[0]=="string"?e[0].trim():"";return n.includes("*")||n.includes(r)},"check")},{method:"reply",description:"\u56DE\u590D\u5F53\u524D\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u76EE\u6807 id)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u56DE\u590D\u7684 user id \u6216\u7FA4 cid \u5217\u8868"),check:a((t,e,n)=>n.messageTarget!=null&&t.includes(n.messageTarget),"check")},{method:"replyToConversation",description:'\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u7FA4 cid;\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u56DE\u590D\u7684\u7FA4 cid \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")?!0:n.includes(e[0])},"check")},{method:"replyToConversationWithButtons",description:'\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u7FA4 cid;\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u56DE\u590D\u7684\u7FA4 cid \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")?!0:n.includes(e[0])},"check")},{method:"sendToGroupByWebhook",description:'\u901A\u8FC7\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u6D88\u606F(scope \u4E3A\u5141\u8BB8\u7684 url host \u5217\u8868,\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u7684 webhook host \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let r=e[0];try{return r?.url?n.includes(new URL(r.url).host):!1}catch{return!1}},"check")}]};function jS(t){if(!t||typeof t!="object")return;let e=t.eventContext;return qe(e)??Pr(e)}a(jS,"eventContextFromItem");import{z as Ie}from"zod";var FS=15e3,Fp=300,NS=["todo","task","create"],LS=["todo","task","get"],WS=["todo","task","done"];function BS(t){let e={dwsBin:t.tracker.dws_bin,timeoutMs:FS};return zS(e)}a(BS,"createTodoToolkit");function zS(t){let e=t.runner??J,n=t.dwsBin,r=t.timeoutMs;async function o(c){let l=[...c,"--format","json"],d=l.slice(0,4).join(" "),u=Date.now();h.debug("todo","dws call",{cmd:d});let f=await ne(n,l,{timeoutMs:r,runner:e}),p=Date.now()-u;if(f.exitCode!==0)throw h.error("todo","dws todo command failed",{cmd:d,exitCode:f.exitCode,stderr:De(f.stderr),elapsed:p}),new We(`dws todo failed (exit ${f.exitCode}): ${De(f.stderr)}`,{retryable:!0});h.debug("todo","dws call completed",{cmd:d,elapsed:p});let g=f.stdout.trim();if(!g)return{};try{return JSON.parse(g)}catch{throw new Error(`dws todo returned invalid JSON: ${g.slice(0,Fp)}`)}}a(o,"runDwsJson");function i(c){if(!S(c))throw new Error("dws todo create: unexpected response format");for(let l of[c,c.body,c.data,c.result])if(S(l))for(let d of["todoTaskId","taskId","task_id","id"]){let u=l[d];if(typeof u=="string"&&u)return u;if(typeof u=="number")return String(u)}throw new Error(`dws todo create: cannot find task ID in response: ${JSON.stringify(c).slice(0,Fp)}`)}a(i,"extractId");function s(c){if(!S(c))return!1;for(let l of[c,c.body,c.data,c.result])if(S(l)){let d=l;if(d.isDone===!0||d.is_done===!0)return!0;if(typeof d.status=="string"){let u=d.status.toLowerCase();if(u==="done"||u==="completed"||u==="finished")return!0}if(typeof d.done=="boolean")return d.done}return!1}return a(s,"isDone"),{async create(c,l,d,u,f){h.info("todo","create",{title:c,assignee:l,recordId:d,stepId:u});let p=[...NS,"--title",c,"--executors",l];f&&p.push("--due",f);let g=await o(p);return i(g)},async isCompleted(c){h.debug("todo","isCompleted",{todoId:c});let l=await o([...LS,"--task-id",c]);return s(l)},async complete(c){h.info("todo","complete",{todoId:c}),await o([...WS,"--task-id",c,"--status","true"])}}}a(zS,"createTodoToolkitFromConfig");var Np={name:"todo",description:"\u5F85\u529E\u7BA1\u7406:\u521B\u5EFA\u5F85\u529E\u5E76\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4\u3001\u67E5\u8BE2/\u6807\u8BB0\u5B8C\u6210\u3002",configSchema:Ie.object({}).strict(),build:a((t,e)=>BS(e.settings),"build"),permissions:[{method:"create",description:'\u521B\u5EFA\u5F85\u529E(\u9650\u5B9A\u53EF\u6307\u6D3E\u7684\u6267\u884C\u4EBA userId \u5217\u8868,\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:Ie.array(Ie.string()).describe('\u5141\u8BB8\u6307\u6D3E\u7684\u6267\u884C\u4EBA userId \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let o=String(e[1]??"").split(",").map(i=>i.trim()).filter(Boolean);return o.length>0&&o.every(i=>n.includes(i))},"check")},{method:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210(\u5E03\u5C14\u5F00\u5173:true \u653E\u884C)"}],methods:[{name:"create",description:"\u521B\u5EFA\u5F85\u529E\u5E76\u5173\u8054\u5230\u6D41\u7A0B\u6B65\u9AA4",params:Ie.object({title:Ie.string().describe("\u5F85\u529E\u6807\u9898"),assignee:Ie.string().describe("\u8D1F\u8D23\u4EBA id"),recordId:Ie.string().describe("\u5173\u8054\u8868\u683C\u8BB0\u5F55 id"),stepId:Ie.string().describe("\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4 id"),dueDate:Ie.string().optional().describe("\u622A\u6B62\u65F6\u95F4(ISO \u5B57\u7B26\u4E32)")}),output:Ie.promise(Ie.string().describe("\u5F85\u529E id"))},{name:"isCompleted",description:"\u67E5\u8BE2\u5F85\u529E\u5B8C\u6210\u72B6\u6001",params:Ie.object({todoId:Ie.string().describe("\u5F85\u529E id")}),output:Ie.promise(Ie.boolean())},{name:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210",params:Ie.object({todoId:Ie.string().describe("\u5F85\u529E id")}),output:Ie.promise(Ie.void())}]};import{rm as Lp,mkdir as Wp}from"fs/promises";import Gt from"path";import{z as U}from"zod";var US="git",KS=12e4,VS=1,qS="master";function HS(t){let e=t.runner??J,n=t.gitBin,r=t.timeoutMs,o=t.workspaceRoot,i=t.defaultBranch,s=new Map;function c(d,u){let p=(s.get(d)??Promise.resolve()).then(()=>u(),()=>u());return s.set(d,p.then(()=>{},()=>{})),p}a(c,"withRepoLock");async function l(d,u){let f=d.slice(0,3).join(" "),p=Date.now();h.debug("git","git call",{cmd:f});let g=await e(n,d,{timeoutMs:r,cwd:u}),m=Date.now()-p;if(g.exitCode!==0)throw h.error("git","git command failed",{cmd:f,exitCode:g.exitCode,stderr:g.stderr.slice(0,300),elapsed:m}),new Error(`git failed (exit ${g.exitCode}): ${De(g.stderr)}`);return h.debug("git","git call completed",{cmd:f,elapsed:m}),g.stdout}return a(l,"runGit"),{async clone(d,u,f){let p=f?.depth??t.cloneDepth;h.info("git","clone",{repoUrl:d,targetDir:u,depth:p}),await Lp(u,{recursive:!0,force:!0});try{await l(["clone","--depth",String(p),"--single-branch",d,u])}catch(g){throw await Lp(u,{recursive:!0,force:!0}),g}},async createBranch(d,u,f){h.info("git","createBranch",{repoDir:d,branchName:u,baseBranch:f});let p=["-C",d,"checkout","-b",u];f&&p.push(f),await l(p)},async currentBranch(d){return(await l(["-C",d,"rev-parse","--abbrev-ref","HEAD"])).trim()},async push(d,u){let f=u??await this.currentBranch(d);h.info("git","push",{repoDir:d,branch:f}),await l(["-C",d,"push","-u","origin",f])},async commit(d,u){return h.info("git","commit",{repoDir:d}),await l(["-C",d,"add","-A"]),(await l(["-C",d,"status","--porcelain"])).trim()?(await l(["-C",d,"commit","-m",u]),{committed:!0}):(h.info("git","commit skipped: nothing to commit",{repoDir:d}),{committed:!1})},async diff(d,u){let f=["-C",d,"diff","--stat"];u&&f.push(u);let p=await l(f),g=p.trim().split(`
273
+ `)}a(OS,"formatCardAsMarkdown");var Op={session:"\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D(\u53EF @\u63D0\u95EE\u8005)",robotApi:"\u673A\u5668\u4EBA robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u9489\u9489\u9650\u5236\u65E0\u6CD5 @\u4EBA,\u6539\u4E3A\u6B63\u6587\u524D\u7F6E\u79F0\u547C)",webhook:"\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u964D\u7EA7",skipped:"\u65E0\u53EF\u7528\u51FA\u7AD9\u901A\u9053(\u89C1 reason)"},Mp=Object.keys(Op),jp={name:"messaging",description:"IM \u6D88\u606F\u63A8\u9001:\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u6587\u672C\u6216\u5361\u7247\u3001\u7ECF\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u6216\u7528\u6237\u53D1\u9001 ActionCard\u3001\u7ECF\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 Markdown/ActionCard;replyToConversation \u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF(\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D\u5E76 @\u63D0\u95EE\u8005 \u2192 robot API \u4E3B\u52A8\u63A8\u9001 \u2192 webhook \u964D\u7EA7)\u3002",configSchema:A.object({robot_creds:A.record(A.string(),A.object({client_id:A.string(),client_secret:A.string()})).optional(),webhook_creds:A.record(A.string(),A.object({url:A.string(),secret:A.string().optional()})).optional()}).passthrough(),build:a((t,e)=>{let n=t.robot_creds??t.robot_refs,r=jS(e.item.raw),o=qe(r),i=o?n?.[o.credRef]:void 0,s=i?.client_id&&i.client_secret?{appKey:i.client_id,appSecret:i.client_secret}:void 0;if(!s&&!o&&n){let c=Object.keys(n)[0],l=c?n[c]:void 0;l?.client_id&&l.client_secret&&(s={appKey:l.client_id,appSecret:l.client_secret})}return $S({dwsBin:e.settings.tracker.dws_bin,timeoutMs:DS,...s?{robot:s,robotCode:s.appKey}:{},...n?{robots:n}:{},...r?{eventContext:r}:{},...t.webhook_creds?{webhookCreds:t.webhook_creds}:{}})},"build"),methods:[{name:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6587\u672C\u6D88\u606F",params:A.object({userId:A.string().describe("\u63A5\u6536\u7528\u6237 id"),content:A.string().describe("\u6D88\u606F\u6B63\u6587")}),output:A.promise(A.void())},{name:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6587\u672C\u6D88\u606F",params:A.object({groupId:A.string().describe("\u7FA4 cid"),content:A.string().describe("\u6D88\u606F\u6B63\u6587")}),output:A.promise(A.void())},{name:"sendCard",description:"\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u5361\u7247\u6D88\u606F(\u964D\u7EA7\u4E3A\u5BCC\u6587\u672C)",params:A.object({target:A.object({type:A.enum(["user","group"]),id:A.string()}).describe("\u63A5\u6536\u76EE\u6807(user/group + id)"),card:A.object({title:A.string(),content:A.string()}).describe("\u5361\u7247\u6807\u9898/\u5185\u5BB9")}),output:A.promise(A.void())},{name:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1B\u53CC\u6309\u94AE\u9ED8\u8BA4\u6A2A\u5411\uFF0C\u53EF\u901A\u8FC7 orientation \u9009\u62E9\u7AD6\u5411\u3002",params:A.object({conversationId:A.string().describe("\u76EE\u6807\u7FA4 openConversationId"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.array(A.object({title:A.string().min(1),url:A.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:A.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:A.object({credRef:A.string().min(1).optional().describe("\u673A\u5668\u4EBA\u547D\u540D\u51ED\u636E\u5F15\u7528\uFF1B\u5F53\u524D Stream \u5165\u7AD9\u7FA4\u53EF\u7701\u7565")}).optional()}),output:A.promise(A.object({processQueryKey:A.string().optional()}))},{name:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u6279\u91CF\u5411\u7528\u6237\u5355\u804A\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1BuserIds \u4E3A\u9489\u9489 userId\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u4ECE\u914D\u7F6E\u89E3\u6790\u3002",params:A.object({userIds:A.array(A.string().min(1)).min(1).describe("\u63A5\u6536\u4EBA\u7684\u9489\u9489 userId \u5217\u8868"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.array(A.object({title:A.string().min(1),url:A.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:A.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:A.object({credRef:A.string().min(1).describe("messaging.robot_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528")})}),output:A.promise(A.object({processQueryKey:A.string().optional()}))},{name:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u914D\u7F6E\u4E2D\u7684\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u6A2A\u5411\u53CC\u6309\u94AE ActionCard\uFF1B\u53EA\u4F20 credRef\uFF0C\u4E0D\u66B4\u9732 URL \u6216\u52A0\u7B7E secret\u3002",params:A.object({credRef:A.string().min(1).describe("messaging.webhook_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.tuple([A.object({title:A.string().min(1),url:A.string().min(1)}),A.object({title:A.string().min(1),url:A.string().min(1)})]).describe("\u56FA\u5B9A\u4E24\u4E2A\u6A2A\u5411\u8DF3\u8F6C\u6309\u94AE")})}),output:A.promise(A.void())},{name:"reply",description:"\u56DE\u590D\u5F53\u524D\u5DE5\u5355\u5173\u8054\u7684\u6D88\u606F\u6E90(\u9700 ctx \u4E8B\u4EF6\u76EE\u6807,\u5F53\u524D no-op)",params:A.object({content:A.string().describe("\u56DE\u590D\u6B63\u6587")}),output:A.promise(A.void())},{name:"replyToConversation",description:"\u56DE\u590D\u5230\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF:\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D\u5E76 @\u63D0\u95EE\u8005(\u9700\u914D robot) \u2192 robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u65E0 sessionWebhook \u65F6,\u5982 DWS \u8F6E\u8BE2\u5165\u7AD9) \u2192 \u7FA4\u673A\u5668\u4EBA webhook \u964D\u7EA7(\u9700\u914D webhook \u6216 options.webhook) \u2192 skipped;\u6052\u4E0D\u629B\u9519\u8FD4\u56DE {via,atUserIds,reason}\u3002\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA\u82E5\u5F00\u542F\u300C\u52A0\u7B7E\u300D,webhook \u5FC5\u987B url+secret \u6210\u5BF9(options.webhook \u662F {url,secret} \u5BF9\u8C61,\u4E0D\u662F url \u5B57\u7B26\u4E32);\u53EA\u4F20 url \u4F1A\u88AB\u9489\u9489\u62D2\u6536(sign not match)\u3002",params:A.object({conversationId:A.string().describe("\u76EE\u6807\u4F1A\u8BDD id(\u7FA4 cid)"),content:A.string().describe("\u56DE\u590D\u6B63\u6587"),options:A.object({mentionSender:A.union([A.boolean(),A.string()]).optional().describe("\u662F\u5426 @ \u63D0\u95EE\u8005\uFF1A\u7F3A\u7701/true \u81EA\u52A8\u89E3\u6790\uFF0Cfalse \u5173\u95ED\uFF0Cstring \u663E\u5F0F\u6307\u5B9A userId"),mentionUserIds:A.array(A.string()).optional().describe("\u8FFD\u52A0 @ \u7684 userId \u5217\u8868\uFF0C\u4E0E\u63D0\u95EE\u8005\u5408\u5E76\u53BB\u91CD"),senderName:A.string().optional().describe("\u63D0\u95EE\u8005\u59D3\u540D\uFF1B\u4EC5 robotApi \u901A\u9053\u751F\u6548\uFF0C\u6B63\u6587\u524D\u7F6E\u300Cxxx\u300D\u66FF\u4EE3\u65E0\u6CD5 @\u4EBA"),title:A.string().optional().describe("markdown \u6807\u9898"),webhook:A.object({url:A.string(),secret:A.string().optional()}).optional().describe("\u8986\u76D6\u9ED8\u8BA4\u964D\u7EA7 webhook \u76EE\u6807;\u52A0\u7B7E\u7FA4\u5FC5\u987B\u5E26 secret,url \u4E0E secret \u9700\u6210\u5BF9\u6765\u81EA\u540C\u4E00\u914D\u7F6E\u6E90"),credRef:A.string().optional().describe("\u547D\u540D\u51ED\u636E\u5F15\u7528\u540D;\u4F18\u5148\u89E3\u6790 messaging.webhook_creds[credRef] \u4F5C webhook \u964D\u7EA7\u76EE\u6807,\u672A\u547D\u4E2D\u65F6\u5141\u8BB8\u547D\u4E2D messaging.robot_creds[credRef] \u7528\u4E8E\u673A\u5668\u4EBA\u901A\u9053")}).optional().describe("\u9009\u8DEF\u4E0E @ \u9009\u9879")}),output:A.promise(A.object({via:A.enum(Mp).describe(`\u5B9E\u9645\u51FA\u7AD9\u901A\u9053\uFF1A${Object.entries(Op).map(([t,e])=>`${t}=${e}`).join("\uFF1B")}`),atUserIds:A.array(A.string()).optional().describe("\u5B9E\u9645 @ \u7684 userId"),reason:A.string().optional().describe("\u964D\u7EA7/\u8DF3\u8FC7\u539F\u56E0"),configError:A.boolean().optional().describe("\u662F\u5426\u56E0\u914D\u7F6E\u9519\u8BEF\u8DF3\u8FC7(\u91CD\u8BD5\u65E0\u76CA)")}))},{name:"replyToConversationWithButtons",description:"\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u5F62\u5F0F\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\uFF08\u7FA4\u804A\u8D70\u7FA4\u5361\u7247\uFF0C\u5355\u804A\u8D70\u7528\u6237\u5355\u804A\u5361\u7247\uFF09\uFF1B\u8DEF\u7531\u5931\u8D25\u8FD4\u56DE skipped\u3002",params:A.object({conversationId:A.string().describe("\u76EE\u6807\u4F1A\u8BDD id"),card:A.object({title:A.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:A.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:A.array(A.object({title:A.string().min(1),url:A.string().min(1)})).min(1).max(5).describe("\u8DF3\u8F6C\u6309\u94AE")}),options:A.object({credRef:A.string().optional().describe("\u673A\u5668\u4EBA\u51ED\u636E\u5F15\u7528\uFF1B\u7701\u7565\u65F6\u4ECE\u5F53\u524D Stream \u5165\u7AD9\u4E0A\u4E0B\u6587\u63A8\u65AD"),senderStaffId:A.string().optional().describe("\u5355\u804A\u65F6\u7684\u63A5\u6536\u4EBA userId\uFF1B\u7701\u7565\u65F6\u4ECE session registry \u63A8\u65AD")}).optional()}),output:A.promise(A.object({via:A.enum(Mp),atUserIds:A.array(A.string()).optional(),reason:A.string().optional(),configError:A.boolean().optional()}))},{name:"sendToGroupByWebhook",description:"\u901A\u8FC7\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u7FA4\u6D88\u606F",params:A.object({target:A.object({url:A.string(),secret:A.string().optional()}).describe("\u76EE\u6807 webhook(url + \u53EF\u9009\u52A0\u7B7E secret)"),content:A.string().describe("\u6D88\u606F\u6B63\u6587"),options:A.object({title:A.string().optional(),atAll:A.boolean().optional(),atUserIds:A.array(A.string()).optional(),atMobiles:A.array(A.string()).optional()}).optional().describe("\u6807\u9898\u4E0E @ \u9009\u9879")}),output:A.promise(A.void())}],permissions:[{method:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684 user id)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684 user id \u5217\u8868"),check:a((t,e)=>t.includes(e[0]),"check")},{method:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u7FA4 cid)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684\u7FA4 cid \u5217\u8868"),check:a((t,e)=>t.includes(e[0]),"check")},{method:"sendCard",description:"\u5411\u6307\u5B9A\u7528\u6237/\u7FA4\u53D1\u9001\u5361\u7247\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u76EE\u6807 id)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684 user id \u6216\u7FA4 cid \u5217\u8868"),check:a((t,e)=>t.includes(e[0].id),"check")},{method:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u7FA4 cid\uFF09",scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u7FA4 cid \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")||n.includes(e[0])},"check")},{method:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001\u5355\u804A ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u9489\u9489 userId\uFF09",scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u9489\u9489 userId \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let r=Array.isArray(e[0])?e[0]:[];return r.length>0&&r.every(o=>typeof o=="string"&&n.includes(o.trim()))},"check")},{method:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u7528\u7684 credRef\uFF09",scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u4F7F\u7528\u7684 webhook_creds credRef \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t,r=typeof e[0]=="string"?e[0].trim():"";return n.includes("*")||n.includes(r)},"check")},{method:"reply",description:"\u56DE\u590D\u5F53\u524D\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u76EE\u6807 id)",scopeSchema:A.array(A.string()).describe("\u5141\u8BB8\u56DE\u590D\u7684 user id \u6216\u7FA4 cid \u5217\u8868"),check:a((t,e,n)=>n.messageTarget!=null&&t.includes(n.messageTarget),"check")},{method:"replyToConversation",description:'\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u7FA4 cid;\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u56DE\u590D\u7684\u7FA4 cid \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")?!0:n.includes(e[0])},"check")},{method:"replyToConversationWithButtons",description:'\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u7FA4 cid;\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u56DE\u590D\u7684\u7FA4 cid \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")?!0:n.includes(e[0])},"check")},{method:"sendToGroupByWebhook",description:'\u901A\u8FC7\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u6D88\u606F(scope \u4E3A\u5141\u8BB8\u7684 url host \u5217\u8868,\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:A.array(A.string()).describe('\u5141\u8BB8\u7684 webhook host \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let r=e[0];try{return r?.url?n.includes(new URL(r.url).host):!1}catch{return!1}},"check")}]};function jS(t){if(!t||typeof t!="object")return;let e=t.eventContext;return qe(e)??Pr(e)}a(jS,"eventContextFromItem");import{z as Ie}from"zod";var FS=15e3,Fp=300,NS=["todo","task","create"],LS=["todo","task","get"],WS=["todo","task","done"];function BS(t){let e={dwsBin:t.tracker.dws_bin,timeoutMs:FS};return zS(e)}a(BS,"createTodoToolkit");function zS(t){let e=t.runner??J,n=t.dwsBin,r=t.timeoutMs;async function o(c){let l=[...c,"--format","json"],d=l.slice(0,4).join(" "),u=Date.now();h.debug("todo","dws call",{cmd:d});let f=await ne(n,l,{timeoutMs:r,runner:e}),p=Date.now()-u;if(f.exitCode!==0)throw h.error("todo","dws todo command failed",{cmd:d,exitCode:f.exitCode,stderr:De(f.stderr),elapsed:p}),new We(`dws todo failed (exit ${f.exitCode}): ${De(f.stderr)}`,{retryable:!0});h.debug("todo","dws call completed",{cmd:d,elapsed:p});let g=f.stdout.trim();if(!g)return{};try{return JSON.parse(g)}catch{throw new Error(`dws todo returned invalid JSON: ${g.slice(0,Fp)}`)}}a(o,"runDwsJson");function i(c){if(!v(c))throw new Error("dws todo create: unexpected response format");for(let l of[c,c.body,c.data,c.result])if(v(l))for(let d of["todoTaskId","taskId","task_id","id"]){let u=l[d];if(typeof u=="string"&&u)return u;if(typeof u=="number")return String(u)}throw new Error(`dws todo create: cannot find task ID in response: ${JSON.stringify(c).slice(0,Fp)}`)}a(i,"extractId");function s(c){if(!v(c))return!1;for(let l of[c,c.body,c.data,c.result])if(v(l)){let d=l;if(d.isDone===!0||d.is_done===!0)return!0;if(typeof d.status=="string"){let u=d.status.toLowerCase();if(u==="done"||u==="completed"||u==="finished")return!0}if(typeof d.done=="boolean")return d.done}return!1}return a(s,"isDone"),{async create(c,l,d,u,f){h.info("todo","create",{title:c,assignee:l,recordId:d,stepId:u});let p=[...NS,"--title",c,"--executors",l];f&&p.push("--due",f);let g=await o(p);return i(g)},async isCompleted(c){h.debug("todo","isCompleted",{todoId:c});let l=await o([...LS,"--task-id",c]);return s(l)},async complete(c){h.info("todo","complete",{todoId:c}),await o([...WS,"--task-id",c,"--status","true"])}}}a(zS,"createTodoToolkitFromConfig");var Np={name:"todo",description:"\u5F85\u529E\u7BA1\u7406:\u521B\u5EFA\u5F85\u529E\u5E76\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4\u3001\u67E5\u8BE2/\u6807\u8BB0\u5B8C\u6210\u3002",configSchema:Ie.object({}).strict(),build:a((t,e)=>BS(e.settings),"build"),permissions:[{method:"create",description:'\u521B\u5EFA\u5F85\u529E(\u9650\u5B9A\u53EF\u6307\u6D3E\u7684\u6267\u884C\u4EBA userId \u5217\u8868,\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:Ie.array(Ie.string()).describe('\u5141\u8BB8\u6307\u6D3E\u7684\u6267\u884C\u4EBA userId \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let o=String(e[1]??"").split(",").map(i=>i.trim()).filter(Boolean);return o.length>0&&o.every(i=>n.includes(i))},"check")},{method:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210(\u5E03\u5C14\u5F00\u5173:true \u653E\u884C)"}],methods:[{name:"create",description:"\u521B\u5EFA\u5F85\u529E\u5E76\u5173\u8054\u5230\u6D41\u7A0B\u6B65\u9AA4",params:Ie.object({title:Ie.string().describe("\u5F85\u529E\u6807\u9898"),assignee:Ie.string().describe("\u8D1F\u8D23\u4EBA id"),recordId:Ie.string().describe("\u5173\u8054\u8868\u683C\u8BB0\u5F55 id"),stepId:Ie.string().describe("\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4 id"),dueDate:Ie.string().optional().describe("\u622A\u6B62\u65F6\u95F4(ISO \u5B57\u7B26\u4E32)")}),output:Ie.promise(Ie.string().describe("\u5F85\u529E id"))},{name:"isCompleted",description:"\u67E5\u8BE2\u5F85\u529E\u5B8C\u6210\u72B6\u6001",params:Ie.object({todoId:Ie.string().describe("\u5F85\u529E id")}),output:Ie.promise(Ie.boolean())},{name:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210",params:Ie.object({todoId:Ie.string().describe("\u5F85\u529E id")}),output:Ie.promise(Ie.void())}]};import{rm as Lp,mkdir as Wp}from"fs/promises";import Gt from"path";import{z as U}from"zod";var US="git",KS=12e4,VS=1,qS="master";function HS(t){let e=t.runner??J,n=t.gitBin,r=t.timeoutMs,o=t.workspaceRoot,i=t.defaultBranch,s=new Map;function c(d,u){let p=(s.get(d)??Promise.resolve()).then(()=>u(),()=>u());return s.set(d,p.then(()=>{},()=>{})),p}a(c,"withRepoLock");async function l(d,u){let f=d.slice(0,3).join(" "),p=Date.now();h.debug("git","git call",{cmd:f});let g=await e(n,d,{timeoutMs:r,cwd:u}),m=Date.now()-p;if(g.exitCode!==0)throw h.error("git","git command failed",{cmd:f,exitCode:g.exitCode,stderr:g.stderr.slice(0,300),elapsed:m}),new Error(`git failed (exit ${g.exitCode}): ${De(g.stderr)}`);return h.debug("git","git call completed",{cmd:f,elapsed:m}),g.stdout}return a(l,"runGit"),{async clone(d,u,f){let p=f?.depth??t.cloneDepth;h.info("git","clone",{repoUrl:d,targetDir:u,depth:p}),await Lp(u,{recursive:!0,force:!0});try{await l(["clone","--depth",String(p),"--single-branch",d,u])}catch(g){throw await Lp(u,{recursive:!0,force:!0}),g}},async createBranch(d,u,f){h.info("git","createBranch",{repoDir:d,branchName:u,baseBranch:f});let p=["-C",d,"checkout","-b",u];f&&p.push(f),await l(p)},async currentBranch(d){return(await l(["-C",d,"rev-parse","--abbrev-ref","HEAD"])).trim()},async push(d,u){let f=u??await this.currentBranch(d);h.info("git","push",{repoDir:d,branch:f}),await l(["-C",d,"push","-u","origin",f])},async commit(d,u){return h.info("git","commit",{repoDir:d}),await l(["-C",d,"add","-A"]),(await l(["-C",d,"status","--porcelain"])).trim()?(await l(["-C",d,"commit","-m",u]),{committed:!0}):(h.info("git","commit skipped: nothing to commit",{repoDir:d}),{committed:!1})},async diff(d,u){let f=["-C",d,"diff","--stat"];u&&f.push(u);let p=await l(f),g=p.trim().split(`
274
274
  `).filter(Boolean),m=[];for(let y of g){let w=y.match(/^\s*(.+?)\s+\|/);w?.[1]&&m.push(w[1].trim())}return{files:m,summary:p.trim()}},async status(d){let f=(await l(["-C",d,"status","--porcelain"])).split(`
275
- `).filter(p=>p.trim().length>0).map(p=>p.slice(3).trim());return{changed:f.length>0,files:f}},async ensureWorktree(d,u,f,p){let g=p?.depth??t.cloneDepth,m=Bp(d),y=Gt.join(o,"repos",m),w=Gt.join(o,"worktrees",Pe(u,{fallback:"item"})),b=Gt.join(w,m);return c(m,async()=>{if(await Wp(Gt.join(o,"repos"),{recursive:!0}),await Wp(w,{recursive:!0}),(await e(n,["-C",y,"rev-parse","--git-dir"],{timeoutMs:r})).exitCode===0){h.info("git","ensureWorktree: \u590D\u7528\u57FA\u7840\u5E93",{repoKey:m,baseDir:y});let k=await e(n,["-C",y,"fetch","--depth",String(g),"origin"],{timeoutMs:r});k.exitCode!==0&&h.warn("git","fetch \u5931\u8D25,\u4F7F\u7528\u73B0\u6709\u57FA\u7840\u5E93\u72B6\u6001",{repoKey:m,stderr:k.stderr.slice(0,200)})}else h.info("git","ensureWorktree: \u514B\u9686\u57FA\u7840\u5E93",{repoUrl:d,baseDir:y,depth:g}),await l(["clone","--depth",String(g),"--single-branch",d,y]);let I=p?.baseRef;if(!I){let k=await e(n,["-C",y,"rev-parse","--abbrev-ref","origin/HEAD"],{timeoutMs:r});I=k.exitCode===0&&k.stdout.trim()?k.stdout.trim():i}if((await l(["-C",y,"worktree","list","--porcelain"])).includes(b))return h.info("git","ensureWorktree: \u590D\u7528\u5DF2\u5B58\u5728 worktree",{wtDir:b,branch:f}),{dir:b,workspaceDir:w,branch:f,reused:!0,baseRef:I};h.info("git","ensureWorktree: \u521B\u5EFA worktree",{wtDir:b,branch:f,baseRef:I});try{await l(["-C",y,"worktree","add",b,"-b",f,I])}catch(k){h.warn("git","worktree add -b \u5931\u8D25,\u56DE\u843D\u5230\u5DF2\u6709\u5206\u652F",{branch:f,error:String(k)}),await l(["-C",y,"worktree","add",b,f])}return{dir:b,workspaceDir:w,branch:f,reused:!1,baseRef:I}})},async removeWorktree(d,u){let f=Bp(d),p=Gt.join(o,"repos",f),g=Gt.join(o,"worktrees",Pe(u,{fallback:"item"}),f);await c(f,async()=>{try{await l(["-C",p,"worktree","remove",g,"--force"])}catch(m){h.warn("git","worktree remove \u5931\u8D25(\u5FFD\u7565)",{wtDir:g,error:String(m)})}try{await l(["-C",p,"worktree","prune"])}catch{}})}}}a(HS,"createGitToolkitFromConfig");function Bp(t){return t.trim().replace(/\.git$/i,"").replace(/^[a-z][a-z0-9+.-]*:\/\//i,"").replace(/^[^@/]+@/,"").replace(/:/g,"/").replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||"repo"}a(Bp,"repoKeyFromUrl");var GS=U.object({root:U.string().optional().describe("\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55(\u76F8\u5BF9\u8DEF\u5F84\u76F8\u5BF9 configDir)"),default_branch:U.string().optional().describe("worktree \u57FA\u51C6\u5206\u652F\u56DE\u843D\u503C"),clone_depth:U.number().optional().describe("\u9ED8\u8BA4 clone \u6DF1\u5EA6")}).strict(),zp={name:"git",description:"Git \u5DE5\u4F5C\u7A7A\u95F4\u7BA1\u7406:clone \u4ED3\u5E93\u3001\u521B\u5EFA/\u5207\u6362\u5206\u652F\u3001push\u3001diff \u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u3002",configSchema:GS,build(t,e){return HS({gitBin:US,timeoutMs:KS,cloneDepth:t.clone_depth??VS,workspaceRoot:t.root?Gt.resolve(e.settings.configDir,t.root):Gt.resolve(e.settings.configDir,".workspace"),defaultBranch:t.default_branch??qS})},methods:[{name:"clone",description:"\u514B\u9686\u8FDC\u7A0B\u4ED3\u5E93\u5230\u672C\u5730\u76EE\u5F55",params:U.object({repoUrl:U.string().describe("\u4ED3\u5E93\u5730\u5740"),targetDir:U.string().describe("\u672C\u5730\u76EE\u6807\u76EE\u5F55"),options:U.object({depth:U.number().optional()}).optional()}),output:U.promise(U.void())},{name:"createBranch",description:"\u57FA\u4E8E\u5F53\u524D\u6216\u6307\u5B9A\u5206\u652F\u521B\u5EFA\u65B0\u5206\u652F",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branchName:U.string().describe("\u65B0\u5206\u652F\u540D"),baseBranch:U.string().optional().describe("\u57FA\u7840\u5206\u652F")}),output:U.promise(U.void())},{name:"currentBranch",description:"\u83B7\u53D6\u5F53\u524D\u5206\u652F\u540D",params:U.object({repoDir:U.string()}),output:U.promise(U.string())},{name:"push",description:"\u63A8\u9001\u5206\u652F\u5230\u8FDC\u7A0B",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branch:U.string().optional().describe("\u5206\u652F\u540D(\u7F3A\u7701\u53D6\u5F53\u524D\u5206\u652F)")}),output:U.promise(U.void())},{name:"commit",description:"\u6682\u5B58(add -A)\u5E76\u63D0\u4EA4\u5DE5\u4F5C\u533A\u6539\u52A8;\u65E0\u6539\u52A8\u5219\u8DF3\u8FC7",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),message:U.string().describe("\u63D0\u4EA4\u4FE1\u606F")}),output:U.promise(U.object({committed:U.boolean()}))},{name:"diff",description:"\u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u5217\u8868\u53CA\u6458\u8981",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),baseBranch:U.string().optional().describe("\u5BF9\u6BD4\u57FA\u51C6\u5206\u652F")}),output:U.promise(U.object({files:U.array(U.string()),summary:U.string()}))},{name:"status",description:"\u67E5\u770B\u5DE5\u4F5C\u533A\u662F\u5426\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF08\u542B\u672A\u8DDF\u8E2A\u65B0\u6587\u4EF6\uFF09",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55")}),output:U.promise(U.object({changed:U.boolean(),files:U.array(U.string())}))},{name:"ensureWorktree",description:"\u786E\u4FDD\u5DE5\u5355\u5728\u6307\u5B9A\u4ED3\u5E93\u4E0A\u6709\u4E00\u4E2A worktree(\u57FA\u7840\u5E93\u53EA clone \u4E00\u6B21,\u5DF2\u5B58\u5728\u5219 fetch \u590D\u7528;worktree \u5E42\u7B49)",params:U.object({repoUrl:U.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:U.string().describe("\u5DE5\u5355 ID"),branch:U.string().describe("worktree \u5206\u652F\u540D"),options:U.object({baseRef:U.string().optional().describe("\u57FA\u51C6\u5206\u652F(\u7F3A\u7701\u53D6 origin/HEAD,\u518D\u56DE\u843D default_branch)"),depth:U.number().optional().describe("clone/fetch \u6DF1\u5EA6")}).optional()}),output:U.promise(U.object({dir:U.string(),workspaceDir:U.string(),branch:U.string(),reused:U.boolean(),baseRef:U.string()}))},{name:"removeWorktree",description:"\u6E05\u7406\u67D0\u5DE5\u5355\u5728\u67D0\u4ED3\u5E93\u7684 worktree(best-effort,\u57FA\u7840\u5E93\u4E0D\u5220\u9664)",params:U.object({repoUrl:U.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:U.string().describe("\u5DE5\u5355 ID")}),output:U.promise(U.void())}],permissions:[{method:"clone",description:"\u5141\u8BB8\u514B\u9686\u4ED3\u5E93\u5230\u672C\u5730"},{method:"createBranch",description:"\u5141\u8BB8\u521B\u5EFA\u65B0\u5206\u652F"},{method:"push",description:"\u5141\u8BB8\u63A8\u9001\u4EE3\u7801\u5230\u8FDC\u7A0B\u4ED3\u5E93"},{method:"commit",description:"\u5141\u8BB8\u6682\u5B58\u5E76\u63D0\u4EA4\u5DE5\u4F5C\u533A\u6539\u52A8"},{method:"ensureWorktree",description:"\u5141\u8BB8\u514B\u9686/fetch \u57FA\u7840\u5E93\u5E76\u521B\u5EFA worktree"},{method:"removeWorktree",description:"\u5141\u8BB8\u6E05\u7406\u5DE5\u5355 worktree"}]};import{z as oe}from"zod";var JS="a1",ZS=3e4;function YS(){return QS({a1Bin:JS,timeoutMs:ZS})}a(YS,"createCodeReviewToolkit");function QS(t){let e=t.runner??J,n=t.a1Bin,r=t.timeoutMs;async function o(i){let s=[...i,"--format","json"],c=s.slice(0,4).join(" "),l=Date.now();h.debug("codereview","a1 call",{cmd:c});let d=await e(n,s,{timeoutMs:r}),u=Date.now()-l;if(d.exitCode!==0){let p=XS(d.stderr),g=!ex(p);h.error("codereview","a1 command failed",{cmd:c,exitCode:d.exitCode,code:p,retryable:g,stderr:De(d.stderr),elapsed:u});let m=p?.startsWith("SYSTEM_CONFLICT")?"MR \u51B2\u7A81\uFF1A\u8BE5\u5206\u652F\u53EF\u80FD\u5DF2\u5B58\u5728 MR\uFF0C\u9700\u4EBA\u5DE5\u4ECB\u5165\u3002":"";throw new We(`${m}a1 failed (exit ${d.exitCode}): ${De(d.stderr)}`,{retryable:g,code:p})}h.debug("codereview","a1 call completed",{cmd:c,elapsed:u});let f=d.stdout.trim();if(!f)return{};try{return JSON.parse(f)}catch{throw new Error(`a1 returned invalid JSON: ${f.slice(0,200)}`)}}return a(o,"runA1Json"),{async createMR(i,s,c,l,d,u){h.info("codereview","createMR",{repo:i,source:s,target:c});let f=["repo","mr","create","--source",s,"--target",c,"--title",l,"--repo",i];d&&f.push("--description",d),u?.length&&f.push("--assignees",u.join(","));let p=await o(f);return tx(p)},async listUnresolvedComments(i,s){h.debug("codereview","listUnresolvedComments",{mrId:i,repoPath:s});let c=await o(["repo","mr","comment","list","--mr",i,"--repo",s,"--unresolved"]);return nx(c)},async isReadyToMerge(i,s){h.debug("codereview","isReadyToMerge",{mrId:i,repoPath:s});let c=await o(["repo","mr","status",i,"--repo",s]);return rx(c)},async isMerged(i,s){h.debug("codereview","isMerged",{mrId:i,repoPath:s});let c=await o(["repo","mr","view",i,"--repo",s]);return ox(c)}}}a(QS,"createCodeReviewToolkitFromConfig");function XS(t){return t.match(/"errorCode"\s*:\s*"([^"]+)"/)?.[1]}a(XS,"extractErrorCode");function ex(t){return t?t.startsWith("SYSTEM_CONFLICT")||t.startsWith("SYSTEM_ILLEGAL_ARGUMENT"):!1}a(ex,"isNonRetryableCode");function ki(t,e){if(S(t))for(let n of[t,t.data,t.body,t.result]){if(!S(n))continue;let r=e(n);if(r!==void 0)return r}}a(ki,"findInResponse");function tx(t){let e=ki(t,n=>{let r=n.mrId??n.mr_id??n.iid??n.id,o=n.mrUrl??n.mr_url??n.web_url??n.url;if(r!=null&&o!=null)return{mrId:String(r),mrUrl:String(o)}});if(e)return e;throw new Error(`a1 mr create: cannot find mrId/mrUrl in response: ${JSON.stringify(t).slice(0,200)}`)}a(tx,"extractMrInfo");function nx(t){let e=[];if(Array.isArray(t))e=t;else{let n=ki(t,r=>{let o=r.data??r.body??r.result??r.comments;return Array.isArray(o)?o:void 0});n&&(e=n)}return e.filter(S).map(n=>{let r=n;return{id:Number(r.id??0),note:String(r.note??r.body??""),author:String(r.author??r.author_name??""),path:typeof r.path=="string"?r.path:typeof r.file=="string"?r.file:null,line:typeof r.line=="number"?r.line:null,createdAt:String(r.createdAt??r.created_at??"")}})}a(nx,"parseComments");function rx(t){return ki(t,e=>{if(typeof e.readyToMerge=="boolean")return e.readyToMerge;if(typeof e.ready_to_merge=="boolean")return e.ready_to_merge;if(e.approve_check_result==="approved")return!0})??!1}a(rx,"extractReadyToMerge");function ox(t){return ki(t,e=>{let n=e.state??e.status??e.merge_status??e.mergeStatus;return typeof n=="string"?n.toLowerCase()==="merged":void 0})??!1}a(ox,"extractMerged");var Up={name:"codeReview",description:"MR \u751F\u547D\u5468\u671F\u7BA1\u7406:\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42\u3001\u67E5\u8BE2\u672A\u89E3\u51B3\u8BC4\u8BBA\u3001\u68C0\u67E5\u5408\u5E76\u5C31\u7EEA\u72B6\u6001\u3002",configSchema:oe.object({}).strict(),build:a(()=>YS(),"build"),methods:[{name:"createMR",description:"\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42(MR)",params:oe.object({repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84(group/project)"),sourceBranch:oe.string().describe("\u6E90\u5206\u652F"),targetBranch:oe.string().describe("\u76EE\u6807\u5206\u652F"),title:oe.string().describe("MR \u6807\u9898"),description:oe.string().optional().describe("MR \u63CF\u8FF0"),assignees:oe.array(oe.string()).optional().describe("\u8BC4\u5BA1\u4EBA\u82B1\u540D\u5217\u8868")}),output:oe.promise(oe.object({mrId:oe.string(),mrUrl:oe.string()}))},{name:"listUnresolvedComments",description:"\u67E5\u8BE2 MR \u4E0A\u672A\u89E3\u51B3\u7684\u8BC4\u8BBA",params:oe.object({mrId:oe.string().describe("MR ID"),repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:oe.promise(oe.array(oe.object({id:oe.number(),note:oe.string(),author:oe.string(),path:oe.string().nullable(),line:oe.number().nullable(),createdAt:oe.string()})))},{name:"isReadyToMerge",description:"\u68C0\u67E5 MR \u662F\u5426\u6EE1\u8DB3\u5408\u5E76\u6761\u4EF6",params:oe.object({mrId:oe.string().describe("MR ID"),repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:oe.promise(oe.boolean())},{name:"isMerged",description:"\u68C0\u67E5 MR \u662F\u5426\u5DF2\u7ECF\u5408\u5E76\uFF08\u53EA\u8BFB\uFF09",params:oe.object({mrId:oe.string().describe("MR ID"),repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:oe.promise(oe.boolean())}],permissions:[{method:"createMR",description:"\u5141\u8BB8\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42"}]};import{z as Re}from"zod";var ix="a1",sx=3e4;function ax(){return cx({a1Bin:ix,timeoutMs:sx})}a(ax,"createCIToolkit");function cx(t){let e=t.runner??J,n=t.a1Bin,r=t.timeoutMs,o=300;async function i(c,l){let d=l?.json?[...c,"--format","json"]:c,u=d.slice(0,4).join(" "),f=Date.now();h.debug("ci","a1 call",{cmd:u});let p=await e(n,d,{timeoutMs:r}),g=Date.now()-f;if(p.exitCode!==0)throw h.error("ci","a1 command failed",{cmd:u,exitCode:p.exitCode,stderr:De(p.stderr),elapsed:g}),new We(`a1 failed (exit ${p.exitCode}): ${De(p.stderr)}`,{retryable:!0});return h.debug("ci","a1 call completed",{cmd:u,elapsed:g}),p}a(i,"runA1");async function s(c){let d=(await i(c,{json:!0})).stdout.trim();if(!d)return{};try{return JSON.parse(d)}catch{throw new Error(`a1 returned invalid JSON: ${d.slice(0,o)}`)}}return a(s,"runA1Json"),{async triggerPipeline(c,l){h.info("ci","triggerPipeline",{pipelineId:c,branch:l});let d=await s(["ci","pipeline","run",c,"-b",l]);return ux(d)},async getRunStatus(c){h.debug("ci","getRunStatus",{runId:c});let l=await s(["ci","run","get",c]);return{runId:c,status:fx(l)}},async getJobLog(c,l,d){h.debug("ci","getJobLog",{jobId:c,runId:l,step:d});let u=["ci","job","log",c,"--run",l];return d&&u.push("--step",d),(await i(u)).stdout}}}a(cx,"createCIToolkitFromConfig");var lx=new Set(["running","success","failed","pending","cancelled"]);function dx(t){let e=t.toLowerCase();return lx.has(e)?e:e==="passed"||e==="completed"?"success":e==="error"||e==="failure"?"failed":e==="queued"||e==="waiting"||e==="created"?"pending":"unknown"}a(dx,"normalizeStatus");function ux(t){if(!S(t))throw new Error("a1 ci pipeline run: unexpected response format");for(let e of[t,t.data,t.body,t.result]){if(!S(e))continue;let n=e,r=n.runId??n.run_id??n.id??n.pipelineRunId;if(typeof r=="string"&&r)return{runId:r};if(typeof r=="number")return{runId:String(r)}}throw new Error(`a1 ci pipeline run: cannot find runId in response: ${JSON.stringify(t).slice(0,200)}`)}a(ux,"extractRunId");function fx(t){if(!S(t))return"unknown";for(let e of[t,t.data,t.body,t.result])if(S(e)){let n=e;if(typeof n.status=="string")return dx(n.status)}return"unknown"}a(fx,"extractStatus");var Kp={name:"ci",description:"CI/CD \u6D41\u6C34\u7EBF\u7BA1\u7406:\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C\u3001\u67E5\u8BE2\u6784\u5EFA\u72B6\u6001\u3001\u62C9\u53D6 Job \u65E5\u5FD7\u3002",configSchema:Re.object({}).strict(),build:a(()=>ax(),"build"),methods:[{name:"triggerPipeline",description:"\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C",params:Re.object({pipelineId:Re.string().describe("\u6D41\u6C34\u7EBF ID"),branch:Re.string().describe("\u89E6\u53D1\u5206\u652F")}),output:Re.promise(Re.object({runId:Re.string()}))},{name:"getRunStatus",description:"\u67E5\u8BE2\u6784\u5EFA\u8FD0\u884C\u72B6\u6001",params:Re.object({runId:Re.string().describe("\u8FD0\u884C ID")}),output:Re.promise(Re.object({runId:Re.string(),status:Re.enum(["running","success","failed","pending","cancelled","unknown"])}))},{name:"getJobLog",description:"\u62C9\u53D6 Job \u65E5\u5FD7(\u539F\u59CB\u6587\u672C)",params:Re.object({jobId:Re.string().describe("Job ID"),runId:Re.string().describe("\u8FD0\u884C ID"),step:Re.string().optional().describe("\u6307\u5B9A Step \u540D\u79F0")}),output:Re.promise(Re.string())}],permissions:[{method:"triggerPipeline",description:"\u5141\u8BB8\u89E6\u53D1 CI \u6D41\u6C34\u7EBF"}]};import{z as at}from"zod";import Vp from"path";import xc from"fs/promises";function px(t,e){try{return $e(t,e,{allowRoot:!1})}catch(n){throw n instanceof ue&&n.reason==="ABSOLUTE_PATH"?new Error(`file toolkit: \u7981\u6B62\u7EDD\u5BF9\u8DEF\u5F84 (${e})`):new Error(`file toolkit: \u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5\uFF0C\u7981\u6B62\u8BBF\u95EE base_dir \u4E4B\u5916 (${e})`)}}a(px,"resolveInBase");function gx(t,e){let n=t.base_dir?Vp.resolve(e.settings.configDir,t.base_dir):void 0;function r(){if(!n)throw new Error("file toolkit: \u672A\u914D\u7F6E base_dir\uFF08\u8BF7\u5728 step.config.file.base_dir \u6307\u5B9A\u5199\u5165\u6839\u76EE\u5F55\uFF09");return n}a(r,"requireBase");async function o(i,s,c){let l=px(r(),i);await xc.mkdir(Vp.dirname(l),{recursive:!0}),c==="append"?await xc.appendFile(l,s,"utf8"):await xc.writeFile(l,s,"utf8"),h.info("file",`${c} \u5B8C\u6210`,{path:i,bytes:Buffer.byteLength(s,"utf8")})}return a(o,"put"),{async append(i,s){await o(i,s,"append")},async write(i,s){await o(i,s,"write")}}}a(gx,"createFileToolkit");var mx=at.object({base_dir:at.string().min(1).optional().describe("\u5199\u5165\u6839\u76EE\u5F55\uFF08jail \u8FB9\u754C\uFF09\uFF0C\u76F8\u5BF9 configDir \u89E3\u6790")}).strict(),qp={name:"file",description:"\u53D7\u9650\u76EE\u5F55\u6587\u4EF6\u5199\u5165\uFF1A\u5728 base_dir \u5185 append/write \u6587\u4EF6\uFF08jail \u9632\u8D8A\u6743\uFF09\uFF0C\u4F9B\u8FD0\u884C\u65F6\u6C89\u6DC0\u6570\u636E\u3002",configSchema:mx,build:a((t,e)=>gx(t,e),"build"),methods:[{name:"append",description:"\u5411 base_dir \u5185\u7684\u76F8\u5BF9\u8DEF\u5F84\u8FFD\u52A0\u5185\u5BB9\uFF08\u6587\u4EF6\u4E0D\u5B58\u5728\u5219\u521B\u5EFA\uFF09",params:at.object({path:at.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:at.string().describe("\u8981\u8FFD\u52A0\u7684\u5185\u5BB9")}),output:at.promise(at.void())},{name:"write",description:"\u8986\u76D6/\u521B\u5EFA\u5199\u5165 base_dir \u5185\u7684\u76F8\u5BF9\u8DEF\u5F84\u6587\u4EF6",params:at.object({path:at.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:at.string().describe("\u8981\u5199\u5165\u7684\u5185\u5BB9")}),output:at.promise(at.void())}]};import Xp from"path";import{z as N}from"zod";import X from"fs";import Me from"path";import{createHash as hx}from"crypto";function Ic(t){let e={channel:t.channel,scenario:t.scenario};return t.tenantId!=null&&(e.tenantId=t.tenantId),t.baseId!=null&&(e.baseId=t.baseId),t.groupId!=null&&(e.groupId=t.groupId),t.conversationId!=null&&(e.conversationId=t.conversationId),t.roleId!=null&&(e.roleId=t.roleId),e}a(Ic,"normalizeScope");function yx(t){let e=Ic(t),n=JSON.stringify(e,Object.keys(e).sort());return hx("sha256").update(n).digest("hex").slice(0,16)}a(yx,"scopeHash");function Jt(t){if(typeof t=="string"){if(!/^[0-9a-f]{1,64}$/.test(t))throw new Error(`\u65E0\u6548\u7684 scope hash: "${t}"\uFF08\u53EA\u5141\u8BB8\u5341\u516D\u8FDB\u5236\u5B57\u7B26\uFF09`);return t}return yx(t)}a(Jt,"resolveScopeHash");var wx=30,bx=365;function kx(t){let e=Date.parse(t);return Number.isFinite(e)?new Date(e):null}a(kx,"parseBlockDate");function Hp(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0,0)}a(Hp,"startOfDay");function vx(t,e){return Math.floor((Hp(t).getTime()-Hp(e).getTime())/(1440*60*1e3))}a(vx,"diffDays");function Gp(t,e){let n=t.map(c=>c.timestamp).filter(c=>Date.parse(c)>0),r=n.length>0?n[0]:t[0]?.timestamp??new Date().toISOString(),o=t.map(c=>c.body.trim()).filter(c=>c.length>0).join(`
275
+ `).filter(p=>p.trim().length>0).map(p=>p.slice(3).trim());return{changed:f.length>0,files:f}},async ensureWorktree(d,u,f,p){let g=p?.depth??t.cloneDepth,m=Bp(d),y=Gt.join(o,"repos",m),w=Gt.join(o,"worktrees",Pe(u,{fallback:"item"})),b=Gt.join(w,m);return c(m,async()=>{if(await Wp(Gt.join(o,"repos"),{recursive:!0}),await Wp(w,{recursive:!0}),(await e(n,["-C",y,"rev-parse","--git-dir"],{timeoutMs:r})).exitCode===0){h.info("git","ensureWorktree: \u590D\u7528\u57FA\u7840\u5E93",{repoKey:m,baseDir:y});let k=await e(n,["-C",y,"fetch","--depth",String(g),"origin"],{timeoutMs:r});k.exitCode!==0&&h.warn("git","fetch \u5931\u8D25,\u4F7F\u7528\u73B0\u6709\u57FA\u7840\u5E93\u72B6\u6001",{repoKey:m,stderr:k.stderr.slice(0,200)})}else h.info("git","ensureWorktree: \u514B\u9686\u57FA\u7840\u5E93",{repoUrl:d,baseDir:y,depth:g}),await l(["clone","--depth",String(g),"--single-branch",d,y]);let I=p?.baseRef;if(!I){let k=await e(n,["-C",y,"rev-parse","--abbrev-ref","origin/HEAD"],{timeoutMs:r});I=k.exitCode===0&&k.stdout.trim()?k.stdout.trim():i}if((await l(["-C",y,"worktree","list","--porcelain"])).includes(b))return h.info("git","ensureWorktree: \u590D\u7528\u5DF2\u5B58\u5728 worktree",{wtDir:b,branch:f}),{dir:b,workspaceDir:w,branch:f,reused:!0,baseRef:I};h.info("git","ensureWorktree: \u521B\u5EFA worktree",{wtDir:b,branch:f,baseRef:I});try{await l(["-C",y,"worktree","add",b,"-b",f,I])}catch(k){h.warn("git","worktree add -b \u5931\u8D25,\u56DE\u843D\u5230\u5DF2\u6709\u5206\u652F",{branch:f,error:String(k)}),await l(["-C",y,"worktree","add",b,f])}return{dir:b,workspaceDir:w,branch:f,reused:!1,baseRef:I}})},async removeWorktree(d,u){let f=Bp(d),p=Gt.join(o,"repos",f),g=Gt.join(o,"worktrees",Pe(u,{fallback:"item"}),f);await c(f,async()=>{try{await l(["-C",p,"worktree","remove",g,"--force"])}catch(m){h.warn("git","worktree remove \u5931\u8D25(\u5FFD\u7565)",{wtDir:g,error:String(m)})}try{await l(["-C",p,"worktree","prune"])}catch{}})}}}a(HS,"createGitToolkitFromConfig");function Bp(t){return t.trim().replace(/\.git$/i,"").replace(/^[a-z][a-z0-9+.-]*:\/\//i,"").replace(/^[^@/]+@/,"").replace(/:/g,"/").replace(/[^a-zA-Z0-9._-]+/g,"_").replace(/^_+|_+$/g,"")||"repo"}a(Bp,"repoKeyFromUrl");var GS=U.object({root:U.string().optional().describe("\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55(\u76F8\u5BF9\u8DEF\u5F84\u76F8\u5BF9 configDir)"),default_branch:U.string().optional().describe("worktree \u57FA\u51C6\u5206\u652F\u56DE\u843D\u503C"),clone_depth:U.number().optional().describe("\u9ED8\u8BA4 clone \u6DF1\u5EA6")}).strict(),zp={name:"git",description:"Git \u5DE5\u4F5C\u7A7A\u95F4\u7BA1\u7406:clone \u4ED3\u5E93\u3001\u521B\u5EFA/\u5207\u6362\u5206\u652F\u3001push\u3001diff \u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u3002",configSchema:GS,build(t,e){return HS({gitBin:US,timeoutMs:KS,cloneDepth:t.clone_depth??VS,workspaceRoot:t.root?Gt.resolve(e.settings.configDir,t.root):Gt.resolve(e.settings.configDir,".workspace"),defaultBranch:t.default_branch??qS})},methods:[{name:"clone",description:"\u514B\u9686\u8FDC\u7A0B\u4ED3\u5E93\u5230\u672C\u5730\u76EE\u5F55",params:U.object({repoUrl:U.string().describe("\u4ED3\u5E93\u5730\u5740"),targetDir:U.string().describe("\u672C\u5730\u76EE\u6807\u76EE\u5F55"),options:U.object({depth:U.number().optional()}).optional()}),output:U.promise(U.void())},{name:"createBranch",description:"\u57FA\u4E8E\u5F53\u524D\u6216\u6307\u5B9A\u5206\u652F\u521B\u5EFA\u65B0\u5206\u652F",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branchName:U.string().describe("\u65B0\u5206\u652F\u540D"),baseBranch:U.string().optional().describe("\u57FA\u7840\u5206\u652F")}),output:U.promise(U.void())},{name:"currentBranch",description:"\u83B7\u53D6\u5F53\u524D\u5206\u652F\u540D",params:U.object({repoDir:U.string()}),output:U.promise(U.string())},{name:"push",description:"\u63A8\u9001\u5206\u652F\u5230\u8FDC\u7A0B",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branch:U.string().optional().describe("\u5206\u652F\u540D(\u7F3A\u7701\u53D6\u5F53\u524D\u5206\u652F)")}),output:U.promise(U.void())},{name:"commit",description:"\u6682\u5B58(add -A)\u5E76\u63D0\u4EA4\u5DE5\u4F5C\u533A\u6539\u52A8;\u65E0\u6539\u52A8\u5219\u8DF3\u8FC7",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),message:U.string().describe("\u63D0\u4EA4\u4FE1\u606F")}),output:U.promise(U.object({committed:U.boolean()}))},{name:"diff",description:"\u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u5217\u8868\u53CA\u6458\u8981",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55"),baseBranch:U.string().optional().describe("\u5BF9\u6BD4\u57FA\u51C6\u5206\u652F")}),output:U.promise(U.object({files:U.array(U.string()),summary:U.string()}))},{name:"status",description:"\u67E5\u770B\u5DE5\u4F5C\u533A\u662F\u5426\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF08\u542B\u672A\u8DDF\u8E2A\u65B0\u6587\u4EF6\uFF09",params:U.object({repoDir:U.string().describe("\u4ED3\u5E93\u76EE\u5F55")}),output:U.promise(U.object({changed:U.boolean(),files:U.array(U.string())}))},{name:"ensureWorktree",description:"\u786E\u4FDD\u5DE5\u5355\u5728\u6307\u5B9A\u4ED3\u5E93\u4E0A\u6709\u4E00\u4E2A worktree(\u57FA\u7840\u5E93\u53EA clone \u4E00\u6B21,\u5DF2\u5B58\u5728\u5219 fetch \u590D\u7528;worktree \u5E42\u7B49)",params:U.object({repoUrl:U.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:U.string().describe("\u5DE5\u5355 ID"),branch:U.string().describe("worktree \u5206\u652F\u540D"),options:U.object({baseRef:U.string().optional().describe("\u57FA\u51C6\u5206\u652F(\u7F3A\u7701\u53D6 origin/HEAD,\u518D\u56DE\u843D default_branch)"),depth:U.number().optional().describe("clone/fetch \u6DF1\u5EA6")}).optional()}),output:U.promise(U.object({dir:U.string(),workspaceDir:U.string(),branch:U.string(),reused:U.boolean(),baseRef:U.string()}))},{name:"removeWorktree",description:"\u6E05\u7406\u67D0\u5DE5\u5355\u5728\u67D0\u4ED3\u5E93\u7684 worktree(best-effort,\u57FA\u7840\u5E93\u4E0D\u5220\u9664)",params:U.object({repoUrl:U.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:U.string().describe("\u5DE5\u5355 ID")}),output:U.promise(U.void())}],permissions:[{method:"clone",description:"\u5141\u8BB8\u514B\u9686\u4ED3\u5E93\u5230\u672C\u5730"},{method:"createBranch",description:"\u5141\u8BB8\u521B\u5EFA\u65B0\u5206\u652F"},{method:"push",description:"\u5141\u8BB8\u63A8\u9001\u4EE3\u7801\u5230\u8FDC\u7A0B\u4ED3\u5E93"},{method:"commit",description:"\u5141\u8BB8\u6682\u5B58\u5E76\u63D0\u4EA4\u5DE5\u4F5C\u533A\u6539\u52A8"},{method:"ensureWorktree",description:"\u5141\u8BB8\u514B\u9686/fetch \u57FA\u7840\u5E93\u5E76\u521B\u5EFA worktree"},{method:"removeWorktree",description:"\u5141\u8BB8\u6E05\u7406\u5DE5\u5355 worktree"}]};import{z as oe}from"zod";var JS="a1",ZS=3e4;function YS(){return QS({a1Bin:JS,timeoutMs:ZS})}a(YS,"createCodeReviewToolkit");function QS(t){let e=t.runner??J,n=t.a1Bin,r=t.timeoutMs;async function o(i){let s=[...i,"--format","json"],c=s.slice(0,4).join(" "),l=Date.now();h.debug("codereview","a1 call",{cmd:c});let d=await e(n,s,{timeoutMs:r}),u=Date.now()-l;if(d.exitCode!==0){let p=XS(d.stderr),g=!ex(p);h.error("codereview","a1 command failed",{cmd:c,exitCode:d.exitCode,code:p,retryable:g,stderr:De(d.stderr),elapsed:u});let m=p?.startsWith("SYSTEM_CONFLICT")?"MR \u51B2\u7A81\uFF1A\u8BE5\u5206\u652F\u53EF\u80FD\u5DF2\u5B58\u5728 MR\uFF0C\u9700\u4EBA\u5DE5\u4ECB\u5165\u3002":"";throw new We(`${m}a1 failed (exit ${d.exitCode}): ${De(d.stderr)}`,{retryable:g,code:p})}h.debug("codereview","a1 call completed",{cmd:c,elapsed:u});let f=d.stdout.trim();if(!f)return{};try{return JSON.parse(f)}catch{throw new Error(`a1 returned invalid JSON: ${f.slice(0,200)}`)}}return a(o,"runA1Json"),{async createMR(i,s,c,l,d,u){h.info("codereview","createMR",{repo:i,source:s,target:c});let f=["repo","mr","create","--source",s,"--target",c,"--title",l,"--repo",i];d&&f.push("--description",d),u?.length&&f.push("--assignees",u.join(","));let p=await o(f);return tx(p)},async listUnresolvedComments(i,s){h.debug("codereview","listUnresolvedComments",{mrId:i,repoPath:s});let c=await o(["repo","mr","comment","list","--mr",i,"--repo",s,"--unresolved"]);return nx(c)},async isReadyToMerge(i,s){h.debug("codereview","isReadyToMerge",{mrId:i,repoPath:s});let c=await o(["repo","mr","status",i,"--repo",s]);return rx(c)},async isMerged(i,s){h.debug("codereview","isMerged",{mrId:i,repoPath:s});let c=await o(["repo","mr","view",i,"--repo",s]);return ox(c)}}}a(QS,"createCodeReviewToolkitFromConfig");function XS(t){return t.match(/"errorCode"\s*:\s*"([^"]+)"/)?.[1]}a(XS,"extractErrorCode");function ex(t){return t?t.startsWith("SYSTEM_CONFLICT")||t.startsWith("SYSTEM_ILLEGAL_ARGUMENT"):!1}a(ex,"isNonRetryableCode");function ki(t,e){if(!v(t))return;let n=[t,t.data,t.body,t.result];for(let r of n)if(v(r))for(let o of[r,r.mergeRequest,r.merge_request]){if(!v(o))continue;let i=e(o);if(i!==void 0)return i}}a(ki,"findInResponse");function tx(t){let e=ki(t,n=>{let r=n.mrId??n.mr_id??n.id??n.iid,o=n.mrUrl??n.mr_url??n.detailUrl??n.detail_url??n.webUrl??n.web_url??n.url;if(r!=null&&o!=null)return{mrId:String(r),mrUrl:String(o)}});if(e)return e;throw new Error(`a1 mr create: cannot find mrId/mrUrl in response: ${JSON.stringify(t).slice(0,200)}`)}a(tx,"extractMrInfo");function nx(t){let e=[];if(Array.isArray(t))e=t;else{let n=ki(t,r=>{let o=r.data??r.body??r.result??r.comments;return Array.isArray(o)?o:void 0});n&&(e=n)}return e.filter(v).map(n=>{let r=n;return{id:Number(r.id??0),note:String(r.note??r.body??""),author:String(r.author??r.author_name??""),path:typeof r.path=="string"?r.path:typeof r.file=="string"?r.file:null,line:typeof r.line=="number"?r.line:null,createdAt:String(r.createdAt??r.created_at??"")}})}a(nx,"parseComments");function rx(t){return ki(t,e=>{if(typeof e.readyToMerge=="boolean")return e.readyToMerge;if(typeof e.ready_to_merge=="boolean")return e.ready_to_merge;if(e.approve_check_result==="approved")return!0})??!1}a(rx,"extractReadyToMerge");function ox(t){return ki(t,e=>{let n=e.state??e.status??e.merge_status??e.mergeStatus;return typeof n=="string"?n.toLowerCase()==="merged":void 0})??!1}a(ox,"extractMerged");var Up={name:"codeReview",description:"MR \u751F\u547D\u5468\u671F\u7BA1\u7406:\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42\u3001\u67E5\u8BE2\u672A\u89E3\u51B3\u8BC4\u8BBA\u3001\u68C0\u67E5\u5408\u5E76\u5C31\u7EEA\u72B6\u6001\u3002",configSchema:oe.object({}).strict(),build:a(()=>YS(),"build"),methods:[{name:"createMR",description:"\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42(MR)",params:oe.object({repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84(group/project)"),sourceBranch:oe.string().describe("\u6E90\u5206\u652F"),targetBranch:oe.string().describe("\u76EE\u6807\u5206\u652F"),title:oe.string().describe("MR \u6807\u9898"),description:oe.string().optional().describe("MR \u63CF\u8FF0"),assignees:oe.array(oe.string()).optional().describe("\u8BC4\u5BA1\u4EBA\u82B1\u540D\u5217\u8868")}),output:oe.promise(oe.object({mrId:oe.string(),mrUrl:oe.string()}))},{name:"listUnresolvedComments",description:"\u67E5\u8BE2 MR \u4E0A\u672A\u89E3\u51B3\u7684\u8BC4\u8BBA",params:oe.object({mrId:oe.string().describe("MR ID"),repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:oe.promise(oe.array(oe.object({id:oe.number(),note:oe.string(),author:oe.string(),path:oe.string().nullable(),line:oe.number().nullable(),createdAt:oe.string()})))},{name:"isReadyToMerge",description:"\u68C0\u67E5 MR \u662F\u5426\u6EE1\u8DB3\u5408\u5E76\u6761\u4EF6",params:oe.object({mrId:oe.string().describe("MR ID"),repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:oe.promise(oe.boolean())},{name:"isMerged",description:"\u68C0\u67E5 MR \u662F\u5426\u5DF2\u7ECF\u5408\u5E76\uFF08\u53EA\u8BFB\uFF09",params:oe.object({mrId:oe.string().describe("MR ID"),repoPath:oe.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:oe.promise(oe.boolean())}],permissions:[{method:"createMR",description:"\u5141\u8BB8\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42"}]};import{z as Re}from"zod";var ix="a1",sx=3e4;function ax(){return cx({a1Bin:ix,timeoutMs:sx})}a(ax,"createCIToolkit");function cx(t){let e=t.runner??J,n=t.a1Bin,r=t.timeoutMs,o=300;async function i(c,l){let d=l?.json?[...c,"--format","json"]:c,u=d.slice(0,4).join(" "),f=Date.now();h.debug("ci","a1 call",{cmd:u});let p=await e(n,d,{timeoutMs:r}),g=Date.now()-f;if(p.exitCode!==0)throw h.error("ci","a1 command failed",{cmd:u,exitCode:p.exitCode,stderr:De(p.stderr),elapsed:g}),new We(`a1 failed (exit ${p.exitCode}): ${De(p.stderr)}`,{retryable:!0});return h.debug("ci","a1 call completed",{cmd:u,elapsed:g}),p}a(i,"runA1");async function s(c){let d=(await i(c,{json:!0})).stdout.trim();if(!d)return{};try{return JSON.parse(d)}catch{throw new Error(`a1 returned invalid JSON: ${d.slice(0,o)}`)}}return a(s,"runA1Json"),{async triggerPipeline(c,l){h.info("ci","triggerPipeline",{pipelineId:c,branch:l});let d=await s(["ci","pipeline","run",c,"-b",l]);return ux(d)},async getRunStatus(c){h.debug("ci","getRunStatus",{runId:c});let l=await s(["ci","run","get",c]);return{runId:c,status:fx(l)}},async getJobLog(c,l,d){h.debug("ci","getJobLog",{jobId:c,runId:l,step:d});let u=["ci","job","log",c,"--run",l];return d&&u.push("--step",d),(await i(u)).stdout}}}a(cx,"createCIToolkitFromConfig");var lx=new Set(["running","success","failed","pending","cancelled"]);function dx(t){let e=t.toLowerCase();return lx.has(e)?e:e==="passed"||e==="completed"?"success":e==="error"||e==="failure"?"failed":e==="queued"||e==="waiting"||e==="created"?"pending":"unknown"}a(dx,"normalizeStatus");function ux(t){if(!v(t))throw new Error("a1 ci pipeline run: unexpected response format");for(let e of[t,t.data,t.body,t.result]){if(!v(e))continue;let n=e,r=n.runId??n.run_id??n.id??n.pipelineRunId;if(typeof r=="string"&&r)return{runId:r};if(typeof r=="number")return{runId:String(r)}}throw new Error(`a1 ci pipeline run: cannot find runId in response: ${JSON.stringify(t).slice(0,200)}`)}a(ux,"extractRunId");function fx(t){if(!v(t))return"unknown";for(let e of[t,t.data,t.body,t.result])if(v(e)){let n=e;if(typeof n.status=="string")return dx(n.status)}return"unknown"}a(fx,"extractStatus");var Kp={name:"ci",description:"CI/CD \u6D41\u6C34\u7EBF\u7BA1\u7406:\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C\u3001\u67E5\u8BE2\u6784\u5EFA\u72B6\u6001\u3001\u62C9\u53D6 Job \u65E5\u5FD7\u3002",configSchema:Re.object({}).strict(),build:a(()=>ax(),"build"),methods:[{name:"triggerPipeline",description:"\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C",params:Re.object({pipelineId:Re.string().describe("\u6D41\u6C34\u7EBF ID"),branch:Re.string().describe("\u89E6\u53D1\u5206\u652F")}),output:Re.promise(Re.object({runId:Re.string()}))},{name:"getRunStatus",description:"\u67E5\u8BE2\u6784\u5EFA\u8FD0\u884C\u72B6\u6001",params:Re.object({runId:Re.string().describe("\u8FD0\u884C ID")}),output:Re.promise(Re.object({runId:Re.string(),status:Re.enum(["running","success","failed","pending","cancelled","unknown"])}))},{name:"getJobLog",description:"\u62C9\u53D6 Job \u65E5\u5FD7(\u539F\u59CB\u6587\u672C)",params:Re.object({jobId:Re.string().describe("Job ID"),runId:Re.string().describe("\u8FD0\u884C ID"),step:Re.string().optional().describe("\u6307\u5B9A Step \u540D\u79F0")}),output:Re.promise(Re.string())}],permissions:[{method:"triggerPipeline",description:"\u5141\u8BB8\u89E6\u53D1 CI \u6D41\u6C34\u7EBF"}]};import{z as at}from"zod";import Vp from"path";import xc from"fs/promises";function px(t,e){try{return $e(t,e,{allowRoot:!1})}catch(n){throw n instanceof ue&&n.reason==="ABSOLUTE_PATH"?new Error(`file toolkit: \u7981\u6B62\u7EDD\u5BF9\u8DEF\u5F84 (${e})`):new Error(`file toolkit: \u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5\uFF0C\u7981\u6B62\u8BBF\u95EE base_dir \u4E4B\u5916 (${e})`)}}a(px,"resolveInBase");function gx(t,e){let n=t.base_dir?Vp.resolve(e.settings.configDir,t.base_dir):void 0;function r(){if(!n)throw new Error("file toolkit: \u672A\u914D\u7F6E base_dir\uFF08\u8BF7\u5728 step.config.file.base_dir \u6307\u5B9A\u5199\u5165\u6839\u76EE\u5F55\uFF09");return n}a(r,"requireBase");async function o(i,s,c){let l=px(r(),i);await xc.mkdir(Vp.dirname(l),{recursive:!0}),c==="append"?await xc.appendFile(l,s,"utf8"):await xc.writeFile(l,s,"utf8"),h.info("file",`${c} \u5B8C\u6210`,{path:i,bytes:Buffer.byteLength(s,"utf8")})}return a(o,"put"),{async append(i,s){await o(i,s,"append")},async write(i,s){await o(i,s,"write")}}}a(gx,"createFileToolkit");var mx=at.object({base_dir:at.string().min(1).optional().describe("\u5199\u5165\u6839\u76EE\u5F55\uFF08jail \u8FB9\u754C\uFF09\uFF0C\u76F8\u5BF9 configDir \u89E3\u6790")}).strict(),qp={name:"file",description:"\u53D7\u9650\u76EE\u5F55\u6587\u4EF6\u5199\u5165\uFF1A\u5728 base_dir \u5185 append/write \u6587\u4EF6\uFF08jail \u9632\u8D8A\u6743\uFF09\uFF0C\u4F9B\u8FD0\u884C\u65F6\u6C89\u6DC0\u6570\u636E\u3002",configSchema:mx,build:a((t,e)=>gx(t,e),"build"),methods:[{name:"append",description:"\u5411 base_dir \u5185\u7684\u76F8\u5BF9\u8DEF\u5F84\u8FFD\u52A0\u5185\u5BB9\uFF08\u6587\u4EF6\u4E0D\u5B58\u5728\u5219\u521B\u5EFA\uFF09",params:at.object({path:at.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:at.string().describe("\u8981\u8FFD\u52A0\u7684\u5185\u5BB9")}),output:at.promise(at.void())},{name:"write",description:"\u8986\u76D6/\u521B\u5EFA\u5199\u5165 base_dir \u5185\u7684\u76F8\u5BF9\u8DEF\u5F84\u6587\u4EF6",params:at.object({path:at.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:at.string().describe("\u8981\u5199\u5165\u7684\u5185\u5BB9")}),output:at.promise(at.void())}]};import Xp from"path";import{z as N}from"zod";import X from"fs";import Me from"path";import{createHash as hx}from"crypto";function Ic(t){let e={channel:t.channel,scenario:t.scenario};return t.tenantId!=null&&(e.tenantId=t.tenantId),t.baseId!=null&&(e.baseId=t.baseId),t.groupId!=null&&(e.groupId=t.groupId),t.conversationId!=null&&(e.conversationId=t.conversationId),t.roleId!=null&&(e.roleId=t.roleId),e}a(Ic,"normalizeScope");function yx(t){let e=Ic(t),n=JSON.stringify(e,Object.keys(e).sort());return hx("sha256").update(n).digest("hex").slice(0,16)}a(yx,"scopeHash");function Jt(t){if(typeof t=="string"){if(!/^[0-9a-f]{1,64}$/.test(t))throw new Error(`\u65E0\u6548\u7684 scope hash: "${t}"\uFF08\u53EA\u5141\u8BB8\u5341\u516D\u8FDB\u5236\u5B57\u7B26\uFF09`);return t}return yx(t)}a(Jt,"resolveScopeHash");var wx=30,bx=365;function kx(t){let e=Date.parse(t);return Number.isFinite(e)?new Date(e):null}a(kx,"parseBlockDate");function Hp(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0,0)}a(Hp,"startOfDay");function vx(t,e){return Math.floor((Hp(t).getTime()-Hp(e).getTime())/(1440*60*1e3))}a(vx,"diffDays");function Gp(t,e){let n=t.map(c=>c.timestamp).filter(c=>Date.parse(c)>0),r=n.length>0?n[0]:t[0]?.timestamp??new Date().toISOString(),o=t.map(c=>c.body.trim()).filter(c=>c.length>0).join(`
276
276
 
277
277
  `),i=4e3,s=o.length>i?o.slice(0,i)+`
278
278
 
@@ -301,21 +301,21 @@ ${n}`,X.writeFileSync(e.longTermFile,i+`
301
301
  `).filter(s=>s.trim().length>0),o=[],i=0;for(let s of r)try{let c=JSON.parse(s);c&&typeof c.timestamp=="string"?o.push(c):i++}catch{i++}return{entries:o,errors:i}}filterEntries(e,n){let r=e;if(n?.kinds&&n.kinds.length>0){let o=new Set(n.kinds);r=r.filter(i=>o.has(i.kind))}return n?.since&&(r=r.filter(o=>o.timestamp>=n.since)),n?.until&&(r=r.filter(o=>o.timestamp<=n.until)),n?.limit!=null&&n.limit>0&&(r=r.slice(-n.limit)),r}writeJsonl(e,n){let r=n.map(o=>JSON.stringify(o)).join(`
302
302
  `);X.writeFileSync(e,r?`${r}
303
303
  `:"","utf-8")}cleanExpiredArchives(e){if(e<=0||!X.existsSync(this.rootDir))return 0;let n=Date.now()-e*24*60*60*1e3,r=0;for(let o of X.readdirSync(this.rootDir,{withFileTypes:!0})){if(!o.isDirectory())continue;let i=Me.join(this.rootDir,o.name,"archive");if(X.existsSync(i))for(let s of X.readdirSync(i)){let c=Me.join(i,s);X.statSync(c).mtimeMs<n&&(X.unlinkSync(c),r++)}}return r}};import pt from"fs";import Cc from"path";import ft from"fs";import Jp from"path";var Zp=300*1e3;function Si(t){let e=Jp.join(t.locksDir,"compact.lock");if(ft.mkdirSync(t.locksDir,{recursive:!0}),ft.existsSync(e))try{let n=JSON.parse(ft.readFileSync(e,"utf-8"));if(Date.now()-n.timestamp<Zp)return null;ft.unlinkSync(e)}catch{try{ft.unlinkSync(e)}catch{}}try{let n=ft.openSync(e,"wx"),r={pid:process.pid,timestamp:Date.now()};ft.writeSync(n,JSON.stringify(r)),ft.closeSync(n)}catch(n){if(n instanceof Error&&"code"in n&&n.code==="EEXIST")return null;throw n}return()=>{try{ft.unlinkSync(e)}catch{}}}a(Si,"acquireLock");function Rc(t){let e=Jp.join(t.locksDir,"compact.lock");if(!ft.existsSync(e))return!1;try{let n=JSON.parse(ft.readFileSync(e,"utf-8"));return!(Date.now()-n.timestamp>=Zp)}catch{return!1}}a(Rc,"isLocked");async function Yp(t,e,n){if(n.sourceScopes&&n.sourceScopes.length>0)return xx(t,e,n);let r=t.ensureScopeDir(e),o=n.archive??!0,i=Si(r);if(!i)throw new Error(`scope ${Jt(e)} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);try{let s,c;if(n.entries)s=n.entries;else{if(c=t.moveToProcessing(r),!c)return{entryCount:0,summary:n.summary};s=xi(c)}if(s.length===0)return c&&pt.existsSync(c)&&pt.unlinkSync(c),{entryCount:0,summary:n.summary};t.appendLongTerm(r,n.summary);let l;return o?c&&(l=t.archiveProcessing(r,c)):c&&pt.existsSync(c)&&t.rollbackFromProcessing(r,c),n.entries&&n.clearShortTerm===!0&&t.clearShortTerm(r),{entryCount:s.length,summary:n.summary,archivePath:l}}finally{i()}}a(Yp,"compactScope");async function xx(t,e,n){let r=t.ensureScopeDir(e),o=n.archive??!0,i=n.checkpoint??!0,s=n.sourceScopes??[],c=[],l=[],d=[],u=Si(r);if(!u)throw new Error(`scope ${Jt(e)} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);d.push(u);try{let f=s.map(g=>({scope:g,hash:Jt(g),paths:t.ensureScopeDir(g)})).sort((g,m)=>g.hash.localeCompare(m.hash));for(let g of f){if(g.hash===Jt(e))continue;let m=Si(g.paths);if(!m)throw new Error(`source scope ${g.hash} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);d.push(m)}for(let g of f)if(i){let m=t.extractToProcessing(g.paths,n.query);if(!m)continue;let y=xi(m);c.push(...y),l.push({paths:g.paths,file:m})}else c.push(...t.queryShortTerm(g.paths,n.query));if(c.length===0)return{entryCount:0,summary:n.summary,archivePaths:[]};t.appendLongTerm(r,n.summary);let p=[];for(let g of l)if(o){let m=t.archiveProcessing(g.paths,g.file);m&&p.push(m)}else pt.existsSync(g.file)&&t.rollbackFromProcessing(g.paths,g.file);return{entryCount:c.length,summary:n.summary,archivePaths:p,archivePath:p[0]}}catch(f){for(let p of l)pt.existsSync(p.file)&&t.rollbackFromProcessing(p.paths,p.file);throw f}finally{for(let f of d.reverse())f()}}a(xx,"compactFromSources");async function Qp(t,e){let n=[],r=0;if(e){let o=t.pathsFor(e);if(Rc(o))return h.debug("memory","scope \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7 recover",{scopeHash:Jt(e)}),{recoveredScopes:0,recoveredEntries:0,details:[]};let i=Ix(t,o);i.entries>0&&(n.push(i),r+=i.entries)}else{let o=t.findOrphanProcessing();for(let i of o){let s=t.pathsFor(i.scopeHash);if(Rc(s))continue;let c=xi(i.processingFile);for(let l of c)t.appendShortTerm(s,l);try{pt.unlinkSync(i.processingFile)}catch{}n.push({scopeHash:i.scopeHash,entries:c.length,action:"restored"}),r+=c.length}}return{recoveredScopes:n.length,recoveredEntries:r,details:n}}a(Qp,"recoverOrphans");function xi(t){if(!pt.existsSync(t))return[];let n=pt.readFileSync(t,"utf-8").split(`
304
- `).filter(o=>o.trim().length>0),r=[];for(let o of n)try{let i=JSON.parse(o);i&&typeof i.timestamp=="string"&&r.push(i)}catch{}return r}a(xi,"readEntriesFromFile");function Ix(t,e){if(!pt.existsSync(e.processingDir))return{scopeHash:Cc.basename(e.dir),entries:0,action:"restored"};let n=0;for(let r of pt.readdirSync(e.processingDir)){if(!r.endsWith(".jsonl"))continue;let o=Cc.join(e.processingDir,r),i=xi(o);for(let s of i)t.appendShortTerm(e,s);n+=i.length;try{pt.unlinkSync(o)}catch{}}return{scopeHash:Cc.basename(e.dir),entries:n,action:"restored"}}a(Ix,"recoverScopeProcessing");var Cn=N.object({tenantId:N.string().optional(),baseId:N.string().optional(),channel:N.string(),groupId:N.string().optional(),conversationId:N.string().optional(),roleId:N.string().optional(),scenario:N.string()}),Rx=N.object({root_dir:N.string().optional(),default_scope:Cn.optional(),retention_days:N.number().optional()}).strict();function Cx(t,e){let n=e?.root_dir??"./.memory";return{rootDir:Xp.isAbsolute(n)?n:Xp.resolve(t.configDir,n),defaultScope:e?.default_scope,retentionDays:e?.retention_days??30}}a(Cx,"resolveConfig");function Tx(t){let e=new vi(t.rootDir);function n(r){if(r!==void 0)return r;if(t.defaultScope)return t.defaultScope;throw new Error("memory toolkit: \u672A\u63D0\u4F9B scope \u4E14\u65E0 default_scope \u914D\u7F6E")}return a(n,"resolveScope"),{async append(r,o){let i=n(r),s=e.ensureScopeDir(i);e.appendShortTerm(s,o)},async readShortTerm(r,o){let i=n(r),s=e.ensureScopeDir(i);return e.queryShortTerm(s,o)},async readLongTerm(r){let o=n(r),i=e.ensureScopeDir(o);return e.readLongTerm(i)},async compact(r,o){let i=n(r);return Yp(e,i,o)},async recover(r){return Qp(e,r!==void 0?r:void 0)}}}a(Tx,"createMemoryToolkit");var eg={name:"memory",description:"Agent \u8BB0\u5FC6\uFF1A\u8DE8\u4E8B\u4EF6/\u8DE8 handler/\u8DE8\u91CD\u542F\u7684\u77ED\u671F+\u957F\u671F\u8BB0\u5FC6\u5B58\u50A8\u4E0E\u538B\u7F29",configSchema:Rx,defaultConfig(t){return{root_dir:"./.memory",retention_days:30}},build(t,e){let n=Cx(e.settings,t);return Tx(n)},methods:[{name:"append",description:"\u8FFD\u52A0\u4E00\u6761\u77ED\u671F\u8BB0\u5FC6",params:N.object({scope:N.union([N.string(),Cn]).describe("\u8BB0\u5FC6\u8303\u56F4"),entry:N.object({id:N.string().optional(),timestamp:N.string().describe("ISO 8601 \u65F6\u95F4\u6233"),kind:N.string().describe("\u4E1A\u52A1\u81EA\u5B9A\u4E49\u7C7B\u578B"),content:N.string(),summary:N.string().optional(),meta:N.record(N.string(),N.unknown()).optional()})}),output:N.promise(N.void())},{name:"readShortTerm",description:"\u8BFB\u53D6\u77ED\u671F\u8BB0\u5FC6\uFF08\u53EF\u6309\u65F6\u95F4/kind/limit \u8FC7\u6EE4\uFF09",params:N.object({scope:N.union([N.string(),Cn]),query:N.object({since:N.string().optional(),until:N.string().optional(),kinds:N.array(N.string()).optional(),limit:N.number().optional()}).optional()}),output:N.promise(N.array(N.object({timestamp:N.string(),kind:N.string(),content:N.string()})))},{name:"readLongTerm",description:"\u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6 long-term.md",params:N.object({scope:N.union([N.string(),Cn])}),output:N.promise(N.string())},{name:"compact",description:"\u628A\u77ED\u671F\u8BB0\u5FC6\u538B\u7F29\u8FDB\u957F\u671F\u8BB0\u5FC6\uFF08summary \u7531 recipe \u901A\u8FC7 ai.chat \u9884\u8BA1\u7B97\uFF09",params:N.object({scope:N.union([N.string(),Cn]),options:N.object({summary:N.string().describe("\u9884\u8BA1\u7B97\u7684\u6458\u8981\u6587\u672C"),entries:N.array(N.object({timestamp:N.string(),kind:N.string(),content:N.string()})).optional(),sourceScopes:N.array(N.union([N.string(),Cn])).optional(),query:N.object({since:N.string().optional(),until:N.string().optional(),kinds:N.array(N.string()).optional(),limit:N.number().optional()}).optional(),checkpoint:N.boolean().optional(),archive:N.boolean().optional(),clearShortTerm:N.boolean().optional()})}),output:N.promise(N.object({entryCount:N.number(),summary:N.string(),archivePath:N.string().optional(),archivePaths:N.array(N.string()).optional()}))},{name:"recover",description:"\u6062\u590D\u5B64\u513F processing \u6587\u4EF6",params:N.object({scope:N.union([N.string(),Cn]).optional()}),output:N.promise(N.object({recoveredScopes:N.number(),recoveredEntries:N.number(),details:N.array(N.object({scopeHash:N.string(),entries:N.number(),action:N.enum(["restored","archived"])}))}))}]};import{z as Q}from"zod";var rg=3e4,og=5*1024*1024,ig=3,sg=Q.object({bin:Q.string().describe("\u5141\u8BB8\u6267\u884C\u7684\u53EF\u6267\u884C\u6587\u4EF6\u540D\uFF08\u4E0D\u542B\u8DEF\u5F84\uFF1B\u8DEF\u5F84\u89E3\u6790\u89C1 bins\uFF09"),args_prefix:Q.array(Q.string()).optional().describe("\u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\u767D\u540D\u5355\uFF1A\u5B9E\u9645 argv \u5FC5\u987B\u4EE5\u8BE5\u5E8F\u5217\u5F00\u5934\uFF0C\u7528\u4E8E\u628A\u6388\u6743\u6536\u7A84\u5230\u67D0\u4E2A\u5B50\u547D\u4EE4\u65CF")}),_x=Q.object({allow:Q.array(sg).optional().describe("default-deny \u547D\u4EE4\u767D\u540D\u5355\uFF1B\u672A\u5217\u51FA\u7684 bin/\u5B50\u547D\u4EE4\u524D\u7F00\u4E00\u5F8B\u62D2\u7EDD\u3002\u7F3A\u7701=\u5168\u90E8\u62D2\u7EDD"),timeout_ms:Q.number().optional().describe("\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF0C\u7F3A\u7701 30000"),max_output_bytes:Q.number().optional().describe("\u6355\u83B7\u8F93\u51FA\u4E0A\u9650\uFF08\u5B57\u8282\uFF09\uFF0C\u7F3A\u7701 5242880"),retry:Q.object({max_attempts:Q.number().optional()}).optional().describe("\u91CD\u8BD5\u7B56\u7565\uFF1Bmax_attempts \u542B\u9996\u6B21\u5C1D\u8BD5\uFF0C\u7F3A\u7701 3"),bins:Q.record(Q.string(),Q.string()).optional().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D \u2192 \u7EDD\u5BF9\u8DEF\u5F84\u8986\u76D6\uFF08\u5982 dws \u88AB\u5BBF\u4E3B PATH \u906E\u853D\u65F6\u663E\u5F0F\u6307\u5B9A\uFF09")}).strict(),Ii=class extends We{static{a(this,"ShellNotAllowedError")}constructor(e){super(`shell: \u547D\u4EE4\u672A\u6388\u6743\u300C${e}\u300D\uFF08toolkit_config.shell.allow \u672A\u5217\u51FA\u8BE5 bin/\u5B50\u547D\u4EE4\u524D\u7F00\uFF09`,{retryable:!1,code:"SHELL_NOT_ALLOWED"}),this.name="ShellNotAllowedError"}};function Ax(t,e,n){return t.some(r=>{if(r.bin!==e)return!1;let o=r.args_prefix;return!o||o.length===0?!0:n.length<o.length?!1:o.every((i,s)=>n[s]===i)})}a(Ax,"isAllowed");function Tc(t,e){if(e.length===0)return t;let n=new Set(e);return t.map(r=>n.has(r)?"***":r)}a(Tc,"redactArgs");function tg(t){return t?.code==="ENOENT"}a(tg,"isEnoent");function Ex(t,e){if(e!==void 0)try{return $e(t,e)}catch(n){throw n instanceof ue?new We(`shell: cwd\u300C${e}\u300D\u8D8A\u51FA\u5B9E\u4F8B\u6839\u76EE\u5F55`,{retryable:!1,code:"SHELL_CWD_ESCAPE"}):n}}a(Ex,"resolveCwd");function ng(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?{text:t,truncated:!1}:{text:n.subarray(0,e).toString("utf8"),truncated:!0}}a(ng,"truncateBytes");function _c(t){let{allow:e,bins:n,configDir:r,secrets:o,runner:i}=t;async function s(l,d,u){let f=n[l]??l,g={cwd:Ex(r,u?.cwd),input:u?.input,timeoutMs:u?.timeoutMs??t.timeoutMs,maxOutputBytes:u?.maxOutputBytes??t.maxOutputBytes};return l==="dws"?ne(f,d,{...g,runner:i}):i(f,d,g)}a(s,"attempt");function c(l,d,u){if(!Ax(e,l,d))throw new Ii(l);h.debug("shell","exec",{bin:l,argv:Tc(d,o),cwd:u})}return a(c,"authorizeAndAudit"),{async run(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=u?.maxOutputBytes??t.maxOutputBytes,g=Date.now(),m=0,y=await wn(async()=>(m++,s(l,d,u)),{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(I=>!tg(I)),onRetry:a((I,v)=>h.debug("shell","run retry",{bin:l,retry:v,error:String(I)}),"onRetry")}),w=ng(y.stdout,p),b=ng(y.stderr,p),x=!!(y.truncated||w.truncated||b.truncated);return h.info("shell","run done",{bin:l,argv:Tc(d,o),exitCode:y.exitCode,durationMs:Date.now()-g,attempts:m,truncated:x}),{stdout:w.text,stderr:b.text,exitCode:y.exitCode,truncated:x}},async runJson(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=Date.now(),g=0,m=await wn(async()=>{g++;let y=await s(l,d,u);if(y.exitCode!==0)throw new We(`shell: \u547D\u4EE4\u975E\u96F6\u9000\u51FA (${y.exitCode})\uFF1A${y.stderr.slice(0,300)}`,{retryable:!0,code:"SHELL_NONZERO_EXIT"});let w=y.stdout.trim();if(w!=="")try{return JSON.parse(w)}catch{throw new We("shell: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON",{retryable:!0,code:"SHELL_BAD_JSON"})}},{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(y=>!tg(y)),onRetry:a((y,w)=>h.debug("shell","runJson retry",{bin:l,retry:w,error:String(y)}),"onRetry")});return h.info("shell","runJson done",{bin:l,argv:Tc(d,o),durationMs:Date.now()-p,attempts:g}),m}}}a(_c,"createShellToolkitFromConfig");function Dx(t,e){let n=t.raw?.toolkit_config?.shell??{};return _c(ag(t,{...n,allow:[{bin:e}]}))}a(Dx,"createExecShellToolkit");function $x(t,e){return _c({allow:[{bin:t}],timeoutMs:rg,maxOutputBytes:og,maxAttempts:ig,bins:{},configDir:e?.configDir??process.cwd(),secrets:[],runner:J})}a($x,"createStandaloneExecShellToolkit");function ag(t,e){let n=Object.values(t.envSource??{}).filter(r=>typeof r=="string"&&r.length>0);return{allow:e?.allow??[],timeoutMs:e?.timeout_ms??rg,maxOutputBytes:e?.max_output_bytes??og,maxAttempts:e?.retry?.max_attempts??ig,bins:e?.bins??{},configDir:t.configDir,secrets:n,runner:J}}a(ag,"resolveConfig");var cg={name:"shell",description:"\u539F\u5B50\u5316\u547D\u4EE4\u6267\u884C\uFF08dws/git \u7B49 CLI \u7684\u901A\u7528\u9003\u751F\u8231\uFF09\uFF1A\u65E0 shell \u89E3\u91CA\u3001default-deny \u767D\u540D\u5355\u3001\u7EDF\u4E00\u91CD\u8BD5/\u8D85\u65F6/JSON \u89E3\u6790/\u8F93\u51FA\u622A\u65AD/\u5BA1\u8BA1\u8131\u654F\u3002",configSchema:_x,build(t,e){return _c(ag(e.settings,t))},methods:[{name:"run",description:"\u6267\u884C\u5355\u4E2A\u53EF\u6267\u884C\u6587\u4EF6\uFF08argv \u6570\u7EC4\uFF0C\u65E0 shell \u89E3\u91CA\uFF09\uFF1B\u975E\u96F6\u9000\u51FA\u4E0D\u629B\u9519\uFF0C\u9000\u51FA\u7801\u539F\u6837\u8FD4\u56DE",params:Q.object({bin:Q.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:Q.array(Q.string()).describe("argv \u6570\u7EC4"),options:Q.object({cwd:Q.string().optional(),input:Q.string().optional(),timeoutMs:Q.number().optional(),maxOutputBytes:Q.number().optional()}).optional()}),output:Q.promise(Q.object({stdout:Q.string(),stderr:Q.string(),exitCode:Q.number().nullable(),truncated:Q.boolean()}))},{name:"runJson",description:"\u540C run\uFF0C\u4F46\u8981\u6C42 exitCode=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u5426\u5219\u629B\u9519\u5E76\u6309\u7B56\u7565\u91CD\u8BD5\uFF1B\u7A7A\u8F93\u51FA\u5F52\u4E00\u4E3A {}",params:Q.object({bin:Q.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:Q.array(Q.string()).describe("argv \u6570\u7EC4"),options:Q.object({cwd:Q.string().optional(),input:Q.string().optional(),timeoutMs:Q.number().optional()}).optional()}),output:Q.promise(Q.unknown().optional())}],permissions:[{method:"run",description:"\u5141\u8BB8\u6267\u884C\u7684\u547D\u4EE4\u767D\u540D\u5355\uFF08default-deny\uFF09\uFF1Abin + \u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\uFF1B\u672C toolkit \u5728 build \u5185\u81EA\u6301\u5F3A\u5236\uFF0C\u672A\u547D\u4E2D\u5373\u62D2\u7EDD\u3002",scopeSchema:Q.array(sg)}]};var Zt=[Sf,Kf,xp,jp,Np,zp,Up,Kp,qp,eg,cg];function Ac(t=[]){let e=new Map;for(let n of Zt)e.set(n.name,n);for(let n of t)e.set(n.name,n);return[...e.values()]}a(Ac,"composeToolkitRegistry");function Ri(t){let{settings:e,tracker:n,item:r,toolkitConfig:o}=t,i=t.registry??Zt,s={settings:e,tracker:n,item:r,kbContext:t.kbContext,roleContext:t.roleContext},c={approval:null},l=e.raw.toolkit_config,d=a((u,f,p)=>{if(f===void 0)return;let g=u.configSchema.safeParse(f);if(!g.success){let m=g.error.issues.map(y=>`${y.path.join(".")||"<root>"}: ${y.message}`).join("; ");throw new Error(`${p}toolkit_config.${u.name} \u6821\u9A8C\u5931\u8D25: ${m}`)}return g.data},"parseOverride");for(let u of i){let f=u.defaultConfig?u.defaultConfig(e):{},p=Fa(f,d(u,l?.[u.name],"\u9879\u76EE\u7EA7 ")),g=d(u,o?.[u.name],"");c[u.name]=u.build(Fa(p,g),s)}return c}a(Ri,"createToolkit");var Ec=class extends Error{constructor(n,r){super(`Toolkit \u672A\u6388\u6743\uFF1A${n}\uFF08step.config \u4E2D\u663E\u5F0F\u8BBE\u7F6E\u4E3A false\uFF09`);this.toolkit=n;this.stepId=r;this.name="ToolkitPermissionError"}toolkit;stepId;static{a(this,"ToolkitPermissionError")}};function lg(t,e){let{stepConfig:n}=e;if(!n)return t;let r=e.registry??Zt,o=new Set;for(let s of r)n[s.name]===!1&&o.add(s.name);if(o.size===0)return t;let i={...t};for(let s of o){let c=i[s];if(c==null)continue;let l=c,d={};for(let[u,f]of Object.entries(l))typeof f=="function"?d[u]=()=>{throw new Ec(s)}:d[u]=f;i[s]=d}return i}a(lg,"createScopedToolkit");import Dc from"path";var Px="cn-wulanchabu.log.aliyuncs.com",Mx="lippi-notable-extension-log",fg="aitable-workflow-cli",Ox=`https://${Mx}.${Px}/logstores/${fg}/track`,jx=3e3,dg=5e3,pg="unknown",$c,ug=null;function Fx(t){pg=t.version}a(Fx,"initSlsReport");function Nx(t){$c=yg(t)}a(Nx,"setReportProject");function gg(t=process.env){let e=t.AITABLE_WORKFLOW_SLS_REPORT?.trim().toLowerCase();return e==="off"||e==="0"||e==="false"}a(gg,"isSlsReportDisabled");function Yt(t){return typeof t=="string"&&t.trim()?t:void 0}a(Yt,"pickString");function Lx(t){if(!t||typeof t!="object")return null;let e=t,n=[e];e.data&&typeof e.data=="object"&&n.push(e.data);for(let r of n){let o={userId:Yt(r.user_id)??Yt(r.userId),corpId:Yt(r.corp_id)??Yt(r.corpId),userName:Yt(r.user_name)??Yt(r.userName),corpName:Yt(r.corp_name)??Yt(r.corpName)};if(o.userId||o.corpId||o.userName||o.corpName)return o}return null}a(Lx,"extractIdentity");function mg(t){let e=t.trim();if(!e)return{};for(let n of[e,...e.split(/\r?\n/).reverse()])try{let r=Lx(JSON.parse(n));if(r)return r}catch{}return{}}a(mg,"parseDwsAuthIdentity");function hg(t){return/v?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/.exec(t)?.[1]}a(hg,"parseDwsVersionOutput");function yg(t){return Dc.basename(Dc.dirname(Dc.resolve(t)))}a(yg,"resolveReportProject");async function Wx(t){try{let e=t.prober??(s=>_t(s,["--version"],Hn({timeoutMs:3e3}))),n,r=t.dwsBin??yn(s=>{let c=e(s);return c.ok&&(n=hg(`${c.stdout}
304
+ `).filter(o=>o.trim().length>0),r=[];for(let o of n)try{let i=JSON.parse(o);i&&typeof i.timestamp=="string"&&r.push(i)}catch{}return r}a(xi,"readEntriesFromFile");function Ix(t,e){if(!pt.existsSync(e.processingDir))return{scopeHash:Cc.basename(e.dir),entries:0,action:"restored"};let n=0;for(let r of pt.readdirSync(e.processingDir)){if(!r.endsWith(".jsonl"))continue;let o=Cc.join(e.processingDir,r),i=xi(o);for(let s of i)t.appendShortTerm(e,s);n+=i.length;try{pt.unlinkSync(o)}catch{}}return{scopeHash:Cc.basename(e.dir),entries:n,action:"restored"}}a(Ix,"recoverScopeProcessing");var Cn=N.object({tenantId:N.string().optional(),baseId:N.string().optional(),channel:N.string(),groupId:N.string().optional(),conversationId:N.string().optional(),roleId:N.string().optional(),scenario:N.string()}),Rx=N.object({root_dir:N.string().optional(),default_scope:Cn.optional(),retention_days:N.number().optional()}).strict();function Cx(t,e){let n=e?.root_dir??"./.memory";return{rootDir:Xp.isAbsolute(n)?n:Xp.resolve(t.configDir,n),defaultScope:e?.default_scope,retentionDays:e?.retention_days??30}}a(Cx,"resolveConfig");function Tx(t){let e=new vi(t.rootDir);function n(r){if(r!==void 0)return r;if(t.defaultScope)return t.defaultScope;throw new Error("memory toolkit: \u672A\u63D0\u4F9B scope \u4E14\u65E0 default_scope \u914D\u7F6E")}return a(n,"resolveScope"),{async append(r,o){let i=n(r),s=e.ensureScopeDir(i);e.appendShortTerm(s,o)},async readShortTerm(r,o){let i=n(r),s=e.ensureScopeDir(i);return e.queryShortTerm(s,o)},async readLongTerm(r){let o=n(r),i=e.ensureScopeDir(o);return e.readLongTerm(i)},async compact(r,o){let i=n(r);return Yp(e,i,o)},async recover(r){return Qp(e,r!==void 0?r:void 0)}}}a(Tx,"createMemoryToolkit");var eg={name:"memory",description:"Agent \u8BB0\u5FC6\uFF1A\u8DE8\u4E8B\u4EF6/\u8DE8 handler/\u8DE8\u91CD\u542F\u7684\u77ED\u671F+\u957F\u671F\u8BB0\u5FC6\u5B58\u50A8\u4E0E\u538B\u7F29",configSchema:Rx,defaultConfig(t){return{root_dir:"./.memory",retention_days:30}},build(t,e){let n=Cx(e.settings,t);return Tx(n)},methods:[{name:"append",description:"\u8FFD\u52A0\u4E00\u6761\u77ED\u671F\u8BB0\u5FC6",params:N.object({scope:N.union([N.string(),Cn]).describe("\u8BB0\u5FC6\u8303\u56F4"),entry:N.object({id:N.string().optional(),timestamp:N.string().describe("ISO 8601 \u65F6\u95F4\u6233"),kind:N.string().describe("\u4E1A\u52A1\u81EA\u5B9A\u4E49\u7C7B\u578B"),content:N.string(),summary:N.string().optional(),meta:N.record(N.string(),N.unknown()).optional()})}),output:N.promise(N.void())},{name:"readShortTerm",description:"\u8BFB\u53D6\u77ED\u671F\u8BB0\u5FC6\uFF08\u53EF\u6309\u65F6\u95F4/kind/limit \u8FC7\u6EE4\uFF09",params:N.object({scope:N.union([N.string(),Cn]),query:N.object({since:N.string().optional(),until:N.string().optional(),kinds:N.array(N.string()).optional(),limit:N.number().optional()}).optional()}),output:N.promise(N.array(N.object({timestamp:N.string(),kind:N.string(),content:N.string()})))},{name:"readLongTerm",description:"\u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6 long-term.md",params:N.object({scope:N.union([N.string(),Cn])}),output:N.promise(N.string())},{name:"compact",description:"\u628A\u77ED\u671F\u8BB0\u5FC6\u538B\u7F29\u8FDB\u957F\u671F\u8BB0\u5FC6\uFF08summary \u7531 recipe \u901A\u8FC7 ai.chat \u9884\u8BA1\u7B97\uFF09",params:N.object({scope:N.union([N.string(),Cn]),options:N.object({summary:N.string().describe("\u9884\u8BA1\u7B97\u7684\u6458\u8981\u6587\u672C"),entries:N.array(N.object({timestamp:N.string(),kind:N.string(),content:N.string()})).optional(),sourceScopes:N.array(N.union([N.string(),Cn])).optional(),query:N.object({since:N.string().optional(),until:N.string().optional(),kinds:N.array(N.string()).optional(),limit:N.number().optional()}).optional(),checkpoint:N.boolean().optional(),archive:N.boolean().optional(),clearShortTerm:N.boolean().optional()})}),output:N.promise(N.object({entryCount:N.number(),summary:N.string(),archivePath:N.string().optional(),archivePaths:N.array(N.string()).optional()}))},{name:"recover",description:"\u6062\u590D\u5B64\u513F processing \u6587\u4EF6",params:N.object({scope:N.union([N.string(),Cn]).optional()}),output:N.promise(N.object({recoveredScopes:N.number(),recoveredEntries:N.number(),details:N.array(N.object({scopeHash:N.string(),entries:N.number(),action:N.enum(["restored","archived"])}))}))}]};import{z as Q}from"zod";var rg=3e4,og=5*1024*1024,ig=3,sg=Q.object({bin:Q.string().describe("\u5141\u8BB8\u6267\u884C\u7684\u53EF\u6267\u884C\u6587\u4EF6\u540D\uFF08\u4E0D\u542B\u8DEF\u5F84\uFF1B\u8DEF\u5F84\u89E3\u6790\u89C1 bins\uFF09"),args_prefix:Q.array(Q.string()).optional().describe("\u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\u767D\u540D\u5355\uFF1A\u5B9E\u9645 argv \u5FC5\u987B\u4EE5\u8BE5\u5E8F\u5217\u5F00\u5934\uFF0C\u7528\u4E8E\u628A\u6388\u6743\u6536\u7A84\u5230\u67D0\u4E2A\u5B50\u547D\u4EE4\u65CF")}),_x=Q.object({allow:Q.array(sg).optional().describe("default-deny \u547D\u4EE4\u767D\u540D\u5355\uFF1B\u672A\u5217\u51FA\u7684 bin/\u5B50\u547D\u4EE4\u524D\u7F00\u4E00\u5F8B\u62D2\u7EDD\u3002\u7F3A\u7701=\u5168\u90E8\u62D2\u7EDD"),timeout_ms:Q.number().optional().describe("\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF0C\u7F3A\u7701 30000"),max_output_bytes:Q.number().optional().describe("\u6355\u83B7\u8F93\u51FA\u4E0A\u9650\uFF08\u5B57\u8282\uFF09\uFF0C\u7F3A\u7701 5242880"),retry:Q.object({max_attempts:Q.number().optional()}).optional().describe("\u91CD\u8BD5\u7B56\u7565\uFF1Bmax_attempts \u542B\u9996\u6B21\u5C1D\u8BD5\uFF0C\u7F3A\u7701 3"),bins:Q.record(Q.string(),Q.string()).optional().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D \u2192 \u7EDD\u5BF9\u8DEF\u5F84\u8986\u76D6\uFF08\u5982 dws \u88AB\u5BBF\u4E3B PATH \u906E\u853D\u65F6\u663E\u5F0F\u6307\u5B9A\uFF09")}).strict(),Ii=class extends We{static{a(this,"ShellNotAllowedError")}constructor(e){super(`shell: \u547D\u4EE4\u672A\u6388\u6743\u300C${e}\u300D\uFF08toolkit_config.shell.allow \u672A\u5217\u51FA\u8BE5 bin/\u5B50\u547D\u4EE4\u524D\u7F00\uFF09`,{retryable:!1,code:"SHELL_NOT_ALLOWED"}),this.name="ShellNotAllowedError"}};function Ax(t,e,n){return t.some(r=>{if(r.bin!==e)return!1;let o=r.args_prefix;return!o||o.length===0?!0:n.length<o.length?!1:o.every((i,s)=>n[s]===i)})}a(Ax,"isAllowed");function Tc(t,e){if(e.length===0)return t;let n=new Set(e);return t.map(r=>n.has(r)?"***":r)}a(Tc,"redactArgs");function tg(t){return t?.code==="ENOENT"}a(tg,"isEnoent");function Ex(t,e){if(e!==void 0)try{return $e(t,e)}catch(n){throw n instanceof ue?new We(`shell: cwd\u300C${e}\u300D\u8D8A\u51FA\u5B9E\u4F8B\u6839\u76EE\u5F55`,{retryable:!1,code:"SHELL_CWD_ESCAPE"}):n}}a(Ex,"resolveCwd");function ng(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?{text:t,truncated:!1}:{text:n.subarray(0,e).toString("utf8"),truncated:!0}}a(ng,"truncateBytes");function _c(t){let{allow:e,bins:n,configDir:r,secrets:o,runner:i}=t;async function s(l,d,u){let f=n[l]??l,g={cwd:Ex(r,u?.cwd),input:u?.input,timeoutMs:u?.timeoutMs??t.timeoutMs,maxOutputBytes:u?.maxOutputBytes??t.maxOutputBytes};return l==="dws"?ne(f,d,{...g,runner:i}):i(f,d,g)}a(s,"attempt");function c(l,d,u){if(!Ax(e,l,d))throw new Ii(l);h.debug("shell","exec",{bin:l,argv:Tc(d,o),cwd:u})}return a(c,"authorizeAndAudit"),{async run(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=u?.maxOutputBytes??t.maxOutputBytes,g=Date.now(),m=0,y=await wn(async()=>(m++,s(l,d,u)),{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(I=>!tg(I)),onRetry:a((I,S)=>h.debug("shell","run retry",{bin:l,retry:S,error:String(I)}),"onRetry")}),w=ng(y.stdout,p),b=ng(y.stderr,p),x=!!(y.truncated||w.truncated||b.truncated);return h.info("shell","run done",{bin:l,argv:Tc(d,o),exitCode:y.exitCode,durationMs:Date.now()-g,attempts:m,truncated:x}),{stdout:w.text,stderr:b.text,exitCode:y.exitCode,truncated:x}},async runJson(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=Date.now(),g=0,m=await wn(async()=>{g++;let y=await s(l,d,u);if(y.exitCode!==0)throw new We(`shell: \u547D\u4EE4\u975E\u96F6\u9000\u51FA (${y.exitCode})\uFF1A${y.stderr.slice(0,300)}`,{retryable:!0,code:"SHELL_NONZERO_EXIT"});let w=y.stdout.trim();if(w!=="")try{return JSON.parse(w)}catch{throw new We("shell: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON",{retryable:!0,code:"SHELL_BAD_JSON"})}},{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(y=>!tg(y)),onRetry:a((y,w)=>h.debug("shell","runJson retry",{bin:l,retry:w,error:String(y)}),"onRetry")});return h.info("shell","runJson done",{bin:l,argv:Tc(d,o),durationMs:Date.now()-p,attempts:g}),m}}}a(_c,"createShellToolkitFromConfig");function Dx(t,e){let n=t.raw?.toolkit_config?.shell??{};return _c(ag(t,{...n,allow:[{bin:e}]}))}a(Dx,"createExecShellToolkit");function $x(t,e){return _c({allow:[{bin:t}],timeoutMs:rg,maxOutputBytes:og,maxAttempts:ig,bins:{},configDir:e?.configDir??process.cwd(),secrets:[],runner:J})}a($x,"createStandaloneExecShellToolkit");function ag(t,e){let n=Object.values(t.envSource??{}).filter(r=>typeof r=="string"&&r.length>0);return{allow:e?.allow??[],timeoutMs:e?.timeout_ms??rg,maxOutputBytes:e?.max_output_bytes??og,maxAttempts:e?.retry?.max_attempts??ig,bins:e?.bins??{},configDir:t.configDir,secrets:n,runner:J}}a(ag,"resolveConfig");var cg={name:"shell",description:"\u539F\u5B50\u5316\u547D\u4EE4\u6267\u884C\uFF08dws/git \u7B49 CLI \u7684\u901A\u7528\u9003\u751F\u8231\uFF09\uFF1A\u65E0 shell \u89E3\u91CA\u3001default-deny \u767D\u540D\u5355\u3001\u7EDF\u4E00\u91CD\u8BD5/\u8D85\u65F6/JSON \u89E3\u6790/\u8F93\u51FA\u622A\u65AD/\u5BA1\u8BA1\u8131\u654F\u3002",configSchema:_x,build(t,e){return _c(ag(e.settings,t))},methods:[{name:"run",description:"\u6267\u884C\u5355\u4E2A\u53EF\u6267\u884C\u6587\u4EF6\uFF08argv \u6570\u7EC4\uFF0C\u65E0 shell \u89E3\u91CA\uFF09\uFF1B\u975E\u96F6\u9000\u51FA\u4E0D\u629B\u9519\uFF0C\u9000\u51FA\u7801\u539F\u6837\u8FD4\u56DE",params:Q.object({bin:Q.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:Q.array(Q.string()).describe("argv \u6570\u7EC4"),options:Q.object({cwd:Q.string().optional(),input:Q.string().optional(),timeoutMs:Q.number().optional(),maxOutputBytes:Q.number().optional()}).optional()}),output:Q.promise(Q.object({stdout:Q.string(),stderr:Q.string(),exitCode:Q.number().nullable(),truncated:Q.boolean()}))},{name:"runJson",description:"\u540C run\uFF0C\u4F46\u8981\u6C42 exitCode=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u5426\u5219\u629B\u9519\u5E76\u6309\u7B56\u7565\u91CD\u8BD5\uFF1B\u7A7A\u8F93\u51FA\u5F52\u4E00\u4E3A {}",params:Q.object({bin:Q.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:Q.array(Q.string()).describe("argv \u6570\u7EC4"),options:Q.object({cwd:Q.string().optional(),input:Q.string().optional(),timeoutMs:Q.number().optional()}).optional()}),output:Q.promise(Q.unknown().optional())}],permissions:[{method:"run",description:"\u5141\u8BB8\u6267\u884C\u7684\u547D\u4EE4\u767D\u540D\u5355\uFF08default-deny\uFF09\uFF1Abin + \u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\uFF1B\u672C toolkit \u5728 build \u5185\u81EA\u6301\u5F3A\u5236\uFF0C\u672A\u547D\u4E2D\u5373\u62D2\u7EDD\u3002",scopeSchema:Q.array(sg)}]};var Zt=[Sf,Kf,xp,jp,Np,zp,Up,Kp,qp,eg,cg];function Ac(t=[]){let e=new Map;for(let n of Zt)e.set(n.name,n);for(let n of t)e.set(n.name,n);return[...e.values()]}a(Ac,"composeToolkitRegistry");function Ri(t){let{settings:e,tracker:n,item:r,toolkitConfig:o}=t,i=t.registry??Zt,s={settings:e,tracker:n,item:r,kbContext:t.kbContext,roleContext:t.roleContext},c={approval:null},l=e.raw.toolkit_config,d=a((u,f,p)=>{if(f===void 0)return;let g=u.configSchema.safeParse(f);if(!g.success){let m=g.error.issues.map(y=>`${y.path.join(".")||"<root>"}: ${y.message}`).join("; ");throw new Error(`${p}toolkit_config.${u.name} \u6821\u9A8C\u5931\u8D25: ${m}`)}return g.data},"parseOverride");for(let u of i){let f=u.defaultConfig?u.defaultConfig(e):{},p=Fa(f,d(u,l?.[u.name],"\u9879\u76EE\u7EA7 ")),g=d(u,o?.[u.name],"");c[u.name]=u.build(Fa(p,g),s)}return c}a(Ri,"createToolkit");var Ec=class extends Error{constructor(n,r){super(`Toolkit \u672A\u6388\u6743\uFF1A${n}\uFF08step.config \u4E2D\u663E\u5F0F\u8BBE\u7F6E\u4E3A false\uFF09`);this.toolkit=n;this.stepId=r;this.name="ToolkitPermissionError"}toolkit;stepId;static{a(this,"ToolkitPermissionError")}};function lg(t,e){let{stepConfig:n}=e;if(!n)return t;let r=e.registry??Zt,o=new Set;for(let s of r)n[s.name]===!1&&o.add(s.name);if(o.size===0)return t;let i={...t};for(let s of o){let c=i[s];if(c==null)continue;let l=c,d={};for(let[u,f]of Object.entries(l))typeof f=="function"?d[u]=()=>{throw new Ec(s)}:d[u]=f;i[s]=d}return i}a(lg,"createScopedToolkit");import Dc from"path";var Px="cn-wulanchabu.log.aliyuncs.com",Mx="lippi-notable-extension-log",fg="aitable-workflow-cli",Ox=`https://${Mx}.${Px}/logstores/${fg}/track`,jx=3e3,dg=5e3,pg="unknown",$c,ug=null;function Fx(t){pg=t.version}a(Fx,"initSlsReport");function Nx(t){$c=yg(t)}a(Nx,"setReportProject");function gg(t=process.env){let e=t.AITABLE_WORKFLOW_SLS_REPORT?.trim().toLowerCase();return e==="off"||e==="0"||e==="false"}a(gg,"isSlsReportDisabled");function Yt(t){return typeof t=="string"&&t.trim()?t:void 0}a(Yt,"pickString");function Lx(t){if(!t||typeof t!="object")return null;let e=t,n=[e];e.data&&typeof e.data=="object"&&n.push(e.data);for(let r of n){let o={userId:Yt(r.user_id)??Yt(r.userId),corpId:Yt(r.corp_id)??Yt(r.corpId),userName:Yt(r.user_name)??Yt(r.userName),corpName:Yt(r.corp_name)??Yt(r.corpName)};if(o.userId||o.corpId||o.userName||o.corpName)return o}return null}a(Lx,"extractIdentity");function mg(t){let e=t.trim();if(!e)return{};for(let n of[e,...e.split(/\r?\n/).reverse()])try{let r=Lx(JSON.parse(n));if(r)return r}catch{}return{}}a(mg,"parseDwsAuthIdentity");function hg(t){return/v?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/.exec(t)?.[1]}a(hg,"parseDwsVersionOutput");function yg(t){return Dc.basename(Dc.dirname(Dc.resolve(t)))}a(yg,"resolveReportProject");async function Wx(t){try{let e=t.prober??(s=>_t(s,["--version"],Hn({timeoutMs:3e3}))),n,r=t.dwsBin??yn(s=>{let c=e(s);return c.ok&&(n=hg(`${c.stdout}
305
305
  ${c.stderr}`)),c.ok}),o=await ne(r,["auth","status","--format","json"],t.runner?{timeoutMs:dg,runner:t.runner}:{timeoutMs:dg}),i=mg(`${o.stdout}
306
306
  ${o.stderr}`);return!i.userId&&!i.corpId&&h.debug("cli","SLS \u672A\u4ECE dws auth status \u89E3\u6790\u5230\u8EAB\u4EFD",{bin:r,dwsVersion:n,exitCode:o.exitCode,stdout:o.stdout.slice(0,2e3),stderr:o.stderr.slice(0,2e3)}),{identity:i,dwsVersion:n}}catch(e){return h.debug("cli","SLS dws \u73AF\u5883\u63A2\u6D4B\u5931\u8D25",{error:e instanceof Error?e.message:String(e)}),{identity:{}}}}a(Wx,"probeEnvironment");function Bx(t){return ug??=Wx(t),ug}a(Bx,"resolveEnvironment");function zx(t){let e=Object.entries(t).filter(([,n])=>n!==void 0).map(([n,r])=>[n,r instanceof Error?r.message:r]);return e.length?JSON.stringify(Object.fromEntries(e)):void 0}a(zx,"serializeTrackData");function Ux(t=process.platform){return t==="darwin"?"mac":t==="win32"?"windows":t==="linux"?"linux":t}a(Ux,"normalizePlatform");function Kx(t,e,n,r={}){let o={cat:"cli-track",event:t,ts:le(r.now?.()??new Date),env:Or(r.env),version:pg,platform:Ux(),nodeVersion:process.version},{identity:i}=n;i.userId&&(o.uid=i.userId),i.corpId&&(o.corpId=i.corpId),n.dwsVersion&&(o.dwsVersion=n.dwsVersion),$c&&(o.project=$c);let s=zx(e??{});return s&&(o.data=s),o}a(Kx,"buildTrackPayload");async function Pc(t,e,n={}){let r=n.env??process.env;if(gg(r))return;let o=n.fetchFn??(typeof fetch=="function"?fetch:void 0);if(o)try{let i=await Bx(n),s=Kx(t,e,i,n),c=await o(Ox,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({__source__:fg,__logs__:[s]}),signal:AbortSignal.timeout(jx)});c.ok||h.debug("cli","SLS \u4E0A\u62A5\u8FD4\u56DE\u975E 2xx\uFF08\u5DF2\u5FFD\u7565\uFF09",{status:c.status,event:t})}catch(i){h.debug("cli","SLS \u4E0A\u62A5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF09",{event:t,error:i instanceof Error?i.message:String(i)})}}a(Pc,"reportCliEvent");import Mc from"fs";import Jx from"path";import Ci from"fs";import wg from"path";import{createHash as Vx,randomBytes as qx}from"crypto";var Qn=class{static{a(this,"MediaLocalizer")}imageMode;mediaDir;downloadTimeoutMs;imageFetcher;resolvedCache=new Map;failedCache=new Set;inflightDownloads=new Map;constructor(e){this.imageMode=e?.imageMode??"download",this.mediaDir=e?.mediaDir??wg.join(process.cwd(),".aitable","media","dingtalk"),this.downloadTimeoutMs=e?.downloadTimeoutMs??2e4,this.imageFetcher=e?.imageFetcher??Gx}resolved(e){return this.resolvedCache.get(e)}get dir(){return this.mediaDir}register(e,n){return this.resolvedCache.set(e,n),n}failed(e){return this.failedCache.has(e)}markFailed(e){this.failedCache.add(e)}async localizeRemoteUrl(e,n){let r=this.resolvedCache.get(n);if(r)return r;if(this.failedCache.has(n))return null;if(!e)return this.failedCache.add(n),null;if(this.imageMode==="url")return this.resolvedCache.set(n,e),e;let o=this.inflightDownloads.get(n);if(o)return o;let i=this.downloadToLocal(e,n).then(s=>(this.inflightDownloads.delete(n),s?(this.resolvedCache.set(n,s),s):(this.failedCache.add(n),null)),s=>(this.inflightDownloads.delete(n),this.failedCache.add(n),h.error("media-localizer","download unexpected error",{key:n,error:s instanceof Error?s.message:String(s)}),null));return this.inflightDownloads.set(n,i),i}async downloadToLocal(e,n){let r=Hx(e),o=wg.join(this.mediaDir,`${n}.${r}`);if(Ci.existsSync(o))return o;let i;try{i=await this.imageFetcher(e,this.downloadTimeoutMs)}catch(s){return h.error("media-localizer","image download error",{url:e,error:s instanceof Error?s.message:String(s)}),null}if(!i||i.length===0)return h.warn("media-localizer","image download empty",{url:e}),null;try{Ci.mkdirSync(this.mediaDir,{recursive:!0});let s=`${o}.${qx(4).toString("hex")}.tmp`;Ci.writeFileSync(s,i),Ci.renameSync(s,o)}catch(s){return h.error("media-localizer","image write failed",{localPath:o,error:s instanceof Error?s.message:String(s)}),null}return h.debug("media-localizer","image localized",{localPath:o}),o}};function Ti(t){let e=t.replace(/[^A-Za-z0-9_-]/g,"_");return e.length>128?Vx("sha1").update(t).digest("hex"):e}a(Ti,"safeMediaId");function Hx(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp)$/i);return n?n[1].toLowerCase():"png"}a(Hx,"extFromUrl");async function Gx(t,e){let n=new AbortController,r=setTimeout(()=>n.abort(),e);try{let o=await fetch(t,{signal:n.signal});if(!o.ok)return h.warn("media-localizer","image fetch non-ok",{url:t,status:o.status}),null;let i=await o.arrayBuffer();return Buffer.from(i)}finally{clearTimeout(r)}}a(Gx,"defaultImageFetcher");var Zx=3,Yx=480*60*1e3,Qx=/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/;function Oc(t){return t instanceof Error?t.message:String(t)}a(Oc,"errorMessage");function jc(t){let e=t.quotedMessage;if(!Dt(e))return{};let n=e.openMessageId??e.messageId;return typeof n!="string"||!n.trim()?{}:{quotedMessageId:n.trim()}}a(jc,"extractQuotedMessageId");function Ei(t){let e=t.match(Qx);return e?Date.parse(`${e[1]}T${e[2]}${e[3]??""}+08:00`):Date.parse(t)}a(Ei,"parseDwsTime");function Xx(t){let e=typeof t=="string"&&t.trim()?t.trim():"";if(!e)return new Date().toISOString();let n=Ei(e);return Number.isFinite(n)?new Date(n).toISOString():new Date().toISOString()}a(Xx,"normalizeCreateTime");function eI(t){let e=Ei(t);return Number.isFinite(e)?new Date(e+Yx).toISOString().slice(0,19).replace("T"," "):t}a(eI,"formatDwsQueryTime");var tI=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),Tn=class{static{a(this,"DwsMediaResolver")}bin;downloadTimeoutMs;downloadAttempts;retryDelayMs;runner;localizer;constructor(e){this.bin=e.dwsBin,this.downloadTimeoutMs=e.downloadTimeoutMs??2e4,this.downloadAttempts=Math.max(1,(e.downloadRetries??2)+1),this.retryDelayMs=Math.max(0,e.retryDelayMs??1e3),this.runner=e.runner??J,this.localizer=new Qn({...e.imageMode?{imageMode:e.imageMode}:{},...e.mediaDir?{mediaDir:e.mediaDir}:{},...e.downloadTimeoutMs!==void 0?{downloadTimeoutMs:e.downloadTimeoutMs}:{}})}get imageMode(){return this.localizer.imageMode}async resolveContent(e,n,r){let o=[];if(this.localizer.imageMode==="off")return{content:e,images:o};let i=[...e.matchAll(rI)];if(i.length===0)return{content:e,images:o};let s=e;for(let c of i){let l=c[1]??c[2];if(!l)continue;let d=await this.resolveOne(l,n,r);d?(o.push(d),s=s.split(c[0]).join(`![\u56FE\u7247](${d})`)):s=s.split(c[0]).join("[\u56FE\u7247\uFF08\u6682\u65F6\u65E0\u6CD5\u52A0\u8F7D\uFF0C\u8BF7\u7528\u6587\u5B57\u63CF\u8FF0\uFF09]")}return{content:s,images:o}}async resolveOne(e,n,r){let o=Ti(e),i=this.localizer.resolved(o);return i||(this.localizer.failed(o)?null:this.resolveViaDownload(e,n,r,o))}async resolveViaDownload(e,n,r,o){if(!n)return h.warn("dws-media","mediaId missing messageId, cannot download",{conversationId:r}),this.localizer.markFailed(o),null;let i=Jx.join(this.localizer.dir,`${o}.png`);try{Mc.mkdirSync(this.localizer.dir,{recursive:!0})}catch(c){return h.error("dws-media","mkdir media dir failed",{error:c instanceof Error?c.message:String(c)}),this.localizer.markFailed(o),null}let s=["chat","message","download-media","--type","mediaId","--resource-id",e,"--message-id",n,"--open-conversation-id",r,"--output",i,"--format","json","-y"];for(let c=1;c<=this.downloadAttempts;c++){let l=await this.tryDownloadOnce(s,i,o,c);if(l.ref)return l.ref;if(!l.retryable)break;c<this.downloadAttempts&&await tI(this.retryDelayMs*c)}return this.localizer.markFailed(o),null}async tryDownloadOnce(e,n,r,o){let i;try{i=await ne(this.bin,e,{timeoutMs:this.downloadTimeoutMs,runner:this.runner})}catch(s){return h.warn("dws-media","download-media invocation failed",{attempt:o,error:s instanceof Error?s.message:String(s)}),{retryable:!0}}if(i.exitCode!==0)return h.warn("dws-media","download-media non-zero exit",{attempt:o,exitCode:i.exitCode,stderr:i.stderr.slice(0,200)}),{retryable:!0};if(this.localizer.imageMode==="url"){let s=nI(i.stdout);return s?{ref:this.localizer.register(r,s),retryable:!1}:(h.warn("dws-media","download-media returned no downloadUrl",{attempt:o}),{retryable:!0})}return!Mc.existsSync(n)||Mc.statSync(n).size===0?(h.warn("dws-media","download-media wrote no file",{outPath:n,attempt:o}),{retryable:!0}):{ref:this.localizer.register(r,n),retryable:!1}}},_i=class{static{a(this,"DwsPullAdapter")}name="dws_pull";bin;timeoutMs;runner;media;failures=new Gn(Zx);resolveUserIds;contactResolver;constructor(e){this.bin=e.dwsBin,this.timeoutMs=e.timeoutMs??15e3,this.runner=e.runner??J,this.media=new Tn({dwsBin:e.dwsBin,...e.imageMode?{imageMode:e.imageMode}:{},...e.mediaDir?{mediaDir:e.mediaDir}:{},...e.downloadTimeoutMs!==void 0?{downloadTimeoutMs:e.downloadTimeoutMs}:{},...e.runner?{runner:e.runner}:{}}),this.resolveUserIds=e.resolveUserIds??!1,this.resolveUserIds&&(this.contactResolver=mi({runner:this.runner,dwsBin:this.bin}))}async fetchMessages(e,n,r){let o=["chat","message","list","--group",e,"--time",eI(n),"--limit",String(r),"--format","json"],i=a(async()=>{let l=await ne(this.bin,o,{timeoutMs:this.timeoutMs,runner:this.runner});if(l.exitCode!==0)throw new Error(`dws chat message list exited ${l.exitCode}: ${l.stderr.slice(0,300)}`);let d=l.stdout.trim();if(!d)return{messages:[]};let u;try{u=JSON.parse(d)}catch{throw new Error(`dws chat message list returned invalid JSON: ${d.slice(0,200)}`)}let f=this.parseMessages(u),p=dI(u);return{messages:f,...p}},"attempt"),s;try{s=await wn(i,{onRetry:a((d,u)=>{let f={conversationId:e,retry:u,error:Oc(d)};u>=2?h.warn("message-adapter","fetch transient failure, retrying",f):h.debug("message-adapter","fetch transient failure, retrying",f)},"onRetry")});let{recovered:l}=this.failures.succeed(e);l&&h.info("message-adapter","message fetch recovered",{conversationId:e})}catch(l){let{consecutive:d,escalate:u}=this.failures.fail(e),f={conversationId:e,consecutive:d,error:Oc(l)};return u?h.error("message-adapter","sustained message fetch failure \u2014 check dws identity/permission for this conversation",f):h.warn("message-adapter","message fetch failed after retries",f),{messages:[]}}let c=await this.resolveMedia(s.messages,e);return await this.resolveContacts(c),{messages:c,nextCursor:s.nextCursor,hasMore:s.hasMore}}parseMessages(e){let n=[],r=cI(e);for(let o of r){if(!Dt(o))continue;let i=Di(lI(o)),s=Ai(i)||aI(o);!i&&!s||n.push({sender:String(o.sender??o.senderId??o.from??""),senderName:typeof o.senderName=="string"?o.senderName:typeof o.senderNick=="string"?o.senderNick:void 0,senderOpenDingTalkId:typeof o.senderOpenDingTalkId=="string"?o.senderOpenDingTalkId:typeof o.senderOpenDingtalkId=="string"?o.senderOpenDingtalkId:typeof o.openDingTalkId=="string"?o.openDingTalkId:void 0,createTime:Xx(o.createTime??o.create_time??o.time),content:i??"",messageId:typeof o.messageId=="string"?o.messageId:typeof o.message_id=="string"?o.message_id:typeof o.msgId=="string"?o.msgId:typeof o.openMessageId=="string"?o.openMessageId:void 0,msgType:typeof o.msgType=="string"?o.msgType:typeof o.msg_type=="string"?o.msg_type:void 0,...jc(o)})}return h.debug("message-adapter","parsed messages",{count:n.length}),n}async resolveMedia(e,n){if(this.media.imageMode==="off")return e;for(let r of e){if(!Ai(r.content))continue;let{content:o,images:i}=await this.media.resolveContent(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}return e}async resolveContacts(e){if(!this.resolveUserIds||!this.contactResolver)return;let n=new Map;for(let r of e){let o=r.senderOpenDingTalkId;if(!o)continue;let i=n.get(o);i||(i=this.contactResolver(o,r.senderName??r.sender),n.set(o,i));try{let s=await i;s&&(r.userId=s)}catch(s){h.warn("message-adapter","resolve contact failed",{openId:o,error:Oc(s)})}}}};function Dt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Dt,"isRecord");function nI(t){let e=t.indexOf("{");if(e===-1)return null;let n;try{n=JSON.parse(t.slice(e))}catch{return null}let r=new Set,o=[n];for(;o.length>0;){let i=o.pop();if(!Dt(i)||r.has(i))continue;r.add(i);let s=i.downloadUrl;if(typeof s=="string"&&s)return s;for(let c of Object.values(i))Dt(c)&&o.push(c)}return null}a(nI,"extractDownloadUrl");var rI=/\[图片消息\]\(mediaId=([@$][A-Za-z0-9_$+/=-]+)\)|!\[(?:图片|image)\]\(([@$][A-Za-z0-9_$+/=-]+)\)/g;function Ai(t){return t?t.includes("[\u56FE\u7247\u6D88\u606F](mediaId=")||t.includes("![\u56FE\u7247](@")||t.includes("![\u56FE\u7247]($")||t.includes("![image](@")||t.includes("![image]($"):!1}a(Ai,"hasImageMarker");var oI=/\[(语音|视频|文件)消息\]\(mediaId=[@$][A-Za-z0-9_$+/=-]+\)/g,iI=/[ \t]*[^\n\])]{0,24}?dws chat message download-media[^\n]*/g,sI="[\u8BED\u97F3\u6D88\u606F]";function Di(t){if(!t)return t;let e=/\[语音消息\]\(mediaId=/.test(t),n=t.replace(oI,(r,o)=>o==="\u8BED\u97F3"?"":`[${o}]`).replace(iI,"");return n=n.split(`
307
307
  `).map(r=>r.trim()).filter(Boolean).join(`
308
308
  `).trim(),n.includes("download-media")&&h.warn("message-adapter","dws \u5A92\u4F53\u63D0\u793A\u672A\u80FD\u5B8C\u5168\u5265\u79BB\uFF0C\u683C\u5F0F\u53EF\u80FD\u5DF2\u53D8\u66F4",{sample:n.slice(0,120)}),!n&&e?sI:n}a(Di,"normalizeDwsMediaNoise");function aI(t){let e=t.msgType??t.msg_type;if(typeof e!="string")return!1;let n=e.toLowerCase();return n==="picture"||n==="image"||n==="img"}a(aI,"isImageMsgType");function cI(t){if(Array.isArray(t))return t;if(!Dt(t))return[];for(let e of["body","data","result","response"]){let n=t[e];if(Array.isArray(n))return n;if(Dt(n))for(let r of["messages","items","list","records"]){let o=n[r];if(Array.isArray(o))return o}}for(let e of["messages","items","list","records"]){let n=t[e];if(Array.isArray(n))return n}return[]}a(cI,"findMessageArray");function lI(t){for(let e of["text","content","body","markdown"]){let n=t[e];if(typeof n=="string"&&n.trim())return n.trim()}if(Dt(t.content)){let e=t.content;for(let n of["text","content","markdown"]){let r=e[n];if(typeof r=="string"&&r.trim())return r.trim()}}return null}a(lI,"extractTextContent");function dI(t){if(!Dt(t))return{};for(let e of["body","data","result","response"]){let n=t[e];if(Dt(n)){let r=bg(n);if(r.nextCursor||r.hasMore!==void 0)return r}}return bg(t)}a(dI,"extractCursorInfo");function bg(t){let e=typeof t.nextCursor=="string"&&t.nextCursor.trim()?t.nextCursor.trim():typeof t.next_cursor=="string"&&t.next_cursor.trim()?t.next_cursor.trim():typeof t.nextToken=="string"&&t.nextToken.trim()?t.nextToken.trim():void 0,n=typeof t.hasMore=="boolean"?t.hasMore:typeof t.has_more=="boolean"?t.has_more:void 0;return{nextCursor:e,hasMore:n}}a(bg,"extractCursorFromLevel");import Fc from"path";var uI=/^\$\{(env|config|globalVar)\.([^}?]+)(\?)?\}$/;function ze(t){if(typeof t!="string")return null;let e=t.match(uI);return e?{ns:e[1],path:e[2]}:null}a(ze,"runtimeRefTarget");function vt(t,e){let n=ze(t);if(!n)return t;switch(n.ns){case"env":return e.configScope?.getEnv(n.path);case"config":return e.configScope?.getConfig(n.path);case"globalVar":return e.globalVars?.get(n.path)}}a(vt,"resolveRuntimeRef");function Qt(t){return ze(t)!==null}a(Qt,"isRuntimeRef");var Jr=class{static{a(this,"DingTalkMessageSource")}name;config;pollIntervalMs;running=!1;abortController=null;adapter;seenIds=new Set;aggregateBySender;states=new Map;configDir;conversationIdsRaw;globalVars;configScope;unsubscribes=[];watched=new Set;getWatchedConversationIds(){return[...this.watched]}resolveConversationIds(){let e=vt(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(fI(n))}refresh(){this.applyWatched(this.resolveConversationIds())}applyWatched(e){let n=new Date().toISOString();for(let r of e)this.states.has(r)||this.states.set(r,{lastFetchTime:n});for(let r of[...this.states.keys()])e.has(r)||this.states.delete(r);this.watched=e}refreshForTest(){this.refresh()}constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.aggregateBySender=this.config.aggregateBySender??!0,this.globalVars=n?.globalVars,this.configScope=n?.configScope,this.conversationIdsRaw=this.config.conversationIds;let r=typeof e.config.configDir=="string"?e.config.configDir:process.cwd();this.configDir=r;let o=this.config.mediaDir?Fc.isAbsolute(this.config.mediaDir)?this.config.mediaDir:Fc.resolve(r,this.config.mediaDir):Fc.join(r,".aitable","media","dingtalk");this.adapter=new _i({dwsBin:this.config.dwsBin??"dws",imageMode:this.config.imageMode,mediaDir:o,downloadTimeoutMs:this.config.downloadTimeoutMs,resolveUserIds:this.config.resolveUserIds}),this.refresh();let i=e.config;this.pollIntervalMs=typeof i.poll_interval_ms=="number"?i.poll_interval_ms:typeof i.pollIntervalMs=="number"?i.pollIntervalMs:5e3}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController;let n=ze(this.conversationIdsRaw);if(n){let r=n.path.split(".")[0];n.ns==="globalVar"&&this.globalVars?this.unsubscribes.push(this.globalVars.subscribe(r,()=>this.refresh())):(n.ns==="env"||n.ns==="config")&&this.configScope&&this.unsubscribes.push(this.configScope.subscribe(`${n.ns}.${r}`,()=>this.refresh()))}for(h.info("dingtalk-message-source","started",{name:this.name,conversationIds:this.getWatchedConversationIds(),pollIntervalMs:this.pollIntervalMs});this.running;){try{let r=await this.poll();r.length>0&&e(r)}catch(r){h.error("dingtalk-message-source","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.pollIntervalMs)}h.info("dingtalk-message-source","stopped",{name:this.name})}stop(){this.running=!1,this.abortController?.abort();for(let e of this.unsubscribes)e();this.unsubscribes=[]}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}async poll(){this.refresh();let e=this.getWatchedConversationIds();h.info("dingtalk-message-source","polling",{name:this.name,conversationIds:e});let n=await Promise.allSettled(e.map(o=>this.collectConversation(o))),r=[];return n.forEach((o,i)=>{o.status==="fulfilled"?r.push(...o.value):h.error("dingtalk-message-source","conversation fetch failed",{name:this.name,conversationId:e[i],error:o.reason instanceof Error?o.reason.message:String(o.reason)})}),r}async collectConversation(e){let n=this.states.get(e);if(!n)return[];let r=await this.adapter.fetchMessages(e,n.lastFetchTime,this.config.fetchLimit??50),o=r.messages;if(o.length>0){let c=o[0].createTime,l=Date.parse(c);for(let d of o){let u=Date.parse(d.createTime);!Number.isNaN(u)&&(Number.isNaN(l)||u>l)&&(c=d.createTime,l=u)}n.lastFetchTime=c}else if(r.nextCursor){let c=Date.parse(r.nextCursor);if(Number.isFinite(c))n.lastFetchTime=new Date(c).toISOString();else{let l=r.nextCursor.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/);if(l){let d=Date.parse(`${l[1]}T${l[2]}${l[3]??""}+08:00`);Number.isFinite(d)&&(n.lastFetchTime=new Date(d).toISOString())}}h.info("dingtalk-message-source","cursor advanced via nextCursor (empty page)",{name:this.name,conversationId:e,nextCursor:r.nextCursor,newLastFetchTime:n.lastFetchTime})}let i=this.sortByCreateTimeAsc(this.dedup(this.filterBySender(o)));if(i.length===0)return[];let s=this.aggregateBySender?this.groupBySender(i):[{sender:null,messages:i}];return h.info("dingtalk-message-source","emitting message_received",{name:this.name,conversationId:e,eventCount:s.length,messageCount:i.length}),s.map(c=>this.buildEvent(e,c.messages,c.sender))}groupBySender(e){let n=[],r=new Map;for(let o of e){let i=o.sender,s=r.get(i);s||(s=[],r.set(i,s),n.push(i)),s.push(o)}return n.map(o=>{let i=r.get(o);return{sender:{id:o,name:i[0]?.senderName,openDingTalkId:i[0]?.senderOpenDingTalkId,userId:i[0]?.userId},messages:i}})}buildEvent(e,n,r){let o={conversationId:e,messages:n,content:n.map(s=>`${s.senderName??s.sender}: ${s.content}`).join(`
309
- `),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString()},i=n.flatMap(s=>s.images??[]);return i.length>0&&(o.images=i),r&&(o.sender=r.id,o.senderName=r.name??r.id,r.openDingTalkId&&(o.senderOpenDingTalkId=r.openDingTalkId),r.userId&&(o.senderUserId=r.userId)),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}sortByCreateTimeAsc(e){return e.map((n,r)=>({msg:n,idx:r,ms:Date.parse(n.createTime)})).sort((n,r)=>{let o=Number.isNaN(n.ms)?-1/0:n.ms,i=Number.isNaN(r.ms)?-1/0:r.ms;return o===i?n.idx-r.idx:o-i}).map(n=>n.msg)}dedup(e){let n=[];for(let r of e){let o=r.messageId??`${r.sender}:${r.createTime}:${r.content.slice(0,50)}`;this.seenIds.has(o)||(this.seenIds.add(o),n.push(r))}if(this.seenIds.size>5e3){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-3e3))this.seenIds.add(o)}return n}filterBySender(e){let n=e;if(this.config.watchSenders&&this.config.watchSenders.length>0){let r=new Set(this.config.watchSenders);n=n.filter(o=>r.has(o.sender)||o.senderName!=null&&r.has(o.senderName))}if(this.config.ignoreSenders&&this.config.ignoreSenders.length>0){let r=new Set(this.config.ignoreSenders);n=n.filter(o=>!r.has(o.sender)&&!(o.senderName!=null&&r.has(o.senderName)))}return n}parseConfig(e){return{conversationIds:e.conversation_ids??e.conversationIds,sourceAdapter:e.source_adapter??e.sourceAdapter??"dws_pull",dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchSenders:Array.isArray(e.watch_senders)?e.watch_senders.map(String):Array.isArray(e.watchSenders)?e.watchSenders.map(String):void 0,ignoreSenders:Array.isArray(e.ignore_senders)?e.ignore_senders.map(String):Array.isArray(e.ignoreSenders)?e.ignoreSenders.map(String):void 0,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0,downloadTimeoutMs:typeof e.download_timeout_ms=="number"?e.download_timeout_ms:typeof e.downloadTimeoutMs=="number"?e.downloadTimeoutMs:void 0,resolveUserIds:typeof e.resolve_user_ids=="boolean"?e.resolve_user_ids:typeof e.resolveUserIds=="boolean"?e.resolveUserIds:void 0}}};function fI(t){return Array.isArray(t)?t.map(e=>typeof e=="string"?e:e&&typeof e=="object"?String(e.groupId??""):"").map(e=>e.trim()).filter(e=>e.length>0):[]}a(fI,"extractConversationIds");var $i=class{static{a(this,"DingTalkUserMessageSource")}name;config;pollIntervalMs;running=!1;abortController=null;aggregateBySender;seenIds=new Set;lastFetchTime;dwsBin;runner;media;conversationIdsRaw;globalVars;configScope;unsubscribes=[];constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.aggregateBySender=this.config.aggregateBySender??!0,this.globalVars=n?.globalVars,this.configScope=n?.configScope,this.conversationIdsRaw=this.config.conversationIds,this.dwsBin=this.config.dwsBin??"dws",this.runner=J,this.media=new Tn({dwsBin:this.dwsBin,...this.config.imageMode?{imageMode:this.config.imageMode}:{},...this.config.mediaDir?{mediaDir:this.config.mediaDir}:{}}),this.lastFetchTime=this.formatWallClock(new Date);let r=e.config;this.pollIntervalMs=typeof r.poll_interval_ms=="number"?r.poll_interval_ms:typeof r.pollIntervalMs=="number"?r.pollIntervalMs:3e4}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController;let n=ze(this.conversationIdsRaw);if(n){let r=n.path.split(".")[0];n.ns==="globalVar"&&this.globalVars&&this.unsubscribes.push(this.globalVars.subscribe(r,()=>{}))}for(h.info("dingtalk-user-message-source","started",{name:this.name,pollIntervalMs:this.pollIntervalMs});this.running;){try{let r=await this.poll();r.length>0&&e(r)}catch(r){h.error("dingtalk-user-message-source","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.pollIntervalMs)}h.info("dingtalk-user-message-source","stopped",{name:this.name})}stop(){this.running=!1,this.abortController?.abort();for(let e of this.unsubscribes)e();this.unsubscribes=[]}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}resolveConversationIds(){let e=vt(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(n.map(r=>typeof r=="string"?r.trim():r&&typeof r=="object"?String(r.groupId??"").trim():"").filter(r=>r.length>0))}async poll(){let e=this.resolveConversationIds();if(e.size===0)return h.debug("dingtalk-user-message-source","no conversation_ids configured, skipping poll"),[];let n=new Date,r=this.lastFetchTime,o=this.formatWallClock(n),i=await this.fetchAllPages(r,o,e);if(this.lastFetchTime=o,i.size===0)return[];let s=this.config.excludeAtBot??!0,c=[];for(let[l,d]of i.entries()){let u=this.filterMessages(d.messages,s);if(u.length===0)continue;let f=this.aggregateBySender?this.groupBySender(u):[{sender:null,messages:u}];for(let p of f)c.push(this.buildEvent(l,p.messages,p.sender,d.title))}return h.info("dingtalk-user-message-source","poll complete",{name:this.name,watchedGroups:e.size,eventsEmitted:c.length}),c}async fetchAllPages(e,n,r){let o=new Map,i="0",s=this.config.maxPages??20,c=this.config.pageSize??50;for(let l=0;l<s;l++){let d=["chat","message","list-all","--start",e,"--end",n,"--limit",String(c),"--cursor",i,"--format","json"],u;try{let m=await ne(this.dwsBin,d,{timeoutMs:3e4,runner:this.runner});if(m.exitCode!==0){h.error("dingtalk-user-message-source","list-all failed",{exitCode:m.exitCode,stderr:m.stderr.slice(0,300)});break}u=m.stdout.trim()}catch(m){h.error("dingtalk-user-message-source","list-all command error",{error:m instanceof Error?m.message:String(m)});break}if(!u)break;let f;try{f=JSON.parse(u)}catch{h.error("dingtalk-user-message-source","list-all invalid JSON",{output:u.slice(0,200)});break}let p=f.result?.conversationMessagesList??[],g=this.config.conversationTypes??[];for(let m of p){let y=m.openConversationId??m.conversationId??"";if(!y||!r.has(y))continue;if(g.length>0){let b=m.conversationType,x=b==="2"||m.singleChat===!1,I=b==="1"||m.singleChat===!0,v=g.includes("group"),k=g.includes("1to1");if((v||k)&&!(v&&x||k&&I))continue}let w=this.parseConversationMessages(m.messages??[]);if(w.length>0){await this.resolveMedia(w,y);let b=o.get(y)??{title:typeof m.title=="string"&&m.title.trim()||void 0,messages:[]};b.messages.push(...w),o.set(y,b)}}if(!f.result?.hasMore||(i=f.result?.nextCursor??"",!i))break}return o}async resolveMedia(e,n){if(this.media.imageMode!=="off")for(let r of e){if(!Ai(r.content))continue;let{content:o,images:i}=await this.media.resolveContent(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}}parseConversationMessages(e){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r,i=this.extractContent(o);if(!i)continue;let s=typeof o.messageId=="string"?o.messageId:typeof o.openMessageId=="string"?o.openMessageId:void 0,c=s??`${o.sender}:${o.createTime}:${(i??"").slice(0,50)}`;this.seenIds.has(c)||(this.seenIds.add(c),n.push({sender:String(o.sender??o.senderId??""),senderName:typeof o.senderName=="string"?o.senderName:typeof o.senderNick=="string"?o.senderNick:void 0,senderOpenDingTalkId:typeof o.senderOpenDingTalkId=="string"?o.senderOpenDingTalkId:typeof o.openDingTalkId=="string"?o.openDingTalkId:void 0,createTime:this.normalizeCreateTime(o.createTime??o.create_time),content:i,messageId:s,msgType:typeof o.msgType=="string"?o.msgType:void 0,...jc(o)}))}if(this.seenIds.size>1e4){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-6e3))this.seenIds.add(o)}return n}filterMessages(e,n){return e.filter(r=>!(n&&this.looksLikeAtBot(r.content)))}looksLikeAtBot(e){return/^@[\S]+\s/.test(e)}groupBySender(e){let n=[],r=new Map;for(let o of e){let i=o.sender,s=r.get(i);s||(s=[],r.set(i,s),n.push(i)),s.push(o)}return n.map(o=>{let i=r.get(o);return{sender:{id:o,name:i[0]?.senderName,openDingTalkId:i[0]?.senderOpenDingTalkId},messages:i}})}buildEvent(e,n,r,o){let i={conversationId:e,messages:n,content:n.map(s=>`${s.senderName??s.sender}: ${s.content}`).join(`
309
+ `),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString()},i=n.flatMap(s=>s.images??[]);return i.length>0&&(o.images=i),r&&(o.sender=r.id,o.senderName=r.name??r.id,r.openDingTalkId&&(o.senderOpenDingTalkId=r.openDingTalkId),r.userId&&(o.senderUserId=r.userId)),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}sortByCreateTimeAsc(e){return e.map((n,r)=>({msg:n,idx:r,ms:Date.parse(n.createTime)})).sort((n,r)=>{let o=Number.isNaN(n.ms)?-1/0:n.ms,i=Number.isNaN(r.ms)?-1/0:r.ms;return o===i?n.idx-r.idx:o-i}).map(n=>n.msg)}dedup(e){let n=[];for(let r of e){let o=r.messageId??`${r.sender}:${r.createTime}:${r.content.slice(0,50)}`;this.seenIds.has(o)||(this.seenIds.add(o),n.push(r))}if(this.seenIds.size>5e3){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-3e3))this.seenIds.add(o)}return n}filterBySender(e){let n=e;if(this.config.watchSenders&&this.config.watchSenders.length>0){let r=new Set(this.config.watchSenders);n=n.filter(o=>r.has(o.sender)||o.senderName!=null&&r.has(o.senderName))}if(this.config.ignoreSenders&&this.config.ignoreSenders.length>0){let r=new Set(this.config.ignoreSenders);n=n.filter(o=>!r.has(o.sender)&&!(o.senderName!=null&&r.has(o.senderName)))}return n}parseConfig(e){return{conversationIds:e.conversation_ids??e.conversationIds,sourceAdapter:e.source_adapter??e.sourceAdapter??"dws_pull",dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchSenders:Array.isArray(e.watch_senders)?e.watch_senders.map(String):Array.isArray(e.watchSenders)?e.watchSenders.map(String):void 0,ignoreSenders:Array.isArray(e.ignore_senders)?e.ignore_senders.map(String):Array.isArray(e.ignoreSenders)?e.ignoreSenders.map(String):void 0,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0,downloadTimeoutMs:typeof e.download_timeout_ms=="number"?e.download_timeout_ms:typeof e.downloadTimeoutMs=="number"?e.downloadTimeoutMs:void 0,resolveUserIds:typeof e.resolve_user_ids=="boolean"?e.resolve_user_ids:typeof e.resolveUserIds=="boolean"?e.resolveUserIds:void 0}}};function fI(t){return Array.isArray(t)?t.map(e=>typeof e=="string"?e:e&&typeof e=="object"?String(e.groupId??""):"").map(e=>e.trim()).filter(e=>e.length>0):[]}a(fI,"extractConversationIds");var $i=class{static{a(this,"DingTalkUserMessageSource")}name;config;pollIntervalMs;running=!1;abortController=null;aggregateBySender;seenIds=new Set;lastFetchTime;dwsBin;runner;media;conversationIdsRaw;globalVars;configScope;unsubscribes=[];constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.aggregateBySender=this.config.aggregateBySender??!0,this.globalVars=n?.globalVars,this.configScope=n?.configScope,this.conversationIdsRaw=this.config.conversationIds,this.dwsBin=this.config.dwsBin??"dws",this.runner=J,this.media=new Tn({dwsBin:this.dwsBin,...this.config.imageMode?{imageMode:this.config.imageMode}:{},...this.config.mediaDir?{mediaDir:this.config.mediaDir}:{}}),this.lastFetchTime=this.formatWallClock(new Date);let r=e.config;this.pollIntervalMs=typeof r.poll_interval_ms=="number"?r.poll_interval_ms:typeof r.pollIntervalMs=="number"?r.pollIntervalMs:3e4}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController;let n=ze(this.conversationIdsRaw);if(n){let r=n.path.split(".")[0];n.ns==="globalVar"&&this.globalVars&&this.unsubscribes.push(this.globalVars.subscribe(r,()=>{}))}for(h.info("dingtalk-user-message-source","started",{name:this.name,pollIntervalMs:this.pollIntervalMs});this.running;){try{let r=await this.poll();r.length>0&&e(r)}catch(r){h.error("dingtalk-user-message-source","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.pollIntervalMs)}h.info("dingtalk-user-message-source","stopped",{name:this.name})}stop(){this.running=!1,this.abortController?.abort();for(let e of this.unsubscribes)e();this.unsubscribes=[]}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}resolveConversationIds(){let e=vt(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(n.map(r=>typeof r=="string"?r.trim():r&&typeof r=="object"?String(r.groupId??"").trim():"").filter(r=>r.length>0))}async poll(){let e=this.resolveConversationIds();if(e.size===0)return h.debug("dingtalk-user-message-source","no conversation_ids configured, skipping poll"),[];let n=new Date,r=this.lastFetchTime,o=this.formatWallClock(n),i=await this.fetchAllPages(r,o,e);if(this.lastFetchTime=o,i.size===0)return[];let s=this.config.excludeAtBot??!0,c=[];for(let[l,d]of i.entries()){let u=this.filterMessages(d.messages,s);if(u.length===0)continue;let f=this.aggregateBySender?this.groupBySender(u):[{sender:null,messages:u}];for(let p of f)c.push(this.buildEvent(l,p.messages,p.sender,d.title))}return h.info("dingtalk-user-message-source","poll complete",{name:this.name,watchedGroups:e.size,eventsEmitted:c.length}),c}async fetchAllPages(e,n,r){let o=new Map,i="0",s=this.config.maxPages??20,c=this.config.pageSize??50;for(let l=0;l<s;l++){let d=["chat","message","list-all","--start",e,"--end",n,"--limit",String(c),"--cursor",i,"--format","json"],u;try{let m=await ne(this.dwsBin,d,{timeoutMs:3e4,runner:this.runner});if(m.exitCode!==0){h.error("dingtalk-user-message-source","list-all failed",{exitCode:m.exitCode,stderr:m.stderr.slice(0,300)});break}u=m.stdout.trim()}catch(m){h.error("dingtalk-user-message-source","list-all command error",{error:m instanceof Error?m.message:String(m)});break}if(!u)break;let f;try{f=JSON.parse(u)}catch{h.error("dingtalk-user-message-source","list-all invalid JSON",{output:u.slice(0,200)});break}let p=f.result?.conversationMessagesList??[],g=this.config.conversationTypes??[];for(let m of p){let y=m.openConversationId??m.conversationId??"";if(!y||!r.has(y))continue;if(g.length>0){let b=m.conversationType,x=b==="2"||m.singleChat===!1,I=b==="1"||m.singleChat===!0,S=g.includes("group"),k=g.includes("1to1");if((S||k)&&!(S&&x||k&&I))continue}let w=this.parseConversationMessages(m.messages??[]);if(w.length>0){await this.resolveMedia(w,y);let b=o.get(y)??{title:typeof m.title=="string"&&m.title.trim()||void 0,messages:[]};b.messages.push(...w),o.set(y,b)}}if(!f.result?.hasMore||(i=f.result?.nextCursor??"",!i))break}return o}async resolveMedia(e,n){if(this.media.imageMode!=="off")for(let r of e){if(!Ai(r.content))continue;let{content:o,images:i}=await this.media.resolveContent(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}}parseConversationMessages(e){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r,i=this.extractContent(o);if(!i)continue;let s=typeof o.messageId=="string"?o.messageId:typeof o.openMessageId=="string"?o.openMessageId:void 0,c=s??`${o.sender}:${o.createTime}:${(i??"").slice(0,50)}`;this.seenIds.has(c)||(this.seenIds.add(c),n.push({sender:String(o.sender??o.senderId??""),senderName:typeof o.senderName=="string"?o.senderName:typeof o.senderNick=="string"?o.senderNick:void 0,senderOpenDingTalkId:typeof o.senderOpenDingTalkId=="string"?o.senderOpenDingTalkId:typeof o.openDingTalkId=="string"?o.openDingTalkId:void 0,createTime:this.normalizeCreateTime(o.createTime??o.create_time),content:i,messageId:s,msgType:typeof o.msgType=="string"?o.msgType:void 0,...jc(o)}))}if(this.seenIds.size>1e4){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-6e3))this.seenIds.add(o)}return n}filterMessages(e,n){return e.filter(r=>!(n&&this.looksLikeAtBot(r.content)))}looksLikeAtBot(e){return/^@[\S]+\s/.test(e)}groupBySender(e){let n=[],r=new Map;for(let o of e){let i=o.sender,s=r.get(i);s||(s=[],r.set(i,s),n.push(i)),s.push(o)}return n.map(o=>{let i=r.get(o);return{sender:{id:o,name:i[0]?.senderName,openDingTalkId:i[0]?.senderOpenDingTalkId},messages:i}})}buildEvent(e,n,r,o){let i={conversationId:e,messages:n,content:n.map(s=>`${s.senderName??s.sender}: ${s.content}`).join(`
310
310
  `),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString(),source:"user_message",...o?{conversationTitle:o}:{}};return r&&(i.sender=r.id,i.senderName=r.name??r.id,r.openDingTalkId&&(i.senderOpenDingTalkId=r.openDingTalkId)),{type:"message_received",payload:i,timestamp:new Date().toISOString(),itemId:null}}extractContent(e){for(let n of["text","content","body","markdown"]){let r=e[n];if(typeof r=="string"&&r.trim())return Di(r.trim())}if(e.content&&typeof e.content=="object"){let n=e.content;for(let r of["text","content","markdown"]){let o=n[r];if(typeof o=="string"&&o.trim())return Di(o.trim())}}return null}normalizeCreateTime(e){let n=typeof e=="string"&&e.trim()?e.trim():"";if(!n)return new Date().toISOString();let r=n.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/);if(r){let i=Date.parse(`${r[1]}T${r[2]}${r[3]??""}+08:00`);return Number.isFinite(i)?new Date(i).toISOString():new Date().toISOString()}let o=Date.parse(n);return Number.isFinite(o)?new Date(o).toISOString():new Date().toISOString()}formatWallClock(e){return new Date(e.getTime()+288e5).toISOString().slice(0,19).replace("T"," ")}parseConfig(e){let n=e.filters&&typeof e.filters=="object"?e.filters:{};return{conversationIds:e.conversation_ids??e.conversationIds??n.conversation_ids??n.conversationIds,excludeAtBot:typeof e.exclude_at_bot=="boolean"?e.exclude_at_bot:typeof e.excludeAtBot=="boolean"?e.excludeAtBot:typeof n.exclude_at_bot=="boolean"?n.exclude_at_bot:typeof n.excludeAtBot=="boolean"?n.excludeAtBot:void 0,conversationTypes:Array.isArray(e.conversation_types)?e.conversation_types.map(String):Array.isArray(e.conversationTypes)?e.conversationTypes.map(String):Array.isArray(n.conversation_types)?n.conversation_types.map(String):Array.isArray(n.conversationTypes)?n.conversationTypes.map(String):void 0,dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,pageSize:typeof e.page_size=="number"?e.page_size:typeof e.pageSize=="number"?e.pageSize:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0}}};import Nc from"path";var kg=1e4,pI=100,gI=600*1e3,vg=2e3,mI=1e3,hI=3e4,yI=5e3,wI="1",Sg="__inline__",Pi=class{static{a(this,"DingTalkStreamSource")}name;config;running=!1;onEvent=null;connections=new Map;seenMsgIds=new Map;dropDirectWarned=!1;localizer;injectedDownloader;globalVars;configScope;unsubscribes=[];healthCheckTimer=null;constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.globalVars=n?.globalVars,this.configScope=n?.configScope;let r=typeof e.config.configDir=="string"?e.config.configDir:process.cwd(),o=this.config.mediaDir?Nc.isAbsolute(this.config.mediaDir)?this.config.mediaDir:Nc.resolve(r,this.config.mediaDir):Nc.join(r,".aitable","media","dingtalk");this.localizer=new Qn({...this.config.imageMode?{imageMode:this.config.imageMode}:{},mediaDir:o});let i=e.config.mediaDownloader;this.injectedDownloader=typeof i=="function"?i:void 0}buildDownloader(e,n){if(this.injectedDownloader)return this.injectedDownloader;if(this.config.imageMode==="off"||!e||!n)return;let r=new Et({appKey:e,appSecret:n});return(o,i)=>r.downloadMessageFile(o,i)}async start(e){if(!this.running){if(this.running=!0,this.onEvent=e,this.startHealthCheck(),this.config.clientId&&this.config.clientSecret&&(h.info("dingtalk-stream-source","starting (inline)",{name:this.name,clientId:vI(this.config.clientId),...this.config.endpoint?{endpoint:this.config.endpoint}:{}}),this.connectRobot(Sg,this.config.clientId,this.config.clientSecret)),this.config.robotRefs!==void 0||this.config.robotCreds!==void 0){h.info("dingtalk-stream-source","starting (dynamic)",{name:this.name}),this.reconcile();for(let n of[this.config.robotRefs,this.config.robotCreds]){let r=ze(n);if(!r)continue;let o=r.path.split(".")[0];r.ns==="globalVar"&&this.globalVars?this.unsubscribes.push(this.globalVars.subscribe(o,()=>this.reconcile())):(r.ns==="env"||r.ns==="config")&&this.configScope&&this.unsubscribes.push(this.configScope.subscribe(`${r.ns}.${o}`,()=>this.reconcile()))}}!this.config.clientId&&this.config.robotRefs===void 0&&this.config.robotCreds===void 0&&h.warn("dingtalk-stream-source","skip: \u672A\u914D\u7F6E clientId/clientSecret \u6216 robot_creds",{name:this.name})}}stop(){this.running=!1,this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null);for(let e of this.unsubscribes)e();this.unsubscribes=[];for(let e of[...this.connections.keys()]){let n=this.connections.get(e);n&&this.disconnectRobot(e,n)}h.info("dingtalk-stream-source","stopped",{name:this.name})}reconcile(){let{creds:e,refs:n}=this.resolveRobotCredentials(),r=new Set(n);for(let o of r){let i=e[o];if(!i?.client_id||!i?.client_secret){this.connections.has(o)||h.warn("dingtalk-stream-source","robot \u51ED\u636E\u672A\u627E\u5230\uFF0C\u7B49\u5F85\u53D1\u5E03",{name:this.name,credRef:o});continue}let s=this.connections.get(o);if(s){if(s.clientId===i.client_id&&s.clientSecret===i.client_secret)continue;this.disconnectRobot(o,s)}this.connectRobot(o,i.client_id,i.client_secret)}for(let[o,i]of this.connections)o!==Sg&&(r.has(o)||this.disconnectRobot(o,i))}resolveRef(e){return vt(e,{configScope:this.configScope,globalVars:this.globalVars})}resolveRobotCredentials(){let e=this.resolveRef(this.config.robotCreds);if(Ig(e)){let i=this.resolveRef(this.config.robotRefs),s=Array.isArray(i)?i.map(c=>String(c).trim()).filter(Boolean):Object.keys(e).map(c=>c.trim()).filter(Boolean);return{creds:e,refs:s}}let n=this.resolveRef(this.config.robotRefs),r=Ig(n)?n:{},o=Object.keys(r).map(i=>i.trim()).filter(Boolean);return{creds:r,refs:o}}async connectRobot(e,n,r){if(this.connections.has(e))return;let o={credRef:e,clientId:n,clientSecret:r,client:null,running:!0,reconnectAttempts:0,reconnectTimer:null,established:!1,mediaDownloader:this.buildDownloader(n,r)};this.connections.set(e,o),await this.openConnection(o)}async openConnection(e){let n;try{n=await import("dingtalk-stream")}catch(s){throw new Error(`DingTalkStreamSource \u9700\u8981\u53EF\u9009\u4F9D\u8D56 "dingtalk-stream"\uFF0C\u4F46\u672A\u80FD\u52A0\u8F7D\uFF1A${s instanceof Error?s.message:String(s)}\u3002\u8BF7\u5728\u90E8\u7F72\u73AF\u5883\u5B89\u88C5\uFF1Apnpm add dingtalk-stream`)}if(!e.running)return;let{DWClient:r,TOPIC_ROBOT:o}=n,i=new r({clientId:e.clientId,clientSecret:e.clientSecret,ua:"aitable-workflow/dingtalk-stream",keepAlive:!0,autoReconnect:!1});i.registerCallbackListener(o,s=>{let c=s.headers?.messageId;this.handleDownstream(s,e).then(()=>{if(c)try{i.socketCallBackResponse(c,"")}catch(l){h.warn("dingtalk-stream-source","ACK failed",{name:this.name,credRef:e.credRef,messageId:c,error:l instanceof Error?l.message:String(l)})}},l=>{h.warn("dingtalk-stream-source","handle downstream failed",{name:this.name,credRef:e.credRef,messageId:c,error:l instanceof Error?l.message:String(l)})})}),e.client=i;try{await i.connect(),await this.waitForConnected(i),e.reconnectAttempts=0,e.established=!0,h.info("dingtalk-stream-source","connected",{name:this.name,credRef:e.credRef})}catch(s){e.established=!1,h.error("dingtalk-stream-source","connect failed",{name:this.name,credRef:e.credRef,error:s instanceof Error?s.message:String(s)});try{i.disconnect()}catch{}e.client===i&&(e.client=null),this.scheduleReconnect(e)}}startHealthCheck(){this.healthCheckTimer||(this.healthCheckTimer=setInterval(()=>this.checkConnectionsHealth(),yI),this.healthCheckTimer.unref?.())}checkConnectionsHealth(){if(this.running){for(let e of this.connections.values())if(!(!e.running||!e.established||e.reconnectTimer)&&!(e.client&&e.client.connected)){if(h.warn("dingtalk-stream-source","connection dropped, reconnecting",{name:this.name,credRef:e.credRef}),e.established=!1,e.client){try{e.client.disconnect()}catch{}e.client=null}this.scheduleReconnect(e)}}}scheduleReconnect(e){if(!this.running||!e.running)return;let n=Math.min(mI*2**e.reconnectAttempts,hI);e.reconnectAttempts+=1,h.info("dingtalk-stream-source","scheduling reconnect",{name:this.name,credRef:e.credRef,delayMs:n,attempt:e.reconnectAttempts}),e.reconnectTimer=setTimeout(()=>{e.reconnectTimer=null,this.running&&e.running&&this.openConnection(e)},n)}disconnectRobot(e,n){if(n.running=!1,n.reconnectTimer&&(clearTimeout(n.reconnectTimer),n.reconnectTimer=null),n.client){try{n.client.disconnect()}catch(r){h.warn("dingtalk-stream-source","disconnect failed",{name:this.name,credRef:e,error:r instanceof Error?r.message:String(r)})}n.client=null}this.connections.delete(e),h.info("dingtalk-stream-source","disconnected",{name:this.name,credRef:e})}async waitForConnected(e){let n=Date.now()+kg;for(;Date.now()<n;){if(e.connected)return;await new Promise(r=>setTimeout(r,pI))}throw new Error(`dingtalk-stream \u8FDE\u63A5\u8D85\u65F6\uFF08${kg}ms\uFF09`)}async handleDownstream(e,n){let r;try{r=JSON.parse(e.data)}catch(c){h.warn("dingtalk-stream-source","drop: malformed JSON frame",{name:this.name,error:c instanceof Error?c.message:String(c)});return}if(!r.conversationId){h.warn("dingtalk-stream-source","drop: missing conversationId",{name:this.name});return}if(!this.acceptsConversationType(r.conversationType)){h.debug("dingtalk-stream-source","drop: conversation type filtered",{name:this.name,conversationId:r.conversationId,conversationType:r.conversationType});return}let o=r.msgId||e.headers?.messageId||"";if(o&&!this.rememberMessageId(o)){h.debug("dingtalk-stream-source","drop: duplicate msgId",{name:this.name,messageId:o});return}let i=await this.toChatMessage(r,o,n.mediaDownloader);if(!i){h.debug("dingtalk-stream-source","drop: unparseable",{name:this.name,msgtype:r.msgtype});return}let s=this.buildEvent(r.conversationId,i,this.extractReplyContext(r,o,n.credRef));Rn.register({conversationId:r.conversationId,...r.conversationType?{conversationType:r.conversationType}:{},...r.sessionWebhook?{sessionWebhook:r.sessionWebhook}:{},...typeof r.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:r.sessionWebhookExpiredTime}:{},...i.sender?{senderStaffId:i.sender}:{},...r.robotCode?{robotCode:r.robotCode}:{}}),h.info("dingtalk-stream-source","emitting message_received",{name:this.name,conversationId:r.conversationId,sender:i.senderName??i.sender,msgtype:r.msgtype}),this.onEvent?.([s])}extractReplyContext(e,n,r){return{conversationId:e.conversationId,...n?{openMsgId:n}:{},...r?{credRef:r}:{},...e.conversationType?{conversationType:e.conversationType}:{},...e.conversationTitle?{conversationTitle:e.conversationTitle}:{},...e.robotCode?{robotCode:e.robotCode}:{},...e.sessionWebhook?{sessionWebhook:e.sessionWebhook}:{},...typeof e.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:e.sessionWebhookExpiredTime}:{},...e.atUsers?{atUsers:e.atUsers}:{},...typeof e.isInAtList=="boolean"?{isInAtList:e.isInAtList}:{}}}async toChatMessage(e,n,r){let{content:o,images:i}=await kI(e,this.localizer,r);return o===null?null:{sender:e.senderStaffId||e.senderId,senderName:e.senderNick??e.senderStaffId??e.senderId,createTime:new Date(e.createAt||Date.now()).toISOString(),content:o,...n?{messageId:n}:{},...e.msgtype?{msgType:e.msgtype}:{},...i.length>0?{images:i}:{}}}buildEvent(e,n,r){let o={conversationId:e,messages:[n],content:`${n.senderName??n.sender}: ${n.content}`,messageCount:1,firstSender:n.senderName??n.sender,firstSendTime:n.createTime,lastSendTime:n.createTime,sender:n.sender,senderName:n.senderName??n.sender,dingtalk:r};return n.images&&n.images.length>0&&(o.images=n.images),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}acceptsConversationType(e){let n=this.config.conversationTypes??[],r=e===wI;if(n.length>0){let i=n.includes("1to1"),s=n.includes("group");return i&&s?!0:i?r:s?!r:!0}return this.config.dropDirect!==void 0&&this.warnDropDirectDeprecated(),!((this.config.dropDirect??!0)&&r)}warnDropDirectDeprecated(){this.dropDirectWarned||(this.dropDirectWarned=!0,h.warn("dingtalk-stream-source","drop_direct \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u6539\u7528 conversation_types",{name:this.name,current:this.config.dropDirect,suggested:this.config.dropDirect===!1?["group","1to1"]:["group"],hint:"\u8FD0\u884C aitable-workflow migrate \u53EF\u81EA\u52A8\u8F6C\u5199"}))}rememberMessageId(e){let n=Date.now();if(this.seenMsgIds.size>vg)for(let[r,o]of this.seenMsgIds)n-o>gI&&this.seenMsgIds.delete(r);if(this.seenMsgIds.size>vg){let r=Math.floor(this.seenMsgIds.size/2),o=0;for(let i of this.seenMsgIds.keys())if(this.seenMsgIds.delete(i),++o>=r)break}return this.seenMsgIds.has(e)?!1:(this.seenMsgIds.set(e,n),!0)}parseConfig(e){let n=xg(e,"client_id","clientId","client_id_env"),r=xg(e,"client_secret","clientSecret","client_secret_env"),o=e.robot_refs??e.robotRefs,i=e.robot_creds??e.robotCreds;return{...n?{clientId:n}:{},...r?{clientSecret:r}:{},...o!==void 0?{robotRefs:o}:{},...i!==void 0?{robotCreds:i}:{},endpoint:typeof e.endpoint=="string"?e.endpoint:void 0,conversationTypes:Array.isArray(e.conversation_types)?e.conversation_types.map(String):Array.isArray(e.conversationTypes)?e.conversationTypes.map(String):void 0,dropDirect:typeof e.drop_direct=="boolean"?e.drop_direct:typeof e.dropDirect=="boolean"?e.dropDirect:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0}}};function xg(t,e,n,r){let o=t[e]??t[n];if(typeof o=="string"&&o.trim())return o.trim();let i=t[r];if(typeof i=="string"&&i.trim()){let s=process.env[i.trim()];if(typeof s=="string"&&s.trim())return s.trim()}return""}a(xg,"resolveSecret");function Ig(t){return!t||typeof t!="object"||Array.isArray(t)?!1:Object.values(t).every(e=>{if(!e||typeof e!="object"||Array.isArray(e))return!1;let n=e;return(n.client_id===void 0||typeof n.client_id=="string")&&(n.client_secret===void 0||typeof n.client_secret=="string")})}a(Ig,"isRobotCredentialMap");function bI(t){switch(t.msgtype){case"text":return t.text?.content?.trim()??"";case"audio":{let e=t.content?.recognition?.trim();return e||"[\u8BED\u97F3\u6D88\u606F]"}case"picture":case"image":return"[\u56FE\u7247\u6D88\u606F]";case"video":return"[\u89C6\u9891\u6D88\u606F]";case"file":{let e=t.content?.fileName?.trim();return e?`[\u6587\u4EF6: ${e}]`:"[\u6587\u4EF6\u6D88\u606F]"}case"richText":return t.content?.text?.trim()||"[\u5BCC\u6587\u672C\u6D88\u606F]";default:return t.msgtype?`[${t.msgtype}]`:null}}a(bI,"extractTextContent");async function Rg(t,e,n,r){if(!r||!t)return null;let o=Ti(e),i=n.resolved(o);if(i)return i;if(n.failed(o))return null;let s;try{s=await r(t,e)}catch(c){return h.warn("dingtalk-stream-source","downloadMessageFile failed",{error:c instanceof Error?c.message:String(c)}),n.markFailed(o),null}return n.localizeRemoteUrl(s,o)}a(Rg,"localizeDownloadCode");async function kI(t,e,n){if(t.msgtype==="richText"){let r=t.content?.richText;if(Array.isArray(r)&&r.length>0){let i=[],s=[];for(let l of r){let d=typeof l?.text=="string"?l.text:"";if(d){i.push(d);continue}let u=typeof l?.downloadCode=="string"?l.downloadCode:"";if(!u)continue;if(e.imageMode==="off"){i.push("[\u56FE\u7247]");continue}let f=await Rg(t.robotCode,u,e,n);f?(i.push(`![\u56FE\u7247](${f})`),s.push(f)):i.push("[\u56FE\u7247\uFF08\u6682\u65F6\u65E0\u6CD5\u52A0\u8F7D\uFF0C\u8BF7\u7528\u6587\u5B57\u63CF\u8FF0\uFF09]")}return{content:i.join("").trim()||"[\u5BCC\u6587\u672C\u6D88\u606F]",images:s}}return{content:t.content?.text?.trim()||"[\u5BCC\u6587\u672C\u6D88\u606F]",images:[]}}if((t.msgtype==="picture"||t.msgtype==="image")&&typeof t.content?.downloadCode=="string"&&t.content.downloadCode){if(e.imageMode!=="off"){let r=await Rg(t.robotCode,t.content.downloadCode,e,n);if(r)return{content:`![\u56FE\u7247](${r})`,images:[r]}}return{content:"[\u56FE\u7247\u6D88\u606F]",images:[]}}return{content:bI(t),images:[]}}a(kI,"extractStreamContent");function vI(t){return t.length<=8?t:`${t.slice(0,4)}...${t.slice(-4)}`}a(vI,"maskClientId");import Lc from"path";var SI=1e3,xI=3e4,II=600*1e3,Cg=2e3,RI="user_im_message_receive",Wc="__all_group__",Mi=class{static{a(this,"DingTalkEventSource")}name;config;running=!1;onEvent=null;groups=new Map;seenIds=new Map;conversationIdsRaw;watched=new Set;globalVars;configScope;unsubscribes=[];mediaResolver;constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.globalVars=n?.globalVars,this.configScope=n?.configScope,this.conversationIdsRaw=this.config.conversationIds;let r=typeof e.config.configDir=="string"?e.config.configDir:process.cwd(),o=this.config.mediaDir?Lc.isAbsolute(this.config.mediaDir)?this.config.mediaDir:Lc.resolve(r,this.config.mediaDir):Lc.join(r,".aitable","media","dingtalk");this.mediaResolver=new Tn({dwsBin:this.config.dwsBin??"dws",...this.config.imageMode?{imageMode:this.config.imageMode}:{},mediaDir:o,...this.config.downloadTimeoutMs!==void 0?{downloadTimeoutMs:this.config.downloadTimeoutMs}:{}})}async start(e){if(this.running)return;this.running=!0,this.onEvent=e,this.reconcile();let n=ze(this.conversationIdsRaw);if(n){let r=n.path.split(".")[0];n.ns==="globalVar"&&this.globalVars?this.unsubscribes.push(this.globalVars.subscribe(r,()=>this.reconcile())):(n.ns==="env"||n.ns==="config")&&this.configScope&&this.unsubscribes.push(this.configScope.subscribe(`${n.ns}.${r}`,()=>this.reconcile()))}this.conversationIdsRaw===void 0&&h.warn("dingtalk-event-source",this.config.kind==="all-group"?"\u672A\u914D\u7F6E conversation_ids\uFF1Aall-group \u767D\u540D\u5355\u4E3A\u7A7A\uFF0C\u5C06\u4E22\u5F03\u5168\u90E8\u4E8B\u4EF6":"skip: \u672A\u914D\u7F6E conversation_ids",{name:this.name}),h.info("dingtalk-event-source","started",{name:this.name,kind:this.config.kind,conversationIds:[...this.watched]})}stop(){this.running=!1;for(let e of this.unsubscribes)e();this.unsubscribes=[];for(let e of[...this.groups.values()])this.terminateGroup(e);h.info("dingtalk-event-source","stopped",{name:this.name})}reconcile(){if(this.watched=this.resolveConversationIds(),this.config.kind==="all-group"){this.groups.has(Wc)||this.spawnGroup(Wc);return}for(let e of this.watched)this.groups.has(e)||this.spawnGroup(e);for(let e of[...this.groups.values()])this.watched.has(e.conversationId)||this.terminateGroup(e)}resolveConversationIds(){let e=vt(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(n.map(r=>typeof r=="string"?r:r&&typeof r=="object"?String(r.groupId??""):"").map(r=>r.trim()).filter(r=>r.length>0))}spawnGroup(e){let n={conversationId:e,proc:null,running:!0,restartAttempts:0,restartTimer:null,stdoutBuffer:""};this.groups.set(e,n);let r=e===Wc?["event","+listen-im","--kind","all-group","-f","ndjson"]:["event","+listen-im","--kind","group","--chat-id",e,"-f","ndjson"],o,i=Wr(this.config.dwsBin??"dws");try{o=Vn({command:i,args:r,stripEnv:Jo,stdio:["pipe","pipe","pipe"]})}catch(s){this.groups.delete(e),h.error("dingtalk-event-source","spawn failed",{name:this.name,conversationId:e,error:s instanceof Error?s.message:String(s)});return}n.proc=o,o.child.stdout?.setEncoding("utf8"),o.child.stdout?.on("data",s=>this.onStdoutChunk(n,s)),o.child.stderr?.setEncoding("utf8"),o.child.stderr?.on("data",s=>this.onStderrChunk(n,s)),o.child.once("close",(s,c)=>this.onProcessClosed(n,s,c)),o.child.once("error",s=>{h.error("dingtalk-event-source","process error",{name:this.name,conversationId:e,error:s instanceof Error?s.message:String(s)})}),h.info("dingtalk-event-source","listening",{name:this.name,conversationId:e,bin:i})}terminateGroup(e){e.running=!1,e.restartTimer&&(clearTimeout(e.restartTimer),e.restartTimer=null),this.groups.delete(e.conversationId),e.proc&&e.proc.terminateTree().catch(()=>{}),h.info("dingtalk-event-source","terminated",{name:this.name,conversationId:e.conversationId})}onProcessClosed(e,n,r){if(!this.running||!e.running){h.debug("dingtalk-event-source","process closed (intentional)",{name:this.name,conversationId:e.conversationId,exitCode:n,signal:r});return}h.warn("dingtalk-event-source","process exited unexpectedly, restarting",{name:this.name,conversationId:e.conversationId,exitCode:n,signal:r}),this.scheduleRestart(e)}scheduleRestart(e){if(!this.running||!e.running||e.restartTimer)return;let n=Math.min(SI*2**e.restartAttempts,xI);e.restartAttempts+=1,h.info("dingtalk-event-source","scheduling restart",{name:this.name,conversationId:e.conversationId,delayMs:n,attempt:e.restartAttempts}),e.restartTimer=setTimeout(()=>{e.restartTimer=null,e.stdoutBuffer="",!(!this.running||!e.running)&&this.groups.get(e.conversationId)===e&&(this.groups.delete(e.conversationId),this.spawnGroup(e.conversationId))},n),e.restartTimer.unref?.()}onStdoutChunk(e,n){e.stdoutBuffer+=n;let r=e.stdoutBuffer.indexOf(`
311
311
  `);for(;r>=0;){let o=e.stdoutBuffer.slice(0,r);e.stdoutBuffer=e.stdoutBuffer.slice(r+1),this.handleLine(e,o),r=e.stdoutBuffer.indexOf(`
312
312
  `)}}handleLine(e,n){let r=n.trim();if(!r)return;let o;try{o=JSON.parse(r)}catch{h.warn("dingtalk-event-source","drop: non-JSON stdout line",{name:this.name,conversationId:e.conversationId,line:r.slice(0,200)});return}this.handleFlattenEvent(e,o)}async handleFlattenEvent(e,n){let r=typeof n.type=="string"?n.type:"";if(!r.startsWith(RI)){h.debug("dingtalk-event-source","skip: non-message event",{name:this.name,type:r});return}let o=typeof n.conversation_id=="string"?n.conversation_id.trim():"";if(!o&&this.config.kind==="all-group"){h.warn("dingtalk-event-source","drop: \u4E8B\u4EF6\u7F3A\u5C11 conversation_id\uFF08all-group \u65E0\u4ECE\u5F52\u5C5E\uFF09",{name:this.name,type:r});return}let i=o||e.conversationId;if(this.config.kind==="all-group"&&!this.watched.has(i)){h.debug("dingtalk-event-source","drop: \u7FA4\u4E0D\u5728\u76D1\u542C\u540D\u5355",{name:this.name,conversationId:i});return}let s=typeof n.sender=="string"?n.sender:"",c=typeof n.sender_open_dingtalk_id=="string"?n.sender_open_dingtalk_id:"";if(this.isIgnoredSender(c,s)){h.debug("dingtalk-event-source","drop: ignored sender",{name:this.name,conversationId:i,sender:s||c});return}let l=typeof n.message_id=="string"?n.message_id:"",d=typeof n.event_id=="string"?n.event_id:"",u=l||d;if(u&&!this.rememberEventId(u)){h.debug("dingtalk-event-source","drop: duplicate event",{name:this.name,dedupeKey:u});return}let f=await this.toChatMessage(n,i,s,c);f&&(h.info("dingtalk-event-source","emitting message_received",{name:this.name,conversationId:i,sender:s||c}),this.onEvent?.([this.buildEvent(i,f)]))}isIgnoredSender(e,n){let r=this.config.ignoreSenders;return!r||r.length===0?!1:e.length>0&&r.includes(e)||n.length>0&&r.includes(n)}async toChatMessage(e,n,r,o){let i=typeof e.content=="string"?e.content:"",s=typeof e.message_id=="string"&&e.message_id?e.message_id:void 0,{content:c,images:l}=await this.mediaResolver.resolveContent(i,s,n);return{sender:o||r,senderName:r||o,...o?{senderOpenDingTalkId:o}:{},createTime:this.normalizeEventTime(e),content:c,...s?{messageId:s}:{},...CI(e),...l.length>0?{images:l}:{}}}normalizeEventTime(e){let n=typeof e.create_time=="string"?e.create_time.trim():"";if(n){let o=Ei(n);if(Number.isFinite(o))return new Date(o).toISOString()}let r=e.event_time;return typeof r=="number"&&Number.isFinite(r)&&r>0?new Date(r).toISOString():new Date().toISOString()}buildEvent(e,n){let r={conversationId:e,messages:[n],content:`${n.senderName??n.sender}: ${n.content}`,messageCount:1,firstSender:n.senderName??n.sender,firstSendTime:n.createTime,lastSendTime:n.createTime,sender:n.sender,senderName:n.senderName??n.sender};return n.senderOpenDingTalkId&&(r.senderOpenDingTalkId=n.senderOpenDingTalkId),n.images&&n.images.length>0&&(r.images=n.images),{type:"message_received",payload:r,timestamp:new Date().toISOString(),itemId:null}}rememberEventId(e){let n=Date.now();if(this.seenIds.size>Cg)for(let[r,o]of this.seenIds)n-o>II&&this.seenIds.delete(r);if(this.seenIds.size>Cg){let r=Math.floor(this.seenIds.size/2),o=0;for(let i of this.seenIds.keys())if(this.seenIds.delete(i),++o>=r)break}return this.seenIds.has(e)?!1:(this.seenIds.set(e,n),!0)}onStderrChunk(e,n){for(let r of n.split(`
313
- `)){let o=r.trim();o&&(o.startsWith("[event] ready")?h.info("dingtalk-event-source","ready",{name:this.name,conversationId:e.conversationId,detail:o}):h.debug("dingtalk-event-source","stderr",{name:this.name,conversationId:e.conversationId,detail:o.slice(0,300)}))}}parseConfig(e){return{kind:e.kind==="all-group"?"all-group":"group",conversationIds:e.conversation_ids??e.conversationIds,dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,ignoreSenders:Array.isArray(e.ignore_senders)?e.ignore_senders.map(String):Array.isArray(e.ignoreSenders)?e.ignoreSenders.map(String):void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0,downloadTimeoutMs:typeof e.download_timeout_ms=="number"?e.download_timeout_ms:typeof e.downloadTimeoutMs=="number"?e.downloadTimeoutMs:void 0}}};function CI(t){let e=t.quoted_message;if(!S(e))return{};let n=e.message_id;return typeof n!="string"||!n.trim()?{}:{quotedMessageId:n.trim()}}a(CI,"extractQuotedMessageId");import{CronExpressionParser as zc}from"cron-parser";function Tg(t,e){let n=new Intl.DateTimeFormat("en-CA",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(t),r=a(o=>Number(n.find(i=>i.type===o)?.value??0),"pick");return{year:r("year"),month:r("month"),day:r("day")}}a(Tg,"zonedDateParts");function _g(t,e){let n=new Intl.DateTimeFormat("en-US",{timeZone:e,hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(t),r={};for(let l of n)l.type!=="literal"&&(r[l.type]=Number(l.value));let o=a(l=>Number(r[l]??0),"get"),i=o("hour"),s=i===24?0:i;return Date.UTC(o("year"),o("month")-1,o("day"),s,o("minute"),o("second"))-t.getTime()}a(_g,"tzOffsetMs");function Bc(t,e,n,r,o,i,s,c){let l=Date.UTC(t,e,n,r,o,i,0),d=_g(new Date(l),c);return new Date(l-d+s).toISOString()}a(Bc,"zonedWallClockToUtc");function TI(t,e=new Date){let n=Tg(e,t),r=new Date(Date.UTC(n.year,n.month-1,n.day)-864e5),o=r.getUTCFullYear(),i=r.getUTCMonth(),s=r.getUTCDate(),c=`${o}-${String(i+1).padStart(2,"0")}-${String(s).padStart(2,"0")}`,l=Bc(o,i,s,0,0,0,0,t),d=Bc(o,i,s,23,59,59,999,t);return{since:l,until:d,dateStr:c}}a(TI,"yesterdayRange");function _I(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"--:--";let r=new Intl.DateTimeFormat("en-GB",{timeZone:e,hourCycle:"h23",hour:"2-digit",minute:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("hour")}:${o("minute")}`}a(_I,"formatZonedHm");function Zr(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"";let r=new Intl.DateTimeFormat("en-CA",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("year")}-${o("month")}-${o("day")} ${o("hour")}:${o("minute")}:${o("second")}`}a(Zr,"formatZonedDateTime");function AI(t){let e=t?.trim();if(!e)return"Asia/Shanghai";try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(new Date),e}catch{return"Asia/Shanghai"}}a(AI,"normalizeTimezone");var Oi="0 0 * * *",ji=class{static{a(this,"CronSchedulerSource")}name;config;scheduleMode;timezone;intervalMs=0;lastFiredAt=0;cronExpr=null;nextFireAt=null;immediateFirePending=!1;running=!1;abortController=null;constructor(e){this.name=e.name,this.config=this.parseConfig(e.config),this.timezone=this.normalizeTimezone(this.config.timezone);let n=this.config.cron?this.parseEveryInterval(this.config.cron):null;this.config.dailyAt!==void 0?(this.scheduleMode="precise",this.cronExpr=this.dailyAtToCron(this.config.dailyAt)):this.config.cron&&n===null?(this.scheduleMode="precise",this.cronExpr=this.validateCron(this.config.cron)):n!==null?(this.scheduleMode="interval",this.intervalMs=n):this.config.intervalMs?(this.scheduleMode="interval",this.intervalMs=this.config.intervalMs):(this.scheduleMode="interval",this.intervalMs=36e5)}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController,this.scheduleMode==="interval"?this.lastFiredAt=this.config.fireImmediately?0:Date.now():(this.immediateFirePending=this.config.fireImmediately===!0,this.nextFireAt=this.immediateFirePending?new Date(0):this.computeNextFireAt(new Date)),h.info("cron-scheduler","started",{name:this.name,scheduleMode:this.scheduleMode,intervalMs:this.scheduleMode==="interval"?this.intervalMs:void 0,cron:this.cronExpr??void 0,timezone:this.timezone,nextFireAt:this.nextFireAt?.toISOString(),nextFireAtLocal:this.nextFireAt?Zr(this.nextFireAt,this.timezone):void 0,eventType:this.config.eventType});let n=this.scheduleMode==="interval"?Math.min(this.intervalMs,6e4):3e4;for(;this.running;){try{let r=this.poll();r.length>0&&e(r)}catch(r){h.error("cron-scheduler","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(n)}h.info("cron-scheduler","stopped",{name:this.name})}stop(){this.running=!1,this.abortController?.abort()}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}poll(){let e=Date.now(),n;if(this.scheduleMode==="interval"){if(e-this.lastFiredAt<this.intervalMs)return[];this.lastFiredAt=e,n=new Date(e).toISOString()}else{if(this.nextFireAt||(this.nextFireAt=this.computeNextFireAt(new Date(e))),e<this.nextFireAt.getTime())return[];n=this.immediateFirePending?new Date(e).toISOString():this.nextFireAt.toISOString(),this.immediateFirePending=!1,this.nextFireAt=this.computeNextFireAt(new Date(e+1))}let r={type:this.config.eventType,payload:{...this.config.payload,schedulerName:this.name,firedAt:new Date(e).toISOString(),scheduledFor:n,timezone:this.timezone},timestamp:new Date(e).toISOString(),itemId:null};return h.info("cron-scheduler","fired",{name:this.name,eventType:this.config.eventType,scheduledFor:n,scheduledForLocal:Zr(new Date(n),this.timezone),nextFireAt:this.nextFireAt?.toISOString(),nextFireAtLocal:this.nextFireAt?Zr(this.nextFireAt,this.timezone):void 0,timezone:this.timezone}),[r]}computeNextFireAt(e){let n=this.cronExpr??Oi;try{return zc.parse(n,{currentDate:e,tz:this.timezone}).next().toDate()}catch(r){return h.error("cron-scheduler","cron \u89E3\u6790\u5931\u8D25\uFF0C\u56DE\u9000\u6BCF\u65E5 00:00",{cron:n,error:r instanceof Error?r.message:String(r)}),zc.parse(Oi,{currentDate:e,tz:this.timezone}).next().toDate()}}dailyAtToCron(e){let n=e.match(/^(\d{1,2}):(\d{2})$/);if(n){let r=parseInt(n[1],10),o=parseInt(n[2],10);if(r>=0&&r<=23&&o>=0&&o<=59)return`${o} ${r} * * *`}return h.warn("cron-scheduler","dailyAt \u683C\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230 00:00",{dailyAt:e}),Oi}validateCron(e){try{return zc.parse(e,{tz:this.timezone}),e}catch(n){return h.warn("cron-scheduler","cron \u8868\u8FBE\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230\u6BCF\u65E5 00:00",{cron:e,error:n instanceof Error?n.message:String(n)}),Oi}}parseEveryInterval(e){let n=e.match(/^every\s+(\d+)(s|m|h|d)$/i);if(!n)return null;let r=parseInt(n[1],10);switch(n[2].toLowerCase()){case"s":return r*1e3;case"m":return r*6e4;case"h":return r*36e5;case"d":return r*864e5;default:return null}}normalizeTimezone(e){let r=e??Intl.DateTimeFormat().resolvedOptions().timeZone??"UTC";try{return new Intl.DateTimeFormat("en-US",{timeZone:r}).format(new Date),r}catch(o){return h.warn("cron-scheduler","timezone \u975E\u6CD5\uFF0C\u56DE\u9000 UTC",{timezone:r,error:o instanceof Error?o.message:String(o)}),"UTC"}}parseConfig(e){let n;return typeof e.payload=="object"&&e.payload!==null?n=e.payload:typeof e.metadata=="object"&&e.metadata!==null&&(n={metadata:e.metadata}),{cron:typeof e.cron=="string"?e.cron:void 0,dailyAt:typeof e.daily_at=="string"?e.daily_at:typeof e.dailyAt=="string"?e.dailyAt:void 0,timezone:typeof e.timezone=="string"?e.timezone:typeof e.tz=="string"?e.tz:void 0,intervalMs:typeof e.interval_ms=="number"?e.interval_ms:typeof e.intervalMs=="number"?e.intervalMs:void 0,eventType:String(e.event_type??e.eventType??"scheduled_trigger"),payload:n,fireImmediately:e.fire_immediately===!0||e.fireImmediately===!0}}};function EI(t,e){if(t===void 0)return;let n=Array.isArray(t)?t:[t],r=[];for(let s of n){if(!s||typeof s!="object"||typeof s.field!="string"||s.field.trim()===""){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08field \u7F3A\u5931\uFF09",s);continue}let l=(Array.isArray(s.equals)?s.equals:[s.equals]).filter(d=>d!=null&&d!=="");if(l.length===0){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08equals \u4E3A\u7A7A\uFF09",s);continue}r.push({field:s.field,values:l})}if(r.length===0)return;let o=a((s,c)=>({operator:"eq",operands:[s,c]}),"eqLeaf");if(r.length===1){let s=r[0],c=s.values.map(l=>o(s.field,l));return c.length===1?{operator:"and",operands:c}:{operator:"or",operands:c}}return{operator:"and",operands:r.map(s=>s.values.length===1?o(s.field,s.values[0]):(e?.(`\u591A\u6761\u4EF6 AND \u4E2D\u5B57\u6BB5\u300C${s.field}\u300D\u4E3A\u591A\u503C,\u9000\u5316\u7528 any_of;\u82E5\u8BE5\u5B57\u6BB5\u662F\u5355\u9009(singleSelect),dws \u4F1A\u9759\u9ED8\u5339\u914D 0 \u6761`,s),{operator:"any_of",operands:[s.field,s.values]}))}}a(EI,"compileSimpleFilter");var Fi=class{static{a(this,"AITableRecordSource")}name;config;pollIntervalMs;watchMode;resolveFieldNames;dws;running=!1;abortController=null;primed=!1;seenIds=new Set;signatures=new Map;idToName=new Map;nameToId=new Map;fieldMapResolved=!1;hasFilter;constructor(e){this.name=e.name,this.config=this.parseConfig(e.config),this.watchMode=this.config.watchMode??"created",this.resolveFieldNames=this.config.resolveFieldNames??!0,this.hasFilter=this.config.filter!==void 0||this.config.filters!==void 0,this.dws=new he({bin:this.config.dwsBin??"dws"});let n=e.config;this.pollIntervalMs=typeof n.poll_interval_ms=="number"?n.poll_interval_ms:typeof n.pollIntervalMs=="number"?n.pollIntervalMs:6e4}async start(e){if(!this.running){for(this.running=!0,this.abortController=new AbortController,(!this.config.baseId||!this.config.tableId)&&h.warn("aitable-record-source","missing base_id / table_id",{name:this.name}),h.info("aitable-record-source","started",{name:this.name,baseId:this.config.baseId,tableId:this.config.tableId,watchMode:this.watchMode,pollIntervalMs:this.pollIntervalMs});this.running;){try{let n=await this.poll();n.length>0&&e(n)}catch(n){h.error("aitable-record-source","poll error",{name:this.name,error:n instanceof Error?n.message:String(n)})}if(!this.running)break;await this.sleep(this.pollIntervalMs)}h.info("aitable-record-source","stopped",{name:this.name})}}stop(){this.running=!1,this.abortController?.abort()}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}async poll(){(this.resolveFieldNames||this.hasFilter)&&!this.fieldMapResolved&&await this.resolveFieldMap();let e=await this.queryRecords(),n=!this.primed&&!this.config.emitExisting,r=[];for(let o of e){let i=$I(o);if(!i)continue;let s=DI(o),c=this.resolveFieldNames?this.translateCellsToNames(s):s,l=Uc(s),d=!this.seenIds.has(i),u=!d&&this.signatures.get(i)!==l;this.seenIds.add(i),this.signatures.set(i,l),!n&&(d&&(this.watchMode==="created"||this.watchMode==="both")?r.push(this.buildEvent("record_created",i,c,o)):u&&(this.watchMode==="updated"||this.watchMode==="both")&&r.push(this.buildEvent("record_updated",i,c,o)))}return this.pruneSeen(),this.primed=!0,r.length>0&&h.info("aitable-record-source","emitting record events",{name:this.name,eventCount:r.length}),r}async resolveFieldMap(){try{let e=await this.dws.runJson(["aitable","field","get","--base-id",this.config.baseId,"--table-id",this.config.tableId]);for(let n of Te(e)){if(!S(n))continue;let r=typeof n.fieldId=="string"?n.fieldId:null,o=typeof n.fieldName=="string"?n.fieldName:null;r&&o&&(this.idToName.set(r,o),this.nameToId.set(o,r))}h.info("aitable-record-source","field mapping resolved",{name:this.name,count:this.idToName.size})}catch(e){h.warn("aitable-record-source","field mapping resolve failed, using raw fieldId",{name:this.name,error:e instanceof Error?e.message:String(e)})}this.fieldMapResolved=!0}async queryRecords(){let e=[],n=this.config.fetchLimit??50,r=this.config.maxPages??10,o=null,i=0,s=this.config.filters!==void 0?this.config.filters:EI(this.config.filter,(l,d)=>h.warn("aitable-record-source",l,{name:this.name,cond:d})),c=s!==void 0?this.translateFilterFieldNames(s):void 0;do{let l=["aitable","record","query","--base-id",this.config.baseId,"--table-id",this.config.tableId,"--limit",String(n)];c!==void 0&&l.push("--filters",JSON.stringify(c)),o&&l.push("--cursor",o);let d=await this.dws.runJson(l),u=Te(d);e.push(...u);let f=Zo(d);if(i+=1,u.length<n||f===o)break;o=f}while(o&&i<r);return e}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e))n[this.idToName.get(r)??r]=o;return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}buildEvent(e,n,r,o){return{type:e,payload:{baseId:this.config.baseId,tableId:this.config.tableId,recordId:n,cells:r,raw:o},timestamp:new Date().toISOString(),itemId:n}}pruneSeen(){if(this.seenIds.size<=5e4)return;let e=[...this.seenIds].slice(-3e4);this.seenIds.clear();let n=new Set(e);for(let r of e)this.seenIds.add(r);for(let r of[...this.signatures.keys()])n.has(r)||this.signatures.delete(r)}parseConfig(e){let n=e.watch_mode??e.watchMode,r=n==="created"||n==="updated"||n==="both"?n:void 0;return{baseId:String(e.base_id??e.baseId??""),tableId:String(e.table_id??e.tableId??""),dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchMode:r,filters:e.filters,filter:e.filter,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,resolveFieldNames:typeof e.resolve_field_names=="boolean"?e.resolve_field_names:typeof e.resolveFieldNames=="boolean"?e.resolveFieldNames:void 0,emitExisting:typeof e.emit_existing=="boolean"?e.emit_existing:typeof e.emitExisting=="boolean"?e.emitExisting:void 0}}};function DI(t){let e=ye(t);if(!S(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(S(r))return r}return e}a(DI,"recordCells");function $I(t){let e=ye(t);if(!S(e))return null;for(let n of["recordId","record_id","id"]){let r=e[n];if(typeof r=="string"&&r.trim()!=="")return r}return null}a($I,"extractRecordId");function Uc(t){return Array.isArray(t)?`[${t.map(Uc).join(",")}]`:S(t)?`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Uc(t[n])}`).join(",")}}`:JSON.stringify(t)??"null"}a(Uc,"stableStringify");import{z as D}from"zod";var PI=/^workflow:[A-Za-z0-9_-]+\.tracker$/,Xn={field:"conversation_ids",label:"\u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868",valueType:"string[]"};function Ni(t){return Qt(t)?{requiredFields:[],optionalFields:[],errors:[],summary:`\u4F7F\u7528 ${ze(t).ns} ref \u52A8\u6001\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868`}:t!=null?{requiredFields:[],optionalFields:[Xn],errors:[]}:{requiredFields:[Xn],optionalFields:[],errors:[]}}a(Ni,"conversationIdsPolicy");var Mg=/^\$\{(?:env|config|globalVar)\.[^}]+\}$/,MI=D.string().regex(Mg,"\u5FC5\u987B\u662F\u5B8C\u6574\u7684\u8FD0\u884C\u65F6\u5F15\u7528\uFF0C\u5982 ${env.NAME} \u6216 ${globalVar.path}").describe("\u6574\u503C\u8FD0\u884C\u65F6\u5F15\u7528\uFF1A${env.*}\u3001${config.*} \u6216 ${globalVar.*}"),OI=D.union([D.string().describe("\u7FA4\u4F1A\u8BDD ID"),D.object({groupId:D.string().describe("\u7FA4\u4F1A\u8BDD ID")}).passthrough().describe("\u5305\u542B groupId \u7684\u7FA4\u914D\u7F6E\u8BB0\u5F55")]),jI=D.string().regex(Mg,"\u7C7B\u578B\u9519\u8BEF\uFF1A\u5FC5\u987B\u662F\u6570\u7EC4\u6216\u5B8C\u6574\u7684\u8FD0\u884C\u65F6\u5F15\u7528\uFF0C\u5982 ${env.NAME} \u6216 ${globalVar.path}").describe("\u6574\u503C\u8FD0\u884C\u65F6\u5F15\u7528\uFF1A${env.*}\u3001${config.*} \u6216 ${globalVar.*}"),Xt=D.union([D.array(D.union([OI,D.null()])),jI]).describe("\u5185\u8054\u503C\u4E3A (string | { groupId: string })[]\uFF1A\u7F3A\u7701\u4F1A\u5728 setup \u63D0\u793A\u5FC5\u586B\uFF0C\u7A7A\u6570\u7EC4\u8868\u793A\u9ED8\u8BA4\u505C\u7528\uFF0C\u975E\u7A7A\u5219\u542F\u7528\uFF1B\u4E5F\u53EF\u7528 ${env.*}\u3001${config.*} \u6216 ${globalVar.*} \u6574\u503C\u5F15\u7528\uFF0C\u5F15\u7528\u7ED3\u679C\u5FC5\u987B\u662F\u540C\u4E00\u6570\u7EC4\u7ED3\u6784"),en=D.enum(["download","url","off"]).describe("\u56FE\u7247\u5904\u7406\u6A21\u5F0F\uFF1Adownload \u4E0B\u8F7D\u5230\u672C\u5730\uFF0Curl \u4FDD\u7559\u94FE\u63A5\uFF0Coff \u4E0D\u5904\u7406"),er=D.array(D.enum(["group","1to1"])).describe("\u76D1\u542C\u7684\u4F1A\u8BDD\u7C7B\u578B\uFF1Agroup \u7FA4\u804A\u30011to1 \u5355\u804A"),Ag=D.union([D.string(),D.number(),D.boolean()]),Eg=D.object({field:D.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u6216\u5B57\u6BB5 ID"),equals:D.union([Ag,D.array(Ag)]).describe("\u8981\u6C42\u76F8\u7B49\u7684 string\u3001number \u6216 boolean\uFF1B\u6570\u7EC4\u8868\u793A\u547D\u4E2D\u4EFB\u4E00\u503C")}).strict(),FI=D.object({operator:D.string().min(1).describe("dws \u6BD4\u8F83\u64CD\u4F5C\u7B26\uFF0C\u5982 eq\u3001neq \u6216 any_of"),operands:D.array(D.unknown()).describe("\u6BD4\u8F83\u53C2\u6570\uFF1B\u9996\u9879\u4E3A\u5B57\u6BB5\u540D\u6216\u5B57\u6BB5 ID\uFF0C\u5176\u4F59\u9879\u4E3A\u6BD4\u8F83\u503C")}).passthrough(),NI=D.object({operator:D.enum(["and","or"]).describe("\u6839\u903B\u8F91\u64CD\u4F5C\u7B26\uFF1Bdws \u8981\u6C42\u6839\u8282\u70B9\u4E3A and \u6216 or"),operands:D.array(FI).describe("\u6241\u5E73\u6BD4\u8F83\u8282\u70B9\u5217\u8868\uFF1B\u4E0D\u8981\u5728\u8FD9\u91CC\u7EE7\u7EED\u5D4C\u5957 and/or")}).passthrough().describe("\u4EC5\u5728\u7B80\u5199 filter \u65E0\u6CD5\u8868\u8FBE\u65F6\u4F7F\u7528\u7684 dws \u6241\u5E73\u8FC7\u6EE4\u6811\uFF1A{ operator: and | or, operands: { operator, operands }[] }\uFF1B\u4E0E filter \u540C\u65F6\u5B58\u5728\u65F6\u4EE5 filters \u4E3A\u51C6"),Dg=D.object({conversation_ids:Xt.optional(),source_adapter:D.literal("dws_pull").optional().describe("\u6D88\u606F\u62C9\u53D6\u9002\u914D\u5668\uFF0C\u5F53\u524D\u4EC5\u652F\u6301 dws_pull"),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),watch_senders:D.array(D.string()).optional().describe("\u53EA\u76D1\u542C\u8FD9\u4E9B\u53D1\u9001\u8005 ID \u6216\u6635\u79F0\uFF1B\u7F3A\u7701\u6216\u7A7A\u6570\u7EC4\u5747\u76D1\u542C\u6240\u6709\u4EBA"),ignore_senders:D.array(D.string()).optional().describe("\u5FFD\u7565\u8FD9\u4E9B\u53D1\u9001\u8005 ID \u6216\u6635\u79F0\uFF0C\u7528\u4E8E\u9632\u6B62\u673A\u5668\u4EBA\u6D88\u606F\u56DE\u6D41"),fetch_limit:D.number().optional().describe("\u6BCF\u4E2A\u4F1A\u8BDD\u6BCF\u8F6E\u62C9\u53D6\u7684\u6D88\u606F\u6570\u4E0A\u9650"),aggregate_by_sender:D.boolean().optional().describe("\u662F\u5426\u6309\u53D1\u9001\u8005\u805A\u5408\u672C\u8F6E\u6D88\u606F\uFF1B\u7F3A\u7701 true\uFF0C\u542F\u7528\u540E\u6BCF\u4E2A\u53D1\u9001\u8005\u4EA7\u51FA\u4E00\u4E2A\u72EC\u7ACB\u4E8B\u4EF6"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u914D\u7F6E\u76EE\u5F55\u89E3\u6790"),download_timeout_ms:D.number().optional().describe("\u5355\u5F20\u56FE\u7247\u4E0B\u8F7D\u8D85\u65F6\u6BEB\u79D2\u6570"),resolve_user_ids:D.boolean().optional().describe("\u662F\u5426\u628A\u53D1\u9001\u8005 openDingTalkId \u89E3\u6790\u4E3A\u4F01\u4E1A\u5185 userId"),poll_interval_ms:D.number().optional().describe("\u6D88\u606F\u8F6E\u8BE2\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2"),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),sourceAdapter:D.literal("dws_pull").optional().describe("source_adapter \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),watchSenders:D.array(D.string()).optional().describe("watch_senders \u7684\u517C\u5BB9\u522B\u540D"),ignoreSenders:D.array(D.string()).optional().describe("ignore_senders \u7684\u517C\u5BB9\u522B\u540D"),fetchLimit:D.number().optional().describe("fetch_limit \u7684\u517C\u5BB9\u522B\u540D"),aggregateBySender:D.boolean().optional().describe("aggregate_by_sender \u7684\u517C\u5BB9\u522B\u540D"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D"),downloadTimeoutMs:D.number().optional().describe("download_timeout_ms \u7684\u517C\u5BB9\u522B\u540D"),resolveUserIds:D.boolean().optional().describe("resolve_user_ids \u7684\u517C\u5BB9\u522B\u540D"),pollIntervalMs:D.number().optional().describe("poll_interval_ms \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u4E5F\u7528\u4E8E\u6846\u67B6\u9ED8\u8BA4\u503C\u6CE8\u5165")}).passthrough(),LI=D.object({conversation_ids:Xt.optional(),exclude_at_bot:D.boolean().optional().describe("\u662F\u5426\u6392\u9664 @\u673A\u5668\u4EBA\u7684\u6D88\u606F\uFF0C\u907F\u514D\u4E0E Stream \u6E90\u91CD\u590D"),conversation_types:er.optional(),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),excludeAtBot:D.boolean().optional().describe("exclude_at_bot \u7684\u517C\u5BB9\u522B\u540D"),conversationTypes:er.optional().describe("conversation_types \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),WI=D.object({conversation_ids:Xt.optional(),exclude_at_bot:D.boolean().optional().describe("\u662F\u5426\u6392\u9664 @\u673A\u5668\u4EBA\u7684\u6D88\u606F\uFF0C\u7F3A\u7701 true"),conversation_types:er.optional(),filters:LI.optional().describe("\u517C\u5BB9\u65E7\u914D\u7F6E\u7684\u6D88\u606F\u8FC7\u6EE4\u9879"),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),page_size:D.number().optional().describe("\u6BCF\u9875\u62C9\u53D6\u6570\u91CF\uFF0C\u7F3A\u7701 50"),max_pages:D.number().optional().describe("\u6700\u5927\u5206\u9875\u6B21\u6570\uFF0C\u7F3A\u7701 20"),aggregate_by_sender:D.boolean().optional().describe("\u662F\u5426\u6309\u53D1\u9001\u8005\u805A\u5408\u672C\u8F6E\u6D88\u606F\uFF1B\u7F3A\u7701 true\uFF0C\u542F\u7528\u540E\u6BCF\u4E2A\u53D1\u9001\u8005\u4EA7\u51FA\u4E00\u4E2A\u72EC\u7ACB\u4E8B\u4EF6"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u5F53\u524D\u8FDB\u7A0B\u5DE5\u4F5C\u76EE\u5F55\u89E3\u6790"),poll_interval_ms:D.number().optional().describe("\u6D88\u606F\u8F6E\u8BE2\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2"),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),excludeAtBot:D.boolean().optional().describe("exclude_at_bot \u7684\u517C\u5BB9\u522B\u540D"),conversationTypes:er.optional().describe("conversation_types \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),pageSize:D.number().optional().describe("page_size \u7684\u517C\u5BB9\u522B\u540D"),maxPages:D.number().optional().describe("max_pages \u7684\u517C\u5BB9\u522B\u540D"),aggregateBySender:D.boolean().optional().describe("aggregate_by_sender \u7684\u517C\u5BB9\u522B\u540D"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D"),pollIntervalMs:D.number().optional().describe("poll_interval_ms \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u4E5F\u7528\u4E8E\u6846\u67B6\u9ED8\u8BA4\u503C\u6CE8\u5165")}).passthrough(),Kc=D.union([D.record(D.string(),D.object({client_id:D.string().describe("\u673A\u5668\u4EBA\u5E94\u7528 Client ID"),client_secret:D.string().describe("\u673A\u5668\u4EBA\u5E94\u7528 Client Secret")}).passthrough()),MI]).describe("\u5185\u8054\u503C\u4E3A Record<credRef, { client_id: string; client_secret: string }>\uFF1B\u4E5F\u53EF\u7528 ${env.*}\u3001${config.*} \u6216 ${globalVar.*} \u6574\u503C\u5F15\u7528\uFF0C\u5F15\u7528\u7ED3\u679C\u5FC5\u987B\u662F\u540C\u4E00\u6620\u5C04\u7ED3\u6784\uFF1B\u914D\u7F6E\u591A\u5C11\u4E2A credRef \u5C31\u76D1\u542C\u591A\u5C11\u4E2A\u673A\u5668\u4EBA"),$g=Kc.describe("\u5DF2\u5E9F\u5F03\u517C\u5BB9\u522B\u540D\uFF1B\u65B0\u914D\u7F6E\u8BF7\u4F7F\u7528 robot_creds"),BI=D.object({kind:D.enum(["group","all-group"]).optional().describe("\u76D1\u542C\u76EE\u6807\u5F62\u6001\uFF0C\u7F3A\u7701 group\u3002group=\u6BCF\u4E2A\u7FA4\u4E00\u4E2A\u76D1\u542C\u5B50\u8FDB\u7A0B\uFF0Cconversation_ids \u5373\u8BA2\u9605\u76EE\u6807\u3002all-group=\u5355\u8FDB\u7A0B\u76D1\u542C\u8D26\u53F7\u5168\u90E8\u7FA4\uFF0Cconversation_ids \u9000\u5316\u4E3A\u5BA2\u6237\u7AEF\u767D\u540D\u5355\uFF08\u540D\u5355\u4E3A\u7A7A\u65F6\u4E22\u5F03\u5168\u90E8\u4E8B\u4EF6\uFF0C\u4E0D\u662F\u653E\u884C\u5168\u90E8\uFF09\uFF0C\u5185\u5B58\u4E0E\u7FA4\u6570\u89E3\u8026\uFF1B\u4EE3\u4EF7\u662F\u4F1A\u6536\u5230\u65E0\u5173\u7FA4\u7684\u6D88\u606F\u5E76\u5728\u672C\u5730\u4E22\u5F03\u3002at-me/sender/all-direct \u9884\u7559\u6269\u5C55\u4F4D"),conversation_ids:Xt.optional(),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),ignore_senders:D.array(D.string()).optional().describe("\u5FFD\u7565\u8FD9\u4E9B\u53D1\u9001\u8005\uFF08openDingTalkId \u6216\u5C55\u793A\u540D\uFF09\uFF0C\u7528\u4E8E\u9632\u6B62\u673A\u5668\u4EBA\u6D88\u606F\u56DE\u6D41"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u914D\u7F6E\u76EE\u5F55\u89E3\u6790"),download_timeout_ms:D.number().optional().describe("\u5355\u5F20\u56FE\u7247\u4E0B\u8F7D\u8D85\u65F6\u6BEB\u79D2\u6570"),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),ignoreSenders:D.array(D.string()).optional().describe("ignore_senders \u7684\u517C\u5BB9\u522B\u540D"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D"),downloadTimeoutMs:D.number().optional().describe("download_timeout_ms \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),zI=D.object({client_id:D.string().optional().describe("\u5355\u673A\u5668\u4EBA\u6A21\u5F0F\u7684\u5E94\u7528 Client ID\uFF1B\u654F\u611F\u503C\u5EFA\u8BAE\u6539\u7528 client_id_env \u6307\u5B9A\u73AF\u5883\u53D8\u91CF\u540D"),client_secret:D.string().optional().describe("\u5355\u673A\u5668\u4EBA\u6A21\u5F0F\u7684\u5E94\u7528 Client Secret\uFF1B\u654F\u611F\u503C\u5EFA\u8BAE\u6539\u7528 client_secret_env \u6307\u5B9A\u73AF\u5883\u53D8\u91CF\u540D"),client_id_env:D.string().optional().describe("\u4FDD\u5B58\u5355\u673A\u5668\u4EBA Client ID \u7684\u73AF\u5883\u53D8\u91CF\u540D\uFF0C\u5982 DINGTALK_CLIENT_ID\uFF1B\u8FD9\u91CC\u586B\u5199\u53D8\u91CF\u540D\uFF0C\u4E0D\u586B\u5199 ${env.*} \u5F15\u7528"),client_secret_env:D.string().optional().describe("\u4FDD\u5B58\u5355\u673A\u5668\u4EBA Client Secret \u7684\u73AF\u5883\u53D8\u91CF\u540D\uFF0C\u5982 DINGTALK_CLIENT_SECRET\uFF1B\u8FD9\u91CC\u586B\u5199\u53D8\u91CF\u540D\uFF0C\u4E0D\u586B\u5199 ${env.*} \u5F15\u7528"),robot_refs:$g.optional(),robot_creds:Kc.optional(),endpoint:D.string().optional().describe("\u4E13\u6709\u9489\u9489 Stream \u7AEF\u70B9\u9884\u7559\u503C\uFF1B\u5F53\u524D SDK \u5C1A\u672A\u6D88\u8D39"),conversation_types:er.optional().describe("\u76D1\u542C\u7684\u4F1A\u8BDD\u7C7B\u578B\uFF0C\u7F3A\u7701\u4EC5\u7FA4\u804A"),drop_direct:D.boolean().optional().describe("\u5DF2\u5E9F\u5F03\uFF1B\u8BF7\u6539\u7528 conversation_types"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u914D\u7F6E\u76EE\u5F55\u89E3\u6790"),clientId:D.string().optional().describe("client_id \u7684\u517C\u5BB9\u522B\u540D"),clientSecret:D.string().optional().describe("client_secret \u7684\u517C\u5BB9\u522B\u540D"),robotRefs:$g.optional().describe("robot_refs \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u5DF2\u5E9F\u5F03"),robotCreds:Kc.optional().describe("robot_creds \u7684\u517C\u5BB9\u522B\u540D"),conversationTypes:er.optional().describe("conversation_types \u7684\u517C\u5BB9\u522B\u540D"),dropDirect:D.boolean().optional().describe("drop_direct \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u5DF2\u5E9F\u5F03"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),UI=D.object({cron:D.string().optional().describe("\u6807\u51C6\u4E94\u6BB5 cron \u8868\u8FBE\u5F0F\uFF0C\u6216 every 5m / every 2h \u5F62\u5F0F\u7684\u56FA\u5B9A\u95F4\u9694\uFF1B\u81F3\u5C11\u914D\u7F6E cron\u3001daily_at\u3001interval_ms \u4E4B\u4E00\uFF0C\u82E5\u540C\u65F6\u5B58\u5728\u5219\u4F18\u5148\u7EA7\u4F4E\u4E8E daily_at\u3001\u9AD8\u4E8E interval_ms"),daily_at:D.string().optional().describe("\u6BCF\u65E5\u89E6\u53D1\u65F6\u95F4\uFF0C\u683C\u5F0F HH:mm\uFF1B\u81F3\u5C11\u914D\u7F6E cron\u3001daily_at\u3001interval_ms \u4E4B\u4E00\uFF0C\u82E5\u540C\u65F6\u5B58\u5728\u65F6\u4F18\u5148\u4F7F\u7528"),timezone:D.string().optional().describe("IANA \u65F6\u533A\uFF0C\u5982 Asia/Shanghai\uFF1B\u7F3A\u7701\u4F7F\u7528\u7CFB\u7EDF\u65F6\u533A"),interval_ms:D.number().optional().describe("\u56FA\u5B9A\u89E6\u53D1\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2\uFF1B\u81F3\u5C11\u914D\u7F6E cron\u3001daily_at\u3001interval_ms \u4E4B\u4E00\uFF0C\u82E5\u540C\u65F6\u5B58\u5728\u65F6\u4F18\u5148\u7EA7\u6700\u4F4E"),event_type:D.string().optional().describe("\u4EA7\u51FA\u7684\u4E8B\u4EF6\u7C7B\u578B\uFF0C\u7F3A\u7701 scheduled_trigger"),payload:D.record(D.string(),D.unknown()).optional().describe("\u968F\u4E8B\u4EF6\u53D1\u9001\u7684\u4EFB\u610F\u952E\u503C\u5BF9\u8C61 Record<string, unknown>\uFF1B\u65E7 metadata \u5199\u6CD5\u4EC5\u4E3A\u517C\u5BB9\uFF0C\u4E0D\u63A8\u8350\u65B0\u914D\u7F6E\u4F7F\u7528"),fire_immediately:D.boolean().optional().describe("\u662F\u5426\u5728\u542F\u52A8\u540E\u7ACB\u5373\u89E6\u53D1\u4E00\u6B21\uFF0C\u7F3A\u7701 false"),dailyAt:D.string().optional().describe("daily_at \u7684\u517C\u5BB9\u522B\u540D"),tz:D.string().optional().describe("timezone \u7684\u517C\u5BB9\u522B\u540D"),intervalMs:D.number().optional().describe("interval_ms \u7684\u517C\u5BB9\u522B\u540D"),eventType:D.string().optional().describe("event_type \u7684\u517C\u5BB9\u522B\u540D"),metadata:D.record(D.string(),D.unknown()).optional().describe("payload.metadata \u7684\u517C\u5BB9\u5199\u6CD5"),fireImmediately:D.boolean().optional().describe("fire_immediately \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),KI=D.object({mode:D.literal("reference").describe("\u56FA\u5B9A\u4E3A reference\uFF0C\u8868\u793A\u5F15\u7528\u53E6\u4E00\u4E2A workflow \u7684 tracker \u8868"),ref:D.string().describe("\u5F15\u7528\u8DEF\u5F84\uFF0C\u683C\u5F0F workflow:<workflowId>.tracker\uFF0C\u5982 workflow:group-qa.tracker")}).passthrough().describe('\u8DE8 workflow tracker \u5F15\u7528\uFF1A{ mode: "reference"; ref: "workflow:<workflowId>.tracker" }'),VI=D.object({base_id:D.string().optional().describe("AI \u8868\u683C Base ID\uFF1Bsource_table \u5F15\u7528\u6A21\u5F0F\u4E0B\u53EF\u7701\u7565"),table_id:D.string().optional().describe("AI \u8868\u683C Table ID\uFF1Bsource_table \u5F15\u7528\u6A21\u5F0F\u4E0B\u53EF\u7701\u7565"),source_table:KI.optional().describe('\u5F15\u7528\u5176\u4ED6 workflow \u7684 tracker \u8868\uFF0C\u7ED3\u6784\u4E3A { mode: "reference"; ref: "workflow:<workflowId>.tracker" }'),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),watch_mode:D.enum(["created","updated","both"]).optional().describe("\u76D1\u542C\u65B0\u589E\u3001\u66F4\u65B0\u6216\u4E24\u8005\uFF0C\u7F3A\u7701 created"),filters:NI.optional(),filter:D.union([Eg,D.array(Eg)]).optional().describe("\u9996\u9009\u7684\u7B49\u503C\u7B5B\u9009 DSL\uFF1A{ field: string; equals: string | number | boolean | (string | number | boolean)[] }\uFF0C\u6216\u8BE5\u5BF9\u8C61\u7684\u6570\u7EC4\uFF1B\u6570\u7EC4\u6761\u4EF6\u6309 AND \u7EC4\u5408\u3002field \u4F7F\u7528\u5B57\u6BB5\u540D\u65F6\u5FC5\u987B\u4E0E field_definitions.name \u5B8C\u5168\u4E00\u81F4\uFF0C\u624D\u80FD\u7FFB\u8BD1\u4E3A fieldId \u5FEB\u8DEF\u5F84\uFF1B\u62FC\u9519\u4F1A\u9000\u56DE\u6162\u8DEF\u5F84\u5E76\u53EF\u80FD\u8D85\u65F6"),fetch_limit:D.number().optional().describe("\u6BCF\u9875\u67E5\u8BE2\u8BB0\u5F55\u6570\u4E0A\u9650"),max_pages:D.number().optional().describe("\u5355\u8F6E\u6700\u5927\u5206\u9875\u6B21\u6570"),resolve_field_names:D.boolean().optional().describe("\u662F\u5426\u628A fieldId \u8F6C\u6210\u5B57\u6BB5\u540D\uFF0C\u7F3A\u7701 true"),emit_existing:D.boolean().optional().describe("\u662F\u5426\u5728\u9996\u6B21\u542F\u52A8\u65F6\u53D1\u9001\u5B58\u91CF\u8BB0\u5F55\uFF0C\u7F3A\u7701 false"),poll_interval_ms:D.number().optional().describe("\u8BB0\u5F55\u8F6E\u8BE2\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2"),baseId:D.string().optional().describe("base_id \u7684\u517C\u5BB9\u522B\u540D"),tableId:D.string().optional().describe("table_id \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),watchMode:D.enum(["created","updated","both"]).optional().describe("watch_mode \u7684\u517C\u5BB9\u522B\u540D"),fetchLimit:D.number().optional().describe("fetch_limit \u7684\u517C\u5BB9\u522B\u540D"),maxPages:D.number().optional().describe("max_pages \u7684\u517C\u5BB9\u522B\u540D"),resolveFieldNames:D.boolean().optional().describe("resolve_field_names \u7684\u517C\u5BB9\u522B\u540D"),emitExisting:D.boolean().optional().describe("emit_existing \u7684\u517C\u5BB9\u522B\u540D"),pollIntervalMs:D.number().optional().describe("poll_interval_ms \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u4E5F\u7528\u4E8E\u6846\u67B6\u9ED8\u8BA4\u503C\u6CE8\u5165")}).passthrough(),qI=[{type:"dingtalk_message",description:"\u517C\u5BB9\u4E8B\u4EF6\u6E90\u7C7B\u578B\uFF1B\u65B0\u914D\u7F6E\u7EDF\u4E00\u4F7F\u7528 dingtalk_group_message\u3002\u8FD0\u884C\u884C\u4E3A\u4E0E dingtalk_group_message \u5B8C\u5168\u4E00\u81F4\u3002",configSchema:Dg,factory:a((t,e)=>new Jr(t,e),"factory"),documentation:{aliasOf:"dingtalk_group_message"},configPolicy:{requiredFields:[Xn],validate:a(t=>Ni(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_group_message",description:"\u9489\u9489\u7FA4\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08dws \u9010\u7FA4\u8F6E\u8BE2\uFF09\u3002conversation_ids \u63A5\u53D7\u5185\u8054\u7FA4 ID \u5217\u8868\u6216 ${env.*}/${config.*}/${globalVar.*} \u6574\u503C\u5F15\u7528\uFF1B\u591A\u4E2A\u4F1A\u8BDD\u5E76\u53D1\u62C9\u53D6\uFF0C\u9002\u5408\u7FA4\u6570\u8F83\u5C11\u3001\u9700\u8981\u9010\u7FA4\u62C9\u53D6\u7684\u573A\u666F\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:Dg,factory:a((t,e)=>new Jr(t,e),"factory"),documentation:{hiddenConfigFields:["conversationIds","sourceAdapter","dwsBin","watchSenders","ignoreSenders","fetchLimit","aggregateBySender","imageMode","mediaDir","downloadTimeoutMs","resolveUserIds","pollIntervalMs"]},configPolicy:{requiredFields:[Xn],validate:a(t=>Ni(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_user_message",description:"\u9489\u9489\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08dws list-all \u6279\u91CF\u8F6E\u8BE2\uFF09\u3002\u4E00\u6B21\u5206\u9875\u62C9\u53D6\u6240\u6709\u4F1A\u8BDD\u540E\u6309 conversation_ids \u548C conversation_types \u672C\u5730\u8FC7\u6EE4\uFF0C\u9002\u5408\u7EA6 200 \u4E2A\u4EE5\u4E0A\u7FA4\uFF1B\u4EC5\u4E0E dingtalk_group_message \u5171\u4EAB conversation_ids \u8BED\u4E49\uFF0C\u5176\u4F59\u914D\u7F6E\u89C1\u5B57\u6BB5\u8868\u3002\u65E0\u6548\u6216\u4E0D\u53EF\u89C1\u7684 conversation_ids \u4E0D\u62A5\u9519\uFF0C\u53EA\u4F1A\u9759\u9ED8\u65E0\u4E8B\u4EF6\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:WI,factory:a((t,e)=>new $i(t,e),"factory"),documentation:{hiddenConfigFields:["filters","conversationIds","excludeAtBot","conversationTypes","dwsBin","pageSize","maxPages","aggregateBySender","imageMode","mediaDir","pollIntervalMs"]},configPolicy:{requiredFields:[Xn],validate:a(t=>{let e=S(t.filters)?t.filters:{};return Ni(t.conversation_ids??t.conversationIds??e.conversation_ids??e.conversationIds)},"validate")}},{type:"dingtalk_stream",description:"\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA Stream \u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08WebSocket \u63A8\u9001\uFF0C\u7FA4\u5185 @ \u673A\u5668\u4EBA\u89E6\u53D1\uFF09\u3002\u5355\u673A\u5668\u4EBA\u53EF\u7528 client_id/client_secret \u6216 *_env\uFF1B\u52A8\u6001\u591A\u673A\u5668\u4EBA\u4F7F\u7528 robot_creds \u51ED\u636E\u6620\u5C04\uFF0C\u914D\u7F6E\u591A\u5C11\u4E2A credRef \u5C31\u76D1\u542C\u591A\u5C11\u4E2A\u673A\u5668\u4EBA\u3002robot_creds \u53EF\u5185\u8054\uFF0C\u4E5F\u53EF\u901A\u8FC7 ${env.*}/${config.*}/${globalVar.*} \u6574\u503C\u5F15\u7528\u6D3B\u8BFB\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:zI,factory:a((t,e)=>new Pi(t,e),"factory"),documentation:{hiddenConfigFields:["clientId","clientSecret","robot_refs","robotRefs","robotCreds","conversationTypes","drop_direct","dropDirect","imageMode","mediaDir"]},configPolicy:{requiredFields:[],validate:GI}},{type:"dingtalk_event",description:"\u9489\u9489\u4E2A\u4EBA IM \u4E8B\u4EF6\u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08dws event \u957F\u8FDE\u63A5\u63A8\u9001\uFF0C\u65E0\u9700\u8F6E\u8BE2\uFF09\u3002\u4EE5\u5F53\u524D dws \u767B\u5F55\u7528\u6237\u8EAB\u4EFD\u5B9E\u65F6\u63A5\u6536\u76EE\u6807\u7FA4\u7684\u5168\u90E8\u6D88\u606F\uFF08\u542B\u672A @ \u7684\u6D88\u606F\uFF09\uFF1B\u76D1\u542C\u5F62\u6001\u7531 kind \u51B3\u5B9A\uFF08\u7F3A\u7701 group=\u6BCF\u7FA4\u4E00\u4E2A\u76D1\u542C\u5B50\u8FDB\u7A0B\uFF0Call-group=\u5355\u8FDB\u7A0B\u76D1\u542C\u5168\u90E8\u7FA4\u540E\u6309\u540D\u5355\u672C\u5730\u8FC7\u6EE4\uFF0C\u5185\u5B58\u4E0E\u7FA4\u6570\u89E3\u8026\uFF09\uFF1Bconversation_ids \u63A5\u53D7\u5185\u8054\u7FA4 ID \u5217\u8868\u6216 ${env.*}/${config.*}/${globalVar.*} \u6574\u503C\u5F15\u7528\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:BI,factory:a((t,e)=>new Mi(t,e),"factory"),documentation:{hiddenConfigFields:["conversationIds","dwsBin","ignoreSenders","imageMode","mediaDir","downloadTimeoutMs"]},configPolicy:{requiredFields:[Xn],validate:a(t=>Ni(t.conversation_ids??t.conversationIds),"validate")}},{type:"cron_scheduler",description:"\u4E1A\u52A1\u5B9A\u65F6\u4E8B\u4EF6\u6E90\u3002\u81F3\u5C11\u4F7F\u7528 cron\u3001daily_at \u6216 interval_ms \u4E4B\u4E00\u6307\u5B9A\u8C03\u5EA6\uFF1B\u591A\u9879\u540C\u65F6\u5B58\u5728\u65F6\u6309 daily_at\u3001cron\u3001interval_ms \u7684\u987A\u5E8F\u53D6\u503C\u3002event_type \u51B3\u5B9A\u4E8B\u4EF6\u540D\uFF0Cpayload \u53EF\u643A\u5E26\u4EFB\u610F\u9759\u6001\u952E\u503C\u3002\u7CBE\u786E\u5899\u949F\u8C03\u5EA6\u53EF\u914D IANA timezone\u3002",configSchema:UI,factory:a(t=>new ji(t),"factory"),documentation:{hiddenConfigFields:["dailyAt","tz","intervalMs","eventType","metadata","fireImmediately"]},configPolicy:{requiredFields:[],oneOf:{fields:["daily_at","cron","interval_ms"],labels:{daily_at:"\u6BCF\u65E5\u89E6\u53D1\u65F6\u95F4\uFF08HH:mm\uFF09",cron:"Cron \u8C03\u5EA6\u8868\u8FBE\u5F0F",interval_ms:"\u56FA\u5B9A\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09"}}}},{type:"aitable_record",description:"AI \u8868\u683C\u8BB0\u5F55\u8F6E\u8BE2\u4E8B\u4EF6\u6E90\u3002\u8868\u6765\u6E90\u4E8C\u9009\u4E00\uFF1A\u76F4\u63A5\u586B\u5199 base_id + table_id\uFF0C\u6216\u7528 source_table \u5F15\u7528\u53E6\u4E00\u4E2A workflow \u7684 tracker\uFF1Bfilter \u662F\u9996\u9009\u7B49\u503C DSL\uFF0Cfilters \u4EC5\u7528\u4E8E\u76F4\u63A5\u586B\u5199 dws \u7684\u6241\u5E73 operator/operands \u6811\u3002\u4EA7\u51FA record_created / record_updated \u4E8B\u4EF6\u3002",configSchema:VI,factory:a(t=>new Fi(t),"factory"),documentation:{hiddenConfigFields:["baseId","tableId","dwsBin","watchMode","fetchLimit","maxPages","resolveFieldNames","emitExisting","pollIntervalMs"]},configPolicy:{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],validate:JI}}];function tr(t){return qI.find(e=>e.type===t)}a(tr,"getEventSourceDescriptor");function _n(t,e){let n=tr(t);if(!n)return[];let r=n.configSchema.safeParse(e);if(r.success)return[];let o=D.toJSONSchema(n.configSchema),i=new Set,s=[];for(let c of Vc(r.error.issues)){let l=c.path.map(f=>typeof f=="number"?f:String(f)),d=l.length>0?l.join("."):"config",u=`${d}\0${c.message}`;i.has(u)||(i.add(u),s.push({key:d,path:l,message:c.message,description:HI(o,l)??`\u4E8B\u4EF6\u6E90 ${t} \u7684 ${d}`}))}return s}a(_n,"validateEventSourceConfig");function Vc(t,e=[]){return t.flatMap(n=>{let r=[...e,...n.path];if(n.code==="invalid_union"&&n.errors.length>0){let i=n.errors.flatMap(s=>Vc(s,r)).filter(s=>s.path.length>r.length);return i.length>0?i:[{path:r,message:n.message}]}return(n.code==="invalid_key"||n.code==="invalid_element")&&n.issues.length>0?Vc(n.issues,r):[{path:r,message:n.message}]})}a(Vc,"flattenZodIssues");function HI(t,e){let n=[t];for(let r of e){let o=[];for(let i of n.flatMap(Pg)){if(typeof r=="number"){S(i.items)&&o.push(i.items);continue}let s=S(i.properties)?i.properties:void 0;s&&S(s[r])&&o.push(s[r]),S(i.additionalProperties)&&o.push(i.additionalProperties)}n=o}for(let r of n.flatMap(Pg))if(typeof r.description=="string")return r.description}a(HI,"schemaDescriptionAtPath");function Pg(t){let e=[t];for(let n of["anyOf","oneOf"]){let r=t[n];Array.isArray(r)&&e.push(...r.filter(S))}return e}a(Pg,"schemaAlternatives");function Yr(t,e){let r=tr(t)?.configPolicy;if(!r)return{requiredFields:[],errors:[]};let o=r.validate?.(e);return{requiredFields:o?.requiredFields??r.requiredFields??[],optionalFields:o?.optionalFields??r.optionalFields??[],...r.oneOf?{oneOf:r.oneOf}:{},errors:o?.errors??[],...o?.summary?{summary:o.summary}:{}}}a(Yr,"eventSourceConfigPolicy");function GI(t){return{requiredFields:[],errors:[],summary:"robot_creds \u627F\u8F7D credRef\u2192\u673A\u5668\u4EBA\u51ED\u636E\u6620\u5C04\uFF0C\u914D\u7F6E\u591A\u5C11\u4E2A credRef \u5C31\u76D1\u542C\u591A\u5C11\u4E2A\u673A\u5668\u4EBA"}}a(GI,"validateDingtalkStreamSourceConfig");function JI(t){return ZI(t)?YI(t):{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],errors:[]}}a(JI,"validateAitableRecordSourceConfig");function ZI(t){let e=t.source_table;return S(e)&&e.mode==="reference"}a(ZI,"hasReferenceSourceTable");function YI(t){let e=t.source_table,n=S(e)&&typeof e.ref=="string"?e.ref.trim():"";return n?PI.test(n)?{requiredFields:[],errors:[],summary:`\u5F15\u7528 ${n}`}:{requiredFields:[],errors:[{key:"source_table.ref",message:`\u5F15\u7528\u8868 source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${n}\uFF09`,description:"\u5F15\u7528\u683C\u5F0F\u5FC5\u987B\u4E3A workflow:<workflowId>.tracker",yamlPath:["source_table","ref"]}]}:{requiredFields:[],errors:[{key:"source_table.ref",message:"\u5F15\u7528\u8868\u7F3A\u5C11 source_table.ref",description:"\u5F15\u7528\u5176\u4ED6 workflow \u7684 tracker \u8868\uFF0C\u5982 workflow:group-qa.tracker",yamlPath:["source_table","ref"]}]}}a(YI,"referenceSourceTablePolicy");var Li=class{static{a(this,"EventSourceRegistry")}customFactories=new Map;register(e,n){this.customFactories.set(e,n)}create(e,n){let r=this.customFactories.get(e.type),o=r?void 0:tr(e.type),i=r??o?.factory;if(!i)return h.warn("event-source-registry","\u672A\u77E5\u4E8B\u4EF6\u6E90\u7C7B\u578B",{type:e.type,name:e.name}),null;if(o){let s=_n(e.type,e.config);if(s.length>0)return h.error("event-source-registry","\u4E8B\u4EF6\u6E90\u914D\u7F6E\u65E0\u6548",{name:e.name,type:e.type,errors:s.map(c=>`config.${c.key}: ${c.message}`)}),null}try{let s=i(e,n);return h.info("event-source-registry","\u4E8B\u4EF6\u6E90\u5DF2\u521B\u5EFA",{name:e.name,type:e.type}),s}catch(s){return h.error("event-source-registry","\u4E8B\u4EF6\u6E90\u521B\u5EFA\u5931\u8D25",{name:e.name,type:e.type,error:s instanceof Error?s.message:String(s)}),null}}createAll(e,n={}){let r={};n.pollIntervalMs!==void 0&&(r.pollIntervalMs=n.pollIntervalMs),n.configDir!==void 0&&(r.configDir=n.configDir);let o=[],i={globalVars:n.globalVars,configScope:n.configScope};for(let s of e){let c=Object.keys(r).length===0?s:{...s,config:{...r,...s.config}},l=QI(c,n.configRefs??{}),d=XI(l,n.tableRefs??{}),u=this.create(d,i);u&&o.push({source:u,handlerRecipe:d.handler,...d.handler_config?{handlerConfig:d.handler_config}:{},...d.record_policy?{recordPolicy:d.record_policy}:{}})}return o}};function QI(t,e){return Object.keys(e).length===0?t:Wi(t,e)}a(QI,"resolveConfigReferences");function Og(t,e){return Object.keys(e).length===0?t:Wi(t,e)}a(Og,"resolvePureRefs");function Wi(t,e){if(Array.isArray(t))return t.map(o=>Wi(o,e));if(!S(t))return t;if(Object.keys(t).length===1&&typeof t.ref=="string"){let o=t.ref.trim();return o&&o in e?e[o]:(h.warn("event-source-registry","\u914D\u7F6E\u5F15\u7528\u672A\u89E3\u6790\uFF0C\u4FDD\u7559\u539F\u59CB ref",{ref:o}),t)}let r={};for(let[o,i]of Object.entries(t))r[o]=Wi(i,e);return r}a(Wi,"resolveReferenceValue");function XI(t,e){if(t.type!=="aitable_record")return t;let n=t.config.source_table;if(!S(n)||n.mode!=="reference")return t;let r=typeof n.ref=="string"?n.ref.trim():"",o=r?e[r]:void 0;return o?{...t,config:{...t.config,base_id:o.base_id,table_id:o.table_id}}:(h.warn("event-source-registry","\u8868\u5F15\u7528\u672A\u89E3\u6790\uFF0C\u4E8B\u4EF6\u6E90\u5C06\u6309\u539F\u914D\u7F6E\u521B\u5EFA",{name:t.name,ref:r}),t)}a(XI,"resolveEventSourceReferences");function jg(t,e,n){let r={},o=`workflow:${t}.tracker`;r[o]=n,r[`${o}.base_id`]=n.base_id,r[`${o}.table_id`]=n.table_id;for(let i of e.eventSources??[]){let s=i.name||i.handler;if(!s)continue;let c=`workflow:${t}.event_source.${s}`;r[c]=i,r[`${c}.config`]=i.config,qc(r,`${c}.config`,i.config),i.handler_config&&(r[`${c}.handler_config`]=i.handler_config,qc(r,`${c}.handler_config`,i.handler_config))}return r}a(jg,"collectWorkflowReferenceValues");function qc(t,e,n){if(S(n))for(let[r,o]of Object.entries(n)){let i=`${e}.${r}`;t[i]=o,S(o)&&qc(t,i,o)}}a(qc,"flattenReferenceValues");var tn=class{static{a(this,"InMemoryGlobalVarStore")}map=new Map;listeners=new Map;get(e){let n=e.indexOf(".");if(n<0)return this.map.get(e);let r=e.slice(0,n),o=e.slice(n+1),i=this.map.get(r);for(let s of o.split(".")){if(i==null||typeof i!="object"||Array.isArray(i))return;i=i[s]}return i}set(e,n){this.map.set(e,n),h.debug("global-var","set",{key:e});let r=this.listeners.get(e);if(r)for(let o of r)try{o()}catch(i){h.warn("global-var","listener \u629B\u9519",{key:e,error:i instanceof Error?i.message:String(i)})}}has(e){return this.map.has(e)}keys(){return[...this.map.keys()]}subscribe(e,n){let r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.add(n),()=>{r.delete(n),r.size===0&&this.listeners.delete(e)}}};import{z as B}from"zod";var eR=B.enum(["ambient","task","guardian"]),tR=B.object({id:B.string().min(1),name:B.string().min(1),description:B.string().default("")}),nR=B.enum(["critical","warning"]),rR=B.object({id:B.string().min(1),rule:B.string().min(1),severity:nR.default("warning")}),oR=B.object({format:B.enum(["json","text","markdown"]).default("text"),schema:B.record(B.string(),B.unknown()).optional()}),iR=B.object({auto_execute:B.boolean(),requires_human_review:B.boolean(),can_escalate:B.boolean().optional(),can_delegate:B.boolean().optional(),can_suggest_workflow_change:B.boolean().optional()}),sR=B.object({initial_level:B.number().min(1).default(1),auto_level_up_threshold:B.number().min(1).default(20),level_down_on_failure:B.boolean().default(!0),autonomy_by_level:B.record(B.string(),iR).default({})}),aR=B.object({enabled:B.boolean().default(!1),persistence:B.enum(["file","aitable","none"]).default("none"),max_entries:B.number().min(1).default(100),retention_days:B.number().min(1).default(90),learns_from:B.array(B.enum(["execution_results","human_feedback","peer_corrections"])).default([])}),AU=B.object({source:B.string().url(),collection:B.string().min(1)}),Fg=B.object({bin:B.string().min(1),args:B.array(B.string()).default([]),timeout_ms:B.number().int().min(1).optional()}),Hc=".kb/wiki/_index.md",cR=B.object({source_kind:B.enum(["aitable","excel","md"]).optional(),inputs:B.array(B.string()).default([]),build:B.array(Fg).default([]),reflow:Fg.optional(),artifact:B.string().default(Hc),validate:B.array(B.string()).default([]),custom:B.record(B.string(),B.unknown()).optional()}),lR=B.object({collection:B.string().min(1),source:B.string().url().optional(),compile:cR.optional()}),Gc=B.union([B.string(),lR]),dR=B.object({domains:B.array(B.string()).default([]),kb_collections:B.array(Gc).default([])}),Qr=B.object({id:B.string().min(1),name:B.string().min(1),department:B.string().optional(),version:B.string().default("1.0.0"),archetype:eR.default("task"),persona:B.union([B.string().min(1),B.object({file:B.string().min(1)})]),skills:B.array(tR).default([]),guardrails:B.array(rR).default([]),output_standard:oR.optional(),knowledge_scope:dR.optional(),trust:sR.optional(),memory:aR.optional()});function Jc(t){let e=Qr.safeParse(t);return e.success?{ok:!0,definition:e.data}:{ok:!1,errors:e.error.issues.map(r=>`${r.path.join(".")||"<root>"}: ${r.message}`)}}a(Jc,"parseRoleDefinition");var Ng={auto_execute:!1,requires_human_review:!0,can_escalate:!1,can_delegate:!1,can_suggest_workflow_change:!1};var uR="__ephemeral__",Bi=class{constructor(e){this.registry=e}registry;static{a(this,"RoleResolver")}async resolve(e){let n=this.registry.get(e);return n?Lg(n,!1):(h.debug("role","\u89D2\u8272\u672A\u6CE8\u518C\uFF0C\u8C03\u7528\u65B9\u53EF\u56DE\u9000\u4E3A\u4E34\u65F6\u89D2\u8272",{roleId:e}),null)}buildEphemeral(e){let n=gR(e);return Lg(n,!0)}};function fR(t,e){let n=t.trust?.autonomy_by_level?.[String(e)];return n?{auto_execute:n.auto_execute,requires_human_review:n.requires_human_review,can_escalate:n.can_escalate??!1,can_delegate:n.can_delegate??!1,can_suggest_workflow_change:n.can_suggest_workflow_change??!1}:{...Ng}}a(fR,"resolveAutonomy");function Lg(t,e){let n=t.trust?.initial_level??1;return{definition:t,currentTrustLevel:n,autonomy:fR(t,n),memoryEntries:[],ephemeral:e}}a(Lg,"buildInstance");function pR(t){let{definition:e,memoryEntries:n}=t,r=typeof e.persona=="string"?e.persona:e.persona.file;return{id:e.id,name:e.name,persona:r,skills:e.skills,guardrails:e.guardrails,memory:n,outputStandard:e.output_standard,kbCollections:(e.knowledge_scope?.kb_collections??[]).map(o=>typeof o=="string"?o:o.collection)}}a(pR,"buildRoleContext");async function Zc(t,e){if(!t||!e||!e.trim())return;let r=await t.resolve(e)??t.buildEphemeral(e);return pR(r)}a(Zc,"resolveRoleContext");function gR(t){let e=t.trim()||"\u901A\u7528\u52A9\u624B";return Qr.parse({id:uR,name:mR(e),persona:e,archetype:"task"})}a(gR,"ephemeralDefinition");function mR(t){let n=(t.split(`
314
- `)[0]?.trim()??"")||"\u4E34\u65F6\u89D2\u8272";return n.length>20?`${n.slice(0,20)}\u2026`:n}a(mR,"deriveName");var Xr=new Set(["ai","coding","messaging","git","codeReview","ci","table","todo","approval","file","memory","shell"]);function zi(t,e){if(t==null)return"";switch(e){case"user":case"person":case"creator":case"lastModifier":return hR(t);case"department":case"group":return yR(t);case"singleSelect":return Yc(t);case"multipleSelect":return wR(t);case"url":return bR(t);case"richText":return kR(t);case"attachment":return vR(t);case"unidirectionalLink":case"bidirectionalLink":return xR(t);case"geolocation":return IR(t);case"text":case"primaryDoc":case"telephone":case"email":case"barcode":case"idCard":return En(t);case"number":case"currency":case"progress":case"rating":return RR(t);case"date":case"createdTime":case"lastModifiedTime":return En(t);case"checkbox":return!!t;default:return An(t)}}a(zi,"normalizeByType");function hR(t){if(Array.isArray(t))return t.map(e=>{if(S(e)){let n=e.userId,r=e.corpId,o=e.name??e.displayName,i=e.userRef,s=e.uid,c={};return typeof n=="string"&&(c.userId=n),typeof r=="string"&&(c.corpId=r),typeof o=="string"&&(c.name=o),typeof i=="string"&&(c.userRef=i),typeof s=="string"&&(c.uid=s),Object.keys(c).length>0?c:An(e)}return An(e)});if(S(t)){let e=t.userId,n=t.uid,r=t.userRef,o={};if(typeof e=="string"&&(o.userId=e),typeof n=="string"&&(o.uid=n),typeof r=="string"&&(o.userRef=r),typeof t.corpId=="string"&&(o.corpId=t.corpId),typeof t.name=="string"&&(o.name=t.name),Object.keys(o).length>0)return o}return An(t)}a(hR,"normalizePersonCell");function yR(t){return Array.isArray(t)?t:An(t)}a(yR,"normalizeIdArray");function Yc(t){if(typeof t=="string")return t;if(S(t)){let e=t.name;if(typeof e=="string")return e;let n=t.id;if(typeof n=="string")return n}return En(t)}a(Yc,"extractOptionName");function wR(t){return Array.isArray(t)?t.map(e=>Yc(e)).filter(Boolean).join(", "):Yc(t)}a(wR,"extractOptionNames");function bR(t){if(typeof t=="string")return t;if(S(t)){let e=t.link;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return En(t)}a(bR,"normalizeUrlCell");function kR(t){if(typeof t=="string")return t;if(S(t)){let e=t.markdown;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return En(t)}a(kR,"extractMarkdown");function vR(t){return Array.isArray(t)?t.map(e=>{if(S(e)){let n=e.filename??e.name;if(typeof n=="string")return n}return""}).filter(Boolean).join(", "):En(t)}a(vR,"normalizeAttachments");function SR(t){return Array.isArray(t)?t.map(e=>{if(!S(e))return null;let n=e.filename??e.name;if(typeof n!="string")return null;let r=typeof e.url=="string"?e.url:typeof e.resourceUrl=="string"?e.resourceUrl:void 0;return{filename:n,url:r,resourceId:typeof e.resourceId=="string"?e.resourceId:void 0,size:typeof e.size=="number"?e.size:void 0,type:typeof e.type=="string"?e.type:void 0,...typeof e.isLink=="boolean"?{isLink:e.isLink}:{}}}).filter(e=>e!==null):[]}a(SR,"extractAttachmentDetails");function xR(t){if(S(t)){let e=t.linkedRecordIds;if(Array.isArray(e))return e}return An(t)}a(xR,"extractLinkedIds");function IR(t){return S(t)?t:En(t)}a(IR,"normalizeGeo");function En(t){return t==null?"":typeof t=="string"?t:String(t)}a(En,"primitiveToString");function RR(t){if(typeof t=="number")return t;if(typeof t=="string"){let e=Number(t);return Number.isFinite(e)?e:0}return 0}a(RR,"toNumber");function An(t){if(t==null)return"";if(typeof t=="string"||typeof t=="number"||typeof t=="boolean")return t;if(Array.isArray(t))return t.map(e=>An(e)).join(", ");if(S(t)){for(let e of["name","text","markdown","value","displayName","label"]){let n=t[e];if(typeof n=="string")return n;if(typeof n=="number")return String(n)}return JSON.stringify(t)}return String(t)}a(An,"legacyNormalize");function CR(t,e){let n={};for(let[r,o]of Object.entries(t))n[r]=zi(o,e?.[r]);return n}a(CR,"normalizeFields");var Ui=class{static{a(this,"RecipeExecutor")}settings;tracker;roleResolver;configScope;toolkitRegistry;globalVars;configRefs;recipeCache=new Map;constructor(e){this.settings=e.settings,this.tracker=e.tracker,this.roleResolver=e.roleResolver,this.configScope=e.configScope,this.toolkitRegistry=e.toolkitRegistry,this.globalVars=e.globalVars??new tn,this.configRefs=e.configRefs??{}}async execute(e,n,r,o){let i=a(async()=>e.recipe?await this.executeRecipe(e,n,r,o):e.prompt?await this.executeCodingAgent(e,n,r,o):{status:"failed",output:{},error:`\u6B65\u9AA4 "${e.id}" \u672A\u5B9A\u4E49 recipe \u6216 prompt\uFF0C\u65E0\u6CD5\u6267\u884C`,logs:["[ERROR] \u6B65\u9AA4\u7F3A\u5C11\u6267\u884C\u6307\u4EE4"]},"run"),s=Ho();if(!s)return await i();s.startStep(n.id,e.id,e.name,this.resolveInput(e,n,r));try{let c=await i();return await s.endStep(n.id,c.status,c.output,c.error??c.blockReason,c.logs??[]),c}catch(c){throw await s.endStep(n.id,"failed",{},c instanceof Error?c.message:String(c)),c}}async executeCodingAgent(e,n,r,o){let i=[],s=this.resolveEngine(e),c=li[s];if(!c)return{status:"failed",output:{},error:`engine "${s}" \u65E0\u5BF9\u5E94\u7684 coding agent\uFF0C\u8BF7\u5207\u6362\u4E3A claude/codex/qoder`,logs:["[ERROR] llm_only \u6A21\u5F0F\u4E0B\u4E0D\u652F\u6301\u76F4\u63A5\u6267\u884C prompt \u6B65\u9AA4"]};let l=this.interpolatePrompt(e.prompt,n,r),d=e.sla?.timeout_ms??this.settings.agent.timeout_ms,u=await Zc(this.roleResolver,void 0),f=await this.resolveKb(u),p=Hr({...u?{roleContext:u}:{},...f?{kbContext:f}:{}}),g=[TR];p&&g.push(p.promptBlock),typeof r.__humanReply=="string"&&g.push(r.__humanReply),g.push(l);let m=g.join(`
313
+ `)){let o=r.trim();o&&(o.startsWith("[event] ready")?h.info("dingtalk-event-source","ready",{name:this.name,conversationId:e.conversationId,detail:o}):h.debug("dingtalk-event-source","stderr",{name:this.name,conversationId:e.conversationId,detail:o.slice(0,300)}))}}parseConfig(e){return{kind:e.kind==="all-group"?"all-group":"group",conversationIds:e.conversation_ids??e.conversationIds,dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,ignoreSenders:Array.isArray(e.ignore_senders)?e.ignore_senders.map(String):Array.isArray(e.ignoreSenders)?e.ignoreSenders.map(String):void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0,downloadTimeoutMs:typeof e.download_timeout_ms=="number"?e.download_timeout_ms:typeof e.downloadTimeoutMs=="number"?e.downloadTimeoutMs:void 0}}};function CI(t){let e=t.quoted_message;if(!v(e))return{};let n=e.message_id;return typeof n!="string"||!n.trim()?{}:{quotedMessageId:n.trim()}}a(CI,"extractQuotedMessageId");import{CronExpressionParser as zc}from"cron-parser";function Tg(t,e){let n=new Intl.DateTimeFormat("en-CA",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(t),r=a(o=>Number(n.find(i=>i.type===o)?.value??0),"pick");return{year:r("year"),month:r("month"),day:r("day")}}a(Tg,"zonedDateParts");function _g(t,e){let n=new Intl.DateTimeFormat("en-US",{timeZone:e,hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(t),r={};for(let l of n)l.type!=="literal"&&(r[l.type]=Number(l.value));let o=a(l=>Number(r[l]??0),"get"),i=o("hour"),s=i===24?0:i;return Date.UTC(o("year"),o("month")-1,o("day"),s,o("minute"),o("second"))-t.getTime()}a(_g,"tzOffsetMs");function Bc(t,e,n,r,o,i,s,c){let l=Date.UTC(t,e,n,r,o,i,0),d=_g(new Date(l),c);return new Date(l-d+s).toISOString()}a(Bc,"zonedWallClockToUtc");function TI(t,e=new Date){let n=Tg(e,t),r=new Date(Date.UTC(n.year,n.month-1,n.day)-864e5),o=r.getUTCFullYear(),i=r.getUTCMonth(),s=r.getUTCDate(),c=`${o}-${String(i+1).padStart(2,"0")}-${String(s).padStart(2,"0")}`,l=Bc(o,i,s,0,0,0,0,t),d=Bc(o,i,s,23,59,59,999,t);return{since:l,until:d,dateStr:c}}a(TI,"yesterdayRange");function _I(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"--:--";let r=new Intl.DateTimeFormat("en-GB",{timeZone:e,hourCycle:"h23",hour:"2-digit",minute:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("hour")}:${o("minute")}`}a(_I,"formatZonedHm");function Zr(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"";let r=new Intl.DateTimeFormat("en-CA",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("year")}-${o("month")}-${o("day")} ${o("hour")}:${o("minute")}:${o("second")}`}a(Zr,"formatZonedDateTime");function AI(t){let e=t?.trim();if(!e)return"Asia/Shanghai";try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(new Date),e}catch{return"Asia/Shanghai"}}a(AI,"normalizeTimezone");var Oi="0 0 * * *",ji=class{static{a(this,"CronSchedulerSource")}name;config;scheduleMode;timezone;intervalMs=0;lastFiredAt=0;cronExpr=null;nextFireAt=null;immediateFirePending=!1;running=!1;abortController=null;constructor(e){this.name=e.name,this.config=this.parseConfig(e.config),this.timezone=this.normalizeTimezone(this.config.timezone);let n=this.config.cron?this.parseEveryInterval(this.config.cron):null;this.config.dailyAt!==void 0?(this.scheduleMode="precise",this.cronExpr=this.dailyAtToCron(this.config.dailyAt)):this.config.cron&&n===null?(this.scheduleMode="precise",this.cronExpr=this.validateCron(this.config.cron)):n!==null?(this.scheduleMode="interval",this.intervalMs=n):this.config.intervalMs?(this.scheduleMode="interval",this.intervalMs=this.config.intervalMs):(this.scheduleMode="interval",this.intervalMs=36e5)}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController,this.scheduleMode==="interval"?this.lastFiredAt=this.config.fireImmediately?0:Date.now():(this.immediateFirePending=this.config.fireImmediately===!0,this.nextFireAt=this.immediateFirePending?new Date(0):this.computeNextFireAt(new Date)),h.info("cron-scheduler","started",{name:this.name,scheduleMode:this.scheduleMode,intervalMs:this.scheduleMode==="interval"?this.intervalMs:void 0,cron:this.cronExpr??void 0,timezone:this.timezone,nextFireAt:this.nextFireAt?.toISOString(),nextFireAtLocal:this.nextFireAt?Zr(this.nextFireAt,this.timezone):void 0,eventType:this.config.eventType});let n=this.scheduleMode==="interval"?Math.min(this.intervalMs,6e4):3e4;for(;this.running;){try{let r=this.poll();r.length>0&&e(r)}catch(r){h.error("cron-scheduler","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(n)}h.info("cron-scheduler","stopped",{name:this.name})}stop(){this.running=!1,this.abortController?.abort()}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}poll(){let e=Date.now(),n;if(this.scheduleMode==="interval"){if(e-this.lastFiredAt<this.intervalMs)return[];this.lastFiredAt=e,n=new Date(e).toISOString()}else{if(this.nextFireAt||(this.nextFireAt=this.computeNextFireAt(new Date(e))),e<this.nextFireAt.getTime())return[];n=this.immediateFirePending?new Date(e).toISOString():this.nextFireAt.toISOString(),this.immediateFirePending=!1,this.nextFireAt=this.computeNextFireAt(new Date(e+1))}let r={type:this.config.eventType,payload:{...this.config.payload,schedulerName:this.name,firedAt:new Date(e).toISOString(),scheduledFor:n,timezone:this.timezone},timestamp:new Date(e).toISOString(),itemId:null};return h.info("cron-scheduler","fired",{name:this.name,eventType:this.config.eventType,scheduledFor:n,scheduledForLocal:Zr(new Date(n),this.timezone),nextFireAt:this.nextFireAt?.toISOString(),nextFireAtLocal:this.nextFireAt?Zr(this.nextFireAt,this.timezone):void 0,timezone:this.timezone}),[r]}computeNextFireAt(e){let n=this.cronExpr??Oi;try{return zc.parse(n,{currentDate:e,tz:this.timezone}).next().toDate()}catch(r){return h.error("cron-scheduler","cron \u89E3\u6790\u5931\u8D25\uFF0C\u56DE\u9000\u6BCF\u65E5 00:00",{cron:n,error:r instanceof Error?r.message:String(r)}),zc.parse(Oi,{currentDate:e,tz:this.timezone}).next().toDate()}}dailyAtToCron(e){let n=e.match(/^(\d{1,2}):(\d{2})$/);if(n){let r=parseInt(n[1],10),o=parseInt(n[2],10);if(r>=0&&r<=23&&o>=0&&o<=59)return`${o} ${r} * * *`}return h.warn("cron-scheduler","dailyAt \u683C\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230 00:00",{dailyAt:e}),Oi}validateCron(e){try{return zc.parse(e,{tz:this.timezone}),e}catch(n){return h.warn("cron-scheduler","cron \u8868\u8FBE\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230\u6BCF\u65E5 00:00",{cron:e,error:n instanceof Error?n.message:String(n)}),Oi}}parseEveryInterval(e){let n=e.match(/^every\s+(\d+)(s|m|h|d)$/i);if(!n)return null;let r=parseInt(n[1],10);switch(n[2].toLowerCase()){case"s":return r*1e3;case"m":return r*6e4;case"h":return r*36e5;case"d":return r*864e5;default:return null}}normalizeTimezone(e){let r=e??Intl.DateTimeFormat().resolvedOptions().timeZone??"UTC";try{return new Intl.DateTimeFormat("en-US",{timeZone:r}).format(new Date),r}catch(o){return h.warn("cron-scheduler","timezone \u975E\u6CD5\uFF0C\u56DE\u9000 UTC",{timezone:r,error:o instanceof Error?o.message:String(o)}),"UTC"}}parseConfig(e){let n;return typeof e.payload=="object"&&e.payload!==null?n=e.payload:typeof e.metadata=="object"&&e.metadata!==null&&(n={metadata:e.metadata}),{cron:typeof e.cron=="string"?e.cron:void 0,dailyAt:typeof e.daily_at=="string"?e.daily_at:typeof e.dailyAt=="string"?e.dailyAt:void 0,timezone:typeof e.timezone=="string"?e.timezone:typeof e.tz=="string"?e.tz:void 0,intervalMs:typeof e.interval_ms=="number"?e.interval_ms:typeof e.intervalMs=="number"?e.intervalMs:void 0,eventType:String(e.event_type??e.eventType??"scheduled_trigger"),payload:n,fireImmediately:e.fire_immediately===!0||e.fireImmediately===!0}}};function EI(t,e){if(t===void 0)return;let n=Array.isArray(t)?t:[t],r=[];for(let s of n){if(!s||typeof s!="object"||typeof s.field!="string"||s.field.trim()===""){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08field \u7F3A\u5931\uFF09",s);continue}let l=(Array.isArray(s.equals)?s.equals:[s.equals]).filter(d=>d!=null&&d!=="");if(l.length===0){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08equals \u4E3A\u7A7A\uFF09",s);continue}r.push({field:s.field,values:l})}if(r.length===0)return;let o=a((s,c)=>({operator:"eq",operands:[s,c]}),"eqLeaf");if(r.length===1){let s=r[0],c=s.values.map(l=>o(s.field,l));return c.length===1?{operator:"and",operands:c}:{operator:"or",operands:c}}return{operator:"and",operands:r.map(s=>s.values.length===1?o(s.field,s.values[0]):(e?.(`\u591A\u6761\u4EF6 AND \u4E2D\u5B57\u6BB5\u300C${s.field}\u300D\u4E3A\u591A\u503C,\u9000\u5316\u7528 any_of;\u82E5\u8BE5\u5B57\u6BB5\u662F\u5355\u9009(singleSelect),dws \u4F1A\u9759\u9ED8\u5339\u914D 0 \u6761`,s),{operator:"any_of",operands:[s.field,s.values]}))}}a(EI,"compileSimpleFilter");var Fi=class{static{a(this,"AITableRecordSource")}name;config;pollIntervalMs;watchMode;resolveFieldNames;dws;running=!1;abortController=null;primed=!1;seenIds=new Set;signatures=new Map;idToName=new Map;nameToId=new Map;fieldMapResolved=!1;hasFilter;constructor(e){this.name=e.name,this.config=this.parseConfig(e.config),this.watchMode=this.config.watchMode??"created",this.resolveFieldNames=this.config.resolveFieldNames??!0,this.hasFilter=this.config.filter!==void 0||this.config.filters!==void 0,this.dws=new he({bin:this.config.dwsBin??"dws"});let n=e.config;this.pollIntervalMs=typeof n.poll_interval_ms=="number"?n.poll_interval_ms:typeof n.pollIntervalMs=="number"?n.pollIntervalMs:6e4}async start(e){if(!this.running){for(this.running=!0,this.abortController=new AbortController,(!this.config.baseId||!this.config.tableId)&&h.warn("aitable-record-source","missing base_id / table_id",{name:this.name}),h.info("aitable-record-source","started",{name:this.name,baseId:this.config.baseId,tableId:this.config.tableId,watchMode:this.watchMode,pollIntervalMs:this.pollIntervalMs});this.running;){try{let n=await this.poll();n.length>0&&e(n)}catch(n){h.error("aitable-record-source","poll error",{name:this.name,error:n instanceof Error?n.message:String(n)})}if(!this.running)break;await this.sleep(this.pollIntervalMs)}h.info("aitable-record-source","stopped",{name:this.name})}}stop(){this.running=!1,this.abortController?.abort()}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}async poll(){(this.resolveFieldNames||this.hasFilter)&&!this.fieldMapResolved&&await this.resolveFieldMap();let e=await this.queryRecords(),n=!this.primed&&!this.config.emitExisting,r=[];for(let o of e){let i=$I(o);if(!i)continue;let s=DI(o),c=this.resolveFieldNames?this.translateCellsToNames(s):s,l=Uc(s),d=!this.seenIds.has(i),u=!d&&this.signatures.get(i)!==l;this.seenIds.add(i),this.signatures.set(i,l),!n&&(d&&(this.watchMode==="created"||this.watchMode==="both")?r.push(this.buildEvent("record_created",i,c,o)):u&&(this.watchMode==="updated"||this.watchMode==="both")&&r.push(this.buildEvent("record_updated",i,c,o)))}return this.pruneSeen(),this.primed=!0,r.length>0&&h.info("aitable-record-source","emitting record events",{name:this.name,eventCount:r.length}),r}async resolveFieldMap(){try{let e=await this.dws.runJson(["aitable","field","get","--base-id",this.config.baseId,"--table-id",this.config.tableId]);for(let n of Te(e)){if(!v(n))continue;let r=typeof n.fieldId=="string"?n.fieldId:null,o=typeof n.fieldName=="string"?n.fieldName:null;r&&o&&(this.idToName.set(r,o),this.nameToId.set(o,r))}h.info("aitable-record-source","field mapping resolved",{name:this.name,count:this.idToName.size})}catch(e){h.warn("aitable-record-source","field mapping resolve failed, using raw fieldId",{name:this.name,error:e instanceof Error?e.message:String(e)})}this.fieldMapResolved=!0}async queryRecords(){let e=[],n=this.config.fetchLimit??50,r=this.config.maxPages??10,o=null,i=0,s=this.config.filters!==void 0?this.config.filters:EI(this.config.filter,(l,d)=>h.warn("aitable-record-source",l,{name:this.name,cond:d})),c=s!==void 0?this.translateFilterFieldNames(s):void 0;do{let l=["aitable","record","query","--base-id",this.config.baseId,"--table-id",this.config.tableId,"--limit",String(n)];c!==void 0&&l.push("--filters",JSON.stringify(c)),o&&l.push("--cursor",o);let d=await this.dws.runJson(l),u=Te(d);e.push(...u);let f=Zo(d);if(i+=1,u.length<n||f===o)break;o=f}while(o&&i<r);return e}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e))n[this.idToName.get(r)??r]=o;return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}buildEvent(e,n,r,o){return{type:e,payload:{baseId:this.config.baseId,tableId:this.config.tableId,recordId:n,cells:r,raw:o},timestamp:new Date().toISOString(),itemId:n}}pruneSeen(){if(this.seenIds.size<=5e4)return;let e=[...this.seenIds].slice(-3e4);this.seenIds.clear();let n=new Set(e);for(let r of e)this.seenIds.add(r);for(let r of[...this.signatures.keys()])n.has(r)||this.signatures.delete(r)}parseConfig(e){let n=e.watch_mode??e.watchMode,r=n==="created"||n==="updated"||n==="both"?n:void 0;return{baseId:String(e.base_id??e.baseId??""),tableId:String(e.table_id??e.tableId??""),dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchMode:r,filters:e.filters,filter:e.filter,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,resolveFieldNames:typeof e.resolve_field_names=="boolean"?e.resolve_field_names:typeof e.resolveFieldNames=="boolean"?e.resolveFieldNames:void 0,emitExisting:typeof e.emit_existing=="boolean"?e.emit_existing:typeof e.emitExisting=="boolean"?e.emitExisting:void 0}}};function DI(t){let e=ye(t);if(!v(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(v(r))return r}return e}a(DI,"recordCells");function $I(t){let e=ye(t);if(!v(e))return null;for(let n of["recordId","record_id","id"]){let r=e[n];if(typeof r=="string"&&r.trim()!=="")return r}return null}a($I,"extractRecordId");function Uc(t){return Array.isArray(t)?`[${t.map(Uc).join(",")}]`:v(t)?`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Uc(t[n])}`).join(",")}}`:JSON.stringify(t)??"null"}a(Uc,"stableStringify");import{z as D}from"zod";var PI=/^workflow:[A-Za-z0-9_-]+\.tracker$/,Xn={field:"conversation_ids",label:"\u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868",valueType:"string[]"};function Ni(t){return Qt(t)?{requiredFields:[],optionalFields:[],errors:[],summary:`\u4F7F\u7528 ${ze(t).ns} ref \u52A8\u6001\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868`}:t!=null?{requiredFields:[],optionalFields:[Xn],errors:[]}:{requiredFields:[Xn],optionalFields:[],errors:[]}}a(Ni,"conversationIdsPolicy");var Mg=/^\$\{(?:env|config|globalVar)\.[^}]+\}$/,MI=D.string().regex(Mg,"\u5FC5\u987B\u662F\u5B8C\u6574\u7684\u8FD0\u884C\u65F6\u5F15\u7528\uFF0C\u5982 ${env.NAME} \u6216 ${globalVar.path}").describe("\u6574\u503C\u8FD0\u884C\u65F6\u5F15\u7528\uFF1A${env.*}\u3001${config.*} \u6216 ${globalVar.*}"),OI=D.union([D.string().describe("\u7FA4\u4F1A\u8BDD ID"),D.object({groupId:D.string().describe("\u7FA4\u4F1A\u8BDD ID")}).passthrough().describe("\u5305\u542B groupId \u7684\u7FA4\u914D\u7F6E\u8BB0\u5F55")]),jI=D.string().regex(Mg,"\u7C7B\u578B\u9519\u8BEF\uFF1A\u5FC5\u987B\u662F\u6570\u7EC4\u6216\u5B8C\u6574\u7684\u8FD0\u884C\u65F6\u5F15\u7528\uFF0C\u5982 ${env.NAME} \u6216 ${globalVar.path}").describe("\u6574\u503C\u8FD0\u884C\u65F6\u5F15\u7528\uFF1A${env.*}\u3001${config.*} \u6216 ${globalVar.*}"),Xt=D.union([D.array(D.union([OI,D.null()])),jI]).describe("\u5185\u8054\u503C\u4E3A (string | { groupId: string })[]\uFF1A\u7F3A\u7701\u4F1A\u5728 setup \u63D0\u793A\u5FC5\u586B\uFF0C\u7A7A\u6570\u7EC4\u8868\u793A\u9ED8\u8BA4\u505C\u7528\uFF0C\u975E\u7A7A\u5219\u542F\u7528\uFF1B\u4E5F\u53EF\u7528 ${env.*}\u3001${config.*} \u6216 ${globalVar.*} \u6574\u503C\u5F15\u7528\uFF0C\u5F15\u7528\u7ED3\u679C\u5FC5\u987B\u662F\u540C\u4E00\u6570\u7EC4\u7ED3\u6784"),en=D.enum(["download","url","off"]).describe("\u56FE\u7247\u5904\u7406\u6A21\u5F0F\uFF1Adownload \u4E0B\u8F7D\u5230\u672C\u5730\uFF0Curl \u4FDD\u7559\u94FE\u63A5\uFF0Coff \u4E0D\u5904\u7406"),er=D.array(D.enum(["group","1to1"])).describe("\u76D1\u542C\u7684\u4F1A\u8BDD\u7C7B\u578B\uFF1Agroup \u7FA4\u804A\u30011to1 \u5355\u804A"),Ag=D.union([D.string(),D.number(),D.boolean()]),Eg=D.object({field:D.string().min(1).describe("\u7B5B\u9009\u5B57\u6BB5\u540D\u6216\u5B57\u6BB5 ID"),equals:D.union([Ag,D.array(Ag)]).describe("\u8981\u6C42\u76F8\u7B49\u7684 string\u3001number \u6216 boolean\uFF1B\u6570\u7EC4\u8868\u793A\u547D\u4E2D\u4EFB\u4E00\u503C")}).strict(),FI=D.object({operator:D.string().min(1).describe("dws \u6BD4\u8F83\u64CD\u4F5C\u7B26\uFF0C\u5982 eq\u3001neq \u6216 any_of"),operands:D.array(D.unknown()).describe("\u6BD4\u8F83\u53C2\u6570\uFF1B\u9996\u9879\u4E3A\u5B57\u6BB5\u540D\u6216\u5B57\u6BB5 ID\uFF0C\u5176\u4F59\u9879\u4E3A\u6BD4\u8F83\u503C")}).passthrough(),NI=D.object({operator:D.enum(["and","or"]).describe("\u6839\u903B\u8F91\u64CD\u4F5C\u7B26\uFF1Bdws \u8981\u6C42\u6839\u8282\u70B9\u4E3A and \u6216 or"),operands:D.array(FI).describe("\u6241\u5E73\u6BD4\u8F83\u8282\u70B9\u5217\u8868\uFF1B\u4E0D\u8981\u5728\u8FD9\u91CC\u7EE7\u7EED\u5D4C\u5957 and/or")}).passthrough().describe("\u4EC5\u5728\u7B80\u5199 filter \u65E0\u6CD5\u8868\u8FBE\u65F6\u4F7F\u7528\u7684 dws \u6241\u5E73\u8FC7\u6EE4\u6811\uFF1A{ operator: and | or, operands: { operator, operands }[] }\uFF1B\u4E0E filter \u540C\u65F6\u5B58\u5728\u65F6\u4EE5 filters \u4E3A\u51C6"),Dg=D.object({conversation_ids:Xt.optional(),source_adapter:D.literal("dws_pull").optional().describe("\u6D88\u606F\u62C9\u53D6\u9002\u914D\u5668\uFF0C\u5F53\u524D\u4EC5\u652F\u6301 dws_pull"),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),watch_senders:D.array(D.string()).optional().describe("\u53EA\u76D1\u542C\u8FD9\u4E9B\u53D1\u9001\u8005 ID \u6216\u6635\u79F0\uFF1B\u7F3A\u7701\u6216\u7A7A\u6570\u7EC4\u5747\u76D1\u542C\u6240\u6709\u4EBA"),ignore_senders:D.array(D.string()).optional().describe("\u5FFD\u7565\u8FD9\u4E9B\u53D1\u9001\u8005 ID \u6216\u6635\u79F0\uFF0C\u7528\u4E8E\u9632\u6B62\u673A\u5668\u4EBA\u6D88\u606F\u56DE\u6D41"),fetch_limit:D.number().optional().describe("\u6BCF\u4E2A\u4F1A\u8BDD\u6BCF\u8F6E\u62C9\u53D6\u7684\u6D88\u606F\u6570\u4E0A\u9650"),aggregate_by_sender:D.boolean().optional().describe("\u662F\u5426\u6309\u53D1\u9001\u8005\u805A\u5408\u672C\u8F6E\u6D88\u606F\uFF1B\u7F3A\u7701 true\uFF0C\u542F\u7528\u540E\u6BCF\u4E2A\u53D1\u9001\u8005\u4EA7\u51FA\u4E00\u4E2A\u72EC\u7ACB\u4E8B\u4EF6"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u914D\u7F6E\u76EE\u5F55\u89E3\u6790"),download_timeout_ms:D.number().optional().describe("\u5355\u5F20\u56FE\u7247\u4E0B\u8F7D\u8D85\u65F6\u6BEB\u79D2\u6570"),resolve_user_ids:D.boolean().optional().describe("\u662F\u5426\u628A\u53D1\u9001\u8005 openDingTalkId \u89E3\u6790\u4E3A\u4F01\u4E1A\u5185 userId"),poll_interval_ms:D.number().optional().describe("\u6D88\u606F\u8F6E\u8BE2\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2"),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),sourceAdapter:D.literal("dws_pull").optional().describe("source_adapter \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),watchSenders:D.array(D.string()).optional().describe("watch_senders \u7684\u517C\u5BB9\u522B\u540D"),ignoreSenders:D.array(D.string()).optional().describe("ignore_senders \u7684\u517C\u5BB9\u522B\u540D"),fetchLimit:D.number().optional().describe("fetch_limit \u7684\u517C\u5BB9\u522B\u540D"),aggregateBySender:D.boolean().optional().describe("aggregate_by_sender \u7684\u517C\u5BB9\u522B\u540D"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D"),downloadTimeoutMs:D.number().optional().describe("download_timeout_ms \u7684\u517C\u5BB9\u522B\u540D"),resolveUserIds:D.boolean().optional().describe("resolve_user_ids \u7684\u517C\u5BB9\u522B\u540D"),pollIntervalMs:D.number().optional().describe("poll_interval_ms \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u4E5F\u7528\u4E8E\u6846\u67B6\u9ED8\u8BA4\u503C\u6CE8\u5165")}).passthrough(),LI=D.object({conversation_ids:Xt.optional(),exclude_at_bot:D.boolean().optional().describe("\u662F\u5426\u6392\u9664 @\u673A\u5668\u4EBA\u7684\u6D88\u606F\uFF0C\u907F\u514D\u4E0E Stream \u6E90\u91CD\u590D"),conversation_types:er.optional(),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),excludeAtBot:D.boolean().optional().describe("exclude_at_bot \u7684\u517C\u5BB9\u522B\u540D"),conversationTypes:er.optional().describe("conversation_types \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),WI=D.object({conversation_ids:Xt.optional(),exclude_at_bot:D.boolean().optional().describe("\u662F\u5426\u6392\u9664 @\u673A\u5668\u4EBA\u7684\u6D88\u606F\uFF0C\u7F3A\u7701 true"),conversation_types:er.optional(),filters:LI.optional().describe("\u517C\u5BB9\u65E7\u914D\u7F6E\u7684\u6D88\u606F\u8FC7\u6EE4\u9879"),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),page_size:D.number().optional().describe("\u6BCF\u9875\u62C9\u53D6\u6570\u91CF\uFF0C\u7F3A\u7701 50"),max_pages:D.number().optional().describe("\u6700\u5927\u5206\u9875\u6B21\u6570\uFF0C\u7F3A\u7701 20"),aggregate_by_sender:D.boolean().optional().describe("\u662F\u5426\u6309\u53D1\u9001\u8005\u805A\u5408\u672C\u8F6E\u6D88\u606F\uFF1B\u7F3A\u7701 true\uFF0C\u542F\u7528\u540E\u6BCF\u4E2A\u53D1\u9001\u8005\u4EA7\u51FA\u4E00\u4E2A\u72EC\u7ACB\u4E8B\u4EF6"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u5F53\u524D\u8FDB\u7A0B\u5DE5\u4F5C\u76EE\u5F55\u89E3\u6790"),poll_interval_ms:D.number().optional().describe("\u6D88\u606F\u8F6E\u8BE2\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2"),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),excludeAtBot:D.boolean().optional().describe("exclude_at_bot \u7684\u517C\u5BB9\u522B\u540D"),conversationTypes:er.optional().describe("conversation_types \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),pageSize:D.number().optional().describe("page_size \u7684\u517C\u5BB9\u522B\u540D"),maxPages:D.number().optional().describe("max_pages \u7684\u517C\u5BB9\u522B\u540D"),aggregateBySender:D.boolean().optional().describe("aggregate_by_sender \u7684\u517C\u5BB9\u522B\u540D"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D"),pollIntervalMs:D.number().optional().describe("poll_interval_ms \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u4E5F\u7528\u4E8E\u6846\u67B6\u9ED8\u8BA4\u503C\u6CE8\u5165")}).passthrough(),Kc=D.union([D.record(D.string(),D.object({client_id:D.string().describe("\u673A\u5668\u4EBA\u5E94\u7528 Client ID"),client_secret:D.string().describe("\u673A\u5668\u4EBA\u5E94\u7528 Client Secret")}).passthrough()),MI]).describe("\u5185\u8054\u503C\u4E3A Record<credRef, { client_id: string; client_secret: string }>\uFF1B\u4E5F\u53EF\u7528 ${env.*}\u3001${config.*} \u6216 ${globalVar.*} \u6574\u503C\u5F15\u7528\uFF0C\u5F15\u7528\u7ED3\u679C\u5FC5\u987B\u662F\u540C\u4E00\u6620\u5C04\u7ED3\u6784\uFF1B\u914D\u7F6E\u591A\u5C11\u4E2A credRef \u5C31\u76D1\u542C\u591A\u5C11\u4E2A\u673A\u5668\u4EBA"),$g=Kc.describe("\u5DF2\u5E9F\u5F03\u517C\u5BB9\u522B\u540D\uFF1B\u65B0\u914D\u7F6E\u8BF7\u4F7F\u7528 robot_creds"),BI=D.object({kind:D.enum(["group","all-group"]).optional().describe("\u76D1\u542C\u76EE\u6807\u5F62\u6001\uFF0C\u7F3A\u7701 group\u3002group=\u6BCF\u4E2A\u7FA4\u4E00\u4E2A\u76D1\u542C\u5B50\u8FDB\u7A0B\uFF0Cconversation_ids \u5373\u8BA2\u9605\u76EE\u6807\u3002all-group=\u5355\u8FDB\u7A0B\u76D1\u542C\u8D26\u53F7\u5168\u90E8\u7FA4\uFF0Cconversation_ids \u9000\u5316\u4E3A\u5BA2\u6237\u7AEF\u767D\u540D\u5355\uFF08\u540D\u5355\u4E3A\u7A7A\u65F6\u4E22\u5F03\u5168\u90E8\u4E8B\u4EF6\uFF0C\u4E0D\u662F\u653E\u884C\u5168\u90E8\uFF09\uFF0C\u5185\u5B58\u4E0E\u7FA4\u6570\u89E3\u8026\uFF1B\u4EE3\u4EF7\u662F\u4F1A\u6536\u5230\u65E0\u5173\u7FA4\u7684\u6D88\u606F\u5E76\u5728\u672C\u5730\u4E22\u5F03\u3002at-me/sender/all-direct \u9884\u7559\u6269\u5C55\u4F4D"),conversation_ids:Xt.optional(),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),ignore_senders:D.array(D.string()).optional().describe("\u5FFD\u7565\u8FD9\u4E9B\u53D1\u9001\u8005\uFF08openDingTalkId \u6216\u5C55\u793A\u540D\uFF09\uFF0C\u7528\u4E8E\u9632\u6B62\u673A\u5668\u4EBA\u6D88\u606F\u56DE\u6D41"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u914D\u7F6E\u76EE\u5F55\u89E3\u6790"),download_timeout_ms:D.number().optional().describe("\u5355\u5F20\u56FE\u7247\u4E0B\u8F7D\u8D85\u65F6\u6BEB\u79D2\u6570"),conversationIds:Xt.optional().describe("conversation_ids \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),ignoreSenders:D.array(D.string()).optional().describe("ignore_senders \u7684\u517C\u5BB9\u522B\u540D"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D"),downloadTimeoutMs:D.number().optional().describe("download_timeout_ms \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),zI=D.object({client_id:D.string().optional().describe("\u5355\u673A\u5668\u4EBA\u6A21\u5F0F\u7684\u5E94\u7528 Client ID\uFF1B\u654F\u611F\u503C\u5EFA\u8BAE\u6539\u7528 client_id_env \u6307\u5B9A\u73AF\u5883\u53D8\u91CF\u540D"),client_secret:D.string().optional().describe("\u5355\u673A\u5668\u4EBA\u6A21\u5F0F\u7684\u5E94\u7528 Client Secret\uFF1B\u654F\u611F\u503C\u5EFA\u8BAE\u6539\u7528 client_secret_env \u6307\u5B9A\u73AF\u5883\u53D8\u91CF\u540D"),client_id_env:D.string().optional().describe("\u4FDD\u5B58\u5355\u673A\u5668\u4EBA Client ID \u7684\u73AF\u5883\u53D8\u91CF\u540D\uFF0C\u5982 DINGTALK_CLIENT_ID\uFF1B\u8FD9\u91CC\u586B\u5199\u53D8\u91CF\u540D\uFF0C\u4E0D\u586B\u5199 ${env.*} \u5F15\u7528"),client_secret_env:D.string().optional().describe("\u4FDD\u5B58\u5355\u673A\u5668\u4EBA Client Secret \u7684\u73AF\u5883\u53D8\u91CF\u540D\uFF0C\u5982 DINGTALK_CLIENT_SECRET\uFF1B\u8FD9\u91CC\u586B\u5199\u53D8\u91CF\u540D\uFF0C\u4E0D\u586B\u5199 ${env.*} \u5F15\u7528"),robot_refs:$g.optional(),robot_creds:Kc.optional(),endpoint:D.string().optional().describe("\u4E13\u6709\u9489\u9489 Stream \u7AEF\u70B9\u9884\u7559\u503C\uFF1B\u5F53\u524D SDK \u5C1A\u672A\u6D88\u8D39"),conversation_types:er.optional().describe("\u76D1\u542C\u7684\u4F1A\u8BDD\u7C7B\u578B\uFF0C\u7F3A\u7701\u4EC5\u7FA4\u804A"),drop_direct:D.boolean().optional().describe("\u5DF2\u5E9F\u5F03\uFF1B\u8BF7\u6539\u7528 conversation_types"),image_mode:en.optional(),media_dir:D.string().optional().describe("\u56FE\u7247\u672C\u5730\u5316\u76EE\u5F55\uFF0C\u76F8\u5BF9\u914D\u7F6E\u76EE\u5F55\u89E3\u6790"),clientId:D.string().optional().describe("client_id \u7684\u517C\u5BB9\u522B\u540D"),clientSecret:D.string().optional().describe("client_secret \u7684\u517C\u5BB9\u522B\u540D"),robotRefs:$g.optional().describe("robot_refs \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u5DF2\u5E9F\u5F03"),robotCreds:Kc.optional().describe("robot_creds \u7684\u517C\u5BB9\u522B\u540D"),conversationTypes:er.optional().describe("conversation_types \u7684\u517C\u5BB9\u522B\u540D"),dropDirect:D.boolean().optional().describe("drop_direct \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u5DF2\u5E9F\u5F03"),imageMode:en.optional().describe("image_mode \u7684\u517C\u5BB9\u522B\u540D"),mediaDir:D.string().optional().describe("media_dir \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),UI=D.object({cron:D.string().optional().describe("\u6807\u51C6\u4E94\u6BB5 cron \u8868\u8FBE\u5F0F\uFF0C\u6216 every 5m / every 2h \u5F62\u5F0F\u7684\u56FA\u5B9A\u95F4\u9694\uFF1B\u81F3\u5C11\u914D\u7F6E cron\u3001daily_at\u3001interval_ms \u4E4B\u4E00\uFF0C\u82E5\u540C\u65F6\u5B58\u5728\u5219\u4F18\u5148\u7EA7\u4F4E\u4E8E daily_at\u3001\u9AD8\u4E8E interval_ms"),daily_at:D.string().optional().describe("\u6BCF\u65E5\u89E6\u53D1\u65F6\u95F4\uFF0C\u683C\u5F0F HH:mm\uFF1B\u81F3\u5C11\u914D\u7F6E cron\u3001daily_at\u3001interval_ms \u4E4B\u4E00\uFF0C\u82E5\u540C\u65F6\u5B58\u5728\u65F6\u4F18\u5148\u4F7F\u7528"),timezone:D.string().optional().describe("IANA \u65F6\u533A\uFF0C\u5982 Asia/Shanghai\uFF1B\u7F3A\u7701\u4F7F\u7528\u7CFB\u7EDF\u65F6\u533A"),interval_ms:D.number().optional().describe("\u56FA\u5B9A\u89E6\u53D1\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2\uFF1B\u81F3\u5C11\u914D\u7F6E cron\u3001daily_at\u3001interval_ms \u4E4B\u4E00\uFF0C\u82E5\u540C\u65F6\u5B58\u5728\u65F6\u4F18\u5148\u7EA7\u6700\u4F4E"),event_type:D.string().optional().describe("\u4EA7\u51FA\u7684\u4E8B\u4EF6\u7C7B\u578B\uFF0C\u7F3A\u7701 scheduled_trigger"),payload:D.record(D.string(),D.unknown()).optional().describe("\u968F\u4E8B\u4EF6\u53D1\u9001\u7684\u4EFB\u610F\u952E\u503C\u5BF9\u8C61 Record<string, unknown>\uFF1B\u65E7 metadata \u5199\u6CD5\u4EC5\u4E3A\u517C\u5BB9\uFF0C\u4E0D\u63A8\u8350\u65B0\u914D\u7F6E\u4F7F\u7528"),fire_immediately:D.boolean().optional().describe("\u662F\u5426\u5728\u542F\u52A8\u540E\u7ACB\u5373\u89E6\u53D1\u4E00\u6B21\uFF0C\u7F3A\u7701 false"),dailyAt:D.string().optional().describe("daily_at \u7684\u517C\u5BB9\u522B\u540D"),tz:D.string().optional().describe("timezone \u7684\u517C\u5BB9\u522B\u540D"),intervalMs:D.number().optional().describe("interval_ms \u7684\u517C\u5BB9\u522B\u540D"),eventType:D.string().optional().describe("event_type \u7684\u517C\u5BB9\u522B\u540D"),metadata:D.record(D.string(),D.unknown()).optional().describe("payload.metadata \u7684\u517C\u5BB9\u5199\u6CD5"),fireImmediately:D.boolean().optional().describe("fire_immediately \u7684\u517C\u5BB9\u522B\u540D")}).passthrough(),KI=D.object({mode:D.literal("reference").describe("\u56FA\u5B9A\u4E3A reference\uFF0C\u8868\u793A\u5F15\u7528\u53E6\u4E00\u4E2A workflow \u7684 tracker \u8868"),ref:D.string().describe("\u5F15\u7528\u8DEF\u5F84\uFF0C\u683C\u5F0F workflow:<workflowId>.tracker\uFF0C\u5982 workflow:group-qa.tracker")}).passthrough().describe('\u8DE8 workflow tracker \u5F15\u7528\uFF1A{ mode: "reference"; ref: "workflow:<workflowId>.tracker" }'),VI=D.object({base_id:D.string().optional().describe("AI \u8868\u683C Base ID\uFF1Bsource_table \u5F15\u7528\u6A21\u5F0F\u4E0B\u53EF\u7701\u7565"),table_id:D.string().optional().describe("AI \u8868\u683C Table ID\uFF1Bsource_table \u5F15\u7528\u6A21\u5F0F\u4E0B\u53EF\u7701\u7565"),source_table:KI.optional().describe('\u5F15\u7528\u5176\u4ED6 workflow \u7684 tracker \u8868\uFF0C\u7ED3\u6784\u4E3A { mode: "reference"; ref: "workflow:<workflowId>.tracker" }'),dws_bin:D.string().optional().describe("dws \u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F3A\u7701\u4E3A dws"),watch_mode:D.enum(["created","updated","both"]).optional().describe("\u76D1\u542C\u65B0\u589E\u3001\u66F4\u65B0\u6216\u4E24\u8005\uFF0C\u7F3A\u7701 created"),filters:NI.optional(),filter:D.union([Eg,D.array(Eg)]).optional().describe("\u9996\u9009\u7684\u7B49\u503C\u7B5B\u9009 DSL\uFF1A{ field: string; equals: string | number | boolean | (string | number | boolean)[] }\uFF0C\u6216\u8BE5\u5BF9\u8C61\u7684\u6570\u7EC4\uFF1B\u6570\u7EC4\u6761\u4EF6\u6309 AND \u7EC4\u5408\u3002field \u4F7F\u7528\u5B57\u6BB5\u540D\u65F6\u5FC5\u987B\u4E0E field_definitions.name \u5B8C\u5168\u4E00\u81F4\uFF0C\u624D\u80FD\u7FFB\u8BD1\u4E3A fieldId \u5FEB\u8DEF\u5F84\uFF1B\u62FC\u9519\u4F1A\u9000\u56DE\u6162\u8DEF\u5F84\u5E76\u53EF\u80FD\u8D85\u65F6"),fetch_limit:D.number().optional().describe("\u6BCF\u9875\u67E5\u8BE2\u8BB0\u5F55\u6570\u4E0A\u9650"),max_pages:D.number().optional().describe("\u5355\u8F6E\u6700\u5927\u5206\u9875\u6B21\u6570"),resolve_field_names:D.boolean().optional().describe("\u662F\u5426\u628A fieldId \u8F6C\u6210\u5B57\u6BB5\u540D\uFF0C\u7F3A\u7701 true"),emit_existing:D.boolean().optional().describe("\u662F\u5426\u5728\u9996\u6B21\u542F\u52A8\u65F6\u53D1\u9001\u5B58\u91CF\u8BB0\u5F55\uFF0C\u7F3A\u7701 false"),poll_interval_ms:D.number().optional().describe("\u8BB0\u5F55\u8F6E\u8BE2\u95F4\u9694\uFF0C\u5355\u4F4D\u6BEB\u79D2"),baseId:D.string().optional().describe("base_id \u7684\u517C\u5BB9\u522B\u540D"),tableId:D.string().optional().describe("table_id \u7684\u517C\u5BB9\u522B\u540D"),dwsBin:D.string().optional().describe("dws_bin \u7684\u517C\u5BB9\u522B\u540D"),watchMode:D.enum(["created","updated","both"]).optional().describe("watch_mode \u7684\u517C\u5BB9\u522B\u540D"),fetchLimit:D.number().optional().describe("fetch_limit \u7684\u517C\u5BB9\u522B\u540D"),maxPages:D.number().optional().describe("max_pages \u7684\u517C\u5BB9\u522B\u540D"),resolveFieldNames:D.boolean().optional().describe("resolve_field_names \u7684\u517C\u5BB9\u522B\u540D"),emitExisting:D.boolean().optional().describe("emit_existing \u7684\u517C\u5BB9\u522B\u540D"),pollIntervalMs:D.number().optional().describe("poll_interval_ms \u7684\u517C\u5BB9\u522B\u540D\uFF0C\u4E5F\u7528\u4E8E\u6846\u67B6\u9ED8\u8BA4\u503C\u6CE8\u5165")}).passthrough(),qI=[{type:"dingtalk_message",description:"\u517C\u5BB9\u4E8B\u4EF6\u6E90\u7C7B\u578B\uFF1B\u65B0\u914D\u7F6E\u7EDF\u4E00\u4F7F\u7528 dingtalk_group_message\u3002\u8FD0\u884C\u884C\u4E3A\u4E0E dingtalk_group_message \u5B8C\u5168\u4E00\u81F4\u3002",configSchema:Dg,factory:a((t,e)=>new Jr(t,e),"factory"),documentation:{aliasOf:"dingtalk_group_message"},configPolicy:{requiredFields:[Xn],validate:a(t=>Ni(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_group_message",description:"\u9489\u9489\u7FA4\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08dws \u9010\u7FA4\u8F6E\u8BE2\uFF09\u3002conversation_ids \u63A5\u53D7\u5185\u8054\u7FA4 ID \u5217\u8868\u6216 ${env.*}/${config.*}/${globalVar.*} \u6574\u503C\u5F15\u7528\uFF1B\u591A\u4E2A\u4F1A\u8BDD\u5E76\u53D1\u62C9\u53D6\uFF0C\u9002\u5408\u7FA4\u6570\u8F83\u5C11\u3001\u9700\u8981\u9010\u7FA4\u62C9\u53D6\u7684\u573A\u666F\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:Dg,factory:a((t,e)=>new Jr(t,e),"factory"),documentation:{hiddenConfigFields:["conversationIds","sourceAdapter","dwsBin","watchSenders","ignoreSenders","fetchLimit","aggregateBySender","imageMode","mediaDir","downloadTimeoutMs","resolveUserIds","pollIntervalMs"]},configPolicy:{requiredFields:[Xn],validate:a(t=>Ni(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_user_message",description:"\u9489\u9489\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08dws list-all \u6279\u91CF\u8F6E\u8BE2\uFF09\u3002\u4E00\u6B21\u5206\u9875\u62C9\u53D6\u6240\u6709\u4F1A\u8BDD\u540E\u6309 conversation_ids \u548C conversation_types \u672C\u5730\u8FC7\u6EE4\uFF0C\u9002\u5408\u7EA6 200 \u4E2A\u4EE5\u4E0A\u7FA4\uFF1B\u4EC5\u4E0E dingtalk_group_message \u5171\u4EAB conversation_ids \u8BED\u4E49\uFF0C\u5176\u4F59\u914D\u7F6E\u89C1\u5B57\u6BB5\u8868\u3002\u65E0\u6548\u6216\u4E0D\u53EF\u89C1\u7684 conversation_ids \u4E0D\u62A5\u9519\uFF0C\u53EA\u4F1A\u9759\u9ED8\u65E0\u4E8B\u4EF6\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:WI,factory:a((t,e)=>new $i(t,e),"factory"),documentation:{hiddenConfigFields:["filters","conversationIds","excludeAtBot","conversationTypes","dwsBin","pageSize","maxPages","aggregateBySender","imageMode","mediaDir","pollIntervalMs"]},configPolicy:{requiredFields:[Xn],validate:a(t=>{let e=v(t.filters)?t.filters:{};return Ni(t.conversation_ids??t.conversationIds??e.conversation_ids??e.conversationIds)},"validate")}},{type:"dingtalk_stream",description:"\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA Stream \u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08WebSocket \u63A8\u9001\uFF0C\u7FA4\u5185 @ \u673A\u5668\u4EBA\u89E6\u53D1\uFF09\u3002\u5355\u673A\u5668\u4EBA\u53EF\u7528 client_id/client_secret \u6216 *_env\uFF1B\u52A8\u6001\u591A\u673A\u5668\u4EBA\u4F7F\u7528 robot_creds \u51ED\u636E\u6620\u5C04\uFF0C\u914D\u7F6E\u591A\u5C11\u4E2A credRef \u5C31\u76D1\u542C\u591A\u5C11\u4E2A\u673A\u5668\u4EBA\u3002robot_creds \u53EF\u5185\u8054\uFF0C\u4E5F\u53EF\u901A\u8FC7 ${env.*}/${config.*}/${globalVar.*} \u6574\u503C\u5F15\u7528\u6D3B\u8BFB\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:zI,factory:a((t,e)=>new Pi(t,e),"factory"),documentation:{hiddenConfigFields:["clientId","clientSecret","robot_refs","robotRefs","robotCreds","conversationTypes","drop_direct","dropDirect","imageMode","mediaDir"]},configPolicy:{requiredFields:[],validate:GI}},{type:"dingtalk_event",description:"\u9489\u9489\u4E2A\u4EBA IM \u4E8B\u4EF6\u5165\u7AD9\u4E8B\u4EF6\u6E90\uFF08dws event \u957F\u8FDE\u63A5\u63A8\u9001\uFF0C\u65E0\u9700\u8F6E\u8BE2\uFF09\u3002\u4EE5\u5F53\u524D dws \u767B\u5F55\u7528\u6237\u8EAB\u4EFD\u5B9E\u65F6\u63A5\u6536\u76EE\u6807\u7FA4\u7684\u5168\u90E8\u6D88\u606F\uFF08\u542B\u672A @ \u7684\u6D88\u606F\uFF09\uFF1B\u76D1\u542C\u5F62\u6001\u7531 kind \u51B3\u5B9A\uFF08\u7F3A\u7701 group=\u6BCF\u7FA4\u4E00\u4E2A\u76D1\u542C\u5B50\u8FDB\u7A0B\uFF0Call-group=\u5355\u8FDB\u7A0B\u76D1\u542C\u5168\u90E8\u7FA4\u540E\u6309\u540D\u5355\u672C\u5730\u8FC7\u6EE4\uFF0C\u5185\u5B58\u4E0E\u7FA4\u6570\u89E3\u8026\uFF09\uFF1Bconversation_ids \u63A5\u53D7\u5185\u8054\u7FA4 ID \u5217\u8868\u6216 ${env.*}/${config.*}/${globalVar.*} \u6574\u503C\u5F15\u7528\u3002\u4EA7\u51FA message_received \u4E8B\u4EF6\u3002",configSchema:BI,factory:a((t,e)=>new Mi(t,e),"factory"),documentation:{hiddenConfigFields:["conversationIds","dwsBin","ignoreSenders","imageMode","mediaDir","downloadTimeoutMs"]},configPolicy:{requiredFields:[Xn],validate:a(t=>Ni(t.conversation_ids??t.conversationIds),"validate")}},{type:"cron_scheduler",description:"\u4E1A\u52A1\u5B9A\u65F6\u4E8B\u4EF6\u6E90\u3002\u81F3\u5C11\u4F7F\u7528 cron\u3001daily_at \u6216 interval_ms \u4E4B\u4E00\u6307\u5B9A\u8C03\u5EA6\uFF1B\u591A\u9879\u540C\u65F6\u5B58\u5728\u65F6\u6309 daily_at\u3001cron\u3001interval_ms \u7684\u987A\u5E8F\u53D6\u503C\u3002event_type \u51B3\u5B9A\u4E8B\u4EF6\u540D\uFF0Cpayload \u53EF\u643A\u5E26\u4EFB\u610F\u9759\u6001\u952E\u503C\u3002\u7CBE\u786E\u5899\u949F\u8C03\u5EA6\u53EF\u914D IANA timezone\u3002",configSchema:UI,factory:a(t=>new ji(t),"factory"),documentation:{hiddenConfigFields:["dailyAt","tz","intervalMs","eventType","metadata","fireImmediately"]},configPolicy:{requiredFields:[],oneOf:{fields:["daily_at","cron","interval_ms"],labels:{daily_at:"\u6BCF\u65E5\u89E6\u53D1\u65F6\u95F4\uFF08HH:mm\uFF09",cron:"Cron \u8C03\u5EA6\u8868\u8FBE\u5F0F",interval_ms:"\u56FA\u5B9A\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09"}}}},{type:"aitable_record",description:"AI \u8868\u683C\u8BB0\u5F55\u8F6E\u8BE2\u4E8B\u4EF6\u6E90\u3002\u8868\u6765\u6E90\u4E8C\u9009\u4E00\uFF1A\u76F4\u63A5\u586B\u5199 base_id + table_id\uFF0C\u6216\u7528 source_table \u5F15\u7528\u53E6\u4E00\u4E2A workflow \u7684 tracker\uFF1Bfilter \u662F\u9996\u9009\u7B49\u503C DSL\uFF0Cfilters \u4EC5\u7528\u4E8E\u76F4\u63A5\u586B\u5199 dws \u7684\u6241\u5E73 operator/operands \u6811\u3002\u4EA7\u51FA record_created / record_updated \u4E8B\u4EF6\u3002",configSchema:VI,factory:a(t=>new Fi(t),"factory"),documentation:{hiddenConfigFields:["baseId","tableId","dwsBin","watchMode","fetchLimit","maxPages","resolveFieldNames","emitExisting","pollIntervalMs"]},configPolicy:{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],validate:JI}}];function tr(t){return qI.find(e=>e.type===t)}a(tr,"getEventSourceDescriptor");function _n(t,e){let n=tr(t);if(!n)return[];let r=n.configSchema.safeParse(e);if(r.success)return[];let o=D.toJSONSchema(n.configSchema),i=new Set,s=[];for(let c of Vc(r.error.issues)){let l=c.path.map(f=>typeof f=="number"?f:String(f)),d=l.length>0?l.join("."):"config",u=`${d}\0${c.message}`;i.has(u)||(i.add(u),s.push({key:d,path:l,message:c.message,description:HI(o,l)??`\u4E8B\u4EF6\u6E90 ${t} \u7684 ${d}`}))}return s}a(_n,"validateEventSourceConfig");function Vc(t,e=[]){return t.flatMap(n=>{let r=[...e,...n.path];if(n.code==="invalid_union"&&n.errors.length>0){let i=n.errors.flatMap(s=>Vc(s,r)).filter(s=>s.path.length>r.length);return i.length>0?i:[{path:r,message:n.message}]}return(n.code==="invalid_key"||n.code==="invalid_element")&&n.issues.length>0?Vc(n.issues,r):[{path:r,message:n.message}]})}a(Vc,"flattenZodIssues");function HI(t,e){let n=[t];for(let r of e){let o=[];for(let i of n.flatMap(Pg)){if(typeof r=="number"){v(i.items)&&o.push(i.items);continue}let s=v(i.properties)?i.properties:void 0;s&&v(s[r])&&o.push(s[r]),v(i.additionalProperties)&&o.push(i.additionalProperties)}n=o}for(let r of n.flatMap(Pg))if(typeof r.description=="string")return r.description}a(HI,"schemaDescriptionAtPath");function Pg(t){let e=[t];for(let n of["anyOf","oneOf"]){let r=t[n];Array.isArray(r)&&e.push(...r.filter(v))}return e}a(Pg,"schemaAlternatives");function Yr(t,e){let r=tr(t)?.configPolicy;if(!r)return{requiredFields:[],errors:[]};let o=r.validate?.(e);return{requiredFields:o?.requiredFields??r.requiredFields??[],optionalFields:o?.optionalFields??r.optionalFields??[],...r.oneOf?{oneOf:r.oneOf}:{},errors:o?.errors??[],...o?.summary?{summary:o.summary}:{}}}a(Yr,"eventSourceConfigPolicy");function GI(t){return{requiredFields:[],errors:[],summary:"robot_creds \u627F\u8F7D credRef\u2192\u673A\u5668\u4EBA\u51ED\u636E\u6620\u5C04\uFF0C\u914D\u7F6E\u591A\u5C11\u4E2A credRef \u5C31\u76D1\u542C\u591A\u5C11\u4E2A\u673A\u5668\u4EBA"}}a(GI,"validateDingtalkStreamSourceConfig");function JI(t){return ZI(t)?YI(t):{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],errors:[]}}a(JI,"validateAitableRecordSourceConfig");function ZI(t){let e=t.source_table;return v(e)&&e.mode==="reference"}a(ZI,"hasReferenceSourceTable");function YI(t){let e=t.source_table,n=v(e)&&typeof e.ref=="string"?e.ref.trim():"";return n?PI.test(n)?{requiredFields:[],errors:[],summary:`\u5F15\u7528 ${n}`}:{requiredFields:[],errors:[{key:"source_table.ref",message:`\u5F15\u7528\u8868 source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${n}\uFF09`,description:"\u5F15\u7528\u683C\u5F0F\u5FC5\u987B\u4E3A workflow:<workflowId>.tracker",yamlPath:["source_table","ref"]}]}:{requiredFields:[],errors:[{key:"source_table.ref",message:"\u5F15\u7528\u8868\u7F3A\u5C11 source_table.ref",description:"\u5F15\u7528\u5176\u4ED6 workflow \u7684 tracker \u8868\uFF0C\u5982 workflow:group-qa.tracker",yamlPath:["source_table","ref"]}]}}a(YI,"referenceSourceTablePolicy");var Li=class{static{a(this,"EventSourceRegistry")}customFactories=new Map;register(e,n){this.customFactories.set(e,n)}create(e,n){let r=this.customFactories.get(e.type),o=r?void 0:tr(e.type),i=r??o?.factory;if(!i)return h.warn("event-source-registry","\u672A\u77E5\u4E8B\u4EF6\u6E90\u7C7B\u578B",{type:e.type,name:e.name}),null;if(o){let s=_n(e.type,e.config);if(s.length>0)return h.error("event-source-registry","\u4E8B\u4EF6\u6E90\u914D\u7F6E\u65E0\u6548",{name:e.name,type:e.type,errors:s.map(c=>`config.${c.key}: ${c.message}`)}),null}try{let s=i(e,n);return h.info("event-source-registry","\u4E8B\u4EF6\u6E90\u5DF2\u521B\u5EFA",{name:e.name,type:e.type}),s}catch(s){return h.error("event-source-registry","\u4E8B\u4EF6\u6E90\u521B\u5EFA\u5931\u8D25",{name:e.name,type:e.type,error:s instanceof Error?s.message:String(s)}),null}}createAll(e,n={}){let r={};n.pollIntervalMs!==void 0&&(r.pollIntervalMs=n.pollIntervalMs),n.configDir!==void 0&&(r.configDir=n.configDir);let o=[],i={globalVars:n.globalVars,configScope:n.configScope};for(let s of e){let c=Object.keys(r).length===0?s:{...s,config:{...r,...s.config}},l=QI(c,n.configRefs??{}),d=XI(l,n.tableRefs??{}),u=this.create(d,i);u&&o.push({source:u,handlerRecipe:d.handler,...d.handler_config?{handlerConfig:d.handler_config}:{},...d.record_policy?{recordPolicy:d.record_policy}:{}})}return o}};function QI(t,e){return Object.keys(e).length===0?t:Wi(t,e)}a(QI,"resolveConfigReferences");function Og(t,e){return Object.keys(e).length===0?t:Wi(t,e)}a(Og,"resolvePureRefs");function Wi(t,e){if(Array.isArray(t))return t.map(o=>Wi(o,e));if(!v(t))return t;if(Object.keys(t).length===1&&typeof t.ref=="string"){let o=t.ref.trim();return o&&o in e?e[o]:(h.warn("event-source-registry","\u914D\u7F6E\u5F15\u7528\u672A\u89E3\u6790\uFF0C\u4FDD\u7559\u539F\u59CB ref",{ref:o}),t)}let r={};for(let[o,i]of Object.entries(t))r[o]=Wi(i,e);return r}a(Wi,"resolveReferenceValue");function XI(t,e){if(t.type!=="aitable_record")return t;let n=t.config.source_table;if(!v(n)||n.mode!=="reference")return t;let r=typeof n.ref=="string"?n.ref.trim():"",o=r?e[r]:void 0;return o?{...t,config:{...t.config,base_id:o.base_id,table_id:o.table_id}}:(h.warn("event-source-registry","\u8868\u5F15\u7528\u672A\u89E3\u6790\uFF0C\u4E8B\u4EF6\u6E90\u5C06\u6309\u539F\u914D\u7F6E\u521B\u5EFA",{name:t.name,ref:r}),t)}a(XI,"resolveEventSourceReferences");function jg(t,e,n){let r={},o=`workflow:${t}.tracker`;r[o]=n,r[`${o}.base_id`]=n.base_id,r[`${o}.table_id`]=n.table_id;for(let i of e.eventSources??[]){let s=i.name||i.handler;if(!s)continue;let c=`workflow:${t}.event_source.${s}`;r[c]=i,r[`${c}.config`]=i.config,qc(r,`${c}.config`,i.config),i.handler_config&&(r[`${c}.handler_config`]=i.handler_config,qc(r,`${c}.handler_config`,i.handler_config))}return r}a(jg,"collectWorkflowReferenceValues");function qc(t,e,n){if(v(n))for(let[r,o]of Object.entries(n)){let i=`${e}.${r}`;t[i]=o,v(o)&&qc(t,i,o)}}a(qc,"flattenReferenceValues");var tn=class{static{a(this,"InMemoryGlobalVarStore")}map=new Map;listeners=new Map;get(e){let n=e.indexOf(".");if(n<0)return this.map.get(e);let r=e.slice(0,n),o=e.slice(n+1),i=this.map.get(r);for(let s of o.split(".")){if(i==null||typeof i!="object"||Array.isArray(i))return;i=i[s]}return i}set(e,n){this.map.set(e,n),h.debug("global-var","set",{key:e});let r=this.listeners.get(e);if(r)for(let o of r)try{o()}catch(i){h.warn("global-var","listener \u629B\u9519",{key:e,error:i instanceof Error?i.message:String(i)})}}has(e){return this.map.has(e)}keys(){return[...this.map.keys()]}subscribe(e,n){let r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.add(n),()=>{r.delete(n),r.size===0&&this.listeners.delete(e)}}};import{z as B}from"zod";var eR=B.enum(["ambient","task","guardian"]),tR=B.object({id:B.string().min(1),name:B.string().min(1),description:B.string().default("")}),nR=B.enum(["critical","warning"]),rR=B.object({id:B.string().min(1),rule:B.string().min(1),severity:nR.default("warning")}),oR=B.object({format:B.enum(["json","text","markdown"]).default("text"),schema:B.record(B.string(),B.unknown()).optional()}),iR=B.object({auto_execute:B.boolean(),requires_human_review:B.boolean(),can_escalate:B.boolean().optional(),can_delegate:B.boolean().optional(),can_suggest_workflow_change:B.boolean().optional()}),sR=B.object({initial_level:B.number().min(1).default(1),auto_level_up_threshold:B.number().min(1).default(20),level_down_on_failure:B.boolean().default(!0),autonomy_by_level:B.record(B.string(),iR).default({})}),aR=B.object({enabled:B.boolean().default(!1),persistence:B.enum(["file","aitable","none"]).default("none"),max_entries:B.number().min(1).default(100),retention_days:B.number().min(1).default(90),learns_from:B.array(B.enum(["execution_results","human_feedback","peer_corrections"])).default([])}),AU=B.object({source:B.string().url(),collection:B.string().min(1)}),Fg=B.object({bin:B.string().min(1),args:B.array(B.string()).default([]),timeout_ms:B.number().int().min(1).optional()}),Hc=".kb/wiki/_index.md",cR=B.object({source_kind:B.enum(["aitable","excel","md"]).optional(),inputs:B.array(B.string()).default([]),build:B.array(Fg).default([]),reflow:Fg.optional(),artifact:B.string().default(Hc),validate:B.array(B.string()).default([]),custom:B.record(B.string(),B.unknown()).optional()}),lR=B.object({collection:B.string().min(1),source:B.string().url().optional(),compile:cR.optional()}),Gc=B.union([B.string(),lR]),dR=B.object({domains:B.array(B.string()).default([]),kb_collections:B.array(Gc).default([])}),Qr=B.object({id:B.string().min(1),name:B.string().min(1),department:B.string().optional(),version:B.string().default("1.0.0"),archetype:eR.default("task"),persona:B.union([B.string().min(1),B.object({file:B.string().min(1)})]),skills:B.array(tR).default([]),guardrails:B.array(rR).default([]),output_standard:oR.optional(),knowledge_scope:dR.optional(),trust:sR.optional(),memory:aR.optional()});function Jc(t){let e=Qr.safeParse(t);return e.success?{ok:!0,definition:e.data}:{ok:!1,errors:e.error.issues.map(r=>`${r.path.join(".")||"<root>"}: ${r.message}`)}}a(Jc,"parseRoleDefinition");var Ng={auto_execute:!1,requires_human_review:!0,can_escalate:!1,can_delegate:!1,can_suggest_workflow_change:!1};var uR="__ephemeral__",Bi=class{constructor(e){this.registry=e}registry;static{a(this,"RoleResolver")}async resolve(e){let n=this.registry.get(e);return n?Lg(n,!1):(h.debug("role","\u89D2\u8272\u672A\u6CE8\u518C\uFF0C\u8C03\u7528\u65B9\u53EF\u56DE\u9000\u4E3A\u4E34\u65F6\u89D2\u8272",{roleId:e}),null)}buildEphemeral(e){let n=gR(e);return Lg(n,!0)}};function fR(t,e){let n=t.trust?.autonomy_by_level?.[String(e)];return n?{auto_execute:n.auto_execute,requires_human_review:n.requires_human_review,can_escalate:n.can_escalate??!1,can_delegate:n.can_delegate??!1,can_suggest_workflow_change:n.can_suggest_workflow_change??!1}:{...Ng}}a(fR,"resolveAutonomy");function Lg(t,e){let n=t.trust?.initial_level??1;return{definition:t,currentTrustLevel:n,autonomy:fR(t,n),memoryEntries:[],ephemeral:e}}a(Lg,"buildInstance");function pR(t){let{definition:e,memoryEntries:n}=t,r=typeof e.persona=="string"?e.persona:e.persona.file;return{id:e.id,name:e.name,persona:r,skills:e.skills,guardrails:e.guardrails,memory:n,outputStandard:e.output_standard,kbCollections:(e.knowledge_scope?.kb_collections??[]).map(o=>typeof o=="string"?o:o.collection)}}a(pR,"buildRoleContext");async function Zc(t,e){if(!t||!e||!e.trim())return;let r=await t.resolve(e)??t.buildEphemeral(e);return pR(r)}a(Zc,"resolveRoleContext");function gR(t){let e=t.trim()||"\u901A\u7528\u52A9\u624B";return Qr.parse({id:uR,name:mR(e),persona:e,archetype:"task"})}a(gR,"ephemeralDefinition");function mR(t){let n=(t.split(`
314
+ `)[0]?.trim()??"")||"\u4E34\u65F6\u89D2\u8272";return n.length>20?`${n.slice(0,20)}\u2026`:n}a(mR,"deriveName");var Xr=new Set(["ai","coding","messaging","git","codeReview","ci","table","todo","approval","file","memory","shell"]);function zi(t,e){if(t==null)return"";switch(e){case"user":case"person":case"creator":case"lastModifier":return hR(t);case"department":case"group":return yR(t);case"singleSelect":return Yc(t);case"multipleSelect":return wR(t);case"url":return bR(t);case"richText":return kR(t);case"attachment":return vR(t);case"unidirectionalLink":case"bidirectionalLink":return xR(t);case"geolocation":return IR(t);case"text":case"primaryDoc":case"telephone":case"email":case"barcode":case"idCard":return En(t);case"number":case"currency":case"progress":case"rating":return RR(t);case"date":case"createdTime":case"lastModifiedTime":return En(t);case"checkbox":return!!t;default:return An(t)}}a(zi,"normalizeByType");function hR(t){if(Array.isArray(t))return t.map(e=>{if(v(e)){let n=e.userId,r=e.corpId,o=e.name??e.displayName,i=e.userRef,s=e.uid,c={};return typeof n=="string"&&(c.userId=n),typeof r=="string"&&(c.corpId=r),typeof o=="string"&&(c.name=o),typeof i=="string"&&(c.userRef=i),typeof s=="string"&&(c.uid=s),Object.keys(c).length>0?c:An(e)}return An(e)});if(v(t)){let e=t.userId,n=t.uid,r=t.userRef,o={};if(typeof e=="string"&&(o.userId=e),typeof n=="string"&&(o.uid=n),typeof r=="string"&&(o.userRef=r),typeof t.corpId=="string"&&(o.corpId=t.corpId),typeof t.name=="string"&&(o.name=t.name),Object.keys(o).length>0)return o}return An(t)}a(hR,"normalizePersonCell");function yR(t){return Array.isArray(t)?t:An(t)}a(yR,"normalizeIdArray");function Yc(t){if(typeof t=="string")return t;if(v(t)){let e=t.name;if(typeof e=="string")return e;let n=t.id;if(typeof n=="string")return n}return En(t)}a(Yc,"extractOptionName");function wR(t){return Array.isArray(t)?t.map(e=>Yc(e)).filter(Boolean).join(", "):Yc(t)}a(wR,"extractOptionNames");function bR(t){if(typeof t=="string")return t;if(v(t)){let e=t.link;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return En(t)}a(bR,"normalizeUrlCell");function kR(t){if(typeof t=="string")return t;if(v(t)){let e=t.markdown;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return En(t)}a(kR,"extractMarkdown");function vR(t){return Array.isArray(t)?t.map(e=>{if(v(e)){let n=e.filename??e.name;if(typeof n=="string")return n}return""}).filter(Boolean).join(", "):En(t)}a(vR,"normalizeAttachments");function SR(t){return Array.isArray(t)?t.map(e=>{if(!v(e))return null;let n=e.filename??e.name;if(typeof n!="string")return null;let r=typeof e.url=="string"?e.url:typeof e.resourceUrl=="string"?e.resourceUrl:void 0;return{filename:n,url:r,resourceId:typeof e.resourceId=="string"?e.resourceId:void 0,size:typeof e.size=="number"?e.size:void 0,type:typeof e.type=="string"?e.type:void 0,...typeof e.isLink=="boolean"?{isLink:e.isLink}:{}}}).filter(e=>e!==null):[]}a(SR,"extractAttachmentDetails");function xR(t){if(v(t)){let e=t.linkedRecordIds;if(Array.isArray(e))return e}return An(t)}a(xR,"extractLinkedIds");function IR(t){return v(t)?t:En(t)}a(IR,"normalizeGeo");function En(t){return t==null?"":typeof t=="string"?t:String(t)}a(En,"primitiveToString");function RR(t){if(typeof t=="number")return t;if(typeof t=="string"){let e=Number(t);return Number.isFinite(e)?e:0}return 0}a(RR,"toNumber");function An(t){if(t==null)return"";if(typeof t=="string"||typeof t=="number"||typeof t=="boolean")return t;if(Array.isArray(t))return t.map(e=>An(e)).join(", ");if(v(t)){for(let e of["name","text","markdown","value","displayName","label"]){let n=t[e];if(typeof n=="string")return n;if(typeof n=="number")return String(n)}return JSON.stringify(t)}return String(t)}a(An,"legacyNormalize");function CR(t,e){let n={};for(let[r,o]of Object.entries(t))n[r]=zi(o,e?.[r]);return n}a(CR,"normalizeFields");var Ui=class{static{a(this,"RecipeExecutor")}settings;tracker;roleResolver;configScope;toolkitRegistry;globalVars;configRefs;recipeCache=new Map;constructor(e){this.settings=e.settings,this.tracker=e.tracker,this.roleResolver=e.roleResolver,this.configScope=e.configScope,this.toolkitRegistry=e.toolkitRegistry,this.globalVars=e.globalVars??new tn,this.configRefs=e.configRefs??{}}async execute(e,n,r,o){let i=a(async()=>e.recipe?await this.executeRecipe(e,n,r,o):e.prompt?await this.executeCodingAgent(e,n,r,o):{status:"failed",output:{},error:`\u6B65\u9AA4 "${e.id}" \u672A\u5B9A\u4E49 recipe \u6216 prompt\uFF0C\u65E0\u6CD5\u6267\u884C`,logs:["[ERROR] \u6B65\u9AA4\u7F3A\u5C11\u6267\u884C\u6307\u4EE4"]},"run"),s=Ho();if(!s)return await i();s.startStep(n.id,e.id,e.name,this.resolveInput(e,n,r));try{let c=await i();return await s.endStep(n.id,c.status,c.output,c.error??c.blockReason,c.logs??[]),c}catch(c){throw await s.endStep(n.id,"failed",{},c instanceof Error?c.message:String(c)),c}}async executeCodingAgent(e,n,r,o){let i=[],s=this.resolveEngine(e),c=li[s];if(!c)return{status:"failed",output:{},error:`engine "${s}" \u65E0\u5BF9\u5E94\u7684 coding agent\uFF0C\u8BF7\u5207\u6362\u4E3A claude/codex/qoder`,logs:["[ERROR] llm_only \u6A21\u5F0F\u4E0B\u4E0D\u652F\u6301\u76F4\u63A5\u6267\u884C prompt \u6B65\u9AA4"]};let l=this.interpolatePrompt(e.prompt,n,r),d=e.sla?.timeout_ms??this.settings.agent.timeout_ms,u=await Zc(this.roleResolver,void 0),f=await this.resolveKb(u),p=Hr({...u?{roleContext:u}:{},...f?{kbContext:f}:{}}),g=[TR];p&&g.push(p.promptBlock),typeof r.__humanReply=="string"&&g.push(r.__humanReply),g.push(l);let m=g.join(`
315
315
 
316
316
  ---
317
317
 
318
- `);h.info("executor","Coding Agent \u6267\u884C",{stepId:e.id,agent:c,promptLen:m.length,contextInjected:!!p}),i.push(`[Agent: ${c}] \u6267\u884C\u4E2D...`);let y=new AbortController,w;try{let b=zg(o,y.signal),x=await kt(m,{agent:c,configPath:bt(this.settings.configDir),workDir:p?.kbActive?p.kbRootDir:this.settings.recipeDir,timeoutMs:d,signal:b,adapterOptions:{permissionMode:"bypassPermissions",...p?.kbActive?{allowedTools:["Read","Glob","Grep"]}:{}},onEvent:a(v=>{v.type==="error"&&v.content&&i.push(`[ERROR] ${v.content}`);let k=ai(v);if(k&&!w){let{question:R,options:T}=ci(v);w={code:"ASK_HUMAN_DETECTED",itemId:n.id,stepId:e.id,agent:c,question:R,options:T,toolName:v.toolName,requestId:v.requestId,source:k.kind,occurredAt:new Date().toISOString(),blockCount:0,failureReason:"ask_human_detected"},i.push(`[ASK_HUMAN] ${k.reason}: ${R}`),y.abort()}},"onEvent")});return w?(w.sessionId=x.sessionId,{status:"blocked",output:{__askHumanSnapshot:w},retryable:!1,failureReason:"ask_human_detected",blockReason:`ASK_HUMAN_DETECTED: ${w.question}`,logs:i}):x.events.some(v=>v.type==="error")||!x.response?{status:"failed",output:{response:x.response},error:"Coding Agent \u6267\u884C\u5931\u8D25",logs:i}:(i.push(`[Agent] \u6267\u884C\u5B8C\u6210 (\u54CD\u5E94\u957F\u5EA6: ${x.response.length})`),{status:"success",output:{response:x.response,sessionId:x.sessionId},logs:i})}catch(b){if(w)return{status:"blocked",output:{__askHumanSnapshot:w},retryable:!1,failureReason:"ask_human_detected",blockReason:`ASK_HUMAN_DETECTED: ${w.question}`,logs:i};let x=b instanceof Error?b.message:String(b);return o.aborted?{status:"blocked",output:{},blockReason:"\u4EFB\u52A1\u88AB\u53D6\u6D88",logs:i}:/超时|timeout/i.test(x)?{status:"blocked",output:{},retryable:!1,failureReason:"agent_timeout",blockReason:`AGENT_TIMEOUT: ${x}`,logs:[...i,`[TIMEOUT] ${x}`]}:(h.error("executor","Agent \u6267\u884C\u5F02\u5E38",{stepId:e.id,error:x}),{status:"failed",output:{},error:x,logs:[...i,`[ERROR] ${x}`]})}}async executeRecipe(e,n,r,o){let i=[],s;try{s=await this.loadRecipe(e.recipe)}catch(w){let b=w instanceof Error?w.message:String(w);return h.error("recipe","\u52A0\u8F7D\u5931\u8D25",{stepId:e.id,error:b}),{status:"failed",output:{},error:b,logs:[`[ERROR] ${b}`]}}let c=s.meta.timeoutMs??this.settings.recipe.default_timeout_ms,l=this.resolveInput(e,n,r),d=await Zc(this.roleResolver,s.meta.role),u=await this.resolveKb(d),f=this.buildToolkit(n,e,d,u),p={itemId:n.id,stepId:e.id,input:l,variables:r,toolkit:f,signal:o,config:this.resolveStepConfig(e),configDir:this.settings.configDir,trackerRef:{baseId:this.settings.tracker.base_id,tableId:this.settings.tracker.table_id},setGlobalVar:a((w,b)=>this.globalVars.set(w,b),"setGlobalVar"),getGlobalVar:a(w=>this.globalVars.get(w),"getGlobalVar"),report:a((w,b)=>{Pc(w,b).catch(()=>{})},"report"),roleContext:d,...u?{kbContext:u}:{},log:a(w=>{i.push(w),h.debug("recipe",w,{stepId:e.id,itemId:n.id})},"log")},g=new AbortController,m=setTimeout(()=>g.abort(),c),y=zg(o,g.signal);try{h.info("recipe","\u6267\u884C\u5F00\u59CB",{stepId:e.id,recipe:s.meta.id,itemId:n.id});let w=await s.execute({...p,signal:y});return w.logs=[...i,...w.logs],h.info("recipe","\u6267\u884C\u5B8C\u6210",{stepId:e.id,status:w.status}),w}catch(w){let b=w instanceof Error?w.message:String(w),x=w instanceof We?w.retryable:void 0;return h.error("recipe","\u6267\u884C\u5F02\u5E38",{stepId:e.id,error:b}),{status:"failed",output:{},error:b,...x===!1?{retryable:!1}:{},logs:[...i,`[ERROR] ${b}`]}}finally{clearTimeout(m)}}resolveEngine(e){return e.engine??this.settings.agent.engine}interpolatePrompt(e,n,r){return e.replace(/\{\{(\$var\.[\w.]+|[\w一-鿿]+)\}\}/g,(o,i)=>{if(i.startsWith("$var.")){let c=Ug(r,i.slice(5));return c!=null?String(c):`{{${i}}}`}let s=r[i]??n.fields[i];return s!=null?String(s):`{{${i}}}`})}async loadRecipe(e){let n=this.recipeCache.get(e);if(n)return n;let r=Wg.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=Wg.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=Bg.existsSync(r)?r:Bg.existsSync(o)?o:r;i.endsWith(".ts")&&await Ut();try{let s=await import(mn(i)),c=s.default??s.recipe;if(!c||typeof c.execute!="function")throw new Error(`Recipe "${e}" \u7F3A\u5C11\u6709\u6548\u7684 execute \u51FD\u6570`);return this.recipeCache.set(e,c),c}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`\u65E0\u6CD5\u52A0\u8F7D Recipe "${e}" (${i}): ${c}`)}}resolveInput(e,n,r){let o=e.input_mapping;if(!o)return CR(n.fields,n.fieldTypes);let i={};for(let[s,c]of Object.entries(o))if(c.startsWith("$var."))i[s]=zi(Ug(r,c.slice(5)));else{let l=n.fieldTypes?.[c];i[s]=zi(n.fields[c],l)}return i}buildToolkit(e,n,r,o){let i=this.mergeToolkitConfig(n),s=Ri({settings:this.settings,tracker:this.tracker,item:e,toolkitConfig:i,...r?{roleContext:r}:{},...o?{kbContext:o}:{},registry:this.toolkitRegistry});return lg(s,{stepConfig:n.config,registry:this.toolkitRegistry})}mergeToolkitConfig(e){let n=this.configScope?.getToolkitConfig()??{},r=e.config;if(!n&&!r)return;let o={};if(n)for(let[i,s]of Object.entries(n))o[i]=s;if(r){for(let[i,s]of Object.entries(r))if(Xr.has(i)&&!(s===!1||s===!0)&&S(s)){let c=o[i]??{};o[i]={...c,...s}}}return Object.keys(o).length>0?o:void 0}async resolveKb(e){let n=e?.kbCollections??[];if(n.length===0)return;let r=await mc({configDir:this.settings.configDir,collections:n});return r.present?r:void 0}resolveStepConfig(e){if(!e.config)return{};let n={};for(let[r,o]of Object.entries(e.config))Xr.has(r)||(n[r]=o);return Object.keys(this.configRefs).length>0?Og(n,this.configRefs):n}};function zg(t,e){if(t.aborted)return t;if(e.aborted)return e;let n=new AbortController,r=a(()=>n.abort(),"onAbort");return t.addEventListener("abort",r,{once:!0}),e.addEventListener("abort",r,{once:!0}),n.signal}a(zg,"combineSignals");var TR=["\u3010\u65E0\u4EBA\u503C\u5B88\u6267\u884C\u89C4\u5219\u3011","\u4F60\u6B63\u5728\u65E0\u4EBA\u503C\u5B88\u81EA\u52A8\u5316\u5DE5\u4F5C\u6D41\u4E2D\u6267\u884C\u3002\u4F60\u4E0D\u80FD\u5411\u7528\u6237\u53D1\u8D77\u4EA4\u4E92\u5F0F\u95EE\u8BE2\uFF08AskUserQuestion\u3001\u786E\u8BA4\u5F39\u7A97\u7B49\uFF09\u3002","\u5982\u679C\u9047\u5230\u9700\u8981\u4EBA\u5DE5\u5224\u65AD\u7684\u60C5\u51B5\uFF0C\u76F4\u63A5\u8FD4\u56DE\u5931\u8D25\u5E76\u5728 error \u4E2D\u8BF4\u660E\u539F\u56E0\u3002"].join(`
318
+ `);h.info("executor","Coding Agent \u6267\u884C",{stepId:e.id,agent:c,promptLen:m.length,contextInjected:!!p}),i.push(`[Agent: ${c}] \u6267\u884C\u4E2D...`);let y=new AbortController,w;try{let b=zg(o,y.signal),x=await kt(m,{agent:c,configPath:bt(this.settings.configDir),workDir:p?.kbActive?p.kbRootDir:this.settings.recipeDir,timeoutMs:d,signal:b,adapterOptions:{permissionMode:"bypassPermissions",...p?.kbActive?{allowedTools:["Read","Glob","Grep"]}:{}},onEvent:a(S=>{S.type==="error"&&S.content&&i.push(`[ERROR] ${S.content}`);let k=ai(S);if(k&&!w){let{question:R,options:T}=ci(S);w={code:"ASK_HUMAN_DETECTED",itemId:n.id,stepId:e.id,agent:c,question:R,options:T,toolName:S.toolName,requestId:S.requestId,source:k.kind,occurredAt:new Date().toISOString(),blockCount:0,failureReason:"ask_human_detected"},i.push(`[ASK_HUMAN] ${k.reason}: ${R}`),y.abort()}},"onEvent")});return w?(w.sessionId=x.sessionId,{status:"blocked",output:{__askHumanSnapshot:w},retryable:!1,failureReason:"ask_human_detected",blockReason:`ASK_HUMAN_DETECTED: ${w.question}`,logs:i}):x.events.some(S=>S.type==="error")||!x.response?{status:"failed",output:{response:x.response},error:"Coding Agent \u6267\u884C\u5931\u8D25",logs:i}:(i.push(`[Agent] \u6267\u884C\u5B8C\u6210 (\u54CD\u5E94\u957F\u5EA6: ${x.response.length})`),{status:"success",output:{response:x.response,sessionId:x.sessionId},logs:i})}catch(b){if(w)return{status:"blocked",output:{__askHumanSnapshot:w},retryable:!1,failureReason:"ask_human_detected",blockReason:`ASK_HUMAN_DETECTED: ${w.question}`,logs:i};let x=b instanceof Error?b.message:String(b);return o.aborted?{status:"blocked",output:{},blockReason:"\u4EFB\u52A1\u88AB\u53D6\u6D88",logs:i}:/超时|timeout/i.test(x)?{status:"blocked",output:{},retryable:!1,failureReason:"agent_timeout",blockReason:`AGENT_TIMEOUT: ${x}`,logs:[...i,`[TIMEOUT] ${x}`]}:(h.error("executor","Agent \u6267\u884C\u5F02\u5E38",{stepId:e.id,error:x}),{status:"failed",output:{},error:x,logs:[...i,`[ERROR] ${x}`]})}}async executeRecipe(e,n,r,o){let i=[],s;try{s=await this.loadRecipe(e.recipe)}catch(w){let b=w instanceof Error?w.message:String(w);return h.error("recipe","\u52A0\u8F7D\u5931\u8D25",{stepId:e.id,error:b}),{status:"failed",output:{},error:b,logs:[`[ERROR] ${b}`]}}let c=s.meta.timeoutMs??this.settings.recipe.default_timeout_ms,l=this.resolveInput(e,n,r),d=await Zc(this.roleResolver,s.meta.role),u=await this.resolveKb(d),f=this.buildToolkit(n,e,d,u),p={itemId:n.id,stepId:e.id,input:l,variables:r,toolkit:f,signal:o,config:this.resolveStepConfig(e),configDir:this.settings.configDir,trackerRef:{baseId:this.settings.tracker.base_id,tableId:this.settings.tracker.table_id},setGlobalVar:a((w,b)=>this.globalVars.set(w,b),"setGlobalVar"),getGlobalVar:a(w=>this.globalVars.get(w),"getGlobalVar"),report:a((w,b)=>{Pc(w,b).catch(()=>{})},"report"),roleContext:d,...u?{kbContext:u}:{},log:a(w=>{i.push(w),h.debug("recipe",w,{stepId:e.id,itemId:n.id})},"log")},g=new AbortController,m=setTimeout(()=>g.abort(),c),y=zg(o,g.signal);try{h.info("recipe","\u6267\u884C\u5F00\u59CB",{stepId:e.id,recipe:s.meta.id,itemId:n.id});let w=await s.execute({...p,signal:y});return w.logs=[...i,...w.logs],h.info("recipe","\u6267\u884C\u5B8C\u6210",{stepId:e.id,status:w.status}),w}catch(w){let b=w instanceof Error?w.message:String(w),x=w instanceof We?w.retryable:void 0;return h.error("recipe","\u6267\u884C\u5F02\u5E38",{stepId:e.id,error:b}),{status:"failed",output:{},error:b,...x===!1?{retryable:!1}:{},logs:[...i,`[ERROR] ${b}`]}}finally{clearTimeout(m)}}resolveEngine(e){return e.engine??this.settings.agent.engine}interpolatePrompt(e,n,r){return e.replace(/\{\{(\$var\.[\w.]+|[\w一-鿿]+)\}\}/g,(o,i)=>{if(i.startsWith("$var.")){let c=Ug(r,i.slice(5));return c!=null?String(c):`{{${i}}}`}let s=r[i]??n.fields[i];return s!=null?String(s):`{{${i}}}`})}async loadRecipe(e){let n=this.recipeCache.get(e);if(n)return n;let r=Wg.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=Wg.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=Bg.existsSync(r)?r:Bg.existsSync(o)?o:r;i.endsWith(".ts")&&await Ut();try{let s=await import(mn(i)),c=s.default??s.recipe;if(!c||typeof c.execute!="function")throw new Error(`Recipe "${e}" \u7F3A\u5C11\u6709\u6548\u7684 execute \u51FD\u6570`);return this.recipeCache.set(e,c),c}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`\u65E0\u6CD5\u52A0\u8F7D Recipe "${e}" (${i}): ${c}`)}}resolveInput(e,n,r){let o=e.input_mapping;if(!o)return CR(n.fields,n.fieldTypes);let i={};for(let[s,c]of Object.entries(o))if(c.startsWith("$var."))i[s]=zi(Ug(r,c.slice(5)));else{let l=n.fieldTypes?.[c];i[s]=zi(n.fields[c],l)}return i}buildToolkit(e,n,r,o){let i=this.mergeToolkitConfig(n),s=Ri({settings:this.settings,tracker:this.tracker,item:e,toolkitConfig:i,...r?{roleContext:r}:{},...o?{kbContext:o}:{},registry:this.toolkitRegistry});return lg(s,{stepConfig:n.config,registry:this.toolkitRegistry})}mergeToolkitConfig(e){let n=this.configScope?.getToolkitConfig()??{},r=e.config;if(!n&&!r)return;let o={};if(n)for(let[i,s]of Object.entries(n))o[i]=s;if(r){for(let[i,s]of Object.entries(r))if(Xr.has(i)&&!(s===!1||s===!0)&&v(s)){let c=o[i]??{};o[i]={...c,...s}}}return Object.keys(o).length>0?o:void 0}async resolveKb(e){let n=e?.kbCollections??[];if(n.length===0)return;let r=await mc({configDir:this.settings.configDir,collections:n});return r.present?r:void 0}resolveStepConfig(e){if(!e.config)return{};let n={};for(let[r,o]of Object.entries(e.config))Xr.has(r)||(n[r]=o);return Object.keys(this.configRefs).length>0?Og(n,this.configRefs):n}};function zg(t,e){if(t.aborted)return t;if(e.aborted)return e;let n=new AbortController,r=a(()=>n.abort(),"onAbort");return t.addEventListener("abort",r,{once:!0}),e.addEventListener("abort",r,{once:!0}),n.signal}a(zg,"combineSignals");var TR=["\u3010\u65E0\u4EBA\u503C\u5B88\u6267\u884C\u89C4\u5219\u3011","\u4F60\u6B63\u5728\u65E0\u4EBA\u503C\u5B88\u81EA\u52A8\u5316\u5DE5\u4F5C\u6D41\u4E2D\u6267\u884C\u3002\u4F60\u4E0D\u80FD\u5411\u7528\u6237\u53D1\u8D77\u4EA4\u4E92\u5F0F\u95EE\u8BE2\uFF08AskUserQuestion\u3001\u786E\u8BA4\u5F39\u7A97\u7B49\uFF09\u3002","\u5982\u679C\u9047\u5230\u9700\u8981\u4EBA\u5DE5\u5224\u65AD\u7684\u60C5\u51B5\uFF0C\u76F4\u63A5\u8FD4\u56DE\u5931\u8D25\u5E76\u5728 error \u4E2D\u8BF4\u660E\u539F\u56E0\u3002"].join(`
319
319
  `);function Ug(t,e){let n=e.indexOf(".");if(n<0)return t[e];let r=e.slice(0,n),o=e.slice(n+1),i=t[r];if(i!=null&&typeof i=="object"&&!Array.isArray(i))return i[o]}a(Ug,"resolveVarPath");import{mkdir as tm,readFile as nm,rename as AR,writeFile as rm,unlink as ER}from"fs/promises";import{existsSync as DR}from"fs";import Ki from"path";import{z as L}from"zod";var Kg=3e4;function Qc(t,e,n){return Br(n)?`dws \u767B\u5F55\u6001\u5DF2\u8FC7\u671F\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C \`dws auth login\` \u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5\u672C\u64CD\u4F5C\u3002
320
320
  ${t}
321
321
  \uFF08\u4EE5\u4E0A\u539F\u59CB\u660E\u7EC6\u4F9B\u8BCA\u65AD\uFF1B\u82E5\u91CD\u65B0\u767B\u5F55\u4ECD\u5931\u8D25\uFF0C\u8BF7\u9644\u660E\u7EC6\u53CD\u9988\uFF09`:`${t}
@@ -324,22 +324,22 @@ ${u.map(p=>` - ${p}`).join(`
324
324
  `)}`;throw new Error(Qc(f,"\u8BF7\u786E\u8BA4 dws \u7248\u672C\u652F\u6301 chat group \u5217\u4E3E\u547D\u4EE4\uFF0C\u4E14\u767B\u5F55\u6001\u6709\u6548\uFF08\u53EF\u5C1D\u8BD5 `dws auth login`\uFF09\u3002",u.join(`
325
325
  `)))}a(fK,"listDwsConversations");var fe=class extends Error{static{a(this,"BotProvisionError")}kind;guidance;raw;constructor(e,n,r){super(n),this.name="BotProvisionError",this.kind=e,this.guidance=r?.guidance??tl(e),this.raw=r?.raw??null}};function tl(t){switch(t){case"auth_required":return"\u4E00\u6B21\u6027\u4EBA\u95E8\uFF1A\u8FD0\u884C `dws auth login` \u91CD\u65B0\u767B\u5F55\uFF08headless \u73AF\u5883\u7528 `dws auth login --device`\uFF09\uFF0C\u7136\u540E\u91CD\u8DD1\u672C\u547D\u4EE4\uFF08\u53EF\u4ECE\u65AD\u70B9\u7EED\u8DD1\uFF09\u3002";case"developer_role_missing":return"\u5F53\u524D\u8D26\u53F7\u7F3A\u5C11\u5F00\u653E\u5E73\u53F0\u5F00\u53D1\u8005\u8EAB\u4EFD\uFF1A\u8BF7\u7BA1\u7406\u5458\u5728\u5F00\u653E\u5E73\u53F0\u300C\u6743\u9650\u7BA1\u7406\u300D\u4E2D\u6DFB\u52A0\u5F00\u53D1\u8005\u540E\u91CD\u8BD5\u3002";case"org_cli_access_denied":return"\u7EC4\u7EC7\u672A\u5F00\u653E CLI \u8BBF\u95EE\uFF1A\u8BF7\u7EC4\u7EC7\u7BA1\u7406\u5458\u5728\u9489\u9489\u5F00\u53D1\u8005\u5E73\u53F0\u300CCLI \u8BBE\u7F6E\u300D\u5F00\u542F\u300C\u5141\u8BB8\u6210\u5458\u901A\u8FC7 CLI \u8BBF\u95EE\u4E2A\u4EBA\u6570\u636E\u300D\u5E76\u914D\u7F6E\u4F7F\u7528\u8303\u56F4\uFF08https://open-dev.dingtalk.com/fe/old?hash=%23%2FdeveloperSettings#/developerSettings\uFF09\uFF0C\u5F00\u901A\u540E\u91CD\u65B0\u767B\u5F55\u5373\u53EF\u3002";case"agent_gate_unified_app_id":return"\u975E\u4EBA\u5BA1\uFF1Alifecycle \u7684 APPROVAL_REQUIRED(provide_unified_app_id) \u53EA\u662F\u8981\u6C42\u663E\u5F0F unifiedAppId\uFF0C\u5F15\u64CE\u4F1A\u7528 `dev app get --app-key` \u81EA\u52A8\u89E3\u9501\uFF0C\u65E0\u9700\u4EBA\u5DE5\u4ECB\u5165\u3002";case"publish_approval_pending":return"\u516C\u5F00\u53D1\u5E03\u9700\u7BA1\u7406\u5458\u5BA1\u6279\uFF1A\u7528 `aitable-workflow bot status` \u67E5\u770B\u5BA1\u6279\u4EBA\u4E0E\u50AC\u529E\u547D\u4EE4\uFF1B\u4E0D\u963B\u585E\u5F15\u64CE\u5EFA\u8054\uFF08bound \u76F8\u5DF2\u53EF\u7528\uFF09\u3002";case"bot_not_published":return"\u673A\u5668\u4EBA\u672A\u53D1\u5E03\u3001\u4F01\u4E1A\u76EE\u5F55\u4E0D\u53EF\u89C1\uFF08RESOURCE_NOT_FOUND 500025\uFF09\uFF1A\u5148\u5B8C\u6210 publish \u76F8\uFF08\u7BA1\u7406\u5458\u5BA1\u6279\u901A\u8FC7\uFF09\uFF0C\u518D\u91CD\u8BD5\u62C9\u7FA4\u3002";case"permission_denied":return"\u5F53\u524D dws \u8D26\u53F7\u65E0\u6743\u6267\u884C\u8BE5\u64CD\u4F5C\uFF08AUTH_PERMISSION_DENIED 500020\uFF09\u3002\u9AD8\u9891\u6210\u56E0\uFF1A\u4F01\u4E1A\u673A\u5668\u4EBA\u7531\u540C\u7EC4\u7EC7\u5176\u4ED6\u8D26\u53F7\u521B\u5EFA\uFF0C\u5F53\u524D\u8D26\u53F7\u4E0D\u662F\u5176 owner/\u5F00\u53D1\u8005\u2014\u2014\u8BF7\u521B\u5EFA\u8005\u5728\u5F00\u653E\u5E73\u53F0\u628A\u4F60\u52A0\u4E3A\u5E94\u7528\u5F00\u53D1\u8005\uFF0C\u6216\u7531\u521B\u5EFA\u8005\u6267\u884C\u672C\u6B65\u9AA4\uFF1B\u53EA\u60F3\u5148\u8DD1\u901A\u6D41\u7A0B\u53EF\u6539\u9009\u300C\u81EA\u5B9A\u4E49\u673A\u5668\u4EBA\u300D\u3002";case"bot_already_installed":return"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF08500043\uFF09\uFF1A\u65E0\u9700\u91CD\u590D\u6DFB\u52A0\uFF0C\u89C6\u540C\u6210\u529F\u7EE7\u7EED\u540E\u7EED\u6D41\u7A0B\u5373\u53EF\u3002";case"timeout":return"dws \u8C03\u7528\u8D85\u65F6\uFF1A\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8DD1\u672C\u547D\u4EE4\uFF08\u72B6\u6001\u6587\u4EF6\u652F\u6301\u65AD\u70B9\u7EED\u8DD1\uFF09\u3002";default:return"\u67E5\u770B\u4E0A\u65B9\u9519\u8BEF\u8BE6\u60C5\uFF1B\u5FC5\u8981\u65F6 `dws --help` \u6838\u5BF9\u547D\u4EE4\u9762\uFF0C\u6216\u91CD\u8DD1\u672C\u547D\u4EE4\u65AD\u70B9\u7EED\u8DD1\u3002"}}a(tl,"provisionGuidance");function Jg(t){let e=[t.code??"",t.message??"",$R(t.raw)].join(" ");return/provide_unified_app_id/i.test(e)?"agent_gate_unified_app_id":/timed?\s*out|ETIMEDOUT/i.test(e)?"timeout":/token_refresh_failed|authenticated\s*:\s*false|auth(entication)?\s*(required|failed|expired)|unauthorized|please\s+(re-?)?login|login\s+required|resolve\s+access\s+token|refresh_token|token\s+exchange|authcode/i.test(e)?"auth_required":/开发者(身份|权限)|developer\s+(identity|role|permission)/i.test(e)?"developer_role_missing":/PERMISSION_DENIED|permission\s+denied|500020/i.test(e)?"permission_denied":/组织.*(禁止.*CLI|CLI.*(访问|开通|申请|使用))|org.*cli.*(access|apply|disabled|forbidden)/i.test(e)?"org_cli_access_denied":/500043|该群已安装过此机器人/.test(e)?"bot_already_installed":/500025|RESOURCE_NOT_FOUND/.test(e)?"bot_not_published":/APPROVAL_REQUIRED|select_approver|审批/i.test(e)?"publish_approval_pending":"unknown"}a(Jg,"classifyProvisionError");function $R(t){if(t==null)return"";if(typeof t=="string")return t;if(t instanceof Error)return t.message;try{return JSON.stringify(t)}catch{return""}}a($R,"errorMessageOf");var PR=L.object({taskId:L.string(),status:L.string().optional(),intervalSeconds:L.number().optional(),expiresInSeconds:L.number().optional(),bindsUnifiedApp:L.boolean().optional()}).passthrough(),MR=L.object({status:L.string().optional(),phase:L.string().optional(),robotTaskDone:L.boolean().optional(),localConnectReady:L.boolean().optional(),localOnlyReady:L.boolean().optional(),publicUseReady:L.boolean().optional(),requiresVersionPublish:L.boolean().optional()}).passthrough(),OR=L.object({clientId:L.string().optional(),clientSecret:L.string().optional(),unifiedAppId:L.string().optional(),lifecycle:MR.optional(),actionRequired:L.string().optional(),mustContinue:L.boolean().optional(),message:L.string().optional()}).passthrough(),jR=L.object({name:L.string().optional(),appName:L.string().optional(),appKey:L.string().optional(),app_key:L.string().optional(),clientId:L.string().optional(),client_id:L.string().optional(),unifiedAppId:L.string().optional(),unified_app_id:L.string().optional()}).passthrough(),FR=L.object({version:L.string().optional(),versionId:L.string(),versionStatus:L.string().optional()}).passthrough(),NR=L.object({versionId:L.string(),version:L.string().optional(),versionStatus:L.string().optional()}).passthrough(),LR=L.object({name:L.string().optional(),userId:L.string(),mainAdmin:L.boolean().optional()}).passthrough(),WR=L.object({requiresApproval:L.boolean().optional(),publishable:L.boolean().optional(),published:L.boolean().optional(),approvalSubmitted:L.boolean().optional(),sensitive:L.boolean().optional(),actionRequired:L.string().optional(),approvalCandidates:L.array(LR).optional()}).passthrough(),BR=L.object({versionId:L.string().optional(),version:L.string().optional(),versionStatus:L.string().optional()}).passthrough(),RK=L.object({error:L.object({server_error_code:L.union([L.string(),L.number()]).optional(),code:L.union([L.string(),L.number()]).optional(),message:L.string().optional()}).passthrough().optional()}).passthrough();function zR(t,e=500){let n;try{n=t===void 0?"(undefined)":JSON.stringify(t)??String(t)}catch{n=String(t)}return n=n.replace(/"(client_?secret|appSecret|app_secret)"\s*:\s*"[^"]*"/gi,'"$1":"***"'),n.length>e?`${n.slice(0,e)}\u2026`:n}a(zR,"redactPayloadForLog");function eo(t,e,n){let r=t.safeParse(e);if(!r.success){let o=r.error.issues[0],i=o?`${o.path.join(".")} ${o.message}`:r.error.message;throw new fe("unknown",`dws ${n} \u54CD\u5E94\u4E0E\u9884\u671F\u5951\u7EA6\u4E0D\u7B26: ${i}
326
326
  \u21B3 \u5B9E\u9645\u8F7D\u8377\uFF08\u8131\u654F\uFF09: ${zR(e)}`,{raw:e})}return r.data}a(eo,"parseWith");var om=["preflight","submitted","robot_ready","unified_resolved","bound","version_created","approver_selected","publish_pending","published","grouped"],Oe=Object.fromEntries(om.map((t,e)=>[t,e])),UR={submit_accepted:"submitted",robot_ready:"robot_ready",unified_resolved:"unified_resolved",bound:"bound",version_created:"version_created",approver_selected:"approver_selected",publish_submitted:"publish_pending",published:"published",grouped:"grouped"};function to(t){return t.groups?t.groups:t.openConversationId?{[t.openConversationId]:{addedAt:t.updatedAt}}:{}}a(to,"groupEntriesOf");function Zg(t,e){let n=new Date().toISOString(),r={addedAt:n};return e.robotName&&(r.robotName=e.robotName),{...t,groups:{...to(t),[e.openConversationId]:r},openConversationId:e.openConversationId,updatedAt:n}}a(Zg,"withGroupEntry");function ct(t,e){let n=UR[e.type],r=Oe[t.phase],o=Oe[n];if(o===r)return e.type==="grouped"&&t.phase==="grouped"?to(t)[e.openConversationId]?t:Zg(t,e):t;let i=e.type==="publish_submitted"&&t.phase==="version_created";if(o!==r+1&&!i)throw new fe("unknown",`\u975E\u6CD5\u72B6\u6001\u8F6C\u79FB: ${t.phase} \u2192 ${n}\uFF08\u4E8B\u4EF6 ${e.type}\uFF09\uFF0Cprovision \u76F8\u4F4D\u5FC5\u987B\u6309\u5E8F\u63A8\u8FDB`);let s={phase:n};switch(e.type){case"submit_accepted":s.taskId=e.taskId;break;case"robot_ready":s.clientId=e.clientId;break;case"unified_resolved":s.unifiedAppId=e.unifiedAppId;break;case"bound":s.credRef=e.credRef;break;case"version_created":s.versionId=e.versionId,e.version&&(s.versionNumber=e.version);break;case"approver_selected":s.approverUserId=e.userId;break;default:break}let c={...t,...s,updatedAt:new Date().toISOString()};return e.type==="grouped"?Zg(c,e):c}a(ct,"applyProvisionEvent");function Yg(t,e){return{schemaVersion:1,appName:t,robotName:e,phase:"preflight",updatedAt:new Date().toISOString()}}a(Yg,"createInitialProvisionState");function KR(t,e){if(e&&nl(e))return`\u7248\u672C\u5DF2\u53D1\u5E03\uFF08versionStatus=${e}\uFF09\uFF0C\u91CD\u8DD1 provision \u7EED\u8DD1\u5B8C\u6210\u72B6\u6001\u540C\u6B65\u4E0E\u540E\u7EED\u6B65\u9AA4`;switch(t){case"preflight":return"\u8FD0\u884C `aitable-workflow bot provision --name <\u5E94\u7528\u540D>`\uFF08\u5EFA\u53F7\u524D\u4F1A\u5148\u6309\u540D\u63A2\u6D4B\uFF0C\u5E42\u7B49\uFF09";case"submitted":return"\u8F6E\u8BE2 `dws dev app robot result --task-id <taskId> -f json`\uFF08\u91CD\u8DD1 provision \u4F1A\u81EA\u52A8\u7EED\u8DD1\uFF09";case"robot_ready":return"\u89E3\u6790 unifiedAppId\uFF1A`dws dev app get --app-key <clientId>`\uFF08provision \u81EA\u52A8\u5B8C\u6210\uFF09";case"unified_resolved":return"\u7ED1\u5B9A\u51ED\u636E\uFF1A\u8BB0 bound \u76F8\uFF08\u51ED\u636E\u586B\u8FDB AI \u8868\u683C\u7FA4\u914D\u7F6E\u8868\uFF0C\u7528 dws dev app credentials get \u590D\u53D6\uFF09";case"bound":return"\u5F15\u64CE\u5EFA\u8054\u5DF2\u53EF\u7528\uFF1B\u771F\u5B9E\u7528\u6237\u6D41\u91CF\u9700\u516C\u5F00\u53D1\u5E03\uFF1A`aitable-workflow bot provision --publish --approver-user-id <id>`";case"version_created":return"\u5BA1\u6279\u9884\u68C0\uFF1A`dws dev app version check-approval --unified-app-id <id> --version-id <id>`\uFF08\u9700\u9009\u5BA1\u6279\u4EBA\u65F6\u7531\u7528\u6237\u786E\u8BA4\uFF09";case"approver_selected":return"\u63D0\u4EA4\u53D1\u5E03\uFF1A`dws dev app version publish --approver-user-id <id> --yes`";case"publish_pending":return"\u7B49\u5F85\u7BA1\u7406\u5458\u5BA1\u6279\uFF1A`aitable-workflow bot status --refresh` \u67E5\u770B\u8FDB\u5EA6\uFF1B\u50AC\u529E\u6A21\u677F\u89C1 status \u8F93\u51FA";case"published":return"\u5DF2\u53D1\u5E03\uFF1B\u53EF\u62C9\u7FA4\uFF1A`aitable-workflow bot provision --group <openConversationId|\u7FA4\u540D>`\uFF08\u591A\u7FA4\u9017\u53F7\u5206\u9694\uFF09";case"grouped":return"\u5168\u94FE\u8DEF\u5B8C\u6210\uFF08\u5EFA\u53F7\u2192\u7ED1\u5B9A\u2192\u53D1\u5E03\u2192\u62C9\u7FA4\uFF09\uFF1B\u7EE7\u7EED\u52A0\u7FA4\u91CD\u8DD1 `--group <\u65B0\u7FA4>`"}}a(KR,"nextStepForPhase");var VR=L.object({addedAt:L.string(),robotName:L.string().optional()}).passthrough(),qR=L.object({schemaVersion:L.literal(1),appName:L.string(),robotName:L.string().optional(),phase:L.enum(om),taskId:L.string().optional(),clientId:L.string().optional(),unifiedAppId:L.string().optional(),credRef:L.string().optional(),versionId:L.string().optional(),versionNumber:L.string().optional(),approverUserId:L.string().optional(),openConversationId:L.string().optional(),groups:L.record(L.string(),VR).optional(),updatedAt:L.string()}).strict();function HR(t){return Ki.join(t,".aitable","provision-state.json")}a(HR,"defaultProvisionStatePath");function GR(t){let e=qR.safeParse(t);return e.success?e.data:null}a(GR,"parseProvisionState");async function JR(t){try{let e=await nm(t,"utf8");return GR(JSON.parse(e))}catch{return null}}a(JR,"loadProvisionState");async function ZR(t,e){await tm(Ki.dirname(t),{recursive:!0});let n=`${t}.tmp`;await rm(n,JSON.stringify(e,null,2)+`
327
- `,"utf8");try{await AR(n,t)}catch(r){throw await ER(n).catch(()=>{}),r}}a(ZR,"saveProvisionState");function YR(t,e,n){let r=e.trim();if(!r)throw new fe("unknown","corpId \u4E0D\u80FD\u4E3A\u7A7A");return XR(t,"DINGTALK_ENTERPRISE_ROBOTS",r,n,"corpId\u2192\u4F01\u4E1A\u673A\u5668\u4EBA map")}a(YR,"mergeEnterpriseRobotCredentials");function QR(t){if(!t)return{};let e=t.match(/^\s*DINGTALK_ENTERPRISE_ROBOTS\s*=\s*(.*)$/m);if(!e)return{};let n=im(e[1]??"");if(n==="")return{};try{let r=JSON.parse(n);if(!S(r))return{};let o={};for(let[i,s]of Object.entries(r))S(s)&&typeof s.name=="string"&&typeof s.unifiedAppId=="string"&&typeof s.appKey=="string"&&typeof s.appSecret=="string"&&(o[i]=s);return o}catch{return{}}}a(QR,"parseEnterpriseRobots");function XR(t,e,n,r,o){let i=n.trim();if(!i)throw new fe("unknown",`${e} \u7684\u952E\u4E0D\u80FD\u4E3A\u7A7A`);let s=t??"",c=s.includes(`\r
327
+ `,"utf8");try{await AR(n,t)}catch(r){throw await ER(n).catch(()=>{}),r}}a(ZR,"saveProvisionState");function YR(t,e,n){let r=e.trim();if(!r)throw new fe("unknown","corpId \u4E0D\u80FD\u4E3A\u7A7A");return XR(t,"DINGTALK_ENTERPRISE_ROBOTS",r,n,"corpId\u2192\u4F01\u4E1A\u673A\u5668\u4EBA map")}a(YR,"mergeEnterpriseRobotCredentials");function QR(t){if(!t)return{};let e=t.match(/^\s*DINGTALK_ENTERPRISE_ROBOTS\s*=\s*(.*)$/m);if(!e)return{};let n=im(e[1]??"");if(n==="")return{};try{let r=JSON.parse(n);if(!v(r))return{};let o={};for(let[i,s]of Object.entries(r))v(s)&&typeof s.name=="string"&&typeof s.unifiedAppId=="string"&&typeof s.appKey=="string"&&typeof s.appSecret=="string"&&(o[i]=s);return o}catch{return{}}}a(QR,"parseEnterpriseRobots");function XR(t,e,n,r,o){let i=n.trim();if(!i)throw new fe("unknown",`${e} \u7684\u952E\u4E0D\u80FD\u4E3A\u7A7A`);let s=t??"",c=s.includes(`\r
328
328
  `)?`\r
329
329
  `:`
330
- `,l=s.split(/\r?\n/),d=new RegExp(`^(\\s*)${e}\\s*=\\s*(.*)$`),u={},f=-1,p="";for(let m=0;m<l.length;m++){let y=d.exec(l[m]);if(!y)continue;if(f>=0)throw new fe("unknown",`.env \u4E2D\u5B58\u5728\u591A\u884C ${e}\uFF0C\u8BF7\u5148\u624B\u5DE5\u5408\u5E76\u540E\u91CD\u8BD5`);f=m,p=y[1];let w=im(y[2]??"");if(w!==""){let b;try{b=JSON.parse(w)}catch{throw new fe("unknown",`.env \u73B0\u6709 ${e} \u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u65E0\u6CD5\u5B89\u5168 merge\uFF1B\u8BF7\u624B\u5DE5\u4FEE\u6B63\u8BE5\u884C\u540E\u91CD\u8BD5`)}if(!S(b))throw new fe("unknown",`.env \u73B0\u6709 ${e} \u4E0D\u662F JSON \u5BF9\u8C61\uFF08\u671F\u671B ${o}\uFF09`);u=b}}u[i]=r;let g=`${p}${e}=${JSON.stringify(u)}`;if(f>=0)l[f]=g;else{for(;l.length>0&&l[l.length-1].trim()==="";)l.pop();l.length>0&&l.push(""),l.push(g)}return l.join(c)}a(XR,"mergeEnvJsonCredentials");function im(t){let e=t.trim();if(e.length>=2){let n=e[0],r=e[e.length-1];if(n==='"'&&r==='"'||n==="'"&&r==="'")return e.slice(1,-1)}return e}a(im,"parseEnvValue");var el=class{static{a(this,"DwsDevRunner")}bin;timeoutMs;runner;homedir;constructor(e={}){this.bin=e.bin??"dws",this.timeoutMs=e.timeoutMs??6e4,this.runner=e.runner??J,this.homedir=e.homedir}async submitRobot(e){let n=await this.run(["dev","app","robot","submit","--name",e.name,"--robot-name",e.robotName,"--desc",e.desc,"--yes"],"app robot submit");return eo(PR,St(n),"app robot submit")}async robotResult(e){let n=await this.run(["dev","app","robot","result","--task-id",e],"app robot result");return eo(OR,St(n),"app robot result")}async listApps(e={}){let n=[],r,o=new Set;for(let i=0;i<100;i++){let s=["dev","app","list"];e.name&&s.push("--name",e.name),r&&s.push("--cursor",r);let c=await this.run(s,"app list");n.push(...Xc(c));let l=tC(c);if(!l||o.has(l))break;o.add(l),r=l}return n}async getApp(e){let n=await this.run(["dev","app","get","--app-key",e],"app get");return Xc(n)[0]??null}async getAppByUnifiedAppId(e){let n=await this.run(["dev","app","get","--unified-app-id",e],"app get");return Xc(n)[0]??null}async getCredentials(e){let n=await this.run(["dev","app","credentials","get","--unified-app-id",e],"app credentials get"),r=St(n),o=Qg(r,["clientId","client_id","appKey","app_key"]),i=Qg(r,["clientSecret","client_secret","appSecret","app_secret"]);if(!o||!i)throw new fe("unknown","dws dev app credentials get \u672A\u8FD4\u56DE clientId/clientSecret\uFF08\u51ED\u636E\u53EF\u80FD\u9700\u91CD\u65B0\u751F\u6210\uFF09",{raw:n});return{client_id:o,client_secret:i}}async createVersion(e,n){let r=await this.run(["dev","app","version","create","--unified-app-id",e,"--desc",n,"--yes"],"app version create");return eo(FR,St(r),"app version create")}async listVersions(e){let n=await this.run(["dev","app","version","list","--unified-app-id",e],"app version list"),r=St(n),o=Object.values(r).find(Array.isArray),i=[];for(let s of o??[]){let c=NR.safeParse(s);c.success&&i.push(c.data)}return i}async checkApproval(e,n){let r=await this.run(["dev","app","version","check-approval","--unified-app-id",e,"--version-id",n],"app version check-approval");return eo(WR,St(r),"app version check-approval")}async publishVersion(e,n,r){let o=["dev","app","version","publish","--unified-app-id",e,"--version-id",n];return r&&o.push("--approver-user-id",r),o.push("--yes"),await this.run(o,"app version publish")}async versionStatus(e,n){let r=await this.run(["dev","app","version","status","--unified-app-id",e,"--version-id",n],"app version status");return eo(BR,St(r),"app version status")}async addBotToGroup(e,n){return await this.run(["chat","group","members","add-bot","--robot-code",e,"--id",n],"chat group members add-bot")}async disableRobot(e){return this.run(["dev","app","robot","disable","--unified-app-id",e,"--yes"],"app robot disable")}async enableRobot(e){return this.run(["dev","app","robot","enable","--unified-app-id",e,"--yes"],"app robot enable")}async disableApp(e){return this.run(["dev","app","disable","--unified-app-id",e,"--yes"],"app disable")}async enableApp(e){return this.run(["dev","app","enable","--unified-app-id",e,"--yes"],"app enable")}async getCurrentCorpId(){let e=await this.run(["profile","list"],"profile list"),n=St(e),o=(Array.isArray(n.items)?n.items:Array.isArray(n.profiles)?n.profiles:[]).find(i=>S(i)&&i.isCurrent===!0&&i.isOrgCurrent===!0);return typeof o?.corpId=="string"?o.corpId:void 0}async searchChatGroups(e){try{return(await Gg(e,{runner:this.runner,dwsBin:this.bin,timeoutMs:this.timeoutMs,probe:a(()=>!0,"probe")})).groups.map(r=>({title:r.title,openConversationId:r.conversationId}))}catch(n){let r=n instanceof Error?n.message:String(n);throw new fe(Jg({message:r}),`dws chat search \u5931\u8D25: ${r}`,{raw:n})}}async run(e,n){let r=[...e,"--format","json"],o;try{o=await ne(this.bin,r,{timeoutMs:this.timeoutMs,runner:this.runner})}catch(l){let d=l instanceof Error?l.message:String(l);if(/ENOENT/.test(d)&&this.bin==="dws"){let f=Lr(this.homedir).find(p=>DR(p));if(f)return this.bin=f,this.run(e,n)}let u=/abort|timed?\s*out/i.test(d)?"timeout":"unknown";throw new fe(u,`dws ${n} \u6267\u884C\u5931\u8D25: ${d}`,{guidance:tl(u)})}let i=o.stdout.trim(),s=null;if(i!=="")try{s=JSON.parse(i)}catch{s=null}let c=eC(s,o);if(c){let l=Jg(c),d=c.message??c.code??`exit ${o.exitCode}`;throw h.warn("bot-provision",`dws ${n} failed`,{kind:l,code:c.code}),new fe(l,`dws ${n} \u5931\u8D25: ${d}`,{raw:s??o.stderr})}if(o.exitCode!==0)throw new fe("unknown",`dws ${n} \u9000\u51FA\u7801 ${o.exitCode}: ${o.stderr.slice(0,300)||i.slice(0,300)}`);if(!S(s))throw new fe("unknown",`dws ${n} \u672A\u8FD4\u56DE JSON \u8F7D\u8377: ${i.slice(0,300)||o.stderr.slice(0,300)||"(\u7A7A\u8F93\u51FA)"}`);return s}};function eC(t,e){let n=[t];S(t)&&S(t.data)&&n.push(t.data);for(let r of n){if(!S(r))continue;let o=r.error;if(typeof o=="string"&&o.trim()!=="")return{message:o,raw:t};if(S(o)){let i=o.server_error_code??o.code??o.upstream_code;return{code:i==null?void 0:String(i),message:typeof o.message=="string"?o.message:void 0,raw:t}}if(typeof r.errcode=="number"&&r.errcode!==0)return{code:String(r.errcode),message:typeof r.errmsg=="string"?r.errmsg:void 0,raw:t};if(r.success===!1){let i=r.errorCode;return{code:i==null?void 0:String(i),message:typeof r.errorMsg=="string"?r.errorMsg:void 0,raw:t}}}return S(t)&&t.ok===!1?{message:typeof t.message=="string"?t.message:typeof t.errorMsg=="string"?t.errorMsg:void 0,raw:t}:e&&e.exitCode!==0&&e.stderr.trim()!==""?{message:e.stderr.slice(0,500),raw:t}:null}a(eC,"extractErrorInfo");function tC(t){if(!S(t))return;let e=S(t.meta)&&S(t.meta.pagination)?t.meta.pagination:void 0;if(e){if(e.endpoint_exhausted===!0)return;let r=e.next_token,o=typeof r=="string"?r.trim():typeof r=="number"?String(r):"";return o===""?void 0:o}if(t.hasMore!==!0)return;let n=typeof t.nextCursor=="string"?t.nextCursor.trim():"";return n===""?void 0:n}a(tC,"nextPageCursor");function Xc(t){let e=St(t),r=Object.values(e).find(Array.isArray)??(Object.keys(e).length>0?[e]:[]),o=[];for(let i of r){let s=jR.safeParse(i);s.success&&o.push(s.data)}return o}a(Xc,"extractAppEntries");function St(t){if(!S(t))return{};for(let e of["data","body","result"]){let n=t[e];if(S(n))return n}return t}a(St,"flattenData");function Qg(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim()!=="")return r}}a(Qg,"pickString");function nC(t){let e=t.trim();return e.length<2||e.length>20?"\u5E94\u7528\u540D\u9700 2-20 \u5B57\uFF08\u4F01\u4E1A\u5185\u552F\u4E00\uFF09\uFF0C\u8BF7\u7528 --name \u6307\u5B9A":null}a(nC,"validateProvisionName");function Xg(t){return t.replace(/[\u3000-\u303f\uff00-\uffef]/g,"").replace(/\s+/g," ").trim()}a(Xg,"sanitizeProvisionText");function rC(t){let e=new Set;for(let n of t.split(",")){let r=n.trim();r&&e.add(r)}return[...e]}a(rC,"parseGroupTargets");function oC(t){let e=St(t);return typeof e.robotName=="string"&&e.robotName.trim()!==""?e.robotName:void 0}a(oC,"extractAddBotRobotName");var em=class{static{a(this,"BotProvisioner")}runner;deps;constructor(e={}){this.runner=e.runner??new el,this.deps={loadState:e.loadState??JR,saveState:e.saveState??ZR,readEnvFile:e.readEnvFile??(async n=>nm(n,"utf8").catch(()=>{})),writeEnvFile:e.writeEnvFile??(async(n,r)=>{await tm(Ki.dirname(n),{recursive:!0}),await rm(n,r,"utf8")}),sleep:e.sleep??(n=>new Promise(r=>setTimeout(r,n)))}}async provision(e){let n=nC(e.name);if(n)return{status:"failed",state:Yg(e.name),message:n};let r=e.stateFile??HR(process.cwd()),o=await this.deps.loadState(r)??Yg(e.name,e.robotName);if(o.appName!==e.name)return{status:"failed",state:o,message:`\u72B6\u6001\u6587\u4EF6\u5C5E\u4E8E\u5E94\u7528\u300C${o.appName}\u300D\uFF0C\u4E0E\u672C\u6B21 --name\u300C${e.name}\u300D\u4E0D\u4E00\u81F4\uFF1B\u8BF7\u786E\u8BA4\u540E\u7528 --state-file \u6307\u5B9A\u4E0D\u540C\u72B6\u6001\u6587\u4EF6`};let i=a(async s=>(await this.deps.saveState(r,s),s),"persist");try{if(Oe[o.phase]<Oe.robot_ready&&(o=await this.ensureRobotReady(o,e,i)),Oe[o.phase]<Oe.unified_resolved){let s=await this.runner.getApp(o.clientId),c=s?.unifiedAppId??s?.unified_app_id;if(!c)throw new fe("agent_gate_unified_app_id",`\u65E0\u6CD5\u4ECE dev app get --app-key ${o.clientId} \u89E3\u6790 unifiedAppId`);o=await i(ct(o,{type:"unified_resolved",unifiedAppId:c}))}if(Oe[o.phase]<Oe.bound&&(o=await i(ct(o,{type:"bound",credRef:o.clientId}))),e.publish){let s=await this.runPublishPhase(o,e,i);if(o=s.state,s.status==="approver_required"||s.status==="failed"||!e.group)return s}if(e.group){if(Oe[o.phase]<Oe.published)return{status:"failed",state:o,message:tl("bot_not_published")};let s=rC(e.group);if(s.length===0)return{status:"failed",state:o,message:"--group \u89E3\u6790\u540E\u4E3A\u7A7A\uFF1A\u8BF7\u4F20 openConversationId \u6216\u7FA4\u540D\uFF08\u591A\u7FA4\u7528\u9017\u53F7\u5206\u9694\uFF09"};let{state:c,outcomes:l,failures:d}=await this.groupBots(o,s,i);return d.length>0?{status:"failed",state:c,message:`\u62C9\u7FA4\u90E8\u5206\u5931\u8D25\uFF08${d.length}/${s.length}\uFF09:
330
+ `,l=s.split(/\r?\n/),d=new RegExp(`^(\\s*)${e}\\s*=\\s*(.*)$`),u={},f=-1,p="";for(let m=0;m<l.length;m++){let y=d.exec(l[m]);if(!y)continue;if(f>=0)throw new fe("unknown",`.env \u4E2D\u5B58\u5728\u591A\u884C ${e}\uFF0C\u8BF7\u5148\u624B\u5DE5\u5408\u5E76\u540E\u91CD\u8BD5`);f=m,p=y[1];let w=im(y[2]??"");if(w!==""){let b;try{b=JSON.parse(w)}catch{throw new fe("unknown",`.env \u73B0\u6709 ${e} \u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u65E0\u6CD5\u5B89\u5168 merge\uFF1B\u8BF7\u624B\u5DE5\u4FEE\u6B63\u8BE5\u884C\u540E\u91CD\u8BD5`)}if(!v(b))throw new fe("unknown",`.env \u73B0\u6709 ${e} \u4E0D\u662F JSON \u5BF9\u8C61\uFF08\u671F\u671B ${o}\uFF09`);u=b}}u[i]=r;let g=`${p}${e}=${JSON.stringify(u)}`;if(f>=0)l[f]=g;else{for(;l.length>0&&l[l.length-1].trim()==="";)l.pop();l.length>0&&l.push(""),l.push(g)}return l.join(c)}a(XR,"mergeEnvJsonCredentials");function im(t){let e=t.trim();if(e.length>=2){let n=e[0],r=e[e.length-1];if(n==='"'&&r==='"'||n==="'"&&r==="'")return e.slice(1,-1)}return e}a(im,"parseEnvValue");var el=class{static{a(this,"DwsDevRunner")}bin;timeoutMs;runner;homedir;constructor(e={}){this.bin=e.bin??"dws",this.timeoutMs=e.timeoutMs??6e4,this.runner=e.runner??J,this.homedir=e.homedir}async submitRobot(e){let n=await this.run(["dev","app","robot","submit","--name",e.name,"--robot-name",e.robotName,"--desc",e.desc,"--yes"],"app robot submit");return eo(PR,St(n),"app robot submit")}async robotResult(e){let n=await this.run(["dev","app","robot","result","--task-id",e],"app robot result");return eo(OR,St(n),"app robot result")}async listApps(e={}){let n=[],r,o=new Set;for(let i=0;i<100;i++){let s=["dev","app","list"];e.name&&s.push("--name",e.name),r&&s.push("--cursor",r);let c=await this.run(s,"app list");n.push(...Xc(c));let l=tC(c);if(!l||o.has(l))break;o.add(l),r=l}return n}async getApp(e){let n=await this.run(["dev","app","get","--app-key",e],"app get");return Xc(n)[0]??null}async getAppByUnifiedAppId(e){let n=await this.run(["dev","app","get","--unified-app-id",e],"app get");return Xc(n)[0]??null}async getCredentials(e){let n=await this.run(["dev","app","credentials","get","--unified-app-id",e],"app credentials get"),r=St(n),o=Qg(r,["clientId","client_id","appKey","app_key"]),i=Qg(r,["clientSecret","client_secret","appSecret","app_secret"]);if(!o||!i)throw new fe("unknown","dws dev app credentials get \u672A\u8FD4\u56DE clientId/clientSecret\uFF08\u51ED\u636E\u53EF\u80FD\u9700\u91CD\u65B0\u751F\u6210\uFF09",{raw:n});return{client_id:o,client_secret:i}}async createVersion(e,n){let r=await this.run(["dev","app","version","create","--unified-app-id",e,"--desc",n,"--yes"],"app version create");return eo(FR,St(r),"app version create")}async listVersions(e){let n=await this.run(["dev","app","version","list","--unified-app-id",e],"app version list"),r=St(n),o=Object.values(r).find(Array.isArray),i=[];for(let s of o??[]){let c=NR.safeParse(s);c.success&&i.push(c.data)}return i}async checkApproval(e,n){let r=await this.run(["dev","app","version","check-approval","--unified-app-id",e,"--version-id",n],"app version check-approval");return eo(WR,St(r),"app version check-approval")}async publishVersion(e,n,r){let o=["dev","app","version","publish","--unified-app-id",e,"--version-id",n];return r&&o.push("--approver-user-id",r),o.push("--yes"),await this.run(o,"app version publish")}async versionStatus(e,n){let r=await this.run(["dev","app","version","status","--unified-app-id",e,"--version-id",n],"app version status");return eo(BR,St(r),"app version status")}async addBotToGroup(e,n){return await this.run(["chat","group","members","add-bot","--robot-code",e,"--id",n],"chat group members add-bot")}async disableRobot(e){return this.run(["dev","app","robot","disable","--unified-app-id",e,"--yes"],"app robot disable")}async enableRobot(e){return this.run(["dev","app","robot","enable","--unified-app-id",e,"--yes"],"app robot enable")}async disableApp(e){return this.run(["dev","app","disable","--unified-app-id",e,"--yes"],"app disable")}async enableApp(e){return this.run(["dev","app","enable","--unified-app-id",e,"--yes"],"app enable")}async getCurrentCorpId(){let e=await this.run(["profile","list"],"profile list"),n=St(e),o=(Array.isArray(n.items)?n.items:Array.isArray(n.profiles)?n.profiles:[]).find(i=>v(i)&&i.isCurrent===!0&&i.isOrgCurrent===!0);return typeof o?.corpId=="string"?o.corpId:void 0}async searchChatGroups(e){try{return(await Gg(e,{runner:this.runner,dwsBin:this.bin,timeoutMs:this.timeoutMs,probe:a(()=>!0,"probe")})).groups.map(r=>({title:r.title,openConversationId:r.conversationId}))}catch(n){let r=n instanceof Error?n.message:String(n);throw new fe(Jg({message:r}),`dws chat search \u5931\u8D25: ${r}`,{raw:n})}}async run(e,n){let r=[...e,"--format","json"],o;try{o=await ne(this.bin,r,{timeoutMs:this.timeoutMs,runner:this.runner})}catch(l){let d=l instanceof Error?l.message:String(l);if(/ENOENT/.test(d)&&this.bin==="dws"){let f=Lr(this.homedir).find(p=>DR(p));if(f)return this.bin=f,this.run(e,n)}let u=/abort|timed?\s*out/i.test(d)?"timeout":"unknown";throw new fe(u,`dws ${n} \u6267\u884C\u5931\u8D25: ${d}`,{guidance:tl(u)})}let i=o.stdout.trim(),s=null;if(i!=="")try{s=JSON.parse(i)}catch{s=null}let c=eC(s,o);if(c){let l=Jg(c),d=c.message??c.code??`exit ${o.exitCode}`;throw h.warn("bot-provision",`dws ${n} failed`,{kind:l,code:c.code}),new fe(l,`dws ${n} \u5931\u8D25: ${d}`,{raw:s??o.stderr})}if(o.exitCode!==0)throw new fe("unknown",`dws ${n} \u9000\u51FA\u7801 ${o.exitCode}: ${o.stderr.slice(0,300)||i.slice(0,300)}`);if(!v(s))throw new fe("unknown",`dws ${n} \u672A\u8FD4\u56DE JSON \u8F7D\u8377: ${i.slice(0,300)||o.stderr.slice(0,300)||"(\u7A7A\u8F93\u51FA)"}`);return s}};function eC(t,e){let n=[t];v(t)&&v(t.data)&&n.push(t.data);for(let r of n){if(!v(r))continue;let o=r.error;if(typeof o=="string"&&o.trim()!=="")return{message:o,raw:t};if(v(o)){let i=o.server_error_code??o.code??o.upstream_code;return{code:i==null?void 0:String(i),message:typeof o.message=="string"?o.message:void 0,raw:t}}if(typeof r.errcode=="number"&&r.errcode!==0)return{code:String(r.errcode),message:typeof r.errmsg=="string"?r.errmsg:void 0,raw:t};if(r.success===!1){let i=r.errorCode;return{code:i==null?void 0:String(i),message:typeof r.errorMsg=="string"?r.errorMsg:void 0,raw:t}}}return v(t)&&t.ok===!1?{message:typeof t.message=="string"?t.message:typeof t.errorMsg=="string"?t.errorMsg:void 0,raw:t}:e&&e.exitCode!==0&&e.stderr.trim()!==""?{message:e.stderr.slice(0,500),raw:t}:null}a(eC,"extractErrorInfo");function tC(t){if(!v(t))return;let e=v(t.meta)&&v(t.meta.pagination)?t.meta.pagination:void 0;if(e){if(e.endpoint_exhausted===!0)return;let r=e.next_token,o=typeof r=="string"?r.trim():typeof r=="number"?String(r):"";return o===""?void 0:o}if(t.hasMore!==!0)return;let n=typeof t.nextCursor=="string"?t.nextCursor.trim():"";return n===""?void 0:n}a(tC,"nextPageCursor");function Xc(t){let e=St(t),r=Object.values(e).find(Array.isArray)??(Object.keys(e).length>0?[e]:[]),o=[];for(let i of r){let s=jR.safeParse(i);s.success&&o.push(s.data)}return o}a(Xc,"extractAppEntries");function St(t){if(!v(t))return{};for(let e of["data","body","result"]){let n=t[e];if(v(n))return n}return t}a(St,"flattenData");function Qg(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim()!=="")return r}}a(Qg,"pickString");function nC(t){let e=t.trim();return e.length<2||e.length>20?"\u5E94\u7528\u540D\u9700 2-20 \u5B57\uFF08\u4F01\u4E1A\u5185\u552F\u4E00\uFF09\uFF0C\u8BF7\u7528 --name \u6307\u5B9A":null}a(nC,"validateProvisionName");function Xg(t){return t.replace(/[\u3000-\u303f\uff00-\uffef]/g,"").replace(/\s+/g," ").trim()}a(Xg,"sanitizeProvisionText");function rC(t){let e=new Set;for(let n of t.split(",")){let r=n.trim();r&&e.add(r)}return[...e]}a(rC,"parseGroupTargets");function oC(t){let e=St(t);return typeof e.robotName=="string"&&e.robotName.trim()!==""?e.robotName:void 0}a(oC,"extractAddBotRobotName");var em=class{static{a(this,"BotProvisioner")}runner;deps;constructor(e={}){this.runner=e.runner??new el,this.deps={loadState:e.loadState??JR,saveState:e.saveState??ZR,readEnvFile:e.readEnvFile??(async n=>nm(n,"utf8").catch(()=>{})),writeEnvFile:e.writeEnvFile??(async(n,r)=>{await tm(Ki.dirname(n),{recursive:!0}),await rm(n,r,"utf8")}),sleep:e.sleep??(n=>new Promise(r=>setTimeout(r,n)))}}async provision(e){let n=nC(e.name);if(n)return{status:"failed",state:Yg(e.name),message:n};let r=e.stateFile??HR(process.cwd()),o=await this.deps.loadState(r)??Yg(e.name,e.robotName);if(o.appName!==e.name)return{status:"failed",state:o,message:`\u72B6\u6001\u6587\u4EF6\u5C5E\u4E8E\u5E94\u7528\u300C${o.appName}\u300D\uFF0C\u4E0E\u672C\u6B21 --name\u300C${e.name}\u300D\u4E0D\u4E00\u81F4\uFF1B\u8BF7\u786E\u8BA4\u540E\u7528 --state-file \u6307\u5B9A\u4E0D\u540C\u72B6\u6001\u6587\u4EF6`};let i=a(async s=>(await this.deps.saveState(r,s),s),"persist");try{if(Oe[o.phase]<Oe.robot_ready&&(o=await this.ensureRobotReady(o,e,i)),Oe[o.phase]<Oe.unified_resolved){let s=await this.runner.getApp(o.clientId),c=s?.unifiedAppId??s?.unified_app_id;if(!c)throw new fe("agent_gate_unified_app_id",`\u65E0\u6CD5\u4ECE dev app get --app-key ${o.clientId} \u89E3\u6790 unifiedAppId`);o=await i(ct(o,{type:"unified_resolved",unifiedAppId:c}))}if(Oe[o.phase]<Oe.bound&&(o=await i(ct(o,{type:"bound",credRef:o.clientId}))),e.publish){let s=await this.runPublishPhase(o,e,i);if(o=s.state,s.status==="approver_required"||s.status==="failed"||!e.group)return s}if(e.group){if(Oe[o.phase]<Oe.published)return{status:"failed",state:o,message:tl("bot_not_published")};let s=rC(e.group);if(s.length===0)return{status:"failed",state:o,message:"--group \u89E3\u6790\u540E\u4E3A\u7A7A\uFF1A\u8BF7\u4F20 openConversationId \u6216\u7FA4\u540D\uFF08\u591A\u7FA4\u7528\u9017\u53F7\u5206\u9694\uFF09"};let{state:c,outcomes:l,failures:d}=await this.groupBots(o,s,i);return d.length>0?{status:"failed",state:c,message:`\u62C9\u7FA4\u90E8\u5206\u5931\u8D25\uFF08${d.length}/${s.length}\uFF09:
331
331
  ${d.map(u=>` - ${u}`).join(`
332
332
  `)}`,...l.length>0?{groups:l}:{}}:{status:"grouped",state:c,groups:l}}return o.phase==="grouped"?{status:"grouped",state:o,groups:[]}:o.phase==="published"?{status:"published",state:o}:{status:"bound",state:o}}catch(s){if(s instanceof fe)return{status:"failed",state:o,message:`${s.message}
333
- \u21B3 ${s.guidance}`};throw s}}async ensureRobotReady(e,n,r){if(e.phase==="preflight"){let i=await this.findAppByName(e.appName).catch(()=>null);if(i){let c=i.appKey??i.app_key??i.clientId??i.client_id,l=i.unifiedAppId??i.unified_app_id;if(!c&&l){let d=await this.runner.getAppByUnifiedAppId(l);c=d?.appKey??d?.app_key??d?.clientId??d?.client_id,l=l??d?.unifiedAppId??d?.unified_app_id}if(c){h.info("bot-provision","app already exists, skipping submit",{name:e.appName});let d=ct(ct(e,{type:"submit_accepted",taskId:e.taskId??`existing:${e.appName}`}),{type:"robot_ready",clientId:c});return l&&(d=ct(d,{type:"unified_resolved",unifiedAppId:l})),r(d)}}let s=await this.runner.submitRobot({name:e.appName,robotName:n.robotName??e.appName,desc:Xg(n.desc??`${e.appName} \u673A\u5668\u4EBA - aitable-workflow bot provision`)});e=await r(ct(e,{type:"submit_accepted",taskId:s.taskId}))}let o=Math.max(1,n.pollAttempts??60);for(let i=0;i<o;i++){let c=await this.runner.robotResult(e.taskId);if(c.lifecycle?.robotTaskDone&&c.clientId)return r(ct(e,{type:"robot_ready",clientId:c.clientId,localConnectReady:c.lifecycle.localConnectReady}));await this.deps.sleep(5e3)}throw new fe("timeout",`\u5EFA\u53F7\u4EFB\u52A1 ${e.taskId} \u5728 ${o} \u6B21\u8F6E\u8BE2\u5185\u672A\u5C31\u7EEA\uFF08expiresInSeconds \u901A\u5E38\u4E3A 86400\uFF0C\u53EF\u7A0D\u540E\u91CD\u8DD1\u7EED\u8DD1\uFF09`)}async runPublishPhase(e,n,r){if(Oe[e.phase]<Oe.version_created){let c=null;try{let d=(await this.runner.listVersions(e.unifiedAppId)).find(u=>(u.versionStatus??"").toUpperCase()==="INIT");d&&(h.info("bot-provision","adopting existing INIT version",{versionId:d.versionId}),c=d)}catch{}c=c??await this.runner.createVersion(e.unifiedAppId,n.desc??`${e.appName} \u9996\u4E2A\u53D1\u5E03\u7248\u672C`),e=await r(ct(e,{type:"version_created",versionId:c.versionId,version:c.version}))}let o=null;if(Oe[e.phase]<Oe.approver_selected){o=await this.runner.checkApproval(e.unifiedAppId,e.versionId);let c=o.approvalCandidates??[];if((o.actionRequired==="select_approver"||c.length>0)&&!n.approverUserId)return{status:"approver_required",state:e,candidates:c};n.approverUserId&&(e=await r(ct(e,{type:"approver_selected",userId:n.approverUserId})))}if(Oe[e.phase]<Oe.publish_pending){let c=e.approverUserId??n.approverUserId;if(!c&&o?.requiresApproval!==!1)throw new fe("publish_approval_pending","\u53D1\u5E03\u9700\u663E\u5F0F\u5BA1\u6279\u4EBA\uFF1A\u8BF7\u8FD0\u884C check-approval \u67E5\u770B\u5019\u9009\u540E\uFF0C\u7528 --approver-user-id \u6307\u5B9A");await this.runner.publishVersion(e.unifiedAppId,e.versionId,c),e=await r(ct(e,{type:"publish_submitted"}))}let s=(await this.runner.versionStatus(e.unifiedAppId,e.versionId).catch(()=>null))?.versionStatus;return s&&nl(s)?(e=await r(ct(e,{type:"published"})),{status:"published",state:e}):{status:"publish_pending",state:e}}async groupBots(e,n,r){let o=[],i=[];for(let s of n)try{let c=await this.groupBot(e,s,r);e=c.state,o.push(c.outcome)}catch(c){if(!(c instanceof fe))throw c;i.push(`\u300C${s}\u300D${c.message}`)}return{state:e,outcomes:o,failures:i}}async groupBot(e,n,r){let o=n.trim(),i;if(!(/^cid/i.test(o)||o.includes("="))){let u=await this.runner.searchChatGroups(o),f=u.find(p=>p.title===o)??u[0];if(!f)throw new fe("unknown",`\u672A\u627E\u5230\u7FA4\u300C${n}\u300D\uFF08dws chat search \u65E0\u7ED3\u679C\uFF09\uFF1B\u53EF\u6539\u7528 --group <openConversationId>`);i=f.title,o=f.openConversationId}let c=to(e)[o];if(c)return{state:e,outcome:{target:n,openConversationId:o,title:i,outcome:"already-added",source:"ledger",addedAt:c.addedAt,robotName:c.robotName}};let l=!1,d;try{let u=await this.runner.addBotToGroup(e.clientId,o);d=oC(u)}catch(u){if(u instanceof fe&&u.kind==="bot_already_installed")l=!0;else throw u}return e=await r(ct(e,{type:"grouped",openConversationId:o,robotName:d})),{state:e,outcome:{target:n,openConversationId:o,title:i,outcome:l?"already-added":"added",...l?{source:"server"}:{},addedAt:to(e)[o]?.addedAt,robotName:d}}}async addBotToGroup(e,n){return this.runner.addBotToGroup(e,n)}async resolveEnterpriseRobot(e){let n=e.name.trim();if(!n)throw new fe("unknown","\u4F01\u4E1A\u673A\u5668\u4EBA\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let r=e.envFile??Ki.join(process.cwd(),".env"),o=await this.runner.getCurrentCorpId();if(!o)throw new fe("auth_required","\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D dws \u7EC4\u7EC7\u7684 corpId\uFF1B\u8BF7\u5148\u8FD0\u884C `dws auth login` \u5E76\u5207\u6362\u7EC4\u7EC7");let i=await this.deps.readEnvFile(r),c=QR(i)[o];if(c?.unifiedAppId&&await this.runner.getAppByUnifiedAppId(c.unifiedAppId).catch(()=>null))return await this.saveEnterpriseRobot(r,i,o,c),{corpId:o,unifiedAppId:c.unifiedAppId,appKey:c.appKey,appSecret:c.appSecret};let l=await this.findAppByName(n);if(l?.unifiedAppId){let m=await this.runner.getCredentials(l.unifiedAppId),y={name:n,unifiedAppId:l.unifiedAppId,appKey:m.client_id,appSecret:m.client_secret};return await this.saveEnterpriseRobot(r,i,o,y),{corpId:o,unifiedAppId:y.unifiedAppId,appKey:y.appKey,appSecret:y.appSecret}}let d=await this.runner.submitRobot({name:n,robotName:n,desc:Xg(e.desc??`${n} \u673A\u5668\u4EBA - aitable-workflow`)}),u=await this.pollRobotReady(d.taskId),f=await this.resolveUnifiedAppId(u),p=await this.runner.getCredentials(f),g={name:n,unifiedAppId:f,appKey:u,appSecret:p.client_secret};return await this.saveEnterpriseRobot(r,i,o,g),{corpId:o,unifiedAppId:f,appKey:g.appKey,appSecret:g.appSecret}}async pollRobotReady(e,n=60){for(let r=0;r<n;r++){let i=await this.runner.robotResult(e);if((S(i.lifecycle)?i.lifecycle:{}).robotTaskDone===!0&&typeof i.clientId=="string")return i.clientId;await this.deps.sleep(5e3)}throw new fe("timeout",`\u5EFA\u53F7\u4EFB\u52A1 ${e} \u5728 ${n} \u6B21\u8F6E\u8BE2\u5185\u672A\u5C31\u7EEA`)}async resolveUnifiedAppId(e){let n=await this.runner.getApp(e),r=n?.unifiedAppId??n?.unified_app_id;if(!r)throw new fe("agent_gate_unified_app_id",`\u65E0\u6CD5\u4ECE dev app get --app-key ${e} \u89E3\u6790 unifiedAppId`);return r}async saveEnterpriseRobot(e,n,r,o){await this.deps.writeEnvFile(e,YR(n,r,o))}async findAppByName(e){let r=(await this.runner.listApps({name:e})).filter(o=>(o.name??o.appName)===e);return r.length>1&&h.warn("bot-provision","\u540C\u540D\u5E94\u7528\u591A\u4E2A\uFF0C\u53D6\u670D\u52A1\u7AEF\u9996\u4E2A\uFF08\u5EFA\u8BAE\u5728\u5F00\u53D1\u8005\u540E\u53F0\u6E05\u7406\u91CD\u590D\u5E94\u7528\uFF09",{name:e,count:r.length,unifiedAppIds:r.map(o=>o.unifiedAppId??o.unified_app_id).join(",")}),r[0]??null}};function nl(t){return/publish(ed)?|public|release(d)?|success/i.test(t)&&!/pending|init|reject|fail/i.test(t)}a(nl,"isPublishedStatus");function CK(t){let e=[],{state:n}=t;if(!n)return e.push("\u672A\u627E\u5230 provision \u72B6\u6001\u6587\u4EF6\uFF08<configDir>/.aitable/provision-state.json\uFF09\u3002"),e.push("\u5148\u8FD0\u884C: aitable-workflow bot provision --name <\u5E94\u7528\u540D> --robot-name <\u673A\u5668\u4EBA\u540D> --desc <\u63CF\u8FF0>"),e;e.push(`\u5E94\u7528: ${n.appName}`),e.push(`\u76F8\u4F4D: ${n.phase}`),n.clientId&&e.push(`clientId: ${n.clientId}`),n.unifiedAppId&&e.push(`unifiedAppId: ${n.unifiedAppId}`),n.versionId&&e.push(`versionId: ${n.versionId}${n.versionNumber?`\uFF08${n.versionNumber}\uFF09`:""}`);let r=Object.entries(to(n));if(r.length>0){e.push(`\u7FA4\u53F0\u8D26: ${r.length} \u4E2A\u7FA4\uFF08\u4EC5\u8BC1\u660E\u5F53\u65F6\u8C03\u7528\u5165\u7FA4\uFF0C\u4E0D\u4EE3\u8868\u5F53\u524D\u4ECD\u5728\u7FA4\uFF09:`);for(let[i,s]of r)e.push(` - ${s.robotName?`${s.robotName} @ `:""}${i}\uFF08addedAt=${s.addedAt}\uFF09`)}t.error?e.push(`\u67E5\u8BE2\u5931\u8D25: ${t.error}`):t.versionStatus&&e.push(`\u5BA1\u6279\u72B6\u6001: versionStatus = ${t.versionStatus}${nl(t.versionStatus)?"\uFF08\u5DF2\u53D1\u5E03\uFF0C\u53EF\u91CD\u8BD5\u62C9\u7FA4\uFF09":""}`),t.approval?.requiresApproval===!1&&e.push("\u5BA1\u6279\u7B56\u7565: \u672C\u7EC4\u7EC7\u53D1\u5E03\u65E0\u9700\u771F\u4EBA\u5BA1\u6279\uFF08requiresApproval=false\uFF09\uFF0Cprovision --publish \u53EF\u76F4\u63A5\u53D1\u5E03\u3002");let o=t.approval?.approvalCandidates??[];if(o.length>0){e.push("\u5BA1\u6279\u4EBA\u5019\u9009:");for(let c of o)e.push(` - ${c.name??"(\u672A\u77E5)"} userId=${c.userId}${c.mainAdmin?"\uFF08\u4E3B\u7BA1\u7406\u5458\uFF09":""}`);let i=n.appName,s=n.versionNumber??n.versionId??"?";e.push("\u50AC\u529E\u547D\u4EE4\u6A21\u677F\uFF08\u4E2A\u4EBA\u8EAB\u4EFD\u5355\u804A\uFF1B\u7D27\u6025\u7528 `dws ding`\uFF09:");for(let c of o){let l=`\u8BF7\u5E2E\u5FD9\u5BA1\u6279\u5F00\u653E\u5E73\u53F0\u5E94\u7528\u300C${i}\u300D\u7684 ${s} \u7248\u672C\u53D1\u5E03\uFF08aitable-workflow bot provisioning\uFF09\uFF0C\u8C22\u8C22\uFF01`;e.push(` dws chat message send --user ${c.userId} --text "${l}"`)}}else t.approval?.actionRequired&&e.push(`check-approval: actionRequired=${t.approval.actionRequired}`);return e.push(`\u4E0B\u4E00\u6B65: ${KR(n.phase,t.versionStatus)}`),e}a(CK,"buildBotApprovalReportLines");export*from"aitable-workflow-base";import iC from"path";var sC=[/^workflow\.yml$/i,/^aitable-workflow\.config\.yml$/i,/^coding-agents\.config\.json$/i,/^design[^/]*\.yml$/i,/^recipes\/.+$/i,/^roles\/.+$/i];function aC(t){return iC.normalize(t).replace(/\\/g,"/").replace(/^\.\//,"")}a(aC,"normalizeArtifactRelPath");function cC(t){try{return Fr(t),!0}catch{return!1}}a(cC,"isSafeRelativePath");function DK(t){if(!cC(t))return!1;let e=aC(t);return sC.some(n=>n.test(e))}a(DK,"isAllowedArtifactPath");function $K(t,e,n){Ba(t,{label:"projectId"}),Ba(e,{label:"requestId"});let r=Fr(n);return`artifacts/${t}/${e}/${r}`}a($K,"buildArtifactKey");import{createHash as lC}from"crypto";import{gzipSync as dC,gunzipSync as uC}from"zlib";var am="aitable-workspace-bundle@1";function sm(t){return lC("sha256").update(t).digest("hex")}a(sm,"sha256Hex");function cm(t){let e=t.map(n=>`${n.path}\0${sm(n.content)}
333
+ \u21B3 ${s.guidance}`};throw s}}async ensureRobotReady(e,n,r){if(e.phase==="preflight"){let i=await this.findAppByName(e.appName).catch(()=>null);if(i){let c=i.appKey??i.app_key??i.clientId??i.client_id,l=i.unifiedAppId??i.unified_app_id;if(!c&&l){let d=await this.runner.getAppByUnifiedAppId(l);c=d?.appKey??d?.app_key??d?.clientId??d?.client_id,l=l??d?.unifiedAppId??d?.unified_app_id}if(c){h.info("bot-provision","app already exists, skipping submit",{name:e.appName});let d=ct(ct(e,{type:"submit_accepted",taskId:e.taskId??`existing:${e.appName}`}),{type:"robot_ready",clientId:c});return l&&(d=ct(d,{type:"unified_resolved",unifiedAppId:l})),r(d)}}let s=await this.runner.submitRobot({name:e.appName,robotName:n.robotName??e.appName,desc:Xg(n.desc??`${e.appName} \u673A\u5668\u4EBA - aitable-workflow bot provision`)});e=await r(ct(e,{type:"submit_accepted",taskId:s.taskId}))}let o=Math.max(1,n.pollAttempts??60);for(let i=0;i<o;i++){let c=await this.runner.robotResult(e.taskId);if(c.lifecycle?.robotTaskDone&&c.clientId)return r(ct(e,{type:"robot_ready",clientId:c.clientId,localConnectReady:c.lifecycle.localConnectReady}));await this.deps.sleep(5e3)}throw new fe("timeout",`\u5EFA\u53F7\u4EFB\u52A1 ${e.taskId} \u5728 ${o} \u6B21\u8F6E\u8BE2\u5185\u672A\u5C31\u7EEA\uFF08expiresInSeconds \u901A\u5E38\u4E3A 86400\uFF0C\u53EF\u7A0D\u540E\u91CD\u8DD1\u7EED\u8DD1\uFF09`)}async runPublishPhase(e,n,r){if(Oe[e.phase]<Oe.version_created){let c=null;try{let d=(await this.runner.listVersions(e.unifiedAppId)).find(u=>(u.versionStatus??"").toUpperCase()==="INIT");d&&(h.info("bot-provision","adopting existing INIT version",{versionId:d.versionId}),c=d)}catch{}c=c??await this.runner.createVersion(e.unifiedAppId,n.desc??`${e.appName} \u9996\u4E2A\u53D1\u5E03\u7248\u672C`),e=await r(ct(e,{type:"version_created",versionId:c.versionId,version:c.version}))}let o=null;if(Oe[e.phase]<Oe.approver_selected){o=await this.runner.checkApproval(e.unifiedAppId,e.versionId);let c=o.approvalCandidates??[];if((o.actionRequired==="select_approver"||c.length>0)&&!n.approverUserId)return{status:"approver_required",state:e,candidates:c};n.approverUserId&&(e=await r(ct(e,{type:"approver_selected",userId:n.approverUserId})))}if(Oe[e.phase]<Oe.publish_pending){let c=e.approverUserId??n.approverUserId;if(!c&&o?.requiresApproval!==!1)throw new fe("publish_approval_pending","\u53D1\u5E03\u9700\u663E\u5F0F\u5BA1\u6279\u4EBA\uFF1A\u8BF7\u8FD0\u884C check-approval \u67E5\u770B\u5019\u9009\u540E\uFF0C\u7528 --approver-user-id \u6307\u5B9A");await this.runner.publishVersion(e.unifiedAppId,e.versionId,c),e=await r(ct(e,{type:"publish_submitted"}))}let s=(await this.runner.versionStatus(e.unifiedAppId,e.versionId).catch(()=>null))?.versionStatus;return s&&nl(s)?(e=await r(ct(e,{type:"published"})),{status:"published",state:e}):{status:"publish_pending",state:e}}async groupBots(e,n,r){let o=[],i=[];for(let s of n)try{let c=await this.groupBot(e,s,r);e=c.state,o.push(c.outcome)}catch(c){if(!(c instanceof fe))throw c;i.push(`\u300C${s}\u300D${c.message}`)}return{state:e,outcomes:o,failures:i}}async groupBot(e,n,r){let o=n.trim(),i;if(!(/^cid/i.test(o)||o.includes("="))){let u=await this.runner.searchChatGroups(o),f=u.find(p=>p.title===o)??u[0];if(!f)throw new fe("unknown",`\u672A\u627E\u5230\u7FA4\u300C${n}\u300D\uFF08dws chat search \u65E0\u7ED3\u679C\uFF09\uFF1B\u53EF\u6539\u7528 --group <openConversationId>`);i=f.title,o=f.openConversationId}let c=to(e)[o];if(c)return{state:e,outcome:{target:n,openConversationId:o,title:i,outcome:"already-added",source:"ledger",addedAt:c.addedAt,robotName:c.robotName}};let l=!1,d;try{let u=await this.runner.addBotToGroup(e.clientId,o);d=oC(u)}catch(u){if(u instanceof fe&&u.kind==="bot_already_installed")l=!0;else throw u}return e=await r(ct(e,{type:"grouped",openConversationId:o,robotName:d})),{state:e,outcome:{target:n,openConversationId:o,title:i,outcome:l?"already-added":"added",...l?{source:"server"}:{},addedAt:to(e)[o]?.addedAt,robotName:d}}}async addBotToGroup(e,n){return this.runner.addBotToGroup(e,n)}async resolveEnterpriseRobot(e){let n=e.name.trim();if(!n)throw new fe("unknown","\u4F01\u4E1A\u673A\u5668\u4EBA\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let r=e.envFile??Ki.join(process.cwd(),".env"),o=await this.runner.getCurrentCorpId();if(!o)throw new fe("auth_required","\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D dws \u7EC4\u7EC7\u7684 corpId\uFF1B\u8BF7\u5148\u8FD0\u884C `dws auth login` \u5E76\u5207\u6362\u7EC4\u7EC7");let i=await this.deps.readEnvFile(r),c=QR(i)[o];if(c?.unifiedAppId&&await this.runner.getAppByUnifiedAppId(c.unifiedAppId).catch(()=>null))return await this.saveEnterpriseRobot(r,i,o,c),{corpId:o,unifiedAppId:c.unifiedAppId,appKey:c.appKey,appSecret:c.appSecret};let l=await this.findAppByName(n);if(l?.unifiedAppId){let m=await this.runner.getCredentials(l.unifiedAppId),y={name:n,unifiedAppId:l.unifiedAppId,appKey:m.client_id,appSecret:m.client_secret};return await this.saveEnterpriseRobot(r,i,o,y),{corpId:o,unifiedAppId:y.unifiedAppId,appKey:y.appKey,appSecret:y.appSecret}}let d=await this.runner.submitRobot({name:n,robotName:n,desc:Xg(e.desc??`${n} \u673A\u5668\u4EBA - aitable-workflow`)}),u=await this.pollRobotReady(d.taskId),f=await this.resolveUnifiedAppId(u),p=await this.runner.getCredentials(f),g={name:n,unifiedAppId:f,appKey:u,appSecret:p.client_secret};return await this.saveEnterpriseRobot(r,i,o,g),{corpId:o,unifiedAppId:f,appKey:g.appKey,appSecret:g.appSecret}}async pollRobotReady(e,n=60){for(let r=0;r<n;r++){let i=await this.runner.robotResult(e);if((v(i.lifecycle)?i.lifecycle:{}).robotTaskDone===!0&&typeof i.clientId=="string")return i.clientId;await this.deps.sleep(5e3)}throw new fe("timeout",`\u5EFA\u53F7\u4EFB\u52A1 ${e} \u5728 ${n} \u6B21\u8F6E\u8BE2\u5185\u672A\u5C31\u7EEA`)}async resolveUnifiedAppId(e){let n=await this.runner.getApp(e),r=n?.unifiedAppId??n?.unified_app_id;if(!r)throw new fe("agent_gate_unified_app_id",`\u65E0\u6CD5\u4ECE dev app get --app-key ${e} \u89E3\u6790 unifiedAppId`);return r}async saveEnterpriseRobot(e,n,r,o){await this.deps.writeEnvFile(e,YR(n,r,o))}async findAppByName(e){let r=(await this.runner.listApps({name:e})).filter(o=>(o.name??o.appName)===e);return r.length>1&&h.warn("bot-provision","\u540C\u540D\u5E94\u7528\u591A\u4E2A\uFF0C\u53D6\u670D\u52A1\u7AEF\u9996\u4E2A\uFF08\u5EFA\u8BAE\u5728\u5F00\u53D1\u8005\u540E\u53F0\u6E05\u7406\u91CD\u590D\u5E94\u7528\uFF09",{name:e,count:r.length,unifiedAppIds:r.map(o=>o.unifiedAppId??o.unified_app_id).join(",")}),r[0]??null}};function nl(t){return/publish(ed)?|public|release(d)?|success/i.test(t)&&!/pending|init|reject|fail/i.test(t)}a(nl,"isPublishedStatus");function CK(t){let e=[],{state:n}=t;if(!n)return e.push("\u672A\u627E\u5230 provision \u72B6\u6001\u6587\u4EF6\uFF08<configDir>/.aitable/provision-state.json\uFF09\u3002"),e.push("\u5148\u8FD0\u884C: aitable-workflow bot provision --name <\u5E94\u7528\u540D> --robot-name <\u673A\u5668\u4EBA\u540D> --desc <\u63CF\u8FF0>"),e;e.push(`\u5E94\u7528: ${n.appName}`),e.push(`\u76F8\u4F4D: ${n.phase}`),n.clientId&&e.push(`clientId: ${n.clientId}`),n.unifiedAppId&&e.push(`unifiedAppId: ${n.unifiedAppId}`),n.versionId&&e.push(`versionId: ${n.versionId}${n.versionNumber?`\uFF08${n.versionNumber}\uFF09`:""}`);let r=Object.entries(to(n));if(r.length>0){e.push(`\u7FA4\u53F0\u8D26: ${r.length} \u4E2A\u7FA4\uFF08\u4EC5\u8BC1\u660E\u5F53\u65F6\u8C03\u7528\u5165\u7FA4\uFF0C\u4E0D\u4EE3\u8868\u5F53\u524D\u4ECD\u5728\u7FA4\uFF09:`);for(let[i,s]of r)e.push(` - ${s.robotName?`${s.robotName} @ `:""}${i}\uFF08addedAt=${s.addedAt}\uFF09`)}t.error?e.push(`\u67E5\u8BE2\u5931\u8D25: ${t.error}`):t.versionStatus&&e.push(`\u5BA1\u6279\u72B6\u6001: versionStatus = ${t.versionStatus}${nl(t.versionStatus)?"\uFF08\u5DF2\u53D1\u5E03\uFF0C\u53EF\u91CD\u8BD5\u62C9\u7FA4\uFF09":""}`),t.approval?.requiresApproval===!1&&e.push("\u5BA1\u6279\u7B56\u7565: \u672C\u7EC4\u7EC7\u53D1\u5E03\u65E0\u9700\u771F\u4EBA\u5BA1\u6279\uFF08requiresApproval=false\uFF09\uFF0Cprovision --publish \u53EF\u76F4\u63A5\u53D1\u5E03\u3002");let o=t.approval?.approvalCandidates??[];if(o.length>0){e.push("\u5BA1\u6279\u4EBA\u5019\u9009:");for(let c of o)e.push(` - ${c.name??"(\u672A\u77E5)"} userId=${c.userId}${c.mainAdmin?"\uFF08\u4E3B\u7BA1\u7406\u5458\uFF09":""}`);let i=n.appName,s=n.versionNumber??n.versionId??"?";e.push("\u50AC\u529E\u547D\u4EE4\u6A21\u677F\uFF08\u4E2A\u4EBA\u8EAB\u4EFD\u5355\u804A\uFF1B\u7D27\u6025\u7528 `dws ding`\uFF09:");for(let c of o){let l=`\u8BF7\u5E2E\u5FD9\u5BA1\u6279\u5F00\u653E\u5E73\u53F0\u5E94\u7528\u300C${i}\u300D\u7684 ${s} \u7248\u672C\u53D1\u5E03\uFF08aitable-workflow bot provisioning\uFF09\uFF0C\u8C22\u8C22\uFF01`;e.push(` dws chat message send --user ${c.userId} --text "${l}"`)}}else t.approval?.actionRequired&&e.push(`check-approval: actionRequired=${t.approval.actionRequired}`);return e.push(`\u4E0B\u4E00\u6B65: ${KR(n.phase,t.versionStatus)}`),e}a(CK,"buildBotApprovalReportLines");export*from"aitable-workflow-base";import iC from"path";var sC=[/^workflow\.yml$/i,/^aitable-workflow\.config\.yml$/i,/^coding-agents\.config\.json$/i,/^design[^/]*\.yml$/i,/^recipes\/.+$/i,/^roles\/.+$/i];function aC(t){return iC.normalize(t).replace(/\\/g,"/").replace(/^\.\//,"")}a(aC,"normalizeArtifactRelPath");function cC(t){try{return Fr(t),!0}catch{return!1}}a(cC,"isSafeRelativePath");function DK(t){if(!cC(t))return!1;let e=aC(t);return sC.some(n=>n.test(e))}a(DK,"isAllowedArtifactPath");function $K(t,e,n){Ba(t,{label:"projectId"}),Ba(e,{label:"requestId"});let r=Fr(n);return`artifacts/${t}/${e}/${r}`}a($K,"buildArtifactKey");import{createHash as lC}from"crypto";import{gzipSync as dC,gunzipSync as uC}from"zlib";var am="aitable-workspace-bundle@1";function sm(t){return lC("sha256").update(t).digest("hex")}a(sm,"sha256Hex");function cm(t){let e=t.map(n=>`${n.path}\0${sm(n.content)}
334
334
  `).sort();return sm(e.join(""))}a(cm,"computeWorkspaceRevision");function FK(t,e){let n=[...e].sort((o,i)=>o.path<i.path?-1:o.path>i.path?1:0),r={format:am,projectId:t,revision:cm(n),files:n};return dC(Buffer.from(JSON.stringify(r),"utf8"))}a(FK,"encodeWorkspaceBundle");function NK(t){let e;try{e=JSON.parse(uC(t).toString("utf8"))}catch(r){throw new Error(`\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u89E3\u7801\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}if(e?.format!==am)throw new Error(`\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u683C\u5F0F\u4E0D\u652F\u6301: ${String(e?.format)}`);if(!Array.isArray(e.files))throw new Error("\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u7F3A\u5C11 files");if(cm(e.files)!==e.revision)throw new Error("\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305 revision \u4E0E\u5185\u5BB9\u4E0D\u7B26\uFF08\u5305\u4F53\u635F\u574F\u6216\u88AB\u7BE1\u6539\uFF09");return e}a(NK,"decodeWorkspaceBundle");function BK(t){return!!(t.bucket&&t.accessKeyId&&t.accessKeySecret)}a(BK,"hasOssCredentials");var lm=class{static{a(this,"InMemoryObjectStore")}store="memory";objects=new Map;expiresSec;constructor(e){this.expiresSec=e?.expiresSec??600}async presignPut(e,n){let r=n?.expiresSec??this.expiresSec,o=new Date(Date.now()+r*1e3).toISOString();return{method:"PUT",url:`memory://${e}`,key:e,expiresAt:o,...n?.contentType?{headers:{"Content-Type":n.contentType}}:{}}}putObject(e,n){this.objects.set(e,Buffer.from(n))}async getObject(e){let n=this.objects.get(e);if(!n)throw new Error(`InMemoryObjectStore: object not found: ${e}`);return Buffer.from(n)}async deleteObject(e){this.objects.delete(e)}keys(){return[...this.objects.keys()]}};import{existsSync as fC}from"fs";import pC from"os";import dm from"path";var gC=5e3;function um(t,e=process.platform){return hn(t,e)[0]}a(um,"getGlobalDwsBinPath");function rl(t,e=process.env,n=process.platform){let r=n==="win32"?dm.win32:dm,o=n==="win32"?";":":",i=n==="win32"?Object.keys(e).find(f=>f.toLowerCase()==="path")??"Path":"PATH",s=r.dirname(t),c=(e[i]??"").split(o).filter(f=>f.length>0),l=n==="win32"?(f,p)=>f.toLowerCase()===p.toLowerCase():(f,p)=>f===p,d=c[0]!==void 0&&l(c[0],s),u=c.filter(f=>!l(f,s));return e[i]=[s,...u].join(o),!d}a(rl,"prependGlobalDwsToPath");async function YK(t={}){let e=t.npmBin?.trim()||(process.platform==="win32"?"npm.cmd":"npm"),n=t.runner??J,r=t.platform??process.platform,o=t.env??process.env,i=t.homedir??pC.homedir(),s=t.isAvailable??fC,c=a(d=>({status:"activated",bin:d,pathAdjusted:rl(d,o,r)}),"activate"),l=Lr(i,r,o).find(d=>s(d));if(l)return c(l);try{let d=await n(e,["prefix","--global"],{timeoutMs:gC}),u=d.stdout.trim();if(d.exitCode===0&&u){let f=hn(u,r).find(p=>s(p));if(f)return c(f)}}catch{}return Rf(o,i,r),{status:"unavailable"}}a(YK,"activateGlobalDwsOnPath");function fm(t){return`${t}__empty_streak`}a(fm,"emptyStreakKey");function mC(t,e,n,r){let o=Math.max(1,Math.trunc(r)||1),i=fm(e),s=Math.trunc(Number(t.getGlobalVar(i)??0)),c=Number.isFinite(s)&&s>0?s:0,l=t.getGlobalVar(e),d=Array.isArray(l)?l.length:0;if(n>0||d===0)return c!==0&&t.setGlobalVar(i,0),{allow:!0,streak:0,rounds:o};let u=c+1;return t.setGlobalVar(i,u>=o?0:u),{allow:u>=o,streak:u,rounds:o}}a(mC,"gateEmptySnapshot");function pm(t){let e=[],n=0,r=!1;for(;n<t.length;){let o=t[n];if(!r)e.push(o),o==='"'&&(r=!0),n++;else if(o==="\\")e.push(o,t[n+1]??""),n+=2;else if(o==='"'){let i=n+1;for(;i<t.length&&/\s/.test(t[i]);)i++;let s=t[i];s===":"||s===","||s==="}"||s==="]"||s===void 0?(e.push(o),r=!1,n++):(e.push('\\"'),n++)}else e.push(o),n++}return e.join("")}a(pm,"repairJsonStringValues");function gm(t){try{return JSON.parse(t)}catch{}try{return JSON.parse(pm(t))}catch{return null}}a(gm,"safeParseJson");function hC(t,e){if(!t)return null;let n=t.trim(),r=n.match(/```(?:json)?\s*([\s\S]*?)```/i);r?.[1]&&(n=r[1].trim());let o=n.indexOf("{"),i=n.lastIndexOf("}");if(o===-1||i<=o)return null;let s=n.slice(o,i+1),c=gm(s);if(!c||typeof c!="object")return null;let l=e.safeParse(c);return l.success?l.data:null}a(hC,"extractStructuredJson");import{createHash as yC}from"crypto";var wC=600*1e3,bC=50,mm=300;function kC(t){let e=t.key,n=t.ttlMs??wC,r=t.capacity??bC,o=t.maxPartLength??mm;function i(l,d){let u=Array.isArray(o)?o[d]??o[o.length-1]??mm:o;return String(l??"").replace(/\s+/g,"").slice(0,u)}a(i,"normalize");function s(...l){return yC("sha1").update(l.map(i).join("|")).digest("hex")}a(s,"fingerprint");function c(l){let d=l(e);if(!Array.isArray(d))return[];let u=Date.now();return d.filter(f=>f&&typeof f.h=="string"&&typeof f.ts=="number"&&u-f.ts<=n)}return a(c,"load"),{fingerprint:s,mark(l,d,...u){let f=s(...u),p=c(l);if(p.some(g=>g.h===f))return d(e,p),!1;for(p.push({h:f,ts:Date.now()});p.length>r;)p.shift();return d(e,p),!0},has(l,...d){if(!d.some(f=>String(f??"").trim()))return!1;let u=s(...d);return c(l).some(f=>f.h===u)}}}a(kC,"createFingerprintWindow");import{readFile as WC,stat as al,readdir as BC}from"fs/promises";import xt from"path";import zC from"yaml";import{z as j}from"zod";var no=j.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]),vC=j.enum(["Grid","FormDesigner","Kanban","Calendar","Gallery","Gantt"]),SC=j.object({field:j.string().min(1),any_of:j.array(j.string().min(1)).min(1).optional(),equals:j.string().optional()}).refine(t=>!!t.any_of||typeof t.equals=="string",{message:"\u89C6\u56FE filter \u6761\u4EF6\u5FC5\u987B\u58F0\u660E any_of \u6216 equals \u4E4B\u4E00"}),ro=j.object({id:j.string().min(1),type:vC,name:j.string().min(1),field_order:j.array(j.string()).optional(),visible_fields:j.array(j.string()).optional(),group_by:j.string().optional(),date_field:j.string().optional(),description:j.string().optional(),filter:j.array(SC).min(1).optional(),for_each_step:j.enum(["needs_human","all"]).optional()}),xC=j.array(ro).optional(),IC=j.enum(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]),RC=j.object({name:j.string().min(1),type:IC,options:j.array(j.string()).optional(),formatter:j.string().optional(),description:j.string().optional()}),CC=j.object({initial:j.string().min(1),active:j.array(j.string()).min(1),restart:j.string().min(1).optional(),terminal:j.array(j.string()).min(1),blocked:j.string().default("\u5DF2\u963B\u585E"),review:j.string().optional()}),TC=j.object({state:j.string().min(1),title:j.string().min(1),description:j.string().optional(),current_step:j.string().optional(),owner:j.string().optional(),submitter:j.string().optional(),deadline:j.string().optional(),event_log:j.string().optional()}),ol=j.object({base_id:j.string().min(1),table_id:j.string().default(""),label:j.string().optional(),description:j.string().optional(),states:CC,fields:TC,field_definitions:j.array(RC).optional(),views:xC,dws_bin:j.string().default("dws"),query_limit:j.number().default(50),human_loop:j.object({doc_workspace_id:j.string().min(1)}).optional(),form_share:j.object({enabled:j.boolean().default(!0)}).default({enabled:!0})}),_C=j.object({template:j.string().min(1).describe("\u76F8\u5BF9\u8DEF\u5F84\u6307\u5411 workflow.yml"),recipe_dir:j.string().default("./recipes")}),AC=j.object({dir:j.string().min(1).describe("\u5DE5\u4F5C\u6D41\u76EE\u5F55\uFF1A\u6BCF\u4E2A\u542B workflow.yml \u7684\u5B50\u76EE\u5F55 = \u4E00\u4E2A\u5DE5\u4F5C\u6D41")}),EC=j.object({max_attempts:j.number().min(1).default(3),base_backoff_ms:j.number().min(0).default(2e3),max_backoff_ms:j.number().min(0).default(6e4)}).optional().refine(t=>!t||t.max_backoff_ms>=t.base_backoff_ms,{message:"max_backoff_ms \u5FC5\u987B\u5927\u4E8E\u6216\u7B49\u4E8E base_backoff_ms"}),DC=j.object({engine:j.preprocess(t=>t===null||t===""?void 0:t,no.default("claude")),model:j.string().optional(),max_concurrent:j.number().min(1).default(3),timeout_ms:j.number().default(3e5),max_step_failures:j.number().min(1).default(5),auto_advance:j.boolean().default(!0),retry:EC,trace_dir:j.string().default("./traces")}),$C=j.object({default_timeout_ms:j.number().default(3e5),llm:j.object({provider:j.enum(["dashscope","openai","anthropic","idealab"]).default("idealab"),model:j.string().default("Qwen3.7-Max-DogFooding"),api_key:j.string().optional()}).optional()}),PC=j.object({dir:j.string().default("./roles"),enabled:j.boolean().default(!0)}),MC=j.object({enabled:j.boolean().default(!1),default_timeout_ms:j.number().default(864e5),escalation_notify:j.array(j.string()).default([])}),OC=j.object({interval_ms:j.number().default(5e3)}),hm=j.object({scene:j.preprocess(t=>t===null?void 0:t,j.string().optional()),base_name:j.preprocess(t=>t===null?void 0:t,j.string().min(1).optional()),default_base_id:j.string().optional(),tracker:ol.optional(),workflow:_C.optional(),workflows:AC.optional(),agent:DC.optional(),recipe:$C.optional(),roles:PC.optional(),sla:MC.optional(),polling:OC.optional(),toolkit_config:j.record(j.string(),j.record(j.string(),j.unknown())).optional()}).refine(t=>!!t.workflow!=!!t.workflows,{message:"\u5FC5\u987B\u4E14\u53EA\u80FD\u914D\u7F6E workflow\uFF08\u5355\u5DE5\u4F5C\u6D41\uFF09\u6216 workflows\uFF08\u591A\u5DE5\u4F5C\u6D41\uFF09\u5176\u4E2D\u4E4B\u4E00"}).refine(t=>!(t.workflows&&t.tracker),{path:["tracker"],message:"\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F\uFF08workflows\uFF09\u4E0B\u4E0D\u5F97\u6709\u6839\u7EA7 tracker\uFF1A\u6BCF\u4E2A\u5DE5\u4F5C\u6D41\u7684 tracker \u5FC5\u987B\u5185\u8054\u5728\u5404\u81EA\u7684 workflows/<id>/workflow.yml \u91CC\uFF0C\u5426\u5219\u6240\u6709\u5DE5\u4F5C\u6D41\u4F1A\u5171\u7528\u540C\u4E00\u5F20\u8868\u3002\u8FC1\u79FB\uFF1A\u628A\u6839\u7EA7 tracker \u6BB5\u642C\u8FDB\u5404 workflow.yml\uFF08table_id \u7559\u7A7A\u8BA9 setup \u5404\u5EFA\u4E00\u5F20\u8868\uFF09\uFF0C\u5176\u4E2D\u7684 base_id \u82E5\u8981\u4F5C\u4E3A\u9879\u76EE\u9ED8\u8BA4\u503C\u4FDD\u7559\uFF0C\u6539\u5199\u4E3A\u6839\u7EA7 default_base_id\u3002"});import{readFile as jC}from"fs/promises";import{readFileSync as FC}from"fs";import bm from"path";import{parse as km}from"dotenv";var il=new Set;function ym(){return il}a(ym,"getAppliedEnvKeys");function sl(t){let e=new Set;for(let[n,r]of Object.entries(t))r!==void 0&&(process.env[n]=r,e.add(n));for(let n of il)e.has(n)||delete process.env[n];il=e}a(sl,"applyEnvToProcess");var NC=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,LC=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function qi(t){let e=t.trim();if((e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"'))&&(e=e.slice(1,-1)),e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e)}catch(n){let r=e.replace(/\\"/g,'"');try{return JSON.parse(r)}catch{throw new Error(`env \u503C\u7591\u4F3C JSON \u4F46\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`)}}return e}a(qi,"parseEnvValue");function nr(t,e,n={}){let r=n.lenient===!0;return o(t);function o(s){if(typeof s=="string"){let c=s.match(LC);if(c){let l=c[1],d=c[2]==="?",u=e[l];if(u===void 0){if(r)return s;if(d)return;throw new Error(`\u914D\u7F6E\u5F15\u7528\u4E86\u672A\u8BBE\u7F6E\u7684\u73AF\u5883\u53D8\u91CF \${env.${l}}(\u8BF7\u5728 .env \u6216\u73AF\u5883\u4E2D\u8BBE\u7F6E ${l})`)}return qi(u)}return i(s)}if(Array.isArray(s))return s.map(o);if(s&&typeof s=="object"){let c={};for(let[l,d]of Object.entries(s))c[l]=o(d);return c}return s}function i(s){return s.replace(NC,(c,l,d)=>{let u=e[l];if(u===void 0){if(r)return c;if(d==="?")return"";throw new Error(`\u914D\u7F6E\u5F15\u7528\u4E86\u672A\u8BBE\u7F6E\u7684\u73AF\u5883\u53D8\u91CF \${env.${l}}(\u8BF7\u5728 .env \u6216\u73AF\u5883\u4E2D\u8BBE\u7F6E ${l})`)}return u})}}a(nr,"interpolateEnv");var wm=(()=>{let t={};for(let[e,n]of Object.entries(process.env))n!==void 0&&(t[e]=n);return t})();async function Hi(t){let e=bm.join(t,".env");try{let n=await jC(e,"utf8");return{...Vi(),...km(n)}}catch{return Vi()}}a(Hi,"buildEnvSource");function vm(t){let e=bm.join(t,".env");try{let n=FC(e,"utf8");return{...Vi(),...km(n)}}catch{return Vi()}}a(vm,"buildEnvSourceSync");function Vi(){let t=ym(),e={...wm};for(let[n,r]of Object.entries(process.env))r!==void 0&&!(n in wm)&&!t.has(n)&&(e[n]=r);return e}a(Vi,"envSourceBase");var UC={engine:"claude",max_concurrent:3,timeout_ms:3e5,max_step_failures:5,auto_advance:!0,trace_dir:"./traces"},KC={default_timeout_ms:3e5,llm:{provider:"idealab",model:"Qwen3.7-Max-DogFooding"}},Sm={dir:"./roles",enabled:!0},VC={interval_ms:5e4},qC={enabled:!1,default_timeout_ms:864e5,escalation_notify:[]},xm={base_id:"__placeholder__",table_id:"",states:{initial:"__placeholder__",active:["__placeholder__"],terminal:["__placeholder__"],blocked:"__placeholder__"},fields:{state:"__placeholder__",title:"__placeholder__"},dws_bin:"dws",query_limit:50,form_share:{enabled:!0}},HC="aitable-workflow.config.yml";async function Ue(t){let e=xt.resolve(t);try{(await al(e)).isDirectory()&&(e=xt.join(e,HC))}catch{}return e}a(Ue,"resolveConfigPath");async function je(t,e={}){let n=await Ue(t),r=xt.dirname(n),o;try{o=await WC(n,"utf8")}catch(m){throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6 ${n}: ${m instanceof Error?m.message:String(m)}`)}let i;try{i=zC.parse(o)}catch(m){throw new Error(`\u914D\u7F6E\u6587\u4EF6 YAML \u89E3\u6790\u5931\u8D25: ${m instanceof Error?m.message:String(m)}`)}let s=await Hi(r),c;try{c=nr(i,s,{lenient:e.lenientEnv})}catch(m){throw new Error(`\u914D\u7F6E\u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${m instanceof Error?m.message:String(m)}`)}let l=hm.safeParse(c);if(!l.success)throw new Error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25:
335
- ${JSON.stringify(l.error.issues,null,2)}`);let d=l.data,u=!!d.workflows,f;if(u){if(f=await cl(r,d.workflows.dir),f.length===0)throw new Error(`\u591A\u5DE5\u4F5C\u6D41\u76EE\u5F55 ${d.workflows.dir} \u4E2D\u672A\u627E\u5230\u4EFB\u4F55\u542B workflow.yml \u7684\u5B50\u76EE\u5F55`);h.info("config","\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F",{workflows:f.map(m=>m.id)})}else{if(!d.workflow)throw new Error("\u5355\u5DE5\u4F5C\u6D41\u6A21\u5F0F\u9700\u8981 workflow \u914D\u7F6E");f=[{id:"default",templatePath:xt.resolve(r,d.workflow.template),recipeDir:xt.resolve(r,d.workflow.recipe_dir)}]}let p=d.tracker??xm,g={raw:d,envSource:s,configDir:r,multiWorkflow:u,workflowEntries:f,workflowTemplatePath:f[0].templatePath,recipeDir:f[0].recipeDir,tracker:p,agent:{...UC,...d.agent},recipe:{...KC,...d.recipe},roles:{...Sm,...d.roles},rolesDir:xt.resolve(r,d.roles?.dir??Sm.dir),polling:{...VC,...d.polling},sla:{...qC,...d.sla}};if(h.info("config","\u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210",{mode:u?"multi-workflow":"single-workflow",workflowCount:f.length,engine:g.agent.engine}),d.tracker)for(let m of GC(d))h.warn("config",m);return g}a(je,"loadSettings");async function cl(t,e){let n=xt.resolve(t,e),r;try{r=await BC(n)}catch{throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u591A\u5DE5\u4F5C\u6D41\u76EE\u5F55 ${n}`)}let o=[];for(let i of r.sort()){let s=xt.join(n,i);try{if(!(await al(s)).isDirectory())continue}catch{continue}let c=xt.join(s,"workflow.yml");try{await al(c)}catch{continue}o.push({id:i,templatePath:c,recipeDir:xt.join(s,"recipes")})}return o}a(cl,"scanWorkflowDirs");function GC(t){let e=[],n=t.tracker;if(!n)return e;let r=n.field_definitions;if(!r)return e;let o=n.fields.state,i=r.find(u=>u.name===o);if(!i?.options)return e;let s=new Set(i.options),c=n.states,l=[["initial",c.initial],...c.active.map((u,f)=>[`active[${f}]`,u]),...c.terminal.map((u,f)=>[`terminal[${f}]`,u]),...c.blocked?[["blocked",c.blocked]]:[],...c.review?[["review",c.review]]:[]],d=new Set(l.map(([,u])=>u));for(let[u,f]of l)s.has(f)||e.push(`\u72B6\u6001\u89D2\u8272 ${u}="${f}" \u672A\u51FA\u73B0\u5728\u300C${o}\u300D\u5B57\u6BB5\u9009\u9879\u4E2D,\u8FD0\u884C\u65F6\u5199\u5165\u8BE5\u72B6\u6001\u4F1A\u5931\u8D25`);for(let u of s)d.has(u)||e.push(`\u300C${o}\u300D\u5B57\u6BB5\u9009\u9879 "${u}" \u672A\u88AB\u4EFB\u4F55 states \u89D2\u8272\u6620\u5C04,\u53EF\u80FD\u9057\u6F0F\u914D\u7F6E(\u5982\u5F02\u5E38\u4E2D\u65AD\u6001\u5E94\u6620\u5C04\u5230 blocked)`);return e}a(GC,"validateStateConsistency");function Gi(t,e){return t.multiWorkflow?e:(t.tracker.base_id===xm.base_id?void 0:t.tracker)??e}a(Gi,"resolveWorkflowTracker");function Dn(t,e,n){return{...t,tracker:n,workflowTemplatePath:e.templatePath,recipeDir:e.recipeDir}}a(Dn,"createPerWorkflowSettings");import{readFile as Os}from"fs/promises";import My from"fs";import Wn from"path";import js from"yaml";var rr="aitable-workflow.config.yml";function Im(t,e={}){let n=[];if(n.push({key:"agent.engine",status:"ok",value:t.agent.engine,message:`agent.engine = ${t.agent.engine}`,writeTarget:{type:"yaml",file:rr,yamlPath:["agent","engine"]}}),t.workflowEntries.length===0)n.push({key:"workflow",status:"error",message:"\u672A\u627E\u5230\u5DE5\u4F5C\u6D41\u5165\u53E3",writeTarget:{type:"yaml",file:rr,yamlPath:["workflow"]}});else{let s=t.multiWorkflow?`\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F (${t.workflowEntries.length} \u4E2A\u5DE5\u4F5C\u6D41)`:"\u5355\u5DE5\u4F5C\u6D41\u6A21\u5F0F (workflow.yml)";n.push({key:"workflow",status:"ok",message:`\u5DE5\u4F5C\u6D41\u5165\u53E3: ${s}`})}let r=e.rawScene??t.raw.scene;r?n.push({key:"scene",status:"ok",value:r,message:"scene \u5DF2\u914D\u7F6E",writeTarget:{type:"yaml",file:rr,yamlPath:["scene"]}}):n.push({key:"scene",status:"warn",message:"scene \u672A\u914D\u7F6E\uFF08\u4EC5 design \u9636\u6BB5\u4F7F\u7528\uFF1B\u573A\u666F\u63CF\u8FF0\uFF0C\u7528\u4E8E design \u9636\u6BB5\u751F\u6210\u5DE5\u4F5C\u6D41\uFF09",writeTarget:{type:"yaml",file:rr,yamlPath:["scene"]}});let o=t.polling.interval_ms;return o>0?n.push({key:"polling.interval_ms",status:"ok",value:o,message:`polling.interval_ms = ${o}`,writeTarget:{type:"yaml",file:rr,yamlPath:["polling","interval_ms"]}}):n.push({key:"polling.interval_ms",status:"warn",value:o,message:"polling.interval_ms \u5E94\u5927\u4E8E 0",writeTarget:{type:"yaml",file:rr,yamlPath:["polling","interval_ms"]}}),{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!n.some(s=>s.status==="error"),items:n}}a(Im,"checkProject");import{readFile as tT}from"fs/promises";import{readFile as JC}from"fs/promises";import ZC from"path";import YC from"yaml";async function or(t){let e=await QC(t.workflowEntries,t.configDir),n=t.agent.engine,o=XC(e.map(i=>i.engine))??n;return{projectEngine:n,workflowOverrides:e,configuredEngine:o,...Sn(o)?{configuredAgent:Sn(o)}:{}}}a(or,"resolveCodingAgentSelection");function Rm(){let t=new Set,e=[];for(let n of Ur()){let r=gp(n.type);!r||t.has(r)||(t.add(r),e.push({agent:n.type,engine:r,cmd:n.cmd,...n.version?{version:n.version}:{}}))}return{available:e,...e[0]?{recommendedEngine:e[0].engine}:{}}}a(Rm,"detectCodingEngines");function Ji(t,e){return t==="llm_only"?!0:e.available.some(n=>n.engine===t)}a(Ji,"isEngineDetected");function Cm(t,e){return Ji(t.configuredEngine,e)?t.configuredEngine:Ji(t.projectEngine,e)?t.projectEngine:e.recommendedEngine}a(Cm,"chooseDetectedEngine");async function QC(t,e){let n=[];for(let r of t){let o;try{o=YC.parse(await JC(r.templatePath,"utf8"))}catch{continue}if(!S(o))continue;let i=o.toolkit_config;if(!S(i))continue;let s=i.coding;if(!S(s))continue;let c=s.engine,l=no.safeParse(c);l.success&&n.push({workflowId:r.id,file:eT(e,r.templatePath),yamlPath:["toolkit_config","coding","engine"],engine:l.data})}return n}a(QC,"readWorkflowCodingEngines");function XC(t){let e=[...new Set(t)];return e.length===1?e[0]:void 0}a(XC,"commonEngine");function eT(t,e){let n=ZC.relative(t,e);return n&&!n.startsWith("..")?n:e}a(eT,"relativeTo");var nT="aitable-workflow.config.yml";async function Tm(t,e={}){let n=e.detection??Rm(),r=await or(t),o=e.engineExplicitlySet??!0,i=[];n.available.length===0?i.push({key:"coding_agent.detected",status:"warn",message:"\u672A\u68C0\u6D4B\u5230\u672C\u673A Coding Agent CLI\uFF08\u8BF7\u5B89\u88C5 claude/codex/qoder \u7B49 CLI\uFF0C\u6216\u542F\u52A8\u5DF2\u5B89\u88C5\u7684\u5343\u95EE\u529E\u516C\u684C\u9762\u5E94\u7528\u4EE5\u542F\u7528 qwenwork\uFF0C\u6216\u9009\u62E9 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09"}):i.push({key:"coding_agent.detected",status:"ok",value:n.available.map(u=>u.engine),message:`\u672C\u673A\u53EF\u7528: ${n.available.map(u=>`${u.engine}(${u.cmd})`).join(", ")}`});let s=Cm(r,n),c=Ji(r.configuredEngine,n);o?!c&&s?i.push({key:"coding_agent.engine",status:"error",value:s,message:`\u5F53\u524D Coding Agent \u914D\u7F6E\u4E3A ${r.configuredEngine}\uFF0C\u4F46\u672C\u673A\u672A\u68C0\u6D4B\u5230\uFF1B\u5EFA\u8BAE\u5207\u6362\u4E3A ${s}`,writeTarget:Zi(r)}):!c&&r.configuredEngine!=="llm_only"?i.push({key:"coding_agent.engine",status:"error",value:s??r.configuredEngine,message:`Coding Agent \u914D\u7F6E\u4E3A ${r.configuredEngine}\uFF0C\u4F46\u672C\u673A\u672A\u68C0\u6D4B\u5230\u5BF9\u5E94 CLI\uFF08\u8BF7\u9009\u62E9\u672C\u673A\u53EF\u7528\u7684 Coding Agent\uFF09`,writeTarget:Zi(r)}):i.push({key:"coding_agent.engine",status:"ok",value:r.configuredEngine,message:`Coding Agent = ${r.configuredEngine}`,writeTarget:Zi(r)}):i.push({key:"coding_agent.engine",status:"error",value:s??"llm_only",message:s?`agent.engine \u672A\u914D\u7F6E\uFF0C\u8BF7\u9009\u62E9\u672C\u673A\u53EF\u7528\u7684 Coding Agent\uFF08\u672C\u673A\u53EF\u7528: ${n.available.map(u=>u.engine).join(", ")}\uFF09`:"agent.engine \u672A\u914D\u7F6E\uFF0C\u4E14\u672C\u673A\u672A\u68C0\u6D4B\u5230\u4EFB\u4F55 Coding Agent CLI\uFF08\u53EF\u9009 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09",writeTarget:Zi(r)});for(let u of r.workflowOverrides)i.push({key:`coding_agent.workflow.${u.workflowId}`,status:u.engine===r.projectEngine?"ok":"warn",value:u.engine,message:`workflow ${u.workflowId} coding.engine = ${u.engine}${u.engine===r.projectEngine?"":"\uFF08\u8986\u76D6\u9879\u76EE\u7EA7\uFF09"}`,writeTarget:{type:"yaml",file:u.file,yamlPath:u.yamlPath}});let l=await rT(t,r.configuredAgent);return l&&i.push(l),{id:"coding_agent",name:"Coding Agent",ok:!i.some(u=>u.status==="error"),items:i}}a(Tm,"checkCodingAgent");async function rT(t,e){if(!e)return;let n=bt(t.configDir),r;try{r=await tT(n,"utf8")}catch{return{key:"coding_agent.config.enabled",status:"error",message:`coding-agents.config.json \u4E0D\u5B58\u5728\uFF0C${e} \u672A\u542F\u7528`,writeTarget:{type:"json",file:"coding-agents.config.json",jsonPath:["agents",e,"enabled"],valueType:"boolean"}}}let o;try{o=JSON.parse(r)}catch{return{key:"coding_agent.config.enabled",status:"error",message:"coding-agents.config.json JSON \u89E3\u6790\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u683C\u5F0F"}}let i=o&&typeof o=="object"&&!Array.isArray(o)?o.agents:void 0,s=i&&typeof i=="object"&&!Array.isArray(i)?i[e]:void 0;if(!(s&&typeof s=="object"&&!Array.isArray(s)&&s.enabled===!0))return{key:"coding_agent.config.enabled",status:"error",message:`coding-agents.config.json \u4E2D ${e} \u672A\u542F\u7528\uFF0Csetup/run \u9636\u6BB5\u65E0\u6CD5\u52A0\u8F7D\u8BE5 agent`,writeTarget:{type:"json",file:"coding-agents.config.json",jsonPath:["agents",e,"enabled"],valueType:"boolean"}}}a(rT,"checkCodingAgentConfigEnabled");function Zi(t){return{type:"yamlAll",targets:[{file:nT,yamlPath:["agent","engine"]},...t.workflowOverrides.map(e=>({file:e.file,yamlPath:e.yamlPath}))]}}a(Zi,"syncTargets");import{readFile as M_}from"fs/promises";import{existsSync as O_,readFileSync as j_}from"fs";import po from"path";import uh from"yaml";import{readFile as oT}from"fs/promises";import iT from"yaml";async function He(t,e={}){let n;try{n=await oT(t,"utf8")}catch(w){throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u4F5C\u6D41\u6A21\u677F ${t}: ${w instanceof Error?w.message:String(w)}`)}let r;try{r=iT.parse(n)}catch(w){throw new Error(`\u5DE5\u4F5C\u6D41\u6A21\u677F YAML \u89E3\u6790\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}if(e.envSource)try{let w=new Map,b=0,x=a(I=>{if(Array.isArray(I))return I.map(x);if(I&&typeof I=="object"){let v={};for(let[k,R]of Object.entries(I))if(Qt(R)){let T=`__RTREF_${b++}__`;w.set(T,R),v[k]=T}else v[k]=x(R);return v}return I},"shield");if(S(r)&&Array.isArray(r.event_sources))for(let I of r.event_sources)S(I)&&I.config&&(I.config=x(I.config));if(r=nr(r,e.envSource),w.size>0){let I=a(v=>{if(typeof v=="string")return w.get(v)??v;if(Array.isArray(v))return v.map(I);if(v&&typeof v=="object"){let k={};for(let[R,T]of Object.entries(v))k[R]=I(T);return k}return v},"restore");r=I(r)}}catch(w){throw new Error(`\u5DE5\u4F5C\u6D41\u6A21\u677F\u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}if(!S(r))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let o=sT(r.meta),i=aT(r.steps),s=uT(r.edges),c=yT(r.event_sources),l=wT(r.event_handlers),d=hT(i,s),u=bT(r.tracker),f=S(r.toolkit_config)?r.toolkit_config:void 0,p=ST(r.notification),g=r.field_definitions;g!=null&&h.warn("workflow","workflow.yml \u6839\u7EA7 field_definitions \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u5728 tracker.field_definitions \u4E2D\u58F0\u660E");let m=gT(u?.field_definitions??g),y=fT(r.steps,m);return h.info("workflow","\u6A21\u677F\u52A0\u8F7D\u5B8C\u6210",{name:o.name,stepCount:i.length,edgeCount:s.length,eventSourceCount:c.length,hasTracker:!!u,hasToolkitConfig:!!f,notificationChannel:p?.channel??"none",fieldRefs:y.all.size}),{meta:o,steps:i,edges:s,eventSources:c,eventHandlers:l,orderedStepIds:d,referencedFields:y,fieldDefinitions:m,tracker:u,toolkitConfig:f,notification:p}}a(He,"loadWorkflowTemplate");function sT(t){if(!S(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 meta \u6BB5");return{id:typeof t.id=="string"&&t.id.trim()?t.id:void 0,name:String(t.name??"unnamed"),version:String(t.version??"1.0.0"),domain:String(t.domain??"custom"),description:typeof t.description=="string"?t.description:void 0}}a(sT,"parseMeta");function aT(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 steps \u6570\u7EC4");return t.map((e,n)=>{if(!S(e))throw new Error(`steps[${n}] \u5FC5\u987B\u662F\u5BF9\u8C61`);let r=String(e.id??`step_${n}`);return{id:r,name:String(e.name??r),recipe:typeof e.recipe=="string"&&e.recipe.trim()?e.recipe:void 0,prompt:typeof e.prompt=="string"?e.prompt:void 0,engine:Am(e.engine),auto:e.auto!==!1,needs_human:cT(e.needs_human),sla:lT(e.sla),input_mapping:_m(e.input_mapping),output_mapping:_m(e.output_mapping),config:mT(e.config)}})}a(aT,"parseSteps");function cT(t){if(!S(t))return;let e=typeof t.reason=="string"?t.reason:"";if(e)return{reason:e,assignee_field:typeof t.assignee_field=="string"?t.assignee_field:void 0}}a(cT,"parseNeedsHuman");function Am(t){if(t==="claude"||t==="codex"||t==="qoder"||t==="codebuddy"||t==="opencode"||t==="qwen"||t==="deepseek"||t==="trae"||t==="llm_only")return t}a(Am,"parseEngine");function lT(t){if(S(t))return{timeout_ms:typeof t.timeout_ms=="number"?t.timeout_ms:3e5,escalation:dT(t.escalation)}}a(lT,"parseSLA");function dT(t){if(t==="notify"||t==="skip"||t==="block")return t}a(dT,"parseEscalation");function _m(t){if(!S(t))return;let e={};for(let[n,r]of Object.entries(t))typeof r=="string"&&(e[n]=r);return Object.keys(e).length>0?e:void 0}a(_m,"parseMapping");function uT(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 edges \u6570\u7EC4");return t.map((e,n)=>{if(!S(e))throw new Error(`edges[${n}] \u5FC5\u987B\u662F\u5BF9\u8C61`);return{from:String(e.from??""),to:String(e.to??""),condition:typeof e.condition=="string"?e.condition:void 0}})}a(uT,"parseEdges");function fT(t,e=[]){let n=new Set,r=new Set,o=new Set,i=new Set(e.filter(l=>pT(l.type)).map(l=>l.name));if(!Array.isArray(t))return{input:n,output:r,userInput:new Set,other:o,all:new Set};for(let l of t)S(l)&&Em(l,n,r,o);let s=new Set;for(let l of n)i.has(l)?o.add(l):r.has(l)||s.add(l);let c=new Set([...n,...r,...o]);return{input:n,output:r,userInput:s,other:o,all:c}}a(fT,"extractFieldRefs");function Em(t,e,n,r){for(let[o,i]of Object.entries(t))if(o.endsWith("_mapping")&&S(i)){let s=o.startsWith("input")?e:o.startsWith("output")?n:r;for(let c of Object.values(i))typeof c=="string"&&c&&!c.startsWith("$var.")&&s.add(c)}else o.endsWith("_field")&&typeof i=="string"&&i?r.add(i):S(i)&&Em(i,e,n,r)}a(Em,"walkStepForFields");var ll=new Set(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]);function pT(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(pT,"isSystemFieldType");function gT(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!S(n))continue;let r=typeof n.name=="string"?n.name:"",o=typeof n.type=="string"?n.type:"text";if(!r)continue;ll.has(o)||h.warn("workflow",`field_definitions \u4E2D\u5B57\u6BB5"${r}"\u7684\u7C7B\u578B "${o}" \u4E0D\u53D7\u652F\u6301\uFF0C\u5DF2\u964D\u7EA7\u4E3A text`,{field:r,declaredType:o,supported:[...ll]});let i=ll.has(o)?o:"text",s=Array.isArray(n.options)?n.options.filter(c=>typeof c=="string"):void 0;e.push({name:r,type:i,...s&&s.length>0?{options:s}:{}})}return e}a(gT,"parseFieldDefinitions");function mT(t){if(S(t))return t}a(mT,"parseStepConfig");function hT(t,e){let n=new Set(t.map(s=>s.id)),r=new Map;for(let s of e)r.set(s.from,s.to);let o=[],i=r.get("__start__");for(;i&&i!=="__end__";){if(!n.has(i))throw new Error(`\u8FB9\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4: ${i}`);if(o.includes(i))throw new Error(`\u68C0\u6D4B\u5230\u5FAA\u73AF\u5F15\u7528: ${i}`);o.push(i),i=r.get(i)}if(o.length!==t.length){let s=t.filter(c=>!o.includes(c.id)).map(c=>c.id);h.warn("workflow","\u90E8\u5206\u6B65\u9AA4\u672A\u5728\u8FB9\u4E2D\u8FDE\u63A5",{missing:s})}return o}a(hT,"topologicalSort");function yT(t){return!t||!Array.isArray(t)?[]:t.filter(S).map(e=>{let n=String(e.name??""),r=String(e.type??""),o=String(e.handler??"");return(!r||!o)&&h.warn("workflow","\u4E8B\u4EF6\u6E90\u7F3A\u5C11 type \u6216 handler",{item:e}),{name:n,type:r,handler:o,config:S(e.config)?e.config:{},...S(e.handler_config)?{handler_config:e.handler_config}:{},...e.record_policy==="on_demand"||e.record_policy==="eager"?{record_policy:e.record_policy}:{},active_on_steps:Array.isArray(e.active_on_steps)?e.active_on_steps.map(String):void 0}})}a(yT,"parseEventSources");function wT(t){return!t||!Array.isArray(t)?[]:t.filter(S).map(e=>({trigger:String(e.trigger??""),recipe:String(e.recipe??""),engine:Am(e.engine)}))}a(wT,"parseEventHandlers");function bT(t){if(!S(t))return;let e=ol.safeParse(t);if(!e.success){if(kT(t)){h.info("workflow","workflow.yml tracker.base_id \u4E3A\u7A7A\uFF0C\u6309\u8BBE\u8BA1\u671F\u8349\u7A3F\u5904\u7406\uFF1Bsetup \u4F1A\u521B\u5EFA\u6216\u590D\u7528 AI \u8868\u683C\u540E\u5199\u56DE\uFF0Crun \u524D\u9700\u5148\u5B8C\u6210 setup");return}h.warn("workflow","workflow.yml tracker \u89E3\u6790\u5931\u8D25\uFF0C\u5FFD\u7565",{errors:e.error.issues.map(n=>n.message)});return}return e.data}a(bT,"parseTracker");function kT(t){return t.base_id===""||t.baseId===""}a(kT,"isDraftTracker");var vT=new Set(["none","webhook","im"]);function ST(t){if(!S(t))return;let e=typeof t.channel=="string"?t.channel:"none",n=vT.has(e)?e:"none",r=S(t.webhook)&&typeof t.webhook.url=="string"?{url:t.webhook.url,...S(t.webhook.headers)?{headers:t.webhook.headers}:{}}:void 0,o=S(t.im)?{...typeof t.im.bot_token_env=="string"?{bot_token_env:t.im.bot_token_env}:{}}:void 0,i=S(t.templates)?Object.fromEntries(Object.entries(t.templates).filter(([,s])=>typeof s=="string").map(([s,c])=>[s,c])):void 0;return{channel:n,...r?{webhook:r}:{},...o&&Object.keys(o).length>0?{im:o}:{},...i&&Object.keys(i).length>0?{templates:i}:{}}}a(ST,"parseNotification");import{readFile as sh}from"fs/promises";import kl from"path";import Xi from"path";import Dm from"fs";async function $t(t,e){return Pm({recipeDir:t,recipeId:e,exportMethod:"execute",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 execute \u51FD\u6570"})}a($t,"loadRecipeDefinitionResult");async function es(t,e){return(await $t(t,e)).definition}a(es,"loadRecipeDefinition");async function $n(t,e){return Pm({recipeDir:t,recipeId:e,exportMethod:"create",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 create \u51FD\u6570"})}a($n,"loadEventHandlerDefinitionResult");async function dl(t,e){return(await $n(t,e)).definition}a(dl,"loadEventHandlerDefinition");function ir(t,e){let n=Xi.resolve(t,`${e}.recipe.ts`),r=Xi.resolve(t,`${e}.recipe.js`);return Dm.existsSync(n)?n:Dm.existsSync(r)?r:null}a(ir,"resolveRecipePath");async function Pm(t){let{recipeDir:e,recipeId:n,exportMethod:r,invalidExportMessage:o}=t,i=ir(e,n);if(!i)return{definition:null,failure:{code:"not_found",message:`\u672A\u627E\u5230 recipe \u6587\u4EF6\uFF08\u5DF2\u68C0\u67E5 ${Xi.resolve(e,`${n}.recipe.ts`)}\u3001${Xi.resolve(e,`${n}.recipe.js`)}\uFF09`}};i.endsWith(".ts")&&await Ut();try{let s=await import(mn(i)),c=s.default??s.recipe;return!c||typeof c[r]!="function"?{definition:null,failure:{code:"invalid_export",recipePath:i,message:`${o}\uFF08${i}\uFF09`}}:{definition:c,failure:null}}catch(s){return{definition:null,failure:{code:"import_failed",recipePath:i,message:`\u5BFC\u5165\u5931\u8D25\uFF08${i}\uFF09: ${s instanceof Error?s.message:String(s)}`}}}}a(Pm,"loadDefinition");async function sr(t,e){let n=[],r=[];for(let o of e.steps){let i=o.recipe;if(!i)continue;let s=await $t(t,i);if(!s.definition){n.push({stepId:o.id,recipeId:i,level:"error",message:`\u65E0\u6CD5\u52A0\u8F7D recipe\u300C${i}\u300D: ${s.failure.message}`}),r.push({stepId:o.id,recipeId:i,configSummary:Yi(o.config),loaded:!1});continue}let l=s.definition.meta;$m(o.config,l.config,o.id,i,n),r.push({stepId:o.id,recipeId:i,configSummary:Yi(o.config),loaded:!0})}for(let o of e.eventSources??[]){let i=o.handler;if(!i)continue;let s=`event:${o.name||i}`,c=await $n(t,i);if(!c.definition){n.push({stepId:s,recipeId:i,level:"error",message:`\u65E0\u6CD5\u52A0\u8F7D EventHandler\u300C${i}\u300D: ${c.failure.message}`}),r.push({stepId:s,recipeId:i,configSummary:Yi(o.handler_config),loaded:!1});continue}let l=c.definition;$m(o.handler_config,l.meta.config,s,i,n),r.push({stepId:s,recipeId:i,configSummary:Yi(o.handler_config),loaded:!0})}return{issues:n,rows:r}}a(sr,"checkWorkflowRecipes");function $m(t,e,n,r,o){let i=t??{};if(!e){Object.keys(i).length>0&&o.push({stepId:n,recipeId:r,level:"warn",message:"\u63D0\u4F9B\u4E86 config\uFF0C\u4F46 meta.config \u672A\u58F0\u660E schema\uFF08\u65E0\u6CD5\u6821\u9A8C\uFF09"});return}let s={};for(let[d,u]of Object.entries(i))Xr.has(d)&&(u===!0||u===!1)||(s[d]=u);let c=e.safeParse(s);if(!c.success)for(let d of c.error.issues){let u=xT(s,d.path);IT(u)||RT(u)||o.push({stepId:n,recipeId:r,level:"error",message:`config.${d.path.join(".")||"<root>"}: ${d.message}`})}let l=Qi(e);if(l){let d=new Set(Object.keys(l));for(let u of Object.keys(i))d.has(u)||o.push({stepId:n,recipeId:r,level:"warn",message:`config \u542B schema \u672A\u58F0\u660E\u7684 key\u300C${u}\u300D\uFF08\u53EF\u80FD\u62FC\u5199\u9519\u8BEF\uFF09`})}}a($m,"checkConfigAgainstSchema");function xT(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}a(xT,"getValueAtPath");function IT(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return Object.keys(e).length===1&&typeof e.ref=="string"&&e.ref.trim()!==""}a(IT,"isRefObject");function RT(t){return typeof t=="string"&&/^\$\{[^}]+\}$/.test(t.trim())}a(RT,"isPlaceholderString");function Qi(t){if(!t)return null;let e=t;return e?._def?.typeName==="ZodObject"&&e.shape?typeof e.shape=="function"?e.shape():e.shape:typeof e.unwrap=="function"?Qi(e.unwrap()):e?._def?.schema?Qi(e._def.schema):e?._def?.innerType?Qi(e._def.innerType):null}a(Qi,"objectShape");function Yi(t){if(!t)return[];let e=[];for(let[n,r]of Object.entries(t))if(r===!0||r===!1)e.push(`${n}=${r}`);else if(r&&typeof r=="object"){let o=Object.entries(r).map(([i,s])=>`${i}=${typeof s=="object"?JSON.stringify(s):String(s)}`).join(", ");e.push(o?`${n}{${o}}`:`${n}{}`)}else e.push(`${n}=${String(r)}`);return e}a(Yi,"summarizeConfig");import{readFileSync as CT,existsSync as Mm}from"fs";import ts from"path";import TT from"yaml";var Om=/^\$\{roles\.([^}]+)\}$/;function _T(t,e){let n=e.split(/\.(?![^[]*\])/),r=t;for(let o of n){if(r==null||typeof r!="object")return;let i=o.match(/^(.+)\[(\d+)\]$/);if(i){let s=i[1],c=Number(i[2]),l=r[s];if(!Array.isArray(l))return;r=l[c]}else r=r[o]}return r}a(_T,"getByJsonPath");function rs(t,e,n){if(typeof t=="string"){let r=t.match(Om);if(r){let o=r[1],i=_T(e,o);if(i===void 0)throw new Error(`profile \u5185\u90E8\u5F15\u7528\u5C55\u5F00\u5931\u8D25: \${roles.${o}} \u627E\u4E0D\u5230\u76EE\u6807\u503C\uFF08\u4F4D\u4E8E ${n}\uFF09`);return i}return t}if(Array.isArray(t))return t.map((r,o)=>rs(r,e,`${n}[${o}]`));if(t&&typeof t=="object"){let r={};for(let[o,i]of Object.entries(t))r[o]=rs(i,e,`${n}.${o}`);return r}return t}a(rs,"expandProfileRefs");function os(t,e="roles"){return typeof t=="string"?Om.test(t)?[`${e} \u2192 ${t}`]:[]:Array.isArray(t)?t.flatMap((n,r)=>os(n,`${e}[${r}]`)):t&&typeof t=="object"?Object.entries(t).flatMap(([n,r])=>os(r,`${e}.${n}`)):[]}a(os,"findPendingRefs");function AT(t){let e=t,n=Object.keys(t).length+1;for(let o=0;o<n;o++){if(os(e).length===0)return e;e=rs(e,e,"roles")}let r=os(e);throw new Error(`profile roles \u6BB5\u5FAA\u73AF\u5F15\u7528\uFF1A\u7ECF ${n} \u8F6E\u5C55\u5F00\u4ECD\u6709\u5F15\u7528\u65E0\u6CD5\u6536\u655B\uFF08${r.join("\u3001")}\uFF09`)}a(AT,"expandRolesRefs");var ns=new Map;function ul(t){if(Mm(ts.resolve(t,"profile","profile.yml")))return t;let e=ts.resolve(t,"profiles","default","profile","profile.yml");return Mm(e)?ts.resolve(t,"profiles","default"):null}a(ul,"resolveProfileConfigDir");function lt(t,e,n={}){let r=`${t}\0${n.lenientEnv?"lenient":"strict"}`,o=ns.get(r);if(o!==void 0)return o;let i=ul(t);if(!i)return ns.set(r,null),null;let s=ts.resolve(i,"profile","profile.yml"),c;try{c=CT(s,"utf8")}catch(w){throw new Error(`profile.yml \u8BFB\u53D6\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}let l;try{l=TT.parse(c)}catch(w){throw new Error(`profile.yml YAML \u89E3\u6790\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}try{l=nr(l,e??vm(t),{lenient:n.lenientEnv===!0})}catch(w){throw new Error(`profile.yml \u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}if(!l||typeof l!="object")throw new Error("profile.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let d=l,u=typeof d.schema_version=="number"?d.schema_version:void 0;if(u!==2)throw new Error(`profile.yml \u4F7F\u7528\u65E7\u7248\u7ED3\u6784\uFF08schema_version: ${u??"\u672A\u58F0\u660E"}\uFF09\uFF0C\u8BF7\u6309\u8FC1\u79FB\u6307\u5357\u5347\u7EA7\u4E3A v2\u3002v2 \u7ED3\u6784\u4EE5 roles / workflows \u4E24\u4E2A\u8F74\u7EC4\u7EC7\u914D\u7F6E\uFF0Cworkflow.yml \u4E0D\u518D\u643A\u5E26 config \u7C7B\u914D\u7F6E\u3002`);let f=oo(d.roles)?AT(d.roles):void 0,p=oo(d.workflows)?d.workflows:void 0,g;p&&f?g=rs(p,f,"workflows"):p&&(g=p);let m=oo(d.meta)?{label:typeof d.meta.label=="string"?d.meta.label:void 0,description:typeof d.meta.description=="string"?d.meta.description:void 0}:void 0,y={schema_version:2,...m?{meta:m}:{},...f?{roles:f}:{},...g?{workflows:g}:{}};return ns.set(r,y),h.info("config","profile v2 \u52A0\u8F7D\u5B8C\u6210",{rolesCount:f?Object.keys(f).length:0,workflowsCount:g?Object.keys(g).length:0}),y}a(lt,"loadProfileConfig");function Pn(){ns.clear()}a(Pn,"resetProfileCache");function nn(t,e,n){if(ET(t,e),e.toolkit_config){let r=n.toolkitConfig??{};for(let[o,i]of Object.entries(e.toolkit_config))i&&typeof i=="object"&&!Array.isArray(i)&&r[o]&&typeof r[o]=="object"?r[o]={...r[o],...i}:r[o]=i;n.toolkitConfig=r}if(e.event_sources){let r=new Map(n.eventSources.map(o=>[o.name,o]));for(let[o,i]of Object.entries(e.event_sources)){let s=r.get(o);if(!s)throw new Error(`profile.workflows.${t}.event_sources.${o} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E8B\u4EF6\u6E90\uFF08workflow.yml \u4E2D\u65E0 name="${o}" \u7684\u4E8B\u4EF6\u6E90\uFF09`);let{handler_config:c,...l}=i;s.config={...s.config,...l},c&&typeof c=="object"&&(s.handler_config={...s.handler_config??{},...c})}}if(e.steps){let r=new Map(n.steps.map(o=>[o.id,o]));for(let[o,i]of Object.entries(e.steps)){let s=r.get(o);if(!s)throw new Error(`profile.workflows.${t}.steps.${o} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\uFF08workflow.yml \u4E2D\u65E0 id="${o}" \u7684\u6B65\u9AA4\uFF09`);s.config={...s.config??{},...i}}}}a(nn,"injectProfileConfig");function ET(t,e){if(e.event_sources){for(let[n,r]of Object.entries(e.event_sources))if(oo(r)&&"config"in r)throw new Error(`profile.workflows.${t}.event_sources.${n}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile event source \u4E0B\u9664 handler_config \u5916\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 event_sources[].config\uFF0C\u8BF7\u6539\u4E3A workflows.${t}.event_sources.${n}.<\u5B57\u6BB5\u540D>`)}if(e.steps){for(let[n,r]of Object.entries(e.steps))if(oo(r)&&"config"in r)throw new Error(`profile.workflows.${t}.steps.${n}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile step \u4E0B\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 step.config\uFF0C\u8BF7\u6539\u4E3A workflows.${t}.steps.${n}.<\u5B57\u6BB5\u540D>`)}}a(ET,"assertNoNestedProfileConfig");function oo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}a(oo,"isRecord");var io=new Set(["\u6807\u9898","\u72B6\u6001","\u5F53\u524D\u6B65\u9AA4","\u5904\u7406\u4EBA","\u4E8B\u4EF6\u65E5\u5FD7","\u63CF\u8FF0","\u622A\u6B62\u65F6\u95F4"]);import DT from"yaml";function jm(t){let e=new Set;if(!t)return e;let n=a(o=>{if(Array.isArray(o))for(let i of o)S(i)&&typeof i.name=="string"&&e.add(i.name)},"collect"),r=t.tracker;return S(r)&&n(r.field_definitions),n(t.field_definitions),e}a(jm,"extractDeclaredFieldNames");var ar="__start__",cr="__end__",$T=/^[a-z0-9_]+$/;function Fm(t,e){let n=[],r;try{r=DT.parse(t)}catch(l){return n.push({code:"WF-S01",severity:"error",message:`workflow.yml YAML \u89E3\u6790\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`,location:{file:e}}),{issues:n,fatal:!0,raw:null}}if(!S(r))return n.push({code:"WF-S01",severity:"error",message:"workflow.yml \u6839\u8282\u70B9\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61",location:{file:e}}),{issues:n,fatal:!0,raw:null};S(r.meta)?(!r.meta.name||typeof r.meta.name!="string")&&n.push({code:"WF-S02",severity:"error",message:"meta.name \u4E0D\u80FD\u4E3A\u7A7A",location:{file:e}}):n.push({code:"WF-S02",severity:"error",message:"\u7F3A\u5C11 meta \u6BB5",location:{file:e}});let o=new Set,i=r.steps;!Array.isArray(i)||i.length===0?n.push({code:"WF-S03",severity:"error",message:"steps \u6570\u7EC4\u7F3A\u5931\u6216\u4E3A\u7A7A",location:{file:e}}):i.forEach((l,d)=>{let u={file:e,stepId:void 0};if(!S(l)){n.push({code:"WF-S03",severity:"error",message:`steps[${d}] \u5FC5\u987B\u662F\u5BF9\u8C61`,location:u});return}let f=l.id;if(typeof f!="string"||f.length===0){n.push({code:"WF-S03",severity:"error",message:`steps[${d}] \u7F3A\u5C11 id`,location:u});return}u.stepId=f,$T.test(f)||n.push({code:"WF-S03",severity:"error",message:`\u6B65\u9AA4 id\u300C${f}\u300D\u53EA\u5141\u8BB8\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF`,location:u}),o.has(f)&&n.push({code:"WF-S03",severity:"error",message:`\u6B65\u9AA4 id\u300C${f}\u300D\u91CD\u590D`,location:u}),o.add(f),!l.recipe&&!l.prompt&&n.push({code:"WF-S06",severity:"error",message:`\u6B65\u9AA4\u300C${f}\u300D\u65E2\u6CA1\u6709 recipe \u4E5F\u6CA1\u6709 prompt\uFF0C\u65E0\u6CD5\u6267\u884C`,location:u})});let s=r.edges;if(!Array.isArray(s)||s.length===0)n.push({code:"WF-S04",severity:"error",message:"edges \u6570\u7EC4\u7F3A\u5931\u6216\u4E3A\u7A7A",location:{file:e}});else{let l=!1,d=!1;if(s.forEach((u,f)=>{if(!S(u)){n.push({code:"WF-S04",severity:"error",message:`edges[${f}] \u5FC5\u987B\u662F\u5BF9\u8C61`,location:{file:e}});return}let p=String(u.from??""),g=String(u.to??"");if(!p||!g){n.push({code:"WF-S04",severity:"error",message:`edges[${f}] \u7F3A\u5C11 from/to`,location:{file:e}});return}p===ar&&(l=!0),g===cr&&(d=!0),p!==ar&&p!==cr&&!o.has(p)&&n.push({code:"WF-S04",severity:"error",message:`edges[${f}].from \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\u300C${p}\u300D`,location:{file:e}}),g!==ar&&g!==cr&&!o.has(g)&&n.push({code:"WF-S04",severity:"error",message:`edges[${f}].to \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\u300C${g}\u300D`,location:{file:e}})}),l||n.push({code:"WF-S04",severity:"error",message:"edges \u7F3A\u5C11\u4ECE __start__ \u51FA\u53D1\u7684\u8FB9",location:{file:e}}),d||n.push({code:"WF-S04",severity:"error",message:"edges \u7F3A\u5C11\u5230\u8FBE __end__ \u7684\u8FB9",location:{file:e}}),o.size>0&&l){let u=MT(s,o);for(let f of u)n.push({...f,location:{file:e,stepId:f.location?.stepId}})}}PT(r.tracker,n,e);let c=n.some(l=>l.severity==="error");return{issues:n,fatal:c,raw:r}}a(Fm,"checkStructure");function PT(t,e,n){if(!S(t)||t.views===void 0)return;let r=t.views;if(!Array.isArray(r)){e.push({code:"WF-S07",severity:"error",message:"tracker.views \u5FC5\u987B\u662F\u6570\u7EC4",location:{file:n,key:"tracker.views"}});return}r.forEach((o,i)=>{let s=`tracker.views[${i}]`,c=new Set;S(o)&&Array.isArray(o.filter)&&o.filter.forEach((d,u)=>{if(S(d)&&Array.isArray(d.equals)){let f=`filter.${u}.equals`;c.add(f),e.push({code:"WF-S07",severity:"error",message:`${s}.filter[${u}].equals \u53EA\u652F\u6301\u5355\u4E2A\u5B57\u7B26\u4E32\uFF1B\u591A\u503C\u7B5B\u9009\u8BF7\u5199 any_of: ["\u503C1", "\u503C2"]`,location:{file:n,key:`${s}.filter[${u}].equals`}})}});let l=ro.safeParse(o);if(!l.success){let d=l.error.issues.filter(u=>!c.has(u.path.join("."))).map(u=>`${u.path.length?`${s}.${u.path.join(".")}`:s}: ${u.message}`).join("; ");if(!d)return;e.push({code:"WF-S07",severity:"error",message:`tracker.views \u914D\u7F6E\u4E0D\u5408\u6CD5\uFF1A${d}`,location:{file:n,key:s}})}})}a(PT,"validateTrackerViews");function MT(t,e){let n=[],r=new Map,o=new Map,i=new Set([ar,cr,...e]);for(let p of i)r.set(p,new Set),o.set(p,new Set);for(let p of t){if(!S(p))continue;let g=String(p.from??""),m=String(p.to??"");!i.has(g)||!i.has(m)||(r.get(g).add(m),o.get(m).add(g))}let s=a((p,g)=>{let m=new Set,y=[p];for(;y.length>0;){let w=y.shift();for(let b of g.get(w)??[])m.has(b)||(m.add(b),y.push(b))}return m},"reach"),c=s(ar,r),l=s(cr,o);for(let p of e)c.has(p)?l.has(p)||n.push({code:"WF-S05",severity:"error",message:`\u6B65\u9AA4\u300C${p}\u300D\u65E0\u6CD5\u5230\u8FBE __end__\uFF08\u6D41\u7A0B\u5728\u6B64\u4E2D\u65AD\uFF09`,location:{stepId:p}}):n.push({code:"WF-S05",severity:"error",message:`\u6B65\u9AA4\u300C${p}\u300D\u4ECE __start__ \u4E0D\u53EF\u8FBE\uFF08\u6CA1\u6709\u8FDB\u5165\u8FB9\u94FE\u8DEF\uFF09`,location:{stepId:p}});let d=new Map,u=null,f=a(p=>{if(!u){d.set(p,1);for(let g of r.get(p)??[]){if(g===ar||g===cr)continue;let m=d.get(g)??0;if(m===1){u=g;return}m===0&&f(g)}d.set(p,2)}},"dfs");for(let p of e)(d.get(p)??0)===0&&f(p);return u&&n.push({code:"WF-S05",severity:"error",message:`\u6B65\u9AA4\u56FE\u5B58\u5728\u73AF\uFF08\u6D89\u53CA\u6B65\u9AA4\u300C${u}\u300D\uFF09`,location:{stepId:u}}),n}a(MT,"checkGraphHealth");async function Wm(t,e,n){let r=[],o=new Map,i=new Map,s=new Set;for(let l of e.steps)l.recipe&&s.add(l.recipe);for(let l of s){let d=await $t(t,l);if(d.definition){o.set(l,d.definition),Nm(d.definition.meta?.id,l,"step",r,n(l));continue}r.push(await Lm(d,t,l,"step",n))}let c=new Set;for(let l of e.eventSources)l.handler&&c.add(l.handler);for(let l of e.eventHandlers)l.recipe&&c.add(l.recipe);for(let l of c){let d=await $n(t,l);if(d.definition){i.set(l,d.definition),Nm(d.definition.meta?.id,l,"handler",r,n(l));continue}r.push(await Lm(d,t,l,"handler",n))}return{issues:r,recipes:o,handlers:i}}a(Wm,"checkRecipeBind");function Nm(t,e,n,r,o){if(!t)return;(n==="handler"&&e.endsWith("_handler")?new Set([e,e.slice(0,-8)]):new Set([e])).has(t)||r.push({code:"WF-R04",severity:"warning",message:n==="handler"?`handler meta.id\u300C${t}\u300D\u4E0E\u5F15\u7528 id\u300C${e}\u300D\u4E0D\u4E00\u81F4\uFF1B\u5141\u8BB8\u5168\u7B49\uFF0C\u6216\u53BB\u6389 _handler \u540E\u7F00\u540E\u4E00\u81F4`:`recipe meta.id\u300C${t}\u300D\u4E0E\u5F15\u7528 id\u300C${e}\u300D\u4E0D\u4E00\u81F4`,location:{file:o,recipeId:e}})}a(Nm,"checkMetaId");async function Lm(t,e,n,r,o){let i=t.failure,s={file:o(n),recipeId:n};return i.code==="not_found"?{code:"WF-R01",severity:"error",message:r==="step"?`\u6B65\u9AA4\u5F15\u7528\u7684 recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${i.message}`:`\u4E8B\u4EF6\u5904\u7406\u5F15\u7528\u7684 recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${i.message}`,location:s}:i.code==="import_failed"?{code:"WF-R02",severity:"error",message:`recipe \u52A0\u8F7D\u5931\u8D25: ${i.message}`,location:s}:(r==="step"?await $n(e,n):await $t(e,n)).definition?{code:"WF-R03",severity:"error",message:`kind \u9519\u914D\uFF1A\u8BE5\u6587\u4EF6\u662F ${r==="step"?"EventHandler\uFF08\u542B create\uFF09":"\u666E\u901A Recipe\uFF08\u542B execute\uFF09"}\uFF0C\u4E0D\u80FD\u4F5C\u4E3A${r==="step"?"\u6B65\u9AA4 recipe":"\u4E8B\u4EF6 handler"}\u4F7F\u7528\uFF08${r==="step"?"\u6B65\u9AA4 recipe\uFF08\u9700\u542B execute\uFF09":"EventHandler\uFF08\u9700\u542B create\uFF09"}\uFF09`,location:s}:{code:"WF-R03",severity:"error",message:`recipe \u5BFC\u51FA\u7ED3\u6784\u65E0\u6548: ${i.message}`,location:s}}a(Lm,"diagnoseLoadFailure");import{readFile as d_}from"fs/promises";import{access as VT,readdir as qT,readFile as as}from"fs/promises";import rn from"path";import Je from"typescript";import fl from"yaml";import{readFile as zm,readdir as OT,access as jT,stat as FT}from"fs/promises";import Ge from"path";import Um from"yaml";import{input as NT}from"@inquirer/prompts";async function is(t){let e=await Ue(t),n=Ge.dirname(e),r=await Vm(e),o=await qm(Ge.join(n,"profile","profile.yml")),i=S(r.workflows)&&typeof r.workflows.dir=="string"?r.workflows.dir:void 0;if(!i)throw new Error("design \u4EC5\u652F\u6301 profile + \u591A workflow \u7684\u65B0\u5F62\u6001\uFF1A\u5F53\u524D config \u7F3A\u5C11 workflows.dir\uFF0C\u7591\u4F3C\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF08\u9876\u5C42\u5355 workflow \u6216\u65E0 profile \u7684\u81EA\u8DB3\u6A21\u5F0F\uFF09\u3002design \u4E0D\u518D\u652F\u6301\u7F16\u8F91\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF0C\u8BF7\u5148\u624B\u52A8\u8FC1\u79FB\u5230\u591A workflow + profile\u3002");let s=await LT(n,i);return{mode:s.some(l=>l.exists)?"brownfield":"greenfield",profileExists:o,workflows:s}}a(is,"probeProjectShape");async function LT(t,e){let n;try{n=await cl(t,e)}catch{n=[]}return n.map(r=>({id:r.id,workflowRelPath:Bm(t,r.templatePath),recipeDirRelPath:Bm(t,r.recipeDir),workflowPath:r.templatePath,recipeDir:r.recipeDir,exists:!0}))}a(LT,"scanExistingWorkflows");function Bm(t,e){let n=Ge.relative(t,e);return n.startsWith(".")?n:`./${n}`}a(Bm,"toRelPath");async function Km(t){let e=await Ue(t.configPath),n=Ge.dirname(e);try{await FT(e)}catch{throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}
335
+ ${JSON.stringify(l.error.issues,null,2)}`);let d=l.data,u=!!d.workflows,f;if(u){if(f=await cl(r,d.workflows.dir),f.length===0)throw new Error(`\u591A\u5DE5\u4F5C\u6D41\u76EE\u5F55 ${d.workflows.dir} \u4E2D\u672A\u627E\u5230\u4EFB\u4F55\u542B workflow.yml \u7684\u5B50\u76EE\u5F55`);h.info("config","\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F",{workflows:f.map(m=>m.id)})}else{if(!d.workflow)throw new Error("\u5355\u5DE5\u4F5C\u6D41\u6A21\u5F0F\u9700\u8981 workflow \u914D\u7F6E");f=[{id:"default",templatePath:xt.resolve(r,d.workflow.template),recipeDir:xt.resolve(r,d.workflow.recipe_dir)}]}let p=d.tracker??xm,g={raw:d,envSource:s,configDir:r,multiWorkflow:u,workflowEntries:f,workflowTemplatePath:f[0].templatePath,recipeDir:f[0].recipeDir,tracker:p,agent:{...UC,...d.agent},recipe:{...KC,...d.recipe},roles:{...Sm,...d.roles},rolesDir:xt.resolve(r,d.roles?.dir??Sm.dir),polling:{...VC,...d.polling},sla:{...qC,...d.sla}};if(h.info("config","\u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210",{mode:u?"multi-workflow":"single-workflow",workflowCount:f.length,engine:g.agent.engine}),d.tracker)for(let m of GC(d))h.warn("config",m);return g}a(je,"loadSettings");async function cl(t,e){let n=xt.resolve(t,e),r;try{r=await BC(n)}catch{throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u591A\u5DE5\u4F5C\u6D41\u76EE\u5F55 ${n}`)}let o=[];for(let i of r.sort()){let s=xt.join(n,i);try{if(!(await al(s)).isDirectory())continue}catch{continue}let c=xt.join(s,"workflow.yml");try{await al(c)}catch{continue}o.push({id:i,templatePath:c,recipeDir:xt.join(s,"recipes")})}return o}a(cl,"scanWorkflowDirs");function GC(t){let e=[],n=t.tracker;if(!n)return e;let r=n.field_definitions;if(!r)return e;let o=n.fields.state,i=r.find(u=>u.name===o);if(!i?.options)return e;let s=new Set(i.options),c=n.states,l=[["initial",c.initial],...c.active.map((u,f)=>[`active[${f}]`,u]),...c.terminal.map((u,f)=>[`terminal[${f}]`,u]),...c.blocked?[["blocked",c.blocked]]:[],...c.review?[["review",c.review]]:[]],d=new Set(l.map(([,u])=>u));for(let[u,f]of l)s.has(f)||e.push(`\u72B6\u6001\u89D2\u8272 ${u}="${f}" \u672A\u51FA\u73B0\u5728\u300C${o}\u300D\u5B57\u6BB5\u9009\u9879\u4E2D,\u8FD0\u884C\u65F6\u5199\u5165\u8BE5\u72B6\u6001\u4F1A\u5931\u8D25`);for(let u of s)d.has(u)||e.push(`\u300C${o}\u300D\u5B57\u6BB5\u9009\u9879 "${u}" \u672A\u88AB\u4EFB\u4F55 states \u89D2\u8272\u6620\u5C04,\u53EF\u80FD\u9057\u6F0F\u914D\u7F6E(\u5982\u5F02\u5E38\u4E2D\u65AD\u6001\u5E94\u6620\u5C04\u5230 blocked)`);return e}a(GC,"validateStateConsistency");function Gi(t,e){return t.multiWorkflow?e:(t.tracker.base_id===xm.base_id?void 0:t.tracker)??e}a(Gi,"resolveWorkflowTracker");function Dn(t,e,n){return{...t,tracker:n,workflowTemplatePath:e.templatePath,recipeDir:e.recipeDir}}a(Dn,"createPerWorkflowSettings");import{readFile as Os}from"fs/promises";import My from"fs";import Wn from"path";import js from"yaml";var rr="aitable-workflow.config.yml";function Im(t,e={}){let n=[];if(n.push({key:"agent.engine",status:"ok",value:t.agent.engine,message:`agent.engine = ${t.agent.engine}`,writeTarget:{type:"yaml",file:rr,yamlPath:["agent","engine"]}}),t.workflowEntries.length===0)n.push({key:"workflow",status:"error",message:"\u672A\u627E\u5230\u5DE5\u4F5C\u6D41\u5165\u53E3",writeTarget:{type:"yaml",file:rr,yamlPath:["workflow"]}});else{let s=t.multiWorkflow?`\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F (${t.workflowEntries.length} \u4E2A\u5DE5\u4F5C\u6D41)`:"\u5355\u5DE5\u4F5C\u6D41\u6A21\u5F0F (workflow.yml)";n.push({key:"workflow",status:"ok",message:`\u5DE5\u4F5C\u6D41\u5165\u53E3: ${s}`})}let r=e.rawScene??t.raw.scene;r?n.push({key:"scene",status:"ok",value:r,message:"scene \u5DF2\u914D\u7F6E",writeTarget:{type:"yaml",file:rr,yamlPath:["scene"]}}):n.push({key:"scene",status:"warn",message:"scene \u672A\u914D\u7F6E\uFF08\u4EC5 design \u9636\u6BB5\u4F7F\u7528\uFF1B\u573A\u666F\u63CF\u8FF0\uFF0C\u7528\u4E8E design \u9636\u6BB5\u751F\u6210\u5DE5\u4F5C\u6D41\uFF09",writeTarget:{type:"yaml",file:rr,yamlPath:["scene"]}});let o=t.polling.interval_ms;return o>0?n.push({key:"polling.interval_ms",status:"ok",value:o,message:`polling.interval_ms = ${o}`,writeTarget:{type:"yaml",file:rr,yamlPath:["polling","interval_ms"]}}):n.push({key:"polling.interval_ms",status:"warn",value:o,message:"polling.interval_ms \u5E94\u5927\u4E8E 0",writeTarget:{type:"yaml",file:rr,yamlPath:["polling","interval_ms"]}}),{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!n.some(s=>s.status==="error"),items:n}}a(Im,"checkProject");import{readFile as tT}from"fs/promises";import{readFile as JC}from"fs/promises";import ZC from"path";import YC from"yaml";async function or(t){let e=await QC(t.workflowEntries,t.configDir),n=t.agent.engine,o=XC(e.map(i=>i.engine))??n;return{projectEngine:n,workflowOverrides:e,configuredEngine:o,...Sn(o)?{configuredAgent:Sn(o)}:{}}}a(or,"resolveCodingAgentSelection");function Rm(){let t=new Set,e=[];for(let n of Ur()){let r=gp(n.type);!r||t.has(r)||(t.add(r),e.push({agent:n.type,engine:r,cmd:n.cmd,...n.version?{version:n.version}:{}}))}return{available:e,...e[0]?{recommendedEngine:e[0].engine}:{}}}a(Rm,"detectCodingEngines");function Ji(t,e){return t==="llm_only"?!0:e.available.some(n=>n.engine===t)}a(Ji,"isEngineDetected");function Cm(t,e){return Ji(t.configuredEngine,e)?t.configuredEngine:Ji(t.projectEngine,e)?t.projectEngine:e.recommendedEngine}a(Cm,"chooseDetectedEngine");async function QC(t,e){let n=[];for(let r of t){let o;try{o=YC.parse(await JC(r.templatePath,"utf8"))}catch{continue}if(!v(o))continue;let i=o.toolkit_config;if(!v(i))continue;let s=i.coding;if(!v(s))continue;let c=s.engine,l=no.safeParse(c);l.success&&n.push({workflowId:r.id,file:eT(e,r.templatePath),yamlPath:["toolkit_config","coding","engine"],engine:l.data})}return n}a(QC,"readWorkflowCodingEngines");function XC(t){let e=[...new Set(t)];return e.length===1?e[0]:void 0}a(XC,"commonEngine");function eT(t,e){let n=ZC.relative(t,e);return n&&!n.startsWith("..")?n:e}a(eT,"relativeTo");var nT="aitable-workflow.config.yml";async function Tm(t,e={}){let n=e.detection??Rm(),r=await or(t),o=e.engineExplicitlySet??!0,i=[];n.available.length===0?i.push({key:"coding_agent.detected",status:"warn",message:"\u672A\u68C0\u6D4B\u5230\u672C\u673A Coding Agent CLI\uFF08\u8BF7\u5B89\u88C5 claude/codex/qoder \u7B49 CLI\uFF0C\u6216\u542F\u52A8\u5DF2\u5B89\u88C5\u7684\u5343\u95EE\u529E\u516C\u684C\u9762\u5E94\u7528\u4EE5\u542F\u7528 qwenwork\uFF0C\u6216\u9009\u62E9 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09"}):i.push({key:"coding_agent.detected",status:"ok",value:n.available.map(u=>u.engine),message:`\u672C\u673A\u53EF\u7528: ${n.available.map(u=>`${u.engine}(${u.cmd})`).join(", ")}`});let s=Cm(r,n),c=Ji(r.configuredEngine,n);o?!c&&s?i.push({key:"coding_agent.engine",status:"error",value:s,message:`\u5F53\u524D Coding Agent \u914D\u7F6E\u4E3A ${r.configuredEngine}\uFF0C\u4F46\u672C\u673A\u672A\u68C0\u6D4B\u5230\uFF1B\u5EFA\u8BAE\u5207\u6362\u4E3A ${s}`,writeTarget:Zi(r)}):!c&&r.configuredEngine!=="llm_only"?i.push({key:"coding_agent.engine",status:"error",value:s??r.configuredEngine,message:`Coding Agent \u914D\u7F6E\u4E3A ${r.configuredEngine}\uFF0C\u4F46\u672C\u673A\u672A\u68C0\u6D4B\u5230\u5BF9\u5E94 CLI\uFF08\u8BF7\u9009\u62E9\u672C\u673A\u53EF\u7528\u7684 Coding Agent\uFF09`,writeTarget:Zi(r)}):i.push({key:"coding_agent.engine",status:"ok",value:r.configuredEngine,message:`Coding Agent = ${r.configuredEngine}`,writeTarget:Zi(r)}):i.push({key:"coding_agent.engine",status:"error",value:s??"llm_only",message:s?`agent.engine \u672A\u914D\u7F6E\uFF0C\u8BF7\u9009\u62E9\u672C\u673A\u53EF\u7528\u7684 Coding Agent\uFF08\u672C\u673A\u53EF\u7528: ${n.available.map(u=>u.engine).join(", ")}\uFF09`:"agent.engine \u672A\u914D\u7F6E\uFF0C\u4E14\u672C\u673A\u672A\u68C0\u6D4B\u5230\u4EFB\u4F55 Coding Agent CLI\uFF08\u53EF\u9009 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09",writeTarget:Zi(r)});for(let u of r.workflowOverrides)i.push({key:`coding_agent.workflow.${u.workflowId}`,status:u.engine===r.projectEngine?"ok":"warn",value:u.engine,message:`workflow ${u.workflowId} coding.engine = ${u.engine}${u.engine===r.projectEngine?"":"\uFF08\u8986\u76D6\u9879\u76EE\u7EA7\uFF09"}`,writeTarget:{type:"yaml",file:u.file,yamlPath:u.yamlPath}});let l=await rT(t,r.configuredAgent);return l&&i.push(l),{id:"coding_agent",name:"Coding Agent",ok:!i.some(u=>u.status==="error"),items:i}}a(Tm,"checkCodingAgent");async function rT(t,e){if(!e)return;let n=bt(t.configDir),r;try{r=await tT(n,"utf8")}catch{return{key:"coding_agent.config.enabled",status:"error",message:`coding-agents.config.json \u4E0D\u5B58\u5728\uFF0C${e} \u672A\u542F\u7528`,writeTarget:{type:"json",file:"coding-agents.config.json",jsonPath:["agents",e,"enabled"],valueType:"boolean"}}}let o;try{o=JSON.parse(r)}catch{return{key:"coding_agent.config.enabled",status:"error",message:"coding-agents.config.json JSON \u89E3\u6790\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u683C\u5F0F"}}let i=o&&typeof o=="object"&&!Array.isArray(o)?o.agents:void 0,s=i&&typeof i=="object"&&!Array.isArray(i)?i[e]:void 0;if(!(s&&typeof s=="object"&&!Array.isArray(s)&&s.enabled===!0))return{key:"coding_agent.config.enabled",status:"error",message:`coding-agents.config.json \u4E2D ${e} \u672A\u542F\u7528\uFF0Csetup/run \u9636\u6BB5\u65E0\u6CD5\u52A0\u8F7D\u8BE5 agent`,writeTarget:{type:"json",file:"coding-agents.config.json",jsonPath:["agents",e,"enabled"],valueType:"boolean"}}}a(rT,"checkCodingAgentConfigEnabled");function Zi(t){return{type:"yamlAll",targets:[{file:nT,yamlPath:["agent","engine"]},...t.workflowOverrides.map(e=>({file:e.file,yamlPath:e.yamlPath}))]}}a(Zi,"syncTargets");import{readFile as M_}from"fs/promises";import{existsSync as O_,readFileSync as j_}from"fs";import po from"path";import uh from"yaml";import{readFile as oT}from"fs/promises";import iT from"yaml";async function He(t,e={}){let n;try{n=await oT(t,"utf8")}catch(w){throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u5DE5\u4F5C\u6D41\u6A21\u677F ${t}: ${w instanceof Error?w.message:String(w)}`)}let r;try{r=iT.parse(n)}catch(w){throw new Error(`\u5DE5\u4F5C\u6D41\u6A21\u677F YAML \u89E3\u6790\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}if(e.envSource)try{let w=new Map,b=0,x=a(I=>{if(Array.isArray(I))return I.map(x);if(I&&typeof I=="object"){let S={};for(let[k,R]of Object.entries(I))if(Qt(R)){let T=`__RTREF_${b++}__`;w.set(T,R),S[k]=T}else S[k]=x(R);return S}return I},"shield");if(v(r)&&Array.isArray(r.event_sources))for(let I of r.event_sources)v(I)&&I.config&&(I.config=x(I.config));if(r=nr(r,e.envSource),w.size>0){let I=a(S=>{if(typeof S=="string")return w.get(S)??S;if(Array.isArray(S))return S.map(I);if(S&&typeof S=="object"){let k={};for(let[R,T]of Object.entries(S))k[R]=I(T);return k}return S},"restore");r=I(r)}}catch(w){throw new Error(`\u5DE5\u4F5C\u6D41\u6A21\u677F\u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}if(!v(r))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let o=sT(r.meta),i=aT(r.steps),s=uT(r.edges),c=yT(r.event_sources),l=wT(r.event_handlers),d=hT(i,s),u=bT(r.tracker),f=v(r.toolkit_config)?r.toolkit_config:void 0,p=ST(r.notification),g=r.field_definitions;g!=null&&h.warn("workflow","workflow.yml \u6839\u7EA7 field_definitions \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u5728 tracker.field_definitions \u4E2D\u58F0\u660E");let m=gT(u?.field_definitions??g),y=fT(r.steps,m);return h.info("workflow","\u6A21\u677F\u52A0\u8F7D\u5B8C\u6210",{name:o.name,stepCount:i.length,edgeCount:s.length,eventSourceCount:c.length,hasTracker:!!u,hasToolkitConfig:!!f,notificationChannel:p?.channel??"none",fieldRefs:y.all.size}),{meta:o,steps:i,edges:s,eventSources:c,eventHandlers:l,orderedStepIds:d,referencedFields:y,fieldDefinitions:m,tracker:u,toolkitConfig:f,notification:p}}a(He,"loadWorkflowTemplate");function sT(t){if(!v(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 meta \u6BB5");return{id:typeof t.id=="string"&&t.id.trim()?t.id:void 0,name:String(t.name??"unnamed"),version:String(t.version??"1.0.0"),domain:String(t.domain??"custom"),description:typeof t.description=="string"?t.description:void 0}}a(sT,"parseMeta");function aT(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 steps \u6570\u7EC4");return t.map((e,n)=>{if(!v(e))throw new Error(`steps[${n}] \u5FC5\u987B\u662F\u5BF9\u8C61`);let r=String(e.id??`step_${n}`);return{id:r,name:String(e.name??r),recipe:typeof e.recipe=="string"&&e.recipe.trim()?e.recipe:void 0,prompt:typeof e.prompt=="string"?e.prompt:void 0,engine:Am(e.engine),auto:e.auto!==!1,needs_human:cT(e.needs_human),sla:lT(e.sla),input_mapping:_m(e.input_mapping),output_mapping:_m(e.output_mapping),config:mT(e.config)}})}a(aT,"parseSteps");function cT(t){if(!v(t))return;let e=typeof t.reason=="string"?t.reason:"";if(e)return{reason:e,assignee_field:typeof t.assignee_field=="string"?t.assignee_field:void 0}}a(cT,"parseNeedsHuman");function Am(t){if(t==="claude"||t==="codex"||t==="qoder"||t==="codebuddy"||t==="opencode"||t==="qwen"||t==="deepseek"||t==="trae"||t==="llm_only")return t}a(Am,"parseEngine");function lT(t){if(v(t))return{timeout_ms:typeof t.timeout_ms=="number"?t.timeout_ms:3e5,escalation:dT(t.escalation)}}a(lT,"parseSLA");function dT(t){if(t==="notify"||t==="skip"||t==="block")return t}a(dT,"parseEscalation");function _m(t){if(!v(t))return;let e={};for(let[n,r]of Object.entries(t))typeof r=="string"&&(e[n]=r);return Object.keys(e).length>0?e:void 0}a(_m,"parseMapping");function uT(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 edges \u6570\u7EC4");return t.map((e,n)=>{if(!v(e))throw new Error(`edges[${n}] \u5FC5\u987B\u662F\u5BF9\u8C61`);return{from:String(e.from??""),to:String(e.to??""),condition:typeof e.condition=="string"?e.condition:void 0}})}a(uT,"parseEdges");function fT(t,e=[]){let n=new Set,r=new Set,o=new Set,i=new Set(e.filter(l=>pT(l.type)).map(l=>l.name));if(!Array.isArray(t))return{input:n,output:r,userInput:new Set,other:o,all:new Set};for(let l of t)v(l)&&Em(l,n,r,o);let s=new Set;for(let l of n)i.has(l)?o.add(l):r.has(l)||s.add(l);let c=new Set([...n,...r,...o]);return{input:n,output:r,userInput:s,other:o,all:c}}a(fT,"extractFieldRefs");function Em(t,e,n,r){for(let[o,i]of Object.entries(t))if(o.endsWith("_mapping")&&v(i)){let s=o.startsWith("input")?e:o.startsWith("output")?n:r;for(let c of Object.values(i))typeof c=="string"&&c&&!c.startsWith("$var.")&&s.add(c)}else o.endsWith("_field")&&typeof i=="string"&&i?r.add(i):v(i)&&Em(i,e,n,r)}a(Em,"walkStepForFields");var ll=new Set(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]);function pT(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(pT,"isSystemFieldType");function gT(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!v(n))continue;let r=typeof n.name=="string"?n.name:"",o=typeof n.type=="string"?n.type:"text";if(!r)continue;ll.has(o)||h.warn("workflow",`field_definitions \u4E2D\u5B57\u6BB5"${r}"\u7684\u7C7B\u578B "${o}" \u4E0D\u53D7\u652F\u6301\uFF0C\u5DF2\u964D\u7EA7\u4E3A text`,{field:r,declaredType:o,supported:[...ll]});let i=ll.has(o)?o:"text",s=Array.isArray(n.options)?n.options.filter(c=>typeof c=="string"):void 0;e.push({name:r,type:i,...s&&s.length>0?{options:s}:{}})}return e}a(gT,"parseFieldDefinitions");function mT(t){if(v(t))return t}a(mT,"parseStepConfig");function hT(t,e){let n=new Set(t.map(s=>s.id)),r=new Map;for(let s of e)r.set(s.from,s.to);let o=[],i=r.get("__start__");for(;i&&i!=="__end__";){if(!n.has(i))throw new Error(`\u8FB9\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4: ${i}`);if(o.includes(i))throw new Error(`\u68C0\u6D4B\u5230\u5FAA\u73AF\u5F15\u7528: ${i}`);o.push(i),i=r.get(i)}if(o.length!==t.length){let s=t.filter(c=>!o.includes(c.id)).map(c=>c.id);h.warn("workflow","\u90E8\u5206\u6B65\u9AA4\u672A\u5728\u8FB9\u4E2D\u8FDE\u63A5",{missing:s})}return o}a(hT,"topologicalSort");function yT(t){return!t||!Array.isArray(t)?[]:t.filter(v).map(e=>{let n=String(e.name??""),r=String(e.type??""),o=String(e.handler??"");return(!r||!o)&&h.warn("workflow","\u4E8B\u4EF6\u6E90\u7F3A\u5C11 type \u6216 handler",{item:e}),{name:n,type:r,handler:o,config:v(e.config)?e.config:{},...v(e.handler_config)?{handler_config:e.handler_config}:{},...e.record_policy==="on_demand"||e.record_policy==="eager"?{record_policy:e.record_policy}:{},active_on_steps:Array.isArray(e.active_on_steps)?e.active_on_steps.map(String):void 0}})}a(yT,"parseEventSources");function wT(t){return!t||!Array.isArray(t)?[]:t.filter(v).map(e=>({trigger:String(e.trigger??""),recipe:String(e.recipe??""),engine:Am(e.engine)}))}a(wT,"parseEventHandlers");function bT(t){if(!v(t))return;let e=ol.safeParse(t);if(!e.success){if(kT(t)){h.info("workflow","workflow.yml tracker.base_id \u4E3A\u7A7A\uFF0C\u6309\u8BBE\u8BA1\u671F\u8349\u7A3F\u5904\u7406\uFF1Bsetup \u4F1A\u521B\u5EFA\u6216\u590D\u7528 AI \u8868\u683C\u540E\u5199\u56DE\uFF0Crun \u524D\u9700\u5148\u5B8C\u6210 setup");return}h.warn("workflow","workflow.yml tracker \u89E3\u6790\u5931\u8D25\uFF0C\u5FFD\u7565",{errors:e.error.issues.map(n=>n.message)});return}return e.data}a(bT,"parseTracker");function kT(t){return t.base_id===""||t.baseId===""}a(kT,"isDraftTracker");var vT=new Set(["none","webhook","im"]);function ST(t){if(!v(t))return;let e=typeof t.channel=="string"?t.channel:"none",n=vT.has(e)?e:"none",r=v(t.webhook)&&typeof t.webhook.url=="string"?{url:t.webhook.url,...v(t.webhook.headers)?{headers:t.webhook.headers}:{}}:void 0,o=v(t.im)?{...typeof t.im.bot_token_env=="string"?{bot_token_env:t.im.bot_token_env}:{}}:void 0,i=v(t.templates)?Object.fromEntries(Object.entries(t.templates).filter(([,s])=>typeof s=="string").map(([s,c])=>[s,c])):void 0;return{channel:n,...r?{webhook:r}:{},...o&&Object.keys(o).length>0?{im:o}:{},...i&&Object.keys(i).length>0?{templates:i}:{}}}a(ST,"parseNotification");import{readFile as sh}from"fs/promises";import kl from"path";import Xi from"path";import Dm from"fs";async function $t(t,e){return Pm({recipeDir:t,recipeId:e,exportMethod:"execute",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 execute \u51FD\u6570"})}a($t,"loadRecipeDefinitionResult");async function es(t,e){return(await $t(t,e)).definition}a(es,"loadRecipeDefinition");async function $n(t,e){return Pm({recipeDir:t,recipeId:e,exportMethod:"create",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 create \u51FD\u6570"})}a($n,"loadEventHandlerDefinitionResult");async function dl(t,e){return(await $n(t,e)).definition}a(dl,"loadEventHandlerDefinition");function ir(t,e){let n=Xi.resolve(t,`${e}.recipe.ts`),r=Xi.resolve(t,`${e}.recipe.js`);return Dm.existsSync(n)?n:Dm.existsSync(r)?r:null}a(ir,"resolveRecipePath");async function Pm(t){let{recipeDir:e,recipeId:n,exportMethod:r,invalidExportMessage:o}=t,i=ir(e,n);if(!i)return{definition:null,failure:{code:"not_found",message:`\u672A\u627E\u5230 recipe \u6587\u4EF6\uFF08\u5DF2\u68C0\u67E5 ${Xi.resolve(e,`${n}.recipe.ts`)}\u3001${Xi.resolve(e,`${n}.recipe.js`)}\uFF09`}};i.endsWith(".ts")&&await Ut();try{let s=await import(mn(i)),c=s.default??s.recipe;return!c||typeof c[r]!="function"?{definition:null,failure:{code:"invalid_export",recipePath:i,message:`${o}\uFF08${i}\uFF09`}}:{definition:c,failure:null}}catch(s){return{definition:null,failure:{code:"import_failed",recipePath:i,message:`\u5BFC\u5165\u5931\u8D25\uFF08${i}\uFF09: ${s instanceof Error?s.message:String(s)}`}}}}a(Pm,"loadDefinition");async function sr(t,e){let n=[],r=[];for(let o of e.steps){let i=o.recipe;if(!i)continue;let s=await $t(t,i);if(!s.definition){n.push({stepId:o.id,recipeId:i,level:"error",message:`\u65E0\u6CD5\u52A0\u8F7D recipe\u300C${i}\u300D: ${s.failure.message}`}),r.push({stepId:o.id,recipeId:i,configSummary:Yi(o.config),loaded:!1});continue}let l=s.definition.meta;$m(o.config,l.config,o.id,i,n),r.push({stepId:o.id,recipeId:i,configSummary:Yi(o.config),loaded:!0})}for(let o of e.eventSources??[]){let i=o.handler;if(!i)continue;let s=`event:${o.name||i}`,c=await $n(t,i);if(!c.definition){n.push({stepId:s,recipeId:i,level:"error",message:`\u65E0\u6CD5\u52A0\u8F7D EventHandler\u300C${i}\u300D: ${c.failure.message}`}),r.push({stepId:s,recipeId:i,configSummary:Yi(o.handler_config),loaded:!1});continue}let l=c.definition;$m(o.handler_config,l.meta.config,s,i,n),r.push({stepId:s,recipeId:i,configSummary:Yi(o.handler_config),loaded:!0})}return{issues:n,rows:r}}a(sr,"checkWorkflowRecipes");function $m(t,e,n,r,o){let i=t??{};if(!e){Object.keys(i).length>0&&o.push({stepId:n,recipeId:r,level:"warn",message:"\u63D0\u4F9B\u4E86 config\uFF0C\u4F46 meta.config \u672A\u58F0\u660E schema\uFF08\u65E0\u6CD5\u6821\u9A8C\uFF09"});return}let s={};for(let[d,u]of Object.entries(i))Xr.has(d)&&(u===!0||u===!1)||(s[d]=u);let c=e.safeParse(s);if(!c.success)for(let d of c.error.issues){let u=xT(s,d.path);IT(u)||RT(u)||o.push({stepId:n,recipeId:r,level:"error",message:`config.${d.path.join(".")||"<root>"}: ${d.message}`})}let l=Qi(e);if(l){let d=new Set(Object.keys(l));for(let u of Object.keys(i))d.has(u)||o.push({stepId:n,recipeId:r,level:"warn",message:`config \u542B schema \u672A\u58F0\u660E\u7684 key\u300C${u}\u300D\uFF08\u53EF\u80FD\u62FC\u5199\u9519\u8BEF\uFF09`})}}a($m,"checkConfigAgainstSchema");function xT(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}a(xT,"getValueAtPath");function IT(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return Object.keys(e).length===1&&typeof e.ref=="string"&&e.ref.trim()!==""}a(IT,"isRefObject");function RT(t){return typeof t=="string"&&/^\$\{[^}]+\}$/.test(t.trim())}a(RT,"isPlaceholderString");function Qi(t){if(!t)return null;let e=t;return e?._def?.typeName==="ZodObject"&&e.shape?typeof e.shape=="function"?e.shape():e.shape:typeof e.unwrap=="function"?Qi(e.unwrap()):e?._def?.schema?Qi(e._def.schema):e?._def?.innerType?Qi(e._def.innerType):null}a(Qi,"objectShape");function Yi(t){if(!t)return[];let e=[];for(let[n,r]of Object.entries(t))if(r===!0||r===!1)e.push(`${n}=${r}`);else if(r&&typeof r=="object"){let o=Object.entries(r).map(([i,s])=>`${i}=${typeof s=="object"?JSON.stringify(s):String(s)}`).join(", ");e.push(o?`${n}{${o}}`:`${n}{}`)}else e.push(`${n}=${String(r)}`);return e}a(Yi,"summarizeConfig");import{readFileSync as CT,existsSync as Mm}from"fs";import ts from"path";import TT from"yaml";var Om=/^\$\{roles\.([^}]+)\}$/;function _T(t,e){let n=e.split(/\.(?![^[]*\])/),r=t;for(let o of n){if(r==null||typeof r!="object")return;let i=o.match(/^(.+)\[(\d+)\]$/);if(i){let s=i[1],c=Number(i[2]),l=r[s];if(!Array.isArray(l))return;r=l[c]}else r=r[o]}return r}a(_T,"getByJsonPath");function rs(t,e,n){if(typeof t=="string"){let r=t.match(Om);if(r){let o=r[1],i=_T(e,o);if(i===void 0)throw new Error(`profile \u5185\u90E8\u5F15\u7528\u5C55\u5F00\u5931\u8D25: \${roles.${o}} \u627E\u4E0D\u5230\u76EE\u6807\u503C\uFF08\u4F4D\u4E8E ${n}\uFF09`);return i}return t}if(Array.isArray(t))return t.map((r,o)=>rs(r,e,`${n}[${o}]`));if(t&&typeof t=="object"){let r={};for(let[o,i]of Object.entries(t))r[o]=rs(i,e,`${n}.${o}`);return r}return t}a(rs,"expandProfileRefs");function os(t,e="roles"){return typeof t=="string"?Om.test(t)?[`${e} \u2192 ${t}`]:[]:Array.isArray(t)?t.flatMap((n,r)=>os(n,`${e}[${r}]`)):t&&typeof t=="object"?Object.entries(t).flatMap(([n,r])=>os(r,`${e}.${n}`)):[]}a(os,"findPendingRefs");function AT(t){let e=t,n=Object.keys(t).length+1;for(let o=0;o<n;o++){if(os(e).length===0)return e;e=rs(e,e,"roles")}let r=os(e);throw new Error(`profile roles \u6BB5\u5FAA\u73AF\u5F15\u7528\uFF1A\u7ECF ${n} \u8F6E\u5C55\u5F00\u4ECD\u6709\u5F15\u7528\u65E0\u6CD5\u6536\u655B\uFF08${r.join("\u3001")}\uFF09`)}a(AT,"expandRolesRefs");var ns=new Map;function ul(t){if(Mm(ts.resolve(t,"profile","profile.yml")))return t;let e=ts.resolve(t,"profiles","default","profile","profile.yml");return Mm(e)?ts.resolve(t,"profiles","default"):null}a(ul,"resolveProfileConfigDir");function lt(t,e,n={}){let r=`${t}\0${n.lenientEnv?"lenient":"strict"}`,o=ns.get(r);if(o!==void 0)return o;let i=ul(t);if(!i)return ns.set(r,null),null;let s=ts.resolve(i,"profile","profile.yml"),c;try{c=CT(s,"utf8")}catch(w){throw new Error(`profile.yml \u8BFB\u53D6\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}let l;try{l=TT.parse(c)}catch(w){throw new Error(`profile.yml YAML \u89E3\u6790\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}try{l=nr(l,e??vm(t),{lenient:n.lenientEnv===!0})}catch(w){throw new Error(`profile.yml \u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${w instanceof Error?w.message:String(w)}`)}if(!l||typeof l!="object")throw new Error("profile.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let d=l,u=typeof d.schema_version=="number"?d.schema_version:void 0;if(u!==2)throw new Error(`profile.yml \u4F7F\u7528\u65E7\u7248\u7ED3\u6784\uFF08schema_version: ${u??"\u672A\u58F0\u660E"}\uFF09\uFF0C\u8BF7\u6309\u8FC1\u79FB\u6307\u5357\u5347\u7EA7\u4E3A v2\u3002v2 \u7ED3\u6784\u4EE5 roles / workflows \u4E24\u4E2A\u8F74\u7EC4\u7EC7\u914D\u7F6E\uFF0Cworkflow.yml \u4E0D\u518D\u643A\u5E26 config \u7C7B\u914D\u7F6E\u3002`);let f=oo(d.roles)?AT(d.roles):void 0,p=oo(d.workflows)?d.workflows:void 0,g;p&&f?g=rs(p,f,"workflows"):p&&(g=p);let m=oo(d.meta)?{label:typeof d.meta.label=="string"?d.meta.label:void 0,description:typeof d.meta.description=="string"?d.meta.description:void 0}:void 0,y={schema_version:2,...m?{meta:m}:{},...f?{roles:f}:{},...g?{workflows:g}:{}};return ns.set(r,y),h.info("config","profile v2 \u52A0\u8F7D\u5B8C\u6210",{rolesCount:f?Object.keys(f).length:0,workflowsCount:g?Object.keys(g).length:0}),y}a(lt,"loadProfileConfig");function Pn(){ns.clear()}a(Pn,"resetProfileCache");function nn(t,e,n){if(ET(t,e),e.toolkit_config){let r=n.toolkitConfig??{};for(let[o,i]of Object.entries(e.toolkit_config))i&&typeof i=="object"&&!Array.isArray(i)&&r[o]&&typeof r[o]=="object"?r[o]={...r[o],...i}:r[o]=i;n.toolkitConfig=r}if(e.event_sources){let r=new Map(n.eventSources.map(o=>[o.name,o]));for(let[o,i]of Object.entries(e.event_sources)){let s=r.get(o);if(!s)throw new Error(`profile.workflows.${t}.event_sources.${o} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E8B\u4EF6\u6E90\uFF08workflow.yml \u4E2D\u65E0 name="${o}" \u7684\u4E8B\u4EF6\u6E90\uFF09`);let{handler_config:c,...l}=i;s.config={...s.config,...l},c&&typeof c=="object"&&(s.handler_config={...s.handler_config??{},...c})}}if(e.steps){let r=new Map(n.steps.map(o=>[o.id,o]));for(let[o,i]of Object.entries(e.steps)){let s=r.get(o);if(!s)throw new Error(`profile.workflows.${t}.steps.${o} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\uFF08workflow.yml \u4E2D\u65E0 id="${o}" \u7684\u6B65\u9AA4\uFF09`);s.config={...s.config??{},...i}}}}a(nn,"injectProfileConfig");function ET(t,e){if(e.event_sources){for(let[n,r]of Object.entries(e.event_sources))if(oo(r)&&"config"in r)throw new Error(`profile.workflows.${t}.event_sources.${n}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile event source \u4E0B\u9664 handler_config \u5916\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 event_sources[].config\uFF0C\u8BF7\u6539\u4E3A workflows.${t}.event_sources.${n}.<\u5B57\u6BB5\u540D>`)}if(e.steps){for(let[n,r]of Object.entries(e.steps))if(oo(r)&&"config"in r)throw new Error(`profile.workflows.${t}.steps.${n}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile step \u4E0B\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 step.config\uFF0C\u8BF7\u6539\u4E3A workflows.${t}.steps.${n}.<\u5B57\u6BB5\u540D>`)}}a(ET,"assertNoNestedProfileConfig");function oo(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}a(oo,"isRecord");var io=new Set(["\u6807\u9898","\u72B6\u6001","\u5F53\u524D\u6B65\u9AA4","\u5904\u7406\u4EBA","\u4E8B\u4EF6\u65E5\u5FD7","\u63CF\u8FF0","\u622A\u6B62\u65F6\u95F4"]);import DT from"yaml";function jm(t){let e=new Set;if(!t)return e;let n=a(o=>{if(Array.isArray(o))for(let i of o)v(i)&&typeof i.name=="string"&&e.add(i.name)},"collect"),r=t.tracker;return v(r)&&n(r.field_definitions),n(t.field_definitions),e}a(jm,"extractDeclaredFieldNames");var ar="__start__",cr="__end__",$T=/^[a-z0-9_]+$/;function Fm(t,e){let n=[],r;try{r=DT.parse(t)}catch(l){return n.push({code:"WF-S01",severity:"error",message:`workflow.yml YAML \u89E3\u6790\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`,location:{file:e}}),{issues:n,fatal:!0,raw:null}}if(!v(r))return n.push({code:"WF-S01",severity:"error",message:"workflow.yml \u6839\u8282\u70B9\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61",location:{file:e}}),{issues:n,fatal:!0,raw:null};v(r.meta)?(!r.meta.name||typeof r.meta.name!="string")&&n.push({code:"WF-S02",severity:"error",message:"meta.name \u4E0D\u80FD\u4E3A\u7A7A",location:{file:e}}):n.push({code:"WF-S02",severity:"error",message:"\u7F3A\u5C11 meta \u6BB5",location:{file:e}});let o=new Set,i=r.steps;!Array.isArray(i)||i.length===0?n.push({code:"WF-S03",severity:"error",message:"steps \u6570\u7EC4\u7F3A\u5931\u6216\u4E3A\u7A7A",location:{file:e}}):i.forEach((l,d)=>{let u={file:e,stepId:void 0};if(!v(l)){n.push({code:"WF-S03",severity:"error",message:`steps[${d}] \u5FC5\u987B\u662F\u5BF9\u8C61`,location:u});return}let f=l.id;if(typeof f!="string"||f.length===0){n.push({code:"WF-S03",severity:"error",message:`steps[${d}] \u7F3A\u5C11 id`,location:u});return}u.stepId=f,$T.test(f)||n.push({code:"WF-S03",severity:"error",message:`\u6B65\u9AA4 id\u300C${f}\u300D\u53EA\u5141\u8BB8\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF`,location:u}),o.has(f)&&n.push({code:"WF-S03",severity:"error",message:`\u6B65\u9AA4 id\u300C${f}\u300D\u91CD\u590D`,location:u}),o.add(f),!l.recipe&&!l.prompt&&n.push({code:"WF-S06",severity:"error",message:`\u6B65\u9AA4\u300C${f}\u300D\u65E2\u6CA1\u6709 recipe \u4E5F\u6CA1\u6709 prompt\uFF0C\u65E0\u6CD5\u6267\u884C`,location:u})});let s=r.edges;if(!Array.isArray(s)||s.length===0)n.push({code:"WF-S04",severity:"error",message:"edges \u6570\u7EC4\u7F3A\u5931\u6216\u4E3A\u7A7A",location:{file:e}});else{let l=!1,d=!1;if(s.forEach((u,f)=>{if(!v(u)){n.push({code:"WF-S04",severity:"error",message:`edges[${f}] \u5FC5\u987B\u662F\u5BF9\u8C61`,location:{file:e}});return}let p=String(u.from??""),g=String(u.to??"");if(!p||!g){n.push({code:"WF-S04",severity:"error",message:`edges[${f}] \u7F3A\u5C11 from/to`,location:{file:e}});return}p===ar&&(l=!0),g===cr&&(d=!0),p!==ar&&p!==cr&&!o.has(p)&&n.push({code:"WF-S04",severity:"error",message:`edges[${f}].from \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\u300C${p}\u300D`,location:{file:e}}),g!==ar&&g!==cr&&!o.has(g)&&n.push({code:"WF-S04",severity:"error",message:`edges[${f}].to \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\u300C${g}\u300D`,location:{file:e}})}),l||n.push({code:"WF-S04",severity:"error",message:"edges \u7F3A\u5C11\u4ECE __start__ \u51FA\u53D1\u7684\u8FB9",location:{file:e}}),d||n.push({code:"WF-S04",severity:"error",message:"edges \u7F3A\u5C11\u5230\u8FBE __end__ \u7684\u8FB9",location:{file:e}}),o.size>0&&l){let u=MT(s,o);for(let f of u)n.push({...f,location:{file:e,stepId:f.location?.stepId}})}}PT(r.tracker,n,e);let c=n.some(l=>l.severity==="error");return{issues:n,fatal:c,raw:r}}a(Fm,"checkStructure");function PT(t,e,n){if(!v(t)||t.views===void 0)return;let r=t.views;if(!Array.isArray(r)){e.push({code:"WF-S07",severity:"error",message:"tracker.views \u5FC5\u987B\u662F\u6570\u7EC4",location:{file:n,key:"tracker.views"}});return}r.forEach((o,i)=>{let s=`tracker.views[${i}]`,c=new Set;v(o)&&Array.isArray(o.filter)&&o.filter.forEach((d,u)=>{if(v(d)&&Array.isArray(d.equals)){let f=`filter.${u}.equals`;c.add(f),e.push({code:"WF-S07",severity:"error",message:`${s}.filter[${u}].equals \u53EA\u652F\u6301\u5355\u4E2A\u5B57\u7B26\u4E32\uFF1B\u591A\u503C\u7B5B\u9009\u8BF7\u5199 any_of: ["\u503C1", "\u503C2"]`,location:{file:n,key:`${s}.filter[${u}].equals`}})}});let l=ro.safeParse(o);if(!l.success){let d=l.error.issues.filter(u=>!c.has(u.path.join("."))).map(u=>`${u.path.length?`${s}.${u.path.join(".")}`:s}: ${u.message}`).join("; ");if(!d)return;e.push({code:"WF-S07",severity:"error",message:`tracker.views \u914D\u7F6E\u4E0D\u5408\u6CD5\uFF1A${d}`,location:{file:n,key:s}})}})}a(PT,"validateTrackerViews");function MT(t,e){let n=[],r=new Map,o=new Map,i=new Set([ar,cr,...e]);for(let p of i)r.set(p,new Set),o.set(p,new Set);for(let p of t){if(!v(p))continue;let g=String(p.from??""),m=String(p.to??"");!i.has(g)||!i.has(m)||(r.get(g).add(m),o.get(m).add(g))}let s=a((p,g)=>{let m=new Set,y=[p];for(;y.length>0;){let w=y.shift();for(let b of g.get(w)??[])m.has(b)||(m.add(b),y.push(b))}return m},"reach"),c=s(ar,r),l=s(cr,o);for(let p of e)c.has(p)?l.has(p)||n.push({code:"WF-S05",severity:"error",message:`\u6B65\u9AA4\u300C${p}\u300D\u65E0\u6CD5\u5230\u8FBE __end__\uFF08\u6D41\u7A0B\u5728\u6B64\u4E2D\u65AD\uFF09`,location:{stepId:p}}):n.push({code:"WF-S05",severity:"error",message:`\u6B65\u9AA4\u300C${p}\u300D\u4ECE __start__ \u4E0D\u53EF\u8FBE\uFF08\u6CA1\u6709\u8FDB\u5165\u8FB9\u94FE\u8DEF\uFF09`,location:{stepId:p}});let d=new Map,u=null,f=a(p=>{if(!u){d.set(p,1);for(let g of r.get(p)??[]){if(g===ar||g===cr)continue;let m=d.get(g)??0;if(m===1){u=g;return}m===0&&f(g)}d.set(p,2)}},"dfs");for(let p of e)(d.get(p)??0)===0&&f(p);return u&&n.push({code:"WF-S05",severity:"error",message:`\u6B65\u9AA4\u56FE\u5B58\u5728\u73AF\uFF08\u6D89\u53CA\u6B65\u9AA4\u300C${u}\u300D\uFF09`,location:{stepId:u}}),n}a(MT,"checkGraphHealth");async function Wm(t,e,n){let r=[],o=new Map,i=new Map,s=new Set;for(let l of e.steps)l.recipe&&s.add(l.recipe);for(let l of s){let d=await $t(t,l);if(d.definition){o.set(l,d.definition),Nm(d.definition.meta?.id,l,"step",r,n(l));continue}r.push(await Lm(d,t,l,"step",n))}let c=new Set;for(let l of e.eventSources)l.handler&&c.add(l.handler);for(let l of e.eventHandlers)l.recipe&&c.add(l.recipe);for(let l of c){let d=await $n(t,l);if(d.definition){i.set(l,d.definition),Nm(d.definition.meta?.id,l,"handler",r,n(l));continue}r.push(await Lm(d,t,l,"handler",n))}return{issues:r,recipes:o,handlers:i}}a(Wm,"checkRecipeBind");function Nm(t,e,n,r,o){if(!t)return;(n==="handler"&&e.endsWith("_handler")?new Set([e,e.slice(0,-8)]):new Set([e])).has(t)||r.push({code:"WF-R04",severity:"warning",message:n==="handler"?`handler meta.id\u300C${t}\u300D\u4E0E\u5F15\u7528 id\u300C${e}\u300D\u4E0D\u4E00\u81F4\uFF1B\u5141\u8BB8\u5168\u7B49\uFF0C\u6216\u53BB\u6389 _handler \u540E\u7F00\u540E\u4E00\u81F4`:`recipe meta.id\u300C${t}\u300D\u4E0E\u5F15\u7528 id\u300C${e}\u300D\u4E0D\u4E00\u81F4`,location:{file:o,recipeId:e}})}a(Nm,"checkMetaId");async function Lm(t,e,n,r,o){let i=t.failure,s={file:o(n),recipeId:n};return i.code==="not_found"?{code:"WF-R01",severity:"error",message:r==="step"?`\u6B65\u9AA4\u5F15\u7528\u7684 recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${i.message}`:`\u4E8B\u4EF6\u5904\u7406\u5F15\u7528\u7684 recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${i.message}`,location:s}:i.code==="import_failed"?{code:"WF-R02",severity:"error",message:`recipe \u52A0\u8F7D\u5931\u8D25: ${i.message}`,location:s}:(r==="step"?await $n(e,n):await $t(e,n)).definition?{code:"WF-R03",severity:"error",message:`kind \u9519\u914D\uFF1A\u8BE5\u6587\u4EF6\u662F ${r==="step"?"EventHandler\uFF08\u542B create\uFF09":"\u666E\u901A Recipe\uFF08\u542B execute\uFF09"}\uFF0C\u4E0D\u80FD\u4F5C\u4E3A${r==="step"?"\u6B65\u9AA4 recipe":"\u4E8B\u4EF6 handler"}\u4F7F\u7528\uFF08${r==="step"?"\u6B65\u9AA4 recipe\uFF08\u9700\u542B execute\uFF09":"EventHandler\uFF08\u9700\u542B create\uFF09"}\uFF09`,location:s}:{code:"WF-R03",severity:"error",message:`recipe \u5BFC\u51FA\u7ED3\u6784\u65E0\u6548: ${i.message}`,location:s}}a(Lm,"diagnoseLoadFailure");import{readFile as d_}from"fs/promises";import{access as VT,readdir as qT,readFile as as}from"fs/promises";import rn from"path";import Je from"typescript";import fl from"yaml";import{readFile as zm,readdir as OT,access as jT,stat as FT}from"fs/promises";import Ge from"path";import Um from"yaml";import{input as NT}from"@inquirer/prompts";async function is(t){let e=await Ue(t),n=Ge.dirname(e),r=await Vm(e),o=await qm(Ge.join(n,"profile","profile.yml")),i=v(r.workflows)&&typeof r.workflows.dir=="string"?r.workflows.dir:void 0;if(!i)throw new Error("design \u4EC5\u652F\u6301 profile + \u591A workflow \u7684\u65B0\u5F62\u6001\uFF1A\u5F53\u524D config \u7F3A\u5C11 workflows.dir\uFF0C\u7591\u4F3C\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF08\u9876\u5C42\u5355 workflow \u6216\u65E0 profile \u7684\u81EA\u8DB3\u6A21\u5F0F\uFF09\u3002design \u4E0D\u518D\u652F\u6301\u7F16\u8F91\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF0C\u8BF7\u5148\u624B\u52A8\u8FC1\u79FB\u5230\u591A workflow + profile\u3002");let s=await LT(n,i);return{mode:s.some(l=>l.exists)?"brownfield":"greenfield",profileExists:o,workflows:s}}a(is,"probeProjectShape");async function LT(t,e){let n;try{n=await cl(t,e)}catch{n=[]}return n.map(r=>({id:r.id,workflowRelPath:Bm(t,r.templatePath),recipeDirRelPath:Bm(t,r.recipeDir),workflowPath:r.templatePath,recipeDir:r.recipeDir,exists:!0}))}a(LT,"scanExistingWorkflows");function Bm(t,e){let n=Ge.relative(t,e);return n.startsWith(".")?n:`./${n}`}a(Bm,"toRelPath");async function Km(t){let e=await Ue(t.configPath),n=Ge.dirname(e);try{await FT(e)}catch{throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}
336
336
 
337
- \u8BF7\u5148\u5728\u5F53\u524D\u76EE\u5F55\u8FD0\u884C \`aitable-workflow init\` \u521B\u5EFA\u914D\u7F6E\uFF0C\u518D\u6267\u884C design\u3002`)}let r=await Vm(e),o=typeof r.scene=="string"?r.scene:"";if(!o)throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E2D\u7F3A\u5C11 scene \u5B57\u6BB5\u3002\u8BF7\u5148\u8FD0\u884C `aitable-workflow init` \u521B\u5EFA\u914D\u7F6E\u3002");let i=await is(t.configPath),s=i.workflows[0]??UT(n),c=S(r.agent)?r.agent:void 0,l=no.default("claude").parse(c?.engine),d=Sn(l),u=S(r.agent)&&typeof r.agent.timeout_ms=="number"?r.agent.timeout_ms:6e5,f="";if(!t.yes){if(console.log(`
337
+ \u8BF7\u5148\u5728\u5F53\u524D\u76EE\u5F55\u8FD0\u884C \`aitable-workflow init\` \u521B\u5EFA\u914D\u7F6E\uFF0C\u518D\u6267\u884C design\u3002`)}let r=await Vm(e),o=typeof r.scene=="string"?r.scene:"";if(!o)throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E2D\u7F3A\u5C11 scene \u5B57\u6BB5\u3002\u8BF7\u5148\u8FD0\u884C `aitable-workflow init` \u521B\u5EFA\u914D\u7F6E\u3002");let i=await is(t.configPath),s=i.workflows[0]??UT(n),c=v(r.agent)?r.agent:void 0,l=no.default("claude").parse(c?.engine),d=Sn(l),u=v(r.agent)&&typeof r.agent.timeout_ms=="number"?r.agent.timeout_ms:6e5,f="";if(!t.yes){if(console.log(`
338
338
  \u{1F4CB} \u5F53\u524D\u573A\u666F\u63CF\u8FF0:`),console.log(` ${o}
339
339
  `),i.mode==="brownfield"){let b=i.workflows.filter(x=>x.exists).map(x=>x.id).join(" / ");console.log(` \u68C0\u6D4B\u5230\u5DF2\u6709\u4EA7\u7269\uFF08${b}\uFF09\uFF0C\u672C\u6B21\u5C06\u589E\u91CF\u4FEE\u6539\u800C\u975E\u91CD\u65B0\u751F\u6210\u3002
340
340
  `)}f=await NT({message:"\u8FFD\u52A0\u8865\u5145\u9700\u6C42\uFF08\u76F4\u63A5\u56DE\u8F66\u8DF3\u8FC7\uFF09",default:""}),f=f.trim()}let p=f?`${o}
341
341
 
342
- \u8865\u5145\u9700\u6C42\uFF1A${f}`:o,g=await KT(n),m=WT(r),y=await BT(n),w=await zT(n);return{scene:o,supplements:f,fullRequirement:p,workDir:n,configPath:e,projectRoot:g,agentType:d,agentTimeoutMs:u,mode:i.mode,profileExists:i.profileExists,workflows:i.workflows,trackerFacts:m,roles:y,strayRoleFiles:w,recipeDir:s.recipeDir,workflowPath:s.workflowPath,workflowRelPath:s.workflowRelPath,recipeDirRelPath:s.recipeDirRelPath}}a(Km,"collectDesignContext");function WT(t){if(!S(t.tracker))return[];let e=t.tracker,n=[];if(S(e.states)){let r=e.states,o=[typeof r.initial=="string"?`initial=${r.initial}`:"",Array.isArray(r.active)?`active=${r.active.join(" / ")}`:"",Array.isArray(r.terminal)?`terminal=${r.terminal.join(" / ")}`:"",typeof r.review=="string"?`review=${r.review}`:"",typeof r.blocked=="string"?`blocked=${r.blocked}`:""].filter(Boolean);o.length>0&&n.push(`- Tracker \u72B6\u6001\uFF1A${o.join("; ")}`)}if(S(e.fields)){let r=Object.entries(e.fields).filter(o=>typeof o[1]=="string").map(([o,i])=>`${o}=${i}`);r.length>0&&n.push(`- \u7CFB\u7EDF\u9AA8\u67B6\u5B57\u6BB5\uFF1A${r.join("; ")}`)}return n}a(WT,"buildTrackerFacts");async function BT(t){try{let e=Um.parse(await zm(Ge.join(t,"profile","profile.yml"),"utf8"));return!S(e)||!S(e.roles)?[]:Object.entries(e.roles).slice(0,8).map(([n,r])=>({id:n,name:S(r)&&typeof r.name=="string"?r.name:void 0}))}catch{return[]}}a(BT,"loadProfileRoles");async function zT(t){try{return(await OT(Ge.join(t,"roles"))).filter(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return[]}}a(zT,"listStrayRoleFiles");async function Vm(t){let e=Um.parse(await zm(t,"utf8"));if(!S(e))throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548");return e}a(Vm,"readRawConfig");function UT(t){return{id:"default",workflowRelPath:"./workflow.yml",recipeDirRelPath:"./recipes",workflowPath:Ge.resolve(t,"./workflow.yml"),recipeDir:Ge.resolve(t,"./recipes"),exists:!1}}a(UT,"fallbackTarget");async function qm(t){try{return await jT(t),!0}catch{return!1}}a(qm,"fileExists");async function KT(t){let e=Ge.resolve(t),n=Ge.parse(e).root;for(;e!==n;){if(await qm(Ge.join(e,"package.json")))return e;e=Ge.dirname(e)}return Ge.resolve(t)}a(KT,"findProjectRoot");async function so(t){let e=[],n=[],r=await HT(t);for(let o of r){let i=await Hm(o.workflowPath,o.recipeDir),s=r.length>1?`[${o.id}] `:"";e.push(...i.errors.map(c=>`${s}${c}`)),n.push(...i.warnings.map(c=>`${s}${c}`))}return await GT(t.workDir,r,e),{valid:e.length===0,errors:e,warnings:n}}a(so,"validateDesignArtifacts");async function HT(t){if(t.configPath)try{let e=await is(t.configPath);if(e.workflows.length>0)return e.workflows.map(n=>({id:n.id,workflowPath:n.workflowPath,recipeDir:n.recipeDir}))}catch{}return t.workflows.length>0?t.workflows:[{id:"default",workflowPath:t.workflowPath,recipeDir:t.recipeDir}]}a(HT,"resolveValidationTargets");async function GT(t,e,n){let r=rn.join(t,"profile","profile.yml");if(!await ss(r))return;let o;try{o=fl.parse(await as(r,"utf8"))}catch(c){n.push(`profile/profile.yml \u89E3\u6790\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`);return}if(!S(o))return;o.schema_version!==2&&n.push("profile/profile.yml \u7684 schema_version \u5FC5\u987B\u662F\u6570\u5B57 2\uFF0C\u5426\u5219\u8FD0\u884C\u65F6\u4F1A\u62D2\u7EDD\u542F\u52A8"),o.roles!==void 0&&await l_(t)&&n.push("profile/profile.yml \u58F0\u660E\u4E86 roles \u6BB5\uFF0C\u540C\u65F6 roles/ \u76EE\u5F55\u4E0B\u8FD8\u6709 .role.yml \u6587\u4EF6\uFF1A\u4E24\u8005\u4E92\u65A5\uFF0C\u5B9E\u4F8B\u542F\u52A8\u4F1A\u76F4\u63A5\u62A5\u9519\u3002\u89D2\u8272\u53EA\u4FDD\u7559\u4E00\u5904\uFF08profile_v2 \u6A21\u5F0F\u4E0B\u5199\u8FDB profile \u7684 roles \u6BB5\uFF09\u3002");let i=o.workflows;if(!S(i))return;let s=new Map(e.map(c=>[c.id,c.workflowPath]));for(let[c,l]of Object.entries(i)){let d=s.get(c);if(!d){n.push(`profile.yml \u914D\u7F6E\u4E86 workflows.${c}\uFF0C\u4F46\u4E0D\u5B58\u5728\u8BE5 workflow\uFF1A\u8FD0\u884C\u65F6\u4F1A\u56E0\u951A\u70B9\u7F3A\u5931\u800C\u629B\u9519\u3002\u8BF7\u6539\u540D\u6216\u5220\u9664\u8BE5\u6BB5\u3002`);continue}if(!S(l))continue;let u=await JT(d);if(!u)continue;for(let m of u.runtimeConfigPaths)n.push(`profile.yml \u5DF2\u58F0\u660E workflows.${c}\uFF0C${m} \u4E0D\u5E94\u518D\u5199\u5728 workflow.yml\uFF1Aprofile \u662F\u8FD0\u884C\u914D\u7F6E\u552F\u4E00\u4E8B\u5B9E\u6E90\uFF0C\u8BF7\u8FC1\u79FB\u5230 profile.workflows.${c} \u5BF9\u5E94\u4F4D\u7F6E\u3002`);let f=l.steps;if(S(f))for(let m of Object.keys(f))u.stepIds.has(m)||n.push(`profile.yml \u7684 workflows.${c}.steps.${m} \u627E\u4E0D\u5230\u5BF9\u5E94 step\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709 step \u4E3A ${[...u.stepIds].join(" / ")||"(\u65E0)"}\u3002`);let p=l.event_sources;if(S(p))for(let[m,y]of Object.entries(p))u.sourceNames.has(m)||n.push(`profile.yml \u7684 workflows.${c}.event_sources.${m} \u627E\u4E0D\u5230\u5BF9\u5E94\u4E8B\u4EF6\u6E90\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709\u4E8B\u4EF6\u6E90\u4E3A ${[...u.sourceNames].join(" / ")||"(\u65E0)"}\u3002`),S(y)&&"config"in y&&n.push(`profile.yml \u7684 workflows.${c}.event_sources.${m}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Aprofile event source \u4E0B\u9664 handler_config \u5916\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 event_sources[].config\uFF0C\u8BF7\u6539\u4E3A workflows.${c}.event_sources.${m}.<\u5B57\u6BB5\u540D>\u3002`);let g=l.steps;if(S(g))for(let[m,y]of Object.entries(g))S(y)&&"config"in y&&n.push(`profile.yml \u7684 workflows.${c}.steps.${m}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Aprofile step \u4E0B\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 step.config\uFF0C\u8BF7\u6539\u4E3A workflows.${c}.steps.${m}.<\u5B57\u6BB5\u540D>\u3002`)}}a(GT,"validateProfileAnchors");async function JT(t){try{let e=fl.parse(await as(t,"utf8"));if(!S(e))return;let n=[];S(e.toolkit_config)&&n.push("workflow.yml \u7684 toolkit_config");let r=new Set;if(Array.isArray(e.steps))for(let i=0;i<e.steps.length;i++){let s=e.steps[i];if(S(s)&&typeof s.id=="string"&&r.add(s.id),S(s)&&S(s.config)){let c=typeof s.id=="string"?`steps.${s.id}.config`:`steps[${i}].config`;n.push(`workflow.yml \u7684 ${c}`)}}let o=new Set;if(Array.isArray(e.event_sources))for(let i=0;i<e.event_sources.length;i++){let s=e.event_sources[i];if(S(s)&&typeof s.name=="string"&&o.add(s.name),S(s)&&S(s.config)){let c=typeof s.name=="string"?`event_sources.${s.name}.config`:`event_sources[${i}].config`;n.push(`workflow.yml \u7684 ${c}`)}if(S(s)&&S(s.handler_config)){let c=typeof s.name=="string"?`event_sources.${s.name}.handler_config`:`event_sources[${i}].handler_config`;n.push(`workflow.yml \u7684 ${c}`)}}return{stepIds:r,sourceNames:o,runtimeConfigPaths:n}}catch{return}}a(JT,"readWorkflowAnchors");async function Hm(t,e){let n=[],r=[];if(!await ss(t))return n.push(`workflow \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),{valid:!1,errors:n,warnings:r};let o;try{let l=await as(t,"utf8");o=fl.parse(l)}catch(l){return n.push(`workflow YAML \u89E3\u6790\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`),{valid:!1,errors:n,warnings:r}}if(!S(o))return n.push("workflow.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{valid:!1,errors:n,warnings:r};ZT(o.meta,n,r);let i=YT(o.steps,n,r);QT(o.edges,i,n,r);let s=XT(o.steps);await e_(s,e,n,r);let c=s_(o.steps,o);return i_(o,n,r),t_(o.event_sources,n),r_(o,r),o_(o.steps,n),a_(o.tracker,c,n,r),{valid:n.length===0,errors:n,warnings:r}}a(Hm,"validateDesignOutput");function ZT(t,e,n){if(!S(t)){e.push("workflow.yml \u7F3A\u5C11 meta \u6BB5");return}t.name||e.push("meta.name \u4E0D\u80FD\u4E3A\u7A7A"),t.version||n.push("meta.version \u672A\u8BBE\u7F6E"),t.domain||n.push("meta.domain \u672A\u8BBE\u7F6E")}a(ZT,"validateMeta");function YT(t,e,n){let r=new Set;if(!Array.isArray(t))return e.push("workflow.yml \u7F3A\u5C11 steps \u6570\u7EC4"),r;if(t.length===0)return e.push("steps \u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A"),r;for(let o=0;o<t.length;o++){let i=t[o];if(!S(i)){e.push(`steps[${o}] \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}let s=i.id;if(!s||typeof s!="string"){e.push(`steps[${o}] \u7F3A\u5C11 id \u5B57\u6BB5`);continue}/^[a-z0-9_]+$/.test(s)||e.push(`steps[${o}].id "${s}" \u53EA\u5141\u8BB8\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF`),r.has(s)&&e.push(`\u6B65\u9AA4 id "${s}" \u91CD\u590D`),r.add(s),i.name||n.push(`\u6B65\u9AA4 "${s}" \u7F3A\u5C11 name \u5B57\u6BB5`),!i.recipe&&!i.prompt&&n.push(`\u6B65\u9AA4 "${s}" \u65E2\u6CA1\u6709 recipe \u4E5F\u6CA1\u6709 prompt\uFF0C\u5C06\u65E0\u6CD5\u6267\u884C`),i.auto===void 0&&n.push(`\u6B65\u9AA4 "${s}" \u672A\u8BBE\u7F6E auto \u5B57\u6BB5\uFF0C\u9ED8\u8BA4\u4E3A true`)}return r}a(YT,"validateSteps");function QT(t,e,n,r){if(!Array.isArray(t)){n.push("workflow.yml \u7F3A\u5C11 edges \u6570\u7EC4");return}if(t.length===0){n.push("edges \u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A");return}let o=!1,i=!1;for(let s=0;s<t.length;s++){let c=t[s];if(!S(c)){n.push(`edges[${s}] \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}let l=String(c.from??""),d=String(c.to??"");l||n.push(`edges[${s}] \u7F3A\u5C11 from \u5B57\u6BB5`),d||n.push(`edges[${s}] \u7F3A\u5C11 to \u5B57\u6BB5`),l==="__start__"&&(o=!0),d==="__end__"&&(i=!0),l&&l!=="__start__"&&!e.has(l)&&n.push(`edges[${s}].from \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4: "${l}"`),d&&d!=="__end__"&&!e.has(d)&&n.push(`edges[${s}].to \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4: "${d}"`)}o||n.push("edges \u7F3A\u5C11\u4ECE __start__ \u51FA\u53D1\u7684\u8FB9"),i||n.push("edges \u7F3A\u5C11\u5230\u8FBE __end__ \u7684\u8FB9")}a(QT,"validateEdges");function XT(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)S(n)&&typeof n.recipe=="string"&&e.push(n.recipe);return e}a(XT,"extractReferencedRecipes");async function e_(t,e,n,r){if(!await ss(e)){t.length>0&&n.push(`recipe \u76EE\u5F55\u4E0D\u5B58\u5728: ${e}`);return}let o=[];for(let i of t){let s=rn.join(e,`${i}.recipe.ts`);if(!await ss(s)){n.push(`recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${s}\uFF08\u6B65\u9AA4\u5F15\u7528\u4E86 recipe="${i}"\uFF09`);continue}try{let c=await as(s,"utf8");c.trim().length===0?n.push(`recipe \u6587\u4EF6\u4E3A\u7A7A: ${s}`):c.includes("export default")||n.push(`recipe \u6587\u4EF6\u7F3A\u5C11 "export default": ${s}`),c.includes("RecipeDefinition")||r.push(`recipe \u6587\u4EF6\u672A\u5F15\u7528 RecipeDefinition \u7C7B\u578B: ${s}`);let l=pl(c,s);for(let d of l)n.push(d);c.trim().length>0&&l.length===0&&o.push(s)}catch{n.push(`\u65E0\u6CD5\u8BFB\u53D6 recipe \u6587\u4EF6: ${s}`)}}if(o.length>0){let i=gl(o);i.degraded?r.push(`\u5DF2\u8DF3\u8FC7 recipe \u7C7B\u578B\u68C0\u67E5\uFF1A\u672A\u80FD\u89E3\u6790\u6846\u67B6\u7C7B\u578B\uFF08aitable-workflow-core / zod\uFF09\uFF0C${i.unresolvedModules.length>0?`\u65E0\u6CD5\u89E3\u6790 ${i.unresolvedModules.join("\u3001")}\uFF1B`:""}\u591A\u4E3A node_modules \u7F3A\u5931\u3001\u672A\u6784\u5EFA\u6216 import \u8DEF\u5F84\u9519\u8BEF\uFF1B\u4EC5\u5B8C\u6210\u8BED\u6CD5\u6821\u9A8C\u3002`):n.push(...i.errors)}}a(e_,"validateRecipeFiles");function t_(t,e){if(Array.isArray(t))for(let n=0;n<t.length;n++){let r=t[n];if(!S(r)||r.type!=="aitable_record")continue;let o=typeof r.name=="string"?`"${r.name}"`:`event_sources[${n}]`,i=S(r.config)?r.config:void 0;if(!i||i.filter===void 0&&i.filters===void 0){e.push(`\u4E8B\u4EF6\u6E90 ${o} \u662F aitable_record \u4F46\u6CA1\u6709 config.filter / config.filters\uFF1A\u4F1A\u5168\u8868\u626B\u63CF\uFF0C\u6570\u636E\u91CF\u589E\u957F\u540E\u67E5\u8BE2\u5FC5\u7136\u8D85\u65F6\u3002\u8BF7\u8865\u5145\u7B5B\u9009\u6761\u4EF6\uFF08\u5982 filter: { field: "\u72B6\u6001", equals: "\u5F85\u5904\u7406" }\uFF09\u3002`);continue}i.resolve_field_names===!1&&e.push(`\u4E8B\u4EF6\u6E90 ${o} \u5173\u95ED\u4E86 resolve_field_names\uFF0Cfilter \u7684\u5B57\u6BB5\u540D\u65E0\u6CD5\u7FFB\u8BD1\u6210 fieldId\uFF0C\u4F1A\u9000\u56DE\u6162\u8DEF\u5F84\u5BFC\u81F4\u8D85\u65F6\u3002\u8BF7\u79FB\u9664\u8BE5\u914D\u7F6E\uFF08\u9ED8\u8BA4\u4E3A true\uFF09\u3002`)}}a(t_,"validateEventSourceFilters");var n_=new Set(["seen_file","resolve_field_names","emit_existing","fetch_limit","max_pages","dws_bin"]);function r_(t,e){let n=a((i,s)=>{e.push(`${i} \u51FA\u73B0\u5185\u90E8\u8FD0\u884C\u534F\u8BAE\u5B57\u6BB5 "${s}"\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732`)},"report"),r=t.event_sources;if(Array.isArray(r))for(let i=0;i<r.length;i++){let s=r[i];if(!S(s))continue;let c=typeof s.name=="string"?`\u4E8B\u4EF6\u6E90 "${s.name}"`:`event_sources[${i}]`,l=s.handler_config;if(S(l))for(let d of Object.keys(l))n_.has(d)&&n(`${c} \u7684 handler_config`,d)}let o=S(t.toolkit_config)&&S(t.toolkit_config.file)?t.toolkit_config.file:void 0;o&&"base_dir"in o&&e.push("toolkit_config.file.base_dir \u662F\u5185\u90E8\u8DEF\u5F84\u7EA6\u5B9A\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732")}a(r_,"validateNoInternalConfigExposed");function o_(t,e){if(!Array.isArray(t))return;let n=new Map;for(let r of t){if(!S(r))continue;let o=typeof r.id=="string"?r.id:"unknown",i=r.output_mapping;if(S(i))for(let s of Object.values(i)){if(typeof s!="string")continue;let c=n.get(s);c&&c!==o?e.push(`\u5B57\u6BB5 "${s}" \u540C\u65F6\u662F\u6B65\u9AA4 "${c}" \u548C "${o}" \u7684 output_mapping \u76EE\u6807\uFF1AStepEngine \u4EE5\u300C\u8F93\u51FA\u5B57\u6BB5\u975E\u7A7A\u300D\u5224\u5B9A\u6B65\u9AA4\u5DF2\u5B8C\u6210\uFF0C\u5171\u7528\u8F93\u51FA\u5217\u4F1A\u5BFC\u81F4\u5176\u4E2D\u4E00\u6B65\u88AB\u6C38\u4E45\u8DF3\u8FC7\u3002\u8BF7\u62C6\u6210\u4E24\u4E2A\u5B57\u6BB5\u3002`):n.set(s,o)}}}a(o_,"validateOutputTargetsExclusive");function Gm(t){let e=t.tracker;if(S(e)&&Array.isArray(e.field_definitions))return e.field_definitions;let n=t.field_definitions;return Array.isArray(n)?n:null}a(Gm,"readFieldDefinitions");function i_(t,e,n){if(!S(t))return;let r=Gm(t);if(!r){e.push("workflow.yml \u7F3A\u5C11 tracker.field_definitions \u6BB5\uFF08\u5FC5\u987B\u58F0\u660E\u6240\u6709\u4E1A\u52A1\u5B57\u6BB5\uFF0Cdesign \u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FC1\u79FB\u5230 config\uFF09");return}let o=new Set;for(let s of r)S(s)&&typeof s.name=="string"&&o.add(s.name);let i=t.steps;if(Array.isArray(i))for(let s of i){if(!S(s))continue;let c=typeof s.id=="string"?s.id:"unknown";for(let l of["input_mapping","output_mapping"]){let d=s[l];if(S(d))for(let u of Object.values(d))typeof u=="string"&&(Jm.has(u)||o.has(u)||n.push(`\u6B65\u9AA4 "${c}" \u7684 ${l} \u5F15\u7528\u4E86\u5B57\u6BB5 "${u}"\uFF0C\u4F46\u672A\u5728 field_definitions \u4E2D\u58F0\u660E`))}}}a(i_,"validateFieldDefinitionsCoverage");var Jm=io;function s_(t,e){let n=new Set(Jm);if(Array.isArray(t)){for(let r of t)if(S(r)){if(S(r.input_mapping))for(let o of Object.values(r.input_mapping))typeof o=="string"&&n.add(o);if(S(r.output_mapping))for(let o of Object.values(r.output_mapping))typeof o=="string"&&n.add(o)}}for(let r of(e?Gm(e):null)??[])S(r)&&typeof r.name=="string"&&n.add(r.name);return n}a(s_,"extractAllFieldNames");function a_(t,e,n,r){if(!S(t)||t.views===void 0)return;let o=t.views;if(!Array.isArray(o)){n.push("tracker.views \u5FC5\u987B\u662F\u6570\u7EC4");return}let i=new Set,s=!1;for(let c=0;c<o.length;c++){let l=o[c],d=S(l)?`tracker.views[${c}] (id="${l.id??""}")`:`tracker.views[${c}]`,u=ro.safeParse(l);if(!u.success){let p=u.error.issues.map(g=>`${g.path.join(".")}: ${g.message}`);n.push(`${d} Schema \u6821\u9A8C\u5931\u8D25: ${p.join("; ")}`);continue}let f=u.data;if(i.has(f.id)&&n.push(`${d} id "${f.id}" \u91CD\u590D`),i.add(f.id),f.id==="default_grid"&&(s=!0),f.type==="Grid"&&!f.field_order?.length&&r.push(`${d} Grid \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B field_order`),f.type==="FormDesigner"&&!f.visible_fields?.length&&r.push(`${d} FormDesigner \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B visible_fields`),f.type==="Kanban"&&!f.group_by&&n.push(`${d} Kanban \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A group_by`),(f.type==="Calendar"||f.type==="Gantt")&&!f.date_field&&n.push(`${d} ${f.type} \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A date_field`),e.size>0){let p=f.visible_fields??f.field_order??[];for(let g of p)e.has(g)||n.push(`${d} \u5F15\u7528\u4E86\u672A\u5728 workflow \u4E2D\u5B9A\u4E49\u7684\u5B57\u6BB5: "${g}"\uFF08\u89C6\u56FE\u4E0D\u5141\u8BB8\u521B\u9020\u65B0\u5B57\u6BB5\uFF0C\u8BF7\u5148\u5728 steps mapping \u6216 field_definitions \u4E2D\u58F0\u660E\uFF09`);f.group_by&&!e.has(f.group_by)&&n.push(`${d} group_by \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.group_by}"`),f.date_field&&!e.has(f.date_field)&&n.push(`${d} date_field \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.date_field}"`)}}s||r.push('tracker.views \u7F3A\u5C11 id="default_grid" \u7684 Grid \u89C6\u56FE\uFF08\u5EFA\u8BAE\u6DFB\u52A0\uFF09')}a(a_,"validateTrackerViews");function pl(t,e){let n=Je.createSourceFile(rn.basename(e),t,Je.ScriptTarget.ESNext,!0,Je.ScriptKind.TS),r=n.parseDiagnostics??Je.createProgram({rootNames:[],options:{}}).getSyntacticDiagnostics(n);return!r||r.length===0?[]:r.map(o=>{let{line:i}=Je.getLineAndCharacterOfPosition(n,o.start),s=Je.flattenDiagnosticMessageText(o.messageText," ");return`recipe \u8BED\u6CD5\u9519\u8BEF [${rn.basename(e)}:${i+1}]: ${s}`})}a(pl,"checkRecipeSyntax");function gl(t){let e={target:Je.ScriptTarget.ESNext,module:Je.ModuleKind.NodeNext,moduleResolution:Je.ModuleResolutionKind.NodeNext,strict:!0,noEmit:!0,skipLibCheck:!0,types:[]},n;try{let s=Je.createProgram({rootNames:t,options:e}),c=new Set(t.map(l=>rn.resolve(l)));n=Je.getPreEmitDiagnostics(s).filter(l=>l.file!=null&&c.has(rn.resolve(l.file.fileName)))}catch{return{errors:[],degraded:!0,unresolvedModules:[]}}let r=n.filter(s=>s.code===2307).map(s=>c_(s)).filter(s=>!!s);return r.length>0||n.some(s=>s.code===2307)?{errors:[],degraded:!0,unresolvedModules:[...new Set(r)]}:{errors:n.map(s=>{let c=s.file&&s.start!=null?`${rn.basename(s.file.fileName)}:${s.file.getLineAndCharacterOfPosition(s.start).line+1}`:"recipe",l=Je.flattenDiagnosticMessageText(s.messageText," ");return`recipe \u7C7B\u578B\u9519\u8BEF [${c}]: TS${s.code} ${l}`}),degraded:!1,unresolvedModules:[]}}a(gl,"checkRecipeTypes");function c_(t){let e=Je.flattenDiagnosticMessageText(t.messageText," ");return(e.match(/Cannot find module ['"]([^'"]+)['"]/)??e.match(/找不到模块[“"]([^”"]+)[”"]/))?.[1]??null}a(c_,"unresolvedModuleName");async function ss(t){try{return await VT(t),!0}catch{return!1}}a(ss,"fileExists");async function l_(t){try{return(await qT(rn.join(t,"roles"))).some(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return!1}}a(l_,"hasRoleFiles");async function Zm(t,e,n){let r=[],o=new Set;for(let s of e.steps)s.recipe&&o.add(s.recipe);for(let s of e.eventSources)s.handler&&o.add(s.handler);for(let s of e.eventHandlers)s.recipe&&o.add(s.recipe);let i=[];for(let s of o){let c=ir(t,s);if(!c||!c.endsWith(".ts"))continue;let l;try{l=await d_(c,"utf8")}catch{continue}let d=pl(l,c);for(let u of d)r.push({code:"WF-T01",severity:"error",message:u,location:{file:n(s),recipeId:s}});d.length===0&&i.push(c)}if(i.length>0){let s=gl(i);if(s.degraded){let c=s.unresolvedModules.length>0?`\u65E0\u6CD5\u89E3\u6790 ${s.unresolvedModules.join("\u3001")}\uFF1B`:"";r.push({code:"WF-T03",severity:"warning",message:`\u5DF2\u8DF3\u8FC7 recipe \u7C7B\u578B\u68C0\u67E5\uFF1A\u672A\u80FD\u89E3\u6790\u6846\u67B6\u7C7B\u578B\uFF08${c}node_modules \u7F3A\u5931\u3001\u672A\u6784\u5EFA\u6216 import \u8DEF\u5F84\u9519\u8BEF\uFF09\uFF0C\u4EC5\u5B8C\u6210\u8BED\u6CD5\u6821\u9A8C`})}else for(let c of s.errors)r.push({code:"WF-T02",severity:"error",message:c,location:{file:u_(c,i,n)}})}return r}a(Zm,"checkRecipeTypecheck");function u_(t,e,n){for(let r of e){let o=r.split("/").pop()??r;if(t.includes(o)){let i=o.replace(/\.recipe\.ts$/,"");return n(i)}}}a(u_,"guessRecipeRelFile");async function Qm(t,e,n){let r=[];if(!n.skipConfigSchema){let o=await sr(t,e);for(let i of o.issues){let s=i.stepId.startsWith("event:");r.push({code:s?"WF-C02":"WF-C01",severity:i.level==="error"?"error":"warning",message:`[${i.recipeId}] ${i.message}`,location:{stepId:s?void 0:i.stepId,key:s?i.stepId:void 0,recipeId:i.recipeId}})}}for(let o of e.steps){if(o.config&&co(o.config,{onIssue:a((i,s,c)=>r.push(ao(s,c,{stepId:o.id,key:`steps.${o.id}.config.${i}`,message:`\u6B65\u9AA4\u300C${o.id}\u300Dconfig.${i} \u542B\u5D4C\u5165\u5F0F\u5F15\u7528 "${s}"`})),"onIssue")}),o.input_mapping)for(let[i,s]of Object.entries(o.input_mapping))Ym(s,c=>r.push(ao(c,"mapping",{stepId:o.id,key:`input_mapping.${i}`,message:`\u6B65\u9AA4\u300C${o.id}\u300Dinput_mapping.${i} \u7684\u503C "${s}" \u542B "${c}"\u2014\u2014\u6620\u5C04\u503C\u5FC5\u987B\u662F\u9759\u6001\u8868\u683C\u5B57\u6BB5\u540D`})));if(o.output_mapping)for(let[i,s]of Object.entries(o.output_mapping))Ym(s,c=>r.push(ao(c,"mapping",{stepId:o.id,key:`output_mapping.${i}`,message:`\u6B65\u9AA4\u300C${o.id}\u300Doutput_mapping.${i} \u7684\u503C "${s}" \u542B "${c}"\u2014\u2014\u6620\u5C04\u503C\u5FC5\u987B\u662F\u9759\u6001\u8868\u683C\u5B57\u6BB5\u540D`})))}for(let o of e.eventSources){let i=`event_source\u300C${o.name||o.handler}\u300D`;co(o.config,{onIssue:a((s,c,l)=>r.push(ao(c,l,{key:`event_sources.${o.name}.config.${s}`,message:`${i} config.${s} \u542B\u5D4C\u5165\u5F0F\u5F15\u7528 "${c}"`})),"onIssue")}),o.handler_config&&co(o.handler_config,{onIssue:a((s,c,l)=>r.push(ao(c,l,{key:`event_sources.${o.name}.handler_config.${s}`,message:`${i} handler_config.${s} \u542B\u5D4C\u5165\u5F0F\u5F15\u7528 "${c}"`})),"onIssue")})}return r}a(Qm,"checkConfigContract");function Ym(t,e){let n=t.match(/\$\{[^}]+\}/);n&&e(n[0])}a(Ym,"checkMappingValue");var f_=/\$\{(env|config|globalVar)\.[^}]+\}/g;function co(t,e,n=[]){if(typeof t=="string"){if(ze(t)!==null)return;for(let r of t.matchAll(f_)){let o=r[0],i=o.startsWith("${env.")?"env":o.startsWith("${config.")?"config":"globalVar";i!=="env"&&e.onIssue(n.join(".")||"<root>",o,i)}return}if(Array.isArray(t)){t.forEach((r,o)=>co(r,e,[...n,String(o)]));return}if(t&&typeof t=="object")for(let[r,o]of Object.entries(t))co(o,e,[...n,r])}a(co,"scanEmbeddedRefs");function ao(t,e,n){let r=e==="mapping"?"\u8BF7\u6539\u4E3A\u9759\u6001\u5B57\u6BB5\u540D":`\u8FD0\u884C\u671F\u53EA\u6709\u6574\u503C\u5F15\u7528\uFF08\u503C\u6070\u4E3A "${t}"\uFF09\u624D\u4F1A\u88AB\u6D3B\u8BFB\uFF0C\u5D4C\u5165\u5F0F\u5F15\u7528\u4F1A\u539F\u6837\u900F\u4F20\uFF1B\u8BF7\u628A\u5F15\u7528\u63D0\u5347\u4E3A\u6574\u503C\u6216\u53BB\u6389`;return{code:"WF-C03",severity:"error",message:`${n.message}\u3002${r}`,location:{stepId:n.stepId,key:n.key}}}a(ao,"embeddedIssue");var Xm="__start__",p_="__end__",g_=/\{\{(\$var\.[\w.]+|[\w一-鿿]+)\}\}/g;function eh(t){let{workflow:e,contracts:n,knownRecipeIds:r,scaffold:o}=t,i=[],s=new Set(o);if(t.declaredFieldNames)for(let k of t.declaredFieldNames)s.add(k);for(let k of e.fieldDefinitions)s.add(k.name);let c=e.steps,l=new Set(c.map(k=>k.id)),d=new Map(c.map(k=>[k.id,k])),u=new Map,f=new Map;for(let k of[Xm,p_,...l])u.set(k,new Set),f.set(k,new Set);for(let k of e.edges)!u.has(k.from)||!u.has(k.to)||(u.get(k.from).add(k.to),f.get(k.to).add(k.from));let p=new Map,g=a(k=>{let R=p.get(k);if(R)return R;let T=new Set,_=[...f.get(k)??[]];for(;_.length>0;){let C=_.shift();T.has(C)||(T.add(C),_.push(...f.get(C)??[]))}return R=T,p.set(k,R),R},"ancestorsOf"),m=a((k,R)=>{let T=new Set,_=[...u.get(Xm)??[]];for(;_.length>0;){let C=_.shift();if(!(C===k||T.has(C))){if(C===R)return!0;T.add(C),_.push(...u.get(C)??[])}}return!1},"bypassable"),y=s,w=a(k=>{let R=new Set(y);for(let[T,_]of b)if(T!==k&&g(k).has(T))for(let C of _)R.add(C);return R},"readableFieldsFor"),b=new Map;for(let k of c)k.output_mapping&&b.set(k.id,new Set(Object.values(k.output_mapping)));let x=new Set,I=a((k,R)=>{if(!k||!r.has(k))return null;let T=n.get(k);if(!T)return null;let _=[];return T.inputs.kind==="unknown"&&_.push(`\u8F93\u5165\uFF08${T.inputs.reason}\uFF09`),T.outputs.kind==="unknown"&&_.push(`\u8F93\u51FA\uFF08${T.outputs.reason}\uFF09`),_.length>0&&!x.has(k)&&(x.add(k),i.push({code:"WF-D12",severity:"suggestion",message:`recipe\u300C${k}\u300D\u7684\u5951\u7EA6\u4E0D\u53EF\u5B8C\u5168\u9759\u6001\u63A8\u65AD\uFF1A${_.join("\u3001")}\u3002\u6B65\u9AA4\u300C${R}\u300D\u76F8\u5173\u7684\u5BF9\u8D26\u5DF2\u964D\u7EA7\uFF1B\u5EFA\u8BAE\u91CD\u6784\u4E3A\u9759\u6001\u53EF\u63A8\u65AD\u98CE\u683C\uFF08\u5B57\u9762\u91CF\u8BBF\u95EE input.X\u3001\u5B57\u9762\u91CF\u8FD4\u56DE output\uFF09`,location:{recipeId:k,stepId:R}})),T},"contractOf"),v=a((k,R,T,_)=>{let C=R.split("."),E=C[0],F=C[1];if(!l.has(E)){i.push({code:"WF-D06",severity:"error",message:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\u300C${E}\u300D\uFF08$var.${R}\uFF09`,location:{stepId:k,key:_}});return}if(!g(k).has(E)){i.push({code:"WF-D07",severity:"error",message:E===k?`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u4E86\u81EA\u5DF1\u7684\u8F93\u51FA\uFF08$var.${R}\uFF09\u2014\u2014\u53D8\u91CF\u6C60\u53EA\u6709\u524D\u5E8F\u6B65\u9AA4\u7684\u8F93\u51FA`:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u4E86\u975E\u524D\u5E8F\u6B65\u9AA4\u300C${E}\u300D\u7684\u8F93\u51FA\uFF08$var.${R}\uFF09\u2014\u2014\u53D8\u91CF\u6C60\u4EC5\u5728\u5355\u6B21\u6267\u884C\u5185\u7531\u524D\u5E8F\u6B65\u9AA4\u586B\u5145`,location:{stepId:k,key:_}});return}if(m(E,k)&&i.push({code:"WF-D08",severity:"warning",message:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u7684\u300C${E}\u300D\u8F93\u51FA\uFF08$var.${R}\uFF09\u4E0D\u4FDD\u8BC1\u6709\u503C\uFF1A\u5B58\u5728\u7ED5\u8FC7\u300C${E}\u300D\u7684\u6267\u884C\u8DEF\u5F84`,location:{stepId:k,key:_}}),F){let P=d.get(E),O=P?.recipe?n.get(P.recipe):void 0;O&&O.outputs.kind==="exact"&&!O.outputs.keys.has(F)&&i.push({code:"WF-D09",severity:"error",message:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528 $var.${R}\uFF0C\u4F46\u6B65\u9AA4\u300C${E}\u300D\u7684 recipe \u4E0D\u4F1A\u4EA7\u51FA\u300C${F}\u300D\uFF08\u53EF\u63A8\u65AD\u4EA7\u51FA\u96C6\uFF1A${ml(O.outputs.keys)}\uFF09`,location:{stepId:k,key:_}})}},"checkVarRef");for(let k of c){let R=I(k.recipe,k.id),T=R&&R.inputs.kind==="exact"?R.inputs.keys:null,_=R&&R.outputs.kind==="exact"?R.outputs.keys:null;if(k.input_mapping){for(let[C,E]of Object.entries(k.input_mapping)){if(E.startsWith("$var.")){v(k.id,E.slice(5),"\u7684 input_mapping ",`input_mapping.${C}`);continue}E.includes("${")||(w(k.id).has(E)||i.push({code:"WF-D01",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Dinput_mapping.${C} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u5B57\u6BB5\u300C${E}\u300D\uFF08\u672A\u5728 field_definitions \u58F0\u660E\uFF0C\u4E5F\u4E0D\u662F\u524D\u5E8F\u6B65\u9AA4\u7684\u5199\u5165\u76EE\u6807\uFF09\u2014\u2014\u8FD0\u884C\u65F6\u4F1A\u9759\u9ED8\u8BFB\u6210\u7A7A\u503C`,location:{stepId:k.id,key:`input_mapping.${C}`}}),T&&!T.has(C)&&i.push({code:"WF-D02",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Dinput_mapping \u4F20\u5165\u4E86\u300C${C}\u300D\uFF0C\u4F46 recipe\u300C${k.recipe}\u300D\u4E0D\u4F1A\u6D88\u8D39\u5B83\uFF08\u53EF\u63A8\u65AD\u6D88\u8D39\u96C6\uFF1A${ml(T)}\uFF09\u2014\u2014\u53C2\u6570\u672A\u6D88\u8D39`,location:{stepId:k.id,key:`input_mapping.${C}`,recipeId:k.recipe}}))}if(T){let C=new Set(Object.keys(k.input_mapping));for(let E of T)C.has(E)||i.push({code:"WF-D03",severity:"warning",message:`\u6B65\u9AA4\u300C${k.id}\u300D\u7684 recipe\u300C${k.recipe}\u300D\u4F1A\u6D88\u8D39\u300C${E}\u300D\uFF0C\u4F46 input_mapping \u672A\u63D0\u4F9B\uFF08\u8FD0\u884C\u65F6\u8BE5\u503C\u4E3A undefined\uFF0C\u8BF7\u786E\u8BA4 recipe \u5DF2\u5BB9\u5FCD\u7F3A\u7701\uFF09`,location:{stepId:k.id,key:E,recipeId:k.recipe}})}}else if(T)for(let C of T)y.has(C)||i.push({code:"WF-D03",severity:"warning",message:`\u6B65\u9AA4\u300C${k.id}\u300D\u65E0 input_mapping\uFF08\u6574\u884C\u6CE8\u5165\uFF09\uFF0Crecipe\u300C${k.recipe}\u300D\u6D88\u8D39\u7684\u300C${C}\u300D\u4E0D\u5728\u5B57\u6BB5\u53EF\u89C1\u96C6\u4E2D\uFF08\u8FD0\u884C\u65F6\u53EF\u80FD\u4E3A undefined\uFF09`,location:{stepId:k.id,key:C,recipeId:k.recipe}});if(k.output_mapping)for(let[C,E]of Object.entries(k.output_mapping))_&&!_.has(C)&&i.push({code:"WF-D04",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Doutput_mapping \u58F0\u660E\u5199\u5165\u300C${C}\u300D\uFF0C\u4F46 recipe\u300C${k.recipe}\u300D\u4E0D\u4F1A\u4EA7\u51FA\u5B83\uFF08\u53EF\u63A8\u65AD\u4EA7\u51FA\u96C6\uFF1A${ml(_)}\uFF09\u2014\u2014\u5B57\u6BB5\u300C${E}\u300D\u5C06\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u5199\u5165\uFF08\u8FD0\u884C\u65F6\u9759\u9ED8\u8DF3\u8FC7\uFF09`,location:{stepId:k.id,key:`output_mapping.${C}`,recipeId:k.recipe}}),y.has(E)||i.push({code:"WF-D05",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Doutput_mapping \u7684\u76EE\u6807\u5B57\u6BB5\u300C${E}\u300D\u672A\u5728 field_definitions \u58F0\u660E\uFF08\u4F1A\u5199\u5165\u5E7D\u7075\u5217\uFF0Csetup \u4E0D\u4F1A\u521B\u5EFA\u8BE5\u5217\uFF09`,location:{stepId:k.id,key:`output_mapping.${C}`}});if(R)for(let C of R.variableReads)v(k.id,`${C.stepId}.${C.key}`,"\u7684 recipe \u4F53\u5185 ",`ctx.variables.${C.stepId}.${C.key}`);k.prompt&&!k.recipe&&m_(k,i,v,l,y)}return i}a(eh,"checkDataflow");function m_(t,e,n,r,o){for(let i of(t.prompt??"").matchAll(g_)){let s=i[1];if(s.startsWith("$var.")){n(t.id,s.slice(5),"\u7684 prompt ",`prompt {{${s}}}`);continue}o.has(s)||r.has(s)||e.push({code:"WF-D10",severity:"error",message:`\u6B65\u9AA4\u300C${t.id}\u300Dprompt \u4E2D\u7684 {{${s}}} \u65E0\u6CD5\u89E3\u6790\uFF1A\u4E0D\u662F\u5DF2\u58F0\u660E\u5B57\u6BB5\u4E5F\u4E0D\u662F\u53D8\u91CF\u6C60\u547D\u540D\u7A7A\u95F4\uFF08\u8FD0\u884C\u65F6\u4F1A\u539F\u6837\u4FDD\u7559\u4E3A\u5360\u4F4D\u7B26\uFF09`,location:{stepId:t.id,key:`prompt {{${s}}}`}})}}a(m_,"checkPromptTokens");function ml(t){if(t.size===0)return"\u7A7A";let e=[...t];return e.length>8?`${e.slice(0,8).join(", ")} \u7B49 ${e.length} \u4E2A`:e.join(", ")}a(ml,"formatKeys");import M from"typescript";function bl(t,e){try{return h_(t,e)}catch{return{recipePath:e,inputs:{kind:"unknown",reason:"AST \u63A8\u65AD\u5F02\u5E38"},outputs:{kind:"unknown",reason:"AST \u63A8\u65AD\u5F02\u5E38"},variableReads:[]}}}a(bl,"inferRecipeContractFromSource");var pe=a(t=>({kind:"unknown",reason:t}),"unknown");function h_(t,e){let n=M.createSourceFile(e,t,M.ScriptTarget.ESNext,!0,M.ScriptKind.TS),r=y_(n);if(!r)return{recipePath:e,inputs:pe("\u672A\u5B9A\u4F4D execute \u51FD\u6570"),outputs:pe("\u672A\u5B9A\u4F4D execute \u51FD\u6570"),variableReads:[]};let o=new hl(n,r.body),i=w_(o,r.param),s=x_(o),c=__(o,r.param);return{recipePath:e,inputs:i,outputs:s,variableReads:c}}a(h_,"inferInternal");function y_(t){let e=null,n=a(r=>{if(!e){if(M.isMethodDeclaration(r)&&r.name&&M.isIdentifier(r.name)&&r.name.text==="execute"&&r.body){e={body:r.body,param:r.parameters[0]};return}if(M.isPropertyAssignment(r)&&M.isIdentifier(r.name)&&r.name.text==="execute"){let o=r.initializer;if((M.isArrowFunction(o)||M.isFunctionExpression(o))&&o.body&&M.isBlock(o.body)){e={body:o.body,param:o.parameters[0]};return}}M.forEachChild(r,n)}},"visit");return n(t),e}a(y_,"findExecuteFunction");var hl=class{constructor(e,n){this.sourceFile=e;this.executeBody=n}sourceFile;executeBody;static{a(this,"InferenceContext")}inputAliases=new Set;variablesAliases=new Set;inputDynamicReasons=[]};function w_(t,e){if(!e)return pe("execute \u65E0\u53C2\u6570\uFF0C\u65E0\u6CD5\u5B9A\u4F4D ctx.input");if(b_(t,e),t.inputAliases.size===0)return pe("execute \u53C2\u6570\u672A\u7ED1\u5B9A ctx.input");k_(t);let n=new Set;return S_(t,t.executeBody,n),t.inputDynamicReasons.length>0?pe(t.inputDynamicReasons[0]):{kind:"exact",keys:n}}a(w_,"inferInputs");function b_(t,e){let n=e.name;if(M.isIdentifier(n))t.inputAliases.add(`@param:${n.text}`),t.variablesAliases.add(`@param:${n.text}`);else if(M.isObjectBindingPattern(n))for(let r of n.elements){let o=r.propertyName??r.name;!M.isIdentifier(o)||!M.isIdentifier(r.name)||(o.text==="input"&&t.inputAliases.add(r.name.text),o.text==="variables"&&t.variablesAliases.add(r.name.text))}}a(b_,"seedAliases");function k_(t){for(let e=0;e<8;e++){let n=!1,r=a(o=>{if(M.isVariableDeclaration(o)&&o.initializer&&M.isObjectBindingPattern(o.name)&&v_(t,o.initializer))for(let i of o.name.elements){let s=i.propertyName??i.name;!M.isIdentifier(s)||!M.isIdentifier(i.name)||(s.text==="input"&&!t.inputAliases.has(i.name.text)&&(t.inputAliases.add(i.name.text),n=!0),s.text==="variables"&&!t.variablesAliases.has(i.name.text)&&(t.variablesAliases.add(i.name.text),n=!0))}M.isVariableDeclaration(o)&&o.initializer&&M.isIdentifier(o.name)&&(lr(t,o.initializer)&&!t.inputAliases.has(o.name.text)&&(t.inputAliases.add(o.name.text),n=!0),th(t,o.initializer)&&!t.variablesAliases.has(o.name.text)&&(t.variablesAliases.add(o.name.text),n=!0)),M.forEachChild(o,r)},"visit");if(r(t.executeBody),!n)break}}a(k_,"propagateAliases");function v_(t,e){return M.isIdentifier(e)&&t.inputAliases.has(`@param:${e.text}`)}a(v_,"isAliasExpr");function lr(t,e){return M.isIdentifier(e)?t.inputAliases.has(e.text):M.isPropertyAccessExpression(e)&&M.isIdentifier(e.name)&&e.name.text==="input"||M.isElementAccessExpression(e)&&M.isStringLiteral(e.argumentExpression)&&e.argumentExpression.text==="input"?yl(t,e.expression):!1}a(lr,"isInputAliasExpr");function th(t,e){return M.isIdentifier(e)?t.variablesAliases.has(e.text):M.isPropertyAccessExpression(e)&&M.isIdentifier(e.name)&&e.name.text==="variables"?yl(t,e.expression):!1}a(th,"isVariablesAliasExpr");function yl(t,e){return M.isIdentifier(e)&&t.inputAliases.has(`@param:${e.text}`)}a(yl,"isCtxExpr");function S_(t,e,n){let r=a(i=>{t.inputDynamicReasons.push(i)},"dynamic"),o=a(i=>{if(M.isPropertyAccessExpression(i)&&lr(t,i.expression)&&M.isIdentifier(i.name)){n.add(i.name.text);return}if(M.isElementAccessExpression(i)&&lr(t,i.expression)){M.isStringLiteral(i.argumentExpression)?n.add(i.argumentExpression.text):r("\u5B58\u5728 input[\u53D8\u91CF] \u5F62\u5F0F\u7684\u52A8\u6001\u7D22\u5F15\u8BBF\u95EE");return}if(M.isVariableDeclaration(i)&&i.initializer&&lr(t,i.initializer)&&M.isObjectBindingPattern(i.name)){for(let s of i.name.elements){if(s.dotDotDotToken){r("input \u89E3\u6784\u5E26 ...rest\uFF0C\u53EF\u80FD\u6D88\u8D39\u4EFB\u610F key");continue}let c=s.propertyName??s.name;M.isIdentifier(c)?n.add(c.text):r("input \u89E3\u6784\u542B\u975E\u6807\u8BC6\u7B26\u7ED1\u5B9A")}return}if((M.isSpreadAssignment(i)||M.isSpreadElement(i))&&lr(t,i.expression)){r("input \u88AB\u5C55\u5F00\uFF08...input\uFF09\uFF0C\u53EF\u80FD\u6D88\u8D39\u4EFB\u610F key");return}if(M.isCallExpression(i))for(let s of i.arguments)(lr(t,s)||M.isIdentifier(s)&&t.inputAliases.has(`@param:${s.text}`))&&r("input \u88AB\u6574\u4F53\u4F5C\u4E3A\u53C2\u6570\u4F20\u9012\uFF0C\u6D88\u8D39\u96C6\u4E0D\u53EF\u9759\u6001\u5224\u5B9A");M.forEachChild(i,o)},"visit");o(e)}a(S_,"collectInputUsage");function x_(t){let e=nh(t.executeBody);if(e.length===0)return pe("execute \u4F53\u5185\u672A\u53D1\u73B0 return");let n=new Set;for(let r of e){let o=dr(t,r,0,new Set);if(o.kind==="unknown")return o;for(let i of o.keys)n.add(i)}return{kind:"exact",keys:n}}a(x_,"inferOutputs");function nh(t){let e=[],n=a(r=>{if(!(r!==t&&(M.isArrowFunction(r)||M.isFunctionExpression(r)||M.isFunctionDeclaration(r)||M.isMethodDeclaration(r)))){if(M.isReturnStatement(r)&&r.expression){e.push(r.expression);return}M.forEachChild(r,n)}},"visit");return n(t),e}a(nh,"collectDirectReturns");function dr(t,e,n,r){if(n>3)return pe("\u8FD4\u56DE\u8868\u8FBE\u5F0F\u5D4C\u5957\u8FC7\u6DF1");if(r.has(e))return{kind:"exact",keys:new Set};if(M.isObjectLiteralExpression(e)){let o=e.properties.find(i=>M.isPropertyAssignment(i)||M.isMethodDeclaration(i)?ih(i.name)==="output":M.isShorthandPropertyAssignment(i)?i.name.text==="output":!1);return o?M.isShorthandPropertyAssignment(o)?oh(t,"output",n,r):M.isPropertyAssignment(o)?ur(t,o.initializer,n+1,r):pe("output \u6210\u5458\u5F62\u6001\u4E0D\u53EF\u89E3\u6790"):{kind:"exact",keys:new Set}}if(M.isIdentifier(e))return rh(t,e.text,n,r,dr);if(M.isCallExpression(e))return C_(t,e,n,r);if(M.isConditionalExpression(e)){let o=dr(t,e.whenTrue,n+1,r);if(o.kind==="unknown")return o;let i=dr(t,e.whenFalse,n+1,r);return i.kind==="unknown"?i:{kind:"exact",keys:new Set([...o.keys,...i.keys])}}return M.isParenthesizedExpression(e)?dr(t,e.expression,n+1,r):pe("\u8FD4\u56DE\u8868\u8FBE\u5F0F\u4E0D\u53EF\u9759\u6001\u89E3\u6790")}a(dr,"resolveExprOutputKeys");function ur(t,e,n,r){if(n>3)return pe("output \u8868\u8FBE\u5F0F\u5D4C\u5957\u8FC7\u6DF1");if(r.has(e))return{kind:"exact",keys:new Set};if(M.isObjectLiteralExpression(e)){let o=new Set;for(let i of e.properties)if(M.isPropertyAssignment(i)||M.isMethodDeclaration(i)){let s=ih(i.name);if(s===void 0)return pe("output \u542B\u8BA1\u7B97\u5C5E\u6027\u540D\uFF08\u4E0D\u53EF\u9759\u6001\u679A\u4E3E\uFF09");o.add(s)}else if(M.isShorthandPropertyAssignment(i))o.add(i.name.text);else if(M.isSpreadAssignment(i)){let s=ur(t,i.expression,n+1,r);if(s.kind==="unknown")return s;for(let c of s.keys)o.add(c)}return{kind:"exact",keys:o}}if(M.isIdentifier(e))return oh(t,e.text,n,r);if(M.isConditionalExpression(e)){let o=ur(t,e.whenTrue,n+1,r);if(o.kind==="unknown")return o;let i=ur(t,e.whenFalse,n+1,r);return i.kind==="unknown"?i:{kind:"exact",keys:new Set([...o.keys,...i.keys])}}return M.isParenthesizedExpression(e)?ur(t,e.expression,n+1,r):pe("output \u503C\u4E0D\u53EF\u9759\u6001\u89E3\u6790")}a(ur,"resolveOutputValue");function rh(t,e,n,r,o){if(n>3)return pe(`\u53D8\u91CF\u300C${e}\u300D\u89E3\u6790\u5D4C\u5957\u8FC7\u6DF1`);let i=new Set,s=!1,c=null,l=a(d=>{let u=null;if(M.isVariableDeclaration(d)&&M.isIdentifier(d.name)&&d.name.text===e&&d.initializer?u=d.initializer:M.isBinaryExpression(d)&&d.operatorToken.kind===M.SyntaxKind.EqualsToken&&M.isIdentifier(d.left)&&d.left.text===e&&(u=d.right),u){let f=o(t,u,n+1,r);if(f.kind==="unknown")c=f.reason;else{s=!0;for(let p of f.keys)i.add(p)}}M.forEachChild(d,l)},"collectAssignments");return l(t.executeBody),c?pe(`\u53D8\u91CF\u300C${e}\u300D\u5B58\u5728\u4E0D\u53EF\u89E3\u6790\u7684\u8D4B\u503C\u6765\u6E90\uFF1A${c}`):s?{kind:"exact",keys:i}:pe(`\u53D8\u91CF\u300C${e}\u300D\u672A\u627E\u5230\u5B57\u9762\u91CF\u521D\u59CB\u5316`)}a(rh,"resolveVariableBy");function oh(t,e,n,r){let o=rh(t,e,n,r,ur);if(o.kind==="unknown")return o;let i=new Set(o.keys),s=null,c=a(l=>{if(M.isBinaryExpression(l)&&l.operatorToken.kind===M.SyntaxKind.EqualsToken){let d=l.left;if(M.isPropertyAccessExpression(d)&&M.isIdentifier(d.expression)&&d.expression.text===e)i.add(d.name.text);else if(M.isElementAccessExpression(d)&&M.isIdentifier(d.expression)&&d.expression.text===e){let u=d.argumentExpression;if(M.isStringLiteral(u))i.add(u.text);else if(M.isIdentifier(u)){let f=I_(t,u.text);if(f.kind==="unknown")s=f.reason;else for(let p of f.keys)i.add(p)}else s="\u52A8\u6001\u952E\u5199\u5165\uFF08\u7D22\u5F15\u8868\u8FBE\u5F0F\u4E0D\u53EF\u9759\u6001\u679A\u4E3E\uFF09"}}M.forEachChild(l,c)},"mutations");return c(t.executeBody),s?pe(`output \u53D8\u91CF\u300C${e}\u300D\u5B58\u5728\u52A8\u6001\u952E\u5199\u5165\uFF1A${s}`):{kind:"exact",keys:i}}a(oh,"resolveVariableOutputObjectKeys");function I_(t,e){let n=new Set,r=!1,o=!1,i=a(s=>{if(M.isForOfStatement(s)){let c=s.initializer;if(M.isVariableDeclarationList(c)&&c.declarations.length===1&&M.isIdentifier(c.declarations[0].name)&&c.declarations[0].name.text===e){r=!0;let d=wl(t,s.expression,0);if(d.kind==="unknown")o=!0;else for(let u of d.keys)n.add(u)}}M.forEachChild(s,i)},"find");return i(t.executeBody),o?pe("for-of \u8FED\u4EE3\u7684\u6570\u7EC4\u4E0D\u53EF\u9759\u6001\u679A\u4E3E"):r?{kind:"exact",keys:n}:pe(`\u6807\u8BC6\u7B26\u300C${e}\u300D\u975E\u5B57\u9762\u91CF\u6570\u7EC4\u7684 for-of \u8FED\u4EE3\u53D8\u91CF`)}a(I_,"resolveForOfLiteralKeys");function wl(t,e,n){if(n>2)return pe("\u6570\u7EC4\u5B57\u9762\u91CF\u5D4C\u5957\u8FC7\u6DF1");if(M.isIdentifier(e)){let o=R_(t.sourceFile,e.text);return o?wl(t,o,n+1):pe(`\u6570\u7EC4\u300C${e.text}\u300D\u5B9A\u4E49\u4E0D\u53EF\u5B9A\u4F4D`)}if(!M.isArrayLiteralExpression(e))return pe("\u8FED\u4EE3\u6E90\u4E0D\u662F\u5B57\u9762\u91CF\u6570\u7EC4");let r=new Set;for(let o of e.elements)if(M.isStringLiteral(o))r.add(o.text);else if(M.isSpreadElement(o)){let i=wl(t,o.expression,n+1);if(i.kind==="unknown")return i;for(let s of i.keys)r.add(s)}else return pe("\u6570\u7EC4\u542B\u975E\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u5143\u7D20");return{kind:"exact",keys:r}}a(wl,"resolveArrayLiteralStrings");function R_(t,e){let n=null,r=a(o=>{if(!n){if(M.isVariableDeclaration(o)&&M.isIdentifier(o.name)&&o.name.text===e&&o.initializer&&M.isArrayLiteralExpression(o.initializer)){n=o.initializer;return}M.forEachChild(o,r)}},"visit");return r(t),n}a(R_,"findConstArrayDeclaration");function C_(t,e,n,r){if(!M.isIdentifier(e.expression))return pe("\u8FD4\u56DE\u503C\u4E3A\u590D\u6742\u8868\u8FBE\u5F0F\u8C03\u7528");let o=e.expression.text,i=T_(t.sourceFile,o);if(!i)return pe(`\u8FD4\u56DE\u8C03\u7528\u4E86\u4E0D\u53EF\u5B9A\u4F4D\u7684\u51FD\u6570\u300C${o}\u300D`);if(r.has(i))return{kind:"exact",keys:new Set};r.add(i);let s=nh(i);if(s.length===0)return pe(`\u51FD\u6570\u300C${o}\u300D\u672A\u53D1\u73B0 return`);let c=new Set;for(let l of s){let d=dr(t,l,n+1,r);if(d.kind==="unknown")return pe(`\u51FD\u6570\u300C${o}\u300D\u7684\u8FD4\u56DE\u4E0D\u53EF\u89E3\u6790\uFF1A${d.reason}`);for(let u of d.keys)c.add(u)}return{kind:"exact",keys:c}}a(C_,"resolveCallOutputKeys");function T_(t,e){let n=null,r=a(o=>{if(!n){if(M.isFunctionDeclaration(o)&&o.name?.text===e&&o.body){n=o.body;return}if(M.isVariableDeclaration(o)&&M.isIdentifier(o.name)&&o.name.text===e&&o.initializer){let i=o.initializer;if((M.isArrowFunction(i)||M.isFunctionExpression(i))&&M.isBlock(i.body)){n=i.body;return}}M.forEachChild(o,r)}},"visit");return r(t),n}a(T_,"findFunctionBody");function ih(t){if(M.isIdentifier(t)||M.isStringLiteral(t))return t.text}a(ih,"propName");function __(t,e){if(!e)return[];let n=[],r=new Set,o=a(i=>{if(M.isPropertyAccessExpression(i)){let s=i.expression;if(M.isPropertyAccessExpression(s)&&M.isIdentifier(s.name)&&M.isIdentifier(i.name)&&th(t,s.expression)){let c=s.name.text,l=i.name.text,d=`${c}.${l}`;r.has(d)||(r.add(d),n.push({stepId:c,key:l}))}}M.forEachChild(i,o)},"visit");return o(t.executeBody),n}a(__,"inferVariableReads");var A_=["structure","recipe_bind","recipe_typecheck","config_contract","dataflow"];async function fH(t,e={}){let n=e.strict===!0,r=[];for(let o of t)r.push(await vl(o,e));return{ok:r.every(o=>o.ok),strict:n,workflows:r}}a(fH,"runWorkflowGates");async function vl(t,e={}){let n=e.strict===!0,r=e.only?new Set(e.only):null,o=e.includeTypecheck!==!1,i=kl.dirname(t.templatePath),s=a(x=>kl.relative(i,x)||kl.basename(x),"relWorkflowFile"),c=a(x=>{let I=ir(t.recipeDir,x);return I?s(I):`recipes/${x}.recipe.ts`},"relRecipeFile"),l=[],d=a(x=>!r||r.has(x),"enabled"),u=a(async(x,I)=>{if(!d(x))return null;let v=Date.now();try{let k=await I();return l.push({gate:x,status:k.some(R=>R.severity==="error")?"failed":"passed",durationMs:Date.now()-v,issues:k}),k}catch(k){return l.push({gate:x,status:"skipped",skipReason:`\u95E8\u7981\u81EA\u8EAB\u5F02\u5E38: ${k instanceof Error?k.message:String(k)}`,durationMs:Date.now()-v,issues:[]}),null}},"runGate"),f=a((x,I)=>{d(x)&&l.push({gate:x,status:"skipped",skipReason:I,durationMs:0,issues:[]})},"skipGate"),p=null;try{p=await sh(t.templatePath,"utf8")}catch(x){d("structure")&&l.push({gate:"structure",status:"failed",durationMs:0,issues:[{code:"WF-S01",severity:"error",message:`\u65E0\u6CD5\u8BFB\u53D6 workflow.yml: ${x instanceof Error?x.message:String(x)}`,location:{file:t.templatePath}}]})}let g=null,m=!1,y=new Set;if(p!==null){let x=Fm(p,s(t.templatePath));if(y=jm(x.raw),d("structure")&&l.push({gate:"structure",status:x.issues.some(v=>v.severity==="error")?"failed":"passed",durationMs:0,issues:x.issues}),!x.issues.some(v=>v.severity==="error"))try{g=await He(t.templatePath);let v=e.profile?.workflows?.[t.id];if(v)try{nn(t.id,v,g)}catch(k){l.push({gate:"config_contract",status:"failed",durationMs:0,issues:[{code:"WF-C04",severity:"error",message:`profile.workflows.${t.id} \u6CE8\u5165\u5931\u8D25: ${k instanceof Error?k.message:String(k)}`}]}),m=!0}}catch(v){g=null,d("dataflow")&&l.push({gate:"dataflow",status:"skipped",skipReason:`\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${v instanceof Error?v.message:String(v)}`,durationMs:0,issues:[]})}else for(let v of["recipe_bind","recipe_typecheck","config_contract","dataflow"])f(v,"structure \u95E8\u7981\u5B58\u5728\u9519\u8BEF\uFF0C\u5148\u4FEE\u590D\u7ED3\u6784\u95EE\u9898")}else for(let x of["recipe_bind","recipe_typecheck","config_contract","dataflow"])f(x,"workflow.yml \u4E0D\u53EF\u8BFB");if(g){let x=g,I=await u("recipe_bind",()=>Wm(t.recipeDir,x,c).then(v=>v.issues));o?await u("recipe_typecheck",()=>Zm(t.recipeDir,x,c)):f("recipe_typecheck","includeTypecheck=false"),m?f("dataflow","profile \u6CE8\u5165\u5931\u8D25\uFF0C\u6709\u6548\u914D\u7F6E\u4E0D\u53EF\u4FE1"):(l.some(v=>v.gate==="config_contract")||await u("config_contract",()=>Qm(t.recipeDir,x,{skipConfigSchema:e.skipConfigSchema===!0})),I?await u("dataflow",async()=>{let{contracts:v,knownRecipeIds:k}=await E_(t.recipeDir,x);return eh({workflow:x,contracts:v,knownRecipeIds:k,scaffold:io,declaredFieldNames:y})}):f("dataflow","recipe_bind \u672A\u6267\u884C"))}let w=A_.filter(x=>l.some(I=>I.gate===x)).map(x=>l.find(I=>I.gate===x)),b=n?w.map(x=>({...x,status:x.issues.some(I=>I.severity==="error"||I.severity==="warning")?"failed":x.status,issues:x.issues.map(I=>I.severity==="warning"?{...I,severity:"error"}:I)})):w;return{id:t.id,ok:b.every(x=>x.status!=="failed"),gates:b}}a(vl,"runWorkflowGate");async function E_(t,e){let n=new Map,r=new Set,o=new Set;for(let i of e.steps)i.recipe&&o.add(i.recipe);for(let i of e.eventSources)i.handler&&o.add(i.handler);for(let i of o){let s=ir(t,i);if(s&&(r.add(i),!n.has(i)))try{let c=await sh(s,"utf8");n.set(i,bl(c,s))}catch{n.set(i,{recipePath:s,inputs:{kind:"unknown",reason:"\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25"},outputs:{kind:"unknown",reason:"\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25"},variableReads:[]})}}return{contracts:n,knownRecipeIds:r}}a(E_,"inferAllContracts");async function ls(t){let{workflow:e,rawYaml:n,recipeDir:r,relPath:o,profile:i,onDefinitionLoadFailure:s}=t,c=e.tracker,l=[D_(o,c?.label,c?.description),$_(o,c?.label,c?.description)],d=Array.isArray(n?.event_sources)?n.event_sources:[];for(let u=0;u<e.eventSources.length;u++){let f=e.eventSources[u],p=f.name||`event_source[${u}]`,g=S(d[u])?d[u]:{},m=i?.config?.event_sources?.[f.name??""],{handler_config:y,...w}=m??{},b={...S(g.config)?g.config:{},...w},x=!!i&&!!f.name,I=a(P=>x?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,...P]}:{file:o,yamlPath:["event_sources",u,"config",...P]},"evtConfigTarget"),v=a(P=>x?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,"handler_config",...P]}:{file:o,yamlPath:["event_sources",u,"handler_config",...P]},"evtHandlerTarget"),k=_n(f.type,b),R=new Set(k.map(P=>P.key)),T=Yr(f.type,b),_=new Map;for(let P of T.requiredFields)_.set(P.field,P.valueType);for(let P of T.optionalFields??[])_.set(P.field,P.valueType);for(let P of k){let O=I(P.path);l.push(lo({key:`event_source.${p}.config.${P.key}`,label:P.description,file:O.file,yamlPath:O.yamlPath,valueType:_.get(P.key)}))}for(let P of T.errors){if(R.has(P.key))continue;let O=I(P.yamlPath);l.push(lo({key:`event_source.${p}.config.${P.key}`,label:P.description,file:O.file,yamlPath:O.yamlPath}))}for(let P of T.requiredFields){let O=I([P.field]);l.push(lo({key:`event_source.${p}.config.${P.field}`,label:P.label,file:O.file,yamlPath:O.yamlPath,valueType:P.valueType}))}for(let P of T.optionalFields??[]){let O=I([P.field]);l.push(lo({key:`event_source.${p}.config.${P.field}`,label:P.label,file:O.file,yamlPath:O.yamlPath,valueType:P.valueType,required:!1,allowEmpty:!0}))}if(T.oneOf){let P=T.oneOf.fields[0];if(P){let O=I([P]);l.push(lo({key:`event_source.${p}.config.${P}`,label:T.oneOf.labels[P]??P,file:O.file,yamlPath:O.yamlPath}))}}if(!f.handler)continue;let C=await $n(r,f.handler);if(!C.definition){s?.(`EventHandler\u300C${f.handler}\u300D`,C.failure);continue}let E=C.definition;if(!E?.meta.config)continue;let F=zt(E.meta.config,P=>P.configType==="tableRef");for(let P of F){let O=P.path.join("."),q=P.hint.description??P.hint.label??`\u4E8B\u4EF6\u6E90 ${p} \u7684 ${O}`,z=gn(P.hint),K=z&&P.hint.defaultBase==="workflow.tracker.base_id",G=ah(P.hint),ee=v([...P.path,"baseId"]);l.push(Sl({key:`event_source.${p}.handler_config.${O}.baseId`,label:cs(q,"baseId"),file:ee.file,yamlPath:ee.yamlPath,required:!K,allowEmpty:K,defaultStrategy:"workflowTrackerBaseId",setup:G}));let te=v([...P.path,"tableId"]);l.push(Sl({key:`event_source.${p}.handler_config.${O}.tableId`,label:cs(q,"tableId"),file:te.file,yamlPath:te.yamlPath,required:!z,allowEmpty:z,setup:G}))}let W=It(E.meta.config);if(W)for(let[P,O]of Object.entries(W)){if(uo(O))continue;let q=ht(O),z=q?.description??q?.label??Pt(O);if(!z)continue;let K=fr(O),G=v([P]);l.push(Sl({key:`event_source.${p}.handler_config.${P}`,label:z,file:G.file,yamlPath:G.yamlPath,required:!K,allowEmpty:K,valueType:q?.valueType??(Mn(O)?"string[]":"string")}))}}for(let u=0;u<e.steps.length;u++){let f=e.steps[u];if(!f.recipe)continue;let p=await $t(r,f.recipe);if(!p.definition){s?.(`recipe\u300C${f.recipe}\u300D`,p.failure);continue}let g=p.definition;if(!g?.meta.config)continue;let m=a(b=>i?{file:i.file,yamlPath:["workflows",i.workflowId,"steps",f.id,...b]}:{file:o,yamlPath:["steps",u,"config",...b]},"stepTarget"),y=zt(g.meta.config,b=>b.configType==="tableRef");for(let b of y){let x=b.path.join("."),I=b.hint.description??b.hint.label??`\u6B65\u9AA4 ${f.id} \u7684 ${x}`,v=gn(b.hint),k=v&&b.hint.defaultBase==="workflow.tracker.base_id",R=ah(b.hint),T=m([...b.path,"baseId"]);l.push(xl({key:`step.${f.id}.config.${x}.baseId`,label:cs(I,"baseId"),file:T.file,yamlPath:T.yamlPath,required:!k,allowEmpty:k,defaultStrategy:"workflowTrackerBaseId",setup:R}));let _=m([...b.path,"tableId"]);l.push(xl({key:`step.${f.id}.config.${x}.tableId`,label:cs(I,"tableId"),file:_.file,yamlPath:_.yamlPath,required:!v,allowEmpty:v,setup:R}))}let w=It(g.meta.config);if(w)for(let[b,x]of Object.entries(w)){if(uo(x))continue;let I=ht(x),v=I?.description??I?.label??Pt(x);if(!v)continue;let k=fr(x),R=m([b]);l.push(xl({key:`step.${f.id}.config.${b}`,label:v,file:R.file,yamlPath:R.yamlPath,required:!k,allowEmpty:k,valueType:I?.valueType??(Mn(x)?"string[]":"string")}))}}return P_(l)}a(ls,"buildWorkflowConfigSurface");function fo(t,e){return{key:e.key??t.key,status:e.status,message:e.message,value:e.value,sensitive:e.sensitive,surface:t,writeTarget:e.writeTarget??t.writeTarget}}a(fo,"toCheckItem");function D_(t,e,n){return{key:"tracker.base_id",label:e?`${e} Base ID`:"\u5DE5\u4F5C\u6D41\u6570\u636E\u5E95\u5EA7 Base ID",description:n??"\u672C\u5DE5\u4F5C\u6D41\u6240\u6709\u8868\u683C\u6240\u5728\u7684 AI \u8868\u683C Base ID\uFF1B\u7559\u7A7A\u65F6 setup \u4F1A\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA",owner:"framework",source:"tracker",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"projectTrackerBaseId",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","base_id"]}}}a(D_,"trackerBaseSurface");function $_(t,e,n){return{key:"tracker.table_id",label:e?`${e} Table ID`:"\u5DE5\u5355\u8BB0\u5F55\u8868 Table ID",description:n??"\u8BB0\u5F55\u5DE5\u5355\u6D41\u8F6C\u72B6\u6001\u7684\u8868\u683C ID\uFF1B\u5982\u672A\u521B\u5EFA\u53EF\u76F4\u63A5\u7559\u7A7A\uFF0Csetup \u9636\u6BB5\u4F1A\u81EA\u52A8\u5EFA\u8868\u5E76\u56DE\u586B",owner:"framework",source:"tracker",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"current",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","table_id"]},setup:{action:"createTable",when:"empty"}}}a($_,"trackerTableSurface");function lo(t){return{key:t.key,label:t.label,description:t.label,owner:"eventSource",source:"eventSource.config",required:t.required??!0,editable:!0,allowEmpty:t.allowEmpty??!1,defaultStrategy:"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType}}}a(lo,"eventSourceConfigSurface");function Sl(t){return{key:t.key,label:t.label,description:t.label,owner:"handler",source:"eventSource.handler_config",required:t.required??!1,editable:!0,allowEmpty:t.allowEmpty??!0,defaultStrategy:t.defaultStrategy??"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType},setup:t.setup}}a(Sl,"handlerConfigSurface");function xl(t){return{key:t.key,label:t.label,description:t.label,owner:"handler",source:"step.config",required:t.required??!1,editable:!0,allowEmpty:t.allowEmpty??!0,defaultStrategy:t.defaultStrategy??"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType},setup:t.setup}}a(xl,"stepConfigSurface");function ah(t){if(!gn(t))return;let n={action:"createTable",when:!!(t.setupSchema?.fields?.length||t.setupSchema?.views?.length)?"alwaysValidate":"empty",tableSchema:t.setupSchema};return t.label&&(n.tableName=t.label),n}a(ah,"setupPolicyForTableRefHint");function cs(t,e){return e==="baseId"?`${t} \u6240\u5728\u7684 AI \u8868\u683C Base ID\uFF0C\u4E00\u822C\u4E0E\u672C\u5DE5\u4F5C\u6D41\u6570\u636E\u5E95\u5EA7\u5171\u7528\u540C\u4E00\u4E2A Base`:`${t} \u7684\u8868\u683C ID\uFF1B\u5982\u672A\u521B\u5EFA\u53EF\u7559\u7A7A\uFF0Csetup \u9636\u6BB5\u4F1A\u81EA\u52A8\u5EFA\u8868\u5E76\u56DE\u586B`}a(cs,"tableRefFieldDescription");function P_(t){let e=new Set,n=[];for(let r of t)e.has(r.key)||(e.add(r.key),n.push(r));return n}a(P_,"dedupeSurface");function It(t){if(!t)return null;let e=t,n=e?._def?.typeName??e?._def?.type;if((n==="ZodObject"||n==="object")&&(e.shape||e._def?.shape)){let r=e.shape??e._def?.shape;return typeof r=="function"?r():r}return typeof e.unwrap=="function"?It(e.unwrap()):e?._def?.schema?It(e._def.schema):e?._def?.innerType?It(e._def.innerType):null}a(It,"getZodObjectShape");function Mn(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return Mn(e.unwrap());if(e?._def?.innerType)return Mn(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(Mn):!1}a(Mn,"isArraySchema");function Pt(t){let e=t,n=e?.description??e?._def?.description;if(typeof n=="string"&&n.trim())return n.trim();if(typeof e.unwrap=="function")return Pt(e.unwrap());if(e?._def?.innerType)return Pt(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=Pt(o);if(i)return i}return null}a(Pt,"getFieldDescription");function uo(t){let e=It(t);return e?"baseId"in e&&"tableId"in e:!1}a(uo,"isTableRefSchema");function fr(t){let e=t,n=e?._def?.typeName??e?._def?.type;return n==="ZodOptional"||n==="optional"||n==="ZodDefault"||n==="default"||n==="ZodNullable"||n==="nullable"}a(fr,"isOptionalSchema");var F_="profile/profile.yml",N_=/\.(ya?ml|json)$/i;function L_(t,e,n){let r=t.trim();if(!r||!N_.test(r)||po.isAbsolute(r))return;let o=/\.json$/i.test(r)?"json":"yaml",i;for(let s of n){let c=po.resolve(s,r),l=po.relative(e,c);if(!l.startsWith("..")){if(O_(c))return{path:l,format:o,exists:!0,summary:W_(c,o)};i??={path:l,format:o,exists:!1}}}return i}a(L_,"resolveFileRef");function W_(t,e){try{let n=j_(t,"utf8"),r=e==="json"?JSON.parse(n):uh.parse(n);return Array.isArray(r)?[{key:"(\u6570\u7EC4)",count:r.length,kind:"array"}]:S(r)?Object.entries(r).map(([o,i])=>Array.isArray(i)?{key:o,count:i.length,kind:"array"}:S(i)?{key:o,count:Object.keys(i).length,kind:"object"}:{key:o,kind:typeof i}):void 0}catch{return}}a(W_,"summarizeStructuredFile");function fs(t,e){return{...t??{},...e??{}}}a(fs,"overlayConfig");function fh(t,e){let n=e?t?.wf.event_sources?.[e]:void 0;if(!n)return{config:{},handlerConfig:{}};let{handler_config:r,...o}=n;return{config:o,handlerConfig:S(r)?r:{}}}a(fh,"profileEventSourceParts");function Se(t,e){return t?{...e,surface:t,writeTarget:e.writeTarget??t.writeTarget}:e}a(Se,"withSurfaceFields");function B_(t,e,n){if(!n?.wf.steps)return;let r=new Set(e.steps.map(o=>o.id));for(let[o,i]of Object.entries(n.wf.steps))!r.has(o)||!S(i)||!("config"in i)||t.push({key:`step.${o}.config.config`,status:"error",message:`profile.workflows.${n.workflowId}.steps.${o}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile step \u4E0B\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 step.config\uFF0C\u8BF7\u6539\u4E3A workflows.${n.workflowId}.steps.${o}.<\u5B57\u6BB5\u540D>`})}a(B_,"pushNestedProfileStepConfigItems");function z_(t,e,n){if(!n?.wf.event_sources)return;let r=new Set(e.eventSources.map(o=>o.name).filter(Boolean));for(let[o,i]of Object.entries(n.wf.event_sources))!r.has(o)||!S(i)||!("config"in i)||t.push({key:`event_source.${o}.config.config`,status:"error",message:`profile.workflows.${n.workflowId}.event_sources.${o}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile event source \u4E0B\u9664 handler_config \u5916\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 event_sources[].config\uFF0C\u8BF7\u6539\u4E3A workflows.${n.workflowId}.event_sources.${o}.<\u5B57\u6BB5\u540D>`})}a(z_,"pushNestedProfileEventSourceConfigItems");async function Tl(t,e,n){let r=[];for(let s of t){let c=n?.workflows?.[s.id],l=c?{file:F_,workflowId:s.id,wf:c}:void 0,d=await U_(s,e,l);r.push(d)}let o=r.flatMap(s=>s.items);return{id:"workflow",name:"\u5DE5\u4F5C\u6D41\u7EA7\u914D\u7F6E",ok:!r.some(s=>!s.ok),items:o,workflows:r}}a(Tl,"checkWorkflows");async function U_(t,e,n){let r=[],o=t.templatePath.startsWith(e)?t.templatePath.slice(e.length+1):t.templatePath,i;try{i=await He(t.templatePath)}catch(x){return r.push({key:"workflow.yml",status:"error",message:`\u5DE5\u4F5C\u6D41\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${x instanceof Error?x.message:String(x)}`}),{id:t.id,name:t.id,ok:!1,items:r,surface:[]}}let s=i.meta?.name??t.id;if(n){if(B_(r,i,n),z_(r,i,n),n.wf.steps)for(let x of Object.values(n.wf.steps))S(x)&&"config"in x&&delete x.config;if(n.wf.event_sources)for(let x of Object.values(n.wf.event_sources))S(x)&&"config"in x&&delete x.config;try{nn(t.id,n.wf,i)}catch(x){r.push({key:"profile",status:"error",message:`profile \u914D\u7F6E\u6CE8\u5165\u5931\u8D25: ${x instanceof Error?x.message:String(x)}`})}}let c,l;try{let x=uh.parse(await M_(t.templatePath,"utf8"));S(x)&&(l=x,S(x.tracker)&&(c=x.tracker))}catch{}let d=await ls({workflow:i,rawYaml:l,recipeDir:t.recipeDir,relPath:o,profile:n?{file:n.file,workflowId:n.workflowId,config:n.wf}:void 0}),u=new Map(d.map(x=>[x.key,x])),f=u.get("tracker.base_id"),p=c?.base_id??i.tracker?.base_id;!p||typeof p=="string"&&p.trim()===""?r.push(fo(f,{status:"warn",message:"tracker.base_id \u672A\u914D\u7F6E\uFF0Csetup \u9636\u6BB5\u5C06\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C"})):r.push(fo(f,{status:"ok",value:p,message:`tracker.base_id = ${p}`}));let g=u.get("tracker.table_id"),m=c?.table_id??i.tracker?.table_id;if(!m||typeof m=="string"&&m.trim()===""?r.push(fo(g,{status:"warn",message:"tracker.table_id \u672A\u914D\u7F6E\uFF08\u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09"})):r.push(fo(g,{status:"ok",value:m,message:`tracker.table_id = ${m}`})),i.toolkitConfig&&Object.keys(i.toolkitConfig).length>0){let x=Object.keys(i.toolkitConfig);r.push({key:"toolkit_config",status:"ok",message:`toolkit_config \u5DF2\u914D\u7F6E (${x.join(", ")})`})}if(i.steps.length===0)r.push({key:"steps",status:"error",message:"\u5DE5\u4F5C\u6D41\u65E0\u6B65\u9AA4\u5B9A\u4E49"});else{let x=i.orderedStepIds.join(" \u2192 ");r.push({key:"steps",status:"ok",message:`\u6B65\u9AA4\u94FE: ${i.steps.length} \u6B65 (${x})`})}try{let x=await sr(t.recipeDir,i),I=new Map(i.steps.map((k,R)=>[k.id,R])),v=new Map(i.eventSources.map((k,R)=>[`event:${k.name||k.handler}`,R]));for(let k of x.issues){let R=k.level==="error",T=v.get(k.stepId),_=T!==void 0?i.eventSources[T]:void 0;if(R){let E=K_(k.message),F=I.get(k.stepId);if(E&&F!==void 0){let W=i.steps[F],P=`step.${W.id}.config.${E}`,O=u.get(P);if(O){r.push(Se(O,{key:P,status:"error",message:`[${k.recipeId}] ${k.message}`}));continue}let q=W.recipe?await es(t.recipeDir,W.recipe):void 0,z=E.split("."),K=q?.meta.config?zt(q.meta.config,G=>G.configType==="tableRef").find(G=>lh(G.path,z)||us(G.path,z)):void 0;if(K){let G=us(K.path,z)??["baseId","tableId"];for(let ee of G){let te=`step.${W.id}.config.${K.path.join(".")}.${ee}`,Ve=u.get(te);r.push(Se(Ve,{key:te,status:"error",message:Rl(k.recipeId,K.path.join("."),ee)}))}continue}r.push({key:`step.${k.stepId}.config`,status:"error",message:`[${k.recipeId}] ${k.message}`,writeTarget:n?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"steps",k.stepId,...E.split(".")]}:{type:"yaml",file:o,yamlPath:["steps",F,"config",...E.split(".")]}});continue}else if(E&&T!==void 0&&_){let W=E.split("."),P=await dl(t.recipeDir,_.handler),O=P?zt(P.meta.config,z=>z.configType==="tableRef").find(z=>lh(z.path,W)||us(z.path,W)):void 0;if(O){let z=_.name||_.handler,K=us(O.path,W)??["baseId","tableId"];for(let G of K){let ee=`event_source.${z}.handler_config.${O.path.join(".")}.${G}`,te=u.get(ee);r.push(Se(te,{key:ee,status:"error",message:Cl(k.recipeId,O.path.join("."),G)}))}continue}let q={key:`event_source.${_.name||_.handler}.handler_config.${E}`,status:"error",message:`[${k.recipeId}] ${k.message}`};q.writeTarget=n&&_.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",_.name,"handler_config",...W]}:{type:"yaml",file:o,yamlPath:["event_sources",T,"handler_config",...W]},r.push(q);continue}}let C={key:`step.${k.stepId}.config`,status:R?"error":"warn",message:`[${k.recipeId}] ${k.message}`};r.push(C)}if(x.issues.filter(k=>k.level==="error").length===0){let k=x.rows.filter(R=>R.loaded).length;k>0&&r.push({key:"recipe_schema",status:"ok",message:`step.config \u6821\u9A8C\u901A\u8FC7 (${k} \u4E2A recipe)`})}}catch{r.push({key:"recipe_schema",status:"warn",message:"recipe schema \u6821\u9A8C\u8DF3\u8FC7\uFF08\u52A0\u8F7D\u5F02\u5E38\uFF09"})}try{let x=n?{schema_version:2,workflows:{[t.id]:n.wf}}:null,I=await vl(t,{only:["config_contract","dataflow"],skipConfigSchema:!0,includeTypecheck:!1,profile:x});for(let v of I.gates)if(v.status!=="skipped")for(let k of v.issues)r.push({key:`gate.${k.code}`,status:k.severity==="error"?"error":k.severity==="warning"?"warn":"suggestion",message:`[${k.code}] ${k.message}`})}catch{}let y=typeof p=="string"?p:void 0;await V_({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await q_({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await H_({items:r,entry:t,configDir:e,workflow:i,rawYaml:l,relPath:o,profileCtx:n});let w=Array.isArray(l?.event_sources)?l.event_sources:[];for(let x=0;x<i.eventSources.length;x++){let I=i.eventSources[x],v=I.name||`event_source[${x}]`,k=S(w[x])?w[x]:{},R=fh(n,I.name),T=fs(S(k.config)?k.config:void 0,R.config);if(Object.keys(T).length===0){r.push({key:`event_source.${v}.config`,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u7684 config \u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u9A71\u52A8\u4E8B\u4EF6\u6E90`,writeTarget:n&&I.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",I.name]}:{type:"yaml",file:o,yamlPath:["event_sources",x,"config"]}});continue}let _=Yr(I.type,T),C=[..._.requiredFields,..._.optionalFields??[]],E=a((O,q)=>n&&I.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",I.name,O],valueType:q}:{type:"yaml",file:o,yamlPath:["event_sources",x,"config",O],valueType:q},"writeTargetFor"),F=_n(I.type,T),W=new Set(F.filter(O=>{let q=O.key.split(".",1)[0],z=C.find(G=>G.field===q)?.valueType;if(!z)return!1;let K=T[q];return ds(K)||!Il(K,z)}).map(O=>O.key)),P=new Set(F.filter(O=>!W.has(O.key)).map(O=>O.key));for(let O of F){if(W.has(O.key))continue;let q=`event_source.${v}.config.${O.key}`,z=u.get(q);r.push(Se(z,{key:q,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u5B57\u6BB5 config.${O.key} \u65E0\u6548\uFF1A${O.message}`}))}for(let O of _.errors){if(P.has(O.key))continue;let q=`event_source.${v}.config.${O.key}`,z=u.get(q);r.push(Se(z,{key:q,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D${O.message}`}))}if(_.requiredFields.length>0||(_.optionalFields?.length??0)>0||_.errors.length>0||_.summary||_.oneOf){let O=!0;for(let q of _.requiredFields){let{field:z,valueType:K}=q,G=T[z],ee=`event_source.${v}.config.${z}`,te=u.get(ee);ds(G)?(O=!1,r.push(Se(te,{key:ee,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 config.${z}`}))):P.has(z)?O=!1:K&&!Il(G,K)?(O=!1,r.push(Se(te,{key:ee,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u5B57\u6BB5 config.${z} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${ch(K)}\uFF09`,writeTarget:te?.writeTarget?{...te.writeTarget,valueType:te.writeTarget.valueType??K}:E(z,K)}))):r.push(Se(te,{key:ee,status:"ok",value:G,message:`config.${z} = ${dh(G)}`}))}for(let q of _.optionalFields??[]){let{field:z,valueType:K}=q,G=T[z],ee=`event_source.${v}.config.${z}`,te=u.get(ee);ds(G)?(O=!1,r.push(Se(te,{key:ee,status:"suggestion",value:G,message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300Dconfig.${z} \u4E3A\u7A7A\u5217\u8868\uFF1A\u76D1\u542C\u505C\u7528\uFF08\u586B\u4F1A\u8BDD ID \u5373\u542F\u7528\uFF09`}))):P.has(z)?O=!1:K&&!Il(G,K)?(O=!1,r.push(Se(te,{key:ee,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u5B57\u6BB5 config.${z} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${ch(K)}\uFF09`,writeTarget:te?.writeTarget?{...te.writeTarget,valueType:te.writeTarget.valueType??K}:E(z,K)}))):r.push(Se(te,{key:ee,status:"ok",value:G,message:`config.${z} = ${dh(G)}`}))}if(_.oneOf&&!_.oneOf.fields.some(z=>!ds(T[z]))){O=!1;let z=_.oneOf.fields[0],K=`event_source.${v}.config.${z}`,G=u.get(K);r.push(Se(G,{key:K,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u7F3A\u5C11\u8C03\u5EA6\u914D\u7F6E\uFF08\u9700\u914D\u7F6E ${_.oneOf.fields.map(ee=>`config.${ee}`).join(" / ")} \u4E4B\u4E00\uFF09`}))}O&&_.errors.length===0&&r.push({key:`event_source.${v}`,status:"ok",message:_.summary?`\u4E8B\u4EF6\u6E90\u300C${v}\u300D(${I.type}) \u914D\u7F6E\u5B8C\u6574\uFF08${_.summary}\uFF09`:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D(${I.type}) \u914D\u7F6E\u5B8C\u6574`})}else r.push({key:`event_source.${v}`,status:"ok",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D(${I.type}) \u5DF2\u914D\u7F6E`})}i.eventSources.length===0&&w.length;let b=r.some(x=>x.status==="error");return{id:t.id,name:s,ok:!b,items:r,surface:d}}a(U_,"checkSingleWorkflow");function K_(t){let e=t.match(/^config\.([A-Za-z_][A-Za-z0-9_.]*)/);return e?e[1]:null}a(K_,"extractConfigKey");function ds(t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.every(e=>e==null||typeof e=="string"&&e.trim()===""):!1}a(ds,"isMissingConfigValue");function Il(t,e){return e==="string[]"?Array.isArray(t):e==="string"?typeof t=="string":!0}a(Il,"matchesConfigType");function ch(t){return t==="string[]"?"\u6570\u7EC4":"\u5B57\u7B26\u4E32"}a(ch,"typeLabel");function lh(t,e){return t.length===e.length&&t.every((n,r)=>n===e[r])}a(lh,"samePath");function us(t,e){if(e.length!==t.length+1||!t.every((r,o)=>r===e[o]))return null;let n=e[t.length];return n==="baseId"?["baseId"]:n==="tableId"?["tableId"]:null}a(us,"tableRefFieldFromPath");function ph(t,e){if(t?.defaultStrategy==="workflowTrackerBaseId"&&e)return e}a(ph,"defaultValueForTableRefWarn");async function V_(t){let{items:e,entry:n,workflow:r,rawYaml:o,surfaceByKey:i,workflowBaseId:s,profileCtx:c}=t,l=Array.isArray(o?.event_sources)?o.event_sources:[];for(let d=0;d<r.eventSources.length;d++){let u=r.eventSources[d];if(!u.handler)continue;let f=await dl(n.recipeDir,u.handler);if(!f?.meta.config)continue;let p=u.name||u.handler,g=S(l[d])?l[d]:{},m=fs(S(g.handler_config)?g.handler_config:void 0,fh(c,u.name).handlerConfig),y=zt(f.meta.config,b=>b.configType==="tableRef");for(let b of y){let x=Kn(m,b.path);if(!S(x))continue;let I=x.baseId,v=x.tableId,k=b.path.join("."),R=gn(b.hint);if(typeof I=="string"&&!I.trim()){let T=`event_source.${p}.handler_config.${k}.baseId`,_=i.get(T),C=R&&b.hint.defaultBase==="workflow.tracker.base_id",E=C?"warn":"error";e.push(Se(_,{key:T,status:E,message:C?`[${u.handler}] handler_config.${k}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:Cl(u.handler,k,"baseId"),value:E==="warn"?ph(_,s):void 0}))}if(typeof v=="string"&&!v.trim()){let T=`event_source.${p}.handler_config.${k}.tableId`,_=i.get(T),C=R?"warn":"error";e.push(Se(_,{key:T,status:C,message:R?`[${u.handler}] handler_config.${k}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:Cl(u.handler,k,"tableId")}))}}let w=It(f.meta.config);if(w){for(let[b,x]of Object.entries(w)){let v=ht(x)?.expose===!0;if(Mn(x)){let k=m[b];if(Array.isArray(k)&&k.length===0){let R=fr(x);if(R&&!v)continue;let T=`event_source.${p}.handler_config.${b}`,_=i.get(T);if(!_)continue;e.push(Se(_,{key:T,status:R?"suggestion":"error",message:`[${u.handler}] handler_config.${b} \u4E3A\u7A7A\u6570\u7EC4`}))}}}for(let[b,x]of Object.entries(w)){if(m[b]!==void 0)continue;let I=ht(x);if(I?.expose!==!0)continue;let v=I.description??I.label??Pt(x);if(!v||uo(x))continue;let k=`event_source.${p}.handler_config.${b}`,R=i.get(k);R&&e.push(Se(R,{key:k,status:"suggestion",message:`[${u.handler}] handler_config.${b} \u672A\u914D\u7F6E\uFF08${v}\uFF09`}))}}}}a(V_,"checkHandlerConfigEmptiness");async function q_(t){let{items:e,entry:n,workflow:r,rawYaml:o,surfaceByKey:i,workflowBaseId:s,profileCtx:c}=t,l=Array.isArray(o?.steps)?o.steps:[];for(let d=0;d<r.steps.length;d++){let u=r.steps[d];if(!u.recipe)continue;let f=await es(n.recipeDir,u.recipe);if(!f?.meta.config)continue;let p=S(l[d])?l[d]:{},g=fs(S(p.config)?p.config:void 0,c?.wf.steps?.[u.id]),m=zt(f.meta.config,w=>w.configType==="tableRef");for(let w of m){let b=Kn(g,w.path);if(!S(b))continue;let x=b.baseId,I=b.tableId,v=w.path.join("."),k=gn(w.hint);if(typeof x=="string"&&!x.trim()){let R=`step.${u.id}.config.${v}.baseId`,T=i.get(R),_=k&&w.hint.defaultBase==="workflow.tracker.base_id",C=_?"warn":"error";e.push(Se(T,{key:R,status:C,message:_?`[${u.recipe}] step.config.${v}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:Rl(u.recipe,v,"baseId"),value:C==="warn"?ph(T,s):void 0}))}if(typeof I=="string"&&!I.trim()){let R=`step.${u.id}.config.${v}.tableId`,T=i.get(R),_=k?"warn":"error";e.push(Se(T,{key:R,status:_,message:k?`[${u.recipe}] step.config.${v}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:Rl(u.recipe,v,"tableId")}))}}let y=It(f.meta.config);if(y)for(let[w,b]of Object.entries(y)){if(uo(b))continue;let x=g[w];if(x!==void 0){if(Array.isArray(x)&&x.length===0&&fr(b)){let T=`step.${u.id}.config.${w}`,_=i.get(T);_&&e.push(Se(_,{key:T,status:"suggestion",message:`[${u.recipe}] step.config.${w} \u4E3A\u7A7A\u6570\u7EC4`}))}continue}let I=ht(b),v=I?.description??I?.label??Pt(b);if(!v||!fr(b))continue;let k=`step.${u.id}.config.${w}`,R=i.get(k);R&&e.push(Se(R,{key:k,status:"suggestion",message:`[${u.recipe}] step.config.${w} \u672A\u914D\u7F6E\uFF08${v}\uFF09`}))}}}a(q_,"checkStepConfigEmptiness");async function H_(t){let{items:e,entry:n,configDir:r,workflow:o,rawYaml:i,relPath:s,profileCtx:c}=t,l=Array.isArray(i?.steps)?i.steps:[],d=new Set(e.map(f=>f.key)),u=c?[po.resolve(r,po.dirname(c.file)),r]:[r];for(let f=0;f<o.steps.length;f++){let p=o.steps[f],g=S(l[f])?l[f]:{},m=fs(S(g.config)?g.config:void 0,c?.wf.steps?.[p.id]);if(Object.keys(m).length===0)continue;let w=(p.recipe?await es(n.recipeDir,p.recipe).catch(()=>null):null)?.meta.config,b=a((I,v)=>{let k=`step.${p.id}.config.${I.join(".")}`;if(d.has(k))return;d.add(k);let R=typeof v=="boolean"?"boolean":typeof v=="number"?"number":"string",T=c?{type:"yaml",file:c.file,yamlPath:["workflows",c.workflowId,"steps",p.id,...I],valueType:R}:{type:"yaml",file:s,yamlPath:["steps",f,"config",...I],valueType:R},_=w?G_(w,I):null,C=typeof v=="string"?L_(v,r,u):void 0,E=C?.exists===!0;e.push({key:k,status:"ok",value:v,message:`${I.join(".")} = ${String(v)}`,writeTarget:T,surface:{key:k,label:I.join("."),description:_??void 0,owner:"handler",source:"step.config",required:!1,editable:!E,allowEmpty:!0,defaultStrategy:"none",valueType:R,writeTarget:T,...C?{fileRef:C}:{}}})},"emit"),x=a((I,v)=>{for(let[k,R]of Object.entries(I)){if(v.length===0&&c?.wf.steps?.[p.id]&&k==="config")continue;let T=[...v,k];if(typeof R=="string"){if(/^\$\{[^}]+\}$/.test(R.trim()))continue;b(T,R)}else if(typeof R=="number"||typeof R=="boolean")b(T,R);else if(S(R)){if(Object.keys(R).length===1&&typeof R.ref=="string"||"baseId"in R||"tableId"in R)continue;x(R,T)}}},"walk");x(m,[])}}a(H_,"emitStepScalarConfigItems");function Rl(t,e,n){return n==="baseId"?`[${t}] step.config.${e}.baseId \u672A\u914D\u7F6E`:`[${t}] step.config.${e}.tableId \u672A\u914D\u7F6E\uFF08\u76EE\u6807\u8868 ID \u4E0D\u4F1A\u590D\u7528\u5176\u4ED6\u8868\uFF1B\u53EA\u6709 tracker.table_id \u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09`}a(Rl,"stepConfigTableRefMissingMessage");function Cl(t,e,n){return n==="baseId"?`[${t}] handler_config.${e}.baseId \u672A\u914D\u7F6E`:`[${t}] handler_config.${e}.tableId \u672A\u914D\u7F6E\uFF08\u76EE\u6807\u8868 ID \u4E0D\u4F1A\u590D\u7528\u5176\u4ED6\u8868\uFF1B\u53EA\u6709 tracker.table_id \u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09`}a(Cl,"tableRefMissingMessage");function G_(t,e){let n=t;for(let r=0;r<e.length;r++){let o=It(n);if(!o||(n=o[e[r]],!n))return null}return Pt(n)}a(G_,"describeSchemaPath");function dh(t){return Array.isArray(t)?`${t.length} \u9879`:typeof t=="string"?t:t==null?"\u672A\u8BBE\u7F6E":JSON.stringify(t)}a(dh,"formatConfigValue");import{readdir as tA,stat as nA,readFile as rA}from"fs/promises";import On from"path";import{readdir as J_,readFile as Z_,stat as Y_}from"fs/promises";import{readFileSync as Q_,existsSync as X_}from"fs";import ps from"path";import eA from"yaml";var gs=".role.yml",Mt=class{constructor(e){this.rolesDir=e}rolesDir;static{a(this,"RoleRegistry")}roles=new Map;errors=[];loaded=!1;async loadAll(){this.roles.clear(),this.errors=[],this.loaded=!0;let e=ps.resolve(this.rolesDir),n=!1;try{n=(await Y_(e)).isDirectory()}catch{n=!1}if(!n){h.info("role","\u89D2\u8272\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u6CE8\u518C\u4E2D\u5FC3\u4E3A\u7A7A",{dir:e});return}let o=(await J_(e)).filter(i=>i.endsWith(gs)).sort();for(let i of o){let s=ps.join(e,i),c=await this.validateFile(s);if(!c.ok){this.errors.push({file:s,errors:c.errors}),h.warn("role","\u89D2\u8272\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{file:s,errors:c.errors});continue}let l=c.definition,d=gh(l,ps.dirname(s));if(!d.ok){this.errors.push({file:s,errors:[d.error]}),h.warn("role","persona \u6587\u4EF6\u8BFB\u53D6\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{file:s,error:d.error});continue}if(this.roles.has(l.id)){let u=`\u89D2\u8272 id \u91CD\u590D\uFF1A${l.id}\uFF08\u4FDD\u7559\u5148\u52A0\u8F7D\u8005\uFF0C\u8DF3\u8FC7 ${i}\uFF09`;this.errors.push({file:s,errors:[u]}),h.warn("role",u,{file:s});continue}this.roles.set(l.id,l)}}get(e){return this.roles.get(e)??null}list(){return[...this.roles.values()]}has(e){return this.roles.has(e)}get size(){return this.roles.size}get loadErrors(){return[...this.errors]}get isLoaded(){return this.loaded}async validateFile(e){let n;try{n=await Z_(e,"utf8")}catch(o){return{ok:!1,errors:[`\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6: ${_l(o)}`]}}let r;try{r=eA.parse(n)}catch(o){return{ok:!1,errors:[`YAML \u89E3\u6790\u5931\u8D25: ${_l(o)}`]}}return Jc(r)}loadFromProfile(e,n){this.roles.clear(),this.errors=[],this.loaded=!0;for(let[r,o]of Object.entries(e)){if(!o||typeof o!="object"){this.errors.push({file:`profile:roles.${r}`,errors:["\u89D2\u8272\u5B9A\u4E49\u5FC5\u987B\u662F\u5BF9\u8C61"]}),h.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5DF2\u8DF3\u8FC7",{key:r});continue}let i={...o,id:r},s=Jc(i);if(!s.ok){this.errors.push({file:`profile:roles.${r}`,errors:s.errors}),h.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{key:r,errors:s.errors});continue}let c=s.definition,l=gh(c,n);if(!l.ok){this.errors.push({file:`profile:roles.${r}`,errors:[l.error]}),h.warn("role","persona \u6587\u4EF6\u8BFB\u53D6\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{key:r,error:l.error});continue}if(this.roles.has(c.id)){let d=`\u89D2\u8272 id \u91CD\u590D\uFF1A${c.id}\uFF08\u4FDD\u7559\u5148\u52A0\u8F7D\u8005\uFF0C\u8DF3\u8FC7 profile:roles.${r}\uFF09`;this.errors.push({file:`profile:roles.${r}`,errors:[d]}),h.warn("role",d,{key:r});continue}this.roles.set(c.id,c)}}};function gh(t,e){let n=t.persona;if(typeof n=="string")return{ok:!0};if(n&&typeof n=="object"&&"file"in n){let r=ps.resolve(e,n.file);if(!X_(r))return{ok:!1,error:`persona file \u4E0D\u5B58\u5728: ${n.file}\uFF08\u76F8\u5BF9 ${e}\uFF09`};try{let o=Q_(r,"utf8").trim();return o?(t.persona=o,{ok:!0}):{ok:!1,error:`persona file \u5185\u5BB9\u4E3A\u7A7A: ${n.file}`}}catch(o){return{ok:!1,error:`persona file \u8BFB\u53D6\u5931\u8D25: ${_l(o)}`}}}return{ok:!0}}a(gh,"resolvePersonaFile");function _l(t){return t instanceof Error?t.message:String(t)}a(_l,"errMsg");function ms(t){let e=t.multiline?"text":"string",n=t.writeTarget?{key:t.key,label:t.label,description:t.description,owner:"project",source:"project",required:!1,editable:!0,allowEmpty:!1,defaultStrategy:"none",valueType:e,writeTarget:{...t.writeTarget,valueType:e}}:void 0;return{key:t.key,status:"ok",value:t.value,message:`${t.label}\u5DF2\u914D\u7F6E`,writeTarget:n?.writeTarget??t.writeTarget,surface:n}}a(ms,"roleFieldItem");function mh(t,e,n){if(!S(t)||typeof t.file!="string")return null;let r=On.resolve(e,t.file),o=On.relative(n,r);return o.startsWith("..")?null:o}a(mh,"personaFileRelPath");async function hh(t,e,n,r){let o=[];if(!e)return o.push({key:"roles.enabled",status:"ok",value:!1,message:"\u89D2\u8272\u7CFB\u7EDF\u5DF2\u7981\u7528"}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!0,items:o};let i=r??null;if(r===void 0&&n)try{i=lt(n,void 0,{lenientEnv:!0})}catch{i=null}return i?.roles?oA(i.roles,n,o):iA(t,o)}a(hh,"checkRoles");async function oA(t,e,n){let r=On.resolve(e,"profile"),o=new Mt(r);o.loadFromProfile(t,r);for(let s of o.loadErrors)n.push({key:`role.${s.file}`,status:"error",message:`\u89D2\u8272\u6821\u9A8C\u5931\u8D25: ${s.errors.join("; ")}`});if(o.size===0&&o.loadErrors.length===0)return n.push({key:"roles",status:"error",message:"profile.yml roles \u6BB5\u4E3A\u7A7A\uFF08\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u89D2\u8272\u5B9A\u4E49\uFF09"}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!1,items:n};for(let s of o.list()){let c=typeof s.persona=="string"?s.persona:"",l=t[s.id],d=S(l)?l.persona:void 0,u=mh(d,r,e),f=u?{type:"textFile",file:u}:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"persona"]};n.push(ms({key:`role.${s.id}.name`,label:"\u89D2\u8272\u540D\u79F0",description:`\u89D2\u8272 ${s.id} \u7684\u5C55\u793A\u540D\u79F0`,value:s.name??s.id,writeTarget:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"name"]}})),c.trim()?(n.push(ms({key:`role.${s.id}.persona`,label:"\u4EBA\u8BBE Persona",description:u?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${u}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:"\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 profile.yml\uFF09",value:c,writeTarget:f,multiline:!0})),n.push({key:`role.${s.id}`,status:"ok",message:`\u89D2\u8272 ${s.id} \u6821\u9A8C\u901A\u8FC7`})):n.push({key:`role.${s.id}.persona`,status:"warn",value:"",message:`\u89D2\u8272 ${s.id} \u7684 persona \u4E3A\u7A7A\uFF0C\u5F71\u54CD AI \u8F93\u51FA\u8D28\u91CF`,writeTarget:f});let p=s.knowledge_scope?.kb_collections??[];if(p.length===0)n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"suggestion",message:`\u89D2\u8272 ${s.id} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`});else{let g=p.map(m=>{if(typeof m=="string")return m;let y=m.compile?.build?.length?"\u81EA\u5B9A\u4E49\u7F16\u8BD1":"\u5185\u7F6E\u7F16\u8BD1";return`${m.collection}\uFF08${y}\uFF09`});n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"ok",value:g,message:`\u89D2\u8272 ${s.id} \u5DF2\u914D\u7F6E ${p.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!n.some(s=>s.status==="error"),items:n}}a(oA,"checkProfileRoles");async function iA(t,e){let n=!1;try{n=(await nA(t)).isDirectory()}catch{n=!1}if(!n)return e.push({key:"roles_dir",status:"warn",message:`roles/ \u76EE\u5F55\u4E0D\u5B58\u5728\uFF08${t}\uFF09\uFF1B\u89D2\u8272\u5B9A\u4E49\u76EE\u5F55\u81F3\u5C11\u9700\u8981\u4E00\u4E2A .role.yml \u6587\u4EF6`}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!0,items:e};let o=(await tA(t)).filter(c=>c.endsWith(gs)).sort();if(o.length===0)return e.push({key:"roles",status:"error",message:"roles/ \u76EE\u5F55\u4E0B\u65E0 .role.yml \u6587\u4EF6\uFF08\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u89D2\u8272\u5B9A\u4E49\u6587\u4EF6\uFF09"}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!1,items:e};let i=new Mt(t);for(let c of o){let l=On.join(t,c),d=await i.validateFile(l),u=c.replace(gs,"");if(!d.ok){e.push({key:`role.${u}`,status:"error",message:`${c} \u6821\u9A8C\u5931\u8D25: ${d.errors.join("; ")}`});continue}let f=d.definition,p=typeof f.persona=="string"?f.persona:"",g=mh(f.persona,t,On.dirname(t)),m={type:"yaml",file:`roles/${c}`,yamlPath:["persona"]};if(g){m={type:"textFile",file:g};try{p=(await rA(On.resolve(On.dirname(t),g),"utf8")).trim()}catch{p=""}}e.push(ms({key:`role.${u}.name`,label:"\u89D2\u8272\u540D\u79F0",description:`\u89D2\u8272 ${f.id} \u7684\u5C55\u793A\u540D\u79F0`,value:f.name??f.id,writeTarget:{type:"yaml",file:`roles/${c}`,yamlPath:["name"]}})),p.trim()?(e.push(ms({key:`role.${u}.persona`,label:"\u4EBA\u8BBE Persona",description:g?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${g}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 roles/${c}\uFF09`,value:p,writeTarget:m,multiline:!0})),e.push({key:`role.${u}`,status:"ok",message:`${c} \u6821\u9A8C\u901A\u8FC7 (${f.id})`})):e.push({key:`role.${u}.persona`,status:"warn",value:"",message:`${c} \u7684 persona \u4E3A\u7A7A\uFF0C\u5F71\u54CD AI \u8F93\u51FA\u8D28\u91CF`,writeTarget:m});let y=f.knowledge_scope?.kb_collections??[];y.length===0?e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"suggestion",message:`${c} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF08knowledge_scope.kb_collections\uFF09\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`}):e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"ok",value:y,message:`${c} \u5DF2\u914D\u7F6E ${y.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!e.some(c=>c.status==="error"),items:e}}a(iA,"checkDirectoryRoles");import sA from"yaml";var aA=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,cA=/api_key|secret|token|password|^DINGTALK_ROBOTS$/i,wh=/^[A-Za-z_][A-Za-z0-9_]*$/;function lA(t){let e=new Map;if(!t)return e;let n=[];for(let r of t.split(`
342
+ \u8865\u5145\u9700\u6C42\uFF1A${f}`:o,g=await KT(n),m=WT(r),y=await BT(n),w=await zT(n);return{scene:o,supplements:f,fullRequirement:p,workDir:n,configPath:e,projectRoot:g,agentType:d,agentTimeoutMs:u,mode:i.mode,profileExists:i.profileExists,workflows:i.workflows,trackerFacts:m,roles:y,strayRoleFiles:w,recipeDir:s.recipeDir,workflowPath:s.workflowPath,workflowRelPath:s.workflowRelPath,recipeDirRelPath:s.recipeDirRelPath}}a(Km,"collectDesignContext");function WT(t){if(!v(t.tracker))return[];let e=t.tracker,n=[];if(v(e.states)){let r=e.states,o=[typeof r.initial=="string"?`initial=${r.initial}`:"",Array.isArray(r.active)?`active=${r.active.join(" / ")}`:"",Array.isArray(r.terminal)?`terminal=${r.terminal.join(" / ")}`:"",typeof r.review=="string"?`review=${r.review}`:"",typeof r.blocked=="string"?`blocked=${r.blocked}`:""].filter(Boolean);o.length>0&&n.push(`- Tracker \u72B6\u6001\uFF1A${o.join("; ")}`)}if(v(e.fields)){let r=Object.entries(e.fields).filter(o=>typeof o[1]=="string").map(([o,i])=>`${o}=${i}`);r.length>0&&n.push(`- \u7CFB\u7EDF\u9AA8\u67B6\u5B57\u6BB5\uFF1A${r.join("; ")}`)}return n}a(WT,"buildTrackerFacts");async function BT(t){try{let e=Um.parse(await zm(Ge.join(t,"profile","profile.yml"),"utf8"));return!v(e)||!v(e.roles)?[]:Object.entries(e.roles).slice(0,8).map(([n,r])=>({id:n,name:v(r)&&typeof r.name=="string"?r.name:void 0}))}catch{return[]}}a(BT,"loadProfileRoles");async function zT(t){try{return(await OT(Ge.join(t,"roles"))).filter(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return[]}}a(zT,"listStrayRoleFiles");async function Vm(t){let e=Um.parse(await zm(t,"utf8"));if(!v(e))throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548");return e}a(Vm,"readRawConfig");function UT(t){return{id:"default",workflowRelPath:"./workflow.yml",recipeDirRelPath:"./recipes",workflowPath:Ge.resolve(t,"./workflow.yml"),recipeDir:Ge.resolve(t,"./recipes"),exists:!1}}a(UT,"fallbackTarget");async function qm(t){try{return await jT(t),!0}catch{return!1}}a(qm,"fileExists");async function KT(t){let e=Ge.resolve(t),n=Ge.parse(e).root;for(;e!==n;){if(await qm(Ge.join(e,"package.json")))return e;e=Ge.dirname(e)}return Ge.resolve(t)}a(KT,"findProjectRoot");async function so(t){let e=[],n=[],r=await HT(t);for(let o of r){let i=await Hm(o.workflowPath,o.recipeDir),s=r.length>1?`[${o.id}] `:"";e.push(...i.errors.map(c=>`${s}${c}`)),n.push(...i.warnings.map(c=>`${s}${c}`))}return await GT(t.workDir,r,e),{valid:e.length===0,errors:e,warnings:n}}a(so,"validateDesignArtifacts");async function HT(t){if(t.configPath)try{let e=await is(t.configPath);if(e.workflows.length>0)return e.workflows.map(n=>({id:n.id,workflowPath:n.workflowPath,recipeDir:n.recipeDir}))}catch{}return t.workflows.length>0?t.workflows:[{id:"default",workflowPath:t.workflowPath,recipeDir:t.recipeDir}]}a(HT,"resolveValidationTargets");async function GT(t,e,n){let r=rn.join(t,"profile","profile.yml");if(!await ss(r))return;let o;try{o=fl.parse(await as(r,"utf8"))}catch(c){n.push(`profile/profile.yml \u89E3\u6790\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`);return}if(!v(o))return;o.schema_version!==2&&n.push("profile/profile.yml \u7684 schema_version \u5FC5\u987B\u662F\u6570\u5B57 2\uFF0C\u5426\u5219\u8FD0\u884C\u65F6\u4F1A\u62D2\u7EDD\u542F\u52A8"),o.roles!==void 0&&await l_(t)&&n.push("profile/profile.yml \u58F0\u660E\u4E86 roles \u6BB5\uFF0C\u540C\u65F6 roles/ \u76EE\u5F55\u4E0B\u8FD8\u6709 .role.yml \u6587\u4EF6\uFF1A\u4E24\u8005\u4E92\u65A5\uFF0C\u5B9E\u4F8B\u542F\u52A8\u4F1A\u76F4\u63A5\u62A5\u9519\u3002\u89D2\u8272\u53EA\u4FDD\u7559\u4E00\u5904\uFF08profile_v2 \u6A21\u5F0F\u4E0B\u5199\u8FDB profile \u7684 roles \u6BB5\uFF09\u3002");let i=o.workflows;if(!v(i))return;let s=new Map(e.map(c=>[c.id,c.workflowPath]));for(let[c,l]of Object.entries(i)){let d=s.get(c);if(!d){n.push(`profile.yml \u914D\u7F6E\u4E86 workflows.${c}\uFF0C\u4F46\u4E0D\u5B58\u5728\u8BE5 workflow\uFF1A\u8FD0\u884C\u65F6\u4F1A\u56E0\u951A\u70B9\u7F3A\u5931\u800C\u629B\u9519\u3002\u8BF7\u6539\u540D\u6216\u5220\u9664\u8BE5\u6BB5\u3002`);continue}if(!v(l))continue;let u=await JT(d);if(!u)continue;for(let m of u.runtimeConfigPaths)n.push(`profile.yml \u5DF2\u58F0\u660E workflows.${c}\uFF0C${m} \u4E0D\u5E94\u518D\u5199\u5728 workflow.yml\uFF1Aprofile \u662F\u8FD0\u884C\u914D\u7F6E\u552F\u4E00\u4E8B\u5B9E\u6E90\uFF0C\u8BF7\u8FC1\u79FB\u5230 profile.workflows.${c} \u5BF9\u5E94\u4F4D\u7F6E\u3002`);let f=l.steps;if(v(f))for(let m of Object.keys(f))u.stepIds.has(m)||n.push(`profile.yml \u7684 workflows.${c}.steps.${m} \u627E\u4E0D\u5230\u5BF9\u5E94 step\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709 step \u4E3A ${[...u.stepIds].join(" / ")||"(\u65E0)"}\u3002`);let p=l.event_sources;if(v(p))for(let[m,y]of Object.entries(p))u.sourceNames.has(m)||n.push(`profile.yml \u7684 workflows.${c}.event_sources.${m} \u627E\u4E0D\u5230\u5BF9\u5E94\u4E8B\u4EF6\u6E90\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709\u4E8B\u4EF6\u6E90\u4E3A ${[...u.sourceNames].join(" / ")||"(\u65E0)"}\u3002`),v(y)&&"config"in y&&n.push(`profile.yml \u7684 workflows.${c}.event_sources.${m}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Aprofile event source \u4E0B\u9664 handler_config \u5916\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 event_sources[].config\uFF0C\u8BF7\u6539\u4E3A workflows.${c}.event_sources.${m}.<\u5B57\u6BB5\u540D>\u3002`);let g=l.steps;if(v(g))for(let[m,y]of Object.entries(g))v(y)&&"config"in y&&n.push(`profile.yml \u7684 workflows.${c}.steps.${m}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Aprofile step \u4E0B\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 step.config\uFF0C\u8BF7\u6539\u4E3A workflows.${c}.steps.${m}.<\u5B57\u6BB5\u540D>\u3002`)}}a(GT,"validateProfileAnchors");async function JT(t){try{let e=fl.parse(await as(t,"utf8"));if(!v(e))return;let n=[];v(e.toolkit_config)&&n.push("workflow.yml \u7684 toolkit_config");let r=new Set;if(Array.isArray(e.steps))for(let i=0;i<e.steps.length;i++){let s=e.steps[i];if(v(s)&&typeof s.id=="string"&&r.add(s.id),v(s)&&v(s.config)){let c=typeof s.id=="string"?`steps.${s.id}.config`:`steps[${i}].config`;n.push(`workflow.yml \u7684 ${c}`)}}let o=new Set;if(Array.isArray(e.event_sources))for(let i=0;i<e.event_sources.length;i++){let s=e.event_sources[i];if(v(s)&&typeof s.name=="string"&&o.add(s.name),v(s)&&v(s.config)){let c=typeof s.name=="string"?`event_sources.${s.name}.config`:`event_sources[${i}].config`;n.push(`workflow.yml \u7684 ${c}`)}if(v(s)&&v(s.handler_config)){let c=typeof s.name=="string"?`event_sources.${s.name}.handler_config`:`event_sources[${i}].handler_config`;n.push(`workflow.yml \u7684 ${c}`)}}return{stepIds:r,sourceNames:o,runtimeConfigPaths:n}}catch{return}}a(JT,"readWorkflowAnchors");async function Hm(t,e){let n=[],r=[];if(!await ss(t))return n.push(`workflow \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),{valid:!1,errors:n,warnings:r};let o;try{let l=await as(t,"utf8");o=fl.parse(l)}catch(l){return n.push(`workflow YAML \u89E3\u6790\u5931\u8D25: ${l instanceof Error?l.message:String(l)}`),{valid:!1,errors:n,warnings:r}}if(!v(o))return n.push("workflow.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{valid:!1,errors:n,warnings:r};ZT(o.meta,n,r);let i=YT(o.steps,n,r);QT(o.edges,i,n,r);let s=XT(o.steps);await e_(s,e,n,r);let c=s_(o.steps,o);return i_(o,n,r),t_(o.event_sources,n),r_(o,r),o_(o.steps,n),a_(o.tracker,c,n,r),{valid:n.length===0,errors:n,warnings:r}}a(Hm,"validateDesignOutput");function ZT(t,e,n){if(!v(t)){e.push("workflow.yml \u7F3A\u5C11 meta \u6BB5");return}t.name||e.push("meta.name \u4E0D\u80FD\u4E3A\u7A7A"),t.version||n.push("meta.version \u672A\u8BBE\u7F6E"),t.domain||n.push("meta.domain \u672A\u8BBE\u7F6E")}a(ZT,"validateMeta");function YT(t,e,n){let r=new Set;if(!Array.isArray(t))return e.push("workflow.yml \u7F3A\u5C11 steps \u6570\u7EC4"),r;if(t.length===0)return e.push("steps \u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A"),r;for(let o=0;o<t.length;o++){let i=t[o];if(!v(i)){e.push(`steps[${o}] \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}let s=i.id;if(!s||typeof s!="string"){e.push(`steps[${o}] \u7F3A\u5C11 id \u5B57\u6BB5`);continue}/^[a-z0-9_]+$/.test(s)||e.push(`steps[${o}].id "${s}" \u53EA\u5141\u8BB8\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF`),r.has(s)&&e.push(`\u6B65\u9AA4 id "${s}" \u91CD\u590D`),r.add(s),i.name||n.push(`\u6B65\u9AA4 "${s}" \u7F3A\u5C11 name \u5B57\u6BB5`),!i.recipe&&!i.prompt&&n.push(`\u6B65\u9AA4 "${s}" \u65E2\u6CA1\u6709 recipe \u4E5F\u6CA1\u6709 prompt\uFF0C\u5C06\u65E0\u6CD5\u6267\u884C`),i.auto===void 0&&n.push(`\u6B65\u9AA4 "${s}" \u672A\u8BBE\u7F6E auto \u5B57\u6BB5\uFF0C\u9ED8\u8BA4\u4E3A true`)}return r}a(YT,"validateSteps");function QT(t,e,n,r){if(!Array.isArray(t)){n.push("workflow.yml \u7F3A\u5C11 edges \u6570\u7EC4");return}if(t.length===0){n.push("edges \u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A");return}let o=!1,i=!1;for(let s=0;s<t.length;s++){let c=t[s];if(!v(c)){n.push(`edges[${s}] \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}let l=String(c.from??""),d=String(c.to??"");l||n.push(`edges[${s}] \u7F3A\u5C11 from \u5B57\u6BB5`),d||n.push(`edges[${s}] \u7F3A\u5C11 to \u5B57\u6BB5`),l==="__start__"&&(o=!0),d==="__end__"&&(i=!0),l&&l!=="__start__"&&!e.has(l)&&n.push(`edges[${s}].from \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4: "${l}"`),d&&d!=="__end__"&&!e.has(d)&&n.push(`edges[${s}].to \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4: "${d}"`)}o||n.push("edges \u7F3A\u5C11\u4ECE __start__ \u51FA\u53D1\u7684\u8FB9"),i||n.push("edges \u7F3A\u5C11\u5230\u8FBE __end__ \u7684\u8FB9")}a(QT,"validateEdges");function XT(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)v(n)&&typeof n.recipe=="string"&&e.push(n.recipe);return e}a(XT,"extractReferencedRecipes");async function e_(t,e,n,r){if(!await ss(e)){t.length>0&&n.push(`recipe \u76EE\u5F55\u4E0D\u5B58\u5728: ${e}`);return}let o=[];for(let i of t){let s=rn.join(e,`${i}.recipe.ts`);if(!await ss(s)){n.push(`recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${s}\uFF08\u6B65\u9AA4\u5F15\u7528\u4E86 recipe="${i}"\uFF09`);continue}try{let c=await as(s,"utf8");c.trim().length===0?n.push(`recipe \u6587\u4EF6\u4E3A\u7A7A: ${s}`):c.includes("export default")||n.push(`recipe \u6587\u4EF6\u7F3A\u5C11 "export default": ${s}`),c.includes("RecipeDefinition")||r.push(`recipe \u6587\u4EF6\u672A\u5F15\u7528 RecipeDefinition \u7C7B\u578B: ${s}`);let l=pl(c,s);for(let d of l)n.push(d);c.trim().length>0&&l.length===0&&o.push(s)}catch{n.push(`\u65E0\u6CD5\u8BFB\u53D6 recipe \u6587\u4EF6: ${s}`)}}if(o.length>0){let i=gl(o);i.degraded?r.push(`\u5DF2\u8DF3\u8FC7 recipe \u7C7B\u578B\u68C0\u67E5\uFF1A\u672A\u80FD\u89E3\u6790\u6846\u67B6\u7C7B\u578B\uFF08aitable-workflow-core / zod\uFF09\uFF0C${i.unresolvedModules.length>0?`\u65E0\u6CD5\u89E3\u6790 ${i.unresolvedModules.join("\u3001")}\uFF1B`:""}\u591A\u4E3A node_modules \u7F3A\u5931\u3001\u672A\u6784\u5EFA\u6216 import \u8DEF\u5F84\u9519\u8BEF\uFF1B\u4EC5\u5B8C\u6210\u8BED\u6CD5\u6821\u9A8C\u3002`):n.push(...i.errors)}}a(e_,"validateRecipeFiles");function t_(t,e){if(Array.isArray(t))for(let n=0;n<t.length;n++){let r=t[n];if(!v(r)||r.type!=="aitable_record")continue;let o=typeof r.name=="string"?`"${r.name}"`:`event_sources[${n}]`,i=v(r.config)?r.config:void 0;if(!i||i.filter===void 0&&i.filters===void 0){e.push(`\u4E8B\u4EF6\u6E90 ${o} \u662F aitable_record \u4F46\u6CA1\u6709 config.filter / config.filters\uFF1A\u4F1A\u5168\u8868\u626B\u63CF\uFF0C\u6570\u636E\u91CF\u589E\u957F\u540E\u67E5\u8BE2\u5FC5\u7136\u8D85\u65F6\u3002\u8BF7\u8865\u5145\u7B5B\u9009\u6761\u4EF6\uFF08\u5982 filter: { field: "\u72B6\u6001", equals: "\u5F85\u5904\u7406" }\uFF09\u3002`);continue}i.resolve_field_names===!1&&e.push(`\u4E8B\u4EF6\u6E90 ${o} \u5173\u95ED\u4E86 resolve_field_names\uFF0Cfilter \u7684\u5B57\u6BB5\u540D\u65E0\u6CD5\u7FFB\u8BD1\u6210 fieldId\uFF0C\u4F1A\u9000\u56DE\u6162\u8DEF\u5F84\u5BFC\u81F4\u8D85\u65F6\u3002\u8BF7\u79FB\u9664\u8BE5\u914D\u7F6E\uFF08\u9ED8\u8BA4\u4E3A true\uFF09\u3002`)}}a(t_,"validateEventSourceFilters");var n_=new Set(["seen_file","resolve_field_names","emit_existing","fetch_limit","max_pages","dws_bin"]);function r_(t,e){let n=a((i,s)=>{e.push(`${i} \u51FA\u73B0\u5185\u90E8\u8FD0\u884C\u534F\u8BAE\u5B57\u6BB5 "${s}"\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732`)},"report"),r=t.event_sources;if(Array.isArray(r))for(let i=0;i<r.length;i++){let s=r[i];if(!v(s))continue;let c=typeof s.name=="string"?`\u4E8B\u4EF6\u6E90 "${s.name}"`:`event_sources[${i}]`,l=s.handler_config;if(v(l))for(let d of Object.keys(l))n_.has(d)&&n(`${c} \u7684 handler_config`,d)}let o=v(t.toolkit_config)&&v(t.toolkit_config.file)?t.toolkit_config.file:void 0;o&&"base_dir"in o&&e.push("toolkit_config.file.base_dir \u662F\u5185\u90E8\u8DEF\u5F84\u7EA6\u5B9A\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732")}a(r_,"validateNoInternalConfigExposed");function o_(t,e){if(!Array.isArray(t))return;let n=new Map;for(let r of t){if(!v(r))continue;let o=typeof r.id=="string"?r.id:"unknown",i=r.output_mapping;if(v(i))for(let s of Object.values(i)){if(typeof s!="string")continue;let c=n.get(s);c&&c!==o?e.push(`\u5B57\u6BB5 "${s}" \u540C\u65F6\u662F\u6B65\u9AA4 "${c}" \u548C "${o}" \u7684 output_mapping \u76EE\u6807\uFF1AStepEngine \u4EE5\u300C\u8F93\u51FA\u5B57\u6BB5\u975E\u7A7A\u300D\u5224\u5B9A\u6B65\u9AA4\u5DF2\u5B8C\u6210\uFF0C\u5171\u7528\u8F93\u51FA\u5217\u4F1A\u5BFC\u81F4\u5176\u4E2D\u4E00\u6B65\u88AB\u6C38\u4E45\u8DF3\u8FC7\u3002\u8BF7\u62C6\u6210\u4E24\u4E2A\u5B57\u6BB5\u3002`):n.set(s,o)}}}a(o_,"validateOutputTargetsExclusive");function Gm(t){let e=t.tracker;if(v(e)&&Array.isArray(e.field_definitions))return e.field_definitions;let n=t.field_definitions;return Array.isArray(n)?n:null}a(Gm,"readFieldDefinitions");function i_(t,e,n){if(!v(t))return;let r=Gm(t);if(!r){e.push("workflow.yml \u7F3A\u5C11 tracker.field_definitions \u6BB5\uFF08\u5FC5\u987B\u58F0\u660E\u6240\u6709\u4E1A\u52A1\u5B57\u6BB5\uFF0Cdesign \u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FC1\u79FB\u5230 config\uFF09");return}let o=new Set;for(let s of r)v(s)&&typeof s.name=="string"&&o.add(s.name);let i=t.steps;if(Array.isArray(i))for(let s of i){if(!v(s))continue;let c=typeof s.id=="string"?s.id:"unknown";for(let l of["input_mapping","output_mapping"]){let d=s[l];if(v(d))for(let u of Object.values(d))typeof u=="string"&&(Jm.has(u)||o.has(u)||n.push(`\u6B65\u9AA4 "${c}" \u7684 ${l} \u5F15\u7528\u4E86\u5B57\u6BB5 "${u}"\uFF0C\u4F46\u672A\u5728 field_definitions \u4E2D\u58F0\u660E`))}}}a(i_,"validateFieldDefinitionsCoverage");var Jm=io;function s_(t,e){let n=new Set(Jm);if(Array.isArray(t)){for(let r of t)if(v(r)){if(v(r.input_mapping))for(let o of Object.values(r.input_mapping))typeof o=="string"&&n.add(o);if(v(r.output_mapping))for(let o of Object.values(r.output_mapping))typeof o=="string"&&n.add(o)}}for(let r of(e?Gm(e):null)??[])v(r)&&typeof r.name=="string"&&n.add(r.name);return n}a(s_,"extractAllFieldNames");function a_(t,e,n,r){if(!v(t)||t.views===void 0)return;let o=t.views;if(!Array.isArray(o)){n.push("tracker.views \u5FC5\u987B\u662F\u6570\u7EC4");return}let i=new Set,s=!1;for(let c=0;c<o.length;c++){let l=o[c],d=v(l)?`tracker.views[${c}] (id="${l.id??""}")`:`tracker.views[${c}]`,u=ro.safeParse(l);if(!u.success){let p=u.error.issues.map(g=>`${g.path.join(".")}: ${g.message}`);n.push(`${d} Schema \u6821\u9A8C\u5931\u8D25: ${p.join("; ")}`);continue}let f=u.data;if(i.has(f.id)&&n.push(`${d} id "${f.id}" \u91CD\u590D`),i.add(f.id),f.id==="default_grid"&&(s=!0),f.type==="Grid"&&!f.field_order?.length&&r.push(`${d} Grid \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B field_order`),f.type==="FormDesigner"&&!f.visible_fields?.length&&r.push(`${d} FormDesigner \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B visible_fields`),f.type==="Kanban"&&!f.group_by&&n.push(`${d} Kanban \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A group_by`),(f.type==="Calendar"||f.type==="Gantt")&&!f.date_field&&n.push(`${d} ${f.type} \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A date_field`),e.size>0){let p=f.visible_fields??f.field_order??[];for(let g of p)e.has(g)||n.push(`${d} \u5F15\u7528\u4E86\u672A\u5728 workflow \u4E2D\u5B9A\u4E49\u7684\u5B57\u6BB5: "${g}"\uFF08\u89C6\u56FE\u4E0D\u5141\u8BB8\u521B\u9020\u65B0\u5B57\u6BB5\uFF0C\u8BF7\u5148\u5728 steps mapping \u6216 field_definitions \u4E2D\u58F0\u660E\uFF09`);f.group_by&&!e.has(f.group_by)&&n.push(`${d} group_by \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.group_by}"`),f.date_field&&!e.has(f.date_field)&&n.push(`${d} date_field \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.date_field}"`)}}s||r.push('tracker.views \u7F3A\u5C11 id="default_grid" \u7684 Grid \u89C6\u56FE\uFF08\u5EFA\u8BAE\u6DFB\u52A0\uFF09')}a(a_,"validateTrackerViews");function pl(t,e){let n=Je.createSourceFile(rn.basename(e),t,Je.ScriptTarget.ESNext,!0,Je.ScriptKind.TS),r=n.parseDiagnostics??Je.createProgram({rootNames:[],options:{}}).getSyntacticDiagnostics(n);return!r||r.length===0?[]:r.map(o=>{let{line:i}=Je.getLineAndCharacterOfPosition(n,o.start),s=Je.flattenDiagnosticMessageText(o.messageText," ");return`recipe \u8BED\u6CD5\u9519\u8BEF [${rn.basename(e)}:${i+1}]: ${s}`})}a(pl,"checkRecipeSyntax");function gl(t){let e={target:Je.ScriptTarget.ESNext,module:Je.ModuleKind.NodeNext,moduleResolution:Je.ModuleResolutionKind.NodeNext,strict:!0,noEmit:!0,skipLibCheck:!0,types:[]},n;try{let s=Je.createProgram({rootNames:t,options:e}),c=new Set(t.map(l=>rn.resolve(l)));n=Je.getPreEmitDiagnostics(s).filter(l=>l.file!=null&&c.has(rn.resolve(l.file.fileName)))}catch{return{errors:[],degraded:!0,unresolvedModules:[]}}let r=n.filter(s=>s.code===2307).map(s=>c_(s)).filter(s=>!!s);return r.length>0||n.some(s=>s.code===2307)?{errors:[],degraded:!0,unresolvedModules:[...new Set(r)]}:{errors:n.map(s=>{let c=s.file&&s.start!=null?`${rn.basename(s.file.fileName)}:${s.file.getLineAndCharacterOfPosition(s.start).line+1}`:"recipe",l=Je.flattenDiagnosticMessageText(s.messageText," ");return`recipe \u7C7B\u578B\u9519\u8BEF [${c}]: TS${s.code} ${l}`}),degraded:!1,unresolvedModules:[]}}a(gl,"checkRecipeTypes");function c_(t){let e=Je.flattenDiagnosticMessageText(t.messageText," ");return(e.match(/Cannot find module ['"]([^'"]+)['"]/)??e.match(/找不到模块[“"]([^”"]+)[”"]/))?.[1]??null}a(c_,"unresolvedModuleName");async function ss(t){try{return await VT(t),!0}catch{return!1}}a(ss,"fileExists");async function l_(t){try{return(await qT(rn.join(t,"roles"))).some(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return!1}}a(l_,"hasRoleFiles");async function Zm(t,e,n){let r=[],o=new Set;for(let s of e.steps)s.recipe&&o.add(s.recipe);for(let s of e.eventSources)s.handler&&o.add(s.handler);for(let s of e.eventHandlers)s.recipe&&o.add(s.recipe);let i=[];for(let s of o){let c=ir(t,s);if(!c||!c.endsWith(".ts"))continue;let l;try{l=await d_(c,"utf8")}catch{continue}let d=pl(l,c);for(let u of d)r.push({code:"WF-T01",severity:"error",message:u,location:{file:n(s),recipeId:s}});d.length===0&&i.push(c)}if(i.length>0){let s=gl(i);if(s.degraded){let c=s.unresolvedModules.length>0?`\u65E0\u6CD5\u89E3\u6790 ${s.unresolvedModules.join("\u3001")}\uFF1B`:"";r.push({code:"WF-T03",severity:"warning",message:`\u5DF2\u8DF3\u8FC7 recipe \u7C7B\u578B\u68C0\u67E5\uFF1A\u672A\u80FD\u89E3\u6790\u6846\u67B6\u7C7B\u578B\uFF08${c}node_modules \u7F3A\u5931\u3001\u672A\u6784\u5EFA\u6216 import \u8DEF\u5F84\u9519\u8BEF\uFF09\uFF0C\u4EC5\u5B8C\u6210\u8BED\u6CD5\u6821\u9A8C`})}else for(let c of s.errors)r.push({code:"WF-T02",severity:"error",message:c,location:{file:u_(c,i,n)}})}return r}a(Zm,"checkRecipeTypecheck");function u_(t,e,n){for(let r of e){let o=r.split("/").pop()??r;if(t.includes(o)){let i=o.replace(/\.recipe\.ts$/,"");return n(i)}}}a(u_,"guessRecipeRelFile");async function Qm(t,e,n){let r=[];if(!n.skipConfigSchema){let o=await sr(t,e);for(let i of o.issues){let s=i.stepId.startsWith("event:");r.push({code:s?"WF-C02":"WF-C01",severity:i.level==="error"?"error":"warning",message:`[${i.recipeId}] ${i.message}`,location:{stepId:s?void 0:i.stepId,key:s?i.stepId:void 0,recipeId:i.recipeId}})}}for(let o of e.steps){if(o.config&&co(o.config,{onIssue:a((i,s,c)=>r.push(ao(s,c,{stepId:o.id,key:`steps.${o.id}.config.${i}`,message:`\u6B65\u9AA4\u300C${o.id}\u300Dconfig.${i} \u542B\u5D4C\u5165\u5F0F\u5F15\u7528 "${s}"`})),"onIssue")}),o.input_mapping)for(let[i,s]of Object.entries(o.input_mapping))Ym(s,c=>r.push(ao(c,"mapping",{stepId:o.id,key:`input_mapping.${i}`,message:`\u6B65\u9AA4\u300C${o.id}\u300Dinput_mapping.${i} \u7684\u503C "${s}" \u542B "${c}"\u2014\u2014\u6620\u5C04\u503C\u5FC5\u987B\u662F\u9759\u6001\u8868\u683C\u5B57\u6BB5\u540D`})));if(o.output_mapping)for(let[i,s]of Object.entries(o.output_mapping))Ym(s,c=>r.push(ao(c,"mapping",{stepId:o.id,key:`output_mapping.${i}`,message:`\u6B65\u9AA4\u300C${o.id}\u300Doutput_mapping.${i} \u7684\u503C "${s}" \u542B "${c}"\u2014\u2014\u6620\u5C04\u503C\u5FC5\u987B\u662F\u9759\u6001\u8868\u683C\u5B57\u6BB5\u540D`})))}for(let o of e.eventSources){let i=`event_source\u300C${o.name||o.handler}\u300D`;co(o.config,{onIssue:a((s,c,l)=>r.push(ao(c,l,{key:`event_sources.${o.name}.config.${s}`,message:`${i} config.${s} \u542B\u5D4C\u5165\u5F0F\u5F15\u7528 "${c}"`})),"onIssue")}),o.handler_config&&co(o.handler_config,{onIssue:a((s,c,l)=>r.push(ao(c,l,{key:`event_sources.${o.name}.handler_config.${s}`,message:`${i} handler_config.${s} \u542B\u5D4C\u5165\u5F0F\u5F15\u7528 "${c}"`})),"onIssue")})}return r}a(Qm,"checkConfigContract");function Ym(t,e){let n=t.match(/\$\{[^}]+\}/);n&&e(n[0])}a(Ym,"checkMappingValue");var f_=/\$\{(env|config|globalVar)\.[^}]+\}/g;function co(t,e,n=[]){if(typeof t=="string"){if(ze(t)!==null)return;for(let r of t.matchAll(f_)){let o=r[0],i=o.startsWith("${env.")?"env":o.startsWith("${config.")?"config":"globalVar";i!=="env"&&e.onIssue(n.join(".")||"<root>",o,i)}return}if(Array.isArray(t)){t.forEach((r,o)=>co(r,e,[...n,String(o)]));return}if(t&&typeof t=="object")for(let[r,o]of Object.entries(t))co(o,e,[...n,r])}a(co,"scanEmbeddedRefs");function ao(t,e,n){let r=e==="mapping"?"\u8BF7\u6539\u4E3A\u9759\u6001\u5B57\u6BB5\u540D":`\u8FD0\u884C\u671F\u53EA\u6709\u6574\u503C\u5F15\u7528\uFF08\u503C\u6070\u4E3A "${t}"\uFF09\u624D\u4F1A\u88AB\u6D3B\u8BFB\uFF0C\u5D4C\u5165\u5F0F\u5F15\u7528\u4F1A\u539F\u6837\u900F\u4F20\uFF1B\u8BF7\u628A\u5F15\u7528\u63D0\u5347\u4E3A\u6574\u503C\u6216\u53BB\u6389`;return{code:"WF-C03",severity:"error",message:`${n.message}\u3002${r}`,location:{stepId:n.stepId,key:n.key}}}a(ao,"embeddedIssue");var Xm="__start__",p_="__end__",g_=/\{\{(\$var\.[\w.]+|[\w一-鿿]+)\}\}/g;function eh(t){let{workflow:e,contracts:n,knownRecipeIds:r,scaffold:o}=t,i=[],s=new Set(o);if(t.declaredFieldNames)for(let k of t.declaredFieldNames)s.add(k);for(let k of e.fieldDefinitions)s.add(k.name);let c=e.steps,l=new Set(c.map(k=>k.id)),d=new Map(c.map(k=>[k.id,k])),u=new Map,f=new Map;for(let k of[Xm,p_,...l])u.set(k,new Set),f.set(k,new Set);for(let k of e.edges)!u.has(k.from)||!u.has(k.to)||(u.get(k.from).add(k.to),f.get(k.to).add(k.from));let p=new Map,g=a(k=>{let R=p.get(k);if(R)return R;let T=new Set,_=[...f.get(k)??[]];for(;_.length>0;){let C=_.shift();T.has(C)||(T.add(C),_.push(...f.get(C)??[]))}return R=T,p.set(k,R),R},"ancestorsOf"),m=a((k,R)=>{let T=new Set,_=[...u.get(Xm)??[]];for(;_.length>0;){let C=_.shift();if(!(C===k||T.has(C))){if(C===R)return!0;T.add(C),_.push(...u.get(C)??[])}}return!1},"bypassable"),y=s,w=a(k=>{let R=new Set(y);for(let[T,_]of b)if(T!==k&&g(k).has(T))for(let C of _)R.add(C);return R},"readableFieldsFor"),b=new Map;for(let k of c)k.output_mapping&&b.set(k.id,new Set(Object.values(k.output_mapping)));let x=new Set,I=a((k,R)=>{if(!k||!r.has(k))return null;let T=n.get(k);if(!T)return null;let _=[];return T.inputs.kind==="unknown"&&_.push(`\u8F93\u5165\uFF08${T.inputs.reason}\uFF09`),T.outputs.kind==="unknown"&&_.push(`\u8F93\u51FA\uFF08${T.outputs.reason}\uFF09`),_.length>0&&!x.has(k)&&(x.add(k),i.push({code:"WF-D12",severity:"suggestion",message:`recipe\u300C${k}\u300D\u7684\u5951\u7EA6\u4E0D\u53EF\u5B8C\u5168\u9759\u6001\u63A8\u65AD\uFF1A${_.join("\u3001")}\u3002\u6B65\u9AA4\u300C${R}\u300D\u76F8\u5173\u7684\u5BF9\u8D26\u5DF2\u964D\u7EA7\uFF1B\u5EFA\u8BAE\u91CD\u6784\u4E3A\u9759\u6001\u53EF\u63A8\u65AD\u98CE\u683C\uFF08\u5B57\u9762\u91CF\u8BBF\u95EE input.X\u3001\u5B57\u9762\u91CF\u8FD4\u56DE output\uFF09`,location:{recipeId:k,stepId:R}})),T},"contractOf"),S=a((k,R,T,_)=>{let C=R.split("."),E=C[0],F=C[1];if(!l.has(E)){i.push({code:"WF-D06",severity:"error",message:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u6B65\u9AA4\u300C${E}\u300D\uFF08$var.${R}\uFF09`,location:{stepId:k,key:_}});return}if(!g(k).has(E)){i.push({code:"WF-D07",severity:"error",message:E===k?`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u4E86\u81EA\u5DF1\u7684\u8F93\u51FA\uFF08$var.${R}\uFF09\u2014\u2014\u53D8\u91CF\u6C60\u53EA\u6709\u524D\u5E8F\u6B65\u9AA4\u7684\u8F93\u51FA`:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u4E86\u975E\u524D\u5E8F\u6B65\u9AA4\u300C${E}\u300D\u7684\u8F93\u51FA\uFF08$var.${R}\uFF09\u2014\u2014\u53D8\u91CF\u6C60\u4EC5\u5728\u5355\u6B21\u6267\u884C\u5185\u7531\u524D\u5E8F\u6B65\u9AA4\u586B\u5145`,location:{stepId:k,key:_}});return}if(m(E,k)&&i.push({code:"WF-D08",severity:"warning",message:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528\u7684\u300C${E}\u300D\u8F93\u51FA\uFF08$var.${R}\uFF09\u4E0D\u4FDD\u8BC1\u6709\u503C\uFF1A\u5B58\u5728\u7ED5\u8FC7\u300C${E}\u300D\u7684\u6267\u884C\u8DEF\u5F84`,location:{stepId:k,key:_}}),F){let P=d.get(E),O=P?.recipe?n.get(P.recipe):void 0;O&&O.outputs.kind==="exact"&&!O.outputs.keys.has(F)&&i.push({code:"WF-D09",severity:"error",message:`\u6B65\u9AA4\u300C${k}\u300D${T}\u5F15\u7528 $var.${R}\uFF0C\u4F46\u6B65\u9AA4\u300C${E}\u300D\u7684 recipe \u4E0D\u4F1A\u4EA7\u51FA\u300C${F}\u300D\uFF08\u53EF\u63A8\u65AD\u4EA7\u51FA\u96C6\uFF1A${ml(O.outputs.keys)}\uFF09`,location:{stepId:k,key:_}})}},"checkVarRef");for(let k of c){let R=I(k.recipe,k.id),T=R&&R.inputs.kind==="exact"?R.inputs.keys:null,_=R&&R.outputs.kind==="exact"?R.outputs.keys:null;if(k.input_mapping){for(let[C,E]of Object.entries(k.input_mapping)){if(E.startsWith("$var.")){S(k.id,E.slice(5),"\u7684 input_mapping ",`input_mapping.${C}`);continue}E.includes("${")||(w(k.id).has(E)||i.push({code:"WF-D01",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Dinput_mapping.${C} \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u5B57\u6BB5\u300C${E}\u300D\uFF08\u672A\u5728 field_definitions \u58F0\u660E\uFF0C\u4E5F\u4E0D\u662F\u524D\u5E8F\u6B65\u9AA4\u7684\u5199\u5165\u76EE\u6807\uFF09\u2014\u2014\u8FD0\u884C\u65F6\u4F1A\u9759\u9ED8\u8BFB\u6210\u7A7A\u503C`,location:{stepId:k.id,key:`input_mapping.${C}`}}),T&&!T.has(C)&&i.push({code:"WF-D02",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Dinput_mapping \u4F20\u5165\u4E86\u300C${C}\u300D\uFF0C\u4F46 recipe\u300C${k.recipe}\u300D\u4E0D\u4F1A\u6D88\u8D39\u5B83\uFF08\u53EF\u63A8\u65AD\u6D88\u8D39\u96C6\uFF1A${ml(T)}\uFF09\u2014\u2014\u53C2\u6570\u672A\u6D88\u8D39`,location:{stepId:k.id,key:`input_mapping.${C}`,recipeId:k.recipe}}))}if(T){let C=new Set(Object.keys(k.input_mapping));for(let E of T)C.has(E)||i.push({code:"WF-D03",severity:"warning",message:`\u6B65\u9AA4\u300C${k.id}\u300D\u7684 recipe\u300C${k.recipe}\u300D\u4F1A\u6D88\u8D39\u300C${E}\u300D\uFF0C\u4F46 input_mapping \u672A\u63D0\u4F9B\uFF08\u8FD0\u884C\u65F6\u8BE5\u503C\u4E3A undefined\uFF0C\u8BF7\u786E\u8BA4 recipe \u5DF2\u5BB9\u5FCD\u7F3A\u7701\uFF09`,location:{stepId:k.id,key:E,recipeId:k.recipe}})}}else if(T)for(let C of T)y.has(C)||i.push({code:"WF-D03",severity:"warning",message:`\u6B65\u9AA4\u300C${k.id}\u300D\u65E0 input_mapping\uFF08\u6574\u884C\u6CE8\u5165\uFF09\uFF0Crecipe\u300C${k.recipe}\u300D\u6D88\u8D39\u7684\u300C${C}\u300D\u4E0D\u5728\u5B57\u6BB5\u53EF\u89C1\u96C6\u4E2D\uFF08\u8FD0\u884C\u65F6\u53EF\u80FD\u4E3A undefined\uFF09`,location:{stepId:k.id,key:C,recipeId:k.recipe}});if(k.output_mapping)for(let[C,E]of Object.entries(k.output_mapping))_&&!_.has(C)&&i.push({code:"WF-D04",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Doutput_mapping \u58F0\u660E\u5199\u5165\u300C${C}\u300D\uFF0C\u4F46 recipe\u300C${k.recipe}\u300D\u4E0D\u4F1A\u4EA7\u51FA\u5B83\uFF08\u53EF\u63A8\u65AD\u4EA7\u51FA\u96C6\uFF1A${ml(_)}\uFF09\u2014\u2014\u5B57\u6BB5\u300C${E}\u300D\u5C06\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u5199\u5165\uFF08\u8FD0\u884C\u65F6\u9759\u9ED8\u8DF3\u8FC7\uFF09`,location:{stepId:k.id,key:`output_mapping.${C}`,recipeId:k.recipe}}),y.has(E)||i.push({code:"WF-D05",severity:"error",message:`\u6B65\u9AA4\u300C${k.id}\u300Doutput_mapping \u7684\u76EE\u6807\u5B57\u6BB5\u300C${E}\u300D\u672A\u5728 field_definitions \u58F0\u660E\uFF08\u4F1A\u5199\u5165\u5E7D\u7075\u5217\uFF0Csetup \u4E0D\u4F1A\u521B\u5EFA\u8BE5\u5217\uFF09`,location:{stepId:k.id,key:`output_mapping.${C}`}});if(R)for(let C of R.variableReads)S(k.id,`${C.stepId}.${C.key}`,"\u7684 recipe \u4F53\u5185 ",`ctx.variables.${C.stepId}.${C.key}`);k.prompt&&!k.recipe&&m_(k,i,S,l,y)}return i}a(eh,"checkDataflow");function m_(t,e,n,r,o){for(let i of(t.prompt??"").matchAll(g_)){let s=i[1];if(s.startsWith("$var.")){n(t.id,s.slice(5),"\u7684 prompt ",`prompt {{${s}}}`);continue}o.has(s)||r.has(s)||e.push({code:"WF-D10",severity:"error",message:`\u6B65\u9AA4\u300C${t.id}\u300Dprompt \u4E2D\u7684 {{${s}}} \u65E0\u6CD5\u89E3\u6790\uFF1A\u4E0D\u662F\u5DF2\u58F0\u660E\u5B57\u6BB5\u4E5F\u4E0D\u662F\u53D8\u91CF\u6C60\u547D\u540D\u7A7A\u95F4\uFF08\u8FD0\u884C\u65F6\u4F1A\u539F\u6837\u4FDD\u7559\u4E3A\u5360\u4F4D\u7B26\uFF09`,location:{stepId:t.id,key:`prompt {{${s}}}`}})}}a(m_,"checkPromptTokens");function ml(t){if(t.size===0)return"\u7A7A";let e=[...t];return e.length>8?`${e.slice(0,8).join(", ")} \u7B49 ${e.length} \u4E2A`:e.join(", ")}a(ml,"formatKeys");import M from"typescript";function bl(t,e){try{return h_(t,e)}catch{return{recipePath:e,inputs:{kind:"unknown",reason:"AST \u63A8\u65AD\u5F02\u5E38"},outputs:{kind:"unknown",reason:"AST \u63A8\u65AD\u5F02\u5E38"},variableReads:[]}}}a(bl,"inferRecipeContractFromSource");var pe=a(t=>({kind:"unknown",reason:t}),"unknown");function h_(t,e){let n=M.createSourceFile(e,t,M.ScriptTarget.ESNext,!0,M.ScriptKind.TS),r=y_(n);if(!r)return{recipePath:e,inputs:pe("\u672A\u5B9A\u4F4D execute \u51FD\u6570"),outputs:pe("\u672A\u5B9A\u4F4D execute \u51FD\u6570"),variableReads:[]};let o=new hl(n,r.body),i=w_(o,r.param),s=x_(o),c=__(o,r.param);return{recipePath:e,inputs:i,outputs:s,variableReads:c}}a(h_,"inferInternal");function y_(t){let e=null,n=a(r=>{if(!e){if(M.isMethodDeclaration(r)&&r.name&&M.isIdentifier(r.name)&&r.name.text==="execute"&&r.body){e={body:r.body,param:r.parameters[0]};return}if(M.isPropertyAssignment(r)&&M.isIdentifier(r.name)&&r.name.text==="execute"){let o=r.initializer;if((M.isArrowFunction(o)||M.isFunctionExpression(o))&&o.body&&M.isBlock(o.body)){e={body:o.body,param:o.parameters[0]};return}}M.forEachChild(r,n)}},"visit");return n(t),e}a(y_,"findExecuteFunction");var hl=class{constructor(e,n){this.sourceFile=e;this.executeBody=n}sourceFile;executeBody;static{a(this,"InferenceContext")}inputAliases=new Set;variablesAliases=new Set;inputDynamicReasons=[]};function w_(t,e){if(!e)return pe("execute \u65E0\u53C2\u6570\uFF0C\u65E0\u6CD5\u5B9A\u4F4D ctx.input");if(b_(t,e),t.inputAliases.size===0)return pe("execute \u53C2\u6570\u672A\u7ED1\u5B9A ctx.input");k_(t);let n=new Set;return S_(t,t.executeBody,n),t.inputDynamicReasons.length>0?pe(t.inputDynamicReasons[0]):{kind:"exact",keys:n}}a(w_,"inferInputs");function b_(t,e){let n=e.name;if(M.isIdentifier(n))t.inputAliases.add(`@param:${n.text}`),t.variablesAliases.add(`@param:${n.text}`);else if(M.isObjectBindingPattern(n))for(let r of n.elements){let o=r.propertyName??r.name;!M.isIdentifier(o)||!M.isIdentifier(r.name)||(o.text==="input"&&t.inputAliases.add(r.name.text),o.text==="variables"&&t.variablesAliases.add(r.name.text))}}a(b_,"seedAliases");function k_(t){for(let e=0;e<8;e++){let n=!1,r=a(o=>{if(M.isVariableDeclaration(o)&&o.initializer&&M.isObjectBindingPattern(o.name)&&v_(t,o.initializer))for(let i of o.name.elements){let s=i.propertyName??i.name;!M.isIdentifier(s)||!M.isIdentifier(i.name)||(s.text==="input"&&!t.inputAliases.has(i.name.text)&&(t.inputAliases.add(i.name.text),n=!0),s.text==="variables"&&!t.variablesAliases.has(i.name.text)&&(t.variablesAliases.add(i.name.text),n=!0))}M.isVariableDeclaration(o)&&o.initializer&&M.isIdentifier(o.name)&&(lr(t,o.initializer)&&!t.inputAliases.has(o.name.text)&&(t.inputAliases.add(o.name.text),n=!0),th(t,o.initializer)&&!t.variablesAliases.has(o.name.text)&&(t.variablesAliases.add(o.name.text),n=!0)),M.forEachChild(o,r)},"visit");if(r(t.executeBody),!n)break}}a(k_,"propagateAliases");function v_(t,e){return M.isIdentifier(e)&&t.inputAliases.has(`@param:${e.text}`)}a(v_,"isAliasExpr");function lr(t,e){return M.isIdentifier(e)?t.inputAliases.has(e.text):M.isPropertyAccessExpression(e)&&M.isIdentifier(e.name)&&e.name.text==="input"||M.isElementAccessExpression(e)&&M.isStringLiteral(e.argumentExpression)&&e.argumentExpression.text==="input"?yl(t,e.expression):!1}a(lr,"isInputAliasExpr");function th(t,e){return M.isIdentifier(e)?t.variablesAliases.has(e.text):M.isPropertyAccessExpression(e)&&M.isIdentifier(e.name)&&e.name.text==="variables"?yl(t,e.expression):!1}a(th,"isVariablesAliasExpr");function yl(t,e){return M.isIdentifier(e)&&t.inputAliases.has(`@param:${e.text}`)}a(yl,"isCtxExpr");function S_(t,e,n){let r=a(i=>{t.inputDynamicReasons.push(i)},"dynamic"),o=a(i=>{if(M.isPropertyAccessExpression(i)&&lr(t,i.expression)&&M.isIdentifier(i.name)){n.add(i.name.text);return}if(M.isElementAccessExpression(i)&&lr(t,i.expression)){M.isStringLiteral(i.argumentExpression)?n.add(i.argumentExpression.text):r("\u5B58\u5728 input[\u53D8\u91CF] \u5F62\u5F0F\u7684\u52A8\u6001\u7D22\u5F15\u8BBF\u95EE");return}if(M.isVariableDeclaration(i)&&i.initializer&&lr(t,i.initializer)&&M.isObjectBindingPattern(i.name)){for(let s of i.name.elements){if(s.dotDotDotToken){r("input \u89E3\u6784\u5E26 ...rest\uFF0C\u53EF\u80FD\u6D88\u8D39\u4EFB\u610F key");continue}let c=s.propertyName??s.name;M.isIdentifier(c)?n.add(c.text):r("input \u89E3\u6784\u542B\u975E\u6807\u8BC6\u7B26\u7ED1\u5B9A")}return}if((M.isSpreadAssignment(i)||M.isSpreadElement(i))&&lr(t,i.expression)){r("input \u88AB\u5C55\u5F00\uFF08...input\uFF09\uFF0C\u53EF\u80FD\u6D88\u8D39\u4EFB\u610F key");return}if(M.isCallExpression(i))for(let s of i.arguments)(lr(t,s)||M.isIdentifier(s)&&t.inputAliases.has(`@param:${s.text}`))&&r("input \u88AB\u6574\u4F53\u4F5C\u4E3A\u53C2\u6570\u4F20\u9012\uFF0C\u6D88\u8D39\u96C6\u4E0D\u53EF\u9759\u6001\u5224\u5B9A");M.forEachChild(i,o)},"visit");o(e)}a(S_,"collectInputUsage");function x_(t){let e=nh(t.executeBody);if(e.length===0)return pe("execute \u4F53\u5185\u672A\u53D1\u73B0 return");let n=new Set;for(let r of e){let o=dr(t,r,0,new Set);if(o.kind==="unknown")return o;for(let i of o.keys)n.add(i)}return{kind:"exact",keys:n}}a(x_,"inferOutputs");function nh(t){let e=[],n=a(r=>{if(!(r!==t&&(M.isArrowFunction(r)||M.isFunctionExpression(r)||M.isFunctionDeclaration(r)||M.isMethodDeclaration(r)))){if(M.isReturnStatement(r)&&r.expression){e.push(r.expression);return}M.forEachChild(r,n)}},"visit");return n(t),e}a(nh,"collectDirectReturns");function dr(t,e,n,r){if(n>3)return pe("\u8FD4\u56DE\u8868\u8FBE\u5F0F\u5D4C\u5957\u8FC7\u6DF1");if(r.has(e))return{kind:"exact",keys:new Set};if(M.isObjectLiteralExpression(e)){let o=e.properties.find(i=>M.isPropertyAssignment(i)||M.isMethodDeclaration(i)?ih(i.name)==="output":M.isShorthandPropertyAssignment(i)?i.name.text==="output":!1);return o?M.isShorthandPropertyAssignment(o)?oh(t,"output",n,r):M.isPropertyAssignment(o)?ur(t,o.initializer,n+1,r):pe("output \u6210\u5458\u5F62\u6001\u4E0D\u53EF\u89E3\u6790"):{kind:"exact",keys:new Set}}if(M.isIdentifier(e))return rh(t,e.text,n,r,dr);if(M.isCallExpression(e))return C_(t,e,n,r);if(M.isConditionalExpression(e)){let o=dr(t,e.whenTrue,n+1,r);if(o.kind==="unknown")return o;let i=dr(t,e.whenFalse,n+1,r);return i.kind==="unknown"?i:{kind:"exact",keys:new Set([...o.keys,...i.keys])}}return M.isParenthesizedExpression(e)?dr(t,e.expression,n+1,r):pe("\u8FD4\u56DE\u8868\u8FBE\u5F0F\u4E0D\u53EF\u9759\u6001\u89E3\u6790")}a(dr,"resolveExprOutputKeys");function ur(t,e,n,r){if(n>3)return pe("output \u8868\u8FBE\u5F0F\u5D4C\u5957\u8FC7\u6DF1");if(r.has(e))return{kind:"exact",keys:new Set};if(M.isObjectLiteralExpression(e)){let o=new Set;for(let i of e.properties)if(M.isPropertyAssignment(i)||M.isMethodDeclaration(i)){let s=ih(i.name);if(s===void 0)return pe("output \u542B\u8BA1\u7B97\u5C5E\u6027\u540D\uFF08\u4E0D\u53EF\u9759\u6001\u679A\u4E3E\uFF09");o.add(s)}else if(M.isShorthandPropertyAssignment(i))o.add(i.name.text);else if(M.isSpreadAssignment(i)){let s=ur(t,i.expression,n+1,r);if(s.kind==="unknown")return s;for(let c of s.keys)o.add(c)}return{kind:"exact",keys:o}}if(M.isIdentifier(e))return oh(t,e.text,n,r);if(M.isConditionalExpression(e)){let o=ur(t,e.whenTrue,n+1,r);if(o.kind==="unknown")return o;let i=ur(t,e.whenFalse,n+1,r);return i.kind==="unknown"?i:{kind:"exact",keys:new Set([...o.keys,...i.keys])}}return M.isParenthesizedExpression(e)?ur(t,e.expression,n+1,r):pe("output \u503C\u4E0D\u53EF\u9759\u6001\u89E3\u6790")}a(ur,"resolveOutputValue");function rh(t,e,n,r,o){if(n>3)return pe(`\u53D8\u91CF\u300C${e}\u300D\u89E3\u6790\u5D4C\u5957\u8FC7\u6DF1`);let i=new Set,s=!1,c=null,l=a(d=>{let u=null;if(M.isVariableDeclaration(d)&&M.isIdentifier(d.name)&&d.name.text===e&&d.initializer?u=d.initializer:M.isBinaryExpression(d)&&d.operatorToken.kind===M.SyntaxKind.EqualsToken&&M.isIdentifier(d.left)&&d.left.text===e&&(u=d.right),u){let f=o(t,u,n+1,r);if(f.kind==="unknown")c=f.reason;else{s=!0;for(let p of f.keys)i.add(p)}}M.forEachChild(d,l)},"collectAssignments");return l(t.executeBody),c?pe(`\u53D8\u91CF\u300C${e}\u300D\u5B58\u5728\u4E0D\u53EF\u89E3\u6790\u7684\u8D4B\u503C\u6765\u6E90\uFF1A${c}`):s?{kind:"exact",keys:i}:pe(`\u53D8\u91CF\u300C${e}\u300D\u672A\u627E\u5230\u5B57\u9762\u91CF\u521D\u59CB\u5316`)}a(rh,"resolveVariableBy");function oh(t,e,n,r){let o=rh(t,e,n,r,ur);if(o.kind==="unknown")return o;let i=new Set(o.keys),s=null,c=a(l=>{if(M.isBinaryExpression(l)&&l.operatorToken.kind===M.SyntaxKind.EqualsToken){let d=l.left;if(M.isPropertyAccessExpression(d)&&M.isIdentifier(d.expression)&&d.expression.text===e)i.add(d.name.text);else if(M.isElementAccessExpression(d)&&M.isIdentifier(d.expression)&&d.expression.text===e){let u=d.argumentExpression;if(M.isStringLiteral(u))i.add(u.text);else if(M.isIdentifier(u)){let f=I_(t,u.text);if(f.kind==="unknown")s=f.reason;else for(let p of f.keys)i.add(p)}else s="\u52A8\u6001\u952E\u5199\u5165\uFF08\u7D22\u5F15\u8868\u8FBE\u5F0F\u4E0D\u53EF\u9759\u6001\u679A\u4E3E\uFF09"}}M.forEachChild(l,c)},"mutations");return c(t.executeBody),s?pe(`output \u53D8\u91CF\u300C${e}\u300D\u5B58\u5728\u52A8\u6001\u952E\u5199\u5165\uFF1A${s}`):{kind:"exact",keys:i}}a(oh,"resolveVariableOutputObjectKeys");function I_(t,e){let n=new Set,r=!1,o=!1,i=a(s=>{if(M.isForOfStatement(s)){let c=s.initializer;if(M.isVariableDeclarationList(c)&&c.declarations.length===1&&M.isIdentifier(c.declarations[0].name)&&c.declarations[0].name.text===e){r=!0;let d=wl(t,s.expression,0);if(d.kind==="unknown")o=!0;else for(let u of d.keys)n.add(u)}}M.forEachChild(s,i)},"find");return i(t.executeBody),o?pe("for-of \u8FED\u4EE3\u7684\u6570\u7EC4\u4E0D\u53EF\u9759\u6001\u679A\u4E3E"):r?{kind:"exact",keys:n}:pe(`\u6807\u8BC6\u7B26\u300C${e}\u300D\u975E\u5B57\u9762\u91CF\u6570\u7EC4\u7684 for-of \u8FED\u4EE3\u53D8\u91CF`)}a(I_,"resolveForOfLiteralKeys");function wl(t,e,n){if(n>2)return pe("\u6570\u7EC4\u5B57\u9762\u91CF\u5D4C\u5957\u8FC7\u6DF1");if(M.isIdentifier(e)){let o=R_(t.sourceFile,e.text);return o?wl(t,o,n+1):pe(`\u6570\u7EC4\u300C${e.text}\u300D\u5B9A\u4E49\u4E0D\u53EF\u5B9A\u4F4D`)}if(!M.isArrayLiteralExpression(e))return pe("\u8FED\u4EE3\u6E90\u4E0D\u662F\u5B57\u9762\u91CF\u6570\u7EC4");let r=new Set;for(let o of e.elements)if(M.isStringLiteral(o))r.add(o.text);else if(M.isSpreadElement(o)){let i=wl(t,o.expression,n+1);if(i.kind==="unknown")return i;for(let s of i.keys)r.add(s)}else return pe("\u6570\u7EC4\u542B\u975E\u5B57\u7B26\u4E32\u5B57\u9762\u91CF\u5143\u7D20");return{kind:"exact",keys:r}}a(wl,"resolveArrayLiteralStrings");function R_(t,e){let n=null,r=a(o=>{if(!n){if(M.isVariableDeclaration(o)&&M.isIdentifier(o.name)&&o.name.text===e&&o.initializer&&M.isArrayLiteralExpression(o.initializer)){n=o.initializer;return}M.forEachChild(o,r)}},"visit");return r(t),n}a(R_,"findConstArrayDeclaration");function C_(t,e,n,r){if(!M.isIdentifier(e.expression))return pe("\u8FD4\u56DE\u503C\u4E3A\u590D\u6742\u8868\u8FBE\u5F0F\u8C03\u7528");let o=e.expression.text,i=T_(t.sourceFile,o);if(!i)return pe(`\u8FD4\u56DE\u8C03\u7528\u4E86\u4E0D\u53EF\u5B9A\u4F4D\u7684\u51FD\u6570\u300C${o}\u300D`);if(r.has(i))return{kind:"exact",keys:new Set};r.add(i);let s=nh(i);if(s.length===0)return pe(`\u51FD\u6570\u300C${o}\u300D\u672A\u53D1\u73B0 return`);let c=new Set;for(let l of s){let d=dr(t,l,n+1,r);if(d.kind==="unknown")return pe(`\u51FD\u6570\u300C${o}\u300D\u7684\u8FD4\u56DE\u4E0D\u53EF\u89E3\u6790\uFF1A${d.reason}`);for(let u of d.keys)c.add(u)}return{kind:"exact",keys:c}}a(C_,"resolveCallOutputKeys");function T_(t,e){let n=null,r=a(o=>{if(!n){if(M.isFunctionDeclaration(o)&&o.name?.text===e&&o.body){n=o.body;return}if(M.isVariableDeclaration(o)&&M.isIdentifier(o.name)&&o.name.text===e&&o.initializer){let i=o.initializer;if((M.isArrowFunction(i)||M.isFunctionExpression(i))&&M.isBlock(i.body)){n=i.body;return}}M.forEachChild(o,r)}},"visit");return r(t),n}a(T_,"findFunctionBody");function ih(t){if(M.isIdentifier(t)||M.isStringLiteral(t))return t.text}a(ih,"propName");function __(t,e){if(!e)return[];let n=[],r=new Set,o=a(i=>{if(M.isPropertyAccessExpression(i)){let s=i.expression;if(M.isPropertyAccessExpression(s)&&M.isIdentifier(s.name)&&M.isIdentifier(i.name)&&th(t,s.expression)){let c=s.name.text,l=i.name.text,d=`${c}.${l}`;r.has(d)||(r.add(d),n.push({stepId:c,key:l}))}}M.forEachChild(i,o)},"visit");return o(t.executeBody),n}a(__,"inferVariableReads");var A_=["structure","recipe_bind","recipe_typecheck","config_contract","dataflow"];async function fH(t,e={}){let n=e.strict===!0,r=[];for(let o of t)r.push(await vl(o,e));return{ok:r.every(o=>o.ok),strict:n,workflows:r}}a(fH,"runWorkflowGates");async function vl(t,e={}){let n=e.strict===!0,r=e.only?new Set(e.only):null,o=e.includeTypecheck!==!1,i=kl.dirname(t.templatePath),s=a(x=>kl.relative(i,x)||kl.basename(x),"relWorkflowFile"),c=a(x=>{let I=ir(t.recipeDir,x);return I?s(I):`recipes/${x}.recipe.ts`},"relRecipeFile"),l=[],d=a(x=>!r||r.has(x),"enabled"),u=a(async(x,I)=>{if(!d(x))return null;let S=Date.now();try{let k=await I();return l.push({gate:x,status:k.some(R=>R.severity==="error")?"failed":"passed",durationMs:Date.now()-S,issues:k}),k}catch(k){return l.push({gate:x,status:"skipped",skipReason:`\u95E8\u7981\u81EA\u8EAB\u5F02\u5E38: ${k instanceof Error?k.message:String(k)}`,durationMs:Date.now()-S,issues:[]}),null}},"runGate"),f=a((x,I)=>{d(x)&&l.push({gate:x,status:"skipped",skipReason:I,durationMs:0,issues:[]})},"skipGate"),p=null;try{p=await sh(t.templatePath,"utf8")}catch(x){d("structure")&&l.push({gate:"structure",status:"failed",durationMs:0,issues:[{code:"WF-S01",severity:"error",message:`\u65E0\u6CD5\u8BFB\u53D6 workflow.yml: ${x instanceof Error?x.message:String(x)}`,location:{file:t.templatePath}}]})}let g=null,m=!1,y=new Set;if(p!==null){let x=Fm(p,s(t.templatePath));if(y=jm(x.raw),d("structure")&&l.push({gate:"structure",status:x.issues.some(S=>S.severity==="error")?"failed":"passed",durationMs:0,issues:x.issues}),!x.issues.some(S=>S.severity==="error"))try{g=await He(t.templatePath);let S=e.profile?.workflows?.[t.id];if(S)try{nn(t.id,S,g)}catch(k){l.push({gate:"config_contract",status:"failed",durationMs:0,issues:[{code:"WF-C04",severity:"error",message:`profile.workflows.${t.id} \u6CE8\u5165\u5931\u8D25: ${k instanceof Error?k.message:String(k)}`}]}),m=!0}}catch(S){g=null,d("dataflow")&&l.push({gate:"dataflow",status:"skipped",skipReason:`\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${S instanceof Error?S.message:String(S)}`,durationMs:0,issues:[]})}else for(let S of["recipe_bind","recipe_typecheck","config_contract","dataflow"])f(S,"structure \u95E8\u7981\u5B58\u5728\u9519\u8BEF\uFF0C\u5148\u4FEE\u590D\u7ED3\u6784\u95EE\u9898")}else for(let x of["recipe_bind","recipe_typecheck","config_contract","dataflow"])f(x,"workflow.yml \u4E0D\u53EF\u8BFB");if(g){let x=g,I=await u("recipe_bind",()=>Wm(t.recipeDir,x,c).then(S=>S.issues));o?await u("recipe_typecheck",()=>Zm(t.recipeDir,x,c)):f("recipe_typecheck","includeTypecheck=false"),m?f("dataflow","profile \u6CE8\u5165\u5931\u8D25\uFF0C\u6709\u6548\u914D\u7F6E\u4E0D\u53EF\u4FE1"):(l.some(S=>S.gate==="config_contract")||await u("config_contract",()=>Qm(t.recipeDir,x,{skipConfigSchema:e.skipConfigSchema===!0})),I?await u("dataflow",async()=>{let{contracts:S,knownRecipeIds:k}=await E_(t.recipeDir,x);return eh({workflow:x,contracts:S,knownRecipeIds:k,scaffold:io,declaredFieldNames:y})}):f("dataflow","recipe_bind \u672A\u6267\u884C"))}let w=A_.filter(x=>l.some(I=>I.gate===x)).map(x=>l.find(I=>I.gate===x)),b=n?w.map(x=>({...x,status:x.issues.some(I=>I.severity==="error"||I.severity==="warning")?"failed":x.status,issues:x.issues.map(I=>I.severity==="warning"?{...I,severity:"error"}:I)})):w;return{id:t.id,ok:b.every(x=>x.status!=="failed"),gates:b}}a(vl,"runWorkflowGate");async function E_(t,e){let n=new Map,r=new Set,o=new Set;for(let i of e.steps)i.recipe&&o.add(i.recipe);for(let i of e.eventSources)i.handler&&o.add(i.handler);for(let i of o){let s=ir(t,i);if(s&&(r.add(i),!n.has(i)))try{let c=await sh(s,"utf8");n.set(i,bl(c,s))}catch{n.set(i,{recipePath:s,inputs:{kind:"unknown",reason:"\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25"},outputs:{kind:"unknown",reason:"\u6587\u4EF6\u8BFB\u53D6\u5931\u8D25"},variableReads:[]})}}return{contracts:n,knownRecipeIds:r}}a(E_,"inferAllContracts");async function ls(t){let{workflow:e,rawYaml:n,recipeDir:r,relPath:o,profile:i,onDefinitionLoadFailure:s}=t,c=e.tracker,l=[D_(o,c?.label,c?.description),$_(o,c?.label,c?.description)],d=Array.isArray(n?.event_sources)?n.event_sources:[];for(let u=0;u<e.eventSources.length;u++){let f=e.eventSources[u],p=f.name||`event_source[${u}]`,g=v(d[u])?d[u]:{},m=i?.config?.event_sources?.[f.name??""],{handler_config:y,...w}=m??{},b={...v(g.config)?g.config:{},...w},x=!!i&&!!f.name,I=a(P=>x?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,...P]}:{file:o,yamlPath:["event_sources",u,"config",...P]},"evtConfigTarget"),S=a(P=>x?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,"handler_config",...P]}:{file:o,yamlPath:["event_sources",u,"handler_config",...P]},"evtHandlerTarget"),k=_n(f.type,b),R=new Set(k.map(P=>P.key)),T=Yr(f.type,b),_=new Map;for(let P of T.requiredFields)_.set(P.field,P.valueType);for(let P of T.optionalFields??[])_.set(P.field,P.valueType);for(let P of k){let O=I(P.path);l.push(lo({key:`event_source.${p}.config.${P.key}`,label:P.description,file:O.file,yamlPath:O.yamlPath,valueType:_.get(P.key)}))}for(let P of T.errors){if(R.has(P.key))continue;let O=I(P.yamlPath);l.push(lo({key:`event_source.${p}.config.${P.key}`,label:P.description,file:O.file,yamlPath:O.yamlPath}))}for(let P of T.requiredFields){let O=I([P.field]);l.push(lo({key:`event_source.${p}.config.${P.field}`,label:P.label,file:O.file,yamlPath:O.yamlPath,valueType:P.valueType}))}for(let P of T.optionalFields??[]){let O=I([P.field]);l.push(lo({key:`event_source.${p}.config.${P.field}`,label:P.label,file:O.file,yamlPath:O.yamlPath,valueType:P.valueType,required:!1,allowEmpty:!0}))}if(T.oneOf){let P=T.oneOf.fields[0];if(P){let O=I([P]);l.push(lo({key:`event_source.${p}.config.${P}`,label:T.oneOf.labels[P]??P,file:O.file,yamlPath:O.yamlPath}))}}if(!f.handler)continue;let C=await $n(r,f.handler);if(!C.definition){s?.(`EventHandler\u300C${f.handler}\u300D`,C.failure);continue}let E=C.definition;if(!E?.meta.config)continue;let F=zt(E.meta.config,P=>P.configType==="tableRef");for(let P of F){let O=P.path.join("."),q=P.hint.description??P.hint.label??`\u4E8B\u4EF6\u6E90 ${p} \u7684 ${O}`,z=gn(P.hint),K=z&&P.hint.defaultBase==="workflow.tracker.base_id",G=ah(P.hint),ee=S([...P.path,"baseId"]);l.push(Sl({key:`event_source.${p}.handler_config.${O}.baseId`,label:cs(q,"baseId"),file:ee.file,yamlPath:ee.yamlPath,required:!K,allowEmpty:K,defaultStrategy:"workflowTrackerBaseId",setup:G}));let te=S([...P.path,"tableId"]);l.push(Sl({key:`event_source.${p}.handler_config.${O}.tableId`,label:cs(q,"tableId"),file:te.file,yamlPath:te.yamlPath,required:!z,allowEmpty:z,setup:G}))}let W=It(E.meta.config);if(W)for(let[P,O]of Object.entries(W)){if(uo(O))continue;let q=ht(O),z=q?.description??q?.label??Pt(O);if(!z)continue;let K=fr(O),G=S([P]);l.push(Sl({key:`event_source.${p}.handler_config.${P}`,label:z,file:G.file,yamlPath:G.yamlPath,required:!K,allowEmpty:K,valueType:q?.valueType??(Mn(O)?"string[]":"string")}))}}for(let u=0;u<e.steps.length;u++){let f=e.steps[u];if(!f.recipe)continue;let p=await $t(r,f.recipe);if(!p.definition){s?.(`recipe\u300C${f.recipe}\u300D`,p.failure);continue}let g=p.definition;if(!g?.meta.config)continue;let m=a(b=>i?{file:i.file,yamlPath:["workflows",i.workflowId,"steps",f.id,...b]}:{file:o,yamlPath:["steps",u,"config",...b]},"stepTarget"),y=zt(g.meta.config,b=>b.configType==="tableRef");for(let b of y){let x=b.path.join("."),I=b.hint.description??b.hint.label??`\u6B65\u9AA4 ${f.id} \u7684 ${x}`,S=gn(b.hint),k=S&&b.hint.defaultBase==="workflow.tracker.base_id",R=ah(b.hint),T=m([...b.path,"baseId"]);l.push(xl({key:`step.${f.id}.config.${x}.baseId`,label:cs(I,"baseId"),file:T.file,yamlPath:T.yamlPath,required:!k,allowEmpty:k,defaultStrategy:"workflowTrackerBaseId",setup:R}));let _=m([...b.path,"tableId"]);l.push(xl({key:`step.${f.id}.config.${x}.tableId`,label:cs(I,"tableId"),file:_.file,yamlPath:_.yamlPath,required:!S,allowEmpty:S,setup:R}))}let w=It(g.meta.config);if(w)for(let[b,x]of Object.entries(w)){if(uo(x))continue;let I=ht(x),S=I?.description??I?.label??Pt(x);if(!S)continue;let k=fr(x),R=m([b]);l.push(xl({key:`step.${f.id}.config.${b}`,label:S,file:R.file,yamlPath:R.yamlPath,required:!k,allowEmpty:k,valueType:I?.valueType??(Mn(x)?"string[]":"string")}))}}return P_(l)}a(ls,"buildWorkflowConfigSurface");function fo(t,e){return{key:e.key??t.key,status:e.status,message:e.message,value:e.value,sensitive:e.sensitive,surface:t,writeTarget:e.writeTarget??t.writeTarget}}a(fo,"toCheckItem");function D_(t,e,n){return{key:"tracker.base_id",label:e?`${e} Base ID`:"\u5DE5\u4F5C\u6D41\u6570\u636E\u5E95\u5EA7 Base ID",description:n??"\u672C\u5DE5\u4F5C\u6D41\u6240\u6709\u8868\u683C\u6240\u5728\u7684 AI \u8868\u683C Base ID\uFF1B\u7559\u7A7A\u65F6 setup \u4F1A\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA",owner:"framework",source:"tracker",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"projectTrackerBaseId",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","base_id"]}}}a(D_,"trackerBaseSurface");function $_(t,e,n){return{key:"tracker.table_id",label:e?`${e} Table ID`:"\u5DE5\u5355\u8BB0\u5F55\u8868 Table ID",description:n??"\u8BB0\u5F55\u5DE5\u5355\u6D41\u8F6C\u72B6\u6001\u7684\u8868\u683C ID\uFF1B\u5982\u672A\u521B\u5EFA\u53EF\u76F4\u63A5\u7559\u7A7A\uFF0Csetup \u9636\u6BB5\u4F1A\u81EA\u52A8\u5EFA\u8868\u5E76\u56DE\u586B",owner:"framework",source:"tracker",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"current",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","table_id"]},setup:{action:"createTable",when:"empty"}}}a($_,"trackerTableSurface");function lo(t){return{key:t.key,label:t.label,description:t.label,owner:"eventSource",source:"eventSource.config",required:t.required??!0,editable:!0,allowEmpty:t.allowEmpty??!1,defaultStrategy:"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType}}}a(lo,"eventSourceConfigSurface");function Sl(t){return{key:t.key,label:t.label,description:t.label,owner:"handler",source:"eventSource.handler_config",required:t.required??!1,editable:!0,allowEmpty:t.allowEmpty??!0,defaultStrategy:t.defaultStrategy??"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType},setup:t.setup}}a(Sl,"handlerConfigSurface");function xl(t){return{key:t.key,label:t.label,description:t.label,owner:"handler",source:"step.config",required:t.required??!1,editable:!0,allowEmpty:t.allowEmpty??!0,defaultStrategy:t.defaultStrategy??"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType},setup:t.setup}}a(xl,"stepConfigSurface");function ah(t){if(!gn(t))return;let n={action:"createTable",when:!!(t.setupSchema?.fields?.length||t.setupSchema?.views?.length)?"alwaysValidate":"empty",tableSchema:t.setupSchema};return t.label&&(n.tableName=t.label),n}a(ah,"setupPolicyForTableRefHint");function cs(t,e){return e==="baseId"?`${t} \u6240\u5728\u7684 AI \u8868\u683C Base ID\uFF0C\u4E00\u822C\u4E0E\u672C\u5DE5\u4F5C\u6D41\u6570\u636E\u5E95\u5EA7\u5171\u7528\u540C\u4E00\u4E2A Base`:`${t} \u7684\u8868\u683C ID\uFF1B\u5982\u672A\u521B\u5EFA\u53EF\u7559\u7A7A\uFF0Csetup \u9636\u6BB5\u4F1A\u81EA\u52A8\u5EFA\u8868\u5E76\u56DE\u586B`}a(cs,"tableRefFieldDescription");function P_(t){let e=new Set,n=[];for(let r of t)e.has(r.key)||(e.add(r.key),n.push(r));return n}a(P_,"dedupeSurface");function It(t){if(!t)return null;let e=t,n=e?._def?.typeName??e?._def?.type;if((n==="ZodObject"||n==="object")&&(e.shape||e._def?.shape)){let r=e.shape??e._def?.shape;return typeof r=="function"?r():r}return typeof e.unwrap=="function"?It(e.unwrap()):e?._def?.schema?It(e._def.schema):e?._def?.innerType?It(e._def.innerType):null}a(It,"getZodObjectShape");function Mn(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return Mn(e.unwrap());if(e?._def?.innerType)return Mn(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(Mn):!1}a(Mn,"isArraySchema");function Pt(t){let e=t,n=e?.description??e?._def?.description;if(typeof n=="string"&&n.trim())return n.trim();if(typeof e.unwrap=="function")return Pt(e.unwrap());if(e?._def?.innerType)return Pt(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=Pt(o);if(i)return i}return null}a(Pt,"getFieldDescription");function uo(t){let e=It(t);return e?"baseId"in e&&"tableId"in e:!1}a(uo,"isTableRefSchema");function fr(t){let e=t,n=e?._def?.typeName??e?._def?.type;return n==="ZodOptional"||n==="optional"||n==="ZodDefault"||n==="default"||n==="ZodNullable"||n==="nullable"}a(fr,"isOptionalSchema");var F_="profile/profile.yml",N_=/\.(ya?ml|json)$/i;function L_(t,e,n){let r=t.trim();if(!r||!N_.test(r)||po.isAbsolute(r))return;let o=/\.json$/i.test(r)?"json":"yaml",i;for(let s of n){let c=po.resolve(s,r),l=po.relative(e,c);if(!l.startsWith("..")){if(O_(c))return{path:l,format:o,exists:!0,summary:W_(c,o)};i??={path:l,format:o,exists:!1}}}return i}a(L_,"resolveFileRef");function W_(t,e){try{let n=j_(t,"utf8"),r=e==="json"?JSON.parse(n):uh.parse(n);return Array.isArray(r)?[{key:"(\u6570\u7EC4)",count:r.length,kind:"array"}]:v(r)?Object.entries(r).map(([o,i])=>Array.isArray(i)?{key:o,count:i.length,kind:"array"}:v(i)?{key:o,count:Object.keys(i).length,kind:"object"}:{key:o,kind:typeof i}):void 0}catch{return}}a(W_,"summarizeStructuredFile");function fs(t,e){return{...t??{},...e??{}}}a(fs,"overlayConfig");function fh(t,e){let n=e?t?.wf.event_sources?.[e]:void 0;if(!n)return{config:{},handlerConfig:{}};let{handler_config:r,...o}=n;return{config:o,handlerConfig:v(r)?r:{}}}a(fh,"profileEventSourceParts");function Se(t,e){return t?{...e,surface:t,writeTarget:e.writeTarget??t.writeTarget}:e}a(Se,"withSurfaceFields");function B_(t,e,n){if(!n?.wf.steps)return;let r=new Set(e.steps.map(o=>o.id));for(let[o,i]of Object.entries(n.wf.steps))!r.has(o)||!v(i)||!("config"in i)||t.push({key:`step.${o}.config.config`,status:"error",message:`profile.workflows.${n.workflowId}.steps.${o}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile step \u4E0B\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 step.config\uFF0C\u8BF7\u6539\u4E3A workflows.${n.workflowId}.steps.${o}.<\u5B57\u6BB5\u540D>`})}a(B_,"pushNestedProfileStepConfigItems");function z_(t,e,n){if(!n?.wf.event_sources)return;let r=new Set(e.eventSources.map(o=>o.name).filter(Boolean));for(let[o,i]of Object.entries(n.wf.event_sources))!r.has(o)||!v(i)||!("config"in i)||t.push({key:`event_source.${o}.config.config`,status:"error",message:`profile.workflows.${n.workflowId}.event_sources.${o}.config \u662F\u591A\u4F59\u5305\u88C5\u5C42\uFF1Bprofile event source \u4E0B\u9664 handler_config \u5916\u7684\u952E\u4F1A\u76F4\u63A5\u5408\u5165 event_sources[].config\uFF0C\u8BF7\u6539\u4E3A workflows.${n.workflowId}.event_sources.${o}.<\u5B57\u6BB5\u540D>`})}a(z_,"pushNestedProfileEventSourceConfigItems");async function Tl(t,e,n){let r=[];for(let s of t){let c=n?.workflows?.[s.id],l=c?{file:F_,workflowId:s.id,wf:c}:void 0,d=await U_(s,e,l);r.push(d)}let o=r.flatMap(s=>s.items);return{id:"workflow",name:"\u5DE5\u4F5C\u6D41\u7EA7\u914D\u7F6E",ok:!r.some(s=>!s.ok),items:o,workflows:r}}a(Tl,"checkWorkflows");async function U_(t,e,n){let r=[],o=t.templatePath.startsWith(e)?t.templatePath.slice(e.length+1):t.templatePath,i;try{i=await He(t.templatePath)}catch(x){return r.push({key:"workflow.yml",status:"error",message:`\u5DE5\u4F5C\u6D41\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${x instanceof Error?x.message:String(x)}`}),{id:t.id,name:t.id,ok:!1,items:r,surface:[]}}let s=i.meta?.name??t.id;if(n){if(B_(r,i,n),z_(r,i,n),n.wf.steps)for(let x of Object.values(n.wf.steps))v(x)&&"config"in x&&delete x.config;if(n.wf.event_sources)for(let x of Object.values(n.wf.event_sources))v(x)&&"config"in x&&delete x.config;try{nn(t.id,n.wf,i)}catch(x){r.push({key:"profile",status:"error",message:`profile \u914D\u7F6E\u6CE8\u5165\u5931\u8D25: ${x instanceof Error?x.message:String(x)}`})}}let c,l;try{let x=uh.parse(await M_(t.templatePath,"utf8"));v(x)&&(l=x,v(x.tracker)&&(c=x.tracker))}catch{}let d=await ls({workflow:i,rawYaml:l,recipeDir:t.recipeDir,relPath:o,profile:n?{file:n.file,workflowId:n.workflowId,config:n.wf}:void 0}),u=new Map(d.map(x=>[x.key,x])),f=u.get("tracker.base_id"),p=c?.base_id??i.tracker?.base_id;!p||typeof p=="string"&&p.trim()===""?r.push(fo(f,{status:"warn",message:"tracker.base_id \u672A\u914D\u7F6E\uFF0Csetup \u9636\u6BB5\u5C06\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C"})):r.push(fo(f,{status:"ok",value:p,message:`tracker.base_id = ${p}`}));let g=u.get("tracker.table_id"),m=c?.table_id??i.tracker?.table_id;if(!m||typeof m=="string"&&m.trim()===""?r.push(fo(g,{status:"warn",message:"tracker.table_id \u672A\u914D\u7F6E\uFF08\u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09"})):r.push(fo(g,{status:"ok",value:m,message:`tracker.table_id = ${m}`})),i.toolkitConfig&&Object.keys(i.toolkitConfig).length>0){let x=Object.keys(i.toolkitConfig);r.push({key:"toolkit_config",status:"ok",message:`toolkit_config \u5DF2\u914D\u7F6E (${x.join(", ")})`})}if(i.steps.length===0)r.push({key:"steps",status:"error",message:"\u5DE5\u4F5C\u6D41\u65E0\u6B65\u9AA4\u5B9A\u4E49"});else{let x=i.orderedStepIds.join(" \u2192 ");r.push({key:"steps",status:"ok",message:`\u6B65\u9AA4\u94FE: ${i.steps.length} \u6B65 (${x})`})}try{let x=await sr(t.recipeDir,i),I=new Map(i.steps.map((k,R)=>[k.id,R])),S=new Map(i.eventSources.map((k,R)=>[`event:${k.name||k.handler}`,R]));for(let k of x.issues){let R=k.level==="error",T=S.get(k.stepId),_=T!==void 0?i.eventSources[T]:void 0;if(R){let E=K_(k.message),F=I.get(k.stepId);if(E&&F!==void 0){let W=i.steps[F],P=`step.${W.id}.config.${E}`,O=u.get(P);if(O){r.push(Se(O,{key:P,status:"error",message:`[${k.recipeId}] ${k.message}`}));continue}let q=W.recipe?await es(t.recipeDir,W.recipe):void 0,z=E.split("."),K=q?.meta.config?zt(q.meta.config,G=>G.configType==="tableRef").find(G=>lh(G.path,z)||us(G.path,z)):void 0;if(K){let G=us(K.path,z)??["baseId","tableId"];for(let ee of G){let te=`step.${W.id}.config.${K.path.join(".")}.${ee}`,Ve=u.get(te);r.push(Se(Ve,{key:te,status:"error",message:Rl(k.recipeId,K.path.join("."),ee)}))}continue}r.push({key:`step.${k.stepId}.config`,status:"error",message:`[${k.recipeId}] ${k.message}`,writeTarget:n?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"steps",k.stepId,...E.split(".")]}:{type:"yaml",file:o,yamlPath:["steps",F,"config",...E.split(".")]}});continue}else if(E&&T!==void 0&&_){let W=E.split("."),P=await dl(t.recipeDir,_.handler),O=P?zt(P.meta.config,z=>z.configType==="tableRef").find(z=>lh(z.path,W)||us(z.path,W)):void 0;if(O){let z=_.name||_.handler,K=us(O.path,W)??["baseId","tableId"];for(let G of K){let ee=`event_source.${z}.handler_config.${O.path.join(".")}.${G}`,te=u.get(ee);r.push(Se(te,{key:ee,status:"error",message:Cl(k.recipeId,O.path.join("."),G)}))}continue}let q={key:`event_source.${_.name||_.handler}.handler_config.${E}`,status:"error",message:`[${k.recipeId}] ${k.message}`};q.writeTarget=n&&_.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",_.name,"handler_config",...W]}:{type:"yaml",file:o,yamlPath:["event_sources",T,"handler_config",...W]},r.push(q);continue}}let C={key:`step.${k.stepId}.config`,status:R?"error":"warn",message:`[${k.recipeId}] ${k.message}`};r.push(C)}if(x.issues.filter(k=>k.level==="error").length===0){let k=x.rows.filter(R=>R.loaded).length;k>0&&r.push({key:"recipe_schema",status:"ok",message:`step.config \u6821\u9A8C\u901A\u8FC7 (${k} \u4E2A recipe)`})}}catch{r.push({key:"recipe_schema",status:"warn",message:"recipe schema \u6821\u9A8C\u8DF3\u8FC7\uFF08\u52A0\u8F7D\u5F02\u5E38\uFF09"})}try{let x=n?{schema_version:2,workflows:{[t.id]:n.wf}}:null,I=await vl(t,{only:["config_contract","dataflow"],skipConfigSchema:!0,includeTypecheck:!1,profile:x});for(let S of I.gates)if(S.status!=="skipped")for(let k of S.issues)r.push({key:`gate.${k.code}`,status:k.severity==="error"?"error":k.severity==="warning"?"warn":"suggestion",message:`[${k.code}] ${k.message}`})}catch{}let y=typeof p=="string"?p:void 0;await V_({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await q_({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await H_({items:r,entry:t,configDir:e,workflow:i,rawYaml:l,relPath:o,profileCtx:n});let w=Array.isArray(l?.event_sources)?l.event_sources:[];for(let x=0;x<i.eventSources.length;x++){let I=i.eventSources[x],S=I.name||`event_source[${x}]`,k=v(w[x])?w[x]:{},R=fh(n,I.name),T=fs(v(k.config)?k.config:void 0,R.config);if(Object.keys(T).length===0){r.push({key:`event_source.${S}.config`,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7684 config \u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u9A71\u52A8\u4E8B\u4EF6\u6E90`,writeTarget:n&&I.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",I.name]}:{type:"yaml",file:o,yamlPath:["event_sources",x,"config"]}});continue}let _=Yr(I.type,T),C=[..._.requiredFields,..._.optionalFields??[]],E=a((O,q)=>n&&I.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",I.name,O],valueType:q}:{type:"yaml",file:o,yamlPath:["event_sources",x,"config",O],valueType:q},"writeTargetFor"),F=_n(I.type,T),W=new Set(F.filter(O=>{let q=O.key.split(".",1)[0],z=C.find(G=>G.field===q)?.valueType;if(!z)return!1;let K=T[q];return ds(K)||!Il(K,z)}).map(O=>O.key)),P=new Set(F.filter(O=>!W.has(O.key)).map(O=>O.key));for(let O of F){if(W.has(O.key))continue;let q=`event_source.${S}.config.${O.key}`,z=u.get(q);r.push(Se(z,{key:q,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${O.key} \u65E0\u6548\uFF1A${O.message}`}))}for(let O of _.errors){if(P.has(O.key))continue;let q=`event_source.${S}.config.${O.key}`,z=u.get(q);r.push(Se(z,{key:q,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D${O.message}`}))}if(_.requiredFields.length>0||(_.optionalFields?.length??0)>0||_.errors.length>0||_.summary||_.oneOf){let O=!0;for(let q of _.requiredFields){let{field:z,valueType:K}=q,G=T[z],ee=`event_source.${S}.config.${z}`,te=u.get(ee);ds(G)?(O=!1,r.push(Se(te,{key:ee,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 config.${z}`}))):P.has(z)?O=!1:K&&!Il(G,K)?(O=!1,r.push(Se(te,{key:ee,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${z} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${ch(K)}\uFF09`,writeTarget:te?.writeTarget?{...te.writeTarget,valueType:te.writeTarget.valueType??K}:E(z,K)}))):r.push(Se(te,{key:ee,status:"ok",value:G,message:`config.${z} = ${dh(G)}`}))}for(let q of _.optionalFields??[]){let{field:z,valueType:K}=q,G=T[z],ee=`event_source.${S}.config.${z}`,te=u.get(ee);ds(G)?(O=!1,r.push(Se(te,{key:ee,status:"suggestion",value:G,message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300Dconfig.${z} \u4E3A\u7A7A\u5217\u8868\uFF1A\u76D1\u542C\u505C\u7528\uFF08\u586B\u4F1A\u8BDD ID \u5373\u542F\u7528\uFF09`}))):P.has(z)?O=!1:K&&!Il(G,K)?(O=!1,r.push(Se(te,{key:ee,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${z} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${ch(K)}\uFF09`,writeTarget:te?.writeTarget?{...te.writeTarget,valueType:te.writeTarget.valueType??K}:E(z,K)}))):r.push(Se(te,{key:ee,status:"ok",value:G,message:`config.${z} = ${dh(G)}`}))}if(_.oneOf&&!_.oneOf.fields.some(z=>!ds(T[z]))){O=!1;let z=_.oneOf.fields[0],K=`event_source.${S}.config.${z}`,G=u.get(K);r.push(Se(G,{key:K,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7F3A\u5C11\u8C03\u5EA6\u914D\u7F6E\uFF08\u9700\u914D\u7F6E ${_.oneOf.fields.map(ee=>`config.${ee}`).join(" / ")} \u4E4B\u4E00\uFF09`}))}O&&_.errors.length===0&&r.push({key:`event_source.${S}`,status:"ok",message:_.summary?`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${I.type}) \u914D\u7F6E\u5B8C\u6574\uFF08${_.summary}\uFF09`:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${I.type}) \u914D\u7F6E\u5B8C\u6574`})}else r.push({key:`event_source.${S}`,status:"ok",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${I.type}) \u5DF2\u914D\u7F6E`})}i.eventSources.length===0&&w.length;let b=r.some(x=>x.status==="error");return{id:t.id,name:s,ok:!b,items:r,surface:d}}a(U_,"checkSingleWorkflow");function K_(t){let e=t.match(/^config\.([A-Za-z_][A-Za-z0-9_.]*)/);return e?e[1]:null}a(K_,"extractConfigKey");function ds(t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.every(e=>e==null||typeof e=="string"&&e.trim()===""):!1}a(ds,"isMissingConfigValue");function Il(t,e){return e==="string[]"?Array.isArray(t):e==="string"?typeof t=="string":!0}a(Il,"matchesConfigType");function ch(t){return t==="string[]"?"\u6570\u7EC4":"\u5B57\u7B26\u4E32"}a(ch,"typeLabel");function lh(t,e){return t.length===e.length&&t.every((n,r)=>n===e[r])}a(lh,"samePath");function us(t,e){if(e.length!==t.length+1||!t.every((r,o)=>r===e[o]))return null;let n=e[t.length];return n==="baseId"?["baseId"]:n==="tableId"?["tableId"]:null}a(us,"tableRefFieldFromPath");function ph(t,e){if(t?.defaultStrategy==="workflowTrackerBaseId"&&e)return e}a(ph,"defaultValueForTableRefWarn");async function V_(t){let{items:e,entry:n,workflow:r,rawYaml:o,surfaceByKey:i,workflowBaseId:s,profileCtx:c}=t,l=Array.isArray(o?.event_sources)?o.event_sources:[];for(let d=0;d<r.eventSources.length;d++){let u=r.eventSources[d];if(!u.handler)continue;let f=await dl(n.recipeDir,u.handler);if(!f?.meta.config)continue;let p=u.name||u.handler,g=v(l[d])?l[d]:{},m=fs(v(g.handler_config)?g.handler_config:void 0,fh(c,u.name).handlerConfig),y=zt(f.meta.config,b=>b.configType==="tableRef");for(let b of y){let x=Kn(m,b.path);if(!v(x))continue;let I=x.baseId,S=x.tableId,k=b.path.join("."),R=gn(b.hint);if(typeof I=="string"&&!I.trim()){let T=`event_source.${p}.handler_config.${k}.baseId`,_=i.get(T),C=R&&b.hint.defaultBase==="workflow.tracker.base_id",E=C?"warn":"error";e.push(Se(_,{key:T,status:E,message:C?`[${u.handler}] handler_config.${k}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:Cl(u.handler,k,"baseId"),value:E==="warn"?ph(_,s):void 0}))}if(typeof S=="string"&&!S.trim()){let T=`event_source.${p}.handler_config.${k}.tableId`,_=i.get(T),C=R?"warn":"error";e.push(Se(_,{key:T,status:C,message:R?`[${u.handler}] handler_config.${k}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:Cl(u.handler,k,"tableId")}))}}let w=It(f.meta.config);if(w){for(let[b,x]of Object.entries(w)){let S=ht(x)?.expose===!0;if(Mn(x)){let k=m[b];if(Array.isArray(k)&&k.length===0){let R=fr(x);if(R&&!S)continue;let T=`event_source.${p}.handler_config.${b}`,_=i.get(T);if(!_)continue;e.push(Se(_,{key:T,status:R?"suggestion":"error",message:`[${u.handler}] handler_config.${b} \u4E3A\u7A7A\u6570\u7EC4`}))}}}for(let[b,x]of Object.entries(w)){if(m[b]!==void 0)continue;let I=ht(x);if(I?.expose!==!0)continue;let S=I.description??I.label??Pt(x);if(!S||uo(x))continue;let k=`event_source.${p}.handler_config.${b}`,R=i.get(k);R&&e.push(Se(R,{key:k,status:"suggestion",message:`[${u.handler}] handler_config.${b} \u672A\u914D\u7F6E\uFF08${S}\uFF09`}))}}}}a(V_,"checkHandlerConfigEmptiness");async function q_(t){let{items:e,entry:n,workflow:r,rawYaml:o,surfaceByKey:i,workflowBaseId:s,profileCtx:c}=t,l=Array.isArray(o?.steps)?o.steps:[];for(let d=0;d<r.steps.length;d++){let u=r.steps[d];if(!u.recipe)continue;let f=await es(n.recipeDir,u.recipe);if(!f?.meta.config)continue;let p=v(l[d])?l[d]:{},g=fs(v(p.config)?p.config:void 0,c?.wf.steps?.[u.id]),m=zt(f.meta.config,w=>w.configType==="tableRef");for(let w of m){let b=Kn(g,w.path);if(!v(b))continue;let x=b.baseId,I=b.tableId,S=w.path.join("."),k=gn(w.hint);if(typeof x=="string"&&!x.trim()){let R=`step.${u.id}.config.${S}.baseId`,T=i.get(R),_=k&&w.hint.defaultBase==="workflow.tracker.base_id",C=_?"warn":"error";e.push(Se(T,{key:R,status:C,message:_?`[${u.recipe}] step.config.${S}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:Rl(u.recipe,S,"baseId"),value:C==="warn"?ph(T,s):void 0}))}if(typeof I=="string"&&!I.trim()){let R=`step.${u.id}.config.${S}.tableId`,T=i.get(R),_=k?"warn":"error";e.push(Se(T,{key:R,status:_,message:k?`[${u.recipe}] step.config.${S}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:Rl(u.recipe,S,"tableId")}))}}let y=It(f.meta.config);if(y)for(let[w,b]of Object.entries(y)){if(uo(b))continue;let x=g[w];if(x!==void 0){if(Array.isArray(x)&&x.length===0&&fr(b)){let T=`step.${u.id}.config.${w}`,_=i.get(T);_&&e.push(Se(_,{key:T,status:"suggestion",message:`[${u.recipe}] step.config.${w} \u4E3A\u7A7A\u6570\u7EC4`}))}continue}let I=ht(b),S=I?.description??I?.label??Pt(b);if(!S||!fr(b))continue;let k=`step.${u.id}.config.${w}`,R=i.get(k);R&&e.push(Se(R,{key:k,status:"suggestion",message:`[${u.recipe}] step.config.${w} \u672A\u914D\u7F6E\uFF08${S}\uFF09`}))}}}a(q_,"checkStepConfigEmptiness");async function H_(t){let{items:e,entry:n,configDir:r,workflow:o,rawYaml:i,relPath:s,profileCtx:c}=t,l=Array.isArray(i?.steps)?i.steps:[],d=new Set(e.map(f=>f.key)),u=c?[po.resolve(r,po.dirname(c.file)),r]:[r];for(let f=0;f<o.steps.length;f++){let p=o.steps[f],g=v(l[f])?l[f]:{},m=fs(v(g.config)?g.config:void 0,c?.wf.steps?.[p.id]);if(Object.keys(m).length===0)continue;let w=(p.recipe?await es(n.recipeDir,p.recipe).catch(()=>null):null)?.meta.config,b=a((I,S)=>{let k=`step.${p.id}.config.${I.join(".")}`;if(d.has(k))return;d.add(k);let R=typeof S=="boolean"?"boolean":typeof S=="number"?"number":"string",T=c?{type:"yaml",file:c.file,yamlPath:["workflows",c.workflowId,"steps",p.id,...I],valueType:R}:{type:"yaml",file:s,yamlPath:["steps",f,"config",...I],valueType:R},_=w?G_(w,I):null,C=typeof S=="string"?L_(S,r,u):void 0,E=C?.exists===!0;e.push({key:k,status:"ok",value:S,message:`${I.join(".")} = ${String(S)}`,writeTarget:T,surface:{key:k,label:I.join("."),description:_??void 0,owner:"handler",source:"step.config",required:!1,editable:!E,allowEmpty:!0,defaultStrategy:"none",valueType:R,writeTarget:T,...C?{fileRef:C}:{}}})},"emit"),x=a((I,S)=>{for(let[k,R]of Object.entries(I)){if(S.length===0&&c?.wf.steps?.[p.id]&&k==="config")continue;let T=[...S,k];if(typeof R=="string"){if(/^\$\{[^}]+\}$/.test(R.trim()))continue;b(T,R)}else if(typeof R=="number"||typeof R=="boolean")b(T,R);else if(v(R)){if(Object.keys(R).length===1&&typeof R.ref=="string"||"baseId"in R||"tableId"in R)continue;x(R,T)}}},"walk");x(m,[])}}a(H_,"emitStepScalarConfigItems");function Rl(t,e,n){return n==="baseId"?`[${t}] step.config.${e}.baseId \u672A\u914D\u7F6E`:`[${t}] step.config.${e}.tableId \u672A\u914D\u7F6E\uFF08\u76EE\u6807\u8868 ID \u4E0D\u4F1A\u590D\u7528\u5176\u4ED6\u8868\uFF1B\u53EA\u6709 tracker.table_id \u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09`}a(Rl,"stepConfigTableRefMissingMessage");function Cl(t,e,n){return n==="baseId"?`[${t}] handler_config.${e}.baseId \u672A\u914D\u7F6E`:`[${t}] handler_config.${e}.tableId \u672A\u914D\u7F6E\uFF08\u76EE\u6807\u8868 ID \u4E0D\u4F1A\u590D\u7528\u5176\u4ED6\u8868\uFF1B\u53EA\u6709 tracker.table_id \u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09`}a(Cl,"tableRefMissingMessage");function G_(t,e){let n=t;for(let r=0;r<e.length;r++){let o=It(n);if(!o||(n=o[e[r]],!n))return null}return Pt(n)}a(G_,"describeSchemaPath");function dh(t){return Array.isArray(t)?`${t.length} \u9879`:typeof t=="string"?t:t==null?"\u672A\u8BBE\u7F6E":JSON.stringify(t)}a(dh,"formatConfigValue");import{readdir as tA,stat as nA,readFile as rA}from"fs/promises";import On from"path";import{readdir as J_,readFile as Z_,stat as Y_}from"fs/promises";import{readFileSync as Q_,existsSync as X_}from"fs";import ps from"path";import eA from"yaml";var gs=".role.yml",Mt=class{constructor(e){this.rolesDir=e}rolesDir;static{a(this,"RoleRegistry")}roles=new Map;errors=[];loaded=!1;async loadAll(){this.roles.clear(),this.errors=[],this.loaded=!0;let e=ps.resolve(this.rolesDir),n=!1;try{n=(await Y_(e)).isDirectory()}catch{n=!1}if(!n){h.info("role","\u89D2\u8272\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u6CE8\u518C\u4E2D\u5FC3\u4E3A\u7A7A",{dir:e});return}let o=(await J_(e)).filter(i=>i.endsWith(gs)).sort();for(let i of o){let s=ps.join(e,i),c=await this.validateFile(s);if(!c.ok){this.errors.push({file:s,errors:c.errors}),h.warn("role","\u89D2\u8272\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{file:s,errors:c.errors});continue}let l=c.definition,d=gh(l,ps.dirname(s));if(!d.ok){this.errors.push({file:s,errors:[d.error]}),h.warn("role","persona \u6587\u4EF6\u8BFB\u53D6\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{file:s,error:d.error});continue}if(this.roles.has(l.id)){let u=`\u89D2\u8272 id \u91CD\u590D\uFF1A${l.id}\uFF08\u4FDD\u7559\u5148\u52A0\u8F7D\u8005\uFF0C\u8DF3\u8FC7 ${i}\uFF09`;this.errors.push({file:s,errors:[u]}),h.warn("role",u,{file:s});continue}this.roles.set(l.id,l)}}get(e){return this.roles.get(e)??null}list(){return[...this.roles.values()]}has(e){return this.roles.has(e)}get size(){return this.roles.size}get loadErrors(){return[...this.errors]}get isLoaded(){return this.loaded}async validateFile(e){let n;try{n=await Z_(e,"utf8")}catch(o){return{ok:!1,errors:[`\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6: ${_l(o)}`]}}let r;try{r=eA.parse(n)}catch(o){return{ok:!1,errors:[`YAML \u89E3\u6790\u5931\u8D25: ${_l(o)}`]}}return Jc(r)}loadFromProfile(e,n){this.roles.clear(),this.errors=[],this.loaded=!0;for(let[r,o]of Object.entries(e)){if(!o||typeof o!="object"){this.errors.push({file:`profile:roles.${r}`,errors:["\u89D2\u8272\u5B9A\u4E49\u5FC5\u987B\u662F\u5BF9\u8C61"]}),h.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5DF2\u8DF3\u8FC7",{key:r});continue}let i={...o,id:r},s=Jc(i);if(!s.ok){this.errors.push({file:`profile:roles.${r}`,errors:s.errors}),h.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{key:r,errors:s.errors});continue}let c=s.definition,l=gh(c,n);if(!l.ok){this.errors.push({file:`profile:roles.${r}`,errors:[l.error]}),h.warn("role","persona \u6587\u4EF6\u8BFB\u53D6\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7",{key:r,error:l.error});continue}if(this.roles.has(c.id)){let d=`\u89D2\u8272 id \u91CD\u590D\uFF1A${c.id}\uFF08\u4FDD\u7559\u5148\u52A0\u8F7D\u8005\uFF0C\u8DF3\u8FC7 profile:roles.${r}\uFF09`;this.errors.push({file:`profile:roles.${r}`,errors:[d]}),h.warn("role",d,{key:r});continue}this.roles.set(c.id,c)}}};function gh(t,e){let n=t.persona;if(typeof n=="string")return{ok:!0};if(n&&typeof n=="object"&&"file"in n){let r=ps.resolve(e,n.file);if(!X_(r))return{ok:!1,error:`persona file \u4E0D\u5B58\u5728: ${n.file}\uFF08\u76F8\u5BF9 ${e}\uFF09`};try{let o=Q_(r,"utf8").trim();return o?(t.persona=o,{ok:!0}):{ok:!1,error:`persona file \u5185\u5BB9\u4E3A\u7A7A: ${n.file}`}}catch(o){return{ok:!1,error:`persona file \u8BFB\u53D6\u5931\u8D25: ${_l(o)}`}}}return{ok:!0}}a(gh,"resolvePersonaFile");function _l(t){return t instanceof Error?t.message:String(t)}a(_l,"errMsg");function ms(t){let e=t.multiline?"text":"string",n=t.writeTarget?{key:t.key,label:t.label,description:t.description,owner:"project",source:"project",required:!1,editable:!0,allowEmpty:!1,defaultStrategy:"none",valueType:e,writeTarget:{...t.writeTarget,valueType:e}}:void 0;return{key:t.key,status:"ok",value:t.value,message:`${t.label}\u5DF2\u914D\u7F6E`,writeTarget:n?.writeTarget??t.writeTarget,surface:n}}a(ms,"roleFieldItem");function mh(t,e,n){if(!v(t)||typeof t.file!="string")return null;let r=On.resolve(e,t.file),o=On.relative(n,r);return o.startsWith("..")?null:o}a(mh,"personaFileRelPath");async function hh(t,e,n,r){let o=[];if(!e)return o.push({key:"roles.enabled",status:"ok",value:!1,message:"\u89D2\u8272\u7CFB\u7EDF\u5DF2\u7981\u7528"}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!0,items:o};let i=r??null;if(r===void 0&&n)try{i=lt(n,void 0,{lenientEnv:!0})}catch{i=null}return i?.roles?oA(i.roles,n,o):iA(t,o)}a(hh,"checkRoles");async function oA(t,e,n){let r=On.resolve(e,"profile"),o=new Mt(r);o.loadFromProfile(t,r);for(let s of o.loadErrors)n.push({key:`role.${s.file}`,status:"error",message:`\u89D2\u8272\u6821\u9A8C\u5931\u8D25: ${s.errors.join("; ")}`});if(o.size===0&&o.loadErrors.length===0)return n.push({key:"roles",status:"error",message:"profile.yml roles \u6BB5\u4E3A\u7A7A\uFF08\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u89D2\u8272\u5B9A\u4E49\uFF09"}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!1,items:n};for(let s of o.list()){let c=typeof s.persona=="string"?s.persona:"",l=t[s.id],d=v(l)?l.persona:void 0,u=mh(d,r,e),f=u?{type:"textFile",file:u}:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"persona"]};n.push(ms({key:`role.${s.id}.name`,label:"\u89D2\u8272\u540D\u79F0",description:`\u89D2\u8272 ${s.id} \u7684\u5C55\u793A\u540D\u79F0`,value:s.name??s.id,writeTarget:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"name"]}})),c.trim()?(n.push(ms({key:`role.${s.id}.persona`,label:"\u4EBA\u8BBE Persona",description:u?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${u}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:"\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 profile.yml\uFF09",value:c,writeTarget:f,multiline:!0})),n.push({key:`role.${s.id}`,status:"ok",message:`\u89D2\u8272 ${s.id} \u6821\u9A8C\u901A\u8FC7`})):n.push({key:`role.${s.id}.persona`,status:"warn",value:"",message:`\u89D2\u8272 ${s.id} \u7684 persona \u4E3A\u7A7A\uFF0C\u5F71\u54CD AI \u8F93\u51FA\u8D28\u91CF`,writeTarget:f});let p=s.knowledge_scope?.kb_collections??[];if(p.length===0)n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"suggestion",message:`\u89D2\u8272 ${s.id} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`});else{let g=p.map(m=>{if(typeof m=="string")return m;let y=m.compile?.build?.length?"\u81EA\u5B9A\u4E49\u7F16\u8BD1":"\u5185\u7F6E\u7F16\u8BD1";return`${m.collection}\uFF08${y}\uFF09`});n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"ok",value:g,message:`\u89D2\u8272 ${s.id} \u5DF2\u914D\u7F6E ${p.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!n.some(s=>s.status==="error"),items:n}}a(oA,"checkProfileRoles");async function iA(t,e){let n=!1;try{n=(await nA(t)).isDirectory()}catch{n=!1}if(!n)return e.push({key:"roles_dir",status:"warn",message:`roles/ \u76EE\u5F55\u4E0D\u5B58\u5728\uFF08${t}\uFF09\uFF1B\u89D2\u8272\u5B9A\u4E49\u76EE\u5F55\u81F3\u5C11\u9700\u8981\u4E00\u4E2A .role.yml \u6587\u4EF6`}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!0,items:e};let o=(await tA(t)).filter(c=>c.endsWith(gs)).sort();if(o.length===0)return e.push({key:"roles",status:"error",message:"roles/ \u76EE\u5F55\u4E0B\u65E0 .role.yml \u6587\u4EF6\uFF08\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u89D2\u8272\u5B9A\u4E49\u6587\u4EF6\uFF09"}),{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!1,items:e};let i=new Mt(t);for(let c of o){let l=On.join(t,c),d=await i.validateFile(l),u=c.replace(gs,"");if(!d.ok){e.push({key:`role.${u}`,status:"error",message:`${c} \u6821\u9A8C\u5931\u8D25: ${d.errors.join("; ")}`});continue}let f=d.definition,p=typeof f.persona=="string"?f.persona:"",g=mh(f.persona,t,On.dirname(t)),m={type:"yaml",file:`roles/${c}`,yamlPath:["persona"]};if(g){m={type:"textFile",file:g};try{p=(await rA(On.resolve(On.dirname(t),g),"utf8")).trim()}catch{p=""}}e.push(ms({key:`role.${u}.name`,label:"\u89D2\u8272\u540D\u79F0",description:`\u89D2\u8272 ${f.id} \u7684\u5C55\u793A\u540D\u79F0`,value:f.name??f.id,writeTarget:{type:"yaml",file:`roles/${c}`,yamlPath:["name"]}})),p.trim()?(e.push(ms({key:`role.${u}.persona`,label:"\u4EBA\u8BBE Persona",description:g?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${g}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 roles/${c}\uFF09`,value:p,writeTarget:m,multiline:!0})),e.push({key:`role.${u}`,status:"ok",message:`${c} \u6821\u9A8C\u901A\u8FC7 (${f.id})`})):e.push({key:`role.${u}.persona`,status:"warn",value:"",message:`${c} \u7684 persona \u4E3A\u7A7A\uFF0C\u5F71\u54CD AI \u8F93\u51FA\u8D28\u91CF`,writeTarget:m});let y=f.knowledge_scope?.kb_collections??[];y.length===0?e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"suggestion",message:`${c} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF08knowledge_scope.kb_collections\uFF09\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`}):e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"ok",value:y,message:`${c} \u5DF2\u914D\u7F6E ${y.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!e.some(c=>c.status==="error"),items:e}}a(iA,"checkDirectoryRoles");import sA from"yaml";var aA=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,cA=/api_key|secret|token|password|^DINGTALK_ROBOTS$/i,wh=/^[A-Za-z_][A-Za-z0-9_]*$/;function lA(t){let e=new Map;if(!t)return e;let n=[];for(let r of t.split(`
343
343
  `)){let o=r.trim();if(o===""){n=[];continue}if(o.startsWith("#")){n.push(o.replace(/^#+\s?/,""));continue}let i=r.indexOf("=");if(i>0){let s=r.slice(0,i).trim(),c=r.slice(i+1).trim();if(wh.test(s)){let l=[];n.length>0&&l.push(n.join(" ")),/^[{[]/.test(c)&&l.push(`\u683C\u5F0F\u793A\u4F8B: ${c}`),l.length>0&&e.set(s,l.join("\uFF1B"))}}n=[]}return e}a(lA,"parseEnvExampleDescriptions");function bh(t){let e=new Map;if(!t)return e;for(let n of t.split(`
344
344
  `)){let r=n.trim().replace(/^#+\s?/,""),o=r.indexOf("=");if(o<=0)continue;let i=r.slice(0,o).trim(),s=r.slice(o+1).trim();wh.test(i)&&/^[{[]/.test(s)&&!e.has(i)&&e.set(i,s)}return e}a(bh,"parseEnvExampleValues");function kh(t,e){for(let n of t){if(!n)continue;let r;try{r=JSON.parse(n)}catch{continue}if(!r||typeof r!="object"||Array.isArray(r))continue;let o=Object.values(r);if(o.length===0||!o.every(c=>c&&typeof c=="object"&&!Array.isArray(c)))continue;let i=[];for(let c of o)for(let l of Object.keys(c))i.includes(l)||i.push(l);if(i.length===0)continue;return{kind:"map",keyLabel:e?.match(/JSON\s*map:?\s*([A-Za-z_][A-Za-z0-9_]*)\s*(?:→|->)/)?.[1],valueFields:i,example:n}}}a(kh,"deriveEnvJsonMapSpec");function dA(t,e,n,r=!1){return{key:t,label:t,description:e,owner:"env",source:"env",required:!r,editable:!0,allowEmpty:r,defaultStrategy:"none",valueType:"string",writeTarget:{type:"env",file:".env",envKey:t},...n?{envJsonSpec:n}:{}}}a(dA,"envSurface");function uA(t){let e=[];for(let n of t.split(`
345
345
  `)){let r=!1,o=!1,i=-1;for(let s=0;s<n.length;s++){let c=n[s];if(r)c==="'"&&(r=!1);else if(o)c==='"'&&(o=!1);else if(c==="'")r=!0;else if(c==='"')o=!0;else if(c==="#"&&(s===0||/\s/.test(n[s-1]))){i=s;break}}e.push(i>=0?n.slice(0,i):n)}return e.join(`
@@ -430,14 +430,14 @@ ${u.slice(w)}`:`${u.trimEnd()}
430
430
 
431
431
  ${g}
432
432
  `}Ye.writeFileSync(l.abs,m,"utf8"),d?d.add(o):n.set(c,new Set([o])),r++}}return r}a(XE,"maintainBidirectionalLinks");function ry(t){let e=[];for(let n of rd(t))if(n!=="tags")for(let r of Ln(ce.join(t,n)))ce.basename(r).startsWith("_")||e.push(r);return e}a(ry,"listWikiArticleAbs");function td(t){let e=new Map;for(let r of t){let o=ce.basename(r);e.set(o,(e.get(o)??0)+1)}let n=new Map;for(let r of t){let o=ce.basename(r);e.get(o)===1&&n.set(o,r)}return n}a(td,"uniqueByBasename");function Ps(t,e){try{return Ye.existsSync(decodeURI(ce.resolve(e,t)))}catch{return!1}}a(Ps,"resolvableFrom");function nd(t,e){let n=t.get(e);if(n)return n;try{let r=decodeURI(e);return r!==e?t.get(r):void 0}catch{return}}a(nd,"lookupDecoded");function eD(t,e){let n=td(Ln(e)),r=ry(t),o=td([...Ln(e),...r.filter(l=>!n.has(ce.basename(l)))]),i=td(r),s=0,c=0;for(let l of ry(t)){let d=Ye.readFileSync(l,"utf8");if(od(d)||!vo(d))continue;let f=ce.dirname(l),p=d,g=!1,m=p.match(/^sources:\s*\[([^\]]*)\]/m);if(m){let R=m[1].split(",").map(T=>T.trim()).filter(Boolean).map(T=>{let _=T.replace(/^["']|["']$/g,"");if(/^(https?|dingtalk):/.test(_)||Ps(_,e)||Ps(_,f)||Ps(_,t))return T;let E=[...o.values()].filter(W=>{let P=ce.relative(e,W).split(ce.sep).join("/"),O=ce.relative(t,W).split(ce.sep).join("/");return P.includes("/")&&_.endsWith(`/${P}`)||O.includes("/")&&_.endsWith(`/${O}`)}),F=E.length===1?E[0]:nd(o,ce.basename(_));return F?(s++,g=!0,ce.relative(f,F).split(ce.sep).join("/")):T});p=p.replace(m[0],`sources: [${R.join(", ")}]`)}let y=p.indexOf(`
433
- ---`,3),w=y!==-1?y+4:0,b=p.slice(0,w),x=p.slice(w),I=Xl(),v=x.replace(I,(k,R,T,_)=>{if(R)return k;let C=yr(_);if(/^(https?|dingtalk):/.test(C)||C.startsWith("#"))return k;if(/\s/.test(C)&&!_.startsWith("<")){let q=nd(i,ce.basename(C));if(!q)return k;c++,g=!0;let z=ce.relative(f,q).split(ce.sep).join("/");return`[${T}](${Ct(z)})`}if(Ps(C.split("#")[0],f))return k;let E=C.indexOf("#"),F=E!==-1?C.slice(0,E):C,W=E!==-1?C.slice(E):"",P=nd(i,ce.basename(F));if(!P)return k;c++,g=!0;let O=ce.relative(f,P).split(ce.sep).join("/");return`[${T}](${Ct(`${O}${W}`)})`});p=b+v,g&&Ye.writeFileSync(l,p,"utf8")}return{sourcesFixed:s,linksFixed:c}}a(eD,"normalizeWikiProvenance");function iy(t){let e=YE(t.wikiDir,t.sourceDir),n=eD(t.wikiDir,t.sourceDir),r=XE(t.wikiDir);return{sources:e,normalized:n,backlinksAdded:r}}a(iy,"postProcessWiki");import wr from"fs";import Ke from"path";function sy(t){try{let e=Ne(wr.readFileSync(t,"utf8"));return e.curated==="true"||e.curated==="yes"}catch{return!1}}a(sy,"isCuratedSource");function tD(t){if(t.startsWith("---")){let e=t.indexOf(`
433
+ ---`,3),w=y!==-1?y+4:0,b=p.slice(0,w),x=p.slice(w),I=Xl(),S=x.replace(I,(k,R,T,_)=>{if(R)return k;let C=yr(_);if(/^(https?|dingtalk):/.test(C)||C.startsWith("#"))return k;if(/\s/.test(C)&&!_.startsWith("<")){let q=nd(i,ce.basename(C));if(!q)return k;c++,g=!0;let z=ce.relative(f,q).split(ce.sep).join("/");return`[${T}](${Ct(z)})`}if(Ps(C.split("#")[0],f))return k;let E=C.indexOf("#"),F=E!==-1?C.slice(0,E):C,W=E!==-1?C.slice(E):"",P=nd(i,ce.basename(F));if(!P)return k;c++,g=!0;let O=ce.relative(f,P).split(ce.sep).join("/");return`[${T}](${Ct(`${O}${W}`)})`});p=b+S,g&&Ye.writeFileSync(l,p,"utf8")}return{sourcesFixed:s,linksFixed:c}}a(eD,"normalizeWikiProvenance");function iy(t){let e=YE(t.wikiDir,t.sourceDir),n=eD(t.wikiDir,t.sourceDir),r=XE(t.wikiDir);return{sources:e,normalized:n,backlinksAdded:r}}a(iy,"postProcessWiki");import wr from"fs";import Ke from"path";function sy(t){try{let e=Ne(wr.readFileSync(t,"utf8"));return e.curated==="true"||e.curated==="yes"}catch{return!1}}a(sy,"isCuratedSource");function tD(t){if(t.startsWith("---")){let e=t.indexOf(`
434
434
  ---`,3);if(e!==-1){let n=t.slice(4,e),r=e+4;return t[r]===`
435
435
  `&&(r+=1),{fmLines:n.split(`
436
- `),body:t.slice(r)}}}return{fmLines:[],body:t}}a(tD,"splitFrontmatter");function nD(t,e,n){return t.replace(ed(),(r,o,i,s)=>{let c=yr(i);if(/^(https?|mailto|dingtalk|file):/.test(c)||c.startsWith("#"))return r;let[l,d=""]=(()=>{let p=c.indexOf("#");return p===-1?[c,""]:[c.slice(0,p),c.slice(p)]})(),u;try{u=Ke.resolve(e,decodeURI(l))}catch{return r}if(!wr.existsSync(u))return r;let f=Ke.relative(n,u).split(Ke.sep).join("/");return`${o}${Ct(`${f}${d}`)}${s}`})}a(nD,"rewriteRelativeLinks");function rD(t,e,n){let r=[],o=ed(),i;for(;(i=o.exec(t))!==null;){let s=yr(i[2]);if(/^(https?|mailto|dingtalk|file):/.test(s)||s.startsWith("#"))continue;let c=s.split("#",1)[0];if(!c)continue;let l;try{l=Ke.resolve(e,decodeURI(c))}catch{continue}if(!wr.existsSync(l))continue;let d=Ke.relative(n,l).split(Ke.sep).join("/");d.startsWith("..")||r.includes(d)||r.push(d)}return r}a(rD,"extractProvenanceTargets");function ay(t){let{sourceAbsPath:e,sourceRelPath:n,wikiDirPath:r,taxonomy:o,today:i,categorySuggestion:s}=t,c=wr.readFileSync(e,"utf8"),{fmLines:l,body:d}=tD(c),u=Ne(c),f=Ke.basename(e).replace(/\.[^.]+$/,".md"),p=t.sourceRootDir??Ke.dirname(e),g=!1,m,y=u.category?Yn(o,u.category):null,w=!!u.category&&y===null,b=s?Yn(o,s):null;y?m=y:b?m=b:(m=o.fallbackCategoryId,g=!0);let x=l.filter(R=>!/^category:\s*/.test(R));x.push(`category: ${m}`),u.title||x.push(`title: ${Ke.basename(f,".md")}`);let I=rD(d,Ke.dirname(e),p).filter(R=>R!==n);!u.sources&&I.length>0&&x.push(`sources: [${I.join(", ")}]`),u.updated||x.push(`updated: ${i}`);let v=Ke.join(r,m,f);wr.mkdirSync(Ke.dirname(v),{recursive:!0});let k=nD(d,Ke.dirname(e),Ke.dirname(v));return wr.writeFileSync(v,`---
436
+ `),body:t.slice(r)}}}return{fmLines:[],body:t}}a(tD,"splitFrontmatter");function nD(t,e,n){return t.replace(ed(),(r,o,i,s)=>{let c=yr(i);if(/^(https?|mailto|dingtalk|file):/.test(c)||c.startsWith("#"))return r;let[l,d=""]=(()=>{let p=c.indexOf("#");return p===-1?[c,""]:[c.slice(0,p),c.slice(p)]})(),u;try{u=Ke.resolve(e,decodeURI(l))}catch{return r}if(!wr.existsSync(u))return r;let f=Ke.relative(n,u).split(Ke.sep).join("/");return`${o}${Ct(`${f}${d}`)}${s}`})}a(nD,"rewriteRelativeLinks");function rD(t,e,n){let r=[],o=ed(),i;for(;(i=o.exec(t))!==null;){let s=yr(i[2]);if(/^(https?|mailto|dingtalk|file):/.test(s)||s.startsWith("#"))continue;let c=s.split("#",1)[0];if(!c)continue;let l;try{l=Ke.resolve(e,decodeURI(c))}catch{continue}if(!wr.existsSync(l))continue;let d=Ke.relative(n,l).split(Ke.sep).join("/");d.startsWith("..")||r.includes(d)||r.push(d)}return r}a(rD,"extractProvenanceTargets");function ay(t){let{sourceAbsPath:e,sourceRelPath:n,wikiDirPath:r,taxonomy:o,today:i,categorySuggestion:s}=t,c=wr.readFileSync(e,"utf8"),{fmLines:l,body:d}=tD(c),u=Ne(c),f=Ke.basename(e).replace(/\.[^.]+$/,".md"),p=t.sourceRootDir??Ke.dirname(e),g=!1,m,y=u.category?Yn(o,u.category):null,w=!!u.category&&y===null,b=s?Yn(o,s):null;y?m=y:b?m=b:(m=o.fallbackCategoryId,g=!0);let x=l.filter(R=>!/^category:\s*/.test(R));x.push(`category: ${m}`),u.title||x.push(`title: ${Ke.basename(f,".md")}`);let I=rD(d,Ke.dirname(e),p).filter(R=>R!==n);!u.sources&&I.length>0&&x.push(`sources: [${I.join(", ")}]`),u.updated||x.push(`updated: ${i}`);let S=Ke.join(r,m,f);wr.mkdirSync(Ke.dirname(S),{recursive:!0});let k=nD(d,Ke.dirname(e),Ke.dirname(S));return wr.writeFileSync(S,`---
437
437
  ${x.filter(R=>R.trim()!=="").join(`
438
438
  `)}
439
439
  ---
440
- ${k}`,"utf8"),{category:m,outAbsPath:v,usedFallbackCategory:g,sourceCategoryInvalid:w}}a(ay,"compileCuratedFile");function cy(t,e){return["\u4F60\u662F\u77E5\u8BC6\u5E93\u5206\u7C7B\u52A9\u624B\u3002\u4EE5\u4E0B curated \u6587\u6863\u7F3A\u5C11\u5206\u7C7B\uFF0C\u8BF7\u7528 Read \u5DE5\u5177\u9010\u4E2A\u8BFB\u53D6\uFF0C\u6309\u5206\u7C7B\u5224\u5B9A\u6807\u51C6\u7ED9\u51FA\u5206\u7C7B\u5EFA\u8BAE\u3002","","\u3010\u5206\u7C7B\u95ED\u96C6\uFF08\u53EA\u80FD\u4ECE\u4E2D\u9009\u62E9\uFF09\u3011",...e.categories.map(r=>`- ${r.id}${r.criteria?`\uFF1A${r.criteria}`:""}`),"","\u3010\u5F85\u5206\u7C7B\u6587\u4EF6\u3011",...t.map((r,o)=>`${o+1}. ${r}`),"","\u3010\u8F93\u51FA\u8981\u6C42\u3011","\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002\u952E\u4E3A\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09\uFF0C\u503C\u4E3A\u5206\u7C7B id\uFF1A",'{"\u6587\u4EF6\u540D.md": "\u5206\u7C7Bid"}',"\u4E0D\u8981\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\u3002"].join(`
440
+ ${k}`,"utf8"),{category:m,outAbsPath:S,usedFallbackCategory:g,sourceCategoryInvalid:w}}a(ay,"compileCuratedFile");function cy(t,e){return["\u4F60\u662F\u77E5\u8BC6\u5E93\u5206\u7C7B\u52A9\u624B\u3002\u4EE5\u4E0B curated \u6587\u6863\u7F3A\u5C11\u5206\u7C7B\uFF0C\u8BF7\u7528 Read \u5DE5\u5177\u9010\u4E2A\u8BFB\u53D6\uFF0C\u6309\u5206\u7C7B\u5224\u5B9A\u6807\u51C6\u7ED9\u51FA\u5206\u7C7B\u5EFA\u8BAE\u3002","","\u3010\u5206\u7C7B\u95ED\u96C6\uFF08\u53EA\u80FD\u4ECE\u4E2D\u9009\u62E9\uFF09\u3011",...e.categories.map(r=>`- ${r.id}${r.criteria?`\uFF1A${r.criteria}`:""}`),"","\u3010\u5F85\u5206\u7C7B\u6587\u4EF6\u3011",...t.map((r,o)=>`${o+1}. ${r}`),"","\u3010\u8F93\u51FA\u8981\u6C42\u3011","\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002\u952E\u4E3A\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09\uFF0C\u503C\u4E3A\u5206\u7C7B id\uFF1A",'{"\u6587\u4EF6\u540D.md": "\u5206\u7C7Bid"}',"\u4E0D\u8981\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\u3002"].join(`
441
441
  `)}a(cy,"buildCuratedClassifyPrompt");function ly(t){let e=t.match(/\{[\s\S]*\}/);if(!e)return{};try{let n=JSON.parse(e[0]);if(n==null||typeof n!="object"||Array.isArray(n))return{};let r={};for(let[o,i]of Object.entries(n))typeof i=="string"&&(r[o]=i);return r}catch{return{}}}a(ly,"parseCuratedClassification");import Qe from"fs";import _e from"path";var oD=/(?:^|[\s("'`((])(?:\/Users\/|\/home\/|[A-Za-z]:\\|file:\/\/)/;function iD(t,e){let n=[];if(!Qe.existsSync(t))return n;for(let r of Qe.readdirSync(t,{withFileTypes:!0})){if(!r.isDirectory()||r.name.startsWith("_")||r.name.startsWith(".")||e.has(r.name))continue;let o=_e.join(t,r.name);for(let i of Qe.readdirSync(o))i.endsWith(".md")&&!i.startsWith("_")&&n.push(_e.join(o,i))}return n}a(iD,"walkArticles");function sD(t){let e=[],n=t.startsWith("---")?t.indexOf(`
442
442
  ---`,3):-1,r=n===-1?"":t.slice(0,n),o=r.match(/^(?:sources|original_sources):\s*\[(.*)\]\s*$/m);if(o?.[1])for(let s of o[1].split(",")){let c=s.trim().replace(/^["']|["']$/g,"");c&&e.push(c)}let i=r.match(/^(?:sources|original_sources):\s*\n((?:\s*-\s*.+\n?)+)/m);if(i?.[1])for(let s of i[1].split(`
443
443
  `)){let c=s.replace(/^\s*-\s*/,"").trim().replace(/^["']|["']$/g,"");c&&e.push(c)}return e}a(sD,"parseSourceEntries");function aD(t){let e=[];if(!Qe.existsSync(t))return e;let n=_e.join(t,"_index.md");Qe.existsSync(n)&&e.push(n);for(let r of Qe.readdirSync(t,{withFileTypes:!0})){if(!r.isDirectory()||r.name.startsWith("."))continue;let o=_e.join(t,r.name,"_index.md");Qe.existsSync(o)&&e.push(o)}return e}a(aD,"walkIndexFiles");function dy(t){let{wikiDirPath:e,taxonomy:n,categoryInputIssues:r,sourceDirPath:o}=t,i=[],s=new Set(st(n)),c=s.has(it)?new Set:new Set([it]),l=iD(e,c),d=new Set;for(let g of l){let m=_e.relative(e,g),y=m.split(_e.sep,1)[0],w=Qe.readFileSync(g,"utf8");s.has(y)?r?.has(m)&&i.push({rule:"invalid-category",file:m,detail:r.get(m)}):i.push({rule:"invalid-category",file:m,detail:`\u76EE\u5F55 ${y} \u4E0D\u5728 taxonomy \u95ED\u96C6\u5185`}),oD.test(w)&&i.push({rule:"absolute-path",file:m,detail:"\u6B63\u6587\u542B\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84"});let b=sD(w);b.length===0?i.push({rule:"missing-sources",file:m,detail:"frontmatter \u7F3A sources/original_sources \u6EAF\u6E90"}):b.some(I=>/^(https?|dingtalk):/.test(I)?!0:[...o?[_e.resolve(o,I)]:[],_e.resolve(_e.dirname(g),I),_e.resolve(e,I)].some(k=>{try{return Qe.existsSync(decodeURI(k))}catch{return!1}}))||i.push({rule:"missing-sources",file:m,detail:`sources \u6761\u76EE\u5168\u90E8\u65E0\u6CD5\u89E3\u6790: ${b.join(", ")}`});for(let x of ko(w)){let I=_e.resolve(_e.dirname(g),decodeURI(x));Qe.existsSync(I)?I.startsWith(e)&&d.add(_e.relative(e,I)):i.push({rule:"broken-link",file:m,detail:`\u5931\u6548\u94FE\u63A5: ${x}`})}}let u=aD(e);for(let g of u){let m=_e.relative(e,g),y=Qe.readFileSync(g,"utf8");for(let w of ko(y)){let b=_e.resolve(_e.dirname(g),decodeURI(w));Qe.existsSync(b)||i.push({rule:"broken-link",file:m,detail:`\u7D22\u5F15\u5931\u6548\u94FE\u63A5: ${w}`})}}let f=u.map(g=>Qe.readFileSync(g,"utf8")).join(`
@@ -455,33 +455,33 @@ ${k}`,"utf8"),{category:m,outAbsPath:v,usedFallbackCategory:g,sourceCategoryInva
455
455
  `,"utf8");let i=n==="full"?"\u5168\u91CF":"\u589E\u91CF",s=[`${r.created} \u65B0\u5EFA`,`${r.updated} \u66F4\u65B0`,`${r.skipped} \u8DF3\u8FC7`,r.failed>0?`${r.failed} \u5931\u8D25`:null,r.pruned>0?`${r.pruned} \u6E05\u7406`:null].filter(Boolean).join(", ");Z.appendFileSync(o,`## [${e.slice(0,10)}] ${i}\u7F16\u8BD1 | ${s}
456
456
  `,"utf8")}a(ld,"appendCompileLog");function wD(t,e,n,r){for(let o of r){let i=Y.join(t,o,e);if(!Z.existsSync(i))continue;let s=Z.readFileSync(i,"utf8");if(s.includes("original_sources:")||!s.startsWith("---"))return;let c=s.indexOf(`
457
457
  ---`,3);if(c===-1)return;Z.writeFileSync(i,`${s.slice(0,c)}
458
- original_sources: [${n.url}]${s.slice(c)}`,"utf8");return}}a(wD,"backfillOriginalSources");function my(t,e){let n=0;for(let r of fd(t)){if(r===it)continue;let o=Y.join(t,r);for(let i of Z.readdirSync(o).filter(s=>s.endsWith(".md")&&!s.startsWith("_")))e.has(i)||(Z.rmSync(Y.join(o,i),{force:!0}),n++)}return n}a(my,"pruneOrphanWikiPages");function hy(t,e,n,r){try{let o=iy({wikiDir:t,sourceDir:e});r?.("indexing",`\u540E\u5904\u7406\uFF1A\u6765\u6E90\u5BCC\u5316 ${o.sources.enrichedArticles} \u7BC7/${o.sources.linksWritten} \u94FE\u63A5\uFF0C\u5F52\u4E00\u5316\u6EAF\u6E90 ${o.normalized.sourcesFixed}/\u94FE\u63A5 ${o.normalized.linksFixed}\uFF0C\u53CD\u5411\u94FE\u63A5 ${o.backlinksAdded} \u6761`),h.info("kb","wiki \u540E\u5904\u7406\u5B8C\u6210",{collection:n,...o.sources,normalized:o.normalized,backlinksAdded:o.backlinksAdded})}catch(o){let i=o instanceof Error?o.message:String(o);h.warn("kb","wiki \u540E\u5904\u7406\u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7)",{collection:n,error:i})}}a(hy,"runPostProcess");function yy(t,e,n,r,o,i){try{let s=dy({wikiDirPath:t,taxonomy:e,categoryInputIssues:r,sourceDirPath:o}),c=s.issues.length;return c>0&&(i?.("indexing",`lint\uFF1A${c} \u4E2A\u95EE\u9898\uFF08\u89C1 _compile-report.json\uFF09`),h.warn("kb","\u7F16\u8BD1\u4EA7\u7269 lint \u53D1\u73B0\u95EE\u9898",{collection:n,counts:s.counts})),{lint:s}}catch(s){let c=s instanceof Error?s.message:String(s);return h.warn("kb","\u7F16\u8BD1\u4EA7\u7269 lint \u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7\uFF0C\u8BB0\u5165\u62A5\u544A)",{collection:n,error:c}),i?.("indexing",`lint \u672A\u80FD\u5B8C\u6210\uFF1A${c}`),{lintError:c}}}a(yy,"runLint");async function xy(t){let{configDir:e,entry:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,onProgress:c}=t,l=Math.max(1,t.batchSize??gD),d=qt(e,n),u=xn(e,n),f=le(),p;try{p=At({configDir:e,entry:n})}catch(H){let de=H instanceof Error?H.message:String(H),ie=le();return c?.("failed",de),h.error("kb","taxonomy \u914D\u7F6E\u65E0\u6548",{collection:n,error:de}),{collection:n,startedAt:f,finishedAt:ie,sourceFileCount:0,articleCount:0,status:"failed",error:de}}let g=st(p),m=Gr(p),y=pi(p),w=new Map,b=await Fn(e,n),x=b?.fileHashes??{},I=b!=null&&(b.taxonomyHash!=null?b.taxonomyHash!==m:!p.isDefault),v=t.forceFull===!0||I;I&&(c?.("scanning","taxonomy \u53D8\u66F4\uFF0C\u81EA\u52A8\u5347\u7EA7\u4E3A\u5168\u91CF\u91CD\u7F16\u4EE5\u91CD\u65B0\u5206\u7C7B"),h.info("kb","taxonomy \u53D8\u66F4\uFF0C\u5F3A\u5236\u5168\u91CF\u91CD\u7F16",{collection:n,taxonomyHash:m}));let k={...b,collection:n,sourceDir:d,wikiDir:u,status:"compiling",startedAt:f,taxonomyHash:m,taxonomyIndexHash:y,lastError:void 0};c?.("scanning",d);let R=wy(d,d),T=R.filter(H=>vp(p,H)),_={};for(let H of R)_[H]=mD(Y.join(d,H));if(await sn(e,n,{...k,fileCount:R.length,compiledCount:0}),R.length===0){let H=le();if(Z.existsSync(u)){let de=my(u,new Set);gy(u,g,n),uy(u,g);let ie=le();id(u,n,ie,0,p);for(let me of p.categories)sd(u,me,ie);ad(u,p,ie),de>0&&(ld(u,ie,"incremental",{created:0,updated:0,skipped:0,failed:0,pruned:de}),h.warn("kb","\u6E90\u76EE\u5F55\u5DF2\u6E05\u7A7A\uFF0C\u540C\u6B65\u6E05\u7406\u65E7\u4EA7\u7269",{collection:n,pruned:de}))}return c?.("skipped","\u6E90\u76EE\u5F55\u4E3A\u7A7A"),await sn(e,n,{...k,status:"done",finishedAt:H,fileCount:0,compiledCount:0,sourceHash:await Ot(d),fileHashes:{}}),h.warn("kb","\u6E90\u76EE\u5F55\u65E0\u53EF\u7F16\u8BD1\u6587\u4EF6",{collection:n,src:d}),{collection:n,startedAt:f,finishedAt:H,sourceFileCount:0,articleCount:0,status:"done"}}uy(u,g);let C=new Set(T.map(jt)),E=my(u,C);for(let H of C)cd(u,H,p);gy(u,g,n);let F=T.filter(H=>v||!fy(u,jt(H),g)?!0:x[H]!==_[H]),W=new Set(F.filter(H=>fy(u,jt(H),g))),P=T.length-F.length,O=v?"full":"incremental",q=v?"\u5168\u91CF":"\u589E\u91CF";if(F.length===0){c?.("indexing");let H=le();hy(u,d,n,c);let de=id(u,n,H,T.length,p);for(let ot of p.categories)sd(u,ot,H);ad(u,p,H);let ie=le(),{lint:me,lintError:Be}=yy(u,p,n,w,d,c),se={collection:n,startedAt:f,finishedAt:ie,sourceFileCount:R.length,articleCount:de,status:"done",...me?{lint:me}:{},...Be?{lintError:Be}:{}};return Z.writeFileSync(Zn(e,n),JSON.stringify(se,null,2)+`
458
+ original_sources: [${n.url}]${s.slice(c)}`,"utf8");return}}a(wD,"backfillOriginalSources");function my(t,e){let n=0;for(let r of fd(t)){if(r===it)continue;let o=Y.join(t,r);for(let i of Z.readdirSync(o).filter(s=>s.endsWith(".md")&&!s.startsWith("_")))e.has(i)||(Z.rmSync(Y.join(o,i),{force:!0}),n++)}return n}a(my,"pruneOrphanWikiPages");function hy(t,e,n,r){try{let o=iy({wikiDir:t,sourceDir:e});r?.("indexing",`\u540E\u5904\u7406\uFF1A\u6765\u6E90\u5BCC\u5316 ${o.sources.enrichedArticles} \u7BC7/${o.sources.linksWritten} \u94FE\u63A5\uFF0C\u5F52\u4E00\u5316\u6EAF\u6E90 ${o.normalized.sourcesFixed}/\u94FE\u63A5 ${o.normalized.linksFixed}\uFF0C\u53CD\u5411\u94FE\u63A5 ${o.backlinksAdded} \u6761`),h.info("kb","wiki \u540E\u5904\u7406\u5B8C\u6210",{collection:n,...o.sources,normalized:o.normalized,backlinksAdded:o.backlinksAdded})}catch(o){let i=o instanceof Error?o.message:String(o);h.warn("kb","wiki \u540E\u5904\u7406\u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7)",{collection:n,error:i})}}a(hy,"runPostProcess");function yy(t,e,n,r,o,i){try{let s=dy({wikiDirPath:t,taxonomy:e,categoryInputIssues:r,sourceDirPath:o}),c=s.issues.length;return c>0&&(i?.("indexing",`lint\uFF1A${c} \u4E2A\u95EE\u9898\uFF08\u89C1 _compile-report.json\uFF09`),h.warn("kb","\u7F16\u8BD1\u4EA7\u7269 lint \u53D1\u73B0\u95EE\u9898",{collection:n,counts:s.counts})),{lint:s}}catch(s){let c=s instanceof Error?s.message:String(s);return h.warn("kb","\u7F16\u8BD1\u4EA7\u7269 lint \u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7\uFF0C\u8BB0\u5165\u62A5\u544A)",{collection:n,error:c}),i?.("indexing",`lint \u672A\u80FD\u5B8C\u6210\uFF1A${c}`),{lintError:c}}}a(yy,"runLint");async function xy(t){let{configDir:e,entry:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,onProgress:c}=t,l=Math.max(1,t.batchSize??gD),d=qt(e,n),u=xn(e,n),f=le(),p;try{p=At({configDir:e,entry:n})}catch(H){let de=H instanceof Error?H.message:String(H),ie=le();return c?.("failed",de),h.error("kb","taxonomy \u914D\u7F6E\u65E0\u6548",{collection:n,error:de}),{collection:n,startedAt:f,finishedAt:ie,sourceFileCount:0,articleCount:0,status:"failed",error:de}}let g=st(p),m=Gr(p),y=pi(p),w=new Map,b=await Fn(e,n),x=b?.fileHashes??{},I=b!=null&&(b.taxonomyHash!=null?b.taxonomyHash!==m:!p.isDefault),S=t.forceFull===!0||I;I&&(c?.("scanning","taxonomy \u53D8\u66F4\uFF0C\u81EA\u52A8\u5347\u7EA7\u4E3A\u5168\u91CF\u91CD\u7F16\u4EE5\u91CD\u65B0\u5206\u7C7B"),h.info("kb","taxonomy \u53D8\u66F4\uFF0C\u5F3A\u5236\u5168\u91CF\u91CD\u7F16",{collection:n,taxonomyHash:m}));let k={...b,collection:n,sourceDir:d,wikiDir:u,status:"compiling",startedAt:f,taxonomyHash:m,taxonomyIndexHash:y,lastError:void 0};c?.("scanning",d);let R=wy(d,d),T=R.filter(H=>vp(p,H)),_={};for(let H of R)_[H]=mD(Y.join(d,H));if(await sn(e,n,{...k,fileCount:R.length,compiledCount:0}),R.length===0){let H=le();if(Z.existsSync(u)){let de=my(u,new Set);gy(u,g,n),uy(u,g);let ie=le();id(u,n,ie,0,p);for(let me of p.categories)sd(u,me,ie);ad(u,p,ie),de>0&&(ld(u,ie,"incremental",{created:0,updated:0,skipped:0,failed:0,pruned:de}),h.warn("kb","\u6E90\u76EE\u5F55\u5DF2\u6E05\u7A7A\uFF0C\u540C\u6B65\u6E05\u7406\u65E7\u4EA7\u7269",{collection:n,pruned:de}))}return c?.("skipped","\u6E90\u76EE\u5F55\u4E3A\u7A7A"),await sn(e,n,{...k,status:"done",finishedAt:H,fileCount:0,compiledCount:0,sourceHash:await Ot(d),fileHashes:{}}),h.warn("kb","\u6E90\u76EE\u5F55\u65E0\u53EF\u7F16\u8BD1\u6587\u4EF6",{collection:n,src:d}),{collection:n,startedAt:f,finishedAt:H,sourceFileCount:0,articleCount:0,status:"done"}}uy(u,g);let C=new Set(T.map(jt)),E=my(u,C);for(let H of C)cd(u,H,p);gy(u,g,n);let F=T.filter(H=>S||!fy(u,jt(H),g)?!0:x[H]!==_[H]),W=new Set(F.filter(H=>fy(u,jt(H),g))),P=T.length-F.length,O=S?"full":"incremental",q=S?"\u5168\u91CF":"\u589E\u91CF";if(F.length===0){c?.("indexing");let H=le();hy(u,d,n,c);let de=id(u,n,H,T.length,p);for(let ot of p.categories)sd(u,ot,H);ad(u,p,H);let ie=le(),{lint:me,lintError:Be}=yy(u,p,n,w,d,c),se={collection:n,startedAt:f,finishedAt:ie,sourceFileCount:R.length,articleCount:de,status:"done",...me?{lint:me}:{},...Be?{lintError:Be}:{}};return Z.writeFileSync(Zn(e,n),JSON.stringify(se,null,2)+`
459
459
  `,"utf8"),await sn(e,n,{...k,status:"done",finishedAt:ie,fileCount:R.length,compiledCount:de,sourceHash:await Ot(d),fileHashes:_}),ld(u,H,O,{created:0,updated:0,skipped:P,failed:0,pruned:E}),c?.("done",`${q}\u7F16\u8BD1\uFF1A\u5168\u90E8\u547D\u4E2D\u7F13\u5B58\uFF0C${P} \u8DF3\u8FC7\uFF08${de} \u7BC7\u6587\u7AE0\uFF09`),h.info("kb","\u7F16\u8BD1\u5B8C\u6210(\u65E0\u53D8\u66F4)",{collection:n,mode:O,sourceFiles:R.length,skipped:P,articles:de,pruned:E}),se}let z=s??180*1e3,K=new Set(F.filter(H=>sy(Y.join(d,H)))),G=F.filter(H=>!K.has(H)),ee=new Set,te=new Set,Ve="",ge=[];if(K.size>0){c?.("compiling",`curated \u786E\u5B9A\u6027\u7F16\u8BD1 ${K.size} \u7BC7\uFF08\u6B63\u6587\u4E0D\u7ECF LLM\uFF09`);let H=[...K].filter(ie=>{let me=Ne(Z.readFileSync(Y.join(d,ie),"utf8"));return!me.category||Yn(p,me.category)===null}),de={};if(H.length>0)try{let ie=await kt(cy(H.map(me=>Y.join(d,me)),p),{...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},workDir:d,timeoutMs:z*H.length,adapterOptions:{allowedTools:["Read"]}});de=ly(ie.response??"")}catch(ie){let me=ie instanceof Error?ie.message:String(ie);h.warn("kb","curated \u5206\u7C7B\u5EFA\u8BAE\u5931\u8D25(\u964D\u7EA7\u56DE\u9000\u5206\u7C7B)",{collection:n,error:me})}for(let ie of K)try{let me=de[Y.basename(ie)]??de[jt(ie)],Be=ay({sourceAbsPath:Y.join(d,ie),sourceRelPath:ie,wikiDirPath:u,sourceRootDir:d,taxonomy:p,today:dd(),...me?{categorySuggestion:me}:{}});cd(u,jt(ie),p),ee.add(ie);let se=Y.relative(u,Be.outAbsPath);Be.usedFallbackCategory?(w.set(se,`\u6E90\u6587\u6863\u65E0\u6709\u6548\u5206\u7C7B\uFF0C\u5DF2\u56DE\u9000\u5230 ${Be.category}\uFF08\u9700\u5728\u6E90\u6587\u6863\u8865\u5408\u6CD5 category\uFF09`),h.warn("kb","curated \u6587\u6863\u65E0\u6709\u6548\u5206\u7C7B\uFF0C\u56DE\u9000",{collection:n,file:ie,fallback:p.fallbackCategoryId})):Be.sourceCategoryInvalid&&(w.set(se,`\u6E90\u6587\u6863 category \u4E0D\u5728 taxonomy \u95ED\u96C6\u5185\uFF0C\u5DF2\u6309\u5206\u7C7B\u5EFA\u8BAE\u843D\u5230 ${Be.category}\uFF08\u9700\u4FEE\u6B63\u6E90\u6587\u6863 category\uFF09`),h.warn("kb","curated \u6587\u6863\u5206\u7C7B\u975E\u6CD5\uFF0C\u5DF2\u6309\u5EFA\u8BAE\u7EA0\u6B63",{collection:n,file:ie,category:Be.category}))}catch(me){te.add(ie);let Be=me instanceof Error?me.message:String(me);h.warn("kb","curated \u7F16\u8BD1\u5931\u8D25",{collection:n,file:ie,error:Be})}await sn(e,n,{...k,fileCount:R.length,compiledCount:ee.size})}let Ee=yD(G,l);c?.("compiling",`${q}\u7F16\u8BD1 ${F.length}/${T.length} \u4E2A\u6E90\u6587\u4EF6\uFF08curated ${K.size}\uFF09\uFF0C\u5206 ${Ee.length} \u6279`);for(let H=0;H<Ee.length;H++){let de=Ee[H];c?.("compiling",`\u6279 ${H+1}/${Ee.length}\uFF08${de.length} \u6587\u4EF6\uFF09`);let ie=de.map(se=>{let ot=jt(se);return{sourceAbsPath:Y.join(d,se),wikiBaseName:ot,candidateOutputs:g.map($r=>({category:$r,absPath:Y.join(u,$r,ot)})),origin:uD(Y.join(d,se))}}),me=fD(ie,dd(),p),Be=new Map;for(let se of de)Be.set(se,py(u,jt(se),g));try{let se=await kt(me,{...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},workDir:d,timeoutMs:z*de.length,adapterOptions:{allowedTools:["Read","Write","Glob"]}});Ve=se.response??Ve,se.events.some(ot=>ot.type==="error")&&h.warn("kb","\u7F16\u8BD1\u8FC7\u7A0B\u51FA\u73B0 error \u4E8B\u4EF6",{collection:n,batch:H+1})}catch(se){let ot=se instanceof Error?se.message:String(se);ge.push(`\u6279 ${H+1}: ${ot}`),h.warn("kb","\u6279\u6B21\u7F16\u8BD1\u5931\u8D25",{collection:n,batch:H+1,error:ot})}for(let se of de)cd(u,jt(se),p);for(let se of de){let ot=py(u,jt(se),g),$r=Be.get(se)??null;ot!==null&&($r===null||ot!==$r)?ee.add(se):te.add(se)}for(let se of ie)se.origin&&wD(u,se.wikiBaseName,se.origin,g);await sn(e,n,{...k,fileCount:R.length,compiledCount:ee.size})}if(ud(u,g).length===0){let H=le(),de=Ve.replace(/\s+/g," ").trim().slice(0,300),me=`coding agent \u672A\u4EA7\u51FA\u4EFB\u4F55 wiki \u6587\u7AE0(\u53EF\u80FD\u6A21\u578B\u672A\u6388\u6743/\u6743\u9650\u4E0D\u8DB3/\u8D85\u65F6)\u3002${ge.length>0?`\u6279\u6B21\u9519\u8BEF: ${ge.join("; ")}\u3002`:""}agent \u8FD4\u56DE: ${de||"(\u7A7A)"}`;return c?.("failed",me),await sn(e,n,{...k,status:"failed",finishedAt:H,fileCount:R.length,compiledCount:0,lastError:me}),h.error("kb","\u7F16\u8BD1\u672A\u4EA7\u51FA\u6587\u7AE0",{collection:n,response:de}),{collection:n,startedAt:f,finishedAt:H,sourceFileCount:R.length,articleCount:0,status:"failed",error:me}}c?.("indexing");let rt=le();hy(u,d,n,c);let Da=id(u,n,rt,T.length,p);for(let H of p.categories)sd(u,H,rt);ad(u,p,rt);let Ku={};for(let H of R)te.has(H)||(Ku[H]=_[H]);let ak=te.size===0?await Ot(d):`${await Ot(d)}:partial`,Bo=0,zo=0;for(let H of ee)W.has(H)?zo++:Bo++;let Vu=le(),{lint:qu,lintError:Hu}=yy(u,p,n,w,d,c),Gu={collection:n,startedAt:f,finishedAt:Vu,sourceFileCount:R.length,articleCount:Da,status:"done",...te.size>0?{failedFileCount:te.size}:{},...qu?{lint:qu}:{},...Hu?{lintError:Hu}:{}};return Z.writeFileSync(Zn(e,n),JSON.stringify(Gu,null,2)+`
460
460
  `,"utf8"),await sn(e,n,{...k,status:"done",finishedAt:Vu,fileCount:R.length,compiledCount:Da,sourceHash:ak,fileHashes:Ku}),ld(u,rt,O,{created:Bo,updated:zo,skipped:P,failed:te.size,pruned:E}),c?.("done",`${q}\u7F16\u8BD1\uFF1A${Bo} \u65B0\u5EFA, ${zo} \u66F4\u65B0, ${P} \u8DF3\u8FC7${te.size>0?`, ${te.size} \u5931\u8D25`:""}`),h.info("kb","\u7F16\u8BD1\u5B8C\u6210",{collection:n,mode:O,sourceFiles:R.length,created:Bo,updated:zo,skipped:P,failed:te.size,pruned:E,articles:Da}),Gu}a(xy,"compileWiki");import dn from"path";import{access as bD,readdir as kD}from"fs/promises";var vD=18e4,SD={tsx:"./node_modules/.bin/tsx"};function xD(t,e){let n=e.bins?.[t]??SD[t]??t;return!/^[./\\]/.test(n)&&!n.includes("/")&&!n.includes("\\")||(e.flavor==="win32"?dn.win32:e.flavor==="posix"?dn.posix:dn).isAbsolute(n)||/^[a-zA-Z]:/.test(n)?n:$e(e.configDir,n,{flavor:e.flavor??"native"})}a(xD,"resolveBuildBin");function br(t){let e=t?.shell,n=e&&typeof e=="object"?e.bins:void 0;if(!n||typeof n!="object"||Array.isArray(n))return;let r={};for(let[o,i]of Object.entries(n))typeof i=="string"&&i.length>0&&(r[o]=i);return Object.keys(r).length>0?r:void 0}a(br,"shellToolkitBins");var ID=/[*?]/,Iy=64;async function RD(t,e){let n=e.replace(/\\/g,"/").replace(/^\.\//,"");if(!n||n.includes("\0"))throw new ue(`glob \u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26: ${e}`,"INVALID_RELATIVE_PATH");if(dn.posix.isAbsolute(n)||/^[a-zA-Z]:/.test(n))throw new ue(`glob \u4E0D\u5141\u8BB8\u7EDD\u5BF9\u8DEF\u5F84: ${e}`,"ABSOLUTE_PATH");let r=n.split("/").filter(f=>f!==""&&f!==".");if(r.some(f=>f===".."))throw new ue(`glob \u4E0D\u80FD\u5305\u542B ..: ${e}`,"OUTSIDE_ROOT");let o=r.findIndex(f=>ID.test(f));o===-1&&(o=r.length-1);let i=r.slice(0,o),s=r.slice(o),c=i.length>0?$e(t,i.join("/")):dn.resolve(t),l=CD(s),d=[];await Ry(c,"",s.includes("**")?Iy:Math.min(s.length,Iy),l,d);let u=i.join("/");return d.map(f=>u?`${u}/${f}`:f).sort()}a(RD,"globMatches");function CD(t){let e="^";return t.forEach((n,r)=>{let o=r===t.length-1;if(n==="**")e+=o?"(?:[^/]+/)*[^/]+":"(?:[^/]+/)*";else for(let i of n)i==="*"?e+="[^/]*":i==="?"?e+="[^/]":e+=TD(i);!o&&n!=="**"&&(e+="/")}),new RegExp(`${e}$`)}a(CD,"globSegmentsToRegExp");function TD(t){return/[.+^${}()|[\]\\]/.test(t)?`\\${t}`:t}a(TD,"escapeRegExpChar");async function Ry(t,e,n,r,o){if(n<=0)return;let i;try{i=await kD(t,{withFileTypes:!0})}catch{return}for(let s of i){if(s.name.startsWith(".")||Ol.has(s.name))continue;let c=e?`${e}/${s.name}`:s.name;s.isDirectory()?await Ry(dn.join(t,s.name),c,n-1,r,o):s.isFile()&&r.test(c)&&o.push(c)}}a(Ry,"walkForGlob");async function Cy(t){let{configDir:e,collection:n,compile:r,bins:o,onProgress:i}=t,s=t.runner??J;if(r.inputs.length>0){let d=[];for(let u of r.inputs)(await RD(e,u)).length>0&&d.push(u);if(d.length===0){let u=`\u77E5\u8BC6\u6E90\u7F3A\u5931: ${r.inputs.join(", ")}\uFF08configDir \u4E0B\u5168\u90E8\u96F6\u547D\u4E2D\uFF09`;return h.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u524D\u7F6E\u68C0\u67E5\u5931\u8D25",{collection:n,inputs:r.inputs}),i?.("failed",u),{collection:n,action:"failed",error:u}}}for(let[d,u]of r.build.entries()){let f=`${u.bin}${u.args.length>0?` ${u.args.join(" ")}`:""}`;i?.("building",`[${d+1}/${r.build.length}] ${f}`);let p;try{p=xD(u.bin,{...o?{bins:o}:{},configDir:e})}catch(m){let y=m instanceof Error?m.message:String(m);return{collection:n,action:"failed",error:`bin \u89E3\u6790\u5931\u8D25\uFF08${u.bin}\uFF09: ${y}`}}let g;try{let m={cwd:e,timeoutMs:u.timeout_ms??vD};g=u.bin==="dws"?await ne(p,[...u.args],{...m,runner:s}):await s(p,[...u.args],m)}catch(m){let y=_D(n,f,m);return h.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5F02\u5E38",{collection:n,bin:u.bin,error:y}),i?.("failed",f),{collection:n,action:"failed",error:y}}if(g.exitCode!==0){let m=De(g.stderr),y=`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u975E\u96F6\u9000\u51FA\uFF08collection=${n}, exitCode=${g.exitCode}\uFF09: ${f}`+(m?`
461
- ${m}`:"");return h.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5931\u8D25",{collection:n,bin:u.bin,exitCode:g.exitCode}),i?.("failed",`${f} \u9000\u51FA\u7801 ${g.exitCode}`),{collection:n,action:"failed",error:y}}}let c=dn.resolve(e,n),l;try{l=$e(c,r.artifact)}catch(d){let u=d instanceof Error?d.message:String(d);return{collection:n,action:"failed",error:`compile.artifact \u914D\u7F6E\u975E\u6CD5: ${u}`}}try{await bD(l)}catch{let d=`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5168\u90E8\u6210\u529F\uFF0C\u4F46\u672A\u4EA7\u51FA\u58F0\u660E\u7684\u4EA7\u7269: ${r.artifact}\uFF08\u671F\u671B\u4F4D\u7F6E ${dn.relative(e,l)||r.artifact}\uFF09\u3002\u8BF7\u68C0\u67E5 build \u811A\u672C\u662F\u5426\u771F\u7684\u5199\u4E86\u8BE5\u6587\u4EF6\u3002`;return i?.("failed",`\u4EA7\u7269\u7F3A\u5931: ${r.artifact}`),{collection:n,action:"failed",error:d}}return i?.("done",`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210\uFF08${r.build.length} \u6761\u547D\u4EE4\uFF09`),h.info("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210",{collection:n,commands:r.build.length}),{collection:n,action:"compiled"}}a(Cy,"runCustomBuild");function _D(t,e,n){if(n instanceof Mr)return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u8D85\u65F6\uFF08collection=${t}\uFF09: ${e}\uFF08\u53EF\u7528 compile.build[].timeout_ms \u8C03\u5927\uFF09`;let r=n instanceof Error?n.message:String(n);return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u6267\u884C\u5931\u8D25\uFF08collection=${t}\uFF09: ${e} \u2014 ${r}`}a(_D,"toBuildError");async function AD(t,e,n){let r=[];for(let o of e){let i=qt(t,o.collection);n?.({collection:o.collection,index:0,total:0,phase:"ingest",detail:o.source});try{let s=await hr({url:o.source,outputDir:i});if("totalDocs"in s){let c=`${s.successCount} \u65B0\u589E/\u66F4\u65B0, ${s.skippedCount} \u8DF3\u8FC7, ${s.skippedUnsupported} \u4E0D\u652F\u6301\u683C\u5F0F`;h.info("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5B8C\u6210",{collection:o.collection,source:o.source,...s}),r.push({source:o.source,collection:o.collection,success:!0,detail:c})}else s.success?(h.info("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5B8C\u6210",{collection:o.collection,source:o.source,title:s.title}),r.push({source:o.source,collection:o.collection,success:!0,detail:s.title})):(h.warn("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5931\u8D25",{collection:o.collection,source:o.source,error:s.error}),r.push({source:o.source,collection:o.collection,success:!1,detail:s.error}))}catch(s){let c=s instanceof Error?s.message:String(s);h.warn("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5F02\u5E38",{collection:o.collection,source:o.source,error:c}),r.push({source:o.source,collection:o.collection,success:!1,detail:c})}}return r}a(AD,"ingestRemoteSources");function ED(t){return typeof t=="string"?{collection:t}:t}a(ED,"normalizeEntry");function Ft(t){return(t.compile?.build?.length??0)>0}a(Ft,"isCustomCompile");async function un(t){let{configDir:e,force:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,batchSize:c,bins:l,onProgress:d}=t,u=t.collections.map(ED),f=[];for(let m of u)typeof m.source=="string"&&m.source.length>0&&f.push({source:m.source,collection:m.collection});f.length>0&&await AD(e,f,d);let p=[],g=u.length;for(let[m,y]of u.entries()){let w=y.collection;if(Ft(y)){let T=await Cy({configDir:e,collection:w,compile:y.compile,...l?{bins:l}:{},onProgress:a((_,C)=>d?.({collection:w,index:m,total:g,phase:_,detail:C}),"onProgress")});p.push(T);continue}let b=await Ot(qt(e,w)),x=await Fn(e,w),I=At({configDir:e,entry:w}),v=x?.taxonomyHash!==void 0&&x.taxonomyHash!==Gr(I),k=x?.taxonomyIndexHash!==void 0&&x.taxonomyIndexHash!==pi(I);if(!n&&!v&&!k&&!ys(x,b)){d?.({collection:w,index:m,total:g,phase:"skipped",detail:"\u6E90\u672A\u53D8\u66F4"}),p.push({collection:w,action:"skipped"});continue}(v||k)&&h.info("kb","taxonomy \u53D8\u66F4\uFF0C\u6E90\u672A\u53D8\u66F4\u4E5F\u91CD\u65B0\u7F16\u8BD1",{collection:w,scope:v?"structure":"index-only"});let R=await xy({configDir:e,entry:w,...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},...s?{timeoutMsPerFile:s}:{},...c?{batchSize:c}:{},...n?{forceFull:!0}:{},onProgress:a(((T,_)=>d?.({collection:w,index:m,total:g,phase:T,detail:_})),"onProgress")});R.status==="failed"?p.push({collection:w,action:"failed",report:R,...R.error?{error:R.error}:{}}):p.push({collection:w,action:"compiled",report:R})}return p}a(un,"refreshKnowledgeBases");import{access as DD,readdir as $D}from"fs/promises";import PD from"path";async function Ms(t){let{configDir:e,targets:n,workflows:r}=t,o=[];if(n.length===0)return o;let i=null;for(let s of n){let c;try{c=$e(PD.resolve(e,s.collection),s.artifact)}catch(f){let p=f instanceof ue?`\u77E5\u8BC6\u5E93 compile.artifact \u914D\u7F6E\u8D8A\u754C\uFF08${s.collection}: ${s.artifact}\uFF09`:`\u77E5\u8BC6\u5E93 compile.artifact \u89E3\u6790\u5931\u8D25\uFF08${s.collection}\uFF09: ${f instanceof Error?f.message:String(f)}`;o.push({level:"error",message:p,collection:s.collection});continue}let l=!0;try{await DD(c)}catch{l=!1}if(l)continue;i??=await MD(r);let d=[...i.entries()].filter(([,f])=>f.some(p=>s.roleIds.includes(p))).map(([f])=>f),u=`\u77E5\u8BC6\u5E93\u4EA7\u7269\u7F3A\u5931: ${s.collection} \u7684\u7F16\u8BD1\u4EA7\u7269 ${s.artifact} \u4E0D\u5B58\u5728\uFF08\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u4E86 compile.build \u5374\u672A\u4EA7\u51FA artifact\uFF09\u2014\u2014\u8BF7\u5148\u8DD1 setup \u6216 kb compile`;if(d.length===0)o.push({level:"error",message:u,collection:s.collection});else for(let f of d)o.push({level:"error",workflowId:f,message:u,collection:s.collection});h.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u4EA7\u7269\u7F3A\u5931",{collection:s.collection,artifact:s.artifact,consumers:d})}return o}a(Ms,"checkKbCompileArtifacts");async function MD(t){let e=await Promise.all(t.map(async n=>{let r=await OD(n.recipeDir),o=await Promise.all(r.map(async s=>(await $t(n.recipeDir,s)).definition?.meta?.role)),i=new Set;for(let s of o)typeof s=="string"&&s.trim()&&i.add(s.trim());return{id:n.id,roles:[...i]}}));return new Map(e.map(n=>[n.id,n.roles]))}a(MD,"resolveWorkflowRoleBindings");async function OD(t){let e;try{e=await $D(t)}catch{return[]}let n=new Set;for(let r of e){let o=r.match(/^(.+)\.recipe\.(?:ts|js)$/);o&&n.add(o[1])}return[...n]}a(OD,"listRecipeIds");var WD=/^\$\{globalVar\.[^}]+\}$/,BD=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function zD(t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:typeof t=="object"?Object.keys(t).length===0:!1}a(zD,"isKbValidateValueEmpty");function UD(t,e){if(!t)return{found:!1,reason:"missing"};let n=e.split(".").filter(o=>o.length>0);if(n.length===0)return{found:!1,reason:"invalid_path"};let r=t;for(let o of n){if(r===null||typeof r!="object"||Array.isArray(r))return{found:!1,reason:"invalid_path"};let i=r;if(!(o in i))return{found:!1,reason:"missing"};r=i[o]}return{found:!0,value:r}}a(UD,"getKbCustomByPath");function Ty(t,e,n,r){Array.isArray(r)&&r.forEach((o,i)=>{let s=Gc.safeParse(o);!s.success||typeof s.data=="string"||s.data.compile&&t.push({roleId:e,file:n,index:i,entry:s.data})})}a(Ty,"pushParsedEntries");function _y(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t.knowledge_scope;if(!(!e||typeof e!="object"||Array.isArray(e)))return e.kb_collections}a(_y,"rawKbCollectionsOf");function KD(t,e,n){let r=[];if(e?.roles){for(let[i,s]of Object.entries(e.roles))Ty(r,i,"profile/profile.yml",_y(s));return r}let o;try{o=FD(n)}catch{return r}for(let i of o.sort()){if(!i.endsWith(".role.yml"))continue;let s;try{s=LD.parse(ND(jD.join(n,i),"utf8"))}catch{continue}let c=s&&typeof s=="object"&&typeof s.id=="string"?s.id:i.replace(/\.role\.yml$/,"");Ty(r,c,`roles/${i}`,_y(s))}return r}a(KD,"collectEntryContexts");function Dy(t){return[...t.file==="profile/profile.yml"?["roles",t.roleId,"knowledge_scope","kb_collections",t.index]:["knowledge_scope","kb_collections",t.index],"compile","custom"]}a(Dy,"yamlPathPrefixFor");function Ay(t,e){let n=e.split(".").filter(r=>r.length>0);return{type:"yaml",file:t.file,yamlPath:[...Dy(t),...n],valueType:"string"}}a(Ay,"yamlWriteTargetFor");function $y(t,e,n,r,o,i){if(n==null||r&&i.has(r))return;let s=typeof n=="string"||typeof n=="number"||typeof n=="boolean",c=Array.isArray(n)&&n.every(u=>typeof u=="string");if(!s&&!c){if(Array.isArray(n))return;for(let[u,f]of Object.entries(n))$y(t,e,f,r?`${r}.${u}`:u,[...o,u],i);return}let l={type:"yaml",file:e.file,yamlPath:[...Dy(e),...o],...c?{valueType:"string[]"}:{valueType:"string"}},d=`kb_compile.${e.roleId}.${e.entry.collection}.custom.${r}`;t.push({key:d,status:"ok",value:n,writeTarget:l,surface:{key:d,label:`${e.entry.collection} \xB7 ${r}`,description:`\u77E5\u8BC6\u5E93 ${e.entry.collection} \u79C1\u6709\u914D\u7F6E compile.custom.${r}\uFF08\u53EF\u7559\u7A7A\uFF09`,owner:"framework",source:"project",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"none",valueType:c?"string[]":"string",writeTarget:l}})}a($y,"pushCustomLeafItems");function Ey(t,e,n){return{key:t.key,label:`\u77E5\u8BC6\u5E93 ${t.collection} \xB7 ${t.dotPath}`,description:`\u77E5\u8BC6\u5E93 ${t.collection} \u7684\u5FC5\u586B\u914D\u7F6E compile.custom.${t.dotPath}`+(n?"\uFF08\u5F53\u524D\u5F15\u7528\u4E86\u672A\u8BBE\u7F6E\u7684\u73AF\u5883\u53D8\u91CF\uFF0C\u586B\u5199\u540E\u5199\u5165 .env\uFF09":"\uFF08\u5199\u5165 profile \u7684 compile.custom\uFF09"),owner:n?"env":"framework",source:n?"env":"project",required:!0,editable:!0,allowEmpty:!1,defaultStrategy:"none",valueType:"string",writeTarget:e}}a(Ey,"validateSurface");async function Py(t){let{configDir:e,profileConfig:n,rolesDir:r,workflowEntries:o}=t,i=KD(e,n,r);if(i.length===0)return null;let s=[],c=a(y=>`kb_compile.${y.roleId}.${y.entry.collection}`,"keyPrefixOf"),l=new Map,d=a((y,w)=>{let b=l.get(y);b||l.set(y,b=new Set),b.add(w)},"rememberEmitted");for(let y of i){let w=y.entry.compile;for(let b of w.validate){let x=`${c(y)}.validate.${b}`,I=UD(w.custom,b);if(!I.found){let R=Ay(y,b),T=I.reason==="invalid_path"?"validate \u8DEF\u5F84\u4E2D\u9014\u7A7F\u8FC7\u6807\u91CF/\u6570\u7EC4\uFF0C\u4E0E compile.custom \u7684\u5B9E\u9645\u7ED3\u6784\u4E0D\u5339\u914D\uFF08\u586B\u5199\u5C06\u6309 validate \u8DEF\u5F84\u91CD\u5EFA\u7ED3\u6784\uFF09":"compile.custom \u4E2D\u4E0D\u5B58\u5728\u8BE5\u8DEF\u5F84\uFF08\u586B\u5199\u540E\u81EA\u52A8\u521B\u5EFA\uFF09";s.push({key:x,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: validate \u767B\u8BB0\u7684\u5FC5\u586B\u8DEF\u5F84\u300C${b}\u300D\u65E0\u6CD5\u53D6\u503C \u2014\u2014 ${T}`,writeTarget:R,surface:Ey({key:x,collection:y.entry.collection,dotPath:b},R,!1)}),d(y,b);continue}let v=I.value;if(typeof v=="string"&&WD.test(v))continue;let k=typeof v=="string"?v.match(BD):null;if(k||zD(v)){let R=k?{type:"env",file:".env",envKey:k[1]}:Ay(y,b);s.push({key:x,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: \u5FC5\u586B\u503C\u4E3A\u7A7A compile.custom.${b}`+(k?`\uFF08\u5F15\u7528\u7684\u73AF\u5883\u53D8\u91CF\u672A\u8BBE\u7F6E: ${v}\uFF0C\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\u5199\u5165 .env\uFF0C\u6216\u76F4\u63A5\u5728\u73AF\u5883\u4E2D\u914D\u7F6E\uFF09`:"\uFF08\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\uFF0C\u5199\u5165 profile \u7684 compile.custom\uFF09"),writeTarget:R,surface:Ey({key:x,collection:y.entry.collection,dotPath:b},R,!!k)}),d(y,b)}}}for(let y of i)$y(s,y,y.entry.compile.custom??{},"",[],l.get(y)??new Set);let u=new Map;for(let y of i){let w=u.get(y.entry.collection);w?w.roleIds.push(y.roleId):u.set(y.entry.collection,{collection:y.entry.collection,compile:y.entry.compile,roleIds:[y.roleId]})}let f=[...u.values()],p=f.filter(Ft).map(y=>({collection:y.collection,artifact:y.compile.artifact,roleIds:y.roleIds})),g=await Ms({configDir:e,targets:p,workflows:o.map(y=>({id:y.id,recipeDir:y.recipeDir}))}),m=new Map(f.map(y=>[y.collection,y.roleIds[0]??""]));for(let y of g)s.push({key:`kb_compile.${m.get(y.collection)??""}.artifact.${s.length}`,status:"warn",message:(y.workflowId?`[${y.workflowId}] `:"")+`\u7F16\u8BD1\u4EA7\u7269\u5C1A\u672A\u751F\u6210: ${y.message.replace(/^知识库产物缺失: /,"")}\uFF08config \u9636\u6BB5\u672A\u7F16\u8BD1\u5C5E\u9884\u671F\uFF1Bsetup \u7684 KB \u9636\u6BB5\u4F1A\u7F16\u8BD1\u4EA7\u51FA\uFF0C\u82E5 setup \u540E\u4ECD\u7F3A\u5931\uFF0Crun \u542F\u52A8\u5C06\u963B\u65AD\u5BF9\u5E94\u5DE5\u4F5C\u6D41\uFF09`});for(let y of f){let w=`kb_compile.${y.roleIds[0]??""}.${y.collection}.`;s.some(x=>x.status==="error"&&x.key.startsWith(w))||s.push({key:`kb_compile.${y.roleIds[0]??""}.${y.collection}`,status:"ok",message:`\u77E5\u8BC6\u5E93 ${y.collection}: \u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u5B8C\u6574\uFF08${y.compile.build.length} \u6761 build \u547D\u4EE4\uFF0Cvalidate ${y.compile.validate.length} \u9879\u901A\u8FC7\uFF09`})}return{id:"profile",name:"\u77E5\u8BC6\u5E93\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E",ok:!s.some(y=>y.status==="error"),items:s}}a(Py,"checkKbCompile");async function Fs(t){let e=await Ue(t.configPath),n=Wn.dirname(e),r;try{r=await Os(e,"utf8")}catch(W){return qD(t.configPath,`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6: ${W instanceof Error?W.message:String(W)}`)}let o=VD(r),i=await Hi(n);Pn();let s=null,c=null;try{s=lt(n,i,{lenientEnv:!0})}catch(W){c=W instanceof Error?W.message:String(W)}let l="",d=ul(n);if(d)try{l=await Os(Wn.resolve(d,"profile","profile.yml"),"utf8")}catch{}let u=null,f=null;try{u=await je(t.configPath)}catch(W){f=W instanceof Error?W.message:String(W)}let p=[];u?p=u.workflowEntries:p=GD(n,r),t.workflowId&&(p=p.filter(W=>W.id===t.workflowId));let g=[];for(let W of p)try{let P=await Os(W.templatePath,"utf8");g.push({id:W.id,text:P})}catch{}let m=[];u?(m.push(Im(u,{rawScene:o})),m.push(await Tm(u,{engineExplicitlySet:HD(r)}))):m.push({id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!1,items:[{key:"config",status:"error",message:`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25: ${f}`}]}),m.push(await Tl(p,n,s)),c&&m.push({id:"profile",name:"Profile \u914D\u7F6E",ok:!1,items:[{key:"profile.yml",status:"error",message:`profile \u52A0\u8F7D\u5931\u8D25: ${c}`}]});let y=u?u.rolesDir:Wn.resolve(n,"./roles"),w=u?u.roles.enabled:!0;m.push(await hh(y,w,n,s));let b=await ho(n);b.present&&m.push(Pl(b));let x=await Py({configDir:n,profileConfig:s,rolesDir:y,workflowEntries:p});x&&m.push(x);let I=go([r,l,...g.map(W=>W.text)]),v="";try{v=await Os(Wn.resolve(n,".env.example"),"utf8")}catch{}let k=l?[...g,{id:"__profile__",text:l}]:g,R=vh(r,g,l),T=new Map;for(let[W,P]of R){let O;if(P.kind==="toolkit"){let z=Zt.find(G=>G.name===P.toolkit);O=(z?on(z.configSchema):null)?.[P.field]}else{let z=tr(P.sourceType);O=(z?on(z.configSchema):null)?.[P.field]}if(!O)continue;let q=$l(O);q&&T.set(W,q)}m.push(Dl(r,k,i,v,I,T)),m.push(JD(r,l,g,p,i));let _=m.reduce((W,P)=>W+P.items.filter(O=>O.status==="error").length,0),C=m.reduce((W,P)=>W+P.items.filter(O=>O.status==="warn").length,0),E=m.reduce((W,P)=>W+P.items.filter(O=>O.status==="suggestion").length,0),F=m.filter(W=>W.ok).length;return{projectPath:t.configPath,ok:m.every(W=>W.ok),modules:m,summary:{totalModules:m.length,passedModules:F,errors:_,warnings:C,suggestions:E}}}a(Fs,"runCheck");function VD(t){try{let e=js.parse(t);return S(e)&&typeof e.scene=="string"?e.scene:void 0}catch{return}}a(VD,"readRawProjectScene");function qD(t,e){return{projectPath:t,ok:!1,modules:[{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!1,items:[{key:"config",status:"error",message:e}]}],summary:{totalModules:1,passedModules:0,errors:1,warnings:0,suggestions:0}}}a(qD,"errorResult");function HD(t){try{let e=js.parse(t);if(!S(e))return!1;let n=e.agent;if(!S(n))return!1;let r=n.engine;return typeof r=="string"&&r.trim().length>0}catch{return!1}}a(HD,"isEngineExplicitlySet");function GD(t,e){try{let n=js.parse(e);if(!S(n))return[];if(S(n.workflow)){let r=n.workflow.template,o=n.workflow.recipe_dir??"./recipes";if(typeof r=="string")return[{id:"default",templatePath:Wn.resolve(t,r),recipeDir:Wn.resolve(t,String(o))}]}if(S(n.workflows)&&typeof n.workflows.dir=="string")return[]}catch{}return[]}a(GD,"inferWorkflowEntries");function JD(t,e,n,r,o){let i={id:"ai_toolkit",name:"AI Toolkit \u51ED\u636E",ok:!0,items:[]},c=[t,e,...n.map(f=>f.text)].some(f=>/\btoolkit\.ai\b|\btoolkit_config:\s*\n\s*ai:|\btoolkit_config\.ai\b/.test(f)),l=!1;for(let f of r)try{let p=My.readdirSync(f.recipeDir);for(let g of p){if(!g.endsWith(".recipe.ts"))continue;let m=My.readFileSync(Wn.join(f.recipeDir,g),"utf8");if(/\btoolkit\.ai\b|\bctx\.toolkit\.ai\b/.test(m)){l=!0;break}}if(l)break}catch{}if(!c&&!l)return i;let d=!1,u;try{let f=js.parse(t),p=S(f)?f.recipe:void 0,g=S(p)?p.llm:void 0,m=S(g)?g.api_key:void 0;if(typeof m=="string"&&m.length>0){let y=m.match(/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/);if(y){let w=y[1];if(w){u=w;let b=o[w];d=typeof b=="string"&&b.length>0}else d=!0}else d=!0}}catch{}return d?(i.items.push({key:"recipe.llm.api_key",status:"ok",message:"AI Toolkit \u5DF2\u914D\u7F6E LLM API Key"}),i):(i.items.push({key:"recipe.llm.api_key",status:"suggestion",message:["\u672C\u9879\u76EE\u7528\u5230\u4E86 toolkit.ai(LLM \u5BF9\u8BDD/\u5206\u7C7B),\u4F46 recipe.llm.api_key \u672A\u914D\u7F6E\u3002","\u8FD0\u884C\u65F6\u8C03\u7528 chat()/chatJSON()/classify() \u4F1A\u629B\u9519\u3002","","\u4E24\u79CD\u89E3\u6CD5,\u4E8C\u9009\u4E00:",` 1. \u63D0\u4F9B LLM API Key:${u?`\u5728 .env \u4E2D\u586B\u5199 ${u}=...`:"\u5728 aitable-workflow.config.yml \u7684 recipe.llm.api_key \u7528 ${env.XXX} \u6CE8\u5165 .env \u53D8\u91CF"}`," 2. \u6539\u7528 toolkit.coding(\u7F16\u7A0B Agent)\u515C\u5E95:\u9002\u5408\u9700\u8981\u771F\u63A8\u7406\u7684\u590D\u6742\u4EFB\u52A1;\u9700\u6539 recipe \u4EE3\u7801\u628A toolkit.ai.chat \u6362\u6210 toolkit.coding.run\u3002"].join(`
461
+ ${m}`:"");return h.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5931\u8D25",{collection:n,bin:u.bin,exitCode:g.exitCode}),i?.("failed",`${f} \u9000\u51FA\u7801 ${g.exitCode}`),{collection:n,action:"failed",error:y}}}let c=dn.resolve(e,n),l;try{l=$e(c,r.artifact)}catch(d){let u=d instanceof Error?d.message:String(d);return{collection:n,action:"failed",error:`compile.artifact \u914D\u7F6E\u975E\u6CD5: ${u}`}}try{await bD(l)}catch{let d=`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5168\u90E8\u6210\u529F\uFF0C\u4F46\u672A\u4EA7\u51FA\u58F0\u660E\u7684\u4EA7\u7269: ${r.artifact}\uFF08\u671F\u671B\u4F4D\u7F6E ${dn.relative(e,l)||r.artifact}\uFF09\u3002\u8BF7\u68C0\u67E5 build \u811A\u672C\u662F\u5426\u771F\u7684\u5199\u4E86\u8BE5\u6587\u4EF6\u3002`;return i?.("failed",`\u4EA7\u7269\u7F3A\u5931: ${r.artifact}`),{collection:n,action:"failed",error:d}}return i?.("done",`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210\uFF08${r.build.length} \u6761\u547D\u4EE4\uFF09`),h.info("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210",{collection:n,commands:r.build.length}),{collection:n,action:"compiled"}}a(Cy,"runCustomBuild");function _D(t,e,n){if(n instanceof Mr)return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u8D85\u65F6\uFF08collection=${t}\uFF09: ${e}\uFF08\u53EF\u7528 compile.build[].timeout_ms \u8C03\u5927\uFF09`;let r=n instanceof Error?n.message:String(n);return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u6267\u884C\u5931\u8D25\uFF08collection=${t}\uFF09: ${e} \u2014 ${r}`}a(_D,"toBuildError");async function AD(t,e,n){let r=[];for(let o of e){let i=qt(t,o.collection);n?.({collection:o.collection,index:0,total:0,phase:"ingest",detail:o.source});try{let s=await hr({url:o.source,outputDir:i});if("totalDocs"in s){let c=`${s.successCount} \u65B0\u589E/\u66F4\u65B0, ${s.skippedCount} \u8DF3\u8FC7, ${s.skippedUnsupported} \u4E0D\u652F\u6301\u683C\u5F0F`;h.info("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5B8C\u6210",{collection:o.collection,source:o.source,...s}),r.push({source:o.source,collection:o.collection,success:!0,detail:c})}else s.success?(h.info("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5B8C\u6210",{collection:o.collection,source:o.source,title:s.title}),r.push({source:o.source,collection:o.collection,success:!0,detail:s.title})):(h.warn("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5931\u8D25",{collection:o.collection,source:o.source,error:s.error}),r.push({source:o.source,collection:o.collection,success:!1,detail:s.error}))}catch(s){let c=s instanceof Error?s.message:String(s);h.warn("kb","\u8FDC\u7A0B\u6E90\u5BFC\u5165\u5F02\u5E38",{collection:o.collection,source:o.source,error:c}),r.push({source:o.source,collection:o.collection,success:!1,detail:c})}}return r}a(AD,"ingestRemoteSources");function ED(t){return typeof t=="string"?{collection:t}:t}a(ED,"normalizeEntry");function Ft(t){return(t.compile?.build?.length??0)>0}a(Ft,"isCustomCompile");async function un(t){let{configDir:e,force:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,batchSize:c,bins:l,onProgress:d}=t,u=t.collections.map(ED),f=[];for(let m of u)typeof m.source=="string"&&m.source.length>0&&f.push({source:m.source,collection:m.collection});f.length>0&&await AD(e,f,d);let p=[],g=u.length;for(let[m,y]of u.entries()){let w=y.collection;if(Ft(y)){let T=await Cy({configDir:e,collection:w,compile:y.compile,...l?{bins:l}:{},onProgress:a((_,C)=>d?.({collection:w,index:m,total:g,phase:_,detail:C}),"onProgress")});p.push(T);continue}let b=await Ot(qt(e,w)),x=await Fn(e,w),I=At({configDir:e,entry:w}),S=x?.taxonomyHash!==void 0&&x.taxonomyHash!==Gr(I),k=x?.taxonomyIndexHash!==void 0&&x.taxonomyIndexHash!==pi(I);if(!n&&!S&&!k&&!ys(x,b)){d?.({collection:w,index:m,total:g,phase:"skipped",detail:"\u6E90\u672A\u53D8\u66F4"}),p.push({collection:w,action:"skipped"});continue}(S||k)&&h.info("kb","taxonomy \u53D8\u66F4\uFF0C\u6E90\u672A\u53D8\u66F4\u4E5F\u91CD\u65B0\u7F16\u8BD1",{collection:w,scope:S?"structure":"index-only"});let R=await xy({configDir:e,entry:w,...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},...s?{timeoutMsPerFile:s}:{},...c?{batchSize:c}:{},...n?{forceFull:!0}:{},onProgress:a(((T,_)=>d?.({collection:w,index:m,total:g,phase:T,detail:_})),"onProgress")});R.status==="failed"?p.push({collection:w,action:"failed",report:R,...R.error?{error:R.error}:{}}):p.push({collection:w,action:"compiled",report:R})}return p}a(un,"refreshKnowledgeBases");import{access as DD,readdir as $D}from"fs/promises";import PD from"path";async function Ms(t){let{configDir:e,targets:n,workflows:r}=t,o=[];if(n.length===0)return o;let i=null;for(let s of n){let c;try{c=$e(PD.resolve(e,s.collection),s.artifact)}catch(f){let p=f instanceof ue?`\u77E5\u8BC6\u5E93 compile.artifact \u914D\u7F6E\u8D8A\u754C\uFF08${s.collection}: ${s.artifact}\uFF09`:`\u77E5\u8BC6\u5E93 compile.artifact \u89E3\u6790\u5931\u8D25\uFF08${s.collection}\uFF09: ${f instanceof Error?f.message:String(f)}`;o.push({level:"error",message:p,collection:s.collection});continue}let l=!0;try{await DD(c)}catch{l=!1}if(l)continue;i??=await MD(r);let d=[...i.entries()].filter(([,f])=>f.some(p=>s.roleIds.includes(p))).map(([f])=>f),u=`\u77E5\u8BC6\u5E93\u4EA7\u7269\u7F3A\u5931: ${s.collection} \u7684\u7F16\u8BD1\u4EA7\u7269 ${s.artifact} \u4E0D\u5B58\u5728\uFF08\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u4E86 compile.build \u5374\u672A\u4EA7\u51FA artifact\uFF09\u2014\u2014\u8BF7\u5148\u8DD1 setup \u6216 kb compile`;if(d.length===0)o.push({level:"error",message:u,collection:s.collection});else for(let f of d)o.push({level:"error",workflowId:f,message:u,collection:s.collection});h.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u4EA7\u7269\u7F3A\u5931",{collection:s.collection,artifact:s.artifact,consumers:d})}return o}a(Ms,"checkKbCompileArtifacts");async function MD(t){let e=await Promise.all(t.map(async n=>{let r=await OD(n.recipeDir),o=await Promise.all(r.map(async s=>(await $t(n.recipeDir,s)).definition?.meta?.role)),i=new Set;for(let s of o)typeof s=="string"&&s.trim()&&i.add(s.trim());return{id:n.id,roles:[...i]}}));return new Map(e.map(n=>[n.id,n.roles]))}a(MD,"resolveWorkflowRoleBindings");async function OD(t){let e;try{e=await $D(t)}catch{return[]}let n=new Set;for(let r of e){let o=r.match(/^(.+)\.recipe\.(?:ts|js)$/);o&&n.add(o[1])}return[...n]}a(OD,"listRecipeIds");var WD=/^\$\{globalVar\.[^}]+\}$/,BD=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function zD(t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:typeof t=="object"?Object.keys(t).length===0:!1}a(zD,"isKbValidateValueEmpty");function UD(t,e){if(!t)return{found:!1,reason:"missing"};let n=e.split(".").filter(o=>o.length>0);if(n.length===0)return{found:!1,reason:"invalid_path"};let r=t;for(let o of n){if(r===null||typeof r!="object"||Array.isArray(r))return{found:!1,reason:"invalid_path"};let i=r;if(!(o in i))return{found:!1,reason:"missing"};r=i[o]}return{found:!0,value:r}}a(UD,"getKbCustomByPath");function Ty(t,e,n,r){Array.isArray(r)&&r.forEach((o,i)=>{let s=Gc.safeParse(o);!s.success||typeof s.data=="string"||s.data.compile&&t.push({roleId:e,file:n,index:i,entry:s.data})})}a(Ty,"pushParsedEntries");function _y(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t.knowledge_scope;if(!(!e||typeof e!="object"||Array.isArray(e)))return e.kb_collections}a(_y,"rawKbCollectionsOf");function KD(t,e,n){let r=[];if(e?.roles){for(let[i,s]of Object.entries(e.roles))Ty(r,i,"profile/profile.yml",_y(s));return r}let o;try{o=FD(n)}catch{return r}for(let i of o.sort()){if(!i.endsWith(".role.yml"))continue;let s;try{s=LD.parse(ND(jD.join(n,i),"utf8"))}catch{continue}let c=s&&typeof s=="object"&&typeof s.id=="string"?s.id:i.replace(/\.role\.yml$/,"");Ty(r,c,`roles/${i}`,_y(s))}return r}a(KD,"collectEntryContexts");function Dy(t){return[...t.file==="profile/profile.yml"?["roles",t.roleId,"knowledge_scope","kb_collections",t.index]:["knowledge_scope","kb_collections",t.index],"compile","custom"]}a(Dy,"yamlPathPrefixFor");function Ay(t,e){let n=e.split(".").filter(r=>r.length>0);return{type:"yaml",file:t.file,yamlPath:[...Dy(t),...n],valueType:"string"}}a(Ay,"yamlWriteTargetFor");function $y(t,e,n,r,o,i){if(n==null||r&&i.has(r))return;let s=typeof n=="string"||typeof n=="number"||typeof n=="boolean",c=Array.isArray(n)&&n.every(u=>typeof u=="string");if(!s&&!c){if(Array.isArray(n))return;for(let[u,f]of Object.entries(n))$y(t,e,f,r?`${r}.${u}`:u,[...o,u],i);return}let l={type:"yaml",file:e.file,yamlPath:[...Dy(e),...o],...c?{valueType:"string[]"}:{valueType:"string"}},d=`kb_compile.${e.roleId}.${e.entry.collection}.custom.${r}`;t.push({key:d,status:"ok",value:n,writeTarget:l,surface:{key:d,label:`${e.entry.collection} \xB7 ${r}`,description:`\u77E5\u8BC6\u5E93 ${e.entry.collection} \u79C1\u6709\u914D\u7F6E compile.custom.${r}\uFF08\u53EF\u7559\u7A7A\uFF09`,owner:"framework",source:"project",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"none",valueType:c?"string[]":"string",writeTarget:l}})}a($y,"pushCustomLeafItems");function Ey(t,e,n){return{key:t.key,label:`\u77E5\u8BC6\u5E93 ${t.collection} \xB7 ${t.dotPath}`,description:`\u77E5\u8BC6\u5E93 ${t.collection} \u7684\u5FC5\u586B\u914D\u7F6E compile.custom.${t.dotPath}`+(n?"\uFF08\u5F53\u524D\u5F15\u7528\u4E86\u672A\u8BBE\u7F6E\u7684\u73AF\u5883\u53D8\u91CF\uFF0C\u586B\u5199\u540E\u5199\u5165 .env\uFF09":"\uFF08\u5199\u5165 profile \u7684 compile.custom\uFF09"),owner:n?"env":"framework",source:n?"env":"project",required:!0,editable:!0,allowEmpty:!1,defaultStrategy:"none",valueType:"string",writeTarget:e}}a(Ey,"validateSurface");async function Py(t){let{configDir:e,profileConfig:n,rolesDir:r,workflowEntries:o}=t,i=KD(e,n,r);if(i.length===0)return null;let s=[],c=a(y=>`kb_compile.${y.roleId}.${y.entry.collection}`,"keyPrefixOf"),l=new Map,d=a((y,w)=>{let b=l.get(y);b||l.set(y,b=new Set),b.add(w)},"rememberEmitted");for(let y of i){let w=y.entry.compile;for(let b of w.validate){let x=`${c(y)}.validate.${b}`,I=UD(w.custom,b);if(!I.found){let R=Ay(y,b),T=I.reason==="invalid_path"?"validate \u8DEF\u5F84\u4E2D\u9014\u7A7F\u8FC7\u6807\u91CF/\u6570\u7EC4\uFF0C\u4E0E compile.custom \u7684\u5B9E\u9645\u7ED3\u6784\u4E0D\u5339\u914D\uFF08\u586B\u5199\u5C06\u6309 validate \u8DEF\u5F84\u91CD\u5EFA\u7ED3\u6784\uFF09":"compile.custom \u4E2D\u4E0D\u5B58\u5728\u8BE5\u8DEF\u5F84\uFF08\u586B\u5199\u540E\u81EA\u52A8\u521B\u5EFA\uFF09";s.push({key:x,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: validate \u767B\u8BB0\u7684\u5FC5\u586B\u8DEF\u5F84\u300C${b}\u300D\u65E0\u6CD5\u53D6\u503C \u2014\u2014 ${T}`,writeTarget:R,surface:Ey({key:x,collection:y.entry.collection,dotPath:b},R,!1)}),d(y,b);continue}let S=I.value;if(typeof S=="string"&&WD.test(S))continue;let k=typeof S=="string"?S.match(BD):null;if(k||zD(S)){let R=k?{type:"env",file:".env",envKey:k[1]}:Ay(y,b);s.push({key:x,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: \u5FC5\u586B\u503C\u4E3A\u7A7A compile.custom.${b}`+(k?`\uFF08\u5F15\u7528\u7684\u73AF\u5883\u53D8\u91CF\u672A\u8BBE\u7F6E: ${S}\uFF0C\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\u5199\u5165 .env\uFF0C\u6216\u76F4\u63A5\u5728\u73AF\u5883\u4E2D\u914D\u7F6E\uFF09`:"\uFF08\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\uFF0C\u5199\u5165 profile \u7684 compile.custom\uFF09"),writeTarget:R,surface:Ey({key:x,collection:y.entry.collection,dotPath:b},R,!!k)}),d(y,b)}}}for(let y of i)$y(s,y,y.entry.compile.custom??{},"",[],l.get(y)??new Set);let u=new Map;for(let y of i){let w=u.get(y.entry.collection);w?w.roleIds.push(y.roleId):u.set(y.entry.collection,{collection:y.entry.collection,compile:y.entry.compile,roleIds:[y.roleId]})}let f=[...u.values()],p=f.filter(Ft).map(y=>({collection:y.collection,artifact:y.compile.artifact,roleIds:y.roleIds})),g=await Ms({configDir:e,targets:p,workflows:o.map(y=>({id:y.id,recipeDir:y.recipeDir}))}),m=new Map(f.map(y=>[y.collection,y.roleIds[0]??""]));for(let y of g)s.push({key:`kb_compile.${m.get(y.collection)??""}.artifact.${s.length}`,status:"warn",message:(y.workflowId?`[${y.workflowId}] `:"")+`\u7F16\u8BD1\u4EA7\u7269\u5C1A\u672A\u751F\u6210: ${y.message.replace(/^知识库产物缺失: /,"")}\uFF08config \u9636\u6BB5\u672A\u7F16\u8BD1\u5C5E\u9884\u671F\uFF1Bsetup \u7684 KB \u9636\u6BB5\u4F1A\u7F16\u8BD1\u4EA7\u51FA\uFF0C\u82E5 setup \u540E\u4ECD\u7F3A\u5931\uFF0Crun \u542F\u52A8\u5C06\u963B\u65AD\u5BF9\u5E94\u5DE5\u4F5C\u6D41\uFF09`});for(let y of f){let w=`kb_compile.${y.roleIds[0]??""}.${y.collection}.`;s.some(x=>x.status==="error"&&x.key.startsWith(w))||s.push({key:`kb_compile.${y.roleIds[0]??""}.${y.collection}`,status:"ok",message:`\u77E5\u8BC6\u5E93 ${y.collection}: \u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u5B8C\u6574\uFF08${y.compile.build.length} \u6761 build \u547D\u4EE4\uFF0Cvalidate ${y.compile.validate.length} \u9879\u901A\u8FC7\uFF09`})}return{id:"profile",name:"\u77E5\u8BC6\u5E93\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E",ok:!s.some(y=>y.status==="error"),items:s}}a(Py,"checkKbCompile");async function Fs(t){let e=await Ue(t.configPath),n=Wn.dirname(e),r;try{r=await Os(e,"utf8")}catch(W){return qD(t.configPath,`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6: ${W instanceof Error?W.message:String(W)}`)}let o=VD(r),i=await Hi(n);Pn();let s=null,c=null;try{s=lt(n,i,{lenientEnv:!0})}catch(W){c=W instanceof Error?W.message:String(W)}let l="",d=ul(n);if(d)try{l=await Os(Wn.resolve(d,"profile","profile.yml"),"utf8")}catch{}let u=null,f=null;try{u=await je(t.configPath)}catch(W){f=W instanceof Error?W.message:String(W)}let p=[];u?p=u.workflowEntries:p=GD(n,r),t.workflowId&&(p=p.filter(W=>W.id===t.workflowId));let g=[];for(let W of p)try{let P=await Os(W.templatePath,"utf8");g.push({id:W.id,text:P})}catch{}let m=[];u?(m.push(Im(u,{rawScene:o})),m.push(await Tm(u,{engineExplicitlySet:HD(r)}))):m.push({id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!1,items:[{key:"config",status:"error",message:`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25: ${f}`}]}),m.push(await Tl(p,n,s)),c&&m.push({id:"profile",name:"Profile \u914D\u7F6E",ok:!1,items:[{key:"profile.yml",status:"error",message:`profile \u52A0\u8F7D\u5931\u8D25: ${c}`}]});let y=u?u.rolesDir:Wn.resolve(n,"./roles"),w=u?u.roles.enabled:!0;m.push(await hh(y,w,n,s));let b=await ho(n);b.present&&m.push(Pl(b));let x=await Py({configDir:n,profileConfig:s,rolesDir:y,workflowEntries:p});x&&m.push(x);let I=go([r,l,...g.map(W=>W.text)]),S="";try{S=await Os(Wn.resolve(n,".env.example"),"utf8")}catch{}let k=l?[...g,{id:"__profile__",text:l}]:g,R=vh(r,g,l),T=new Map;for(let[W,P]of R){let O;if(P.kind==="toolkit"){let z=Zt.find(G=>G.name===P.toolkit);O=(z?on(z.configSchema):null)?.[P.field]}else{let z=tr(P.sourceType);O=(z?on(z.configSchema):null)?.[P.field]}if(!O)continue;let q=$l(O);q&&T.set(W,q)}m.push(Dl(r,k,i,S,I,T)),m.push(JD(r,l,g,p,i));let _=m.reduce((W,P)=>W+P.items.filter(O=>O.status==="error").length,0),C=m.reduce((W,P)=>W+P.items.filter(O=>O.status==="warn").length,0),E=m.reduce((W,P)=>W+P.items.filter(O=>O.status==="suggestion").length,0),F=m.filter(W=>W.ok).length;return{projectPath:t.configPath,ok:m.every(W=>W.ok),modules:m,summary:{totalModules:m.length,passedModules:F,errors:_,warnings:C,suggestions:E}}}a(Fs,"runCheck");function VD(t){try{let e=js.parse(t);return v(e)&&typeof e.scene=="string"?e.scene:void 0}catch{return}}a(VD,"readRawProjectScene");function qD(t,e){return{projectPath:t,ok:!1,modules:[{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!1,items:[{key:"config",status:"error",message:e}]}],summary:{totalModules:1,passedModules:0,errors:1,warnings:0,suggestions:0}}}a(qD,"errorResult");function HD(t){try{let e=js.parse(t);if(!v(e))return!1;let n=e.agent;if(!v(n))return!1;let r=n.engine;return typeof r=="string"&&r.trim().length>0}catch{return!1}}a(HD,"isEngineExplicitlySet");function GD(t,e){try{let n=js.parse(e);if(!v(n))return[];if(v(n.workflow)){let r=n.workflow.template,o=n.workflow.recipe_dir??"./recipes";if(typeof r=="string")return[{id:"default",templatePath:Wn.resolve(t,r),recipeDir:Wn.resolve(t,String(o))}]}if(v(n.workflows)&&typeof n.workflows.dir=="string")return[]}catch{}return[]}a(GD,"inferWorkflowEntries");function JD(t,e,n,r,o){let i={id:"ai_toolkit",name:"AI Toolkit \u51ED\u636E",ok:!0,items:[]},c=[t,e,...n.map(f=>f.text)].some(f=>/\btoolkit\.ai\b|\btoolkit_config:\s*\n\s*ai:|\btoolkit_config\.ai\b/.test(f)),l=!1;for(let f of r)try{let p=My.readdirSync(f.recipeDir);for(let g of p){if(!g.endsWith(".recipe.ts"))continue;let m=My.readFileSync(Wn.join(f.recipeDir,g),"utf8");if(/\btoolkit\.ai\b|\bctx\.toolkit\.ai\b/.test(m)){l=!0;break}}if(l)break}catch{}if(!c&&!l)return i;let d=!1,u;try{let f=js.parse(t),p=v(f)?f.recipe:void 0,g=v(p)?p.llm:void 0,m=v(g)?g.api_key:void 0;if(typeof m=="string"&&m.length>0){let y=m.match(/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/);if(y){let w=y[1];if(w){u=w;let b=o[w];d=typeof b=="string"&&b.length>0}else d=!0}else d=!0}}catch{}return d?(i.items.push({key:"recipe.llm.api_key",status:"ok",message:"AI Toolkit \u5DF2\u914D\u7F6E LLM API Key"}),i):(i.items.push({key:"recipe.llm.api_key",status:"suggestion",message:["\u672C\u9879\u76EE\u7528\u5230\u4E86 toolkit.ai(LLM \u5BF9\u8BDD/\u5206\u7C7B),\u4F46 recipe.llm.api_key \u672A\u914D\u7F6E\u3002","\u8FD0\u884C\u65F6\u8C03\u7528 chat()/chatJSON()/classify() \u4F1A\u629B\u9519\u3002","","\u4E24\u79CD\u89E3\u6CD5,\u4E8C\u9009\u4E00:",` 1. \u63D0\u4F9B LLM API Key:${u?`\u5728 .env \u4E2D\u586B\u5199 ${u}=...`:"\u5728 aitable-workflow.config.yml \u7684 recipe.llm.api_key \u7528 ${env.XXX} \u6CE8\u5165 .env \u53D8\u91CF"}`," 2. \u6539\u7528 toolkit.coding(\u7F16\u7A0B Agent)\u515C\u5E95:\u9002\u5408\u9700\u8981\u771F\u63A8\u7406\u7684\u590D\u6742\u4EFB\u52A1;\u9700\u6539 recipe \u4EE3\u7801\u628A toolkit.ai.chat \u6362\u6210 toolkit.coding.run\u3002"].join(`
462
462
  `),sensitive:!0,writeTarget:u?{type:"env",file:".env",envKey:u}:{type:"yaml",file:"aitable-workflow.config.yml",yamlPath:["recipe","llm","api_key"]}}),i)}a(JD,"checkAiToolkit");import{readFile as pd,writeFile as Ls}from"fs/promises";import ZD from"yaml";function jy(t){let e=t.trim();if(e.startsWith("[")){let n;try{n=JSON.parse(e)}catch{throw new Error("string[] \u914D\u7F6E\u503C\u5FC5\u987B\u662F JSON \u5B57\u7B26\u4E32\u6570\u7EC4\uFF0C\u6216\u4F7F\u7528\u9017\u53F7/\u6362\u884C\u5206\u9694\u7684\u6587\u672C")}if(!Array.isArray(n)||!n.every(r=>typeof r=="string"))throw new Error('string[] \u914D\u7F6E\u503C\u5FC5\u987B\u662F JSON \u5B57\u7B26\u4E32\u6570\u7EC4\uFF0C\u4F8B\u5982 ["\u7FA4A","\u7FA4B"]');return n}return t.split(/[\n,]/).map(n=>n.trim()).filter(n=>n.length>0)}a(jy,"coerceStringArray");function Oy(t,e){if(e==="string[]")return jy(t);if(e==="boolean")return t.trim().toLowerCase()==="true";if(e==="number"){let n=Number(t.trim());return Number.isFinite(n)?n:t}return t}a(Oy,"coerceYamlValue");function YD(t,e){let n=t.trim();return e==="boolean"?n.toLowerCase()==="true":e==="string[]"?jy(n):t}a(YD,"coerceJsonValue");async function Ns(t,e,n){let r;try{r=await pd(t,"utf8")}catch{r=""}let o=ZD.parseDocument(r);if(o.errors.length>0){let i=o.errors[0];throw new Error(`YAML \u6587\u4EF6\u89E3\u6790\u5931\u8D25\uFF0C\u62D2\u7EDD\u5199\u5165 ${t}: ${i.message}`)}o.setIn(e,n),await Ls(t,o.toString(),"utf8")}a(Ns,"writeYaml");async function QD(t,e,n){let r;try{r=await pd(t,"utf8")}catch{r=""}if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(e))throw new Error(`\u975E\u6CD5\u7684\u73AF\u5883\u53D8\u91CF\u540D: ${e}`);let o=new RegExp(`^${e$(e)}=.*$`,"m"),i;if(n.includes('"')&&!n.includes("'")&&!/[\r\n]/.test(n))i=`${e}='${n}'`;else{let s=n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r");i=`${e}="${s}"`}o.test(r)?r=r.replace(o,i):r=r.trimEnd()+(r.length>0?`
463
463
  `:"")+i+`
464
464
  `,await Ls(t,r,"utf8")}a(QD,"writeEnvFile");async function gd(t,e,n){let r;try{r=await pd(t,"utf8")}catch{r=""}let o;try{o=r.trim()?JSON.parse(r):{}}catch{throw new Error("JSON \u6587\u4EF6\u89E3\u6790\u5931\u8D25: "+t)}XD(o,e,n),await Ls(t,JSON.stringify(o,null,2)+`
465
465
  `,"utf8")}a(gd,"writeJsonFile");function XD(t,e,n){let r=t;for(let i=0;i<e.length-1;i++){let s=e[i],c=e[i+1];if(typeof s=="number"){if(!Array.isArray(r))throw new Error("JSON \u8DEF\u5F84\u671F\u671B\u6570\u7EC4\u4F46\u5F97\u5230 "+typeof r);r=r[s]}else{if(typeof r!="object"||r===null||Array.isArray(r))throw new Error("JSON \u8DEF\u5F84\u671F\u671B\u5BF9\u8C61\u4F46\u5F97\u5230 "+typeof r);let l=r;l[s]===void 0&&(l[s]=typeof c=="number"?[]:{}),r=l[s]}}let o=e[e.length-1];if(typeof o=="number"){if(!Array.isArray(r))throw new Error("JSON \u8DEF\u5F84\u7EC8\u70B9\u671F\u671B\u6570\u7EC4\u4F46\u5F97\u5230 "+typeof r);r[o]=n}else{if(typeof r!="object"||r===null||Array.isArray(r))throw new Error("JSON \u8DEF\u5F84\u7EC8\u70B9\u671F\u671B\u5BF9\u8C61\u4F46\u5F97\u5230 "+typeof r);r[o]=n}}a(XD,"setInJson");async function md(t,e,n){let r=await import("path");if(t.type==="yaml")await Ns(r.resolve(n,t.file),t.yamlPath,Oy(e,t.valueType));else if(t.type==="yamlAll")for(let o of t.targets)await Ns(r.resolve(n,o.file),o.yamlPath,Oy(e,t.valueType));else t.type==="json"?await gd(r.resolve(n,t.file),t.jsonPath,YD(e,t.valueType)):t.type==="textFile"?await Ls(r.resolve(n,t.file),e.endsWith(`
466
466
  `)?e:e+`
467
- `,"utf8"):await QD(r.resolve(n,t.file),t.envKey,e)}a(md,"writeBack");function e$(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(e$,"escapeRegex");import{readFile as Fy,writeFile as t$,readdir as n$,stat as r$}from"fs/promises";import Ws from"path";import Ny,{isScalar as Bs,visit as o$}from"yaml";var i$=new Set(["baseId","base_id"]),s$=new Set(["tableId","table_id"]);async function hd(t,e){let n;try{n=await Fy(t,"utf8")}catch{return}let r;try{r=Ny.parse(n)}catch{return}let o=r;for(let i of e)if(Array.isArray(o)&&typeof i=="number")o=o[i];else if(S(o))o=o[String(i)];else return;return typeof o=="string"?o:void 0}a(hd,"readYamlValueAt");async function yd(t,e=[]){let n=[...e,Ws.join(t,"aitable-workflow.config.yml"),Ws.join(t,"profile","profile.yml")],r=Ws.join(t,"workflows");try{let i=await n$(r,{withFileTypes:!0});for(let s of i)s.isDirectory()&&n.push(Ws.join(r,s.name,"workflow.yml"))}catch{}let o=[];for(let i of n)try{(await r$(i)).isFile()&&o.push(i)}catch{}return[...new Set(o)]}a(yd,"collectBaseIdCandidateFiles");async function wd(t,e,n){let r=e.trim(),o=n.trim();if(!r||!o||r===o)return{migratedFields:0,clearedTableIds:0,changedFiles:[]};let i=0,s=0,c=[];for(let l of t){let d;try{d=await Fy(l,"utf8")}catch{continue}let u;try{u=Ny.parseDocument(d)}catch{continue}if(u.contents===null)continue;let f=0,p=0;o$(u,{Map(g,m){let y=!1;for(let w of m.items)Bs(w.key)&&i$.has(String(w.key.value))&&Bs(w.value)&&typeof w.value.value=="string"&&w.value.value.trim()===r&&(w.value.value=o,f++,y=!0);if(y)for(let w of m.items)Bs(w.key)&&s$.has(String(w.key.value))&&Bs(w.value)&&typeof w.value.value=="string"&&w.value.value.trim()!==""&&!Qt(w.value.value)&&(w.value.value="",p++)}}),f>0&&(await t$(l,u.toString(),"utf8"),i+=f,s+=p,c.push(l))}return{migratedFields:i,clearedTableIds:s,changedFiles:c}}a(wd,"migrateBaseIdInFiles");import bd from"path";import{writeFile as a$,mkdir as c$,access as l$}from"fs/promises";import zs from"path";function dt(t){switch(t){case"claudecode":return{enabled:!0,cmd:"claude"};case"codex":return{enabled:!0,cmd:"codex",model:"gpt-5.5",permissionMode:"bypassPermissions",mode:"full-auto",ignoreUserConfig:!0};case"qoder":return{enabled:!0,cmd:"qodercli",permissionMode:"bypassPermissions"};case"codebuddy":return{enabled:!0,cmd:"codebuddy"};case"opencode":return{enabled:!0,cmd:"opencode"};case"qwen":return{enabled:!0,cmd:"qwen"};case"deepseek":return{enabled:!0,cmd:"deepseek"};case"trae":return{enabled:!0,cmd:"trae-cli"};default:return{enabled:!0}}}a(dt,"getDefaultAgentEntry");function Ly(t){let e={version:1,agents:{claudecode:t==="claudecode"?dt("claudecode"):{enabled:!1},codex:t==="codex"?dt("codex"):{enabled:!1},qoder:t==="qoder"?dt("qoder"):{enabled:!1},codebuddy:t==="codebuddy"?dt("codebuddy"):{enabled:!1},opencode:t==="opencode"?dt("opencode"):{enabled:!1},qwen:t==="qwen"?dt("qwen"):{enabled:!1},deepseek:t==="deepseek"?dt("deepseek"):{enabled:!1},trae:t==="trae"?dt("trae"):{enabled:!1},qwenwork:t==="qwenwork"?dt("qwenwork"):{enabled:!1}}};return JSON.stringify(e,null,2)+`
467
+ `,"utf8"):await QD(r.resolve(n,t.file),t.envKey,e)}a(md,"writeBack");function e$(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(e$,"escapeRegex");import{readFile as Fy,writeFile as t$,readdir as n$,stat as r$}from"fs/promises";import Ws from"path";import Ny,{isScalar as Bs,visit as o$}from"yaml";var i$=new Set(["baseId","base_id"]),s$=new Set(["tableId","table_id"]);async function hd(t,e){let n;try{n=await Fy(t,"utf8")}catch{return}let r;try{r=Ny.parse(n)}catch{return}let o=r;for(let i of e)if(Array.isArray(o)&&typeof i=="number")o=o[i];else if(v(o))o=o[String(i)];else return;return typeof o=="string"?o:void 0}a(hd,"readYamlValueAt");async function yd(t,e=[]){let n=[...e,Ws.join(t,"aitable-workflow.config.yml"),Ws.join(t,"profile","profile.yml")],r=Ws.join(t,"workflows");try{let i=await n$(r,{withFileTypes:!0});for(let s of i)s.isDirectory()&&n.push(Ws.join(r,s.name,"workflow.yml"))}catch{}let o=[];for(let i of n)try{(await r$(i)).isFile()&&o.push(i)}catch{}return[...new Set(o)]}a(yd,"collectBaseIdCandidateFiles");async function wd(t,e,n){let r=e.trim(),o=n.trim();if(!r||!o||r===o)return{migratedFields:0,clearedTableIds:0,changedFiles:[]};let i=0,s=0,c=[];for(let l of t){let d;try{d=await Fy(l,"utf8")}catch{continue}let u;try{u=Ny.parseDocument(d)}catch{continue}if(u.contents===null)continue;let f=0,p=0;o$(u,{Map(g,m){let y=!1;for(let w of m.items)Bs(w.key)&&i$.has(String(w.key.value))&&Bs(w.value)&&typeof w.value.value=="string"&&w.value.value.trim()===r&&(w.value.value=o,f++,y=!0);if(y)for(let w of m.items)Bs(w.key)&&s$.has(String(w.key.value))&&Bs(w.value)&&typeof w.value.value=="string"&&w.value.value.trim()!==""&&!Qt(w.value.value)&&(w.value.value="",p++)}}),f>0&&(await t$(l,u.toString(),"utf8"),i+=f,s+=p,c.push(l))}return{migratedFields:i,clearedTableIds:s,changedFiles:c}}a(wd,"migrateBaseIdInFiles");import bd from"path";import{writeFile as a$,mkdir as c$,access as l$}from"fs/promises";import zs from"path";function dt(t){switch(t){case"claudecode":return{enabled:!0,cmd:"claude"};case"codex":return{enabled:!0,cmd:"codex",model:"gpt-5.5",permissionMode:"bypassPermissions",mode:"full-auto",ignoreUserConfig:!0};case"qoder":return{enabled:!0,cmd:"qodercli",permissionMode:"bypassPermissions"};case"codebuddy":return{enabled:!0,cmd:"codebuddy"};case"opencode":return{enabled:!0,cmd:"opencode"};case"qwen":return{enabled:!0,cmd:"qwen"};case"deepseek":return{enabled:!0,cmd:"deepseek"};case"trae":return{enabled:!0,cmd:"trae-cli"};default:return{enabled:!0}}}a(dt,"getDefaultAgentEntry");function Ly(t){let e={version:1,agents:{claudecode:t==="claudecode"?dt("claudecode"):{enabled:!1},codex:t==="codex"?dt("codex"):{enabled:!1},qoder:t==="qoder"?dt("qoder"):{enabled:!1},codebuddy:t==="codebuddy"?dt("codebuddy"):{enabled:!1},opencode:t==="opencode"?dt("opencode"):{enabled:!1},qwen:t==="qwen"?dt("qwen"):{enabled:!1},deepseek:t==="deepseek"?dt("deepseek"):{enabled:!1},trae:t==="trae"?dt("trae"):{enabled:!1},qwenwork:t==="qwenwork"?dt("qwenwork"):{enabled:!1}}};return JSON.stringify(e,null,2)+`
468
468
  `}a(Ly,"generateCodingAgentsConfig");function Wy(t){let e=d$(t.agentType);return["# aitable-workflow \u914D\u7F6E","# \u7531 `aitable-workflow init` \u4EA4\u4E92\u5F0F\u5411\u5BFC\u751F\u6210","","# \u2500\u2500\u2500 \u573A\u666F\u63CF\u8FF0\uFF08design \u547D\u4EE4\u7684\u6838\u5FC3\u8F93\u5165\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","scene: |",u$(t.scene,2),"","# \u2500\u2500\u2500 AI \u8868\u683C\u8FDE\u63A5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","# \u9879\u76EE\u9ED8\u8BA4 Base\uFF1Atracker \u7531 design \u5185\u8054\u5230\u5404 workflow.yml\uFF0C\u4E0D\u8981\u5728\u8FD9\u91CC\u5199\u6839\u7EA7 tracker\uFF08schema \u62D2\u7EDD\uFF09\u3002","# \u2192 multi-workflow.md",`default_base_id: "${t.baseId}"`,"","# \u2500\u2500\u2500 \u5DE5\u4F5C\u6D41\u6A21\u677F\uFF08design \u547D\u4EE4\u751F\u6210\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","workflows:",' dir: "./workflows"',"","# \u2500\u2500\u2500 Agent \u5F15\u64CE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","# agent.engine: Coding Agent \u9009\u578B\u7684\u552F\u4E00\u771F\u6E90\uFF08design \u4E0E\u8FD0\u884C\u65F6\u7EDF\u4E00\u8D70\u5B83\uFF09\uFF1B","# coding-agents.config.json \u53EA\u63D0\u4F9B\u8BE5\u5F15\u64CE\u7684 CLI \u9002\u914D\u53C2\u6570\uFF08cmd/args/permissionMode \u7B49\uFF09","# agent.timeout_ms: Design \u9636\u6BB5\u4E0E Coding Agent \u6267\u884C\u8D85\u65F6\uFF1B\u8FD0\u884C\u65F6\u4EE5\u672C\u914D\u7F6E\u6587\u4EF6\u4E3A\u51C6","agent:",` engine: ${e}`," max_concurrent: 3"," timeout_ms: 1800000"," max_step_failures: 5",' trace_dir: "./traces"',"","# \u2500\u2500\u2500 LLM \u914D\u7F6E\uFF08\u5DE5\u4F5C\u6D41\u6B65\u9AA4\u4E2D\u7684 AI \u63A8\u7406\uFF09 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","recipe:"," default_timeout_ms: 300000",...t.llmProvider?[" llm:",` provider: ${t.llmProvider}`,` model: ${t.llmModel}`,` api_key: \${env.${t.llmApiKeyEnv}}`]:[],"","# \u2500\u2500\u2500 \u8F6E\u8BE2\u914D\u7F6E \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","# interval_ms: Run \u9636\u6BB5\u626B\u63CF\u5F85\u5904\u7406\u8BB0\u5F55\u7684\u8F6E\u8BE2\u95F4\u9694\uFF1B\u8FD0\u884C\u65F6\u4EE5\u672C\u914D\u7F6E\u6587\u4EF6\u4E3A\u51C6","polling:"," interval_ms: 5000","","# \u2500\u2500\u2500 SLA \u914D\u7F6E \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","sla:"," enabled: true"," default_timeout_ms: 86400000"," escalation_notify: []",""].join(`
469
469
  `)}a(Wy,"generateMainConfig");async function Us(t){let{answers:e,cwd:n,force:r=!1}=t,o={files:[],dirs:[],skipped:[]},i=[zs.join(n,"workflows")];for(let c of i)await c$(c,{recursive:!0}),o.dirs.push(c);let s=[{path:zs.join(n,"coding-agents.config.json"),content:Ly(e.agentType)},{path:zs.join(n,"aitable-workflow.config.yml"),content:Wy(e)},{path:zs.join(n,"workflows",".gitkeep"),content:""}];for(let c of s){if(!r&&await f$(c.path)){o.skipped.push(c.path);continue}await a$(c.path,c.content,"utf8"),o.files.push(c.path)}return o}a(Us,"scaffold");function d$(t){switch(t){case"claudecode":return"claude";case"codex":return"codex";case"qoder":return"qoder";case"codebuddy":return"codebuddy";case"opencode":return"opencode";case"qwen":return"qwen";case"deepseek":return"deepseek";case"trae":return"trae";case"qwenwork":return"qwenwork";default:return"claude"}}a(d$,"agentTypeToEngine");function u$(t,e){let n=" ".repeat(e);return t.split(`
470
470
  `).map(r=>n+r).join(`
471
471
  `)}a(u$,"formatYamlBlock");async function f$(t){try{return await l$(t),!0}catch{return!1}}a(f$,"fileExists");function xo(t){let e=[];for(let n of t.modules)if(n.workflows)for(let r of n.workflows)e.push(...r.items);else e.push(...n.items);return e}a(xo,"collectAllItems");function Ks(t){let e=t.key,n=e.lastIndexOf("."),r=n>=0?e.slice(n+1):e;return r==="base_id"||r==="baseId"?"baseId":r==="table_id"||r==="tableId"?"tableId":r}a(Ks,"getSemanticKey");function Vs(t){return Ks(t)==="baseId"}a(Vs,"canOfferDefaultFor");var Io=class extends Error{static{a(this,"ConfigSaveError")}status;constructor(e,n){super(n),this.name="ConfigSaveError",this.status=e}};function p$(t,e){for(let n of t){let r=xo(e).find(o=>{if(!o.writeTarget)return!1;let i=o.writeTarget,s=n.writeTarget;return i.type!==s.type?!1:i.type==="yaml"&&s.type==="yaml"?i.file===s.file&&JSON.stringify(i.yamlPath)===JSON.stringify(s.yamlPath):!1});if(r&&Vs(r)&&n.value.trim().length>0)return n.value.trim()}return null}a(p$,"findSavedBaseId");async function g$(t,e,n){if(!Array.isArray(t.updates))throw new Io(400,"updates must be an array");for(let l of t.updates){let d=[];if(l.writeTarget.type==="yamlAll")for(let u of l.writeTarget.targets)d.push(u.file);else d.push(l.writeTarget.file);for(let u of d)try{$e(e,u,{allowRoot:!1})}catch{throw new Io(403,`\u8DEF\u5F84\u8D8A\u754C: ${u}`)}}let r=0,o=new Map;for(let l of t.updates){let d=l.writeTarget.type==="yaml"?[l.writeTarget]:l.writeTarget.type==="yamlAll"?l.writeTarget.targets:[],u=l.value.trim();if(u)for(let f of d){let p=f.yamlPath[f.yamlPath.length-1];if(p!=="base_id"&&p!=="baseId")continue;let g=(await hd(bd.resolve(e,f.file),f.yamlPath))?.trim();g&&g!==u&&o.set(g,u)}}if(o.size>0){let l=await yd(e,[bd.resolve(n)]);for(let[d,u]of o){let f=await wd(l,d,u);r+=f.migratedFields+f.clearedTableIds}}for(let l of t.updates)await md(l.writeTarget,l.value,e),r++;let i=await Fs({configPath:n}),s=p$(t.updates,i);if(s){let l=0;for(let d of xo(i))d.writeTarget&&(d.status==="error"||d.status==="warn")&&Vs(d)&&Ks(d)==="baseId"&&(!d.value||typeof d.value=="string"&&!d.value.trim())&&(await md(d.writeTarget,s,e),l++);l>0&&(i=await Fs({configPath:n}),r+=l)}let c=0;for(let l of xo(i))if(l.key==="coding_agent.config.enabled"&&l.status==="error"&&l.writeTarget?.type==="json"){let d=l.writeTarget.jsonPath[1];if(!d)continue;let u=dt(d),f=bd.resolve(e,"coding-agents.config.json");for(let[p,g]of Object.entries(u))(typeof g=="string"||typeof g=="boolean")&&await gd(f,["agents",d,p],g);c++}return c>0&&(i=await Fs({configPath:n}),r+=c),{written:r,recheck:i}}a(g$,"applyConfigSave");var By=/^\$\{globalVar\.([^}]+)\}$/;function q8(t){return typeof t=="string"&&By.test(t)}a(q8,"isGlobalVarRef");function m$(t){if(typeof t!="string")return null;let e=t.match(By);return e?e[1]:null}a(m$,"globalVarRefPath");function H8(t,e){let n=m$(t);return n===null?t:e?.(n)}a(H8,"resolveGlobalVarRef");var vd=1,h$=["asker","answerer","bot","unknown"],y$=["idle","forced"],w$=new Set(["heuristic_merge","same_sender_window","single_active_adjacent","multiple_name_candidates","quoted_parent_missing","missing_answerers","missing_bots","near_max_open","forced_close"]),b$=["high","medium","low"];function Ro(t){return t.some(e=>w$.has(e))}a(Ro,"threadNeedsReview");var zy={high:3,medium:2,low:1};function qs(t,e){return zy[t]<=zy[e]?t:e}a(qs,"lowerConfidence");function Sd(t,e){return e.includes("heuristic_merge")||e.includes("multiple_name_candidates")||e.includes("quoted_parent_missing")?"low":e.includes("near_max_open")?qs(t,"medium"):t}a(Sd,"degradeConfidence");function xd(t){if(t.length===0)return{};let e=[...t].sort((s,c)=>s.createTime-c.createTime),n=e[0],r=n.createTime,o=n.senderOpenDingTalkId||n.senderName,i=e.find(s=>s.role==="answerer"&&(s.senderOpenDingTalkId||s.senderName)!==o&&s.createTime>=r);return i?{firstAnswerAt:i.createTime,firstAnswererName:i.senderName,firstResponseMs:i.createTime-r}:{}}a(xd,"computeFirstResponse");function Id(t){let e=new Map;for(let n of t){let r=n.senderOpenDingTalkId||n.senderName,o=e.get(r);if(o){o.messageCount+=1,o.role==="unknown"&&n.role!=="unknown"&&(o.role=n.role);continue}e.set(r,{name:n.senderName,openId:n.senderOpenDingTalkId,role:n.role,messageCount:1})}return[...e.values()]}a(Id,"computeParticipants");function Rd(t,e){if(t.length===0)return;let n=new Set(e.answererIds??[]),r=new Set(e.answererNames??[]),o=new Set(e.botNames??[]),i=[...t].sort((d,u)=>d.createTime-u.createTime),s=i[0].senderOpenDingTalkId||i[0].senderName,c=e.forcedAskerKey,l=a(d=>c?d.senderOpenDingTalkId===c||d.senderName===c:(d.senderOpenDingTalkId||d.senderName)===s,"isAsker");for(let d of t){if(o.has(d.senderName)){d.role="bot";continue}if(l(d)){d.role="asker";continue}d.role=n.has(d.senderOpenDingTalkId)||r.has(d.senderName)?"answerer":"unknown"}}a(Rd,"assignThreadRoles");function kd(t){let e=new Date(t),n=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0");return`${n}:${r}`}a(kd,"formatClock");function k$(t,e){let n=[];for(let o of t.images)n.push(`${e}![\u56FE\u7247](${o})`);let r=t.content.trim();if(r)for(let o of r.split(`
472
- `))n.push(`${e}${o}`);return n.length===0&&n.push(`${e}(\u7A7A\u6D88\u606F)`),n}a(k$,"renderBody");function v$(t){let e=new Map(t.messages.map(b=>[b.openMessageId,b])),n=new Map,r=new Map;for(let b of t.edges){if(!e.has(b.child)||(n.set(b.child,b.parent),!e.has(b.parent)))continue;let x=r.get(b.parent)??[];x.push(b.child),r.set(b.parent,x)}for(let b of r.values())b.sort((x,I)=>e.get(x).createTime-e.get(I).createTime);let o=a(b=>{let x=n.get(b);return x!==void 0&&e.has(x)},"isAttached"),i=[...r.values()].filter(b=>b.length>=2).length,s=[],c=new Set,l=a((b,x,I)=>{if(c.has(b))return x;c.add(b);let v=e.get(b),k=" ".repeat(x),R=x===0?"":I?"\u2517\u2501 ":"\u2514\u2500 ";s.push(`${k}${R}[${kd(v.createTime)}] ${v.senderName}(${v.role}) msg=${v.openMessageId}`),s.push(...k$(v,`${k}${x===0?"":" "}\u2502 `));let T=x,_=r.get(b)??[];for(let C of _)T=Math.max(T,l(C,x+1,_.length>=2));return T},"walk"),d=[t.rootMsgId,...t.messages.map(b=>b.openMessageId).filter(b=>b!==t.rootMsgId&&!o(b))].filter(b=>e.has(b)),u=0;for(let[b,x]of d.entries()){let I=s.length,v=l(x,0,!1);u=Math.max(u,v),b>0&&s.length>I&&s.splice(I,0,"","\u2014 \u4EE5\u4E0B\u6D88\u606F\u65E0\u5F15\u7528\u951A\u70B9\uFF0C\u4EC5\u540C\u7FA4\u65F6\u95F4\u90BB\u8FD1\uFF0C\u5F52\u5C5E\u53EF\u80FD\u4E0D\u51C6 \u2014")}let f=t.participants.map(b=>`${b.name}(${b.role})`).join(" / "),p=t.messages[0],g=t.messages[t.messages.length-1],m=p&&g?`${kd(p.createTime)} ~ ${kd(g.createTime)}`:"-",y=t.firstResponseMs===void 0?"\u4E0D\u9002\u7528\uFF08\u65E0 answerer \u6216\u7B54\u7591\u4EBA\u5458\u540D\u5355\u7F3A\u5931\uFF09":`${Math.round(t.firstResponseMs/6e4)} \u5206\u949F\uFF08\u9996\u6B21\u54CD\u5E94\u4EBA\uFF1A${t.firstAnswererName}\uFF09`,w=t.review.warnings.length>0?t.review.warnings.join(", "):"-";return[`# thread ${t.threadId}`,`\u7FA4: ${t.groupName} (${t.conversationId})`,`\u8282\u70B9\u6570: ${t.messages.length} \u6811\u6700\u5927\u6DF1\u5EA6: ${u+1} \u5206\u53C9\u6570: ${i}`,`\u5F52\u5E76: ${t.review.reason} / ${t.review.confidence} \u7591\u70B9: ${w}`,`\u53C2\u4E0E\u4EBA: ${f||"-"}`,`\u65F6\u95F4\u8303\u56F4: ${m}`,`\u9996\u6B21\u54CD\u5E94: ${y}`,"",...s].join(`
472
+ `))n.push(`${e}${o}`);return n.length===0&&n.push(`${e}(\u7A7A\u6D88\u606F)`),n}a(k$,"renderBody");function v$(t){let e=new Map(t.messages.map(b=>[b.openMessageId,b])),n=new Map,r=new Map;for(let b of t.edges){if(!e.has(b.child)||(n.set(b.child,b.parent),!e.has(b.parent)))continue;let x=r.get(b.parent)??[];x.push(b.child),r.set(b.parent,x)}for(let b of r.values())b.sort((x,I)=>e.get(x).createTime-e.get(I).createTime);let o=a(b=>{let x=n.get(b);return x!==void 0&&e.has(x)},"isAttached"),i=[...r.values()].filter(b=>b.length>=2).length,s=[],c=new Set,l=a((b,x,I)=>{if(c.has(b))return x;c.add(b);let S=e.get(b),k=" ".repeat(x),R=x===0?"":I?"\u2517\u2501 ":"\u2514\u2500 ";s.push(`${k}${R}[${kd(S.createTime)}] ${S.senderName}(${S.role}) msg=${S.openMessageId}`),s.push(...k$(S,`${k}${x===0?"":" "}\u2502 `));let T=x,_=r.get(b)??[];for(let C of _)T=Math.max(T,l(C,x+1,_.length>=2));return T},"walk"),d=[t.rootMsgId,...t.messages.map(b=>b.openMessageId).filter(b=>b!==t.rootMsgId&&!o(b))].filter(b=>e.has(b)),u=0;for(let[b,x]of d.entries()){let I=s.length,S=l(x,0,!1);u=Math.max(u,S),b>0&&s.length>I&&s.splice(I,0,"","\u2014 \u4EE5\u4E0B\u6D88\u606F\u65E0\u5F15\u7528\u951A\u70B9\uFF0C\u4EC5\u540C\u7FA4\u65F6\u95F4\u90BB\u8FD1\uFF0C\u5F52\u5C5E\u53EF\u80FD\u4E0D\u51C6 \u2014")}let f=t.participants.map(b=>`${b.name}(${b.role})`).join(" / "),p=t.messages[0],g=t.messages[t.messages.length-1],m=p&&g?`${kd(p.createTime)} ~ ${kd(g.createTime)}`:"-",y=t.firstResponseMs===void 0?"\u4E0D\u9002\u7528\uFF08\u65E0 answerer \u6216\u7B54\u7591\u4EBA\u5458\u540D\u5355\u7F3A\u5931\uFF09":`${Math.round(t.firstResponseMs/6e4)} \u5206\u949F\uFF08\u9996\u6B21\u54CD\u5E94\u4EBA\uFF1A${t.firstAnswererName}\uFF09`,w=t.review.warnings.length>0?t.review.warnings.join(", "):"-";return[`# thread ${t.threadId}`,`\u7FA4: ${t.groupName} (${t.conversationId})`,`\u8282\u70B9\u6570: ${t.messages.length} \u6811\u6700\u5927\u6DF1\u5EA6: ${u+1} \u5206\u53C9\u6570: ${i}`,`\u5F52\u5E76: ${t.review.reason} / ${t.review.confidence} \u7591\u70B9: ${w}`,`\u53C2\u4E0E\u4EBA: ${f||"-"}`,`\u65F6\u95F4\u8303\u56F4: ${m}`,`\u9996\u6B21\u54CD\u5E94: ${y}`,"",...s].join(`
473
473
  `)}a(v$,"renderThread");import{createHash as S$}from"crypto";import{appendFileSync as x$,existsSync as I$,mkdirSync as R$,readdirSync as C$,rmSync as T$,statSync as _$}from"fs";import Hs from"path";var A$=/^\d{4}-\d{2}-\d{2}$/;function kr(t){let e=new Date(t),n=a(r=>String(r).padStart(2,"0"),"pad");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}a(kr,"logDateDir");function Uy(t){let e=S$("sha1").update(t).digest("hex").slice(0,8);return`${Pe(t,{fallback:"conv",maxLength:16}).slice(0,16)}-${e}.jsonl`}a(Uy,"threadLogFileName");var Cd=class{static{a(this,"ThreadLog")}rootDir;retainDays;now;onError;prunedFor=null;constructor(e){this.rootDir=Hs.resolve(e.rootDir),this.retainDays=e.retainDays??2,this.now=e.now??(()=>Date.now()),e.onError&&(this.onError=e.onError)}filePathFor(e,n=this.now()){return $e(this.rootDir,Hs.posix.join(kr(n),Uy(e)))}append(e){try{let n=this.filePathFor(e.cid);R$(Hs.dirname(n),{recursive:!0}),x$(n,`${JSON.stringify(e)}
474
474
  `,"utf8"),this.pruneOnce()}catch(n){this.onError?.(`thread \u65E5\u5FD7\u5199\u5165\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u5165\u7AD9\u5904\u7406\uFF09: ${n instanceof Error?n.message:String(n)}`)}}pruneOnce(){let e=kr(this.now());if(this.prunedFor===e||(this.prunedFor=e,!I$(this.rootDir)))return;let n=this.now()-this.retainDays*24*60*60*1e3,r=kr(n);for(let o of C$(this.rootDir)){if(!A$.test(o)||o>=r)continue;let i=Hs.join(this.rootDir,o);try{if(!_$(i).isDirectory())continue;T$(i,{recursive:!0,force:!0})}catch(s){this.onError?.(`thread \u65E5\u5FD7\u6E05\u7406\u5931\u8D25 ${o}: ${s instanceof Error?s.message:String(s)}`)}}}};import{existsSync as E$,readFileSync as D$,readdirSync as Ky}from"fs";import Vy from"path";var $$={duplicate:"high",quoted_message:"high",mention_asker:"medium",answerer_mentions_user:"medium",same_sender_window:"low",single_active_adjacent:"low",new_thread:"high"},P$=1800*1e3,Td=0;function M$(){return Td=(Td+1)%1e6,`t-${Date.now().toString(36)}-${Td.toString(36)}`}a(M$,"newThreadId");function O$(t){return{answererIds:new Set(t.answererIds??[]),answererNameKeys:new Set((t.answererNames??[]).map(Xe)),botNameKeys:new Set((t.botNames??[]).map(Xe))}}a(O$,"normalizeRoster");var Co=class{static{a(this,"ThreadStore")}opts;addressPrefixes;open=new Map;msgIndex=new Map;byConversation=new Map;lastBySender=new Map;byAsker=new Map;constructor(e={}){this.opts={idleCloseMs:e.idleCloseMs??1800*1e3,maxOpenMs:e.maxOpenMs??360*60*1e3,sameSenderWindowMs:e.sameSenderWindowMs??600*1e3,adjacentWindowMs:e.adjacentWindowMs??300*1e3,enableHeuristicMerge:e.enableHeuristicMerge??!1,enableMentionMerge:e.enableMentionMerge??!1},this.addressPrefixes=(e.addressPatterns??[]).map(n=>n.split("{name}")[0]??"").filter(n=>n.length>0)}onMessage(e,n={}){let r=this.decide(e,O$(n));return this.apply(e,r)}drainClosed(e,n={}){let r=[];for(let[o,i]of[...this.open.entries()]){let s=e-i.lastActivityAt>=this.opts.idleCloseMs,c=e-i.openedAt>=this.opts.maxOpenMs;if(!s&&!c)continue;r.push(this.toSnapshot(i,e,s?"idle":"forced",n)),this.open.delete(o),this.byConversation.get(i.conversationId)?.delete(o);let l=`${i.conversationId}\0${Xe(i.askerName)}`;this.byAsker.get(l)===o&&this.byAsker.delete(l)}return this.pruneIndex(),r}get openCount(){return this.open.size}recoverFromLog(e,n,r=Date.now(),o={}){let i=0,s=0,c=[];if(!E$(e))return{files:i,messages:s,drainedSnapshots:c};let l=new Set;for(let u=0;u<n;u++)l.add(kr(r-u*24*60*60*1e3));let d=[];for(let u of Ky(e)){if(!l.has(u))continue;let f=Vy.join(e,u);for(let p of Ky(f))if(p.endsWith(".jsonl")){i+=1;for(let g of D$(Vy.join(f,p),"utf8").split(`
475
475
  `)){if(!g.trim())continue;let m;try{m=JSON.parse(g)}catch{continue}m.kind==="msg"&&(d.push({openMessageId:m.openMessageId,conversationId:m.cid,groupName:m.groupName,senderName:m.senderName,senderOpenDingTalkId:m.senderOpenDingTalkId,createTime:m.ts,content:m.content,images:m.images,...m.quotedMessageId?{quotedMessageId:m.quotedMessageId}:{},role:m.identity==="bot"?"bot":"unknown"}),s+=1)}}}d.sort((u,f)=>u.createTime-f.createTime);for(let u of d)this.onMessage(u,o),c.push(...this.drainClosed(u.createTime,o));return{files:i,messages:s,drainedSnapshots:c}}decide(e,n){let r=[],o=[];n.answererIds.size===0&&n.answererNameKeys.size===0&&r.push("missing_answerers"),n.botNameKeys.size===0&&r.push("missing_bots");let i=this.msgIndex.get(e.openMessageId);if(i&&this.open.has(i))return{reason:"duplicate",threadId:i,candidateThreadIds:[],warnings:r};if(e.quotedMessageId){let d=this.msgIndex.get(e.quotedMessageId);if(d&&this.open.has(d))return{reason:"quoted_message",threadId:d,matchedMessageId:e.quotedMessageId,candidateThreadIds:[],warnings:r};r.push("quoted_parent_missing")}let s=e.conversationId,c=Xe(e.senderName),l=[...this.byConversation.get(s)??[]].filter(d=>this.open.has(d));if(this.opts.enableMentionMerge){let d=this.matchMention(e,c,l,o,r);if(d)return{...d,candidateThreadIds:o,warnings:r}}if(this.opts.enableHeuristicMerge){let d=this.lastBySender.get(this.senderKey(e));if(d!==void 0&&e.createTime-d<=this.opts.sameSenderWindowMs){let u=this.latestThreadOf(l,o,f=>f.messages.some(p=>(p.senderOpenDingTalkId||p.senderName)===(e.senderOpenDingTalkId||e.senderName)));if(u)return r.push("heuristic_merge","same_sender_window"),{reason:"same_sender_window",threadId:u,candidateThreadIds:o,warnings:r}}if(l.length===1){let u=this.open.get(l[0]);if(o.push(u.threadId),e.createTime-u.lastActivityAt<=this.opts.adjacentWindowMs)return r.push("heuristic_merge","single_active_adjacent"),{reason:"single_active_adjacent",threadId:u.threadId,candidateThreadIds:o,warnings:r}}}if(e.role!=="bot"){let d=this.forcedAskerFor(e,n);if(d)return r.push("answerer_forced_asker"),{reason:"answerer_mentions_user",matchedName:d,forcedAskerName:d,candidateThreadIds:o,warnings:r}}return{reason:"new_thread",candidateThreadIds:o,warnings:r}}matchMention(e,n,r,o,i){let s=a(u=>{let f,p=0;for(let g of r){let m=this.open.get(g);!m||!u(m)||(p+=1,o.includes(m.threadId)||o.push(m.threadId),(!f||m.lastActivityAt>f.lastActivityAt)&&(f=m))}return f?{thread:f,hits:p}:null},"pick"),l=s(u=>Xe(u.askerName)===n||u.participants.has(n)?this.addressesName(e.content,u.askerName)||[...u.participants].some(p=>p!==n&&this.addressesName(e.content,p)):!1)??s(u=>!u.askerIsBot&&this.addressesName(e.content,u.askerName));if(l)return i.push("mention_merge"),l.hits>1&&i.push("multiple_name_candidates"),this.opts.maxOpenMs-(e.createTime-l.thread.openedAt)<P$&&i.push("near_max_open"),{reason:"mention_asker",threadId:l.thread.threadId,matchedName:l.thread.askerName};let d=this.byAsker.get(`${e.conversationId}\0${n}`);return d&&this.open.has(d)?(o.includes(d)||o.push(d),i.push("mention_merge"),{reason:"mention_asker",threadId:d,matchedName:e.senderName}):null}forcedAskerFor(e,n){if(!(!!e.senderOpenDingTalkId&&n.answererIds.has(e.senderOpenDingTalkId)||n.answererNameKeys.has(Xe(e.senderName))))return;let o=e.content,i=0;for(;;){let s=o.indexOf("@",i);if(s<0)return;i=s+1;let c=(o.slice(i,i+30).split(/[ \u3000\n,,]/)[0]??"").trim();if(c&&!n.botNameKeys.has(Xe(c))&&Xe(c)!==Xe(e.senderName))return c}}apply(e,n){let r=Sd($$[n.reason],n.warnings),o={reason:n.reason,confidence:r,...n.threadId?{matchedThreadId:n.threadId}:{},...n.matchedMessageId?{matchedMessageId:n.matchedMessageId}:{},...n.matchedName?{matchedName:n.matchedName}:{},...n.candidateThreadIds.length>0?{candidateThreadIds:n.candidateThreadIds}:{},warnings:n.warnings,needsReview:Ro(n.warnings)};if(n.reason==="duplicate")return{threadId:n.threadId,isNew:!1,trace:o};let i=n.threadId??M$(),s=!this.open.has(i),c=n.forcedAskerName??e.senderName,l=this.open.get(i)??{threadId:i,conversationId:e.conversationId,groupName:e.groupName,askerName:c,askerIsBot:e.role==="bot",participants:new Set,messages:[],edges:[],openedAt:e.createTime,lastActivityAt:e.createTime,review:{reason:n.reason,confidence:r,warnings:[],candidateThreadIds:[],needsReview:!1},...n.forcedAskerName?{forcedAskerKey:n.forcedAskerName}:{}};l.messages.push(e),l.messages.sort((u,f)=>u.createTime-f.createTime),e.quotedMessageId&&l.edges.push({child:e.openMessageId,parent:e.quotedMessageId}),!l.groupName&&e.groupName&&(l.groupName=e.groupName),l.lastActivityAt=Math.max(l.lastActivityAt,e.createTime),e.senderName&&l.participants.add(Xe(e.senderName)),l.review.reason=n.reason,l.review.confidence=qs(l.review.confidence,r);for(let u of n.warnings)l.review.warnings.includes(u)||l.review.warnings.push(u);for(let u of n.candidateThreadIds)l.review.candidateThreadIds.includes(u)||l.review.candidateThreadIds.push(u);l.review.needsReview=Ro(l.review.warnings),this.open.set(i,l),this.msgIndex.set(e.openMessageId,i);let d=this.byConversation.get(e.conversationId)??new Set;return d.add(i),this.byConversation.set(e.conversationId,d),this.lastBySender.set(this.senderKey(e),e.createTime),s&&c&&!l.askerIsBot&&this.byAsker.set(`${e.conversationId}\0${Xe(c)}`,i),{threadId:i,isNew:s,trace:o}}senderKey(e){return`${e.conversationId}\0${e.senderOpenDingTalkId||e.senderName}`}addressesName(e,n){let r=Xe(n);if(!r||!e)return!1;for(let o of["@",...this.addressPrefixes]){let i=0;for(;;){let s=e.indexOf(o,i);if(s<0)break;if(i=s+o.length,Xe(e.slice(i,i+r.length+24)).startsWith(r))return!0}}return!1}latestThreadOf(e,n,r){let o=null;for(let i of e){let s=this.open.get(i);!s||!r(s)||(n.includes(s.threadId)||n.push(s.threadId),(!o||s.lastActivityAt>o.lastActivityAt)&&(o=s))}return o?.threadId??null}toSnapshot(e,n,r,o){let i=e.messages.map(l=>({...l}));Rd(i,{...o,...e.forcedAskerKey?{forcedAskerKey:e.forcedAskerKey}:{}});let s=[...e.review.warnings];r==="forced"&&!s.includes("forced_close")&&s.push("forced_close");let c=i[0];return{contractVersion:1,threadId:e.threadId,conversationId:e.conversationId,groupName:e.groupName,rootMsgId:c.openMessageId,messages:i,edges:e.edges,participants:Id(i),...xd(i),openedAt:e.openedAt,closedAt:n,closeReason:r,review:{reason:e.review.reason,confidence:e.review.confidence,warnings:s,candidateThreadIds:[...e.review.candidateThreadIds],needsReview:Ro(s)}}}pruneIndex(){if(this.msgIndex.size<=2e4)return;let n=Math.floor(2e4/2),r=[...this.msgIndex.entries()];this.msgIndex.clear();for(let[o,i]of r.slice(r.length-n))this.msgIndex.set(o,i)}};function Xe(t){let e=(t??"").trim();return e?e.replace(/\s+/g,"")||e:""}a(Xe,"nameKey");var _d=new Map,Ad=new Set;function qy(t,e){let n=_d.get(t);if(n)return n;let r=new Co(e??{});return _d.set(t,r),r}a(qy,"getThreadStore");function j$(){_d.clear(),Ad.clear()}a(j$,"_resetThreadStoreRegistry");function F$(t,e){let n=`${t}::${e.logDir}`;if(Ad.has(n))return{files:0,messages:0,drainedSnapshots:[]};Ad.add(n);let o=qy(t,e.storeOptions).recoverFromLog(e.logDir,e.days,e.now,e.roster);return Hy(t,o.drainedSnapshots),o}a(F$,"recoverThreadStoreOnce");var Ed=new Map;function vr(t){let e=Ed.get(t);return e||(e=[],Ed.set(t,e)),e}a(vr,"getQueue");function Hy(t,e){if(e.length===0)return;let n=vr(t);for(let r of e)n.some(o=>o.snapshot.threadId===r.threadId)||n.push({snapshot:r,attempts:0,failCount:0,nextRetryAt:0})}a(Hy,"enqueueForDigest");function N$(t){return[...vr(t)]}a(N$,"getPendingItems");function L$(t){return vr(t).length===0}a(L$,"isDigestQueueEmpty");function W$(t,e){let n=vr(t),r=n.findIndex(o=>o.snapshot.threadId===e);r>=0&&n.splice(r,1)}a(W$,"removeFromDigestQueue");function B$(t,e){let n=vr(t).find(r=>r.snapshot.threadId===e);return n?(n.attempts+=1,n.attempts):0}a(B$,"incrementDigestAttempts");function z$(t,e,n){let r=vr(t),o=r.findIndex(s=>s.snapshot.threadId===e);if(o<0)return{dropped:!1,failCount:0};let i=r[o];return i.failCount+=1,i.failCount>n.maxRetries?(r.splice(o,1),{dropped:!0,failCount:i.failCount}):(i.nextRetryAt=(n.now??Date.now())+n.backoffMs,{dropped:!1,failCount:i.failCount})}a(z$,"markDigestFailure");function U$(){Ed.clear()}a(U$,"_resetDigestQueues");import{mkdir as K$,readFile as V$,writeFile as q$,chmod as Gy,rename as H$}from"fs/promises";import Zy from"path";import G$ from"os";var Yy=Zy.join(G$.homedir(),".aitable-workflow"),J$="credentials.json";function Qy(t=Yy){return Zy.join(t,J$)}a(Qy,"credentialsFilePath");function Jy(){return{version:1,agents:[],activeAgent:null}}a(Jy,"emptyStore");async function To(t){let e=Qy(t);try{let n=await V$(e,"utf8"),r=JSON.parse(n);return r.version!==1||!Array.isArray(r.agents)?Jy():r}catch{return Jy()}}a(To,"readCredentials");async function Xy(t,e){let n=e??Yy,r=Qy(n),o=`${r}.tmp`;await K$(n,{recursive:!0}),await q$(o,JSON.stringify(t,null,2)+`
476
- `,"utf8"),await Gy(o,384),await H$(o,r),await Gy(r,384)}a(Xy,"writeCredentials");async function v3(t,e){let n=await To(e),r=n.agents.findIndex(o=>o.name===t.name);return r>=0?n.agents[r]=t:n.agents.push(t),n.activeAgent=t.name,await Xy(n,e),n}a(v3,"saveCredential");async function S3(t,e,n){let o=(await To(n)).agents.find(i=>i.name===t);return o&&o.serverUrl!==e?o:null}a(S3,"findConflictingCredential");async function x3(t,e){let n=await To(e);if(!n.agents.find(o=>o.name===t))throw new Error(`Agent "${t}" \u672A\u627E\u5230\u3002\u53EF\u7528: ${n.agents.map(o=>o.name).join(", ")||"(\u65E0)"}`);return n.activeAgent=t,await Xy(n,e),n}a(x3,"setActiveAgent");async function I3(t){let e=await To(t);return e.activeAgent?e.agents.find(n=>n.name===e.activeAgent)??null:null}a(I3,"getActiveCredential");async function R3(t){return(await To(t)).agents}a(R3,"listCredentials");function _3(t){if(!t||t.length<8)return"***";let e=t.indexOf("_");if(e>0&&e<t.length-4){let n=t.slice(0,e+1),r=t.slice(-4);return`${n}...${r}`}return`${t.slice(0,4)}...${t.slice(-4)}`}a(_3,"maskSecret");var Gs=class{static{a(this,"AITableTracker")}config;fields;dws;appendLocks=new Map;eventLogCache=new Map;nameToId=new Map;idToName=new Map;nameToType=new Map;initialized=!1;constructor(e,n){this.config=e,this.fields=e.fields,this.dws=n??new he({bin:e.dws_bin})}async init(){if(this.initialized)return;h.info("tracker","resolving field schema",{baseId:this.config.base_id,tableId:this.config.table_id});let e=await this.dws.runJson(["aitable","field","get","--base-id",this.config.base_id,"--table-id",this.config.table_id]),n=Te(e);for(let r of n){if(!S(r))continue;let o=typeof r.fieldId=="string"?r.fieldId:null,i=typeof r.fieldName=="string"?r.fieldName:null,s=typeof r.type=="string"?r.type:null;o&&i&&(this.nameToId.set(i,o),this.idToName.set(o,i),s&&this.nameToType.set(i,s))}h.info("tracker","field mapping resolved",{count:this.nameToId.size,mappings:Object.fromEntries(this.nameToId)}),this.initialized=!0}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e)){let i=this.idToName.get(r)??r;n[i]=o}return n}translateCellsToIds(e){let n={};for(let[r,o]of Object.entries(e)){let i=this.nameToId.get(r)??r;n[i]=o}return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}async fetchCandidateItems(){let e=[...new Set([this.config.states.initial,...this.config.states.active])].filter(i=>typeof i=="string"&&i.length>0),n=[],r=new Set;if(e.length===0)return n;let o={operator:"or",operands:e.map(i=>({operator:"eq",operands:[this.fields.state,i]}))};for(let i of await this.queryRecords({filters:o})){let s=this.recordToWorkItem(i);r.has(s.id)||(r.add(s.id),n.push(s))}return n}async fetchItemsByIds(e){return e.length===0?[]:(await this.queryRecords({recordIds:e})).map(r=>this.recordToWorkItem(r))}async fetchItemsByStates(e){let n=[],r=new Set;for(let o of e){let i={operator:"and",operands:[{operator:"eq",operands:[this.fields.state,o]}]};for(let s of await this.queryRecords({filters:i})){let c=this.recordToWorkItem(s);r.has(c.id)||(r.add(c.id),n.push(c))}}return n}async fetchItemsByFilter(e,n){let r=Object.entries(e).filter(([c])=>c.length>0);if(r.length===0)return[];let o={operator:"and",operands:r.map(([c,l])=>({operator:"eq",operands:[c,l]}))},s=(await this.queryRecords({filters:o})).map(c=>this.recordToWorkItem(c));return n!==void 0?s.slice(0,n):s}async fetchAllItems(){let e=[this.config.states.initial,...this.config.states.active,...this.config.states.terminal,this.config.states.blocked,this.config.states.review].filter(i=>typeof i=="string"&&i.length>0),n=[...new Set(e)];if(n.length===0)return[];let r={operator:"or",operands:n.map(i=>({operator:"eq",operands:[this.fields.state,i]}))};return(await this.queryRecords({filters:r})).map(i=>this.recordToWorkItem(i))}async updateState(e,n){h.info("tracker","updating state",{itemId:e,state:n}),await this.updateRecord(e,{[this.fields.state]:n})}async updateCurrentStep(e,n){this.fields.current_step&&(h.info("tracker","updating current step",{itemId:e,stepId:n}),await this.updateRecord(e,{[this.fields.current_step]:n}))}async updateFields(e,n){Object.keys(n).length!==0&&(h.info("tracker","updating fields",{itemId:e,fieldCount:Object.keys(n).length}),await this.updateRecord(e,n))}async updateCheckpoint(e,n){let r={...n.fields??{}};n.state!==void 0&&(r[this.fields.state]=n.state),n.currentStep!==void 0&&this.fields.current_step&&(r[this.fields.current_step]=n.currentStep??""),Object.keys(r).length!==0&&(h.info("tracker","updating checkpoint",{itemId:e,cellCount:Object.keys(r).length,state:n.state,currentStep:n.currentStep}),await this.updateRecord(e,r))}async appendEvent(e,n){if(!this.fields.event_log)return;let o=(this.appendLocks.get(e)??Promise.resolve()).then(()=>this.doAppendEvent(e,n)).catch(i=>{h.warn("tracker","appendEvent \u5F02\u6B65\u5199\u5165\u5931\u8D25(\u65C1\u8DEF)",{itemId:e,error:String(i)})});this.appendLocks.set(e,o)}async flush(e){if(e){await(this.appendLocks.get(e)??Promise.resolve());return}await Promise.all([...this.appendLocks.values()])}async doAppendEvent(e,n){let r=this.fields.event_log;if(!r)return;let o=this.eventLogCache.get(e);if(o===void 0){let[c]=await this.fetchItemsByIds([e]);o=c?Sr(c.fields[r]):""}let i=le(),s=[o,`[${i}] ${n}`].filter(Boolean).join(`
477
- `);this.eventLogCache.set(e,s),await this.updateRecord(e,{[r]:s})}async updateRecord(e,n){let r=this.translateCellsToIds(n);e==="__new__"?await yt(this.dws,["aitable","record","create","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--yes"],[{cells:r}]):await yt(this.dws,["aitable","record","update","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--yes"],[{recordId:e,cells:r}])}async queryRecords(e){let n=[],r=null,o=0,i=10;do{let s=["aitable","record","query","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--limit",String(this.config.query_limit)];e.filters!==void 0&&s.push("--filters",JSON.stringify(this.translateFilterFieldNames(e.filters))),e.recordIds&&e.recordIds.length>0&&s.push("--record-ids",e.recordIds.join(",")),r&&s.push("--cursor",r);let c=await this.dws.runJson(s),l=Te(c);n.push(...l);let d=Zo(c);if(o+=1,l.length<this.config.query_limit||d===r)break;r=d}while(r&&o<i&&!e.recordIds);return n}recordToWorkItem(e){let n=Z$(e),r=this.translateCellsToNames(n);this.fillSubmitterFromMetadata(e,r);let o=Y$(e);if(!o)throw new Error(`AI \u8868\u683C\u8BB0\u5F55\u7F3A\u5C11 recordId: ${JSON.stringify(e).slice(0,200)}`);let i=Object.fromEntries(this.nameToType);return{id:o,title:Sr(r[this.fields.title])||"(\u65E0\u6807\u9898)",state:Sr(r[this.fields.state])||"Unknown",currentStep:this.fields.current_step&&Sr(r[this.fields.current_step])||null,owner:this.fields.owner&&Sr(r[this.fields.owner])||null,fields:r,fieldTypes:Object.keys(i).length>0?i:void 0,raw:e}}fillSubmitterFromMetadata(e,n){let r=this.fields.submitter;if(!r||n[r])return;let o=Q$(e);if(o){if(this.nameToType.get(r)==="user"){let i={userId:o.userId};o.corpId&&(i.corpId=o.corpId),o.name&&(i.name=o.name),n[r]=[i];return}n[r]=o.userId}}};function Z$(t){let e=ye(t);if(!S(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(S(r))return r}return e}a(Z$,"recordCells");function Y$(t){let e=ye(t);if(!S(e))return null;for(let n of["recordId","record_id","id"]){let r=e[n];if(typeof r=="string"&&r.trim()!=="")return r}return null}a(Y$,"extractRecordId");function Q$(t){let e=ye(t);return $d(e)}a(Q$,"extractSubmitterIdentity");function $d(t){if(Array.isArray(t)){for(let n of t){let r=$d(n);if(r)return r}return null}if(!S(t))return null;let e=Dd(t,["userId","user_id","createUserId","create_user_id","createdUserId","created_user_id","creatorUserId","creator_user_id"]);if(e){let n=Dd(t,["corpId","corp_id","corpID"]),r=Dd(t,["name","userName","user_name"]);return{userId:e,...n?{corpId:n}:{},...r?{name:r}:{}}}for(let n of Object.values(t)){let r=$d(n);if(r)return r}return null}a($d,"findUserIdentityDeep");function Dd(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r;if(typeof r=="number")return String(r)}return null}a(Dd,"firstStringByKeys");function Sr(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(Sr).filter(Boolean).join(", ");if(S(t)){for(let e of["markdown","text","name","value","displayName","label"]){let n=t[e];if(typeof n=="string"||typeof n=="number")return String(n)}return JSON.stringify(t)}return String(t)}a(Sr,"cellToString");var Js=class{static{a(this,"PollingSource")}name="polling";running=!1;abortController=null;intervalMs;constructor(e){this.intervalMs=e.intervalMs}async start(e){if(!this.running){for(this.running=!0,this.abortController=new AbortController,h.info("event-source","PollingSource started",{name:this.name,role:"reconcile-heartbeat",reconcileIntervalMs:this.intervalMs});this.running;){let n={type:"timer_fired"};try{await e(n)}catch(r){h.error("event-source","PollingSource handler error",{error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.intervalMs)}h.info("event-source","PollingSource stopped")}}stop(){this.running=!1,this.abortController?.abort()}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}};var Zs=class{static{a(this,"EventQueue")}items=[];maxSize;constructor(e=1e4){this.maxSize=e}enqueue(e){if(this.items.push(e),this.items.length>this.maxSize){let n=this.items.length-this.maxSize;this.items.splice(0,n),h.warn("event-queue","\u961F\u5217\u8D85\u9650,\u4E22\u5F03\u6700\u65E7\u52A8\u4F5C",{dropped:n,maxSize:this.maxSize})}}drainAll(){return this.items.splice(0,this.items.length)}get size(){return this.items.length}};var Ys=class{static{a(this,"EventRouter")}handlers;constructor(e){this.handlers=e}asHandler(){return e=>this.route(e)}async route(e){let n=this.handlers[e.type];if(!n){h.debug("event-router","\u672A\u6CE8\u518C\u7684\u4E8B\u4EF6\u7C7B\u578B\uFF0C\u8DF3\u8FC7",{type:e.type});return}await n(e)}};import ew from"path";import tw from"fs";var X$={id:"",title:"",state:"",currentStep:null,owner:null,fields:{},raw:{}};function Pd(t,e){let{title:n,...r}=e,o=typeof n=="string"?n:"\u65B0\u5DE5\u5355";return{[t.tracker.fields.state]:t.tracker.states.initial,[t.tracker.fields.title]:o,...r}}a(Pd,"buildCreateCells");var Qs=class{static{a(this,"EventHandlerExecutor")}settings;tracker;toolkitFactory;globalVars;configScope;recipeCache=new Map;constructor(e){this.settings=e.settings,this.tracker=e.tracker,this.globalVars=e.globalVars??new tn,this.configScope=e.configScope;let n=e.toolkitRegistry;this.toolkitFactory=e.toolkitFactory??(()=>Ri({settings:this.settings,tracker:this.tracker,item:X$,toolkitConfig:this.configScope?.getToolkitConfig(),registry:n}))}async createHandler(e,n,r){let o=await this.loadRecipe(e),i=a(()=>this.toolkitFactory(),"getToolkit"),s=a(()=>(r?this.configScope?.getHandlerConfig(r):void 0)??{},"getConfig"),c={get toolkit(){return i()},get config(){return s()},log:a(l=>h.debug("event-handler",l,{recipe:e}),"log"),pushEvent:n,configDir:this.settings.configDir,getGlobalVar:a(l=>this.globalVars.get(l),"getGlobalVar")};return o.create(c)}async applyAction(e){switch(e.action){case"create_record":{let n=Pd(this.settings,e.fields);h.info("event-handler","\u521B\u5EFA\u65B0\u5DE5\u5355",{title:n[this.settings.tracker.fields.title],fieldCount:Object.keys(e.fields).length}),await this.tracker.updateFields("__new__",n);break}case"update_record":{if(!e.itemId){h.warn("event-handler","update_record \u7F3A\u5C11 itemId");return}h.info("event-handler","\u66F4\u65B0\u5DE5\u5355",{itemId:e.itemId,fieldCount:Object.keys(e.fields).length}),await this.tracker.updateFields(e.itemId,e.fields),await this.tracker.appendEvent(e.itemId,"\u5916\u90E8\u4E8B\u4EF6\u66F4\u65B0");break}}}async loadRecipe(e){let n=this.recipeCache.get(e);if(n)return n;let r=ew.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=ew.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=tw.existsSync(r)?r:tw.existsSync(o)?o:r,s;i.endsWith(".ts")&&await Ut();try{s=await import(mn(i))}catch(l){let d=l instanceof Error?l.message:String(l);if(i.endsWith(".ts")&&d.includes("Unknown file extension"))try{await import("tsx/esm/api").then(u=>u.register?.()),s=await import(mn(i))}catch{throw new Error(`\u65E0\u6CD5\u52A0\u8F7D .ts EventHandler Recipe "${e}"\u3002\u8BF7\u4F7F\u7528 "npx tsx src/cli.ts run" \u542F\u52A8\u3002
476
+ `,"utf8"),await Gy(o,384),await H$(o,r),await Gy(r,384)}a(Xy,"writeCredentials");async function v3(t,e){let n=await To(e),r=n.agents.findIndex(o=>o.name===t.name);return r>=0?n.agents[r]=t:n.agents.push(t),n.activeAgent=t.name,await Xy(n,e),n}a(v3,"saveCredential");async function S3(t,e,n){let o=(await To(n)).agents.find(i=>i.name===t);return o&&o.serverUrl!==e?o:null}a(S3,"findConflictingCredential");async function x3(t,e){let n=await To(e);if(!n.agents.find(o=>o.name===t))throw new Error(`Agent "${t}" \u672A\u627E\u5230\u3002\u53EF\u7528: ${n.agents.map(o=>o.name).join(", ")||"(\u65E0)"}`);return n.activeAgent=t,await Xy(n,e),n}a(x3,"setActiveAgent");async function I3(t){let e=await To(t);return e.activeAgent?e.agents.find(n=>n.name===e.activeAgent)??null:null}a(I3,"getActiveCredential");async function R3(t){return(await To(t)).agents}a(R3,"listCredentials");function _3(t){if(!t||t.length<8)return"***";let e=t.indexOf("_");if(e>0&&e<t.length-4){let n=t.slice(0,e+1),r=t.slice(-4);return`${n}...${r}`}return`${t.slice(0,4)}...${t.slice(-4)}`}a(_3,"maskSecret");var Gs=class{static{a(this,"AITableTracker")}config;fields;dws;appendLocks=new Map;eventLogCache=new Map;nameToId=new Map;idToName=new Map;nameToType=new Map;initialized=!1;constructor(e,n){this.config=e,this.fields=e.fields,this.dws=n??new he({bin:e.dws_bin})}async init(){if(this.initialized)return;h.info("tracker","resolving field schema",{baseId:this.config.base_id,tableId:this.config.table_id});let e=await this.dws.runJson(["aitable","field","get","--base-id",this.config.base_id,"--table-id",this.config.table_id]),n=Te(e);for(let r of n){if(!v(r))continue;let o=typeof r.fieldId=="string"?r.fieldId:null,i=typeof r.fieldName=="string"?r.fieldName:null,s=typeof r.type=="string"?r.type:null;o&&i&&(this.nameToId.set(i,o),this.idToName.set(o,i),s&&this.nameToType.set(i,s))}h.info("tracker","field mapping resolved",{count:this.nameToId.size,mappings:Object.fromEntries(this.nameToId)}),this.initialized=!0}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e)){let i=this.idToName.get(r)??r;n[i]=o}return n}translateCellsToIds(e){let n={};for(let[r,o]of Object.entries(e)){let i=this.nameToId.get(r)??r;n[i]=o}return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}async fetchCandidateItems(){let e=[...new Set([this.config.states.initial,...this.config.states.active])].filter(i=>typeof i=="string"&&i.length>0),n=[],r=new Set;if(e.length===0)return n;let o={operator:"or",operands:e.map(i=>({operator:"eq",operands:[this.fields.state,i]}))};for(let i of await this.queryRecords({filters:o})){let s=this.recordToWorkItem(i);r.has(s.id)||(r.add(s.id),n.push(s))}return n}async fetchItemsByIds(e){return e.length===0?[]:(await this.queryRecords({recordIds:e})).map(r=>this.recordToWorkItem(r))}async fetchItemsByStates(e){let n=[],r=new Set;for(let o of e){let i={operator:"and",operands:[{operator:"eq",operands:[this.fields.state,o]}]};for(let s of await this.queryRecords({filters:i})){let c=this.recordToWorkItem(s);r.has(c.id)||(r.add(c.id),n.push(c))}}return n}async fetchItemsByFilter(e,n){let r=Object.entries(e).filter(([c])=>c.length>0);if(r.length===0)return[];let o={operator:"and",operands:r.map(([c,l])=>({operator:"eq",operands:[c,l]}))},s=(await this.queryRecords({filters:o})).map(c=>this.recordToWorkItem(c));return n!==void 0?s.slice(0,n):s}async fetchAllItems(){let e=[this.config.states.initial,...this.config.states.active,...this.config.states.terminal,this.config.states.blocked,this.config.states.review].filter(i=>typeof i=="string"&&i.length>0),n=[...new Set(e)];if(n.length===0)return[];let r={operator:"or",operands:n.map(i=>({operator:"eq",operands:[this.fields.state,i]}))};return(await this.queryRecords({filters:r})).map(i=>this.recordToWorkItem(i))}async updateState(e,n){h.info("tracker","updating state",{itemId:e,state:n}),await this.updateRecord(e,{[this.fields.state]:n})}async updateCurrentStep(e,n){this.fields.current_step&&(h.info("tracker","updating current step",{itemId:e,stepId:n}),await this.updateRecord(e,{[this.fields.current_step]:n}))}async updateFields(e,n){Object.keys(n).length!==0&&(h.info("tracker","updating fields",{itemId:e,fieldCount:Object.keys(n).length}),await this.updateRecord(e,n))}async updateCheckpoint(e,n){let r={...n.fields??{}};n.state!==void 0&&(r[this.fields.state]=n.state),n.currentStep!==void 0&&this.fields.current_step&&(r[this.fields.current_step]=n.currentStep??""),Object.keys(r).length!==0&&(h.info("tracker","updating checkpoint",{itemId:e,cellCount:Object.keys(r).length,state:n.state,currentStep:n.currentStep}),await this.updateRecord(e,r))}async appendEvent(e,n){if(!this.fields.event_log)return;let o=(this.appendLocks.get(e)??Promise.resolve()).then(()=>this.doAppendEvent(e,n)).catch(i=>{h.warn("tracker","appendEvent \u5F02\u6B65\u5199\u5165\u5931\u8D25(\u65C1\u8DEF)",{itemId:e,error:String(i)})});this.appendLocks.set(e,o)}async flush(e){if(e){await(this.appendLocks.get(e)??Promise.resolve());return}await Promise.all([...this.appendLocks.values()])}async doAppendEvent(e,n){let r=this.fields.event_log;if(!r)return;let o=this.eventLogCache.get(e);if(o===void 0){let[c]=await this.fetchItemsByIds([e]);o=c?Sr(c.fields[r]):""}let i=le(),s=[o,`[${i}] ${n}`].filter(Boolean).join(`
477
+ `);this.eventLogCache.set(e,s),await this.updateRecord(e,{[r]:s})}async updateRecord(e,n){let r=this.translateCellsToIds(n);e==="__new__"?await yt(this.dws,["aitable","record","create","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--yes"],[{cells:r}]):await yt(this.dws,["aitable","record","update","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--yes"],[{recordId:e,cells:r}])}async queryRecords(e){let n=[],r=null,o=0,i=10;do{let s=["aitable","record","query","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--limit",String(this.config.query_limit)];e.filters!==void 0&&s.push("--filters",JSON.stringify(this.translateFilterFieldNames(e.filters))),e.recordIds&&e.recordIds.length>0&&s.push("--record-ids",e.recordIds.join(",")),r&&s.push("--cursor",r);let c=await this.dws.runJson(s),l=Te(c);n.push(...l);let d=Zo(c);if(o+=1,l.length<this.config.query_limit||d===r)break;r=d}while(r&&o<i&&!e.recordIds);return n}recordToWorkItem(e){let n=Z$(e),r=this.translateCellsToNames(n);this.fillSubmitterFromMetadata(e,r);let o=Y$(e);if(!o)throw new Error(`AI \u8868\u683C\u8BB0\u5F55\u7F3A\u5C11 recordId: ${JSON.stringify(e).slice(0,200)}`);let i=Object.fromEntries(this.nameToType);return{id:o,title:Sr(r[this.fields.title])||"(\u65E0\u6807\u9898)",state:Sr(r[this.fields.state])||"Unknown",currentStep:this.fields.current_step&&Sr(r[this.fields.current_step])||null,owner:this.fields.owner&&Sr(r[this.fields.owner])||null,fields:r,fieldTypes:Object.keys(i).length>0?i:void 0,raw:e}}fillSubmitterFromMetadata(e,n){let r=this.fields.submitter;if(!r||n[r])return;let o=Q$(e);if(o){if(this.nameToType.get(r)==="user"){let i={userId:o.userId};o.corpId&&(i.corpId=o.corpId),o.name&&(i.name=o.name),n[r]=[i];return}n[r]=o.userId}}};function Z$(t){let e=ye(t);if(!v(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(v(r))return r}return e}a(Z$,"recordCells");function Y$(t){let e=ye(t);if(!v(e))return null;for(let n of["recordId","record_id","id"]){let r=e[n];if(typeof r=="string"&&r.trim()!=="")return r}return null}a(Y$,"extractRecordId");function Q$(t){let e=ye(t);return $d(e)}a(Q$,"extractSubmitterIdentity");function $d(t){if(Array.isArray(t)){for(let n of t){let r=$d(n);if(r)return r}return null}if(!v(t))return null;let e=Dd(t,["userId","user_id","createUserId","create_user_id","createdUserId","created_user_id","creatorUserId","creator_user_id"]);if(e){let n=Dd(t,["corpId","corp_id","corpID"]),r=Dd(t,["name","userName","user_name"]);return{userId:e,...n?{corpId:n}:{},...r?{name:r}:{}}}for(let n of Object.values(t)){let r=$d(n);if(r)return r}return null}a($d,"findUserIdentityDeep");function Dd(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r;if(typeof r=="number")return String(r)}return null}a(Dd,"firstStringByKeys");function Sr(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(Sr).filter(Boolean).join(", ");if(v(t)){for(let e of["markdown","text","name","value","displayName","label"]){let n=t[e];if(typeof n=="string"||typeof n=="number")return String(n)}return JSON.stringify(t)}return String(t)}a(Sr,"cellToString");var Js=class{static{a(this,"PollingSource")}name="polling";running=!1;abortController=null;intervalMs;constructor(e){this.intervalMs=e.intervalMs}async start(e){if(!this.running){for(this.running=!0,this.abortController=new AbortController,h.info("event-source","PollingSource started",{name:this.name,role:"reconcile-heartbeat",reconcileIntervalMs:this.intervalMs});this.running;){let n={type:"timer_fired"};try{await e(n)}catch(r){h.error("event-source","PollingSource handler error",{error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.intervalMs)}h.info("event-source","PollingSource stopped")}}stop(){this.running=!1,this.abortController?.abort()}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}};var Zs=class{static{a(this,"EventQueue")}items=[];maxSize;constructor(e=1e4){this.maxSize=e}enqueue(e){if(this.items.push(e),this.items.length>this.maxSize){let n=this.items.length-this.maxSize;this.items.splice(0,n),h.warn("event-queue","\u961F\u5217\u8D85\u9650,\u4E22\u5F03\u6700\u65E7\u52A8\u4F5C",{dropped:n,maxSize:this.maxSize})}}drainAll(){return this.items.splice(0,this.items.length)}get size(){return this.items.length}};var Ys=class{static{a(this,"EventRouter")}handlers;constructor(e){this.handlers=e}asHandler(){return e=>this.route(e)}async route(e){let n=this.handlers[e.type];if(!n){h.debug("event-router","\u672A\u6CE8\u518C\u7684\u4E8B\u4EF6\u7C7B\u578B\uFF0C\u8DF3\u8FC7",{type:e.type});return}await n(e)}};import ew from"path";import tw from"fs";var X$={id:"",title:"",state:"",currentStep:null,owner:null,fields:{},raw:{}};function Pd(t,e){let{title:n,...r}=e,o=typeof n=="string"?n:"\u65B0\u5DE5\u5355";return{[t.tracker.fields.state]:t.tracker.states.initial,[t.tracker.fields.title]:o,...r}}a(Pd,"buildCreateCells");var Qs=class{static{a(this,"EventHandlerExecutor")}settings;tracker;toolkitFactory;globalVars;configScope;recipeCache=new Map;constructor(e){this.settings=e.settings,this.tracker=e.tracker,this.globalVars=e.globalVars??new tn,this.configScope=e.configScope;let n=e.toolkitRegistry;this.toolkitFactory=e.toolkitFactory??(()=>Ri({settings:this.settings,tracker:this.tracker,item:X$,toolkitConfig:this.configScope?.getToolkitConfig(),registry:n}))}async createHandler(e,n,r){let o=await this.loadRecipe(e),i=a(()=>this.toolkitFactory(),"getToolkit"),s=a(()=>(r?this.configScope?.getHandlerConfig(r):void 0)??{},"getConfig"),c={get toolkit(){return i()},get config(){return s()},log:a(l=>h.debug("event-handler",l,{recipe:e}),"log"),pushEvent:n,configDir:this.settings.configDir,getGlobalVar:a(l=>this.globalVars.get(l),"getGlobalVar")};return o.create(c)}async applyAction(e){switch(e.action){case"create_record":{let n=Pd(this.settings,e.fields);h.info("event-handler","\u521B\u5EFA\u65B0\u5DE5\u5355",{title:n[this.settings.tracker.fields.title],fieldCount:Object.keys(e.fields).length}),await this.tracker.updateFields("__new__",n);break}case"update_record":{if(!e.itemId){h.warn("event-handler","update_record \u7F3A\u5C11 itemId");return}h.info("event-handler","\u66F4\u65B0\u5DE5\u5355",{itemId:e.itemId,fieldCount:Object.keys(e.fields).length}),await this.tracker.updateFields(e.itemId,e.fields),await this.tracker.appendEvent(e.itemId,"\u5916\u90E8\u4E8B\u4EF6\u66F4\u65B0");break}}}async loadRecipe(e){let n=this.recipeCache.get(e);if(n)return n;let r=ew.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=ew.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=tw.existsSync(r)?r:tw.existsSync(o)?o:r,s;i.endsWith(".ts")&&await Ut();try{s=await import(mn(i))}catch(l){let d=l instanceof Error?l.message:String(l);if(i.endsWith(".ts")&&d.includes("Unknown file extension"))try{await import("tsx/esm/api").then(u=>u.register?.()),s=await import(mn(i))}catch{throw new Error(`\u65E0\u6CD5\u52A0\u8F7D .ts EventHandler Recipe "${e}"\u3002\u8BF7\u4F7F\u7528 "npx tsx src/cli.ts run" \u542F\u52A8\u3002
478
478
  \u8DEF\u5F84: ${i}`)}else throw new Error(`\u65E0\u6CD5\u52A0\u8F7D EventHandler Recipe "${e}" (${i}): ${d}`)}let c=s.default??s.recipe;if(!c||typeof c.create!="function")throw new Error(`EventHandler Recipe "${e}" \u7F3A\u5C11\u6709\u6548\u7684 create \u51FD\u6570`);return this.recipeCache.set(e,c),c}};var eP={maxAttempts:3,baseBackoffMs:2e3,maxBackoffMs:6e4,maxStepFailures:5},Xs=class{static{a(this,"RetryScheduler")}config;failureCounter=new Map;constructor(e){this.config={...eP,...e}}getBackoffMs(e){return Math.min(this.config.baseBackoffMs*2**e,this.config.maxBackoffMs)}shouldRetry(e){return e<this.config.maxAttempts-1}isExhausted(e,n){let r=this.failureCounter.get(e);return!!(r&&r.stepId===n&&r.count>=this.config.maxStepFailures)}hasFailures(e){return this.failureCounter.has(e)}recordFailure(e,n){let r=this.failureCounter.get(e);r&&r.stepId===n?r.count+=1:this.failureCounter.set(e,{stepId:n,count:1})}clearFailures(e){this.failureCounter.delete(e)}};function rw(t){return t.steps.some(e=>!e.auto)}a(rw,"hasHumanStep");function ow(t,e){if(!rw(e))return{kind:"none"};let n=t.tracker.states.review;if(n)return{kind:"explicit",state:n};let r=t.tracker.states.active;if(r[1])return{kind:"legacy",state:r[1],source:"active[1]"};if(r[0])return{kind:"legacy",state:r[0],source:"active[0]"};throw new Error(`\u5DE5\u4F5C\u6D41 ${e.meta.name} \u542B\u4EBA\u5DE5\u6B65\u9AA4\uFF0C\u4F46 tracker \u65E2\u672A\u58F0\u660E states.review\u3001active \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u786E\u5B9A\u4EBA\u5DE5\u5BA1\u6838\u72B6\u6001`)}a(ow,"resolveReviewStateDetailed");var nw=new WeakSet;function _o(t,e){let n=ow(t,e);return n.kind==="none"?null:(n.kind==="legacy"&&!nw.has(e)&&(nw.add(e),h.warn("review-state",`\u5DE5\u4F5C\u6D41\u542B\u4EBA\u5DE5\u6B65\u9AA4\u4F46\u672A\u58F0\u660E tracker.states.review\uFF0C\u5DF2\u56DE\u9000\u5230 ${n.source}="${n.state}"\uFF08\u65E7\u5DE5\u4F5C\u6D41\u517C\u5BB9\uFF09\uFF0C\u8BF7\u663E\u5F0F\u58F0\u660E states.review`,{workflow:e.meta.name,fallbackSource:n.source,reviewState:n.state,...n.source==="active[0]"?{risk:"\u5BA1\u6838\u6001\u4E0E\u5904\u7406\u4E2D\u72B6\u6001\u91CD\u5408\uFF0C\u4EBA\u5DE5\u6B65\u9AA4\u4F1A\u6C38\u4E45\u505C\u5728\u7B49\u5F85\u5BA1\u6838"}:{}})),n.state)}a(_o,"resolveReviewState");var iw="__human_prepared",ea=class{static{a(this,"StepEngine")}settings;workflow;tracker;executor;stepsMap;retry;onRunEvent;reportedNonSuccessOutcomes=new Map;enteredSteps=new Map;constructor(e){this.settings=e.settings,this.workflow=e.workflow,this.tracker=e.tracker,this.onRunEvent=e.onRunEvent,this.executor=new Ui({settings:e.settings,tracker:e.tracker,roleResolver:e.roleResolver,configScope:e.configScope,toolkitRegistry:e.toolkitRegistry,globalVars:e.globalVars,configRefs:e.configRefs}),this.stepsMap=new Map(e.workflow.steps.map(o=>[o.id,o]));let n=e.settings.raw.agent?.retry,r={maxStepFailures:e.settings.agent.max_step_failures};n&&(n.max_attempts!=null&&(r.maxAttempts=n.max_attempts),n.base_backoff_ms!=null&&(r.baseBackoffMs=n.base_backoff_ms),n.max_backoff_ms!=null&&(r.maxBackoffMs=n.max_backoff_ms)),this.retry=new Xs(r)}get reviewState(){let e=_o(this.settings,this.workflow);if(e===null)throw new Error(`\u5DE5\u4F5C\u6D41 ${this.workflow.meta.name} \u4E0D\u542B\u4EBA\u5DE5\u6B65\u9AA4\uFF0C\u4E0D\u5E94\u8BBF\u95EE\u4EBA\u5DE5\u5BA1\u6838\u72B6\u6001`);return e}async processItem(e,n){let r={},o={recorded:!1,forceReplay:!!this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart},i=this.resolveCurrentStep(e);if(!i)return h.warn("step-engine","\u65E0\u6CD5\u786E\u5B9A\u5F53\u524D\u6B65\u9AA4",{itemId:e.id,state:e.state}),{recorded:o.recorded};let s=String(e.fields.Agent\u95EE\u8BE2??"").trim(),c=String(e.fields.\u4EBA\u5DE5\u56DE\u590D??"").trim();s&&c&&(r.__humanReply=`## \u4EBA\u5DE5\u8865\u5145\u56DE\u7B54
479
479
 
480
480
  \u7528\u6237\u5DF2\u56DE\u7B54\uFF1A${c}
481
481
 
482
- \u539F\u59CB\u95EE\u8BE2\uFF1A${s}`,await this.tracker.updateFields(e.id,{Agent\u95EE\u8BE2:"",\u4EBA\u5DE5\u56DE\u590D:""}));try{for(;;){if(n.aborted)return{recorded:o.recorded};let l=await this.processStep(e,i,r,n,o);if(!l)return{recorded:o.recorded};if(!this.settings.agent.auto_advance)return{recorded:o.recorded};if(!l.auto)return{recorded:o.recorded};i=l}}finally{await this.tracker.flush?.(e.id)}}async processStep(e,n,r,o,i){if(!n.auto){if(e.state===this.reviewState)return h.debug("step-engine","\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838",{itemId:e.id,stepId:n.id}),null;if(n.recipe&&!this.hasHumanStepPrepared(e,n,r))return await this.executeHumanStepRecipe(e,n,r,o,i),null;if(this.settings.tracker.states.review){let d=this.settings.tracker.states.active.slice(1).filter(u=>u!==this.reviewState);if(d.length>0&&!d.includes(e.state))return h.warn("step-engine","\u4EBA\u5DE5\u6B65\u9AA4\u72B6\u6001\u672A\u660E\u786E\u786E\u8BA4\uFF0C\u62D2\u7EDD\u63A8\u8FDB",{itemId:e.id,stepId:n.id,state:e.state,confirmedStates:d}),null}i.recorded=!0,h.info("step-engine","\u4EBA\u5DE5\u5BA1\u6838\u901A\u8FC7\uFF0C\u63A8\u8FDB",{itemId:e.id,stepId:n.id}),await this.tracker.appendEvent(e.id,`\u4EBA\u5DE5\u5BA1\u6838\u901A\u8FC7: ${n.name}`);let l=await this.advanceToNextStep(e,n,r);return this.retry.clearFailures(e.id),l}if(this.retry.isExhausted(e.id,n.id))return i.recorded=!0,await this.blockItem(e,n),null;if(!i.forceReplay&&!this.retry.hasFailures(e.id)&&n.output_mapping&&this.isStepAlreadyComplete(e,n,r))return i.recorded=!0,h.info("step-engine","\u6B65\u9AA4\u5DF2\u5B8C\u6210\uFF0C\u8DF3\u8FC7\u6267\u884C\u76F4\u63A5\u63A8\u8FDB",{itemId:e.id,stepId:n.id}),await this.advanceToNextStep(e,n,r);await this.prepareExecution(e,n);let s=await this.executeWithRetry(n,e,r,o);if(!s)return null;let c=s.status==="success"&&s.tracker===!1;return i.recorded=i.recorded||!c,c&&this.logNoOpTrace(e,n,s),s.status==="success"&&(i.forceReplay=!0,Object.keys(s.output).length>0&&this.mergeStepOutput(r,n,s.output)),await this.handleResult(e,n,s,r)}async updateCheckpoint(e,n){if(this.tracker.updateCheckpoint)await this.tracker.updateCheckpoint(e.id,n);else if(n.fields&&Object.keys(n.fields).length>0&&await this.tracker.updateFields(e.id,n.fields),n.state!==void 0&&await this.tracker.updateState(e.id,n.state),n.currentStep!==void 0)if(n.currentStep===null){let r=this.settings.tracker.fields.current_step;r&&await this.tracker.updateFields(e.id,{[r]:""})}else await this.tracker.updateCurrentStep(e.id,n.currentStep);n.fields&&Object.assign(e.fields,n.fields),n.state!==void 0&&(e.state=n.state),n.currentStep!==void 0&&(e.currentStep=n.currentStep)}async executeWithRetry(e,n,r,o){let i=null;for(let s=0;s<this.retry.config.maxAttempts&&(i=await this.executor.execute(e,n,r,o),!(i.status==="success"||i.status==="needs_human"||i.status==="blocked"));s++){if(i.retryable===!1){h.warn("step-engine","\u4E0D\u53EF\u91CD\u8BD5\u9519\u8BEF,\u8DF3\u8FC7\u5373\u65F6\u91CD\u8BD5",{itemId:n.id,stepId:e.id,error:i.error});break}if(this.retry.shouldRetry(s)){let c=s+1;h.warn("step-engine",`\u6B65\u9AA4\u5931\u8D25\uFF0C\u91CD\u8BD5 (${c}/${this.retry.config.maxAttempts-1})`,{itemId:n.id,stepId:e.id,error:i.error}),await this.tracker.appendEvent(n.id,`\u6B65\u9AA4\u91CD\u8BD5 (${c}/${this.retry.config.maxAttempts-1}): ${i.error??"\u672A\u77E5\u9519\u8BEF"}`),await tP(this.retry.getBackoffMs(s))}}return i}async prepareExecution(e,n){let r=this.settings.tracker.states.active[0],o=this.settings.tracker.states.restart,i={};r&&(e.state===this.settings.tracker.states.initial||e.state===o)&&(i.state=r),e.currentStep!==n.id&&(i.currentStep=n.id),(i.state!==void 0||i.currentStep!==void 0)&&await this.updateCheckpoint(e,i),this.enteredSteps.get(e.id)!==n.id&&(this.enteredSteps.set(e.id,n.id),await this.tracker.appendEvent(e.id,`\u5F00\u59CB\u6267\u884C\u6B65\u9AA4: ${n.name}`),this.onRunEvent?.({type:"step.started",itemId:e.id,stepId:n.id,stepName:n.name}))}async blockItem(e,n,r){let o=r?.trim()||`\u6B65\u9AA4 ${n.name} \u8FDE\u7EED\u5931\u8D25\u5DF2\u8FBE\u4E0A\u9650`;h.error("step-engine","\u8F6C\u5165\u963B\u585E",{itemId:e.id,stepId:n.id,reason:o}),await this.tracker.appendEvent(e.id,`${o}\uFF0C\u5DF2\u963B\u585E`);let i=this.settings.tracker.states.blocked;i?await this.tracker.updateState(e.id,i):h.warn("step-engine","\u672A\u914D\u7F6E tracker.states.blocked\uFF0C\u5DE5\u5355\u65E0\u6CD5\u8F6C\u5165\u963B\u585E\u6001\u3001\u53EF\u80FD\u88AB\u6301\u7EED\u91CD\u8BD5",{itemId:e.id,stepId:n.id}),this.retry.clearFailures(e.id)}resolveCurrentStep(e){let n=this.workflow.orderedStepIds[0],r=n?this.stepsMap.get(n)??null:null;if(this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart)return r;if(e.currentStep){let o=this.stepsMap.get(e.currentStep);if(o)return o}return e.state===this.settings.tracker.states.initial||this.settings.tracker.states.active.includes(e.state)?r:null}async handleFailureOrBlock(e,n,r){switch(r.status){case"failed":if(r.retryable===!1)await this.blockItem(e,n,r.error);else{if(this.retry.recordFailure(e.id,n.id),!this.markNonSuccessOutcome(e.id,n.id,"failed",r.error??"\u672A\u77E5\u9519\u8BEF"))break;await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u5931\u8D25: ${r.error??"\u672A\u77E5\u9519\u8BEF"}`)}this.onRunEvent?.({type:"step.failed",itemId:e.id,stepId:n.id,stepName:n.name,error:r.error??"\u672A\u77E5\u9519\u8BEF",logs:r.logs});break;case"blocked":{let o=r.output.__askHumanSnapshot;if(o&&o.code==="ASK_HUMAN_DETECTED"){let i=String(o.question??""),s=this.settings.tracker.fields.event_log??"\u4E8B\u4EF6\u65E5\u5FD7",l=(String(e.fields[s]??"").match(/\[问询#\d+\]/g)??[]).length;await this.tracker.updateFields(e.id,{Agent\u95EE\u8BE2:i}),await this.tracker.appendEvent(e.id,`[\u95EE\u8BE2#${l+1}] ${i}`),l+1>=3&&await this.tracker.appendEvent(e.id,"ASK_HUMAN_EXHAUSTED: \u95EE\u8BE2\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650")}else await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u963B\u585E: ${r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165"}`);this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:n.id,stepName:n.name,reason:r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165",logs:r.logs}),this.settings.tracker.states.blocked&&await this.tracker.updateState(e.id,this.settings.tracker.states.blocked),this.retry.clearFailures(e.id);break}case"needs_human":if(!this.markNonSuccessOutcome(e.id,n.id,"needs_human",r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838"))break;await this.tracker.appendEvent(e.id,`\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838: ${r.blockReason??""}`),this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:n.id,stepName:n.name,reason:r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838",logs:r.logs}),this.retry.clearFailures(e.id);break}}async handleResult(e,n,r,o){switch(r.status){case"success":{let i={};Object.keys(r.output).length>0&&Object.assign(i,this.resolveOutput(n,r.output)),this.retry.clearFailures(e.id),this.reportedNonSuccessOutcomes.delete(e.id),this.enteredSteps.delete(e.id);let s=await this.advanceToNextStep(e,n,o,i);return this.onRunEvent?.({type:"step.succeeded",itemId:e.id,stepId:n.id,stepName:n.name,logs:r.logs}),s}case"failed":case"blocked":case"needs_human":return await this.handleFailureOrBlock(e,n,r),null}return null}markNonSuccessOutcome(e,n,r,o){let i={stepId:n,status:r,reason:o.trim()||(r==="failed"?"\u672A\u77E5\u9519\u8BEF":"\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838")},s=this.reportedNonSuccessOutcomes.get(e);return s&&s.stepId===i.stepId&&s.status===i.status&&s.reason===i.reason?!1:(this.reportedNonSuccessOutcomes.set(e,i),!0)}async advanceToNextStep(e,n,r,o){let i=o&&Object.keys(o).length>0?{...o}:void 0,s=this.workflow.orderedStepIds.indexOf(n.id),c=this.workflow.orderedStepIds[s+1];if(!c){let d=this.settings.tracker.states.terminal[0];return await this.updateCheckpoint(e,{...i?{fields:i}:{},...d?{state:d}:{},currentStep:null}),await this.tracker.appendEvent(e.id,"\u6D41\u7A0B\u5B8C\u6210"),h.info("step-engine","\u6D41\u7A0B\u5B8C\u6210",{itemId:e.id}),this.onRunEvent?.({type:"record.completed",itemId:e.id}),null}let l=this.stepsMap.get(c);return l&&!l.auto&&!l.recipe?(await this.updateCheckpoint(e,{...i?{fields:i}:{},currentStep:c,state:this.reviewState}),await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u5B8C\u6210: ${n.name} \u2192 \u4E0B\u4E00\u6B65: ${l.name}`),await this.tracker.appendEvent(e.id,`\u7B49\u5F85\u4EBA\u5DE5\u64CD\u4F5C: ${l.name}`),h.info("step-engine","\u8FDB\u5165\u4EBA\u5DE5\u7B49\u5F85",{itemId:e.id,stepId:c}),null):(await this.updateCheckpoint(e,{...i?{fields:i}:{},currentStep:c}),await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u5B8C\u6210: ${n.name} \u2192 \u4E0B\u4E00\u6B65: ${l?.name??c}`),h.info("step-engine","\u6B65\u8FDB",{itemId:e.id,from:n.id,to:c}),l??null)}isStepAlreadyComplete(e,n,r){if(!n.output_mapping)return!1;let o=r[n.id];return S(o)?Object.keys(n.output_mapping).every(i=>{let s=o[i];return s!=null&&s!==""}):this.hasRecipeOutput(e,n)}hasRecipeOutput(e,n){if(!n.output_mapping)return!1;let r=Object.values(n.output_mapping);return r.length>0&&r.every(o=>{let i=e.fields[o];return i!=null&&i!==""})}hasHumanStepPrepared(e,n,r){let o=r[n.id];return S(o)&&o[iw]===!0?!0:this.hasHumanPreparedEvent(e,n)}hasHumanPreparedEvent(e,n){let r=this.settings.tracker.fields.event_log;if(!r)return!1;let o=e.fields[r];return typeof o!="string"?!1:o.includes(`\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838: ${n.name}`)||o.includes(`\u7B49\u5F85\u4EBA\u5DE5\u64CD\u4F5C: ${n.name}`)}async executeHumanStepRecipe(e,n,r,o,i){if(this.retry.isExhausted(e.id,n.id)){i.recorded=!0,await this.blockItem(e,n);return}await this.prepareExecution(e,n);let s=await this.executeWithRetry(n,e,r,o);if(!s)return;let c=s.status==="success"&&s.tracker===!1;if(i.recorded=i.recorded||!c,c&&this.logNoOpTrace(e,n,s),s.status==="success"){this.mergeStepOutput(r,n,s.output),this.markHumanStepPrepared(r,n);let l={...this.resolveOutput(n,s.output)};await this.updateCheckpoint(e,{...Object.keys(l).length>0?{fields:l}:{},state:this.reviewState})}switch(s.status){case"success":this.onRunEvent?.({type:"step.succeeded",itemId:e.id,stepId:n.id,stepName:n.name,logs:s.logs}),this.retry.clearFailures(e.id),this.reportedNonSuccessOutcomes.delete(e.id),this.enteredSteps.delete(e.id),await this.tracker.appendEvent(e.id,`\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838: ${n.name}`),h.info("step-engine","recipe \u5B8C\u6210\uFF0C\u8FDB\u5165\u4EBA\u5DE5\u5BA1\u6838",{itemId:e.id,stepId:n.id}),this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:n.id,stepName:n.name,reason:"\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838",logs:s.logs});break;case"failed":case"blocked":case"needs_human":await this.handleFailureOrBlock(e,n,s);break}}logNoOpTrace(e,n,r){let o=r.logs.join(" | ").slice(0,300);h.info("step-engine","\u6B65\u9AA4 no-op\uFF1A\u672C\u6B21\u4E0D\u7559\u75D5",{itemId:e.id,stepId:n.id,...o?{note:o}:{}})}mergeStepOutput(e,n,r){let o=S(e[n.id])?e[n.id]:{};e[n.id]={...o,...r}}markHumanStepPrepared(e,n){let r=S(e[n.id])?e[n.id]:{};e[n.id]={...r,[iw]:!0}}resolveOutput(e,n){let r=e.output_mapping;if(!r)return n;let o={};for(let[i,s]of Object.entries(r))i in n&&(o[s]=n[i]);return o}};function tP(t){return new Promise(e=>setTimeout(e,t))}a(tP,"sleep");var ta=class{constructor(e){this.opts=e;this.capacity=Math.max(1,e.capacity)}opts;static{a(this,"TaskPool")}queue=[];queuedKeys=new Set;inFlight=new Map;capacity;get depth(){return this.queue.length}get running(){return this.inFlight.size}has(e){return this.queuedKeys.has(e)||this.inFlight.has(e)}submit(e){let n=0;for(let r of e)this.has(r.key)||(this.queue.push(r),this.queuedKeys.add(r.key),n++);return n>0&&this.pump(),n}async drain(){for(;this.inFlight.size>0;)await Promise.all([...this.inFlight.values()])}pump(){for(;this.inFlight.size<this.capacity;){let e=this.queue.shift();if(e===void 0)return;this.queuedKeys.delete(e.key);let n=e.run().catch(r=>{this.opts.onError?this.opts.onError(e,r):h.error("task-pool","\u4EFB\u52A1\u5904\u7406\u5F02\u5E38",{key:e.key,error:r instanceof Error?r.message:String(r)})}).finally(()=>{this.inFlight.delete(e.key),this.pump()});this.inFlight.set(e.key,n)}}};import{randomBytes as nP}from"crypto";var rP="__transient_",na=class{constructor(e,n){this.inner=e;this.fields=n;e.updateCheckpoint&&(this.updateCheckpoint=async(r,o)=>{let i=this.buffers.get(r);if(i){this.applyCheckpoint(i,o);return}await this.inner.updateCheckpoint(r,o)}),e.flush&&(this.flush=async r=>{r&&this.buffers.has(r)||await this.inner.flush(r)})}inner;fields;static{a(this,"DeferredTracker")}buffers=new Map;updateCheckpoint;flush;beginTransient(e){let n=`${rP}${nP(8).toString("hex")}`;return this.buffers.set(n,{cells:{...e}}),n}async finalize(e,n){let r=this.buffers.get(e);this.buffers.delete(e),r&&n.materialize&&await this.inner.updateFields("__new__",r.cells)}async fetchItemsByIds(e){let n=e.filter(i=>this.buffers.has(i)),r=e.filter(i=>!this.buffers.has(i)),o=n.map(i=>this.bufferToItem(i));return r.length>0&&o.push(...await this.inner.fetchItemsByIds(r)),o}fetchCandidateItems(){return this.inner.fetchCandidateItems()}fetchItemsByStates(e){return this.inner.fetchItemsByStates(e)}fetchAllItems(){return this.inner.fetchAllItems()}fetchItemsByFilter(e,n){return this.inner.fetchItemsByFilter(e,n)}async updateState(e,n){let r=this.buffers.get(e);if(r){r.cells[this.fields.state]=n;return}await this.inner.updateState(e,n)}async updateCurrentStep(e,n){let r=this.buffers.get(e);if(r){this.fields.current_step&&(r.cells[this.fields.current_step]=n);return}await this.inner.updateCurrentStep(e,n)}async updateFields(e,n){let r=this.buffers.get(e);if(r){Object.assign(r.cells,n);return}await this.inner.updateFields(e,n)}async appendEvent(e,n){let r=this.buffers.get(e);if(r){if(!this.fields.event_log)return;let o=String(r.cells[this.fields.event_log]??""),i=le();r.cells[this.fields.event_log]=[o,`[${i}] ${n}`].filter(Boolean).join(`
483
- `);return}await this.inner.appendEvent(e,n)}applyCheckpoint(e,n){n.fields&&Object.assign(e.cells,n.fields),n.state!==void 0&&(e.cells[this.fields.state]=n.state),n.currentStep!==void 0&&this.fields.current_step&&(e.cells[this.fields.current_step]=n.currentStep??"")}bufferToItem(e){let n=this.buffers.get(e).cells;return{id:e,title:String(n[this.fields.title]??"(\u65E0\u6807\u9898)"),state:String(n[this.fields.state]??""),currentStep:this.fields.current_step&&String(n[this.fields.current_step]??"")||null,owner:null,fields:n,raw:{transient:!0}}}};function Md(t){return{id:t.id,title:t.title,state:t.state,currentStep:t.currentStep}}a(Md,"snapshotRunRecord");function sw(t){return qe(t)!==void 0||Pr(t)!==void 0}a(sw,"eventContextRequiresTransient");async function aw(t,e){qe(t)&&await bi.finalize(t,e)}a(aw,"finalizeEventContext");var oP=500,ra=class{static{a(this,"Orchestrator")}settings;workflow;tracker;deferredTracker;stepEngine;eventHandlerExecutor;schedulerSources=[];eventBindings;queue=new Zs;handlerInstances=[];toolkitFactory;onRunEvent;configScope;observedRunRecordSignatures=new Map;running=!1;abortController=null;taskPool;seedSeq=0;drainTimeoutMs=15e3;constructor(e){this.settings=e.settings,this.workflow=e.workflow,this.deferredTracker=new na(e.tracker,e.settings.tracker.fields),this.tracker=this.deferredTracker,this.eventBindings=e.eventBindings??[],this.toolkitFactory=e.toolkitFactory,this.onRunEvent=e.onRunEvent,this.configScope=e.configScope,this.stepEngine=new ea({settings:e.settings,workflow:e.workflow,tracker:this.deferredTracker,roleResolver:e.roleResolver,toolkitRegistry:e.toolkitRegistry,onRunEvent:e.onRunEvent,globalVars:e.globalVars,configScope:e.configScope,configRefs:e.configRefs}),this.eventHandlerExecutor=new Qs({settings:e.settings,tracker:this.deferredTracker,toolkitFactory:e.toolkitFactory,toolkitRegistry:e.toolkitRegistry,globalVars:e.globalVars,configScope:e.configScope}),this.taskPool=new ta({capacity:e.settings.agent.max_concurrent,onError:a((n,r)=>{h.error("orchestrator","\u4EFB\u52A1\u5904\u7406\u5F02\u5E38",{key:n.key,error:r instanceof Error?r.message:String(r)})},"onError")})}async start(){if(this.running)return;this.running=!0,this.abortController=new AbortController;for(let{source:r,handlerRecipe:o,recordPolicy:i}of this.eventBindings){let s;try{s=await this.eventHandlerExecutor.createHandler(o,c=>this.queue.enqueue(cw(c,i)),r.name)}catch(c){h.error("orchestrator","\u4E8B\u4EF6\u6E90\u542F\u52A8\u5931\u8D25",{source:r.name,handlerRecipe:o,error:c instanceof Error?c.message:String(c)});continue}this.handlerInstances.push(s),r.start(c=>{for(let l of c)try{s.onEvent(l)}catch(d){h.error("orchestrator","handler.onEvent \u5F02\u5E38",{source:r.name,error:d instanceof Error?d.message:String(d)})}}).catch(c=>{h.error("orchestrator","source.start \u5F02\u5E38",{source:r.name,error:c instanceof Error?c.message:String(c)})})}let e=new Ys({timer_fired:a(async()=>{await this.reconcile()},"timer_fired")}),n=new Js({intervalMs:this.settings.polling.interval_ms});this.schedulerSources.push(n),h.info("orchestrator","\u542F\u52A8",{schedulerSources:this.schedulerSources.map(r=>r.name),eventSources:this.eventBindings.map(r=>`${r.source.name} \u2192 ${r.handlerRecipe}`),reconcileIntervalMs:this.settings.polling.interval_ms}),await n.start(e.asHandler()),h.info("orchestrator","\u5DF2\u505C\u6B62")}async stop(){this.running=!1;for(let r of this.schedulerSources)r.stop();for(let{source:r}of this.eventBindings)r.stop();for(let r of this.handlerInstances)r.stop();(this.taskPool.running>0||this.taskPool.depth>0)&&h.info("orchestrator","\u7B49\u5F85\u5728\u9014\u4EFB\u52A1\u7ED3\u675F",{running:this.taskPool.running,queued:this.taskPool.depth}),await this.taskPool.drain();let e=Oa();e>0&&h.info("orchestrator","\u7B49\u5F85\u8FDB\u884C\u4E2D\u7684\u5B50\u8FDB\u7A0B\u7ED3\u675F",{pending:e}),await lf(this.drainTimeoutMs)||(h.warn("orchestrator","drain \u8D85\u65F6\uFF0C\u5F3A\u5236\u4E2D\u6B62\u6B8B\u7559\u5B50\u8FDB\u7A0B",{remaining:Oa()}),this.abortController?.abort())}async triggerOnce(e={}){let n=Date.now(),r=e.sourceName?this.eventBindings.find(u=>u.source.name===e.sourceName):this.eventBindings[0];if(!r){if(this.eventBindings.length===0)throw new Error("\u8BE5\u5DE5\u4F5C\u6D41\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 event_sources\uFF0C\u65E0\u6CD5\u5355\u6B21\u89E6\u53D1");let u=this.eventBindings.map(f=>f.source.name).join("\u3001");throw new Error(`\u4E8B\u4EF6\u6E90 "${e.sourceName}" \u4E0D\u5B58\u5728\u3002\u8BE5\u5DE5\u4F5C\u6D41\u53EF\u7528\u4E8B\u4EF6\u6E90\uFF1A${u}`)}let o=[],i=await this.eventHandlerExecutor.createHandler(r.handlerRecipe,u=>o.push(cw(u,r.recordPolicy)),r.source.name);try{i.onEvent({type:e.event?.type??"manual_trigger",payload:e.event?.payload??{},timestamp:e.event?.timestamp??new Date().toISOString(),...e.event?.itemId!==void 0?{itemId:e.event.itemId}:{}});let u=e.graceMs??oP;o.length===0&&u>0&&await iP(o,u)}finally{i.stop()}let s=e.signal??new AbortController().signal,c=0,l=0;for(let u of o)u.action==="create_record"&&u.defer?(await this.runTransient(u,s),l++):(await this.eventHandlerExecutor.applyAction(u),c++);let d={sourceName:r.source.name,handlerRecipe:r.handlerRecipe,actions:o.length,applied:c,transient:l,durationMs:Date.now()-n};return h.info("orchestrator","\u5355\u6B21\u89E6\u53D1\u5B8C\u6210",d),d}async reconcile(){let e=this.queue.drainAll(),n=[];for(let d of e){if(d.action==="create_record"&&d.defer){n.push(d);continue}try{await this.eventHandlerExecutor.applyAction(d)}catch(u){h.error("orchestrator","\u843D\u5E93\u5931\u8D25",{action:d.action,error:u instanceof Error?u.message:String(u)})}}let r=await this.tracker.fetchCandidateItems(),o=_o(this.settings,this.workflow),i=o===null?r:r.filter(d=>d.state!==o);for(let d of r)this.emitRunRecordSnapshot(d,o);let s=this.abortController?.signal??new AbortController().signal,c=[...n.map(d=>({key:`seed:${++this.seedSeq}`,run:a(()=>this.runTransient(d,s),"run")})),...i.map(d=>({key:d.id,run:a(async()=>{await this.stepEngine.processItem(d,s)},"run")}))];if(c.length===0)return;let l=this.taskPool.submit(c);h.info("orchestrator","\u4EFB\u52A1\u6295\u9012",{seeds:n.length,items:i.length,accepted:l,skipped:c.length-l,inFlight:this.taskPool.running,queueDepth:this.taskPool.depth,waiting:r.length-i.length})}async runTransient(e,n){let r=Pd(this.settings,e.fields),o=this.deferredTracker.beginTransient(r),i={id:o,title:String(r[this.settings.tracker.fields.title]??""),state:this.settings.tracker.states.initial,currentStep:null,owner:null,fields:{...r},raw:{transient:!0,...e.eventContext?{eventContext:e.eventContext}:{}}},s=!0,c=!1;try{s=(await this.stepEngine.processItem(i,n)).recorded,c=this.settings.tracker.states.terminal.includes(i.state)}catch(l){h.error("orchestrator","\u77AC\u6001\u8FD0\u884C\u5F02\u5E38",{transientId:o,error:l instanceof Error?l.message:String(l)}),s=!0,c=!1}try{await aw(e.eventContext,{completed:c,recorded:s})}catch(l){h.warn("orchestrator","\u4E8B\u4EF6\u4E0A\u4E0B\u6587\u6536\u5C3E\u5931\u8D25\uFF0C\u4E3B\u6D41\u7A0B\u7EE7\u7EED",{transientId:o,error:l instanceof Error?l.message:String(l)})}s||h.info("orchestrator","\u77AC\u6001\u8FD0\u884C\u672A\u843D\u8868\uFF08\u7B56\u7565\u5224\u5B9A\u4E0D\u7559\u75D5\uFF09",{transientId:o,title:i.title.slice(0,100),completed:c}),await this.deferredTracker.finalize(o,{materialize:s})}emitRunRecordSnapshot(e,n){let r=`${e.title}\0${e.state}\0${e.currentStep??""}`;this.observedRunRecordSignatures.get(e.id)!==r&&(this.observedRunRecordSignatures.set(e.id,r),this.onRunEvent?.({type:"record.observed",record:Md(e)}),e.state===n&&e.currentStep&&this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:e.currentStep,stepName:this.stepNameFor(e.currentStep),reason:"\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838"}))}stepNameFor(e){return this.workflow.steps.find(n=>n.id===e)?.name??e}};function cw(t,e){return t.action==="create_record"&&(e==="on_demand"||sw(t.eventContext))?{...t,defer:!0}:t}a(cw,"tagDeferred");async function iP(t,e){let n=Date.now()+e,r=25;for(;t.length===0&&Date.now()<n;)await new Promise(o=>setTimeout(o,r))}a(iP,"waitForFirstAction");import Fw from"path";var Od=3e5,oa=class{static{a(this,"KbAutoRefresher")}options;timer=null;inFlight=!1;stopped=!1;constructor(e){this.options=e}start(){this.stopped||(h.info("kb-watcher","\u542F\u52A8\u81EA\u52A8\u5237\u65B0",{intervalMs:Od}),this.scheduleNext(0))}stop(){this.stopped=!0,this.timer&&(clearTimeout(this.timer),this.timer=null),h.info("kb-watcher","\u5DF2\u505C\u6B62")}scheduleNext(e){this.stopped||(this.timer=setTimeout(()=>{this.tick()},e),this.timer.unref?.())}async tick(){if(!this.stopped){if(this.inFlight){this.scheduleNext(Od);return}this.inFlight=!0;try{let e=await this.options.resolveCollections();if(e.length===0)h.debug("kb-watcher","\u65E0 collection,\u8DF3\u8FC7\u672C\u8F6E");else{let n=await un({configDir:this.options.configDir,collections:e,...this.options.agent?{agent:this.options.agent}:{},...this.options.configPath?{configPath:this.options.configPath}:{},...this.options.model?{model:this.options.model}:{},...this.options.bins?{bins:this.options.bins}:{}}),r=n.filter(i=>i.action==="compiled").length,o=n.filter(i=>i.action==="failed").length;if(r>0||o>0){h.info("kb-watcher","\u5237\u65B0\u5B8C\u6210",{total:n.length,compiled:r,skipped:n.length-r-o,failed:o});for(let i of n.filter(s=>s.action==="failed"))h.warn("kb-watcher","\u7F16\u8BD1\u5931\u8D25",{collection:i.collection,error:i.error})}else h.debug("kb-watcher","\u65E0\u53D8\u66F4",{total:n.length})}}catch(e){h.error("kb-watcher","\u81EA\u52A8\u5237\u65B0\u5F02\u5E38",{error:e instanceof Error?e.message:String(e)})}finally{this.inFlight=!1,this.scheduleNext(Od)}}}};import{existsSync as sP}from"fs";import lw from"path";function dw(t){return t.map(e=>e.collection)}a(dw,"collectionNames");var aP="knowledge-steward",xr=class extends Error{static{a(this,"RequiredTaxonomyError")}constructor(e){super(e),this.name="RequiredTaxonomyError"}};function cP(t){let e=new Map;for(let n of t)for(let r of n.knowledge_scope?.kb_collections??[]){let o=typeof r=="string"?{collection:r,roleIds:[n.id]}:{collection:r.collection,...r.source?{source:r.source}:{},...r.compile?{compile:r.compile}:{},roleIds:[n.id]},i=e.get(o.collection);if(!i){e.set(o.collection,o);continue}i.roleIds=[...i.roleIds??[],n.id],o.source&&i.source&&o.source!==i.source&&h.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C\u8FDC\u7A0B\u6E90\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),o.compile&&i.compile&&JSON.stringify(o.compile)!==JSON.stringify(i.compile)&&h.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C compile\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),!i.source&&o.source&&(i.source=o.source),!i.compile&&o.compile&&(i.compile=o.compile)}return[...e.values()]}a(cP,"resolveKbCollectionsFromRoles");async function Ir(t){let e=new Mt(t.rolesDir),n=lt(t.configDir,t.envSource);if(n?.roles){let c=lw.resolve(t.configDir,"profile");e.loadFromProfile(n.roles,c)}else await e.loadAll();let r=e.list(),o=cP(r),s=(r.find(c=>c.id===aP)?.knowledge_scope?.kb_collections??[]).map(c=>typeof c=="string"?c:c.collection);return{collections:dw(o),resolved:o,remoteSources:o.filter(c=>c.source!==void 0).map(c=>({source:c.source,collection:c.collection})),requiredTaxonomyCollections:s}}a(Ir,"collectKbCollections");function lP(t,e){for(let n of e){let r=lw.resolve(t,n,"taxonomy.yml");if(!sP(r))throw new xr(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7F3A\u5C11\u81EA\u5DF1\u7684 taxonomy.yml: ${r}`);try{At({configDir:t,entry:n})}catch(o){let i=o instanceof Error?o.message:String(o);throw new xr(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7684 taxonomy.yml \u975E\u6CD5: ${i}`)}}}a(lP,"validateRequiredTaxonomies");async function jd(t){let{settings:e,force:n,onProgress:r}=t,o=await Ir(e),i=o.resolved,s=o.collections;if(lP(e.configDir,o.requiredTaxonomyCollections),i.length===0)return{collections:s,results:[],skippedReason:"no-collections"};let c=await or(e),l=c.configuredAgent,d=br(e.raw?.toolkit_config);if(!l){let f=i.filter(Ft);if(f.length===0)return h.warn("kb","engine \u4E3A llm_only,\u65E0 coding agent \u53EF\u7528,\u8DF3\u8FC7 KB \u7F16\u8BD1",{collections:s,engine:c.configuredEngine}),{collections:s,results:[],skippedReason:"llm_only"};let p=await un({configDir:e.configDir,collections:f,...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:dw(f),results:p}}let u=await un({configDir:e.configDir,collections:i,...n?{force:n}:{},agent:l,...e.agent.model?{model:e.agent.model}:{},configPath:bt(e.configDir),...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:s,results:u}}a(jd,"setupKnowledgeBases");import{readFile as fP,writeFile as pP}from"fs/promises";import gP from"yaml";var dP=10;async function ia(t,e){let{baseId:n,fields:r}=e,o=e.name,i=await Nd(t,n,o,e.onProgress);if(i)return await e.onProgress?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${o}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${i.tableId}`),{tableId:i.tableId,reused:!0};try{return{tableId:await uw(t,{baseId:n,name:o,fields:r}),reused:!1}}catch(s){if(!fw(s))throw s;await e.onProgress?.(`\u8868\u540D\u300C${o}\u300D\u51B2\u7A81\uFF0C\u5C1D\u8BD5\u590D\u7528\u5DF2\u5B58\u5728\u8868`);let c=await Ld(t,n,o);if(c)return await e.onProgress?.(`\u590D\u7528\u5DF2\u6709\u8868\u300C${o}\u300D: ${c.tableId}`),{tableId:c.tableId,reused:!0};let l=await uP(t,{baseId:n,name:o,fields:r,onProgress:e.onProgress});if(l)return l;throw s}}a(ia,"createTableWithConflictResolution");async function uP(t,e){let{baseId:n,fields:r}=e;for(let o=2;o<=dP+1;o++){let i=`${e.name} ${o}`;try{await e.onProgress?.(`\u5C1D\u8BD5\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA`);let s=await uw(t,{baseId:n,name:i,fields:r});return await e.onProgress?.(`\u5DF2\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA\u8868: ${s}`),{tableId:s,reused:!1}}catch(s){if(!fw(s))throw s;let c=await Ld(t,n,i);if(c)return{tableId:c.tableId,reused:!0}}}return null}a(uP,"createTableWithRename");async function uw(t,e){let n=await t.runJson(["aitable","table","create","--base-id",e.baseId,"--name",e.name,"--fields",JSON.stringify(e.fields),"--timeout","60","--yes"],{timeoutMs:9e4}),r=pw(n);if(!r)throw new Error(`\u521B\u5EFA\u8868\u300C${e.name}\u300D\u540E\u672A\u8FD4\u56DE tableId`);return r}a(uw,"createTable");async function Nd(t,e,n,r){try{return await Ld(t,e,n)}catch(o){let i=o instanceof Error?o.message:String(o);return await r?.(`\u65E0\u6CD5\u5217\u51FA base \u5DF2\u6709\u8868\uFF08${i}\uFF09\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u65B0\u5EFA\u300C${n}\u300D`),null}}a(Nd,"findExistingTableByName");async function Ld(t,e,n){let r=await Wd(t,e),o=n.trim();return r.find(i=>i.name.trim()===o)??null}a(Ld,"findTableByName");async function Wd(t,e){let n=await t.runJson(["aitable","table","get","--base-id",e,"--timeout","60"],{timeoutMs:9e4}),r=ye(n);return Te(r).filter(S).map(i=>({tableId:String(i.tableId??i.table_id??i.id??""),name:String(i.name??i.tableName??i.title??"")})).filter(i=>i.tableId&&i.name)}a(Wd,"listTablesInBase");function fw(t){if(!(t instanceof ve))return!1;let e=`${t.message}
484
- ${t.stderr}`.toLowerCase();return e.includes("already exist")||e.includes("\u5DF2\u5B58\u5728")||e.includes("duplicate")||e.includes("exist")}a(fw,"isTableNameConflictError");function pw(t){let e=ye(t),n=Fd(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=pw(r);if(o)return o}return null}a(pw,"findTableId");function Fd(t,e){if(!S(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r.trim()}for(let n of Object.values(t)){let r=Array.isArray(n)?n.map(o=>Fd(o,e)).find(Boolean)??null:Fd(n,e);if(r)return r}return null}a(Fd,"findStringByKeys");async function zd(t){let{trackerFilePath:e,settings:n,workflow:r,onProgress:o}=t;if(n.tracker.table_id.trim())return n;await o?.("\u672A\u586B\u5199 Table Id\uFF0C\u4F18\u5148\u590D\u7528 base \u5185\u540C\u540D\u8868\uFF0C\u5426\u5219\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868","create_table");let i=await mw(n,r,o);return await gw(e,i),await o?.(`\u6570\u636E\u8868\u5DF2\u5C31\u7EEA\uFF1A${i}`,"create_table"),{...n,tracker:{...n.tracker,table_id:i}}}a(zd,"ensureTableExists");async function gw(t,e){let n=await fP(t,"utf8"),r=gP.parseDocument(n);if(!r.hasIn(["tracker"]))throw Object.assign(new Error(`\u914D\u7F6E\u6587\u4EF6 ${t} \u7F3A\u5C11 tracker\uFF0C\u65E0\u6CD5\u5199\u56DE\u65B0\u5EFA\u7684\u6570\u636E\u8868 ID`),{code:"CONFIG_TRACKER_MISSING",status:500});r.setIn(["tracker","table_id"],e),await pP(t,r.toString(),"utf8")}a(gw,"writeTableIdToConfig");async function mw(t,e,n){let r=new he({bin:t.tracker.dws_bin,timeoutMs:6e4}),o="dws aitable table create",i=mP(e.tracker?.label??e.meta.name??"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"),s=await Nd(r,t.tracker.base_id,i,d=>n?.(d,"create_table"));if(s)return h.info("setup","\u590D\u7528 base \u4E0B\u540C\u540D AI \u8868\u683C\u6570\u636E\u8868",{baseId:t.tracker.base_id,tableName:i,tableId:s.tableId}),await n?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${i}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${s.tableId}`,"create_table"),s.tableId;await n?.("\u6B63\u5728\u8C03\u7528 dws \u521B\u5EFA\u6570\u636E\u8868","create_table"),h.info("setup","\u8C03\u7528 dws \u521B\u5EFA AI \u8868\u683C\u6570\u636E\u8868",{command:o,dwsBin:t.tracker.dws_bin,baseId:t.tracker.base_id,tableName:i});let c=await r.runJson(["aitable","table","create","--base-id",t.tracker.base_id,"--name",i,"--fields",JSON.stringify(hw(t)),"--timeout","60","--yes"],{timeoutMs:9e4}),l=yw(c);if(!l){let d=ye(c);throw h.warn("setup","dws \u521B\u5EFA\u6570\u636E\u8868\u540E\u672A\u8FD4\u56DE tableId",{command:o,baseId:t.tracker.base_id,response:d}),Object.assign(new Error("dws \u5EFA\u8868\u547D\u4EE4\u672A\u8FD4\u56DE tableId\uFF0C\u65E0\u6CD5\u786E\u8BA4\u6570\u636E\u8868\u662F\u5426\u521B\u5EFA\u6210\u529F\uFF1B\u8BF7\u68C0\u67E5 dws CLI \u8F93\u51FA\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u786E\u8BA4\u540E\u624B\u52A8\u8865\u5145 table_id"),{code:"TABLE_ID_NOT_RETURNED",status:502,details:{command:o,response:d}})}return l}a(mw,"createWorkflowTable");function mP(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"}a(mP,"sanitizeTableName");function hw(t){let e=[t.tracker.states.initial,...t.tracker.states.active,...t.tracker.states.terminal,t.tracker.states.blocked,t.tracker.states.review].filter((l,d,u)=>!!l&&u.indexOf(l)===d),n=t.tracker.fields.title,r=t.tracker.fields.state,o=[],i=new Set,s=a(l=>{i.has(l.fieldName)||(o.push(l),i.add(l.fieldName))},"addField"),c=a(l=>(t.tracker.field_definitions??[]).find(d=>d.name===l)?.description,"descOf");if(n===r)return s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),o;s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),s({fieldName:r,type:"singleSelect",config:{options:e.map(l=>({name:l}))},...c(r)?{description:c(r)}:{}});for(let l of t.tracker.field_definitions??[])s(hP(l));return o}a(hw,"initialTableFields");function hP(t){let e={fieldName:t.name,type:t.type},n={};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),t.formatter&&(n.formatter=t.formatter),Object.keys(n).length>0&&(e.config=n),t.description&&(e.description=t.description),e}a(hP,"fieldDefinitionToCreatePayload");function yw(t){let e=ye(t),n=Bd(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=yw(r);if(o)return o}return null}a(yw,"findTableId");function Bd(t,e){if(!S(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r.trim()}for(let n of Object.values(t)){let r=Array.isArray(n)?n.map(o=>Bd(o,e)).find(Boolean)??null:Bd(n,e);if(r)return r}return null}a(Bd,"findStringByKeys");async function Ao(t,e,n,r){let o=r?.get(e);if(o||(o=await Wd(t,e),r?.set(e,o)),!o.some(s=>s.tableId===n))throw new Error(`tracker.table_id="${n}" \u4E0D\u5C5E\u4E8E tracker.base_id="${e}"\uFF08\u53EF\u80FD\u662F\u6539\u4E86 base_id \u4F46\u6CA1\u6E05\u7A7A\u65E7 table_id\uFF09\u3002\u8BF7\u6E05\u7A7A table_id \u540E\u91CD\u8DD1 setup\u3002`)}a(Ao,"assertTableBelongsToBase");import Mo from"path";import{access as qP}from"fs/promises";import HP from"fs";var Tw={};ck(Tw,{ASSETS_DIR:()=>Zd,HASH_VERSION:()=>Nt,MANIFEST_NAME:()=>Jd,MAX_PAGE_SIZE:()=>ba,ROWS_DIR:()=>Bn,SchemaChangeError:()=>_r,TableScanStuckError:()=>Po,VOLATILE_FIELD_TYPES:()=>sa,assetsPath:()=>bw,collectPendingAttachments:()=>ya,computeRowHash:()=>la,computeSchemaFingerprint:()=>ua,computeSnapshotFingerprint:()=>da,createDwsTableReader:()=>ka,describeSchemaChange:()=>ha,diffSchemas:()=>ga,extOf:()=>Kd,hasAttachmentFailure:()=>Iw,isBlockingSchemaChange:()=>ma,isVolatileType:()=>Gd,localizeAttachments:()=>wa,localizeInlineImages:()=>Vd,manifestPath:()=>Do,normalizeCell:()=>qd,normalizeCells:()=>aa,parseFieldSchemas:()=>ca,parseNextCursor:()=>Tr,parseRawRecords:()=>Cr,pullTable:()=>xw,readAllRowSnapshots:()=>Cw,readManifest:()=>pa,readRowSnapshot:()=>Xd,resourceIdFromUrl:()=>Rr,rowPath:()=>zn,sniffImageExt:()=>Qd,writeJsonAtomic:()=>$o});var sa=["formula","button","createdTime","lastModifiedTime","creator","lastModifier"];import{createHash as yP}from"crypto";var wP=new Set(["unidirectionalLink","bidirectionalLink"]);function Ae(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Ae,"isRecord");function ke(t){return typeof t=="string"?t:t==null?"":String(t)}a(ke,"str");function Ud(t){if(!Ae(t))return null;let e=ke(t.name).trim();return e?{id:ke(t.id),name:e}:null}a(Ud,"toOption");function bP(t,e){if(!Ae(t))return null;let n=ke(t.resourceId).trim(),r=ke(t.filename).trim(),o=typeof t.size=="number"?t.size:Number(t.size??0)||0,i=ke(t.type);if(!n){let s=ke(t.resourceUrl||t.url).trim();return s?{filename:r,resourceId:Rr(s),asset:"",size:o,mediaType:i,url:s,link:!0}:null}return{filename:r,resourceId:n,asset:`${e}/${n}${Kd(r)}`,size:o,mediaType:i}}a(bP,"toAttachment");function Kd(t){let e=/(\.[A-Za-z0-9]{1,10})$/.exec(String(t??""));return e?e[1].toLowerCase():""}a(Kd,"extOf");function kP(t){return t.map(e=>e.filename).filter(Boolean).join(", ")}a(kP,"attachmentsText");var vP=/!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)/g;function Rr(t){let n=String(t??"").split("?")[0]??"",o=(n.split("/").pop()??"").replace(/\.[A-Za-z0-9]{1,10}$/,"");return/^[0-9a-fA-F-]{16,}$/.test(o)?o:o?o.replace(/[^\w.-]/g,"_"):yP("sha1").update(n).digest("hex").slice(0,32)}a(Rr,"resourceIdFromUrl");function Vd(t,e){let n=[],r=new Set;return{markdown:String(t??"").replace(vP,(i,s,c)=>{let l=c.startsWith("<")&&c.endsWith(">")?c.slice(1,-1):c;if(!/^https?:\/\//i.test(l))return i;let d=Rr(l),u=`${e}/${d}`;return r.has(d)||(r.add(d),n.push({filename:s||d,resourceId:d,asset:u,size:0,mediaType:"image"})),`![${s}](${u})`}),images:n}}a(Vd,"localizeInlineImages");function qd(t,e,n,r){let o=n.fields.get(t),i=o?.type??"text",s=n.assetsDir??"assets";if(e==null||e==="")return null;if(i==="attachment"){if(!Array.isArray(e))return null;let l=[];for(let d of e){let u=bP(d,s);u?l.push(u):r(`\u9644\u4EF6\u9879\u65E2\u65E0 resourceId \u4E5F\u65E0\u53EF\u7528 URL\uFF0C\u65E0\u4ECE\u5F15\u7528\uFF0C\u5DF2\u8DF3\u8FC7\uFF1A${JSON.stringify(d).slice(0,120)}`)}return l.length===0?null:{type:i,value:l,text:kP(l)}}if(wP.has(i)){let l=Ae(e)&&Array.isArray(e.linkedRecordIds)?e.linkedRecordIds.map(ke).filter(Boolean):[];if(l.length===0)return null;let d=l.map(f=>({recordId:f})),u={type:i,value:d,text:""};return o?.linkedTableId&&o.linkedTableId===n.sheetId&&(u.selfLink=!0),u}if(i==="richText"){let l=Ae(e)?ke(e.markdown):ke(e);if(!l.trim())return null;let{markdown:d,images:u}=Vd(l,s),p={type:i,value:{markdown:d},text:d};return u.length>0&&(p.embeddedImages=u),p}if(i==="url"){let l=Ae(e)?ke(e.link||e.text).trim():ke(e).trim();if(!l)return null;let d=Ae(e)&&ke(e.text).trim()||l;return{type:i,value:l,text:d===l?l:`${d} ${l}`}}if(i==="singleSelect"){let l=Ud(e);return l?{type:i,value:l,text:l.name}:null}if(i==="multipleSelect"){if(!Array.isArray(e))return null;let l=e.map(Ud).filter(d=>d!==null);return l.length===0?null:{type:i,value:l,text:l.map(d=>d.name).join(", ")}}if(i==="user"||i==="department"||i==="group"||i==="creator"||i==="lastModifier"){if(!Array.isArray(e))return null;let l=e.map(d=>Ae(d)?ke(d.userRef||d.userId||d.ref||d.id):ke(d)).filter(Boolean).map(d=>({userRef:d}));return l.length===0?null:{type:i,value:l,text:l.map(d=>d.userRef).join(", ")}}if(i==="checkbox")return e===!0||e==="true"?{type:i,value:!0,text:"true"}:null;if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"){let l=ke(e);return l.trim()?{type:i,value:l,text:l}:null}r(`\u5B57\u6BB5\u7C7B\u578B ${i} \u7684\u8FD4\u56DE\u7ED3\u6784\u672A\u8BC6\u522B\uFF0C\u5DF2\u6309 JSON \u6587\u672C\u515C\u5E95`);let c=JSON.stringify(e);return{type:i,value:c,text:c}}a(qd,"normalizeCell");function aa(t,e,n,r){let o={};for(let[i,s]of Object.entries(e??{})){let c=qd(i,s,n,l=>r.push({recordId:t,fieldId:i,message:l}));c&&(o[i]=c)}return o}a(aa,"normalizeCells");function ca(t){let e=Ae(t)?t.data:void 0,n=Ae(e)&&Array.isArray(e.fields)?e.fields:[],r=[];for(let o of n){if(!Ae(o))continue;let i=ke(o.fieldId).trim();if(!i)continue;let s=Ae(o.config)?o.config:void 0,c=s&&Array.isArray(s.options)?s.options:void 0,l={id:i,name:ke(o.fieldName).trim(),type:ke(o.type).trim()||"text"};if(c){let d=c.map(Ud).filter(u=>u!==null);d.length&&(l.options=d)}s&&s.linkedTableId&&(l.linkedTableId=ke(s.linkedTableId)),r.push(l)}return r}a(ca,"parseFieldSchemas");function Cr(t){let e=Ae(t)?t.data:void 0,n=Ae(e)&&Array.isArray(e.records)?e.records:[],r=[];for(let o of n){if(!Ae(o))continue;let i=ke(o.recordId).trim();i&&r.push({recordId:i,cells:Ae(o.cells)?o.cells:{}})}return r}a(Cr,"parseRawRecords");function Tr(t){let e=Ae(t)?t.data:void 0;return Ae(e)?ke(e.nextCursor).trim():""}a(Tr,"parseNextCursor");import{createHash as SP}from"crypto";var Nt="1";function Hd(t){return`sha256:${SP("sha256").update(t,"utf8").digest("hex")}`}a(Hd,"sha256");function Eo(t){return String(t??"").replace(/\r\n/g,`
482
+ \u539F\u59CB\u95EE\u8BE2\uFF1A${s}`,await this.tracker.updateFields(e.id,{Agent\u95EE\u8BE2:"",\u4EBA\u5DE5\u56DE\u590D:""}));try{for(;;){if(n.aborted)return{recorded:o.recorded};let l=await this.processStep(e,i,r,n,o);if(!l)return{recorded:o.recorded};if(!this.settings.agent.auto_advance)return{recorded:o.recorded};if(!l.auto)return{recorded:o.recorded};i=l}}finally{await this.tracker.flush?.(e.id)}}async processStep(e,n,r,o,i){if(!n.auto){if(e.state===this.reviewState)return h.debug("step-engine","\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838",{itemId:e.id,stepId:n.id}),null;if(n.recipe&&!this.hasHumanStepPrepared(e,n,r))return await this.executeHumanStepRecipe(e,n,r,o,i),null;if(this.settings.tracker.states.review){let d=this.settings.tracker.states.active.slice(1).filter(u=>u!==this.reviewState);if(d.length>0&&!d.includes(e.state))return h.warn("step-engine","\u4EBA\u5DE5\u6B65\u9AA4\u72B6\u6001\u672A\u660E\u786E\u786E\u8BA4\uFF0C\u62D2\u7EDD\u63A8\u8FDB",{itemId:e.id,stepId:n.id,state:e.state,confirmedStates:d}),null}i.recorded=!0,h.info("step-engine","\u4EBA\u5DE5\u5BA1\u6838\u901A\u8FC7\uFF0C\u63A8\u8FDB",{itemId:e.id,stepId:n.id}),await this.tracker.appendEvent(e.id,`\u4EBA\u5DE5\u5BA1\u6838\u901A\u8FC7: ${n.name}`);let l=await this.advanceToNextStep(e,n,r);return this.retry.clearFailures(e.id),l}if(this.retry.isExhausted(e.id,n.id))return i.recorded=!0,await this.blockItem(e,n),null;if(!i.forceReplay&&!this.retry.hasFailures(e.id)&&n.output_mapping&&this.isStepAlreadyComplete(e,n,r))return i.recorded=!0,h.info("step-engine","\u6B65\u9AA4\u5DF2\u5B8C\u6210\uFF0C\u8DF3\u8FC7\u6267\u884C\u76F4\u63A5\u63A8\u8FDB",{itemId:e.id,stepId:n.id}),await this.advanceToNextStep(e,n,r);await this.prepareExecution(e,n);let s=await this.executeWithRetry(n,e,r,o);if(!s)return null;let c=s.status==="success"&&s.tracker===!1;return i.recorded=i.recorded||!c,c&&this.logNoOpTrace(e,n,s),s.status==="success"&&(i.forceReplay=!0,Object.keys(s.output).length>0&&this.mergeStepOutput(r,n,s.output)),await this.handleResult(e,n,s,r)}async updateCheckpoint(e,n){if(this.tracker.updateCheckpoint)await this.tracker.updateCheckpoint(e.id,n);else if(n.fields&&Object.keys(n.fields).length>0&&await this.tracker.updateFields(e.id,n.fields),n.state!==void 0&&await this.tracker.updateState(e.id,n.state),n.currentStep!==void 0)if(n.currentStep===null){let r=this.settings.tracker.fields.current_step;r&&await this.tracker.updateFields(e.id,{[r]:""})}else await this.tracker.updateCurrentStep(e.id,n.currentStep);n.fields&&Object.assign(e.fields,n.fields),n.state!==void 0&&(e.state=n.state),n.currentStep!==void 0&&(e.currentStep=n.currentStep)}async executeWithRetry(e,n,r,o){let i=null;for(let s=0;s<this.retry.config.maxAttempts&&(i=await this.executor.execute(e,n,r,o),!(i.status==="success"||i.status==="needs_human"||i.status==="blocked"));s++){if(i.retryable===!1){h.warn("step-engine","\u4E0D\u53EF\u91CD\u8BD5\u9519\u8BEF,\u8DF3\u8FC7\u5373\u65F6\u91CD\u8BD5",{itemId:n.id,stepId:e.id,error:i.error});break}if(this.retry.shouldRetry(s)){let c=s+1;h.warn("step-engine",`\u6B65\u9AA4\u5931\u8D25\uFF0C\u91CD\u8BD5 (${c}/${this.retry.config.maxAttempts-1})`,{itemId:n.id,stepId:e.id,error:i.error}),await this.tracker.appendEvent(n.id,`\u6B65\u9AA4\u91CD\u8BD5 (${c}/${this.retry.config.maxAttempts-1}): ${i.error??"\u672A\u77E5\u9519\u8BEF"}`),await tP(this.retry.getBackoffMs(s))}}return i}async prepareExecution(e,n){let r=this.settings.tracker.states.active[0],o=this.settings.tracker.states.restart,i={};r&&(e.state===this.settings.tracker.states.initial||e.state===o)&&(i.state=r),e.currentStep!==n.id&&(i.currentStep=n.id),(i.state!==void 0||i.currentStep!==void 0)&&await this.updateCheckpoint(e,i),this.enteredSteps.get(e.id)!==n.id&&(this.enteredSteps.set(e.id,n.id),await this.tracker.appendEvent(e.id,`\u5F00\u59CB\u6267\u884C\u6B65\u9AA4: ${n.name}`),this.onRunEvent?.({type:"step.started",itemId:e.id,stepId:n.id,stepName:n.name}))}async blockItem(e,n,r){let o=r?.trim()||`\u6B65\u9AA4 ${n.name} \u8FDE\u7EED\u5931\u8D25\u5DF2\u8FBE\u4E0A\u9650`;h.error("step-engine","\u8F6C\u5165\u963B\u585E",{itemId:e.id,stepId:n.id,reason:o}),await this.tracker.appendEvent(e.id,`${o}\uFF0C\u5DF2\u963B\u585E`);let i=this.settings.tracker.states.blocked;i?await this.tracker.updateState(e.id,i):h.warn("step-engine","\u672A\u914D\u7F6E tracker.states.blocked\uFF0C\u5DE5\u5355\u65E0\u6CD5\u8F6C\u5165\u963B\u585E\u6001\u3001\u53EF\u80FD\u88AB\u6301\u7EED\u91CD\u8BD5",{itemId:e.id,stepId:n.id}),this.retry.clearFailures(e.id)}resolveCurrentStep(e){let n=this.workflow.orderedStepIds[0],r=n?this.stepsMap.get(n)??null:null;if(this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart)return r;if(e.currentStep){let o=this.stepsMap.get(e.currentStep);if(o)return o}return e.state===this.settings.tracker.states.initial||this.settings.tracker.states.active.includes(e.state)?r:null}async handleFailureOrBlock(e,n,r){switch(r.status){case"failed":if(r.retryable===!1)await this.blockItem(e,n,r.error);else{if(this.retry.recordFailure(e.id,n.id),!this.markNonSuccessOutcome(e.id,n.id,"failed",r.error??"\u672A\u77E5\u9519\u8BEF"))break;await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u5931\u8D25: ${r.error??"\u672A\u77E5\u9519\u8BEF"}`)}this.onRunEvent?.({type:"step.failed",itemId:e.id,stepId:n.id,stepName:n.name,error:r.error??"\u672A\u77E5\u9519\u8BEF",logs:r.logs});break;case"blocked":{let o=r.output.__askHumanSnapshot;if(o&&o.code==="ASK_HUMAN_DETECTED"){let i=String(o.question??""),s=this.settings.tracker.fields.event_log??"\u4E8B\u4EF6\u65E5\u5FD7",l=(String(e.fields[s]??"").match(/\[问询#\d+\]/g)??[]).length;await this.tracker.updateFields(e.id,{Agent\u95EE\u8BE2:i}),await this.tracker.appendEvent(e.id,`[\u95EE\u8BE2#${l+1}] ${i}`),l+1>=3&&await this.tracker.appendEvent(e.id,"ASK_HUMAN_EXHAUSTED: \u95EE\u8BE2\u6B21\u6570\u5DF2\u8FBE\u4E0A\u9650")}else await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u963B\u585E: ${r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165"}`);this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:n.id,stepName:n.name,reason:r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u4ECB\u5165",logs:r.logs}),this.settings.tracker.states.blocked&&await this.tracker.updateState(e.id,this.settings.tracker.states.blocked),this.retry.clearFailures(e.id);break}case"needs_human":if(!this.markNonSuccessOutcome(e.id,n.id,"needs_human",r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838"))break;await this.tracker.appendEvent(e.id,`\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838: ${r.blockReason??""}`),this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:n.id,stepName:n.name,reason:r.blockReason??"\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838",logs:r.logs}),this.retry.clearFailures(e.id);break}}async handleResult(e,n,r,o){switch(r.status){case"success":{let i={};Object.keys(r.output).length>0&&Object.assign(i,this.resolveOutput(n,r.output)),this.retry.clearFailures(e.id),this.reportedNonSuccessOutcomes.delete(e.id),this.enteredSteps.delete(e.id);let s=await this.advanceToNextStep(e,n,o,i);return this.onRunEvent?.({type:"step.succeeded",itemId:e.id,stepId:n.id,stepName:n.name,logs:r.logs}),s}case"failed":case"blocked":case"needs_human":return await this.handleFailureOrBlock(e,n,r),null}return null}markNonSuccessOutcome(e,n,r,o){let i={stepId:n,status:r,reason:o.trim()||(r==="failed"?"\u672A\u77E5\u9519\u8BEF":"\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838")},s=this.reportedNonSuccessOutcomes.get(e);return s&&s.stepId===i.stepId&&s.status===i.status&&s.reason===i.reason?!1:(this.reportedNonSuccessOutcomes.set(e,i),!0)}async advanceToNextStep(e,n,r,o){let i=o&&Object.keys(o).length>0?{...o}:void 0,s=this.workflow.orderedStepIds.indexOf(n.id),c=this.workflow.orderedStepIds[s+1];if(!c){let d=this.settings.tracker.states.terminal[0];return await this.updateCheckpoint(e,{...i?{fields:i}:{},...d?{state:d}:{},currentStep:null}),await this.tracker.appendEvent(e.id,"\u6D41\u7A0B\u5B8C\u6210"),h.info("step-engine","\u6D41\u7A0B\u5B8C\u6210",{itemId:e.id}),this.onRunEvent?.({type:"record.completed",itemId:e.id}),null}let l=this.stepsMap.get(c);return l&&!l.auto&&!l.recipe?(await this.updateCheckpoint(e,{...i?{fields:i}:{},currentStep:c,state:this.reviewState}),await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u5B8C\u6210: ${n.name} \u2192 \u4E0B\u4E00\u6B65: ${l.name}`),await this.tracker.appendEvent(e.id,`\u7B49\u5F85\u4EBA\u5DE5\u64CD\u4F5C: ${l.name}`),h.info("step-engine","\u8FDB\u5165\u4EBA\u5DE5\u7B49\u5F85",{itemId:e.id,stepId:c}),null):(await this.updateCheckpoint(e,{...i?{fields:i}:{},currentStep:c}),await this.tracker.appendEvent(e.id,`\u6B65\u9AA4\u5B8C\u6210: ${n.name} \u2192 \u4E0B\u4E00\u6B65: ${l?.name??c}`),h.info("step-engine","\u6B65\u8FDB",{itemId:e.id,from:n.id,to:c}),l??null)}isStepAlreadyComplete(e,n,r){if(!n.output_mapping)return!1;let o=r[n.id];return v(o)?Object.keys(n.output_mapping).every(i=>{let s=o[i];return s!=null&&s!==""}):this.hasRecipeOutput(e,n)}hasRecipeOutput(e,n){if(!n.output_mapping)return!1;let r=Object.values(n.output_mapping);return r.length>0&&r.every(o=>{let i=e.fields[o];return i!=null&&i!==""})}hasHumanStepPrepared(e,n,r){let o=r[n.id];return v(o)&&o[iw]===!0?!0:this.hasHumanPreparedEvent(e,n)}hasHumanPreparedEvent(e,n){let r=this.settings.tracker.fields.event_log;if(!r)return!1;let o=e.fields[r];return typeof o!="string"?!1:o.includes(`\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838: ${n.name}`)||o.includes(`\u7B49\u5F85\u4EBA\u5DE5\u64CD\u4F5C: ${n.name}`)}async executeHumanStepRecipe(e,n,r,o,i){if(this.retry.isExhausted(e.id,n.id)){i.recorded=!0,await this.blockItem(e,n);return}await this.prepareExecution(e,n);let s=await this.executeWithRetry(n,e,r,o);if(!s)return;let c=s.status==="success"&&s.tracker===!1;if(i.recorded=i.recorded||!c,c&&this.logNoOpTrace(e,n,s),s.status==="success"){this.mergeStepOutput(r,n,s.output),this.markHumanStepPrepared(r,n);let l={...this.resolveOutput(n,s.output)};await this.updateCheckpoint(e,{...Object.keys(l).length>0?{fields:l}:{},state:this.reviewState})}switch(s.status){case"success":this.onRunEvent?.({type:"step.succeeded",itemId:e.id,stepId:n.id,stepName:n.name,logs:s.logs}),this.retry.clearFailures(e.id),this.reportedNonSuccessOutcomes.delete(e.id),this.enteredSteps.delete(e.id),await this.tracker.appendEvent(e.id,`\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838: ${n.name}`),h.info("step-engine","recipe \u5B8C\u6210\uFF0C\u8FDB\u5165\u4EBA\u5DE5\u5BA1\u6838",{itemId:e.id,stepId:n.id}),this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:n.id,stepName:n.name,reason:"\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838",logs:s.logs});break;case"failed":case"blocked":case"needs_human":await this.handleFailureOrBlock(e,n,s);break}}logNoOpTrace(e,n,r){let o=r.logs.join(" | ").slice(0,300);h.info("step-engine","\u6B65\u9AA4 no-op\uFF1A\u672C\u6B21\u4E0D\u7559\u75D5",{itemId:e.id,stepId:n.id,...o?{note:o}:{}})}mergeStepOutput(e,n,r){let o=v(e[n.id])?e[n.id]:{};e[n.id]={...o,...r}}markHumanStepPrepared(e,n){let r=v(e[n.id])?e[n.id]:{};e[n.id]={...r,[iw]:!0}}resolveOutput(e,n){let r=e.output_mapping;if(!r)return n;let o={};for(let[i,s]of Object.entries(r))i in n&&(o[s]=n[i]);return o}};function tP(t){return new Promise(e=>setTimeout(e,t))}a(tP,"sleep");var ta=class{constructor(e){this.opts=e;this.capacity=Math.max(1,e.capacity)}opts;static{a(this,"TaskPool")}queue=[];queuedKeys=new Set;inFlight=new Map;capacity;get depth(){return this.queue.length}get running(){return this.inFlight.size}has(e){return this.queuedKeys.has(e)||this.inFlight.has(e)}submit(e){let n=0;for(let r of e)this.has(r.key)||(this.queue.push(r),this.queuedKeys.add(r.key),n++);return n>0&&this.pump(),n}async drain(){for(;this.inFlight.size>0;)await Promise.all([...this.inFlight.values()])}pump(){for(;this.inFlight.size<this.capacity;){let e=this.queue.shift();if(e===void 0)return;this.queuedKeys.delete(e.key);let n=e.run().catch(r=>{this.opts.onError?this.opts.onError(e,r):h.error("task-pool","\u4EFB\u52A1\u5904\u7406\u5F02\u5E38",{key:e.key,error:r instanceof Error?r.message:String(r)})}).finally(()=>{this.inFlight.delete(e.key),this.pump()});this.inFlight.set(e.key,n)}}};import{randomBytes as nP}from"crypto";var rP="__transient_",na=class{constructor(e,n){this.inner=e;this.fields=n;e.updateCheckpoint&&(this.updateCheckpoint=async(r,o)=>{let i=this.buffers.get(r);if(i){this.applyCheckpoint(i,o);return}await this.inner.updateCheckpoint(r,o)}),e.flush&&(this.flush=async r=>{r&&this.buffers.has(r)||await this.inner.flush(r)})}inner;fields;static{a(this,"DeferredTracker")}buffers=new Map;updateCheckpoint;flush;beginTransient(e){let n=`${rP}${nP(8).toString("hex")}`;return this.buffers.set(n,{cells:{...e}}),n}async finalize(e,n){let r=this.buffers.get(e);this.buffers.delete(e),r&&n.materialize&&await this.inner.updateFields("__new__",r.cells)}async fetchItemsByIds(e){let n=e.filter(i=>this.buffers.has(i)),r=e.filter(i=>!this.buffers.has(i)),o=n.map(i=>this.bufferToItem(i));return r.length>0&&o.push(...await this.inner.fetchItemsByIds(r)),o}fetchCandidateItems(){return this.inner.fetchCandidateItems()}fetchItemsByStates(e){return this.inner.fetchItemsByStates(e)}fetchAllItems(){return this.inner.fetchAllItems()}fetchItemsByFilter(e,n){return this.inner.fetchItemsByFilter(e,n)}async updateState(e,n){let r=this.buffers.get(e);if(r){r.cells[this.fields.state]=n;return}await this.inner.updateState(e,n)}async updateCurrentStep(e,n){let r=this.buffers.get(e);if(r){this.fields.current_step&&(r.cells[this.fields.current_step]=n);return}await this.inner.updateCurrentStep(e,n)}async updateFields(e,n){let r=this.buffers.get(e);if(r){Object.assign(r.cells,n);return}await this.inner.updateFields(e,n)}async appendEvent(e,n){let r=this.buffers.get(e);if(r){if(!this.fields.event_log)return;let o=String(r.cells[this.fields.event_log]??""),i=le();r.cells[this.fields.event_log]=[o,`[${i}] ${n}`].filter(Boolean).join(`
483
+ `);return}await this.inner.appendEvent(e,n)}applyCheckpoint(e,n){n.fields&&Object.assign(e.cells,n.fields),n.state!==void 0&&(e.cells[this.fields.state]=n.state),n.currentStep!==void 0&&this.fields.current_step&&(e.cells[this.fields.current_step]=n.currentStep??"")}bufferToItem(e){let n=this.buffers.get(e).cells;return{id:e,title:String(n[this.fields.title]??"(\u65E0\u6807\u9898)"),state:String(n[this.fields.state]??""),currentStep:this.fields.current_step&&String(n[this.fields.current_step]??"")||null,owner:null,fields:n,raw:{transient:!0}}}};function Md(t){return{id:t.id,title:t.title,state:t.state,currentStep:t.currentStep}}a(Md,"snapshotRunRecord");function sw(t){return qe(t)!==void 0||Pr(t)!==void 0}a(sw,"eventContextRequiresTransient");async function aw(t,e){qe(t)&&await bi.finalize(t,e)}a(aw,"finalizeEventContext");var oP=500,ra=class{static{a(this,"Orchestrator")}settings;workflow;tracker;deferredTracker;stepEngine;eventHandlerExecutor;schedulerSources=[];eventBindings;queue=new Zs;handlerInstances=[];toolkitFactory;onRunEvent;configScope;observedRunRecordSignatures=new Map;running=!1;abortController=null;taskPool;seedSeq=0;drainTimeoutMs=15e3;constructor(e){this.settings=e.settings,this.workflow=e.workflow,this.deferredTracker=new na(e.tracker,e.settings.tracker.fields),this.tracker=this.deferredTracker,this.eventBindings=e.eventBindings??[],this.toolkitFactory=e.toolkitFactory,this.onRunEvent=e.onRunEvent,this.configScope=e.configScope,this.stepEngine=new ea({settings:e.settings,workflow:e.workflow,tracker:this.deferredTracker,roleResolver:e.roleResolver,toolkitRegistry:e.toolkitRegistry,onRunEvent:e.onRunEvent,globalVars:e.globalVars,configScope:e.configScope,configRefs:e.configRefs}),this.eventHandlerExecutor=new Qs({settings:e.settings,tracker:this.deferredTracker,toolkitFactory:e.toolkitFactory,toolkitRegistry:e.toolkitRegistry,globalVars:e.globalVars,configScope:e.configScope}),this.taskPool=new ta({capacity:e.settings.agent.max_concurrent,onError:a((n,r)=>{h.error("orchestrator","\u4EFB\u52A1\u5904\u7406\u5F02\u5E38",{key:n.key,error:r instanceof Error?r.message:String(r)})},"onError")})}async start(){if(this.running)return;this.running=!0,this.abortController=new AbortController;for(let{source:r,handlerRecipe:o,recordPolicy:i}of this.eventBindings){let s;try{s=await this.eventHandlerExecutor.createHandler(o,c=>this.queue.enqueue(cw(c,i)),r.name)}catch(c){h.error("orchestrator","\u4E8B\u4EF6\u6E90\u542F\u52A8\u5931\u8D25",{source:r.name,handlerRecipe:o,error:c instanceof Error?c.message:String(c)});continue}this.handlerInstances.push(s),r.start(c=>{for(let l of c)try{s.onEvent(l)}catch(d){h.error("orchestrator","handler.onEvent \u5F02\u5E38",{source:r.name,error:d instanceof Error?d.message:String(d)})}}).catch(c=>{h.error("orchestrator","source.start \u5F02\u5E38",{source:r.name,error:c instanceof Error?c.message:String(c)})})}let e=new Ys({timer_fired:a(async()=>{await this.reconcile()},"timer_fired")}),n=new Js({intervalMs:this.settings.polling.interval_ms});this.schedulerSources.push(n),h.info("orchestrator","\u542F\u52A8",{schedulerSources:this.schedulerSources.map(r=>r.name),eventSources:this.eventBindings.map(r=>`${r.source.name} \u2192 ${r.handlerRecipe}`),reconcileIntervalMs:this.settings.polling.interval_ms}),await n.start(e.asHandler()),h.info("orchestrator","\u5DF2\u505C\u6B62")}async stop(){this.running=!1;for(let r of this.schedulerSources)r.stop();for(let{source:r}of this.eventBindings)r.stop();for(let r of this.handlerInstances)r.stop();(this.taskPool.running>0||this.taskPool.depth>0)&&h.info("orchestrator","\u7B49\u5F85\u5728\u9014\u4EFB\u52A1\u7ED3\u675F",{running:this.taskPool.running,queued:this.taskPool.depth}),await this.taskPool.drain();let e=Oa();e>0&&h.info("orchestrator","\u7B49\u5F85\u8FDB\u884C\u4E2D\u7684\u5B50\u8FDB\u7A0B\u7ED3\u675F",{pending:e}),await lf(this.drainTimeoutMs)||(h.warn("orchestrator","drain \u8D85\u65F6\uFF0C\u5F3A\u5236\u4E2D\u6B62\u6B8B\u7559\u5B50\u8FDB\u7A0B",{remaining:Oa()}),this.abortController?.abort())}async triggerOnce(e={}){let n=Date.now(),r=e.sourceName?this.eventBindings.find(u=>u.source.name===e.sourceName):this.eventBindings[0];if(!r){if(this.eventBindings.length===0)throw new Error("\u8BE5\u5DE5\u4F5C\u6D41\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 event_sources\uFF0C\u65E0\u6CD5\u5355\u6B21\u89E6\u53D1");let u=this.eventBindings.map(f=>f.source.name).join("\u3001");throw new Error(`\u4E8B\u4EF6\u6E90 "${e.sourceName}" \u4E0D\u5B58\u5728\u3002\u8BE5\u5DE5\u4F5C\u6D41\u53EF\u7528\u4E8B\u4EF6\u6E90\uFF1A${u}`)}let o=[],i=await this.eventHandlerExecutor.createHandler(r.handlerRecipe,u=>o.push(cw(u,r.recordPolicy)),r.source.name);try{i.onEvent({type:e.event?.type??"manual_trigger",payload:e.event?.payload??{},timestamp:e.event?.timestamp??new Date().toISOString(),...e.event?.itemId!==void 0?{itemId:e.event.itemId}:{}});let u=e.graceMs??oP;o.length===0&&u>0&&await iP(o,u)}finally{i.stop()}let s=e.signal??new AbortController().signal,c=0,l=0;for(let u of o)u.action==="create_record"&&u.defer?(await this.runTransient(u,s),l++):(await this.eventHandlerExecutor.applyAction(u),c++);let d={sourceName:r.source.name,handlerRecipe:r.handlerRecipe,actions:o.length,applied:c,transient:l,durationMs:Date.now()-n};return h.info("orchestrator","\u5355\u6B21\u89E6\u53D1\u5B8C\u6210",d),d}async reconcile(){let e=this.queue.drainAll(),n=[];for(let d of e){if(d.action==="create_record"&&d.defer){n.push(d);continue}try{await this.eventHandlerExecutor.applyAction(d)}catch(u){h.error("orchestrator","\u843D\u5E93\u5931\u8D25",{action:d.action,error:u instanceof Error?u.message:String(u)})}}let r=await this.tracker.fetchCandidateItems(),o=_o(this.settings,this.workflow),i=o===null?r:r.filter(d=>d.state!==o);for(let d of r)this.emitRunRecordSnapshot(d,o);let s=this.abortController?.signal??new AbortController().signal,c=[...n.map(d=>({key:`seed:${++this.seedSeq}`,run:a(()=>this.runTransient(d,s),"run")})),...i.map(d=>({key:d.id,run:a(async()=>{await this.stepEngine.processItem(d,s)},"run")}))];if(c.length===0)return;let l=this.taskPool.submit(c);h.info("orchestrator","\u4EFB\u52A1\u6295\u9012",{seeds:n.length,items:i.length,accepted:l,skipped:c.length-l,inFlight:this.taskPool.running,queueDepth:this.taskPool.depth,waiting:r.length-i.length})}async runTransient(e,n){let r=Pd(this.settings,e.fields),o=this.deferredTracker.beginTransient(r),i={id:o,title:String(r[this.settings.tracker.fields.title]??""),state:this.settings.tracker.states.initial,currentStep:null,owner:null,fields:{...r},raw:{transient:!0,...e.eventContext?{eventContext:e.eventContext}:{}}},s=!0,c=!1;try{s=(await this.stepEngine.processItem(i,n)).recorded,c=this.settings.tracker.states.terminal.includes(i.state)}catch(l){h.error("orchestrator","\u77AC\u6001\u8FD0\u884C\u5F02\u5E38",{transientId:o,error:l instanceof Error?l.message:String(l)}),s=!0,c=!1}try{await aw(e.eventContext,{completed:c,recorded:s})}catch(l){h.warn("orchestrator","\u4E8B\u4EF6\u4E0A\u4E0B\u6587\u6536\u5C3E\u5931\u8D25\uFF0C\u4E3B\u6D41\u7A0B\u7EE7\u7EED",{transientId:o,error:l instanceof Error?l.message:String(l)})}s||h.info("orchestrator","\u77AC\u6001\u8FD0\u884C\u672A\u843D\u8868\uFF08\u7B56\u7565\u5224\u5B9A\u4E0D\u7559\u75D5\uFF09",{transientId:o,title:i.title.slice(0,100),completed:c}),await this.deferredTracker.finalize(o,{materialize:s})}emitRunRecordSnapshot(e,n){let r=`${e.title}\0${e.state}\0${e.currentStep??""}`;this.observedRunRecordSignatures.get(e.id)!==r&&(this.observedRunRecordSignatures.set(e.id,r),this.onRunEvent?.({type:"record.observed",record:Md(e)}),e.state===n&&e.currentStep&&this.onRunEvent?.({type:"record.blocked",itemId:e.id,stepId:e.currentStep,stepName:this.stepNameFor(e.currentStep),reason:"\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838"}))}stepNameFor(e){return this.workflow.steps.find(n=>n.id===e)?.name??e}};function cw(t,e){return t.action==="create_record"&&(e==="on_demand"||sw(t.eventContext))?{...t,defer:!0}:t}a(cw,"tagDeferred");async function iP(t,e){let n=Date.now()+e,r=25;for(;t.length===0&&Date.now()<n;)await new Promise(o=>setTimeout(o,r))}a(iP,"waitForFirstAction");import Fw from"path";var Od=3e5,oa=class{static{a(this,"KbAutoRefresher")}options;timer=null;inFlight=!1;stopped=!1;constructor(e){this.options=e}start(){this.stopped||(h.info("kb-watcher","\u542F\u52A8\u81EA\u52A8\u5237\u65B0",{intervalMs:Od}),this.scheduleNext(0))}stop(){this.stopped=!0,this.timer&&(clearTimeout(this.timer),this.timer=null),h.info("kb-watcher","\u5DF2\u505C\u6B62")}scheduleNext(e){this.stopped||(this.timer=setTimeout(()=>{this.tick()},e),this.timer.unref?.())}async tick(){if(!this.stopped){if(this.inFlight){this.scheduleNext(Od);return}this.inFlight=!0;try{let e=await this.options.resolveCollections();if(e.length===0)h.debug("kb-watcher","\u65E0 collection,\u8DF3\u8FC7\u672C\u8F6E");else{let n=await un({configDir:this.options.configDir,collections:e,...this.options.agent?{agent:this.options.agent}:{},...this.options.configPath?{configPath:this.options.configPath}:{},...this.options.model?{model:this.options.model}:{},...this.options.bins?{bins:this.options.bins}:{}}),r=n.filter(i=>i.action==="compiled").length,o=n.filter(i=>i.action==="failed").length;if(r>0||o>0){h.info("kb-watcher","\u5237\u65B0\u5B8C\u6210",{total:n.length,compiled:r,skipped:n.length-r-o,failed:o});for(let i of n.filter(s=>s.action==="failed"))h.warn("kb-watcher","\u7F16\u8BD1\u5931\u8D25",{collection:i.collection,error:i.error})}else h.debug("kb-watcher","\u65E0\u53D8\u66F4",{total:n.length})}}catch(e){h.error("kb-watcher","\u81EA\u52A8\u5237\u65B0\u5F02\u5E38",{error:e instanceof Error?e.message:String(e)})}finally{this.inFlight=!1,this.scheduleNext(Od)}}}};import{existsSync as sP}from"fs";import lw from"path";function dw(t){return t.map(e=>e.collection)}a(dw,"collectionNames");var aP="knowledge-steward",xr=class extends Error{static{a(this,"RequiredTaxonomyError")}constructor(e){super(e),this.name="RequiredTaxonomyError"}};function cP(t){let e=new Map;for(let n of t)for(let r of n.knowledge_scope?.kb_collections??[]){let o=typeof r=="string"?{collection:r,roleIds:[n.id]}:{collection:r.collection,...r.source?{source:r.source}:{},...r.compile?{compile:r.compile}:{},roleIds:[n.id]},i=e.get(o.collection);if(!i){e.set(o.collection,o);continue}i.roleIds=[...i.roleIds??[],n.id],o.source&&i.source&&o.source!==i.source&&h.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C\u8FDC\u7A0B\u6E90\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),o.compile&&i.compile&&JSON.stringify(o.compile)!==JSON.stringify(i.compile)&&h.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C compile\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),!i.source&&o.source&&(i.source=o.source),!i.compile&&o.compile&&(i.compile=o.compile)}return[...e.values()]}a(cP,"resolveKbCollectionsFromRoles");async function Ir(t){let e=new Mt(t.rolesDir),n=lt(t.configDir,t.envSource);if(n?.roles){let c=lw.resolve(t.configDir,"profile");e.loadFromProfile(n.roles,c)}else await e.loadAll();let r=e.list(),o=cP(r),s=(r.find(c=>c.id===aP)?.knowledge_scope?.kb_collections??[]).map(c=>typeof c=="string"?c:c.collection);return{collections:dw(o),resolved:o,remoteSources:o.filter(c=>c.source!==void 0).map(c=>({source:c.source,collection:c.collection})),requiredTaxonomyCollections:s}}a(Ir,"collectKbCollections");function lP(t,e){for(let n of e){let r=lw.resolve(t,n,"taxonomy.yml");if(!sP(r))throw new xr(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7F3A\u5C11\u81EA\u5DF1\u7684 taxonomy.yml: ${r}`);try{At({configDir:t,entry:n})}catch(o){let i=o instanceof Error?o.message:String(o);throw new xr(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7684 taxonomy.yml \u975E\u6CD5: ${i}`)}}}a(lP,"validateRequiredTaxonomies");async function jd(t){let{settings:e,force:n,onProgress:r}=t,o=await Ir(e),i=o.resolved,s=o.collections;if(lP(e.configDir,o.requiredTaxonomyCollections),i.length===0)return{collections:s,results:[],skippedReason:"no-collections"};let c=await or(e),l=c.configuredAgent,d=br(e.raw?.toolkit_config);if(!l){let f=i.filter(Ft);if(f.length===0)return h.warn("kb","engine \u4E3A llm_only,\u65E0 coding agent \u53EF\u7528,\u8DF3\u8FC7 KB \u7F16\u8BD1",{collections:s,engine:c.configuredEngine}),{collections:s,results:[],skippedReason:"llm_only"};let p=await un({configDir:e.configDir,collections:f,...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:dw(f),results:p}}let u=await un({configDir:e.configDir,collections:i,...n?{force:n}:{},agent:l,...e.agent.model?{model:e.agent.model}:{},configPath:bt(e.configDir),...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:s,results:u}}a(jd,"setupKnowledgeBases");import{readFile as fP,writeFile as pP}from"fs/promises";import gP from"yaml";var dP=10;async function ia(t,e){let{baseId:n,fields:r}=e,o=e.name,i=await Nd(t,n,o,e.onProgress);if(i)return await e.onProgress?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${o}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${i.tableId}`),{tableId:i.tableId,reused:!0};try{return{tableId:await uw(t,{baseId:n,name:o,fields:r}),reused:!1}}catch(s){if(!fw(s))throw s;await e.onProgress?.(`\u8868\u540D\u300C${o}\u300D\u51B2\u7A81\uFF0C\u5C1D\u8BD5\u590D\u7528\u5DF2\u5B58\u5728\u8868`);let c=await Ld(t,n,o);if(c)return await e.onProgress?.(`\u590D\u7528\u5DF2\u6709\u8868\u300C${o}\u300D: ${c.tableId}`),{tableId:c.tableId,reused:!0};let l=await uP(t,{baseId:n,name:o,fields:r,onProgress:e.onProgress});if(l)return l;throw s}}a(ia,"createTableWithConflictResolution");async function uP(t,e){let{baseId:n,fields:r}=e;for(let o=2;o<=dP+1;o++){let i=`${e.name} ${o}`;try{await e.onProgress?.(`\u5C1D\u8BD5\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA`);let s=await uw(t,{baseId:n,name:i,fields:r});return await e.onProgress?.(`\u5DF2\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA\u8868: ${s}`),{tableId:s,reused:!1}}catch(s){if(!fw(s))throw s;let c=await Ld(t,n,i);if(c)return{tableId:c.tableId,reused:!0}}}return null}a(uP,"createTableWithRename");async function uw(t,e){let n=await t.runJson(["aitable","table","create","--base-id",e.baseId,"--name",e.name,"--fields",JSON.stringify(e.fields),"--timeout","60","--yes"],{timeoutMs:9e4}),r=pw(n);if(!r)throw new Error(`\u521B\u5EFA\u8868\u300C${e.name}\u300D\u540E\u672A\u8FD4\u56DE tableId`);return r}a(uw,"createTable");async function Nd(t,e,n,r){try{return await Ld(t,e,n)}catch(o){let i=o instanceof Error?o.message:String(o);return await r?.(`\u65E0\u6CD5\u5217\u51FA base \u5DF2\u6709\u8868\uFF08${i}\uFF09\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u65B0\u5EFA\u300C${n}\u300D`),null}}a(Nd,"findExistingTableByName");async function Ld(t,e,n){let r=await Wd(t,e),o=n.trim();return r.find(i=>i.name.trim()===o)??null}a(Ld,"findTableByName");async function Wd(t,e){let n=await t.runJson(["aitable","table","get","--base-id",e,"--timeout","60"],{timeoutMs:9e4}),r=ye(n);return Te(r).filter(v).map(i=>({tableId:String(i.tableId??i.table_id??i.id??""),name:String(i.name??i.tableName??i.title??"")})).filter(i=>i.tableId&&i.name)}a(Wd,"listTablesInBase");function fw(t){if(!(t instanceof ve))return!1;let e=`${t.message}
484
+ ${t.stderr}`.toLowerCase();return e.includes("already exist")||e.includes("\u5DF2\u5B58\u5728")||e.includes("duplicate")||e.includes("exist")}a(fw,"isTableNameConflictError");function pw(t){let e=ye(t),n=Fd(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=pw(r);if(o)return o}return null}a(pw,"findTableId");function Fd(t,e){if(!v(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r.trim()}for(let n of Object.values(t)){let r=Array.isArray(n)?n.map(o=>Fd(o,e)).find(Boolean)??null:Fd(n,e);if(r)return r}return null}a(Fd,"findStringByKeys");async function zd(t){let{trackerFilePath:e,settings:n,workflow:r,onProgress:o}=t;if(n.tracker.table_id.trim())return n;await o?.("\u672A\u586B\u5199 Table Id\uFF0C\u4F18\u5148\u590D\u7528 base \u5185\u540C\u540D\u8868\uFF0C\u5426\u5219\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868","create_table");let i=await mw(n,r,o);return await gw(e,i),await o?.(`\u6570\u636E\u8868\u5DF2\u5C31\u7EEA\uFF1A${i}`,"create_table"),{...n,tracker:{...n.tracker,table_id:i}}}a(zd,"ensureTableExists");async function gw(t,e){let n=await fP(t,"utf8"),r=gP.parseDocument(n);if(!r.hasIn(["tracker"]))throw Object.assign(new Error(`\u914D\u7F6E\u6587\u4EF6 ${t} \u7F3A\u5C11 tracker\uFF0C\u65E0\u6CD5\u5199\u56DE\u65B0\u5EFA\u7684\u6570\u636E\u8868 ID`),{code:"CONFIG_TRACKER_MISSING",status:500});r.setIn(["tracker","table_id"],e),await pP(t,r.toString(),"utf8")}a(gw,"writeTableIdToConfig");async function mw(t,e,n){let r=new he({bin:t.tracker.dws_bin,timeoutMs:6e4}),o="dws aitable table create",i=mP(e.tracker?.label??e.meta.name??"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"),s=await Nd(r,t.tracker.base_id,i,d=>n?.(d,"create_table"));if(s)return h.info("setup","\u590D\u7528 base \u4E0B\u540C\u540D AI \u8868\u683C\u6570\u636E\u8868",{baseId:t.tracker.base_id,tableName:i,tableId:s.tableId}),await n?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${i}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${s.tableId}`,"create_table"),s.tableId;await n?.("\u6B63\u5728\u8C03\u7528 dws \u521B\u5EFA\u6570\u636E\u8868","create_table"),h.info("setup","\u8C03\u7528 dws \u521B\u5EFA AI \u8868\u683C\u6570\u636E\u8868",{command:o,dwsBin:t.tracker.dws_bin,baseId:t.tracker.base_id,tableName:i});let c=await r.runJson(["aitable","table","create","--base-id",t.tracker.base_id,"--name",i,"--fields",JSON.stringify(hw(t)),"--timeout","60","--yes"],{timeoutMs:9e4}),l=yw(c);if(!l){let d=ye(c);throw h.warn("setup","dws \u521B\u5EFA\u6570\u636E\u8868\u540E\u672A\u8FD4\u56DE tableId",{command:o,baseId:t.tracker.base_id,response:d}),Object.assign(new Error("dws \u5EFA\u8868\u547D\u4EE4\u672A\u8FD4\u56DE tableId\uFF0C\u65E0\u6CD5\u786E\u8BA4\u6570\u636E\u8868\u662F\u5426\u521B\u5EFA\u6210\u529F\uFF1B\u8BF7\u68C0\u67E5 dws CLI \u8F93\u51FA\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u786E\u8BA4\u540E\u624B\u52A8\u8865\u5145 table_id"),{code:"TABLE_ID_NOT_RETURNED",status:502,details:{command:o,response:d}})}return l}a(mw,"createWorkflowTable");function mP(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"}a(mP,"sanitizeTableName");function hw(t){let e=[t.tracker.states.initial,...t.tracker.states.active,...t.tracker.states.terminal,t.tracker.states.blocked,t.tracker.states.review].filter((l,d,u)=>!!l&&u.indexOf(l)===d),n=t.tracker.fields.title,r=t.tracker.fields.state,o=[],i=new Set,s=a(l=>{i.has(l.fieldName)||(o.push(l),i.add(l.fieldName))},"addField"),c=a(l=>(t.tracker.field_definitions??[]).find(d=>d.name===l)?.description,"descOf");if(n===r)return s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),o;s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),s({fieldName:r,type:"singleSelect",config:{options:e.map(l=>({name:l}))},...c(r)?{description:c(r)}:{}});for(let l of t.tracker.field_definitions??[])s(hP(l));return o}a(hw,"initialTableFields");function hP(t){let e={fieldName:t.name,type:t.type},n={};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),t.formatter&&(n.formatter=t.formatter),Object.keys(n).length>0&&(e.config=n),t.description&&(e.description=t.description),e}a(hP,"fieldDefinitionToCreatePayload");function yw(t){let e=ye(t),n=Bd(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=yw(r);if(o)return o}return null}a(yw,"findTableId");function Bd(t,e){if(!v(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r.trim()}for(let n of Object.values(t)){let r=Array.isArray(n)?n.map(o=>Bd(o,e)).find(Boolean)??null:Bd(n,e);if(r)return r}return null}a(Bd,"findStringByKeys");async function Ao(t,e,n,r){let o=r?.get(e);if(o||(o=await Wd(t,e),r?.set(e,o)),!o.some(s=>s.tableId===n))throw new Error(`tracker.table_id="${n}" \u4E0D\u5C5E\u4E8E tracker.base_id="${e}"\uFF08\u53EF\u80FD\u662F\u6539\u4E86 base_id \u4F46\u6CA1\u6E05\u7A7A\u65E7 table_id\uFF09\u3002\u8BF7\u6E05\u7A7A table_id \u540E\u91CD\u8DD1 setup\u3002`)}a(Ao,"assertTableBelongsToBase");import Mo from"path";import{access as qP}from"fs/promises";import HP from"fs";var Tw={};ck(Tw,{ASSETS_DIR:()=>Zd,HASH_VERSION:()=>Nt,MANIFEST_NAME:()=>Jd,MAX_PAGE_SIZE:()=>ba,ROWS_DIR:()=>Bn,SchemaChangeError:()=>_r,TableScanStuckError:()=>Po,VOLATILE_FIELD_TYPES:()=>sa,assetsPath:()=>bw,collectPendingAttachments:()=>ya,computeRowHash:()=>la,computeSchemaFingerprint:()=>ua,computeSnapshotFingerprint:()=>da,createDwsTableReader:()=>ka,describeSchemaChange:()=>ha,diffSchemas:()=>ga,extOf:()=>Kd,hasAttachmentFailure:()=>Iw,isBlockingSchemaChange:()=>ma,isVolatileType:()=>Gd,localizeAttachments:()=>wa,localizeInlineImages:()=>Vd,manifestPath:()=>Do,normalizeCell:()=>qd,normalizeCells:()=>aa,parseFieldSchemas:()=>ca,parseNextCursor:()=>Tr,parseRawRecords:()=>Cr,pullTable:()=>xw,readAllRowSnapshots:()=>Cw,readManifest:()=>pa,readRowSnapshot:()=>Xd,resourceIdFromUrl:()=>Rr,rowPath:()=>zn,sniffImageExt:()=>Qd,writeJsonAtomic:()=>$o});var sa=["formula","button","createdTime","lastModifiedTime","creator","lastModifier"];import{createHash as yP}from"crypto";var wP=new Set(["unidirectionalLink","bidirectionalLink"]);function Ae(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Ae,"isRecord");function ke(t){return typeof t=="string"?t:t==null?"":String(t)}a(ke,"str");function Ud(t){if(!Ae(t))return null;let e=ke(t.name).trim();return e?{id:ke(t.id),name:e}:null}a(Ud,"toOption");function bP(t,e){if(!Ae(t))return null;let n=ke(t.resourceId).trim(),r=ke(t.filename).trim(),o=typeof t.size=="number"?t.size:Number(t.size??0)||0,i=ke(t.type);if(!n){let s=ke(t.resourceUrl||t.url).trim();return s?{filename:r,resourceId:Rr(s),asset:"",size:o,mediaType:i,url:s,link:!0}:null}return{filename:r,resourceId:n,asset:`${e}/${n}${Kd(r)}`,size:o,mediaType:i}}a(bP,"toAttachment");function Kd(t){let e=/(\.[A-Za-z0-9]{1,10})$/.exec(String(t??""));return e?e[1].toLowerCase():""}a(Kd,"extOf");function kP(t){return t.map(e=>e.filename).filter(Boolean).join(", ")}a(kP,"attachmentsText");var vP=/!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)/g;function Rr(t){let n=String(t??"").split("?")[0]??"",o=(n.split("/").pop()??"").replace(/\.[A-Za-z0-9]{1,10}$/,"");return/^[0-9a-fA-F-]{16,}$/.test(o)?o:o?o.replace(/[^\w.-]/g,"_"):yP("sha1").update(n).digest("hex").slice(0,32)}a(Rr,"resourceIdFromUrl");function Vd(t,e){let n=[],r=new Set;return{markdown:String(t??"").replace(vP,(i,s,c)=>{let l=c.startsWith("<")&&c.endsWith(">")?c.slice(1,-1):c;if(!/^https?:\/\//i.test(l))return i;let d=Rr(l),u=`${e}/${d}`;return r.has(d)||(r.add(d),n.push({filename:s||d,resourceId:d,asset:u,size:0,mediaType:"image"})),`![${s}](${u})`}),images:n}}a(Vd,"localizeInlineImages");function qd(t,e,n,r){let o=n.fields.get(t),i=o?.type??"text",s=n.assetsDir??"assets";if(e==null||e==="")return null;if(i==="attachment"){if(!Array.isArray(e))return null;let l=[];for(let d of e){let u=bP(d,s);u?l.push(u):r(`\u9644\u4EF6\u9879\u65E2\u65E0 resourceId \u4E5F\u65E0\u53EF\u7528 URL\uFF0C\u65E0\u4ECE\u5F15\u7528\uFF0C\u5DF2\u8DF3\u8FC7\uFF1A${JSON.stringify(d).slice(0,120)}`)}return l.length===0?null:{type:i,value:l,text:kP(l)}}if(wP.has(i)){let l=Ae(e)&&Array.isArray(e.linkedRecordIds)?e.linkedRecordIds.map(ke).filter(Boolean):[];if(l.length===0)return null;let d=l.map(f=>({recordId:f})),u={type:i,value:d,text:""};return o?.linkedTableId&&o.linkedTableId===n.sheetId&&(u.selfLink=!0),u}if(i==="richText"){let l=Ae(e)?ke(e.markdown):ke(e);if(!l.trim())return null;let{markdown:d,images:u}=Vd(l,s),p={type:i,value:{markdown:d},text:d};return u.length>0&&(p.embeddedImages=u),p}if(i==="url"){let l=Ae(e)?ke(e.link||e.text).trim():ke(e).trim();if(!l)return null;let d=Ae(e)&&ke(e.text).trim()||l;return{type:i,value:l,text:d===l?l:`${d} ${l}`}}if(i==="singleSelect"){let l=Ud(e);return l?{type:i,value:l,text:l.name}:null}if(i==="multipleSelect"){if(!Array.isArray(e))return null;let l=e.map(Ud).filter(d=>d!==null);return l.length===0?null:{type:i,value:l,text:l.map(d=>d.name).join(", ")}}if(i==="user"||i==="department"||i==="group"||i==="creator"||i==="lastModifier"){if(!Array.isArray(e))return null;let l=e.map(d=>Ae(d)?ke(d.userRef||d.userId||d.ref||d.id):ke(d)).filter(Boolean).map(d=>({userRef:d}));return l.length===0?null:{type:i,value:l,text:l.map(d=>d.userRef).join(", ")}}if(i==="checkbox")return e===!0||e==="true"?{type:i,value:!0,text:"true"}:null;if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"){let l=ke(e);return l.trim()?{type:i,value:l,text:l}:null}r(`\u5B57\u6BB5\u7C7B\u578B ${i} \u7684\u8FD4\u56DE\u7ED3\u6784\u672A\u8BC6\u522B\uFF0C\u5DF2\u6309 JSON \u6587\u672C\u515C\u5E95`);let c=JSON.stringify(e);return{type:i,value:c,text:c}}a(qd,"normalizeCell");function aa(t,e,n,r){let o={};for(let[i,s]of Object.entries(e??{})){let c=qd(i,s,n,l=>r.push({recordId:t,fieldId:i,message:l}));c&&(o[i]=c)}return o}a(aa,"normalizeCells");function ca(t){let e=Ae(t)?t.data:void 0,n=Ae(e)&&Array.isArray(e.fields)?e.fields:[],r=[];for(let o of n){if(!Ae(o))continue;let i=ke(o.fieldId).trim();if(!i)continue;let s=Ae(o.config)?o.config:void 0,c=s&&Array.isArray(s.options)?s.options:void 0,l={id:i,name:ke(o.fieldName).trim(),type:ke(o.type).trim()||"text"};if(c){let d=c.map(Ud).filter(u=>u!==null);d.length&&(l.options=d)}s&&s.linkedTableId&&(l.linkedTableId=ke(s.linkedTableId)),r.push(l)}return r}a(ca,"parseFieldSchemas");function Cr(t){let e=Ae(t)?t.data:void 0,n=Ae(e)&&Array.isArray(e.records)?e.records:[],r=[];for(let o of n){if(!Ae(o))continue;let i=ke(o.recordId).trim();i&&r.push({recordId:i,cells:Ae(o.cells)?o.cells:{}})}return r}a(Cr,"parseRawRecords");function Tr(t){let e=Ae(t)?t.data:void 0;return Ae(e)?ke(e.nextCursor).trim():""}a(Tr,"parseNextCursor");import{createHash as SP}from"crypto";var Nt="1";function Hd(t){return`sha256:${SP("sha256").update(t,"utf8").digest("hex")}`}a(Hd,"sha256");function Eo(t){return String(t??"").replace(/\r\n/g,`
485
485
  `).trim()}a(Eo,"canonText");function xP(t){return t.replace(/(assets\/[\w-]+)\.[A-Za-z0-9]{1,10}/g,"$1")}a(xP,"canonAssetRefs");function IP(t){return{filename:Eo(t.filename),size:t.size,resourceId:t.resourceId}}a(IP,"canonAttachment");function RP(t){let e=t.value;if(typeof e=="string")return Eo(e);if(typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>{if(n&&typeof n=="object"){if("resourceId"in n)return IP(n);if("recordId"in n)return{recordId:n.recordId};if("userRef"in n)return{userRef:n.userRef};if("name"in n){let r=n;return{id:r.id??"",name:Eo(r.name)}}}return n});if(e&&typeof e=="object"){if("markdown"in e)return{markdown:xP(Eo(e.markdown))};if("name"in e){let n=e;return{id:n.id??"",name:Eo(n.name)}}}return e}a(RP,"canonCellValue");function Gd(t,e){return e?.includes(t)?!1:sa.includes(t)}a(Gd,"isVolatileType");function la(t,e={}){let n=[];for(let o of Object.keys(t).sort()){let i=t[o];if(Gd(i.type,e.includeVolatileTypes))continue;let s=RP(i);s===""||Array.isArray(s)&&s.length===0||n.push([o,{type:i.type,value:s}])}let r=JSON.stringify(n);return Hd(`${Nt}
486
486
  ${r}`)}a(la,"computeRowHash");function da(t){let e=Object.entries(t).map(([n,r])=>`${n}:${r}`).sort();return Hd(`${Nt}
487
487
  ${e.join(`
@@ -489,13 +489,13 @@ ${e.join(`
489
489
  ${e.join(`
490
490
  `)}`)}a(ua,"computeSchemaFingerprint");import{mkdirSync as CP,readFileSync as TP,writeFileSync as _P,existsSync as AP,renameSync as EP}from"fs";import fa from"path";var Jd="manifest.json",Bn="rows",Zd="assets",_r=class extends Error{constructor(n,r){super(n);this.diff=r;this.name="SchemaChangeError"}diff;static{a(this,"SchemaChangeError")}};function Do(t){return fa.join(t,Jd)}a(Do,"manifestPath");function zn(t,e){return fa.join(t,Bn,`${e}.json`)}a(zn,"rowPath");function bw(t){return fa.join(t,Zd)}a(bw,"assetsPath");function pa(t){let e=Do(t);if(!AP(e))return null;try{return JSON.parse(TP(e,"utf8"))}catch{return null}}a(pa,"readManifest");function $o(t,e){CP(fa.dirname(t),{recursive:!0});let n=`${t}.tmp`;_P(n,`${JSON.stringify(e,null,2)}
491
491
  `,"utf8"),EP(n,t)}a($o,"writeJsonAtomic");function ga(t,e){let n=new Map(t.map(i=>[i.id,i])),r=new Map(e.map(i=>[i.id,i])),o={added:[],removed:[],renamed:[],retyped:[],optionsChanged:[]};for(let[i,s]of r){let c=n.get(i);if(!c){o.added.push(i);continue}c.name!==s.name&&o.renamed.push({id:i,from:c.name,to:s.name}),c.type!==s.type&&o.retyped.push({id:i,from:c.type,to:s.type}),ww(c)!==ww(s)&&o.optionsChanged.push(i)}for(let i of n.keys())r.has(i)||o.removed.push(i);return o}a(ga,"diffSchemas");function ww(t){return(t.options??[]).map(e=>`${e.id}=${e.name}`).sort().join("|")}a(ww,"optionsKey");function ma(t){return t.removed.length>0||t.renamed.length>0||t.retyped.length>0}a(ma,"isBlockingSchemaChange");function ha(t,e){let n=a(o=>e.find(i=>i.id===o)?.name??o,"nameOf"),r=["\u8868\u7ED3\u6784\u53D1\u751F\u4E86\u9700\u8981\u4EBA\u5DE5\u786E\u8BA4\u7684\u53D8\u5316\uFF0C\u5DF2\u505C\u6B62\u62C9\u53D6\uFF1A"];for(let o of t.renamed)r.push(` \xB7 \u5217\u6539\u540D\uFF1A${o.id}\u300C${o.from}\u300D\u2192\u300C${o.to}\u300D`);for(let o of t.removed)r.push(` \xB7 \u5217\u88AB\u5220\u9664\uFF1A${o}\u300C${n(o)}\u300D`);for(let o of t.retyped)r.push(` \xB7 \u5217\u7C7B\u578B\u53D8\u66F4\uFF1A${o.id}\u300C${n(o.id)}\u300D${o.from} \u2192 ${o.to}`);return r.push(""),r.push("\u6309\u5B57\u6BB5\u540D\u4E66\u5199\u7684\u6295\u5F71\u58F0\u660E\u4F1A\u9759\u9ED8\u89E3\u6790\u4E0D\u5230\u503C\uFF08\u6574\u5217\u6570\u636E\u6D88\u5931\uFF0C\u4F46\u7F16\u8BD1\u770B\u8D77\u6765\u6210\u529F\uFF09\uFF0C"),r.push("\u6545\u5FC5\u987B\u5148\u786E\u8BA4\u6620\u5C04\uFF1A\u66F4\u65B0 template \u7684\u5217\u540D\u6620\u5C04\u540E\u91CD\u8DD1\uFF0C\u6216\u7528 --accept-schema-change \u5F3A\u5236\u7EE7\u7EED\u3002"),r.join(`
492
- `)}a(ha,"describeSchemaChange");import{mkdir as DP,writeFile as $P,rename as PP,stat as E5,readdir as MP}from"fs/promises";import Yd from"path";import{randomBytes as OP}from"crypto";function ya(t,e){let n=[];for(let[r,o]of Object.entries(e)){if(o.type==="attachment"){let s=t[r];if(!Array.isArray(s))continue;let c=new Map;for(let l of s)if(l&&typeof l=="object"){let d=l,u=typeof d.resourceId=="string"?d.resourceId:"",f=typeof d.url=="string"?d.url:"";u&&f&&c.set(u,f)}for(let l of o.value){if(l.link||!l.asset)continue;let d=c.get(l.resourceId);d&&n.push({attachment:l,url:d})}continue}let i=o.embeddedImages;if(i?.length){let s=t[r],c=s&&typeof s=="object"&&"markdown"in s?String(s.markdown??""):String(s??""),l=new Map;for(let d of c.matchAll(/!\[[^\]]*\]\(\s*(<[^>]+>|[^)\s]+)/g)){let u=d[1];u.startsWith("<")&&u.endsWith(">")&&(u=u.slice(1,-1)),/^https?:\/\//i.test(u)&&l.set(Rr(u),u)}for(let d of i){let u=l.get(d.resourceId);u&&n.push({attachment:d,url:u})}}}return n}a(ya,"collectPendingAttachments");function Qd(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?".png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?".jpg":t.length>=6&&t.subarray(0,3).toString("latin1")==="GIF"?".gif":t.length>=12&&t.subarray(0,4).toString("latin1")==="RIFF"&&t.subarray(8,12).toString("latin1")==="WEBP"?".webp":t.length>=5&&t.subarray(0,5).toString("latin1")==="<?xml"||t.length>=4&&t.subarray(0,4).toString("latin1")==="<svg"?".svg":".png"}a(Qd,"sniffImageExt");async function wa(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??3e4,i=Math.max(1,n.concurrency??4),s={downloaded:0,skipped:0,failed:[],resolved:{}},c=new Map;for(let g of e)c.has(g.attachment.resourceId)||c.set(g.attachment.resourceId,g);let l=[...c.values()];if(l.length===0)return s;let d=Yd.join(t,"assets");await DP(d,{recursive:!0});let u=new Map;for(let g of await MP(d).catch(()=>[]))g.includes(".tmp-")||u.set(g.replace(/\.[A-Za-z0-9]{1,10}$/,""),g);let f=0,p=a(async()=>{for(;;){let g=f++;if(g>=l.length)return;let{attachment:m,url:y}=l[g],w=/\.[A-Za-z0-9]{1,10}$/.test(m.asset),b=u.get(m.resourceId);if(b){s.skipped+=1,s.resolved[m.resourceId]=`assets/${b}`;continue}let x=new AbortController,I=setTimeout(()=>x.abort(),o);try{let v=await r(y,{signal:x.signal});if(!v.ok)throw new Error(`HTTP ${v.status}`);let k=Buffer.from(await v.arrayBuffer());if(k.byteLength===0)throw new Error("\u7A7A\u54CD\u5E94\u4F53");let R=w?m.asset:`assets/${m.resourceId}${Qd(k)}`,T=Yd.join(t,R),_=`${T}.tmp-${OP(4).toString("hex")}`;await $P(_,k),await PP(_,T),s.downloaded+=1,s.resolved[m.resourceId]=R,u.set(m.resourceId,Yd.basename(R))}catch(v){s.failed.push({resourceId:m.resourceId,filename:m.filename,reason:v instanceof Error?v.message:String(v)})}finally{clearTimeout(I)}}},"worker");return await Promise.all(Array.from({length:Math.min(i,l.length)},()=>p())),s}a(wa,"localizeAttachments");import{readdir as jP,unlink as FP}from"fs/promises";import{existsSync as Sw}from"fs";import kw from"path";var ba=100,NP=1,LP=4,vw=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),Po=class extends Error{static{a(this,"TableScanStuckError")}rowsRead;pages;cursor;lastOkRecordId;lastOkCells;limitsTried;cause;constructor(e){let n=e.cause instanceof Error?e.cause.message:String(e.cause);super(`\u53D6\u6570\u5728\u7B2C ${e.rowsRead+1} \u6761\u5904\u5361\u4F4F\u4E14\u65E0\u6CD5\u7ED5\u8FC7\uFF08\u5DF2\u6210\u529F\u8BFB\u53D6 ${e.rowsRead} \u884C / ${e.pages} \u9875\uFF09\u3002\u5DF2\u8BD5 limit=${e.limitsTried.join("/")} \u5747\u5931\u8D25 \u2192 \u4E0E\u9875\u5927\u5C0F\u65E0\u5173\uFF0C\u5224\u5B9A\u4E3A\u8BE5\u884C\u6570\u636E\u672C\u8EAB\u7684\u95EE\u9898\u3002\u539F\u56E0\uFF1A${n}`),this.name="TableScanStuckError",this.rowsRead=e.rowsRead,this.pages=e.pages,this.cursor=e.cursor,this.lastOkRecordId=e.lastOkRecordId,this.lastOkCells=e.lastOkCells,this.limitsTried=e.limitsTried,this.cause=e.cause}};async function WP(t,e){let n=t.maxPages??2e3,r=Math.min(t.pageSize??ba,ba),o=[],i,s=0,c=r,l=0,d=NP;for(;;){let u=[],f=t.backoffMs?.retry??2e3,p=t.backoffMs?.degrade??3e3,g,m,y=!1;for(let b=0;b<3;b++){if(b===1)t.onProgress?.(`\u5355\u9875\u53D6\u6570\u5931\u8D25\uFF08limit=${c}\uFF09\u2192 \u7B49 ${f}ms \u539F\u503C\u91CD\u8BD5\uFF08\u6392\u9664\u62D6\u5EF6/\u9650\u6D41\uFF09`),await vw(f);else if(b===2){if(c<=1||d<=0)break;let x=Math.max(1,Math.floor(c/LP));t.onProgress?.(`\u4ECD\u5931\u8D25 \u2192 \u7B49 ${p}ms \u540E\u964D\u7EA7\u5230 limit=${x} \u63A2\u8DEF\u4E00\u6B21\uFF08\u9274\u522B\u201C\u9875\u592A\u5927\u201D\u8FD8\u662F\u201C\u810F\u6570\u636E\u201D\uFF09`),await vw(p),c=x,d-=1}u.push(c);try{g=await t.reader.queryRecords({baseId:t.baseId,sheetId:t.sheetId,limit:c,...i?{cursor:i}:{}}),y=!0,b===2&&(l=c);break}catch(x){m=x}}if(!y){let b=o[o.length-1];throw new Po({rowsRead:o.length,pages:s,cursor:i,lastOkRecordId:b?.recordId,lastOkCells:b?.cells,limitsTried:u,cause:m})}s+=1,o.push(...Cr(g));let w=Tr(g);if(t.onProgress?.(`\u7B2C ${s} \u9875\uFF08limit=${c}\uFF09\uFF1A\u7D2F\u8BA1 ${o.length} \u884C`),!w||w===i)break;if(i=w,s>=n)throw new Error(`\u5206\u9875\u8D85\u8FC7\u4FDD\u9669\u4E1D ${n} \u9875\uFF08\u5DF2\u53D6 ${o.length} \u884C\uFF09\u3002\u82E5\u8868\u786E\u5B9E\u66F4\u5927\uFF0C\u8BF7\u8C03\u9AD8 maxPages\u3002`)}return l>0&&e(`\u5355\u9875\u6761\u6570\u5DF2\u964D\u7EA7\u5230 ${l}\uFF08\u539F ${r}\uFF09\uFF1A\u8BE5\u8868\u5355\u884C\u6570\u636E\u8F83\u5927\uFF08\u5185\u5D4C\u56FE/\u957F\u5BCC\u6587\u672C\uFF09\uFF0C\u5927 limit \u4F1A\u88AB\u670D\u52A1\u7AEF\u62D2\u7EDD\u3002\u5EFA\u8BAE\u5728 profile \u91CC\u56FA\u5316 page_size=${l} \u4EE5\u7701\u53BB\u6BCF\u8F6E\u8BD5\u9519\u3002`),{rows:o,pages:s}}a(WP,"scanAll");async function BP(t,e){let n=kw.join(t,Bn);if(!Sw(n))return[];let r=[];for(let o of await jP(n)){if(!o.endsWith(".json"))continue;let i=o.slice(0,-5);e.has(i)||(await FP(kw.join(n,o)),r.push(i))}return r}a(BP,"pruneRows");function zP(t,e){if(Object.keys(e).length!==0)for(let n of t)for(let r of Object.values(n.cells)){let o=r.embeddedImages;if(!o?.length)continue;let i=r.value&&typeof r.value=="object"&&"markdown"in r.value?r.value.markdown:"";for(let s of o){let c=e[s.resourceId];!c||c===s.asset||(i=i.split(`(${s.asset})`).join(`(${c})`),s.asset=c)}i&&(r.value.markdown=i,r.text=i)}}a(zP,"applyResolvedAssets");async function xw(t){let{snapshotDir:e,baseId:n,sheetId:r}=t,o=new Date().toISOString(),i=[],s=ca(await t.reader.getFields({baseId:n,sheetId:r}));if(s.length===0)throw new Error(`\u672A\u8BFB\u5230\u4EFB\u4F55\u5B57\u6BB5\uFF08baseId=${n} sheetId=${r}\uFF09`);let c=pa(e);if(c){let T=ga(c.fields,s);if(ma(T)){let _=ha(T,c.fields);if(!t.acceptSchemaChange)throw new _r(_,T);i.push(`[\u5DF2\u6309 --accept-schema-change \u653E\u884C] ${_}`)}T.optionsChanged.length>0&&i.push(`\u5355\u9009\u9009\u9879\u6709\u589E\u51CF\uFF08${T.optionsChanged.join(", ")}\uFF09\uFF1A\u76EE\u5F55\u96C6\u5408\u53EF\u80FD\u53D8\u5316\uFF0C\u9700\u91CD\u5EFA\u7D22\u5F15`)}let{rows:l,pages:d}=await WP(t,T=>i.push(T));t.onProgress?.(`scan \u5B8C\u6210\uFF1A${l.length} \u884C / ${d} \u9875`);let u={fields:new Map(s.map(T=>[T.id,T])),sheetId:r},f=[],p=[],g=[];for(let T of l){let _=aa(T.recordId,T.cells,u,f);p.push({recordId:T.recordId,cells:_}),g.push(...ya(T.cells,_))}for(let T of f)i.push(`${T.recordId}/${T.fieldId}: ${T.message}`);let m=await wa(e,g,t.attachmentOptions);for(let T of m.failed)i.push(`\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${T.filename}\uFF08${T.resourceId}\uFF09\u2014\u2014 ${T.reason}`);zP(p,m.resolved);let y=[],w={};for(let T of p){let _=la(T.cells,t.hashOptions);y.push({recordId:T.recordId,rowHash:_,fetchedAt:o,cells:T.cells}),w[T.recordId]=_}let b=da(w),x=ua(s);if(!t.force&&c?.snapshotFingerprint===b&&c?.schemaFingerprint===x&&c?.hashVersion===Nt)return t.onProgress?.("\u5FEB\u7167\u6307\u7EB9\u672A\u53D8 \u2192 \u8DF3\u8FC7\u5199\u76D8\u4E0E\u7F16\u8BD1"),{manifest:c,changed:[],removed:[],unchanged:!0,attachmentsDownloaded:m.downloaded,attachmentsSkipped:m.skipped,warnings:i};let v=[];for(let T of y){let _=c?.rows[T.recordId],C=c?.hashVersion!==Nt;!t.force&&!C&&_===T.rowHash&&Sw(zn(e,T.recordId))||($o(zn(e,T.recordId),T),v.push(T.recordId))}let k=await BP(e,new Set(Object.keys(w))),R={baseId:n,sheetId:r,hashVersion:Nt,fetchedAt:o,fields:s,rows:w,snapshotFingerprint:b,schemaFingerprint:x};return $o(Do(e),R),{manifest:R,changed:v,removed:k,unchanged:!1,attachmentsDownloaded:m.downloaded,attachmentsSkipped:m.skipped,warnings:i}}a(xw,"pullTable");function Iw(t){return t.warnings.some(e=>e.startsWith("\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25"))}a(Iw,"hasAttachmentFailure");function ka(t){let e=t.timeoutSeconds??120,n=(e+30)*1e3;return{async getFields({baseId:r,sheetId:o}){return t.client.runJson(["aitable","+field-get","--baseId",r,"--tableId",o,"--timeout",String(e)],{timeoutMs:n})},async queryRecords({baseId:r,sheetId:o,limit:i,cursor:s}){let c=["aitable","+record-query","--base-id",r,"--table-id",o,"--limit",String(i),"--timeout",String(e)];return s&&c.push("--cursor",s),t.client.runJson(c,{timeoutMs:n})}}}a(ka,"createDwsTableReader");import{readFileSync as UP,existsSync as Rw}from"fs";import{readdirSync as KP}from"fs";import VP from"path";function Xd(t,e){let n=zn(t,e);if(!Rw(n))return null;try{return JSON.parse(UP(n,"utf8"))}catch{return null}}a(Xd,"readRowSnapshot");function Cw(t){let e=VP.join(t,Bn);if(!Rw(e))return[];let n=[];for(let r of KP(e).sort()){if(!r.endsWith(".json"))continue;let o=Xd(t,r.slice(0,-5));o&&n.push(o)}return n}a(Cw,"readAllRowSnapshots");import eu from"fs/promises";import _w from"path";async function tu(t){let{collectionDir:e,activeRowIds:n}=t,r=_w.join(e,"articles"),o=[],i=[],s;try{s=await eu.readdir(r)}catch{return{removed:o,kept:i}}for(let c of s){if(!c.endsWith(".md")||c.startsWith("_"))continue;let l=_w.join(r,c),d;try{d=await eu.readFile(l,"utf8")}catch{continue}let f=Ne(d).sourceRowId;f&&!n.has(f)?(await eu.rm(l,{force:!0}),o.push(c)):i.push(c)}return{removed:o,kept:i}}a(tu,"cleanupOrphanArticles");async function Aw(t,e){let n=await Fn(t,e),r=await Ot(qt(t,e));return{collection:e,state:n,currentHash:r,sourceChanged:ys(n,r)}}a(Aw,"getKbStatus");async function GP(t){return(await Ir(t)).resolved}a(GP,"resolveAllCollections");function JP(t){return br(t.raw?.toolkit_config)}a(JP,"shellBins");async function nu(t){let n=(await or(t)).configuredAgent;return{...n?{agent:n}:{},...t.agent.model?{model:t.agent.model}:{},configPath:bt(t.configDir)}}a(nu,"resolveCompileAgent");function ru(t){let e=`${t.index+1}/${t.total}`,n=t.detail?` \u2014 ${t.detail}`:"",r=t.phase==="done"?"\u2713":t.phase==="failed"?"\u26A0":t.phase==="skipped"?"\u23ED":"\u23F3";console.log(`${r} [KB ${e}] ${t.collection}: ${t.phase}${n}`)}a(ru,"printKbProgress");function ou(t){if(t.skippedReason==="no-collections"){console.log("\xB7 \u672A\u58F0\u660E\u77E5\u8BC6\u5E93(\u89D2\u8272\u65E0 knowledge_scope.kb_collections)\uFF0C\u8DF3\u8FC7\u7F16\u8BD1");return}if(t.skippedReason==="llm_only"){console.log("\u26A0 \u5F53\u524D engine \u4E3A llm_only\uFF0C\u65E0 coding agent\uFF0C\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u7F16\u8BD1");return}let e=t.results.filter(o=>o.action==="compiled").length,n=t.results.filter(o=>o.action==="skipped").length,r=t.results.filter(o=>o.action==="failed").length;console.log(`\u77E5\u8BC6\u5E93\u7F16\u8BD1\u5B8C\u6210: ${e} \u7F16\u8BD1, ${n} \u8DF3\u8FC7${r>0?`, ${r} \u5931\u8D25`:""}`);for(let o of t.results.filter(i=>i.action==="failed"))console.log(` \u26A0 ${o.collection}: ${o.error??"\u7F16\u8BD1\u5931\u8D25"}`)}a(ou,"printKbSummary");var ZP=["broken-link","absolute-path","invalid-category","missing-sources"];function YP(t){let e=[];for(let n of t){if(n.action==="failed"){e.push(`${n.collection}: \u7F16\u8BD1\u5931\u8D25\uFF08${n.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}let r=n.report;if(!r){n.action==="skipped"&&e.push(`${n.collection}: \u8DF3\u8FC7\u7F16\u8BD1\u4E14\u65E0\u5386\u53F2\u7F16\u8BD1\u62A5\u544A\uFF0C\u65E0\u6CD5\u786E\u8BA4\u4EA7\u7269\u8D28\u91CF`);continue}let o=n.action==="skipped"?`${n.collection}\uFF08\u4E0A\u6B21\u7F16\u8BD1\uFF09`:n.collection;if(r.status==="failed"){e.push(`${o}: \u4E0A\u6B21\u7F16\u8BD1\u5931\u8D25\uFF08${r.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}if((r.failedFileCount??0)>0&&e.push(`${o}: ${r.failedFileCount} \u4E2A\u6E90\u6587\u4EF6\u7F16\u8BD1\u5931\u8D25`),r.lintError)e.push(`${o}: lint \u672A\u80FD\u6267\u884C\uFF08${r.lintError}\uFF09\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`);else if(r.lint)for(let i of ZP){let s=r.lint.counts[i]??0;s>0&&e.push(`${o}: lint ${i} \xD7${s}`)}else e.push(`${o}: \u7F16\u8BD1\u62A5\u544A\u65E0 lint \u7ED3\u679C\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`)}return e}a(YP,"evaluateStrictGate");function QP(t,e){return e.map(n=>{if(n.action!=="skipped"||n.report)return n;try{let r=HP.readFileSync(Zn(t,n.collection),"utf8");return{...n,report:JSON.parse(r)}}catch{return n}})}a(QP,"attachHistoricalReports");function Dw(t,e){let n=YP(QP(e,t));if(n.length!==0){console.error(`
492
+ `)}a(ha,"describeSchemaChange");import{mkdir as DP,writeFile as $P,rename as PP,stat as E5,readdir as MP}from"fs/promises";import Yd from"path";import{randomBytes as OP}from"crypto";function ya(t,e){let n=[];for(let[r,o]of Object.entries(e)){if(o.type==="attachment"){let s=t[r];if(!Array.isArray(s))continue;let c=new Map;for(let l of s)if(l&&typeof l=="object"){let d=l,u=typeof d.resourceId=="string"?d.resourceId:"",f=typeof d.url=="string"?d.url:"";u&&f&&c.set(u,f)}for(let l of o.value){if(l.link||!l.asset)continue;let d=c.get(l.resourceId);d&&n.push({attachment:l,url:d})}continue}let i=o.embeddedImages;if(i?.length){let s=t[r],c=s&&typeof s=="object"&&"markdown"in s?String(s.markdown??""):String(s??""),l=new Map;for(let d of c.matchAll(/!\[[^\]]*\]\(\s*(<[^>]+>|[^)\s]+)/g)){let u=d[1];u.startsWith("<")&&u.endsWith(">")&&(u=u.slice(1,-1)),/^https?:\/\//i.test(u)&&l.set(Rr(u),u)}for(let d of i){let u=l.get(d.resourceId);u&&n.push({attachment:d,url:u})}}}return n}a(ya,"collectPendingAttachments");function Qd(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?".png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?".jpg":t.length>=6&&t.subarray(0,3).toString("latin1")==="GIF"?".gif":t.length>=12&&t.subarray(0,4).toString("latin1")==="RIFF"&&t.subarray(8,12).toString("latin1")==="WEBP"?".webp":t.length>=5&&t.subarray(0,5).toString("latin1")==="<?xml"||t.length>=4&&t.subarray(0,4).toString("latin1")==="<svg"?".svg":".png"}a(Qd,"sniffImageExt");async function wa(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??3e4,i=Math.max(1,n.concurrency??4),s={downloaded:0,skipped:0,failed:[],resolved:{}},c=new Map;for(let g of e)c.has(g.attachment.resourceId)||c.set(g.attachment.resourceId,g);let l=[...c.values()];if(l.length===0)return s;let d=Yd.join(t,"assets");await DP(d,{recursive:!0});let u=new Map;for(let g of await MP(d).catch(()=>[]))g.includes(".tmp-")||u.set(g.replace(/\.[A-Za-z0-9]{1,10}$/,""),g);let f=0,p=a(async()=>{for(;;){let g=f++;if(g>=l.length)return;let{attachment:m,url:y}=l[g],w=/\.[A-Za-z0-9]{1,10}$/.test(m.asset),b=u.get(m.resourceId);if(b){s.skipped+=1,s.resolved[m.resourceId]=`assets/${b}`;continue}let x=new AbortController,I=setTimeout(()=>x.abort(),o);try{let S=await r(y,{signal:x.signal});if(!S.ok)throw new Error(`HTTP ${S.status}`);let k=Buffer.from(await S.arrayBuffer());if(k.byteLength===0)throw new Error("\u7A7A\u54CD\u5E94\u4F53");let R=w?m.asset:`assets/${m.resourceId}${Qd(k)}`,T=Yd.join(t,R),_=`${T}.tmp-${OP(4).toString("hex")}`;await $P(_,k),await PP(_,T),s.downloaded+=1,s.resolved[m.resourceId]=R,u.set(m.resourceId,Yd.basename(R))}catch(S){s.failed.push({resourceId:m.resourceId,filename:m.filename,reason:S instanceof Error?S.message:String(S)})}finally{clearTimeout(I)}}},"worker");return await Promise.all(Array.from({length:Math.min(i,l.length)},()=>p())),s}a(wa,"localizeAttachments");import{readdir as jP,unlink as FP}from"fs/promises";import{existsSync as Sw}from"fs";import kw from"path";var ba=100,NP=1,LP=4,vw=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),Po=class extends Error{static{a(this,"TableScanStuckError")}rowsRead;pages;cursor;lastOkRecordId;lastOkCells;limitsTried;cause;constructor(e){let n=e.cause instanceof Error?e.cause.message:String(e.cause);super(`\u53D6\u6570\u5728\u7B2C ${e.rowsRead+1} \u6761\u5904\u5361\u4F4F\u4E14\u65E0\u6CD5\u7ED5\u8FC7\uFF08\u5DF2\u6210\u529F\u8BFB\u53D6 ${e.rowsRead} \u884C / ${e.pages} \u9875\uFF09\u3002\u5DF2\u8BD5 limit=${e.limitsTried.join("/")} \u5747\u5931\u8D25 \u2192 \u4E0E\u9875\u5927\u5C0F\u65E0\u5173\uFF0C\u5224\u5B9A\u4E3A\u8BE5\u884C\u6570\u636E\u672C\u8EAB\u7684\u95EE\u9898\u3002\u539F\u56E0\uFF1A${n}`),this.name="TableScanStuckError",this.rowsRead=e.rowsRead,this.pages=e.pages,this.cursor=e.cursor,this.lastOkRecordId=e.lastOkRecordId,this.lastOkCells=e.lastOkCells,this.limitsTried=e.limitsTried,this.cause=e.cause}};async function WP(t,e){let n=t.maxPages??2e3,r=Math.min(t.pageSize??ba,ba),o=[],i,s=0,c=r,l=0,d=NP;for(;;){let u=[],f=t.backoffMs?.retry??2e3,p=t.backoffMs?.degrade??3e3,g,m,y=!1;for(let b=0;b<3;b++){if(b===1)t.onProgress?.(`\u5355\u9875\u53D6\u6570\u5931\u8D25\uFF08limit=${c}\uFF09\u2192 \u7B49 ${f}ms \u539F\u503C\u91CD\u8BD5\uFF08\u6392\u9664\u62D6\u5EF6/\u9650\u6D41\uFF09`),await vw(f);else if(b===2){if(c<=1||d<=0)break;let x=Math.max(1,Math.floor(c/LP));t.onProgress?.(`\u4ECD\u5931\u8D25 \u2192 \u7B49 ${p}ms \u540E\u964D\u7EA7\u5230 limit=${x} \u63A2\u8DEF\u4E00\u6B21\uFF08\u9274\u522B\u201C\u9875\u592A\u5927\u201D\u8FD8\u662F\u201C\u810F\u6570\u636E\u201D\uFF09`),await vw(p),c=x,d-=1}u.push(c);try{g=await t.reader.queryRecords({baseId:t.baseId,sheetId:t.sheetId,limit:c,...i?{cursor:i}:{}}),y=!0,b===2&&(l=c);break}catch(x){m=x}}if(!y){let b=o[o.length-1];throw new Po({rowsRead:o.length,pages:s,cursor:i,lastOkRecordId:b?.recordId,lastOkCells:b?.cells,limitsTried:u,cause:m})}s+=1,o.push(...Cr(g));let w=Tr(g);if(t.onProgress?.(`\u7B2C ${s} \u9875\uFF08limit=${c}\uFF09\uFF1A\u7D2F\u8BA1 ${o.length} \u884C`),!w||w===i)break;if(i=w,s>=n)throw new Error(`\u5206\u9875\u8D85\u8FC7\u4FDD\u9669\u4E1D ${n} \u9875\uFF08\u5DF2\u53D6 ${o.length} \u884C\uFF09\u3002\u82E5\u8868\u786E\u5B9E\u66F4\u5927\uFF0C\u8BF7\u8C03\u9AD8 maxPages\u3002`)}return l>0&&e(`\u5355\u9875\u6761\u6570\u5DF2\u964D\u7EA7\u5230 ${l}\uFF08\u539F ${r}\uFF09\uFF1A\u8BE5\u8868\u5355\u884C\u6570\u636E\u8F83\u5927\uFF08\u5185\u5D4C\u56FE/\u957F\u5BCC\u6587\u672C\uFF09\uFF0C\u5927 limit \u4F1A\u88AB\u670D\u52A1\u7AEF\u62D2\u7EDD\u3002\u5EFA\u8BAE\u5728 profile \u91CC\u56FA\u5316 page_size=${l} \u4EE5\u7701\u53BB\u6BCF\u8F6E\u8BD5\u9519\u3002`),{rows:o,pages:s}}a(WP,"scanAll");async function BP(t,e){let n=kw.join(t,Bn);if(!Sw(n))return[];let r=[];for(let o of await jP(n)){if(!o.endsWith(".json"))continue;let i=o.slice(0,-5);e.has(i)||(await FP(kw.join(n,o)),r.push(i))}return r}a(BP,"pruneRows");function zP(t,e){if(Object.keys(e).length!==0)for(let n of t)for(let r of Object.values(n.cells)){let o=r.embeddedImages;if(!o?.length)continue;let i=r.value&&typeof r.value=="object"&&"markdown"in r.value?r.value.markdown:"";for(let s of o){let c=e[s.resourceId];!c||c===s.asset||(i=i.split(`(${s.asset})`).join(`(${c})`),s.asset=c)}i&&(r.value.markdown=i,r.text=i)}}a(zP,"applyResolvedAssets");async function xw(t){let{snapshotDir:e,baseId:n,sheetId:r}=t,o=new Date().toISOString(),i=[],s=ca(await t.reader.getFields({baseId:n,sheetId:r}));if(s.length===0)throw new Error(`\u672A\u8BFB\u5230\u4EFB\u4F55\u5B57\u6BB5\uFF08baseId=${n} sheetId=${r}\uFF09`);let c=pa(e);if(c){let T=ga(c.fields,s);if(ma(T)){let _=ha(T,c.fields);if(!t.acceptSchemaChange)throw new _r(_,T);i.push(`[\u5DF2\u6309 --accept-schema-change \u653E\u884C] ${_}`)}T.optionsChanged.length>0&&i.push(`\u5355\u9009\u9009\u9879\u6709\u589E\u51CF\uFF08${T.optionsChanged.join(", ")}\uFF09\uFF1A\u76EE\u5F55\u96C6\u5408\u53EF\u80FD\u53D8\u5316\uFF0C\u9700\u91CD\u5EFA\u7D22\u5F15`)}let{rows:l,pages:d}=await WP(t,T=>i.push(T));t.onProgress?.(`scan \u5B8C\u6210\uFF1A${l.length} \u884C / ${d} \u9875`);let u={fields:new Map(s.map(T=>[T.id,T])),sheetId:r},f=[],p=[],g=[];for(let T of l){let _=aa(T.recordId,T.cells,u,f);p.push({recordId:T.recordId,cells:_}),g.push(...ya(T.cells,_))}for(let T of f)i.push(`${T.recordId}/${T.fieldId}: ${T.message}`);let m=await wa(e,g,t.attachmentOptions);for(let T of m.failed)i.push(`\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${T.filename}\uFF08${T.resourceId}\uFF09\u2014\u2014 ${T.reason}`);zP(p,m.resolved);let y=[],w={};for(let T of p){let _=la(T.cells,t.hashOptions);y.push({recordId:T.recordId,rowHash:_,fetchedAt:o,cells:T.cells}),w[T.recordId]=_}let b=da(w),x=ua(s);if(!t.force&&c?.snapshotFingerprint===b&&c?.schemaFingerprint===x&&c?.hashVersion===Nt)return t.onProgress?.("\u5FEB\u7167\u6307\u7EB9\u672A\u53D8 \u2192 \u8DF3\u8FC7\u5199\u76D8\u4E0E\u7F16\u8BD1"),{manifest:c,changed:[],removed:[],unchanged:!0,attachmentsDownloaded:m.downloaded,attachmentsSkipped:m.skipped,warnings:i};let S=[];for(let T of y){let _=c?.rows[T.recordId],C=c?.hashVersion!==Nt;!t.force&&!C&&_===T.rowHash&&Sw(zn(e,T.recordId))||($o(zn(e,T.recordId),T),S.push(T.recordId))}let k=await BP(e,new Set(Object.keys(w))),R={baseId:n,sheetId:r,hashVersion:Nt,fetchedAt:o,fields:s,rows:w,snapshotFingerprint:b,schemaFingerprint:x};return $o(Do(e),R),{manifest:R,changed:S,removed:k,unchanged:!1,attachmentsDownloaded:m.downloaded,attachmentsSkipped:m.skipped,warnings:i}}a(xw,"pullTable");function Iw(t){return t.warnings.some(e=>e.startsWith("\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25"))}a(Iw,"hasAttachmentFailure");function ka(t){let e=t.timeoutSeconds??120,n=(e+30)*1e3;return{async getFields({baseId:r,sheetId:o}){return t.client.runJson(["aitable","+field-get","--baseId",r,"--tableId",o,"--timeout",String(e)],{timeoutMs:n})},async queryRecords({baseId:r,sheetId:o,limit:i,cursor:s}){let c=["aitable","+record-query","--base-id",r,"--table-id",o,"--limit",String(i),"--timeout",String(e)];return s&&c.push("--cursor",s),t.client.runJson(c,{timeoutMs:n})}}}a(ka,"createDwsTableReader");import{readFileSync as UP,existsSync as Rw}from"fs";import{readdirSync as KP}from"fs";import VP from"path";function Xd(t,e){let n=zn(t,e);if(!Rw(n))return null;try{return JSON.parse(UP(n,"utf8"))}catch{return null}}a(Xd,"readRowSnapshot");function Cw(t){let e=VP.join(t,Bn);if(!Rw(e))return[];let n=[];for(let r of KP(e).sort()){if(!r.endsWith(".json"))continue;let o=Xd(t,r.slice(0,-5));o&&n.push(o)}return n}a(Cw,"readAllRowSnapshots");import eu from"fs/promises";import _w from"path";async function tu(t){let{collectionDir:e,activeRowIds:n}=t,r=_w.join(e,"articles"),o=[],i=[],s;try{s=await eu.readdir(r)}catch{return{removed:o,kept:i}}for(let c of s){if(!c.endsWith(".md")||c.startsWith("_"))continue;let l=_w.join(r,c),d;try{d=await eu.readFile(l,"utf8")}catch{continue}let f=Ne(d).sourceRowId;f&&!n.has(f)?(await eu.rm(l,{force:!0}),o.push(c)):i.push(c)}return{removed:o,kept:i}}a(tu,"cleanupOrphanArticles");async function Aw(t,e){let n=await Fn(t,e),r=await Ot(qt(t,e));return{collection:e,state:n,currentHash:r,sourceChanged:ys(n,r)}}a(Aw,"getKbStatus");async function GP(t){return(await Ir(t)).resolved}a(GP,"resolveAllCollections");function JP(t){return br(t.raw?.toolkit_config)}a(JP,"shellBins");async function nu(t){let n=(await or(t)).configuredAgent;return{...n?{agent:n}:{},...t.agent.model?{model:t.agent.model}:{},configPath:bt(t.configDir)}}a(nu,"resolveCompileAgent");function ru(t){let e=`${t.index+1}/${t.total}`,n=t.detail?` \u2014 ${t.detail}`:"",r=t.phase==="done"?"\u2713":t.phase==="failed"?"\u26A0":t.phase==="skipped"?"\u23ED":"\u23F3";console.log(`${r} [KB ${e}] ${t.collection}: ${t.phase}${n}`)}a(ru,"printKbProgress");function ou(t){if(t.skippedReason==="no-collections"){console.log("\xB7 \u672A\u58F0\u660E\u77E5\u8BC6\u5E93(\u89D2\u8272\u65E0 knowledge_scope.kb_collections)\uFF0C\u8DF3\u8FC7\u7F16\u8BD1");return}if(t.skippedReason==="llm_only"){console.log("\u26A0 \u5F53\u524D engine \u4E3A llm_only\uFF0C\u65E0 coding agent\uFF0C\u8DF3\u8FC7\u77E5\u8BC6\u5E93\u7F16\u8BD1");return}let e=t.results.filter(o=>o.action==="compiled").length,n=t.results.filter(o=>o.action==="skipped").length,r=t.results.filter(o=>o.action==="failed").length;console.log(`\u77E5\u8BC6\u5E93\u7F16\u8BD1\u5B8C\u6210: ${e} \u7F16\u8BD1, ${n} \u8DF3\u8FC7${r>0?`, ${r} \u5931\u8D25`:""}`);for(let o of t.results.filter(i=>i.action==="failed"))console.log(` \u26A0 ${o.collection}: ${o.error??"\u7F16\u8BD1\u5931\u8D25"}`)}a(ou,"printKbSummary");var ZP=["broken-link","absolute-path","invalid-category","missing-sources"];function YP(t){let e=[];for(let n of t){if(n.action==="failed"){e.push(`${n.collection}: \u7F16\u8BD1\u5931\u8D25\uFF08${n.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}let r=n.report;if(!r){n.action==="skipped"&&e.push(`${n.collection}: \u8DF3\u8FC7\u7F16\u8BD1\u4E14\u65E0\u5386\u53F2\u7F16\u8BD1\u62A5\u544A\uFF0C\u65E0\u6CD5\u786E\u8BA4\u4EA7\u7269\u8D28\u91CF`);continue}let o=n.action==="skipped"?`${n.collection}\uFF08\u4E0A\u6B21\u7F16\u8BD1\uFF09`:n.collection;if(r.status==="failed"){e.push(`${o}: \u4E0A\u6B21\u7F16\u8BD1\u5931\u8D25\uFF08${r.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}if((r.failedFileCount??0)>0&&e.push(`${o}: ${r.failedFileCount} \u4E2A\u6E90\u6587\u4EF6\u7F16\u8BD1\u5931\u8D25`),r.lintError)e.push(`${o}: lint \u672A\u80FD\u6267\u884C\uFF08${r.lintError}\uFF09\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`);else if(r.lint)for(let i of ZP){let s=r.lint.counts[i]??0;s>0&&e.push(`${o}: lint ${i} \xD7${s}`)}else e.push(`${o}: \u7F16\u8BD1\u62A5\u544A\u65E0 lint \u7ED3\u679C\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`)}return e}a(YP,"evaluateStrictGate");function QP(t,e){return e.map(n=>{if(n.action!=="skipped"||n.report)return n;try{let r=HP.readFileSync(Zn(t,n.collection),"utf8");return{...n,report:JSON.parse(r)}}catch{return n}})}a(QP,"attachHistoricalReports");function Dw(t,e){let n=YP(QP(e,t));if(n.length!==0){console.error(`
493
493
  \u2717 strict \u95E8\u7981\u672A\u901A\u8FC7\uFF08${n.length} \u9879\uFF09\uFF1A`);for(let r of n)console.error(` - ${r}`);process.exit(1)}}a(Dw,"enforceStrictGate");async function $w(t,e){let n=await GP(e);if(t.length>0){let r=n.filter(o=>t.includes(o.collection));for(let o of t)r.some(i=>i.collection===o)||r.push({collection:o});return r}return n.length===0?(console.log("\u26A0 \u672A\u53D1\u73B0\u4EFB\u4F55 kb_collections\uFF08\u68C0\u67E5 roles \u7684 knowledge_scope.kb_collections\uFF09"),null):n}a($w,"resolveTargets");async function Pw(t,e,n){let r=await je(e.config),o=await $w(t,r);if(!o)return{results:[],configDir:r.configDir};let i=JP(r),s=await un({configDir:r.configDir,collections:o,force:n,...await nu(r),...i?{bins:i}:{},onProgress:ru});return ou({collections:o.map(c=>c.collection),results:s}),{results:s,configDir:r.configDir}}a(Pw,"runKbRefresh");async function XP(t,e){let{results:n,configDir:r}=await Pw(t,e,e.full??!1);e.strict&&Dw(n,r)}a(XP,"runKbCompileCommand");async function MY(t,e){let{results:n,configDir:r}=await Pw(t,e,!1);e.strict&&Dw(n,r)}a(MY,"runKbUpdateCommand");async function OY(t,e){let n=await je(e.config),r=await $w(t,n);if(r){console.log(`
494
494
  \u77E5\u8BC6\u5E93\u72B6\u6001:`);for(let o of r){if(Ft(o)){let u=o.compile.artifact,f=Mo.resolve(n.configDir,o.collection,u),p=!1;try{await qP(f),p=!0}catch{p=!1}console.log(` \xB7 ${o.collection}: \u81EA\u5B9A\u4E49\u7F16\u8BD1\uFF08${o.compile.build.length} \u6761\u547D\u4EE4\uFF09\xB7 \u4EA7\u7269${p?"\u5DF2\u5C31\u7EEA":"\u7F3A\u5931"}: ${u}`),p||console.log(" \u21B3 \u4EA7\u7269\u7F3A\u5931\uFF1A\u5148\u8DD1 setup \u6216 kb compile \u89E6\u53D1\u7F16\u8BD1\u547D\u4EE4\u94FE");continue}let i=await Aw(n.configDir,o.collection),s=i.state?.status??"\u672A\u7F16\u8BD1",c=i.sourceChanged?"\uFF08\u6E90\u5DF2\u53D8\u66F4\uFF0C\u9700\u91CD\u7F16\u8BD1\uFF09":"",l=i.state?.compiledCount!=null?` \xB7 ${i.state.compiledCount} \u7BC7`:"",d=i.state?.finishedAt?` \xB7 ${i.state.finishedAt}`:"";console.log(` \xB7 ${o.collection}: ${s}${l}${d} ${c}`),i.state?.lastError&&console.log(` \u21B3 \u9519\u8BEF: ${i.state.lastError}`)}}}a(OY,"runKbStatusCommand");function e0(t){return"totalDocs"in t}a(e0,"isIngestReport");async function jY(t,e){let n=Mo.dirname(Mo.resolve(e.config)),r=e.output??Mo.resolve(n,"wiki"),o=e.type,i=e.timeout?parseInt(e.timeout,10):void 0;console.log(`\u5BFC\u5165: ${t}`),console.log(`\u8F93\u51FA: ${r}`);let s=await hr({url:t,type:o,outputDir:r,preserveStructure:!e.flat,force:e.force,timeoutMs:i,onProgress:a((c,l,d)=>{console.log(` [${c+1}/${l}] ${d}`)},"onProgress")});if(e0(s)){let c=[`${s.successCount} \u65B0\u589E/\u66F4\u65B0`];s.skippedCount>0&&c.push(`${s.skippedCount} \u8DF3\u8FC7(\u65E0\u53D8\u5316)`),s.skippedUnsupported>0&&c.push(`${s.skippedUnsupported} \u8DF3\u8FC7(\u4E0D\u652F\u6301\u7684\u683C\u5F0F)`),s.failureCount>0&&c.push(`${s.failureCount} \u5931\u8D25`),console.log(`
495
495
  \u5BFC\u5165\u5B8C\u6210: ${c.join(", ")} (\u5171 ${s.totalDocs} \u7BC7)`);for(let l of s.results.filter(d=>!d.success))console.log(` \u26A0 ${l.title??l.sourceUrl}: ${l.error}`)}else if(s.success){let c=s.action==="skipped"?"\u8DF3\u8FC7(\u65E0\u53D8\u5316)":s.action==="updated"?"\u5DF2\u66F4\u65B0":"\u5BFC\u5165\u6210\u529F";console.log(`
496
496
  \u2713 ${c}: ${s.title??s.relativePath}`),s.action!=="skipped"&&console.log(` \u6587\u4EF6: ${s.filePath}`)}else console.error(`
497
497
  \u2717 \u5BFC\u5165\u5931\u8D25: ${s.error}`),process.exit(1);e.compile&&(console.log(`
498
- \u89E6\u53D1\u7F16\u8BD1...`),await XP([],{config:e.config}))}a(jY,"runKbIngestCommand");var t0=100,Ew=200;async function FY(t,e){let n=await je(e.config),r=Mo.resolve(n.configDir,t),o=new Set;for(let c of n.workflowEntries){let l=await He(c.templatePath,{envSource:n.envSource}),u=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??l.tracker;if(!u)continue;let f=Dn(n,c,u),{base_id:p,table_id:g}=f.tracker;if(!p.trim()||!g.trim())continue;let m=ka({client:new he({bin:f.tracker.dws_bin})}),y;for(let w=0;;w++){if(w>=Ew)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${c.id}\u300Dtracker \u8868\u5206\u9875\u8D85\u4FDD\u9669\u4E1D ${Ew} \u9875\uFF0C\u5DF2\u62D2\u7EDD\u6E05\u7406`);let b=await m.queryRecords({baseId:p,sheetId:g,limit:t0,...y?{cursor:y}:{}});for(let I of Cr(b))o.add(I.recordId);let x=Tr(b);if(!x||x===y)break;y=x}}let{removed:i,kept:s}=await tu({collectionDir:r,activeRowIds:o});console.log(`\u6E05\u7406\u4E86 ${i.length} \u7BC7\u5B64\u513F\u6587\u7AE0\uFF0C\u4FDD\u7559 ${s.length} \u7BC7`);for(let c of i)console.log(` - ${c}`)}a(FY,"runKbCleanupCommand");import{watch as n0}from"fs";function r0(t){return t?t===".env"||t.endsWith(".yml")||t.endsWith(".yaml"):!0}a(r0,"isRelevantFile");function Mw(t){return JSON.stringify({raw:t.raw,env:t.envSource})}a(Mw,"snapshot");function Ow(t){let{watchDir:e,configCenter:n}=t;if(!t.reload&&!t.configPath)throw new Error("startConfigHotReload: \u9700\u63D0\u4F9B reload \u6216 configPath \u4E4B\u4E00");let r=t.reload??(()=>je(t.configPath)),o=t.debounceMs??300,i=a(async()=>{let p=await r(),g=Mw(n.current());n.applyReload(p);let m=Mw(n.current())!==g;return await t.onReloaded?.(p),m},"runReloadOnce"),s=null,c=!1,l=a(async()=>{if(s)return c=!0,s;let p=(async()=>{try{let g=await i();for(;c;)c=!1,g=await i();return g}finally{s=null}})();return s=p,p},"refresh"),d=null,u=a(()=>{d&&clearTimeout(d),d=setTimeout(()=>{d=null,l().then(p=>{p&&h.info("config-watcher","\u914D\u7F6E\u53F6\u5B50\u5DF2\u70ED\u66F4(env/config); recipe/event handler \u4EE3\u7801\u3001steps/edges \u4E0E event_sources \u53D8\u66F4\u9700\u91CD\u542F",{})}).catch(p=>{h.warn("config-watcher","\u914D\u7F6E\u70ED\u66F4\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{error:p instanceof Error?p.message:String(p)})})},o)},"onChange"),f=null;try{f=n0(e,{persistent:!1},(p,g)=>{r0(g)&&u()})}catch(p){h.warn("config-watcher","\u914D\u7F6E\u76EE\u5F55\u76D1\u542C\u672A\u751F\u6548,\u70ED\u66F4\u4E0D\u53EF\u7528(\u6539\u914D\u7F6E\u9700\u91CD\u542F)",{watchDir:e,error:p instanceof Error?p.message:String(p)})}return{stop(){if(d&&(clearTimeout(d),d=null),f){try{f.close()}catch{}f=null}},refresh:l}}a(Ow,"startConfigHotReload");function jw(t,e){let n=t;for(let r of e.split(".")){if(n==null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}a(jw,"getByPath");var va=class{static{a(this,"InMemoryConfigCenter")}settings;globalVars;listeners=new Map;workflows=new Map;constructor(e,n){this.settings=e,this.globalVars=n}getConfig(e){return jw(this.settings.raw,e)}getEnv(e){let n=this.settings.envSource[e];if(n!==void 0)return qi(n)}subscribe(e,n){let r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.add(n),()=>{r.delete(n),r.size===0&&this.listeners.delete(e)}}applyReload(e){let n=new Map;for(let o of this.listeners.keys())n.set(o,JSON.stringify(this.resolveNsPath(o,this.settings)??null));let r=this.settings.raw;for(let o of Object.keys(r))o in e.raw||delete r[o];Object.assign(r,e.raw),this.settings.envSource=e.envSource;for(let[o,i]of this.listeners)if(JSON.stringify(this.resolveNsPath(o,this.settings)??null)!==n.get(o))for(let c of i)try{c()}catch(l){h.warn("config-center","listener \u629B\u9519",{nsPath:o,error:l instanceof Error?l.message:String(l)})}}current(){return this.settings}getToolkitConfig(e){let n=this.workflows.get(e)?.toolkitConfig??{};return this.resolveToolkitRefs(n)}resolveFieldRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=Qt(o)?vt(o,{configScope:this,...this.globalVars?{globalVars:this.globalVars}:{}}):o;return n}resolveToolkitRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=this.resolveFieldRefs(o);return n}getHandlerConfig(e,n){let r=this.workflows.get(e)?.handlerConfigs.get(n);return r===void 0?void 0:this.resolveFieldRefs(r)}applyWorkflow(e,n,r){this.workflows.set(e,{toolkitConfig:n,handlerConfigs:r})}scope(e){return{getEnv:a(n=>this.getEnv(n),"getEnv"),getConfig:a(n=>this.getConfig(n),"getConfig"),subscribe:a((n,r)=>this.subscribe(n,r),"subscribe"),getToolkitConfig:a(()=>this.getToolkitConfig(e),"getToolkitConfig"),getHandlerConfig:a(n=>this.getHandlerConfig(e,n),"getHandlerConfig")}}resolveNsPath(e,n){let r=e.indexOf(".");if(r<0)return;let o=e.slice(0,r),i=e.slice(r+1);if(o==="config")return jw(n.raw,i);if(o==="env"){let s=n.envSource[i];return s===void 0?void 0:qi(s)}}};import{readdirSync as o0}from"fs";function Nw(t){let e=new Map;for(let n of t.eventSources??[]){let r=n.name,o=n.handler_config;r&&o&&typeof o=="object"&&e.set(r,o)}return e}a(Nw,"collectHandlerConfigs");function i0(t,e,n){let r=t.find(c=>c.id===n);if(r)return r;let o=t.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09",i=e.find(c=>c.id===n),s=i?`\u3002\u8BE5\u5DE5\u4F5C\u6D41\u542F\u52A8\u65F6\u88AB\u8DF3\u8FC7\uFF1A${i.reason}`:"";throw new Error(`\u5DE5\u4F5C\u6D41 "${n}" \u4E0D\u53EF\u89E6\u53D1\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${o}${s}`)}a(i0,"resolveTriggerTarget");async function IQ(t,e={}){let n=await je(t);sl(n.envSource);let r=Fw.resolve(n.configDir,n.agent.trace_dir);bf(r);let o,i=lt(n.configDir,n.envSource);if(n.roles.enabled){let _=new Mt(n.rolesDir);if(i?.roles){let C=Fw.resolve(n.configDir,"profile"),E=!1;try{E=o0(n.rolesDir).some(W=>W.endsWith(".role.yml"))}catch{}if(E)throw new Error(`profile.yml \u5DF2\u58F0\u660E roles \u6BB5\uFF0C\u4F46 ${n.rolesDir} \u4E2D\u4ECD\u5B58\u5728 .role.yml \u6587\u4EF6\u3002\u4E24\u8005\u4E92\u65A5\uFF1A\u8BF7\u5220\u9664 roles/ \u76EE\u5F55\u6216\u79FB\u9664 profile.yml \u7684 roles \u6BB5\u3002`);_.loadFromProfile(i.roles,C)}else await _.loadAll();o=new Bi(_)}let s=Ac(),c=new tn,l=new va(n,c),d=[],u=new Map,f={},p={};for(let _ of n.workflowEntries){let C=await He(_.templatePath,{envSource:n.envSource});i?.workflows?.[_.id]&&nn(_.id,i.workflows[_.id],C),u.set(_.id,C);let F=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??C.tracker;F&&(f[`workflow:${_.id}.tracker`]={base_id:F.base_id,table_id:F.table_id},Object.assign(p,jg(_.id,C,{base_id:F.base_id,table_id:F.table_id})))}let g=[],m=(await Ir(n)).resolved,y=await Ms({configDir:n.configDir,targets:m.filter(Ft).map(_=>({collection:_.collection,artifact:_.compile?.artifact??Hc,roleIds:_.roleIds??[]})),workflows:n.workflowEntries.map(_=>({id:_.id,recipeDir:_.recipeDir}))}),w=Ml(xh(await ho(n.configDir),y));if(w.hasFatal){let _=w.issues.find(C=>C.level==="fatal");throw new Error(`\u5B9E\u4F8B\u6821\u9A8C\u5931\u8D25(preflight fatal)\uFF0C\u62D2\u7EDD\u542F\u52A8: ${_.message}`)}for(let _ of w.blockedWorkflowIds){let C=w.issues.filter(E=>E.workflowId===_&&E.level==="error").map(E=>E.message).join("; ");g.push({id:_,reason:`preflight \u6821\u9A8C\u5931\u8D25: ${C}`})}let b=new Set(w.blockedWorkflowIds),x=new Map;await Promise.all(n.workflowEntries.map(async _=>{if(!b.has(_.id))try{let C=u.get(_.id),E=Gi(n,C.tracker);if(!E)throw new Error("\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09");let F=Dn(n,_,E);if(F.tracker.base_id&&F.tracker.table_id){let P=new he({bin:F.tracker.dws_bin});await Ao(P,F.tracker.base_id,F.tracker.table_id)}let W=new Gs(F.tracker);await W.init(),x.set(_.id,{perSettings:F,tracker:W})}catch(C){let E=C instanceof Error?C.message:String(C);g.push({id:_.id,reason:E}),h.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:_.id,error:E})}}));for(let _ of n.workflowEntries){let C=x.get(_.id);if(C)try{let E=u.get(_.id),{perSettings:F,tracker:W}=C,P=l.scope(_.id);l.applyWorkflow(_.id,E.toolkitConfig??{},Nw(E));let q=new Li().createAll(E.eventSources,{pollIntervalMs:F.polling.interval_ms,configDir:F.configDir,tableRefs:f,configRefs:p,globalVars:c,configScope:P}),z=new ra({settings:F,workflow:E,tracker:W,eventBindings:q,roleResolver:o,toolkitRegistry:s,onRunEvent:e.onRunEvent,globalVars:c,configScope:P,configRefs:p});d.push({id:_.id,settings:F,workflow:E,tracker:W,orchestrator:z,entry:_}),h.info("app","\u5DE5\u4F5C\u6D41\u7EC4\u88C5\u5B8C\u6210",{id:_.id,workflow:E.meta.name,domain:E.meta.domain,steps:E.orderedStepIds,eventSources:q.map(K=>K.source.name)})}catch(E){let F=E instanceof Error?E.message:String(E);g.push({id:_.id,reason:F}),h.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:_.id,error:F})}}for(let _ of d)h.info("app",`[preflight] ${_.id} \u2713 \u5DF2\u542F\u52A8`,{workflow:_.workflow.meta.name});for(let _ of g)h.error("app",`[preflight] ${_.id} \u2717 \u672A\u542F\u52A8\uFF1A${_.reason}`,{id:_.id});if(d.length===0){let _=g.map(C=>`${C.id}: ${C.reason}`).join("; ");throw new Error(`\u6CA1\u6709\u4EFB\u4F55\u5DE5\u4F5C\u6D41\u80FD\u542F\u52A8\uFF08\u5171 ${g.length} \u4E2A\u5747\u88C5\u914D\u5931\u8D25\uFF09\u3002${_}`)}h.info("app","\u5E94\u7528\u7EC4\u88C5\u5B8C\u6210",{mode:n.multiWorkflow?"multi-workflow":"single-workflow",workflowCount:d.length,skippedCount:g.length,rolesEnabled:n.roles.enabled,toolkitsLoaded:s.length});let I=await nu(n),v=br(n.raw?.toolkit_config),k=I.agent?new oa({configDir:n.configDir,resolveCollections:a(async()=>(await Ir(n)).resolved,"resolveCollections"),...I,...v?{bins:v}:{}}):null;I.agent||h.warn("app","\u5F53\u524D engine \u65E0\u53EF\u7528 coding agent(\u5982 llm_only),\u8DF3\u8FC7 KB \u81EA\u52A8\u5237\u65B0");let R=d[0],T;return{settings:n,instances:d,skippedWorkflows:g,workflow:R.workflow,tracker:R.tracker,orchestrator:R.orchestrator,triggerWorkflowOnce:a((_,C)=>i0(d,g,_).orchestrator.triggerOnce(C),"triggerWorkflowOnce"),start:a(async()=>{k?.start(),T=Ow({watchDir:n.configDir,configCenter:l,reload:a(()=>je(t),"reload"),onReloaded:a(async _=>{sl(_.envSource),Pn();let C=lt(n.configDir,_.envSource);for(let E of d)try{let F=await He(E.entry.templatePath,{envSource:_.envSource});C?.workflows?.[E.id]&&nn(E.id,C.workflows[E.id],F),(JSON.stringify(F.steps)!==JSON.stringify(E.workflow.steps)||JSON.stringify(F.edges??null)!==JSON.stringify(E.workflow.edges??null))&&h.warn("app","workflow \u7ED3\u6784(steps/edges)\u53D8\u66F4\u9700\u91CD\u542F\u624D\u751F\u6548,\u672C\u6B21\u4EC5\u70ED\u66F4\u914D\u7F6E\u53F6\u5B50",{id:E.id}),l.applyWorkflow(E.id,F.toolkitConfig??{},Nw(F))}catch(F){h.warn("app","workflow \u91CD\u89E3\u6790\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{id:E.id,error:F instanceof Error?F.message:String(F)})}},"onReloaded")}),await Promise.all(d.map(_=>_.orchestrator.start()))},"start"),stop:a(async()=>{T?.stop(),T=void 0,k?.stop(),await Promise.all(d.map(_=>_.orchestrator.stop()))},"stop")}}a(IQ,"createApp");async function Lt(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return Te(r).filter(S).map(i=>({fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??"")})).filter(i=>i.fieldId&&i.fieldName)}a(Lt,"fetchFields");function s0(t){for(let e of["config","property"]){let n=t[e];if(S(n)&&Array.isArray(n.options))return n.options}return Array.isArray(t.options)?t.options:[]}a(s0,"pickOptions");async function Ar(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return Te(r).filter(S).map(i=>{let c=s0(i).filter(S).map(l=>({id:String(l.id??""),name:String(l.name??"")})).filter(l=>l.id&&l.name);return{fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??""),options:c}}).filter(i=>i.fieldId&&i.fieldName)}a(Ar,"fetchFieldsWithOptions");import{EventEmitter as a0}from"events";import{randomUUID as c0}from"crypto";var iu=class extends a0{static{a(this,"RelayAgentSession")}transport;requestId;projectId;agent;workDir;permissionMode;timeoutMs;sessionId;finalResponse;artifacts;pending=null;closed=!1;unsubscribe;constructor(e,n){super(),this.transport=e,this.requestId=n.requestId,this.projectId=n.projectId,this.agent=n.agent,this.workDir=n.workDir,this.permissionMode=n.permissionMode,this.timeoutMs=n.timeoutMs,this.sessionId=n.sessionId??"",this.unsubscribe=e.onMessage(r=>this.handleMessage(r))}send(e){return this.closed?Promise.reject(new Error("relay session already closed")):new Promise((n,r)=>{this.pending={resolve:n,reject:r},this.transport.send({type:"run:agent",requestId:this.requestId,projectId:this.projectId,agent:this.agent,prompt:e,...this.workDir?{workDir:this.workDir}:{},...this.sessionId?{sessionId:this.sessionId}:{},...this.permissionMode?{permissionMode:this.permissionMode}:{},...this.timeoutMs!==void 0?{timeoutMs:this.timeoutMs}:{}})})}currentSessionId(){return this.sessionId}isAlive(){return!this.closed}async close(){if(!this.closed&&(this.closed=!0,this.unsubscribe(),this.transport.close(),this.pending)){let e=this.pending;this.pending=null,e.reject(new Error("relay session closed before completion"))}}lastResponse(){return this.finalResponse}artifactManifest(){return this.artifacts}handleMessage(e){if(!(!("requestId"in e)||e.requestId!==this.requestId))switch(e.type){case"event":this.emit("event",e.event);break;case"result":{e.sessionId&&(this.sessionId=e.sessionId),this.finalResponse=e.response,this.artifacts=e.artifacts,this.settleResolve();break}case"error":{let n=new Error(e.message);n.code=e.code,this.settleReject(n);break}default:break}}settleResolve(){if(!this.pending)return;let e=this.pending;this.pending=null,e.resolve()}settleReject(e){if(!this.pending)return;let n=this.pending;this.pending=null,n.reject(e)}},su=class{static{a(this,"RelayExecutor")}kind="relay";transport;projectId;agent;requestIdFactory;landArtifacts;constructor(e,n){this.transport=e,this.projectId=n.projectId,this.agent=n.agent,this.requestIdFactory=n.requestIdFactory??(()=>c0()),this.landArtifacts=n.landArtifacts}async run(e,n){let r=n?.adapterOptions?.permissionMode==="bypassPermissions"?"bypassPermissions":void 0,o=new iu(this.transport,{requestId:this.requestIdFactory(),projectId:this.projectId,agent:this.agent,sessionId:n?.sessionId,workDir:n?.workDir,...r?{permissionMode:r}:{},...n?.timeoutMs!==void 0?{timeoutMs:n.timeoutMs}:{}}),i=[];o.on("event",c=>{i.push(c),n?.onEvent?.(c)});try{await o.send(e)}finally{await o.close().catch(()=>{})}let s=o.artifactManifest();return s&&this.landArtifacts&&await this.landArtifacts(this.projectId,s),{response:(o.lastResponse()??"").trim(),events:i,sessionId:o.currentSessionId()}}};function MQ(t,e){return new su(t,e)}a(MQ,"createRelayExecutor");var au=class{static{a(this,"LocalSpawnExecutor")}kind="local-spawn";defaults;runner;constructor(e={},n=oi){this.defaults=e,this.runner=n}run(e,n){if(!(Object.keys(this.defaults).length>0))return this.runner(e,n);let o={...this.defaults,...n??{}};return this.runner(e,o)}};function NQ(t,e){return new au(t??{},e??oi)}a(NQ,"createLocalSpawnExecutor");import aM from"path";import{access as cM,readFile as lM}from"fs/promises";import dM from"yaml";import{serializeForm as l0}from"aitable-workflow-base";function Sa(t,e,n){let r=n?.interactive??!0,o=!!(e?.designSkillRelPath||e?.frameworkSkillRelPath);return[d0,u0(e,r),r?p0(e?.questionFormProtocolRelPath):g0,y0(t),o?"":f0,w0(t),b0(t)].filter(Boolean).join(`
498
+ \u89E6\u53D1\u7F16\u8BD1...`),await XP([],{config:e.config}))}a(jY,"runKbIngestCommand");var t0=100,Ew=200;async function FY(t,e){let n=await je(e.config),r=Mo.resolve(n.configDir,t),o=new Set;for(let c of n.workflowEntries){let l=await He(c.templatePath,{envSource:n.envSource}),u=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??l.tracker;if(!u)continue;let f=Dn(n,c,u),{base_id:p,table_id:g}=f.tracker;if(!p.trim()||!g.trim())continue;let m=ka({client:new he({bin:f.tracker.dws_bin})}),y;for(let w=0;;w++){if(w>=Ew)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${c.id}\u300Dtracker \u8868\u5206\u9875\u8D85\u4FDD\u9669\u4E1D ${Ew} \u9875\uFF0C\u5DF2\u62D2\u7EDD\u6E05\u7406`);let b=await m.queryRecords({baseId:p,sheetId:g,limit:t0,...y?{cursor:y}:{}});for(let I of Cr(b))o.add(I.recordId);let x=Tr(b);if(!x||x===y)break;y=x}}let{removed:i,kept:s}=await tu({collectionDir:r,activeRowIds:o});console.log(`\u6E05\u7406\u4E86 ${i.length} \u7BC7\u5B64\u513F\u6587\u7AE0\uFF0C\u4FDD\u7559 ${s.length} \u7BC7`);for(let c of i)console.log(` - ${c}`)}a(FY,"runKbCleanupCommand");import{watch as n0}from"fs";function r0(t){return t?t===".env"||t.endsWith(".yml")||t.endsWith(".yaml"):!0}a(r0,"isRelevantFile");function Mw(t){return JSON.stringify({raw:t.raw,env:t.envSource})}a(Mw,"snapshot");function Ow(t){let{watchDir:e,configCenter:n}=t;if(!t.reload&&!t.configPath)throw new Error("startConfigHotReload: \u9700\u63D0\u4F9B reload \u6216 configPath \u4E4B\u4E00");let r=t.reload??(()=>je(t.configPath)),o=t.debounceMs??300,i=a(async()=>{let p=await r(),g=Mw(n.current());n.applyReload(p);let m=Mw(n.current())!==g;return await t.onReloaded?.(p),m},"runReloadOnce"),s=null,c=!1,l=a(async()=>{if(s)return c=!0,s;let p=(async()=>{try{let g=await i();for(;c;)c=!1,g=await i();return g}finally{s=null}})();return s=p,p},"refresh"),d=null,u=a(()=>{d&&clearTimeout(d),d=setTimeout(()=>{d=null,l().then(p=>{p&&h.info("config-watcher","\u914D\u7F6E\u53F6\u5B50\u5DF2\u70ED\u66F4(env/config); recipe/event handler \u4EE3\u7801\u3001steps/edges \u4E0E event_sources \u53D8\u66F4\u9700\u91CD\u542F",{})}).catch(p=>{h.warn("config-watcher","\u914D\u7F6E\u70ED\u66F4\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{error:p instanceof Error?p.message:String(p)})})},o)},"onChange"),f=null;try{f=n0(e,{persistent:!1},(p,g)=>{r0(g)&&u()})}catch(p){h.warn("config-watcher","\u914D\u7F6E\u76EE\u5F55\u76D1\u542C\u672A\u751F\u6548,\u70ED\u66F4\u4E0D\u53EF\u7528(\u6539\u914D\u7F6E\u9700\u91CD\u542F)",{watchDir:e,error:p instanceof Error?p.message:String(p)})}return{stop(){if(d&&(clearTimeout(d),d=null),f){try{f.close()}catch{}f=null}},refresh:l}}a(Ow,"startConfigHotReload");function jw(t,e){let n=t;for(let r of e.split(".")){if(n==null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}a(jw,"getByPath");var va=class{static{a(this,"InMemoryConfigCenter")}settings;globalVars;listeners=new Map;workflows=new Map;constructor(e,n){this.settings=e,this.globalVars=n}getConfig(e){return jw(this.settings.raw,e)}getEnv(e){let n=this.settings.envSource[e];if(n!==void 0)return qi(n)}subscribe(e,n){let r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.add(n),()=>{r.delete(n),r.size===0&&this.listeners.delete(e)}}applyReload(e){let n=new Map;for(let o of this.listeners.keys())n.set(o,JSON.stringify(this.resolveNsPath(o,this.settings)??null));let r=this.settings.raw;for(let o of Object.keys(r))o in e.raw||delete r[o];Object.assign(r,e.raw),this.settings.envSource=e.envSource;for(let[o,i]of this.listeners)if(JSON.stringify(this.resolveNsPath(o,this.settings)??null)!==n.get(o))for(let c of i)try{c()}catch(l){h.warn("config-center","listener \u629B\u9519",{nsPath:o,error:l instanceof Error?l.message:String(l)})}}current(){return this.settings}getToolkitConfig(e){let n=this.workflows.get(e)?.toolkitConfig??{};return this.resolveToolkitRefs(n)}resolveFieldRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=Qt(o)?vt(o,{configScope:this,...this.globalVars?{globalVars:this.globalVars}:{}}):o;return n}resolveToolkitRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=this.resolveFieldRefs(o);return n}getHandlerConfig(e,n){let r=this.workflows.get(e)?.handlerConfigs.get(n);return r===void 0?void 0:this.resolveFieldRefs(r)}applyWorkflow(e,n,r){this.workflows.set(e,{toolkitConfig:n,handlerConfigs:r})}scope(e){return{getEnv:a(n=>this.getEnv(n),"getEnv"),getConfig:a(n=>this.getConfig(n),"getConfig"),subscribe:a((n,r)=>this.subscribe(n,r),"subscribe"),getToolkitConfig:a(()=>this.getToolkitConfig(e),"getToolkitConfig"),getHandlerConfig:a(n=>this.getHandlerConfig(e,n),"getHandlerConfig")}}resolveNsPath(e,n){let r=e.indexOf(".");if(r<0)return;let o=e.slice(0,r),i=e.slice(r+1);if(o==="config")return jw(n.raw,i);if(o==="env"){let s=n.envSource[i];return s===void 0?void 0:qi(s)}}};import{readdirSync as o0}from"fs";function Nw(t){let e=new Map;for(let n of t.eventSources??[]){let r=n.name,o=n.handler_config;r&&o&&typeof o=="object"&&e.set(r,o)}return e}a(Nw,"collectHandlerConfigs");function i0(t,e,n){let r=t.find(c=>c.id===n);if(r)return r;let o=t.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09",i=e.find(c=>c.id===n),s=i?`\u3002\u8BE5\u5DE5\u4F5C\u6D41\u542F\u52A8\u65F6\u88AB\u8DF3\u8FC7\uFF1A${i.reason}`:"";throw new Error(`\u5DE5\u4F5C\u6D41 "${n}" \u4E0D\u53EF\u89E6\u53D1\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${o}${s}`)}a(i0,"resolveTriggerTarget");async function IQ(t,e={}){let n=await je(t);sl(n.envSource);let r=Fw.resolve(n.configDir,n.agent.trace_dir);bf(r);let o,i=lt(n.configDir,n.envSource);if(n.roles.enabled){let _=new Mt(n.rolesDir);if(i?.roles){let C=Fw.resolve(n.configDir,"profile"),E=!1;try{E=o0(n.rolesDir).some(W=>W.endsWith(".role.yml"))}catch{}if(E)throw new Error(`profile.yml \u5DF2\u58F0\u660E roles \u6BB5\uFF0C\u4F46 ${n.rolesDir} \u4E2D\u4ECD\u5B58\u5728 .role.yml \u6587\u4EF6\u3002\u4E24\u8005\u4E92\u65A5\uFF1A\u8BF7\u5220\u9664 roles/ \u76EE\u5F55\u6216\u79FB\u9664 profile.yml \u7684 roles \u6BB5\u3002`);_.loadFromProfile(i.roles,C)}else await _.loadAll();o=new Bi(_)}let s=Ac(),c=new tn,l=new va(n,c),d=[],u=new Map,f={},p={};for(let _ of n.workflowEntries){let C=await He(_.templatePath,{envSource:n.envSource});i?.workflows?.[_.id]&&nn(_.id,i.workflows[_.id],C),u.set(_.id,C);let F=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??C.tracker;F&&(f[`workflow:${_.id}.tracker`]={base_id:F.base_id,table_id:F.table_id},Object.assign(p,jg(_.id,C,{base_id:F.base_id,table_id:F.table_id})))}let g=[],m=(await Ir(n)).resolved,y=await Ms({configDir:n.configDir,targets:m.filter(Ft).map(_=>({collection:_.collection,artifact:_.compile?.artifact??Hc,roleIds:_.roleIds??[]})),workflows:n.workflowEntries.map(_=>({id:_.id,recipeDir:_.recipeDir}))}),w=Ml(xh(await ho(n.configDir),y));if(w.hasFatal){let _=w.issues.find(C=>C.level==="fatal");throw new Error(`\u5B9E\u4F8B\u6821\u9A8C\u5931\u8D25(preflight fatal)\uFF0C\u62D2\u7EDD\u542F\u52A8: ${_.message}`)}for(let _ of w.blockedWorkflowIds){let C=w.issues.filter(E=>E.workflowId===_&&E.level==="error").map(E=>E.message).join("; ");g.push({id:_,reason:`preflight \u6821\u9A8C\u5931\u8D25: ${C}`})}let b=new Set(w.blockedWorkflowIds),x=new Map;await Promise.all(n.workflowEntries.map(async _=>{if(!b.has(_.id))try{let C=u.get(_.id),E=Gi(n,C.tracker);if(!E)throw new Error("\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09");let F=Dn(n,_,E);if(F.tracker.base_id&&F.tracker.table_id){let P=new he({bin:F.tracker.dws_bin});await Ao(P,F.tracker.base_id,F.tracker.table_id)}let W=new Gs(F.tracker);await W.init(),x.set(_.id,{perSettings:F,tracker:W})}catch(C){let E=C instanceof Error?C.message:String(C);g.push({id:_.id,reason:E}),h.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:_.id,error:E})}}));for(let _ of n.workflowEntries){let C=x.get(_.id);if(C)try{let E=u.get(_.id),{perSettings:F,tracker:W}=C,P=l.scope(_.id);l.applyWorkflow(_.id,E.toolkitConfig??{},Nw(E));let q=new Li().createAll(E.eventSources,{pollIntervalMs:F.polling.interval_ms,configDir:F.configDir,tableRefs:f,configRefs:p,globalVars:c,configScope:P}),z=new ra({settings:F,workflow:E,tracker:W,eventBindings:q,roleResolver:o,toolkitRegistry:s,onRunEvent:e.onRunEvent,globalVars:c,configScope:P,configRefs:p});d.push({id:_.id,settings:F,workflow:E,tracker:W,orchestrator:z,entry:_}),h.info("app","\u5DE5\u4F5C\u6D41\u7EC4\u88C5\u5B8C\u6210",{id:_.id,workflow:E.meta.name,domain:E.meta.domain,steps:E.orderedStepIds,eventSources:q.map(K=>K.source.name)})}catch(E){let F=E instanceof Error?E.message:String(E);g.push({id:_.id,reason:F}),h.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:_.id,error:F})}}for(let _ of d)h.info("app",`[preflight] ${_.id} \u2713 \u5DF2\u542F\u52A8`,{workflow:_.workflow.meta.name});for(let _ of g)h.error("app",`[preflight] ${_.id} \u2717 \u672A\u542F\u52A8\uFF1A${_.reason}`,{id:_.id});if(d.length===0){let _=g.map(C=>`${C.id}: ${C.reason}`).join("; ");throw new Error(`\u6CA1\u6709\u4EFB\u4F55\u5DE5\u4F5C\u6D41\u80FD\u542F\u52A8\uFF08\u5171 ${g.length} \u4E2A\u5747\u88C5\u914D\u5931\u8D25\uFF09\u3002${_}`)}h.info("app","\u5E94\u7528\u7EC4\u88C5\u5B8C\u6210",{mode:n.multiWorkflow?"multi-workflow":"single-workflow",workflowCount:d.length,skippedCount:g.length,rolesEnabled:n.roles.enabled,toolkitsLoaded:s.length});let I=await nu(n),S=br(n.raw?.toolkit_config),k=I.agent?new oa({configDir:n.configDir,resolveCollections:a(async()=>(await Ir(n)).resolved,"resolveCollections"),...I,...S?{bins:S}:{}}):null;I.agent||h.warn("app","\u5F53\u524D engine \u65E0\u53EF\u7528 coding agent(\u5982 llm_only),\u8DF3\u8FC7 KB \u81EA\u52A8\u5237\u65B0");let R=d[0],T;return{settings:n,instances:d,skippedWorkflows:g,workflow:R.workflow,tracker:R.tracker,orchestrator:R.orchestrator,triggerWorkflowOnce:a((_,C)=>i0(d,g,_).orchestrator.triggerOnce(C),"triggerWorkflowOnce"),start:a(async()=>{k?.start(),T=Ow({watchDir:n.configDir,configCenter:l,reload:a(()=>je(t),"reload"),onReloaded:a(async _=>{sl(_.envSource),Pn();let C=lt(n.configDir,_.envSource);for(let E of d)try{let F=await He(E.entry.templatePath,{envSource:_.envSource});C?.workflows?.[E.id]&&nn(E.id,C.workflows[E.id],F),(JSON.stringify(F.steps)!==JSON.stringify(E.workflow.steps)||JSON.stringify(F.edges??null)!==JSON.stringify(E.workflow.edges??null))&&h.warn("app","workflow \u7ED3\u6784(steps/edges)\u53D8\u66F4\u9700\u91CD\u542F\u624D\u751F\u6548,\u672C\u6B21\u4EC5\u70ED\u66F4\u914D\u7F6E\u53F6\u5B50",{id:E.id}),l.applyWorkflow(E.id,F.toolkitConfig??{},Nw(F))}catch(F){h.warn("app","workflow \u91CD\u89E3\u6790\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{id:E.id,error:F instanceof Error?F.message:String(F)})}},"onReloaded")}),await Promise.all(d.map(_=>_.orchestrator.start()))},"start"),stop:a(async()=>{T?.stop(),T=void 0,k?.stop(),await Promise.all(d.map(_=>_.orchestrator.stop()))},"stop")}}a(IQ,"createApp");async function Lt(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return Te(r).filter(v).map(i=>({fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??"")})).filter(i=>i.fieldId&&i.fieldName)}a(Lt,"fetchFields");function s0(t){for(let e of["config","property"]){let n=t[e];if(v(n)&&Array.isArray(n.options))return n.options}return Array.isArray(t.options)?t.options:[]}a(s0,"pickOptions");async function Ar(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return Te(r).filter(v).map(i=>{let c=s0(i).filter(v).map(l=>({id:String(l.id??""),name:String(l.name??"")})).filter(l=>l.id&&l.name);return{fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??""),options:c}}).filter(i=>i.fieldId&&i.fieldName)}a(Ar,"fetchFieldsWithOptions");import{EventEmitter as a0}from"events";import{randomUUID as c0}from"crypto";var iu=class extends a0{static{a(this,"RelayAgentSession")}transport;requestId;projectId;agent;workDir;permissionMode;timeoutMs;sessionId;finalResponse;artifacts;pending=null;closed=!1;unsubscribe;constructor(e,n){super(),this.transport=e,this.requestId=n.requestId,this.projectId=n.projectId,this.agent=n.agent,this.workDir=n.workDir,this.permissionMode=n.permissionMode,this.timeoutMs=n.timeoutMs,this.sessionId=n.sessionId??"",this.unsubscribe=e.onMessage(r=>this.handleMessage(r))}send(e){return this.closed?Promise.reject(new Error("relay session already closed")):new Promise((n,r)=>{this.pending={resolve:n,reject:r},this.transport.send({type:"run:agent",requestId:this.requestId,projectId:this.projectId,agent:this.agent,prompt:e,...this.workDir?{workDir:this.workDir}:{},...this.sessionId?{sessionId:this.sessionId}:{},...this.permissionMode?{permissionMode:this.permissionMode}:{},...this.timeoutMs!==void 0?{timeoutMs:this.timeoutMs}:{}})})}currentSessionId(){return this.sessionId}isAlive(){return!this.closed}async close(){if(!this.closed&&(this.closed=!0,this.unsubscribe(),this.transport.close(),this.pending)){let e=this.pending;this.pending=null,e.reject(new Error("relay session closed before completion"))}}lastResponse(){return this.finalResponse}artifactManifest(){return this.artifacts}handleMessage(e){if(!(!("requestId"in e)||e.requestId!==this.requestId))switch(e.type){case"event":this.emit("event",e.event);break;case"result":{e.sessionId&&(this.sessionId=e.sessionId),this.finalResponse=e.response,this.artifacts=e.artifacts,this.settleResolve();break}case"error":{let n=new Error(e.message);n.code=e.code,this.settleReject(n);break}default:break}}settleResolve(){if(!this.pending)return;let e=this.pending;this.pending=null,e.resolve()}settleReject(e){if(!this.pending)return;let n=this.pending;this.pending=null,n.reject(e)}},su=class{static{a(this,"RelayExecutor")}kind="relay";transport;projectId;agent;requestIdFactory;landArtifacts;constructor(e,n){this.transport=e,this.projectId=n.projectId,this.agent=n.agent,this.requestIdFactory=n.requestIdFactory??(()=>c0()),this.landArtifacts=n.landArtifacts}async run(e,n){let r=n?.adapterOptions?.permissionMode==="bypassPermissions"?"bypassPermissions":void 0,o=new iu(this.transport,{requestId:this.requestIdFactory(),projectId:this.projectId,agent:this.agent,sessionId:n?.sessionId,workDir:n?.workDir,...r?{permissionMode:r}:{},...n?.timeoutMs!==void 0?{timeoutMs:n.timeoutMs}:{}}),i=[];o.on("event",c=>{i.push(c),n?.onEvent?.(c)});try{await o.send(e)}finally{await o.close().catch(()=>{})}let s=o.artifactManifest();return s&&this.landArtifacts&&await this.landArtifacts(this.projectId,s),{response:(o.lastResponse()??"").trim(),events:i,sessionId:o.currentSessionId()}}};function MQ(t,e){return new su(t,e)}a(MQ,"createRelayExecutor");var au=class{static{a(this,"LocalSpawnExecutor")}kind="local-spawn";defaults;runner;constructor(e={},n=oi){this.defaults=e,this.runner=n}run(e,n){if(!(Object.keys(this.defaults).length>0))return this.runner(e,n);let o={...this.defaults,...n??{}};return this.runner(e,o)}};function NQ(t,e){return new au(t??{},e??oi)}a(NQ,"createLocalSpawnExecutor");import aM from"path";import{access as cM,readFile as lM}from"fs/promises";import dM from"yaml";import{serializeForm as l0}from"aitable-workflow-base";function Sa(t,e,n){let r=n?.interactive??!0,o=!!(e?.designSkillRelPath||e?.frameworkSkillRelPath);return[d0,u0(e,r),r?p0(e?.questionFormProtocolRelPath):g0,y0(t),o?"":f0,w0(t),b0(t)].filter(Boolean).join(`
499
499
 
500
500
  `)}a(Sa,"buildMetaPrompt");function lu(t){return["## \u4FEE\u6B63\u8BF7\u6C42","","\u4E0A\u4E00\u8F6E\u751F\u6210\u7684\u6587\u4EF6\u5B58\u5728\u4EE5\u4E0B\u95EE\u9898\uFF0C\u8BF7\u4FEE\u6B63\uFF1A","",...t.map((e,n)=>`${n+1}. ${e}`),"","\u8BF7\u76F4\u63A5\u4FEE\u6539\u5BF9\u5E94\u6587\u4EF6\uFF0C\u4FEE\u590D\u4E0A\u8FF0\u95EE\u9898\u3002\u5B8C\u6210\u540E\u5217\u51FA\u4FEE\u6539\u7684\u6587\u4EF6\u6E05\u5355\u3002"].join(`
501
501
  `)}a(lu,"buildFixPrompt");function xa(t){return["\u4EE5\u4E0B\u662F\u7528\u6237\u5BF9\u4F60\u4E0A\u4E00\u8F6E\u63D0\u95EE\u7684\u7B54\u590D\uFF1A","",t.map(({form:e,answers:n})=>l0(e,n)).join(`
@@ -543,9 +543,9 @@ ${t?["\u5F53\u524D\u5165\u53E3\u7531 CLI / Server \u7684 design discovery \u8FD0
543
543
  `);function y0(t){let e=t.profileExists?"**\u5DF2\u6709 profile/profile.yml**\uFF08\u589E\u91CF\u4FEE\u6539\u5B83\uFF09":"**\u9700\u65B0\u5EFA profile/profile.yml**\uFF08\u65B0\u5EFA\u9879\u76EE\u9ED8\u8BA4\u6536\u655B\u914D\u7F6E\u9762\uFF09",n=["## \u5DF2\u9A8C\u8BC1\u9879\u76EE\u4E8B\u5B9E","",`- \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF1A${t.workDir}`,`- \u4EFB\u52A1\u6027\u8D28\uFF1A${t.mode==="brownfield"?"**\u589E\u91CF\u4FEE\u6539\u5DF2\u6709\u9879\u76EE**\uFF08\u5FC5\u987B\u4FDD\u7559\u65E2\u6709\u4EA7\u7269\uFF0C\u89C1 design Skill \u7684 patterns/brownfield-editing.md\uFF09":"\u5168\u65B0\u751F\u6210"}`,`- \u914D\u7F6E\u4E0E\u89D2\u8272\u843D\u5730\u4F4D\u7F6E\uFF1A${e}\u2014\u2014\u914D\u7F6E\u5199\u8FDB profile \u7684 workflows.<id>\uFF0C\u89D2\u8272\u5199\u8FDB profile \u7684 roles \u6BB5\uFF1B**\u7EDD\u4E0D\u521B\u5EFA roles/*.role.yml**\uFF08\u4E0E profile \u4E92\u65A5\u4F1A\u629B\u9519\uFF09\uFF0C\u4E14 profile \u91CC\u7684 steps/event_sources \u952E\u5FC5\u987B\u951A\u5B9A\u5230\u771F\u5B9E id`];t.strayRoleFiles.length>0&&n.push(`- \u26A0\uFE0F \u68C0\u6D4B\u5230\u6B8B\u7559\u89D2\u8272\u6587\u4EF6\uFF1A${t.strayRoleFiles.map(r=>`roles/${r}`).join("\u3001")}\u3002\u4E0E profile \u7684 roles \u6BB5\u4E92\u65A5\uFF08invariant #7\uFF0C\u5171\u5B58\u542F\u52A8\u5373\u5D29\uFF09\u2014\u2014**\u52A8\u624B\u524D\u5148\u5220\u9664\u8FD9\u4E9B\u6587\u4EF6**\uFF0C\u89D2\u8272\u7EDF\u4E00\u5199\u8FDB profile \u7684 roles \u6BB5\u3002`),n.push("- \u4EA7\u51FA\u76EE\u6807\uFF1A");for(let r of t.workflows)n.push(` - \`${r.workflowRelPath}\`\uFF08recipe \u76EE\u5F55 \`${r.recipeDirRelPath}\`\uFF09${r.exists?" \u2014 **\u5DF2\u5B58\u5728\uFF0C\u589E\u91CF\u4FEE\u6539**":" \u2014 \u65B0\u5EFA"}`);return t.workflows.length===0&&n.push(" - workflow \u76EE\u5F55\u5C1A\u7A7A\uFF0C\u8BF7\u6309\u4E1A\u52A1\u8282\u5F8B\u81EA\u884C\u547D\u540D workflow \u76EE\u5F55\uFF08\u5C0F\u5199\u5B57\u6BCD/\u6570\u5B57/\u8FDE\u5B57\u7B26\uFF09"),t.trackerFacts.length>0&&n.push(...t.trackerFacts),t.roles.length>0?n.push("- \u5DF2\u6709\u89D2\u8272\uFF08\u590D\u7528\u5B83\u4EEC\uFF0C\u4E0D\u8981\u91CD\u590D\u5B9A\u4E49\uFF09\uFF1A",...t.roles.map(r=>` - ${r.id}${r.name?`\uFF08${r.name}\uFF09`:""}`)):n.push("- \u5F53\u524D\u6CA1\u6709\u5DF2\u5B9A\u4E49\u7684\u89D2\u8272\uFF1A\u4EFB\u4F55 requiresAgent: true \u7684 step \u90FD\u9700\u8981\u4F60\u65B0\u5EFA\u89D2\u8272\u4E0E\u5DE5\u4F5C\u533A\u6587\u4EF6"),n.push("- \u4EE5\u4E0A\u8DEF\u5F84\u65E0\u9700\u518D\u7528 Bash/Read \u9A8C\u8BC1\uFF1B\u4F46**\u5DF2\u5B58\u5728\u7684\u6587\u4EF6\u5FC5\u987B\u5148\u8BFB\u518D\u6539**\u3002"),n.join(`
544
544
  `)}a(y0,"buildProjectFacts");function w0(t){let e=["## \u7528\u6237\u9700\u6C42","",`\u573A\u666F\uFF1A${t.scene}`];return t.supplements&&e.push("",`\u8865\u5145\u9700\u6C42\uFF1A${t.supplements}`),t.clarifications?e.push("","### \u7528\u6237\u5DF2\u786E\u8BA4\u7684\u7EA6\u675F","",t.clarifications):e.push("","> \u7528\u6237\u6CA1\u6709\u56DE\u7B54\u6F84\u6E05\u63D0\u95EE\u3002\u8BF7\u6309 design Skill \u7684 `patterns/clarification-checklist.md` \u9010\u9879\u81EA\u67E5\uFF0C","> \u7F3A\u5931\u9879\u5728\u4EA7\u7269\u6CE8\u91CA\u91CC\u5199\u660E\u4F60\u91C7\u7528\u7684\u5047\u8BBE\uFF0C\u5E76\u5728\u6C47\u62A5\u4E2D\u5217\u4E3A\u300C\u9700\u786E\u8BA4\u9879\u300D\u3002"),e.join(`
545
545
  `)}a(w0,"buildUserRequirement");function b0(t){let e=[];for(let r of t.workflows)e.push(`- \`${r.workflowRelPath}\` \u2014 workflow.yml\uFF08\u89C6\u56FE\u914D\u7F6E\u5199\u5165\u5176 \`tracker.views\`\uFF09${r.exists?" **\u5DF2\u5B58\u5728 \u2192 \u589E\u91CF\u4FEE\u6539\uFF0C\u4E0D\u8981\u91CD\u5199**":""}`),e.push(`- \`${r.recipeDirRelPath}/{step_id}.recipe.ts\` \u2014 \u6BCF\u4E2A\u6B65\u9AA4\u4E00\u4E2A recipe`),e.push(`- \`${r.recipeDirRelPath}/{handler_id}_handler.recipe.ts\` \u2014 \u4EC5\u4E8B\u4EF6\u9A71\u52A8\u573A\u666F\uFF0C\u6BCF\u4E2A handler \u4E00\u4E2A\u6587\u4EF6`);return t.workflows.length===0&&e.push("- `./workflows/<workflow-id>/workflow.yml` \u4E0E `./workflows/<workflow-id>/recipes/*.recipe.ts` \u2014 \u591A workflow \u6A21\u5F0F\uFF0C\u76EE\u5F55\u540D\u81EA\u5B9A\uFF08\u5C0F\u5199\u5B57\u6BCD/\u6570\u5B57/\u8FDE\u5B57\u7B26\uFF09"),e.push(t.profileExists?"- `./profile/profile.yml` \u2014 **\u5DF2\u5B58\u5728 \u2192 \u589E\u91CF\u4FEE\u6539**":"- `./profile/profile.yml` \u2014 **\u65B0\u5EFA**\u6536\u655B\u914D\u7F6E\u9762"),e.push("- `./workspaces/<role-id>/AGENTS.md` \u2014 \u6BCF\u4E2A\u89D2\u8272\u7684\u4E1A\u52A1\u89C4\u683C\u4E0E**\u8F93\u51FA\u5951\u7EA6**"),["## \u8F93\u51FA\u6307\u4EE4","",`\u4F60\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u662F: ${t.workDir}`,"","\u8BF7\u4F7F\u7528**\u76F8\u5BF9\u8DEF\u5F84**\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u521B\u5EFA\u6216\u4FEE\u6539\u4EE5\u4E0B\u6587\u4EF6\uFF1A","",...e,"","\u6BCF\u9879\u4EA7\u7269\u5FC5\u987B\u5305\u542B\u4EC0\u4E48\u3001\u4EC0\u4E48\u65F6\u5019\u53EF\u4EE5\u7701\u7565\uFF0C\u89C1 design Skill \u7684 `patterns/output-and-report.md`\u3002","","\u6846\u67B6\u7C7B\u578B\u4E0E dws \u5BA2\u6237\u7AEF\u7684 import \u8DEF\u5F84\uFF08\u4E00\u5F8B\u7528\u5305\u540D\u6839\uFF09\uFF1A","```typescript",`import { DwsClient, type RecipeDefinition, type RecipeContext, type RecipeResult } from "${cu}";`,`import type { EventHandlerRecipeDefinition, HandlerInitContext, HandlerInstance } from "${cu}";`,`import type { ExternalEvent } from "${cu}";`,"```","",'recipe \u5185\u8C03\u7528 dws \u5FC5\u987B\u4F7F\u7528 `new DwsClient({ bin: "dws" }).runJson([...])`\uFF1B\u4E0D\u8981\u4F7F\u7528 `toolkit.shell.runJson("dws", ...)`\u3002',"","\u76F4\u63A5\u521B\u5EFA/\u4FEE\u6539\u6587\u4EF6\uFF0C\u4E0D\u8981\u628A\u6587\u4EF6\u5185\u5BB9\u8F93\u51FA\u5230\u804A\u5929\u3002\u5B8C\u6210\u540E\u6309 `patterns/output-and-report.md` \u7684\u4E09\u6BB5\u683C\u5F0F\u6C47\u62A5\u3002"].join(`
546
- `)}a(b0,"buildOutputInstructions");var cu="aitable-workflow-core";import W0 from"path";import{cpSync as k0,existsSync as Ww,lstatSync as v0,mkdirSync as S0,rmSync as x0}from"fs";import et from"path";import{fileURLToPath as I0}from"url";var R0="aitable-workflow",C0="aitable-workflow-design",T0="aitable-workflow-design-discovery",_0=et.join("reference","question-form-protocol.md"),Bw=et.join(".aitable","skills"),A0=et.join("references","generated","toolkits.md");function E0(t){let e=et.dirname(I0(import.meta.url));for(let n=0;n<8;n++){let r=et.join(e,"skills",t);if(Ww(et.join(r,"SKILL.md")))return r;let o=et.dirname(e);if(o===e)break;e=o}}a(E0,"resolveSkillDir");function fu(t,e){let n={},r=et.resolve(t,Bw);try{S0(r,{recursive:!0})}catch(i){return e?.(`Skill \u6302\u8F7D\u76EE\u5F55\u521B\u5EFA\u5931\u8D25(\u4E0D\u963B\u65AD): ${zw(i)}`),n}n.frameworkSkillRelPath=uu(r,R0,e),n.designSkillRelPath=uu(r,C0,e);let o=uu(r,T0,e);if(o){let i=et.join(o,_0);Ww(et.join(t,i))?n.questionFormProtocolRelPath=i:e?.(`design discovery \u53D1\u95EE\u534F\u8BAE\u7F3A\u5931(\u4E0D\u963B\u65AD): ${i}`)}return n.frameworkSkillRelPath&&(n.toolkitManifestRelPath=et.join(n.frameworkSkillRelPath,A0)),n}a(fu,"mountDesignSkills");function uu(t,e,n){let r=E0(e);if(!r){n?.(`\u672A\u627E\u5230\u5185\u7F6E Skill \u76EE\u5F55(skills/${e})\uFF0Cdesign \u9000\u5316\u4E3A\u4EC5\u5185\u8054\u7EA6\u675F`);return}let o=et.join(Bw,e),i=et.join(t,e);try{if(!v0(i).isSymbolicLink())return o;x0(i,{recursive:!0,force:!0})}catch{}try{return k0(r,i,{recursive:!0}),o}catch(s){n?.(`Skill \u590D\u5236\u5931\u8D25(\u4E0D\u963B\u65AD, ${e}): ${zw(s)}`);return}}a(uu,"mountOne");function zw(t){return t instanceof Error?t.message:String(t)}a(zw,"errText");var pu="question-form",D0=new RegExp(`<${pu}([^>]*)>([\\s\\S]*?)</${pu}>`,"i"),$0=["radio","checkbox","text","textarea","switch"];function mu(t){let e=D0.exec(t);if(!e)return;let[,n="",r=""]=e,o=P0(r);if(!o)return;let i=M0(n),s=Tt(o.id,i.id)??"clarify",c=Tt(o.title,i.title)??"\u8FD8\u9700\u8981\u786E\u8BA4\u51E0\u70B9",l=O0(o.questions);if(l.length===0){h.debug("discovery","question-form \u91CC\u6CA1\u6709\u53EF\u7528\u9898\u76EE\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406");return}let d=Tt(o.description);return{id:s,title:c,...d?{description:d}:{},questions:l}}a(mu,"parseQuestionForm");function P0(t){let e=t.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/,"").trim();if(e)try{let n=JSON.parse(e);if(!Ia(n)){h.debug("discovery","question-form \u7684 JSON \u9876\u5C42\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5FFD\u7565\u672C\u8F6E\u63D0\u95EE");return}return n}catch(n){h.debug("discovery","question-form \u7684 JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406",{error:n instanceof Error?n.message:String(n)});return}}a(P0,"parseJsonBody");function M0(t){let e={};for(let n of t.matchAll(/(\w+)\s*=\s*"([^"]*)"/g)){let[,r,o]=n;r&&o!==void 0&&(e[r]=o)}return e}a(M0,"parseAttributes");function O0(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(!Ia(r))continue;let o=Tt(r.id),i=Tt(r.label),s=$0.find(d=>d===r.type);if(!o||!i||!s||n.has(o))continue;n.add(o);let c=j0(r.options),l=(s==="radio"||s==="checkbox")&&c.length===0?"text":s;e.push({id:o,label:i,type:l,...c.length>0?{options:c}:{},...gu(r,"placeholder"),...gu(r,"help"),...r.required===!0?{required:!0}:{},...F0(l,r.defaultValue),...N0(r.maxSelections),...typeof r.allowCustom=="boolean"?{allowCustom:r.allowCustom}:{},...L0(r.showIf)})}return e}a(O0,"normalizeQuestions");function j0(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(typeof r=="string"){let i=r.trim();if(!i||n.has(i))continue;n.add(i),e.push({label:i,value:i});continue}if(!Ia(r))continue;let o=Tt(r.value,r.label);!o||n.has(o)||(n.add(o),e.push({label:Tt(r.label)??o,value:o,...gu(r,"description")}))}return e}a(j0,"normalizeOptions");function F0(t,e){if(t==="checkbox"){let n=Array.isArray(e)?e.filter(r=>typeof r=="string"):typeof e=="string"&&e?[e]:[];return n.length>0?{defaultValue:n}:{}}return typeof e=="string"&&e!==""?{defaultValue:e}:typeof e=="boolean"?{defaultValue:String(e)}:{}}a(F0,"normalizeDefaultValue");function N0(t){return typeof t=="number"&&Number.isInteger(t)&&t>0?{maxSelections:t}:{}}a(N0,"normalizeMaxSelections");function L0(t){if(!Ia(t))return{};let e=Tt(t.questionId),n=Tt(t.hasValue);return e&&n?{showIf:{questionId:e,hasValue:n}}:{}}a(L0,"normalizeShowIf");function Ia(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Ia,"isRecord");function Tt(...t){for(let e of t)if(typeof e=="string"&&e.trim()!=="")return e.trim()}a(Tt,"firstString");function gu(t,e){let n=Tt(t[e]);return n?{[e]:n}:{}}a(gu,"pickString");import{summarizeForms as B0}from"aitable-workflow-base";async function Uw(t,e){return Ga(e?.executor,()=>z0(t,e))}a(Uw,"runDesign");async function a6(t,e){return Ga(e?.executor,async()=>{let n=fu(t.workDir),r=du(t,n,{interactive:e?.interactive??!0,...e?.judgeOnly?{judgeOnly:!0}:{}}),{form:o,sessionId:i,response:s}=await Kw(t,r,{...e?.sessionId?{sessionId:e.sessionId}:{},timeoutMs:e?.timeoutMs??3e5,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}});return{...o?{form:o}:{},...i?{sessionId:i}:{},response:s}})}a(a6,"runClarifyRound");async function Kw(t,e,n){let r=await kt(e,{agent:t.agentType,configPath:V0(t),workDir:t.workDir,...n.sessionId?{sessionId:n.sessionId}:{},timeoutMs:n.timeoutMs,...n.onEvent?{onEvent:n.onEvent}:{},...n.onAgentLifecycle?{onLifecycle:n.onAgentLifecycle}:{},adapterOptions:K0(t)}),o=mu(r.response);return{response:r.response,...r.sessionId?{sessionId:r.sessionId}:{},...o?{form:o}:{}}}a(Kw,"sendDesignTurn");async function z0(t,e){let n=e?.maxFixRounds??2,r=e?.maxClarifyRounds??2,o=e?.timeoutMs===void 0?3e5:e.timeoutMs,i=Date.now(),s=a(()=>o==null?null:U0(i,o),"nextRoundTimeout"),c=fu(t.workDir),l=a(async(x,I)=>{let v=s();if(v!=null&&v<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${o}ms)`);return Kw(t,x,{...I?{sessionId:I}:{},timeoutMs:v,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}})},"callAgent"),d=e?.resume?.sessionId,u=!!e?.onQuestions,f=du(t,c,{interactive:u,...e?.resume?{resume:e.resume}:{}}),p=[...e?.resume?.answered??[]],g=0,m=!1,y="";for(e?.onRoundStart?.(1,!1);;){let x;try{x=await l(f,d)}catch(R){return await hu(t,R,1,g,e)}y=x.response,d=x.sessionId??d;let I=x.form;if(!I)break;if(!(!!e?.onQuestions&&g<r)){if(m){h.debug("design","Agent \u53CD\u590D\u63D0\u95EE\u4F46\u65E0\u4EBA\u53EF\u7B54\uFF0C\u7ED3\u675F\u6F84\u6E05\u8FDB\u5165\u6821\u9A8C");break}h.debug("design","\u65E0\u4EBA\u53EF\u7B54\u6216\u6F84\u6E05\u56DE\u5408\u7528\u5C3D\uFF0C\u6307\u793A Agent \u6309\u5047\u8BBE\u7EE7\u7EED",{maxClarifyRounds:r}),m=!0,f=Lw;continue}g++,e?.onClarifyRound?.(g);let k=await e.onQuestions(I,g);p.push({form:I,answers:k}),f=xa([{form:I,answers:k}])}e?.onValidationStart?.(1);let w=await so(t);e?.onValidation?.(w,1);let b=1;for(;!w.valid&&b<=n;){b++,e?.onRoundStart?.(b,!0);let x=lu(w.errors),I=p.length>0&&!t.clarifications?{...t,clarifications:B0(p)}:t,v=`${Sa(I,c,{interactive:!1})}
546
+ `)}a(b0,"buildOutputInstructions");var cu="aitable-workflow-core";import W0 from"path";import{cpSync as k0,existsSync as Ww,lstatSync as v0,mkdirSync as S0,rmSync as x0}from"fs";import et from"path";import{fileURLToPath as I0}from"url";var R0="aitable-workflow",C0="aitable-workflow-design",T0="aitable-workflow-design-discovery",_0=et.join("reference","question-form-protocol.md"),Bw=et.join(".aitable","skills"),A0=et.join("references","generated","toolkits.md");function E0(t){let e=et.dirname(I0(import.meta.url));for(let n=0;n<8;n++){let r=et.join(e,"skills",t);if(Ww(et.join(r,"SKILL.md")))return r;let o=et.dirname(e);if(o===e)break;e=o}}a(E0,"resolveSkillDir");function fu(t,e){let n={},r=et.resolve(t,Bw);try{S0(r,{recursive:!0})}catch(i){return e?.(`Skill \u6302\u8F7D\u76EE\u5F55\u521B\u5EFA\u5931\u8D25(\u4E0D\u963B\u65AD): ${zw(i)}`),n}n.frameworkSkillRelPath=uu(r,R0,e),n.designSkillRelPath=uu(r,C0,e);let o=uu(r,T0,e);if(o){let i=et.join(o,_0);Ww(et.join(t,i))?n.questionFormProtocolRelPath=i:e?.(`design discovery \u53D1\u95EE\u534F\u8BAE\u7F3A\u5931(\u4E0D\u963B\u65AD): ${i}`)}return n.frameworkSkillRelPath&&(n.toolkitManifestRelPath=et.join(n.frameworkSkillRelPath,A0)),n}a(fu,"mountDesignSkills");function uu(t,e,n){let r=E0(e);if(!r){n?.(`\u672A\u627E\u5230\u5185\u7F6E Skill \u76EE\u5F55(skills/${e})\uFF0Cdesign \u9000\u5316\u4E3A\u4EC5\u5185\u8054\u7EA6\u675F`);return}let o=et.join(Bw,e),i=et.join(t,e);try{if(!v0(i).isSymbolicLink())return o;x0(i,{recursive:!0,force:!0})}catch{}try{return k0(r,i,{recursive:!0}),o}catch(s){n?.(`Skill \u590D\u5236\u5931\u8D25(\u4E0D\u963B\u65AD, ${e}): ${zw(s)}`);return}}a(uu,"mountOne");function zw(t){return t instanceof Error?t.message:String(t)}a(zw,"errText");var pu="question-form",D0=new RegExp(`<${pu}([^>]*)>([\\s\\S]*?)</${pu}>`,"i"),$0=["radio","checkbox","text","textarea","switch"];function mu(t){let e=D0.exec(t);if(!e)return;let[,n="",r=""]=e,o=P0(r);if(!o)return;let i=M0(n),s=Tt(o.id,i.id)??"clarify",c=Tt(o.title,i.title)??"\u8FD8\u9700\u8981\u786E\u8BA4\u51E0\u70B9",l=O0(o.questions);if(l.length===0){h.debug("discovery","question-form \u91CC\u6CA1\u6709\u53EF\u7528\u9898\u76EE\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406");return}let d=Tt(o.description);return{id:s,title:c,...d?{description:d}:{},questions:l}}a(mu,"parseQuestionForm");function P0(t){let e=t.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/,"").trim();if(e)try{let n=JSON.parse(e);if(!Ia(n)){h.debug("discovery","question-form \u7684 JSON \u9876\u5C42\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5FFD\u7565\u672C\u8F6E\u63D0\u95EE");return}return n}catch(n){h.debug("discovery","question-form \u7684 JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406",{error:n instanceof Error?n.message:String(n)});return}}a(P0,"parseJsonBody");function M0(t){let e={};for(let n of t.matchAll(/(\w+)\s*=\s*"([^"]*)"/g)){let[,r,o]=n;r&&o!==void 0&&(e[r]=o)}return e}a(M0,"parseAttributes");function O0(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(!Ia(r))continue;let o=Tt(r.id),i=Tt(r.label),s=$0.find(d=>d===r.type);if(!o||!i||!s||n.has(o))continue;n.add(o);let c=j0(r.options),l=(s==="radio"||s==="checkbox")&&c.length===0?"text":s;e.push({id:o,label:i,type:l,...c.length>0?{options:c}:{},...gu(r,"placeholder"),...gu(r,"help"),...r.required===!0?{required:!0}:{},...F0(l,r.defaultValue),...N0(r.maxSelections),...typeof r.allowCustom=="boolean"?{allowCustom:r.allowCustom}:{},...L0(r.showIf)})}return e}a(O0,"normalizeQuestions");function j0(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(typeof r=="string"){let i=r.trim();if(!i||n.has(i))continue;n.add(i),e.push({label:i,value:i});continue}if(!Ia(r))continue;let o=Tt(r.value,r.label);!o||n.has(o)||(n.add(o),e.push({label:Tt(r.label)??o,value:o,...gu(r,"description")}))}return e}a(j0,"normalizeOptions");function F0(t,e){if(t==="checkbox"){let n=Array.isArray(e)?e.filter(r=>typeof r=="string"):typeof e=="string"&&e?[e]:[];return n.length>0?{defaultValue:n}:{}}return typeof e=="string"&&e!==""?{defaultValue:e}:typeof e=="boolean"?{defaultValue:String(e)}:{}}a(F0,"normalizeDefaultValue");function N0(t){return typeof t=="number"&&Number.isInteger(t)&&t>0?{maxSelections:t}:{}}a(N0,"normalizeMaxSelections");function L0(t){if(!Ia(t))return{};let e=Tt(t.questionId),n=Tt(t.hasValue);return e&&n?{showIf:{questionId:e,hasValue:n}}:{}}a(L0,"normalizeShowIf");function Ia(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Ia,"isRecord");function Tt(...t){for(let e of t)if(typeof e=="string"&&e.trim()!=="")return e.trim()}a(Tt,"firstString");function gu(t,e){let n=Tt(t[e]);return n?{[e]:n}:{}}a(gu,"pickString");import{summarizeForms as B0}from"aitable-workflow-base";async function Uw(t,e){return Ga(e?.executor,()=>z0(t,e))}a(Uw,"runDesign");async function a6(t,e){return Ga(e?.executor,async()=>{let n=fu(t.workDir),r=du(t,n,{interactive:e?.interactive??!0,...e?.judgeOnly?{judgeOnly:!0}:{}}),{form:o,sessionId:i,response:s}=await Kw(t,r,{...e?.sessionId?{sessionId:e.sessionId}:{},timeoutMs:e?.timeoutMs??3e5,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}});return{...o?{form:o}:{},...i?{sessionId:i}:{},response:s}})}a(a6,"runClarifyRound");async function Kw(t,e,n){let r=await kt(e,{agent:t.agentType,configPath:V0(t),workDir:t.workDir,...n.sessionId?{sessionId:n.sessionId}:{},timeoutMs:n.timeoutMs,...n.onEvent?{onEvent:n.onEvent}:{},...n.onAgentLifecycle?{onLifecycle:n.onAgentLifecycle}:{},adapterOptions:K0(t)}),o=mu(r.response);return{response:r.response,...r.sessionId?{sessionId:r.sessionId}:{},...o?{form:o}:{}}}a(Kw,"sendDesignTurn");async function z0(t,e){let n=e?.maxFixRounds??2,r=e?.maxClarifyRounds??2,o=e?.timeoutMs===void 0?3e5:e.timeoutMs,i=Date.now(),s=a(()=>o==null?null:U0(i,o),"nextRoundTimeout"),c=fu(t.workDir),l=a(async(x,I)=>{let S=s();if(S!=null&&S<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${o}ms)`);return Kw(t,x,{...I?{sessionId:I}:{},timeoutMs:S,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}})},"callAgent"),d=e?.resume?.sessionId,u=!!e?.onQuestions,f=du(t,c,{interactive:u,...e?.resume?{resume:e.resume}:{}}),p=[...e?.resume?.answered??[]],g=0,m=!1,y="";for(e?.onRoundStart?.(1,!1);;){let x;try{x=await l(f,d)}catch(R){return await hu(t,R,1,g,e)}y=x.response,d=x.sessionId??d;let I=x.form;if(!I)break;if(!(!!e?.onQuestions&&g<r)){if(m){h.debug("design","Agent \u53CD\u590D\u63D0\u95EE\u4F46\u65E0\u4EBA\u53EF\u7B54\uFF0C\u7ED3\u675F\u6F84\u6E05\u8FDB\u5165\u6821\u9A8C");break}h.debug("design","\u65E0\u4EBA\u53EF\u7B54\u6216\u6F84\u6E05\u56DE\u5408\u7528\u5C3D\uFF0C\u6307\u793A Agent \u6309\u5047\u8BBE\u7EE7\u7EED",{maxClarifyRounds:r}),m=!0,f=Lw;continue}g++,e?.onClarifyRound?.(g);let k=await e.onQuestions(I,g);p.push({form:I,answers:k}),f=xa([{form:I,answers:k}])}e?.onValidationStart?.(1);let w=await so(t);e?.onValidation?.(w,1);let b=1;for(;!w.valid&&b<=n;){b++,e?.onRoundStart?.(b,!0);let x=lu(w.errors),I=p.length>0&&!t.clarifications?{...t,clarifications:B0(p)}:t,S=`${Sa(I,c,{interactive:!1})}
547
547
 
548
- ${x}`,k;try{k=await l(x,d),k.response.includes("already in use")&&(k=await l(v))}catch(R){if(!q0(R))return await hu(t,R,b,g,e);try{k=await l(v)}catch(T){return await hu(t,T,b,g,e)}}y=k.response,d=k.sessionId??d,e?.onValidationStart?.(b),w=await so(t),e?.onValidation?.(w,b)}return{success:w.valid,validation:w,rounds:b,response:y,clarifyRounds:g}}a(z0,"runDesignInner");function U0(t,e,n=Date.now()){return Math.max(0,e-(n-t))}a(U0,"remainingDesignTimeoutMs");function K0(t){return{permissionMode:"bypassPermissions",...t.agentType==="codex"?{ignoreUserConfig:!0}:{}}}a(K0,"adapterOptionsFor");function V0(t){return W0.resolve(t.workDir,"coding-agents.config.json")}a(V0,"agentConfigPathFor");function q0(t){let e=t instanceof Error?t.message:String(t);return e.includes("already in use")||e.includes("session")}a(q0,"isSessionConflict");async function hu(t,e,n,r,o){o?.onValidationStart?.(n);let i=await so(t);o?.onValidation?.(i,n);let s=e instanceof Error?e.message:String(e);return{success:i.valid,validation:i,rounds:n,clarifyRounds:r,response:i.valid?`Coding Agent \u6536\u5C3E\u8D85\u65F6\uFF0C\u4F46\u5DF2\u751F\u6210\u5E76\u6821\u9A8C\u901A\u8FC7\u672C\u5730\u6587\u4EF6\uFF1A${s}`:`Coding Agent \u6267\u884C\u4E2D\u65AD\uFF0C\u5DF2\u4FDD\u7559\u5F53\u524D\u751F\u6210\u6587\u4EF6\uFF1A${s}`}}a(hu,"recoverGeneratedDesign");import{readFile as Vw,writeFile as H0}from"fs/promises";import Ra from"yaml";var G0=["state","title","description","current_step","owner","event_log"],J0=["\u95EE\u9898\u63CF\u8FF0","\u9700\u6C42\u63CF\u8FF0","\u4EFB\u52A1\u63CF\u8FF0","\u63CF\u8FF0","\u5185\u5BB9","\u8BE6\u60C5","\u9700\u6C42\u5185\u5BB9","\u4EFB\u52A1\u5185\u5BB9","\u5DE5\u5355\u5185\u5BB9","\u8BE6\u7EC6\u63CF\u8FF0"];async function qw(t){let{workflowPath:e,autoUpdate:n=!0}=t,r=await Ue(t.configPath),o=await Vw(e,"utf8"),i=Ra.parse(o);if(!S(i)||!Array.isArray(i.steps))throw new Error("workflow.yml \u683C\u5F0F\u65E0\u6548\uFF1A\u7F3A\u5C11 steps \u6570\u7EC4");let s=new Set,c=new Map;for(let v of i.steps){if(!S(v))continue;let k=typeof v.id=="string"?v.id:"unknown",R=typeof v.name=="string"?v.name:k;if(S(v.input_mapping))for(let T of Object.values(v.input_mapping))typeof T=="string"&&s.add(T);if(S(v.output_mapping))for(let[T,_]of Object.entries(v.output_mapping))typeof _=="string"&&c.set(_,{sourceStep:R,variable:T})}let l=await Vw(r,"utf8"),d=Ra.parse(l);if(!S(d)||!S(d.tracker)||!S(d.tracker.fields))throw new Error("config.yml \u683C\u5F0F\u65E0\u6548\uFF1A\u7F3A\u5C11 tracker.fields");let u=d.tracker,f=d.tracker.fields,p=[];for(let v of G0){let k=f[v];k&&p.push({role:v,fieldName:k})}let g=null,m=f.description;for(let v of s)if(J0.includes(v)){(!m||m!==v)&&(g=v);break}let y=new Set(p.map(v=>v.fieldName)),w=[],b=new Set;for(let[v,k]of c)y.has(v)||(w.push({fieldName:v,sourceStep:k.sourceStep,type:"text",direction:"output"}),b.add(v));for(let v of s)!y.has(v)&&!b.has(v)&&(w.push({fieldName:v,sourceStep:"(\u7528\u6237\u8F93\u5165)",type:"text",direction:"input"}),b.add(v));let x=!1,I=!1;if(n){if(S(i)&&Array.isArray(i.field_definitions)){let v=i.field_definitions.filter(k=>S(k)&&typeof k.name=="string").map(k=>{let R=k,T={name:R.name,type:R.type??"text"};return Array.isArray(R.options)&&R.options.length>0&&(T.options=R.options),T});v.length>0&&(u.field_definitions=v,I=!0,x=!0,h.info("field-sync","\u540C\u6B65 field_definitions \u5230 config",{count:v.length}))}if(g&&m!==g&&(f.description=g,x=!0,h.info("field-sync","\u66F4\u65B0 description \u5B57\u6BB5",{from:m??"(\u7A7A)",to:g})),x){let v=Ra.stringify(d);Ra.parse(v),await H0(r,v,"utf8")}}return{scaffold:p,business:w,inputs:[...s],inferredDescription:g,configUpdated:x,fieldDefinitionsSynced:I}}a(qw,"syncFieldsFromWorkflow");function Hw(t){console.log(`
548
+ ${x}`,k;try{k=await l(x,d),k.response.includes("already in use")&&(k=await l(S))}catch(R){if(!q0(R))return await hu(t,R,b,g,e);try{k=await l(S)}catch(T){return await hu(t,T,b,g,e)}}y=k.response,d=k.sessionId??d,e?.onValidationStart?.(b),w=await so(t),e?.onValidation?.(w,b)}return{success:w.valid,validation:w,rounds:b,response:y,clarifyRounds:g}}a(z0,"runDesignInner");function U0(t,e,n=Date.now()){return Math.max(0,e-(n-t))}a(U0,"remainingDesignTimeoutMs");function K0(t){return{permissionMode:"bypassPermissions",...t.agentType==="codex"?{ignoreUserConfig:!0}:{}}}a(K0,"adapterOptionsFor");function V0(t){return W0.resolve(t.workDir,"coding-agents.config.json")}a(V0,"agentConfigPathFor");function q0(t){let e=t instanceof Error?t.message:String(t);return e.includes("already in use")||e.includes("session")}a(q0,"isSessionConflict");async function hu(t,e,n,r,o){o?.onValidationStart?.(n);let i=await so(t);o?.onValidation?.(i,n);let s=e instanceof Error?e.message:String(e);return{success:i.valid,validation:i,rounds:n,clarifyRounds:r,response:i.valid?`Coding Agent \u6536\u5C3E\u8D85\u65F6\uFF0C\u4F46\u5DF2\u751F\u6210\u5E76\u6821\u9A8C\u901A\u8FC7\u672C\u5730\u6587\u4EF6\uFF1A${s}`:`Coding Agent \u6267\u884C\u4E2D\u65AD\uFF0C\u5DF2\u4FDD\u7559\u5F53\u524D\u751F\u6210\u6587\u4EF6\uFF1A${s}`}}a(hu,"recoverGeneratedDesign");import{readFile as Vw,writeFile as H0}from"fs/promises";import Ra from"yaml";var G0=["state","title","description","current_step","owner","event_log"],J0=["\u95EE\u9898\u63CF\u8FF0","\u9700\u6C42\u63CF\u8FF0","\u4EFB\u52A1\u63CF\u8FF0","\u63CF\u8FF0","\u5185\u5BB9","\u8BE6\u60C5","\u9700\u6C42\u5185\u5BB9","\u4EFB\u52A1\u5185\u5BB9","\u5DE5\u5355\u5185\u5BB9","\u8BE6\u7EC6\u63CF\u8FF0"];async function qw(t){let{workflowPath:e,autoUpdate:n=!0}=t,r=await Ue(t.configPath),o=await Vw(e,"utf8"),i=Ra.parse(o);if(!v(i)||!Array.isArray(i.steps))throw new Error("workflow.yml \u683C\u5F0F\u65E0\u6548\uFF1A\u7F3A\u5C11 steps \u6570\u7EC4");let s=new Set,c=new Map;for(let S of i.steps){if(!v(S))continue;let k=typeof S.id=="string"?S.id:"unknown",R=typeof S.name=="string"?S.name:k;if(v(S.input_mapping))for(let T of Object.values(S.input_mapping))typeof T=="string"&&s.add(T);if(v(S.output_mapping))for(let[T,_]of Object.entries(S.output_mapping))typeof _=="string"&&c.set(_,{sourceStep:R,variable:T})}let l=await Vw(r,"utf8"),d=Ra.parse(l);if(!v(d)||!v(d.tracker)||!v(d.tracker.fields))throw new Error("config.yml \u683C\u5F0F\u65E0\u6548\uFF1A\u7F3A\u5C11 tracker.fields");let u=d.tracker,f=d.tracker.fields,p=[];for(let S of G0){let k=f[S];k&&p.push({role:S,fieldName:k})}let g=null,m=f.description;for(let S of s)if(J0.includes(S)){(!m||m!==S)&&(g=S);break}let y=new Set(p.map(S=>S.fieldName)),w=[],b=new Set;for(let[S,k]of c)y.has(S)||(w.push({fieldName:S,sourceStep:k.sourceStep,type:"text",direction:"output"}),b.add(S));for(let S of s)!y.has(S)&&!b.has(S)&&(w.push({fieldName:S,sourceStep:"(\u7528\u6237\u8F93\u5165)",type:"text",direction:"input"}),b.add(S));let x=!1,I=!1;if(n){if(v(i)&&Array.isArray(i.field_definitions)){let S=i.field_definitions.filter(k=>v(k)&&typeof k.name=="string").map(k=>{let R=k,T={name:R.name,type:R.type??"text"};return Array.isArray(R.options)&&R.options.length>0&&(T.options=R.options),T});S.length>0&&(u.field_definitions=S,I=!0,x=!0,h.info("field-sync","\u540C\u6B65 field_definitions \u5230 config",{count:S.length}))}if(g&&m!==g&&(f.description=g,x=!0,h.info("field-sync","\u66F4\u65B0 description \u5B57\u6BB5",{from:m??"(\u7A7A)",to:g})),x){let S=Ra.stringify(d);Ra.parse(S),await H0(r,S,"utf8")}}return{scaffold:p,business:w,inputs:[...s],inferredDescription:g,configUpdated:x,fieldDefinitionsSynced:I}}a(qw,"syncFieldsFromWorkflow");function Hw(t){console.log(`
549
549
  \u{1F4CB} \u5B57\u6BB5\u8BA1\u5212:
550
550
  `),console.log(" \u9AA8\u67B6\u5B57\u6BB5\uFF08\u5F15\u64CE\u5FC5\u9700\uFF09:");for(let{role:o,fieldName:i}of t.scaffold)console.log(` ${o.padEnd(14)} \u2192 "${i}"`);let e=t.business.filter(o=>o.direction==="input"),n=t.business.filter(o=>o.direction==="output");if(e.length>0){console.log(`
551
551
  \u8F93\u5165\u5B57\u6BB5\uFF08\u7528\u6237\u586B\u5199\uFF0Csetup \u81EA\u52A8\u521B\u5EFA\uFF09:`);for(let{fieldName:o}of e)console.log(` "\u276F ${o}"`)}if(n.length>0){console.log(`
@@ -576,7 +576,7 @@ ${x}`,k;try{k=await l(x,d),k.response.includes("already in use")&&(k=await l(v))
576
576
  \u26A0\uFE0F \u5B57\u6BB5\u540C\u6B65\u8DF3\u8FC7\uFF08${i.id}\uFF09: ${s instanceof Error?s.message:String(s)}`)}if(console.log(`
577
577
  `+"\u2500".repeat(50)),o.success){console.log("\u{1F389} Design \u5B8C\u6210\uFF01\u751F\u6210\u7684\u6587\u4EF6\u5DF2\u5C31\u7EEA\u3002"),console.log(` \u8F6E\u6B21: ${o.rounds}`),o.validation.warnings.length>0&&console.log(` \uFF08\u53E6\u6709 ${o.validation.warnings.length} \u6761\u5EFA\u8BAE\uFF0C\u89C1\u4E0A\u65B9 \u26A1 \u6807\u8BB0\uFF09`),console.log(`
578
578
  \u4E0B\u4E00\u6B65:`);let i=1;n.mode==="brownfield"?console.log(` ${i++}. \u5148 review \u6539\u52A8\uFF1A\`git diff\`\uFF08\u672C\u6B21\u4E3A\u589E\u91CF\u4FEE\u6539\u5DF2\u6709\u4EA7\u7269\uFF09`):console.log(` ${i++}. \u68C0\u67E5\u751F\u6210\u7684 workflow\u3001recipes \u4E0E roles`);for(let s of await uM(e,n))console.log(` ${i++}. ${s}`);console.log(` ${i++}. \u8FD0\u884C \`aitable-workflow setup\` \u521D\u59CB\u5316\u8868\u7ED3\u6784\u548C\u89C6\u56FE`),console.log(` ${i++}. \u8FD0\u884C \`aitable-workflow run\` \u542F\u52A8\u5F15\u64CE
579
- `)}else{console.log("\u274C Design \u672A\u5B8C\u5168\u901A\u8FC7\u6821\u9A8C\uFF0C\u8BF7\u624B\u52A8\u68C0\u67E5\u5E76\u4FEE\u590D\u5269\u4F59\u95EE\u9898:");for(let i of o.validation.errors)console.log(` \u2717 ${i}`);console.log("\n\u4F60\u53EF\u4EE5\u624B\u52A8\u4FEE\u590D\u540E\u8FD0\u884C `aitable-workflow validate` \u9A8C\u8BC1\u3002\n"),process.exitCode=1}}a($6,"runDesignCommand");async function uM(t,e){let n=[];try{let r=await Ue(t),o=dM.parse(await lM(r,"utf8"));S(o)&&((S(o.agent)?o.agent:void 0)?.engine||n.push("\u786E\u8BA4 `aitable-workflow.config.yml` \u7684 `agent.engine`\uFF08\u672A\u8BBE\u7F6E\u65F6\u9ED8\u8BA4 claude\uFF09"))}catch{}return await fM(aM.resolve(e.workDir,".env.example"))&&n.push("\u6309 `.env.example` \u7684\u8BF4\u660E\u5728 `.env` \u91CC\u8865\u9F50\u51ED\u636E\uFF08run \u9636\u6BB5\u7F3A\u5931\u4F1A\u76F4\u63A5\u5931\u8D25\uFF09"),n.push("\u8FD0\u884C `aitable-workflow validate` \u786E\u8BA4\u914D\u7F6E\u5B8C\u6574"),n}a(uM,"collectRunnableGaps");async function fM(t){try{return await cM(t),!0}catch{return!1}}a(fM,"fileExists");import fn from"path";import{access as AM,mkdir as gb,stat as EM}from"fs/promises";import{readFile as pM,writeFile as gM}from"fs/promises";import{homedir as mM}from"os";import Er from"path";var wu="# >>> aitable-workflow DWS PATH >>>",bu="# <<< aitable-workflow DWS PATH <<<",hM=new RegExp(`${Zw(wu)}[\\s\\S]*?${Zw(bu)}(?:\\r?\\n)?`,"g");async function Qw(t,e={}){let n=e.platform??process.platform;if(n==="win32")return{status:"unsupported",detail:"\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u6539 Windows \u7528\u6237 PATH"};let r=e.configPath??yM(e.env??process.env,e.homeDir??mM(),n);if(!r)return{status:"unsupported",detail:`\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u914D\u7F6E ${(e.env??process.env).SHELL||"\u672A\u77E5 shell"}`};let o=Er.dirname(t);if(o.includes(`
579
+ `)}else{console.log("\u274C Design \u672A\u5B8C\u5168\u901A\u8FC7\u6821\u9A8C\uFF0C\u8BF7\u624B\u52A8\u68C0\u67E5\u5E76\u4FEE\u590D\u5269\u4F59\u95EE\u9898:");for(let i of o.validation.errors)console.log(` \u2717 ${i}`);console.log("\n\u4F60\u53EF\u4EE5\u624B\u52A8\u4FEE\u590D\u540E\u8FD0\u884C `aitable-workflow validate` \u9A8C\u8BC1\u3002\n"),process.exitCode=1}}a($6,"runDesignCommand");async function uM(t,e){let n=[];try{let r=await Ue(t),o=dM.parse(await lM(r,"utf8"));v(o)&&((v(o.agent)?o.agent:void 0)?.engine||n.push("\u786E\u8BA4 `aitable-workflow.config.yml` \u7684 `agent.engine`\uFF08\u672A\u8BBE\u7F6E\u65F6\u9ED8\u8BA4 claude\uFF09"))}catch{}return await fM(aM.resolve(e.workDir,".env.example"))&&n.push("\u6309 `.env.example` \u7684\u8BF4\u660E\u5728 `.env` \u91CC\u8865\u9F50\u51ED\u636E\uFF08run \u9636\u6BB5\u7F3A\u5931\u4F1A\u76F4\u63A5\u5931\u8D25\uFF09"),n.push("\u8FD0\u884C `aitable-workflow validate` \u786E\u8BA4\u914D\u7F6E\u5B8C\u6574"),n}a(uM,"collectRunnableGaps");async function fM(t){try{return await cM(t),!0}catch{return!1}}a(fM,"fileExists");import fn from"path";import{access as AM,mkdir as gb,stat as EM}from"fs/promises";import{readFile as pM,writeFile as gM}from"fs/promises";import{homedir as mM}from"os";import Er from"path";var wu="# >>> aitable-workflow DWS PATH >>>",bu="# <<< aitable-workflow DWS PATH <<<",hM=new RegExp(`${Zw(wu)}[\\s\\S]*?${Zw(bu)}(?:\\r?\\n)?`,"g");async function Qw(t,e={}){let n=e.platform??process.platform;if(n==="win32")return{status:"unsupported",detail:"\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u4FEE\u6539 Windows \u7528\u6237 PATH"};let r=e.configPath??yM(e.env??process.env,e.homeDir??mM(),n);if(!r)return{status:"unsupported",detail:`\u6682\u4E0D\u652F\u6301\u81EA\u52A8\u914D\u7F6E ${(e.env??process.env).SHELL||"\u672A\u77E5 shell"}`};let o=Er.dirname(t);if(o.includes(`
580
580
  `)||o.includes("\r"))return{status:"failed",configPath:r,detail:"DWS \u5B89\u88C5\u76EE\u5F55\u5305\u542B\u975E\u6CD5\u6362\u884C\u7B26"};let i="";try{i=await pM(r,"utf8")}catch(p){if(!wM(p)||p.code!=="ENOENT")return{status:"failed",configPath:r,detail:Yw(p)}}let s=Jw(i,wu),c=Jw(i,bu);if(s!==c)return{status:"failed",configPath:r,detail:"\u68C0\u6D4B\u5230\u4E0D\u5B8C\u6574\u7684 aitable-workflow DWS PATH \u914D\u7F6E\u5757\uFF0C\u8BF7\u5148\u624B\u52A8\u4FEE\u590D"};let l=i.includes(`\r
581
581
  `)?`\r
582
582
  `:`
@@ -619,11 +619,11 @@ ${x}`,k;try{k=await l(x,d),k.response.includes("already in use")&&(k=await l(v))
619
619
  `))}}else{let f=d.action==="install"?"\u5B89\u88C5":"\u66F4\u65B0";console.warn(` \u26A0 DWS \u81EA\u52A8${f}\u672A\u5B8C\u6210\uFF1A${d.detail}`),console.warn(" \u5DF2\u7EE7\u7EED\u521D\u59CB\u5316\uFF1B\u53EF\u7A0D\u540E\u624B\u52A8\u8FD0\u884C `npm install --global dingtalk-workspace-cli@latest`\u3002\n")}let u;if(r?u=await mb(r):u=process.cwd(),await jo(u)||(await gb(u,{recursive:!0}),console.log(`
620
620
  \u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${u}`)),!e&&!n){let f=fn.join(u,"aitable-workflow.config.yml");await jo(f)&&(console.log(`
621
621
  \u26A0\uFE0F \u68C0\u6D4B\u5230\u5DF2\u6709 aitable-workflow.config.yml`),console.log(` \u4F7F\u7528 --force \u8986\u76D6\u5DF2\u6709\u914D\u7F6E\uFF0C\u6216\u66F4\u6362\u76EE\u5F55\u91CD\u8BD5\u3002
622
- `))}return cb({cwd:u,force:e,yes:n})}a(k4,"runInit");async function mb(t){let e=fn.resolve(t);try{return(await EM(e)).isDirectory()?e:fn.dirname(e)}catch{let n=fn.extname(e).toLowerCase();return n===".yml"||n===".yaml"?fn.dirname(e):e}}a(mb,"resolveInitCwd");async function jo(t){try{return await AM(t),!0}catch{return!1}}a(jo,"pathExists");import{existsSync as OO}from"fs";import{readFile as Nb,writeFile as jO}from"fs/promises";import Dr from"path";import{pathToFileURL as FO}from"url";import Lb from"yaml";var Ru=process.env.NODE_ENV==="test"?2:5,hb=process.env.NODE_ENV==="test"?0:500,DM={Grid:"Grid",FormDesigner:"FormDesigner",Kanban:"Kanban",Calendar:"Calendar",Gallery:"Gallery",Gantt:"Gantt"};function Eu(t){return DM[t]??t}a(Eu,"toDwsViewType");var $M={state:"singleSelect",description:"text",current_step:"text",owner:"text",event_log:"text"};function PM(t){let e=new Set;e.add(t.initial);for(let n of t.active)e.add(n);for(let n of t.terminal)e.add(n);return t.blocked&&e.add(t.blocked),t.review&&e.add(t.review),[...e]}a(PM,"extractStateOptions");async function Du(t){let{settings:e,workflow:n,cleanEmptyRows:r=!0}=t,{base_id:o,table_id:i,fields:s}=e.tracker,c=t.dws??new he({bin:e.tracker.dws_bin}),l=[];h.info("setup","\u83B7\u53D6\u8868\u7ED3\u6784",{baseId:o,tableId:i});let d=await Ar(c,o,i),u=new Set(d.map(C=>C.fieldName));h.info("setup","\u73B0\u6709\u5B57\u6BB5",{count:d.length,names:d.map(C=>C.fieldName)});let f=[],p=e.tracker.field_definitions,g=p?p.map(C=>({name:C.name,type:C.type,...C.options?{options:C.options}:{},...C.formatter?{formatter:C.formatter}:{},...C.description?{description:C.description}:{}})):[],m=new Map(g.map(C=>[C.name,C])),y=[{role:"description",name:s.description},{role:"state",name:s.state},{role:"current_step",name:s.current_step},{role:"owner",name:s.owner},{role:"event_log",name:s.event_log}],w=new Set(y.map(C=>C.name).filter(Boolean)),{userInput:b,output:x,other:I}=n.referencedFields,v=new Set([...u]);for(let C of b){if(v.has(C)||w.has(C))continue;let E=m.get(C);f.push({fieldName:C,type:E?.type??"text",...E?.options?{options:E.options}:{},...E?.formatter?{formatter:E.formatter}:{},...E?.description?{description:E.description}:{}}),v.add(C)}for(let C of x){if(v.has(C)||w.has(C))continue;let E=m.get(C);f.push({fieldName:C,type:E?.type??"text",...E?.options?{options:E.options}:{},...E?.formatter?{formatter:E.formatter}:{},...E?.description?{description:E.description}:{}}),v.add(C)}for(let C of I){if(v.has(C)||w.has(C))continue;let E=m.get(C);f.push({fieldName:C,type:E?.type??"text",...E?.options?{options:E.options}:{},...E?.formatter?{formatter:E.formatter}:{},...E?.description?{description:E.description}:{}}),v.add(C)}for(let C of g)v.has(C.name)||w.has(C.name)||(f.push({fieldName:C.name,type:C.type??"text",...C.options?{options:C.options}:{},...C.formatter?{formatter:C.formatter}:{},...C.description?{description:C.description}:{}}),v.add(C.name));for(let{role:C,name:E}of y){if(!E)continue;if(v.has(E)){h.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${E}`);continue}let F=m.get(E),W=F?.type??$M[C]??"text";f.push({fieldName:E,type:W,...F?.options?{options:F.options}:{},...F?.description?{description:F.description}:{},...!F?.options&&C==="state"?{options:PM(e.tracker.states)}:{}}),v.add(E)}if(f.length>0){h.info("setup","\u521B\u5EFA\u5B57\u6BB5",{count:f.length,fields:f.map(P=>P.fieldName)});let C=5,E=2,F=0,W=[];for(let P=0;P<f.length;P+=C){let O=f.slice(P,P+C),q=!1;for(let z=0;z<=E;z++)try{let K=O.map(ge=>{let Ee={fieldName:ge.fieldName,type:ge.type},nt={};return ge.options&&ge.options.length>0&&(nt.options=ge.options.map(rt=>({name:rt}))),ge.formatter&&(nt.formatter=ge.formatter),Object.keys(nt).length>0&&(Ee.config=nt),ge.description&&(Ee.description=ge.description),Ee}),G=await c.runJson(["aitable","field","create","--base-id",o,"--table-id",i,"--fields",JSON.stringify(K),"--timeout","60","--yes"],{timeoutMs:9e4}),ee=S(G)&&S(G.data)?G.data:null,te=typeof ee?.successCount=="number"?ee.successCount:O.length,Ve=typeof ee?.failedCount=="number"?ee.failedCount:0;if(F+=te,Ve>0&&Array.isArray(ee?.results)){for(let ge of ee.results)if(S(ge)&&ge.success===!1){let Ee=String(ge.fieldName??"");if(String(ge.errorCode??"").includes("Forbidden"))h.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${Ee}`),F++;else{let nt={fieldName:Ee||"<unknown>",...typeof ge.errorCode=="string"?{errorCode:ge.errorCode}:{},...typeof ge.errorMessage=="string"?{errorMessage:ge.errorMessage}:{}};W.push(nt),h.warn("setup","\u5B57\u6BB5\u521B\u5EFA\u8FD4\u56DE\u5931\u8D25",nt)}}}q=!0;break}catch(K){let G=K instanceof Error?K.message:String(K),ee=K instanceof ve?K.stderr:"";if((G.includes("TIMEOUT")||G.includes("timeout")||ee.includes("TIMEOUT")||ee.includes("timeout"))&&z<E){h.warn("setup",`\u6279\u6B21\u8D85\u65F6\uFF0C\u68C0\u67E5\u5B9E\u9645\u72B6\u6001\u540E\u91CD\u8BD5 ${z+1}/${E}`,{batch:O.map(rt=>rt.fieldName)}),await Cu(3e3);let Ve=await Lt(c,o,i),ge=new Set(Ve.map(rt=>rt.fieldName)),Ee=O.filter(rt=>!ge.has(rt.fieldName));if(Ee.length===0){h.info("setup","\u8D85\u65F6\u4F46\u5B57\u6BB5\u5DF2\u5168\u90E8\u521B\u5EFA\u6210\u529F"),F+=O.length,q=!0;break}let nt=O.length-Ee.length;nt>0&&(h.info("setup",`\u5176\u4E2D ${nt} \u4E2A\u5DF2\u521B\u5EFA\uFF0C\u4EC5\u91CD\u8BD5\u5269\u4F59 ${Ee.length} \u4E2A`),F+=nt),O=Ee}else{h.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25",{batch:O.map(Ve=>Ve.fieldName),error:G}),W.push(...O.map(Ve=>({fieldName:Ve.fieldName,errorMessage:G})));break}}q&&P+C<f.length&&await Cu(500)}if(W.length===0)h.info("setup","\u5B57\u6BB5\u521B\u5EFA\u5B8C\u6210",{createdCount:F,fields:f.map(P=>P.fieldName)}),console.log(`\u2713 \u5DF2\u521B\u5EFA ${F} \u4E2A\u5B57\u6BB5: ${f.map(P=>P.fieldName).join(", ")}`);else throw h.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5B58\u5728\u5931\u8D25\u9879\uFF0C\u7EC8\u6B62\u642D\u5EFA",{requestedCount:f.length,createdCount:F,failedCount:W.length,failedFields:W}),Object.assign(new Error(`\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25\uFF1A${W.map(P=>P.fieldName).join(", ")}`),{code:"FIELD_CREATE_FAILED",status:502,details:{requestedCount:f.length,createdCount:F,failedCount:W.length,failedFields:W}})}else console.log("\u2713 \u6240\u6709\u5B57\u6BB5\u5DF2\u5C31\u7EEA\uFF0C\u65E0\u9700\u521B\u5EFA");if(r&&(f.length>0||t.tableJustCreated===!0))try{await MM(c,o,i)}catch(C){let E=C instanceof Error?C.message:String(C);h.warn("setup","\u7A7A\u767D\u884C\u6E05\u7406\u5931\u8D25\uFF08\u975E\u81F4\u547D\uFF09",{error:E}),console.log("\u26A0 \u7A7A\u767D\u884C\u6E05\u7406\u8DF3\u8FC7\uFF08API \u8D85\u65F6\uFF09")}let R=f.length>0?await Ar(c,o,i):d,T=n.tracker?.views;if(T&&T.length>0)try{l.push(...await FM(c,o,i,R,T,n,s.title,e.tracker.form_share?.enabled))}catch(C){let E=C instanceof Error?C.message:String(C);throw h.error("setup","\u89C6\u56FE\u914D\u7F6E\u5931\u8D25",{error:E}),console.log("\u2717 \u89C6\u56FE\u914D\u7F6E\u5931\u8D25"),C}else h.info("setup","\u672A\u914D\u7F6E tracker.views\uFF0C\u8DF3\u8FC7\u89C6\u56FE\u521B\u5EFA");let _=R;console.log(`
622
+ `))}return cb({cwd:u,force:e,yes:n})}a(k4,"runInit");async function mb(t){let e=fn.resolve(t);try{return(await EM(e)).isDirectory()?e:fn.dirname(e)}catch{let n=fn.extname(e).toLowerCase();return n===".yml"||n===".yaml"?fn.dirname(e):e}}a(mb,"resolveInitCwd");async function jo(t){try{return await AM(t),!0}catch{return!1}}a(jo,"pathExists");import{existsSync as OO}from"fs";import{readFile as Nb,writeFile as jO}from"fs/promises";import Dr from"path";import{pathToFileURL as FO}from"url";import Lb from"yaml";var Ru=process.env.NODE_ENV==="test"?2:5,hb=process.env.NODE_ENV==="test"?0:500,DM={Grid:"Grid",FormDesigner:"FormDesigner",Kanban:"Kanban",Calendar:"Calendar",Gallery:"Gallery",Gantt:"Gantt"};function Eu(t){return DM[t]??t}a(Eu,"toDwsViewType");var $M={state:"singleSelect",description:"text",current_step:"text",owner:"text",event_log:"text"};function PM(t){let e=new Set;e.add(t.initial);for(let n of t.active)e.add(n);for(let n of t.terminal)e.add(n);return t.blocked&&e.add(t.blocked),t.review&&e.add(t.review),[...e]}a(PM,"extractStateOptions");async function Du(t){let{settings:e,workflow:n,cleanEmptyRows:r=!0}=t,{base_id:o,table_id:i,fields:s}=e.tracker,c=t.dws??new he({bin:e.tracker.dws_bin}),l=[];h.info("setup","\u83B7\u53D6\u8868\u7ED3\u6784",{baseId:o,tableId:i});let d=await Ar(c,o,i),u=new Set(d.map(C=>C.fieldName));h.info("setup","\u73B0\u6709\u5B57\u6BB5",{count:d.length,names:d.map(C=>C.fieldName)});let f=[],p=e.tracker.field_definitions,g=p?p.map(C=>({name:C.name,type:C.type,...C.options?{options:C.options}:{},...C.formatter?{formatter:C.formatter}:{},...C.description?{description:C.description}:{}})):[],m=new Map(g.map(C=>[C.name,C])),y=[{role:"description",name:s.description},{role:"state",name:s.state},{role:"current_step",name:s.current_step},{role:"owner",name:s.owner},{role:"event_log",name:s.event_log}],w=new Set(y.map(C=>C.name).filter(Boolean)),{userInput:b,output:x,other:I}=n.referencedFields,S=new Set([...u]);for(let C of b){if(S.has(C)||w.has(C))continue;let E=m.get(C);f.push({fieldName:C,type:E?.type??"text",...E?.options?{options:E.options}:{},...E?.formatter?{formatter:E.formatter}:{},...E?.description?{description:E.description}:{}}),S.add(C)}for(let C of x){if(S.has(C)||w.has(C))continue;let E=m.get(C);f.push({fieldName:C,type:E?.type??"text",...E?.options?{options:E.options}:{},...E?.formatter?{formatter:E.formatter}:{},...E?.description?{description:E.description}:{}}),S.add(C)}for(let C of I){if(S.has(C)||w.has(C))continue;let E=m.get(C);f.push({fieldName:C,type:E?.type??"text",...E?.options?{options:E.options}:{},...E?.formatter?{formatter:E.formatter}:{},...E?.description?{description:E.description}:{}}),S.add(C)}for(let C of g)S.has(C.name)||w.has(C.name)||(f.push({fieldName:C.name,type:C.type??"text",...C.options?{options:C.options}:{},...C.formatter?{formatter:C.formatter}:{},...C.description?{description:C.description}:{}}),S.add(C.name));for(let{role:C,name:E}of y){if(!E)continue;if(S.has(E)){h.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${E}`);continue}let F=m.get(E),W=F?.type??$M[C]??"text";f.push({fieldName:E,type:W,...F?.options?{options:F.options}:{},...F?.description?{description:F.description}:{},...!F?.options&&C==="state"?{options:PM(e.tracker.states)}:{}}),S.add(E)}if(f.length>0){h.info("setup","\u521B\u5EFA\u5B57\u6BB5",{count:f.length,fields:f.map(P=>P.fieldName)});let C=5,E=2,F=0,W=[];for(let P=0;P<f.length;P+=C){let O=f.slice(P,P+C),q=!1;for(let z=0;z<=E;z++)try{let K=O.map(ge=>{let Ee={fieldName:ge.fieldName,type:ge.type},nt={};return ge.options&&ge.options.length>0&&(nt.options=ge.options.map(rt=>({name:rt}))),ge.formatter&&(nt.formatter=ge.formatter),Object.keys(nt).length>0&&(Ee.config=nt),ge.description&&(Ee.description=ge.description),Ee}),G=await c.runJson(["aitable","field","create","--base-id",o,"--table-id",i,"--fields",JSON.stringify(K),"--timeout","60","--yes"],{timeoutMs:9e4}),ee=v(G)&&v(G.data)?G.data:null,te=typeof ee?.successCount=="number"?ee.successCount:O.length,Ve=typeof ee?.failedCount=="number"?ee.failedCount:0;if(F+=te,Ve>0&&Array.isArray(ee?.results)){for(let ge of ee.results)if(v(ge)&&ge.success===!1){let Ee=String(ge.fieldName??"");if(String(ge.errorCode??"").includes("Forbidden"))h.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${Ee}`),F++;else{let nt={fieldName:Ee||"<unknown>",...typeof ge.errorCode=="string"?{errorCode:ge.errorCode}:{},...typeof ge.errorMessage=="string"?{errorMessage:ge.errorMessage}:{}};W.push(nt),h.warn("setup","\u5B57\u6BB5\u521B\u5EFA\u8FD4\u56DE\u5931\u8D25",nt)}}}q=!0;break}catch(K){let G=K instanceof Error?K.message:String(K),ee=K instanceof ve?K.stderr:"";if((G.includes("TIMEOUT")||G.includes("timeout")||ee.includes("TIMEOUT")||ee.includes("timeout"))&&z<E){h.warn("setup",`\u6279\u6B21\u8D85\u65F6\uFF0C\u68C0\u67E5\u5B9E\u9645\u72B6\u6001\u540E\u91CD\u8BD5 ${z+1}/${E}`,{batch:O.map(rt=>rt.fieldName)}),await Cu(3e3);let Ve=await Lt(c,o,i),ge=new Set(Ve.map(rt=>rt.fieldName)),Ee=O.filter(rt=>!ge.has(rt.fieldName));if(Ee.length===0){h.info("setup","\u8D85\u65F6\u4F46\u5B57\u6BB5\u5DF2\u5168\u90E8\u521B\u5EFA\u6210\u529F"),F+=O.length,q=!0;break}let nt=O.length-Ee.length;nt>0&&(h.info("setup",`\u5176\u4E2D ${nt} \u4E2A\u5DF2\u521B\u5EFA\uFF0C\u4EC5\u91CD\u8BD5\u5269\u4F59 ${Ee.length} \u4E2A`),F+=nt),O=Ee}else{h.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25",{batch:O.map(Ve=>Ve.fieldName),error:G}),W.push(...O.map(Ve=>({fieldName:Ve.fieldName,errorMessage:G})));break}}q&&P+C<f.length&&await Cu(500)}if(W.length===0)h.info("setup","\u5B57\u6BB5\u521B\u5EFA\u5B8C\u6210",{createdCount:F,fields:f.map(P=>P.fieldName)}),console.log(`\u2713 \u5DF2\u521B\u5EFA ${F} \u4E2A\u5B57\u6BB5: ${f.map(P=>P.fieldName).join(", ")}`);else throw h.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5B58\u5728\u5931\u8D25\u9879\uFF0C\u7EC8\u6B62\u642D\u5EFA",{requestedCount:f.length,createdCount:F,failedCount:W.length,failedFields:W}),Object.assign(new Error(`\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25\uFF1A${W.map(P=>P.fieldName).join(", ")}`),{code:"FIELD_CREATE_FAILED",status:502,details:{requestedCount:f.length,createdCount:F,failedCount:W.length,failedFields:W}})}else console.log("\u2713 \u6240\u6709\u5B57\u6BB5\u5DF2\u5C31\u7EEA\uFF0C\u65E0\u9700\u521B\u5EFA");if(r&&(f.length>0||t.tableJustCreated===!0))try{await MM(c,o,i)}catch(C){let E=C instanceof Error?C.message:String(C);h.warn("setup","\u7A7A\u767D\u884C\u6E05\u7406\u5931\u8D25\uFF08\u975E\u81F4\u547D\uFF09",{error:E}),console.log("\u26A0 \u7A7A\u767D\u884C\u6E05\u7406\u8DF3\u8FC7\uFF08API \u8D85\u65F6\uFF09")}let R=f.length>0?await Ar(c,o,i):d,T=n.tracker?.views;if(T&&T.length>0)try{l.push(...await FM(c,o,i,R,T,n,s.title,e.tracker.form_share?.enabled))}catch(C){let E=C instanceof Error?C.message:String(C);throw h.error("setup","\u89C6\u56FE\u914D\u7F6E\u5931\u8D25",{error:E}),console.log("\u2717 \u89C6\u56FE\u914D\u7F6E\u5931\u8D25"),C}else h.info("setup","\u672A\u914D\u7F6E tracker.views\uFF0C\u8DF3\u8FC7\u89C6\u56FE\u521B\u5EFA");let _=R;console.log(`
623
623
  \u6700\u7EC8\u8868\u7ED3\u6784:`),console.log(" \u2500\u2500\u2500 \u7528\u6237\u586B\u5199 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let C of _)b.has(C.fieldName)&&console.log(` \u2713 [${C.type}] ${C.fieldName}`);console.log(" \u2500\u2500\u2500 AI \u81EA\u52A8\u8F93\u51FA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let C of _)x.has(C.fieldName)&&!b.has(C.fieldName)&&console.log(` [${C.type}] ${C.fieldName}`);console.log(" \u2500\u2500\u2500 \u7CFB\u7EDF\u5B57\u6BB5 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let C of _)if(w.has(C.fieldName)||C.type==="primaryDoc"){let E=OM(C.fieldName,s),F=E?` \u2190 ${E}`:"";console.log(` [${C.type}] ${C.fieldName}${F}`)}if(console.log(`
624
- \u{1F4A1} \u4F7F\u7528\u63D0\u793A:`),console.log(` \u7528\u6237\u53EA\u9700\u586B\u5199\u4E0A\u65B9 \u2713 \u6807\u8BB0\u7684 ${b.size} \u4E2A\u5B57\u6BB5\uFF0C\u5176\u4F59\u5B57\u6BB5\u7531 AI \u81EA\u52A8\u586B\u5199\u3002`),T?.some(C=>C.type==="FormDesigner"&&C.id==="input_form")){let C=T.find(E=>E.id==="input_form");console.log(` \u63A8\u8350\u4F7F\u7528\u89C6\u56FE "${C?.name}" \u65B0\u5EFA\u5DE5\u5355\u3002`)}return{warnings:l}}a(Du,"initTable");function Cu(t){return new Promise(e=>setTimeout(e,t))}a(Cu,"sleep");async function MM(t,e,n){h.info("setup","\u68C0\u67E5\u7A7A\u767D\u884C");let r=await t.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--limit","100"]),o=Te(r),i=[];for(let s of o){if(!S(s))continue;let c=typeof s.recordId=="string"?s.recordId:null,l=S(s.cells)?s.cells:{},d=Object.values(l).some(u=>u!=null&&u!=="");c&&!d&&i.push(c)}i.length>0?(h.info("setup",`\u53D1\u73B0 ${i.length} \u6761\u7A7A\u767D\u884C\uFF0C\u5220\u9664\u4E2D`),await t.runJson(["aitable","record","delete","--base-id",e,"--table-id",n,"--record-ids",i.join(","),"--yes"]),console.log(`\u2713 \u5DF2\u6E05\u7406 ${i.length} \u6761\u7A7A\u767D\u884C`)):console.log("\u2713 \u65E0\u7A7A\u767D\u884C")}a(MM,"cleanupEmptyRows");function OM(t,e){for(let[n,r]of Object.entries(e))if(r===t)return n;return null}a(OM,"findRole");function jM(t){if(t instanceof ve){let e=t.stderr.trim(),n=typeof t.raw=="string"?t.raw.trim():"";return[t.message,e,n].filter(Boolean).join("\uFF1B")}return t instanceof Error?t.message:String(t)}a(jM,"describeViewError");async function FM(t,e,n,r,o,i,s,c){let l=new Map(r.map(v=>[v.fieldName,v.fieldId])),d=new Map(r.map(v=>[v.fieldName,v.type])),u=new Map(r.map(v=>[v.fieldName,v])),p=NM(r,s)?.fieldId??"",g=await _a(t,e,n),m=new Map(g.map(v=>[String(v.viewName??""),v])),y=WM(o,i),w=[],b=[],x=y.some(v=>v.type==="Grid"&&v.id==="default_grid"),I=!1;!x&&y.some(v=>v.type==="Grid")&&(h.warn("setup","tracker.views \u7F3A\u5C11 default_grid\uFF0C\u9996\u4E2A Grid \u5C06\u517C\u5BB9\u590D\u7528\u9ED8\u8BA4\u89C6\u56FE"),console.log('\u26A0 tracker.views \u7F3A\u5C11 id="default_grid"\uFF1B\u9996\u4E2A Grid \u5C06\u517C\u5BB9\u590D\u7528\u9ED8\u8BA4\u89C6\u56FE\uFF0C\u5EFA\u8BAE\u8865\u9F50\u8BE5\u58F0\u660E'));for(let v of y){v.filter?.length&&v.type!=="Grid"&&(h.warn("setup",`\u89C6\u56FE "${v.name}" \u975E Grid \u89C6\u56FE\uFF0Cfilter \u58F0\u660E\u88AB\u5FFD\u7565`,{type:v.type}),console.log(`\u26A0 \u89C6\u56FE "${v.name}"\uFF08${v.type}\uFF09\u6682\u4E0D\u652F\u6301\u58F0\u660E\u5F0F\u8FC7\u6EE4\uFF0C\u5DF2\u5FFD\u7565`));try{switch(v.type){case"Grid":{let k=v.id==="default_grid"||!x&&!I;k&&!x&&(I=!0),await BM(t,e,n,v,l,u,p,g,i,k,m);break}case"FormDesigner":await HM(t,e,n,v,l,d,p,m,c??!0,b);break;case"Kanban":case"Calendar":case"Gallery":case"Gantt":await QM(t,e,n,v,l,p,m);break}}catch(k){let R=jM(k);if(v.type==="FormDesigner"){let T={code:"FORM_VIEW_CREATE_FAILED",message:`\u8868\u5355\u89C6\u56FE "${v.name}" \u672A\u81EA\u52A8\u521B\u5EFA\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6DFB\u52A0\u8868\u5355\u89C6\u56FE\uFF08\u539F\u56E0\uFF1A${tO(R)}\uFF09`,details:{id:v.id,name:v.name,type:v.type,retryable:!0,errorDetail:R}};h.warn("setup","\u975E\u5173\u952E\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF0C\u7EE7\u7EED setup",{...T.details,error:R}),console.log(`\u26A0 ${T.message}`),console.log(` \u21B3 \u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u540D\u4E3A "${v.name}" \u7684\u8868\u5355\u89C6\u56FE`),b.push(T);continue}h.warn("setup",`\u89C6\u56FE "${v.name}" \u914D\u7F6E\u5931\u8D25`,{error:R}),console.log(`\u26A0 \u89C6\u56FE "${v.name}" \u521B\u5EFA\u5931\u8D25: ${R}`),w.push({id:v.id,name:v.name,type:v.type,errorMessage:R})}}if(w.length>0)throw Object.assign(new Error(`\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF1A${w.map(v=>v.name).join(", ")}`),{code:"VIEW_CREATE_FAILED",status:502,details:{requestedCount:y.length,failedCount:w.length,failedViews:w}});return b}a(FM,"configureViews");function NM(t,e){return t.find(n=>LM(n.type))??(e?t.find(n=>n.fieldName===e):void 0)??t[0]}a(NM,"resolvePrimaryField");function LM(t){let e=t.replace(/[_-]/g,"").toLowerCase();return e==="primarydoc"||e==="primary"}a(LM,"isPrimaryFieldType");function WM(t,e){let n=[],r=2;for(let o of t){if(!o.for_each_step){n.push(o);continue}let i=e.steps.filter(s=>o.for_each_step==="needs_human"?!!s.needs_human:!0);for(let s of i){let c=String.fromCodePoint(9311+r),l=Object.values(s.input_mapping??{}),d=Object.values(s.output_mapping??{});n.push({...o,id:`step_${s.id}`,name:`${c} ${s.name}`,visible_fields:[...l,...d],description:s.needs_human?.reason??o.description,for_each_step:void 0}),r++}}return n}a(WM,"expandForEachStep");async function BM(t,e,n,r,o,i,s,c,l,d,u){if(!d){await zM(t,e,n,r,o,i,s,u);return}let f=c.find(y=>y.viewType==="Grid");if(!f)return;let p=String(f.viewId??"");if(!p)return;let g=r.field_order?.length?r.field_order:qM(o,l),m=Pu(g,o,s);if(m.length>0){await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",p,"--config",JSON.stringify({visibleFieldIds:m}),"--yes"],{timeoutMs:6e4});let y=r.field_order?.length?"config":"\u81EA\u52A8\u63A8\u5BFC";console.log(`\u2713 \u5DF2\u91CD\u6392\u9ED8\u8BA4\u89C6\u56FE\u5217\u987A\u5E8F\uFF08${m.length} \u4E2A\u5B57\u6BB5\uFF0C\u6765\u6E90: ${y}\uFF09`)}await Tu(t,e,n,p,r.name,r,o,i)}a(BM,"applyGridView");async function zM(t,e,n,r,o,i,s,c){if(c.has(r.name)){await Tu(t,e,n,Ta(c.get(r.name)),r.name,r,o,i),console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}h.info("setup",`\u521B\u5EFA Grid \u89C6\u56FE: ${r.name}`);let l=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Eu("Grid"),"--yes"],{timeoutMs:6e4}),d=await $u(t,e,n,r.name);if(!d)throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"`);c.set(r.name,d);let u=Ta(l)||String(d.viewId??""),f=r.field_order?.length?r.field_order:r.visible_fields??[];if(u&&f.length){let p=Pu(f,o,s);p.length>0&&await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",u,"--config",JSON.stringify({visibleFieldIds:p}),"--yes"],{timeoutMs:6e4})}await Tu(t,e,n,u,r.name,r,o,i),console.log(`\u2713 \u5DF2\u521B\u5EFA Grid \u89C6\u56FE: "${r.name}"\uFF08${f.length} \u4E2A\u5B57\u6BB5\uFF09`)}a(zM,"applyAdditionalGridView");var UM=new Set(["singleselect","multipleselect"]);function KM(t){return t.replace(/[_-]/g,"").toLowerCase()}a(KM,"normalizeFieldType");function VM(t,e,n){if(!t?.length)return;let r=[];for(let o of t){let i=e.get(o.field);if(!i){h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u5B57\u6BB5\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u6761\u4EF6: ${o.field}`);continue}let s=n?.get(o.field),c=UM.has(KM(s?.type??"")),l=o.any_of?.length?o.any_of:typeof o.equals=="string"?[o.equals]:[];if(!l.length)continue;if(!c){if(l.length>1){h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u975E\u9009\u62E9\u578B\u5B57\u6BB5\u4E0D\u652F\u6301\u591A\u503C\uFF0C\u8DF3\u8FC7\u6761\u4EF6: ${o.field}`,{values:l});continue}r.push({fieldId:i,link:null,symbol:"EQ",value:l[0],valueType:"VALUE"});continue}let d=new Map((s?.options??[]).map(f=>[f.name,f.id])),u=[];for(let f of l){let p=d.get(f);if(!p){h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u9009\u9879\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u8BE5\u503C: ${o.field}=${f}`);continue}u.push(p)}u.length&&r.push({fieldId:i,link:null,symbol:"ANY_OF",value:u,valueType:"VALUE"})}return r.length?r:void 0}a(VM,"buildViewFilter");async function Tu(t,e,n,r,o,i,s,c){if(!r||!i.filter?.length)return!1;let l=VM(i.filter,s,c);if(!l)return!1;try{return await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",r,"--config",JSON.stringify({filter:l}),"--yes"],{timeoutMs:6e4}),console.log(`\u2713 \u5DF2\u5E94\u7528\u89C6\u56FE\u8FC7\u6EE4: "${o}"\uFF08${i.filter.length} \u4E2A\u6761\u4EF6\uFF09`),!0}catch(d){return h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u4E0B\u53D1\u5931\u8D25\uFF08\u4E0D\u963B\u65AD\uFF09: ${o}`,{viewId:r,filter:JSON.stringify(l),error:d instanceof Error?d.message:String(d)}),console.log(`\u26A0 \u89C6\u56FE "${o}" \u8FC7\u6EE4\u4E0B\u53D1\u5931\u8D25\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u8BBE\u7F6E`),!1}}a(Tu,"applyViewFilter");function qM(t,e){let{userInput:n,output:r,other:o}=e.referencedFields,i=[],s=new Set;for(let c of n)t.has(c)&&!s.has(c)&&(i.push(c),s.add(c));for(let c of r)t.has(c)&&!s.has(c)&&(i.push(c),s.add(c));for(let c of o)t.has(c)&&!s.has(c)&&(i.push(c),s.add(c));for(let c of t.keys())s.has(c)||(i.push(c),s.add(c));return i}a(qM,"buildDefaultFieldOrder");async function HM(t,e,n,r,o,i,s,c,l,d){if(c.has(r.name)){console.log(`\u2713 \u8868\u5355\u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"\uFF0C\u540C\u6B65\u53EF\u89C1\u5B57\u6BB5`);let w=c.get(r.name),b=S(w)?String(w.viewId??w.id??""):"";b&&r.visible_fields?.length&&await wb(t,e,n,b,r.visible_fields,o,i,s),l&&b&&await yb(t,e,n,b,r,d);return}h.info("setup",`\u521B\u5EFA\u8868\u5355\u89C6\u56FE: ${r.name}`,{visibleFieldCount:r.visible_fields?.length??0,baseId:e,tableId:n});let u=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Eu("FormDesigner"),"--yes"],{timeoutMs:6e4}),f=Ta(u),p=_u(u);h.info("setup","\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u8FD4\u56DE",{name:r.name,viewId:f||void 0,success:p,rawResult:JSON.stringify(u).slice(0,2e3)});let g=await $u(t,e,n,r.name);if(!g){let w=JSON.stringify(u).slice(0,500);if(!f&&!p)throw new Error(`dws \u672A\u8FD4\u56DE\u53EF\u9A8C\u8BC1\u7684\u6210\u529F\u4FE1\u53F7\uFF08\u65E0 viewId\u3001\u65E0 success=true\uFF09\uFF0C\u8868\u5355\u89C6\u56FE "${r.name}" \u53EF\u80FD\u672A\u521B\u5EFA\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}\u3002\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u8868\u5355\u89C6\u56FE\uFF0C\u6216\u4F7F\u7528 dws aitable view create --verbose \u6392\u67E5`);let b=[f?`viewId=${f}`:"",p?"success=true":"",`\u5DF2\u91CD\u8BD5 ${Ru} \u6B21 view get`].filter(Boolean).join("\uFF1B");throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF08${b}\uFF09\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}`)}c.set(r.name,g);let m=f||String(g.viewId??"");m&&r.visible_fields?.length&&(await GM(t,e,n,m,r,o,i,s),await wb(t,e,n,m,r.visible_fields,o,i,s));let y=r.visible_fields?.length??0;if(console.log(`\u2713 \u5DF2\u521B\u5EFA\u8868\u5355\u89C6\u56FE: "${r.name}"\uFF08${y} \u4E2A\u5B57\u6BB5\uFF09`),l){let w=m||f||"";w&&await yb(t,e,n,w,r,d)}}a(HM,"applyFormView");async function GM(t,e,n,r,o,i,s,c){let l=o.visible_fields??[],d=[];c&&l.some(u=>i.get(u)===c)&&d.push(c);for(let u of l){if(bb(s.get(u)))continue;let f=i.get(u);f&&f!==c&&d.push(f)}d.length!==0&&(h.info("setup",`\u66F4\u65B0\u8868\u5355\u89C6\u56FE\u53EF\u89C1\u5B57\u6BB5: ${o.name}`,{viewId:r,visibleCount:d.length}),await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",r,"--config",JSON.stringify({visibleFieldIds:d}),"--yes"],{timeoutMs:6e4}).catch(u=>{h.warn("setup",`\u8868\u5355\u53EF\u89C1\u5B57\u6BB5\u4E00\u6B21\u6027\u4E0B\u53D1\u5931\u8D25\uFF0C\u6539\u7531\u9010\u5B57\u6BB5\u540C\u6B65\u5BF9\u9F50: ${o.name}`,{viewId:r,error:u instanceof Error?u.message:String(u)})}))}a(GM,"applyFormVisibleFieldIds");async function yb(t,e,n,r,o,i){let s=await Yo(t,e,n,r,{autoEnable:!0});if(s){console.log(`\u2713 \u5DF2\u5F00\u542F\u8868\u5355\u5206\u4EAB \u2192 ${s}`),console.log(" \uFF08\u94FE\u63A5\u4E0D\u5199\u5165\u914D\u7F6E\uFF0C\u8FD0\u884C\u671F\u81EA\u52A8\u89E3\u6790\uFF1B\u6B64\u5904\u4EC5\u4F9B\u6838\u5BF9\uFF09");return}let c={code:"FORM_SHARE_DISABLED",message:`\u8868\u5355\u89C6\u56FE "${o.name}" \u7684\u5206\u4EAB\u672A\u5F00\u542F\uFF0C\u8FD0\u884C\u671F\u89E3\u6790\u4E0D\u51FA\u8868\u5355\u94FE\u63A5\uFF08\u56DE\u590D\u91CC\u4E0D\u4F1A\u51FA\u73B0\u586B\u5355\u5165\u53E3\uFF09\uFF1B\u8BF7\u91CD\u8DD1 setup\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6253\u5F00\u8BE5\u8868\u5355\u7684\u5206\u4EAB`,details:{id:o.id,name:o.name,viewId:r,retryable:!0}};h.warn("setup","\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\uFF0Csetup \u7EE7\u7EED",c.details),console.log(`\u26A0 ${c.message}`),i.push(c)}a(yb,"applyFormShare");async function wb(t,e,n,r,o,i,s,c){let l=new Set(o),d=[],u=[],f=o.length===0;for(let[y,w]of i){if(w===c&&f)continue;let b=s.get(y);if(bb(b)){u.push(w);continue}l.has(y)?d.push(w):u.push(w)}let p=await JM(t,e,n,r),g=p?d.filter(y=>!p.has(y)):d,m=p?u.filter(y=>p.has(y)):u;for(let y of g)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","false","--yes"],{timeoutMs:3e4}).catch(w=>{h.warn("setup",`form field unhide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});for(let y of m)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","true","--yes"],{timeoutMs:3e4}).catch(w=>{h.warn("setup",`form field hide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})}),await t.runJson(["aitable","form","field","update","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--required","false","--yes"],{timeoutMs:3e4}).catch(w=>{h.warn("setup",`form field required=false \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});h.info("setup",`\u8868\u5355\u5B57\u6BB5\u540C\u6B65\u5B8C\u6210: viewId=${r}`,{mode:p?"incremental":"full",shown:g.length,hidden:m.length,skipped:d.length-g.length+(u.length-m.length)})}a(wb,"syncFormFieldVisibility");async function JM(t,e,n,r){let o;try{o=await t.runJson(["aitable","form","field","list","--base-id",e,"--table-id",n,"--view-id",r],{timeoutMs:3e4})}catch(c){h.warn("setup","form field list \u5931\u8D25\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r,error:c instanceof Error?c.message:String(c)});return}let i=ZM(o);if(!i){h.warn("setup","form field list \u8FD4\u56DE\u4E2D\u672A\u627E\u5230\u5B57\u6BB5\u6570\u7EC4\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}let s=new Map;for(let c of i){if(!S(c))continue;let l=typeof c.fieldId=="string"?c.fieldId.trim():"";l&&s.set(l,c.required===!0)}if(i.length>0&&s.size===0){h.warn("setup","form field list \u8FD4\u56DE\u5F62\u72B6\u4E0D\u7B26\u9884\u671F\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}return s}a(JM,"fetchFormVisibleFields");function ZM(t){let e=ye(t);if(Array.isArray(e))return e;if(!S(e))return;let n=["formFields","fields","items","list","records","results"];for(let r of n){let o=e[r];if(Array.isArray(o))return o}for(let r of Object.values(e))if(S(r))for(let o of n){let i=r[o];if(Array.isArray(i))return i}}a(ZM,"extractFormFieldArray");function YM(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(YM,"isSystemReadonlyFieldType");function bb(t){return YM(t)||t==="formula"||t==="lookup"||t==="filterUp"}a(bb,"isFormExcludedFieldType");async function QM(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}h.info("setup",`\u521B\u5EFA\u89C6\u56FE: ${r.name} (${r.type})`);let c=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Eu(r.type),"--yes"],{timeoutMs:6e4}),l=await $u(t,e,n,r.name);if(!l)throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"`);s.set(r.name,l);let d=Ta(c)||String(l.viewId??"");if(d&&r.visible_fields?.length){let u=Pu(r.visible_fields,o,i);u.length>0&&await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",d,"--config",JSON.stringify({visibleFieldIds:u}),"--yes"],{timeoutMs:6e4})}console.log(`\u2713 \u5DF2\u521B\u5EFA\u89C6\u56FE: "${r.name}" (${r.type})`)}a(QM,"applyGenericView");async function _a(t,e,n){let r=await t.runJson(["aitable","view","get","--base-id",e,"--table-id",n]),o=S(r)&&S(r.data)?r.data:null,i=Array.isArray(o?.views)?kb(o.views):[];if(i.length>0)return i;try{let s=await XM(t,e,n);return s.length>0&&h.info("setup","view get \u672A\u8FD4\u56DE\u89C6\u56FE\uFF0C\u5DF2\u4ECE table get \u56DE\u9000\u8BFB\u53D6",{baseId:e,tableId:n,count:s.length}),s}catch(s){return h.warn("setup","table get \u56DE\u9000\u8BFB\u53D6\u89C6\u56FE\u5931\u8D25",{baseId:e,tableId:n,error:s instanceof Error?s.message:String(s)}),i}}a(_a,"fetchViews");async function XM(t,e,n){let r=await t.runJson(["aitable","table","get","--base-id",e]),o=S(r)&&S(r.data)?r.data:null,s=(Array.isArray(o?.tables)?o.tables:[]).find(l=>String(l.tableId??"")===n),c=Array.isArray(s?.views)?s.views:[];return kb(c)}a(XM,"fetchViewsFromTableList");function kb(t){return t.map(e=>{let n=e.viewType??e.type;return{...e,...n?{viewType:n}:{}}})}a(kb,"normalizeViews");async function eO(t,e,n,r){return(await _a(t,e,n)).find(i=>String(i.viewName??"")===r)??null}a(eO,"fetchViewByName");async function $u(t,e,n,r){for(let o=0;o<Ru;o++){let i=await eO(t,e,n,r);if(i)return i;o+1<Ru&&hb>0&&await Cu(hb)}return null}a($u,"fetchViewByNameWithRetry");function Pu(t,e,n){let r=[],o=new Set;n&&(r.push(n),o.add(n));for(let i of t){let s=e.get(i);s&&!o.has(s)&&(r.push(s),o.add(s))}return r}a(Pu,"resolveFieldIds");function Ta(t){return Au(t,["viewId","view_id"])||""}a(Ta,"extractViewId");function _u(t){return S(t)?t.success===!0?!0:S(t.data)?_u(t.data):S(t.result)?_u(t.result):!1:!1}a(_u,"hasSuccessSignal");function Au(t,e){if(Array.isArray(t)){for(let n of t){let r=Au(n,e);if(r)return r}return null}if(!S(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r;if(typeof r=="number")return String(r)}for(let n of Object.values(t)){let r=Au(n,e);if(r)return r}return null}a(Au,"findStringByKeys");function tO(t){let e=t.replace(/\s+/g," ").trim();return e.length<=180?e:`${e.slice(0,177)}...`}a(tO,"summarizeWarningReason");import{readFile as vb,writeFile as Sb}from"fs/promises";import Mu from"yaml";var nO=/^workflow:([A-Za-z0-9_-]+)\.tracker$/,Aa=15;async function Ou(t){let{workflowFilePath:e,recipeDir:n,workflow:r,settings:o,profile:i,dwsRunner:s,onProgress:c,workflowTrackers:l}=t,d=await vb(e,"utf8"),u=Mu.parse(d);if(!S(u))return 0;fO(u,l,i?.config);let f=Array.isArray(u.event_sources)?u.event_sources:[],p=Array.isArray(u.steps)?u.steps:[],g=[],m=new he({bin:o.tracker.dws_bin,timeoutMs:9e4,runner:s}),y=await ls({workflow:r,rawYaml:u,recipeDir:n,relPath:e,profile:i?{file:i.filePath,workflowId:i.workflowId,config:i.config}:void 0,onDefinitionLoadFailure:a((I,v)=>{throw new Error(`setup \u65E0\u6CD5\u52A0\u8F7D ${I}: ${v.message}`)},"onDefinitionLoadFailure")}),w=new Map(y.map(I=>[I.key,I]));for(let I of y){let v=dO(I);if(!v)continue;let{kind:k,path:R}=v,T=k==="eventSource"?rO(f,v):oO(p,v),_=k==="eventSource"?iO(i?.config,v.srcName):(v.stepId?i?.config.steps?.[v.stepId]:void 0)??{},C=Kn(T,R),E=Kn(_,R),F=S(E)?{...S(C)?C:{},...E}:S(C)?C:{};if(S(F.baseId)||S(F.tableId)){await c?.(`\u8DF3\u8FC7\u5F15\u7528\u8868\u300C${xb(I,R)}\u300D\uFF08workflow ref\uFF0C\u8FD0\u884C\u65F6\u89E3\u6790\uFF09`);continue}let W=typeof F.tableId=="string"?F.tableId.trim():"",P=w.get(I.key.replace(/\.tableId$/,".baseId")),O=sO(F,P,o),q=xb(I,R);if(W){await Ib(m,{baseId:O,tableId:W,name:q,setup:I.setup,onProgress:c});continue}await c?.(`\u6B63\u5728\u521B\u5EFA\u8F85\u52A9\u8868\u300C${q}\u300D`);let z=await aO(m,{baseId:O,name:q,setup:I.setup,onProgress:c}),K=v.inProfile;g.push({target:K?"profile":"workflow",basePath:v.basePath,baseId:O,tableId:z}),await c?.(`\u5DF2\u521B\u5EFA\u8F85\u52A9\u8868\u300C${q}\u300D: ${z}`)}if(g.length===0)return 0;let b=g.filter(I=>I.target==="workflow"),x=g.filter(I=>I.target==="profile");if(b.length>0){let I=Mu.parseDocument(d);for(let v of b)I.setIn([...v.basePath,"mode"],"owned"),I.setIn([...v.basePath,"baseId"],v.baseId),I.setIn([...v.basePath,"tableId"],v.tableId);await Sb(e,I.toString(),"utf8")}if(x.length>0&&i){let I=await vb(i.filePath,"utf8"),v=Mu.parseDocument(I);for(let k of x)v.setIn([...k.basePath,"mode"],"owned"),v.setIn([...k.basePath,"baseId"],k.baseId),v.setIn([...k.basePath,"tableId"],k.tableId);await Sb(i.filePath,v.toString(),"utf8")}return g.length}a(Ou,"setupSurfaceTables");function rO(t,e){let n;return e.idx!==void 0?n=S(t[e.idx])?t[e.idx]:void 0:e.srcName&&(n=t.find(r=>S(r)&&r.name===e.srcName)),n&&S(n.handler_config)?n.handler_config:{}}a(rO,"findEventSourceContainer");function oO(t,e){let n;return e.idx!==void 0?n=S(t[e.idx])?t[e.idx]:void 0:e.stepId&&(n=t.find(r=>S(r)&&r.id===e.stepId)),n&&S(n.config)?n.config:{}}a(oO,"findStepContainer");function iO(t,e){if(!t||!e)return{};let n=t.event_sources?.[e];if(!n)return{};let r=n.handler_config;return S(r)?r:{}}a(iO,"profileHandlerConfig");function sO(t,e,n){let r=typeof t.baseId=="string"?t.baseId.trim():"";if(r)return r;if(e?.defaultStrategy==="workflowTrackerBaseId")return n.tracker.base_id;throw new Error("owned tableRef \u7F3A\u5C11 baseId\uFF0C\u4E14\u672A\u58F0\u660E workflowTrackerBaseId \u9ED8\u8BA4\u503C\u7B56\u7565")}a(sO,"resolveSurfaceTableRefBaseId");async function aO(t,e){let n=e.setup?.tableSchema?.fields??[],{tableId:r,reused:o}=await ia(t,{baseId:e.baseId,name:e.name,fields:lO(e.setup).slice(0,Aa),onProgress:e.onProgress});if(o)return await Ib(t,{baseId:e.baseId,tableId:r,name:e.name,setup:e.setup,onProgress:e.onProgress}),r;let i=n.slice(Aa);return i.length>0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5269\u4F59\u5B57\u6BB5: ${i.map(s=>s.name).join(", ")}`),await Rb(t,{baseId:e.baseId,tableId:r,fields:i})),r}a(aO,"createSurfaceTable");async function Ib(t,e){let n=e.setup?.tableSchema?.fields??[];if(n.length===0)return;await e.onProgress?.(`\u6B63\u5728\u6821\u9A8C\u8F85\u52A9\u8868\u300C${e.name}\u300D\u7ED3\u6784`);let r=await Lt(t,e.baseId,e.tableId),o=new Map(r.map(l=>[l.fieldName,l])),i=[];for(let l of n){let d=o.get(l.name);d&&(cO(l.type,d.type)||i.push(`\u300C${l.name}\u300D\u58F0\u660E\u4E3A ${l.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${d.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(i.length>0)throw new Error(`\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${i.join("; ")}`);let s=new Set(r.map(l=>l.fieldName)),c=n.filter(l=>!s.has(l.name));c.length!==0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5: ${c.map(l=>l.name).join(", ")}`),await Rb(t,{baseId:e.baseId,tableId:e.tableId,fields:c}))}a(Ib,"ensureSurfaceTableSchema");function cO(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(cO,"isSurfaceFieldTypeCompatible");async function Rb(t,e){for(let n=0;n<e.fields.length;n+=Aa){let r=e.fields.slice(n,n+Aa);await t.runJson(["aitable","field","create","--base-id",e.baseId,"--table-id",e.tableId,"--fields",JSON.stringify(uO(r)),"--timeout","60","--yes"],{timeoutMs:9e4})}}a(Rb,"createSurfaceFields");function lO(t){let e=t?.tableSchema?.fields??[];return e.length===0?[{fieldName:"\u6807\u9898",type:"primaryDoc"}]:e.map((n,r)=>{let o={fieldName:n.name,type:r===0&&n.type==="text"?"primaryDoc":n.type};return(n.type==="singleSelect"||n.type==="multipleSelect")&&n.options?.length&&(o.config={options:n.options.map(i=>({name:i}))}),o})}a(lO,"buildCreateFields");function dO(t){if(t.setup?.action!=="createTable"||!t.key.endsWith(".tableId")||t.source!=="eventSource.handler_config"&&t.source!=="step.config")return null;let e=t.writeTarget;if(e.type!=="yaml")return null;let n=e.yamlPath;if(n[n.length-1]!=="tableId")return null;let r=t.source==="eventSource.handler_config"?"eventSource":"step";return n[0]==="workflows"?r==="eventSource"?n[2]!=="event_sources"||n[4]!=="handler_config"?null:{kind:r,path:n.slice(5,-1).map(String),basePath:n.slice(0,-1),inProfile:!0,srcName:String(n[3])}:n[2]!=="steps"?null:{kind:r,path:n.slice(4,-1).map(String),basePath:n.slice(0,-1),inProfile:!0,stepId:String(n[3])}:r==="eventSource"?n[0]!=="event_sources"||typeof n[1]!="number"||n[2]!=="handler_config"?null:{kind:r,path:n.slice(3,-1).map(String),basePath:n.slice(0,-1),inProfile:!1,idx:n[1]}:n[0]!=="steps"||typeof n[1]!="number"||n[2]!=="config"?null:{kind:r,path:n.slice(3,-1).map(String),basePath:n.slice(0,-1),inProfile:!1,idx:n[1]}}a(dO,"parseTableIdSurface");function xb(t,e){let n=t.setup?.tableName?.trim();return n||t.label.replace(/ 的 Table ID.*/,"")||e.join(".")}a(xb,"tableNameFromSurface");function uO(t){return t.map(e=>{let n={fieldName:e.name,type:e.type};return(e.type==="singleSelect"||e.type==="multipleSelect")&&e.options?.length&&(n.config={options:e.options.map(r=>({name:r}))}),n})}a(uO,"buildFieldCreateFields");function fO(t,e,n){if(!e||e.size===0)return;let r=Array.isArray(t.event_sources)?t.event_sources:[];for(let o=0;o<r.length;o++){let i=S(r[o])?r[o]:{};if(i.type!=="aitable_record")continue;let s=S(i.config)?i.config:{},c=typeof i.name=="string"?i.name:void 0,l=c?n?.event_sources?.[c]:void 0,{handler_config:d,...u}=l??{},p={...s,...u}.source_table;if(!S(p)||p.mode!=="reference")continue;let g=typeof p.ref=="string"?p.ref.trim():"",m=nO.exec(g);if(!m)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${g||"\u7A7A"}\uFF09\uFF0C\u5E94\u4E3A workflow:<workflowId>.tracker`);let y=m[1],w=e.get(y);if(!w)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300D`);if(!w.base_id||!w.table_id)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300Dtracker \u672A\u914D\u7F6E\u5B8C\u6574\uFF08base_id/table_id \u4E3A\u7A7A\uFF09`)}}a(fO,"validateSourceTableReferences");import{existsSync as pO,mkdirSync as gO,readdirSync as mO,readFileSync as Ab,renameSync as hO,writeFileSync as Eb,unlinkSync as Db}from"fs";import Un from"path";var $b=Un.join(".aitable-workflow","automation-state.json");function yO(t,e){let n=Un.join(t,$b);try{let r=JSON.parse(Ab(n,"utf8"));if(r.version!==1||r.baseId!==e||!S(r.entries))return{version:1,baseId:e,entries:{}};let o={};for(let[i,s]of Object.entries(r.entries))S(s)&&typeof s.flowId=="string"&&typeof s.name=="string"&&(o[i]={flowId:s.flowId,name:s.name});return{version:1,baseId:e,entries:o}}catch{return{version:1,baseId:e,entries:{}}}}a(yO,"readAutomationState");function Pb(t,e,n){let r=Un.join(t,$b),o=`${r}.tmp`;try{gO(Un.dirname(r),{recursive:!0}),Eb(o,`${JSON.stringify(e,null,2)}
625
- `,"utf8"),hO(o,r)}catch(i){try{Db(o)}catch{}n(`\u81EA\u52A8\u5316\u6E05\u5355\u5199\u5165\u5931\u8D25\uFF08\u672C\u8F6E\u8FDC\u7AEF\u7ED3\u679C\u5DF2\u4FDD\u7559\uFF09: ${i instanceof Error?i.message:String(i)}`)}}a(Pb,"writeAutomationState");var Ea=15,wO=/^([A-Za-z][A-Za-z0-9_]*)_(.+)$/,bO=/<[^<>]+_viewId>/;function Cb(t){return`https://docs.dingtalk.com/i/nodes/${t.baseId}?iframeQuery=sheetId%3D${t.tableId}`}a(Cb,"tableUrl");function kO(t,e){return t.find(r=>r.fieldName===e)?.fieldId??null}a(kO,"resolveFieldId");function Mb(t){return t.includes("\u540D\u79F0\u91CD\u590D")||t.includes("\u5DF2\u5B58\u5728")||t.includes("already exist")||t.includes("duplicate")}a(Mb,"isAlreadyExists");async function vO(t,e,n){let r=new Map,o=100,i=0;try{for(let s=0;s<50;s++){let c=await t.runJson(["aitable","workflow","list","--base-id",e,"--limit",String(o),"--offset",String(i),"--yes"],{timeoutMs:3e4}),l=S(c)&&S(c.data)&&Array.isArray(c.data.list)?c.data.list:[];for(let d of l){if(!S(d))continue;let u=typeof d.name=="string"?d.name:"",f=typeof d.flowId=="string"?d.flowId:typeof d.workflowId=="string"?d.workflowId:"";u&&f&&r.set(u,f)}if(l.length<o)break;i+=o}}catch(s){n?.(`\u5217\u51FA\u5DF2\u6709\u6D41\u7A0B\u5931\u8D25\uFF0C\u9000\u5316\u4E3A\u53EA create: ${s instanceof Error?s.message:String(s)}`)}return r}a(vO,"listExistingFlows");async function Fo(t){let{dws:e,baseId:n,flowId:r,dslName:o,enable:i,log:s}=t;try{await e.runJson(["aitable","workflow",i?"enable":"disable","--base-id",n,"--workflow-id",r,"--yes"],{timeoutMs:3e4})}catch(c){s(`${i?"\u542F\u7528":"\u505C\u7528"} ${o} \u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}a(Fo,"alignFlowState");function SO(t){let e=S(t)&&S(t.data)?t.data:S(t)?t:null;if(!e||e.valid!==!1)return null;let r=(Array.isArray(e.issues)?e.issues:[]).filter(S).map(o=>{let i=typeof o.path=="string"?o.path:"",s=typeof o.message=="string"?o.message:String(o.code??"\u672A\u77E5\u95EE\u9898");return i?`${i}: ${s}`:s});return r.length>0?`DSL \u6821\u9A8C\u5931\u8D25 \u2014 ${r.join("; ")}`:"DSL \u6821\u9A8C\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u5177\u4F53\u539F\u56E0\uFF09"}a(SO,"extractValidationError");function Tb(t,e,n){let r=n?t.filter(o=>o.fieldName===n):t;for(let o of r){if(!o.options.length)continue;let i=o.options.find(s=>s.name===e);if(i)return i.id}return null}a(Tb,"resolveOptionId");function xO(t){let e=new Map,n=[];if(!S(t))return{decls:e,errors:n};for(let[r,o]of Object.entries(t)){if(!S(o)){n.push(`_tables.${r} \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}if(r==="tracker"&&o.ref!=="tracker"){n.push('_tables.tracker \u53EA\u80FD\u58F0\u660E\u4E3A { ref: "tracker" }');continue}if(o.ref==="tracker"){e.set(r,{ref:"tracker"});continue}let i=typeof o.name=="string"?o.name.trim():"";if(!i){n.push(`_tables.${r} \u9700\u8981 name\uFF08\u8868\u540D\uFF09\u6216 ref: "tracker"`);continue}e.set(r,{name:i,fields:IO(o.fields,r,n)})}return{decls:e,errors:n}}a(xO,"parseTableDecls");function IO(t,e,n){if(t===void 0)return[];if(!Array.isArray(t))return n.push(`_tables.${e}.fields \u5FC5\u987B\u662F\u6570\u7EC4`),[];let r=[];for(let o of t){if(!S(o))continue;let i=typeof o.name=="string"?o.name.trim():"",s=typeof o.type=="string"?o.type.trim():"";if(!i||!s){n.push(`_tables.${e}.fields \u4E2D\u6709\u6761\u76EE\u7F3A\u5C11 name \u6216 type`);continue}let c={name:i,type:s};Array.isArray(o.options)&&(c.options=o.options.map(l=>String(l))),S(o.config)&&(c.config=o.config),r.push(c)}return r}a(IO,"parseDeclFields");async function RO(t){let{dws:e,baseId:n,tracker:r,decls:o,cache:i,onProgress:s}=t,c=new Map([["tracker",r]]),l=[];for(let[d,u]of o){if("ref"in u){c.set(d,r);continue}let f=`${n}::${u.name}`,p=i.get(f);if(p){c.set(d,p);continue}try{let g=await CO(e,{baseId:n,name:u.name,fields:u.fields??[],onProgress:s});i.set(f,g),c.set(d,g)}catch(g){l.push(`\u4F9D\u8D56\u8868\u300C${u.name}\u300D\u51C6\u5907\u5931\u8D25: ${g instanceof Error?g.message:String(g)}`)}}return{tables:c,errors:l}}a(RO,"resolveDeclaredTables");async function CO(t,e){let{baseId:n,name:r,fields:o,onProgress:i}=e,{tableId:s,reused:c}=await ia(t,{baseId:n,name:r,fields:AO(o).slice(0,Ea),onProgress:i});if(c)await TO(t,{baseId:n,tableId:s,name:r,fields:o,onProgress:i});else{i?.(`\u81EA\u52A8\u5316\u4F9D\u8D56\u8868\u300C${r}\u300D: \u5DF2\u521B\u5EFA ${s}`);let l=o.slice(Ea);l.length>0&&(i?.(`\u6B63\u5728\u8865\u9F50\u4F9D\u8D56\u8868\u300C${r}\u300D\u5269\u4F59\u5B57\u6BB5: ${l.map(d=>d.name).join(", ")}`),await Ob(t,n,s,l))}return{baseId:n,tableId:s,label:r,fields:await Ar(t,n,s)}}a(CO,"ensureDeclaredTable");async function TO(t,e){if(e.fields.length===0)return;let n=await Lt(t,e.baseId,e.tableId),r=new Map(n.map(c=>[c.fieldName,c])),o=[];for(let c of e.fields){let l=r.get(c.name);l&&(_O(c.type,l.type)||o.push(`\u300C${c.name}\u300D\u58F0\u660E\u4E3A ${c.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${l.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(o.length>0)throw new Error(`\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${o.join("; ")}`);let i=new Set(n.map(c=>c.fieldName)),s=e.fields.filter(c=>!i.has(c.name));s.length!==0&&(e.onProgress?.(`\u6B63\u5728\u4E3A\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u8865\u9F50\u5B57\u6BB5: ${s.map(c=>c.name).join(", ")}`),await Ob(t,e.baseId,e.tableId,s))}a(TO,"ensureFields");function _O(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(_O,"isFieldTypeCompatible");async function Ob(t,e,n,r){for(let o=0;o<r.length;o+=Ea)await t.runJson(["aitable","field","create","--base-id",e,"--table-id",n,"--fields",JSON.stringify(r.slice(o,o+Ea).map(jb)),"--timeout","60","--yes"],{timeoutMs:9e4})}a(Ob,"createFields");function AO(t){return t.length===0?[{fieldName:"\u6807\u9898",type:"primaryDoc"}]:t.map((e,n)=>{let r=jb(e);return n===0&&e.type==="text"&&(r.type="primaryDoc"),r})}a(AO,"buildCreateFields");function jb(t){let e={fieldName:t.name,type:t.type},n={...t.config??{}};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),Object.keys(n).length>0&&(e.config=n),e}a(jb,"fieldPayload");function EO(t,e,n=new Map){let r=[],o=new Set,i=a(c=>{o.has(c)||(o.add(c),r.push(c))},"fail");return{resolved:t.replace(/<([^<>]+)>/g,(c,l)=>{if(l==="sheetId")return e.tableId;if(l==="table_url")return Cb(e);for(let[d,u]of[["_sheetId",f=>f.tableId],["_table_url",f=>Cb(f)]]){if(!l.endsWith(d))continue;let f=l.slice(0,-d.length),p=n.get(f);return p?u(p):(i(`\u8868\u524D\u7F00\u300C${f}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),c)}if(l.endsWith("_fieldId")){let d=ju(l.slice(0,-8),n,e,i);if(!d)return c;let u=kO(d.table.fields,d.rest);return u||(i(`\u5B57\u6BB5\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u4E0D\u5B58\u5728`),c)}if(l.endsWith("_optionId")){let d=ju(l.slice(0,-9),n,e,i);if(!d)return c;let u=DO(d.table,d.rest);return u||(i(`\u9009\u9879\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u672A\u627E\u5230`),c)}if(l.endsWith("_viewId")){let d=ju(l.slice(0,-7),n,e,i);if(!d)return c;let u=d.table.views??[],f=u.find(p=>p.viewName===d.rest);return f?f.viewId:(i(`\u89C6\u56FE\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u4E0D\u5B58\u5728\uFF08\u73B0\u6709\u89C6\u56FE\uFF1A${u.map(p=>p.viewName).join("\u3001")||"\u672A\u8BFB\u5230\u4EFB\u4F55\u89C6\u56FE"}\uFF09`),c)}return c}),errors:r}}a(EO,"resolvePlaceholders");function ju(t,e,n,r){let o=[...e.keys()].filter(c=>t.startsWith(`${c}_`)).sort((c,l)=>l.length-c.length)[0];if(o)return{table:e.get(o),rest:t.slice(o.length+1)};if(e.size===1&&e.has("tracker"))return{table:n,rest:t};let i=wO.exec(t);if(!i)return{table:n,rest:t};let[,s]=i;return r(`\u8868\u524D\u7F00\u300C${s}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),null}a(ju,"locate");function DO(t,e){let n=e.lastIndexOf("_");if(n>0){let r=Tb(t.fields,e.slice(n+1),e.slice(0,n));if(r)return r}return Tb(t.fields,e)}a(DO,"resolveOptionIdFlexible");async function Fu(t){let{configDir:e,baseId:n,tableId:r,dws:o,enabled:i,onProgress:s}=t,c=s??(()=>{}),l=Un.resolve(e,"automations"),d={deployed:[],updated:[],skipped:[],disabled:[],failed:[]},u=yO(e,n);if(!pO(l))return await _b({configDir:e,baseId:n,dws:o,previousState:u,result:d,log:c}),d;let f=mO(l).filter(b=>b.endsWith(".json"));if(f.length===0)return await _b({configDir:e,baseId:n,dws:o,previousState:u,result:d,log:c}),d;c(`\u53D1\u73B0 ${f.length} \u4E2A\u81EA\u52A8\u5316 DSL \u6587\u4EF6`);let p={baseId:n,tableId:r,label:"\u5DE5\u4F5C\u6D41\u8BB0\u5F55\u8868",fields:await Ar(o,n,r)};c(`\u5DF2\u83B7\u53D6\u8868\u7ED3\u6784: ${p.fields.length} \u4E2A\u5B57\u6BB5`);let g=new Map,m=await vO(o,n,c);m.size>0&&c(`\u5DF2\u5217\u51FA ${m.size} \u4E2A\u5DF2\u6709\u6D41\u7A0B\uFF0C\u540C\u540D\u6D41\u7A0B\u5C06\u81EA\u52A8 update`);let y={version:1,baseId:n,entries:{...u.entries}},w=new Set;for(let b of f){let x=Un.join(l,b),I;try{I=Ab(x,"utf-8")}catch{d.failed.push({name:b,error:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"});continue}let v;try{v=JSON.parse(I)}catch{d.failed.push({name:b,error:"JSON \u89E3\u6790\u5931\u8D25"});continue}let k=String(v.name??b),R=b.replace(/\.json$/,"");w.add(R);let T=u.entries[R];if(i?.[R]===!1){let K=T?.flowId??m.get(k);K?(await Fo({dws:o,baseId:n,flowId:K,dslName:k,enable:!1,log:c}),c(`\u5DF2\u505C\u7528: ${k}\uFF08\u914D\u7F6E ${R}: false\uFF09`)):c(`\u672A\u90E8\u7F72: ${k}\uFF08\u914D\u7F6E ${R}: false\uFF09`),T&&(y.entries[R]={flowId:T.flowId,name:k}),d.disabled.push(k);continue}let{decls:_,errors:C}=xO(v._tables);if(delete v._deploy_notes,delete v._tables,C.length>0){c(`\u8DF3\u8FC7 ${k}: ${C.join("; ")}`),d.skipped.push(k);continue}let{tables:E,errors:F}=await RO({dws:o,baseId:n,tracker:p,decls:_,cache:g,onProgress:s});if(F.length>0){c(`\u8DF3\u8FC7 ${k}: ${F.join("; ")}`),d.skipped.push(k);continue}let W=JSON.stringify(v,null,2);if(bO.test(W))for(let K of new Set([p,...E.values()]))await $O(o,K);let{resolved:P,errors:O}=EO(W,p,E);if(O.length>0){c(`\u8DF3\u8FC7 ${k}: ${O.join("; ")}`),d.skipped.push(k);continue}if(P.includes("<")&&/<[^>]+>/.test(P)){let K=P.match(/<[^>]+>/g)??[];c(`\u8DF3\u8FC7 ${k}: \u4ECD\u6709\u672A\u89E3\u6790\u5360\u4F4D\u7B26 ${K.slice(0,3).join(", ")}`),d.skipped.push(k);continue}let q=Un.join(l,`.${b}.resolved.tmp`);Eb(q,P,"utf-8");let z=T?.flowId;try{let K=await PO({dws:o,baseId:n,dslName:k,tmpFile:q,existing:m,existingId:z,result:d,log:c});K&&(y.entries[R]={flowId:K,name:k})}catch(K){let G=K instanceof Error?K.message:String(K);Mb(G)?(c(`\u8DF3\u8FC7 ${k}\uFF08\u5DF2\u5B58\u5728\uFF0Clist \u672A\u547D\u4E2D\u4F46 create \u62A5\u91CD\u540D\uFF09`),d.skipped.push(k)):(c(`\u90E8\u7F72\u5931\u8D25 ${k}: ${G}`),d.failed.push({name:k,error:G}))}finally{try{Db(q)}catch{}}}for(let[b,x]of Object.entries(u.entries))w.has(b)||(await Fo({dws:o,baseId:n,flowId:x.flowId,dslName:x.name,enable:!1,log:c}),c(`\u5DF2\u505C\u7528\u9648\u65E7\u81EA\u52A8\u5316: ${x.name}\uFF08\u672C\u5730\u6587\u4EF6\u5DF2\u5220\u9664\uFF09`),d.disabled.push(x.name),delete y.entries[b]);return Pb(e,y,c),d}a(Fu,"setupAutomations");async function _b(t){let{configDir:e,baseId:n,dws:r,previousState:o,result:i,log:s}=t;if(Object.keys(o.entries).length!==0){for(let c of Object.values(o.entries))await Fo({dws:r,baseId:n,flowId:c.flowId,dslName:c.name,enable:!1,log:s}),s(`\u5DF2\u505C\u7528\u9648\u65E7\u81EA\u52A8\u5316: ${c.name}\uFF08\u672C\u5730\u6587\u4EF6\u5DF2\u5220\u9664\uFF09`),i.disabled.push(c.name);Pb(e,{version:1,baseId:n,entries:{}},s)}}a(_b,"disableRemovedAutomations");async function $O(t,e){if(!e.views)try{let n=await _a(t,e.baseId,e.tableId);e.views=n.map(r=>({viewId:String(r.viewId??""),viewName:String(r.viewName??"")})).filter(r=>r.viewId&&r.viewName)}catch{e.views=[]}}a($O,"ensureViews");async function PO(t){let{dws:e,baseId:n,dslName:r,tmpFile:o,existing:i,result:s,log:c}=t,l=t.existingId??i.get(r),d=l?["aitable","workflow","update","--base-id",n,"--workflow-id",l,"--dsl",`@${o}`]:["aitable","workflow","create","--base-id",n,"--dsl",`@${o}`],u=await e.runJson(d,{timeoutMs:6e4}),f=SO(u);if(f)return Mb(f)?(c(`\u8DF3\u8FC7 ${r}\uFF08\u540C\u540D\u5DF2\u5B58\u5728\uFF0Cupdate \u4ECD\u62A5\u91CD\u590D\uFF09`),s.skipped.push(r),null):(c(`${l?"\u66F4\u65B0":"\u90E8\u7F72"}\u5931\u8D25 ${r}: ${f}`),s.failed.push({name:r,error:f}),null);if(l)return c(`\u5DF2\u66F4\u65B0: ${r}`),s.updated.push(r),i.delete(r),await Fo({dws:e,baseId:n,flowId:l,dslName:r,enable:!0,log:c}),l;{c(`\u5DF2\u90E8\u7F72: ${r}`),s.deployed.push(r);let p=MO(u);return p&&await Fo({dws:e,baseId:n,flowId:p,dslName:r,enable:!0,log:c}),p||null}}a(PO,"publishFlow");function MO(t){let e=S(t)&&S(t.data)?t.data:S(t)?t:null;return e?typeof e.flowId=="string"?e.flowId:typeof e.workflowId=="string"?e.workflowId:"":""}a(MO,"extractFlowId");async function NO(t){let{configPath:e,settings:n,onProgress:r}=t,o=n.tracker.base_id?.trim();if(o&&o!=="__placeholder__")return{baseId:o,created:!1};if(n.multiWorkflow){let f=await BO(n);if(f)return await Nu(n,f),await r?.(`\u590D\u7528 workflow.yml \u5DF2\u58F0\u660E\u7684 AI \u8868\u683C\uFF1A${f}`,"create_base"),{baseId:f,created:!1}}let i=Dr.dirname(await Ue(e)),s=typeof n.raw?.default_base_id=="string"?n.raw.default_base_id.trim():"";if(s)return await Nu(n,s),await r?.(`\u91C7\u7528 config.yml \u7684\u9879\u76EE\u7EA7\u9ED8\u8BA4 AI \u8868\u683C\uFF1A${s}`,"create_base"),{baseId:s,created:!1};let c=LO(n.raw?.base_name??Dr.basename(i)),l=new he({bin:n.tracker.dws_bin,timeoutMs:6e4});await r?.(`tracker.base_id \u4E3A\u7A7A\uFF0C\u6B63\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C\uFF1A${c}`,"create_base");let d=await l.runJson(["aitable","base","create","--name",c,"--yes"],{timeoutMs:9e4}),u=WO(d);if(!u)throw Object.assign(new Error("dws \u521B\u5EFA AI \u8868\u683C\u672A\u8FD4\u56DE baseId"),{code:"BASE_ID_NOT_RETURNED",details:{response:d}});return await r?.(`AI \u8868\u683C\u5DF2\u521B\u5EFA\uFF1A${u}`,"create_base"),await Nu(n,u,{clearStaleTableIds:!0}),{baseId:u,created:!0}}a(NO,"ensureBaseExists");function LO(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"AI \u8868\u683C\u5DE5\u4F5C\u6D41"}a(LO,"sanitizeBaseName");function WO(t){if(S(t)){let e=t.data;if(S(e)){let n=e.baseId??e.base_id??e.id;if(typeof n=="string"&&n.trim())return n.trim()}}return null}a(WO,"findBaseId");async function BO(t){for(let e of t.workflowEntries)try{let n=Lb.parse(await Nb(e.templatePath,"utf8")),r=S(n?.tracker)?n.tracker:null,o=typeof r?.base_id=="string"?r.base_id.trim():"";if(o&&o!=="__placeholder__")return o}catch{}return null}a(BO,"findBaseIdInWorkflows");async function Nu(t,e,n){let r=n?.clearStaleTableIds===!0;if(!t.multiWorkflow){let i=await Ue(t.configDir);await Fb(i,e,r);return}let o=new Set;for(let i of t.workflowEntries)o.has(i.templatePath)||(o.add(i.templatePath),await Fb(i.templatePath,e,r))}a(Nu,"writeBaseIdToWorkflows");async function Fb(t,e,n){if(!n){await Ns(t,["tracker","base_id"],e);return}let r="";try{r=await Nb(t,"utf8")}catch{}let o=Lb.parseDocument(r);o.setIn(["tracker","base_id"],e),o.getIn(["tracker","table_id"])!==void 0&&o.setIn(["tracker","table_id"],""),await jO(t,o.toString(),"utf8")}a(Fb,"writeBaseIdWithOptionalTableClear");async function hX(t){let e=await je(t.config,{lenientEnv:!0}),n=await Ue(t.config),r=t.only==="automations";if(!r){let{baseId:f}=await NO({configPath:t.config,settings:e,onProgress:a(p=>console.log(` \u2022 ${p}`),"onProgress")});e.tracker.base_id!==f&&(e=await je(t.config,{lenientEnv:!0}))}let o=[];for(let f of e.workflowEntries){let p=await He(f.templatePath,{envSource:e.envSource}),g=Gi(e,p.tracker);if(!g)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${f.id}\u300D\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09`);let m=g===e.tracker?n:f.templatePath;o.push({entry:f,workflow:p,trackerConfig:g,trackerFilePath:m})}let i=new Map,s=new Set;for(let f of o){if(r){i.set(f.entry.id,Dn(e,f.entry,f.trackerConfig));continue}console.log(`
626
- \u25B6 \u521D\u59CB\u5316\u5DE5\u4F5C\u6D41\u300C${f.entry.id}\u300D\uFF08${f.workflow.meta.name}\uFF09`);let p=Dn(e,f.entry,f.trackerConfig);p.tracker.table_id.trim()||s.add(f.entry.id),p=await zd({trackerFilePath:f.trackerFilePath,settings:p,workflow:f.workflow,onProgress:a(g=>console.log(` \u2022 ${g}`),"onProgress")}),i.set(f.entry.id,p)}let c=new Map;for(let f of o){let p=i.get(f.entry.id);c.set(f.entry.id,{base_id:p.tracker.base_id,table_id:p.tracker.table_id})}let l=new Map;for(let f of o){let p=i.get(f.entry.id),{base_id:g,table_id:m}=p.tracker;if(g&&m){let y=new he({bin:p.tracker.dws_bin});await Ao(y,g,m,l)}}Pn();let d=lt(e.configDir,e.envSource),u=Dr.resolve(e.configDir,"profile","profile.yml");for(let f of r?[]:o){let p=i.get(f.entry.id),g=d?.workflows?.[f.entry.id],m=await Ou({workflowFilePath:f.entry.templatePath,recipeDir:f.entry.recipeDir,workflow:f.workflow,settings:p,profile:g?{filePath:u,workflowId:f.entry.id,config:g}:void 0,workflowTrackers:c,onProgress:a(y=>console.log(` \u2022 ${y}`),"onProgress")});m>0&&console.log(` \u2022 \u5DF2\u81EA\u52A8\u521B\u5EFA ${m} \u4E2A\u8F85\u52A9\u8868`)}for(let f of r?[]:o){let p=i.get(f.entry.id);await Du({settings:p,workflow:f.workflow,cleanEmptyRows:t.clean!==!1,tableJustCreated:s.has(f.entry.id)})}for(let f of o){let p=i.get(f.entry.id),{base_id:g,table_id:m,dws_bin:y}=p.tracker;if(!g||!m){if(r)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${f.entry.id}\u300D\u7684 tracker.base_id/table_id \u4E3A\u7A7A\uFF0C--only automations \u9700\u8981\u5148\u5B8C\u6210\u4E00\u6B21\u5B8C\u6574 setup`);continue}let w=Dr.dirname(f.entry.templatePath),b=new he({bin:y}),x=d?.workflows?.[f.entry.id]?.automations,I=await Fu({configDir:w,baseId:g,tableId:m,dws:b,...x?{enabled:x}:{},onProgress:a(k=>console.log(` \u2022 ${k}`),"onProgress")});I.deployed.length+I.updated.length+I.skipped.length+I.disabled.length+I.failed.length>0&&console.log(` \u2022 \u81EA\u52A8\u5316: ${I.deployed.length} \u90E8\u7F72, ${I.updated.length} \u66F4\u65B0, ${I.disabled.length} \u5173\u95ED, ${I.skipped.length} \u8DF3\u8FC7, ${I.failed.length} \u5931\u8D25`)}if(t.kb!==!1&&!r){await zO(e.configDir);try{let f=await jd({settings:e,...t.kbFull?{force:!0}:{},onProgress:ru});ou(f)}catch(f){if(f instanceof xr)throw f;console.log(`\u26A0 \u77E5\u8BC6\u5E93\u7F16\u8BD1\u8DF3\u8FC7\uFF08\u975E\u81F4\u547D\uFF09: ${f instanceof Error?f.message:String(f)}`)}}}a(hX,"runSetupCommand");async function zO(t){let e=Dr.resolve(t,"lib","assemble.ts");if(OO(e))try{let n=await import(FO(e).href);if(typeof n.ensureAssembled!="function")return;let r=n.ensureAssembled(t,i=>console.log(` ${i}`)),o=r.issues.filter(i=>i.level==="error");if(o.length>0){console.log(`\u26A0 profile \u88C5\u914D\u6709 ${o.length} \u4E2A\u9519\u8BEF\uFF0CKB \u7F16\u8BD1\u53EF\u80FD\u4F7F\u7528\u4E0D\u5B8C\u6574\u7684\u914D\u7F6E`);for(let i of o)console.log(` \u2717 ${i.message}`)}else r.wrote.length>0&&console.log(`\u2713 profile \u88C5\u914D\u5B8C\u6210\uFF0C\u5DF2\u66F4\u65B0: ${r.wrote.map(i=>Dr.relative(t,i)).join(", ")}`)}catch(n){console.log(`\u26A0 \u65E0\u6CD5\u52A0\u8F7D lib/assemble.ts\uFF0C\u8DF3\u8FC7 profile \u88C5\u914D: ${n instanceof Error?n.message:String(n)}`)}}a(zO,"runEnsureAssembled");import{mkdir as Wb,readFile as UO,writeFile as Bb}from"fs/promises";import zb from"path";import Lu from"yaml";async function AX(t,e){let n=[],r=e.filter(d=>d.name?.trim()&&d.persona?.trim());if(r.length===0)return{written:!1,profilePath:t,roleIds:[],skippedKnowledgeBindings:n};let o=await UO(t,"utf8").then(d=>{try{return Lu.parse(d)}catch{return}},()=>{}),i=S(o)?{...o}:{},s=S(i.roles)?{...i.roles}:{},c=[],l=new Set;for(let d of r){let u=Wu(d.id||d.name),f=u;for(let p=2;l.has(f);p++)f=`${u}-${p}`;l.add(f),s[f]={name:d.name.trim(),persona:d.persona.trim()},c.push(f),d.knowledge&&d.knowledge.length>0&&n.push({roleId:f,knowledge:d.knowledge})}return i.schema_version=2,i.roles=s,await Wb(zb.dirname(t),{recursive:!0}),await Bb(t,Lu.stringify(i),"utf8"),{written:!0,profilePath:t,roleIds:c,skippedKnowledgeBindings:n}}a(AX,"writeProfileRoles");async function EX(t,e){await Wb(t,{recursive:!0});let n=[],r=[];for(let o of e){let i=KO(o),s=zb.join(t,`${i.id}.role.yml`),c=Lu.stringify(i);await Bb(s,c,"utf8"),n.push(s),o.knowledge&&o.knowledge.length>0&&r.push({roleId:i.id,knowledge:o.knowledge})}return{files:n,skippedKnowledgeBindings:r}}a(EX,"writeRoleDefinitions");function KO(t){let e={id:Wu(t.id||t.name),name:t.name||t.id||"\u672A\u547D\u540D\u89D2\u8272",persona:t.persona||"\u901A\u7528\u4E1A\u52A1\u6D41\u7A0B\u52A9\u624B",archetype:"task",skills:t.skills.map(n=>({id:Wu(n),name:n,description:""}))};return Qr.parse(e)}a(KO,"toRoleDefinition");function Wu(t){return t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"role"}a(Wu,"safeId");function Ub(t,e,n){let r=[],o=new Map(t.map(c=>[c.fieldName,c]));for(let c of e){if(c.type!=="singleSelect"&&c.type!=="multipleSelect"||!c.options||c.options.length===0)continue;let l=o.get(c.name);l&&l.type&&l.type!==c.type&&r.push({fieldName:c.name,configOptions:c.options,tableOptions:null,added:[],removed:[]})}let i=VO(n),s=e.find(c=>c.name==="\u72B6\u6001"||c.options?.some(l=>i.includes(l)));if(s?.options){let c=new Set(s.options),l=new Set(i),d=i.filter(f=>!c.has(f)),u=s.options.filter(f=>!l.has(f));(d.length>0||u.length>0)&&r.push({fieldName:s.name,configOptions:s.options,tableOptions:i,added:d,removed:u})}return{hasDrift:r.length>0,items:r}}a(Ub,"buildDriftReport");function VO(t){let e=new Set;e.add(t.initial);for(let n of t.active)e.add(n);for(let n of t.terminal)e.add(n);return t.blocked&&e.add(t.blocked),t.review&&e.add(t.review),[...e]}a(VO,"extractAllStates");import{readdir as qO,readFile as HO}from"fs/promises";import GO from"path";async function Kb(t,e){if(e.length===0)return[];let n=[],r;try{r=await qO(t)}catch{return[]}let o=r.filter(i=>i.endsWith(".recipe.ts")||i.endsWith(".ts"));for(let i of o){let s=GO.join(t,i),c;try{c=await HO(s,"utf8")}catch{continue}let l=c.split(`
624
+ \u{1F4A1} \u4F7F\u7528\u63D0\u793A:`),console.log(` \u7528\u6237\u53EA\u9700\u586B\u5199\u4E0A\u65B9 \u2713 \u6807\u8BB0\u7684 ${b.size} \u4E2A\u5B57\u6BB5\uFF0C\u5176\u4F59\u5B57\u6BB5\u7531 AI \u81EA\u52A8\u586B\u5199\u3002`),T?.some(C=>C.type==="FormDesigner"&&C.id==="input_form")){let C=T.find(E=>E.id==="input_form");console.log(` \u63A8\u8350\u4F7F\u7528\u89C6\u56FE "${C?.name}" \u65B0\u5EFA\u5DE5\u5355\u3002`)}return{warnings:l}}a(Du,"initTable");function Cu(t){return new Promise(e=>setTimeout(e,t))}a(Cu,"sleep");async function MM(t,e,n){h.info("setup","\u68C0\u67E5\u7A7A\u767D\u884C");let r=await t.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--limit","100"]),o=Te(r),i=[];for(let s of o){if(!v(s))continue;let c=typeof s.recordId=="string"?s.recordId:null,l=v(s.cells)?s.cells:{},d=Object.values(l).some(u=>u!=null&&u!=="");c&&!d&&i.push(c)}i.length>0?(h.info("setup",`\u53D1\u73B0 ${i.length} \u6761\u7A7A\u767D\u884C\uFF0C\u5220\u9664\u4E2D`),await t.runJson(["aitable","record","delete","--base-id",e,"--table-id",n,"--record-ids",i.join(","),"--yes"]),console.log(`\u2713 \u5DF2\u6E05\u7406 ${i.length} \u6761\u7A7A\u767D\u884C`)):console.log("\u2713 \u65E0\u7A7A\u767D\u884C")}a(MM,"cleanupEmptyRows");function OM(t,e){for(let[n,r]of Object.entries(e))if(r===t)return n;return null}a(OM,"findRole");function jM(t){if(t instanceof ve){let e=t.stderr.trim(),n=typeof t.raw=="string"?t.raw.trim():"";return[t.message,e,n].filter(Boolean).join("\uFF1B")}return t instanceof Error?t.message:String(t)}a(jM,"describeViewError");async function FM(t,e,n,r,o,i,s,c){let l=new Map(r.map(S=>[S.fieldName,S.fieldId])),d=new Map(r.map(S=>[S.fieldName,S.type])),u=new Map(r.map(S=>[S.fieldName,S])),p=NM(r,s)?.fieldId??"",g=await _a(t,e,n),m=new Map(g.map(S=>[String(S.viewName??""),S])),y=WM(o,i),w=[],b=[],x=y.some(S=>S.type==="Grid"&&S.id==="default_grid"),I=!1;!x&&y.some(S=>S.type==="Grid")&&(h.warn("setup","tracker.views \u7F3A\u5C11 default_grid\uFF0C\u9996\u4E2A Grid \u5C06\u517C\u5BB9\u590D\u7528\u9ED8\u8BA4\u89C6\u56FE"),console.log('\u26A0 tracker.views \u7F3A\u5C11 id="default_grid"\uFF1B\u9996\u4E2A Grid \u5C06\u517C\u5BB9\u590D\u7528\u9ED8\u8BA4\u89C6\u56FE\uFF0C\u5EFA\u8BAE\u8865\u9F50\u8BE5\u58F0\u660E'));for(let S of y){S.filter?.length&&S.type!=="Grid"&&(h.warn("setup",`\u89C6\u56FE "${S.name}" \u975E Grid \u89C6\u56FE\uFF0Cfilter \u58F0\u660E\u88AB\u5FFD\u7565`,{type:S.type}),console.log(`\u26A0 \u89C6\u56FE "${S.name}"\uFF08${S.type}\uFF09\u6682\u4E0D\u652F\u6301\u58F0\u660E\u5F0F\u8FC7\u6EE4\uFF0C\u5DF2\u5FFD\u7565`));try{switch(S.type){case"Grid":{let k=S.id==="default_grid"||!x&&!I;k&&!x&&(I=!0),await BM(t,e,n,S,l,u,p,g,i,k,m);break}case"FormDesigner":await HM(t,e,n,S,l,d,p,m,c??!0,b);break;case"Kanban":case"Calendar":case"Gallery":case"Gantt":await QM(t,e,n,S,l,p,m);break}}catch(k){let R=jM(k);if(S.type==="FormDesigner"){let T={code:"FORM_VIEW_CREATE_FAILED",message:`\u8868\u5355\u89C6\u56FE "${S.name}" \u672A\u81EA\u52A8\u521B\u5EFA\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6DFB\u52A0\u8868\u5355\u89C6\u56FE\uFF08\u539F\u56E0\uFF1A${tO(R)}\uFF09`,details:{id:S.id,name:S.name,type:S.type,retryable:!0,errorDetail:R}};h.warn("setup","\u975E\u5173\u952E\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF0C\u7EE7\u7EED setup",{...T.details,error:R}),console.log(`\u26A0 ${T.message}`),console.log(` \u21B3 \u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u540D\u4E3A "${S.name}" \u7684\u8868\u5355\u89C6\u56FE`),b.push(T);continue}h.warn("setup",`\u89C6\u56FE "${S.name}" \u914D\u7F6E\u5931\u8D25`,{error:R}),console.log(`\u26A0 \u89C6\u56FE "${S.name}" \u521B\u5EFA\u5931\u8D25: ${R}`),w.push({id:S.id,name:S.name,type:S.type,errorMessage:R})}}if(w.length>0)throw Object.assign(new Error(`\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF1A${w.map(S=>S.name).join(", ")}`),{code:"VIEW_CREATE_FAILED",status:502,details:{requestedCount:y.length,failedCount:w.length,failedViews:w}});return b}a(FM,"configureViews");function NM(t,e){return t.find(n=>LM(n.type))??(e?t.find(n=>n.fieldName===e):void 0)??t[0]}a(NM,"resolvePrimaryField");function LM(t){let e=t.replace(/[_-]/g,"").toLowerCase();return e==="primarydoc"||e==="primary"}a(LM,"isPrimaryFieldType");function WM(t,e){let n=[],r=2;for(let o of t){if(!o.for_each_step){n.push(o);continue}let i=e.steps.filter(s=>o.for_each_step==="needs_human"?!!s.needs_human:!0);for(let s of i){let c=String.fromCodePoint(9311+r),l=Object.values(s.input_mapping??{}),d=Object.values(s.output_mapping??{});n.push({...o,id:`step_${s.id}`,name:`${c} ${s.name}`,visible_fields:[...l,...d],description:s.needs_human?.reason??o.description,for_each_step:void 0}),r++}}return n}a(WM,"expandForEachStep");async function BM(t,e,n,r,o,i,s,c,l,d,u){if(!d){await zM(t,e,n,r,o,i,s,u);return}let f=c.find(y=>y.viewType==="Grid");if(!f)return;let p=String(f.viewId??"");if(!p)return;let g=r.field_order?.length?r.field_order:qM(o,l),m=Pu(g,o,s);if(m.length>0){await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",p,"--config",JSON.stringify({visibleFieldIds:m}),"--yes"],{timeoutMs:6e4});let y=r.field_order?.length?"config":"\u81EA\u52A8\u63A8\u5BFC";console.log(`\u2713 \u5DF2\u91CD\u6392\u9ED8\u8BA4\u89C6\u56FE\u5217\u987A\u5E8F\uFF08${m.length} \u4E2A\u5B57\u6BB5\uFF0C\u6765\u6E90: ${y}\uFF09`)}await Tu(t,e,n,p,r.name,r,o,i)}a(BM,"applyGridView");async function zM(t,e,n,r,o,i,s,c){if(c.has(r.name)){await Tu(t,e,n,Ta(c.get(r.name)),r.name,r,o,i),console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}h.info("setup",`\u521B\u5EFA Grid \u89C6\u56FE: ${r.name}`);let l=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Eu("Grid"),"--yes"],{timeoutMs:6e4}),d=await $u(t,e,n,r.name);if(!d)throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"`);c.set(r.name,d);let u=Ta(l)||String(d.viewId??""),f=r.field_order?.length?r.field_order:r.visible_fields??[];if(u&&f.length){let p=Pu(f,o,s);p.length>0&&await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",u,"--config",JSON.stringify({visibleFieldIds:p}),"--yes"],{timeoutMs:6e4})}await Tu(t,e,n,u,r.name,r,o,i),console.log(`\u2713 \u5DF2\u521B\u5EFA Grid \u89C6\u56FE: "${r.name}"\uFF08${f.length} \u4E2A\u5B57\u6BB5\uFF09`)}a(zM,"applyAdditionalGridView");var UM=new Set(["singleselect","multipleselect"]);function KM(t){return t.replace(/[_-]/g,"").toLowerCase()}a(KM,"normalizeFieldType");function VM(t,e,n){if(!t?.length)return;let r=[];for(let o of t){let i=e.get(o.field);if(!i){h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u5B57\u6BB5\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u6761\u4EF6: ${o.field}`);continue}let s=n?.get(o.field),c=UM.has(KM(s?.type??"")),l=o.any_of?.length?o.any_of:typeof o.equals=="string"?[o.equals]:[];if(!l.length)continue;if(!c){if(l.length>1){h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u975E\u9009\u62E9\u578B\u5B57\u6BB5\u4E0D\u652F\u6301\u591A\u503C\uFF0C\u8DF3\u8FC7\u6761\u4EF6: ${o.field}`,{values:l});continue}r.push({fieldId:i,link:null,symbol:"EQ",value:l[0],valueType:"VALUE"});continue}let d=new Map((s?.options??[]).map(f=>[f.name,f.id])),u=[];for(let f of l){let p=d.get(f);if(!p){h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u9009\u9879\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u8BE5\u503C: ${o.field}=${f}`);continue}u.push(p)}u.length&&r.push({fieldId:i,link:null,symbol:"ANY_OF",value:u,valueType:"VALUE"})}return r.length?r:void 0}a(VM,"buildViewFilter");async function Tu(t,e,n,r,o,i,s,c){if(!r||!i.filter?.length)return!1;let l=VM(i.filter,s,c);if(!l)return!1;try{return await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",r,"--config",JSON.stringify({filter:l}),"--yes"],{timeoutMs:6e4}),console.log(`\u2713 \u5DF2\u5E94\u7528\u89C6\u56FE\u8FC7\u6EE4: "${o}"\uFF08${i.filter.length} \u4E2A\u6761\u4EF6\uFF09`),!0}catch(d){return h.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u4E0B\u53D1\u5931\u8D25\uFF08\u4E0D\u963B\u65AD\uFF09: ${o}`,{viewId:r,filter:JSON.stringify(l),error:d instanceof Error?d.message:String(d)}),console.log(`\u26A0 \u89C6\u56FE "${o}" \u8FC7\u6EE4\u4E0B\u53D1\u5931\u8D25\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u8BBE\u7F6E`),!1}}a(Tu,"applyViewFilter");function qM(t,e){let{userInput:n,output:r,other:o}=e.referencedFields,i=[],s=new Set;for(let c of n)t.has(c)&&!s.has(c)&&(i.push(c),s.add(c));for(let c of r)t.has(c)&&!s.has(c)&&(i.push(c),s.add(c));for(let c of o)t.has(c)&&!s.has(c)&&(i.push(c),s.add(c));for(let c of t.keys())s.has(c)||(i.push(c),s.add(c));return i}a(qM,"buildDefaultFieldOrder");async function HM(t,e,n,r,o,i,s,c,l,d){if(c.has(r.name)){console.log(`\u2713 \u8868\u5355\u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"\uFF0C\u540C\u6B65\u53EF\u89C1\u5B57\u6BB5`);let w=c.get(r.name),b=v(w)?String(w.viewId??w.id??""):"";b&&r.visible_fields?.length&&await wb(t,e,n,b,r.visible_fields,o,i,s),l&&b&&await yb(t,e,n,b,r,d);return}h.info("setup",`\u521B\u5EFA\u8868\u5355\u89C6\u56FE: ${r.name}`,{visibleFieldCount:r.visible_fields?.length??0,baseId:e,tableId:n});let u=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Eu("FormDesigner"),"--yes"],{timeoutMs:6e4}),f=Ta(u),p=_u(u);h.info("setup","\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u8FD4\u56DE",{name:r.name,viewId:f||void 0,success:p,rawResult:JSON.stringify(u).slice(0,2e3)});let g=await $u(t,e,n,r.name);if(!g){let w=JSON.stringify(u).slice(0,500);if(!f&&!p)throw new Error(`dws \u672A\u8FD4\u56DE\u53EF\u9A8C\u8BC1\u7684\u6210\u529F\u4FE1\u53F7\uFF08\u65E0 viewId\u3001\u65E0 success=true\uFF09\uFF0C\u8868\u5355\u89C6\u56FE "${r.name}" \u53EF\u80FD\u672A\u521B\u5EFA\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}\u3002\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u8868\u5355\u89C6\u56FE\uFF0C\u6216\u4F7F\u7528 dws aitable view create --verbose \u6392\u67E5`);let b=[f?`viewId=${f}`:"",p?"success=true":"",`\u5DF2\u91CD\u8BD5 ${Ru} \u6B21 view get`].filter(Boolean).join("\uFF1B");throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF08${b}\uFF09\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}`)}c.set(r.name,g);let m=f||String(g.viewId??"");m&&r.visible_fields?.length&&(await GM(t,e,n,m,r,o,i,s),await wb(t,e,n,m,r.visible_fields,o,i,s));let y=r.visible_fields?.length??0;if(console.log(`\u2713 \u5DF2\u521B\u5EFA\u8868\u5355\u89C6\u56FE: "${r.name}"\uFF08${y} \u4E2A\u5B57\u6BB5\uFF09`),l){let w=m||f||"";w&&await yb(t,e,n,w,r,d)}}a(HM,"applyFormView");async function GM(t,e,n,r,o,i,s,c){let l=o.visible_fields??[],d=[];c&&l.some(u=>i.get(u)===c)&&d.push(c);for(let u of l){if(bb(s.get(u)))continue;let f=i.get(u);f&&f!==c&&d.push(f)}d.length!==0&&(h.info("setup",`\u66F4\u65B0\u8868\u5355\u89C6\u56FE\u53EF\u89C1\u5B57\u6BB5: ${o.name}`,{viewId:r,visibleCount:d.length}),await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",r,"--config",JSON.stringify({visibleFieldIds:d}),"--yes"],{timeoutMs:6e4}).catch(u=>{h.warn("setup",`\u8868\u5355\u53EF\u89C1\u5B57\u6BB5\u4E00\u6B21\u6027\u4E0B\u53D1\u5931\u8D25\uFF0C\u6539\u7531\u9010\u5B57\u6BB5\u540C\u6B65\u5BF9\u9F50: ${o.name}`,{viewId:r,error:u instanceof Error?u.message:String(u)})}))}a(GM,"applyFormVisibleFieldIds");async function yb(t,e,n,r,o,i){let s=await Yo(t,e,n,r,{autoEnable:!0});if(s){console.log(`\u2713 \u5DF2\u5F00\u542F\u8868\u5355\u5206\u4EAB \u2192 ${s}`),console.log(" \uFF08\u94FE\u63A5\u4E0D\u5199\u5165\u914D\u7F6E\uFF0C\u8FD0\u884C\u671F\u81EA\u52A8\u89E3\u6790\uFF1B\u6B64\u5904\u4EC5\u4F9B\u6838\u5BF9\uFF09");return}let c={code:"FORM_SHARE_DISABLED",message:`\u8868\u5355\u89C6\u56FE "${o.name}" \u7684\u5206\u4EAB\u672A\u5F00\u542F\uFF0C\u8FD0\u884C\u671F\u89E3\u6790\u4E0D\u51FA\u8868\u5355\u94FE\u63A5\uFF08\u56DE\u590D\u91CC\u4E0D\u4F1A\u51FA\u73B0\u586B\u5355\u5165\u53E3\uFF09\uFF1B\u8BF7\u91CD\u8DD1 setup\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6253\u5F00\u8BE5\u8868\u5355\u7684\u5206\u4EAB`,details:{id:o.id,name:o.name,viewId:r,retryable:!0}};h.warn("setup","\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\uFF0Csetup \u7EE7\u7EED",c.details),console.log(`\u26A0 ${c.message}`),i.push(c)}a(yb,"applyFormShare");async function wb(t,e,n,r,o,i,s,c){let l=new Set(o),d=[],u=[],f=o.length===0;for(let[y,w]of i){if(w===c&&f)continue;let b=s.get(y);if(bb(b)){u.push(w);continue}l.has(y)?d.push(w):u.push(w)}let p=await JM(t,e,n,r),g=p?d.filter(y=>!p.has(y)):d,m=p?u.filter(y=>p.has(y)):u;for(let y of g)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","false","--yes"],{timeoutMs:3e4}).catch(w=>{h.warn("setup",`form field unhide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});for(let y of m)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","true","--yes"],{timeoutMs:3e4}).catch(w=>{h.warn("setup",`form field hide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})}),await t.runJson(["aitable","form","field","update","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--required","false","--yes"],{timeoutMs:3e4}).catch(w=>{h.warn("setup",`form field required=false \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});h.info("setup",`\u8868\u5355\u5B57\u6BB5\u540C\u6B65\u5B8C\u6210: viewId=${r}`,{mode:p?"incremental":"full",shown:g.length,hidden:m.length,skipped:d.length-g.length+(u.length-m.length)})}a(wb,"syncFormFieldVisibility");async function JM(t,e,n,r){let o;try{o=await t.runJson(["aitable","form","field","list","--base-id",e,"--table-id",n,"--view-id",r],{timeoutMs:3e4})}catch(c){h.warn("setup","form field list \u5931\u8D25\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r,error:c instanceof Error?c.message:String(c)});return}let i=ZM(o);if(!i){h.warn("setup","form field list \u8FD4\u56DE\u4E2D\u672A\u627E\u5230\u5B57\u6BB5\u6570\u7EC4\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}let s=new Map;for(let c of i){if(!v(c))continue;let l=typeof c.fieldId=="string"?c.fieldId.trim():"";l&&s.set(l,c.required===!0)}if(i.length>0&&s.size===0){h.warn("setup","form field list \u8FD4\u56DE\u5F62\u72B6\u4E0D\u7B26\u9884\u671F\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}return s}a(JM,"fetchFormVisibleFields");function ZM(t){let e=ye(t);if(Array.isArray(e))return e;if(!v(e))return;let n=["formFields","fields","items","list","records","results"];for(let r of n){let o=e[r];if(Array.isArray(o))return o}for(let r of Object.values(e))if(v(r))for(let o of n){let i=r[o];if(Array.isArray(i))return i}}a(ZM,"extractFormFieldArray");function YM(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(YM,"isSystemReadonlyFieldType");function bb(t){return YM(t)||t==="formula"||t==="lookup"||t==="filterUp"}a(bb,"isFormExcludedFieldType");async function QM(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}h.info("setup",`\u521B\u5EFA\u89C6\u56FE: ${r.name} (${r.type})`);let c=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Eu(r.type),"--yes"],{timeoutMs:6e4}),l=await $u(t,e,n,r.name);if(!l)throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"`);s.set(r.name,l);let d=Ta(c)||String(l.viewId??"");if(d&&r.visible_fields?.length){let u=Pu(r.visible_fields,o,i);u.length>0&&await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",d,"--config",JSON.stringify({visibleFieldIds:u}),"--yes"],{timeoutMs:6e4})}console.log(`\u2713 \u5DF2\u521B\u5EFA\u89C6\u56FE: "${r.name}" (${r.type})`)}a(QM,"applyGenericView");async function _a(t,e,n){let r=await t.runJson(["aitable","view","get","--base-id",e,"--table-id",n]),o=v(r)&&v(r.data)?r.data:null,i=Array.isArray(o?.views)?kb(o.views):[];if(i.length>0)return i;try{let s=await XM(t,e,n);return s.length>0&&h.info("setup","view get \u672A\u8FD4\u56DE\u89C6\u56FE\uFF0C\u5DF2\u4ECE table get \u56DE\u9000\u8BFB\u53D6",{baseId:e,tableId:n,count:s.length}),s}catch(s){return h.warn("setup","table get \u56DE\u9000\u8BFB\u53D6\u89C6\u56FE\u5931\u8D25",{baseId:e,tableId:n,error:s instanceof Error?s.message:String(s)}),i}}a(_a,"fetchViews");async function XM(t,e,n){let r=await t.runJson(["aitable","table","get","--base-id",e]),o=v(r)&&v(r.data)?r.data:null,s=(Array.isArray(o?.tables)?o.tables:[]).find(l=>String(l.tableId??"")===n),c=Array.isArray(s?.views)?s.views:[];return kb(c)}a(XM,"fetchViewsFromTableList");function kb(t){return t.map(e=>{let n=e.viewType??e.type;return{...e,...n?{viewType:n}:{}}})}a(kb,"normalizeViews");async function eO(t,e,n,r){return(await _a(t,e,n)).find(i=>String(i.viewName??"")===r)??null}a(eO,"fetchViewByName");async function $u(t,e,n,r){for(let o=0;o<Ru;o++){let i=await eO(t,e,n,r);if(i)return i;o+1<Ru&&hb>0&&await Cu(hb)}return null}a($u,"fetchViewByNameWithRetry");function Pu(t,e,n){let r=[],o=new Set;n&&(r.push(n),o.add(n));for(let i of t){let s=e.get(i);s&&!o.has(s)&&(r.push(s),o.add(s))}return r}a(Pu,"resolveFieldIds");function Ta(t){return Au(t,["viewId","view_id"])||""}a(Ta,"extractViewId");function _u(t){return v(t)?t.success===!0?!0:v(t.data)?_u(t.data):v(t.result)?_u(t.result):!1:!1}a(_u,"hasSuccessSignal");function Au(t,e){if(Array.isArray(t)){for(let n of t){let r=Au(n,e);if(r)return r}return null}if(!v(t))return null;for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim())return r;if(typeof r=="number")return String(r)}for(let n of Object.values(t)){let r=Au(n,e);if(r)return r}return null}a(Au,"findStringByKeys");function tO(t){let e=t.replace(/\s+/g," ").trim();return e.length<=180?e:`${e.slice(0,177)}...`}a(tO,"summarizeWarningReason");import{readFile as vb,writeFile as Sb}from"fs/promises";import Mu from"yaml";var nO=/^workflow:([A-Za-z0-9_-]+)\.tracker$/,Aa=15;async function Ou(t){let{workflowFilePath:e,recipeDir:n,workflow:r,settings:o,profile:i,dwsRunner:s,onProgress:c,workflowTrackers:l}=t,d=await vb(e,"utf8"),u=Mu.parse(d);if(!v(u))return 0;fO(u,l,i?.config);let f=Array.isArray(u.event_sources)?u.event_sources:[],p=Array.isArray(u.steps)?u.steps:[],g=[],m=new he({bin:o.tracker.dws_bin,timeoutMs:9e4,runner:s}),y=await ls({workflow:r,rawYaml:u,recipeDir:n,relPath:e,profile:i?{file:i.filePath,workflowId:i.workflowId,config:i.config}:void 0,onDefinitionLoadFailure:a((I,S)=>{throw new Error(`setup \u65E0\u6CD5\u52A0\u8F7D ${I}: ${S.message}`)},"onDefinitionLoadFailure")}),w=new Map(y.map(I=>[I.key,I]));for(let I of y){let S=dO(I);if(!S)continue;let{kind:k,path:R}=S,T=k==="eventSource"?rO(f,S):oO(p,S),_=k==="eventSource"?iO(i?.config,S.srcName):(S.stepId?i?.config.steps?.[S.stepId]:void 0)??{},C=Kn(T,R),E=Kn(_,R),F=v(E)?{...v(C)?C:{},...E}:v(C)?C:{};if(v(F.baseId)||v(F.tableId)){await c?.(`\u8DF3\u8FC7\u5F15\u7528\u8868\u300C${xb(I,R)}\u300D\uFF08workflow ref\uFF0C\u8FD0\u884C\u65F6\u89E3\u6790\uFF09`);continue}let W=typeof F.tableId=="string"?F.tableId.trim():"",P=w.get(I.key.replace(/\.tableId$/,".baseId")),O=sO(F,P,o),q=xb(I,R);if(W){await Ib(m,{baseId:O,tableId:W,name:q,setup:I.setup,onProgress:c});continue}await c?.(`\u6B63\u5728\u521B\u5EFA\u8F85\u52A9\u8868\u300C${q}\u300D`);let z=await aO(m,{baseId:O,name:q,setup:I.setup,onProgress:c}),K=S.inProfile;g.push({target:K?"profile":"workflow",basePath:S.basePath,baseId:O,tableId:z}),await c?.(`\u5DF2\u521B\u5EFA\u8F85\u52A9\u8868\u300C${q}\u300D: ${z}`)}if(g.length===0)return 0;let b=g.filter(I=>I.target==="workflow"),x=g.filter(I=>I.target==="profile");if(b.length>0){let I=Mu.parseDocument(d);for(let S of b)I.setIn([...S.basePath,"mode"],"owned"),I.setIn([...S.basePath,"baseId"],S.baseId),I.setIn([...S.basePath,"tableId"],S.tableId);await Sb(e,I.toString(),"utf8")}if(x.length>0&&i){let I=await vb(i.filePath,"utf8"),S=Mu.parseDocument(I);for(let k of x)S.setIn([...k.basePath,"mode"],"owned"),S.setIn([...k.basePath,"baseId"],k.baseId),S.setIn([...k.basePath,"tableId"],k.tableId);await Sb(i.filePath,S.toString(),"utf8")}return g.length}a(Ou,"setupSurfaceTables");function rO(t,e){let n;return e.idx!==void 0?n=v(t[e.idx])?t[e.idx]:void 0:e.srcName&&(n=t.find(r=>v(r)&&r.name===e.srcName)),n&&v(n.handler_config)?n.handler_config:{}}a(rO,"findEventSourceContainer");function oO(t,e){let n;return e.idx!==void 0?n=v(t[e.idx])?t[e.idx]:void 0:e.stepId&&(n=t.find(r=>v(r)&&r.id===e.stepId)),n&&v(n.config)?n.config:{}}a(oO,"findStepContainer");function iO(t,e){if(!t||!e)return{};let n=t.event_sources?.[e];if(!n)return{};let r=n.handler_config;return v(r)?r:{}}a(iO,"profileHandlerConfig");function sO(t,e,n){let r=typeof t.baseId=="string"?t.baseId.trim():"";if(r)return r;if(e?.defaultStrategy==="workflowTrackerBaseId")return n.tracker.base_id;throw new Error("owned tableRef \u7F3A\u5C11 baseId\uFF0C\u4E14\u672A\u58F0\u660E workflowTrackerBaseId \u9ED8\u8BA4\u503C\u7B56\u7565")}a(sO,"resolveSurfaceTableRefBaseId");async function aO(t,e){let n=e.setup?.tableSchema?.fields??[],{tableId:r,reused:o}=await ia(t,{baseId:e.baseId,name:e.name,fields:lO(e.setup).slice(0,Aa),onProgress:e.onProgress});if(o)return await Ib(t,{baseId:e.baseId,tableId:r,name:e.name,setup:e.setup,onProgress:e.onProgress}),r;let i=n.slice(Aa);return i.length>0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5269\u4F59\u5B57\u6BB5: ${i.map(s=>s.name).join(", ")}`),await Rb(t,{baseId:e.baseId,tableId:r,fields:i})),r}a(aO,"createSurfaceTable");async function Ib(t,e){let n=e.setup?.tableSchema?.fields??[];if(n.length===0)return;await e.onProgress?.(`\u6B63\u5728\u6821\u9A8C\u8F85\u52A9\u8868\u300C${e.name}\u300D\u7ED3\u6784`);let r=await Lt(t,e.baseId,e.tableId),o=new Map(r.map(l=>[l.fieldName,l])),i=[];for(let l of n){let d=o.get(l.name);d&&(cO(l.type,d.type)||i.push(`\u300C${l.name}\u300D\u58F0\u660E\u4E3A ${l.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${d.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(i.length>0)throw new Error(`\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${i.join("; ")}`);let s=new Set(r.map(l=>l.fieldName)),c=n.filter(l=>!s.has(l.name));c.length!==0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5: ${c.map(l=>l.name).join(", ")}`),await Rb(t,{baseId:e.baseId,tableId:e.tableId,fields:c}))}a(Ib,"ensureSurfaceTableSchema");function cO(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(cO,"isSurfaceFieldTypeCompatible");async function Rb(t,e){for(let n=0;n<e.fields.length;n+=Aa){let r=e.fields.slice(n,n+Aa);await t.runJson(["aitable","field","create","--base-id",e.baseId,"--table-id",e.tableId,"--fields",JSON.stringify(uO(r)),"--timeout","60","--yes"],{timeoutMs:9e4})}}a(Rb,"createSurfaceFields");function lO(t){let e=t?.tableSchema?.fields??[];return e.length===0?[{fieldName:"\u6807\u9898",type:"primaryDoc"}]:e.map((n,r)=>{let o={fieldName:n.name,type:r===0&&n.type==="text"?"primaryDoc":n.type};return(n.type==="singleSelect"||n.type==="multipleSelect")&&n.options?.length&&(o.config={options:n.options.map(i=>({name:i}))}),o})}a(lO,"buildCreateFields");function dO(t){if(t.setup?.action!=="createTable"||!t.key.endsWith(".tableId")||t.source!=="eventSource.handler_config"&&t.source!=="step.config")return null;let e=t.writeTarget;if(e.type!=="yaml")return null;let n=e.yamlPath;if(n[n.length-1]!=="tableId")return null;let r=t.source==="eventSource.handler_config"?"eventSource":"step";return n[0]==="workflows"?r==="eventSource"?n[2]!=="event_sources"||n[4]!=="handler_config"?null:{kind:r,path:n.slice(5,-1).map(String),basePath:n.slice(0,-1),inProfile:!0,srcName:String(n[3])}:n[2]!=="steps"?null:{kind:r,path:n.slice(4,-1).map(String),basePath:n.slice(0,-1),inProfile:!0,stepId:String(n[3])}:r==="eventSource"?n[0]!=="event_sources"||typeof n[1]!="number"||n[2]!=="handler_config"?null:{kind:r,path:n.slice(3,-1).map(String),basePath:n.slice(0,-1),inProfile:!1,idx:n[1]}:n[0]!=="steps"||typeof n[1]!="number"||n[2]!=="config"?null:{kind:r,path:n.slice(3,-1).map(String),basePath:n.slice(0,-1),inProfile:!1,idx:n[1]}}a(dO,"parseTableIdSurface");function xb(t,e){let n=t.setup?.tableName?.trim();return n||t.label.replace(/ 的 Table ID.*/,"")||e.join(".")}a(xb,"tableNameFromSurface");function uO(t){return t.map(e=>{let n={fieldName:e.name,type:e.type};return(e.type==="singleSelect"||e.type==="multipleSelect")&&e.options?.length&&(n.config={options:e.options.map(r=>({name:r}))}),n})}a(uO,"buildFieldCreateFields");function fO(t,e,n){if(!e||e.size===0)return;let r=Array.isArray(t.event_sources)?t.event_sources:[];for(let o=0;o<r.length;o++){let i=v(r[o])?r[o]:{};if(i.type!=="aitable_record")continue;let s=v(i.config)?i.config:{},c=typeof i.name=="string"?i.name:void 0,l=c?n?.event_sources?.[c]:void 0,{handler_config:d,...u}=l??{},p={...s,...u}.source_table;if(!v(p)||p.mode!=="reference")continue;let g=typeof p.ref=="string"?p.ref.trim():"",m=nO.exec(g);if(!m)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${g||"\u7A7A"}\uFF09\uFF0C\u5E94\u4E3A workflow:<workflowId>.tracker`);let y=m[1],w=e.get(y);if(!w)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300D`);if(!w.base_id||!w.table_id)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300Dtracker \u672A\u914D\u7F6E\u5B8C\u6574\uFF08base_id/table_id \u4E3A\u7A7A\uFF09`)}}a(fO,"validateSourceTableReferences");import{existsSync as pO,mkdirSync as gO,readdirSync as mO,readFileSync as Ab,renameSync as hO,writeFileSync as Eb,unlinkSync as Db}from"fs";import Un from"path";var $b=Un.join(".aitable-workflow","automation-state.json");function yO(t,e){let n=Un.join(t,$b);try{let r=JSON.parse(Ab(n,"utf8"));if(r.version!==1||r.baseId!==e||!v(r.entries))return{version:1,baseId:e,entries:{}};let o={};for(let[i,s]of Object.entries(r.entries))v(s)&&typeof s.flowId=="string"&&typeof s.name=="string"&&(o[i]={flowId:s.flowId,name:s.name});return{version:1,baseId:e,entries:o}}catch{return{version:1,baseId:e,entries:{}}}}a(yO,"readAutomationState");function Pb(t,e,n){let r=Un.join(t,$b),o=`${r}.tmp`;try{gO(Un.dirname(r),{recursive:!0}),Eb(o,`${JSON.stringify(e,null,2)}
625
+ `,"utf8"),hO(o,r)}catch(i){try{Db(o)}catch{}n(`\u81EA\u52A8\u5316\u6E05\u5355\u5199\u5165\u5931\u8D25\uFF08\u672C\u8F6E\u8FDC\u7AEF\u7ED3\u679C\u5DF2\u4FDD\u7559\uFF09: ${i instanceof Error?i.message:String(i)}`)}}a(Pb,"writeAutomationState");var Ea=15,wO=/^([A-Za-z][A-Za-z0-9_]*)_(.+)$/,bO=/<[^<>]+_viewId>/;function Cb(t){return`https://docs.dingtalk.com/i/nodes/${t.baseId}?iframeQuery=sheetId%3D${t.tableId}`}a(Cb,"tableUrl");function kO(t,e){return t.find(r=>r.fieldName===e)?.fieldId??null}a(kO,"resolveFieldId");function Mb(t){return t.includes("\u540D\u79F0\u91CD\u590D")||t.includes("\u5DF2\u5B58\u5728")||t.includes("already exist")||t.includes("duplicate")}a(Mb,"isAlreadyExists");async function vO(t,e,n){let r=new Map,o=100,i=0;try{for(let s=0;s<50;s++){let c=await t.runJson(["aitable","workflow","list","--base-id",e,"--limit",String(o),"--offset",String(i),"--yes"],{timeoutMs:3e4}),l=v(c)&&v(c.data)&&Array.isArray(c.data.list)?c.data.list:[];for(let d of l){if(!v(d))continue;let u=typeof d.name=="string"?d.name:"",f=typeof d.flowId=="string"?d.flowId:typeof d.workflowId=="string"?d.workflowId:"";u&&f&&r.set(u,f)}if(l.length<o)break;i+=o}}catch(s){n?.(`\u5217\u51FA\u5DF2\u6709\u6D41\u7A0B\u5931\u8D25\uFF0C\u9000\u5316\u4E3A\u53EA create: ${s instanceof Error?s.message:String(s)}`)}return r}a(vO,"listExistingFlows");async function Fo(t){let{dws:e,baseId:n,flowId:r,dslName:o,enable:i,log:s}=t;try{await e.runJson(["aitable","workflow",i?"enable":"disable","--base-id",n,"--workflow-id",r,"--yes"],{timeoutMs:3e4})}catch(c){s(`${i?"\u542F\u7528":"\u505C\u7528"} ${o} \u5931\u8D25: ${c instanceof Error?c.message:String(c)}`)}}a(Fo,"alignFlowState");function SO(t){let e=v(t)&&v(t.data)?t.data:v(t)?t:null;if(!e||e.valid!==!1)return null;let r=(Array.isArray(e.issues)?e.issues:[]).filter(v).map(o=>{let i=typeof o.path=="string"?o.path:"",s=typeof o.message=="string"?o.message:String(o.code??"\u672A\u77E5\u95EE\u9898");return i?`${i}: ${s}`:s});return r.length>0?`DSL \u6821\u9A8C\u5931\u8D25 \u2014 ${r.join("; ")}`:"DSL \u6821\u9A8C\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u5177\u4F53\u539F\u56E0\uFF09"}a(SO,"extractValidationError");function Tb(t,e,n){let r=n?t.filter(o=>o.fieldName===n):t;for(let o of r){if(!o.options.length)continue;let i=o.options.find(s=>s.name===e);if(i)return i.id}return null}a(Tb,"resolveOptionId");function xO(t){let e=new Map,n=[];if(!v(t))return{decls:e,errors:n};for(let[r,o]of Object.entries(t)){if(!v(o)){n.push(`_tables.${r} \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}if(r==="tracker"&&o.ref!=="tracker"){n.push('_tables.tracker \u53EA\u80FD\u58F0\u660E\u4E3A { ref: "tracker" }');continue}if(o.ref==="tracker"){e.set(r,{ref:"tracker"});continue}let i=typeof o.name=="string"?o.name.trim():"";if(!i){n.push(`_tables.${r} \u9700\u8981 name\uFF08\u8868\u540D\uFF09\u6216 ref: "tracker"`);continue}e.set(r,{name:i,fields:IO(o.fields,r,n)})}return{decls:e,errors:n}}a(xO,"parseTableDecls");function IO(t,e,n){if(t===void 0)return[];if(!Array.isArray(t))return n.push(`_tables.${e}.fields \u5FC5\u987B\u662F\u6570\u7EC4`),[];let r=[];for(let o of t){if(!v(o))continue;let i=typeof o.name=="string"?o.name.trim():"",s=typeof o.type=="string"?o.type.trim():"";if(!i||!s){n.push(`_tables.${e}.fields \u4E2D\u6709\u6761\u76EE\u7F3A\u5C11 name \u6216 type`);continue}let c={name:i,type:s};Array.isArray(o.options)&&(c.options=o.options.map(l=>String(l))),v(o.config)&&(c.config=o.config),r.push(c)}return r}a(IO,"parseDeclFields");async function RO(t){let{dws:e,baseId:n,tracker:r,decls:o,cache:i,onProgress:s}=t,c=new Map([["tracker",r]]),l=[];for(let[d,u]of o){if("ref"in u){c.set(d,r);continue}let f=`${n}::${u.name}`,p=i.get(f);if(p){c.set(d,p);continue}try{let g=await CO(e,{baseId:n,name:u.name,fields:u.fields??[],onProgress:s});i.set(f,g),c.set(d,g)}catch(g){l.push(`\u4F9D\u8D56\u8868\u300C${u.name}\u300D\u51C6\u5907\u5931\u8D25: ${g instanceof Error?g.message:String(g)}`)}}return{tables:c,errors:l}}a(RO,"resolveDeclaredTables");async function CO(t,e){let{baseId:n,name:r,fields:o,onProgress:i}=e,{tableId:s,reused:c}=await ia(t,{baseId:n,name:r,fields:AO(o).slice(0,Ea),onProgress:i});if(c)await TO(t,{baseId:n,tableId:s,name:r,fields:o,onProgress:i});else{i?.(`\u81EA\u52A8\u5316\u4F9D\u8D56\u8868\u300C${r}\u300D: \u5DF2\u521B\u5EFA ${s}`);let l=o.slice(Ea);l.length>0&&(i?.(`\u6B63\u5728\u8865\u9F50\u4F9D\u8D56\u8868\u300C${r}\u300D\u5269\u4F59\u5B57\u6BB5: ${l.map(d=>d.name).join(", ")}`),await Ob(t,n,s,l))}return{baseId:n,tableId:s,label:r,fields:await Ar(t,n,s)}}a(CO,"ensureDeclaredTable");async function TO(t,e){if(e.fields.length===0)return;let n=await Lt(t,e.baseId,e.tableId),r=new Map(n.map(c=>[c.fieldName,c])),o=[];for(let c of e.fields){let l=r.get(c.name);l&&(_O(c.type,l.type)||o.push(`\u300C${c.name}\u300D\u58F0\u660E\u4E3A ${c.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${l.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(o.length>0)throw new Error(`\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${o.join("; ")}`);let i=new Set(n.map(c=>c.fieldName)),s=e.fields.filter(c=>!i.has(c.name));s.length!==0&&(e.onProgress?.(`\u6B63\u5728\u4E3A\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u8865\u9F50\u5B57\u6BB5: ${s.map(c=>c.name).join(", ")}`),await Ob(t,e.baseId,e.tableId,s))}a(TO,"ensureFields");function _O(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(_O,"isFieldTypeCompatible");async function Ob(t,e,n,r){for(let o=0;o<r.length;o+=Ea)await t.runJson(["aitable","field","create","--base-id",e,"--table-id",n,"--fields",JSON.stringify(r.slice(o,o+Ea).map(jb)),"--timeout","60","--yes"],{timeoutMs:9e4})}a(Ob,"createFields");function AO(t){return t.length===0?[{fieldName:"\u6807\u9898",type:"primaryDoc"}]:t.map((e,n)=>{let r=jb(e);return n===0&&e.type==="text"&&(r.type="primaryDoc"),r})}a(AO,"buildCreateFields");function jb(t){let e={fieldName:t.name,type:t.type},n={...t.config??{}};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),Object.keys(n).length>0&&(e.config=n),e}a(jb,"fieldPayload");function EO(t,e,n=new Map){let r=[],o=new Set,i=a(c=>{o.has(c)||(o.add(c),r.push(c))},"fail");return{resolved:t.replace(/<([^<>]+)>/g,(c,l)=>{if(l==="sheetId")return e.tableId;if(l==="table_url")return Cb(e);for(let[d,u]of[["_sheetId",f=>f.tableId],["_table_url",f=>Cb(f)]]){if(!l.endsWith(d))continue;let f=l.slice(0,-d.length),p=n.get(f);return p?u(p):(i(`\u8868\u524D\u7F00\u300C${f}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),c)}if(l.endsWith("_fieldId")){let d=ju(l.slice(0,-8),n,e,i);if(!d)return c;let u=kO(d.table.fields,d.rest);return u||(i(`\u5B57\u6BB5\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u4E0D\u5B58\u5728`),c)}if(l.endsWith("_optionId")){let d=ju(l.slice(0,-9),n,e,i);if(!d)return c;let u=DO(d.table,d.rest);return u||(i(`\u9009\u9879\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u672A\u627E\u5230`),c)}if(l.endsWith("_viewId")){let d=ju(l.slice(0,-7),n,e,i);if(!d)return c;let u=d.table.views??[],f=u.find(p=>p.viewName===d.rest);return f?f.viewId:(i(`\u89C6\u56FE\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u4E0D\u5B58\u5728\uFF08\u73B0\u6709\u89C6\u56FE\uFF1A${u.map(p=>p.viewName).join("\u3001")||"\u672A\u8BFB\u5230\u4EFB\u4F55\u89C6\u56FE"}\uFF09`),c)}return c}),errors:r}}a(EO,"resolvePlaceholders");function ju(t,e,n,r){let o=[...e.keys()].filter(c=>t.startsWith(`${c}_`)).sort((c,l)=>l.length-c.length)[0];if(o)return{table:e.get(o),rest:t.slice(o.length+1)};if(e.size===1&&e.has("tracker"))return{table:n,rest:t};let i=wO.exec(t);if(!i)return{table:n,rest:t};let[,s]=i;return r(`\u8868\u524D\u7F00\u300C${s}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),null}a(ju,"locate");function DO(t,e){let n=e.lastIndexOf("_");if(n>0){let r=Tb(t.fields,e.slice(n+1),e.slice(0,n));if(r)return r}return Tb(t.fields,e)}a(DO,"resolveOptionIdFlexible");async function Fu(t){let{configDir:e,baseId:n,tableId:r,dws:o,enabled:i,onProgress:s}=t,c=s??(()=>{}),l=Un.resolve(e,"automations"),d={deployed:[],updated:[],skipped:[],disabled:[],failed:[]},u=yO(e,n);if(!pO(l))return await _b({configDir:e,baseId:n,dws:o,previousState:u,result:d,log:c}),d;let f=mO(l).filter(b=>b.endsWith(".json"));if(f.length===0)return await _b({configDir:e,baseId:n,dws:o,previousState:u,result:d,log:c}),d;c(`\u53D1\u73B0 ${f.length} \u4E2A\u81EA\u52A8\u5316 DSL \u6587\u4EF6`);let p={baseId:n,tableId:r,label:"\u5DE5\u4F5C\u6D41\u8BB0\u5F55\u8868",fields:await Ar(o,n,r)};c(`\u5DF2\u83B7\u53D6\u8868\u7ED3\u6784: ${p.fields.length} \u4E2A\u5B57\u6BB5`);let g=new Map,m=await vO(o,n,c);m.size>0&&c(`\u5DF2\u5217\u51FA ${m.size} \u4E2A\u5DF2\u6709\u6D41\u7A0B\uFF0C\u540C\u540D\u6D41\u7A0B\u5C06\u81EA\u52A8 update`);let y={version:1,baseId:n,entries:{...u.entries}},w=new Set;for(let b of f){let x=Un.join(l,b),I;try{I=Ab(x,"utf-8")}catch{d.failed.push({name:b,error:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"});continue}let S;try{S=JSON.parse(I)}catch{d.failed.push({name:b,error:"JSON \u89E3\u6790\u5931\u8D25"});continue}let k=String(S.name??b),R=b.replace(/\.json$/,"");w.add(R);let T=u.entries[R];if(i?.[R]===!1){let K=T?.flowId??m.get(k);K?(await Fo({dws:o,baseId:n,flowId:K,dslName:k,enable:!1,log:c}),c(`\u5DF2\u505C\u7528: ${k}\uFF08\u914D\u7F6E ${R}: false\uFF09`)):c(`\u672A\u90E8\u7F72: ${k}\uFF08\u914D\u7F6E ${R}: false\uFF09`),T&&(y.entries[R]={flowId:T.flowId,name:k}),d.disabled.push(k);continue}let{decls:_,errors:C}=xO(S._tables);if(delete S._deploy_notes,delete S._tables,C.length>0){c(`\u8DF3\u8FC7 ${k}: ${C.join("; ")}`),d.skipped.push(k);continue}let{tables:E,errors:F}=await RO({dws:o,baseId:n,tracker:p,decls:_,cache:g,onProgress:s});if(F.length>0){c(`\u8DF3\u8FC7 ${k}: ${F.join("; ")}`),d.skipped.push(k);continue}let W=JSON.stringify(S,null,2);if(bO.test(W))for(let K of new Set([p,...E.values()]))await $O(o,K);let{resolved:P,errors:O}=EO(W,p,E);if(O.length>0){c(`\u8DF3\u8FC7 ${k}: ${O.join("; ")}`),d.skipped.push(k);continue}if(P.includes("<")&&/<[^>]+>/.test(P)){let K=P.match(/<[^>]+>/g)??[];c(`\u8DF3\u8FC7 ${k}: \u4ECD\u6709\u672A\u89E3\u6790\u5360\u4F4D\u7B26 ${K.slice(0,3).join(", ")}`),d.skipped.push(k);continue}let q=Un.join(l,`.${b}.resolved.tmp`);Eb(q,P,"utf-8");let z=T?.flowId;try{let K=await PO({dws:o,baseId:n,dslName:k,tmpFile:q,existing:m,existingId:z,result:d,log:c});K&&(y.entries[R]={flowId:K,name:k})}catch(K){let G=K instanceof Error?K.message:String(K);Mb(G)?(c(`\u8DF3\u8FC7 ${k}\uFF08\u5DF2\u5B58\u5728\uFF0Clist \u672A\u547D\u4E2D\u4F46 create \u62A5\u91CD\u540D\uFF09`),d.skipped.push(k)):(c(`\u90E8\u7F72\u5931\u8D25 ${k}: ${G}`),d.failed.push({name:k,error:G}))}finally{try{Db(q)}catch{}}}for(let[b,x]of Object.entries(u.entries))w.has(b)||(await Fo({dws:o,baseId:n,flowId:x.flowId,dslName:x.name,enable:!1,log:c}),c(`\u5DF2\u505C\u7528\u9648\u65E7\u81EA\u52A8\u5316: ${x.name}\uFF08\u672C\u5730\u6587\u4EF6\u5DF2\u5220\u9664\uFF09`),d.disabled.push(x.name),delete y.entries[b]);return Pb(e,y,c),d}a(Fu,"setupAutomations");async function _b(t){let{configDir:e,baseId:n,dws:r,previousState:o,result:i,log:s}=t;if(Object.keys(o.entries).length!==0){for(let c of Object.values(o.entries))await Fo({dws:r,baseId:n,flowId:c.flowId,dslName:c.name,enable:!1,log:s}),s(`\u5DF2\u505C\u7528\u9648\u65E7\u81EA\u52A8\u5316: ${c.name}\uFF08\u672C\u5730\u6587\u4EF6\u5DF2\u5220\u9664\uFF09`),i.disabled.push(c.name);Pb(e,{version:1,baseId:n,entries:{}},s)}}a(_b,"disableRemovedAutomations");async function $O(t,e){if(!e.views)try{let n=await _a(t,e.baseId,e.tableId);e.views=n.map(r=>({viewId:String(r.viewId??""),viewName:String(r.viewName??"")})).filter(r=>r.viewId&&r.viewName)}catch{e.views=[]}}a($O,"ensureViews");async function PO(t){let{dws:e,baseId:n,dslName:r,tmpFile:o,existing:i,result:s,log:c}=t,l=t.existingId??i.get(r),d=l?["aitable","workflow","update","--base-id",n,"--workflow-id",l,"--dsl",`@${o}`]:["aitable","workflow","create","--base-id",n,"--dsl",`@${o}`],u=await e.runJson(d,{timeoutMs:6e4}),f=SO(u);if(f)return Mb(f)?(c(`\u8DF3\u8FC7 ${r}\uFF08\u540C\u540D\u5DF2\u5B58\u5728\uFF0Cupdate \u4ECD\u62A5\u91CD\u590D\uFF09`),s.skipped.push(r),null):(c(`${l?"\u66F4\u65B0":"\u90E8\u7F72"}\u5931\u8D25 ${r}: ${f}`),s.failed.push({name:r,error:f}),null);if(l)return c(`\u5DF2\u66F4\u65B0: ${r}`),s.updated.push(r),i.delete(r),await Fo({dws:e,baseId:n,flowId:l,dslName:r,enable:!0,log:c}),l;{c(`\u5DF2\u90E8\u7F72: ${r}`),s.deployed.push(r);let p=MO(u);return p&&await Fo({dws:e,baseId:n,flowId:p,dslName:r,enable:!0,log:c}),p||null}}a(PO,"publishFlow");function MO(t){let e=v(t)&&v(t.data)?t.data:v(t)?t:null;return e?typeof e.flowId=="string"?e.flowId:typeof e.workflowId=="string"?e.workflowId:"":""}a(MO,"extractFlowId");async function NO(t){let{configPath:e,settings:n,onProgress:r}=t,o=n.tracker.base_id?.trim();if(o&&o!=="__placeholder__")return{baseId:o,created:!1};if(n.multiWorkflow){let f=await BO(n);if(f)return await Nu(n,f),await r?.(`\u590D\u7528 workflow.yml \u5DF2\u58F0\u660E\u7684 AI \u8868\u683C\uFF1A${f}`,"create_base"),{baseId:f,created:!1}}let i=Dr.dirname(await Ue(e)),s=typeof n.raw?.default_base_id=="string"?n.raw.default_base_id.trim():"";if(s)return await Nu(n,s),await r?.(`\u91C7\u7528 config.yml \u7684\u9879\u76EE\u7EA7\u9ED8\u8BA4 AI \u8868\u683C\uFF1A${s}`,"create_base"),{baseId:s,created:!1};let c=LO(n.raw?.base_name??Dr.basename(i)),l=new he({bin:n.tracker.dws_bin,timeoutMs:6e4});await r?.(`tracker.base_id \u4E3A\u7A7A\uFF0C\u6B63\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C\uFF1A${c}`,"create_base");let d=await l.runJson(["aitable","base","create","--name",c,"--yes"],{timeoutMs:9e4}),u=WO(d);if(!u)throw Object.assign(new Error("dws \u521B\u5EFA AI \u8868\u683C\u672A\u8FD4\u56DE baseId"),{code:"BASE_ID_NOT_RETURNED",details:{response:d}});return await r?.(`AI \u8868\u683C\u5DF2\u521B\u5EFA\uFF1A${u}`,"create_base"),await Nu(n,u,{clearStaleTableIds:!0}),{baseId:u,created:!0}}a(NO,"ensureBaseExists");function LO(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"AI \u8868\u683C\u5DE5\u4F5C\u6D41"}a(LO,"sanitizeBaseName");function WO(t){if(v(t)){let e=t.data;if(v(e)){let n=e.baseId??e.base_id??e.id;if(typeof n=="string"&&n.trim())return n.trim()}}return null}a(WO,"findBaseId");async function BO(t){for(let e of t.workflowEntries)try{let n=Lb.parse(await Nb(e.templatePath,"utf8")),r=v(n?.tracker)?n.tracker:null,o=typeof r?.base_id=="string"?r.base_id.trim():"";if(o&&o!=="__placeholder__")return o}catch{}return null}a(BO,"findBaseIdInWorkflows");async function Nu(t,e,n){let r=n?.clearStaleTableIds===!0;if(!t.multiWorkflow){let i=await Ue(t.configDir);await Fb(i,e,r);return}let o=new Set;for(let i of t.workflowEntries)o.has(i.templatePath)||(o.add(i.templatePath),await Fb(i.templatePath,e,r))}a(Nu,"writeBaseIdToWorkflows");async function Fb(t,e,n){if(!n){await Ns(t,["tracker","base_id"],e);return}let r="";try{r=await Nb(t,"utf8")}catch{}let o=Lb.parseDocument(r);o.setIn(["tracker","base_id"],e),o.getIn(["tracker","table_id"])!==void 0&&o.setIn(["tracker","table_id"],""),await jO(t,o.toString(),"utf8")}a(Fb,"writeBaseIdWithOptionalTableClear");async function hX(t){let e=await je(t.config,{lenientEnv:!0}),n=await Ue(t.config),r=t.only==="automations";if(!r){let{baseId:f}=await NO({configPath:t.config,settings:e,onProgress:a(p=>console.log(` \u2022 ${p}`),"onProgress")});e.tracker.base_id!==f&&(e=await je(t.config,{lenientEnv:!0}))}let o=[];for(let f of e.workflowEntries){let p=await He(f.templatePath,{envSource:e.envSource}),g=Gi(e,p.tracker);if(!g)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${f.id}\u300D\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09`);let m=g===e.tracker?n:f.templatePath;o.push({entry:f,workflow:p,trackerConfig:g,trackerFilePath:m})}let i=new Map,s=new Set;for(let f of o){if(r){i.set(f.entry.id,Dn(e,f.entry,f.trackerConfig));continue}console.log(`
626
+ \u25B6 \u521D\u59CB\u5316\u5DE5\u4F5C\u6D41\u300C${f.entry.id}\u300D\uFF08${f.workflow.meta.name}\uFF09`);let p=Dn(e,f.entry,f.trackerConfig);p.tracker.table_id.trim()||s.add(f.entry.id),p=await zd({trackerFilePath:f.trackerFilePath,settings:p,workflow:f.workflow,onProgress:a(g=>console.log(` \u2022 ${g}`),"onProgress")}),i.set(f.entry.id,p)}let c=new Map;for(let f of o){let p=i.get(f.entry.id);c.set(f.entry.id,{base_id:p.tracker.base_id,table_id:p.tracker.table_id})}let l=new Map;for(let f of o){let p=i.get(f.entry.id),{base_id:g,table_id:m}=p.tracker;if(g&&m){let y=new he({bin:p.tracker.dws_bin});await Ao(y,g,m,l)}}Pn();let d=lt(e.configDir,e.envSource),u=Dr.resolve(e.configDir,"profile","profile.yml");for(let f of r?[]:o){let p=i.get(f.entry.id),g=d?.workflows?.[f.entry.id],m=await Ou({workflowFilePath:f.entry.templatePath,recipeDir:f.entry.recipeDir,workflow:f.workflow,settings:p,profile:g?{filePath:u,workflowId:f.entry.id,config:g}:void 0,workflowTrackers:c,onProgress:a(y=>console.log(` \u2022 ${y}`),"onProgress")});m>0&&console.log(` \u2022 \u5DF2\u81EA\u52A8\u521B\u5EFA ${m} \u4E2A\u8F85\u52A9\u8868`)}for(let f of r?[]:o){let p=i.get(f.entry.id);await Du({settings:p,workflow:f.workflow,cleanEmptyRows:t.clean!==!1,tableJustCreated:s.has(f.entry.id)})}for(let f of o){let p=i.get(f.entry.id),{base_id:g,table_id:m,dws_bin:y}=p.tracker;if(!g||!m){if(r)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${f.entry.id}\u300D\u7684 tracker.base_id/table_id \u4E3A\u7A7A\uFF0C--only automations \u9700\u8981\u5148\u5B8C\u6210\u4E00\u6B21\u5B8C\u6574 setup`);continue}let w=Dr.dirname(f.entry.templatePath),b=new he({bin:y}),x=d?.workflows?.[f.entry.id]?.automations,I=await Fu({configDir:w,baseId:g,tableId:m,dws:b,...x?{enabled:x}:{},onProgress:a(k=>console.log(` \u2022 ${k}`),"onProgress")});I.deployed.length+I.updated.length+I.skipped.length+I.disabled.length+I.failed.length>0&&console.log(` \u2022 \u81EA\u52A8\u5316: ${I.deployed.length} \u90E8\u7F72, ${I.updated.length} \u66F4\u65B0, ${I.disabled.length} \u5173\u95ED, ${I.skipped.length} \u8DF3\u8FC7, ${I.failed.length} \u5931\u8D25`)}if(t.kb!==!1&&!r){await zO(e.configDir);try{let f=await jd({settings:e,...t.kbFull?{force:!0}:{},onProgress:ru});ou(f)}catch(f){if(f instanceof xr)throw f;console.log(`\u26A0 \u77E5\u8BC6\u5E93\u7F16\u8BD1\u8DF3\u8FC7\uFF08\u975E\u81F4\u547D\uFF09: ${f instanceof Error?f.message:String(f)}`)}}}a(hX,"runSetupCommand");async function zO(t){let e=Dr.resolve(t,"lib","assemble.ts");if(OO(e))try{let n=await import(FO(e).href);if(typeof n.ensureAssembled!="function")return;let r=n.ensureAssembled(t,i=>console.log(` ${i}`)),o=r.issues.filter(i=>i.level==="error");if(o.length>0){console.log(`\u26A0 profile \u88C5\u914D\u6709 ${o.length} \u4E2A\u9519\u8BEF\uFF0CKB \u7F16\u8BD1\u53EF\u80FD\u4F7F\u7528\u4E0D\u5B8C\u6574\u7684\u914D\u7F6E`);for(let i of o)console.log(` \u2717 ${i.message}`)}else r.wrote.length>0&&console.log(`\u2713 profile \u88C5\u914D\u5B8C\u6210\uFF0C\u5DF2\u66F4\u65B0: ${r.wrote.map(i=>Dr.relative(t,i)).join(", ")}`)}catch(n){console.log(`\u26A0 \u65E0\u6CD5\u52A0\u8F7D lib/assemble.ts\uFF0C\u8DF3\u8FC7 profile \u88C5\u914D: ${n instanceof Error?n.message:String(n)}`)}}a(zO,"runEnsureAssembled");import{mkdir as Wb,readFile as UO,writeFile as Bb}from"fs/promises";import zb from"path";import Lu from"yaml";async function AX(t,e){let n=[],r=e.filter(d=>d.name?.trim()&&d.persona?.trim());if(r.length===0)return{written:!1,profilePath:t,roleIds:[],skippedKnowledgeBindings:n};let o=await UO(t,"utf8").then(d=>{try{return Lu.parse(d)}catch{return}},()=>{}),i=v(o)?{...o}:{},s=v(i.roles)?{...i.roles}:{},c=[],l=new Set;for(let d of r){let u=Wu(d.id||d.name),f=u;for(let p=2;l.has(f);p++)f=`${u}-${p}`;l.add(f),s[f]={name:d.name.trim(),persona:d.persona.trim()},c.push(f),d.knowledge&&d.knowledge.length>0&&n.push({roleId:f,knowledge:d.knowledge})}return i.schema_version=2,i.roles=s,await Wb(zb.dirname(t),{recursive:!0}),await Bb(t,Lu.stringify(i),"utf8"),{written:!0,profilePath:t,roleIds:c,skippedKnowledgeBindings:n}}a(AX,"writeProfileRoles");async function EX(t,e){await Wb(t,{recursive:!0});let n=[],r=[];for(let o of e){let i=KO(o),s=zb.join(t,`${i.id}.role.yml`),c=Lu.stringify(i);await Bb(s,c,"utf8"),n.push(s),o.knowledge&&o.knowledge.length>0&&r.push({roleId:i.id,knowledge:o.knowledge})}return{files:n,skippedKnowledgeBindings:r}}a(EX,"writeRoleDefinitions");function KO(t){let e={id:Wu(t.id||t.name),name:t.name||t.id||"\u672A\u547D\u540D\u89D2\u8272",persona:t.persona||"\u901A\u7528\u4E1A\u52A1\u6D41\u7A0B\u52A9\u624B",archetype:"task",skills:t.skills.map(n=>({id:Wu(n),name:n,description:""}))};return Qr.parse(e)}a(KO,"toRoleDefinition");function Wu(t){return t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"role"}a(Wu,"safeId");function Ub(t,e,n){let r=[],o=new Map(t.map(c=>[c.fieldName,c]));for(let c of e){if(c.type!=="singleSelect"&&c.type!=="multipleSelect"||!c.options||c.options.length===0)continue;let l=o.get(c.name);l&&l.type&&l.type!==c.type&&r.push({fieldName:c.name,configOptions:c.options,tableOptions:null,added:[],removed:[]})}let i=VO(n),s=e.find(c=>c.name==="\u72B6\u6001"||c.options?.some(l=>i.includes(l)));if(s?.options){let c=new Set(s.options),l=new Set(i),d=i.filter(f=>!c.has(f)),u=s.options.filter(f=>!l.has(f));(d.length>0||u.length>0)&&r.push({fieldName:s.name,configOptions:s.options,tableOptions:i,added:d,removed:u})}return{hasDrift:r.length>0,items:r}}a(Ub,"buildDriftReport");function VO(t){let e=new Set;e.add(t.initial);for(let n of t.active)e.add(n);for(let n of t.terminal)e.add(n);return t.blocked&&e.add(t.blocked),t.review&&e.add(t.review),[...e]}a(VO,"extractAllStates");import{readdir as qO,readFile as HO}from"fs/promises";import GO from"path";async function Kb(t,e){if(e.length===0)return[];let n=[],r;try{r=await qO(t)}catch{return[]}let o=r.filter(i=>i.endsWith(".recipe.ts")||i.endsWith(".ts"));for(let i of o){let s=GO.join(t,i),c;try{c=await HO(s,"utf8")}catch{continue}let l=c.split(`
627
627
  `);for(let d=0;d<l.length;d++){let u=l[d];for(let f of e)u.includes(f)&&n.push({file:i,line:d+1,content:u.trim(),matchedValue:f})}}return n}a(Kb,"scanRecipeImpact");async function HX(t){let{configPath:e}=t;h.info("sync","\u52A0\u8F7D\u914D\u7F6E",{configPath:e});let n=await je(e),r=await He(n.workflowTemplatePath,{envSource:n.envSource}),{base_id:o,table_id:i}=n.tracker,s=new he({bin:n.tracker.dws_bin});h.info("sync","\u6821\u9A8C recipe schema \u4E0E workflow steps \u5BF9\u9F50");let{issues:c}=await sr(n.recipeDir,r);JO(c);let l=n.tracker.field_definitions?n.tracker.field_definitions.map(g=>({name:g.name,type:g.type,...g.options?{options:g.options}:{}})):[];h.info("sync","L0 \u8BCA\u65AD\uFF1A\u68C0\u6D4B\u914D\u7F6E\u4E0E\u8868\u7684\u504F\u5DEE");let d=await Lt(s,o,i),u=Ub(d,l,n.tracker.states);if(!u.hasDrift)return console.log("\u2713 \u65E0\u504F\u5DEE\uFF1Afield_definitions \u4E0E\u8868\u7ED3\u6784\u4E00\u81F4"),{driftReport:u,impacts:[],recipeIssues:c};console.log(`
628
628
  \u26A0 \u68C0\u6D4B\u5230\u914D\u7F6E\u504F\u5DEE\uFF1A
629
629
  `);for(let g of u.items)ZO(g);let f=u.items.flatMap(g=>[...g.added,...g.removed]),p=await Kb(n.recipeDir,f);if(p.length>0){console.log(`
@@ -638,4 +638,4 @@ ${x}`,k;try{k=await l(x,d),k.response.includes("already in use")&&(k=await l(v))
638
638
  `)}a(No,"normalizeEol");function Qb(t){return No(t).replace(/^\s+|\s+$/g,"")}a(Qb,"tidySection");function sj(t){let e=String(t??"");return e===""?'""':/[:#[\]{}&*!|>'"%@`,\n\r\t]/.test(e)||e!==e.trim()?JSON.stringify(e):e}a(sj,"yamlScalar");function aj(t){return`[${(t??[]).map(n=>String(n??"").trim()).filter(Boolean).map(n=>JSON.stringify(n)).join(", ")}]`}a(aj,"yamlFlowList");function Lo(t){let e=/^---\n([\s\S]*?)\n---\n([\s\S]*)$/.exec(No(t));return e?{frontmatter:e[1],body:e[2]}:null}a(Lo,"splitFrontmatter");function cj(t,e){let n=String(e??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^##\\s*${n}\\s*$([\\s\\S]*?)(?=^##\\s|(?![\\s\\S]))`,"m").exec(No(String(t??"")));return o?Qb(o[1]):""}a(cj,"readSection");function Bu(t){return/^#\s+(.+)$/m.exec(No(String(t??"")))?.[1]?.trim()??""}a(Bu,"readTitle");function lj(t){return t==null?[]:(Array.isArray(t)?t:[t]).map(n=>String(n??"").trim()).filter(Boolean)}a(lj,"toStringList");function Xb(t){return dj("sha256").update(t).digest("hex")}a(Xb,"sha256");async function wj(t,e){let n=e?.exclude&&e.exclude.length>0?new Set(e.exclude):null,r=[];async function o(i,s){let c=await pj(i).catch(()=>[]);for(let l of c.sort()){let d=mt.join(i,l),u=s?`${s}/${l}`:l,f=await hj(d).catch(()=>null);if(f){if(f.isDirectory())await o(d,u);else if(l.endsWith(".md")){if(n?.has(u))continue;let p=await tk(d,"utf8"),g=Lo(p)?.body??p;r.push([u,Xb(g)])}}}}return a(o,"walk"),await o(t,""),Xb(JSON.stringify(r))}a(wj,"hashNormalizedContent");function nk(t,e){return`${t}::${e}`}a(nk,"contentIndexKey");function zu(){return{version:1,entries:{}}}a(zu,"emptyContentIndex");async function rk(t){try{let e=await tk(t,"utf8"),n=JSON.parse(e);return typeof n=="object"&&n!==null&&n.version===1&&typeof n.entries=="object"?n:zu()}catch{return zu()}}a(rk,"readContentIndex");async function ok(t,e){await ek(mt.dirname(t),{recursive:!0});let n=`${t}.tmp-${process.pid}`;await yj(n,JSON.stringify(e,null,2),"utf8"),await gj(n,t)}a(ok,"writeContentIndex");async function bj(t,e,n){let r=await rk(t);r.entries[nk(e,n.contentHash)]=n,await ok(t,r)}a(bj,"upsertContentIndexEntry");async function kj(t,e,n){let r=t.articles.map(s=>({id:s.id,abs:mt.join(e,s.path),name:mt.basename(s.path)}));for(let s of r){if(!s.name.endsWith(".md")||s.name.startsWith("_"))return null;try{await uj(s.abs)}catch{return null}}r.every(s=>mt.resolve(mt.dirname(s.abs))===mt.resolve(n))||(await mj(n,{recursive:!0,force:!0}),await ek(n,{recursive:!0}));let i=[];for(let s of r){let c=mt.join(n,s.name);mt.resolve(s.abs)!==mt.resolve(c)&&await fj(s.abs,c),i.push({id:s.id,path:mt.relative(e,c)})}return i}a(kj,"tryReuseStagingArticles");import{existsSync as Wo,readFileSync as ik,readdirSync as Uu}from"fs";import tt from"path";var vj=/(?:^|[\s("'`(])(?:\/Users\/|\/home\/|[A-Za-z]:\\|file:\/\/)/;function Sj(){return{"missing-frontmatter":0,"missing-title":0,"missing-source":0,"index-missing-card":0,"index-orphan-entry":0,"index-too-large":0,"broken-asset":0,"absolute-path":0}}a(Sj,"emptyCounts");function xj(t){let e=tt.join(t,"cards");if(!Wo(e))return[];let n=[];for(let r of Uu(e,{withFileTypes:!0})){if(!r.isDirectory()||r.name.startsWith("_")||r.name.startsWith("."))continue;let o=tt.join(e,r.name);for(let i of Uu(o))!i.endsWith(".md")||i.startsWith("_")||i.startsWith(".")||n.push(tt.join("cards",r.name,i))}return n.sort()}a(xj,"listCards");function Ij(t){let e=[];Wo(tt.join(t,"_index.md"))&&e.push("_index.md");let n=tt.join(t,"cards");if(!Wo(n))return e;for(let r of Uu(n,{withFileTypes:!0})){if(!r.isDirectory())continue;let o=tt.join("cards",r.name,"_index.md");Wo(tt.join(t,o))&&e.push(o)}return e}a(Ij,"listIndexes");function Rj(t){let e=0;for(let n of t.split(`
639
639
  `)){let r=n.trim();r.startsWith("|")&&(/^\|[\s:|-]+\|?$/.test(r)||(e+=1))}return Math.max(0,e-1)}a(Rj,"countTableRows");function Cj(t){let{wikiDir:e}=t,n=t.indexEntryWarn??300,r=t.sourcePrefixes??["> \u6765\u6E90","> Source"],o=[],i=Sj(),s={},c=a((p,g,m,y="error")=>{o.push({rule:p,file:g,detail:m,level:y}),i[p]+=1},"push"),l=xj(e),d=[];for(let p of l){let g=ik(tt.join(e,p),"utf8"),m=tt.basename(p,".md");d.push(m);let y=Lo(g);if(!y){c("missing-frontmatter",p,"\u7F3A\u5C11 --- \u5305\u88F9\u7684 frontmatter");continue}Bu(y.body)||c("missing-title",p,"\u6B63\u6587\u7F3A\u5C11\u4E00\u7EA7\u6807\u9898\uFF08# ...\uFF09"),r.some(w=>y.body.includes(w))||c("missing-source",p,`\u6B63\u6587\u7F3A\u5C11\u6EAF\u6E90\u884C\uFF08\u5E94\u542B ${r.join(" \u6216 ")}\uFF09\u2014\u2014 \u65E0\u6CD5\u56DE\u67E5\u8FD9\u6761\u77E5\u8BC6\u6765\u81EA\u54EA\u91CC`),vj.test(g)&&c("absolute-path",p,"\u51FA\u73B0\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u4EA7\u7269\u5FC5\u987B\u53EF\u8FC1\u79FB\uFF09");for(let w of g.matchAll(/!\[[^\]]*\]\(([^)\s]+)\)/g)){let b=w[1];if(/^(https?|data):/.test(b))continue;let x=tt.resolve(tt.dirname(tt.join(e,p)),b);Wo(x)||c("broken-asset",p,`\u56FE\u7247\u4E0D\u5B58\u5728\uFF1A${b}`)}}let u=Ij(e),f=new Map;for(let p of u){let g=ik(tt.join(e,p),"utf8");f.set(p,g);let m=Rj(g);s[p]=m,m>n&&c("index-too-large",p,`\u7D22\u5F15 ${m} \u6761\uFF0C\u8D85\u8FC7\u53EF\u6574\u8BFB\u9608\u503C ${n}\u3002agent \u65E0\u6CD5\u6574\u7BC7\u8BFB\u53D6 \u2192 \u8BED\u4E49\u5339\u914D\u5C42\u5931\u6548\uFF08\u662F\u5426\u8BE5\u518D\u5206\u5C42\u7531\u6A21\u677F\u51B3\u5B9A\uFF09`,"warn")}if(u.length===0&&l.length>0)c("index-missing-card","_index.md","\u6CA1\u6709\u4EFB\u4F55\u7D22\u5F15\u6587\u4EF6\uFF0C\u5168\u90E8\u5361\u7247\u90FD\u4E0D\u53EF\u5BFC\u822A");else{let p=[...f.values()].join(`
640
640
  `);for(let g of d)p.includes(g)||c("index-missing-card",`cards/**/${g}.md`,"\u5361\u7247\u672A\u88AB\u4EFB\u4F55\u7D22\u5F15\u5217\u5230\uFF0C\u7B49\u4E8E\u8FD9\u6761\u77E5\u8BC6\u4E0D\u5B58\u5728")}return{issues:o,counts:i,checkedCards:l.length,indexEntries:s}}a(Cj,"lintArtifacts");function Tj(t){return t.issues.some(e=>e.level==="error")}a(Tj,"hasArtifactError");function _j(t){if(t.issues.length===0)return`\u4EA7\u7269\u6821\u9A8C\u901A\u8FC7\uFF1A${t.checkedCards} \u5F20\u5361\u7247\uFF0C\u7D22\u5F15 ${Object.keys(t.indexEntries).length} \u4E2A\uFF0C\u5168\u90E8\u4E0D\u53D8\u91CF\u6EE1\u8DB3\u3002`;let e=[`\u4EA7\u7269\u6821\u9A8C\u53D1\u73B0 ${t.issues.length} \u4E2A\u95EE\u9898\uFF08\u5361\u7247 ${t.checkedCards} \u5F20\uFF09\uFF1A`];for(let n of t.issues)e.push(` ${n.level==="error"?"\u2716":"\u26A0"} [${n.rule}] ${n.file}\uFF1A${n.detail}`);return e.join(`
641
- `)}a(_j,"formatArtifactLint");import{createHash as Aj}from"crypto";var Ej=1,Dj=1;function $j(t){return JSON.stringify(t,(e,n)=>n===null||typeof n!="object"||Array.isArray(n)?n:Object.fromEntries(Object.entries(n).sort(([r],[o])=>r.localeCompare(o))))}a($j,"canonicalJson");function sk(t){return Aj("sha256").update($j(t)).digest("hex")}a(sk,"hashCanonical");function m9(t){return sk({contractVersion:Ej,targetCollection:t.targetCollection,sourceId:t.sourceId,documentId:t.documentId,cardId:t.cardId})}a(m9,"buildCandidateId");function h9(t){return sk({contractVersion:Dj,candidateId:t.candidateId,contentHash:t.contentHash,distillFingerprint:t.distillFingerprint,compareFingerprint:t.compareFingerprint,proposedCandidate:t.proposedCandidate,comparisonDecision:t.comparisonDecision,targetContentHash:t.targetContentHash})}a(h9,"buildCandidateRevision");function y9(t,e){return`${t}::${e}`}a(y9,"buildReviewKey");export{oS as AGENT_TO_ENGINE,zr as BASE_AGENT_DEFS,fe as BotProvisionError,em as BotProvisioner,Ej as CANDIDATE_IDENTITY_CONTRACT_VERSION,Dj as CANDIDATE_REVISION_CONTRACT_VERSION,Ko as CommandAbortedError,Mr as CommandTimeoutError,Io as ConfigSaveError,ji as CronSchedulerSource,fi as DEFAULT_TAXONOMY,Zb as DEFAULT_VISION_BASE_MS,Yb as DEFAULT_VISION_PER_PAGE_MS,Vb as DISTILL_PRESETS,Jo as DWS_HOST_ENV_KEYS,Et as DingTalkRobotClient,he as DwsClient,el as DwsDevRunner,ve as DwsError,li as ENGINE_TO_AGENT,tn as InMemoryGlobalVarStore,lm as InMemoryObjectStore,Ce as IngestError,ti as KNOWN_AGENT_IDS,au as LocalSpawnExecutor,om as PROVISION_PHASES,ue as PathBoundaryError,pu as QUESTION_FORM_TAG,iu as RelayAgentSession,su as RelayExecutor,io as SCAFFOLD_FIELD_NAMES,Ii as ShellNotAllowedError,it as TAGS_INDEX_DIR,y$ as THREAD_CLOSE_REASONS,b$ as THREAD_CONFIDENCES,vd as THREAD_CONTRACT_VERSION,h$ as THREAD_ROLES,xe as TaxonomyError,Cd as ThreadLog,Co as ThreadStore,We as ToolkitError,Ua as Tracer,nj as VISION_META_NAME,tj as VISION_NORMALIZED_NAME,am as WORKSPACE_BUNDLE_FORMAT,U$ as _resetDigestQueues,j$ as _resetThreadStoreRegistry,YK as activateGlobalDwsOnPath,no as agentEngineSchema,gp as agentToEngine,g$ as applyConfigSave,ct as applyProvisionEvent,LR as approvalCandidateSchema,lE as assertDownloadMatchesExtension,Ba as assertPortableId,Ao as assertTableBelongsToBase,XO as assessPdfDensity,Rd as assignThreadRoles,Su as buildAgentChoices,$K as buildArtifactKey,CK as buildBotApprovalReportLines,m9 as buildCandidateId,h9 as buildCandidateRevision,xa as buildClarifyReply,Hi as buildEnvSource,vm as buildEnvSourceSync,lu as buildFixPrompt,Sa as buildMetaPrompt,y9 as buildReviewKey,Vs as canOfferDefaultFor,$j as canonicalJson,WR as checkApprovalSchema,Dl as checkEnv,gk as checkMigrateHint,pl as checkRecipeSyntax,gl as checkRecipeTypes,sr as checkWorkflowRecipes,Tl as checkWorkflows,Cm as chooseDetectedEngine,Jg as classifyProvisionError,tu as cleanupOrphanArticles,sp as codingAgentsConfigSchema,YD as coerceJsonValue,Oy as coerceYamlValue,xo as collectAllItems,yd as collectBaseIdCandidateFiles,zt as collectConfigHints,Km as collectDesignContext,go as collectEnvRefDetails,fA as collectEnvRefs,uc as collectionDir,Oa as commandsInFlight,Ac as composeToolkitRegistry,xd as computeFirstResponse,Id as computeParticipants,cm as computeWorkspaceRevision,hm as configSchema,nk as contentIndexKey,IQ as createApp,mi as createDingTalkAtUserIdResolver,Dx as createExecShellToolkit,kC as createFingerprintWindow,Yg as createInitialProvisionState,NQ as createLocalSpawnExecutor,Dn as createPerWorkflowSettings,Ak as createPrintfLogger,MQ as createRelayExecutor,$x as createStandaloneExecShellToolkit,mw as createWorkflowTable,Qy as credentialsFilePath,NK as decodeWorkspaceBundle,J as defaultCommandRunner,HR as defaultProvisionStatePath,Zt as defaultToolkitRegistry,Sd as degradeConfidence,kh as deriveEnvJsonMapSpec,Lj as describeConfigPath,dc as detectAgentFailure,vu as detectAgents,Rm as detectCodingEngines,Ur as detectInstalledAgents,ni as detectInstalledCodingAgents,VE as detectScope,Ql as detectSourceType,jR as devAppEntrySchema,Qh as discoverLocalSources,YO as distillPresetSpec,lf as drainCommands,Hn as dwsCommandOptions,RK as dwsErrorEnvelopeSchema,ye as dwsPayload,zu as emptyContentIndex,Jy as emptyStore,fm as emptyStreakKey,FK as encodeWorkspaceBundle,Sn as engineToAgent,Hy as enqueueForDigest,xk as enrichLogContext,NO as ensureBaseExists,xu as ensureLatestDws,zd as ensureTableExists,Ut as ensureTsxRegistered,YP as evaluateStrictGate,oC as extractAddBotRobotName,SR as extractAttachmentDetails,eC as extractErrorInfo,Gb as extractPdfPageCount,hC as extractStructuredJson,Lt as fetchFields,RC as fieldDefinitionSchema,IC as fieldTypeSchema,Wj as fileRefConfigSchema,Te as findArrayPayload,S3 as findConflictingCredential,Zo as findCursor,_j as formatArtifactLint,De as formatCommandError,Zr as formatZonedDateTime,_I as formatZonedHm,mC as gateEmptySnapshot,Ly as generateCodingAgentsConfig,Wy as generateMainConfig,I3 as getActiveCredential,ac as getAgentConfig,Kv as getAgentDef,ht as getAitableAgentConfigMeta,Zu as getConfigHint,Kn as getConfigValueAtPath,Df as getCurrentDwsRunner,_f as getCurrentExecutor,dt as getDefaultAgentEntry,Bj as getFileRefHint,um as getGlobalDwsBinPath,La as getLogContext,N$ as getPendingItems,Ks as getSemanticKey,qy as getThreadStore,Ho as getTracer,on as getZodObjectShape,m$ as globalVarRefPath,to as groupEntriesOf,Tj as hasArtifactError,rw as hasHumanStep,BK as hasOssCredentials,wj as hashNormalizedContent,B$ as incrementDigestAttempts,fc as indexPath,bl as inferRecipeContractFromSource,hr as ingest,Fx as initSlsReport,Du as initTable,bf as initTracer,hw as initialTableFields,nn as injectProfileConfig,nr as interpolateEnv,DK as isAllowedArtifactPath,L$ as isDigestQueueEmpty,kp as isDistillPreset,Ji as isEngineDetected,q8 as isGlobalVarRef,gn as isOwnedAutoCreateHint,nl as isPublishedStatus,S as isRecord,cC as isSafeRelativePath,gg as isSlsReportDisabled,Cj as lintArtifacts,Vv as listCodingAgents,R3 as listCredentials,fK as listDwsConversations,fk as listProfiles,uk as listTemplates,sc as loadAgentConfig,dl as loadEventHandlerDefinition,$n as loadEventHandlerDefinitionResult,lt as loadProfileConfig,JR as loadProvisionState,es as loadRecipeDefinition,$t as loadRecipeDefinitionResult,je as loadSettings,At as loadTaxonomy,He as loadWorkflowTemplate,kr as logDateDir,Ml as logPreflightSummary,h as logger,qs as lowerConfidence,yc as mapWithConcurrency,z$ as markDigestFailure,_3 as maskSecret,lk as materializeSharedKnowledge,dk as materializeWithMapping,sf as mergeCommandEnv,YR as mergeEnterpriseRobotCredentials,wd as migrateBaseIdInFiles,tF as moduleDir,KR as nextStepForPhase,aC as normalizeArtifactRelPath,zi as normalizeByType,gc as normalizeCategory,No as normalizeEol,AI as normalizeTimezone,hi as padStaffId,mg as parseDwsAuthIdentity,hg as parseDwsVersionOutput,QR as parseEnterpriseRobots,bh as parseEnvExampleValues,qi as parseEnvValue,Ne as parseFrontmatter,rC as parseGroupTargets,GR as parseProvisionState,mu as parseQuestionForm,rj as parseVisionMeta,Pl as preflightModuleResult,rl as prependGlobalDwsToPath,Hw as printFieldPlan,ru as printKbProgress,ou as printKbSummary,_t as probeCommand,is as probeProjectShape,tl as provisionGuidance,qR as provisionStateFileSchema,VR as provisionedGroupEntrySchema,rk as readContentIndex,To as readCredentials,cj as readSection,Fn as readState,Bu as readTitle,hd as readYamlValueAt,F$ as recoverThreadStoreOnce,zR as redactPayloadForLog,un as refreshKnowledgeBases,U0 as remainingDesignTimeoutMs,W$ as removeFromDigestQueue,QO as renderDistillPrompt,Ca as renderForm,eM as renderForms,gi as renderKbPromptBlock,qb as renderSimpleDistillPrompt,v$ as renderThread,ej as renderVisionNormalizePrompt,pm as repairJsonStringValues,Pc as reportCliEvent,Zn as reportPath,tc as requireAgentDef,Pn as resetProfileCache,GP as resolveAllCollections,or as resolveCodingAgentSelection,nu as resolveCompileAgent,Ue as resolveConfigPath,NW as resolveContactsByUserIds,Rp as resolveDingTalkAtUserId,qe as resolveDingTalkStreamMessageEventContext,Pr as resolveDingTalkWebhookMentionEventContext,Wr as resolveDwsCommandBin,H8 as resolveGlobalVarRef,$e as resolveInsideRoot,mc as resolveKbContext,ir as resolveRecipePath,yg as resolveReportProject,_o as resolveReviewState,ow as resolveReviewStateDetailed,i0 as resolveTriggerTarget,Gi as resolveWorkflowTracker,MR as robotLifecycleSchema,OR as robotResultSchema,PR as robotSubmitSchema,Fs as runCheck,a6 as runClarifyRound,kt as runCodingAgent,oi as runCodingAgentViaSpawn,yk as runCommand,Uw as runDesign,$6 as runDesignCommand,ne as runDwsCommand,k4 as runInit,ho as runInstancePreflight,FY as runKbCleanupCommand,XP as runKbCompileCommand,jY as runKbIngestCommand,OY as runKbStatusCommand,MY as runKbUpdateCommand,pk as runMigrate,hX as runSetupCommand,HX as runSync,ZF as runWithDwsRunner,Ga as runWithExecutor,Sk as runWithLogContext,vl as runWorkflowGate,fH as runWorkflowGates,Pe as safeFilename,gm as safeParseJson,Xg as sanitizeProvisionText,v3 as saveCredential,ZR as saveProvisionState,Us as scaffold,$a as scaffoldFromTemplate,cl as scanWorkflowDirs,Gg as searchDwsChatGroups,Rn as sessionWebhookRegistry,x3 as setActiveAgent,JF as setGlobalDwsRunner,XD as setInJson,Nx as setReportProject,Fu as setupAutomations,jd as setupKnowledgeBases,Ou as setupSurfaceTables,UF as shellToken,af as shouldDetachCommand,oj as shouldRunVisionRound,Md as snapshotRunRecord,Vn as spawnManagedProcess,cf as spawnManagedProcessSync,Lo as splitFrontmatter,zF as stringOrNull,Jb as stripPdfSeparators,qw as syncFieldsFromWorkflow,Nj as tableRefConfigSchema,Tw as tableSource,st as taxonomyCategoryIds,Gr as taxonomyFingerprint,Uy as threadLogFileName,Ro as threadNeedsReview,Qb as tidySection,mn as toModuleUrl,Fr as toPortableRelPath,lj as toStringList,ol as trackerSchema,kj as tryReuseStagingArticles,_g as tzOffsetMs,bj as upsertContentIndexEntry,so as validateDesignArtifacts,Hm as validateDesignOutput,nC as validateProvisionName,GC as validateStateConsistency,FR as versionCreateSchema,NR as versionListItemSchema,BR as versionStatusSchema,ro as viewDefSchema,SC as viewFilterConditionSchema,vC as viewTypeSchema,ij as visionTimeoutMs,xn as wikiDir,bt as workspaceAgentConfigPath,md as writeBack,ok as writeContentIndex,Xy as writeCredentials,QD as writeEnvFile,gd as writeJsonFile,AX as writeProfileRoles,EX as writeRoleDefinitions,gw as writeTableIdToConfig,Ns as writeYaml,aj as yamlFlowList,sj as yamlScalar,TI as yesterdayRange,$l as zodToFormatExample,Tg as zonedDateParts,Bc as zonedWallClockToUtc};
641
+ `)}a(_j,"formatArtifactLint");import{createHash as Aj}from"crypto";var Ej=1,Dj=1;function $j(t){return JSON.stringify(t,(e,n)=>n===null||typeof n!="object"||Array.isArray(n)?n:Object.fromEntries(Object.entries(n).sort(([r],[o])=>r.localeCompare(o))))}a($j,"canonicalJson");function sk(t){return Aj("sha256").update($j(t)).digest("hex")}a(sk,"hashCanonical");function m9(t){return sk({contractVersion:Ej,targetCollection:t.targetCollection,sourceId:t.sourceId,documentId:t.documentId,cardId:t.cardId})}a(m9,"buildCandidateId");function h9(t){return sk({contractVersion:Dj,candidateId:t.candidateId,contentHash:t.contentHash,distillFingerprint:t.distillFingerprint,compareFingerprint:t.compareFingerprint,proposedCandidate:t.proposedCandidate,comparisonDecision:t.comparisonDecision,targetContentHash:t.targetContentHash})}a(h9,"buildCandidateRevision");function y9(t,e){return`${t}::${e}`}a(y9,"buildReviewKey");export{oS as AGENT_TO_ENGINE,zr as BASE_AGENT_DEFS,fe as BotProvisionError,em as BotProvisioner,Ej as CANDIDATE_IDENTITY_CONTRACT_VERSION,Dj as CANDIDATE_REVISION_CONTRACT_VERSION,Ko as CommandAbortedError,Mr as CommandTimeoutError,Io as ConfigSaveError,ji as CronSchedulerSource,fi as DEFAULT_TAXONOMY,Zb as DEFAULT_VISION_BASE_MS,Yb as DEFAULT_VISION_PER_PAGE_MS,Vb as DISTILL_PRESETS,Jo as DWS_HOST_ENV_KEYS,Et as DingTalkRobotClient,he as DwsClient,el as DwsDevRunner,ve as DwsError,li as ENGINE_TO_AGENT,tn as InMemoryGlobalVarStore,lm as InMemoryObjectStore,Ce as IngestError,ti as KNOWN_AGENT_IDS,au as LocalSpawnExecutor,om as PROVISION_PHASES,ue as PathBoundaryError,pu as QUESTION_FORM_TAG,iu as RelayAgentSession,su as RelayExecutor,io as SCAFFOLD_FIELD_NAMES,Ii as ShellNotAllowedError,it as TAGS_INDEX_DIR,y$ as THREAD_CLOSE_REASONS,b$ as THREAD_CONFIDENCES,vd as THREAD_CONTRACT_VERSION,h$ as THREAD_ROLES,xe as TaxonomyError,Cd as ThreadLog,Co as ThreadStore,We as ToolkitError,Ua as Tracer,nj as VISION_META_NAME,tj as VISION_NORMALIZED_NAME,am as WORKSPACE_BUNDLE_FORMAT,U$ as _resetDigestQueues,j$ as _resetThreadStoreRegistry,YK as activateGlobalDwsOnPath,no as agentEngineSchema,gp as agentToEngine,g$ as applyConfigSave,ct as applyProvisionEvent,LR as approvalCandidateSchema,lE as assertDownloadMatchesExtension,Ba as assertPortableId,Ao as assertTableBelongsToBase,XO as assessPdfDensity,Rd as assignThreadRoles,Su as buildAgentChoices,$K as buildArtifactKey,CK as buildBotApprovalReportLines,m9 as buildCandidateId,h9 as buildCandidateRevision,xa as buildClarifyReply,Hi as buildEnvSource,vm as buildEnvSourceSync,lu as buildFixPrompt,Sa as buildMetaPrompt,y9 as buildReviewKey,Vs as canOfferDefaultFor,$j as canonicalJson,WR as checkApprovalSchema,Dl as checkEnv,gk as checkMigrateHint,pl as checkRecipeSyntax,gl as checkRecipeTypes,sr as checkWorkflowRecipes,Tl as checkWorkflows,Cm as chooseDetectedEngine,Jg as classifyProvisionError,tu as cleanupOrphanArticles,sp as codingAgentsConfigSchema,YD as coerceJsonValue,Oy as coerceYamlValue,xo as collectAllItems,yd as collectBaseIdCandidateFiles,zt as collectConfigHints,Km as collectDesignContext,go as collectEnvRefDetails,fA as collectEnvRefs,uc as collectionDir,Oa as commandsInFlight,Ac as composeToolkitRegistry,xd as computeFirstResponse,Id as computeParticipants,cm as computeWorkspaceRevision,hm as configSchema,nk as contentIndexKey,IQ as createApp,mi as createDingTalkAtUserIdResolver,Dx as createExecShellToolkit,kC as createFingerprintWindow,Yg as createInitialProvisionState,NQ as createLocalSpawnExecutor,Dn as createPerWorkflowSettings,Ak as createPrintfLogger,MQ as createRelayExecutor,$x as createStandaloneExecShellToolkit,mw as createWorkflowTable,Qy as credentialsFilePath,NK as decodeWorkspaceBundle,J as defaultCommandRunner,HR as defaultProvisionStatePath,Zt as defaultToolkitRegistry,Sd as degradeConfidence,kh as deriveEnvJsonMapSpec,Lj as describeConfigPath,dc as detectAgentFailure,vu as detectAgents,Rm as detectCodingEngines,Ur as detectInstalledAgents,ni as detectInstalledCodingAgents,VE as detectScope,Ql as detectSourceType,jR as devAppEntrySchema,Qh as discoverLocalSources,YO as distillPresetSpec,lf as drainCommands,Hn as dwsCommandOptions,RK as dwsErrorEnvelopeSchema,ye as dwsPayload,zu as emptyContentIndex,Jy as emptyStore,fm as emptyStreakKey,FK as encodeWorkspaceBundle,Sn as engineToAgent,Hy as enqueueForDigest,xk as enrichLogContext,NO as ensureBaseExists,xu as ensureLatestDws,zd as ensureTableExists,Ut as ensureTsxRegistered,YP as evaluateStrictGate,oC as extractAddBotRobotName,SR as extractAttachmentDetails,eC as extractErrorInfo,Gb as extractPdfPageCount,hC as extractStructuredJson,Lt as fetchFields,RC as fieldDefinitionSchema,IC as fieldTypeSchema,Wj as fileRefConfigSchema,Te as findArrayPayload,S3 as findConflictingCredential,Zo as findCursor,_j as formatArtifactLint,De as formatCommandError,Zr as formatZonedDateTime,_I as formatZonedHm,mC as gateEmptySnapshot,Ly as generateCodingAgentsConfig,Wy as generateMainConfig,I3 as getActiveCredential,ac as getAgentConfig,Kv as getAgentDef,ht as getAitableAgentConfigMeta,Zu as getConfigHint,Kn as getConfigValueAtPath,Df as getCurrentDwsRunner,_f as getCurrentExecutor,dt as getDefaultAgentEntry,Bj as getFileRefHint,um as getGlobalDwsBinPath,La as getLogContext,N$ as getPendingItems,Ks as getSemanticKey,qy as getThreadStore,Ho as getTracer,on as getZodObjectShape,m$ as globalVarRefPath,to as groupEntriesOf,Tj as hasArtifactError,rw as hasHumanStep,BK as hasOssCredentials,wj as hashNormalizedContent,B$ as incrementDigestAttempts,fc as indexPath,bl as inferRecipeContractFromSource,hr as ingest,Fx as initSlsReport,Du as initTable,bf as initTracer,hw as initialTableFields,nn as injectProfileConfig,nr as interpolateEnv,DK as isAllowedArtifactPath,L$ as isDigestQueueEmpty,kp as isDistillPreset,Ji as isEngineDetected,q8 as isGlobalVarRef,gn as isOwnedAutoCreateHint,nl as isPublishedStatus,v as isRecord,cC as isSafeRelativePath,gg as isSlsReportDisabled,Cj as lintArtifacts,Vv as listCodingAgents,R3 as listCredentials,fK as listDwsConversations,fk as listProfiles,uk as listTemplates,sc as loadAgentConfig,dl as loadEventHandlerDefinition,$n as loadEventHandlerDefinitionResult,lt as loadProfileConfig,JR as loadProvisionState,es as loadRecipeDefinition,$t as loadRecipeDefinitionResult,je as loadSettings,At as loadTaxonomy,He as loadWorkflowTemplate,kr as logDateDir,Ml as logPreflightSummary,h as logger,qs as lowerConfidence,yc as mapWithConcurrency,z$ as markDigestFailure,_3 as maskSecret,lk as materializeSharedKnowledge,dk as materializeWithMapping,sf as mergeCommandEnv,YR as mergeEnterpriseRobotCredentials,wd as migrateBaseIdInFiles,tF as moduleDir,KR as nextStepForPhase,aC as normalizeArtifactRelPath,zi as normalizeByType,gc as normalizeCategory,No as normalizeEol,AI as normalizeTimezone,hi as padStaffId,mg as parseDwsAuthIdentity,hg as parseDwsVersionOutput,QR as parseEnterpriseRobots,bh as parseEnvExampleValues,qi as parseEnvValue,Ne as parseFrontmatter,rC as parseGroupTargets,GR as parseProvisionState,mu as parseQuestionForm,rj as parseVisionMeta,Pl as preflightModuleResult,rl as prependGlobalDwsToPath,Hw as printFieldPlan,ru as printKbProgress,ou as printKbSummary,_t as probeCommand,is as probeProjectShape,tl as provisionGuidance,qR as provisionStateFileSchema,VR as provisionedGroupEntrySchema,rk as readContentIndex,To as readCredentials,cj as readSection,Fn as readState,Bu as readTitle,hd as readYamlValueAt,F$ as recoverThreadStoreOnce,zR as redactPayloadForLog,un as refreshKnowledgeBases,U0 as remainingDesignTimeoutMs,W$ as removeFromDigestQueue,QO as renderDistillPrompt,Ca as renderForm,eM as renderForms,gi as renderKbPromptBlock,qb as renderSimpleDistillPrompt,v$ as renderThread,ej as renderVisionNormalizePrompt,pm as repairJsonStringValues,Pc as reportCliEvent,Zn as reportPath,tc as requireAgentDef,Pn as resetProfileCache,GP as resolveAllCollections,or as resolveCodingAgentSelection,nu as resolveCompileAgent,Ue as resolveConfigPath,NW as resolveContactsByUserIds,Rp as resolveDingTalkAtUserId,qe as resolveDingTalkStreamMessageEventContext,Pr as resolveDingTalkWebhookMentionEventContext,Wr as resolveDwsCommandBin,H8 as resolveGlobalVarRef,$e as resolveInsideRoot,mc as resolveKbContext,ir as resolveRecipePath,yg as resolveReportProject,_o as resolveReviewState,ow as resolveReviewStateDetailed,i0 as resolveTriggerTarget,Gi as resolveWorkflowTracker,MR as robotLifecycleSchema,OR as robotResultSchema,PR as robotSubmitSchema,Fs as runCheck,a6 as runClarifyRound,kt as runCodingAgent,oi as runCodingAgentViaSpawn,yk as runCommand,Uw as runDesign,$6 as runDesignCommand,ne as runDwsCommand,k4 as runInit,ho as runInstancePreflight,FY as runKbCleanupCommand,XP as runKbCompileCommand,jY as runKbIngestCommand,OY as runKbStatusCommand,MY as runKbUpdateCommand,pk as runMigrate,hX as runSetupCommand,HX as runSync,ZF as runWithDwsRunner,Ga as runWithExecutor,Sk as runWithLogContext,vl as runWorkflowGate,fH as runWorkflowGates,Pe as safeFilename,gm as safeParseJson,Xg as sanitizeProvisionText,v3 as saveCredential,ZR as saveProvisionState,Us as scaffold,$a as scaffoldFromTemplate,cl as scanWorkflowDirs,Gg as searchDwsChatGroups,Rn as sessionWebhookRegistry,x3 as setActiveAgent,JF as setGlobalDwsRunner,XD as setInJson,Nx as setReportProject,Fu as setupAutomations,jd as setupKnowledgeBases,Ou as setupSurfaceTables,UF as shellToken,af as shouldDetachCommand,oj as shouldRunVisionRound,Md as snapshotRunRecord,Vn as spawnManagedProcess,cf as spawnManagedProcessSync,Lo as splitFrontmatter,zF as stringOrNull,Jb as stripPdfSeparators,qw as syncFieldsFromWorkflow,Nj as tableRefConfigSchema,Tw as tableSource,st as taxonomyCategoryIds,Gr as taxonomyFingerprint,Uy as threadLogFileName,Ro as threadNeedsReview,Qb as tidySection,mn as toModuleUrl,Fr as toPortableRelPath,lj as toStringList,ol as trackerSchema,kj as tryReuseStagingArticles,_g as tzOffsetMs,bj as upsertContentIndexEntry,so as validateDesignArtifacts,Hm as validateDesignOutput,nC as validateProvisionName,GC as validateStateConsistency,FR as versionCreateSchema,NR as versionListItemSchema,BR as versionStatusSchema,ro as viewDefSchema,SC as viewFilterConditionSchema,vC as viewTypeSchema,ij as visionTimeoutMs,xn as wikiDir,bt as workspaceAgentConfigPath,md as writeBack,ok as writeContentIndex,Xy as writeCredentials,QD as writeEnvFile,gd as writeJsonFile,AX as writeProfileRoles,EX as writeRoleDefinitions,gw as writeTableIdToConfig,Ns as writeYaml,aj as yamlFlowList,sj as yamlScalar,TI as yesterdayRange,$l as zodToFormatExample,Tg as zonedDateParts,Bc as zonedWallClockToUtc};