aitable-workflow-core 0.1.13-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,703 @@
1
+ import{a,b as bS}from"./chunk-J5QGFP2Q.js";function Se(t){if(!t||typeof t!="object")return;let e=t;if(e.type!=="dingtalk_stream_message")return;let n=at(e.openMsgId),r=at(e.conversationId),o=at(e.robotCode),i=at(e.credRef);if(!(!n||!r||!o||!i))return{type:"dingtalk_stream_message",openMsgId:n,conversationId:r,robotCode:o,credRef:i}}a(Se,"resolveDingTalkStreamMessageEventContext");function Zt(t){if(!t||typeof t!="object")return;let e=t;if(e.type!=="dingtalk_webhook_mention")return;let n=at(e.conversationId),r=at(e.senderOpenDingTalkId),o=at(e.senderName);if(!(!n||!r||!o))return{type:"dingtalk_webhook_mention",conversationId:n,senderOpenDingTalkId:r,senderName:o}}a(Zt,"resolveDingTalkWebhookMentionEventContext");function at(t){return typeof t=="string"?t.trim():""}a(at,"stringValue");import{z as ct}from"zod";var In="aitableAgentConfig";function CS(t={}){let e=t.ownership==="owned"&&t.autoCreate===!0?ct.string().optional():ct.string(),n=t.ownership==="owned"&&t.autoCreate===!0?ct.enum(["owned","reference","external"]).optional().default("owned"):ct.enum(["owned","reference","external"]).optional();return ct.object({mode:n,baseId:e,tableId:e}).describe(t.description??t.label??"AI \u8868\u683C\u5F15\u7528").meta({[In]:{configType:"tableRef",access:t.access,ownership:t.ownership,autoCreate:t.autoCreate,defaultBase:t.defaultBase,label:t.label,description:t.description,setupSchema:t.setupSchema}})}a(CS,"tableRefConfigSchema");function Js(t){let e=Ve(t);if(!(!e||e.configType!=="tableRef"))return{configType:"tableRef",access:e.access==="read"||e.access==="write"?e.access:void 0,ownership:Zs(e.ownership)?e.ownership:void 0,autoCreate:e.autoCreate===!0,defaultBase:e.defaultBase==="workflow.tracker.base_id"?"workflow.tracker.base_id":void 0,label:typeof e.label=="string"?e.label:void 0,description:typeof e.description=="string"?e.description:void 0,setupSchema:Ys(e.setupSchema)?e.setupSchema:void 0}}a(Js,"getConfigHint");function Ve(t){let n=Xs(t)?.[In];if(!n||typeof n!="object")return;let r=n;return{configType:r.configType==="tableRef"?"tableRef":r.configType==="fileRef"?"fileRef":void 0,expose:r.expose===!0,access:r.access==="read"||r.access==="write"?r.access:void 0,ownership:Zs(r.ownership)?r.ownership:void 0,autoCreate:r.autoCreate===!0,defaultBase:r.defaultBase==="workflow.tracker.base_id"?"workflow.tracker.base_id":void 0,label:typeof r.label=="string"?r.label:void 0,description:typeof r.description=="string"?r.description:void 0,valueType:r.valueType==="string"||r.valueType==="string[]"||r.valueType==="boolean"?r.valueType:void 0,setupSchema:Ys(r.setupSchema)?r.setupSchema:void 0}}a(Ve,"getAitableAgentConfigMeta");function lt(t){return t.ownership==="owned"&&t.autoCreate===!0}a(lt,"isOwnedAutoCreateHint");function Zs(t){return t==="owned"||t==="reference"||t==="external"}a(Zs,"isOwnership");function Ys(t){if(!t||typeof t!="object")return!1;let e=t;return!(e.fields!==void 0&&!Array.isArray(e.fields)||e.views!==void 0&&!Array.isArray(e.views))}a(Ys,"isSetupSchema");function dt(t,e){let n=[];return Qs(Ue(t),[],n,e),n}a(dt,"collectConfigHints");function xS(t,e){let n=Ue(t),r=Gs(n);for(let o of e){let i=ea(n);if(!i)break;n=Ue(i[o]),r=Gs(n)??r}return r}a(xS,"describeConfigPath");function Ct(t,e){let n=t;for(let r of e){if(!n||typeof n!="object")return;n=n[r]}return n}a(Ct,"getConfigValueAtPath");function Qs(t,e,n,r){if(!t)return;let o=Ue(t),i=Js(o);i&&(!r||r(i))&&n.push({path:e,schema:o,hint:i});let s=ea(o);if(s)for(let[c,l]of Object.entries(s))Qs(Ue(l),[...e,c],n,r)}a(Qs,"walkSchema");function Gs(t){let e=Js(t),n=Ve(t);return e?.description??e?.label??n?.description??n?.label??t?.description}a(Gs,"descriptionForSchema");function Xs(t){if(!t)return;let e=t.meta;if(typeof e!="function")return;let n=e.call(t);return n&&typeof n=="object"?n:void 0}a(Xs,"getSchemaMeta");function Ue(t){if(!t)return;let e=t;return typeof e.unwrap=="function"?Ue(e.unwrap()):Ue(e._def?.schema??e.def?.schema)??Ue(e._def?.innerType??e.def?.innerType)??t}a(Ue,"unwrapSchema");function ea(t){if(!t)return null;let e=t,n=e._def?.typeName??e.def?.typeName,r=e._def?.type??e.def?.type,o=e.shape??e._def?.shape??e.def?.shape;return n!=="ZodObject"&&r!=="object"&&!o||!o?null:typeof o=="function"?o():o}a(ea,"objectShape");function TS(t){return(t.required===!1?ct.string().optional():ct.string()).describe(t.description??t.label??"\u6587\u4EF6\u8DEF\u5F84\u5F15\u7528").meta({[In]:{configType:"fileRef",kind:t.kind,required:t.required!==!1,label:t.label,description:t.description}})}a(TS,"fileRefConfigSchema");function _S(t){let e=Ve(t);if(!e||e.configType!=="fileRef")return;let r=Xs(t)?.[In];return{configType:"fileRef",kind:r?.kind==="dir"?"dir":"file",required:r?.required!==!1,label:typeof r?.label=="string"?r.label:void 0,description:typeof r?.description=="string"?r.description:void 0}}a(_S,"getFileRefHint");import fi from"path";import Ic from"fs";import{spawn as Fu}from"child_process";var xt=new Set;function vo(){return xt.size}a(vo,"commandsInFlight");async function ta(t=15e3){let e=Date.now()+t;for(;xt.size>0&&Date.now()<e;)await Promise.race([Promise.allSettled([...xt]),new Promise(n=>setTimeout(n,200))]);return xt.size===0}a(ta,"drainCommands");var G=a((t,e,n={})=>{let r=new Promise((i,s)=>{if(n.signal?.aborted){s(new Error("Command aborted"));return}let c=new AbortController,l=n.timeoutMs&&n.timeoutMs>0?setTimeout(()=>c.abort(),n.timeoutMs):null,d=a(()=>c.abort(),"abortFromParent");n.signal?.addEventListener("abort",d,{once:!0});let u=Fu(t,e,{cwd:n.cwd,env:{...process.env,...n.env},stdio:n.inheritStdio?["inherit","inherit","inherit"]:["pipe","pipe","pipe"],signal:c.signal,detached:!0}),f="",p="";n.inheritStdio||(u.stdout?.setEncoding("utf8"),u.stderr?.setEncoding("utf8"),u.stdout?.on("data",h=>{f+=h}),u.stderr?.on("data",h=>{p+=h}),n.input!==void 0?u.stdin?.end(n.input):u.stdin?.end()),u.on("error",h=>{m(),s(h)}),u.on("close",h=>{m(),i({stdout:f,stderr:p,exitCode:h})});function m(){l&&clearTimeout(l),n.signal?.removeEventListener("abort",d)}a(m,"cleanup")});xt.add(r);let o=a(()=>{xt.delete(r)},"forget");return r.then(o,o),r},"defaultCommandRunner");function ge(t,e){let n=e?.max??800,r=(t??"").trim();if(r.length<=n)return r;let o=r.match(/\b(error|Error|ERROR|fatal|Fatal|FATAL|warning|Warning|WARNING):/),i=o?r.slice(o.index):r;return i.length<=n?i:"\u2026"+i.slice(i.length-n)}a(ge,"formatCommandError");var Ee=class extends Error{static{a(this,"ToolkitError")}retryable;code;constructor(e,n){super(e),this.name="ToolkitError",this.retryable=n?.retryable??!1,this.code=n?.code}};var na=!1;async function Tt(){if(!na){na=!0;try{(await import("tsx/esm/api")).register?.()}catch{}}}a(Tt,"ensureTsxRegistered");function So(t,e){if(!e)return t;let n={};for(let[r,o]of Object.entries(e))o!==void 0&&(n[r]=o);return{...t,...n}}a(So,"overlay");import{z as J}from"zod";import{mkdir as Nu,writeFile as Lu,readdir as Co,readFile as Wu}from"fs/promises";import _t from"path";var ra={debug:0,info:1,warn:2,error:3},Ou=480*60*1e3;function X(t=new Date){return new Date(t.getTime()+Ou).toISOString().replace(/Z$/,"+08:00")}a(X,"formatBeijingTimestamp");var Ro=class{static{a(this,"Logger")}minLevel="info";setLevel(e){this.minLevel=e}debug(e,n,r){this.write("debug",e,n,r)}info(e,n,r){this.write("info",e,n,r)}warn(e,n,r){this.write("warn",e,n,r)}error(e,n,r){this.write("error",e,n,r)}write(e,n,r,o){if(ra[e]<ra[this.minLevel])return;let i={ts:X(),level:e,cat:n,msg:r};o&&Object.keys(o).length>0&&(i.data=o);let s=JSON.stringify(i);e==="error"||e==="warn"?process.stderr.write(`${s}
2
+ `):process.stdout.write(`${s}
3
+ `)}},g=new Ro;var xo=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){let i=this.activeSteps.get(e);i&&(this.activeSteps.delete(e),await this.writeStep(i,n,r,o))}recordLLMCall(e,n){this.activeSteps.get(e)?.llmCalls.push(n)}isActive(e){return this.activeSteps.has(e)}async getTraces(e){let n=_t.join(this.traceDir,e),r;try{r=await Co(n)}catch{return[]}let o=r.filter(s=>s.endsWith(".json")).sort(Bu),i=[];for(let s of o)try{let c=await Wu(_t.join(n,s),"utf8");i.push(JSON.parse(c))}catch{g.warn("tracer","trace \u6587\u4EF6\u4E0D\u53EF\u8BFB\u6216\u635F\u574F\uFF0C\u5DF2\u8DF3\u8FC7",{file:_t.join(n,s)})}return i}async getLatestTraces(e=10){try{let n=await Co(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){let i=Date.now(),c=(this.writeQueues.get(e.itemId)??Promise.resolve()).then(async()=>{let l=await this.nextSeq(e.itemId),d={step_id:e.stepId,step_name:e.stepName,item_id:e.itemId,seq:l,started_at:X(new Date(e.startedAt)),ended_at:X(new Date(i)),duration_ms:i-e.startedAt,status:n,llm_calls:e.llmCalls,inputs:e.inputs,outputs:r,error:o??null};await this.writeTrace(e.itemId,l,e.stepId,d)}).catch(l=>{g.warn("tracer","trace \u5199\u5165\u5931\u8D25",{itemId:e.itemId,stepId:e.stepId,error:l instanceof Error?l.message:String(l)})}).finally(()=>{this.writeQueues.get(e.itemId)===c&&this.writeQueues.delete(e.itemId)});return this.writeQueues.set(e.itemId,c),c}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 Co(_t.join(this.traceDir,e))).filter(r=>r.endsWith(".json")).length}catch{return 0}}async writeTrace(e,n,r,o){let i=_t.join(this.traceDir,e);await Nu(i,{recursive:!0});let s=X().slice(0,23).replace(/[:.]/g,"-"),c=`${String(n).padStart(3,"0")}-${r}-${s}.json`,l=_t.join(i,c);await Lu(l,JSON.stringify(o,null,2),"utf8"),g.debug("tracer","trace \u5DF2\u5199\u5165",{filepath:l})}};function Bu(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(Bu,"compareBySeq");var To=null;function oa(t){return To=new xo(t),To}a(oa,"initTracer");function En(){return To}a(En,"getTracer");function Yt(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 g.debug("llm","chat \u8C03\u7528",{model:o,promptLength:n.length}),await zu(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(`
4
+ `),l=await this.chat(c,o),d=ia(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(`
5
+ `),i=await this.chat(o,{temperature:0}),s=ia(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(Yt,"createLLMToolkit");async function zu(t,e,n,r){let{url:o,headers:i,body:s}=Uu(t,e,n),c=Date.now(),l=await fetch(o,{method:"POST",headers:i,body:JSON.stringify(s)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`LLM API \u8C03\u7528\u5931\u8D25 (${l.status}): ${m.slice(0,300)}`)}let d=await l.json(),u=Vu(t,d),f=Date.now()-c,p=En();if(r&&p?.isActive(r)){let m=n.messages.map(k=>k.content).join(`
6
+ `),h={purpose:n.messages[n.messages.length-1]?.content.slice(0,50)??"chat",model:n.model,prompt_summary:m.slice(0,300),response_summary:u.slice(0,500),prompt_tokens_approx:Math.ceil(m.length/4),duration_ms:f};p.recordLLMCall(r,h)}return u}a(zu,"callLLM");function Uu(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(Uu,"buildRequest");function Vu(t,e){return t==="anthropic"?e.content?.[0]?.text??"":e.choices?.[0]?.message?.content??""}a(Vu,"extractLLMContent");function ia(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(ia,"extractJSON");function qu(t,e){return t??e}a(qu,"resolveApiKey");var Hu=J.object({model:J.string().min(1).optional().describe("LLM \u6A21\u578B\u540D,\u5982 qwen-max / claude-opus-4-8"),provider:J.enum(["dashscope","openai","anthropic","idealab"]).optional().describe("\u6A21\u578B\u670D\u52A1\u5546"),api_key:J.string().min(1).optional().describe("LLM API Key;\u503C\u7528 ${env.XXX} \u4ECE\u73AF\u5883\u6CE8\u5165(\u52A0\u8F7D\u65F6\u63D2\u503C)")}).strict(),sa=J.object({model:J.string().optional().describe("\u6A21\u578B\u8986\u76D6"),temperature:J.number().optional(),maxTokens:J.number().optional(),systemPrompt:J.string().optional()}).describe("LLM \u8C03\u7528\u9009\u9879"),aa={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:Hu,methods:[{name:"chat",description:"\u5355\u6B21 LLM \u5BF9\u8BDD",params:J.object({prompt:J.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),options:sa.optional()}),output:J.string()},{name:"chatJSON",description:"\u7ED3\u6784\u5316 JSON \u8F93\u51FA",params:J.object({prompt:J.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),schema:J.record(J.string(),J.unknown()).describe("\u671F\u671B\u8F93\u51FA\u7684 JSON Schema"),options:sa.optional()}),output:J.unknown().describe("\u6309\u4F20\u5165 schema \u89E3\u6790\u51FA\u7684\u5BF9\u8C61")},{name:"classify",description:"\u6587\u672C\u5206\u7C7B",params:J.object({text:J.string().describe("\u5F85\u5206\u7C7B\u6587\u672C"),categories:J.array(J.string()).describe("\u5019\u9009\u7C7B\u522B")}),output:J.object({category:J.string(),confidence:J.number()})}],defaultConfig(t){let e=t.recipe.llm;return{model:e?.model??"qwen-max",provider:e?.provider??"dashscope"}},build(t,e){return Yt({llm:{provider:t.provider,model:t.model,api_key:qu(t.api_key,e.settings.recipe.llm?.api_key)},itemId:e.item.id})}};import{z as O}from"zod";function y(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(y,"isRecord");function JS(t){return typeof t=="string"&&t.trim()!==""?t:typeof t=="number"||typeof t=="boolean"?String(t):null}a(JS,"stringOrNull");function ZS(t){return/^[A-Za-z0-9._/:=@+-]+$/.test(t)?t:`'${t.replace(/'/g,`'"'"'`)}'`}a(ZS,"shellToken");import{AsyncLocalStorage as ca}from"async_hooks";var la=new ca;function da(t,e){return la.run(t,e)}a(da,"runWithExecutor");function ua(){return la.getStore()}a(ua,"getCurrentExecutor");var fa=new ca,pa;function eR(t){pa=t}a(eR,"setGlobalDwsRunner");function tR(t,e){return fa.run(t,e)}a(tR,"runWithDwsRunner");function ga(){return fa.getStore()??pa}a(ga,"getCurrentDwsRunner");var Ku=[300,1e3,2e3];async function An(t,e){let n=e?.retries??2,r=e?.delaysMs??Ku;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 Gu(l)}}a(An,"withRetry");var It=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 Gu(t){return new Promise(e=>setTimeout(e,t))}a(Gu,"sleep");var Ju=3,de=class extends Error{static{a(this,"DwsError")}exitCode;stderr;raw;constructor(e,n){super(e),this.name="DwsError",this.exitCode=n?.exitCode??null,this.stderr=n?.stderr??"",this.raw=n?.raw??null}},re=class{static{a(this,"DwsClient")}bin;timeoutMs;runner;failures=new It(Ju);constructor(e){this.bin=e.bin,this.timeoutMs=e.timeoutMs??3e4,this.runner=e.runner??G}async runJson(e,n){let r=Zu(e),o=n?.timeoutMs??this.timeoutMs,i=r.slice(0,3).join(" "),s=Date.now(),c=ga();if(c)return g.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 this.runner(this.bin,r,{timeoutMs:o})}catch(p){throw Qu(p,o)}if(d.exitCode!==0)throw new de(`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 de("dws did not return valid JSON",{exitCode:d.exitCode,stderr:d.stderr,raw:d.stdout})}return Yu(f,d.stderr),f},"attempt");try{let d=await An(l,{onRetry:a((f,p)=>{let m={cmd:i,retry:p,error:ma(f)};p>=2?g.warn("dws","runJson transient failure, retrying",m):g.debug("dws","runJson transient failure, retrying",m)},"onRetry")}),{recovered:u}=this.failures.succeed(i);return u&&g.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),m={cmd:i,elapsed:u,consecutive:f,error:ma(d),stderr:d instanceof de?d.stderr.slice(0,500):void 0};throw p?g.error("dws","runJson sustained failure \u2014 likely real misconfig, not a transient blip",m):g.warn("dws","runJson failed after retries",m),d}}};function oe(t){return y(t)?"body"in t?t.body:"data"in t?t.data:"result"in t?t.result:y(t.response)?"body"in t.response?t.response.body:"data"in t.response?t.response.data:t.response:t:t}a(oe,"dwsPayload");function ie(t){let e=oe(t),n=ha(e);if(n)return n;if(y(e))for(let r of Object.values(e)){let o=ha(r);if(o)return o}return[]}a(ie,"findArrayPayload");function Dn(t){let e=oe(t),n=ya(e,["nextCursor","next_cursor","cursor"]);return n&&n.trim()!==""?n:null}a(Dn,"findCursor");function Zu(t){return t.includes("--format")||t.includes("-f")?t:[...t,"--format","json"]}a(Zu,"ensureJsonFormat");function Yu(t,e){if(!y(t))return;let n=[t];for(let r of["body","data","result","response"]){let o=t[r];y(o)&&n.push(o)}for(let r of n){if(r.success===!1||String(r.success).toLowerCase()==="false")throw new de("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 de(o?`dws degraded: ${o}`:"dws response reported degraded",{stderr:e,raw:t})}}}a(Yu,"assertDwsSuccess");function ma(t){return t instanceof Error?t.message:String(t)}a(ma,"errorMessage");function Qu(t,e){if(t instanceof de)return t;let n=t instanceof Error?t.message:String(t);return t instanceof Error&&t.name==="AbortError"?new de(`dws timed out after ${e}ms: ${n}`):new de(`dws runner failed: ${n}`)}a(Qu,"wrapRunnerError");function ha(t){if(Array.isArray(t))return t;if(!y(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(ha,"findKnownArray");function ya(t,e){if(!y(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(y(n)){let r=ya(n,e);if(r)return r}return null}a(ya,"findStringByKeys");var Xu=300*1e3,_o=new Map;function ef(t){let e=`${t.baseId}/${t.tableId}`;_o.delete(e)}a(ef,"_clearFieldIdCacheFor");async function tf(t,e){let n=`${e.baseId}/${e.tableId}`,r=_o.get(n);if(r&&Date.now()-r.ts<Xu)return r.map;let o=await t.runJson(["aitable","field","get","--base-id",e.baseId,"--table-id",e.tableId]),i=ie(o),s=new Map;for(let c of i){if(!y(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 _o.set(n,{map:s,ts:Date.now()}),g.debug("table","\u5B57\u6BB5\u6620\u5C04\u5DF2\u52A0\u8F7D",{target:e,count:s.size}),s}a(tf,"fetchFieldIdMap");function Io(t){return ie(t).map(n=>{let r=oe(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(Io,"extractRecordIds");function nf(t){return ie(t).map(n=>{let r=oe(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(nf,"extractRecords");function rf(t,e,n){return{async readCurrentRow(){let[r]=await t.fetchItemsByIds([e.id]);return r?.fields??e.fields},async updateCurrentRow(r){await t.updateFields(e.id,r)},async queryRows(r,o){let i=await t.fetchAllItems();return(o!==void 0?i.slice(0,o):i).map(c=>c.fields)},async createRecordIn(r,o){Pn(n);let i=await n.runJson(["aitable","record","create","--base-id",r.baseId,"--table-id",r.tableId,"--records",JSON.stringify([{cells:o}]),"--yes"]),s=Io(i);if(s.length===0)throw new Error(`createRecordIn: dws \u672A\u8FD4\u56DE recordId\uFF08target=${r.baseId}/${r.tableId}\uFF09`);return g.debug("table","createRecordIn \u6210\u529F",{target:r,recordId:s[0]}),{recordId:s[0]}},async createRecordsIn(r,o){if(Pn(n),o.length===0)return{recordIds:[]};let i=await n.runJson(["aitable","record","create","--base-id",r.baseId,"--table-id",r.tableId,"--records",JSON.stringify(o.map(c=>({cells:c}))),"--yes"]),s=Io(i);return g.debug("table","createRecordsIn \u6210\u529F",{target:r,count:s.length}),{recordIds:s}},async upsertRecordIn(r,o,i){Pn(n);let s=i[o];if(s===void 0)throw new Error(`upsertRecordIn: fields \u4E2D\u7F3A\u5C11\u552F\u4E00\u952E "${o}"`);return wa(n,r,o,s,i,0)},async updateRecordIn(r,o,i){if(Pn(n),!o)throw new Error(`updateRecordIn: recordId \u4E3A\u7A7A\uFF08target=${r.baseId}/${r.tableId}\uFF09`);await n.runJson(["aitable","record","update","--base-id",r.baseId,"--table-id",r.tableId,"--records",JSON.stringify([{recordId:o,cells:i}]),"--yes"]),g.debug("table","updateRecordIn \u6210\u529F",{target:r,recordId:o})}}}a(rf,"createTableToolkit");async function wa(t,e,n,r,o,i){let l={operator:"and",operands:[{operator:"eq",operands:[(await tf(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=nf(d);if(u.length>0){let f=u[0].recordId;return await t.runJson(["aitable","record","update","--base-id",e.baseId,"--table-id",e.tableId,"--records",JSON.stringify([{recordId:f,cells:o}]),"--yes"]),g.debug("table","upsertRecordIn \u66F4\u65B0",{target:e,recordId:f,uniqueBy:n}),{recordId:f}}try{let f=await t.runJson(["aitable","record","create","--base-id",e.baseId,"--table-id",e.tableId,"--records",JSON.stringify([{cells:o}]),"--yes"]),p=Io(f);if(p.length===0)throw new Error("upsertRecordIn: create \u540E dws \u672A\u8FD4\u56DE recordId");return g.debug("table","upsertRecordIn \u65B0\u5EFA",{target:e,recordId:p[0],uniqueBy:n}),{recordId:p[0]}}catch(f){if(i===0)return ef(e),g.debug("table","upsertRecordIn create \u5931\u8D25\uFF0C\u6E05\u9664\u5B57\u6BB5\u7F13\u5B58\u540E\u91CD\u8BD5",{target:e,uniqueBy:n,error:String(f)}),wa(t,e,n,r,o,1);throw f}}a(wa,"doUpsertRecordIn");function Pn(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(Pn,"ensureDws");function of(t){return new re({bin:t.tracker.dws_bin})}a(of,"createDwsFromSettings");var ka={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:O.object({}).strict(),build(t,e){let n=of(e.settings);return rf(e.tracker,e.item,n)},methods:[{name:"readCurrentRow",description:"\u8BFB\u53D6\u5F53\u524D\u884C\u6570\u636E",output:O.record(O.string(),O.unknown())},{name:"updateCurrentRow",description:"\u66F4\u65B0\u5F53\u524D\u884C\u5B57\u6BB5",params:O.object({fields:O.record(O.string(),O.unknown()).describe("\u8981\u5199\u5165\u7684\u5B57\u6BB5\u952E\u503C")})},{name:"queryRows",description:"\u67E5\u8BE2\u5176\u4ED6\u884C",params:O.object({filter:O.record(O.string(),O.unknown()).describe("\u67E5\u8BE2\u6761\u4EF6"),limit:O.number().optional().describe("\u8FD4\u56DE\u6761\u6570\u4E0A\u9650")}),output:O.array(O.record(O.string(),O.unknown()))},{name:"createRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u521B\u5EFA\u4E00\u6761\u8BB0\u5F55",params:O.object({target:O.object({baseId:O.string(),tableId:O.string()}),fields:O.record(O.string(),O.unknown())}),output:O.object({recordId:O.string()})},{name:"createRecordsIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6279\u91CF\u521B\u5EFA\u8BB0\u5F55",params:O.object({target:O.object({baseId:O.string(),tableId:O.string()}),rows:O.array(O.record(O.string(),O.unknown()))}),output:O.object({recordIds:O.array(O.string())})},{name:"upsertRecordIn",description:"\u6309\u552F\u4E00\u952E upsert\uFF08\u547D\u4E2D\u5219 update\uFF0C\u672A\u547D\u4E2D\u5219 create\uFF09",params:O.object({target:O.object({baseId:O.string(),tableId:O.string()}),uniqueBy:O.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),fields:O.record(O.string(),O.unknown())}),output:O.object({recordId:O.string()})}],permissions:[{method:"updateCurrentRow",description:"\u5199\u5165\u8868\u683C\u884C\u6570\u636E(\u9650\u5B9A\u53EF\u5199\u7684\u8868)",scopeSchema:O.array(O.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 te}from"zod";import Je from"path";import Dt from"fs";import{readFile as If}from"fs/promises";import $o from"path";import{z}from"zod";import{execSync as xf}from"child_process";var sf=/^(Error|ERROR|fatal|FATAL|crash|CRASH|panic|PANIC|exception|EXCEPTION)\b/;function qe(t){return sf.test(t)}a(qe,"isStderrError");function Y(t){if(!(!t||typeof t!="object"||Array.isArray(t)))return t}a(Y,"asRecord");function D(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim().length>0)return r}}a(D,"pickString");function Qt(t,e=512){return t.length>e?`${t.slice(0,e)}...`:t}a(Qt,"truncateText");var af=["content","text","message","delta","output"];function cf(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(cf,"mapStructuredType");function lf(t){let e=D(t,["type","event","kind","level"])??"text",n=cf(e),r=D(t,["toolName","tool_name","tool","name"]),o=Y(t.toolInput)??Y(t.input);return{type:n,content:D(t,af),toolName:r,toolInput:typeof t.toolInput=="string"?t.toolInput:void 0,toolInputRaw:o,sessionId:D(t,["sessionId","session_id","conversationId","conversation_id"]),requestId:D(t,["requestId","request_id","id"]),done:!!t.done||n==="result"}}a(lf,"fromStructuredJson");function df(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(df,"fromTextLine");function ut(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:[lf(n)],structured:!0}}catch{}return{events:[df(e)],structured:!1}}a(ut,"parseAgentLine");function uf(t,e){let n=Y(e);if(!n)return"";switch(t){case"Read":case"Edit":case"Write":{let o=D(n,["file_path","filePath","path"]);if(o)return o;break}case"Bash":{let o=D(n,["command","cmd"]);if(o)return o;break}case"Grep":case"Glob":{let o=D(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(uf,"summarizeToolInput");function ff(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=Y(n);if(!r)continue;let o=D(r,["type"])??"";if(o==="text"){let i=D(r,["text"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=D(r,["thinking","text"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"){let i=D(r,["name"])??"unknown";e.push({type:"tool_use",requestId:D(r,["id"]),toolName:i,toolInput:uf(i,r.input),toolInputRaw:Y(r.input)})}else if(o==="tool_result"){let i=D(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(ff,"parseContentBlocks");function pf(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=D(e,["type"])??"",r=D(e,["session_id","sessionId"]),o=a(i=>r?{...i,sessionId:r}:i,"addSession");if(n==="assistant"||n==="user"){let i=Y(e.message);return i?ff(i.content).map(o):[o({type:"text",content:""})]}if(n==="result"){let i=D(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=D(e,["error","message","content"])??"unknown error";return[o({type:"error",content:i,done:!0})]}return null}a(pf,"parseClaudeLine");function Eo(){return(t,e)=>{if(t==="stderr"){let o=e.trim();return o?qe(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=pf(n);return r&&r.length>0?r:ut(n).events}}a(Eo,"createClaudeParser");var ba={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("--session-id",e),o.push("-p",t),o},"buildArgs"),createParser:Eo};function Ao(t){return D(t,["text","content","message","summary"])??""}a(Ao,"extractItemText");function ft(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(ft,"stringifyValue");function Do(t,e){let n=Y(t.error);return D(t,["message","error","content"])??(n?D(n,["message","error","content"]):void 0)??ft(t.error)??e}a(Do,"extractErrorText");function gf(t){return D(t,["command","query","input","arguments"])??ft(t.arguments)??ft(t.input)??ft(t.changes)}a(gf,"extractToolInput");function mf(t){let e=D(t,["aggregated_output","output","result","message","text","summary"])??ft(t.output)??ft(t.result)??ft(t.changes);return e||(typeof t.exit_code=="number"?`exit_code=${t.exit_code}`:void 0)}a(mf,"extractToolResult");function hf(t,e){if(e!=="mcp_tool_call")return e||"codex_tool";let n=D(t,["server","server_name"]),r=D(t,["tool","tool_name","name"]);return[n,r].filter(Boolean).join(".")||e}a(hf,"codexToolName");function yf(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=D(e,["type"])??"";if(n==="thread.started"){let r=D(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:Do(e,"Codex turn failed"),done:!0}];if(n==="item.started"||n==="item.updated"||n==="item.completed"){let r=Y(e.item);if(!r)return[];let o=D(r,["type"])??"",i=D(r,["id","call_id"]),s=n==="item.completed";if(o==="agent_message"){if(!s)return[];let l=Ao(r);return l?[{type:"result",content:l,requestId:i,done:!0}]:[]}if(o==="reasoning"){if(!s)return[];let l=Ao(r);return l?[{type:"thinking",content:l,requestId:i}]:[]}if(o==="error")return[{type:"error",content:Do(r,"Codex item failed"),requestId:i,done:!0}];let c=hf(r,o);return n==="item.started"?[{type:"tool_use",toolName:c,toolInput:gf(r),toolInputRaw:r,requestId:i}]:s?[{type:"tool_result",toolName:c,content:mf(r),requestId:i}]:[]}if(n==="message.delta"){let r=Y(e.delta)??Y(e.content);if(!r)return[];let o=D(r,["text","content","value"]);return o?(D(r,["role"])??D(e,["role"]))==="system"?[]:[{type:"text",content:o}]:[]}if(n==="message.completed"){let r=Y(e.message)??Y(e.content);if(!r)return[];let o=Array.isArray(r.content)?r.content.map(i=>{let s=Y(i);return s?Ao(s):""}).filter(i=>i.length>0).join(`
7
+ `):D(r,["text","content"])??"";return o?[{type:"result",content:o,done:!0}]:[]}if(n==="tool_use"||n==="function_call"){let r=D(e,["name","tool","toolName"])??"unknown",o=D(e,["input","arguments"]);return[{type:"tool_use",toolName:r,toolInput:o,requestId:D(e,["id","call_id"])}]}return n==="tool_result"||n==="function_result"?[{type:"tool_result",content:D(e,["output","result","content"]),requestId:D(e,["tool_use_id","call_id","id"])}]:n==="error"?[{type:"error",content:Do(e,"unknown error"),done:!0}]:null}a(yf,"parseCodexJsonLine");function wf(){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)?[]:qe(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=yf(n);return r!==null?r:ut(n).events}}a(wf,"createCodexParser");var va={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:wf};function kf(t){if(typeof t!="string")return;let e=t.trim();if(!(!e.startsWith("{")||!e.endsWith("}")))try{return Y(JSON.parse(e))}catch{return}}a(kf,"parseRecordString");function $n(t){return Y(t)??kf(t)}a($n,"parseToolInputRaw");function bf(t){return(t??"").replace(/[^a-z]/gi,"").toLowerCase()==="askuserquestion"}a(bf,"isAskUserQuestionTool");function vf(t){let e=$n(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=Y(o);if(!i)continue;let s=D(i,["header","title"]),c=D(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=Y(u);return f?D(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 Qt(r.join(" | "))}a(vf,"summarizeAskUserQuestion");function Sa(t,e){if(bf(t)){let r=vf(e);if(r)return r}if(typeof e=="string"&&e.trim().length>0)return Qt(e);let n=$n(e);if(n)return Qt(JSON.stringify(n))}a(Sa,"summarizeToolInput");function Sf(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=Y(n);if(!r)continue;let o=D(r,["type"])??"";if(o==="text"){let i=D(r,["text","content"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=D(r,["thinking","text","content"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"||o==="tool_call"){let i=D(r,["name","toolName","tool_name","tool"])??"unknown",s=r.input??r.toolInput??r.arguments;e.push({type:"tool_use",requestId:D(r,["id","requestId","request_id"]),toolName:i,toolInput:Sa(i,s),toolInputRaw:$n(s)})}else if(o==="tool_result"||o==="tool_output"){let i=typeof r.content=="string"?r.content:D(r,["output","result"]),s=!!r.is_error;e.push({type:s?"error":"tool_result",requestId:D(r,["tool_use_id","id","requestId","request_id"]),content:i})}}return e}a(Sf,"parseQoderContentBlocks");function Rf(t,e){if(!t.startsWith("{")||!t.endsWith("}"))return null;let n;try{n=JSON.parse(t)}catch{return null}let r=D(n,["messageId","message_id","id"]);if(r&&e.has(r))return[];r&&e.add(r);let o=D(n,["type","event"])??"",i=D(n,["sessionId","session_id"]),s=a(c=>i?{...c,sessionId:i}:c,"addSession");if(o==="system")return[];if(o==="text"){let c=D(n,["content","text","message","delta"]);return c?[s({type:"text",content:c})]:[]}if(o==="assistant"||o==="message"){let c=Y(n.message),l=Sf(c?.content??n.content);if(l.length>0)return l.map(s);let d=D(n,["content","text","message","delta"])??(c?D(c,["content","text","message","delta"]):void 0);return d?[s({type:"text",content:d})]:[]}if(o==="thinking"||o==="thought"||o==="reasoning"){let c=D(n,["content","text","thinking"]);return c?[s({type:"thinking",content:c})]:[]}if(o==="tool_use"||o==="tool_call"){let c=D(n,["toolName","tool_name","name","tool"])??"unknown",l=n.toolInput??n.input??n.arguments;return[s({type:"tool_use",toolName:c,toolInput:Sa(c,l),toolInputRaw:$n(l),requestId:D(n,["requestId","request_id","id"])})]}if(o==="tool_result"||o==="tool_output"){let c=D(n,["content","output","result"]);return[s({type:"tool_result",content:c,requestId:D(n,["requestId","request_id","tool_use_id"])})]}if(o==="result"||o==="final"||o==="done"){let c=D(n,["content","result","text"])??"";return[s({type:"result",content:c,done:!0})]}if(o==="error"){let c=D(n,["content","error","message"])??"unknown error";return[s({type:"error",content:c,done:!0})]}return null}a(Rf,"parseQoderJsonLine");function Cf(){let t=new Set,e=!1;return(n,r)=>{if(n==="stderr"){let s=r.trim();return s?qe(s)?[{type:"error",content:s}]:[]:[]}let o=r.trim();if(!o)return[];let i=Rf(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(Cf,"createQoderParser");var Ra={id:"qoder",name:"Qoder",bin:"qodercli",fallbackBins:["qoder"],versionArgs:["--version"],promptViaStdin:!1,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("--session-id")&&o.push("--session-id",e),o.push("--",t),o},"buildArgs"),createParser:Cf};var Ca={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.push("--session-id",e),o.push("-p",t),o},"buildArgs"),createParser:Eo};function He(){return(t,e)=>{let n=e.trim();return n?t==="stderr"?qe(n)?[{type:"error",content:n}]:[]:ut(n).events:[]}}a(He,"createGenericParser");var xa={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:He};var Ta={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:He};var _a={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:He};var Ia={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:He};var Xt=[ba,va,Ra,Ca,xa,Ta,_a,Ia],Ea=new Map(Xt.map(t=>[t.id,t])),Mn=Xt.map(t=>t.id);function Tf(t){return Ea.get(t)}a(Tf,"getAgentDef");function Po(t){let e=Ea.get(t);if(!e)throw new Error(`\u4E0D\u652F\u6301\u7684 Agent \u7C7B\u578B: ${t}\uFF08\u5DF2\u767B\u8BB0: ${Mn.join(", ")}\uFF09`);return e}a(Po,"requireAgentDef");function jn(){let t=[];for(let e of Xt){let n=[e.bin,...e.fallbackBins??[]],r=e.versionArgs[0]??"--version";for(let o of n)try{let i=xf(`${o} ${r}`,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim();t.push({id:e.id,cmd:o,version:i.split(`
8
+ `)[0]});break}catch{}}return t}a(jn,"detectInstalledCodingAgents");function _f(){let t=jn(),e=new Map(t.map(n=>[n.id,n]));return Xt.map(n=>{let r=e.get(n.id);return{id:n.id,name:n.name,bin:n.bin,fallbackBins:n.fallbackBins??[],promptViaStdin:n.promptViaStdin,installed:!!r,detectedCmd:r?.cmd,detectedVersion:r?.version}})}a(_f,"listCodingAgents");var Ke="bypassPermissions",Aa="gpt-5.5",Da="full-auto",Pa="high",Fn=z.object({enabled:z.boolean().default(!1),cmd:z.string().min(1).optional(),args:z.array(z.string()).default([]),workDir:z.string().min(1).optional(),model:z.string().optional(),env:z.record(z.string(),z.string()).default({})}),Ef=Fn.extend({permissionMode:z.enum([Ke]).optional(),allowedTools:z.array(z.string()).optional()}),Af=Fn.extend({model:z.string().min(1).default(Aa),permissionMode:z.enum([Ke]).default(Ke),mode:z.enum(["suggest","full-auto","yolo"]).default(Da),reasoningEffort:z.enum(["low","medium","high","xhigh"]).default(Pa),search:z.boolean().default(!1),addDirs:z.array(z.string()).optional(),ignoreUserConfig:z.boolean().default(!1)}),Df=Fn.extend({permissionMode:z.enum([Ke]).default(Ke)}),Pf=Fn.extend({permissionMode:z.enum([Ke]).optional(),allowedTools:z.array(z.string()).optional(),mode:z.enum(["suggest","full-auto","yolo"]).optional(),reasoningEffort:z.enum(["low","medium","high","xhigh"]).optional(),reasoning:z.string().optional(),search:z.boolean().optional(),addDirs:z.array(z.string()).optional(),ignoreUserConfig:z.boolean().optional()}).passthrough(),Mo={enabled:!0,args:[],env:{}},jo={enabled:!1,args:[],env:{},model:Aa,permissionMode:Ke,mode:Da,reasoningEffort:Pa,search:!1,ignoreUserConfig:!1},Fo={enabled:!1,args:[],env:{},permissionMode:Ke},$a=z.object({version:z.number().int().positive().default(1),agents:z.object({claudecode:Ef.default(Mo),codex:Af.default(jo),qoder:Df.default(Fo)}).catchall(Pf).default({claudecode:Mo,codex:jo,qoder:Fo})}),$f={version:1,agents:{claudecode:Mo,codex:jo,qoder:Fo}},Ma="coding-agents.config.json";function Ae(t){return $o.join(t,Ma)}a(Ae,"workspaceAgentConfigPath");async function Oo(t){let e=t?$o.resolve(t):$o.resolve(process.cwd(),Ma),n;try{n=await If(e,"utf8")}catch{return $f}let r;try{r=JSON.parse(n)}catch(i){throw new Error(`coding-agents \u914D\u7F6E JSON \u89E3\u6790\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`)}let o=$a.safeParse(r);if(!o.success)throw new Error(`coding-agents \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25:
9
+ ${JSON.stringify(o.error.issues,null,2)}`);return o.data}a(Oo,"loadAgentConfig");function No(t,e){return t.agents[e]??{enabled:!1,args:[],env:{}}}a(No,"getAgentConfig");function en(){return jn().map(({id:t,cmd:e,version:n})=>({type:t,cmd:e,version:n}))}a(en,"detectInstalledAgents");import{EventEmitter as Mf}from"events";import{spawn as jf}from"child_process";function Ff(t,e){t.value+=e;let n=t.value.split(/\r?\n/);return t.value=n.pop()??"",n.filter(r=>r.trim().length>0)}a(Ff,"extractLines");function ja(t){let e=t.value.trim();return t.value="",e.length>0?[e]:[]}a(ja,"flushLines");var tn=class extends Mf{static{a(this,"BaseCliSession")}currentId;child;alive=!0;sending=!1;interrupted=!1;constructor(e){super(),this.currentId=typeof e=="string"?e.trim():""}currentSessionId(){return this.currentId}isAlive(){return this.alive}emitEvents(e,n,r){for(let o of e)o.sessionId&&(this.currentId=o.sessionId),o.content&&o.content.trim().length>0&&(n.value+=`${o.content}
10
+ `),o.type==="result"&&(r.value=!0),this.emit("event",o)}emitLifecycle(e){this.emit("lifecycle",{provider:this.providerName(),...e})}async runOnce(e,n){let r=this.buildInvocation(e,n),o=r.cwd??process.cwd(),i=Date.now(),s={...process.env,...r.env??{},PWD:o},c=jf(r.cmd,r.args,{cwd:o,env:s,stdio:["pipe","pipe","pipe"]});this.child=c,this.emitLifecycle({phase:"process_spawned",elapsedMs:0,pid:c.pid,cmd:r.cmd,cwd:o}),r.stdinPrompt&&c.stdin.write(`${e}
11
+ `),c.stdin.end();let l={value:""},d={value:!1},u={stdout:!1,stderr:!1},f={value:""},p={value:""},m=a((k,w)=>{u[k]||(u[k]=!0,this.emitLifecycle({phase:k==="stdout"?"first_stdout":"first_stderr",elapsedMs:Date.now()-i,pid:c.pid}));let b=w.toString("utf8"),S=Ff(k==="stdout"?f:p,b);for(let v of S){let x=this.parseOutputLine(k,v);this.emitEvents(x,l,d)}},"onChunk");c.stdout.on("data",k=>m("stdout",k)),c.stderr.on("data",k=>m("stderr",k));let h=await new Promise((k,w)=>{c.once("error",w),c.once("close",b=>{for(let C of ja(f)){let S=this.parseOutputLine("stdout",C);this.emitEvents(S,l,d)}for(let C of ja(p)){let S=this.parseOutputLine("stderr",C);this.emitEvents(S,l,d)}!d.value&&l.value.trim().length>0&&this.emitEvents([{type:"result",content:l.value.trim(),done:!0}],l,d),this.emitLifecycle({phase:"process_closed",elapsedMs:Date.now()-i,pid:c.pid,exitCode:b??0}),k(b??0)})});if(!this.interrupted&&h!==0){let k=l.value.trim()||`process exited with code ${h}`;d.value||this.emit("event",{type:"error",content:k,done:!0})}}async send(e){if(!this.alive)throw new Error("agent session is closed");if(this.sending)throw new Error("agent session is busy");this.sending=!0,this.interrupted=!1;try{await this.runOnce(e,this.currentId)}finally{this.child=void 0,this.sending=!1}}async close(){this.alive=!1,this.child&&!this.child.killed&&(this.interrupted=!0,this.child.kill("SIGTERM")),this.child=void 0,this.emit("close")}};var Lo=class extends tn{static{a(this,"DefDrivenSession")}def;options;parser;constructor(e,n,r){super(r),this.def=e,this.options=n,this.parser=e.createParser()}providerName(){return this.def.id}buildInvocation(e,n){let r=this.options.cmd??this.def.bin,o=this.options.args??[],i=this.def.buildArgs(e,{sessionId:n,baseArgs:o,options:this.options});return{cmd:r,args:i,stdinPrompt:this.def.promptViaStdin,cwd:this.options.workDir,env:{...this.options.env??{}}}}parseOutputLine(e,n){return this.parser(e,n)}};function Fa(t,e){return{name:t.id,async startSession(n){return new Lo(t,e,n)},async stop(){}}}a(Fa,"createDefAdapter");function Wo(t,e){let n=Po(t);return Fa(n,e)}a(Wo,"createCodingAgent");async function we(t,e){let n=ua();return n?n.run(t,e):On(t,e)}a(we,"runCodingAgent");async function On(t,e){let n=await Oo(e?.configPath),r=e?.agent;if(!r)throw new Error("runCodingAgent: \u672A\u6307\u5B9A agent\u3002\u9009\u578B\u7531 aitable-workflow.config.yml \u7684 agent.engine \u51B3\u5B9A\uFF08claude/codex/qoder\uFF09\uFF1Bllm_only \u65E0\u53EF\u7528 coding agent\u3002");let i={...No(n,r),...e?.workDir?{workDir:e.workDir}:{},...e?.model?{model:e.model}:{},...e?.adapterOptions??{}},s=Wo(r,i),c=await s.startSession(e?.sessionId),l=[],d="";c.on("event",k=>{l.push(k),e?.onEvent?.(k),k.type==="result"&&k.content?d=k.content:k.type==="text"&&k.content&&(d||(d+=k.content))}),c.on("lifecycle",k=>{e?.onLifecycle?.(k)});let u=e?.timeoutMs??6e5,f=new Promise((k,w)=>{setTimeout(()=>{c.close().catch(()=>{}),w(new Error(`coding agent \u6267\u884C\u8D85\u65F6 (${u}ms)`))},u).unref?.()}),p=e?.signal,m,h=new Promise((k,w)=>{if(!p)return;let b=a(()=>{c.close().catch(()=>{}),w(new Error("coding agent \u5DF2\u88AB\u4E2D\u6B62 (abort)"))},"fail");if(p.aborted){b();return}m=b,p.addEventListener("abort",b,{once:!0})});try{await Promise.race([c.send(t),f,h])}finally{p&&m&&p.removeEventListener("abort",m),await c.close().catch(()=>{}),await s.stop().catch(()=>{})}return{response:d.trim(),events:l,sessionId:c.currentSessionId()}}a(On,"runCodingAgentViaSpawn");var Nn={claude:"claudecode",qoder:"qoder",codex:"codex",codebuddy:"codebuddy",opencode:"opencode",qwen:"qwen",deepseek:"deepseek",trae:"trae"},Of=Object.fromEntries(Object.entries(Nn).map(([t,e])=>[e,t]));function pt(t){return Nn[t]}a(pt,"engineToAgent");function Oa(t){return Of[t]}a(Oa,"agentToEngine");function nn(t){let e=[];t.roleContext&&e.push(Nf(t.roleContext));let n=t.kbContext,r=n?.present===!0;if(r&&e.push(t.kbPromptBlock??n.promptBlock),e.length!==0)return{promptBlock:e.join(`
12
+
13
+ ---
14
+
15
+ `),kbActive:r,...r?{kbRootDir:t.kbRootDir??n.rootDir}:{}}}a(nn,"buildInjectedContext");function Nf(t){let e=["# \u89D2\u8272\u8BBE\u5B9A","",t.persona.trim()];if(t.skills.length>0){e.push("","## \u6280\u80FD");for(let n of t.skills)e.push(`- ${n.name}${n.description?`\uFF1A${n.description}`:""}`)}if(t.guardrails.length>0){e.push("","## \u7EA6\u675F");for(let n of t.guardrails)e.push(`- [${n.severity}] ${n.rule}`)}if(t.outputStandard&&e.push("","## \u8F93\u51FA\u89C4\u8303",`- \u683C\u5F0F\uFF1A${t.outputStandard.format}`),t.memory.length>0){e.push("","## \u8BB0\u5FC6\uFF08\u8FD1\u671F\uFF09");for(let n of t.memory.slice(-10))e.push(`- (${n.type}) ${n.summary}`)}return e.join(`
16
+ `)}a(Nf,"renderRoleContext");import{access as Lf}from"fs/promises";import Et from"path";function Na(t){return t.trim().replace(/^\.\//,"").replace(/[\\/]+/g,"__").replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"kb"}a(Na,"slug");function Ge(t,e){return Et.resolve(t,e)}a(Ge,"sourceDir");function La(t,e){return Et.join(Ge(t,e),".kb")}a(La,"collectionDir");function At(t,e){return Et.join(La(t,e),"wiki")}a(At,"wikiDir");function Wa(t,e){return Et.join(At(t,e),"_index.md")}a(Wa,"indexPath");function Bo(t,e){return Et.join(La(t,e),"state.json")}a(Bo,"statePath");function zo(t,e){return Et.join(At(t,e),"_compile-report.json")}a(zo,"reportPath");function Uo(t,e){let n=e?.wikiRootOf??(o=>o.dir);return t.map(o=>["# \u77E5\u8BC6\u5E93(\u5DF2\u79BB\u7EBF\u7F16\u8BD1\u4E3A wiki)",`wiki \u6839\u76EE\u5F55:${n(o)}`,"\u7528\u6CD5:\u4F18\u5148\u7528 Grep \u5728\u8BE5\u76EE\u5F55\u4E0B\u6309\u5173\u952E\u8BCD(\u529F\u80FD\u540D/\u62A5\u9519\u7247\u6BB5/\u53C2\u6570\u540D)\u641C\u7D22\u547D\u4E2D\u540E Read \u6253\u5F00\u6B63\u6587;","\u9700\u4FEF\u77B0\u5206\u7C7B\u65F6\u8BFB _index.md(\u6309 concepts/topics/references \u7EC4\u7EC7,\u53EF\u80FD\u8F83\u5927,\u52FF\u6574\u7BC7\u901A\u8BFB)\u3002"].join(`
17
+ `)).join(`
18
+
19
+ `)}a(Uo,"renderKbPromptBlock");async function Ba(t){let{configDir:e,collections:n}=t,r=e;if(!n||n.length===0)return{present:!1,promptBlock:"",rootDir:r,collections:[],wikis:[]};let o=[];for(let s of n)try{await Lf(Wa(e,s)),o.push({name:s,slug:Na(s),dir:At(e,s)})}catch{g.warn("kb","\u672A\u627E\u5230\u5DF2\u7F16\u8BD1\u7D22\u5F15,\u8DF3\u8FC7(\u8BF7\u5148 setup \u6216 kb compile)",{collection:s})}return o.length===0?{present:!1,promptBlock:"",rootDir:r,collections:[],wikis:[]}:{present:!0,promptBlock:Uo(o),rootDir:r,collections:o.map(s=>s.name),wikis:o}}a(Ba,"resolveKbContext");function Wf(t){let e=pt(t.engine),n=t.injected;return{async run(r,o){let i=o?.agent??e;if(!i)return{response:"",success:!1,sessionId:void 0};let s=n?`${n.promptBlock}
20
+
21
+ ---
22
+
23
+ ${r}`:r,c=o?.workDir??(n?.kbActive?n.kbRootDir:t.workDir);g.info("coding","\u8C03\u7528\u7F16\u7A0B Agent",{agent:i,workDir:c,promptLength:s.length,contextInjected:!!n,kbActive:n?.kbActive??!1});let l=Date.now();try{let d=await we(s,{agent:i,configPath:t.configPath,workDir:c,model:o?.model??t.model,timeoutMs:o?.timeoutMs,adapterOptions:{permissionMode:"bypassPermissions",...n?.kbActive?{allowedTools:["Read","Glob","Grep"]}:{}},onEvent:o?.onEvent?m=>o.onEvent({type:m.type,content:m.content}):void 0}),f=!d.events.some(m=>m.type==="error")&&d.response.length>0,p={agent:i,workDir:c,sessionId:d.sessionId,success:f,durationMs:Date.now()-l};return f?g.info("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210",p):g.warn("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210(\u6709\u9519\u8BEF)",p),{response:d.response,success:f,sessionId:d.sessionId}}catch(d){let u=d instanceof Error?d.message:String(d);return g.error("coding","Agent \u6267\u884C\u5F02\u5E38",{agent:i,error:u}),{response:u,success:!1,sessionId:void 0}}},activeAgent(){return e},available(){return e!==void 0}}}a(Wf,"createCodingToolkit");function Bf(){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\u3002",success:!1,sessionId:void 0}},activeAgent(){},available(){return!1}}}a(Bf,"createNullCodingToolkit");function za(t){return t.name.replace(/[\\/]+$/g,"").split(/[\\/]/).pop()?.trim()||t.slug}a(za,"mountName");function zf(t,e){try{let n=Je.join(t,"wiki");Dt.mkdirSync(n,{recursive:!0});for(let r of e){let o=Je.join(n,za(r));try{let i=Dt.readlinkSync(o);if(Je.resolve(Je.dirname(o),i)===Je.resolve(r.dir))continue;Dt.rmSync(o,{force:!0})}catch{Dt.existsSync(o)&&Dt.rmSync(o,{recursive:!0,force:!0})}Dt.symlinkSync(r.dir,o,"dir")}return!0}catch(n){return g.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(zf,"ensureWikiSymlinks");var Uf=te.object({engine:te.enum(["claude","codex","qoder","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:te.string().min(1).optional().describe("coding agent \u4F7F\u7528\u7684\u6A21\u578B\u540D"),cwd:te.string().min(1).optional().describe("coding agent \u5DE5\u4F5C\u76EE\u5F55"),workspace_dir:te.string().min(1).optional().describe("agent \u6267\u884C workspace \u76EE\u5F55(\u76F8\u5BF9 configDir)\uFF0C\u7F3A\u7701 workspaces/<role.id>")}).strict(),Ua={name:"coding",description:"\u7F16\u7A0B Agent \u80FD\u529B:\u8BA9 recipe \u8C03\u7528 coding agent \u751F\u6210\u4EE3\u7801/\u6587\u4EF6/\u6A21\u677F\u3002",configSchema:Uf,methods:[{name:"run",description:"\u53D1\u9001 prompt \u7ED9\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1",params:te.object({prompt:te.string().describe("\u4EFB\u52A1\u63D0\u793A\u8BCD"),options:te.object({agent:te.string().optional().describe("\u8986\u76D6 Agent \u7C7B\u578B(claude/codex/qoder)"),workDir:te.string().optional(),model:te.string().optional(),timeoutMs:te.number().optional()}).optional().describe("\u8FD0\u884C\u9009\u9879")}),output:te.object({response:te.string(),success:te.boolean(),sessionId:te.string().optional()})},{name:"activeAgent",description:"\u8FD4\u56DE\u5F53\u524D\u914D\u7F6E\u7684 Agent \u7C7B\u578B",output:te.string().optional()},{name:"available",description:"\u662F\u5426\u6709\u53EF\u7528\u7684\u7F16\u7A0B Agent",output:te.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 Bf();let r=e.roleContext?.id?.trim(),o=r&&/^[A-Za-z0-9._-]+$/.test(r)?r:void 0,i=t.workspace_dir?Je.resolve(e.settings.configDir,t.workspace_dir):o?Je.resolve(e.settings.configDir,"workspaces",o):void 0,s=e.kbContext?.present===!0,c;if(s&&i&&(e.kbContext?.wikis?.length??0)>0&&zf(i,e.kbContext.wikis)){let d=Uo(e.kbContext.wikis,{wikiRootOf:a(u=>Je.posix.join("wiki",za(u)),"wikiRootOf")});c=nn({...e.roleContext?{roleContext:e.roleContext}:{},kbContext:e.kbContext,kbPromptBlock:d,kbRootDir:i})}return c||(c=nn({...e.roleContext?{roleContext:e.roleContext}:{},...e.kbContext?{kbContext:e.kbContext}:{}})),Wf({engine:n,workDir:i??t.cwd,model:t.model,configPath:Ae(e.settings.configDir),...c?{injected:c}:{}})},permissions:[{method:"run",description:"\u542F\u52A8\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1(\u9650\u5B9A\u53EF\u7528\u7684 agent \u7C7B\u578B)",scopeSchema:te.array(te.string()).describe("\u5141\u8BB8\u4F7F\u7528\u7684 agent \u7C7B\u578B(\u5982 claude/codex/qoder)"),check:a((t,e)=>{let n=t,r=e[1]?.agent;return r==null?n.length>0:n.includes(r)},"check")}]};import{createHmac as op}from"crypto";import{z as P}from"zod";var Vf=3600*1e3,qf=300*1e3,Hf=1e3,Kf=15e3;function Gf(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(Gf,"contactCandidates");function Jf(t,e){return async n=>{let r=await t(e,["contact","user","search","--query",n,"--format","json"],{timeoutMs:Kf});if(r.exitCode!==0)throw new Error(`dws contact user search \u5931\u8D25(exit ${r.exitCode}): ${r.stderr.slice(0,200)}`);return r.stdout.trim()?JSON.parse(r.stdout):{}}}a(Jf,"createDwsContactSearch");function Va(t={}){let e=t.now??Date.now,n=t.positiveTtlMs??Vf,r=t.negativeTtlMs??qf,o=Math.max(1,Math.floor(t.maxCacheEntries??Hf)),i=t.searchContacts??Jf(t.runner??G,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 m=s.keys().next().value;if(m===void 0)break;s.delete(m)}s.set(u,f)},"writeCache");return async(u,f)=>{let p=u.trim();if(!p)return;if(/^\d+$/.test(p))return p;let m=f.trim();if(!m)return;let h=`${p}\0${m}`,k=e(),w=l(h,k);if(w)return w.userId;try{let b=[...new Set(Gf(await i(m)).filter(S=>S.openDingTalkId?.trim()===p).map(S=>S.userId?.trim()??"").filter(Boolean))],C=b.length===1?b[0]:void 0;return d(h,{...C?{userId:C}:{},expiresAt:k+(C?n:r)},k),C}catch{d(h,{expiresAt:k+r},k);return}}}a(Va,"createDingTalkAtUserIdResolver");var Zf=Va();function qa(t,e,n){return n?Va({searchContacts:n})(t,e):Zf(t,e)}a(qa,"resolveDingTalkAtUserId");var Yf="#007fff";function Vo(t){return`<font color="${Yf}">@${t}</font>`}a(Vo,"formatDingTalkAtPlaceholder");function Ha(t,e){let n=t,r=[];for(let i of e)if(!n.includes(Vo(i))){if(n.includes(`@${i}`)){n=n.split(`@${i}`).join(Vo(i));continue}r.push(i)}return r.length===0?n:`${r.map(Vo).join(" ")} ${n}`}a(Ha,"prependDingTalkAtPlaceholders");var Qf="https://api.dingtalk.com",Xf=300*1e3,ep=15e3,Ka=6,$e=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||Qf).replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??ep,this.fetchImpl=e.fetchImpl??globalThis.fetch}async getAccessToken(){let e=Date.now();return this.tokenCache&&e<this.tokenCache.expireAt-Xf?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 g.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(Ln).filter(Boolean),i=o.length>0?tp(n,o):n,s={msgtype:"markdown",markdown:{title:r?.title??np(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 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 g.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 g.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 g.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 g.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 g.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 g.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)}`);g.debug("dingtalk-robot-client","sent",{channel:o})}};function Ln(t){let e=String(t??"").trim();return e&&(e.length<Ka?e.padStart(Ka,"0"):e)}a(Ln,"padStaffId");function tp(t,e){let n=e.filter(o=>!t.includes(`@${o}`));return n.length===0?t:`${n.map(o=>`@${o}`).join(" ")} ${t}`}a(tp,"prependAtPlaceholders");function np(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(np,"deriveTitle");var qo=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;this.map.set(e.conversationId,{...e,...r?{sessionWebhook:r}:{},...typeof o=="number"?{sessionWebhookExpiredTime:o}:{},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 qo;var Wn=class{static{a(this,"DingTalkSender")}robotClient;registry;constructor(e={},n={}){n.robotClient?this.robotClient=n.robotClient:e.robot?.appKey&&e.robot?.appSecret&&(this.robotClient=new $e({appKey:e.robot.appKey,appSecret:e.robot.appSecret,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})),this.registry=n.registry??rn}get canReplyInSession(){return!!this.robotClient}async replyToConversation(e,n,r={}){let o=r.entry??this.registry.lookup(e),i=r.mentionSender===!1?"":typeof r.mentionSender=="string"?r.mentionSender.trim():String(o?.senderStaffId??"").trim(),s=[...new Set([i,...(r.mentionUserIds??[]).map(d=>d.trim())].filter(Boolean))],c=s.length>0?{atUserIds:s}:{};if(!r.preferWebhook&&this.robotClient&&o?.sessionWebhook)try{return await this.robotClient.replyViaSessionWebhook(o.sessionWebhook,n,{...s.length>0?{atUserStaffIds:s}:{},...typeof o.sessionWebhookExpiredTime=="number"?{expiredTime:o.sessionWebhookExpiredTime}:{},...r.title?{title:r.title}:{}}),{via:"session",...c}}catch(d){let u=d instanceof Error?d.message:String(d),f=await this.tryWebhook(n,s,r);if(f&&f.via==="webhook")return f;let p=f?.reason?` + ${f.reason}`:"";return{via:"skipped",reason:`session \u5931\u8D25: ${u}${p}`}}let l=await this.tryWebhook(n,s,r);return l||{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=>Ln(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 Ho=["\u601D\u8003","\u4E13\u6CE8","\u7B49\u4E00\u7B49"],Ko=class{static{a(this,"DingTalkEmotionClientPool")}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 $e({appKey:n.clientId,appSecret:n.clientSecret,fetchImpl:r});return this.entries.set(e,{...n,fetchImpl:r,client:i}),i}clear(){this.entries.clear()}},Go=class{static{a(this,"DingTalkEmotionFeedbackCoordinator")}states=new Map;begin(e,n){let r=Se(e);if(!r||this.states.get(r.openMsgId))return;let i={robotCode:r.robotCode,openMsgId:r.openMsgId,openConversationId:r.conversationId,emotionName:rp()},s={context:r,emotionContext:i,client:n,delivered:!1,addPromise:Promise.resolve().then(()=>n.replyEmotion(i)).then(()=>(g.debug("dingtalk-emotion-feedback","processing emotion added",{messageId:Bn(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName}),!0)).catch(c=>(g.warn("dingtalk-emotion-feedback","add processing emotion failed; workflow continues",{messageId:Bn(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=Se(e);if(!r||n!==r.conversationId)return;let o=this.states.get(r.openMsgId);!o||!Ga(o.context,r)||o.finalizePromise||(o.delivered=!0)}finalize(e,n){let r=Se(e);if(!r)return Promise.resolve();let o=this.states.get(r.openMsgId);return!o||!Ga(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),g.debug("dingtalk-emotion-feedback","processing emotion recalled",{messageId:Bn(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName})}catch(i){g.warn("dingtalk-emotion-feedback","recall processing emotion failed; workflow unaffected",{messageId:Bn(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 Ga(t,e){return t.openMsgId===e.openMsgId&&t.conversationId===e.conversationId&&t.robotCode===e.robotCode&&t.credRef===e.credRef}a(Ga,"sameContext");function Bn(t){return t.length<=8?"***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}a(Bn,"maskMessageId");function rp(){let t=Math.floor(Math.random()*Ho.length);return Ho[t]??Ho[0]}a(rp,"pickProcessingEmotion");var zn=new Go,Ja=new Ko;var ip=15e3;function sp(t){let e=t.runner??G,n=t.dwsBin,r=t.timeoutMs,o=t.fetchImpl??globalThis.fetch,i=t.emotionFeedbackCoordinator??zn,s=t.emotionClientPool??Ja,c=t.atUserIdResolver??qa;async function l(f){let p=Date.now(),m=f.slice(0,3).join(" ");g.debug("messaging","dws call",{cmd:m});let h=await e(n,f,{timeoutMs:r}),k=Date.now()-p;if(h.exitCode!==0)throw g.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:m,exitCode:h.exitCode,stderr:h.stderr.slice(0,300),elapsed:k}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (exit ${h.exitCode}): ${h.stderr.slice(0,200)}`);let w=dp(h.stdout);if(w)throw g.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:m,code:w.code,desc:w.desc,elapsed:k}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (${w.code}): ${w.desc}`);g.debug("messaging","dws call completed",{cmd:m,elapsed:k})}a(l,"runDws");let d=new Wn({...t.robot?{robot:t.robot}:{},...t.fetchImpl?{fetchImpl:t.fetchImpl}:{}}),u={async sendToUser(f,p){g.info("messaging","sendToUser",{userId:f,contentLen:p.length}),await l(["chat","message","send","--user",f,"--title",Jo(p),"--text",p,"-y"])},async sendToGroup(f,p){g.info("messaging","sendToGroup",{groupId:f,contentLen:p.length}),await l(["chat","message","send","--group",f,"--title",Jo(p),"--text",p,"-y"])},async sendCard(f,p){let m=up(p);f.type==="user"?await this.sendToUser(f.id,m):await this.sendToGroup(f.id,m)},async reply(f){g.warn("messaging","reply called without target context",{contentLen:f.length})},async replyToConversation(f,p,m){let h=m?.credRef?t.webhookCreds?.[m.credRef]:void 0,k=!!m?.credRef&&!h,w=k?`credRef="${m.credRef}" \u672A\u547D\u4E2D\u547D\u540D\u96C6(\u53EF\u7528: ${Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0"})`:void 0,b=m?.webhook??h,C=b?.url?(x,_)=>u.sendToGroupByWebhook({url:b.url,...b.secret?{secret:b.secret}:{}},x,_):void 0,S=m?.mentionSender;if(m?.preferWebhook&&m.mentionSender!==!1&&typeof m.mentionSender!="string"){let x=Zt(t.eventContext);if(x?.conversationId===f)try{S=await c(x.senderOpenDingTalkId,x.senderName)}catch(_){g.warn("messaging","Webhook @\u4EBA\u8EAB\u4EFD\u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u4E0D @ \u4EBA",{conversationId:f,error:_ instanceof Error?_.message:String(_)})}(typeof S!="string"||!S.trim())&&(S=!1)}let v=await d.replyToConversation(f,p,{...S!==void 0?{mentionSender:S}:{},...m?.mentionUserIds?.length?{mentionUserIds:m.mentionUserIds}:{},...m?.title?{title:m.title}:{},...m?.preferWebhook?{preferWebhook:m.preferWebhook}:{},...C?{webhookFallback:C}:{}});return w&&(v.reason=v.reason?`${v.reason}; ${w}`:w),v.via==="session"||v.via==="webhook"?i.markDelivered(t.eventContext,f):k&&(v.configError=!0),g.info("messaging","replyToConversation",{conversationId:f,via:v.via,atUserIds:v.atUserIds,reason:v.reason}),v},beginDingTalkProcessingFeedback(f){let p=Se(f);if(!p)return;let m=t.robots?.[p.credRef];if(!m?.client_id||!m.client_secret){g.warn("messaging","skip processing emotion: credRef \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u8BC1",{credRef:p.credRef,available:Object.keys(t.robots??{})});return}let h=s.get(p.credRef,{clientId:m.client_id,clientSecret:m.client_secret},o);i.begin(f,h)},async sendToGroupByWebhook(f,p,m){let h=f?.url,k=f?.secret;if(!h)throw new Error("sendToGroupByWebhook \u7F3A\u5C11 url");let w=ap(h);g.info("messaging","sendToGroupByWebhook",{host:w,contentLen:p.length,signed:!!k});let b=m?.title??Jo(p),C=[...m?.atUserIds??[],...m?.atMobiles??[]],S=C.length>0?Ha(p,C):p,v={msgtype:"markdown",markdown:{title:b,text:S},at:{isAtAll:m?.atAll??!1,...m?.atUserIds?.length?{atUserIds:m.atUserIds}:{},...m?.atMobiles?.length?{atMobiles:m.atMobiles}:{}}},x=k?cp(h,k):h;await lp(o,x,v,r,w)}};return u}a(sp,"createMessagingToolkitFromConfig");function ap(t){try{return new URL(t).host}catch{return"webhook"}}a(ap,"safeHost");function cp(t,e){let n=Date.now(),r=`${n}
24
+ ${e}`,o=op("sha256",e).update(r,"utf8").digest("base64"),i=t.includes("?")?"&":"?";return`${t}${i}timestamp=${n}&sign=${encodeURIComponent(o)}`}a(cp,"signWebhookUrl");async function lp(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 g.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 g.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 g.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(lp,"postWebhook");function dp(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(dp,"parseDwsFailure");function Jo(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(Jo,"deriveTitle");function up(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(`
25
+ `)}a(up,"formatCardAsMarkdown");var Za={name:"messaging",description:"IM \u6D88\u606F\u63A8\u9001:\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u6587\u672C\u6216\u5361\u7247\u3001\u7ECF\u7FA4\u673A\u5668\u4EBA Webhook(HTTP)\u53D1\u9001;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 webhook \u964D\u7EA7)\u3002",configSchema:P.object({robot_creds:P.record(P.string(),P.object({client_id:P.string(),client_secret:P.string()})).optional(),webhook_creds:P.record(P.string(),P.object({url:P.string(),secret:P.string().optional()})).optional()}).strict(),build:a((t,e)=>{let n=t.robot_creds,r=fp(e.item.raw),o=Se(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;return sp({dwsBin:e.settings.tracker.dws_bin,timeoutMs:ip,...s?{robot:s}:{},...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:P.object({userId:P.string().describe("\u63A5\u6536\u7528\u6237 id"),content:P.string().describe("\u6D88\u606F\u6B63\u6587")})},{name:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6587\u672C\u6D88\u606F",params:P.object({groupId:P.string().describe("\u7FA4 cid"),content:P.string().describe("\u6D88\u606F\u6B63\u6587")})},{name:"sendCard",description:"\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u5361\u7247\u6D88\u606F(\u964D\u7EA7\u4E3A\u5BCC\u6587\u672C)",params:P.object({target:P.object({type:P.enum(["user","group"]),id:P.string()}).describe("\u63A5\u6536\u76EE\u6807(user/group + id)"),card:P.object({title:P.string(),content:P.string()}).describe("\u5361\u7247\u6807\u9898/\u5185\u5BB9")})},{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:P.object({content:P.string().describe("\u56DE\u590D\u6B63\u6587")})},{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 \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",params:P.object({conversationId:P.string().describe("\u76EE\u6807\u4F1A\u8BDD id(\u7FA4 cid)"),content:P.string().describe("\u56DE\u590D\u6B63\u6587"),options:P.object({mentionSender:P.union([P.boolean(),P.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:P.array(P.string()).optional().describe("\u8FFD\u52A0 @ \u7684 userId \u5217\u8868\uFF0C\u4E0E\u63D0\u95EE\u8005\u5408\u5E76\u53BB\u91CD"),title:P.string().optional().describe("markdown \u6807\u9898"),webhook:P.object({url:P.string(),secret:P.string().optional()}).optional().describe("\u8986\u76D6\u9ED8\u8BA4\u964D\u7EA7 webhook \u76EE\u6807"),credRef:P.string().optional().describe("\u547D\u540D\u51ED\u636E\u96C6\u5F15\u7528\u540D;\u89E3\u6790 messaging.webhook_creds[credRef] \u4F5C\u964D\u7EA7\u76EE\u6807(\u8DEF\u7531\u53EA\u5B58 credRef,\u65E0\u5BC6\u94A5)")}).optional().describe("\u9009\u8DEF\u4E0E @ \u9009\u9879")})},{name:"sendToGroupByWebhook",description:"\u901A\u8FC7\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u7FA4\u6D88\u606F",params:P.object({target:P.object({url:P.string(),secret:P.string().optional()}).describe("\u76EE\u6807 webhook(url + \u53EF\u9009\u52A0\u7B7E secret)"),content:P.string().describe("\u6D88\u606F\u6B63\u6587"),options:P.object({title:P.string().optional(),atAll:P.boolean().optional(),atUserIds:P.array(P.string()).optional(),atMobiles:P.array(P.string()).optional()}).optional().describe("\u6807\u9898\u4E0E @ \u9009\u9879")})}],permissions:[{method:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6D88\u606F(\u9650\u5B9A\u53EF\u53D1\u9001\u7684 user id)",scopeSchema:P.array(P.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:P.array(P.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:P.array(P.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:"reply",description:"\u56DE\u590D\u5F53\u524D\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u76EE\u6807 id)",scopeSchema:P.array(P.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:P.array(P.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:P.array(P.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 fp(t){if(!t||typeof t!="object")return;let e=t.eventContext;return Se(e)??Zt(e)}a(fp,"eventContextFromItem");import{z as ue}from"zod";var pp=15e3,Ya=300,gp=["todo","task","create"],mp=["todo","task","get"],hp=["todo","task","done"];function yp(t){let e={dwsBin:t.tracker.dws_bin,timeoutMs:pp};return wp(e)}a(yp,"createTodoToolkit");function wp(t){let e=t.runner??G,n=t.dwsBin,r=t.timeoutMs;async function o(c){let l=[...c,"--format","json"],d=l.slice(0,4).join(" "),u=Date.now();g.debug("todo","dws call",{cmd:d});let f=await e(n,l,{timeoutMs:r}),p=Date.now()-u;if(f.exitCode!==0)throw g.error("todo","dws todo command failed",{cmd:d,exitCode:f.exitCode,stderr:ge(f.stderr),elapsed:p}),new Ee(`dws todo failed (exit ${f.exitCode}): ${ge(f.stderr)}`,{retryable:!0});g.debug("todo","dws call completed",{cmd:d,elapsed:p});let m=f.stdout.trim();if(!m)return{};try{return JSON.parse(m)}catch{throw new Error(`dws todo returned invalid JSON: ${m.slice(0,Ya)}`)}}a(o,"runDwsJson");function i(c){if(!y(c))throw new Error("dws todo create: unexpected response format");for(let l of[c,c.body,c.data,c.result])if(y(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,Ya)}`)}a(i,"extractId");function s(c){if(!y(c))return!1;for(let l of[c,c.body,c.data,c.result])if(y(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){g.info("todo","create",{title:c.title,assignee:c.assignee,recordId:c.recordId,stepId:c.stepId});let l=[...gp,"--title",c.title,"--executors",c.assignee];c.dueDate&&l.push("--due",c.dueDate.toISOString());let d=await o(l);return i(d)},async isCompleted(c){g.debug("todo","isCompleted",{todoId:c});let l=await o([...mp,"--task-id",c]);return s(l)},async complete(c){g.info("todo","complete",{todoId:c}),await o([...hp,"--task-id",c,"--status","true"])}}}a(wp,"createTodoToolkitFromConfig");var Qa={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:ue.object({}).strict(),build:a((t,e)=>yp(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:ue.array(ue.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[0]?.assignee??"").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:ue.object({title:ue.string().describe("\u5F85\u529E\u6807\u9898"),assignee:ue.string().describe("\u8D1F\u8D23\u4EBA id"),dueDate:ue.string().optional().describe("\u622A\u6B62\u65F6\u95F4(ISO \u5B57\u7B26\u4E32)"),recordId:ue.string().describe("\u5173\u8054\u8868\u683C\u8BB0\u5F55 id"),stepId:ue.string().describe("\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4 id")}),output:ue.string().describe("\u5F85\u529E id")},{name:"isCompleted",description:"\u67E5\u8BE2\u5F85\u529E\u5B8C\u6210\u72B6\u6001",params:ue.object({todoId:ue.string().describe("\u5F85\u529E id")}),output:ue.boolean()},{name:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210",params:ue.object({todoId:ue.string().describe("\u5F85\u529E id")})}]};import{rm as Xa,mkdir as ec}from"fs/promises";import Ze from"path";import{z as j}from"zod";var kp="git",bp=12e4,vp=1,Sp="master";function Rp(t){let e=t.runner??G,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();g.debug("git","git call",{cmd:f});let m=await e(n,d,{timeoutMs:r,cwd:u}),h=Date.now()-p;if(m.exitCode!==0)throw g.error("git","git command failed",{cmd:f,exitCode:m.exitCode,stderr:m.stderr.slice(0,300),elapsed:h}),new Error(`git failed (exit ${m.exitCode}): ${ge(m.stderr)}`);return g.debug("git","git call completed",{cmd:f,elapsed:h}),m.stdout}return a(l,"runGit"),{async clone(d,u,f){let p=f?.depth??t.cloneDepth;g.info("git","clone",{repoUrl:d,targetDir:u,depth:p}),await Xa(u,{recursive:!0,force:!0});try{await l(["clone","--depth",String(p),"--single-branch",d,u])}catch(m){throw await Xa(u,{recursive:!0,force:!0}),m}},async createBranch(d,u,f){g.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);g.info("git","push",{repoDir:d,branch:f}),await l(["-C",d,"push","-u","origin",f])},async commit(d,u){return g.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}):(g.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),m=p.trim().split(`
26
+ `).filter(Boolean),h=[];for(let k of m){let w=k.match(/^\s*(.+?)\s+\|/);w?.[1]&&h.push(w[1].trim())}return{files:h,summary:p.trim()}},async status(d){let f=(await l(["-C",d,"status","--porcelain"])).split(`
27
+ `).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 m=p?.depth??t.cloneDepth,h=tc(d),k=Ze.join(o,"repos",h),w=Ze.join(o,"worktrees",u),b=Ze.join(w,h);return c(h,async()=>{if(await ec(Ze.join(o,"repos"),{recursive:!0}),await ec(w,{recursive:!0}),(await e(n,["-C",k,"rev-parse","--git-dir"],{timeoutMs:r})).exitCode===0){g.info("git","ensureWorktree: \u590D\u7528\u57FA\u7840\u5E93",{repoKey:h,baseDir:k});let x=await e(n,["-C",k,"fetch","--depth",String(m),"origin"],{timeoutMs:r});x.exitCode!==0&&g.warn("git","fetch \u5931\u8D25,\u4F7F\u7528\u73B0\u6709\u57FA\u7840\u5E93\u72B6\u6001",{repoKey:h,stderr:x.stderr.slice(0,200)})}else g.info("git","ensureWorktree: \u514B\u9686\u57FA\u7840\u5E93",{repoUrl:d,baseDir:k,depth:m}),await l(["clone","--depth",String(m),"--single-branch",d,k]);let S=p?.baseRef;if(!S){let x=await e(n,["-C",k,"rev-parse","--abbrev-ref","origin/HEAD"],{timeoutMs:r});S=x.exitCode===0&&x.stdout.trim()?x.stdout.trim():i}if((await l(["-C",k,"worktree","list","--porcelain"])).includes(b))return g.info("git","ensureWorktree: \u590D\u7528\u5DF2\u5B58\u5728 worktree",{wtDir:b,branch:f}),{dir:b,workspaceDir:w,branch:f,reused:!0,baseRef:S};g.info("git","ensureWorktree: \u521B\u5EFA worktree",{wtDir:b,branch:f,baseRef:S});try{await l(["-C",k,"worktree","add",b,"-b",f,S])}catch(x){g.warn("git","worktree add -b \u5931\u8D25,\u56DE\u843D\u5230\u5DF2\u6709\u5206\u652F",{branch:f,error:String(x)}),await l(["-C",k,"worktree","add",b,f])}return{dir:b,workspaceDir:w,branch:f,reused:!1,baseRef:S}})},async removeWorktree(d,u){let f=tc(d),p=Ze.join(o,"repos",f),m=Ze.join(o,"worktrees",u,f);await c(f,async()=>{try{await l(["-C",p,"worktree","remove",m,"--force"])}catch(h){g.warn("git","worktree remove \u5931\u8D25(\u5FFD\u7565)",{wtDir:m,error:String(h)})}try{await l(["-C",p,"worktree","prune"])}catch{}})}}}a(Rp,"createGitToolkitFromConfig");function tc(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(tc,"repoKeyFromUrl");var Cp=j.object({root:j.string().optional().describe("\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55(\u76F8\u5BF9\u8DEF\u5F84\u76F8\u5BF9 configDir)"),default_branch:j.string().optional().describe("worktree \u57FA\u51C6\u5206\u652F\u56DE\u843D\u503C"),clone_depth:j.number().optional().describe("\u9ED8\u8BA4 clone \u6DF1\u5EA6")}).strict(),nc={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:Cp,build(t,e){return Rp({gitBin:kp,timeoutMs:bp,cloneDepth:t.clone_depth??vp,workspaceRoot:t.root?Ze.resolve(e.settings.configDir,t.root):Ze.resolve(e.settings.configDir,".workspace"),defaultBranch:t.default_branch??Sp})},methods:[{name:"clone",description:"\u514B\u9686\u8FDC\u7A0B\u4ED3\u5E93\u5230\u672C\u5730\u76EE\u5F55",params:j.object({repoUrl:j.string().describe("\u4ED3\u5E93\u5730\u5740"),targetDir:j.string().describe("\u672C\u5730\u76EE\u6807\u76EE\u5F55"),options:j.object({depth:j.number().optional()}).optional()})},{name:"createBranch",description:"\u57FA\u4E8E\u5F53\u524D\u6216\u6307\u5B9A\u5206\u652F\u521B\u5EFA\u65B0\u5206\u652F",params:j.object({repoDir:j.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branchName:j.string().describe("\u65B0\u5206\u652F\u540D"),baseBranch:j.string().optional().describe("\u57FA\u7840\u5206\u652F")})},{name:"currentBranch",description:"\u83B7\u53D6\u5F53\u524D\u5206\u652F\u540D",params:j.object({repoDir:j.string()}),output:j.string()},{name:"push",description:"\u63A8\u9001\u5206\u652F\u5230\u8FDC\u7A0B",params:j.object({repoDir:j.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branch:j.string().optional().describe("\u5206\u652F\u540D(\u7F3A\u7701\u53D6\u5F53\u524D\u5206\u652F)")})},{name:"commit",description:"\u6682\u5B58(add -A)\u5E76\u63D0\u4EA4\u5DE5\u4F5C\u533A\u6539\u52A8;\u65E0\u6539\u52A8\u5219\u8DF3\u8FC7",params:j.object({repoDir:j.string().describe("\u4ED3\u5E93\u76EE\u5F55"),message:j.string().describe("\u63D0\u4EA4\u4FE1\u606F")}),output:j.object({committed:j.boolean()})},{name:"diff",description:"\u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u5217\u8868\u53CA\u6458\u8981",params:j.object({repoDir:j.string().describe("\u4ED3\u5E93\u76EE\u5F55"),baseBranch:j.string().optional().describe("\u5BF9\u6BD4\u57FA\u51C6\u5206\u652F")}),output:j.object({files:j.array(j.string()),summary:j.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:j.object({repoDir:j.string().describe("\u4ED3\u5E93\u76EE\u5F55")}),output:j.object({changed:j.boolean(),files:j.array(j.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:j.object({repoUrl:j.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:j.string().describe("\u5DE5\u5355 ID"),branch:j.string().describe("worktree \u5206\u652F\u540D"),options:j.object({baseRef:j.string().optional().describe("\u57FA\u51C6\u5206\u652F(\u7F3A\u7701\u53D6 origin/HEAD,\u518D\u56DE\u843D default_branch)"),depth:j.number().optional().describe("clone/fetch \u6DF1\u5EA6")}).optional()}),output:j.object({dir:j.string(),workspaceDir:j.string(),branch:j.string(),reused:j.boolean(),baseRef:j.string()})},{name:"removeWorktree",description:"\u6E05\u7406\u67D0\u5DE5\u5355\u5728\u67D0\u4ED3\u5E93\u7684 worktree(best-effort,\u57FA\u7840\u5E93\u4E0D\u5220\u9664)",params:j.object({repoUrl:j.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:j.string().describe("\u5DE5\u5355 ID")})}],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 K}from"zod";var xp="a1",Tp=3e4;function _p(){return Ip({a1Bin:xp,timeoutMs:Tp})}a(_p,"createCodeReviewToolkit");function Ip(t){let e=t.runner??G,n=t.a1Bin,r=t.timeoutMs;async function o(i){let s=[...i,"--format","json"],c=s.slice(0,4).join(" "),l=Date.now();g.debug("codereview","a1 call",{cmd:c});let d=await e(n,s,{timeoutMs:r}),u=Date.now()-l;if(d.exitCode!==0){let p=Ep(d.stderr),m=!Ap(p);g.error("codereview","a1 command failed",{cmd:c,exitCode:d.exitCode,code:p,retryable:m,stderr:ge(d.stderr),elapsed:u});let h=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 Ee(`${h}a1 failed (exit ${d.exitCode}): ${ge(d.stderr)}`,{retryable:m,code:p})}g.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){g.info("codereview","createMR",{repo:i.repoPath,source:i.sourceBranch,target:i.targetBranch});let s=["repo","mr","create","--source",i.sourceBranch,"--target",i.targetBranch,"--title",i.title,"--repo",i.repoPath];i.description&&s.push("--description",i.description),i.assignees?.length&&s.push("--assignees",i.assignees.join(","));let c=await o(s);return Dp(c)},async listUnresolvedComments(i,s){g.debug("codereview","listUnresolvedComments",{mrId:i,repoPath:s});let c=await o(["repo","mr","comment","list","--mr",i,"--repo",s,"--unresolved"]);return Pp(c)},async isReadyToMerge(i,s){g.debug("codereview","isReadyToMerge",{mrId:i,repoPath:s});let c=await o(["repo","mr","status",i,"--repo",s]);return $p(c)}}}a(Ip,"createCodeReviewToolkitFromConfig");function Ep(t){return t.match(/"errorCode"\s*:\s*"([^"]+)"/)?.[1]}a(Ep,"extractErrorCode");function Ap(t){return t?t.startsWith("SYSTEM_CONFLICT")||t.startsWith("SYSTEM_ILLEGAL_ARGUMENT"):!1}a(Ap,"isNonRetryableCode");function Zo(t,e){if(y(t))for(let n of[t,t.data,t.body,t.result]){if(!y(n))continue;let r=e(n);if(r!==void 0)return r}}a(Zo,"findInResponse");function Dp(t){let e=Zo(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(Dp,"extractMrInfo");function Pp(t){let e=[];if(Array.isArray(t))e=t;else{let n=Zo(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(y).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(Pp,"parseComments");function $p(t){return Zo(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($p,"extractReadyToMerge");var rc={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:K.object({}).strict(),build:a(()=>_p(),"build"),methods:[{name:"createMR",description:"\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42(MR)",params:K.object({repoPath:K.string().describe("\u4ED3\u5E93\u8DEF\u5F84(group/project)"),sourceBranch:K.string().describe("\u6E90\u5206\u652F"),targetBranch:K.string().describe("\u76EE\u6807\u5206\u652F"),title:K.string().describe("MR \u6807\u9898"),description:K.string().optional().describe("MR \u63CF\u8FF0"),assignees:K.array(K.string()).optional().describe("\u8BC4\u5BA1\u4EBA\u82B1\u540D\u5217\u8868")}),output:K.object({mrId:K.string(),mrUrl:K.string()})},{name:"listUnresolvedComments",description:"\u67E5\u8BE2 MR \u4E0A\u672A\u89E3\u51B3\u7684\u8BC4\u8BBA",params:K.object({mrId:K.string().describe("MR ID"),repoPath:K.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:K.array(K.object({id:K.number(),note:K.string(),author:K.string(),path:K.string().nullable(),line:K.number().nullable(),createdAt:K.string()}))},{name:"isReadyToMerge",description:"\u68C0\u67E5 MR \u662F\u5426\u6EE1\u8DB3\u5408\u5E76\u6761\u4EF6",params:K.object({mrId:K.string().describe("MR ID"),repoPath:K.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:K.boolean()}],permissions:[{method:"createMR",description:"\u5141\u8BB8\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42"}]};import{z as se}from"zod";var Mp="a1",jp=3e4;function Fp(){return Op({a1Bin:Mp,timeoutMs:jp})}a(Fp,"createCIToolkit");function Op(t){let e=t.runner??G,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();g.debug("ci","a1 call",{cmd:u});let p=await e(n,d,{timeoutMs:r}),m=Date.now()-f;if(p.exitCode!==0)throw g.error("ci","a1 command failed",{cmd:u,exitCode:p.exitCode,stderr:ge(p.stderr),elapsed:m}),new Ee(`a1 failed (exit ${p.exitCode}): ${ge(p.stderr)}`,{retryable:!0});return g.debug("ci","a1 call completed",{cmd:u,elapsed:m}),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){g.info("ci","triggerPipeline",{pipelineId:c,branch:l});let d=await s(["ci","pipeline","run",c,"-b",l]);return Wp(d)},async getRunStatus(c){g.debug("ci","getRunStatus",{runId:c});let l=await s(["ci","run","get",c]);return{runId:c,status:Bp(l)}},async getJobLog(c,l,d){g.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(Op,"createCIToolkitFromConfig");var Np=new Set(["running","success","failed","pending","cancelled"]);function Lp(t){let e=t.toLowerCase();return Np.has(e)?e:e==="passed"||e==="completed"?"success":e==="error"||e==="failure"?"failed":e==="queued"||e==="waiting"||e==="created"?"pending":"unknown"}a(Lp,"normalizeStatus");function Wp(t){if(!y(t))throw new Error("a1 ci pipeline run: unexpected response format");for(let e of[t,t.data,t.body,t.result]){if(!y(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(Wp,"extractRunId");function Bp(t){if(!y(t))return"unknown";for(let e of[t,t.data,t.body,t.result])if(y(e)){let n=e;if(typeof n.status=="string")return Lp(n.status)}return"unknown"}a(Bp,"extractStatus");var oc={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:se.object({}).strict(),build:a(()=>Fp(),"build"),methods:[{name:"triggerPipeline",description:"\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C",params:se.object({pipelineId:se.string().describe("\u6D41\u6C34\u7EBF ID"),branch:se.string().describe("\u89E6\u53D1\u5206\u652F")}),output:se.object({runId:se.string()})},{name:"getRunStatus",description:"\u67E5\u8BE2\u6784\u5EFA\u8FD0\u884C\u72B6\u6001",params:se.object({runId:se.string().describe("\u8FD0\u884C ID")}),output:se.object({runId:se.string(),status:se.enum(["running","success","failed","pending","cancelled","unknown"])})},{name:"getJobLog",description:"\u62C9\u53D6 Job \u65E5\u5FD7(\u539F\u59CB\u6587\u672C)",params:se.object({jobId:se.string().describe("Job ID"),runId:se.string().describe("\u8FD0\u884C ID"),step:se.string().optional().describe("\u6307\u5B9A Step \u540D\u79F0")}),output:se.string()}],permissions:[{method:"triggerPipeline",description:"\u5141\u8BB8\u89E6\u53D1 CI \u6D41\u6C34\u7EBF"}]};import{z as Ye}from"zod";import Pt from"path";import Yo from"fs/promises";function zp(t,e){if(!e||typeof e!="string")throw new Error("file toolkit: path \u4E0D\u80FD\u4E3A\u7A7A");if(Pt.isAbsolute(e))throw new Error(`file toolkit: \u7981\u6B62\u7EDD\u5BF9\u8DEF\u5F84 (${e})`);let n=Pt.resolve(t,e),r=Pt.relative(t,n);if(r.startsWith("..")||Pt.isAbsolute(r))throw new Error(`file toolkit: \u8DEF\u5F84\u8D8A\u754C\uFF0C\u7981\u6B62\u8BBF\u95EE base_dir \u4E4B\u5916 (${e})`);return n}a(zp,"resolveInBase");function Up(t,e){let n=t.base_dir?Pt.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=zp(r(),i);await Yo.mkdir(Pt.dirname(l),{recursive:!0}),c==="append"?await Yo.appendFile(l,s,"utf8"):await Yo.writeFile(l,s,"utf8"),g.info("file",`${c} \u5B8C\u6210`,{path:i,bytes:Buffer.byteLength(s,"utf8")})}return a(o,"put"),{async append(i){await o(i.path,i.content,"append")},async write(i){await o(i.path,i.content,"write")}}}a(Up,"createFileToolkit");var Vp=Ye.object({base_dir:Ye.string().min(1).optional().describe("\u5199\u5165\u6839\u76EE\u5F55\uFF08jail \u8FB9\u754C\uFF09\uFF0C\u76F8\u5BF9 configDir \u89E3\u6790")}).strict(),ic={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:Vp,build:a((t,e)=>Up(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:Ye.object({path:Ye.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:Ye.string().describe("\u8981\u8FFD\u52A0\u7684\u5185\u5BB9")})},{name:"write",description:"\u8986\u76D6/\u521B\u5EFA\u5199\u5165 base_dir \u5185\u7684\u76F8\u5BF9\u8DEF\u5F84\u6587\u4EF6",params:Ye.object({path:Ye.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:Ye.string().describe("\u8981\u5199\u5165\u7684\u5185\u5BB9")})}]};import fc from"path";import{z as A}from"zod";import L from"fs";import ae from"path";import{createHash as qp}from"crypto";function Qo(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(Qo,"normalizeScope");function Hp(t){let e=Qo(t),n=JSON.stringify(e,Object.keys(e).sort());return qp("sha256").update(n).digest("hex").slice(0,16)}a(Hp,"scopeHash");function Qe(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 Hp(t)}a(Qe,"resolveScopeHash");var Kp=30,Gp=365;function Jp(t){let e=Date.parse(t);return Number.isFinite(e)?new Date(e):null}a(Jp,"parseBlockDate");function sc(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0,0)}a(sc,"startOfDay");function Zp(t,e){return Math.floor((sc(t).getTime()-sc(e).getTime())/(1440*60*1e3))}a(Zp,"diffDays");function ac(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(`
28
+
29
+ `),i=4e3,s=o.length>i?o.slice(0,i)+`
30
+
31
+ ...`:o;return{timestamp:r,body:`## ${e}
32
+
33
+ ${s}`}}a(ac,"compactBlocks");function Yp(t,e){if(!t.trim())return"";let n=[],r=t.split(/\n?---\n?/).filter(l=>l.trim().length>0);for(let l of r){let d=l.match(/^\s*##\s+压缩\s+@\s+(\S+)/);if(!d)continue;let u=d[1],f=l.slice(d[0].length).trim();n.push({timestamp:u,body:f})}if(n.length===0)return t;let o=[],i=new Map,s=new Map;for(let l of n){let d=Jp(l.timestamp);if(!d)continue;let u=Zp(e,d);if(u<Kp)o.push(l);else if(u<Gp){let f=`${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,"0")}`,p=i.get(f)??[];p.push(l),i.set(f,p)}else{let f=`${d.getFullYear()}`,p=s.get(f)??[];p.push(l),s.set(f,p)}}let c=[...o];for(let[l,d]of i)c.push(ac(d,`\u5386\u53F2\u5F52\u6863 ${l}`));for(let[l,d]of s)c.push(ac(d,`\u5E74\u5EA6\u5F52\u6863 ${l}`));return c.sort((l,d)=>l.timestamp.localeCompare(d.timestamp)),c.map(l=>`---
34
+
35
+ ## \u538B\u7F29 @ ${l.timestamp}
36
+
37
+ ${l.body}`).join(`
38
+
39
+ `)}a(Yp,"applyRollingWindow");var Un=class{constructor(e){this.rootDir=e}rootDir;static{a(this,"MemoryStore")}pathsFor(e){let n=Qe(e),r=ae.join(this.rootDir,n);return{dir:r,shortTermFile:ae.join(r,"short-term.jsonl"),longTermFile:ae.join(r,"long-term.md"),scopeMetaFile:ae.join(r,"scope.json"),archiveDir:ae.join(r,"archive"),processingDir:ae.join(r,"processing"),locksDir:ae.join(r,"locks")}}ensureScopeDir(e){let n=this.pathsFor(e);if(L.mkdirSync(n.dir,{recursive:!0}),L.mkdirSync(n.archiveDir,{recursive:!0}),L.mkdirSync(n.processingDir,{recursive:!0}),L.mkdirSync(n.locksDir,{recursive:!0}),typeof e!="string"){let r=Qo(e);try{L.writeFileSync(n.scopeMetaFile,JSON.stringify(r,null,2))}catch{}}return n}appendShortTerm(e,n){let r=JSON.stringify(n)+`
40
+ `;L.appendFileSync(e.shortTermFile,r,"utf-8")}readShortTerm(e){if(!L.existsSync(e.shortTermFile))return{entries:[],errors:0};let r=L.readFileSync(e.shortTermFile,"utf-8").split(`
41
+ `).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"&&typeof c.content=="string"?o.push(c):i++}catch{i++}return{entries:o,errors:i}}queryShortTerm(e,n){let{entries:r}=this.readShortTerm(e);return this.filterEntries(r,n)}clearShortTerm(e){L.existsSync(e.shortTermFile)&&L.writeFileSync(e.shortTermFile,"","utf-8")}readLongTerm(e){return L.existsSync(e.longTermFile)?L.readFileSync(e.longTermFile,"utf-8"):""}appendLongTerm(e,n){let r=new Date().toISOString(),o=this.readLongTerm(e),i;o.trim().length===0?i=`---
42
+
43
+ ## \u538B\u7F29 @ ${r}
44
+
45
+ ${n}`:i=`${Yp(o,new Date)}
46
+
47
+ ---
48
+
49
+ ## \u538B\u7F29 @ ${r}
50
+
51
+ ${n}`,L.writeFileSync(e.longTermFile,i+`
52
+ `,"utf-8")}archiveShortTerm(e){if(!L.existsSync(e.shortTermFile))return;let n=new Date().toISOString().replace(/[:.]/g,"-"),r=ae.join(e.archiveDir,`${n}.jsonl`);return L.renameSync(e.shortTermFile,r),r}moveToProcessing(e){if(!L.existsSync(e.shortTermFile))return;let n=new Date().toISOString().replace(/[:.]/g,"-"),r=ae.join(e.processingDir,`${n}.jsonl`);return L.renameSync(e.shortTermFile,r),r}extractToProcessing(e,n){if(!n)return this.moveToProcessing(e);if(!L.existsSync(e.shortTermFile))return;let{entries:r}=this.readShortTerm(e),o=this.filterEntries(r,n);if(o.length===0)return;let i=new Set(o),s=r.filter(d=>!i.has(d)),c=new Date().toISOString().replace(/[:.]/g,"-"),l=ae.join(e.processingDir,`${c}.jsonl`);return this.writeJsonl(l,o),s.length>0?this.writeJsonl(e.shortTermFile,s):L.unlinkSync(e.shortTermFile),l}rollbackFromProcessing(e,n){if(L.existsSync(n)){let r=L.readFileSync(n,"utf-8");L.appendFileSync(e.shortTermFile,r,"utf-8"),L.unlinkSync(n)}}archiveProcessing(e,n){if(!L.existsSync(n))return;let r=ae.basename(n),o=ae.join(e.archiveDir,r);return L.renameSync(n,o),o}findOrphanProcessing(){if(!L.existsSync(this.rootDir))return[];let e=[];for(let n of L.readdirSync(this.rootDir,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=n.name,o=ae.join(this.rootDir,r,"processing");if(L.existsSync(o))for(let i of L.readdirSync(o)){if(!i.endsWith(".jsonl"))continue;let s=ae.join(o,i),{entries:c}=this.readShortTermFile(s);e.push({scopeHash:r,processingFile:s,entries:c})}}return e}readShortTermFile(e){if(!L.existsSync(e))return{entries:[],errors:0};let r=L.readFileSync(e,"utf-8").split(`
53
+ `).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(`
54
+ `);L.writeFileSync(e,r?`${r}
55
+ `:"","utf-8")}cleanExpiredArchives(e){if(e<=0||!L.existsSync(this.rootDir))return 0;let n=Date.now()-e*24*60*60*1e3,r=0;for(let o of L.readdirSync(this.rootDir,{withFileTypes:!0})){if(!o.isDirectory())continue;let i=ae.join(this.rootDir,o.name,"archive");if(L.existsSync(i))for(let s of L.readdirSync(i)){let c=ae.join(i,s);L.statSync(c).mtimeMs<n&&(L.unlinkSync(c),r++)}}return r}};import Ce from"fs";import ei from"path";import Re from"fs";import cc from"path";var lc=300*1e3;function Vn(t){let e=cc.join(t.locksDir,"compact.lock");if(Re.mkdirSync(t.locksDir,{recursive:!0}),Re.existsSync(e))try{let n=JSON.parse(Re.readFileSync(e,"utf-8"));if(Date.now()-n.timestamp<lc)return null;Re.unlinkSync(e)}catch{try{Re.unlinkSync(e)}catch{}}try{let n=Re.openSync(e,"wx"),r={pid:process.pid,timestamp:Date.now()};Re.writeSync(n,JSON.stringify(r)),Re.closeSync(n)}catch(n){if(n instanceof Error&&"code"in n&&n.code==="EEXIST")return null;throw n}return()=>{try{Re.unlinkSync(e)}catch{}}}a(Vn,"acquireLock");function Xo(t){let e=cc.join(t.locksDir,"compact.lock");if(!Re.existsSync(e))return!1;try{let n=JSON.parse(Re.readFileSync(e,"utf-8"));return!(Date.now()-n.timestamp>=lc)}catch{return!1}}a(Xo,"isLocked");async function dc(t,e,n){if(n.sourceScopes&&n.sourceScopes.length>0)return Qp(t,e,n);let r=t.ensureScopeDir(e),o=n.archive??!0,i=Vn(r);if(!i)throw new Error(`scope ${Qe(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=qn(c)}if(s.length===0)return c&&Ce.existsSync(c)&&Ce.unlinkSync(c),{entryCount:0,summary:n.summary};t.appendLongTerm(r,n.summary);let l;return o?c&&(l=t.archiveProcessing(r,c)):c&&Ce.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(dc,"compactScope");async function Qp(t,e,n){let r=t.ensureScopeDir(e),o=n.archive??!0,i=n.checkpoint??!0,s=n.sourceScopes??[],c=[],l=[],d=[],u=Vn(r);if(!u)throw new Error(`scope ${Qe(e)} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);d.push(u);try{let f=s.map(m=>({scope:m,hash:Qe(m),paths:t.ensureScopeDir(m)})).sort((m,h)=>m.hash.localeCompare(h.hash));for(let m of f){if(m.hash===Qe(e))continue;let h=Vn(m.paths);if(!h)throw new Error(`source scope ${m.hash} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);d.push(h)}for(let m of f)if(i){let h=t.extractToProcessing(m.paths,n.query);if(!h)continue;let k=qn(h);c.push(...k),l.push({paths:m.paths,file:h})}else c.push(...t.queryShortTerm(m.paths,n.query));if(c.length===0)return{entryCount:0,summary:n.summary,archivePaths:[]};t.appendLongTerm(r,n.summary);let p=[];for(let m of l)if(o){let h=t.archiveProcessing(m.paths,m.file);h&&p.push(h)}else Ce.existsSync(m.file)&&t.rollbackFromProcessing(m.paths,m.file);return{entryCount:c.length,summary:n.summary,archivePaths:p,archivePath:p[0]}}catch(f){for(let p of l)Ce.existsSync(p.file)&&t.rollbackFromProcessing(p.paths,p.file);throw f}finally{for(let f of d.reverse())f()}}a(Qp,"compactFromSources");async function uc(t,e){let n=[],r=0;if(e){let o=t.pathsFor(e);if(Xo(o))return g.debug("memory","scope \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7 recover",{scopeHash:Qe(e)}),{recoveredScopes:0,recoveredEntries:0,details:[]};let i=Xp(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(Xo(s))continue;let c=qn(i.processingFile);for(let l of c)t.appendShortTerm(s,l);try{Ce.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(uc,"recoverOrphans");function qn(t){if(!Ce.existsSync(t))return[];let n=Ce.readFileSync(t,"utf-8").split(`
56
+ `).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(qn,"readEntriesFromFile");function Xp(t,e){if(!Ce.existsSync(e.processingDir))return{scopeHash:ei.basename(e.dir),entries:0,action:"restored"};let n=0;for(let r of Ce.readdirSync(e.processingDir)){if(!r.endsWith(".jsonl"))continue;let o=ei.join(e.processingDir,r),i=qn(o);for(let s of i)t.appendShortTerm(e,s);n+=i.length;try{Ce.unlinkSync(o)}catch{}}return{scopeHash:ei.basename(e.dir),entries:n,action:"restored"}}a(Xp,"recoverScopeProcessing");var gt=A.object({tenantId:A.string().optional(),baseId:A.string().optional(),channel:A.string(),groupId:A.string().optional(),conversationId:A.string().optional(),roleId:A.string().optional(),scenario:A.string()}),eg=A.object({root_dir:A.string().optional(),default_scope:gt.optional(),retention_days:A.number().optional()}).strict();function tg(t,e){let n=e?.root_dir??"./.memory";return{rootDir:fc.isAbsolute(n)?n:fc.resolve(t.configDir,n),defaultScope:e?.default_scope,retentionDays:e?.retention_days??30}}a(tg,"resolveConfig");function ng(t){let e=new Un(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 dc(e,i,o)},async recover(r){return uc(e,r!==void 0?r:void 0)}}}a(ng,"createMemoryToolkit");var pc={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:eg,defaultConfig(t){return{root_dir:"./.memory",retention_days:30}},build(t,e){let n=tg(e.settings,t);return ng(n)},methods:[{name:"append",description:"\u8FFD\u52A0\u4E00\u6761\u77ED\u671F\u8BB0\u5FC6",params:A.object({scope:A.union([A.string(),gt]).describe("\u8BB0\u5FC6\u8303\u56F4"),entry:A.object({id:A.string().optional(),timestamp:A.string().describe("ISO 8601 \u65F6\u95F4\u6233"),kind:A.string().describe("\u4E1A\u52A1\u81EA\u5B9A\u4E49\u7C7B\u578B"),content:A.string(),summary:A.string().optional(),meta:A.record(A.string(),A.unknown()).optional()})})},{name:"readShortTerm",description:"\u8BFB\u53D6\u77ED\u671F\u8BB0\u5FC6\uFF08\u53EF\u6309\u65F6\u95F4/kind/limit \u8FC7\u6EE4\uFF09",params:A.object({scope:A.union([A.string(),gt]),query:A.object({since:A.string().optional(),until:A.string().optional(),kinds:A.array(A.string()).optional(),limit:A.number().optional()}).optional()}),output:A.array(A.object({timestamp:A.string(),kind:A.string(),content:A.string()}))},{name:"readLongTerm",description:"\u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6 long-term.md",params:A.object({scope:A.union([A.string(),gt])}),output:A.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:A.object({scope:A.union([A.string(),gt]),options:A.object({summary:A.string().describe("\u9884\u8BA1\u7B97\u7684\u6458\u8981\u6587\u672C"),entries:A.array(A.object({timestamp:A.string(),kind:A.string(),content:A.string()})).optional(),sourceScopes:A.array(A.union([A.string(),gt])).optional(),query:A.object({since:A.string().optional(),until:A.string().optional(),kinds:A.array(A.string()).optional(),limit:A.number().optional()}).optional(),checkpoint:A.boolean().optional(),archive:A.boolean().optional(),clearShortTerm:A.boolean().optional()})})},{name:"recover",description:"\u6062\u590D\u5B64\u513F processing \u6587\u4EF6",params:A.object({scope:A.union([A.string(),gt]).optional()})}]};var De=[aa,ka,Ua,Za,Qa,nc,rc,oc,ic,pc];function ti(t=[]){let e=new Map;for(let n of De)e.set(n.name,n);for(let n of t)e.set(n.name,n);return[...e.values()]}a(ti,"composeToolkitRegistry");function Hn(t){let{settings:e,tracker:n,item:r,toolkitConfig:o}=t,i=t.registry??De,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 m=u.configSchema.safeParse(f);if(!m.success){let h=m.error.issues.map(k=>`${k.path.join(".")||"<root>"}: ${k.message}`).join("; ");throw new Error(`${p}toolkit_config.${u.name} \u6821\u9A8C\u5931\u8D25: ${h}`)}return m.data},"parseOverride");for(let u of i){let f=u.defaultConfig?u.defaultConfig(e):{},p=So(f,d(u,l?.[u.name],"\u9879\u76EE\u7EA7 ")),m=d(u,o?.[u.name],"");c[u.name]=u.build(So(p,m),s)}return c}a(Hn,"createToolkit");var ni=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 gc(t,e){let{stepConfig:n}=e;if(!n)return t;let r=e.registry??De,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 ni(s)}:d[u]=f;i[s]=d}return i}a(gc,"createScopedToolkit");import ri from"fs";import ag from"path";import Kn from"fs";import mc from"path";import{createHash as rg,randomBytes as og}from"crypto";var $t=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??mc.join(process.cwd(),".aitable","media","dingtalk"),this.downloadTimeoutMs=e?.downloadTimeoutMs??2e4,this.imageFetcher=e?.imageFetcher??sg}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),g.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=ig(e),o=mc.join(this.mediaDir,`${n}.${r}`);if(Kn.existsSync(o))return o;let i;try{i=await this.imageFetcher(e,this.downloadTimeoutMs)}catch(s){return g.error("media-localizer","image download error",{url:e,error:s instanceof Error?s.message:String(s)}),null}if(!i||i.length===0)return g.warn("media-localizer","image download empty",{url:e}),null;try{Kn.mkdirSync(this.mediaDir,{recursive:!0});let s=`${o}.${og(4).toString("hex")}.tmp`;Kn.writeFileSync(s,i),Kn.renameSync(s,o)}catch(s){return g.error("media-localizer","image write failed",{localPath:o,error:s instanceof Error?s.message:String(s)}),null}return g.debug("media-localizer","image localized",{localPath:o}),o}};function Gn(t){let e=t.replace(/[^A-Za-z0-9_-]/g,"_");return e.length>128?rg("sha1").update(t).digest("hex"):e}a(Gn,"safeMediaId");function ig(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp)$/i);return n?n[1].toLowerCase():"png"}a(ig,"extFromUrl");async function sg(t,e){let n=new AbortController,r=setTimeout(()=>n.abort(),e);try{let o=await fetch(t,{signal:n.signal});if(!o.ok)return g.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(sg,"defaultImageFetcher");var cg=3,lg=480*60*1e3,dg=/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/;function hc(t){return t instanceof Error?t.message:String(t)}a(hc,"errorMessage");function wc(t){let e=t.match(dg);return e?Date.parse(`${e[1]}T${e[2]}${e[3]??""}+08:00`):Date.parse(t)}a(wc,"parseDwsTime");function ug(t){let e=typeof t=="string"&&t.trim()?t.trim():"";if(!e)return new Date().toISOString();let n=wc(e);return Number.isFinite(n)?new Date(n).toISOString():new Date().toISOString()}a(ug,"normalizeCreateTime");function fg(t){let e=wc(t);return Number.isFinite(e)?new Date(e+lg).toISOString().slice(0,19).replace("T"," "):t}a(fg,"formatDwsQueryTime");var Jn=class{static{a(this,"DwsPullAdapter")}name="dws_pull";bin;timeoutMs;downloadTimeoutMs;runner;localizer;failures=new It(cg);constructor(e){this.bin=e.dwsBin,this.timeoutMs=e.timeoutMs??15e3,this.downloadTimeoutMs=e.downloadTimeoutMs??2e4,this.runner=e.runner??G,this.localizer=new $t({imageMode:e.imageMode,mediaDir:e.mediaDir,downloadTimeoutMs:e.downloadTimeoutMs})}async fetchMessages(e,n,r){let o=["chat","message","list","--group",e,"--time",fg(n),"--limit",String(r),"--format","json"],i=a(async()=>{let c=await this.runner(this.bin,o,{timeoutMs:this.timeoutMs});if(c.exitCode!==0)throw new Error(`dws chat message list exited ${c.exitCode}: ${c.stderr.slice(0,300)}`);let l=c.stdout.trim();if(!l)return[];let d;try{d=JSON.parse(l)}catch{throw new Error(`dws chat message list returned invalid JSON: ${l.slice(0,200)}`)}return this.parseMessages(d)},"attempt"),s;try{s=await An(i,{onRetry:a((l,d)=>{let u={conversationId:e,retry:d,error:hc(l)};d>=2?g.warn("message-adapter","fetch transient failure, retrying",u):g.debug("message-adapter","fetch transient failure, retrying",u)},"onRetry")});let{recovered:c}=this.failures.succeed(e);c&&g.info("message-adapter","message fetch recovered",{conversationId:e})}catch(c){let{consecutive:l,escalate:d}=this.failures.fail(e),u={conversationId:e,consecutive:l,error:hc(c)};return d?g.error("message-adapter","sustained message fetch failure \u2014 check dws identity/permission for this conversation",u):g.warn("message-adapter","message fetch failed after retries",u),[]}return this.resolveMedia(s,e)}parseMessages(e){let n=[],r=hg(e);for(let o of r){if(!Mt(o))continue;let i=yg(o),s=yc(i)||mg(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:ug(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})}return g.debug("message-adapter","parsed messages",{count:n.length}),n}async resolveMedia(e,n){if(this.localizer.imageMode==="off")return e;for(let r of e){if(!yc(r.content))continue;let{content:o,images:i}=await this.resolveImages(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}return e}async resolveImages(e,n,r){let o=[],i=[...e.matchAll(gg)];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=Gn(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 g.warn("message-adapter","mediaId missing messageId, cannot download",{conversationId:r}),this.localizer.markFailed(o),null;let s=ag.join(this.localizer.dir,`${o}.png`);try{ri.mkdirSync(this.localizer.dir,{recursive:!0})}catch(d){return g.error("message-adapter","mkdir media dir failed",{error:d instanceof Error?d.message:String(d)}),this.localizer.markFailed(o),null}let c=["chat","message","download-media","--type","mediaId","--resource-id",e,"--message-id",n,"--open-conversation-id",r,"--output",s,"--format","json","-y"],l;try{l=await this.runner(this.bin,c,{timeoutMs:this.downloadTimeoutMs})}catch(d){return g.warn("message-adapter","download-media invocation failed",{error:d instanceof Error?d.message:String(d)}),this.localizer.markFailed(o),null}if(l.exitCode!==0)return g.warn("message-adapter","download-media non-zero exit",{exitCode:l.exitCode,stderr:l.stderr.slice(0,200)}),this.localizer.markFailed(o),null;if(this.localizer.imageMode==="url"){let d=pg(l.stdout);return d?this.localizer.register(o,d):(g.warn("message-adapter","download-media returned no downloadUrl"),this.localizer.markFailed(o),null)}return!ri.existsSync(s)||ri.statSync(s).size===0?(g.warn("message-adapter","download-media wrote no file",{outPath:s}),this.localizer.markFailed(o),null):this.localizer.register(o,s)}};function Mt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Mt,"isRecord");function pg(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(!Mt(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))Mt(c)&&o.push(c)}return null}a(pg,"extractDownloadUrl");var gg=/\[图片消息\]\(mediaId=([@$][A-Za-z0-9_$+/=-]+)\)|!\[(?:图片|image)\]\(([@$][A-Za-z0-9_$+/=-]+)\)/g;function yc(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(yc,"hasImageMarker");function mg(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(mg,"isImageMsgType");function hg(t){if(Array.isArray(t))return t;if(!Mt(t))return[];for(let e of["body","data","result","response"]){let n=t[e];if(Array.isArray(n))return n;if(Mt(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(hg,"findMessageArray");function yg(t){for(let e of["text","content","body","markdown"]){let n=t[e];if(typeof n=="string"&&n.trim())return n.trim()}if(Mt(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(yg,"extractTextContent");import oi from"path";var wg=/^\$\{(env|config|globalVar)\.([^}]+)\}$/;function Xe(t){if(typeof t!="string")return null;let e=t.match(wg);return e?{ns:e[1],path:e[2]}:null}a(Xe,"runtimeRefTarget");function Zn(t,e){let n=Xe(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(Zn,"resolveRuntimeRef");function Yn(t){return Xe(t)!==null}a(Yn,"isRuntimeRef");var Qn=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=Zn(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(kg(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?oi.isAbsolute(this.config.mediaDir)?this.config.mediaDir:oi.resolve(r,this.config.mediaDir):oi.join(r,".aitable","media","dingtalk");this.adapter=new Jn({dwsBin:this.config.dwsBin??"dws",imageMode:this.config.imageMode,mediaDir:o,downloadTimeoutMs:this.config.downloadTimeoutMs}),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=Xe(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(g.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){g.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)}g.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();g.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):g.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);if(r.length>0){let s=r[0].createTime,c=Date.parse(s);for(let l of r){let d=Date.parse(l.createTime);!Number.isNaN(d)&&(Number.isNaN(c)||d>c)&&(s=l.createTime,c=d)}n.lastFetchTime=s}let o=this.sortByCreateTimeAsc(this.dedup(this.filterBySender(r)));if(o.length===0)return[];let i=this.aggregateBySender?this.groupBySender(o):[{sender:null,messages:o}];return g.info("dingtalk-message-source","emitting message_received",{name:this.name,conversationId:e,eventCount:i.length,messageCount:o.length}),i.map(s=>this.buildEvent(e,s.messages,s.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},messages:i}})}buildEvent(e,n,r){let o={conversationId:e,messages:n,content:n.map(s=>`${s.senderName??s.sender}: ${s.content}`).join(`
57
+ `),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)),{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}}};function kg(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(kg,"extractConversationIds");import ii from"path";var kc=1e4,bg=100,vg=600*1e3,bc=2e3,Sg=1e3,Rg=3e4,Cg=5e3,xg="1",vc="__inline__",Xn=class{static{a(this,"DingTalkStreamSource")}name;config;running=!1;onEvent=null;connections=new Map;seenMsgIds=new Map;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?ii.isAbsolute(this.config.mediaDir)?this.config.mediaDir:ii.resolve(r,this.config.mediaDir):ii.join(r,".aitable","media","dingtalk");this.localizer=new $t({...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 $e({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&&(g.info("dingtalk-stream-source","starting (inline)",{name:this.name,clientId:Ig(this.config.clientId),...this.config.endpoint?{endpoint:this.config.endpoint}:{}}),this.connectRobot(vc,this.config.clientId,this.config.clientSecret)),this.config.robotRefs!==void 0){g.info("dingtalk-stream-source","starting (dynamic)",{name:this.name}),this.reconcile();for(let n of[this.config.robotRefs,this.config.robotCreds]){let r=Xe(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&&g.warn("dingtalk-stream-source","skip: \u672A\u914D\u7F6E clientId/clientSecret \u6216 robot_refs",{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)}g.info("dingtalk-stream-source","stopped",{name:this.name})}reconcile(){if(this.config.robotRefs===void 0)return;let e=this.resolveRef(this.config.robotRefs),n=new Set((Array.isArray(e)?e:[]).map(o=>String(o).trim()).filter(o=>o.length>0)),r=this.resolveRef(this.config.robotCreds)??{};for(let o of n){let i=r[o];if(!i?.client_id||!i?.client_secret){this.connections.has(o)||g.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!==vc&&(n.has(o)||this.disconnectRobot(o,i))}resolveRef(e){return Zn(e,{configScope:this.configScope,globalVars:this.globalVars})}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){g.warn("dingtalk-stream-source","ACK failed",{name:this.name,credRef:e.credRef,messageId:c,error:l instanceof Error?l.message:String(l)})}},l=>{g.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,g.info("dingtalk-stream-source","connected",{name:this.name,credRef:e.credRef})}catch(s){e.established=!1,g.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(),Cg),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(g.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(Sg*2**e.reconnectAttempts,Rg);e.reconnectAttempts+=1,g.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){g.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),g.info("dingtalk-stream-source","disconnected",{name:this.name,credRef:e})}async waitForConnected(e){let n=Date.now()+kc;for(;Date.now()<n;){if(e.connected)return;await new Promise(r=>setTimeout(r,bg))}throw new Error(`dingtalk-stream \u8FDE\u63A5\u8D85\u65F6\uFF08${kc}ms\uFF09`)}async handleDownstream(e,n){let r;try{r=JSON.parse(e.data)}catch(l){g.warn("dingtalk-stream-source","drop: malformed JSON frame",{name:this.name,error:l instanceof Error?l.message:String(l)});return}if(!r.conversationId){g.warn("dingtalk-stream-source","drop: missing conversationId",{name:this.name});return}if((this.config.dropDirect??!0)&&r.conversationType===xg){g.debug("dingtalk-stream-source","drop: direct conversation",{name:this.name,conversationId:r.conversationId});return}let i=r.msgId||e.headers?.messageId||"";if(i&&!this.rememberMessageId(i)){g.debug("dingtalk-stream-source","drop: duplicate msgId",{name:this.name,messageId:i});return}let s=await this.toChatMessage(r,i,n.mediaDownloader);if(!s){g.debug("dingtalk-stream-source","drop: unparseable",{name:this.name,msgtype:r.msgtype});return}let c=this.buildEvent(r.conversationId,s,this.extractReplyContext(r,i,n.credRef));rn.register({conversationId:r.conversationId,...r.sessionWebhook?{sessionWebhook:r.sessionWebhook}:{},...typeof r.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:r.sessionWebhookExpiredTime}:{},...s.sender?{senderStaffId:s.sender}:{},...r.robotCode?{robotCode:r.robotCode}:{}}),g.info("dingtalk-stream-source","emitting message_received",{name:this.name,conversationId:r.conversationId,sender:s.senderName??s.sender,msgtype:r.msgtype}),this.onEvent?.([c])}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 _g(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}}rememberMessageId(e){let n=Date.now();if(this.seenMsgIds.size>bc)for(let[r,o]of this.seenMsgIds)n-o>vg&&this.seenMsgIds.delete(r);if(this.seenMsgIds.size>bc){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=Sc(e,"client_id","clientId","client_id_env"),r=Sc(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,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 Sc(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(Sc,"resolveSecret");function Tg(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(Tg,"extractTextContent");async function Rc(t,e,n,r){if(!r||!t)return null;let o=Gn(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 g.warn("dingtalk-stream-source","downloadMessageFile failed",{error:c instanceof Error?c.message:String(c)}),n.markFailed(o),null}return n.localizeRemoteUrl(s,o)}a(Rc,"localizeDownloadCode");async function _g(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 Rc(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 Rc(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:Tg(t),images:[]}}a(_g,"extractStreamContent");function Ig(t){return t.length<=8?t:`${t.slice(0,4)}...${t.slice(-4)}`}a(Ig,"maskClientId");import{CronExpressionParser as si}from"cron-parser";var er="0 0 * * *",tr=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)),g.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(),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){g.error("cron-scheduler","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(n)}g.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 g.info("cron-scheduler","fired",{name:this.name,eventType:this.config.eventType,scheduledFor:n,nextFireAt:this.nextFireAt?.toISOString()}),[r]}computeNextFireAt(e){let n=this.cronExpr??er;try{return si.parse(n,{currentDate:e,tz:this.timezone}).next().toDate()}catch(r){return g.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)}),si.parse(er,{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 g.warn("cron-scheduler","dailyAt \u683C\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230 00:00",{dailyAt:e}),er}validateCron(e){try{return si.parse(e,{tz:this.timezone}),e}catch(n){return g.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)}),er}}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 g.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}}};var nr=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 re({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)&&g.warn("aitable-record-source","missing base_id / table_id",{name:this.name}),g.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){g.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)}g.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=Ag(o);if(!i)continue;let s=Eg(o),c=this.resolveFieldNames?this.translateCellsToNames(s):s,l=ai(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&&g.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 ie(e)){if(!y(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))}g.info("aitable-record-source","field mapping resolved",{name:this.name,count:this.idToName.size})}catch(e){g.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:this.compileSimpleFilter(this.config.filter),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=ie(d);e.push(...u);let f=Dn(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}compileSimpleFilter(e){if(e===void 0)return;let n=Array.isArray(e)?e:[e],r=[];for(let o of n){if(!o||typeof o!="object"||typeof o.field!="string"||o.field.trim()===""){g.warn("aitable-record-source","\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08field \u7F3A\u5931\uFF09",{name:this.name,cond:o});continue}let s=(Array.isArray(o.equals)?o.equals:[o.equals]).filter(l=>l!=null&&l!=="");if(s.length===0){g.warn("aitable-record-source","\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08equals \u4E3A\u7A7A\uFF09",{name:this.name,cond:o});continue}let c=s.map(l=>({operator:"eq",operands:[o.field,l]}));r.push(c.length===1?c[0]:{operator:"or",operands:c})}if(r.length!==0)return{operator:"and",operands:r}}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 Eg(t){let e=oe(t);if(!y(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(y(r))return r}return e}a(Eg,"recordCells");function Ag(t){let e=oe(t);if(!y(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(Ag,"extractRecordId");function ai(t){return Array.isArray(t)?`[${t.map(ai).join(",")}]`:y(t)?`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${ai(t[n])}`).join(",")}}`:JSON.stringify(t)??"null"}a(ai,"stableStringify");var Dg=/^workflow:[A-Za-z0-9_-]+\.tracker$/,ci=[{type:"dingtalk_message",description:"\u9489\u9489\u7FA4\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\u3010dws \u8F6E\u8BE2\u65B9\u5F0F\u3011\uFF1A\u5B9A\u65F6\u62C9\u53D6\u4F1A\u8BDD\u6D88\u606F\u3002\u4E0E dingtalk_stream \u4EA7\u51FA\u540C\u6784\u7684 message_received \u4E8B\u4EF6\uFF0C\u5207\u6362\u5165\u7AD9\u65B9\u5F0F\u53EA\u9700\u6539\u4E8B\u4EF6\u6E90 type\uFF0C\u4E0B\u6E38 handler/workflow \u96F6\u6539\u52A8\u3002",factory:a((t,e)=>new Qn(t,e),"factory"),configPolicy:{requiredFields:[{field:"conversation_ids",label:"\u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868",valueType:"string[]"}],validate:a(t=>{let e=t.conversation_ids??t.conversationIds;return Yn(e)?{requiredFields:[],errors:[],summary:`\u4F7F\u7528 ${Xe(e).ns} ref \u52A8\u6001\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868`}:{requiredFields:[{field:"conversation_ids",label:"\u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868",valueType:"string[]"}],errors:[]}},"validate")}},{type:"dingtalk_stream",description:"\u9489\u9489\u7FA4\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\u3010\u4F01\u4E1A\u673A\u5668\u4EBA Stream \u65B9\u5F0F\u3011\uFF1AWebSocket \u63A8\u9001\uFF0C\u7FA4\u5185 @ \u673A\u5668\u4EBA\u89E6\u53D1\u3002\u4E0E dingtalk_message \u4EA7\u51FA\u540C\u6784\u7684 message_received \u4E8B\u4EF6\uFF0C\u5207\u6362\u5165\u7AD9\u65B9\u5F0F\u53EA\u9700\u6539\u4E8B\u4EF6\u6E90 type\uFF0C\u4E0B\u6E38\u96F6\u6539\u52A8\uFF1B\u51FA\u7AD9 @\u4EBA \u7531 messaging.replyToConversation \u6D88\u8D39\u672C\u6E90\u767B\u8BB0\u7684 sessionWebhook \u5B8C\u6210\u3002",factory:a((t,e)=>new Xn(t,e),"factory"),configPolicy:{requiredFields:[],validate:$g}},{type:"cron_scheduler",description:"\u5B9A\u65F6\u8C03\u5EA6\u4E8B\u4EF6\u6E90",factory:a(t=>new tr(t),"factory"),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",factory:a(t=>new nr(t),"factory"),configPolicy:{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],validate:Mg}}];function Pg(t){return ci.find(e=>e.type===t)}a(Pg,"getEventSourceDescriptor");function on(t,e){let r=Pg(t)?.configPolicy;if(!r)return{requiredFields:[],errors:[]};let o=r.validate?.(e);return{requiredFields:o?.requiredFields??r.requiredFields??[],...r.oneOf?{oneOf:r.oneOf}:{},errors:o?.errors??[],...o?.summary?{summary:o.summary}:{}}}a(on,"eventSourceConfigPolicy");function $g(t){return{requiredFields:[],errors:[],summary:"\u51ED\u636E\u7ECF robot_creds ref \u6D3B\u8BFB;\u914D robot_refs/robot_creds \u52A8\u6001\u7BA1\u7406\u591A\u673A\u5668\u4EBA\u8FDE\u63A5\u6C60"}}a($g,"validateDingtalkStreamSourceConfig");function Mg(t){return jg(t)?Fg(t):{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],errors:[]}}a(Mg,"validateAitableRecordSourceConfig");function jg(t){let e=t.source_table;return y(e)&&e.mode==="reference"}a(jg,"hasReferenceSourceTable");function Fg(t){let e=t.source_table,n=y(e)&&typeof e.ref=="string"?e.ref.trim():"";return n?Dg.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(Fg,"referenceSourceTablePolicy");var Og=new Map(ci.map(t=>[t.type,t.factory])),rr=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)??Og.get(e.type);if(!r)return g.warn("event-source-registry","\u672A\u77E5\u4E8B\u4EF6\u6E90\u7C7B\u578B",{type:e.type,name:e.name}),null;try{let o=r(e,n);return g.info("event-source-registry","\u4E8B\u4EF6\u6E90\u5DF2\u521B\u5EFA",{name:e.name,type:e.type}),o}catch(o){return g.error("event-source-registry","\u4E8B\u4EF6\u6E90\u521B\u5EFA\u5931\u8D25",{name:e.name,type:e.type,error:o instanceof Error?o.message:String(o)}),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=Ng(c,n.configRefs??{}),d=Lg(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 Ng(t,e){return Object.keys(e).length===0?t:or(t,e)}a(Ng,"resolveConfigReferences");function Cc(t,e){return Object.keys(e).length===0?t:or(t,e)}a(Cc,"resolvePureRefs");function or(t,e){if(Array.isArray(t))return t.map(o=>or(o,e));if(!y(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]:(g.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]=or(i,e);return r}a(or,"resolveReferenceValue");function Lg(t,e){if(t.type!=="aitable_record")return t;let n=t.config.source_table;if(!y(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}}:(g.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(Lg,"resolveEventSourceReferences");function xc(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,li(r,`${c}.config`,i.config),i.handler_config&&(r[`${c}.handler_config`]=i.handler_config,li(r,`${c}.handler_config`,i.handler_config))}return r}a(xc,"collectWorkflowReferenceValues");function li(t,e,n){if(y(n))for(let[r,o]of Object.entries(n)){let i=`${e}.${r}`;t[i]=o,y(o)&&li(t,i,o)}}a(li,"flattenReferenceValues");var et=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),g.debug("global-var","set",{key:e});let r=this.listeners.get(e);if(r)for(let o of r)try{o()}catch(i){g.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 F}from"zod";var Wg=F.enum(["ambient","task","guardian"]),Bg=F.object({id:F.string().min(1),name:F.string().min(1),description:F.string().default("")}),zg=F.enum(["critical","warning"]),Ug=F.object({id:F.string().min(1),rule:F.string().min(1),severity:zg.default("warning")}),Vg=F.object({format:F.enum(["json","text","markdown"]).default("text"),schema:F.record(F.string(),F.unknown()).optional()}),qg=F.object({auto_execute:F.boolean(),requires_human_review:F.boolean(),can_escalate:F.boolean().optional(),can_delegate:F.boolean().optional(),can_suggest_workflow_change:F.boolean().optional()}),Hg=F.object({initial_level:F.number().min(1).default(1),auto_level_up_threshold:F.number().min(1).default(20),level_down_on_failure:F.boolean().default(!0),autonomy_by_level:F.record(F.string(),qg).default({})}),Kg=F.object({enabled:F.boolean().default(!1),persistence:F.enum(["file","aitable","none"]).default("none"),max_entries:F.number().min(1).default(100),retention_days:F.number().min(1).default(90),learns_from:F.array(F.enum(["execution_results","human_feedback","peer_corrections"])).default([])}),Gg=F.object({source:F.string().url(),collection:F.string().min(1)}),Jg=F.union([F.string(),Gg]),Zg=F.object({domains:F.array(F.string()).default([]),kb_collections:F.array(Jg).default([])}),sn=F.object({id:F.string().min(1),name:F.string().min(1),department:F.string().optional(),version:F.string().default("1.0.0"),archetype:Wg.default("task"),persona:F.union([F.string().min(1),F.object({file:F.string().min(1)})]),skills:F.array(Bg).default([]),guardrails:F.array(Ug).default([]),output_standard:Vg.optional(),knowledge_scope:Zg.optional(),trust:Hg.optional(),memory:Kg.optional()});function di(t){let e=sn.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(di,"parseRoleDefinition");var Tc={auto_execute:!1,requires_human_review:!0,can_escalate:!1,can_delegate:!1,can_suggest_workflow_change:!1};var Yg="__ephemeral__",ir=class{constructor(e){this.registry=e}registry;static{a(this,"RoleResolver")}async resolve(e){let n=this.registry.get(e);return n?_c(n,!1):(g.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=em(e);return _c(n,!0)}};function Qg(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}:{...Tc}}a(Qg,"resolveAutonomy");function _c(t,e){let n=t.trust?.initial_level??1;return{definition:t,currentTrustLevel:n,autonomy:Qg(t,n),memoryEntries:[],ephemeral:e}}a(_c,"buildInstance");function Xg(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(Xg,"buildRoleContext");async function ui(t,e){if(!t||!e||!e.trim())return;let r=await t.resolve(e)??t.buildEphemeral(e);return Xg(r)}a(ui,"resolveRoleContext");function em(t){let e=t.trim()||"\u901A\u7528\u52A9\u624B";return sn.parse({id:Yg,name:tm(e),persona:e,archetype:"task"})}a(em,"ephemeralDefinition");function tm(t){let n=(t.split(`
58
+ `)[0]?.trim()??"")||"\u4E34\u65F6\u89D2\u8272";return n.length>20?`${n.slice(0,20)}\u2026`:n}a(tm,"deriveName");var an=new Set(["ai","coding","messaging","git","codeReview","ci","table","todo","approval","file","memory"]);function sr(t,e){if(t==null)return"";switch(e){case"user":case"person":case"creator":case"lastModifier":return nm(t);case"department":case"group":return rm(t);case"singleSelect":return pi(t);case"multipleSelect":return om(t);case"url":return im(t);case"richText":return sm(t);case"attachment":return am(t);case"unidirectionalLink":case"bidirectionalLink":return cm(t);case"geolocation":return lm(t);case"text":case"primaryDoc":case"telephone":case"email":case"barcode":case"idCard":return ht(t);case"number":case"currency":case"progress":case"rating":return dm(t);case"date":case"createdTime":case"lastModifiedTime":return ht(t);case"checkbox":return!!t;default:return mt(t)}}a(sr,"normalizeByType");function nm(t){if(Array.isArray(t))return t.map(e=>{if(y(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:mt(e)}return mt(e)});if(y(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 mt(t)}a(nm,"normalizePersonCell");function rm(t){return Array.isArray(t)?t:mt(t)}a(rm,"normalizeIdArray");function pi(t){if(typeof t=="string")return t;if(y(t)){let e=t.name;if(typeof e=="string")return e;let n=t.id;if(typeof n=="string")return n}return ht(t)}a(pi,"extractOptionName");function om(t){return Array.isArray(t)?t.map(e=>pi(e)).filter(Boolean).join(", "):pi(t)}a(om,"extractOptionNames");function im(t){if(typeof t=="string")return t;if(y(t)){let e=t.link;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return ht(t)}a(im,"normalizeUrlCell");function sm(t){if(typeof t=="string")return t;if(y(t)){let e=t.markdown;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return ht(t)}a(sm,"extractMarkdown");function am(t){return Array.isArray(t)?t.map(e=>{if(y(e)){let n=e.filename??e.name;if(typeof n=="string")return n}return""}).filter(Boolean).join(", "):ht(t)}a(am,"normalizeAttachments");function cm(t){if(y(t)){let e=t.linkedRecordIds;if(Array.isArray(e))return e}return mt(t)}a(cm,"extractLinkedIds");function lm(t){return y(t)?t:ht(t)}a(lm,"normalizeGeo");function ht(t){return t==null?"":typeof t=="string"?t:String(t)}a(ht,"primitiveToString");function dm(t){if(typeof t=="number")return t;if(typeof t=="string"){let e=Number(t);return Number.isFinite(e)?e:0}return 0}a(dm,"toNumber");function mt(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=>mt(e)).join(", ");if(y(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(mt,"legacyNormalize");function um(t,e){let n={};for(let[r,o]of Object.entries(t))n[r]=sr(o,e?.[r]);return n}a(um,"normalizeFields");var ar=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 et,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=En();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}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=Nn[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 ui(this.roleResolver,void 0),f=await this.resolveKb(u),p=nn({...u?{roleContext:u}:{},...f?{kbContext:f}:{}}),m=p?`${p.promptBlock}
59
+
60
+ ---
61
+
62
+ ${l}`:l;g.info("executor","Coding Agent \u6267\u884C",{stepId:e.id,agent:c,promptLen:m.length,contextInjected:!!p}),i.push(`[Agent: ${c}] \u6267\u884C\u4E2D...`);try{let h=await we(m,{agent:c,configPath:Ae(this.settings.configDir),workDir:p?.kbActive?p.kbRootDir:this.settings.recipeDir,timeoutMs:d,signal:o,...p?.kbActive?{adapterOptions:{allowedTools:["Read","Glob","Grep"]}}:{},onEvent:a(w=>{w.type==="error"&&w.content&&i.push(`[ERROR] ${w.content}`)},"onEvent")});return h.events.some(w=>w.type==="error")||!h.response?{status:"failed",output:{response:h.response},error:"Coding Agent \u6267\u884C\u5931\u8D25",logs:i}:(i.push(`[Agent] \u6267\u884C\u5B8C\u6210 (\u54CD\u5E94\u957F\u5EA6: ${h.response.length})`),{status:"success",output:{response:h.response,sessionId:h.sessionId},logs:i})}catch(h){let k=h instanceof Error?h.message:String(h);return o.aborted?{status:"blocked",output:{},blockReason:"\u4EFB\u52A1\u88AB\u53D6\u6D88",logs:i}:(g.error("executor","Agent \u6267\u884C\u5F02\u5E38",{stepId:e.id,error:k}),{status:"failed",output:{},error:k,logs:[...i,`[ERROR] ${k}`]})}}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 g.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 ui(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,setGlobalVar:a((w,b)=>this.globalVars.set(w,b),"setGlobalVar"),getGlobalVar:a(w=>this.globalVars.get(w),"getGlobalVar"),roleContext:d,...u?{kbContext:u}:{},log:a(w=>{i.push(w),g.debug("recipe",w,{stepId:e.id,itemId:n.id})},"log")},m=new AbortController,h=setTimeout(()=>m.abort(),c),k=fm(o,m.signal);try{g.info("recipe","\u6267\u884C\u5F00\u59CB",{stepId:e.id,recipe:s.meta.id,itemId:n.id});let w=await s.execute({...p,signal:k});return w.logs=[...i,...w.logs],g.info("recipe","\u6267\u884C\u5B8C\u6210",{stepId:e.id,status:w.status}),w}catch(w){let b=w instanceof Error?w.message:String(w),C=w instanceof Ee?w.retryable:void 0;return g.error("recipe","\u6267\u884C\u5F02\u5E38",{stepId:e.id,error:b}),{status:"failed",output:{},error:b,...C===!1?{retryable:!1}:{},logs:[...i,`[ERROR] ${b}`]}}finally{clearTimeout(h)}}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=Ec(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=fi.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=fi.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=Ic.existsSync(r)?r:Ic.existsSync(o)?o:r,s;i.endsWith(".ts")&&await Tt();try{s=await import(i)}catch(l){let d=l instanceof Error?l.message:String(l);if(i.endsWith(".ts")&&d.includes("Unknown file extension"))s=await this.loadRecipeViaTsx(i);else throw new Error(`\u65E0\u6CD5\u52A0\u8F7D Recipe "${e}" (${i}): ${d}`)}let 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}async loadRecipeViaTsx(e){let{execSync:n}=await import("child_process"),r=`
63
+ import recipe from ${JSON.stringify(e)};
64
+ const def = recipe.default ?? recipe;
65
+ // \u9A8C\u8BC1 recipe \u7ED3\u6784\u5B58\u5728
66
+ if (def && typeof def.execute === 'function') {
67
+ console.log(JSON.stringify({ valid: true }));
68
+ } else {
69
+ console.log(JSON.stringify({ valid: false }));
70
+ }
71
+ `;try{n(`npx tsx -e ${JSON.stringify(r)}`,{cwd:fi.dirname(e),timeout:1e4,stdio:["pipe","pipe","pipe"]})}catch{throw new Error(`tsx \u52A0\u8F7D Recipe \u5931\u8D25: ${e}`)}try{return await import("tsx/esm/api").then(o=>o.register?.()).catch(()=>{}),await import(e)}catch{throw new Error(`\u65E0\u6CD5\u52A0\u8F7D .ts Recipe\u3002\u8BF7\u4F7F\u7528 "npx tsx src/cli.ts run" \u542F\u52A8\uFF0C\u6216\u5C06 recipe \u7F16\u8BD1\u4E3A .js \u6587\u4EF6\u3002
72
+ \u8DEF\u5F84: ${e}`)}}resolveInput(e,n,r){let o=e.input_mapping;if(!o)return um(n.fields,n.fieldTypes);let i={};for(let[s,c]of Object.entries(o))if(c.startsWith("$var."))i[s]=sr(Ec(r,c.slice(5)));else{let l=n.fieldTypes?.[c];i[s]=sr(n.fields[c],l)}return i}buildToolkit(e,n,r,o){let i=this.mergeToolkitConfig(n),s=Hn({settings:this.settings,tracker:this.tracker,item:e,toolkitConfig:i,...r?{roleContext:r}:{},...o?{kbContext:o}:{},registry:this.toolkitRegistry});return gc(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(an.has(i)&&!(s===!1||s===!0)&&y(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 Ba({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))an.has(r)||(n[r]=o);return Object.keys(this.configRefs).length>0?Cc(n,this.configRefs):n}};function fm(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(fm,"combineSignals");function Ec(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(Ec,"resolveVarPath");var CI=4001,xI=1013,pm=new Set(["ready","pong","event","result","error","ready:ack","ping","run:agent","run:dws","upload:request","upload:grant"]);function TI(t){if(typeof t!="object"||t===null)return!1;let e=t.type;return typeof e=="string"&&pm.has(e)}a(TI,"isRelayMessage");import Ac from"path";var gm=[/^workflow\.yml$/i,/^views\.yml$/i,/^aitable-workflow\.config\.yml$/i,/^coding-agents\.config\.json$/i,/^design[^/]*\.yml$/i,/^recipes\/.+$/i,/^roles\/.+$/i];function gi(t){return Ac.normalize(t).replace(/\\/g,"/").replace(/^\.\//,"")}a(gi,"normalizeArtifactRelPath");function mm(t){if(typeof t!="string"||t.trim()===""||Ac.isAbsolute(t))return!1;let e=gi(t);return!(e===""||e==="."||e.split("/").some(n=>n===".."))}a(mm,"isSafeRelativePath");function AI(t){if(!mm(t))return!1;let e=gi(t);return gm.some(n=>n.test(e))}a(AI,"isAllowedArtifactPath");function DI(t,e,n){let r=gi(n);return`artifacts/${t}/${e}/${r}`}a(DI,"buildArtifactKey");function MI(t){return!!(t.bucket&&t.accessKeyId&&t.accessKeySecret)}a(MI,"hasOssCredentials");var Dc=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()]}};var ke="2026-07-14T00:00:00.000Z",cr={id:"task_design_1",projectId:"wf_contract",stage:"design",status:"running",attempt:1,startedAt:ke,updatedAt:ke,currentAction:"\u6B63\u5728\u751F\u6210\u5DE5\u4F5C\u6D41\u8BBE\u8BA1",checkpoint:"round_1"},cn={...cr,status:"blocked",checkpoint:"discovery_waiting_user",currentAction:"\u7B49\u5F85\u7528\u6237\u786E\u8BA4\u9700\u6C42\u6F84\u6E05",block:{reason:"discovery_required",message:"\u8BF7\u786E\u8BA4\u4EE5\u4E0B\u8BBE\u8BA1\u7EA6\u675F",actionLabel:"\u786E\u8BA4\u5E76\u5F00\u59CB\u751F\u6210"},outputs:{discovery:{form:{id:"contract_discovery",title:"\u786E\u8BA4\u5DE5\u4F5C\u6D41\u8BBE\u8BA1\u7EA6\u675F",submitLabel:"\u786E\u8BA4\u5E76\u5F00\u59CB\u751F\u6210",questions:[{id:"scope",type:"single_choice",title:"\u4F18\u5148\u8986\u76D6\u54EA\u4E2A\u6D41\u7A0B\u8303\u56F4\uFF1F",required:!0,options:["\u552E\u540E\u5DE5\u5355","\u5BA2\u6237\u56DE\u8BBF"]}]},answers:{scope:"\u552E\u540E\u5DE5\u5355"},summary:"\u7528\u6237\u786E\u8BA4\u4F18\u5148\u8986\u76D6\u552E\u540E\u5DE5\u5355",confirmed:!1}}},mi={...cr,status:"failed",checkpoint:"validating",currentAction:"\u771F\u5B9E\u8BBE\u8BA1\u672A\u901A\u8FC7\u6821\u9A8C",completedAt:ke,error:{code:"DESIGN_VALIDATION_FAILED",message:"\u771F\u5B9E\u8BBE\u8BA1\u672A\u901A\u8FC7\u6821\u9A8C",retryable:!0}},Pc={fieldCount:2,viewCount:1,fields:[{id:"fld_title",name:"\u6807\u9898",type:"text",group:"business"},{id:"fld_state",name:"\u72B6\u6001",type:"single_select",options:["\u5F85\u5904\u7406","\u5904\u7406\u4E2D","\u5DF2\u5B8C\u6210"],group:"process"}],views:[{id:"view_main",name:"\u5168\u90E8\u5DE5\u5355",kind:"grid",desc:"\u67E5\u770B\u5168\u90E8\u552E\u540E\u5DE5\u5355"}]},hi={id:"task_setup_1",projectId:"wf_contract",stage:"setup",status:"succeeded",attempt:1,startedAt:ke,updatedAt:ke,completedAt:ke,currentAction:"AI \u8868\u683C\u642D\u5EFA\u5B8C\u6210",checkpoint:"done",outputs:{tableUrl:"https://alidocs.dingtalk.com/i/nodes/base_contract",schema:Pc}},yi={id:"task_run_1",projectId:"wf_contract",stage:"run",status:"running",attempt:1,startedAt:ke,updatedAt:ke,currentAction:"\u771F\u5B9E\u8FD0\u884C\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u5F00\u59CB\u76D1\u542C AI \u8868\u683C\u4E2D\u7684\u5F85\u5904\u7406\u8BB0\u5F55",checkpoint:"listening"},LI=[{path:"workflow.yml",content:`meta:
73
+ name: contract workflow
74
+ steps: []
75
+ `},{path:"aitable-workflow.config.yml",content:`scene: \u552E\u540E\u5DE5\u5355\u81EA\u52A8\u5316
76
+ tracker:
77
+ base_id: base_contract
78
+ table_id: table_contract
79
+ recipe:
80
+ llm:
81
+ provider: idealab
82
+ model: test-model
83
+ `}],WI={steps:[],edges:[]},BI={projectId:"wf_contract",stage:"run",activeTask:yi,lastTasks:{design:{...cr,status:"succeeded",completedAt:ke,currentAction:"\u5DE5\u4F5C\u6D41\u8BBE\u8BA1\u5B8C\u6210",checkpoint:"done"},setup:hi,run:yi},stageRuntime:{init:{status:"succeeded",message:"\u914D\u7F6E\u5DF2\u5B8C\u6210",retryable:!1},design:{status:"succeeded",taskId:"task_design_1",checkpoint:"done",message:"\u5DE5\u4F5C\u6D41\u8BBE\u8BA1\u5B8C\u6210",retryable:!1},setup:{status:"succeeded",taskId:"task_setup_1",checkpoint:"done",message:"AI \u8868\u683C\u642D\u5EFA\u5B8C\u6210",retryable:!1},run:{status:"running",taskId:"task_run_1",checkpoint:"listening",message:"\u771F\u5B9E\u8FD0\u884C\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u5F00\u59CB\u76D1\u542C AI \u8868\u683C\u4E2D\u7684\u5F85\u5904\u7406\u8BB0\u5F55",retryable:!1}},runSnapshot:{records:[{id:"rec_contract_1",title:"\u5BA2\u6237\u53CD\u9988\u53D1\u7968\u4FE1\u606F\u9519\u8BEF",state:"\u5904\u7406\u4E2D",status:"running",currentStepId:"validate_invoice",doneStepIds:["classify"],createdAt:17841312e5,updatedAt:178413126e4}],logs:[{id:"log_contract_1",ts:178413126e4,itemId:"rec_contract_1",stepId:"validate_invoice",level:"info",text:"\u8FDB\u5165\u53D1\u7968\u4FE1\u606F\u6821\u9A8C\u6B65\u9AA4"}]},updatedAt:ke},zI={projectId:"wf_contract",stage:"design",activeTask:cn,lastTasks:{design:cn},stageRuntime:{init:{status:"succeeded",message:"\u914D\u7F6E\u5DF2\u5B8C\u6210",retryable:!1},design:{status:"blocked",taskId:cn.id,checkpoint:"discovery_waiting_user",message:"\u8BF7\u786E\u8BA4\u4EE5\u4E0B\u8BBE\u8BA1\u7EA6\u675F",retryable:!0,block:cn.block,recoveryAction:{type:"confirm_input",label:"\u786E\u8BA4\u5E76\u5F00\u59CB\u751F\u6210",description:"\u8BF7\u786E\u8BA4\u4EE5\u4E0B\u8BBE\u8BA1\u7EA6\u675F",api:{method:"POST",path:"/api/projects/wf_contract/design/discovery/confirm"}}},setup:{status:"idle",message:"\u5C1A\u672A\u5F00\u59CB"},run:{status:"idle",message:"\u5C1A\u672A\u5F00\u59CB"}},updatedAt:ke},UI={projectId:"wf_contract",stage:"design",activeTask:null,lastTasks:{design:mi},stageRuntime:{init:{status:"succeeded",message:"\u914D\u7F6E\u5DF2\u5B8C\u6210",retryable:!1},design:{status:"failed",taskId:mi.id,checkpoint:"validating",message:"\u771F\u5B9E\u8BBE\u8BA1\u672A\u901A\u8FC7\u6821\u9A8C",retryable:!0,error:mi.error,recoveryAction:{type:"retry",label:"\u91CD\u65B0\u751F\u6210\u5DE5\u4F5C\u6D41\u8BBE\u8BA1",description:"\u771F\u5B9E\u8BBE\u8BA1\u672A\u901A\u8FC7\u6821\u9A8C",api:{method:"POST",path:"/api/projects/wf_contract/design"}}},setup:{status:"idle",message:"\u5C1A\u672A\u5F00\u59CB"},run:{status:"idle",message:"\u5C1A\u672A\u5F00\u59CB"}},updatedAt:ke},VI=[{type:"task.started",task:cr},{type:"design.discovery",summary:"\u7528\u6237\u786E\u8BA4\u4F18\u5148\u8986\u76D6\u552E\u540E\u5DE5\u5355"},{type:"task.blocked",task:cn}],qI=[{type:"task.started",task:{...hi,status:"running",completedAt:void 0,checkpoint:"creating_table"}},{type:"setup.done",tableUrl:"https://alidocs.dingtalk.com/i/nodes/base_contract",baseId:"base_contract",tableId:"table_contract",schema:Pc,warnings:[]},{type:"task.succeeded",task:hi}],HI=[{type:"task.started",task:yi},{type:"run.record.detected",record:{id:"rec_contract_1",title:"\u5BA2\u6237\u53CD\u9988\u53D1\u7968\u4FE1\u606F\u9519\u8BEF",state:"\u5F85\u5904\u7406",currentStep:null}},{type:"run.step.started",itemId:"rec_contract_1",stepId:"validate_invoice",stepName:"\u6821\u9A8C\u53D1\u7968\u4FE1\u606F"},{type:"run.step.succeeded",itemId:"rec_contract_1",stepId:"validate_invoice",stepName:"\u6821\u9A8C\u53D1\u7968\u4FE1\u606F",logs:["\u6821\u9A8C\u5B8C\u6210"]},{type:"run.record.completed",itemId:"rec_contract_1"}];import{existsSync as hm}from"fs";import lr from"path";var ym=5e3;function wi(t,e=process.platform){let n=e==="win32"?lr.win32:lr;return e==="win32"?n.join(t,"dws.cmd"):n.join(t,"bin","dws")}a(wi,"getGlobalDwsBinPath");function ki(t,e=process.env,n=process.platform){let r=n==="win32"?lr.win32:lr,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(ki,"prependGlobalDwsToPath");async function YI(t={}){let e=t.npmBin?.trim()||(process.platform==="win32"?"npm.cmd":"npm"),n=t.runner??G,r=t.platform??process.platform,o=t.env??process.env;try{let i=await n(e,["prefix","--global"],{timeoutMs:ym}),s=i.stdout.trim();if(i.exitCode!==0||!s)return{status:"unavailable"};let c=wi(s,r);return(t.isAvailable??hm)(c)?{status:"activated",bin:c,pathAdjusted:ki(c,o,r)}:{status:"unavailable"}}catch{return{status:"unavailable"}}}a(YI,"activateGlobalDwsOnPath");import{readFile as Fm,stat as Ri,readdir as Om}from"fs/promises";import Pe from"path";import Nm from"yaml";import{z as I}from"zod";var ln=I.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","llm_only"]),wm=I.enum(["Grid","FormDesigner","Kanban","Calendar","Gallery","Gantt"]),dn=I.object({id:I.string().min(1),type:wm,name:I.string().min(1),field_order:I.array(I.string()).optional(),visible_fields:I.array(I.string()).optional(),group_by:I.string().optional(),date_field:I.string().optional(),description:I.string().optional(),for_each_step:I.enum(["needs_human","all"]).optional()}),km=I.array(dn).optional(),bm=I.enum(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","creator","lastModifier","createdTime","lastModifiedTime"]),vm=I.object({name:I.string().min(1),type:bm,options:I.array(I.string()).optional()}),Sm=I.object({initial:I.string().min(1),active:I.array(I.string()).min(1),terminal:I.array(I.string()).min(1),blocked:I.string().default("\u5DF2\u963B\u585E"),review:I.string().optional()}),Rm=I.object({state:I.string().min(1),title:I.string().min(1),description:I.string().optional(),current_step:I.string().optional(),owner:I.string().optional(),submitter:I.string().optional(),deadline:I.string().optional(),event_log:I.string().optional()}),bi=I.object({base_id:I.string().min(1),table_id:I.string().default(""),label:I.string().optional(),description:I.string().optional(),states:Sm,fields:Rm,field_definitions:I.array(vm).optional(),views:km,dws_bin:I.string().default("dws"),query_limit:I.number().default(50),human_loop:I.object({doc_workspace_id:I.string().min(1)}).optional()}),Cm=I.object({template:I.string().min(1).describe("\u76F8\u5BF9\u8DEF\u5F84\u6307\u5411 workflow.yml"),recipe_dir:I.string().default("./recipes")}),xm=I.object({dir:I.string().min(1).describe("\u5DE5\u4F5C\u6D41\u76EE\u5F55\uFF1A\u6BCF\u4E2A\u542B workflow.yml \u7684\u5B50\u76EE\u5F55 = \u4E00\u4E2A\u5DE5\u4F5C\u6D41")}),Tm=I.object({max_attempts:I.number().min(1).default(3),base_backoff_ms:I.number().min(0).default(2e3),max_backoff_ms:I.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"}),_m=I.object({engine:I.preprocess(t=>t===null||t===""?void 0:t,ln.default("claude")),model:I.string().optional(),max_concurrent:I.number().min(1).default(3),timeout_ms:I.number().default(3e5),max_step_failures:I.number().min(1).default(5),auto_advance:I.boolean().default(!0),retry:Tm,trace_dir:I.string().default("./traces")}),Im=I.object({default_timeout_ms:I.number().default(3e5),llm:I.object({provider:I.enum(["dashscope","openai","anthropic","idealab"]).default("idealab"),model:I.string().default("Qwen3.7-Max-DogFooding"),api_key:I.string().optional()}).optional()}),Em=I.object({dir:I.string().default("./roles"),enabled:I.boolean().default(!0)}),Am=I.object({enabled:I.boolean().default(!1),default_timeout_ms:I.number().default(864e5),escalation_notify:I.array(I.string()).default([])}),Dm=I.object({interval_ms:I.number().default(5e3)}),$c=I.object({scene:I.string().optional(),tracker:bi.optional(),workflow:Cm.optional(),workflows:xm.optional(),agent:_m.optional(),recipe:Im.optional(),roles:Em.optional(),sla:Am.optional(),polling:Dm.optional(),toolkit_config:I.record(I.string(),I.record(I.string(),I.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"});import{readFile as Pm}from"fs/promises";import{readFileSync as $m}from"fs";import Fc from"path";import{parse as Oc}from"dotenv";var vi=new Set;function Mc(){return vi}a(Mc,"getAppliedEnvKeys");function Si(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 vi)e.has(n)||delete process.env[n];vi=e}a(Si,"applyEnvToProcess");var Mm=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,jm=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function ur(t){let e=t.trim();if(e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e)}catch(n){throw new Error(`env \u503C\u7591\u4F3C JSON \u4F46\u89E3\u6790\u5931\u8D25: ${n instanceof Error?n.message:String(n)}`)}return t}a(ur,"parseEnvValue");function jt(t,e,n={}){let r=n.lenient===!0;return o(t);function o(s){if(typeof s=="string"){let c=s.match(jm);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 ur(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(Mm,(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(jt,"interpolateEnv");var jc=(()=>{let t={};for(let[e,n]of Object.entries(process.env))n!==void 0&&(t[e]=n);return t})();async function fr(t){let e=Fc.join(t,".env");try{let n=await Pm(e,"utf8");return{...dr(),...Oc(n)}}catch{return dr()}}a(fr,"buildEnvSource");function Nc(t){let e=Fc.join(t,".env");try{let n=$m(e,"utf8");return{...dr(),...Oc(n)}}catch{return dr()}}a(Nc,"buildEnvSourceSync");function dr(){let t=Mc(),e={...jc};for(let[n,r]of Object.entries(process.env))r!==void 0&&!(n in jc)&&!t.has(n)&&(e[n]=r);return e}a(dr,"envSourceBase");var Lm={engine:"claude",max_concurrent:3,timeout_ms:3e5,max_step_failures:5,auto_advance:!0,trace_dir:"./traces"},Wm={default_timeout_ms:3e5,llm:{provider:"idealab",model:"Qwen3.7-Max-DogFooding"}},Lc={dir:"./roles",enabled:!0},Bm={interval_ms:5e4},zm={enabled:!1,default_timeout_ms:864e5,escalation_notify:[]},Um={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},Vm="aitable-workflow.config.yml";async function he(t){let e=Pe.resolve(t);try{(await Ri(e)).isDirectory()&&(e=Pe.join(e,Vm))}catch{}return e}a(he,"resolveConfigPath");async function fe(t,e={}){let n=await he(t),r=Pe.dirname(n),o;try{o=await Fm(n,"utf8")}catch(h){throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6 ${n}: ${h instanceof Error?h.message:String(h)}`)}let i;try{i=Nm.parse(o)}catch(h){throw new Error(`\u914D\u7F6E\u6587\u4EF6 YAML \u89E3\u6790\u5931\u8D25: ${h instanceof Error?h.message:String(h)}`)}let s=await fr(r),c;try{c=jt(i,s,{lenient:e.lenientEnv})}catch(h){throw new Error(`\u914D\u7F6E\u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${h instanceof Error?h.message:String(h)}`)}let l=$c.safeParse(c);if(!l.success)throw new Error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25:
84
+ ${JSON.stringify(l.error.issues,null,2)}`);let d=l.data,u=!!d.workflows,f;if(u){if(f=await qm(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`);g.info("config","\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F",{workflows:f.map(h=>h.id)})}else{if(!d.workflow)throw new Error("\u5355\u5DE5\u4F5C\u6D41\u6A21\u5F0F\u9700\u8981 workflow \u914D\u7F6E");f=[{id:"default",templatePath:Pe.resolve(r,d.workflow.template),recipeDir:Pe.resolve(r,d.workflow.recipe_dir)}]}let p=d.tracker??Um,m={raw:d,envSource:s,configDir:r,multiWorkflow:u,workflowEntries:f,workflowTemplatePath:f[0].templatePath,recipeDir:f[0].recipeDir,tracker:p,agent:{...Lm,...d.agent},recipe:{...Wm,...d.recipe},roles:{...Lc,...d.roles},rolesDir:Pe.resolve(r,d.roles?.dir??Lc.dir),polling:{...Bm,...d.polling},sla:{...zm,...d.sla}};if(g.info("config","\u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210",{mode:u?"multi-workflow":"single-workflow",workflowCount:f.length,engine:m.agent.engine}),d.tracker)for(let h of Hm(d))g.warn("config",h);return m}a(fe,"loadSettings");async function qm(t,e){let n=Pe.resolve(t,e),r;try{r=await Om(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=Pe.join(n,i);try{if(!(await Ri(s)).isDirectory())continue}catch{continue}let c=Pe.join(s,"workflow.yml");try{await Ri(c)}catch{continue}o.push({id:i,templatePath:c,recipeDir:Pe.join(s,"recipes")})}return o}a(qm,"scanWorkflowDirs");function Hm(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(Hm,"validateStateConsistency");function pr(t,e,n){return{...t,tracker:n,workflowTemplatePath:e.templatePath,recipeDir:e.recipeDir}}a(pr,"createPerWorkflowSettings");import{readFile as Er}from"fs/promises";import Bt from"path";import pl from"yaml";var Ft="aitable-workflow.config.yml";function Wc(t){let e=[];if(e.push({key:"agent.engine",status:"ok",value:t.agent.engine,message:`agent.engine = ${t.agent.engine}`,writeTarget:{type:"yaml",file:Ft,yamlPath:["agent","engine"]}}),t.workflowEntries.length===0)e.push({key:"workflow",status:"error",message:"\u672A\u627E\u5230\u5DE5\u4F5C\u6D41\u5165\u53E3",writeTarget:{type:"yaml",file:Ft,yamlPath:["workflow"]}});else{let o=t.multiWorkflow?`\u591A\u5DE5\u4F5C\u6D41\u6A21\u5F0F (${t.workflowEntries.length} \u4E2A\u5DE5\u4F5C\u6D41)`:"\u5355\u5DE5\u4F5C\u6D41\u6A21\u5F0F (workflow.yml)";e.push({key:"workflow",status:"ok",message:`\u5DE5\u4F5C\u6D41\u5165\u53E3: ${o}`})}t.raw.scene?e.push({key:"scene",status:"ok",value:t.raw.scene,message:"scene \u5DF2\u914D\u7F6E",writeTarget:{type:"yaml",file:Ft,yamlPath:["scene"]}}):e.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:Ft,yamlPath:["scene"]}});let n=t.polling.interval_ms;return n>0?e.push({key:"polling.interval_ms",status:"ok",value:n,message:`polling.interval_ms = ${n}`,writeTarget:{type:"yaml",file:Ft,yamlPath:["polling","interval_ms"]}}):e.push({key:"polling.interval_ms",status:"warn",value:n,message:"polling.interval_ms \u5E94\u5927\u4E8E 0",writeTarget:{type:"yaml",file:Ft,yamlPath:["polling","interval_ms"]}}),{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!e.some(o=>o.status==="error"),items:e}}a(Wc,"checkProject");import{readFile as Xm}from"fs/promises";import{readFile as Km}from"fs/promises";import Gm from"path";import Jm from"yaml";async function Ot(t){let e=await Zm(t.workflowEntries,t.configDir),n=t.agent.engine,o=Ym(e.map(i=>i.engine))??n;return{projectEngine:n,workflowOverrides:e,configuredEngine:o,...pt(o)?{configuredAgent:pt(o)}:{}}}a(Ot,"resolveCodingAgentSelection");function Bc(){let t=new Set,e=[];for(let n of en()){let r=Oa(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(Bc,"detectCodingEngines");function un(t,e){return t==="llm_only"?!0:e.available.some(n=>n.engine===t)}a(un,"isEngineDetected");function zc(t,e){return un(t.configuredEngine,e)?t.configuredEngine:un(t.projectEngine,e)?t.projectEngine:e.recommendedEngine}a(zc,"chooseDetectedEngine");async function Zm(t,e){let n=[];for(let r of t){let o;try{o=Jm.parse(await Km(r.templatePath,"utf8"))}catch{continue}if(!y(o))continue;let i=o.toolkit_config;if(!y(i))continue;let s=i.coding;if(!y(s))continue;let c=s.engine,l=ln.safeParse(c);l.success&&n.push({workflowId:r.id,file:Qm(e,r.templatePath),yamlPath:["toolkit_config","coding","engine"],engine:l.data})}return n}a(Zm,"readWorkflowCodingEngines");function Ym(t){let e=[...new Set(t)];return e.length===1?e[0]:void 0}a(Ym,"commonEngine");function Qm(t,e){let n=Gm.relative(t,e);return n&&!n.startsWith("..")?n:e}a(Qm,"relativeTo");var eh="aitable-workflow.config.yml";async function Uc(t,e={}){let n=e.detection??Bc(),r=await Ot(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\u9009\u62E9 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09"}):i.push({key:"coding_agent.detected",status:"ok",value:n.available.map(m=>m.engine),message:`\u672C\u673A\u53EF\u7528: ${n.available.map(m=>`${m.engine}(${m.cmd})`).join(", ")}`});let s=zc(r,n),c=un(r.configuredEngine,n),l=un(r.projectEngine,n),u=r.workflowOverrides.length>0&&r.workflowOverrides.some(m=>m.engine!==r.projectEngine);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:fn(r)}):u?i.push({key:"coding_agent.engine",status:"error",value:r.configuredEngine,message:`\u9879\u76EE agent.engine=${r.projectEngine}\uFF0Cworkflow coding.engine=${r.configuredEngine}\uFF0Csetup/run \u4F1A\u4F7F\u7528\u4E0D\u4E00\u81F4\uFF08\u5EFA\u8BAE\u7EDF\u4E00\u9879\u76EE\u7EA7\u4E0E workflow \u7EA7 coding agent\uFF0C\u907F\u514D setup KB \u7F16\u8BD1\u548C run \u9636\u6BB5\u4F7F\u7528\u4E0D\u540C CLI\uFF09`,writeTarget:fn(r)}):!l&&r.projectEngine!=="llm_only"?i.push({key:"coding_agent.engine",status:"error",value:s??r.projectEngine,message:`agent.engine=${r.projectEngine}\uFF0C\u4F46\u672C\u673A\u672A\u68C0\u6D4B\u5230\u5BF9\u5E94 CLI\uFF08\u8BF7\u9009\u62E9\u672C\u673A\u53EF\u7528\u7684 Coding Agent\uFF09`,writeTarget:fn(r)}):i.push({key:"coding_agent.engine",status:"ok",value:r.configuredEngine,message:`Coding Agent = ${r.configuredEngine}`,writeTarget:fn(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(m=>m.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:fn(r)});for(let m of r.workflowOverrides)i.push({key:`coding_agent.workflow.${m.workflowId}`,status:m.engine===r.projectEngine?"ok":"warn",value:m.engine,message:`workflow ${m.workflowId} coding.engine = ${m.engine}${m.engine===r.projectEngine?"":"\uFF08\u8986\u76D6\u9879\u76EE\u7EA7\uFF09"}`,writeTarget:{type:"yaml",file:m.file,yamlPath:m.yamlPath}});let f=await th(t,r.configuredAgent);return f&&i.push(f),{id:"coding_agent",name:"Coding Agent",ok:!i.some(m=>m.status==="error"),items:i}}a(Uc,"checkCodingAgent");async function th(t,e){if(!e)return;let n=Ae(t.configDir),r;try{r=await Xm(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(th,"checkCodingAgentConfigEnabled");function fn(t){return{type:"yamlAll",targets:[{file:eh,yamlPath:["agent","engine"]},...t.workflowOverrides.map(e=>({file:e.file,yamlPath:e.yamlPath}))]}}a(fn,"syncTargets");import{readFile as Fh}from"fs/promises";import{existsSync as Oh,readFileSync as Nh}from"fs";import hn from"path";import nl from"yaml";import{readFile as nh}from"fs/promises";import rh from"yaml";async function Me(t,e={}){let n;try{n=await nh(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=rh.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,C=a(S=>{if(Array.isArray(S))return S.map(C);if(S&&typeof S=="object"){let v={};for(let[x,_]of Object.entries(S))if(Yn(_)){let R=`__RTREF_${b++}__`;w.set(R,_),v[x]=R}else v[x]=C(_);return v}return S},"shield");if(y(r)&&Array.isArray(r.event_sources))for(let S of r.event_sources)y(S)&&S.config&&(S.config=C(S.config));if(r=jt(r,e.envSource),w.size>0){let S=a(v=>{if(typeof v=="string")return w.get(v)??v;if(Array.isArray(v))return v.map(S);if(v&&typeof v=="object"){let x={};for(let[_,R]of Object.entries(v))x[_]=S(R);return x}return v},"restore");r=S(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(!y(r))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let o=oh(r.meta),i=ih(r.steps),s=lh(r.edges),c=hh(r.event_sources),l=yh(r.event_handlers),d=mh(i,s),u=wh(r.tracker),f=y(r.toolkit_config)?r.toolkit_config:void 0,p=vh(r.notification),m=r.field_definitions;m!=null&&g.warn("workflow","workflow.yml \u6839\u7EA7 field_definitions \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u5728 tracker.field_definitions \u4E2D\u58F0\u660E");let h=ph(u?.field_definitions??m),k=dh(r.steps,h);return g.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:k.all.size}),{meta:o,steps:i,edges:s,eventSources:c,eventHandlers:l,orderedStepIds:d,referencedFields:k,fieldDefinitions:h,tracker:u,toolkitConfig:f,notification:p}}a(Me,"loadWorkflowTemplate");function oh(t){if(!y(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 meta \u6BB5");return{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(oh,"parseMeta");function ih(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 steps \u6570\u7EC4");return t.map((e,n)=>{if(!y(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:String(e.recipe??r),engine:qc(e.engine),auto:e.auto!==!1,needs_human:sh(e.needs_human),sla:ah(e.sla),input_mapping:Vc(e.input_mapping),output_mapping:Vc(e.output_mapping),config:gh(e.config)}})}a(ih,"parseSteps");function sh(t){if(!y(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(sh,"parseNeedsHuman");function qc(t){if(t==="claude"||t==="codex"||t==="qoder"||t==="codebuddy"||t==="opencode"||t==="qwen"||t==="deepseek"||t==="trae"||t==="llm_only")return t}a(qc,"parseEngine");function ah(t){if(y(t))return{timeout_ms:typeof t.timeout_ms=="number"?t.timeout_ms:3e5,escalation:ch(t.escalation)}}a(ah,"parseSLA");function ch(t){if(t==="notify"||t==="skip"||t==="block")return t}a(ch,"parseEscalation");function Vc(t){if(!y(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(Vc,"parseMapping");function lh(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 edges \u6570\u7EC4");return t.map((e,n)=>{if(!y(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(lh,"parseEdges");function dh(t,e=[]){let n=new Set,r=new Set,o=new Set,i=new Set(e.filter(l=>fh(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)y(l)&&Hc(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(dh,"extractFieldRefs");function Hc(t,e,n,r){for(let[o,i]of Object.entries(t))if(o.endsWith("_mapping")&&y(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):y(i)&&Hc(i,e,n,r)}a(Hc,"walkStepForFields");var uh=new Set(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","creator","lastModifier","createdTime","lastModifiedTime"]);function fh(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(fh,"isSystemFieldType");function ph(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!y(n))continue;let r=typeof n.name=="string"?n.name:"",o=typeof n.type=="string"?n.type:"text";if(!r)continue;let i=uh.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(ph,"parseFieldDefinitions");function gh(t){if(y(t))return t}a(gh,"parseStepConfig");function mh(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);g.warn("workflow","\u90E8\u5206\u6B65\u9AA4\u672A\u5728\u8FB9\u4E2D\u8FDE\u63A5",{missing:s})}return o}a(mh,"topologicalSort");function hh(t){return!t||!Array.isArray(t)?[]:t.filter(y).map(e=>{let n=String(e.name??""),r=String(e.type??""),o=String(e.handler??"");return(!r||!o)&&g.warn("workflow","\u4E8B\u4EF6\u6E90\u7F3A\u5C11 type \u6216 handler",{item:e}),{name:n,type:r,handler:o,config:y(e.config)?e.config:{},...y(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(hh,"parseEventSources");function yh(t){return!t||!Array.isArray(t)?[]:t.filter(y).map(e=>({trigger:String(e.trigger??""),recipe:String(e.recipe??""),engine:qc(e.engine)}))}a(yh,"parseEventHandlers");function wh(t){if(!y(t))return;let e=bi.safeParse(t);if(!e.success){if(kh(t))return;g.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(wh,"parseTracker");function kh(t){return t.base_id===""||t.baseId===""}a(kh,"isDraftTracker");var bh=new Set(["none","webhook","im"]);function vh(t){if(!y(t))return;let e=typeof t.channel=="string"?t.channel:"none",n=bh.has(e)?e:"none",r=y(t.webhook)&&typeof t.webhook.url=="string"?{url:t.webhook.url,...y(t.webhook.headers)?{headers:t.webhook.headers}:{}}:void 0,o=y(t.im)?{...typeof t.im.bot_token_env=="string"?{bot_token_env:t.im.bot_token_env}:{}}:void 0,i=y(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(vh,"parseNotification");import Kc from"path";import Gc from"fs";async function hr(t,e){return Zc({recipeDir:t,recipeId:e,exportMethod:"execute",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 execute \u51FD\u6570"})}a(hr,"loadRecipeDefinitionResult");async function Ci(t,e){return(await hr(t,e)).definition}a(Ci,"loadRecipeDefinition");async function yr(t,e){return Zc({recipeDir:t,recipeId:e,exportMethod:"create",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 create \u51FD\u6570"})}a(yr,"loadEventHandlerDefinitionResult");async function xi(t,e){return(await yr(t,e)).definition}a(xi,"loadEventHandlerDefinition");async function Zc(t){let{recipeDir:e,recipeId:n,exportMethod:r,invalidExportMessage:o}=t,i=Kc.resolve(e,`${n}.recipe.ts`),s=Kc.resolve(e,`${n}.recipe.js`),c=Gc.existsSync(i)?i:Gc.existsSync(s)?s:null;if(!c)return{definition:null,failure:{code:"not_found",message:`\u672A\u627E\u5230 recipe \u6587\u4EF6\uFF08\u5DF2\u68C0\u67E5 ${i}\u3001${s}\uFF09`}};c.endsWith(".ts")&&await Tt();try{let l=await import(c),d=l.default??l.recipe;return!d||typeof d[r]!="function"?{definition:null,failure:{code:"invalid_export",recipePath:c,message:`${o}\uFF08${c}\uFF09`}}:{definition:d,failure:null}}catch(l){return{definition:null,failure:{code:"import_failed",recipePath:c,message:`\u5BFC\u5165\u5931\u8D25\uFF08${c}\uFF09: ${l instanceof Error?l.message:String(l)}`}}}}a(Zc,"loadDefinition");async function wr(t,e){let n=[],r=[];for(let o of e.steps){let i=o.recipe;if(!i)continue;let s=await hr(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:gr(o.config),loaded:!1});continue}let l=s.definition.meta;Jc(o.config,l.config,o.id,i,n),r.push({stepId:o.id,recipeId:i,configSummary:gr(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 yr(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:gr(o.handler_config),loaded:!1});continue}let l=c.definition;Jc(o.handler_config,l.meta.config,s,i,n),r.push({stepId:s,recipeId:i,configSummary:gr(o.handler_config),loaded:!0})}return{issues:n,rows:r}}a(wr,"checkWorkflowRecipes");function Jc(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))an.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=Sh(s,d.path);Rh(u)||Ch(u)||o.push({stepId:n,recipeId:r,level:"error",message:`config.${d.path.join(".")||"<root>"}: ${d.message}`})}let l=mr(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(Jc,"checkConfigAgainstSchema");function Sh(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}a(Sh,"getValueAtPath");function Rh(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(Rh,"isRefObject");function Ch(t){return typeof t=="string"&&/^\$\{[^}]+\}$/.test(t.trim())}a(Ch,"isPlaceholderString");function mr(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"?mr(e.unwrap()):e?._def?.schema?mr(e._def.schema):e?._def?.innerType?mr(e._def.innerType):null}a(mr,"objectShape");function gr(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(gr,"summarizeConfig");async function Sr(t){let{workflow:e,rawYaml:n,recipeDir:r,relPath:o,profile:i,onDefinitionLoadFailure:s}=t,c=e.tracker,l=[xh(o,c?.label,c?.description),Th(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}]`,m=y(d[u])?d[u]:{},h=i?.config?.event_sources?.[f.name??""],{handler_config:k,...w}=h??{},b={...y(m.config)?m.config:{},...w},C=!!i&&!!f.name,S=a(E=>C?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,...E]}:{file:o,yamlPath:["event_sources",u,"config",...E]},"evtConfigTarget"),v=a(E=>C?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,"handler_config",...E]}:{file:o,yamlPath:["event_sources",u,"handler_config",...E]},"evtHandlerTarget"),x=on(f.type,b);for(let E of x.errors){let $=S(E.yamlPath);l.push(Ti({key:`event_source.${p}.config.${E.key}`,label:E.description,file:$.file,yamlPath:$.yamlPath}))}for(let E of x.requiredFields){let $=S([E.field]);l.push(Ti({key:`event_source.${p}.config.${E.field}`,label:E.label,file:$.file,yamlPath:$.yamlPath,valueType:E.valueType}))}if(x.oneOf){let E=x.oneOf.fields[0];if(E){let $=S([E]);l.push(Ti({key:`event_source.${p}.config.${E}`,label:x.oneOf.labels[E]??E,file:$.file,yamlPath:$.yamlPath}))}}if(!f.handler)continue;let _=await yr(r,f.handler);if(!_.definition){s?.(`EventHandler\u300C${f.handler}\u300D`,_.failure);continue}let R=_.definition;if(!R?.meta.config)continue;let T=dt(R.meta.config,E=>E.configType==="tableRef");for(let E of T){let $=E.path.join("."),N=E.hint.description??E.hint.label??`\u4E8B\u4EF6\u6E90 ${p} \u7684 ${$}`,H=lt(E.hint),U=H&&E.hint.defaultBase==="workflow.tracker.base_id",q=Qc(E.hint),ee=v([...E.path,"baseId"]);l.push(_i({key:`event_source.${p}.handler_config.${$}.baseId`,label:kr(N,"baseId"),file:ee.file,yamlPath:ee.yamlPath,required:!U,allowEmpty:U,defaultStrategy:"workflowTrackerBaseId",setup:q}));let Q=v([...E.path,"tableId"]);l.push(_i({key:`event_source.${p}.handler_config.${$}.tableId`,label:kr(N,"tableId"),file:Q.file,yamlPath:Q.yamlPath,required:!H,allowEmpty:H,setup:q}))}let M=pn(R.meta.config);if(M)for(let[E,$]of Object.entries(M)){let N=Ve($);if(N?.expose!==!0||Ih($))continue;let H=N.description??N.label??vr($);if(!H)continue;let U=Eh($),q=v([E]);l.push(_i({key:`event_source.${p}.handler_config.${E}`,label:H,file:q.file,yamlPath:q.yamlPath,required:!U,allowEmpty:U,valueType:N.valueType??(br($)?"string[]":"string")}))}}for(let u=0;u<e.steps.length;u++){let f=e.steps[u];if(!f.recipe)continue;let p=await hr(r,f.recipe);if(!p.definition){s?.(`recipe\u300C${f.recipe}\u300D`,p.failure);continue}let m=p.definition;if(!m?.meta.config)continue;let h=a(w=>i?{file:i.file,yamlPath:["workflows",i.workflowId,"steps",f.id,...w]}:{file:o,yamlPath:["steps",u,"config",...w]},"stepTarget"),k=dt(m.meta.config,w=>w.configType==="tableRef");for(let w of k){let b=w.path.join("."),C=w.hint.description??w.hint.label??`\u6B65\u9AA4 ${f.id} \u7684 ${b}`,S=lt(w.hint),v=S&&w.hint.defaultBase==="workflow.tracker.base_id",x=Qc(w.hint),_=h([...w.path,"baseId"]);l.push(Yc({key:`step.${f.id}.config.${b}.baseId`,label:kr(C,"baseId"),file:_.file,yamlPath:_.yamlPath,required:!v,allowEmpty:v,defaultStrategy:"workflowTrackerBaseId",setup:x}));let R=h([...w.path,"tableId"]);l.push(Yc({key:`step.${f.id}.config.${b}.tableId`,label:kr(C,"tableId"),file:R.file,yamlPath:R.yamlPath,required:!S,allowEmpty:S,setup:x}))}}return _h(l)}a(Sr,"buildWorkflowConfigSurface");function gn(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(gn,"toCheckItem");function xh(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\uFF0C\u6253\u5F00\u76EE\u6807\u8868\u683C\u540E\u4ECE\u6D4F\u89C8\u5668 URL \u4E2D\u590D\u5236 dst \u5F00\u5934\u7684\u5B57\u7B26\u4E32",owner:"framework",source:"tracker",required:!0,editable:!0,allowEmpty:!1,defaultStrategy:"projectTrackerBaseId",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","base_id"]}}}a(xh,"trackerBaseSurface");function Th(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(Th,"trackerTableSurface");function Ti(t){return{key:t.key,label:t.label,description:t.label,owner:"eventSource",source:"eventSource.config",required:!0,editable:!0,allowEmpty:!1,defaultStrategy:"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType}}}a(Ti,"eventSourceConfigSurface");function _i(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(_i,"handlerConfigSurface");function Yc(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(Yc,"stepConfigSurface");function Qc(t){if(!lt(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(Qc,"setupPolicyForTableRefHint");function kr(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(kr,"tableRefFieldDescription");function _h(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(_h,"dedupeSurface");function pn(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"?pn(e.unwrap()):e?._def?.schema?pn(e._def.schema):e?._def?.innerType?pn(e._def.innerType):null}a(pn,"getZodObjectShape");function br(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return br(e.unwrap());if(e?._def?.innerType)return br(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(br):!1}a(br,"isArraySchema");function vr(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 vr(e.unwrap());if(e?._def?.innerType)return vr(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=vr(o);if(i)return i}return null}a(vr,"getFieldDescription");function Ih(t){let e=pn(t);return e?"baseId"in e&&"tableId"in e:!1}a(Ih,"isTableRefSchema");function Eh(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(Eh,"isOptionalSchema");import{readFileSync as Ah,existsSync as Dh}from"fs";import Ph from"path";import $h from"yaml";var Mh=/^\$\{roles\.([^}]+)\}$/;function jh(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(jh,"getByJsonPath");function Ei(t,e,n){if(typeof t=="string"){let r=t.match(Mh);if(r){let o=r[1],i=jh(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)=>Ei(r,e,`${n}[${o}]`));if(t&&typeof t=="object"){let r={};for(let[o,i]of Object.entries(t))r[o]=Ei(i,e,`${n}.${o}`);return r}return t}a(Ei,"expandProfileRefs");var Rr=new Map;function xe(t,e,n={}){let r=`${t}\0${n.lenientEnv?"lenient":"strict"}`,o=Rr.get(r);if(o!==void 0)return o;let i=Ph.resolve(t,"profile","profile.yml");if(!Dh(i))return Rr.set(r,null),null;let s;try{s=Ah(i,"utf8")}catch(k){throw new Error(`profile.yml \u8BFB\u53D6\u5931\u8D25: ${k instanceof Error?k.message:String(k)}`)}let c;try{c=$h.parse(s)}catch(k){throw new Error(`profile.yml YAML \u89E3\u6790\u5931\u8D25: ${k instanceof Error?k.message:String(k)}`)}try{c=jt(c,e??Nc(t),{lenient:n.lenientEnv===!0})}catch(k){throw new Error(`profile.yml \u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${k instanceof Error?k.message:String(k)}`)}if(!c||typeof c!="object")throw new Error("profile.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let l=c,d=typeof l.schema_version=="number"?l.schema_version:void 0;if(d!==2)throw new Error(`profile.yml \u4F7F\u7528\u65E7\u7248\u7ED3\u6784\uFF08schema_version: ${d??"\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 u=Ii(l.roles)?l.roles:void 0,f=Ii(l.workflows)?l.workflows:void 0,p;f&&u?p=Ei(f,u,"workflows"):f&&(p=f);let m=Ii(l.meta)?{label:typeof l.meta.label=="string"?l.meta.label:void 0,description:typeof l.meta.description=="string"?l.meta.description:void 0}:void 0,h={schema_version:2,...m?{meta:m}:{},...u?{roles:u}:{},...p?{workflows:p}:{}};return Rr.set(r,h),g.info("config","profile v2 \u52A0\u8F7D\u5B8C\u6210",{rolesCount:u?Object.keys(u).length:0,workflowsCount:p?Object.keys(p).length:0}),h}a(xe,"loadProfileConfig");function Nt(){Rr.clear()}a(Nt,"resetProfileCache");function mn(t,e,n){if(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(mn,"injectProfileConfig");function Ii(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}a(Ii,"isRecord");var Lh="profile/profile.yml",Wh=/\.(ya?ml|json)$/i;function Bh(t,e,n){let r=t.trim();if(!r||!Wh.test(r)||hn.isAbsolute(r))return;let o=/\.json$/i.test(r)?"json":"yaml",i;for(let s of n){let c=hn.resolve(s,r),l=hn.relative(e,c);if(!l.startsWith("..")){if(Oh(c))return{path:l,format:o,exists:!0,summary:zh(c,o)};i??={path:l,format:o,exists:!1}}}return i}a(Bh,"resolveFileRef");function zh(t,e){try{let n=Nh(t,"utf8"),r=e==="json"?JSON.parse(n):nl.parse(n);return Array.isArray(r)?[{key:"(\u6570\u7EC4)",count:r.length,kind:"array"}]:y(r)?Object.entries(r).map(([o,i])=>Array.isArray(i)?{key:o,count:i.length,kind:"array"}:y(i)?{key:o,count:Object.keys(i).length,kind:"object"}:{key:o,kind:typeof i}):void 0}catch{return}}a(zh,"summarizeStructuredFile");function xr(t,e){return{...t??{},...e??{}}}a(xr,"overlayConfig");function rl(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:y(r)?r:{}}}a(rl,"profileEventSourceParts");function be(t,e){return t?{...e,surface:t,writeTarget:e.writeTarget??t.writeTarget}:e}a(be,"withSurfaceFields");async function Di(t,e,n){let r=[];for(let s of t){let c=n?.workflows?.[s.id],l=c?{file:Lh,workflowId:s.id,wf:c}:void 0,d=await Uh(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(Di,"checkWorkflows");async function Uh(t,e,n){let r=[],o=t.templatePath.startsWith(e)?t.templatePath.slice(e.length+1):t.templatePath,i;try{i=await Me(t.templatePath)}catch(C){return r.push({key:"workflow.yml",status:"error",message:`\u5DE5\u4F5C\u6D41\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${C instanceof Error?C.message:String(C)}`}),{id:t.id,name:t.id,ok:!1,items:r}}let s=i.meta?.name??t.id;if(n)try{mn(t.id,n.wf,i)}catch(C){r.push({key:"profile",status:"error",message:`profile \u914D\u7F6E\u6CE8\u5165\u5931\u8D25: ${C instanceof Error?C.message:String(C)}`})}let c,l;try{let C=nl.parse(await Fh(t.templatePath,"utf8"));y(C)&&(l=C,y(C.tracker)&&(c=C.tracker))}catch{}let d=await Sr({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(C=>[C.key,C])),f=u.get("tracker.base_id"),p=c?.base_id??i.tracker?.base_id;!p||typeof p=="string"&&p.trim()===""?r.push(gn(f,{status:"error",message:"tracker.base_id \u672A\u914D\u7F6E"})):r.push(gn(f,{status:"ok",value:p,message:`tracker.base_id = ${p}`}));let m=u.get("tracker.table_id"),h=c?.table_id??i.tracker?.table_id;if(!h||typeof h=="string"&&h.trim()===""?r.push(gn(m,{status:"warn",message:"tracker.table_id \u672A\u914D\u7F6E\uFF08\u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09"})):r.push(gn(m,{status:"ok",value:h,message:`tracker.table_id = ${h}`})),i.toolkitConfig&&Object.keys(i.toolkitConfig).length>0){let C=Object.keys(i.toolkitConfig);r.push({key:"toolkit_config",status:"ok",message:`toolkit_config \u5DF2\u914D\u7F6E (${C.join(", ")})`})}if(i.steps.length===0)r.push({key:"steps",status:"error",message:"\u5DE5\u4F5C\u6D41\u65E0\u6B65\u9AA4\u5B9A\u4E49"});else{let C=i.orderedStepIds.join(" \u2192 ");r.push({key:"steps",status:"ok",message:`\u6B65\u9AA4\u94FE: ${i.steps.length} \u6B65 (${C})`})}try{let C=await wr(t.recipeDir,i),S=new Map(i.steps.map((x,_)=>[x.id,_])),v=new Map(i.eventSources.map((x,_)=>[`event:${x.name||x.handler}`,_]));for(let x of C.issues){let _=x.level==="error",R=v.get(x.stepId),T=R!==void 0?i.eventSources[R]:void 0,M={key:`step.${x.stepId}.config`,status:_?"error":"warn",message:`[${x.recipeId}] ${x.message}`};if(_){let E=Vh(x.message),$=S.get(x.stepId);if(E&&$!==void 0)M.writeTarget=n?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"steps",x.stepId,...E.split(".")]}:{type:"yaml",file:o,yamlPath:["steps",$,"config",...E.split(".")]};else if(E&&R!==void 0&&T){let N=E.split("."),H=await xi(t.recipeDir,T.handler),U=H?dt(H.meta.config,q=>q.configType==="tableRef").find(q=>Kh(q.path,N)||el(q.path,N)):void 0;if(U){let q=T.name||T.handler,ee=el(U.path,N)??["baseId","tableId"];for(let Q of ee){let We=`event_source.${q}.handler_config.${U.path.join(".")}.${Q}`,_e=u.get(We);r.push(be(_e,{key:We,status:"error",message:Ai(x.recipeId,U.path.join("."),Q)}))}continue}M.key=`event_source.${T.name||T.handler}.handler_config.${E}`,M.writeTarget=n&&T.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",T.name,"handler_config",...N]}:{type:"yaml",file:o,yamlPath:["event_sources",R,"handler_config",...N]}}}r.push(M)}if(C.issues.filter(x=>x.level==="error").length===0){let x=C.rows.filter(_=>_.loaded).length;x>0&&r.push({key:"recipe_schema",status:"ok",message:`step.config \u6821\u9A8C\u901A\u8FC7 (${x} \u4E2A recipe)`})}}catch{r.push({key:"recipe_schema",status:"warn",message:"recipe schema \u6821\u9A8C\u8DF3\u8FC7\uFF08\u52A0\u8F7D\u5F02\u5E38\uFF09"})}let k=typeof p=="string"?p:void 0;await Gh({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:k,profileCtx:n}),await Jh({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:k,profileCtx:n}),await Zh({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 C=0;C<i.eventSources.length;C++){let S=i.eventSources[C],v=S.name||`event_source[${C}]`,x=y(w[C])?w[C]:{},_=rl(n,S.name),R=xr(y(x.config)?x.config:void 0,_.config);if(Object.keys(R).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&&S.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",S.name]}:{type:"yaml",file:o,yamlPath:["event_sources",C,"config"]}});continue}let T=on(S.type,R);for(let M of T.errors){let E=`event_source.${v}.config.${M.key}`,$=u.get(E);r.push(be($,{key:E,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D${M.message}`}))}if(T.requiredFields.length>0||T.errors.length>0||T.summary||T.oneOf){let M=!0;for(let E of T.requiredFields){let{field:$,valueType:N}=E,H=R[$],U=`event_source.${v}.config.${$}`,q=u.get(U);Xc(H)?(M=!1,r.push(be(q,{key:U,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 config.${$}`}))):N&&!qh(H,N)?(M=!1,r.push(be(q,{key:U,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u5B57\u6BB5 config.${$} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${Hh(N)}\uFF09`}))):r.push(be(q,{key:U,status:"ok",value:H,message:`config.${$} = ${ey(H)}`}))}if(T.oneOf&&!T.oneOf.fields.some($=>!Xc(R[$]))){M=!1;let $=T.oneOf.fields[0],N=`event_source.${v}.config.${$}`,H=u.get(N);r.push(be(H,{key:N,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D\u7F3A\u5C11\u8C03\u5EA6\u914D\u7F6E\uFF08\u9700\u914D\u7F6E ${T.oneOf.fields.map(U=>`config.${U}`).join(" / ")} \u4E4B\u4E00\uFF09`}))}M&&T.errors.length===0&&r.push({key:`event_source.${v}`,status:"ok",message:T.summary?`\u4E8B\u4EF6\u6E90\u300C${v}\u300D(${S.type}) \u914D\u7F6E\u5B8C\u6574\uFF08${T.summary}\uFF09`:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D(${S.type}) \u914D\u7F6E\u5B8C\u6574`})}else r.push({key:`event_source.${v}`,status:"ok",message:`\u4E8B\u4EF6\u6E90\u300C${v}\u300D(${S.type}) \u5DF2\u914D\u7F6E`})}i.eventSources.length===0&&w.length;let b=r.some(C=>C.status==="error");return{id:t.id,name:s,ok:!b,items:r}}a(Uh,"checkSingleWorkflow");function Vh(t){let e=t.match(/^config\.([A-Za-z_][A-Za-z0-9_.]*)/);return e?e[1]:null}a(Vh,"extractConfigKey");function Xc(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(Xc,"isMissingConfigValue");function qh(t,e){return e==="string[]"?Array.isArray(t):e==="string"?typeof t=="string":!0}a(qh,"matchesConfigType");function Hh(t){return t==="string[]"?"\u6570\u7EC4":"\u5B57\u7B26\u4E32"}a(Hh,"typeLabel");function Kh(t,e){return t.length===e.length&&t.every((n,r)=>n===e[r])}a(Kh,"samePath");function el(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(el,"tableRefFieldFromPath");function ol(t,e){if(t?.defaultStrategy==="workflowTrackerBaseId"&&e)return e}a(ol,"defaultValueForTableRefWarn");async function Gh(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 xi(n.recipeDir,u.handler);if(!f?.meta.config)continue;let p=u.name||u.handler,m=y(l[d])?l[d]:{},h=xr(y(m.handler_config)?m.handler_config:void 0,rl(c,u.name).handlerConfig),k=dt(f.meta.config,b=>b.configType==="tableRef");for(let b of k){let C=Ct(h,b.path);if(!y(C))continue;let S=C.baseId,v=C.tableId,x=b.path.join("."),_=lt(b.hint);if(typeof S=="string"&&!S.trim()){let R=`event_source.${p}.handler_config.${x}.baseId`,T=i.get(R),M=_&&b.hint.defaultBase==="workflow.tracker.base_id",E=M?"warn":"error";e.push(be(T,{key:R,status:E,message:M?`[${u.handler}] handler_config.${x}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:Ai(u.handler,x,"baseId"),value:E==="warn"?ol(T,s):void 0}))}if(typeof v=="string"&&!v.trim()){let R=`event_source.${p}.handler_config.${x}.tableId`,T=i.get(R),M=_?"warn":"error";e.push(be(T,{key:R,status:M,message:_?`[${u.handler}] handler_config.${x}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:Ai(u.handler,x,"tableId")}))}}let w=Lt(f.meta.config);if(w){for(let[b,C]of Object.entries(w)){let v=Ve(C)?.expose===!0;if(Cr(C)){let x=h[b];if(Array.isArray(x)&&x.length===0){let _=Xh(C);if(_&&!v)continue;let R=`event_source.${p}.handler_config.${b}`,T=i.get(R);if(!T)continue;e.push(be(T,{key:R,status:_?"suggestion":"error",message:`[${u.handler}] handler_config.${b} \u4E3A\u7A7A\u6570\u7EC4`}))}}}for(let[b,C]of Object.entries(w)){if(h[b]!==void 0)continue;let S=Ve(C);if(S?.expose!==!0)continue;let v=S.description??S.label??yn(C);if(!v||Qh(C))continue;let x=`event_source.${p}.handler_config.${b}`,_=i.get(x);_&&e.push(be(_,{key:x,status:"suggestion",message:`[${u.handler}] handler_config.${b} \u672A\u914D\u7F6E\uFF08${v}\uFF09`}))}}}}a(Gh,"checkHandlerConfigEmptiness");async function Jh(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 Ci(n.recipeDir,u.recipe);if(!f?.meta.config)continue;let p=y(l[d])?l[d]:{},m=xr(y(p.config)?p.config:void 0,c?.wf.steps?.[u.id]),h=dt(f.meta.config,k=>k.configType==="tableRef");for(let k of h){let w=Ct(m,k.path);if(!y(w))continue;let b=w.baseId,C=w.tableId,S=k.path.join("."),v=lt(k.hint);if(typeof b=="string"&&!b.trim()){let x=`step.${u.id}.config.${S}.baseId`,_=i.get(x),R=v&&k.hint.defaultBase==="workflow.tracker.base_id",T=R?"warn":"error";e.push(be(_,{key:x,status:T,message:R?`[${u.recipe}] step.config.${S}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:tl(u.recipe,S,"baseId"),value:T==="warn"?ol(_,s):void 0}))}if(typeof C=="string"&&!C.trim()){let x=`step.${u.id}.config.${S}.tableId`,_=i.get(x),R=v?"warn":"error";e.push(be(_,{key:x,status:R,message:v?`[${u.recipe}] step.config.${S}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:tl(u.recipe,S,"tableId")}))}}}}a(Jh,"checkStepConfigEmptiness");async function Zh(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?[hn.resolve(r,hn.dirname(c.file)),r]:[r];for(let f=0;f<o.steps.length;f++){let p=o.steps[f],m=y(l[f])?l[f]:{},h=xr(y(m.config)?m.config:void 0,c?.wf.steps?.[p.id]);if(Object.keys(h).length===0)continue;let w=(p.recipe?await Ci(n.recipeDir,p.recipe).catch(()=>null):null)?.meta.config,b=a((S,v)=>{let x=`step.${p.id}.config.${S.join(".")}`;if(d.has(x))return;d.add(x);let _=typeof v=="boolean"?"boolean":typeof v=="number"?"number":"string",R=c?{type:"yaml",file:c.file,yamlPath:["workflows",c.workflowId,"steps",p.id,...S],valueType:_}:{type:"yaml",file:s,yamlPath:["steps",f,"config",...S],valueType:_},T=w?Yh(w,S):null,M=typeof v=="string"?Bh(v,r,u):void 0,E=M?.exists===!0;e.push({key:x,status:"ok",value:v,message:`${S.join(".")} = ${String(v)}`,writeTarget:R,surface:{key:x,label:S.join("."),description:T??void 0,owner:"handler",source:"step.config",required:!1,editable:!E,allowEmpty:!0,defaultStrategy:"none",valueType:_,writeTarget:R,...M?{fileRef:M}:{}}})},"emit"),C=a((S,v)=>{for(let[x,_]of Object.entries(S)){let R=[...v,x];if(typeof _=="string"){if(/^\$\{[^}]+\}$/.test(_.trim()))continue;b(R,_)}else if(typeof _=="number"||typeof _=="boolean")b(R,_);else if(y(_)){if(Object.keys(_).length===1&&typeof _.ref=="string"||"baseId"in _||"tableId"in _)continue;C(_,R)}}},"walk");C(h,[])}}a(Zh,"emitStepScalarConfigItems");function tl(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(tl,"stepConfigTableRefMissingMessage");function Ai(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(Ai,"tableRefMissingMessage");function Yh(t,e){let n=t;for(let r=0;r<e.length;r++){let o=Lt(n);if(!o||(n=o[e[r]],!n))return null}return yn(n)}a(Yh,"describeSchemaPath");function Lt(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"?Lt(e.unwrap()):e?._def?.schema?Lt(e._def.schema):e?._def?.innerType?Lt(e._def.innerType):null}a(Lt,"getZodObjectShape");function Cr(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return Cr(e.unwrap());if(e?._def?.innerType)return Cr(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(Cr):!1}a(Cr,"isArraySchema");function yn(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 yn(e.unwrap());if(e?._def?.innerType)return yn(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=yn(o);if(i)return i}return null}a(yn,"getFieldDescription");function Qh(t){let e=Lt(t);return e?"baseId"in e&&"tableId"in e:!1}a(Qh,"isTableRefSchema");function Xh(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(Xh,"isOptionalSchema");function ey(t){return Array.isArray(t)?`${t.length} \u9879`:typeof t=="string"?t:t==null?"\u672A\u8BBE\u7F6E":JSON.stringify(t)}a(ey,"formatConfigValue");import{readdir as ay,stat as cy,readFile as ly}from"fs/promises";import yt from"path";import{readdir as ty,readFile as ny,stat as ry}from"fs/promises";import{readFileSync as oy,existsSync as iy}from"fs";import Tr from"path";import sy from"yaml";var _r=".role.yml",je=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=Tr.resolve(this.rolesDir),n=!1;try{n=(await ry(e)).isDirectory()}catch{n=!1}if(!n){g.info("role","\u89D2\u8272\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u6CE8\u518C\u4E2D\u5FC3\u4E3A\u7A7A",{dir:e});return}let o=(await ty(e)).filter(i=>i.endsWith(_r)).sort();for(let i of o){let s=Tr.join(e,i),c=await this.validateFile(s);if(!c.ok){this.errors.push({file:s,errors:c.errors}),g.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=il(l,Tr.dirname(s));if(!d.ok){this.errors.push({file:s,errors:[d.error]}),g.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]}),g.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 ny(e,"utf8")}catch(o){return{ok:!1,errors:[`\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6: ${Pi(o)}`]}}let r;try{r=sy.parse(n)}catch(o){return{ok:!1,errors:[`YAML \u89E3\u6790\u5931\u8D25: ${Pi(o)}`]}}return di(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"]}),g.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5DF2\u8DF3\u8FC7",{key:r});continue}let i={...o,id:r},s=di(i);if(!s.ok){this.errors.push({file:`profile:roles.${r}`,errors:s.errors}),g.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=il(c,n);if(!l.ok){this.errors.push({file:`profile:roles.${r}`,errors:[l.error]}),g.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]}),g.warn("role",d,{key:r});continue}this.roles.set(c.id,c)}}};function il(t,e){let n=t.persona;if(typeof n=="string")return{ok:!0};if(n&&typeof n=="object"&&"file"in n){let r=Tr.resolve(e,n.file);if(!iy(r))return{ok:!1,error:`persona file \u4E0D\u5B58\u5728: ${n.file}\uFF08\u76F8\u5BF9 ${e}\uFF09`};try{let o=oy(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: ${Pi(o)}`}}}return{ok:!0}}a(il,"resolvePersonaFile");function Pi(t){return t instanceof Error?t.message:String(t)}a(Pi,"errMsg");function Ir(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(Ir,"roleFieldItem");function sl(t,e,n){if(!y(t)||typeof t.file!="string")return null;let r=yt.resolve(e,t.file),o=yt.relative(n,r);return o.startsWith("..")?null:o}a(sl,"personaFileRelPath");async function al(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=xe(n,void 0,{lenientEnv:!0})}catch{i=null}return i?.roles?dy(i.roles,n,o):uy(t,o)}a(al,"checkRoles");async function dy(t,e,n){let r=yt.resolve(e,"profile"),o=new je(r);if(o.loadFromProfile(t,r),o.size===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.loadErrors)n.push({key:`role.${s.file}`,status:"error",message:`\u89D2\u8272\u6821\u9A8C\u5931\u8D25: ${s.errors.join("; ")}`});for(let s of o.list()){let c=typeof s.persona=="string"?s.persona:"",l=t[s.id],d=y(l)?l.persona:void 0,u=sl(d,r,e),f=u?{type:"textFile",file:u}:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"persona"]};n.push(Ir({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(Ir({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??[];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`}):n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"ok",value:p,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(dy,"checkProfileRoles");async function uy(t,e){let n=!1;try{n=(await cy(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 ay(t)).filter(c=>c.endsWith(_r)).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 je(t);for(let c of o){let l=yt.join(t,c),d=await i.validateFile(l),u=c.replace(_r,"");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:"",m=sl(f.persona,t,yt.dirname(t)),h={type:"yaml",file:`roles/${c}`,yamlPath:["persona"]};if(m){h={type:"textFile",file:m};try{p=(await ly(yt.resolve(yt.dirname(t),m),"utf8")).trim()}catch{p=""}}e.push(Ir({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(Ir({key:`role.${u}.persona`,label:"\u4EBA\u8BBE Persona",description:m?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${m}\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:h,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:h});let k=f.knowledge_scope?.kb_collections??[];k.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:k,message:`${c} \u5DF2\u914D\u7F6E ${k.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(uy,"checkDirectoryRoles");import fy from"yaml";var py=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,gy=/api_key|secret|token|password/i,cl=/^[A-Za-z_][A-Za-z0-9_]*$/;function my(t){let e=new Map;if(!t)return e;let n=[];for(let r of t.split(`
85
+ `)){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(cl.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(my,"parseEnvExampleDescriptions");function ll(t){let e=new Map;if(!t)return e;for(let n of t.split(`
86
+ `)){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();cl.test(i)&&/^[{[]/.test(s)&&!e.has(i)&&e.set(i,s)}return e}a(ll,"parseEnvExampleValues");function dl(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(dl,"deriveEnvJsonMapSpec");function hy(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(hy,"envSurface");function yy(t){let e=[];for(let n of t.split(`
87
+ `)){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(`
88
+ `)}a(yy,"stripYamlComments");function wn(t){let e=new Map;for(let n of t)for(let r of yy(n).matchAll(py)){let o=r[1],i=r[2]==="?",s=e.get(o);e.set(o,{optional:s?s.optional&&i:i})}return e}a(wn,"collectEnvRefDetails");function wy(t){return new Set(wn(t).keys())}a(wy,"collectEnvRefs");var ky=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function ul(t,e){let n=new Map;for(let r of[t,...e.map(o=>o.text)]){let o;try{o=fy.parse(r)}catch{continue}if(!o||typeof o!="object")continue;let i=o.toolkit_config;if(!(!i||typeof i!="object")){for(let[s,c]of Object.entries(i))if(!(!c||typeof c!="object"))for(let[l,d]of Object.entries(c)){if(typeof d!="string")continue;let u=d.match(ky);u&&n.set(u[1],{toolkit:s,field:l})}}}return n}a(ul,"collectToolkitEnvRefs");function $i(t,e,n,r="",o,i){let s=[],c=my(r),l=ll(r),d=o?new Map(o):wn([t,...e.map(f=>f.text)]);if(d.size===0)return s.push({key:"env",status:"ok",message:"\u914D\u7F6E\u4E2D\u672A\u5F15\u7528\u4EFB\u4F55\u73AF\u5883\u53D8\u91CF"}),{id:"env",name:"\u73AF\u5883\u53D8\u91CF",ok:!0,items:s};for(let f of[...d.keys()].sort()){let p=d.get(f).optional,m=n[f],h=gy.test(f),k=c.get(f),w=i?.get(f),b;k&&w?b=`${k}\uFF1B\u683C\u5F0F: ${w}`:w?b=`\u683C\u5F0F: ${w}`:b=k;let C=hy(f,b,dl([l.get(f),w,m],b),p);m===void 0?s.push({key:f,status:p?"suggestion":"error",message:p?`\u73AF\u5883\u53D8\u91CF ${f}\uFF08\u914D\u7F6E\u4E2D\u4EE5 \${env.${f}?} \u53EF\u9009\u5F15\u7528\uFF09\u672A\u5B9A\u4E49\uFF0C\u6309\u9700\u914D\u7F6E`:`\u73AF\u5883\u53D8\u91CF ${f}\uFF08\u914D\u7F6E\u4E2D\u4EE5 \${env.${f}} \u5F15\u7528\uFF09\u672A\u5B9A\u4E49`,sensitive:h,surface:C,writeTarget:{type:"env",file:".env",envKey:f}}):m.trim()===""?s.push({key:f,status:p?"suggestion":"error",value:"",message:p?`\u73AF\u5883\u53D8\u91CF ${f}\uFF08\u914D\u7F6E\u4E2D\u4EE5 \${env.${f}?} \u53EF\u9009\u5F15\u7528\uFF09\u503C\u4E3A\u7A7A\uFF0C\u6309\u9700\u914D\u7F6E`:`\u73AF\u5883\u53D8\u91CF ${f}\uFF08\u914D\u7F6E\u4E2D\u4EE5 \${env.${f}} \u5F15\u7528\uFF09\u503C\u4E3A\u7A7A`,sensitive:h,surface:C,writeTarget:{type:"env",file:".env",envKey:f}}):s.push({key:f,status:"ok",value:h?"***":m,message:"\u5DF2\u5B9A\u4E49",sensitive:h,surface:C,writeTarget:{type:"env",file:".env",envKey:f}})}return{id:"env",name:"\u73AF\u5883\u53D8\u91CF",ok:!s.some(f=>f.status==="error"),items:s}}a($i,"checkEnv");function kn(t){return t?._def?.typeName??t?._def?.type}a(kn,"typeName");function wt(t){if(!t)return null;let e=t,n=kn(e);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"?wt(e.unwrap()):e?._def?.schema?wt(e._def.schema):e?._def?.innerType?wt(e._def.innerType):null}a(wt,"getZodObjectShape");function Wt(t){let e=kn(t);if(!e)return"...";if(e==="ZodOptional"||e==="optional"||e==="ZodDefault"||e==="default"||e==="ZodNullable"||e==="nullable"){let n=t._def?.innerType??t._def?.schema;return n?Wt(n):"..."}if(e==="ZodString"||e==="string")return"...";if(e==="ZodNumber"||e==="number")return 0;if(e==="ZodBoolean"||e==="boolean")return!0;if(e==="ZodArray"||e==="array"){let n=t._def?.element??t._def?.items;return n?[Wt(n)]:["..."]}if(e==="ZodRecord"||e==="record"){let n=t._def?.valueType??t._def?.valueSchema;return{"<name>":n?Wt(n):"..."}}if(e==="ZodObject"||e==="object"){let n=wt(t);if(!n)return{};let r={};for(let[o,i]of Object.entries(n))r[o]=Wt(i);return r}return typeof t.unwrap=="function"?Wt(t.unwrap()):"..."}a(Wt,"toExample");function Mi(t){if(!kn(t))return;let n=fl(t),r=kn(n);if(r==="ZodString"||r==="string"||r==="ZodNumber"||r==="number"||r==="ZodBoolean"||r==="boolean")return;let o=Wt(t);if(!(o==="..."||o===void 0))return JSON.stringify(o)}a(Mi,"zodToFormatExample");function fl(t){let e=kn(t);if(e==="ZodOptional"||e==="optional"||e==="ZodDefault"||e==="default"||e==="ZodNullable"||e==="nullable"){let n=t._def?.innerType??t._def?.schema;return n?fl(n):t}return t}a(fl,"unwrapWrapper");async function iD(t){let e=await he(t.configPath),n=Bt.dirname(e),r;try{r=await Er(e,"utf8")}catch(T){return by(t.configPath,`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6: ${T instanceof Error?T.message:String(T)}`)}let o=await fr(n);Nt();let i=null,s=null;try{i=xe(n,o,{lenientEnv:!0})}catch(T){s=T instanceof Error?T.message:String(T)}let c="";try{c=await Er(Bt.resolve(n,"profile","profile.yml"),"utf8")}catch{}let l=null,d=null;try{l=await fe(t.configPath)}catch(T){d=T instanceof Error?T.message:String(T)}let u=[];l?u=l.workflowEntries:u=Sy(n,r),t.workflowId&&(u=u.filter(T=>T.id===t.workflowId));let f=[];for(let T of u)try{let M=await Er(T.templatePath,"utf8");f.push({id:T.id,text:M})}catch{}let p=[];l?(p.push(Wc(l)),p.push(await Uc(l,{engineExplicitlySet:vy(r)}))):p.push({id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!1,items:[{key:"config",status:"error",message:`\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25: ${d}`}]}),p.push(await Di(u,n,i)),s&&p.push({id:"profile",name:"Profile \u914D\u7F6E",ok:!1,items:[{key:"profile.yml",status:"error",message:`profile \u52A0\u8F7D\u5931\u8D25: ${s}`}]});let m=l?l.rolesDir:Bt.resolve(n,"./roles"),h=l?l.roles.enabled:!0;p.push(await al(m,h,n,i));let k=wn([r,c,...f.map(T=>T.text)]),w="";try{w=await Er(Bt.resolve(n,".env.example"),"utf8")}catch{}let b=c?[...f,{id:"__profile__",text:c}]:f,C=ul(r,b),S=new Map;for(let[T,{toolkit:M,field:E}]of C){let $=De.find(U=>U.name===M);if(!$)continue;let N=wt($.configSchema);if(!N||!N[E])continue;let H=Mi(N[E]);H&&S.set(T,H)}p.push($i(r,b,o,w,k,S));let v=p.reduce((T,M)=>T+M.items.filter(E=>E.status==="error").length,0),x=p.reduce((T,M)=>T+M.items.filter(E=>E.status==="warn").length,0),_=p.reduce((T,M)=>T+M.items.filter(E=>E.status==="suggestion").length,0),R=p.filter(T=>T.ok).length;return{projectPath:t.configPath,ok:p.every(T=>T.ok),modules:p,summary:{totalModules:p.length,passedModules:R,errors:v,warnings:x,suggestions:_}}}a(iD,"runCheck");function by(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(by,"errorResult");function vy(t){try{let e=pl.parse(t);if(!y(e))return!1;let n=e.agent;if(!y(n))return!1;let r=n.engine;return typeof r=="string"&&r.trim().length>0}catch{return!1}}a(vy,"isEngineExplicitlySet");function Sy(t,e){try{let n=pl.parse(e);if(!y(n))return[];if(y(n.workflow)){let r=n.workflow.template,o=n.workflow.recipe_dir??"./recipes";if(typeof r=="string")return[{id:"default",templatePath:Bt.resolve(t,r),recipeDir:Bt.resolve(t,String(o))}]}if(y(n.workflows)&&typeof n.workflows.dir=="string")return[]}catch{}return[]}a(Sy,"inferWorkflowEntries");import{readFile as ji,writeFile as Ar}from"fs/promises";import Ry from"yaml";function gl(t,e){if(e==="string[]")return t.split(/[,\n]/).map(n=>n.trim()).filter(n=>n.length>0);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(gl,"coerceYamlValue");function Cy(t,e){let n=t.trim();return e==="boolean"?n.toLowerCase()==="true":e==="string[]"?n.split(",").map(r=>r.trim()).filter(r=>r.length>0):t}a(Cy,"coerceJsonValue");async function ml(t,e,n){let r;try{r=await ji(t,"utf8")}catch{r=""}let o=Ry.parseDocument(r);o.setIn(e,n),await Ar(t,o.toString(),"utf8")}a(ml,"writeYaml");async function xy(t,e,n){let r;try{r=await ji(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(`^${Iy(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?`
89
+ `:"")+i+`
90
+ `,await Ar(t,r,"utf8")}a(xy,"writeEnvFile");async function Ty(t,e,n){let r;try{r=await ji(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)}_y(o,e,n),await Ar(t,JSON.stringify(o,null,2)+`
91
+ `,"utf8")}a(Ty,"writeJsonFile");function _y(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(_y,"setInJson");async function dD(t,e,n){let r=await import("path");if(t.type==="yaml")await ml(r.resolve(n,t.file),t.yamlPath,gl(e,t.valueType));else if(t.type==="yamlAll")for(let o of t.targets)await ml(r.resolve(n,o.file),o.yamlPath,gl(e,t.valueType));else t.type==="json"?await Ty(r.resolve(n,t.file),t.jsonPath,Cy(e,t.valueType)):t.type==="textFile"?await Ar(r.resolve(n,t.file),e.endsWith(`
92
+ `)?e:e+`
93
+ `,"utf8"):await xy(r.resolve(n,t.file),t.envKey,e)}a(dD,"writeBack");function Iy(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(Iy,"escapeRegex");var hl=/^\$\{globalVar\.([^}]+)\}$/;function pD(t){return typeof t=="string"&&hl.test(t)}a(pD,"isGlobalVarRef");function Ey(t){if(typeof t!="string")return null;let e=t.match(hl);return e?e[1]:null}a(Ey,"globalVarRefPath");function gD(t,e){let n=Ey(t);return n===null?t:e?.(n)}a(gD,"resolveGlobalVarRef");import{mkdir as Ay,readFile as Dy,writeFile as Py,chmod as yl,rename as $y}from"fs/promises";import kl from"path";import My from"os";var bl=kl.join(My.homedir(),".aitable-workflow"),jy="credentials.json";function vl(t=bl){return kl.join(t,jy)}a(vl,"credentialsFilePath");function wl(){return{version:1,agents:[],activeAgent:null}}a(wl,"emptyStore");async function bn(t){let e=vl(t);try{let n=await Dy(e,"utf8"),r=JSON.parse(n);return r.version!==1||!Array.isArray(r.agents)?wl():r}catch{return wl()}}a(bn,"readCredentials");async function Sl(t,e){let n=e??bl,r=vl(n),o=`${r}.tmp`;await Ay(n,{recursive:!0}),await Py(o,JSON.stringify(t,null,2)+`
94
+ `,"utf8"),await yl(o,384),await $y(o,r),await yl(r,384)}a(Sl,"writeCredentials");async function bD(t,e){let n=await bn(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 Sl(n,e),n}a(bD,"saveCredential");async function vD(t,e,n){let o=(await bn(n)).agents.find(i=>i.name===t);return o&&o.serverUrl!==e?o:null}a(vD,"findConflictingCredential");async function SD(t,e){let n=await bn(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 Sl(n,e),n}a(SD,"setActiveAgent");async function RD(t){let e=await bn(t);return e.activeAgent?e.agents.find(n=>n.name===e.activeAgent)??null:null}a(RD,"getActiveCredential");async function CD(t){return(await bn(t)).agents}a(CD,"listCredentials");function _D(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(_D,"maskSecret");var Dr=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 re({bin:e.dws_bin})}async init(){if(this.initialized)return;g.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=ie(e);for(let r of n){if(!y(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))}g.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 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){g.info("tracker","updating state",{itemId:e,state:n}),await this.updateRecord(e,{[this.fields.state]:n})}async updateCurrentStep(e,n){this.fields.current_step&&(g.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&&(g.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&&(g.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=>{g.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?zt(c.fields[r]):""}let i=X(),s=[o,`[${i}] ${n}`].filter(Boolean).join(`
95
+ `);this.eventLogCache.set(e,s),await this.updateRecord(e,{[r]:s})}async updateRecord(e,n){let r=this.translateCellsToIds(n);e==="__new__"?await this.dws.runJson(["aitable","record","create","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--records",JSON.stringify([{cells:r}]),"--yes"]):await this.dws.runJson(["aitable","record","update","--base-id",this.config.base_id,"--table-id",this.config.table_id,"--records",JSON.stringify([{recordId:e,cells:r}]),"--yes"])}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=ie(c);n.push(...l);let d=Dn(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=Fy(e),r=this.translateCellsToNames(n);this.fillSubmitterFromMetadata(e,r);let o=Oy(e);if(!o)throw new Error(`AI \u8868\u683C\u8BB0\u5F55\u7F3A\u5C11 recordId: ${JSON.stringify(e).slice(0,200)}`);let i={};for(let s of Object.keys(r)){let c=this.nameToType.get(s);c&&(i[s]=c)}return{id:o,title:zt(r[this.fields.title])||"(\u65E0\u6807\u9898)",state:zt(r[this.fields.state])||"Unknown",currentStep:this.fields.current_step&&zt(r[this.fields.current_step])||null,owner:this.fields.owner&&zt(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=Ny(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 Fy(t){let e=oe(t);if(!y(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(y(r))return r}return e}a(Fy,"recordCells");function Oy(t){let e=oe(t);if(!y(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(Oy,"extractRecordId");function Ny(t){let e=oe(t);return Oi(e)}a(Ny,"extractSubmitterIdentity");function Oi(t){if(Array.isArray(t)){for(let n of t){let r=Oi(n);if(r)return r}return null}if(!y(t))return null;let e=Fi(t,["userId","user_id","createUserId","create_user_id","createdUserId","created_user_id","creatorUserId","creator_user_id"]);if(e){let n=Fi(t,["corpId","corp_id","corpID"]),r=Fi(t,["name","userName","user_name"]);return{userId:e,...n?{corpId:n}:{},...r?{name:r}:{}}}for(let n of Object.values(t)){let r=Oi(n);if(r)return r}return null}a(Oi,"findUserIdentityDeep");function Fi(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(Fi,"firstStringByKeys");function zt(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(zt).filter(Boolean).join(", ");if(y(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(zt,"cellToString");var Pr=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,g.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){g.error("event-source","PollingSource handler error",{error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.intervalMs)}g.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 $r=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),g.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 Mr=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){g.debug("event-router","\u672A\u6CE8\u518C\u7684\u4E8B\u4EF6\u7C7B\u578B\uFF0C\u8DF3\u8FC7",{type:e.type});return}await n(e)}};import Rl from"path";import Cl from"fs";var Ly={id:"",title:"",state:"",currentStep:null,owner:null,fields:{},raw:{}};function Ni(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(Ni,"buildCreateCells");var jr=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 et,this.configScope=e.configScope;let n=e.toolkitRegistry;this.toolkitFactory=e.toolkitFactory??(()=>Hn({settings:this.settings,tracker:this.tracker,item:Ly,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=>g.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=Ni(this.settings,e.fields);g.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){g.warn("event-handler","update_record \u7F3A\u5C11 itemId");return}g.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=Rl.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=Rl.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=Cl.existsSync(r)?r:Cl.existsSync(o)?o:r,s;i.endsWith(".ts")&&await Tt();try{s=await import(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(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
96
+ \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 Wy={maxAttempts:3,baseBackoffMs:2e3,maxBackoffMs:6e4,maxStepFailures:5},Fr=class{static{a(this,"RetryScheduler")}config;failureCounter=new Map;constructor(e){this.config={...Wy,...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)}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)}};var xl="__human_prepared",Or=class{static{a(this,"StepEngine")}settings;workflow;tracker;executor;stepsMap;retry;onRunEvent;constructor(e){this.settings=e.settings,this.workflow=e.workflow,this.tracker=e.tracker,this.onRunEvent=e.onRunEvent,this.executor=new ar({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 Fr(r)}get reviewState(){return this.settings.raw.tracker?.states.review??this.settings.tracker.states.active[1]??this.settings.tracker.states.active[0]}async processItem(e,n){let r={},o={recorded:!1},i=this.resolveCurrentStep(e);if(!i)return g.warn("step-engine","\u65E0\u6CD5\u786E\u5B9A\u5F53\u524D\u6B65\u9AA4",{itemId:e.id,state:e.state}),{recorded:o.recorded};try{for(;;){if(n.aborted)return{recorded:o.recorded};let s=await this.processStep(e,i,r,n,o);if(!s)return{recorded:o.recorded};if(!this.settings.agent.auto_advance)return{recorded:o.recorded};if(!s.auto)return{recorded:o.recorded};i=s}}finally{await this.tracker.flush?.(e.id)}}async processStep(e,n,r,o,i){if(!n.auto){if(e.state===this.reviewState)return g.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;i.recorded=!0,g.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 c=await this.advanceToNextStep(e,n,r);return this.retry.clearFailures(e.id),c}if(this.retry.isExhausted(e.id,n.id))return i.recorded=!0,await this.blockItem(e,n),null;if(n.output_mapping&&this.isStepAlreadyComplete(e,n,r))return i.recorded=!0,g.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);return s?(i.recorded=i.recorded||!(s.status==="success"&&s.tracker===!1),s.status==="success"&&Object.keys(s.output).length>0&&this.mergeStepOutput(r,n,s.output),await this.handleResult(e,n,s,r)):null}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){g.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;g.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 By(this.retry.getBackoffMs(s))}}return i}async prepareExecution(e,n){let r=this.settings.tracker.states.active[0],o={};r&&e.state===this.settings.tracker.states.initial&&(o.state=r),e.currentStep!==n.id&&(o.currentStep=n.id),(o.state!==void 0||o.currentStep!==void 0)&&await this.updateCheckpoint(e,o),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`;g.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):g.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){if(e.currentStep){let n=this.stepsMap.get(e.currentStep);if(n)return n}if(e.state===this.settings.tracker.states.initial){let n=this.workflow.orderedStepIds[0];return n?this.stepsMap.get(n)??null:null}if(this.settings.tracker.states.active.includes(e.state)){let n=this.workflow.orderedStepIds[0];return n?this.stepsMap.get(n)??null:null}return null}async handleFailureOrBlock(e,n,r){switch(r.status){case"failed":r.retryable===!1?await this.blockItem(e,n,r.error):(this.retry.recordFailure(e.id,n.id),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":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":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);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}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"),g.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}`),g.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}`),g.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 y(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;for(let r of Object.values(n.output_mapping)){let o=e.fields[r];if(o!=null&&o!=="")return!0}return!1}hasHumanStepPrepared(e,n,r){let o=r[n.id];return y(o)&&o[xl]===!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){if(i.recorded=i.recorded||!(s.status==="success"&&s.tracker===!1),s.status==="success"){this.mergeStepOutput(r,n,s.output),this.markHumanStepPrepared(r,n);let c={...this.resolveOutput(n,s.output)};await this.updateCheckpoint(e,{...Object.keys(c).length>0?{fields:c}:{},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),await this.tracker.appendEvent(e.id,`\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838: ${n.name}`),g.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}}}mergeStepOutput(e,n,r){let o=y(e[n.id])?e[n.id]:{};e[n.id]={...o,...r}}markHumanStepPrepared(e,n){let r=y(e[n.id])?e[n.id]:{};e[n.id]={...r,[xl]:!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 By(t){return new Promise(e=>setTimeout(e,t))}a(By,"sleep");var Nr=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):g.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 zy}from"crypto";var Uy="__transient_",Lr=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=`${Uy}${zy(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()}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=X();r.cells[this.fields.event_log]=[o,`[${i}] ${n}`].filter(Boolean).join(`
97
+ `);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 Li(t){return{id:t.id,title:t.title,state:t.state,currentStep:t.currentStep}}a(Li,"snapshotRunRecord");function Tl(t){return Se(t)!==void 0||Zt(t)!==void 0}a(Tl,"eventContextRequiresTransient");async function _l(t,e){Se(t)&&await zn.finalize(t,e)}a(_l,"finalizeEventContext");var Wr=class{static{a(this,"Orchestrator")}settings;workflow;tracker;deferredTracker;stepEngine;eventHandlerExecutor;schedulerSources=[];eventBindings;queue=new $r;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 Lr(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 Or({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 jr({settings:e.settings,tracker:this.deferredTracker,toolkitFactory:e.toolkitFactory,toolkitRegistry:e.toolkitRegistry,globalVars:e.globalVars,configScope:e.configScope}),this.taskPool=new Nr({capacity:e.settings.agent.max_concurrent,onError:a((n,r)=>{g.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(Vy(c,i)),r.name)}catch(c){g.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){g.error("orchestrator","handler.onEvent \u5F02\u5E38",{source:r.name,error:d instanceof Error?d.message:String(d)})}}).catch(c=>{g.error("orchestrator","source.start \u5F02\u5E38",{source:r.name,error:c instanceof Error?c.message:String(c)})})}let e=new Mr({timer_fired:a(async()=>{await this.reconcile()},"timer_fired")}),n=new Pr({intervalMs:this.settings.polling.interval_ms});this.schedulerSources.push(n),g.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()),g.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)&&g.info("orchestrator","\u7B49\u5F85\u5728\u9014\u4EFB\u52A1\u7ED3\u675F",{running:this.taskPool.running,queued:this.taskPool.depth}),await this.taskPool.drain();let e=vo();e>0&&g.info("orchestrator","\u7B49\u5F85\u8FDB\u884C\u4E2D\u7684\u5B50\u8FDB\u7A0B\u7ED3\u675F",{pending:e}),await ta(this.drainTimeoutMs)||(g.warn("orchestrator","drain \u8D85\u65F6\uFF0C\u5F3A\u5236\u4E2D\u6B62\u6B8B\u7559\u5B50\u8FDB\u7A0B",{remaining:vo()}),this.abortController?.abort())}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){g.error("orchestrator","\u843D\u5E93\u5931\u8D25",{action:d.action,error:u instanceof Error?u.message:String(u)})}}let r=await this.tracker.fetchCandidateItems(),o=this.settings.raw.tracker?.states.review??this.settings.tracker.states.active[1]??this.settings.tracker.states.active[0],i=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);g.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=Ni(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){g.error("orchestrator","\u77AC\u6001\u8FD0\u884C\u5F02\u5E38",{transientId:o,error:l instanceof Error?l.message:String(l)}),s=!0,c=!1}try{await _l(e.eventContext,{completed:c,recorded:s})}catch(l){g.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)})}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:Li(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 Vy(t,e){return t.action==="create_record"&&(e==="on_demand"||Tl(t.eventContext))?{...t,defer:!0}:t}a(Vy,"tagDeferred");import hd from"path";import{mkdir as qy,readFile as Hy,rename as Ky,writeFile as Gy}from"fs/promises";import Jy from"path";async function Ut(t,e){try{let n=await Hy(Bo(t,e),"utf8");return JSON.parse(n)}catch{return null}}a(Ut,"readState");async function kt(t,e,n){let r=Bo(t,e);await qy(Jy.dirname(r),{recursive:!0});let o=`${r}.tmp`;await Gy(o,JSON.stringify(n,null,2)+`
98
+ `,"utf8"),await Ky(o,r)}a(kt,"writeState");import{createHash as Zy}from"crypto";import{readdir as Yy,stat as Qy}from"fs/promises";import Wi from"path";var Xy=new Set([".md",".txt",".text",".rst",".csv",".json",".yaml",".yml",".html",".htm",".xml"]),ew=new Set(["node_modules",".git",".kb",".DS_Store","thumbs.db"]);async function Il(t,e){let n;try{n=await Yy(t,{withFileTypes:!0})}catch{return[]}let r=[];for(let o of n){if(ew.has(o.name))continue;let i=Wi.join(t,o.name);if(o.isDirectory())r.push(...await Il(i,e));else if(o.isFile()){let s=Wi.extname(o.name).toLowerCase();if(!Xy.has(s)||o.name.startsWith("_"))continue;let c=await Qy(i);r.push({relativePath:Wi.relative(e,i),size:c.size,mtimeMs:Math.floor(c.mtimeMs)})}}return r}a(Il,"collectSourceFiles");async function Fe(t){let e=await Il(t,t);if(e.length===0)return"sha256:empty";e.sort((r,o)=>r.relativePath<o.relativePath?-1:r.relativePath>o.relativePath?1:0);let n=e.map(r=>`${r.relativePath}:${r.size}:${r.mtimeMs}`).join(`
99
+ `);return`sha256:${Zy("sha256").update(n).digest("hex")}`}a(Fe,"computeSourceHash");function Br(t,e){return!t||t.status!=="done"?!0:t.sourceHash!==e}a(Br,"needsRecompile");import B from"fs";import V from"path";import{createHash as Gw}from"crypto";import{mkdir as eo,writeFile as ts,readFile as ns,readdir as Ow,access as Nw}from"fs/promises";import ye from"path";var tw=6e4,nw=3,rw=1e3;function ow(t){if(!t)return!1;let e=t.toLowerCase();return t.includes("\u5C1A\u672A\u5C31\u7EEA")||t.includes("\u8BF7\u7A0D\u540E\u91CD\u8BD5")||e.includes("internalerror")}a(ow,"isTransientDwsError");function zr(t){return t?.runner??G}a(zr,"resolveRunner");function Ur(t){return t?.dwsBinPath??"dws"}a(Ur,"resolveBin");function Vr(t){return t?.timeoutMs??tw}a(Vr,"resolveTimeout");function Bi(t){let e=t.trim();if(e.startsWith("{")||e.startsWith("["))try{return JSON.parse(e)}catch{}let n=null;for(let r of t.split(`
100
+ `)){let o=r.trim();if(!((!o.startsWith("{")||!o.endsWith("}"))&&(!o.startsWith("[")||!o.endsWith("]"))))try{let i=JSON.parse(o);if("nodeId"in i||"nodes"in i||"title"in i||"markdown"in i)return i;n||(n=i)}catch{}}return n}a(Bi,"parseDwsResponse");function tt(t,e,n){let r=n?.trim()?` | ${n.slice(0,300)}`:"";return new Error(`dws doc ${t} \u5931\u8D25: ${e}${r}`)}a(tt,"makeDwsError");function qr(t){if(t instanceof Error&&"code"in t){let e=t.code;if(e==="ENOENT"||e==="EACCES")throw new Error(`dws CLI \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH \u4E2D\u3002\u5B89\u88C5\u65B9\u5F0F: npm install -g @anthropic-ai/dingtalk-workspace-cli
101
+ \u6216\u8FD0\u884C: a1 ext install dws`)}throw t}a(qr,"checkDwsMissing");async function El(t,e){let n=zr(e),r=Ur(e),o=Vr(e),i;try{i=await n(r,["doc","info","--node",t,"--format","json"],{timeoutMs:o})}catch(c){qr(c)}if(i.exitCode!==0)throw tt("info",`exit code ${i.exitCode}`,i.stderr);let s=Bi(i.stdout);if(!s||!s.nodeId)throw tt("info",`\u65E0\u6CD5\u89E3\u6790\u54CD\u5E94: ${i.stdout.slice(0,200)}`);return{nodeId:s.nodeId,nodeType:s.nodeType??"file",name:s.name??"",workspaceId:s.workspaceId,updateTime:s.updateTime,extension:s.extension}}a(El,"dwsDocInfo");async function Al(t,e,n){let r=zr(n),o=Ur(n),i=Vr(n),s=["doc","list","--format","json"];t&&s.push("--workspace",t),e&&s.push("--folder",e);let c;try{c=await r(o,s,{timeoutMs:i})}catch(d){qr(d)}if(c.exitCode!==0)throw tt("list",`exit code ${c.exitCode}`,c.stderr);return Bi(c.stdout)?.nodes??[]}a(Al,"dwsDocList");async function Dl(t,e){let n=zr(e),r=Ur(e),o=Vr(e),i=e?.maxReadAttempts??nw,s=e?.retryBaseDelayMs??rw,c=e?.sleep??(l=>new Promise(d=>setTimeout(d,l)));for(let l=1;l<=i;l++){let d;try{d=await n(r,["doc","read","--node",t,"--format","json"],{timeoutMs:o})}catch(m){qr(m)}if(d.exitCode!==0){let m=d.stderr.toLowerCase();if(m.includes("unauthorized")||m.includes("401")||m.includes("login"))throw new Error("dws \u672A\u6388\u6743\uFF0C\u8BF7\u5148\u6267\u884C: dws auth login");if(ow(d.stderr)&&l<i){await c(s*l);continue}throw tt("read",`exit code ${d.exitCode}`,d.stderr)}let u=Bi(d.stdout);if(!u)throw tt("read",`\u65E0\u6CD5\u89E3\u6790\u54CD\u5E94: ${d.stdout.slice(0,200)}`);let f=u.title??u.name??"",p=u.markdown??u.content??"";if(!p)throw tt("read","\u6587\u6863\u5185\u5BB9\u4E3A\u7A7A");return{title:f,markdown:p}}throw tt("read","\u91CD\u8BD5\u8017\u5C3D")}a(Dl,"dwsDocRead");async function Pl(t,e,n){let r=zr(n),o=Ur(n),i=Vr(n),s;try{s=await r(o,["drive","download","--node",t,"--output",e],{timeoutMs:i})}catch(c){qr(c)}if(s.exitCode!==0)throw tt("drive download",`exit code ${s.exitCode}`,s.stderr)}a(Pl,"dwsDriveDownload");var iw="https://alidocs.dingtalk.com/i/nodes/",sw=new Set(["adoc","docx","pdf","md","txt","text","rst","csv","json","yaml","yml","xml","html","htm","xlsx"]);function $l(t){let n=new URL(t).pathname;if(n.includes("/desktop/my-space"))return{type:"my-space",id:""};let r=n.match(/\/i\/spaces\/([^/]+)/);if(r?.[1])return{type:"space",id:r[1]};let o=n.match(/\/i\/nodes\/([^/]+)/);if(o?.[1])return{type:"node",id:o[1]};throw new Error(`\u65E0\u6CD5\u89E3\u6790\u9489\u9489\u6587\u6863 URL: ${t}\u3002\u652F\u6301\u7684\u683C\u5F0F: /i/spaces/<id>/overview\u3001/i/nodes/<id> \u6216 /i/desktop/my-space`)}a($l,"parseDingtalkUrl");async function Hr(t,e,n,r){let o=await Al(t,e,r),i=[],s=0;for(let c of o){let l=n?`${n}/${zi(c.name)}`:zi(c.name);if(c.nodeType==="folder"){let d=await Hr(t,c.nodeId,l,r);i.push(...d.nodes),s+=d.skippedUnsupported}else{if(c.extension&&!sw.has(c.extension)){s++;continue}i.push({id:c.nodeId,title:c.name,relativePath:l,sourceUrl:`${iw}${c.nodeId}`,updateTime:c.updateTime,extension:c.extension})}}return{nodes:i,skippedUnsupported:s}}a(Hr,"listRecursive");function zi(t){return t.replace(/[<>:"/\\|?*\x00-\x1f]/g,"").replace(/\s+/g," ").trim()||"untitled"}a(zi,"sanitizeDirName");async function Ml(t,e){let n=$l(t);if(n.type==="my-space")return{scope:"space",...await Hr(void 0,void 0,"",e)};if(n.type==="space"){let i=await Hr(n.id,void 0,"",e);return{scope:"space",workspaceId:n.id,...i}}let r=await El(t,e);if(r.nodeType==="file")return{scope:"document",workspaceId:r.workspaceId,skippedUnsupported:0,nodes:[{id:r.nodeId,title:r.name,relativePath:zi(r.name),sourceUrl:t,updateTime:r.updateTime,extension:r.extension}]};if(!r.workspaceId)throw new Error(`\u65E0\u6CD5\u83B7\u53D6\u6587\u4EF6\u5939 ${r.nodeId} \u7684 workspaceId\u3002dws doc info \u672A\u8FD4\u56DE workspaceId \u5B57\u6BB5\u3002`);let o=await Hr(r.workspaceId,r.nodeId,"",e);return{scope:"folder",workspaceId:r.workspaceId,...o}}a(Ml,"crawlDingtalk");import{readFile as aw,writeFile as ZP}from"fs/promises";import QP from"path";function Ui(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}a(Ui,"yamlEscapeTitle");async function Vi(t){let n=(await import("mammoth")).convertToMarkdown;if(!n)throw new Error("mammoth.convertToMarkdown not found");return(await n({path:t})).value}a(Vi,"convertDocxToMd");async function qi(t){let e=await import("pdf-parse"),n=await aw(t);if(e.PDFParse){let o=new e.PDFParse({data:new Uint8Array(n)});await o.load();let i=await o.getText(),s=typeof i=="string"?i:i?.text??"";return await o.destroy(),s}let r=e.default??e;if(typeof r=="function")return(await r(n)).text??"";throw new Error("pdf-parse: \u65E0\u6CD5\u8BC6\u522B\u7684 API \u7248\u672C\uFF08\u65E2\u975E v1 \u51FD\u6570\u5F0F\u4E5F\u975E v2 class \u5F0F\uFF09")}a(qi,"convertPdfToMd");function cw(t){if(t==null)return"";if(t instanceof Date)return t.toISOString();if(typeof t=="object"){let e=t;return Array.isArray(e.richText)?e.richText.map(n=>n.text??"").join(""):typeof e.text=="string"?e.text:e.hyperlink?String(e.text??e.hyperlink):"result"in e?e.result==null?"":String(e.result):""}return String(t)}a(cw,"xlsxCellText");function lw(t){return t.replace(/\r?\n/g,"<br>").replace(/\|/g,"\\|").trim()}a(lw,"escapeTableCell");function dw(t,e){let n=a(s=>{let c=s.slice(0,e);for(;c.length<e;)c.push("");return c.map(lw)},"pad"),r=n(t[0]),o=new Array(e).fill("---"),i=t.slice(1).map(n);return[`| ${r.join(" | ")} |`,`| ${o.join(" | ")} |`,...i.map(s=>`| ${s.join(" | ")} |`)].join(`
102
+ `)}a(dw,"renderMarkdownTable");async function Hi(t){let e=await import("exceljs"),n=e.default??e,r=new n.Workbook;await r.xlsx.readFile(t);let o=1024,i=[];return r.eachSheet(s=>{let c=[];if(s.eachRow({includeEmpty:!1},d=>{let u=d.values,f=[],p=Math.min(u.length,o+1);for(let m=1;m<p;m++)f.push(cw(u[m]));f.some(m=>m.trim()!=="")&&c.push(f)}),c.length===0)return;let l=0;for(let d of c){let u=0;for(let f=0;f<d.length;f++)d[f].trim()!==""&&(u=f+1);u>l&&(l=u)}l!==0&&i.push(`## ${s.name}
103
+
104
+ ${dw(c,l)}`)}),i.join(`
105
+
106
+ `)}a(Hi,"convertXlsxToMd");import{mkdir as uw,readdir as fw,stat as jl,readFile as Gr,access as Fl,writeFile as pw}from"fs/promises";import{existsSync as Jr,readFileSync as gw}from"fs";import ce from"path";import{fileURLToPath as mw}from"url";var Kr=ce.dirname(mw(import.meta.url));function nt(){let t=Kr;for(let e=0;e<12;e++){let n=ce.join(t,"package.json");if(Jr(n))try{let o=JSON.parse(gw(n,"utf-8"));if(o.name==="aitable-workflow-monorepo"||o.workspaces)return t}catch{}let r=ce.dirname(t);if(r===t)break;t=r}return ce.resolve(Kr,"../../../../..")}a(nt,"findRepoRoot");function Ki(){let t=[ce.resolve(Kr,"..","wolai-crawler","run.js"),ce.join(nt(),"packages","core","src","kb","wolai-crawler","run.js")];for(let e of t)if(Jr(e))return e;return t[0]}a(Ki,"resolveCrawlerScript");function hw(){let t=[ce.resolve(Kr,"..","wolai-crawler","config.default.json"),ce.join(nt(),"packages","core","src","kb","wolai-crawler","config.default.json")];for(let e of t)if(Jr(e))return e;return t[0]}a(hw,"resolveDefaultConfigPath");function Gi(){let t=nt(),e=ce.join(t,".sandbox","kb-validate","wolai-crawler-config.json"),n=hw();return Jr(e)?e:n}a(Gi,"resolveConfigPath");async function yw(){let t=Gi();try{return JSON.parse(await Gr(t,"utf8")).storageState??null}catch{return null}}a(yw,"resolveStorageStatePath");async function ww(t){let e=await yw(),n=Gi();if(!e)throw new Error(`\u672A\u627E\u5230 wolai-crawler \u7684 storageState \u914D\u7F6E\u3002
107
+ \u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u662F\u5426\u5305\u542B storageState \u5B57\u6BB5\uFF1A
108
+ ${n}`);let r=ce.isAbsolute(e)?e:ce.join(nt(),e);try{await Fl(r);return}catch{}console.log("\u2192 \u672A\u627E\u5230 wolai \u767B\u5F55\u6001\uFF0C\u5C06\u5F39\u51FA\u6D4F\u89C8\u5668\u7A97\u53E3\u5F15\u5BFC\u767B\u5F55\u3002"),console.log(" \u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u5B8C\u6210\u767B\u5F55/\u626B\u7801\uFF0C\u7136\u540E\u6309\u56DE\u8F66\u952E\u7EE7\u7EED\u3002"),console.log(" \u6CE8\u610F\uFF1A\u4F60\u9700\u8981\u5BF9\u76EE\u6807\u9875\u9762\u5177\u6709\u5BFC\u51FA\u6743\u9650\u3002");let o=await t("node",[Ki(),"--config",n,"--login","--login-wait-ms","600000","--repo-root",nt()],{cwd:nt(),timeoutMs:9e5,inheritStdio:!0});if(o.exitCode!==0)throw new Error(`wolai \u767B\u5F55\u6D41\u7A0B\u5931\u8D25\uFF1A
109
+ `+ge(o.stderr||o.stdout,{max:800})+`
110
+ \u8BF7\u786E\u8BA4\u4F60\u5BF9\u76EE\u6807\u9875\u9762\u5177\u6709\u5BFC\u51FA\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`);try{await Fl(r)}catch{throw new Error(`\u767B\u5F55\u540E\u4ECD\u672A\u751F\u6210\u767B\u5F55\u6001\u6587\u4EF6: ${r}
111
+ \u8BF7\u91CD\u65B0\u8FD0\u884C\u767B\u5F55\u547D\u4EE4\uFF1A
112
+ node ${Ki()} --config ${n} --login`)}}a(ww,"ensureStorageStateExists");async function kw(t){try{let e=await Gr(t,"utf8");return!!rt(e).ingested}catch{return!1}}a(kw,"shouldSkip");async function Ji(t){let e=[],n;try{n=await fw(t,{withFileTypes:!0})}catch{return e}for(let r of n){let o=ce.join(t,r.name);r.isDirectory()?e.push(...await Ji(o)):r.name.endsWith(".md")&&e.push(o)}return e}a(Ji,"scanMarkdownFiles");async function bw(t,e){let n=e.runner??G,r=Ki(),o=Gi(),i=e.outputDir;await uw(i,{recursive:!0});let s=[r,"--config",o,"--url",t,"--output",i,"--repo-root",nt()],c=await n("node",s,{cwd:nt(),timeoutMs:e.timeoutMs??36e5,inheritStdio:!0});if(c.exitCode!==0)throw new Error(ge(c.stderr||c.stdout,{max:800}));let l=await Ji(i);if(l.length===0)throw new Error("Wolai \u5BFC\u51FA\u6210\u529F\uFF0C\u4F46\u672A\u5728\u8F93\u51FA\u76EE\u5F55\u627E\u5230 markdown \u6587\u4EF6");let d=await Promise.all(l.map(async h=>({path:h,mtimeMs:(await jl(h)).mtimeMs})));d.sort((h,k)=>k.mtimeMs-h.mtimeMs);let u=d[0].path,f=ce.relative(i,u),p=ce.basename(u,".md"),m=await Gr(u,"utf8");return bt(m)||await pw(u,Te(p,t,"wolai")+m,"utf8"),{success:!0,action:"created",relativePath:f,filePath:u,title:p,sourceType:"wolai",sourceUrl:t,contentLength:(await jl(u)).size}}a(bw,"ingestSingleWolaiPage");async function Ol(t){if((t.scope??"document")!=="document")throw new Error("Wolai \u6682\u4EC5\u652F\u6301\u5355\u6587\u6863\u5BFC\u5165\uFF0C\u76EE\u5F55\u9875\u6279\u91CF\u5BFC\u5165\u53EF\u901A\u8FC7 wolai-crawler \u5168\u91CF\u6A21\u5F0F\u5B8C\u6210");await ww(t.runner??G);let n=await Ji(t.outputDir);for(let o of n)try{let i=await Gr(o,"utf8"),s=rt(i);if(s.source===t.url&&!t.force&&await kw(o))return{success:!0,action:"skipped",relativePath:ce.relative(t.outputDir,o),filePath:o,title:s.title||ce.basename(o,".md"),sourceType:"wolai",sourceUrl:t.url}}catch{}return await bw(t.url,t)}a(Ol,"ingestWolai");import{mkdir as Wl,writeFile as vw}from"fs/promises";import Sw from"path";var Bl="yuque-api.antfin-inc.com",Nl=`https://${Bl}/api/v2`,Rw={"yuque.com":"https://www.yuque.com/api/v2","www.yuque.com":"https://www.yuque.com/api/v2","aliyuque.antfin.com":Nl,"yuque.antfin.com":Nl};function zl(t){try{return new URL(t).hostname===Bl}catch{return!1}}a(zl,"isInternalApiBase");function Ul(t){let e;try{e=new URL(t)}catch{throw new Error(`\u65E0\u6548\u7684\u8BED\u96C0 URL: ${t}`)}let n=e.hostname.toLowerCase(),r=Rw[n];if(!r)throw new Error(`\u4E0D\u652F\u6301\u7684\u8BED\u96C0\u57DF\u540D: ${n}\u3002\u652F\u6301\u7684\u57DF\u540D: yuque.com, www.yuque.com, aliyuque.antfin.com, yuque.antfin.com`);let i=e.pathname.replace(/\/edit\/?$/,"").replace(/\/$/,"").split("/").filter(Boolean);if(i.length<2)throw new Error(`\u65E0\u6CD5\u89E3\u6790\u8BED\u96C0 URL: ${t}\u3002\u671F\u671B\u683C\u5F0F: https://${n}/{user}/{repo} \u6216 https://${n}/{user}/{repo}/{slug}`);let s=`${i[0]}/${i[1]}`,c=i.length>=3?i[2]:void 0;return{namespace:s,slug:c,host:n,apiBase:r}}a(Ul,"parseYuqueUrl");function Zi(t,e){if(e?.yuqueToken)return e.yuqueToken;let n=zl(t),r=n?"ALIYUQUE_TOKEN":"YUQUE_TOKEN",o=process.env[r];if(o)return o;let i=n?"\u963F\u91CC\u5185\u7F51\u8BED\u96C0 \u2192 \u56E2\u961F\u8BBE\u7F6E \u2192 Token\uFF08\u56E2\u961F Token\uFF09\u2192 \u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ALIYUQUE_TOKEN":"\u516C\u7F51\u8BED\u96C0 (yuque.com) \u2192 \u8BBE\u7F6E \u2192 \u5F00\u53D1\u8005\u8BBE\u7F6E \u2192 \u521B\u5EFA Token\uFF0C\u7136\u540E\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF YUQUE_TOKEN";throw new Error(`\u8BED\u96C0 Token \u7F3A\u5931\u3002${i}`)}a(Zi,"resolveToken");async function Yi(t,e,n,r){let o=r?.fetchImpl??globalThis.fetch,i=r?.timeoutMs??3e4,s=3,c=null;for(let l=0;l<=s;l++){let d=new AbortController,u=setTimeout(()=>d.abort(),i),f;try{f=await o(`${t}${e}`,{headers:{...zl(t)?{"X-Auth-Token":n}:{Authorization:`Bearer ${n}`},"User-Agent":"aitable-workflow","Content-Type":"application/json"},signal:d.signal})}catch(m){if(clearTimeout(u),m instanceof Error&&m.name==="AbortError")throw new Error(`\u8BED\u96C0 API \u8BF7\u6C42\u8D85\u65F6 (${i}ms): ${e}`);if(c=m instanceof Error?m:new Error(String(m)),l>=s)throw c;continue}if(clearTimeout(u),f.status===429){if(l>=s)throw new Error("\u8BED\u96C0 API \u9650\u6D41\uFF08429\uFF09\uFF0C\u5DF2\u91CD\u8BD5 3 \u6B21\u4ECD\u5931\u8D25\u3002\u8BF7\u7A0D\u540E\u518D\u8BD5\uFF08\u9650\u5236: 5000 \u6B21/\u5C0F\u65F6\uFF09");let m=Math.pow(2,l)*1e3;await new Promise(h=>setTimeout(h,m));continue}if(f.status===401)throw new Error("\u8BED\u96C0 Token \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\u3002\u8BF7\u5728\u8BED\u96C0\u8BBE\u7F6E\u4E2D\u91CD\u65B0\u751F\u6210 Token");if(f.status===404)throw new Error(`\u8BED\u96C0\u6587\u6863\u4E0D\u5B58\u5728\u6216\u65E0\u8BBF\u95EE\u6743\u9650: ${e}`);if(!f.ok)throw new Error(`\u8BED\u96C0 API \u8BF7\u6C42\u5931\u8D25 (HTTP ${f.status}): ${e}`);return(await f.json()).data}throw c}a(Yi,"yuqueFetch");async function Vl(t,e,n,r){let o=Zi(t,r),i=await Yi(t,`/repos/${e}/docs/${n}`,o,r);return{title:i.title,markdown:i.body??"",updatedAt:new Date(i.updated_at).getTime()}}a(Vl,"yuqueDocRead");async function Cw(t,e,n){let r=Zi(t,n);return Yi(t,`/repos/${e}/docs`,r,n)}a(Cw,"yuqueDocList");async function xw(t,e,n){let r=Zi(t,n);return Yi(t,`/repos/${e}/toc`,r,n)}a(xw,"yuqueTocTree");function Tw(t,e){let n=new Map,r=[];for(let o of t){if(r.length=o.depth,o.type==="TITLE"){r.push(Zr(o.title));continue}o.type==="LINK"||!o.slug||o.type==="DOC"&&e.has(o.slug)&&(r.push(Zr(o.title)),n.set(o.slug,r.join("/")),r.pop())}return n}a(Tw,"buildRelativePaths");function Zr(t){return t.replace(/[<>:"/\\|?*\x00-\x1f]/g,"").replace(/\s+/g," ").trim()||"untitled"}a(Zr,"sanitizeDirName");async function _w(t,e){let n=Ul(t),{namespace:r,slug:o,host:i,apiBase:s}=n;if(o){let p=await Vl(s,r,o,e);return{scope:"document",skippedUnsupported:0,nodes:[{id:o,title:p.title,relativePath:Zr(p.title),sourceUrl:`https://${i}/${r}/${o}`,updateTime:p.updatedAt,cachedMarkdown:p.markdown}]}}let[c,l]=await Promise.all([xw(s,r,e).catch(()=>[]),Cw(s,r,e)]),d=new Set(l.map(p=>p.slug)),u=Tw(c,d);return{scope:"space",skippedUnsupported:0,nodes:l.map(p=>({id:p.slug,title:p.title,relativePath:u.get(p.slug)??Zr(p.title),sourceUrl:`https://${i}/${r}/${p.slug}`,updateTime:new Date(p.updated_at).getTime()}))}}a(_w,"crawlYuque");async function Ll(t,e,n,r){try{let o=e.outputFileName??(e.preserveStructure!==!1?t.relativePath:Qi(t.title)),{filePath:i,relPath:s}=Qr(e.outputDir,o);if(!e.force&&await Xi(i,t.updateTime))return{success:!0,action:"skipped",relativePath:s,filePath:i,title:t.title,sourceType:"yuque",sourceUrl:t.sourceUrl};let c=await Yr(i);await Wl(Sw.dirname(i),{recursive:!0});let l,d;if(t.cachedMarkdown!==void 0)l=t.title,d=t.cachedMarkdown;else{let f=await Vl(n,r,t.id,{yuqueToken:e.yuqueToken,fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs});l=f.title,d=f.markdown}let u=d;return bt(u)||(u=Te(l,t.sourceUrl,"yuque")+u),await vw(i,u,"utf8"),{success:!0,action:c?"updated":"created",relativePath:s,filePath:i,title:l,sourceType:"yuque",sourceUrl:t.sourceUrl,contentLength:u.length}}catch(o){return{success:!1,sourceType:"yuque",sourceUrl:t.sourceUrl,title:t.title,error:o instanceof Error?o.message:String(o)}}}a(Ll,"ingestSingleYuqueDoc");async function ql(t){await Wl(t.outputDir,{recursive:!0});let e=Ul(t.url),{namespace:n,apiBase:r}=e,o;try{o=await _w(t.url,{yuqueToken:t.yuqueToken,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs})}catch(c){return{success:!1,sourceType:"yuque",sourceUrl:t.url,error:c instanceof Error?c.message:String(c)}}if(o.scope==="document")return o.nodes.length===0?{success:!1,sourceType:"yuque",sourceUrl:t.url,error:"\u672A\u627E\u5230\u6587\u6863"}:Ll(o.nodes[0],t,r,n);let i=[],s=o.nodes.length;for(let c=0;c<o.nodes.length;c++){let l=o.nodes[c];t.onProgress?.(c,s,l.title);let d=await Ll(l,{...t,outputFileName:void 0},r,n);i.push(d)}return t.onProgress?.(s,s,"\u5B8C\u6210"),{sourceUrl:t.url,scope:o.scope,totalDocs:s,successCount:i.filter(c=>c.success&&c.action!=="skipped").length,failureCount:i.filter(c=>!c.success).length,skippedCount:i.filter(c=>c.action==="skipped").length,skippedUnsupported:0,results:i}}a(ql,"ingestYuque");import{mkdir as Iw,writeFile as Ew,rename as Aw}from"fs/promises";import{existsSync as Dw}from"fs";import Xr from"path";import{createHash as Pw,randomBytes as $w}from"crypto";var Hl=String.raw`!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)`;async function es(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??2e4,i=n.imageDirName??"image",s=Xr.join(Xr.dirname(e),i),c=new Set;for(let p of t.matchAll(new RegExp(Hl,"g"))){let m=Kl(p[2]??"");/^https?:\/\//i.test(m)&&c.add(m)}if(c.size===0)return{markdown:t,imageCount:0,failedCount:0};let l=new Map,d=0,u=0;for(let p of c){let m=Mw(p),h=Xr.join(s,m),k=`${i}/${m}`;if(Dw(h)){l.set(p,k),d++;continue}await Fw(p,h,s,r,o)?(l.set(p,k),d++):(l.set(p,null),u++)}return{markdown:t.replace(new RegExp(Hl,"g"),(p,m,h)=>{let k=Kl(h),w=l.get(k);return w?`![${m}](${w})`:p}),imageCount:d,failedCount:u}}a(es,"localizeMarkdownImages");function Kl(t){let e=t.trim();return e.startsWith("<")&&e.endsWith(">")?e.slice(1,-1):e}a(Kl,"unwrapUrl");function Mw(t){let e=t,n="img",r=jw(t);try{let i=new URL(t);e=i.origin+i.pathname;let c=Xr.basename(decodeURIComponent(i.pathname)).replace(/\.[^.]+$/,"").replace(/[^A-Za-z0-9_-]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"").slice(0,48);c&&(n=c)}catch{}let o=Pw("sha1").update(e).digest("hex").slice(0,8);return`${n}-${o}.${r}`}a(Mw,"imageFilename");function jw(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp|svg)$/i);return n?n[1].toLowerCase():"png"}a(jw,"extFromUrl");async function Fw(t,e,n,r,o){let i=new AbortController,s=setTimeout(()=>i.abort(),o);try{let c=await r(t,{signal:i.signal});if(!c.ok)return g.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u5931\u8D25(\u975E 2xx)",{url:t,status:c.status}),!1;let l=Buffer.from(await c.arrayBuffer());if(l.length===0)return g.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u4E3A\u7A7A",{url:t}),!1;await Iw(n,{recursive:!0});let d=`${e}.${$w(4).toString("hex")}.tmp`;return await Ew(d,l),await Aw(d,e),g.debug("image-localizer","\u56FE\u7247\u5DF2\u672C\u5730\u5316",{dest:e}),!0}catch(c){return g.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u5F02\u5E38",{url:t,error:c instanceof Error?c.message:String(c)}),!1}finally{clearTimeout(s)}}a(Fw,"downloadImage");var Lw=new Set(["docx","pdf","xlsx"]);function rs(t){let e;try{e=new URL(t).hostname.toLowerCase()}catch{throw new Error(`\u65E0\u6548\u7684 URL: ${t}`)}return e.includes("alidocs.dingtalk.com")?"dingtalk-doc":e.includes("yuque.com")||e.includes("yuque.antfin.com")||e.includes("aliyuque.antfin.com")?"yuque":e.includes("wolai.dingtalk.com")?"wolai":"web"}a(rs,"detectSourceType");function Qi(t){return t.trim().replace(/\s+/g,"-").replace(/[<>:"/\\|?*\x00-\x1f]/g,"").replace(/[^\p{L}\p{N}._-]/gu,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"untitled"}a(Qi,"slugify");function Te(t,e,n){let r=X();return["---",`title: "${Ui(t)}"`,`source: "${Ui(e)}"`,`source_type: ${n}`,`ingested: "${r}"`,"---",""].join(`
113
+ `)}a(Te,"buildFrontmatter");function bt(t){return t.startsWith("---")}a(bt,"hasFrontmatter");function rt(t){let e={};if(!t.startsWith("---"))return e;let n=t.indexOf(`
114
+ ---`,3);if(n===-1)return e;for(let r of t.slice(3,n).trim().split(`
115
+ `)){let o=r.indexOf(":");if(o===-1)continue;let i=r.slice(0,o).trim(),s=r.slice(o+1).trim().replace(/^["']|["']$/g,"");i&&s&&(e[i]=s)}return e}a(rt,"parseFrontmatter");async function Xi(t,e){if(e===void 0)return!1;try{let n=await ns(t,"utf8"),r=rt(n);if(!r.ingested)return!1;let o=new Date(r.ingested).getTime();return e<=o}catch{return!1}}a(Xi,"shouldSkip");async function Yr(t){try{return await Nw(t),!0}catch{return!1}}a(Yr,"fileExists");function Qr(t,e){let r=`${e.replace(/\.[^.]+$/,"")}.md`;return{filePath:ye.join(t,r),relPath:r}}a(Qr,"resolveMdPath");async function Gl(t,e){let n=t.extension&&t.extension!=="adoc";try{let r=e.outputFileName??(e.preserveStructure!==!1?t.relativePath:Qi(t.title)),{filePath:o,relPath:i}=Qr(e.outputDir,r);if(!e.force&&await Xi(o,t.updateTime))return{success:!0,action:"skipped",relativePath:i,filePath:o,title:t.title,sourceType:"dingtalk-doc",sourceUrl:t.sourceUrl};let s=await Yr(o);if(await eo(ye.dirname(o),{recursive:!0}),n){let u=ye.join(e.outputDir,".ingest-tmp");await eo(u,{recursive:!0});let f=ye.join(u,`${t.id}.${t.extension}`);await Pl(t.id,f,{runner:e.runner,dwsBinPath:e.dwsBinPath,timeoutMs:e.timeoutMs});let p=t.extension.toLowerCase(),m;Lw.has(p)?(p==="docx"?m=await Vi(f):p==="xlsx"?m=await Hi(f):m=await qi(f),m=Te(t.title,t.sourceUrl,"dingtalk-doc")+m):(m=await ns(f,"utf8"),bt(m)||(m=Te(t.title,t.sourceUrl,"dingtalk-doc")+m));let{unlink:h}=await import("fs/promises");return await h(f).catch(()=>{}),m=(await es(m,o,{fetchImpl:e.fetchImpl})).markdown,await ts(o,m,"utf8"),{success:!0,action:s?"updated":"created",relativePath:i,filePath:o,title:t.title,sourceType:"dingtalk-doc",sourceUrl:t.sourceUrl,contentLength:m.length}}let c=await Dl(t.sourceUrl,{runner:e.runner,dwsBinPath:e.dwsBinPath,timeoutMs:e.timeoutMs}),l=c.title||t.title,d=c.markdown;return bt(d)||(d=Te(l,t.sourceUrl,"dingtalk-doc")+d),d=(await es(d,o,{fetchImpl:e.fetchImpl})).markdown,await ts(o,d,"utf8"),{success:!0,action:s?"updated":"created",relativePath:i,filePath:o,title:l,sourceType:"dingtalk-doc",sourceUrl:t.sourceUrl,contentLength:d.length}}catch(r){return{success:!1,sourceType:"dingtalk-doc",sourceUrl:t.sourceUrl,title:t.title,error:r instanceof Error?r.message:String(r)}}}a(Gl,"ingestSingleDingtalkDoc");async function Jl(t,e){let n=[],r;try{r=await Ow(t,{withFileTypes:!0})}catch{return n}for(let o of r){if(o.name.startsWith(".")||o.name==="node_modules")continue;let i=ye.join(t,o.name);o.isDirectory()?n.push(...await Jl(i,e)):n.push(ye.relative(e,i))}return n}a(Jl,"scanLocalFiles");async function Ww(t,e,n){try{let r=ye.extname(t).toLowerCase(),{filePath:o,relPath:i}=Qr(n,e),s=await Yr(o);await eo(ye.dirname(o),{recursive:!0});let c=ye.basename(t,r),l;return r===".docx"?(l=await Vi(t),l=Te(c,t,"local")+l):r===".pdf"?(l=await qi(t),l=Te(c,t,"local")+l):r===".xlsx"?(l=await Hi(t),l=Te(c,t,"local")+l):(l=await ns(t,"utf8"),bt(l)||(l=Te(c,t,"local")+l)),await ts(o,l,"utf8"),{success:!0,action:s?"updated":"created",relativePath:i,filePath:o,title:c,sourceType:"local",sourceUrl:t,contentLength:l.length}}catch(r){return{success:!1,sourceType:"local",sourceUrl:t,title:ye.basename(t),error:r instanceof Error?r.message:String(r)}}}a(Ww,"ingestLocalFile");function Bw(t){try{return new URL(t),!1}catch{return!0}}a(Bw,"isLocalPath");var zw=new Set([".md",".txt",".text",".rst",".csv",".json",".yaml",".yml",".xml",".html",".htm",".docx",".pdf",".xlsx"]);async function Vt(t){if(await eo(t.outputDir,{recursive:!0}),Bw(t.url)){let i=ye.resolve(t.url),s=await Jl(i,i),c=s.filter(d=>zw.has(ye.extname(d).toLowerCase())),l=[];for(let d=0;d<c.length;d++){let u=c[d];t.onProgress?.(d,c.length,u);let f=await Ww(ye.join(i,u),u,t.outputDir);l.push(f)}return t.onProgress?.(c.length,c.length,"\u5B8C\u6210"),{sourceUrl:i,scope:"space",totalDocs:c.length,successCount:l.filter(d=>d.success).length,failureCount:l.filter(d=>!d.success).length,skippedCount:0,skippedUnsupported:s.length-c.length,results:l}}let e=t.type??rs(t.url);if(e==="wolai")return Ol(t);if(e==="yuque")return ql(t);if(e!=="dingtalk-doc")throw new Error(`\u6682\u4E0D\u652F\u6301 ${e} \u7C7B\u578B\u7684\u5BFC\u5165\uFF0C\u5F53\u524D\u4EC5\u652F\u6301 dingtalk-doc\u3001wolai \u548C yuque\u3002`);let n=await Ml(t.url,{runner:t.runner,dwsBinPath:t.dwsBinPath,timeoutMs:t.timeoutMs});if(n.scope==="document")return n.nodes.length===0?{success:!1,sourceType:"dingtalk-doc",sourceUrl:t.url,error:"\u672A\u627E\u5230\u6587\u6863"}:Gl(n.nodes[0],t);let r=[],o=n.nodes.length;for(let i=0;i<n.nodes.length;i++){let s=n.nodes[i];t.onProgress?.(i,o,s.title);let c=await Gl(s,{...t,outputFileName:void 0});r.push(c)}return t.onProgress?.(o,o,"\u5B8C\u6210"),{sourceUrl:t.url,scope:n.scope,totalDocs:o,successCount:r.filter(i=>i.success&&i.action!=="skipped").length,failureCount:r.filter(i=>!i.success).length,skippedCount:r.filter(i=>i.action==="skipped").length,skippedUnsupported:n.skippedUnsupported,results:r}}a(Vt,"ingest");import Oe from"fs";import ot from"path";var Zl=["concepts","topics","references"];function to(t){let e=[];if(!Oe.existsSync(t))return e;for(let n of Oe.readdirSync(t,{withFileTypes:!0})){let r=ot.join(t,n.name);n.isDirectory()?e.push(...to(r)):n.name.endsWith(".md")&&e.push(r)}return e}a(to,"walkMarkdown");function os(t){let e=t.match(/^---\n([\s\S]*?)\n---/);return e?e[1]:null}a(os,"frontmatterBlock");function is(t,e){let n=t.match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return n?n[1].trim().replace(/^["']|["']$/g,""):null}a(is,"fmField");function Uw(t){let e=t.match(/^sources:\s*\[([^\]]*)\]/m);return e?e[1].split(",").map(n=>n.trim().replace(/^["']|["']$/g,"")).filter(Boolean):[]}a(Uw,"parseSourcesList");function Vw(t,e){let n=os(t);return n?is(n,"title")??e:e}a(Vw,"fmTitle");function Yl(t){return t.replace(/[\[\]()]/g,"\\$&")}a(Yl,"escapeMdLinkText");function qw(t,e){let n=new Map;for(let s of to(e)){let c=ot.relative(e,s),l=Oe.readFileSync(s,"utf8"),d=os(l)??"",u=is(d,"source");if(!u){let f=l.match(/https?:\/\/(?:wolai|[\w.]*dingtalk)[^\s)"']+/);f&&(u=f[0])}n.set(c,{title:is(d,"title")??ot.basename(c,".md"),url:u})}let r=0,o=0,i=0;for(let s of Zl)for(let c of to(ot.join(t,s))){if(ot.basename(c).startsWith("_"))continue;let l=Oe.readFileSync(c,"utf8"),d=os(l);if(!d)continue;let u=Uw(d);if(!u.length)continue;let f=new Set,p=[];for(let w of u){let b=n.get(w)??n.get(w.replace(/^\.\//,""));if(b?.url){if(f.has(b.url))continue;f.add(b.url);let C=Yl(b.title);p.push(`- [${C}](${b.url})`),o++}else i++,p.push(`- ${b?.title??w}`)}if(!p.length)continue;let m=`## Sources
116
+
117
+ ${p.join(`
118
+ `)}
119
+ `,h=l.indexOf("## Sources"),k;if(h!==-1){let b=l.slice(h+10).match(/\n## /);k=b?.index!==void 0?l.slice(0,h)+m+`
120
+ `+l.slice(h+10+b.index+1):l.slice(0,h)+m}else k=l.trimEnd()+`
121
+
122
+ `+m;Oe.writeFileSync(c,k,"utf8"),r++}return{enrichedArticles:r,linksWritten:o,sourcesWithoutUrl:i}}a(qw,"enrichWikiSources");function Hw(t){let e=t.match(/## See Also\s*\n([\s\S]*?)(?=\n## |\n*$)/);if(!e)return[];let n=new Set,r=/\]\(\.\.\/[^/\s)]*\/([^)]+)\.md\)/g,o;for(;(o=r.exec(e[1]??""))!==null;)o[1]&&n.add(o[1]);return[...n]}a(Hw,"extractSeeAlsoSlugs");function Kw(t){let e=new Map;for(let o of Zl){let i=ot.join(t,o);for(let s of to(i)){if(ot.basename(s).startsWith("_"))continue;let c=ot.basename(s,".md");e.set(c,{category:o,title:Vw(Oe.readFileSync(s,"utf8"),c),abs:s})}}let n=new Map;for(let[o,i]of e)n.set(o,new Set(Hw(Oe.readFileSync(i.abs,"utf8"))));let r=0;for(let[o,i]of n){let s=e.get(o);if(s)for(let c of i){let l=e.get(c);if(!l)continue;let d=n.get(c);if(d?.has(o))continue;let u=Oe.readFileSync(l.abs,"utf8"),f=Yl(s.title),p=`- [[${o}|${f}]] ([${f}](../${s.category}/${o}.md))`,m,h=u.indexOf("## See Also");if(h!==-1){let w=u.slice(h).match(/\n## (?!See Also)/);m=w?.index!==void 0?`${u.slice(0,h+w.index)}${p}
123
+ ${u.slice(h+w.index)}`:`${u.trimEnd()}
124
+ ${p}
125
+ `}else{let k=u.indexOf("## Sources");m=k!==-1?`${u.slice(0,k)}## See Also
126
+
127
+ ${p}
128
+
129
+ ${u.slice(k)}`:`${u.trimEnd()}
130
+
131
+ ## See Also
132
+
133
+ ${p}
134
+ `}Oe.writeFileSync(l.abs,m,"utf8"),d?d.add(o):n.set(c,new Set([o])),r++}}return r}a(Kw,"maintainBidirectionalLinks");function Ql(t){let e=qw(t.wikiDir,t.sourceDir),n=Kw(t.wikiDir);return{sources:e,backlinksAdded:n}}a(Ql,"postProcessWiki");var Jw=new Set([".md",".txt",".text",".rst",".csv",".json",".yaml",".yml",".html",".htm",".xml"]),Zw=new Set(["node_modules",".git",".kb",".DS_Store","thumbs.db"]),Ne=["concepts","topics","references"];function sd(t,e){if(!B.existsSync(t))return[];let n=[];for(let r of B.readdirSync(t,{withFileTypes:!0})){if(Zw.has(r.name))continue;let o=V.join(t,r.name);if(r.isDirectory())n.push(...sd(o,e));else if(r.isFile()){let i=V.extname(r.name).toLowerCase();Jw.has(i)&&!r.name.startsWith("_")&&n.push(V.relative(e,o))}}return n}a(sd,"scanSourceFiles");function ad(t){let e=t.startsWith("---")?t.indexOf(`
135
+ ---`,3)+4:0,n=t.slice(e).split(`
136
+ `).filter(o=>o.trim().length>0);return(n.find(o=>!o.startsWith("#")&&!o.startsWith(">"))??n[0]??"").replace(/^\*+|\*+$/g,"").trim().slice(0,120)}a(ad,"extractFallbackSummary");function Yw(t){try{let e=B.readFileSync(t,"utf8"),n=rt(e);if(n.source)return{url:n.source,type:n.source_type??"unknown"}}catch{}}a(Yw,"extractSourceOrigin");function Qw(t,e){let n=t.map((r,o)=>{let i=r.candidateOutputs.map(c=>` - ${c.category}: ${c.absPath}`).join(`
137
+ `),s=r.origin?` \u539F\u59CB\u6765\u6E90: ${r.origin.url} (${r.origin.type})`:null;return[`${o+1}. \u6E90\u6587\u4EF6: ${r.sourceAbsPath}`,...s?[s]:[]," \u5019\u9009\u8F93\u51FA\u8DEF\u5F84\uFF08\u6839\u636E\u4F60\u5224\u5B9A\u7684 category \u9009\u62E9\u5176\u4E00\u5199\u5165\uFF09\uFF1A",i].join(`
138
+ `)});return["\u4F60\u662F\u4E00\u4E2A\u77E5\u8BC6\u5E93\u7F16\u8BD1\u52A9\u624B\u3002\u672C\u6B21\u4EFB\u52A1\u9700\u8981\u6279\u91CF\u7F16\u8BD1\u4EE5\u4E0B\u539F\u59CB\u6587\u6863\u4E3A\u7ED3\u6784\u5316\u7684 Markdown Wiki \u9875\u9762\u3002","\u4F60\u62E5\u6709 Read / Write / Glob \u5DE5\u5177\uFF0C\u8BF7\u6309\u4E0B\u5217\u6B65\u9AA4\u81EA\u4E3B\u5B8C\u6210\uFF1A","","\u3010\u4EFB\u52A1\u6B65\u9AA4\u3011","1. \u5BF9\u6E05\u5355\u4E2D\u7684\u6BCF\u4E00\u4E2A\u6E90\u6587\u4EF6\u4F9D\u6B21\u6267\u884C\uFF1A"," a. \u7528 Read \u5DE5\u5177\u8BFB\u53D6\u6E90\u6587\u4EF6\u5168\u6587"," b. \u6309\u4E0B\u65B9\u3010\u8F93\u51FA\u683C\u5F0F\u534F\u8BAE\u3011\u751F\u6210\u5B8C\u6574\u7684 Markdown \u5185\u5BB9\uFF08\u542B frontmatter\uFF09"," c. \u6839\u636E frontmatter \u4E2D\u7684 category\uFF08concept/topic/reference\uFF09\u9009\u62E9\u5BF9\u5E94\u5019\u9009\u8F93\u51FA\u8DEF\u5F84\uFF1A"," - concept \u2192 concepts/..."," - topic \u2192 topics/..."," - reference \u2192 references/..."," d. \u7528 Write \u5DE5\u5177\u628A\u751F\u6210\u7684 Markdown \u5199\u5165\u9009\u5B9A\u7684\u8F93\u51FA\u8DEF\u5F84\uFF08\u5FC5\u987B\u4ECE\u5019\u9009\u6E05\u5355\u4E2D\u9009\uFF0C\u7EDD\u5BF9\u8DEF\u5F84\uFF09","2. \u6BCF\u5199\u5B8C\u4E00\u7BC7\u7ACB\u5373\u5904\u7406\u4E0B\u4E00\u7BC7\uFF0C\u4E0D\u8981\u7B49\u5168\u90E8\u751F\u6210\u5B8C\u518D\u7EDF\u4E00\u5199\u5165","3. \u5168\u90E8\u5B8C\u6210\u540E\uFF0C\u7528\u4E00\u884C\u4E2D\u6587\u6C47\u62A5\uFF1A\u300C\u6279\u91CF\u7F16\u8BD1\u5B8C\u6210\uFF1AN \u7BC7\u6587\u7AE0\u5DF2\u5199\u5165\u300D","","\u3010\u91CD\u8981\u7EA6\u675F\u3011","- \u4E25\u683C\u6309\u5019\u9009\u8F93\u51FA\u8DEF\u5F84\u5199\u5165\uFF0C\u4E0D\u8981\u65B0\u5EFA\u8DEF\u5F84\u6216\u6539\u6587\u4EF6\u540D","- \u6BCF\u7BC7\u6587\u7AE0\u72EC\u7ACB\u5199\u51FA\uFF1B\u67D0\u6587\u4EF6\u65E0\u6CD5\u7F16\u8BD1\uFF08\u5982\u5185\u5BB9\u4E3A\u7A7A\uFF09\u5219\u8DF3\u8FC7\u7EE7\u7EED\u4E0B\u4E00\u4E2A\uFF0C\u4E0D\u8981\u4E2D\u65AD\u6574\u6279","- \u4E0D\u8981\u4FEE\u6539\u672C\u6B21\u6E05\u5355\u4E4B\u5916\u7684\u4EFB\u4F55\u6587\u4EF6","","\u3010\u8F93\u51FA\u683C\u5F0F\u534F\u8BAE\u3011","\u6BCF\u7BC7\u6587\u7AE0\u5FC5\u987B\u4EE5 YAML frontmatter \u5F00\u5934\uFF0C\u4E25\u683C\u6309\u4EE5\u4E0B\u683C\u5F0F\uFF1A","---","title: <\u9875\u9762\u6807\u9898\uFF0C\u7B80\u6D01\u51C6\u786E>","category: <concept|topic|reference \u4E09\u9009\u4E00\uFF1Aconcept=\u5177\u4F53\u6709\u754C\u6982\u5FF5\uFF0Ctopic=\u5BBD\u6CDB\u4E3B\u9898\uFF0Creference=\u8D44\u6E90\u5217\u8868>","sources: [<\u6E90\u6587\u4EF6\u76F8\u5BF9\u8DEF\u5F84>]","original_sources: [<\u4E0E sources \u4E00\u4E00\u5BF9\u5E94\u7684\u539F\u59CB\u6587\u6863 URL\uFF1B\u6E05\u5355\u4E2D\u6807\u6CE8\u4E86\u300C\u539F\u59CB\u6765\u6E90\u300D\u5219\u586B\u5165\uFF0C\u5426\u5219\u7701\u7565\u6B64\u884C>]",`created: ${e}`,`updated: ${e}`,"tags: [<\u6807\u7B7E1>, <\u6807\u7B7E2>, <\u6807\u7B7E3>]","aliases: [<\u522B\u540D1>, <\u522B\u540D2>]","confidence: <high|medium|low>","summary: <2-3 \u53E5\u6458\u8981\uFF0C\u7528\u4E8E\u7D22\u5F15\u5BFC\u822A\uFF0C\u4E0D\u8D85\u8FC7 150 \u5B57>","---","","\u6B63\u6587\u8981\u6C42\uFF1A","1. \u5F00\u5934\u4E00\u6BB5\u6458\u8981\uFF08> \u5F15\u7528\u683C\u5F0F\uFF09\uFF1A\u8FD9\u662F\u4EC0\u4E48\u3001\u4E3A\u4EC0\u4E48\u91CD\u8981","2. \u7528 ## \u6807\u9898\u5C42\u7EA7\u7EC4\u7EC7\u6838\u5FC3\u77E5\u8BC6\u70B9\uFF08\u5B9A\u4E49\u3001\u6B65\u9AA4\u3001\u6CE8\u610F\u4E8B\u9879\u3001\u793A\u4F8B\u7B49\uFF09","3. \u7EFC\u5408\u63D0\u70BC\u539F\u6587\uFF0C\u4E0D\u8981\u76F4\u63A5\u62F7\u8D1D","4. \u539F\u6587\u542B FAQ \u5219\u4FDD\u6301\u95EE\u7B54\u683C\u5F0F","5. \u5B8C\u6574\u4FDD\u7559\u539F\u6587\u4E2D\u7684\u56FE\u7247/\u5A92\u4F53\u94FE\u63A5\uFF08\u5982 ![...](url)\uFF09\uFF0C\u653E\u7F6E\u5728\u5BF9\u5E94\u77E5\u8BC6\u70B9\u6BB5\u843D\u4E2D\uFF0C\u4E0D\u8981\u4E22\u5F03\u6216\u6539\u5199 URL","6. \u672B\u5C3E\u5305\u542B ## See Also \u533A\u5757\uFF08\u5217\u51FA\u76F8\u5173\u6587\u7AE0\u7684\u76F8\u5BF9\u94FE\u63A5\uFF09","7. \u672B\u5C3E\u5305\u542B ## Sources \u533A\u5757\uFF08\u4F18\u5148\u5217\u51FA original_sources URL \u4F5C\u4E3A\u77E5\u8BC6\u6765\u6E90\u94FE\u63A5\uFF1B\u65E0 URL \u5219\u5217\u672C\u5730\u6E90\u6587\u4EF6\u8DEF\u5F84\uFF09","","\u3010\u5F85\u7F16\u8BD1\u6587\u4EF6\u6E05\u5355\u3011","",...n,"","\u73B0\u5728\u5F00\u59CB\u6279\u91CF\u7F16\u8BD1\u3002"].join(`
139
+ `)}a(Qw,"buildBatchCompilePrompt");function cd(t){let e=[];for(let n of Ne){let r=V.join(t,n);if(B.existsSync(r))for(let o of B.readdirSync(r).filter(i=>i.endsWith(".md")&&!i.startsWith("_"))){let i=B.readFileSync(V.join(r,o),"utf8"),s=rt(i);e.push({relativePath:`${n}/${o}`,title:s.title??V.basename(o,".md"),summary:(s.summary??ad(i)).slice(0,120),tags:(s.tags??"").replace(/[[\]]/g,""),updated:s.updated??ld()})}}return e}a(cd,"collectWikiPageEntries");function ld(){return X().slice(0,10)}a(ld,"today");function Xl(t,e,n,r){let o=cd(t),i=["# \u77E5\u8BC6\u5E93\u7D22\u5F15","",`> \u77E5\u8BC6\u5E93\u300C${e}\u300D\u7531 wiki-compiler \u81EA\u52A8\u7F16\u8BD1\u3002\u5BFC\u822A\uFF1A\u5148\u8BFB\u672C\u6587\u4EF6\u5B9A\u4F4D\u5206\u7C7B\uFF0C\u518D\u8BFB\u5206\u7C7B _index.md\uFF0C\u6700\u540E\u8BFB\u5177\u4F53\u6587\u7AE0\u3002`,"",`Last updated: ${n.slice(0,10)}`,"","## Statistics","",`- Sources: ${r} \u4E2A\u539F\u59CB\u6587\u6863`,`- Articles: ${o.length} \u7BC7 wiki \u6587\u7AE0`,`- Last compiled: ${n}`,"","## Quick Navigation","","- [Concepts](concepts/_index.md)","- [Topics](topics/_index.md)","- [References](references/_index.md)","","## Contents","","| File | Summary | Tags | Updated |","|------|---------|------|---------|"];for(let s of o){let c=`[${V.basename(s.relativePath)}](${s.relativePath})`;i.push(`| ${c} | ${s.summary.replace(/\|/g,"\\|")} | ${s.tags} | ${s.updated} |`)}return i.push(""),B.writeFileSync(V.join(t,"_index.md"),i.join(`
140
+ `),"utf8"),o.length}a(Xl,"generateMasterIndex");function ed(t,e,n){let r=V.join(t,e);if(!B.existsSync(r))return;let o=B.readdirSync(r).filter(c=>c.endsWith(".md")&&!c.startsWith("_"));if(o.length===0)return;let i={concepts:"\u6982\u5FF5",topics:"\u4E3B\u9898",references:"\u53C2\u8003\u8D44\u6E90"},s=[`# ${i[e]}\u7D22\u5F15`,"",`> \u672C\u76EE\u5F55\u5305\u542B\u6240\u6709${i[e]}\u7C7B wiki \u6587\u7AE0\u3002`,"",`Last updated: ${n.slice(0,10)}`,"","## Contents","","| File | Summary | Tags | Updated |","|------|---------|------|---------|"];for(let c of o){let l=B.readFileSync(V.join(r,c),"utf8"),d=rt(l),u=(d.summary??ad(l)).slice(0,120).replace(/\|/g,"\\|"),f=(d.tags??"").replace(/[[\]]/g,"");s.push(`| [${c}](${c}) | ${u} | ${f} | ${d.updated??n.slice(0,10)} |`)}s.push(""),B.writeFileSync(V.join(r,"_index.md"),s.join(`
141
+ `),"utf8")}a(ed,"generateCategoryIndex");function Xw(t){B.mkdirSync(t,{recursive:!0});for(let e of Ne)B.mkdirSync(V.join(t,e),{recursive:!0})}a(Xw,"ensureWikiSubdirs");var ek=20;function vt(t){return V.basename(t).replace(/\.[^.]+$/,".md")}a(vt,"wikiBaseNameOf");function tk(t){let e=B.readFileSync(t,"utf-8");return`sha256:${Gw("sha256").update(e).digest("hex").slice(0,16)}`}a(tk,"fileFingerprint");function td(t,e){return Ne.some(n=>B.existsSync(V.join(t,n,e)))}a(td,"findExistingWikiPage");function nd(t,e){for(let n of Ne){let r=V.join(t,n,e);if(B.existsSync(r))return Math.floor(B.statSync(r).mtimeMs)}return null}a(nd,"wikiPageMtime");var dd=new Set(Ne);function nk(t){let e=t.toLowerCase();return dd.has(e)?e:e==="concept"?"concepts":e==="topic"?"topics":"references"}a(nk,"normalizeCategoryName");function ss(t){try{return B.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}a(ss,"listWikiSubdirs");function rd(t,e){let n=[];for(let i of ss(t)){let s=V.join(t,i,e);B.existsSync(s)&&n.push({abs:s,dir:i,mtime:Math.floor(B.statSync(s).mtimeMs)})}if(n.length===0)return null;n.sort((i,s)=>s.mtime-i.mtime);let r=n[0],o=V.join(t,nk(r.dir),e);V.resolve(r.abs)!==V.resolve(o)&&(B.mkdirSync(V.dirname(o),{recursive:!0}),B.copyFileSync(r.abs,o),B.rmSync(r.abs,{force:!0}));for(let i of n)V.resolve(i.abs)!==V.resolve(o)&&B.rmSync(i.abs,{force:!0});return o}a(rd,"normalizeWikiPage");function rk(t){for(let e of ss(t)){if(dd.has(e))continue;let n=V.join(t,e);try{B.readdirSync(n).length===0&&B.rmdirSync(n)}catch{}}}a(rk,"removeEmptyIllegalDirs");function ok(t,e){let n=[];for(let r=0;r<t.length;r+=e)n.push(t.slice(r,r+e));return n}a(ok,"chunk");function od(t,e,n,r){let o=V.join(t,"log.md");B.existsSync(o)||B.writeFileSync(o,`# Wiki \u7F16\u8BD1\u65E5\u5FD7
142
+
143
+ `,"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(", ");B.appendFileSync(o,`## [${e.slice(0,10)}] ${i}\u7F16\u8BD1 | ${s}
144
+ `,"utf8")}a(od,"appendCompileLog");function ik(t,e,n){for(let r of Ne){let o=V.join(t,r,e);if(!B.existsSync(o))continue;let i=B.readFileSync(o,"utf8");if(i.includes("original_sources:")||!i.startsWith("---"))return;let s=i.indexOf(`
145
+ ---`,3);if(s===-1)return;B.writeFileSync(o,`${i.slice(0,s)}
146
+ original_sources: [${n.url}]${i.slice(s)}`,"utf8");return}}a(ik,"backfillOriginalSources");function sk(t,e){let n=0;for(let r of ss(t)){let o=V.join(t,r);for(let i of B.readdirSync(o).filter(s=>s.endsWith(".md")&&!s.startsWith("_")))e.has(i)||(B.rmSync(V.join(o,i),{force:!0}),n++)}return n}a(sk,"pruneOrphanWikiPages");function id(t,e,n,r){try{let o=Ql({wikiDir:t,sourceDir:e});r?.("indexing",`\u540E\u5904\u7406\uFF1A\u6765\u6E90\u5BCC\u5316 ${o.sources.enrichedArticles} \u7BC7/${o.sources.linksWritten} \u94FE\u63A5\uFF0C\u53CD\u5411\u94FE\u63A5 ${o.backlinksAdded} \u6761`),g.info("kb","wiki \u540E\u5904\u7406\u5B8C\u6210",{collection:n,...o.sources,backlinksAdded:o.backlinksAdded})}catch(o){let i=o instanceof Error?o.message:String(o);g.warn("kb","wiki \u540E\u5904\u7406\u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7)",{collection:n,error:i})}}a(id,"runPostProcess");async function ud(t){let{configDir:e,entry:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,onProgress:c}=t,l=Math.max(1,t.batchSize??ek),d=t.forceFull===!0,u=Ge(e,n),f=At(e,n),p=X(),m=await Ut(e,n),h=m?.fileHashes??{},k={...m,collection:n,sourceDir:u,wikiDir:f,status:"compiling",startedAt:p,lastError:void 0};c?.("scanning",u);let w=sd(u,u),b={};for(let W of w)b[W]=tk(V.join(u,W));if(await kt(e,n,{...k,fileCount:w.length,compiledCount:0}),w.length===0){let W=X();return c?.("skipped","\u6E90\u76EE\u5F55\u4E3A\u7A7A"),await kt(e,n,{...k,status:"done",finishedAt:W,fileCount:0,compiledCount:0,sourceHash:await Fe(u),fileHashes:{}}),g.warn("kb","\u6E90\u76EE\u5F55\u65E0\u53EF\u7F16\u8BD1\u6587\u4EF6",{collection:n,src:u}),{collection:n,startedAt:p,finishedAt:W,sourceFileCount:0,articleCount:0,status:"done"}}Xw(f);let C=new Set(w.map(vt)),S=sk(f,C);for(let W of C)rd(f,W);rk(f);let v=w.filter(W=>d||!td(f,vt(W))?!0:h[W]!==b[W]),x=new Set(v.filter(W=>td(f,vt(W)))),_=w.length-v.length,R=d?"full":"incremental",T=d?"\u5168\u91CF":"\u589E\u91CF";if(v.length===0){c?.("indexing");let W=X();id(f,u,n,c);let pe=Xl(f,n,W,w.length);for(let _n of Ne)ed(f,_n,W);let Rt=X(),ze={collection:n,startedAt:p,finishedAt:Rt,sourceFileCount:w.length,articleCount:pe,status:"done"};return B.writeFileSync(zo(e,n),JSON.stringify(ze,null,2)+`
147
+ `,"utf8"),await kt(e,n,{...k,status:"done",finishedAt:Rt,fileCount:w.length,compiledCount:pe,sourceHash:await Fe(u),fileHashes:b}),od(f,W,R,{created:0,updated:0,skipped:_,failed:0,pruned:S}),c?.("done",`${T}\u7F16\u8BD1\uFF1A\u5168\u90E8\u547D\u4E2D\u7F13\u5B58\uFF0C${_} \u8DF3\u8FC7\uFF08${pe} \u7BC7\u6587\u7AE0\uFF09`),g.info("kb","\u7F16\u8BD1\u5B8C\u6210(\u65E0\u53D8\u66F4)",{collection:n,mode:R,sourceFiles:w.length,skipped:_,articles:pe,pruned:S}),ze}let M=s??180*1e3,E=ok(v,l),$=new Set,N=new Set,H="",U=[];c?.("compiling",`${T}\u7F16\u8BD1 ${v.length}/${w.length} \u4E2A\u6E90\u6587\u4EF6\uFF0C\u5206 ${E.length} \u6279`);for(let W=0;W<E.length;W++){let pe=E[W];c?.("compiling",`\u6279 ${W+1}/${E.length}\uFF08${pe.length} \u6587\u4EF6\uFF09`);let Rt=pe.map(Z=>{let Ie=vt(Z);return{sourceAbsPath:V.join(u,Z),wikiBaseName:Ie,candidateOutputs:Ne.map(Jt=>({category:Jt,absPath:V.join(f,Jt,Ie)})),origin:Yw(V.join(u,Z))}}),ze=Qw(Rt,ld()),_n=new Map;for(let Z of pe)_n.set(Z,nd(f,vt(Z)));try{let Z=await we(ze,{...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},workDir:f,timeoutMs:M*pe.length,adapterOptions:{allowedTools:["Read","Write","Glob"]}});H=Z.response??H,Z.events.some(Ie=>Ie.type==="error")&&g.warn("kb","\u7F16\u8BD1\u8FC7\u7A0B\u51FA\u73B0 error \u4E8B\u4EF6",{collection:n,batch:W+1})}catch(Z){let Ie=Z instanceof Error?Z.message:String(Z);U.push(`\u6279 ${W+1}: ${Ie}`),g.warn("kb","\u6279\u6B21\u7F16\u8BD1\u5931\u8D25",{collection:n,batch:W+1,error:Ie})}for(let Z of pe)rd(f,vt(Z));for(let Z of pe){let Ie=nd(f,vt(Z)),Jt=_n.get(Z)??null;Ie!==null&&(Jt===null||Ie!==Jt)?$.add(Z):N.add(Z)}for(let Z of Rt)Z.origin&&ik(f,Z.wikiBaseName,Z.origin);await kt(e,n,{...k,fileCount:w.length,compiledCount:$.size})}if(cd(f).length===0){let W=X(),pe=H.replace(/\s+/g," ").trim().slice(0,300),ze=`coding agent \u672A\u4EA7\u51FA\u4EFB\u4F55 wiki \u6587\u7AE0(\u53EF\u80FD\u6A21\u578B\u672A\u6388\u6743/\u6743\u9650\u4E0D\u8DB3/\u8D85\u65F6)\u3002${U.length>0?`\u6279\u6B21\u9519\u8BEF: ${U.join("; ")}\u3002`:""}agent \u8FD4\u56DE: ${pe||"(\u7A7A)"}`;return c?.("failed",ze),await kt(e,n,{...k,status:"failed",finishedAt:W,fileCount:w.length,compiledCount:0,lastError:ze}),g.error("kb","\u7F16\u8BD1\u672A\u4EA7\u51FA\u6587\u7AE0",{collection:n,response:pe}),{collection:n,startedAt:p,finishedAt:W,sourceFileCount:w.length,articleCount:0,status:"failed",error:ze}}c?.("indexing");let ee=X();id(f,u,n,c);let Q=Xl(f,n,ee,w.length);for(let W of Ne)ed(f,W,ee);let We={};for(let W of w)N.has(W)||(We[W]=b[W]);let ne=N.size===0?await Fe(u):`${await Fe(u)}:partial`,le=0,me=0;for(let W of $)x.has(W)?me++:le++;let Be=X(),Ks={collection:n,startedAt:p,finishedAt:Be,sourceFileCount:w.length,articleCount:Q,status:"done"};return B.writeFileSync(zo(e,n),JSON.stringify(Ks,null,2)+`
148
+ `,"utf8"),await kt(e,n,{...k,status:"done",finishedAt:Be,fileCount:w.length,compiledCount:Q,sourceHash:ne,fileHashes:We}),od(f,ee,R,{created:le,updated:me,skipped:_,failed:N.size,pruned:S}),c?.("done",`${T}\u7F16\u8BD1\uFF1A${le} \u65B0\u5EFA, ${me} \u66F4\u65B0, ${_} \u8DF3\u8FC7${N.size>0?`, ${N.size} \u5931\u8D25`:""}`),g.info("kb","\u7F16\u8BD1\u5B8C\u6210",{collection:n,mode:R,sourceFiles:w.length,created:le,updated:me,skipped:_,failed:N.size,pruned:S,articles:Q}),Ks}a(ud,"compileWiki");async function ak(t,e,n){let r=[];for(let o of e){let i=Ge(t,o.collection);n?.({collection:o.collection,index:0,total:0,phase:"ingest",detail:o.source});try{let s=await Vt({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`;g.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?(g.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})):(g.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);g.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(ak,"ingestRemoteSources");async function St(t){let{configDir:e,collections:n,remoteSources:r,force:o,agent:i,configPath:s,model:c,timeoutMsPerFile:l,batchSize:d,onProgress:u}=t;r&&r.length>0&&await ak(e,r,u);let f=[],p=n.length;for(let[m,h]of n.entries()){let k=await Fe(Ge(e,h)),w=await Ut(e,h);if(!o&&!Br(w,k)){u?.({collection:h,index:m,total:p,phase:"skipped",detail:"\u6E90\u672A\u53D8\u66F4"}),f.push({collection:h,action:"skipped"});continue}let b=await ud({configDir:e,entry:h,...i?{agent:i}:{},...s?{configPath:s}:{},...c?{model:c}:{},...l?{timeoutMsPerFile:l}:{},...d?{batchSize:d}:{},...o?{forceFull:!0}:{},onProgress:a(((C,S)=>u?.({collection:h,index:m,total:p,phase:C,detail:S})),"onProgress")});b.status==="failed"?f.push({collection:h,action:"failed",report:b,...b.error?{error:b.error}:{}}):f.push({collection:h,action:"compiled",report:b})}return f}a(St,"refreshKnowledgeBases");var as=3e5,no=class{static{a(this,"KbAutoRefresher")}options;timer=null;inFlight=!1;stopped=!1;constructor(e){this.options=e}start(){this.stopped||(g.info("kb-watcher","\u542F\u52A8\u81EA\u52A8\u5237\u65B0",{intervalMs:as}),this.scheduleNext(0))}stop(){this.stopped=!0,this.timer&&(clearTimeout(this.timer),this.timer=null),g.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(as);return}this.inFlight=!0;try{let{collections:e,remoteSources:n}=await this.options.resolveCollections();if(e.length===0)g.debug("kb-watcher","\u65E0 collection,\u8DF3\u8FC7\u672C\u8F6E");else{let r=await St({configDir:this.options.configDir,collections:e,remoteSources:n,...this.options.agent?{agent:this.options.agent}:{},...this.options.configPath?{configPath:this.options.configPath}:{},...this.options.model?{model:this.options.model}:{}}),o=r.filter(s=>s.action==="compiled").length,i=r.filter(s=>s.action==="failed").length;if(o>0||i>0){g.info("kb-watcher","\u5237\u65B0\u5B8C\u6210",{total:r.length,compiled:o,skipped:r.length-o-i,failed:i});for(let s of r.filter(c=>c.action==="failed"))g.warn("kb-watcher","\u7F16\u8BD1\u5931\u8D25",{collection:s.collection,error:s.error})}else g.debug("kb-watcher","\u65E0\u53D8\u66F4",{total:r.length})}}catch(e){g.error("kb-watcher","\u81EA\u52A8\u5237\u65B0\u5F02\u5E38",{error:e instanceof Error?e.message:String(e)})}finally{this.inFlight=!1,this.scheduleNext(as)}}}};import ck from"path";async function vn(t){let e=new je(t.rolesDir),n=xe(t.configDir,t.envSource);if(n?.roles){let i=ck.resolve(t.configDir,"profile");e.loadFromProfile(n.roles,i)}else await e.loadAll();let r=new Set,o=new Map;for(let i of e.list())for(let s of i.knowledge_scope?.kb_collections??[])typeof s=="string"?r.add(s):(r.add(s.collection),o.set(s.collection,s));return{collections:[...r],remoteSources:[...o.values()]}}a(vn,"collectKbCollections");async function cs(t){let{settings:e,force:n,onProgress:r}=t,{collections:o,remoteSources:i}=await vn(e);if(o.length===0)return{collections:o,results:[],skippedReason:"no-collections"};let s=await Ot(e),c=s.configuredAgent;if(!c)return g.warn("kb","engine \u4E3A llm_only,\u65E0 coding agent \u53EF\u7528,\u8DF3\u8FC7 KB \u7F16\u8BD1",{collections:o,engine:s.configuredEngine}),{collections:o,results:[],skippedReason:"llm_only"};let l=await St({configDir:e.configDir,collections:o,remoteSources:i,...n?{force:n}:{},agent:c,...e.agent.model?{model:e.agent.model}:{},configPath:Ae(e.configDir),...r?{onProgress:r}:{}});return{collections:o,results:l}}a(cs,"setupKnowledgeBases");import ls from"path";async function fd(t,e){let n=await Ut(t,e),r=await Fe(Ge(t,e));return{collection:e,state:n,currentHash:r,sourceChanged:Br(n,r)}}a(fd,"getKbStatus");async function lk(t){return vn(t)}a(lk,"resolveAllCollections");async function ro(t){let n=(await Ot(t)).configuredAgent;return{...n?{agent:n}:{},...t.agent.model?{model:t.agent.model}:{},configPath:Ae(t.configDir)}}a(ro,"resolveCompileAgent");function oo(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(oo,"printKbProgress");function io(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(io,"printKbSummary");async function ds(t,e){let n=await lk(e);return t.length>0?{collections:t,remoteSources:n.remoteSources.filter(r=>t.includes(r.collection))}:n.collections.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(ds,"resolveTargets");async function dk(t,e){let n=await fe(e.config),r=await ds(t,n);if(!r)return;let o=await St({configDir:n.configDir,collections:r.collections,remoteSources:r.remoteSources,force:e.full??!1,...await ro(n),onProgress:oo});io({collections:r.collections,results:o})}a(dk,"runKbCompileCommand");async function P$(t,e){let n=await fe(e.config),r=await ds(t,n);if(!r)return;let o=await St({configDir:n.configDir,collections:r.collections,remoteSources:r.remoteSources,...await ro(n),onProgress:oo});io({collections:r.collections,results:o})}a(P$,"runKbUpdateCommand");async function $$(t,e){let n=await fe(e.config),r=await ds(t,n);if(r){console.log(`
149
+ \u77E5\u8BC6\u5E93\u72B6\u6001:`);for(let o of r.collections){let i=await fd(n.configDir,o),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}: ${s}${l}${d} ${c}`),i.state?.lastError&&console.log(` \u21B3 \u9519\u8BEF: ${i.state.lastError}`)}}}a($$,"runKbStatusCommand");function uk(t){return"totalDocs"in t}a(uk,"isIngestReport");async function M$(t,e){let n=ls.dirname(ls.resolve(e.config)),r=e.output??ls.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 Vt({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(uk(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(`
150
+ \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(`
151
+ \u2713 ${c}: ${s.title??s.relativePath}`),s.action!=="skipped"&&console.log(` \u6587\u4EF6: ${s.filePath}`)}else console.error(`
152
+ \u2717 \u5BFC\u5165\u5931\u8D25: ${s.error}`),process.exit(1);e.compile&&(console.log(`
153
+ \u89E6\u53D1\u7F16\u8BD1...`),await dk([],{config:e.config}))}a(M$,"runKbIngestCommand");import{watch as fk}from"fs";function pk(t){return t?t===".env"||t.endsWith(".yml")||t.endsWith(".yaml"):!0}a(pk,"isRelevantFile");function pd(t){return JSON.stringify({raw:t.raw,env:t.envSource})}a(pd,"snapshot");function gd(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??(()=>fe(t.configPath)),o=t.debounceMs??300,i=a(async()=>{let p=await r(),m=pd(n.current());n.applyReload(p);let h=pd(n.current())!==m;return await t.onReloaded?.(p),h},"runReloadOnce"),s=null,c=!1,l=a(async()=>{if(s)return c=!0,s;let p=(async()=>{try{let m=await i();for(;c;)c=!1,m=await i();return m}finally{s=null}})();return s=p,p},"refresh"),d=null,u=a(()=>{d&&clearTimeout(d),d=setTimeout(()=>{d=null,l().then(p=>{p&&g.info("config-watcher","\u914D\u7F6E\u5DF2\u70ED\u66F4(env/config),\u65E0\u9700\u91CD\u542F\u5373\u751F\u6548",{})}).catch(p=>{g.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=fk(e,{persistent:!1},(p,m)=>{pk(m)&&u()})}catch(p){g.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(gd,"startConfigHotReload");function md(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(md,"getByPath");var so=class{static{a(this,"InMemoryConfigCenter")}settings;listeners=new Map;workflows=new Map;constructor(e){this.settings=e}getConfig(e){return md(this.settings.raw,e)}getEnv(e){let n=this.settings.envSource[e];if(n!==void 0)return ur(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){g.warn("config-center","listener \u629B\u9519",{nsPath:o,error:l instanceof Error?l.message:String(l)})}}current(){return this.settings}getToolkitConfig(e){return this.workflows.get(e)?.toolkitConfig??{}}getHandlerConfig(e,n){return this.workflows.get(e)?.handlerConfigs.get(n)}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 md(n.raw,i);if(o==="env"){let s=n.envSource[i];return s===void 0?void 0:ur(s)}}};import{readdirSync as gk}from"fs";function yd(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(yd,"collectHandlerConfigs");async function pM(t,e={}){let n=await fe(t);Si(n.envSource);let r=hd.resolve(n.configDir,n.agent.trace_dir);oa(r);let o,i=xe(n.configDir,n.envSource);if(n.roles.enabled){let b=new je(n.rolesDir);if(i?.roles){let C=hd.resolve(n.configDir,"profile"),S=!1;try{S=gk(n.rolesDir).some(x=>x.endsWith(".role.yml"))}catch{}if(S)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`);b.loadFromProfile(i.roles,C)}else await b.loadAll();o=new ir(b)}let s=ti(),c=new et,l=new so(n),d=[],u=new Map,f={},p={};for(let b of n.workflowEntries){let C=await Me(b.templatePath,{envSource:n.envSource});i?.workflows?.[b.id]&&mn(b.id,i.workflows[b.id],C),u.set(b.id,C);let v=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??C.tracker;v&&(f[`workflow:${b.id}.tracker`]={base_id:v.base_id,table_id:v.table_id},Object.assign(p,xc(b.id,C,{base_id:v.base_id,table_id:v.table_id})))}for(let b of n.workflowEntries){let C=u.get(b.id),v=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??C.tracker;if(!v)throw new Error(`\u5DE5\u4F5C\u6D41 ${b.id} \u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09`);let x=pr(n,b,v),_=new Dr(x.tracker);await _.init();let R=l.scope(b.id);l.applyWorkflow(b.id,C.toolkitConfig??{},yd(C));let M=new rr().createAll(C.eventSources,{pollIntervalMs:x.polling.interval_ms,configDir:x.configDir,tableRefs:f,configRefs:p,globalVars:c,configScope:R}),E=new Wr({settings:x,workflow:C,tracker:_,eventBindings:M,roleResolver:o,toolkitRegistry:s,onRunEvent:e.onRunEvent,globalVars:c,configScope:R,configRefs:p});d.push({id:b.id,settings:x,workflow:C,tracker:_,orchestrator:E,entry:b}),g.info("app","\u5DE5\u4F5C\u6D41\u7EC4\u88C5\u5B8C\u6210",{id:b.id,workflow:C.meta.name,domain:C.meta.domain,steps:C.orderedStepIds,eventSources:M.map($=>$.source.name)})}g.info("app","\u5E94\u7528\u7EC4\u88C5\u5B8C\u6210",{mode:n.multiWorkflow?"multi-workflow":"single-workflow",workflowCount:d.length,rolesEnabled:n.roles.enabled,toolkitsLoaded:s.length});let m=await ro(n),h=m.agent?new no({configDir:n.configDir,resolveCollections:a(()=>vn(n),"resolveCollections"),...m}):null;m.agent||g.warn("app","\u5F53\u524D engine \u65E0\u53EF\u7528 coding agent(\u5982 llm_only),\u8DF3\u8FC7 KB \u81EA\u52A8\u5237\u65B0");let k=d[0],w;return{settings:n,instances:d,workflow:k.workflow,tracker:k.tracker,orchestrator:k.orchestrator,start:a(async()=>{h?.start(),w=gd({watchDir:n.configDir,configCenter:l,reload:a(()=>fe(t),"reload"),onReloaded:a(async b=>{Si(b.envSource),Nt();let C=xe(n.configDir,b.envSource);for(let S of d)try{let v=await Me(S.entry.templatePath,{envSource:b.envSource});C?.workflows?.[S.id]&&mn(S.id,C.workflows[S.id],v),(JSON.stringify(v.steps)!==JSON.stringify(S.workflow.steps)||JSON.stringify(v.edges??null)!==JSON.stringify(S.workflow.edges??null))&&g.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:S.id}),l.applyWorkflow(S.id,v.toolkitConfig??{},yd(v))}catch(v){g.warn("app","workflow \u91CD\u89E3\u6790\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{id:S.id,error:v instanceof Error?v.message:String(v)})}},"onReloaded")}),await Promise.all(d.map(b=>b.orchestrator.start()))},"start"),stop:a(async()=>{w?.stop(),w=void 0,h?.stop(),await Promise.all(d.map(b=>b.orchestrator.stop()))},"stop")}}a(pM,"createApp");import{EventEmitter as mk}from"events";import{randomUUID as hk}from"crypto";var us=class extends mk{static{a(this,"RelayAgentSession")}transport;requestId;projectId;agent;workDir;permissionMode;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.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}:{}})})}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)}},fs=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??(()=>hk()),this.landArtifacts=n.landArtifacts}async run(e,n){let r=n?.adapterOptions?.permissionMode==="bypassPermissions"?"bypassPermissions":void 0,o=new us(this.transport,{requestId:this.requestIdFactory(),projectId:this.projectId,agent:this.agent,sessionId:n?.sessionId,workDir:n?.workDir,...r?{permissionMode:r}:{}}),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 wM(t,e){return new fs(t,e)}a(wM,"createRelayExecutor");var ps=class{static{a(this,"LocalSpawnExecutor")}kind="local-spawn";defaults;runner;constructor(e={},n=On){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 SM(t,e){return new ps(t??{},e??On)}a(SM,"createLocalSpawnExecutor");import zb from"path";import{readFile as yk,access as wk,stat as kk}from"fs/promises";import it from"path";import bk from"yaml";import{input as vk}from"@inquirer/prompts";async function wd(t){let e=await he(t.configPath),n=it.dirname(e);try{await kk(e)}catch{throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}
154
+
155
+ \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 yk(e,"utf8"),o=bk.parse(r);if(!y(o))throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548");let i=typeof o.scene=="string"?o.scene:"";if(!i)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 s=y(o.workflow)&&typeof o.workflow.template=="string"?o.workflow.template:typeof o.workflowTemplatePath=="string"?o.workflowTemplatePath:"./workflow.yml",c=y(o.workflow)&&typeof o.workflow.recipe_dir=="string"?o.workflow.recipe_dir:"./recipes",l=it.resolve(n,s),d=it.resolve(n,c),u=y(o.agent)?o.agent:void 0,f=ln.default("claude").parse(u?.engine),p=pt(f),m=y(o.agent)&&typeof o.agent.timeout_ms=="number"?o.agent.timeout_ms:6e5,h="";t.yes||(console.log(`
156
+ \u{1F4CB} \u5F53\u524D\u573A\u666F\u63CF\u8FF0:`),console.log(` ${i}
157
+ `),h=await vk({message:"\u8FFD\u52A0\u8865\u5145\u9700\u6C42\uFF08\u76F4\u63A5\u56DE\u8F66\u8DF3\u8FC7\uFF09",default:""}),h=h.trim());let k=h?`${i}
158
+
159
+ \u8865\u5145\u9700\u6C42\uFF1A${h}`:i,w=await Sk(n);return{scene:i,supplements:h,fullRequirement:k,workDir:n,projectRoot:w,agentType:p,recipeDir:d,workflowPath:l,workflowRelPath:s,recipeDirRelPath:c,agentTimeoutMs:m}}a(wd,"collectDesignContext");async function Sk(t){let e=it.resolve(t),n=it.parse(e).root;for(;e!==n;)try{return await wk(it.join(e,"package.json")),e}catch{e=it.dirname(e)}return it.resolve(t)}a(Sk,"findProjectRoot");import lo from"path";import{readdirSync as _k,readFileSync as gs}from"fs";import Ik from"yaml";var kd=`## \u89C6\u56FE\u914D\u7F6E\u8BF4\u660E
160
+
161
+ \u4F60\u9700\u8981\u751F\u6210 \`views.yml\`\uFF08YAML \u6570\u7EC4\uFF09\uFF0Csetup \u9636\u6BB5\u4F1A\u636E\u6B64\u914D\u7F6E AI \u8868\u683C\u89C6\u56FE\u3002
162
+ \u6587\u4EF6\u5934\u90E8\u52A0\u6CE8\u91CA\uFF1A\`# \u4E2D\u95F4\u4EA7\u7269 \u2014 \u6700\u7EC8\u914D\u7F6E\u4EE5 aitable-workflow.config.yml \u7684 tracker.views \u4E3A\u51C6\`
163
+
164
+ \u6BCF\u4E2A\u89C6\u56FE\u5B9A\u4E49\uFF1A
165
+ \`\`\`yaml
166
+ - id: string # \u552F\u4E00\u6807\u8BC6\uFF08snake_case\uFF09\uFF0C\u5E42\u7B49\u7528
167
+ type: string # Grid | FormDesigner | Kanban | Calendar | Gallery | Gantt
168
+ name: string # \u663E\u793A\u540D\u79F0
169
+ field_order: [] # (Grid \u4E13\u7528) \u5168\u90E8\u5B57\u6BB5\u540D\u6309\u987A\u5E8F\u6392\u5217
170
+ visible_fields: [] # (\u975E Grid) \u53EF\u89C1\u5B57\u6BB5\uFF0C\u672A\u5217\u5165\u7684\u9690\u85CF
171
+ group_by: string # (Kanban/Gallery) \u5206\u7EC4\u5B57\u6BB5\u540D
172
+ date_field: string # (Calendar/Gantt) \u65E5\u671F\u5B57\u6BB5\u540D
173
+ description: string # \u7528\u9014\u8BF4\u660E
174
+ \`\`\`
175
+
176
+ \u5F53\u524D\u7A33\u5B9A\u843D\u5730\u80FD\u529B\u4EE5 \`default_grid\` \u7684\u5B57\u6BB5\u987A\u5E8F\u4E3A\u51C6\u3002\u82E5\u7528\u6237\u63D0\u5230\u201C\u8868\u5355\u63D0\u4EA4 / \u8868\u5355\u586B\u5199 / \u586B\u8868 / \u5F55\u5165\u8868\u5355\u201D\u7B49\u5165\u53E3\uFF0CFormDesigner \u662F\u6D41\u7A0B\u5165\u53E3\u89C6\u56FE\uFF0C\u5FC5\u987B\u751F\u6210 \`input_form\`\uFF1B\u5176\u4ED6\u989D\u5916\u89C6\u56FE\uFF08Kanban/Calendar/Gallery/Gantt\uFF09\u53EA\u6709\u5728\u7528\u6237\u660E\u786E\u8981\u6C42\u4E14\u573A\u666F\u786E\u5B9E\u9700\u8981\u65F6\u518D\u751F\u6210\u3002`,bd=`## \u89C6\u56FE\u751F\u6210\u89C4\u5219
177
+
178
+ ### \u786C\u6027\u89C4\u5219
179
+
180
+ 1. **\u5FC5\u987B\u751F\u6210 default_grid** (id: "default_grid", type: Grid)
181
+ - field_order \u6309 "\u7528\u6237\u8F93\u5165 \u2192 AI\u8F93\u51FA \u2192 \u7CFB\u7EDF\u5B57\u6BB5" \u6392\u5217
182
+ - \u82E5\u7701\u7565 field_order\uFF0Csetup \u4F1A\u81EA\u52A8\u515C\u5E95\u6392\u5E8F
183
+
184
+ ### \u8F6F\u6027\u6307\u5F15
185
+
186
+ 2. **\u8868\u5355\u5165\u53E3\u89C6\u56FE** \u2014 \u5982\u679C\u7528\u6237\u63D0\u5230\u201C\u8868\u5355\u63D0\u4EA4 / \u8868\u5355\u586B\u5199 / \u586B\u8868 / \u5F55\u5165\u8868\u5355\u201D\uFF0C\u5FC5\u987B\u751F\u6210 input_form
187
+ - id: "input_form"
188
+ - type: FormDesigner
189
+ - name: \u4F7F\u7528\u4E1A\u52A1\u8BED\u4E49\uFF0C\u5982 "\u4FE1\u606F\u63D0\u4EA4\u8868\u5355"\u3001"\u7533\u8BF7\u63D0\u4EA4\u8868\u5355"
190
+ - visible_fields: \u9700\u8981\u7528\u6237\u586B\u5199\u7684\u5B57\u6BB5\uFF08input_mapping \u4E2D\u4F46\u4E0D\u5728\u4EFB\u4F55 output_mapping \u4E2D\u7684\uFF09+ \u72B6\u6001\u5B57\u6BB5
191
+ - \u72B6\u6001\u5B57\u6BB5\u5FC5\u987B\u5305\u542B\u5728 visible_fields \u4E2D\uFF0Cdescription \u8BF4\u660E\u63D0\u4EA4\u65F6\u5C06\u72B6\u6001\u8BBE\u4E3A tracker.states.initial\uFF08\u901A\u5E38\u4E3A\u201C\u5F85\u5904\u7406\u201D\uFF09
192
+ - \u4E0D\u8981\u628A\u201C\u5F53\u524D\u6B65\u9AA4\u201D\u201C\u4E8B\u4EF6\u65E5\u5FD7\u201D\u7B49\u8FD0\u884C\u65F6\u5B57\u6BB5\u653E\u5165\u8868\u5355
193
+
194
+ 3. **\u6B65\u9AA4\u89C6\u56FE** \u2014 \u9ED8\u8BA4\u7531 Run \u9636\u6BB5 UI \u5448\u73B0\u4EBA\u5DE5\u786E\u8BA4\uFF0C\u4E0D\u8981\u4E3A\u4E86 needs_human \u81EA\u52A8\u751F\u6210 FormDesigner
195
+ - visible_fields: \u8BE5\u6B65\u9AA4 input_mapping + output_mapping \u5B57\u6BB5
196
+
197
+ 4. **\u5176\u4ED6\u89C6\u56FE** \u2014 \u6309\u573A\u666F\u81EA\u884C\u5224\u65AD\u662F\u5426\u9700\u8981 Kanban/Calendar/Gallery/Gantt
198
+ - \u4E0D\u8981\u786C\u5957\u89C4\u5219\uFF0C\u6839\u636E\u4E1A\u52A1\u573A\u666F\u5408\u7406\u51B3\u7B56
199
+
200
+ ### \u547D\u540D\u4E0E ID
201
+
202
+ - id: snake_case\uFF0C\u5982 "input_form"\u3001"status_kanban"\u3001"step_draft_email"
203
+ - \u5176\u4ED6\u89C6\u56FE\u76F4\u63A5\u7528\u529F\u80FD\u540D
204
+
205
+ ### \u5B57\u6BB5\u5F15\u7528
206
+
207
+ - \u89C6\u56FE**\u53EA\u80FD\u5F15\u7528**\u5DF2\u5B58\u5728\u7684\u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u5141\u8BB8\u521B\u9020\u65B0\u5B57\u6BB5
208
+ - \u5408\u6CD5\u5B57\u6BB5\u6765\u6E90\uFF08\u4EC5\u9650\u4EE5\u4E0B\u4E09\u7C7B\uFF09\uFF1A
209
+ 1. workflow steps \u7684 input_mapping / output_mapping \u7684 value
210
+ 2. field_definitions \u4E2D\u58F0\u660E\u7684 name
211
+ 3. \u7CFB\u7EDF\u9AA8\u67B6\u5B57\u6BB5\uFF1A\u201C\u6807\u9898\u201D\u201C\u72B6\u6001\u201D\u201C\u5F53\u524D\u6B65\u9AA4\u201D\u201C\u5904\u7406\u4EBA\u201D\u201C\u4E8B\u4EF6\u65E5\u5FD7\u201D
212
+ - \u5982\u679C\u89C6\u56FE\u9700\u8981\u67D0\u4E2A\u5B57\u6BB5\u4F46\u5B83\u4E0D\u5728\u4E0A\u8FF0\u6765\u6E90\u4E2D\uFF0C\u5E94\u5148\u5728 workflow \u7684 steps \u6216 field_definitions \u4E2D\u58F0\u660E\uFF0C\u800C\u4E0D\u662F\u76F4\u63A5\u5728\u89C6\u56FE\u4E2D\u4F7F\u7528
213
+ - field_order \u5217\u51FA\u6240\u6709\u5B57\u6BB5\uFF1Bvisible_fields \u53EA\u5217\u9700\u8981\u5C55\u793A\u7684
214
+ `,vd=`### views.yml \u793A\u4F8B
215
+ \`\`\`yaml
216
+ # \u4E2D\u95F4\u4EA7\u7269 \u2014 \u6700\u7EC8\u914D\u7F6E\u4EE5 aitable-workflow.config.yml \u7684 tracker.views \u4E3A\u51C6
217
+ - id: default_grid
218
+ type: Grid
219
+ name: "\u8868\u683C"
220
+ field_order: ["\u6807\u9898", "\u95EE\u9898\u63CF\u8FF0", "\u95EE\u9898\u7C7B\u578B", "\u7D27\u6025\u7A0B\u5EA6", "\u56DE\u590D\u5185\u5BB9", "\u72B6\u6001", "\u5F53\u524D\u6B65\u9AA4", "\u5904\u7406\u4EBA", "\u4E8B\u4EF6\u65E5\u5FD7"]
221
+ \`\`\``;import{z as ao}from"zod";function Rd(t=De){return t.map(e=>{let n=Ck(e);return{name:e.name,description:e.description??"",config:{schema:ao.toJSONSchema(e.configSchema)},methods:Rk(e),permissions:n,readOnly:n.length===0}})}a(Rd,"buildToolkitManifest");function Rk(t){return(t.methods??[]).map(e=>({name:e.name,description:e.description,params:e.params?ao.toJSONSchema(e.params):void 0,output:e.output?ao.toJSONSchema(e.output):void 0}))}a(Rk,"collectMethods");function Ck(t){let e=new Map;for(let n of t.permissions??[]){let r=`${t.name}:${n.method}`,o=e.get(r);o||(o={permission:r,methods:[]},e.set(r,o)),o.methods.push(n.method),o.description??=n.description,o.scope===void 0&&n.scopeSchema&&(o.scope=ao.toJSONSchema(n.scopeSchema))}return[...e.values()]}a(Ck,"collectPermissions");function xk(t){if(!t)return"";let e=t.properties;if(!e||typeof e!="object")return"";let n=new Set(Array.isArray(t.required)?t.required:[]),r=[];for(let[o,i]of Object.entries(e)){let s=i??{},l=(Array.isArray(s.enum)?s.enum.join("|"):void 0)??(typeof s.type=="string"?s.type:"object");r.push(`${o}${n.has(o)?"":"?"}: ${l}`)}return r.join(", ")}a(xk,"renderParams");function Sd(t){if(!t)return"void";if(Array.isArray(t.enum))return t.enum.join("|");let e=t.type;if(e==="array"){let n=t.items??{};return`${typeof n.type=="string"?n.type:"object"}[]`}return typeof e=="string"?e:"unknown"}a(Sd,"renderType");function Cd(t){let e=[];for(let n of t){e.push(`### toolkit: ${n.name}${n.readOnly?"(\u7EAF\u8BFB,\u65E0\u9700\u6388\u6743)":""}`),n.description&&e.push(n.description);let r=Tk(n.config.schema);if(e.push("","**\u53EF\u914D\u7F6E\u9879(toolkit_config):**"),e.push(r.length?r.map(o=>`- ${o}`).join(`
222
+ `):"- (\u65E0\u53EF\u8986\u76D6\u914D\u7F6E)"),e.push("","**\u65B9\u6CD5(methods):**"),n.methods.length===0)e.push("- (\u672A\u58F0\u660E\u65B9\u6CD5\u9762)");else for(let o of n.methods){let i=`${o.name}(${xk(o.params)}): ${Sd(o.output)}`;e.push(`- \`${i}\`${o.description?` \u2014 ${o.description}`:""}`)}if(e.push("","**\u6388\u6743(permissions,step.config \u91CC\u53EF\u914D\u7F6E):**"),n.permissions.length===0)e.push("- (\u65E0\u526F\u4F5C\u7528,\u65E0\u9700\u6388\u6743)");else for(let o of n.permissions){let i=o.scope?`true | false | ${Sd(o.scope)}`:"true | false",s=o.methods.length?`;\u65B9\u6CD5:${o.methods.join("/")}`:"";e.push(`- \`${o.permission}\` \u2014 ${o.description??""}\uFF1B\u503C:${i}${s}`)}e.push("")}return e.join(`
223
+ `).trim()}a(Cd,"renderManifest");function Tk(t){let e=t.properties;if(!e||typeof e!="object")return[];let n=[];for(let[r,o]of Object.entries(e)){let i=o??{},c=(Array.isArray(i.enum)?i.enum.join(" | "):void 0)??(typeof i.type=="string"?i.type:"any"),l=typeof i.description=="string"?` \u2014 ${i.description}`:"";n.push(`\`${r}\`(${c})${l}`)}return n}a(Tk,"renderConfigFields");function Sn(t){let e=Nk(t.projectRoot),n=zk(t);return[Ak,jk(t,n),Dk(n),...n?[Pk]:[],$k,Mk(t),e,Ek(),kd,bd,Lk,vd,Wk(t),Bk(t,n)].join(`
224
+
225
+ `)}a(Sn,"buildMetaPrompt");function Ek(){return["## \u53EF\u7528 Toolkit \u80FD\u529B(\u81EA\u52A8\u4ECE\u6CE8\u518C\u8868\u751F\u6210)","","recipe \u901A\u8FC7 `ctx.toolkit.<name>.<method>` \u8C03\u7528\u4EE5\u4E0B\u80FD\u529B;\u526F\u4F5C\u7528\u80FD\u529B\u9700 binding \u6388\u6743(permissions):","",Cd(Rd())].join(`
226
+ `)}a(Ek,"buildToolkitCapabilities");function ms(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(`
227
+ `)}a(ms,"buildFixPrompt");var Ak=`## \u7CFB\u7EDF\u89D2\u8272
228
+
229
+ \u4F60\u662F\u4E00\u4E2A aitable-workflow \u5DE5\u4F5C\u6D41\u8BBE\u8BA1\u4E13\u5BB6\u3002\u6839\u636E\u7528\u6237\u7684\u4E1A\u52A1\u573A\u666F\u63CF\u8FF0\uFF0C
230
+ \u5728\u9879\u76EE\u76EE\u5F55\u4E2D\u751F\u6210\u5B8C\u6574\u7684 workflow.yml\u3001recipe \u6587\u4EF6\u548C views.yml \u89C6\u56FE\u914D\u7F6E\u3002
231
+
232
+ \u4F60\u751F\u6210\u7684\u4EA7\u7269\u5C06\u76F4\u63A5\u88AB aitable-workflow \u8FD0\u884C\u65F6\u89E3\u6790\u548C\u6267\u884C\uFF0C
233
+ \u56E0\u6B64\u5FC5\u987B\u4E25\u683C\u9075\u5FAA\u4EE5\u4E0B\u7EA6\u675F\u89C4\u8303\u3002`;function Dk(t){return`## \u7EA6\u675F\u89C4\u8303
234
+
235
+ 1. workflow.yml \u5FC5\u987B\u5305\u542B meta\u3001steps\u3001edges \u4E09\u4E2A\u9876\u5C42\u6BB5
236
+ 2. meta \u5FC5\u987B\u5305\u542B name\u3001version\u3001domain \u5B57\u6BB5
237
+ 3. \u6BCF\u4E2A step \u5FC5\u987B\u6709 id\u3001name\u3001recipe\u3001auto \u5B57\u6BB5
238
+ 4. step.id \u53EA\u5141\u8BB8\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF
239
+ 5. step.recipe \u7684\u503C\u662F recipe \u6587\u4EF6\u540D\uFF08\u4E0D\u542B .recipe.ts \u540E\u7F00\uFF09
240
+ 6. step.auto: true \u8868\u793A\u81EA\u52A8\u6267\u884C\uFF0Cfalse \u8868\u793A\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838\u540E\u624D\u7EE7\u7EED
241
+ 7. \u5F53 step.auto: false \u65F6\uFF0C\u5FC5\u987B\u6DFB\u52A0 needs_human \u5B57\u6BB5\u8BF4\u660E\u539F\u56E0\u548C\u8D1F\u8D23\u4EBA\uFF1A
242
+ needs_human:
243
+ reason: "\u8BF4\u660E\u4E3A\u4EC0\u4E48\u9700\u8981\u4EBA\u5DE5" # \u5FC5\u586B
244
+ assignee_field: "\u5904\u7406\u4EBA" # \u53EF\u9009\uFF0C\u6307\u5B9A\u8868\u683C\u4E2D\u54EA\u4E2A\u5B57\u6BB5\u5B58\u653E\u8D1F\u8D23\u4EBA
245
+ 8. \u4E0D\u8981\u4F7F\u7528 compliance \u5B57\u6BB5\uFF08\u5DF2\u5E9F\u5F03\uFF0C\u7528 needs_human.reason \u66FF\u4EE3\uFF09
246
+ 9. input_mapping: Record<string, string> \u2014 key \u662F\u53D8\u91CF\u540D\uFF0Cvalue \u662F AI \u8868\u683C\u5B57\u6BB5\u540D
247
+ 10. output_mapping: Record<string, string> \u2014 key \u662F\u53D8\u91CF\u540D\uFF0Cvalue \u662F AI \u8868\u683C\u5B57\u6BB5\u540D
248
+ 11. edges \u5FC5\u987B\u5F62\u6210 __start__ \u2192 step1 \u2192 step2 \u2192 ... \u2192 __end__ \u7684\u5B8C\u6574\u94FE
249
+ 12. recipe \u6587\u4EF6\u4EE5 .recipe.ts \u4E3A\u540E\u7F00\uFF0C\u9ED8\u8BA4\u5BFC\u51FA RecipeDefinition \u5BF9\u8C61
250
+ 13. recipe \u901A\u8FC7 ctx.toolkit.<name>.<method> \u8C03\u7528\u80FD\u529B\uFF0C\u53EF\u7528 toolkit / \u65B9\u6CD5 / \u526F\u4F5C\u7528\u6388\u6743\u8BE6\u89C1\u4E0B\u65B9\u300C\u53EF\u7528 Toolkit \u80FD\u529B\u300D\u6E05\u5355
251
+ 14. recipe \u4E2D\u4E0D\u8981 import \u5916\u90E8 npm \u5305\uFF0C\u53EA\u4F7F\u7528 toolkit \u63D0\u4F9B\u7684\u80FD\u529B
252
+ 15. \u6240\u6709\u6587\u4EF6\u4F7F\u7528 TypeScript\uFF0CESM \u6A21\u5757\u683C\u5F0F
253
+ 16. views.yml \u5FC5\u987B\u6309"\u89C6\u56FE\u751F\u6210\u89C4\u5219"\u8F93\u51FA\uFF0C\u81F3\u5C11\u5305\u542B default_grid\uFF1B\u989D\u5916\u89C6\u56FE\u4EC5\u5728\u7528\u6237\u660E\u786E\u8981\u6C42\u4E14\u573A\u666F\u786E\u5B9E\u9700\u8981\u65F6\u751F\u6210
254
+ 17. workflow.yml \u5E94\u5305\u542B field_definitions \u6BB5\uFF0C\u4E3A\u4E1A\u52A1\u5B57\u6BB5\u58F0\u660E\u7C7B\u578B\uFF08\u540E\u5904\u7406\u4F1A\u81EA\u52A8\u8FC1\u79FB\u5230 config\uFF09
255
+ ${(t?["19. workflow.yml \u5E94\u5305\u542B event_sources \u6BB5\uFF0C\u58F0\u660E\u4E8B\u4EF6\u6E90\u5217\u8868\uFF0C\u6BCF\u6761\u5185\u8054 handler\uFF08\u8BE6\u89C1\u4E0B\u65B9 EventHandler \u89C4\u8303\uFF09","20. EventHandler Recipe \u6587\u4EF6\u4EE5 {handler_id}_handler.recipe.ts \u547D\u540D\uFF0C\u9ED8\u8BA4\u5BFC\u51FA EventHandlerRecipeDefinition \u5BF9\u8C61"]:["19. \u4EC5\u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u5916\u90E8\u4E8B\u4EF6\u6E90\u3001\u7FA4\u6D88\u606F\u3001webhook\u3001\u5BF9\u8BDD\u76D1\u542C\u7B49\u4E8B\u4EF6\u9A71\u52A8\u5165\u53E3\u65F6\uFF0C\u624D\u751F\u6210 event_sources \u548C EventHandler Recipe","20. \u8868\u5355\u63D0\u4EA4\u3001AI \u8868\u683C\u72B6\u6001\u8F6E\u8BE2\u3001\u624B\u52A8\u65B0\u5EFA\u8BB0\u5F55\u7B49\u573A\u666F\u4E0D\u8981\u751F\u6210 event_sources \u6BB5\uFF0C\u4E5F\u4E0D\u8981\u751F\u6210 handler recipe"]).join(`
256
+ `)}`}a(Dk,"buildConstraints");var Pk=`## EventHandler \u89C4\u8303
257
+
258
+ ### \u8BBE\u8BA1\u7406\u5FF5
259
+
260
+ EventHandler \u662F\u957F\u6D3B\u3001\u6709\u72B6\u6001\u7684**\u5355\u4F8B**\uFF08\u50CF\u4E8B\u4EF6\u6E90\u4E00\u6837\u7531\u914D\u7F6E\u5B9E\u4F8B\u5316\u4E00\u6B21\uFF09\uFF1A
261
+ - \u4E8B\u4EF6\u6E90\u91C7\u96C6\u5230\u4E8B\u4EF6\u5373\u8C03 \`onEvent(event)\`\uFF1A**\u5FC5\u987B\u5FEB\u3001\u4E0D\u957F await**\uFF08\u4EC5\u6444\u5165 buffer / \u91CD\u7F6E\u5B9A\u65F6\u5668 / \u540C\u6B65 pushEvent\uFF09
262
+ - \u6162\u6D3B\uFF08\u67E5\u5386\u53F2 / LLM / \u7ED3\u5408\u4E0A\u4E0B\u6587\uFF09\u653E\u8FDB\u5185\u90E8\u5B9A\u65F6\u5668\u6216 \`void (async () => { ...; ctx.pushEvent(...) })()\`
263
+ - \u505A\u4E1A\u52A1\u51B3\u7B56\uFF1A\u5206\u7C7B\u3001\u5B57\u6BB5\u6620\u5C04\u3001\u51B3\u5B9A create_record / update_record\uFF1B**\u4E0D push \u5373\u7B49\u4EF7 skip**
264
+ - \u4EA7\u51FA\u7684\u5F85\u843D\u5E93\u52A8\u4F5C\u7ECF \`ctx.pushEvent(action)\` \u8FDB\u961F\u5217\uFF0C\u7531 reconcile \u843D\u5E93
265
+ - Orchestrator \u4E0D\u505A\u4E1A\u52A1\u51B3\u7B56\uFF0C\u6240\u6709\u903B\u8F91\u7531 EventHandler Recipe \u8D1F\u8D23
266
+
267
+ ### \u4E8B\u4EF6\u6E90 (event_sources) \u914D\u7F6E
268
+
269
+ \u4E8B\u4EF6\u6E90\u5728 **workflow.yml** \u7684 \`event_sources\` \u6BB5\u58F0\u660E\uFF0C\u6BCF\u6761\u5185\u8054 \`handler\`\uFF08handler recipe \u540D\uFF09\uFF1B
270
+ **\u6CA1\u6709 engine / trigger \u5B57\u6BB5**\u2014\u2014\u4E00\u4E2A\u4E8B\u4EF6\u6E90\u5BF9\u5E94\u4E00\u4E2A handler \u5355\u4F8B\u3002
271
+
272
+ \`\`\`yaml
273
+ event_sources:
274
+ - name: "\u7FA4\u6D88\u606F\u76D1\u542C" # \u4E8B\u4EF6\u6E90\u5B9E\u4F8B\u540D
275
+ type: dingtalk_message # \u9489\u9489\u6D88\u606F\u62C9\u53D6\u6E90\uFF08DWS \u4E2A\u4EBA\u8EAB\u4EFD\u8F6E\u8BE2\uFF0C\u4E0D\u9700\u8981\u673A\u5668\u4EBA\uFF09
276
+ handler: message_triage_handler # \u5904\u7406\u8BE5\u6E90\u4E8B\u4EF6\u7684 handler recipe \u540D\uFF08\u4E0D\u542B .recipe.ts \u540E\u7F00\uFF09
277
+ config:
278
+ conversation_ids: # \u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868\uFF08\u7FA4\u804A/\u5355\u804A\uFF09\uFF0C\u652F\u6301\u591A\u4E2A
279
+ - "cidXXXXXXXXXXXX=="
280
+ - "cidYYYYYYYYYYYY=="
281
+ aggregate_by_sender: true # \u53EF\u9009\uFF0C\u9ED8\u8BA4 true\uFF1B\u4F1A\u8BDD\u5185\u6D88\u606F\u6309\u53D1\u9001\u8005\u5206\u7EC4\uFF0C\u6BCF\u4EBA\u4EA7\u51FA\u4E00\u4E2A\u4E8B\u4EF6
282
+ watch_senders: [] # \u53EF\u9009\uFF0C\u53EA\u76D1\u542C\u6307\u5B9A\u53D1\u9001\u8005\uFF08\u7A7A=\u76D1\u542C\u6240\u6709\u4EBA\uFF09
283
+ fetch_limit: 50 # \u53EF\u9009\uFF0C\u6BCF\u6B21\u62C9\u53D6\u7684\u6D88\u606F\u6570\u4E0A\u9650
284
+ \`\`\`
285
+
286
+ dingtalk_message \u89C4\u5219\uFF1A
287
+ 1. **conversation_ids \u662F\u5B57\u7B26\u4E32\u6570\u7EC4**\uFF08\u53EF\u76D1\u542C\u591A\u4E2A\u4F1A\u8BDD\uFF09\uFF1B\u4E0D\u518D\u652F\u6301\u5355\u503C conversation_id\u3002
288
+ \u591A\u4E2A\u4F1A\u8BDD\u7531\u4E8B\u4EF6\u6E90**\u5E76\u53D1**\u62C9\u53D6\uFF08dws \u62C9\u53D6\u8F83\u6162\u65F6\u907F\u514D\u987A\u5E8F\u7D2F\u52A0\u5EF6\u8FDF\uFF09\u3002
289
+ 2. \u6BCF\u4E2A\u4F1A\u8BDD**\u72EC\u7ACB**\u4EA7\u51FA \`message_received\` \u4E8B\u4EF6\uFF0Cpayload.conversationId \u4E3A\u8BE5\u4F1A\u8BDD ID\uFF0C
290
+ \u5404\u4F1A\u8BDD\u6709\u5404\u81EA\u7684\u53BB\u91CD\u6C34\u4F4D\u7EBF\uFF0C\u4E92\u4E0D\u5F71\u54CD\u3002\u4E8B\u4EF6\u6E90\u6309\u8F6E\u8BE2\u95F4\u9694\uFF08polling.interval_ms\uFF09\u5B9A\u65F6\u62C9\u53D6\uFF0C
291
+ **\u4E00\u8F6E\u62C9\u5230\u7684\u6D88\u606F\u5C31\u5730\u805A\u5408\u6210\u4E8B\u4EF6\u7ACB\u5373\u4EA7\u51FA**\uFF0C\u4E0D\u505A\u8DE8\u8F6E\u9759\u9ED8\u5408\u6279\uFF08\u907F\u514D\u6D3B\u8DC3\u4F1A\u8BDD\u6D88\u606F\u4E0D\u65AD\u800C\u6C38\u4E0D\u4EA7\u51FA\uFF09\u3002
292
+ 3. \`aggregate_by_sender\`\uFF08\u9ED8\u8BA4 true\uFF09\uFF1A\u5F00\u542F\u540E\uFF0C\u4E00\u4E2A\u4F1A\u8BDD\u672C\u8F6E\u7684\u6D88\u606F\u6309\u53D1\u9001\u8005\u5206\u7EC4\uFF0C
293
+ **\u6BCF\u4E2A\u53D1\u9001\u8005\u4EA7\u51FA\u4E00\u4E2A\u72EC\u7ACB\u4E8B\u4EF6**\uFF08\u4E00\u4E2A\u4EBA\u8FDE\u7EED\u53D1\u9001\u7684\u591A\u6761\u6D88\u606F\u805A\u5408\u6210\u4E00\u6761\u5DE5\u5355\uFF09\uFF0C
294
+ payload \u989D\u5916\u5E26 sender / senderName\uFF1B\u5173\u95ED\u65F6\u6574\u4F1A\u8BDD\u4EA7\u51FA\u4E00\u4E2A\u4E8B\u4EF6\uFF08\u542B\u6240\u6709\u4EBA\u6D88\u606F\uFF09\u3002
295
+ 4. \u4E8B\u4EF6\u6E90\u53EA\u4EA7\u51FA\u539F\u59CB \`message_received\`\uFF08\u542B messages / content / messageCount / firstSender / firstSendTime \u7B49\uFF0CitemId \u6052\u4E3A null\uFF09\uFF0C
296
+ \u4E0D\u505A"\u65B0\u5BF9\u8BDD vs \u8FFD\u95EE"\u5224\u65AD\u2014\u2014\u7531 EventHandler Recipe \u51B3\u7B56\u3002
297
+ 5. \u53E6\u6709 \`cron_scheduler\` \u7C7B\u578B\uFF08\u5B9A\u65F6\u4EA7\u51FA\u81EA\u5B9A\u4E49 event_type\uFF0Cconfig \u7528 event_type / interval_ms \u6216 cron\uFF09\uFF0C\u7528\u4E8E\u65E5\u62A5/\u5DE1\u68C0\u7B49\u5B9A\u65F6\u89E6\u53D1\u573A\u666F\u3002
298
+
299
+ aitable_record \u89C4\u5219\uFF1A
300
+ 1. \u5982\u679C\u76D1\u542C\u7684\u662F**\u5F53\u524D workflow \u81EA\u5DF1\u6301\u6709\u7684 tracker \u8868**\uFF0C\u4E0D\u8981\u751F\u6210 event_source\uFF1Btracker \u81EA\u8EAB\u8F6E\u8BE2\u5373\u53EF\u3002
301
+ 2. \u5982\u679C\u76D1\u542C\u7684\u662F**\u53E6\u4E00\u4E2A workflow \u7684 tracker \u8868**\uFF0Cconfig \u5FC5\u987B\u4F7F\u7528\u5F15\u7528\uFF0C\u4E0D\u8981\u751F\u6210\u88F8 \`base_id/table_id\`\uFF1A
302
+ \`source_table: { mode: reference, ref: "workflow:<workflowId>.tracker" }\`\u3002
303
+ \u8BE5\u5F15\u7528\u7531\u8FD0\u884C\u65F6\u89E3\u6790\uFF0Cconfig \u9636\u6BB5\u4E0D\u8981\u6C42\u7528\u6237\u91CD\u590D\u586B\u5199 tableId\uFF0Csetup \u9636\u6BB5\u4E5F\u4E0D\u4F1A\u4E3A\u8FD9\u4E2A\u5F15\u7528\u8868\u91CD\u590D\u5EFA\u8868\u3002
304
+ 3. \u53EA\u6709\u7528\u6237\u660E\u786E\u8981\u6C42\u76D1\u542C\u7CFB\u7EDF\u5916\u90E8\u3001\u4E0D\u4F1A\u7531\u672C\u9879\u76EE setup \u7BA1\u7406\u7684 AI \u8868\u683C\u65F6\uFF0C\u624D\u4F7F\u7528\u88F8 \`base_id/table_id\`\uFF1B\u8FD9\u662F\u9AD8\u7EA7\u5916\u90E8\u8868\u914D\u7F6E\u3002
305
+ 4. \`watch_mode\` \u8868\u793A\u76D1\u542C\u6A21\u5F0F\uFF1A\`created\` \u53EA\u76D1\u542C\u65B0\u589E\u8BB0\u5F55\uFF0C\`updated\` \u53EA\u76D1\u542C\u5DF2\u6709\u8BB0\u5F55\u53D8\u66F4\uFF0C\`both\` \u4E24\u8005\u90FD\u76D1\u542C\u3002
306
+
307
+ ### Config Surface \u4E0E\u53EF\u914D\u7F6E\u9879\u58F0\u660E
308
+
309
+ Design \u751F\u6210 workflow/recipes \u65F6\uFF0C\u5FC5\u987B\u533A\u5206"\u4E1A\u52A1\u53EF\u914D\u7F6E\u9879"\u4E0E"\u5185\u90E8\u8FD0\u884C\u534F\u8BAE"\uFF1A
310
+ 1. \`tracker.base_id\` \u5FC5\u586B\uFF1B\`tracker.table_id\` \u53EF\u7559\u7A7A\uFF0C\u7531 setup \u81EA\u52A8\u521B\u5EFA tracker \u8868\u5E76\u5199\u56DE\u3002
311
+ 2. \`event_sources[].config\` \u53EA\u653E\u4E8B\u4EF6\u6E90\u9A71\u52A8\u5C42\u914D\u7F6E\uFF08\u76D1\u542C\u54EA\u4E2A\u7FA4/\u8868\u3001\u4F55\u65F6\u89E6\u53D1\uFF09\uFF1B\u4E0D\u8981\u628A handler \u4E1A\u52A1\u53C2\u6570\u653E\u8FDB config\u3002
312
+ 3. \`event_sources[].handler_config\` \u53EA\u653E handler recipe \u9700\u8981\u7684\u4E1A\u52A1\u914D\u7F6E\uFF08\u5982\u673A\u5668\u4EBA\u6635\u79F0\u3001\u590D\u76D8\u8868\u5F15\u7528\u3001\u590D\u7528\u7684\u7FA4\u5217\u8868\uFF09\u3002
313
+ 4. \u4E0D\u8981\u66B4\u9732\u6216\u8981\u6C42\u7528\u6237\u914D\u7F6E\u5185\u90E8\u5B57\u6BB5\uFF0C\u5982 \`toolkit_config.file.base_dir\`\u3001\`seen_file\`\u3001\`resolve_field_names\`\u3001\`emit_existing\`\u3001\`admin_field/question_field/context_field\` \u7B49\u3002
314
+
315
+ \u901A\u7528 workflow ref\uFF1A
316
+ - \u8DE8 workflow \u590D\u7528\u914D\u7F6E\u65F6\uFF0C\u4F7F\u7528\u7EAF\u5BF9\u8C61 \`{ ref: "..." }\`\uFF0C\u8FD0\u884C\u65F6\u5728 app \u542F\u52A8\u65F6\u89E3\u6790\u5230\u5185\u5B58\uFF0C\u4E0D\u5199\u56DE YAML\u3002
317
+ - \u652F\u6301\u5F15\u7528\uFF1A
318
+ - \`workflow:<workflowId>.tracker\`
319
+ - \`workflow:<workflowId>.tracker.base_id\`
320
+ - \`workflow:<workflowId>.tracker.table_id\`
321
+ - \`workflow:<workflowId>.event_source.<eventSourceName>.config.<field>\`
322
+ - \`workflow:<workflowId>.event_source.<eventSourceName>.handler_config.<field>\`
323
+ - \u4F8B\u5982 daily review \u590D\u7528\u7FA4\u95EE\u7B54\u76D1\u542C\u7684\u7FA4\u5217\u8868\uFF1A
324
+ \`\`\`yaml
325
+ handler_config:
326
+ conversation_ids:
327
+ ref: workflow:group-qa.event_source.\u7FA4\u6D88\u606F\u76D1\u542C.config.conversation_ids
328
+ \`\`\`
329
+ - \u4EC5\u7EAF \`{ ref: "..." }\` \u5BF9\u8C61\u4F1A\u88AB\u66FF\u6362\uFF1B\`source_table: { mode: reference, ref: "workflow:<workflowId>.tracker" }\` \u662F aitable_record \u7684\u4E13\u7528 tracker \u5F15\u7528\uFF0C\u4FDD\u7559\u539F\u7ED3\u6784\u3002
330
+
331
+ Handler recipe \u7684 meta.config \u5E94\u58F0\u660E Config Surface\uFF1A
332
+ - \u76EE\u6807\u8868\u5F15\u7528\u4F7F\u7528 \`tableRefConfigSchema\`\uFF0C\u4E0D\u8981\u624B\u5199 \`z.object({ baseId, tableId })\`\u3002
333
+ - handler \u81EA\u5DF1\u6301\u6709\u3001\u53EF\u7531 setup \u81EA\u52A8\u521B\u5EFA\u7684\u8868\uFF0C\u58F0\u660E\uFF1A
334
+ \`\`\`typescript
335
+ tableRefConfigSchema({
336
+ label: "\u6BCF\u65E5\u7EDF\u8BA1\u8868",
337
+ ownership: "owned",
338
+ autoCreate: true,
339
+ defaultBase: "workflow.tracker.base_id",
340
+ setupSchema: {
341
+ fields: [
342
+ { name: "\u65E5\u671F", type: "text" },
343
+ { name: "\u95EE\u9898\u6570", type: "number" },
344
+ ],
345
+ },
346
+ })
347
+ \`\`\`
348
+ - \u7528\u6237\u53EF\u89C1\u7684\u666E\u901A handler_config \u5B57\u6BB5\u5FC5\u987B\u663E\u5F0F\u6253\u6807\uFF1A
349
+ \`\`\`typescript
350
+ z.array(z.string()).optional().describe("\u673A\u5668\u4EBA\u81EA\u8EAB\u7FA4\u6635\u79F0\u540D\u5355").meta({
351
+ aitableAgentConfig: {
352
+ expose: true,
353
+ label: "\u673A\u5668\u4EBA\u6635\u79F0",
354
+ valueType: "string[]",
355
+ },
356
+ })
357
+ \`\`\`
358
+ - \u672A\u6807\u8BB0 \`aitableAgentConfig.expose: true\` \u7684\u666E\u901A\u5B57\u6BB5\u9ED8\u8BA4\u89C6\u4E3A\u5185\u90E8\u5B9E\u73B0\uFF0C\u4E0D\u8FDB\u5165 \`aitable-workflow config\`\u3002
359
+
360
+ ### \u89C4\u5219
361
+
362
+ 1. \u4E00\u4E2A event_source \u6070\u597D\u5BF9\u5E94\u4E00\u4E2A handler\uFF08inline handler \u5B57\u6BB5\uFF09\uFF1B\u4E0D\u518D\u6709 trigger\u2194event.type \u5BF9\u5E94\u5173\u7CFB\u3002
363
+ 2. \u4E8B\u4EF6\u6E90\u53EA\u4EA7\u51FA\u7EDF\u4E00\u7684\u539F\u59CB\u4E8B\u4EF6\uFF08\u5982 message_received\uFF09\uFF0C**\u4E0D\u533A\u5206\u65B0\u5BF9\u8BDD/\u8FFD\u95EE**\u3002
364
+ \u5982\u9700"\u9996\u6B21\u5EFA\u5355 / \u540E\u7EED\u66F4\u65B0"\u7684\u533A\u5206\uFF0C\u7531 handler \u81EA\u884C\u6309\u4E1A\u52A1\u5224\u65AD\uFF08\u4E0D push = skip\uFF09\u3002
365
+ 3. handler \u7528 \`ctx.pushEvent(action)\` \u4EA7\u51FA\u5F85\u843D\u5E93\u52A8\u4F5C\uFF1A
366
+ - create_record: \u521B\u5EFA\u65B0\u5DE5\u5355 + fields \u6620\u5C04
367
+ - update_record: \u66F4\u65B0\u5DF2\u6709\u5DE5\u5355 + itemId + fields \u6620\u5C04
368
+ - \u4E0D\u8C03\u7528 pushEvent = \u8DF3\u8FC7\uFF08skip\uFF09
369
+ 4. EventHandler Recipe \u5BFC\u51FA\u7C7B\u578B\u662F EventHandlerRecipeDefinition\uFF08\u975E RecipeDefinition\uFF09\u3002
370
+ 5. **\u94C1\u5F8B\uFF1A\`onEvent\` \u5185\u4E0D\u5F97\u957F await**\uFF1B\u5426\u5219\u540C\u4F1A\u8BDD\u5224\u5B9A\u7ADE\u6001\u4F1A\u56DE\u6765\u3002\u6162\u6D3B\u653E\u5B9A\u65F6\u5668 flush \u6216\u5F02\u6B65\u4EFB\u52A1\u91CC\u3002
371
+
372
+ ### EventHandler Recipe \u7C7B\u578B\u5B9A\u4E49\uFF08\u5355\u4F8B\u5951\u7EA6\uFF09
373
+
374
+ \`\`\`typescript
375
+ export interface EventHandlerRecipeDefinition {
376
+ meta: { id: string; name: string; description?: string };
377
+ create(ctx: HandlerInitContext): HandlerInstance; // \u542F\u52A8\u65F6\u5B9E\u4F8B\u5316\u4E00\u6B21\uFF0C\u8FD4\u56DE\u957F\u6D3B\u5355\u4F8B
378
+ }
379
+
380
+ export interface HandlerInitContext {
381
+ toolkit: Toolkit; // { ai, table, messaging, ... }
382
+ log: (message: string) => void;
383
+ pushEvent: (action: PendingAction) => void; // \u628A\u5F85\u843D\u5E93\u52A8\u4F5C\u6295\u8FDB\u961F\u5217
384
+ }
385
+
386
+ export interface HandlerInstance {
387
+ onEvent(event: ExternalEvent): void; // \u91C7\u96C6\u5230\u5373\u8C03\uFF1B\u5FC5\u987B\u5FEB\u3001\u4E0D\u957F await
388
+ stop(): void; // \u5173\u505C\u65F6\u6E05\u7406\u5185\u90E8\u5B9A\u65F6\u5668/\u8D44\u6E90
389
+ }
390
+
391
+ export type PendingAction =
392
+ | { action: "create_record"; fields: Record<string, unknown> }
393
+ | { action: "update_record"; itemId: string; fields: Record<string, unknown> };
394
+
395
+ // ExternalEvent = { type, payload, timestamp, itemId? }
396
+ \`\`\`
397
+
398
+ ### EventHandler Recipe \u793A\u4F8B\uFF08conversation_handler.recipe.ts\uFF09
399
+
400
+ \`\`\`typescript
401
+ import type {
402
+ EventHandlerRecipeDefinition,
403
+ HandlerInitContext,
404
+ HandlerInstance,
405
+ } from "aitable-workflow-core";
406
+
407
+ const recipe: EventHandlerRecipeDefinition = {
408
+ meta: {
409
+ id: "conversation_handler",
410
+ name: "\u4F1A\u8BDD\u6D88\u606F\u5904\u7406\u5668",
411
+ description: "message_received \u2192 \u63D0\u53D6\u4FE1\u606F \u2192 \u521B\u5EFA\u5DE5\u5355",
412
+ },
413
+
414
+ create(ctx: HandlerInitContext): HandlerInstance {
415
+ return {
416
+ onEvent(event) {
417
+ // \u5FEB\uFF1A\u4EC5\u540C\u6B65\u6444\u5165 + pushEvent\uFF0C\u4E0D\u957F await
418
+ const payload = event.payload;
419
+ const content = String(payload.content ?? "");
420
+ if (!content.trim()) return; // \u4E0D push = skip
421
+
422
+ const senderName = String(payload.senderName ?? payload.firstSender ?? "");
423
+ ctx.log(\`\u5904\u7406\u4F1A\u8BDD\u6D88\u606F: \u6765\u81EA \${senderName}\`);
424
+
425
+ ctx.pushEvent({
426
+ action: "create_record",
427
+ fields: {
428
+ "\u6D88\u606F\u5185\u5BB9": content,
429
+ "\u53D1\u9001\u4EBA": senderName,
430
+ "\u53D1\u9001\u65F6\u95F4": String(payload.firstSendTime ?? new Date().toISOString()),
431
+ },
432
+ });
433
+ },
434
+ stop() {
435
+ // \u6E05\u7406\u5185\u90E8\u5B9A\u65F6\u5668/\u8D44\u6E90\uFF08\u672C\u4F8B\u65E0\uFF09
436
+ },
437
+ };
438
+ },
439
+ };
440
+
441
+ export default recipe;
442
+ \`\`\`
443
+
444
+ > \u9700\u8981 LLM / \u67E5\u5386\u53F2\u7B49\u6162\u6D3B\u65F6\uFF0C\u4E0D\u8981\u5728 onEvent \u91CC await\uFF1B\u6309\u4F1A\u8BDD\u628A\u4E8B\u4EF6\u5B58\u8FDB buffer + \u91CD\u7F6E\u5B9A\u65F6\u5668\uFF0C
445
+ > \u5728\u5B9A\u65F6\u5668 flush \u91CC\u505A\u6162\u6D3B\u540E\u518D \`ctx.pushEvent(...)\`\uFF08\u5B9A\u65F6\u6E90\u8FD9\u7C7B\u4E00\u6B21\u6027\u89E6\u53D1\u53EF\u7528 \`void run(event)\`\uFF09\u3002`,$k=`## \u5B57\u6BB5\u7C7B\u578B\u6307\u5F15
446
+
447
+ workflow.yml \u9876\u5C42\u5FC5\u987B\u58F0\u660E field_definitions\uFF0C\u4F5C\u4E3A\u8868\u7ED3\u6784\u7684\u4E2D\u95F4\u4EA7\u7269\u3002
448
+ design \u5B8C\u6210\u540E\uFF0C\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u5C06\u5176\u8FC1\u79FB\u5230 config \u7684 tracker.field_definitions \u4F5C\u4E3A\u552F\u4E00\u6CE8\u518C\u8868\u3002
449
+ setup \u636E\u6B64\u521B\u5EFA\u5B57\u6BB5\uFF0Csync \u636E\u6B64\u6821\u9A8C\u6F02\u79FB\uFF0C\u89C6\u56FE\u636E\u6B64\u5F15\u7528\u5B57\u6BB5\u3002
450
+
451
+ \u652F\u6301\u7684\u7C7B\u578B: text | number | date | singleSelect | multipleSelect | url | rating | currency | progress | user | creator | lastModifier | createdTime | lastModifiedTime
452
+
453
+ ### \u89C4\u5219
454
+
455
+ 1. **\u6240\u6709\u4E1A\u52A1\u5B57\u6BB5\u90FD\u5FC5\u987B\u5728 field_definitions \u4E2D\u663E\u5F0F\u58F0\u660E**\uFF08\u5305\u62EC text \u7C7B\u578B\uFF09
456
+ 2. field_definitions \u662F\u5B57\u6BB5\u7684\u5B9A\u4E49\u6E90\uFF0C\u540E\u5904\u7406\u4F1A\u81EA\u52A8\u5C06\u5176\u5199\u5165 config \u4F5C\u4E3A single source of truth
457
+ 3. \u542B\u201C\u65E5\u671F\u201D\u201C\u65F6\u95F4\u201D\u5173\u952E\u8BCD\u7684\u5B57\u6BB5\u5E94\u8BBE\u4E3A date
458
+ 4. \u660E\u786E\u6709\u6709\u9650\u53EF\u9009\u9879\u7684\u5B57\u6BB5\u7528 singleSelect \u6216 multipleSelect
459
+ 5. \u8868\u793A\u4F01\u4E1A\u5185\u90E8\u6210\u5458\u3001\u63A5\u6536\u4EBA\u3001\u8D1F\u8D23\u4EBA\u4E14\u9700\u8981\u7528\u4E8E\u53D1\u9001 IM \u65F6\uFF0C\u58F0\u660E\u4E3A user \u4EBA\u5458\u5B57\u6BB5\uFF1B\u5B57\u6BB5\u540D\u5E94\u4F7F\u7528\u4E1A\u52A1\u89D2\u8272\u540D\uFF08\u5982 \u63A5\u6536\u4EBA / \u6210\u5458 / \u8D1F\u8D23\u4EBA / \u63D0\u4EA4\u4EBA\uFF09
460
+ 6. \u5F53\u901A\u77E5\u76EE\u6807\u662F\u586B\u8868\u4EBA\u3001\u7533\u8BF7\u4EBA\u3001\u63D0\u4EA4\u4EBA\u6216\u8BB0\u5F55\u521B\u5EFA\u4EBA\u672C\u4EBA\u65F6\uFF0C\u4F18\u5148\u58F0\u660E\u4E00\u4E2A user \u4EBA\u5458\u5B57\u6BB5\uFF08\u5982 \u63D0\u4EA4\u4EBA / \u7533\u8BF7\u4EBA\uFF09\u4F5C\u4E3A\u53D1\u9001\u76EE\u6807\uFF1Bcreator \u7CFB\u7EDF\u5B57\u6BB5\u53EF\u540C\u65F6\u7528\u4E8E\u5C55\u793A/\u5BA1\u8BA1\uFF0C\u4F46 creator \u53EA\u8FD4\u56DE uid \u65F6\u4E0D\u80FD\u76F4\u63A5\u7528\u4E8E sendToUser
461
+ 7. \u4E1A\u52A1\u6807\u9898\u5B57\u6BB5\u5C3D\u91CF\u590D\u7528\u4E3B\u952E\u5B57\u6BB5\u8BED\u4E49\uFF1B\u5982\u679C\u573A\u666F\u5DF2\u6709\u81EA\u7136\u6807\u9898\uFF08\u5982\u5458\u5DE5\u59D3\u540D\u3001\u7533\u8BF7\u5355\u53F7\u3001\u5BA2\u6237\u540D\u79F0\uFF09\uFF0C\u4F18\u5148\u7528\u5B83\u627F\u8F7D\u8BB0\u5F55\u6807\u9898\uFF0C\u4E0D\u8981\u518D\u751F\u6210\u4E00\u4E2A\u65E0\u4E1A\u52A1\u542B\u4E49\u7684\u91CD\u590D\u6807\u9898\u5B57\u6BB5
462
+ 8. \u5982\u679C\u80FD\u4ECE\u7528\u6237\u573A\u666F\u63CF\u8FF0\u4E2D\u63A8\u65AD\u51FA\u9009\u9879\u5217\u8868\uFF0C\u5199\u5165 options
463
+ 9. \u82E5\u65E0\u6CD5\u786E\u5B9A\u9009\u9879\uFF0C\u53EA\u58F0\u660E type \u4E0D\u5199 options\uFF08\u7531\u7528\u6237\u540E\u7EED\u8865\u5145\uFF09
464
+ 10. \u72B6\u6001\u5B57\u6BB5\u7684 options \u5FC5\u987B\u4E0E tracker.states \u4E2D\u5B9A\u4E49\u7684\u503C\u4E00\u81F4
465
+ 11. creator / lastModifier / createdTime / lastModifiedTime \u662F\u7CFB\u7EDF\u53EA\u8BFB\u5B57\u6BB5\uFF0C\u53EF\u5728 create_table \u6216 create_fields \u65F6\u521B\u5EFA\uFF1B\u5B83\u4EEC\u4E0D\u5E94\u51FA\u73B0\u5728 FormDesigner visible_fields \u4E2D\uFF0C\u4E5F\u4E0D\u80FD\u5728 create/update records \u65F6\u5199\u5165
466
+ 12. creator / lastModifier \u8BB0\u5F55\u67E5\u8BE2\u65F6\u53EF\u80FD\u8FD4\u56DE [{ userId, corpId }] \u6216 { name, uid }\uFF1Buid \u4E0E userId \u4E0D\u662F\u540C\u4E00\u6982\u5FF5\uFF0CsendToUser \u53EA\u80FD\u4F7F\u7528\u660E\u786E\u7684 userId\u3002recipe \u53EF\u4FDD\u7559 uid \u7528\u4E8E\u5C55\u793A\u6216\u540E\u7EED\u8F6C\u6362\uFF0C\u4F46\u4E0D\u80FD\u628A uid/name/userRef \u5F53 userId \u53D1\u9001
467
+ 13. \u4E0D\u8981\u4F7F\u7528 person\uFF1BMCP \u6807\u51C6\u4EBA\u5458\u5B57\u6BB5\u7C7B\u578B\u662F user
468
+ 14. \u7CFB\u7EDF\u9AA8\u67B6\u5B57\u6BB5\uFF08\u6807\u9898\u3001\u72B6\u6001\u3001\u5F53\u524D\u6B65\u9AA4\u3001\u5904\u7406\u4EBA\u3001\u4E8B\u4EF6\u65E5\u5FD7\uFF09\u65E0\u9700\u58F0\u660E\uFF0C\u5B83\u4EEC\u7531 setup \u81EA\u52A8\u521B\u5EFA
469
+
470
+ ### \u683C\u5F0F
471
+
472
+ \`\`\`yaml
473
+ field_definitions:
474
+ - name: "\u59D3\u540D"
475
+ type: text
476
+ - name: "\u90E8\u95E8"
477
+ type: singleSelect
478
+ options: ["\u6280\u672F\u90E8", "\u4EA7\u54C1\u90E8", "\u8BBE\u8BA1\u90E8"]
479
+ - name: "\u63D0\u4EA4\u65E5\u671F"
480
+ type: date
481
+ - name: "\u7533\u8BF7\u4EBA"
482
+ type: creator
483
+ - name: "\u63A5\u6536\u4EBA"
484
+ type: user
485
+ - name: "\u6700\u540E\u7F16\u8F91\u4EBA"
486
+ type: lastModifier
487
+ - name: "\u6821\u9A8C\u7ED3\u679C"
488
+ type: text
489
+ \`\`\``;function Mk(t){let e=[t.scene,t.fullRequirement,t.clarifications??""].join(`
490
+ `),n=/(现场|演示|demo|稳定|快速|不要太多|尽量快|少调用|少依赖|确定性)/i.test(e),r=/(通知|发送|IM|消息|sendToUser|接收人|目标用户|用户ID|userId)/i.test(e),o=["## \u6267\u884C\u7B56\u7565","","1. \u5148\u6839\u636E\u7528\u6237\u573A\u666F\u9009\u62E9 recipe \u5B9E\u73B0\u7B56\u7565\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u6240\u6709\u6B65\u9AA4\u90FD\u8C03\u7528 LLM\u3002","2. \u53EF\u7531\u89C4\u5219\u3001\u5B57\u6BB5\u5B8C\u6574\u6027\u3001\u679A\u4E3E\u6620\u5C04\u3001\u6A21\u677F\u62FC\u63A5\u5B8C\u6210\u7684\u81EA\u52A8\u6B65\u9AA4\uFF0C\u4F18\u5148\u5199\u786E\u5B9A\u6027 TypeScript \u903B\u8F91\u3002","3. \u53EA\u6709\u5F00\u653E\u5F0F\u6587\u6848\u751F\u6210\u3001\u8BED\u4E49\u5206\u7C7B\u3001\u590D\u6742\u5224\u65AD\u3001\u77E5\u8BC6\u5F52\u7EB3\u7B49\u786E\u9700\u6A21\u578B\u80FD\u529B\u7684\u6B65\u9AA4\uFF0C\u624D\u8C03\u7528 toolkit.ai\u3002","4. \u7528\u6237\u8981\u6C42\u73B0\u573A\u6F14\u793A\u3001\u7A33\u5B9A\u3001\u5FEB\u901F\u6216\u5C11\u4F9D\u8D56\u65F6\uFF0C\u5E94\u66F4\u504F\u5411\u786E\u5B9A\u6027\u903B\u8F91\uFF0C\u5E76\u5728 logs/ctx.log \u4E2D\u6E05\u6670\u5C55\u793A\u6D41\u7A0B\u63A8\u8FDB\u3002"];return n&&o.push("5. \u5F53\u524D\u9700\u6C42\u5305\u542B\u73B0\u573A\u7A33\u5B9A\u6027\u4FE1\u53F7\uFF1A\u81EA\u52A8\u6B65\u9AA4\u5E94\u5C3D\u91CF\u907F\u514D\u8FD0\u884C\u671F LLM \u4F9D\u8D56\uFF1B\u6B22\u8FCE\u8BED\u3001\u6E05\u5355\u3001\u6821\u9A8C\u6458\u8981\u53EF\u7528\u6A21\u677F\u548C\u89C4\u5219\u751F\u6210\u3002"),r&&o.push(`${n?"6":"5"}. \u5982\u679C\u8C03\u7528 toolkit.messaging.sendToUser\uFF0C\u76EE\u6807\u5FC5\u987B\u6765\u81EA user \u4EBA\u5458\u5B57\u6BB5\u4E2D\u7684 userId\uFF0C\u6216\u6765\u81EA\u660E\u786E\u547D\u540D\u4E3A userId \u7684\u5B57\u6BB5\uFF1B\u4E0D\u8981\u7528\u59D3\u540D\u3001\u624B\u673A\u53F7\u3001\u6807\u9898\u3001uid\u3001userRef \u7B49\u5C55\u793A/\u5185\u90E8\u6807\u8BC6\u5192\u5145 userId\u3002creator/lastModifier cell \u53EF\u80FD\u8FD4\u56DE { name, uid }\uFF0Cuid \u4E0E userId \u4E0D\u662F\u540C\u4E00\u6982\u5FF5\uFF0C\u4E0D\u80FD\u76F4\u63A5\u53D1\u9001\uFF1B\u53EA\u6709\u5F53 cell \u4E2D\u660E\u786E\u5B58\u5728 userId \u65F6\u624D\u53EF\u4F5C\u4E3A\u53D1\u9001\u76EE\u6807\u3002\u5982\u679C\u7528\u6237\u8BED\u4E49\u662F\u901A\u77E5\u586B\u8868\u4EBA/\u7533\u8BF7\u4EBA/\u63D0\u4EA4\u4EBA\u672C\u4EBA\uFF0C\u4F18\u5148\u751F\u6210 user \u4EBA\u5458\u5B57\u6BB5\uFF08\u5982 \u63D0\u4EA4\u4EBA / \u7533\u8BF7\u4EBA\uFF09\u4F5C\u4E3A\u53D1\u9001\u76EE\u6807\uFF0C\u53EF\u53E6\u5EFA creator \u5B57\u6BB5\u7528\u4E8E\u5BA1\u8BA1\uFF1B\u4E0D\u8981\u751F\u6210\u6CDB\u5316\u7684\u300C\u901A\u77E5\u5BF9\u8C61\u300D\u5B57\u6BB5\u3002\u7F3A\u5C11 userId \u65F6\u5E94\u5199\u5165\u5931\u8D25/\u964D\u7EA7\u7ED3\u679C\u5E76\u8FD4\u56DE success\uFF0C\u907F\u514D\u963B\u65AD\u6D41\u7A0B\u3002**\u5173\u952E\uFF1AsendToUser \u6B65\u9AA4\u7684 input_mapping \u5FC5\u987B\u5305\u542B\u53D1\u9001\u76EE\u6807 user \u5B57\u6BB5\u6216 userId \u5B57\u6BB5**\uFF0C\u5426\u5219 recipe \u65E0\u6CD5\u4ECE input \u4E2D\u83B7\u53D6 userId\uFF0C\u53EA\u80FD\u901A\u8FC7 readCurrentRow \u515C\u5E95\uFF08\u4E0D\u53EF\u9760\uFF09\u3002\u793A\u4F8B input_mapping: { ..., target_user: "\u5165\u804C\u5458\u5DE5" }\u3002`),o.join(`
491
+ `)}a(Mk,"buildExecutionStrategyGuidance");function jk(t,e){let n=_d(t),r=["## \u5DF2\u9A8C\u8BC1\u9879\u76EE\u4E8B\u5B9E","",`- \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55: ${t.workDir}`,`- workflow \u8F93\u51FA\u8DEF\u5F84: ${t.workflowRelPath}`,`- recipe \u8F93\u51FA\u76EE\u5F55: ${t.recipeDirRelPath}`,"- Recipe import \u8DEF\u5F84\u5DF2\u8BA1\u7B97\uFF0Crecipe \u6587\u4EF6\u4E2D\u76F4\u63A5\u4F7F\u7528\uFF1A","```typescript",`import type { RecipeDefinition, RecipeContext, RecipeResult } from "${n}";`,"```"];e&&r.push("- EventHandler import \u8DEF\u5F84\u5DF2\u8BA1\u7B97\uFF0Chandler recipe \u6587\u4EF6\u4E2D\u76F4\u63A5\u4F7F\u7528\uFF1A","```typescript",`import type { EventHandlerRecipeDefinition, HandlerInitContext, HandlerInstance } from "${Id(t)}";`,`import type { ExternalEvent } from "${Ed(t)}";`,"```");let o=Fk(t.workDir);o.length>0&&r.push(...o);let i=Ok(t.workDir);return i.length>0&&r.push("- \u53EF\u7528\u89D2\u8272\uFF1A",...i.map(s=>` - ${s.id}${s.name?`\uFF08${s.name}\uFF09`:""}`)),r.push("- \u65E0\u9700\u518D\u901A\u8FC7 Bash/Read \u9A8C\u8BC1\u8FD9\u4E9B\u8DEF\u5F84\uFF1B\u9664\u975E\u7528\u6237\u9700\u6C42\u660E\u786E\u8981\u6C42\u68C0\u67E5\u5DF2\u6709\u6587\u4EF6\u5185\u5BB9\u3002"),r.join(`
492
+ `)}a(jk,"buildProjectFacts");function Fk(t){try{let e=Ik.parse(gs(lo.join(t,"aitable-workflow.config.yml"),"utf8"));if(!co(e)||!co(e.tracker))return[];let n=e.tracker,r=[];if(co(n.states)){let o=n.states,i=[typeof o.initial=="string"?`initial=${o.initial}`:"",Array.isArray(o.active)?`active=${o.active.join(" / ")}`:"",Array.isArray(o.terminal)?`terminal=${o.terminal.join(" / ")}`:"",typeof o.review=="string"?`review=${o.review}`:"",typeof o.blocked=="string"?`blocked=${o.blocked}`:""].filter(Boolean);i.length>0&&r.push(`- Tracker \u72B6\u6001\uFF1A${i.join("; ")}`)}if(co(n.fields)){let o=Object.entries(n.fields).filter(i=>typeof i[1]=="string").map(([i,s])=>`${i}=${s}`);o.length>0&&r.push(`- \u7CFB\u7EDF\u9AA8\u67B6\u5B57\u6BB5\uFF1A${o.join("; ")}`)}return r}catch{return[]}}a(Fk,"loadTrackerFacts");function co(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(co,"isPlainRecord");function Ok(t){let e=lo.join(t,"roles");try{return _k(e).filter(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml")).slice(0,8).map(n=>{let r=gs(lo.join(e,n),"utf8"),o=n.replace(/\.role\.ya?ml$/,"");return{id:xd(r,"id")??o,name:xd(r,"name")}})}catch{return[]}}a(Ok,"loadRoleFacts");function xd(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=t.match(new RegExp(`^\\s*${n}\\s*:\\s*(.+?)\\s*$`,"m"));if(r)return r[1]?.replace(/^["']|["']$/g,"").trim()||void 0}a(xd,"readYamlScalar");function Nk(t){if(process.env.AITABLE_DESIGN_PROMPT_FULL_SCHEMA!=="1")return Td;let e=lo.join(t,"src/recipe/types.ts");try{return["## Schema \u53C2\u8003\uFF08\u81EA\u52A8\u4ECE src/recipe/types.ts \u8BFB\u53D6\uFF09","","\u4EE5\u4E0B\u662F Recipe \u8FD0\u884C\u65F6\u7684\u5B8C\u6574\u7C7B\u578B\u5B9A\u4E49\uFF0C\u4F60\u751F\u6210\u7684 recipe \u6587\u4EF6\u5FC5\u987B\u7B26\u5408\u8FD9\u4E9B\u7C7B\u578B\uFF1A","","```typescript",gs(e,"utf8").trim(),"```"].join(`
493
+ `)}catch{return Td}}a(Nk,"loadSchemaReference");var Td=`## Schema \u53C2\u8003
494
+
495
+ > \u7CBE\u7B80\u8FD0\u884C\u5951\u7EA6\uFF1B\u5B8C\u6574\u7C7B\u578B\u7531\u9879\u76EE\u5185 src/recipe/types.ts \u63D0\u4F9B\uFF0C\u901A\u5E38\u65E0\u9700\u8BA9 Agent \u8BFB\u53D6\u3002
496
+
497
+ - RecipeDefinition = { meta: RecipeMeta; execute: (ctx: RecipeContext) => Promise<RecipeResult> }
498
+ - RecipeContext = { itemId, stepId, input, variables, toolkit, signal, log }
499
+ - RecipeResult = { status: "success"|"failed"|"blocked"|"needs_human", output, error?, logs }
500
+ - \u53EF\u7528 toolkit\u3001\u65B9\u6CD5\u4E0E\u526F\u4F5C\u7528\u6388\u6743\u89C1\u4E0B\u65B9\u300C\u53EF\u7528 Toolkit \u80FD\u529B\u300D\u6E05\u5355(\u4ECE\u6CE8\u518C\u8868\u52A8\u6001\u751F\u6210)`,Lk=`## \u793A\u4F8B\u53C2\u8003
501
+
502
+ ### workflow.yml \u793A\u4F8B\uFF08\u5BA2\u670D\u5DE5\u5355\u5904\u7406\uFF09
503
+ \`\`\`yaml
504
+ meta:
505
+ name: "\u5BA2\u670D\u5DE5\u5355\u5904\u7406"
506
+ version: "1.0.0"
507
+ domain: customer_service
508
+ description: "\u5BA2\u6237\u63D0\u4EA4\u5DE5\u5355\u540E\u7684\u81EA\u52A8\u5206\u7C7B\u3001\u6392\u67E5\u3001\u56DE\u590D\u3001\u5BA1\u6838\u5168\u6D41\u7A0B"
509
+
510
+ steps:
511
+ - id: classify
512
+ name: "\u5DE5\u5355\u5206\u7C7B"
513
+ recipe: classify-ticket
514
+ auto: true
515
+ input_mapping:
516
+ title: "\u6807\u9898"
517
+ description: "\u95EE\u9898\u63CF\u8FF0"
518
+ output_mapping:
519
+ category: "\u95EE\u9898\u7C7B\u578B"
520
+ priority: "\u7D27\u6025\u7A0B\u5EA6"
521
+
522
+ - id: draft_reply
523
+ name: "\u8349\u62DF\u56DE\u590D"
524
+ recipe: draft-reply
525
+ auto: true
526
+ input_mapping:
527
+ title: "\u6807\u9898"
528
+ solution: "\u89E3\u51B3\u65B9\u6848"
529
+ output_mapping:
530
+ reply: "\u56DE\u590D\u5185\u5BB9"
531
+
532
+ - id: quality_check
533
+ name: "\u8D28\u91CF\u5BA1\u6838"
534
+ recipe: quality-check
535
+ auto: false
536
+ needs_human:
537
+ reason: "\u56DE\u590D\u5185\u5BB9\u9700\u4EBA\u5DE5\u786E\u8BA4\u540E\u53D1\u9001\u7ED9\u5BA2\u6237"
538
+ assignee_field: "\u5904\u7406\u4EBA"
539
+ input_mapping:
540
+ reply: "\u56DE\u590D\u5185\u5BB9"
541
+
542
+ edges:
543
+ - from: __start__
544
+ to: classify
545
+ - from: classify
546
+ to: draft_reply
547
+ - from: draft_reply
548
+ to: quality_check
549
+ - from: quality_check
550
+ to: __end__
551
+ \`\`\`
552
+
553
+ ### recipe \u793A\u4F8B\uFF08classify-ticket.recipe.ts\uFF09
554
+ \`\`\`typescript
555
+ import type { RecipeDefinition, RecipeContext, RecipeResult } from "aitable-workflow-core";
556
+
557
+ const recipe: RecipeDefinition = {
558
+ meta: {
559
+ id: "classify-ticket",
560
+ name: "\u5DE5\u5355\u5206\u7C7B",
561
+ role: "\u667A\u80FD\u5206\u7C7B\u5458",
562
+ description: "\u6839\u636E\u5DE5\u5355\u6807\u9898\u548C\u63CF\u8FF0\uFF0C\u81EA\u52A8\u5206\u7C7B\u95EE\u9898\u7C7B\u578B\u548C\u7D27\u6025\u7A0B\u5EA6",
563
+ version: "1.0.0",
564
+ requiresAgent: false,
565
+ timeoutMs: 60_000,
566
+ },
567
+
568
+ async execute(ctx: RecipeContext): Promise<RecipeResult> {
569
+ const { input, toolkit } = ctx;
570
+ const title = String(input.title ?? "");
571
+ const description = String(input.description ?? "");
572
+
573
+ ctx.log(\`\u5F00\u59CB\u5206\u7C7B\u5DE5\u5355: \${title}\`);
574
+
575
+ const categories = ["\u529F\u80FD\u5F02\u5E38", "\u4F7F\u7528\u54A8\u8BE2", "\u6570\u636E\u95EE\u9898", "\u6743\u9650\u95EE\u9898", "\u5176\u4ED6"];
576
+ const classifyResult = await toolkit.ai.classify(
577
+ \`\u5DE5\u5355\u6807\u9898: \${title}\\n\u95EE\u9898\u63CF\u8FF0: \${description}\`,
578
+ categories,
579
+ );
580
+
581
+ return {
582
+ status: "success",
583
+ output: {
584
+ category: classifyResult.category,
585
+ priority: "P2-\u4E2D",
586
+ },
587
+ logs: [],
588
+ };
589
+ },
590
+ };
591
+
592
+ export default recipe;
593
+ \`\`\``;function Wk(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.join(`
594
+ `)}a(Wk,"buildUserRequirement");function Bk(t,e){let n=_d(t),r=[`- \`${t.workflowRelPath}\` \u2014 \u5B8C\u6574\u7684 workflow.yml\uFF08\u5305\u542B meta\u3001field_definitions\u3001steps\u3001edges\uFF1B\u4EC5\u4E8B\u4EF6\u9A71\u52A8\u573A\u666F\u5305\u542B event_sources\uFF09`,`- \`${t.recipeDirRelPath}/{step_id}.recipe.ts\` \u2014 \u6BCF\u4E2A\u6B65\u9AA4\u5BF9\u5E94\u7684 recipe \u6587\u4EF6`,...e?[`- \`${t.recipeDirRelPath}/{handler_id}_handler.recipe.ts\` \u2014 \u6BCF\u4E2A event_handler \u5BF9\u5E94\u7684 EventHandler Recipe \u6587\u4EF6`]:[],"- `./views.yml` \u2014 \u89C6\u56FE\u914D\u7F6E\uFF08\u6309\u89C6\u56FE\u751F\u6210\u89C4\u5219\u8F93\u51FA\uFF0C\u5B9A\u4E49\u8868\u683C\u7684\u89C6\u56FE\u7ED3\u6784\uFF09"],o=["## \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\u4EE5\u4E0B\u6587\u4EF6\uFF1A","",...r,"","recipe \u6587\u4EF6\u4E2D\u7684 import \u8DEF\u5F84\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84\u5F15\u7528 types\uFF1A","```typescript",`import type { RecipeDefinition, RecipeContext, RecipeResult } from "${n}";`,"```"];return e&&o.push("","EventHandler Recipe \u6587\u4EF6\u7684 import \u8DEF\u5F84\uFF1A","```typescript",`import type { EventHandlerRecipeDefinition, HandlerInitContext, HandlerInstance } from "${Id(t)}";`,`import type { ExternalEvent } from "${Ed(t)}";`,"```",""),o.push("\u76F4\u63A5\u521B\u5EFA\u6587\u4EF6\uFF0C\u4E0D\u8981\u8F93\u51FA\u5230\u804A\u5929\u3002\u5B8C\u6210\u540E\u5217\u51FA\u521B\u5EFA\u7684\u6587\u4EF6\u6E05\u5355\u3002"),o.join(`
595
+ `)}a(Bk,"buildOutputInstructions");var hs="aitable-workflow-core";function _d(t){return hs}a(_d,"recipeTypesImportPath");function Id(t){return hs}a(Id,"eventHandlerTypesImportPath");function Ed(t){return hs}a(Ed,"eventSourceTypesImportPath");function zk(t){let e=[t.scene,t.fullRequirement,t.clarifications??""].join(`
596
+ `);return/(群消息|消息监听|对话监听|conversation|webhook|事件源|外部事件|回调|EventHandler|event_handlers|event[-_\s]?driven|DingTalkMessageSource)/i.test(e)}a(zk,"shouldIncludeEventHandlerGuidance");import{access as Uk,readFile as ys}from"fs/promises";import Rn from"path";import qt from"typescript";import Ad from"yaml";async function Cn(t,e,n){let r=[],o=[];if(!await uo(t))return r.push(`workflow \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),{valid:!1,errors:r,warnings:o};let i;try{let u=await ys(t,"utf8");i=Ad.parse(u)}catch(u){return r.push(`workflow YAML \u89E3\u6790\u5931\u8D25: ${u instanceof Error?u.message:String(u)}`),{valid:!1,errors:r,warnings:o}}if(!y(i))return r.push("workflow.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{valid:!1,errors:r,warnings:o};Vk(i.meta,r,o);let s=qk(i.steps,r,o);Hk(i.edges,s,r,o);let c=Kk(i.steps);await Gk(c,e,r,o);let l=Zk(i.steps,i);Jk(i,r,o);let d=n??Rn.join(Rn.dirname(t),"views.yml");return await Yk(d,l,r,o),{valid:r.length===0,errors:r,warnings:o}}a(Cn,"validateDesignOutput");function Vk(t,e,n){if(!y(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(Vk,"validateMeta");function qk(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(!y(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(qk,"validateSteps");function Hk(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(!y(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(Hk,"validateEdges");function Kk(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)y(n)&&typeof n.recipe=="string"&&e.push(n.recipe);return e}a(Kk,"extractReferencedRecipes");async function Gk(t,e,n,r){if(!await uo(e)){t.length>0&&n.push(`recipe \u76EE\u5F55\u4E0D\u5B58\u5728: ${e}`);return}for(let o of t){let i=Rn.join(e,`${o}.recipe.ts`);if(!await uo(i)){n.push(`recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${i}\uFF08\u6B65\u9AA4\u5F15\u7528\u4E86 recipe="${o}"\uFF09`);continue}try{let s=await ys(i,"utf8");s.trim().length===0?n.push(`recipe \u6587\u4EF6\u4E3A\u7A7A: ${i}`):s.includes("export default")||n.push(`recipe \u6587\u4EF6\u7F3A\u5C11 "export default": ${i}`),s.includes("RecipeDefinition")||r.push(`recipe \u6587\u4EF6\u672A\u5F15\u7528 RecipeDefinition \u7C7B\u578B: ${i}`);let c=Qk(s,i);for(let l of c)n.push(l)}catch{n.push(`\u65E0\u6CD5\u8BFB\u53D6 recipe \u6587\u4EF6: ${i}`)}}}a(Gk,"validateRecipeFiles");function Jk(t,e,n){if(!y(t))return;let r=t.field_definitions;if(!Array.isArray(r)){e.push("workflow.yml \u7F3A\u5C11 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)y(s)&&typeof s.name=="string"&&o.add(s.name);let i=t.steps;if(Array.isArray(i))for(let s of i){if(!y(s))continue;let c=typeof s.id=="string"?s.id:"unknown";for(let l of["input_mapping","output_mapping"]){let d=s[l];if(y(d))for(let u of Object.values(d))typeof u=="string"&&(Dd.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(Jk,"validateFieldDefinitionsCoverage");var Dd=new Set(["\u6807\u9898","\u72B6\u6001","\u5F53\u524D\u6B65\u9AA4","\u5904\u7406\u4EBA","\u4E8B\u4EF6\u65E5\u5FD7","\u63CF\u8FF0","\u622A\u6B62\u65F6\u95F4"]);function Zk(t,e){let n=new Set(Dd);if(Array.isArray(t)){for(let r of t)if(y(r)){if(y(r.input_mapping))for(let o of Object.values(r.input_mapping))typeof o=="string"&&n.add(o);if(y(r.output_mapping))for(let o of Object.values(r.output_mapping))typeof o=="string"&&n.add(o)}}if(e&&Array.isArray(e.field_definitions))for(let r of e.field_definitions)y(r)&&typeof r.name=="string"&&n.add(r.name);return n}a(Zk,"extractAllFieldNames");async function Yk(t,e,n,r){if(!await uo(t)){r.push("views.yml \u4E0D\u5B58\u5728\uFF08\u5EFA\u8BAE\u751F\u6210\u89C6\u56FE\u914D\u7F6E\u4EE5\u4F18\u5316\u7528\u6237\u4F53\u9A8C\uFF09");return}let o;try{let c=await ys(t,"utf8");o=Ad.parse(c)}catch(c){n.push(`views.yml \u89E3\u6790\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`);return}if(!Array.isArray(o)){n.push("views.yml \u9876\u5C42\u5FC5\u987B\u662F\u6570\u7EC4");return}if(o.length===0){n.push("views.yml \u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A");return}let i=new Set,s=!1;for(let c=0;c<o.length;c++){let l=o[c],d=y(l)?`views[${c}] (id="${l.id??""}")`:`views[${c}]`,u=dn.safeParse(l);if(!u.success){let p=u.error.issues.map(m=>`${m.path.join(".")}: ${m.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 m of p)e.has(m)||n.push(`${d} \u5F15\u7528\u4E86\u672A\u5728 workflow \u4E2D\u5B9A\u4E49\u7684\u5B57\u6BB5: "${m}"\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('views.yml \u7F3A\u5C11 id="default_grid" \u7684 Grid \u89C6\u56FE\uFF08\u5EFA\u8BAE\u6DFB\u52A0\uFF09')}a(Yk,"validateViews");function Qk(t,e){let n=qt.createSourceFile(Rn.basename(e),t,qt.ScriptTarget.ESNext,!0,qt.ScriptKind.TS),r=n.parseDiagnostics??qt.createProgram({rootNames:[],options:{}}).getSyntacticDiagnostics(n);return!r||r.length===0?[]:r.map(o=>{let{line:i}=qt.getLineAndCharacterOfPosition(n,o.start),s=qt.flattenDiagnosticMessageText(o.messageText," ");return`recipe \u8BED\u6CD5\u9519\u8BEF [${Rn.basename(e)}:${i+1}]: ${s}`})}a(Qk,"checkRecipeSyntax");async function uo(t){try{return await Uk(t),!0}catch{return!1}}a(uo,"fileExists");import Xk from"path";async function Pd(t,e){return da(e?.executor,()=>eb(t,e))}a(Pd,"runDesign");async function eb(t,e){let n=e?.maxFixRounds??2,r=e?.timeoutMs??3e5,o=Date.now(),i={permissionMode:"bypassPermissions",...t.agentType==="codex"?{ignoreUserConfig:!0}:{}};e?.onRoundStart?.(1,!1);let s=Sn(t),c=Xk.resolve(t.workDir,"coding-agents.config.json"),l=a(()=>tb(o,r),"nextRoundTimeout"),d;try{let h=l();if(h<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${r}ms)`);d=await we(s,{agent:t.agentType,configPath:c,workDir:t.workDir,timeoutMs:h,onEvent:e?.onEvent,onLifecycle:e?.onAgentLifecycle,adapterOptions:i})}catch(h){return await fo(t,h,1,e)}let u=d.response,f=d.sessionId,p=await Cn(t.workflowPath,t.recipeDir);e?.onValidation?.(p,1);let m=1;for(;!p.valid&&m<=n;){m++,e?.onRoundStart?.(m,!0);let h=ms(p.errors),k;try{let w=l();if(w<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${r}ms)`);k=await we(h,{agent:t.agentType,configPath:c,workDir:t.workDir,sessionId:f,timeoutMs:w,onEvent:e?.onEvent,onLifecycle:e?.onAgentLifecycle,adapterOptions:i})}catch(w){let b=w instanceof Error?w.message:String(w);if(b.includes("already in use")||b.includes("session")){let C=Sn(t)+`
597
+
598
+ `+h;try{let S=l();if(S<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${r}ms)`);k=await we(C,{agent:t.agentType,configPath:c,workDir:t.workDir,timeoutMs:S,onEvent:e?.onEvent,onLifecycle:e?.onAgentLifecycle,adapterOptions:i})}catch(S){return await fo(t,S,m,e)}}else return await fo(t,w,m,e)}if(k.response.includes("already in use")){let w=Sn(t)+`
599
+
600
+ `+h;try{let b=l();if(b<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${r}ms)`);k=await we(w,{agent:t.agentType,configPath:c,workDir:t.workDir,timeoutMs:b,onEvent:e?.onEvent,onLifecycle:e?.onAgentLifecycle,adapterOptions:i})}catch(b){return await fo(t,b,m,e)}}u=k.response,f=k.sessionId,p=await Cn(t.workflowPath,t.recipeDir),e?.onValidation?.(p,m)}return{success:p.valid,validation:p,rounds:m,response:u}}a(eb,"runDesignInner");function tb(t,e,n=Date.now()){return Math.max(0,e-(n-t))}a(tb,"remainingDesignTimeoutMs");async function fo(t,e,n,r){let o=await Cn(t.workflowPath,t.recipeDir);r?.onValidation?.(o,n);let i=e instanceof Error?e.message:String(e);return{success:o.valid,validation:o,rounds:n,response:o.valid?`Coding Agent \u6536\u5C3E\u8D85\u65F6\uFF0C\u4F46\u5DF2\u751F\u6210\u5E76\u6821\u9A8C\u901A\u8FC7\u672C\u5730\u6587\u4EF6\uFF1A${i}`:`Coding Agent \u6267\u884C\u4E2D\u65AD\uFF0C\u5DF2\u4FDD\u7559\u5F53\u524D\u751F\u6210\u6587\u4EF6\uFF1A${i}`}}a(fo,"recoverGeneratedDesign");import{readFile as $d,writeFile as nb}from"fs/promises";import po from"yaml";var rb=["state","title","description","current_step","owner","event_log"],ob=["\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 Md(t){let{workflowPath:e,autoUpdate:n=!0}=t,r=await he(t.configPath),o=await $d(e,"utf8"),i=po.parse(o);if(!y(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(!y(v))continue;let x=typeof v.id=="string"?v.id:"unknown",_=typeof v.name=="string"?v.name:x;if(y(v.input_mapping))for(let R of Object.values(v.input_mapping))typeof R=="string"&&s.add(R);if(y(v.output_mapping))for(let[R,T]of Object.entries(v.output_mapping))typeof T=="string"&&c.set(T,{sourceStep:_,variable:R})}let l=await $d(r,"utf8"),d=po.parse(l);if(!y(d)||!y(d.tracker)||!y(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 rb){let x=f[v];x&&p.push({role:v,fieldName:x})}let m=null,h=f.description;for(let v of s)if(ob.includes(v)){(!h||h!==v)&&(m=v);break}let k=new Set(p.map(v=>v.fieldName)),w=[],b=new Set;for(let[v,x]of c)k.has(v)||(w.push({fieldName:v,sourceStep:x.sourceStep,type:"text",direction:"output"}),b.add(v));for(let v of s)!k.has(v)&&!b.has(v)&&(w.push({fieldName:v,sourceStep:"(\u7528\u6237\u8F93\u5165)",type:"text",direction:"input"}),b.add(v));let C=!1,S=!1;if(n){if(y(i)&&Array.isArray(i.field_definitions)){let v=i.field_definitions.filter(x=>y(x)&&typeof x.name=="string").map(x=>{let _=x,R={name:_.name,type:_.type??"text"};return Array.isArray(_.options)&&_.options.length>0&&(R.options=_.options),R});v.length>0&&(u.field_definitions=v,S=!0,C=!0,g.info("field-sync","\u540C\u6B65 field_definitions \u5230 config",{count:v.length}))}if(m&&h!==m&&(f.description=m,C=!0,g.info("field-sync","\u66F4\u65B0 description \u5B57\u6BB5",{from:h??"(\u7A7A)",to:m})),C){let v=po.stringify(d);po.parse(v),await nb(r,v,"utf8")}}return{scaffold:p,business:w,inputs:[...s],inferredDescription:m,configUpdated:C,fieldDefinitionsSynced:S}}a(Md,"syncFieldsFromWorkflow");function jd(t){console.log(`
601
+ \u{1F4CB} \u5B57\u6BB5\u8BA1\u5212:
602
+ `),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(`
603
+ \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(`
604
+ \u8F93\u51FA\u5B57\u6BB5\uFF08AI \u56DE\u5199\uFF0Csetup \u81EA\u52A8\u521B\u5EFA\uFF09:`);for(let{fieldName:o,sourceStep:i}of n)console.log(` "${o}"`.padEnd(20)+`\u2190 ${i}`)}t.inferredDescription&&console.log(`
605
+ \u{1F4A1} \u63A8\u65AD\u63CF\u8FF0\u5B57\u6BB5: "${t.inferredDescription}"`),t.configUpdated&&(console.log(`
606
+ \u2713 config \u5DF2\u81EA\u52A8\u66F4\u65B0`),t.fieldDefinitionsSynced&&console.log(" \u2514\u2500 field_definitions \u5DF2\u540C\u6B65\u5230 tracker.field_definitions"));let r=t.scaffold.length+t.business.length;console.log(`
607
+ \u5171 ${r} \u4E2A\u5B57\u6BB5\uFF08${t.scaffold.length} \u9AA8\u67B6 + ${e.length} \u8F93\u5165 + ${n.length} \u8F93\u51FA\uFF09`),console.log("")}a(jd,"printFieldPlan");import{readFile as Fd,writeFile as ib}from"fs/promises";import go from"yaml";async function Od(t){let{viewsPath:e,autoUpdate:n=!0,knownFieldNames:r}=t,o=await he(t.configPath),i;try{i=await Fd(e,"utf8")}catch{return g.info("view-sync","views.yml \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u89C6\u56FE\u540C\u6B65"),{syncedCount:0,skippedViews:[],configUpdated:!1,views:[]}}let s;try{s=go.parse(i)}catch(f){return g.warn("view-sync","views.yml \u89E3\u6790\u5931\u8D25",{error:String(f)}),{syncedCount:0,skippedViews:[{id:"(all)",reason:"YAML \u89E3\u6790\u5931\u8D25"}],configUpdated:!1,views:[]}}if(!Array.isArray(s))return g.warn("view-sync","views.yml \u9876\u5C42\u5FC5\u987B\u662F\u6570\u7EC4"),{syncedCount:0,skippedViews:[{id:"(all)",reason:"\u9876\u5C42\u4E0D\u662F\u6570\u7EC4"}],configUpdated:!1,views:[]};let c=[],l=[],d=new Set;for(let f=0;f<s.length;f++){let p=s[f],m=y(p)?String(p.id??`view_${f}`):`view_${f}`,h=dn.safeParse(p);if(!h.success){let w=h.error.issues.map(b=>b.message).join("; ");l.push({id:m,reason:`Schema \u6821\u9A8C\u5931\u8D25: ${w}`});continue}let k=h.data;if(d.has(k.id)){l.push({id:k.id,reason:"id \u91CD\u590D"});continue}if(d.add(k.id),r){let w=sb(k,r);w.length>0&&g.warn("view-sync",`\u89C6\u56FE "${k.id}" \u5F15\u7528\u4E86\u672A\u77E5\u5B57\u6BB5`,{unknownFields:w})}c.push(k)}let u=!1;return n&&c.length>0&&(u=await ab(o,c)),{syncedCount:c.length,skippedViews:l,configUpdated:u,views:c}}a(Od,"syncViewsFromDesign");function Nd(t){if(!(t.syncedCount===0&&t.skippedViews.length===0)){if(console.log(`
608
+ \u{1F4D0} \u89C6\u56FE\u914D\u7F6E:
609
+ `),t.views.length>0)for(let e of t.views){let n=e.visible_fields?.length??e.field_order?.length??0,r=n>0?` (${n} \u4E2A\u5B57\u6BB5)`:"";console.log(` [${e.type}] "${e.name}"${r}`)}if(t.skippedViews.length>0){console.log(`
610
+ \u26A0 \u8DF3\u8FC7\u7684\u89C6\u56FE:`);for(let{id:e,reason:n}of t.skippedViews)console.log(` \u2717 ${e}: ${n}`)}t.configUpdated&&console.log(`
611
+ \u2713 \u89C6\u56FE\u914D\u7F6E\u5DF2\u5199\u5165 config`),console.log(`
612
+ \u5171 ${t.syncedCount} \u4E2A\u89C6\u56FE\u914D\u7F6E\u5DF2\u540C\u6B65`),console.log("")}}a(Nd,"printViewSyncResult");function sb(t,e){let n=[],r=t.visible_fields??t.field_order??[];for(let o of r)e.has(o)||n.push(o);return t.group_by&&!e.has(t.group_by)&&n.push(t.group_by),t.date_field&&!e.has(t.date_field)&&n.push(t.date_field),n}a(sb,"findUnknownFields");async function ab(t,e){try{let n=await Fd(t,"utf8"),r=go.parse(n);if(!y(r)||!y(r.tracker))return g.warn("view-sync","config \u7F3A\u5C11 tracker \u6BB5\uFF0C\u65E0\u6CD5\u5199\u5165\u89C6\u56FE"),!1;let o=e.map(s=>{let c={id:s.id,type:s.type,name:s.name};return s.field_order&&(c.field_order=s.field_order),s.visible_fields&&(c.visible_fields=s.visible_fields),s.group_by&&(c.group_by=s.group_by),s.date_field&&(c.date_field=s.date_field),s.description&&(c.description=s.description),s.for_each_step&&(c.for_each_step=s.for_each_step),c});r.tracker.views=o;let i=go.stringify(r);return go.parse(i),await ib(t,i,"utf8"),g.info("view-sync","\u89C6\u56FE\u914D\u7F6E\u5DF2\u5199\u5165 config",{count:e.length}),!0}catch(n){return g.warn("view-sync","\u5199\u5165 config \u5931\u8D25",{error:String(n)}),!1}}a(ab,"mergeViewsToConfig");import{readFile as Nb}from"fs/promises";import Lb from"yaml";var cb=["im_message","cron_schedule","manual_create","event_driven"];async function mo(t){let e=ho(t.scene,t.existingFields);if(!t.llm||!t.llm.api_key)return g.debug("discovery","LLM \u672A\u914D\u7F6E\uFF0C\u4F7F\u7528\u542F\u53D1\u5F0F\u9884\u586B"),e;try{let n=await db(t);return ub(n,e,t.existingFields)}catch(n){return g.debug("discovery","LLM \u9884\u586B\u5931\u8D25\uFF0C\u964D\u7EA7\u542F\u53D1\u5F0F",{error:n instanceof Error?n.message:String(n)}),e}}a(mo,"inferSkeleton");var lb={shape:"string \u2014 \u573A\u666F\u5F62\u6001\u663E\u793A\u540D\uFF0C\u5982 \u5BA2\u670D\u5DE5\u5355\u5904\u7406\u6D41\u7A0B",triggers:["string \u2014 \u89E6\u53D1\u65B9\u5F0F\u673A\u5668\u503C\uFF0C\u53D6\u503C im_message | cron_schedule | manual_create | event_driven\uFF0C\u53EF\u591A\u4E2A"],stages:["string \u2014 \u6309\u4E1A\u52A1\u987A\u5E8F\u62C6\u51FA\u7684\u73AF\u8282\u540D\uFF08\u7B80\u77ED\uFF09\uFF0C\u5982 \u5DE5\u5355\u5206\u7C7B / \u56DE\u590D\u8D28\u68C0"],humanGates:["string \u2014 stages \u4E2D\u5EFA\u8BAE\u4EBA\u5DE5\u628A\u5173\u540E\u624D\u80FD\u7EE7\u7EED\u7684\u73AF\u8282\u540D\uFF08\u5FC5\u987B\u662F stages \u7684\u5B50\u96C6\uFF09"],dataGaps:["string \u2014 \u5EFA\u8BAE\u8BB0\u5F55/\u6C89\u6DC0\u7684\u5173\u952E\u4FE1\u606F\u5B57\u6BB5\u540D\uFF08\u4E0D\u542B\u8868\u683C\u5DF2\u6709\u5B57\u6BB5\uFF09"]};async function db(t){let e=Yt({llm:t.llm}),n=["\u4F60\u662F aitable-workflow \u5DE5\u4F5C\u6D41\u8BBE\u8BA1\u7684\u9700\u6C42\u5206\u6790\u5E08\u3002","\u9605\u8BFB\u7528\u6237\u7684\u4E1A\u52A1\u573A\u666F\u63CF\u8FF0\uFF0C\u62BD\u53D6\u7528\u4E8E\u300C\u9700\u6C42\u6F84\u6E05\u95EE\u5377\u9884\u586B\u300D\u7684\u7ED3\u6784\u5316\u4FE1\u606F\u3002","","\u8981\u6C42\uFF1A","1. triggers \u53EF\u591A\u9009\uFF1A\u4E00\u4E2A\u6D41\u7A0B\u53EF\u80FD\u540C\u65F6\u6709\u591A\u79CD\u89E6\u53D1\u5165\u53E3\uFF08\u5982\u7FA4\u6D88\u606F + \u5B9A\u65F6\u515C\u5E95\uFF09\u3002","2. stages \u662F\u73AF\u8282\u540D\u5217\u8868\uFF0C\u4F9B\u7528\u6237\u52FE\u9009\u54EA\u4E9B\u8981\u4EBA\u5DE5\u628A\u5173\uFF1B\u4E0D\u8981\u8F93\u51FA\u7F16\u7A0B\u5B9E\u73B0\u7EC6\u8282\u6216\u89D2\u8272\u5212\u5206\u3002","3. humanGates \u5FC5\u987B\u662F stages \u7684\u5B50\u96C6\uFF0C\u53EA\u5217\u771F\u6B63\u9700\u8981\u4EBA\u628A\u5173\uFF08\u6709\u98CE\u9669\u3001\u9700\u5224\u65AD\uFF09\u7684\u73AF\u8282\u3002","4. dataGaps \u53EA\u5217\u8868\u683C\u5C1A\u672A\u5B58\u5728\u3001\u4F46\u8FD9\u4E2A\u6D41\u7A0B\u9700\u8981\u8BB0\u5F55/\u6C89\u6DC0\u7684\u5173\u952E\u4FE1\u606F\u5B57\u6BB5\u3002","",`\u5DF2\u6709\u8868\u683C\u5B57\u6BB5\uFF1A${t.existingFields.length?t.existingFields.join("\u3001"):"\uFF08\u65E0/\u672A\u77E5\uFF09"}`,"","\u4E1A\u52A1\u573A\u666F\uFF1A",t.scene].join(`
613
+ `);return e.chatJSON(n,lb,{temperature:0})}a(db,"inferWithLLM");function ub(t,e,n){let r=new Set(n),o=t.stages?.length?t.stages:e.stages,i=new Set(o);return{shape:t.shape?.trim()||e.shape,triggers:bb(t.triggers)??e.triggers,stages:o,humanGates:(t.humanGates?.length?t.humanGates:e.humanGates).filter(s=>i.has(s)),dataGaps:(t.dataGaps?.length?t.dataGaps:e.dataGaps).filter(s=>!r.has(s))}}a(ub,"mergeInference");var fb=[{re:/(群|钉钉|消息|会话|@|艾特)/,value:"im_message"},{re:/(每天|每日|定时|定期|每周|每小时|cron|周期)/,value:"cron_schedule"},{re:/(webhook|事件|回调|外部系统触发)/,value:"event_driven"},{re:/(提交|填写|表单|手动新建|录入)/,value:"manual_create"}],pb=[{re:/(客服|工单|售后|投诉)/,shape:"\u5BA2\u670D\u5DE5\u5355\u5904\u7406\u6D41\u7A0B"},{re:/(分诊|建单|分流|triage)/i,shape:"\u6D88\u606F\u5206\u8BCA\u5EFA\u5355\u6D41\u7A0B"},{re:/(摘要|简报|日报|digest|汇总推送)/i,shape:"\u6BCF\u65E5\u6458\u8981\u63A8\u9001\u6D41\u7A0B"}],gb=/(人工|审核|质检|审批|把关|复核|人工确认|确认节点|确认.*(草稿|内容|方案|结果|材料|邮件))/i,mb=/(自动|系统自动|无需人工|不需要人工)/,hb=/(按钮|UI|schema|workflow\s+的|运行日志|现场演示|稳定|不要|必须|只通过|写入结果字段)/i;function ho(t,e){let n=fb.filter(s=>s.re.test(t)).map(s=>s.value),r=pb.find(s=>s.re.test(t))?.shape??"\u81EA\u5B9A\u4E49\u6D41\u7A0B",o=yb(t),i=o.filter(kb);return{shape:r,triggers:n.length?Array.from(new Set(n)):["manual_create"],stages:o,humanGates:i,dataGaps:[]}}a(ho,"heuristicInference");function yb(t){let e=[];for(let n of t.split(`
614
+ `).map(r=>r.trim()).filter(Boolean)){let r=n.match(/^(?:\d+[.、)]\s*|[-*]\s*)(.+)$/);if(!r)continue;let o=(r[1]??"").split(/[::]/)[0].trim();if(!wb(o))continue;let i=o;i&&e.push(i)}return e}a(yb,"extractStages");function wb(t){return hb.test(t)?!1:/(提交|填写|录入|创建|新建|校验|检查|准备|生成|确认|审核|审批|发送|通知|推送|回复|分类|排查|归档|汇总|处理)/.test(t)}a(wb,"isLikelyStage");function kb(t){return mb.test(t)&&!/(人工|审核|审批|把关|复核|质检|人工确认|确认节点)/i.test(t)||/确认后/.test(t)&&!/(人工|审核|审批|把关|复核|质检|人工确认|确认节点)/i.test(t)?!1:gb.test(t)}a(kb,"isHumanGateStage");function bb(t){if(!t?.length)return;let e=t.filter(n=>cb.includes(n));return e.length?Array.from(new Set(e)):void 0}a(bb,"normalizeTriggers");async function ws(t){let{baseId:e,tableId:n}=t;if(!e?.trim()||!n?.trim())return[];let r=new re({bin:t.dwsBin??"dws",timeoutMs:t.timeoutMs??15e3,runner:t.runner});try{let o=await r.runJson(["aitable","field","get","--base-id",e,"--table-id",n]),i=ie(o),s=[];for(let c of i){if(!y(c))continue;let l=typeof c.fieldName=="string"?c.fieldName:null;l&&s.push(l)}return s}catch(o){return g.debug("discovery","\u8BFB\u53D6\u8868\u683C\u5B57\u6BB5\u5931\u8D25\uFF0C\u6309\u7A7A\u5904\u7406",{error:o instanceof Error?o.message:String(o)}),[]}}a(ws,"readExistingFields");var vb=[{label:"\u7FA4\u6D88\u606F\u89E6\u53D1",value:"im_message"},{label:"\u5B9A\u65F6\u89E6\u53D1",value:"cron_schedule"},{label:"\u624B\u52A8\u65B0\u5EFA",value:"manual_create"},{label:"\u7CFB\u7EDF\u4E8B\u4EF6",value:"event_driven"}];function yo(t,e){let n=[];return n.push({id:"triggers",label:"\u8FD9\u4E2A\u6D41\u7A0B\u600E\u4E48\u88AB\u89E6\u53D1\uFF1F\uFF08\u53EF\u591A\u9009\uFF09",type:"checkbox",defaultValue:t.triggers,options:vb,allowCustom:!0}),n.push({id:"humanGates",label:"\u54EA\u4E9B\u73AF\u8282\u9700\u8981\u4EBA\u5DE5\u628A\u5173\u540E\u624D\u80FD\u7EE7\u7EED\uFF1F",type:"checkbox",defaultValue:t.humanGates,options:t.stages.map(r=>({label:r,value:r})),allowCustom:!0}),n.push(Sb(t,e.existingFields)),n.push({id:"onFailure",label:"\u51FA\u9519\u3001\u8D85\u65F6\u6216\u5361\u4F4F\u65F6\u600E\u4E48\u5904\u7406\uFF1F\u901A\u77E5\u8C01\uFF1F",type:"text",placeholder:"\u4F8B\uFF1A\u8D85\u65F6 30 \u5206\u949F\u901A\u77E5 @\u5BA2\u670D\u4E3B\u7BA1\uFF0C\u8FDE\u7EED\u5931\u8D25\u8F6C\u4EBA\u5DE5"}),n.push({id:"constraints",label:"\u8FD8\u6709\u4EC0\u4E48\u5FC5\u987B\u9075\u5B88\u7684\u89C4\u5219\u6216\u8981\u907F\u514D\u7684\u505A\u6CD5\uFF1F\uFF08\u53EF\u8DF3\u8FC7\uFF09",type:"textarea",placeholder:"SLA\u3001VIP \u4F18\u5148\u3001\u654F\u611F\u8BCD\u8FC7\u6EE4\u3001\u7981\u6B62\u81EA\u52A8\u53D1\u9001\u2026"}),{id:"discovery",title:"\u786E\u8BA4\u51E0\u70B9\u540E\u5F00\u59CB\u751F\u6210",description:"\u4EE5\u4E0B\u662F\u6211\u4ECE\u4F60\u7684\u573A\u666F\u63CF\u8FF0\u9884\u586B\u7684\uFF0C\u6539\u4E00\u6539\u3001\u52FE\u4E00\u52FE\u5373\u53EF\uFF0C\u4E0D\u5FC5\u4ECE\u96F6\u586B\u5199\u3002",questions:n}}a(yo,"buildDiscoveryForm");function Sb(t,e){let n=new Set(e),r=e.map(i=>({label:`${i}\uFF08\u5DF2\u5B58\u5728\uFF09`,value:i}));for(let i of t.dataGaps)n.has(i)||r.push({label:i,value:i});return{id:"trackFields",label:`\u8FD9\u4E2A\u6D41\u7A0B\u8981\u8BB0\u5F55 / \u6C89\u6DC0\u54EA\u4E9B\u5173\u952E\u4FE1\u606F\uFF1F${e.length?`\uFF08\u5DF2\u6709\uFF1A${e.join(" / ")}\uFF09`:""}`,type:"checkbox",defaultValue:e,options:r,allowCustom:!0}}a(Sb,"buildTrackFieldsQuestion");import{select as Rb,checkbox as Cb,input as ks,confirm as xb}from"@inquirer/prompts";var Ld="__custom__";async function Wd(t){console.log(`
615
+ \u{1F4DD} ${t.title}`),t.description&&console.log(` ${t.description}
616
+ `);let e={};for(let n of t.questions)e[n.id]=await Tb(n);return e}a(Wd,"renderForm");async function Tb(t){switch(t.type){case"radio":return _b(t);case"checkbox":return Ib(t);case"switch":return Eb(t);default:return Ab(t)}}a(Tb,"renderQuestion");async function _b(t){let e=(t.options??[]).map(o=>({name:o.description?`${o.label} \u2014 ${o.description}`:o.label,value:o.value}));t.allowCustom!==!1&&e.push({name:"\u5176\u4ED6 \u2014 \u624B\u52A8\u8F93\u5165",value:Ld});let n=typeof t.defaultValue=="string"?t.defaultValue:void 0,r=await Rb({message:t.label,choices:e,default:n});return r===Ld?(await ks({message:`${t.label}\uFF08\u8BF7\u8F93\u5165\uFF09`})).trim():r}a(_b,"renderRadio");async function Ib(t){let e=new Set(Db(t.defaultValue)),n=(t.options??[]).map(o=>({name:o.description?`${o.label} \u2014 ${o.description}`:o.label,value:o.value,checked:e.has(o.value)})),r=n.length?await Cb({message:t.label,choices:n}):[];if(t.allowCustom){let o=(await ks({message:`${t.label} \u2014 \u8865\u5145\uFF08\u9017\u53F7\u5206\u9694\uFF0C\u56DE\u8F66\u8DF3\u8FC7\uFF09`,default:""})).trim();if(o)for(let i of o.split(/[,,]/).map(s=>s.trim()).filter(Boolean))r.includes(i)||r.push(i)}return r}a(Ib,"renderCheckbox");async function Eb(t){let e=t.defaultValue==="true"||t.defaultValue===!0;return xb({message:t.label,default:e})}a(Eb,"renderSwitch");async function Ab(t){let e=typeof t.defaultValue=="string"?t.defaultValue:"",n=t.placeholder?`${t.label}
617
+ (${t.placeholder})`:t.label;return(await ks({message:n,default:e})).trim()}a(Ab,"renderText");function Db(t){return Array.isArray(t)?t:typeof t=="string"&&t?[t]:[]}a(Db,"toStringArray");function Bd(t,e){let n=[`[form answers \u2014 ${t.id}]`];for(let r of t.questions){let o=bs(r,e[r.id]);n.push(`- ${r.label}: ${o}`)}return n.join(`
618
+ `)}a(Bd,"serializeForm");function Pb(t){return t.map(({form:e,answers:n})=>Bd(e,n)).join(`
619
+
620
+ `)}a(Pb,"serializeForms");var $b={triggers:"\u89E6\u53D1\u65B9\u5F0F",humanGates:"\u9700\u4EBA\u5DE5\u628A\u5173",trackFields:"\u9700\u8BB0\u5F55\u5B57\u6BB5",onFailure:"\u5F02\u5E38\u5904\u7406",constraints:"\u5176\u4ED6\u7EA6\u675F"};function xn(t){let e=["\u7528\u6237\u5DF2\u786E\u8BA4\uFF1A"];for(let{form:n,answers:r}of t)for(let o of n.questions){let i=$b[o.id]??o.label,s=bs(o,r[o.id]);e.push(`- ${i}\uFF1A${s}`)}return e.join(`
621
+ `)}a(xn,"summarizeForms");function bs(t,e){if(e===void 0||Mb(e))return"(skipped)";switch(t.type){case"switch":return jb(e)?"\u662F":"\u5426";case"radio":{let n=String(e),r=t.options?.find(o=>o.value===n);return r&&r.label!==r.value?`${r.label} [value: ${r.value}]`:n}case"checkbox":return(Array.isArray(e)?e:[String(e)]).map(o=>t.options?.find(s=>s.value===o)?.label??o).join(", ");default:return String(e)}}a(bs,"formatAnswerDisplay");function Mb(t){return typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:!1}a(Mb,"isEmpty");function jb(t){return typeof t=="boolean"?t:String(t)==="true"||t==="\u662F"}a(jb,"toBool");var Fb={brief:"string \u2014 \u7528\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0\u7684\u8BBE\u8BA1\u7EA6\u675F\u6458\u8981\uFF0C200\u5B57\u4EE5\u5185\uFF0C\u4E0D\u542B\u95EE\u5377\u683C\u5F0F\u6216 [form answers] \u6807\u8BB0"};async function vs(t){let e=xn(t.filled);if(!t.llm||!t.llm.api_key)return g.debug("discovery","LLM \u672A\u914D\u7F6E\uFF0C\u4F7F\u7528\u673A\u68B0 fallback brief"),e;try{let o=(await Yt({llm:t.llm}).chatJSON(Ob(t.scene,e),Fb,{temperature:0})).brief?.trim();if(o)return g.debug("discovery","LLM \u751F\u6210 design brief",{length:o.length}),o}catch(n){g.debug("discovery","LLM \u751F\u6210 brief \u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A fallback",{error:n instanceof Error?n.message:String(n)})}return e}a(vs,"buildDesignBrief");function Ob(t,e){return["\u4F60\u662F aitable-workflow \u5DE5\u4F5C\u6D41\u8BBE\u8BA1\u7684\u9700\u6C42\u5206\u6790\u5E08\u3002","\u8BF7\u6839\u636E\u4EE5\u4E0B\u573A\u666F\u548C\u5DF2\u786E\u8BA4\u7EA6\u675F\uFF0C\u6539\u5199\u4E3A\u4E00\u6BB5\u6D41\u7545\u3001\u7B80\u6D01\u7684\u8BBE\u8BA1\u6458\u8981\uFF08design brief\uFF09\uFF0C\u4F9B Coding Agent \u751F\u6210 workflow \u65F6\u53C2\u8003\u3002","","\u8981\u6C42\uFF1A","1. \u7528\u81EA\u7136\u8BED\u8A00\u53D9\u8FF0\uFF0C\u4E0D\u8981\u51FA\u73B0 [form answers]\u3001\u95EE\u5377\u683C\u5F0F\u6216\u9898\u76EE\u6807\u7B7E","2. \u53EA\u4FDD\u7559\u4F1A\u5B9E\u8D28\u5F71\u54CD workflow \u5F62\u6001\u7684\u5173\u952E\u4FE1\u606F","3. \u672A\u6307\u5B9A\u7684\u7EA6\u675F\u4E0D\u8981\u786C\u51D1","4. \u63A7\u5236\u5728 200 \u5B57\u4EE5\u5185","","\u573A\u666F\u63CF\u8FF0\uFF1A",t.trim(),"","\u5DF2\u786E\u8BA4\u7EA6\u675F\uFF1A",e,"","\u8BF7\u76F4\u63A5\u8F93\u51FA brief \u6587\u672C\uFF0C\u4E0D\u8981\u89E3\u91CA\u3002"].join(`
622
+ `)}a(Ob,"buildBriefPrompt");async function zd(t){if(t.yes||t.skipQuestions)return g.debug("discovery","\u8DF3\u8FC7\u6F84\u6E05\u95EE\u5377\uFF08--yes / --skip-questions\uFF09"),{clarifications:""};console.log(`
623
+ \u{1F50E} \u6F84\u6E05\u9700\u6C42 \u2014 \u6211\u5148\u6839\u636E\u4F60\u7684\u573A\u666F\u9884\u586B\u4E00\u7248\uFF0C\u4F60\u6765\u6821\u6B63\uFF08\u7EA6 1 \u5206\u949F\uFF09`);let e=await Ud(t.configPath),n=await ws({baseId:e.baseId,tableId:e.tableId,dwsBin:e.dwsBin}),r=await mo({scene:t.scene,existingFields:n,llm:e.llm}),o=Bb(r.triggers);console.log(`
624
+ \u5DF2\u7406\u89E3\u2014\u2014${r.shape}${o?`\u3001${o}`:""}\u3002\u786E\u8BA4\u51E0\u70B9\u540E\u6211\u5C31\u5F00\u59CB\u751F\u6210\uFF1A`);let s=yo(r,{existingFields:n}),c=await Wd(s),l=[{form:s,answers:c}],d=await vs({scene:t.scene,filled:l,llm:e.llm});return g.debug("discovery","\u6F84\u6E05\u95EE\u5377\u5B8C\u6210",{length:d.length}),{clarifications:d}}a(zd,"runDiscovery");async function tF(t){let e=t.mode??"smart",n=await Ud(t.configPath),r=e==="fast"?[]:await ws({baseId:n.baseId,tableId:n.tableId,dwsBin:n.dwsBin,timeoutMs:t.fieldReadTimeoutMs}),o=e==="fast"?ho(t.scene,r):await mo({scene:t.scene,existingFields:r,llm:n.llm}),i=yo(o,{existingFields:r}),s=Object.fromEntries(i.questions.map(d=>[d.id,d.defaultValue??""])),c=[{form:i,answers:s}],l=e==="fast"?xn(c):await vs({scene:t.scene,filled:c,llm:n.llm});return{clarifications:l,summary:l.replace(/\s+/g," ").trim(),form:i,answers:s}}a(tF,"runAutoDiscovery");var Wb={im_message:"\u7FA4\u6D88\u606F\u89E6\u53D1",cron_schedule:"\u5B9A\u65F6\u89E6\u53D1",manual_create:"\u624B\u52A8\u65B0\u5EFA",event_driven:"\u7CFB\u7EDF\u4E8B\u4EF6\u89E6\u53D1"};function Bb(t){return t.map(n=>Wb[n]).filter(Boolean).join(" / ")}a(Bb,"describeTriggers");async function Ud(t){let e={baseId:"",tableId:"",dwsBin:"dws"};try{let n=await he(t),r=Lb.parse(await Nb(n,"utf8"));if(!y(r))return e;let o=y(r.tracker)?r.tracker:{},i=y(r.recipe)?r.recipe:{},s=y(i.llm)?i.llm:void 0;return{baseId:typeof o.base_id=="string"?o.base_id:"",tableId:typeof o.table_id=="string"?o.table_id:"",dwsBin:typeof o.dws_bin=="string"?o.dws_bin:"dws",llm:s}}catch(n){return g.debug("discovery","\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25\uFF0C\u6309\u9ED8\u8BA4\u5904\u7406",{error:n instanceof Error?n.message:String(n)}),e}}a(Ud,"loadDiscoveryConfig");async function mF(t){let e=t.config??"./aitable-workflow.config.yml";console.log(`
625
+ \u{1F3A8} Design \u2014 \u8BA9 Coding Agent \u751F\u6210\u5DE5\u4F5C\u6D41\u548C\u5904\u65B9
626
+ `);let n=await wd({configPath:e,yes:t.yes});console.log(`
627
+ \u{1F4DD} \u573A\u666F: ${n.scene}`),n.supplements&&console.log(` \u8865\u5145: ${n.supplements}`);let r=await zd({scene:n.scene,configPath:e,yes:t.yes,skipQuestions:t.skipQuestions});r.clarifications&&(n.clarifications=r.clarifications,console.log(`
628
+ \u2705 \u5DF2\u6839\u636E\u6F84\u6E05\u7ED3\u679C\u66F4\u65B0\u9700\u6C42\uFF0C\u5C06\u5E76\u5165 Coding Agent \u8F93\u5165\u3002`)),console.log(` Agent: ${n.agentType??"(llm_only\uFF0C\u65E0 coding agent)"}`),console.log(` \u8F93\u51FA: ${n.workflowPath}`),console.log(` ${n.recipeDir}/
629
+ `),console.log(`\u{1F680} \u5F00\u59CB\u8C03\u7528 Coding Agent \u751F\u6210...
630
+ `);let o=await Pd(n,{timeoutMs:n.agentTimeoutMs,onRoundStart:a((i,s)=>{s&&console.log(`
631
+ \u{1F527} \u4FEE\u6B63\u8F6E\u6B21 ${i-1}...
632
+ `)},"onRoundStart"),onValidation:a((i,s)=>{if(i.valid)console.log(`
633
+ \u2705 \u6821\u9A8C\u901A\u8FC7 (\u8F6E\u6B21 ${s})`);else{console.log(`
634
+ \u26A0\uFE0F \u6821\u9A8C\u53D1\u73B0 ${i.errors.length} \u4E2A\u95EE\u9898 (\u8F6E\u6B21 ${s}):`);for(let c of i.errors)console.log(` \u2717 ${c}`)}if(i.warnings.length>0)for(let c of i.warnings)console.log(` \u26A1 ${c}`)},"onValidation"),onEvent:a(i=>{if(i.type==="tool_use"&&i.toolName){let s=i.toolInput?` ${i.toolInput}`:"";process.stdout.write(` \u2699\uFE0F ${i.toolName}${s}
635
+ `)}else i.type==="error"&&i.content&&process.stdout.write(` \u274C [Agent Error] ${i.content}
636
+ `)},"onEvent")});if(!o.success&&o.response){console.log(`
637
+ \u{1F4DD} Agent \u54CD\u5E94\u6458\u8981:`);let i=o.response.length>500?o.response.slice(0,500)+"...(truncated)":o.response;console.log(` ${i.replace(/\n/g,`
638
+ `)}`)}else!o.success&&!o.response&&(console.log(`
639
+ \u26A0\uFE0F Agent \u672A\u8FD4\u56DE\u4EFB\u4F55\u54CD\u5E94\uFF0C\u53EF\u80FD\u539F\u56E0\uFF1A`),console.log(" - claude CLI \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH \u4E2D"),console.log(" - Agent \u6267\u884C\u8D85\u65F6"),console.log(" - Agent \u8FD4\u56DE\u4E86\u7A7A\u5185\u5BB9"),console.log(`
640
+ \u8C03\u8BD5\u5EFA\u8BAE: \u624B\u52A8\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u67E5\u770B Agent \u662F\u5426\u6B63\u5E38\uFF1A`),console.log(" claude --version"));if(o.success){try{let i=await Md({workflowPath:n.workflowPath,configPath:e,autoUpdate:!0});jd(i)}catch(i){console.log(`
641
+ \u26A0\uFE0F \u5B57\u6BB5\u540C\u6B65\u8DF3\u8FC7: ${i instanceof Error?i.message:String(i)}`)}try{let i=zb.resolve(n.workDir,"views.yml"),s=await Od({viewsPath:i,configPath:e,autoUpdate:!0});Nd(s)}catch(i){console.log(`
642
+ \u26A0\uFE0F \u89C6\u56FE\u540C\u6B65\u8DF3\u8FC7: ${i instanceof Error?i.message:String(i)}`)}}if(console.log(`
643
+ `+"\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}`),console.log(`
644
+ \u4E0B\u4E00\u6B65:`),console.log(" 1. \u68C0\u67E5\u751F\u6210\u7684 workflow\u3001recipes \u548C views"),console.log(" 2. \u8FD0\u884C `aitable-workflow setup` \u521D\u59CB\u5316\u8868\u7ED3\u6784\u548C\u89C6\u56FE"),console.log(" 3. \u8FD0\u884C `aitable-workflow run` \u542F\u52A8\u5F15\u64CE\n");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(mF,"runDesignCommand");import Gt from"path";import{access as kv,mkdir as mu,stat as bv}from"fs/promises";import{readFile as Ub,writeFile as Vb}from"fs/promises";import{homedir as qb}from"os";import Ht from"path";var Ss="# >>> aitable-workflow DWS PATH >>>",Rs="# <<< aitable-workflow DWS PATH <<<",Hb=new RegExp(`${qd(Ss)}[\\s\\S]*?${qd(Rs)}(?:\\r?\\n)?`,"g");async function Kd(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??Kb(e.env??process.env,e.homeDir??qb(),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=Ht.dirname(t);if(o.includes(`
645
+ `)||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 Ub(r,"utf8")}catch(p){if(!Gb(p)||p.code!=="ENOENT")return{status:"failed",configPath:r,detail:Hd(p)}}let s=Vd(i,Ss),c=Vd(i,Rs);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
646
+ `)?`\r
647
+ `:`
648
+ `,d=i.replace(Hb,"").trimEnd(),u=[Ss,"# Managed by aitable-workflow init; changes inside this block may be replaced.",`export PATH=${Cs(o)}:"$PATH"`,Rs].join(l),f=`${d}${d?`${l}${l}`:""}${u}${l}`;if(f===i)return{status:"persisted",configPath:r,changed:!1};try{return await Vb(r,f,"utf8"),{status:"persisted",configPath:r,changed:!0}}catch(p){return{status:"failed",configPath:r,detail:Hd(p)}}}a(Kd,"persistGlobalDwsPath");function Gd(t){return`source ${Cs(t)}`}a(Gd,"buildShellReloadCommand");function Jd(t){return`export PATH=${Cs(Ht.dirname(t))}:"$PATH"`}a(Jd,"buildShellPathCommand");function Kb(t,e,n){let r=Ht.basename(t.SHELL||"");return r==="zsh"?Ht.join(e,".zshrc"):r==="bash"?Ht.join(e,n==="darwin"?".bash_profile":".bashrc"):r==="sh"||r==="dash"||r==="ksh"?Ht.join(e,".profile"):null}a(Kb,"resolveShellConfigPath");function Cs(t){return`'${t.replace(/'/g,`'"'"'`)}'`}a(Cs,"quotePosixShell");function Vd(t,e){return t.split(e).length-1}a(Vd,"countOccurrences");function qd(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(qd,"escapeRegExp");function Gb(t){return t instanceof Error&&"code"in t}a(Gb,"isNodeError");function Hd(t){return t instanceof Error?t.message:String(t)}a(Hd,"errorMessage");var Zd={claudecode:"Claude Code",codex:"Codex CLI",qoder:"Qoder CLI",codebuddy:"Codebuddy Code",opencode:"OpenCode",qwen:"Qwen Code",deepseek:"DeepSeek",trae:"Trae CLI"};function xs(){let e=en().map(r=>({type:r.type,cmd:r.cmd,version:r.version,label:Zd[r.type]??r.type})),n=e[0]?.type??"claudecode";return{available:e,recommended:n}}a(xs,"detectAgents");function Ts(t){let e=Mn,n=new Map(t.available.map(r=>[r.type,r]));return e.map(r=>{let o=n.get(r),i=Zd[r]??r;if(o){let s=o.version?` (${o.version})`:"";return{name:`${i}${s}`,value:r,description:`\u547D\u4EE4: ${o.cmd}`}}return{name:`${i} (\u672A\u68C0\u6D4B\u5230)`,value:r,description:"\u9700\u8981\u5148\u5B89\u88C5\u5BF9\u5E94 CLI"}})}a(Ts,"buildAgentChoices");import{select as Yd,input as Kt,confirm as Jb,editor as Zb}from"@inquirer/prompts";async function Qd(t){let e=Ts(t);return await Yd({message:"\u9009\u62E9\u7528\u4E8E\u8BBE\u8BA1\u9636\u6BB5\u7684 Coding Agent",choices:e,default:t.recommended})}a(Qd,"promptAgentType");async function Xd(){return console.log(`
649
+ \u{1F4A1} \u63D0\u793A\uFF1A\u8BE6\u7EC6\u63CF\u8FF0\u4F60\u7684\u4E1A\u52A1\u573A\u666F\uFF08\u652F\u6301\u591A\u884C\uFF09\uFF0CCoding Agent \u5C06\u636E\u6B64\u751F\u6210\u5B8C\u6574\u5DE5\u4F5C\u6D41\u3002`),console.log(` \u5EFA\u8BAE\u5305\u542B\uFF1A\u6574\u4F53\u76EE\u6807\u3001\u5177\u4F53\u6B65\u9AA4\u3001\u8F93\u5165\u8F93\u51FA\u5B57\u6BB5\u3001\u662F\u5426\u9700\u8981\u4EBA\u5DE5\u5BA1\u6838\u3002
650
+ `),(await Zb({message:"\u63CF\u8FF0\u4F60\u7684\u4E1A\u52A1\u573A\u666F\uFF08\u6253\u5F00\u7F16\u8F91\u5668\u64B0\u5199\uFF0C\u4FDD\u5B58\u9000\u51FA\u5373\u53EF\uFF09",default:`\u8BF7\u5728\u6B64\u63CF\u8FF0\u4F60\u7684\u4E1A\u52A1\u573A\u666F\uFF0C\u4F8B\u5982\uFF1A
651
+
652
+ \u5BA2\u670D\u5DE5\u5355\u81EA\u52A8\u5904\u7406\u7CFB\u7EDF\u3002
653
+ \u7528\u6237\u5728\u8868\u683C\u4E2D\u63D0\u4EA4\u5DE5\u5355\uFF08\u5305\u542B\u6807\u9898\u3001\u95EE\u9898\u63CF\u8FF0\uFF09\uFF0C\u7CFB\u7EDF\u81EA\u52A8\u5B8C\u6210\uFF1A
654
+ 1. \u5DE5\u5355\u5206\u7C7B\uFF1A\u8BC6\u522B\u95EE\u9898\u7C7B\u578B\u548C\u7D27\u6025\u7A0B\u5EA6
655
+ 2. \u95EE\u9898\u6392\u67E5\uFF1A\u5206\u6790\u6839\u56E0\u5E76\u7ED9\u51FA\u89E3\u51B3\u65B9\u6848
656
+ 3. \u8349\u62DF\u56DE\u590D\uFF1A\u751F\u6210\u9762\u5411\u5BA2\u6237\u7684\u56DE\u590D\u6587\u6848
657
+ 4. \u8D28\u91CF\u5BA1\u6838\uFF1A\u4EBA\u5DE5\u5BA1\u6838\u56DE\u590D\u5185\u5BB9\uFF08\u4EBA\u5DE5\u6B65\u9AA4\uFF09
658
+ 5. \u53D1\u9001\u56DE\u590D\uFF1A\u786E\u8BA4\u540E\u6807\u8BB0\u5B8C\u6210
659
+ `,postfix:".md",validate:a(e=>{let n=e.trim();return n.length===0?"\u573A\u666F\u63CF\u8FF0\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8FD9\u662F design \u9636\u6BB5\u7684\u6838\u5FC3\u8F93\u5165":n.length<20?"\u8BF7\u81F3\u5C11\u63D0\u4F9B 20 \u4E2A\u5B57\u7B26\u7684\u573A\u666F\u63CF\u8FF0\uFF0C\u4EE5\u4FBF\u751F\u6210\u6709\u6548\u7684\u5DE5\u4F5C\u6D41":!0},"validate")})).trim()}a(Xd,"promptScene");async function eu(){console.log(`
660
+ \u{1F4CA} \u8FDE\u63A5 AI \u8868\u683C Base\uFF08tableId \u53EF\u5728 setup \u9636\u6BB5\u81EA\u52A8\u521B\u5EFA\uFF09`);let t=await Kt({message:"base_id\uFF08AI \u8868\u683C URL \u4E2D\u7684 base \u6807\u8BC6\uFF09",validate:a(n=>n.trim().length===0?"base_id \u4E0D\u80FD\u4E3A\u7A7A\uFF1Bsetup \u4F1A\u5728\u8BE5 Base \u4E0B\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868":!0,"validate")}),e=await Kt({message:"table_id\uFF08\u53EF\u7559\u7A7A\uFF1B\u7559\u7A7A\u65F6 setup \u4F1A\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868\u5E76\u5199\u56DE\u914D\u7F6E\uFF09"});return{baseId:t.trim(),tableId:e.trim()}}a(eu,"promptTableConnection");async function tu(){console.log(`
661
+ \u{1F916} \u914D\u7F6E LLM\uFF08\u7528\u4E8E\u5DE5\u4F5C\u6D41\u6B65\u9AA4\u4E2D\u7684 AI \u63A8\u7406\uFF09`);let t=await Yd({message:"LLM \u63D0\u4F9B\u5546",choices:[{name:"IdeaLab\uFF08\u963F\u91CC\u5185\u90E8\uFF09",value:"idealab",description:"\u63A8\u8350\u5185\u90E8\u4F7F\u7528"},{name:"OpenAI",value:"openai",description:"\u9700\u8981 API Key"},{name:"\u5176\u4ED6\uFF08\u624B\u52A8\u914D\u7F6E\uFF09",value:"custom"}],default:"idealab"}),e,n;return t==="idealab"?(e=await Kt({message:"\u6A21\u578B\u540D\u79F0",default:"Qwen3.7-Max-DogFooding"}),n="IDEALAB_API_KEY"):t==="openai"?(e=await Kt({message:"\u6A21\u578B\u540D\u79F0",default:"gpt-4o"}),n="OPENAI_API_KEY"):(e=await Kt({message:"\u6A21\u578B\u540D\u79F0",validate:a(r=>r.trim().length>0||"\u6A21\u578B\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A","validate")}),n=await Kt({message:"API Key \u73AF\u5883\u53D8\u91CF\u540D",default:"LLM_API_KEY"})),{provider:t,model:e,apiKeyEnv:n}}a(tu,"promptLlmConfig");var Yb={claudecode:"Claude Code",codex:"Codex CLI",qoder:"Qoder CLI",codebuddy:"Codebuddy Code",opencode:"OpenCode",qwen:"Qwen Code",deepseek:"DeepSeek",trae:"Trae CLI"};async function nu(t){let e=t.scene.length>60?t.scene.slice(0,60).replace(/\n/g," ")+"...":t.scene.replace(/\n/g," "),n=t.baseId?`base=${t.baseId} / table=${t.tableId||"setup \u81EA\u52A8\u65B0\u5EFA"}`:"\uFF08\u9700\u8865\u5145 base_id \u540E\u518D setup\uFF09";return console.log(`
662
+ \u250C\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510`),console.log("\u2502 \u914D\u7F6E\u6982\u89C8 \u2502"),console.log("\u251C\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524"),console.log(`\u2502 Agent: ${Yb[t.agentType]??t.agentType}`),console.log(`\u2502 \u573A\u666F: ${e}`),console.log(`\u2502 AI\u8868\u683C: ${n}`),console.log(`\u2502 LLM: ${t.llmProvider} / ${t.llmModel}`),console.log(`\u2514\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
663
+ `),await Jb({message:"\u786E\u8BA4\u751F\u6210\u914D\u7F6E\u6587\u4EF6\uFF1F",default:!0})}a(nu,"promptConfirm");import{writeFile as Qb,mkdir as Xb,access as ev}from"fs/promises";import wo from"path";function ru(t){let e={version:1,agents:{claudecode:{enabled:t==="claudecode",...t==="claudecode"?{cmd:"claude"}:{}},codex:{enabled:t==="codex",...t==="codex"?{cmd:"codex",model:"gpt-5.5",permissionMode:"bypassPermissions",mode:"full-auto",ignoreUserConfig:!0}:{}},qoder:{enabled:t==="qoder",...t==="qoder"?{cmd:"qodercli",permissionMode:"bypassPermissions"}:{}},codebuddy:{enabled:t==="codebuddy",...t==="codebuddy"?{cmd:"codebuddy"}:{}},opencode:{enabled:t==="opencode",...t==="opencode"?{cmd:"opencode"}:{}},qwen:{enabled:t==="qwen",...t==="qwen"?{cmd:"qwen"}:{}},deepseek:{enabled:t==="deepseek",...t==="deepseek"?{cmd:"deepseek"}:{}},trae:{enabled:t==="trae",...t==="trae"?{cmd:"trae-cli"}:{}}}};return JSON.stringify(e,null,2)+`
664
+ `}a(ru,"generateCodingAgentsConfig");function ou(t){let e=tv(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: |",nv(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","tracker:",` base_id: "${t.baseId}"`,` table_id: "${t.tableId}"`,""," # \u72B6\u6001\u673A\uFF08\u56FA\u5B9A\uFF0C\u5F15\u64CE\u5185\u7F6E\uFF09"," states:",' initial: "\u5F85\u5904\u7406"',' active: ["\u5904\u7406\u4E2D", "\u5BA1\u6838\u4E2D"]',' terminal: ["\u5DF2\u5B8C\u6210", "\u5DF2\u5173\u95ED"]',' blocked: "\u5DF2\u963B\u585E"',' review: "\u5BA1\u6838\u4E2D"',""," # \u9AA8\u67B6\u5B57\u6BB5\u6620\u5C04\uFF08\u56FA\u5B9A\uFF0C\u5F15\u64CE\u5FC5\u9700\uFF09"," fields:",' state: "\u72B6\u6001"',' title: "\u6807\u9898"',' current_step: "\u5F53\u524D\u6B65\u9AA4"',' owner: "\u5904\u7406\u4EBA"',' event_log: "\u4E8B\u4EF6\u65E5\u5FD7"',"","# \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","workflow:",' template: "./workflow.yml"',' recipe_dir: "./recipes"',"","# \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: 300000"," 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(`
665
+ `)}a(ou,"generateMainConfig");async function ko(t){let{answers:e,cwd:n,force:r=!1}=t,o={files:[],dirs:[],skipped:[]},i=[wo.join(n,"recipes")];for(let c of i)await Xb(c,{recursive:!0}),o.dirs.push(c);let s=[{path:wo.join(n,"coding-agents.config.json"),content:ru(e.agentType)},{path:wo.join(n,"aitable-workflow.config.yml"),content:ou(e)},{path:wo.join(n,"recipes",".gitkeep"),content:""}];for(let c of s){if(!r&&await rv(c.path)){o.skipped.push(c.path);continue}await Qb(c.path,c.content,"utf8"),o.files.push(c.path)}return o}a(ko,"scaffold");function tv(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";default:return"claude"}}a(tv,"agentTypeToEngine");function nv(t,e){let n=" ".repeat(e);return t.split(`
666
+ `).map(r=>n+r).join(`
667
+ `)}a(nv,"formatYamlBlock");async function rv(t){try{return await ev(t),!0}catch{return!1}}a(rv,"fileExists");function ov(t){return{agentType:t.recommended,scene:`\u901A\u7528\u4E1A\u52A1\u81EA\u52A8\u5316\u573A\u666F\u3002
668
+ \u7528\u6237\u5728\u8868\u683C\u4E2D\u63D0\u4EA4\u5DE5\u5355\uFF0C\u7CFB\u7EDF\u81EA\u52A8\u5B8C\u6210\u5206\u7C7B\u3001\u5904\u7406\u3001\u56DE\u590D\u3002`,baseId:"",tableId:"",llmProvider:"idealab",llmModel:"Qwen3.7-Max-DogFooding",llmApiKeyEnv:"IDEALAB_API_KEY",confirmed:!0}}a(ov,"buildDefaultAnswers");async function iu(t){let{cwd:e,force:n=!1,yes:r=!1}=t;console.log(`
669
+ \u{1F50D} \u68C0\u6D4B\u5DF2\u5B89\u88C5\u7684 Coding Agent...
670
+ `);let o=xs();if(o.available.length>0)for(let k of o.available){let w=k.version?` (${k.version})`:"";console.log(` \u2713 ${k.label}${w} \u2014 ${k.cmd}`)}else console.log(" \u26A0 \u672A\u68C0\u6D4B\u5230\u5DF2\u5B89\u88C5\u7684 Coding Agent CLI"),console.log(` \u5C06\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u540E\u7EED\u9700\u8981\u5B89\u88C5\u5BF9\u5E94 Agent
671
+ `);if(r){let k=ov(o);console.log(`
672
+ \u{1F4CB} \u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\uFF08--yes \u6A21\u5F0F\uFF09`),console.log(` Agent: ${k.agentType}`),console.log(` LLM: ${k.llmProvider} / ${k.llmModel}`),console.log(` \u573A\u666F: ${k.scene.split(`
673
+ `)[0]}
674
+ `);let w=await ko({answers:k,cwd:e,force:n});return{answers:k,scaffold:w}}let i=await Qd(o),s=await Xd(),{baseId:c,tableId:l}=await eu(),{provider:d,model:u,apiKeyEnv:f}=await tu(),p={agentType:i,scene:s,baseId:c,tableId:l,llmProvider:d,llmModel:u,llmApiKeyEnv:f,confirmed:!1},m=await nu(p);if(p.confirmed=m,!m)return console.log(`
675
+ \u274C \u5DF2\u53D6\u6D88\u521D\u59CB\u5316\u3002
676
+ `),{answers:p,scaffold:{files:[],dirs:[],skipped:[]}};console.log(`
677
+ \u{1F4C1} \u751F\u6210\u914D\u7F6E\u6587\u4EF6...
678
+ `);let h=await ko({answers:p,cwd:e,force:n});return iv(h),{answers:p,scaffold:h}}a(iu,"runWizard");function iv(t){if(t.dirs.length>0)for(let e of t.dirs)console.log(` \u{1F4C2} ${e}/`);if(t.files.length>0)for(let e of t.files)console.log(` \u2713 ${e}`);if(t.skipped.length>0){console.log("");for(let e of t.skipped)console.log(` \u2298 ${e} (\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7)`)}console.log(`
679
+ \u2705 \u521D\u59CB\u5316\u5B8C\u6210\uFF01
680
+ `),console.log("\u4E0B\u4E00\u6B65\uFF1A"),console.log(" 1. \u8FD0\u884C `aitable-workflow design` \u8BA9 Coding Agent \u751F\u6210\u5B8C\u6574\u7684 workflow \u548C recipes"),console.log(" 2. \u8FD0\u884C `aitable-workflow setup` \u521D\u59CB\u5316\u8868\u683C\u5B57\u6BB5"),console.log(" 3. \u8FD0\u884C `aitable-workflow run` \u542F\u52A8\u8FD0\u884C\u65F6\u6267\u884C\n")}a(iv,"printResult");var sv=12e4,au=5e3,su=300,av="dingtalk-workspace-cli@latest";function cu(t){return t.status==="succeeded"&&t.action==="upgraded"&&t.pathAdjusted}a(cu,"shouldPersistDwsPath");async function _s(t={}){let e=t.bin?.trim()||"dws",n=t.runner??G,r=await dv(e,n);return cv({...t,bin:e,runner:n},r)}a(_s,"ensureLatestDws");async function cv(t,e){let n=t.bin?.trim()||"dws",r=t.npmBin?.trim()||(process.platform==="win32"?"npm.cmd":"npm"),o=t.runner??G,i=e?"upgrade":"install",s=e?"upgraded":"installed";try{let l=await o(r,["install","--global",av],{timeoutMs:t.timeoutMs??sv});if(l.exitCode!==0)return{status:"failed",action:i,detail:du(l,"npm install")}}catch(l){return{status:"failed",action:i,detail:Is(l instanceof Error?l.message:String(l))}}let c=await lv(r,o,t.env??process.env,t.platform??process.platform);return"detail"in c?{status:"failed",action:i,detail:c.detail}:{status:"succeeded",action:s,globalBin:c.globalBin,pathAdjusted:c.pathAdjusted}}a(cv,"installLatestDws");async function lv(t,e,n,r){let o;try{o=await e(t,["prefix","--global"],{timeoutMs:au})}catch(l){return{detail:`npm \u5B89\u88C5\u5DF2\u5B8C\u6210\uFF0C\u4F46\u65E0\u6CD5\u83B7\u53D6\u5168\u5C40\u5B89\u88C5\u76EE\u5F55\uFF1A${Is(l instanceof Error?l.message:String(l))}`}}let i=o.stdout.trim();if(o.exitCode!==0||!i)return{detail:`npm \u5B89\u88C5\u5DF2\u5B8C\u6210\uFF0C\u4F46\u65E0\u6CD5\u83B7\u53D6\u5168\u5C40\u5B89\u88C5\u76EE\u5F55\uFF1A${du(o,"npm prefix --global")}`};let s=wi(i,r);return await lu(s,e)?{globalBin:s,pathAdjusted:ki(s,n,r)}:{detail:`npm \u5B89\u88C5\u5DF2\u5B8C\u6210\uFF0C\u4F46\u65E0\u6CD5\u8FD0\u884C ${s}`}}a(lv,"verifyInstalledDws");async function lu(t,e){try{let n=await e(t,["version"],{timeoutMs:au});return n.exitCode!==0?null:n.stdout.match(/^\s*Version:\s*(\S+)/mi)?.[1]??null}catch{return null}}a(lu,"readDwsVersion");async function dv(t,e){return await lu(t,e)!==null}a(dv,"isDwsAvailable");function du(t,e){let n=t.stderr.trim()||t.stdout.trim();return n?Is(n):`${e} \u9000\u51FA\u7801 ${t.exitCode??"unknown"}`}a(du,"commandFailureDetail");function Is(t){let e=t.replace(/\s+/g," ").trim()||"\u672A\u77E5\u9519\u8BEF";return e.length>su?`${e.slice(0,su-1)}\u2026`:e}a(Is,"compactDetail");import{cp as uu,access as uv,readFile as fv,readdir as fu,rename as pv,writeFile as gv}from"fs/promises";import ve from"path";import{fileURLToPath as mv}from"url";async function st(t){try{return await uv(t),!0}catch{return!1}}a(st,"exists");async function Es(){let t=ve.dirname(mv(import.meta.url));for(let e=0;e<8;e++){let n=ve.join(t,"templates");if(await st(n))return n;let r=ve.dirname(t);if(r===t)break;t=r}throw new Error("\u627E\u4E0D\u5230\u5185\u7F6E templates \u76EE\u5F55(\u8BF7\u901A\u8FC7 templatesDir \u6CE8\u5165,\u6216\u786E\u8BA4 aitable-workflow-cli \u5DF2\u968F\u5305\u53D1\u5E03 templates)")}a(Es,"resolveTemplatesDir");var Tn=new Set(["aitable-handoff"]),hv={"aitable-handoff":"support-qa --profile aitable"};async function pu(t,e={}){let n=t??await Es();return(await fu(n,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name).filter(o=>e.includeDeprecated||!Tn.has(o)).sort()}a(pu,"listTemplates");async function gu(t,e){let n=e??await Es(),r=ve.join(n,t,"profiles");return await st(r)?(await fu(r,{withFileTypes:!0})).filter(i=>i.isDirectory()).map(i=>i.name).sort():[]}a(gu,"listProfiles");async function As(t,e,n,r,o={},i){if(Tn.has(t)){let m=hv[t];throw new Error(`\u6A21\u677F "${t}" \u5DF2\u5E9F\u5F03\uFF0C\u4E0D\u518D\u652F\u6301\u521B\u5EFA\u65B0\u5B9E\u4F8B\uFF08\u65E9\u4E8E profile v2 \u67B6\u6784\uFF0C\u914D\u7F6E\u4E8B\u5B9E\u6E90\u6563\u843D\u5728 workflow.yml\uFF09\u3002`+(m?`\u8BF7\u4F7F\u7528\uFF1A--template ${m}`:""))}let s=r??await Es(),c=ve.join(s,t);if(!await st(c)){let m=await pu(s);throw new Error(`\u672A\u627E\u5230\u6A21\u677F "${t}"\u3002\u53EF\u7528\u6A21\u677F: ${m.join(", ")||"(\u7A7A)"}`)}let l;if(i){if(l=ve.join(c,"profiles",i),!await st(l)){let m=await gu(t,s);throw new Error(`\u6A21\u677F "${t}" \u672A\u627E\u5230 profile "${i}"\u3002\u53EF\u7528 profile: ${m.join(", ")||"(\u65E0)"}`)}}else{let m=ve.join(c,"profiles","default");await st(m)&&(l=m,i="default")}let d=ve.join(e,"package.json"),u=n||!await st(d),f=ve.join(c,"profiles");await uu(c,e,{recursive:!0,force:n,errorOnExist:!1,filter:a(m=>m!==f&&!m.startsWith(f+ve.sep),"filter")}),l&&await uu(l,e,{recursive:!0,force:!0,errorOnExist:!1}),u&&await wv(d,o);let p=ve.join(e,"npmrc");return await st(p)&&await pv(p,ve.join(e,".npmrc")),{template:t,from:c,target:e,...i?{profile:i}:{}}}a(As,"scaffoldFromTemplate");var yv=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function wv(t,e){if(!await st(t)||Object.keys(e).length===0)return;let n=JSON.parse(await fv(t,"utf8")),r=!1;for(let o of yv){let i=n[o];if(!(!i||typeof i!="object"||Array.isArray(i)))for(let[s,c]of Object.entries(i)){let l=e[s];!l||c===l||(i[s]=l,r=!0)}}r&&await gv(t,`${JSON.stringify(n,null,2)}
681
+ `,"utf8")}a(wv,"pinPackageVersions");async function lO(t={}){let{force:e=!1,yes:n=!1,config:r,template:o,profile:i,templatesDir:s,templatePackageVersions:c}=t;if(o){if(Tn.has(o))throw new Error(`\u6A21\u677F "${o}" \u5DF2\u5E9F\u5F03\uFF0C\u4E0D\u518D\u652F\u6301\u521B\u5EFA\u65B0\u5B9E\u4F8B\u3002\u8BF7\u4F7F\u7528\uFF1A--template support-qa --profile aitable`);let u=r?await hu(r):Gt.join(process.cwd(),o);await Ds(u)||(await mu(u,{recursive:!0}),console.log(`
682
+ \u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${u}`)),console.log(`
683
+ \u{1F4E6} \u4ECE\u6A21\u677F\u811A\u624B\u67B6: ${o}${i?` (profile: ${i})`:""}`);let f=await As(o,u,e,s,c,i);console.log(` \u2713 \u5DF2\u62F7\u8D1D\u6A21\u677F\u5230: ${f.target}`),f.profile&&console.log(` \u2713 \u5DF2\u53E0\u52A0 profile \u4E1A\u52A1\u5305: ${f.profile}`),console.log(`
684
+ \u4E0B\u4E00\u6B65:`),console.log(` 1. cd ${u}`),console.log(" 2. \u5B89\u88C5\u4F9D\u8D56(\u6A21\u677F\u4F9D\u8D56\u4EC5\u5185\u7F51\u53EF\u7528,\u8BF7\u7528 tnpm):tnpm i"),console.log(" 3. \u524D\u7F6E\u73AF\u5883\u51C6\u5907:aitable-workflow setup"),console.log(` 4. \u8FD0\u884C:aitable-workflow run
685
+ `);return}console.log(`
686
+ \u2B06\uFE0F \u68C0\u67E5\u5E76\u66F4\u65B0 DWS CLI...`);let l=await _s();if(l.status==="succeeded"){if(console.log(l.action==="installed"?" \u2713 \u672A\u68C0\u6D4B\u5230\u672C\u5730 DWS\uFF0C\u5DF2\u5B89\u88C5\u6700\u65B0\u7248\u672C":" \u2713 DWS \u5DF2\u66F4\u65B0\u6216\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C"),cu(l)){let u=await Kd(l.globalBin);u.status==="persisted"?(u.changed&&console.log(` \u2713 \u5DF2\u66F4\u65B0 shell PATH \u914D\u7F6E\uFF1A${u.configPath}`),console.log(" \u2139 \u8981\u8BA9\u5F53\u524D\u7EC8\u7AEF\u76F4\u63A5\u6267\u884C `dws` \u65F6\u4F7F\u7528\u65B0\u7248\uFF0C\u8BF7\u91CD\u5F00\u7EC8\u7AEF\uFF0C"),console.log(` \u6216\u8FD0\u884C \`${Gd(u.configPath)}\`\u3002
687
+ `)):(console.warn(` \u26A0 \u672A\u80FD\u81EA\u52A8\u6301\u4E45\u5316 DWS PATH\uFF1A${u.detail}`),console.warn(` \u5F53\u524D\u7EC8\u7AEF\u53EF\u8FD0\u884C \`${Jd(l.globalBin)}\`\u3002`),console.warn(` \u5DF2\u7EE7\u7EED\u521D\u59CB\u5316\u3002
688
+ `))}}else{let u=l.action==="install"?"\u5B89\u88C5":"\u66F4\u65B0";console.warn(` \u26A0 DWS \u81EA\u52A8${u}\u672A\u5B8C\u6210\uFF1A${l.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 d;if(r?d=await hu(r):d=process.cwd(),await Ds(d)||(await mu(d,{recursive:!0}),console.log(`
689
+ \u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${d}`)),!e&&!n){let u=Gt.join(d,"aitable-workflow.config.yml");await Ds(u)&&(console.log(`
690
+ \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
691
+ `))}return iu({cwd:d,force:e,yes:n})}a(lO,"runInit");async function hu(t){let e=Gt.resolve(t);try{return(await bv(e)).isDirectory()?e:Gt.dirname(e)}catch{let n=Gt.extname(e).toLowerCase();return n===".yml"||n===".yaml"?Gt.dirname(e):e}}a(hu,"resolveInitCwd");async function Ds(t){try{return await kv(t),!0}catch{return!1}}a(Ds,"pathExists");import{existsSync as iS}from"fs";import Hs from"path";import{pathToFileURL as sS}from"url";import{readFile as vv,writeFile as Sv}from"fs/promises";import Rv from"yaml";async function $s(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\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868","create_table"),await o?.("\u6B63\u5728\u8C03\u7528 dws \u521B\u5EFA\u6570\u636E\u8868","create_table");let i=await wu(n,r);return await yu(e,i),await o?.(`\u5DF2\u65B0\u5EFA\u6570\u636E\u8868\uFF1A${i}`,"create_table"),{...n,tracker:{...n.tracker,table_id:i}}}a($s,"ensureTableExists");async function yu(t,e){let n=await vv(t,"utf8"),r=Rv.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 Sv(t,r.toString(),"utf8")}a(yu,"writeTableIdToConfig");async function wu(t,e){let n=new re({bin:t.tracker.dws_bin,timeoutMs:6e4}),r="dws aitable table create",o=Cv(e.tracker?.label??e.meta.name??"\u5DE5\u4F5C\u6D41\u4EFB\u52A1");g.info("setup","\u8C03\u7528 dws \u521B\u5EFA AI \u8868\u683C\u6570\u636E\u8868",{command:r,dwsBin:t.tracker.dws_bin,baseId:t.tracker.base_id,tableName:o});let i=await n.runJson(["aitable","table","create","--base-id",t.tracker.base_id,"--name",o,"--fields",JSON.stringify(ku(t)),"--timeout","60","--yes"],{timeoutMs:9e4}),s=bu(i);if(!s){let c=oe(i);throw g.warn("setup","dws \u521B\u5EFA\u6570\u636E\u8868\u540E\u672A\u8FD4\u56DE tableId",{command:r,baseId:t.tracker.base_id,response:c}),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:r,response:c}})}return s}a(wu,"createWorkflowTable");function Cv(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"}a(Cv,"sanitizeTableName");function ku(t){let e=[t.tracker.states.initial,...t.tracker.states.active,...t.tracker.states.terminal,t.tracker.states.blocked,t.tracker.states.review].filter((c,l,d)=>!!c&&d.indexOf(c)===l),n=t.tracker.fields.title,r=t.tracker.fields.state,o=[],i=new Set,s=a(c=>{i.has(c.fieldName)||(o.push(c),i.add(c.fieldName))},"addField");if(n===r)return s({fieldName:n,type:"primaryDoc"}),o;s({fieldName:n,type:"primaryDoc"}),s({fieldName:r,type:"singleSelect",config:{options:e.map(c=>({name:c}))}});for(let c of t.tracker.field_definitions??[])s(xv(c));return o}a(ku,"initialTableFields");function xv(t){let e={fieldName:t.name,type:t.type};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(e.config={options:t.options.map(n=>({name:n}))}),e}a(xv,"fieldDefinitionToCreatePayload");function bu(t){let e=oe(t),n=Ps(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=bu(r);if(o)return o}return null}a(bu,"findTableId");function Ps(t,e){if(!y(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=>Ps(o,e)).find(Boolean)??null:Ps(n,e);if(r)return r}return null}a(Ps,"findStringByKeys");async function Le(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return ie(r).filter(y).map(i=>({fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??"")})).filter(i=>i.fieldId&&i.fieldName)}a(Le,"fetchFields");var Ms=process.env.NODE_ENV==="test"?2:5,vu=process.env.NODE_ENV==="test"?0:500,Tv={Grid:"Grid",FormDesigner:"FormDesigner",Kanban:"Kanban",Calendar:"Calendar",Gallery:"Gallery",Gantt:"Gantt"};function Ns(t){return Tv[t]??t}a(Ns,"toDwsViewType");var _v={state:"singleSelect",description:"text",current_step:"text",owner:"text",event_log:"text"};function Iv(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(Iv,"extractStateOptions");async function Ls(t){let{settings:e,workflow:n,cleanEmptyRows:r=!0}=t,{base_id:o,table_id:i,fields:s}=e.tracker,c=t.dws??new re({bin:e.tracker.dws_bin}),l=[];g.info("setup","\u83B7\u53D6\u8868\u7ED3\u6784",{baseId:o,tableId:i});let d=await Le(c,o,i),u=new Set(d.map(R=>R.fieldName));g.info("setup","\u73B0\u6709\u5B57\u6BB5",{count:d.length,names:d.map(R=>R.fieldName)});let f=[],p=e.tracker.field_definitions,m=p?p.map(R=>({name:R.name,type:R.type,...R.options?{options:R.options}:{}})):[],h=new Map(m.map(R=>[R.name,R])),k=[{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(k.map(R=>R.name).filter(Boolean)),{userInput:b,output:C,other:S}=n.referencedFields,v=new Set([...u]);for(let R of b){if(v.has(R)||w.has(R))continue;let T=h.get(R);f.push({fieldName:R,type:T?.type??"text",...T?.options?{options:T.options}:{}}),v.add(R)}for(let R of C){if(v.has(R)||w.has(R))continue;let T=h.get(R);f.push({fieldName:R,type:T?.type??"text",...T?.options?{options:T.options}:{}}),v.add(R)}for(let R of S){if(v.has(R)||w.has(R))continue;let T=h.get(R);f.push({fieldName:R,type:T?.type??"text",...T?.options?{options:T.options}:{}}),v.add(R)}for(let R of m)v.has(R.name)||w.has(R.name)||(f.push({fieldName:R.name,type:R.type??"text",...R.options?{options:R.options}:{}}),v.add(R.name));for(let{role:R,name:T}of k){if(!T)continue;if(v.has(T)){g.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${T}`);continue}let M=h.get(T),E=M?.type??_v[R]??"text";f.push({fieldName:T,type:E,...M?.options?{options:M.options}:{},...!M?.options&&R==="state"?{options:Iv(e.tracker.states)}:{}}),v.add(T)}if(f.length>0){g.info("setup","\u521B\u5EFA\u5B57\u6BB5",{count:f.length,fields:f.map($=>$.fieldName)});let R=5,T=2,M=0,E=[];for(let $=0;$<f.length;$+=R){let N=f.slice($,$+R),H=!1;for(let U=0;U<=T;U++)try{let q=N.map(ne=>{let le={fieldName:ne.fieldName,type:ne.type};return ne.options&&ne.options.length>0&&(le.config={options:ne.options.map(me=>({name:me}))}),le}),ee=await c.runJson(["aitable","field","create","--base-id",o,"--table-id",i,"--fields",JSON.stringify(q),"--timeout","60","--yes"],{timeoutMs:9e4}),Q=y(ee)&&y(ee.data)?ee.data:null,We=typeof Q?.successCount=="number"?Q.successCount:N.length,_e=typeof Q?.failedCount=="number"?Q.failedCount:0;if(M+=We,_e>0&&Array.isArray(Q?.results)){for(let ne of Q.results)if(y(ne)&&ne.success===!1){let le=String(ne.fieldName??"");if(String(ne.errorCode??"").includes("Forbidden"))g.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${le}`),M++;else{let me={fieldName:le||"<unknown>",...typeof ne.errorCode=="string"?{errorCode:ne.errorCode}:{},...typeof ne.errorMessage=="string"?{errorMessage:ne.errorMessage}:{}};E.push(me),g.warn("setup","\u5B57\u6BB5\u521B\u5EFA\u8FD4\u56DE\u5931\u8D25",me)}}}H=!0;break}catch(q){let ee=q instanceof Error?q.message:String(q),Q=q instanceof de?q.stderr:"";if((ee.includes("TIMEOUT")||ee.includes("timeout")||Q.includes("TIMEOUT")||Q.includes("timeout"))&&U<T){g.warn("setup",`\u6279\u6B21\u8D85\u65F6\uFF0C\u68C0\u67E5\u5B9E\u9645\u72B6\u6001\u540E\u91CD\u8BD5 ${U+1}/${T}`,{batch:N.map(Be=>Be.fieldName)}),await js(3e3);let _e=await Le(c,o,i),ne=new Set(_e.map(Be=>Be.fieldName)),le=N.filter(Be=>!ne.has(Be.fieldName));if(le.length===0){g.info("setup","\u8D85\u65F6\u4F46\u5B57\u6BB5\u5DF2\u5168\u90E8\u521B\u5EFA\u6210\u529F"),M+=N.length,H=!0;break}let me=N.length-le.length;me>0&&(g.info("setup",`\u5176\u4E2D ${me} \u4E2A\u5DF2\u521B\u5EFA\uFF0C\u4EC5\u91CD\u8BD5\u5269\u4F59 ${le.length} \u4E2A`),M+=me),N=le}else{g.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25",{batch:N.map(_e=>_e.fieldName),error:ee}),E.push(...N.map(_e=>({fieldName:_e.fieldName,errorMessage:ee})));break}}H&&$+R<f.length&&await js(500)}if(E.length===0)g.info("setup","\u5B57\u6BB5\u521B\u5EFA\u5B8C\u6210",{createdCount:M,fields:f.map($=>$.fieldName)}),console.log(`\u2713 \u5DF2\u521B\u5EFA ${M} \u4E2A\u5B57\u6BB5: ${f.map($=>$.fieldName).join(", ")}`);else throw g.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5B58\u5728\u5931\u8D25\u9879\uFF0C\u7EC8\u6B62\u642D\u5EFA",{requestedCount:f.length,createdCount:M,failedCount:E.length,failedFields:E}),Object.assign(new Error(`\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25\uFF1A${E.map($=>$.fieldName).join(", ")}`),{code:"FIELD_CREATE_FAILED",status:502,details:{requestedCount:f.length,createdCount:M,failedCount:E.length,failedFields:E}})}else console.log("\u2713 \u6240\u6709\u5B57\u6BB5\u5DF2\u5C31\u7EEA\uFF0C\u65E0\u9700\u521B\u5EFA");if(r)try{await Ev(c,o,i)}catch(R){let T=R instanceof Error?R.message:String(R);g.warn("setup","\u7A7A\u767D\u884C\u6E05\u7406\u5931\u8D25\uFF08\u975E\u81F4\u547D\uFF09",{error:T}),console.log("\u26A0 \u7A7A\u767D\u884C\u6E05\u7406\u8DF3\u8FC7\uFF08API \u8D85\u65F6\uFF09")}let x=e.tracker.views;if(x&&x.length>0)try{l.push(...await Pv(c,o,i,x,n,s.title))}catch(R){let T=R instanceof Error?R.message:String(R);throw g.error("setup","\u89C6\u56FE\u914D\u7F6E\u5931\u8D25",{error:T}),console.log("\u2717 \u89C6\u56FE\u914D\u7F6E\u5931\u8D25"),R}else g.info("setup","\u672A\u914D\u7F6E tracker.views\uFF0C\u8DF3\u8FC7\u89C6\u56FE\u521B\u5EFA");let _=await Le(c,o,i);console.log(`
692
+ \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 R of _)b.has(R.fieldName)&&console.log(` \u2713 [${R.type}] ${R.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 R of _)C.has(R.fieldName)&&!b.has(R.fieldName)&&console.log(` [${R.type}] ${R.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 R of _)if(w.has(R.fieldName)||R.type==="primaryDoc"){let T=Av(R.fieldName,s),M=T?` \u2190 ${T}`:"";console.log(` [${R.type}] ${R.fieldName}${M}`)}if(console.log(`
693
+ \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`),x?.some(R=>R.type==="FormDesigner"&&R.id==="input_form")){let R=x.find(T=>T.id==="input_form");console.log(` \u63A8\u8350\u4F7F\u7528\u89C6\u56FE "${R?.name}" \u65B0\u5EFA\u5DE5\u5355\u3002`)}return{warnings:l}}a(Ls,"initTable");function js(t){return new Promise(e=>setTimeout(e,t))}a(js,"sleep");async function Ev(t,e,n){g.info("setup","\u68C0\u67E5\u7A7A\u767D\u884C");let r=await t.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--limit","100"]),o=ie(r),i=[];for(let s of o){if(!y(s))continue;let c=typeof s.recordId=="string"?s.recordId:null,l=y(s.cells)?s.cells:{},d=Object.values(l).some(u=>u!=null&&u!=="");c&&!d&&i.push(c)}i.length>0?(g.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(Ev,"cleanupEmptyRows");function Av(t,e){for(let[n,r]of Object.entries(e))if(r===t)return n;return null}a(Av,"findRole");function Dv(t){if(t instanceof de){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(Dv,"describeViewError");async function Pv(t,e,n,r,o,i){let s=await Le(t,e,n),c=new Map(s.map(b=>[b.fieldName,b.fieldId])),l=new Map(s.map(b=>[b.fieldName,b.type])),u=$v(s,i)?.fieldId??"",f=await Su(t,e,n),p=new Map(f.map(b=>[String(b.viewName??""),b])),m=jv(r,o),h=[],k=[],w=!1;for(let b of m)try{switch(b.type){case"Grid":{let C=!w;w=!0,await Fv(t,e,n,b,c,u,f,o,C,p);break}case"FormDesigner":await Lv(t,e,n,b,c,l,u,p);break;case"Kanban":case"Calendar":case"Gallery":case"Gantt":await Bv(t,e,n,b,c,u,p);break}}catch(C){let S=Dv(C);if(b.type==="FormDesigner"){let v={code:"FORM_VIEW_CREATE_FAILED",message:`\u8868\u5355\u89C6\u56FE "${b.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${Vv(S)}\uFF09`,details:{id:b.id,name:b.name,type:b.type,retryable:!0,errorDetail:S}};g.warn("setup","\u975E\u5173\u952E\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF0C\u7EE7\u7EED setup",{...v.details,error:S}),console.log(`\u26A0 ${v.message}`),console.log(` \u21B3 \u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u540D\u4E3A "${b.name}" \u7684\u8868\u5355\u89C6\u56FE`),k.push(v);continue}g.warn("setup",`\u89C6\u56FE "${b.name}" \u914D\u7F6E\u5931\u8D25`,{error:S}),console.log(`\u26A0 \u89C6\u56FE "${b.name}" \u521B\u5EFA\u5931\u8D25: ${S}`),h.push({id:b.id,name:b.name,type:b.type,errorMessage:S})}if(h.length>0)throw Object.assign(new Error(`\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF1A${h.map(b=>b.name).join(", ")}`),{code:"VIEW_CREATE_FAILED",status:502,details:{requestedCount:m.length,failedCount:h.length,failedViews:h}});return k}a(Pv,"configureViews");function $v(t,e){return t.find(n=>Mv(n.type))??(e?t.find(n=>n.fieldName===e):void 0)??t[0]}a($v,"resolvePrimaryField");function Mv(t){let e=t.replace(/[_-]/g,"").toLowerCase();return e==="primarydoc"||e==="primary"}a(Mv,"isPrimaryFieldType");function jv(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(jv,"expandForEachStep");async function Fv(t,e,n,r,o,i,s,c,l,d){if(!l){await Ov(t,e,n,r,o,i,d);return}let u=s.find(k=>k.viewType==="Grid");if(!u)return;let f=String(u.viewId??"");if(!f)return;let p=r.field_order?.length?r.field_order:Nv(o,c),m=Bs(p,o,i);if(m.length===0)return;await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",f,"--config",JSON.stringify({visibleFieldIds:m}),"--yes"],{timeoutMs:6e4});let h=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: ${h}\uFF09`)}a(Fv,"applyGridView");async function Ov(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}g.info("setup",`\u521B\u5EFA Grid \u89C6\u56FE: ${r.name}`);let c=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Ns("Grid"),"--yes"],{timeoutMs:6e4}),l=await Ws(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=zs(c)||String(l.viewId??""),u=r.field_order?.length?r.field_order:r.visible_fields??[];if(d&&u.length){let f=Bs(u,o,i);f.length>0&&await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",d,"--config",JSON.stringify({visibleFieldIds:f}),"--yes"],{timeoutMs:6e4})}console.log(`\u2713 \u5DF2\u521B\u5EFA Grid \u89C6\u56FE: "${r.name}"\uFF08${u.length} \u4E2A\u5B57\u6BB5\uFF09`)}a(Ov,"applyAdditionalGridView");function Nv(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(Nv,"buildDefaultFieldOrder");async function Lv(t,e,n,r,o,i,s,c){if(c.has(r.name)){console.log(`\u2713 \u8868\u5355\u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}g.info("setup",`\u521B\u5EFA\u8868\u5355\u89C6\u56FE: ${r.name}`,{visibleFieldCount:r.visible_fields?.length??0,baseId:e,tableId:n});let l=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Ns("FormDesigner"),"--yes"],{timeoutMs:6e4}),d=zs(l),u=Fs(l);g.info("setup","\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u8FD4\u56DE",{name:r.name,viewId:d||void 0,success:u,rawResult:JSON.stringify(l).slice(0,2e3)});let f=await Ws(t,e,n,r.name);if(!f){let h=JSON.stringify(l).slice(0,500);if(!d&&!u)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: ${h}\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 k=[d?`viewId=${d}`:"",u?"success=true":"",`\u5DF2\u91CD\u8BD5 ${Ms} \u6B21 view get`].filter(Boolean).join("\uFF1B");throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF08${k}\uFF09\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"\u3002dws \u539F\u59CB\u8FD4\u56DE: ${h}`)}c.set(r.name,f);let p=d||String(f.viewId??"");if(p){let h=[];if(s&&h.push(s),r.visible_fields?.length)for(let k of r.visible_fields){if(Wv(i.get(k)))continue;let w=o.get(k);w&&w!==s&&h.push(w)}h.length>0&&(g.info("setup",`\u66F4\u65B0\u8868\u5355\u89C6\u56FE\u53EF\u89C1\u5B57\u6BB5: ${r.name}`,{viewId:p,visibleCount:h.length}),await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",p,"--config",JSON.stringify({visibleFieldIds:h}),"--yes"],{timeoutMs:6e4}))}let m=r.visible_fields?.length??0;console.log(`\u2713 \u5DF2\u521B\u5EFA\u8868\u5355\u89C6\u56FE: "${r.name}"\uFF08${m} \u4E2A\u5B57\u6BB5\uFF09`)}a(Lv,"applyFormView");function Wv(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(Wv,"isSystemReadonlyFieldType");async function Bv(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}g.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",Ns(r.type),"--yes"],{timeoutMs:6e4}),l=await Ws(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=zs(c)||String(l.viewId??"");if(d&&r.visible_fields?.length){let u=Bs(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(Bv,"applyGenericView");async function Su(t,e,n){let r=await t.runJson(["aitable","view","get","--base-id",e,"--table-id",n]),o=y(r)&&y(r.data)?r.data:null,i=Array.isArray(o?.views)?Ru(o.views):[];if(i.length>0)return i;try{let s=await zv(t,e,n);return s.length>0&&g.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 g.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(Su,"fetchViews");async function zv(t,e,n){let r=await t.runJson(["aitable","table","get","--base-id",e]),o=y(r)&&y(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 Ru(c)}a(zv,"fetchViewsFromTableList");function Ru(t){return t.map(e=>{let n=e.viewType??e.type;return{...e,...n?{viewType:n}:{}}})}a(Ru,"normalizeViews");async function Uv(t,e,n,r){return(await Su(t,e,n)).find(i=>String(i.viewName??"")===r)??null}a(Uv,"fetchViewByName");async function Ws(t,e,n,r){for(let o=0;o<Ms;o++){let i=await Uv(t,e,n,r);if(i)return i;o+1<Ms&&vu>0&&await js(vu)}return null}a(Ws,"fetchViewByNameWithRetry");function Bs(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(Bs,"resolveFieldIds");function zs(t){return Os(t,["viewId","view_id"])||""}a(zs,"extractViewId");function Fs(t){return y(t)?t.success===!0?!0:y(t.data)?Fs(t.data):y(t.result)?Fs(t.result):!1:!1}a(Fs,"hasSuccessSignal");function Os(t,e){if(Array.isArray(t)){for(let n of t){let r=Os(n,e);if(r)return r}return null}if(!y(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=Os(n,e);if(r)return r}return null}a(Os,"findStringByKeys");function Vv(t){let e=t.replace(/\s+/g," ").trim();return e.length<=180?e:`${e.slice(0,177)}...`}a(Vv,"summarizeWarningReason");import{readFile as Eu,writeFile as Au}from"fs/promises";import Vs from"yaml";var qv=10;async function Cu(t,e){let{baseId:n,fields:r}=e,o=e.name;try{return await xu(t,{baseId:n,name:o,fields:r})}catch(i){if(!_u(i))throw i;await e.onProgress?.(`\u8868\u540D\u300C${o}\u300D\u51B2\u7A81\uFF0C\u5C1D\u8BD5\u590D\u7528\u5DF2\u5B58\u5728\u8868`);let s=await Tu(t,n,o);if(s)return await e.onProgress?.(`\u590D\u7528\u5DF2\u6709\u8868\u300C${o}\u300D: ${s.tableId}`),s.tableId;let c=await Hv(t,{baseId:n,name:o,fields:r,onProgress:e.onProgress});if(c)return c;throw i}}a(Cu,"createTableWithConflictResolution");async function Hv(t,e){let{baseId:n,fields:r}=e;for(let o=2;o<=qv+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 xu(t,{baseId:n,name:i,fields:r});return await e.onProgress?.(`\u5DF2\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA\u8868: ${s}`),s}catch(s){if(!_u(s))throw s;let c=await Tu(t,n,i);if(c)return c.tableId}}return null}a(Hv,"createTableWithRename");async function xu(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=Iu(n);if(!r)throw new Error(`\u521B\u5EFA\u8868\u300C${e.name}\u300D\u540E\u672A\u8FD4\u56DE tableId`);return r}a(xu,"createTable");async function Tu(t,e,n){let r=await Kv(t,e),o=n.trim();return r.find(i=>i.name.trim()===o)??null}a(Tu,"findTableByName");async function Kv(t,e){let n=await t.runJson(["aitable","table","get","--base-id",e,"--timeout","60"],{timeoutMs:9e4}),r=oe(n);return ie(r).filter(y).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(Kv,"listTablesInBase");function _u(t){if(!(t instanceof de))return!1;let e=`${t.message}
694
+ ${t.stderr}`.toLowerCase();return e.includes("already exist")||e.includes("\u5DF2\u5B58\u5728")||e.includes("duplicate")||e.includes("exist")}a(_u,"isTableNameConflictError");function Iu(t){let e=oe(t),n=Us(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=Iu(r);if(o)return o}return null}a(Iu,"findTableId");function Us(t,e){if(!y(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=>Us(o,e)).find(Boolean)??null:Us(n,e);if(r)return r}return null}a(Us,"findStringByKeys");var Gv=/^workflow:([A-Za-z0-9_-]+)\.tracker$/,bo=15;async function qs(t){let{workflowFilePath:e,recipeDir:n,workflow:r,settings:o,profile:i,dwsRunner:s,onProgress:c,workflowTrackers:l}=t,d=await Eu(e,"utf8"),u=Vs.parse(d);if(!y(u))return 0;oS(u,l,i?.config);let f=Array.isArray(u.event_sources)?u.event_sources:[],p=Array.isArray(u.steps)?u.steps:[],m=[],h=new re({bin:o.tracker.dws_bin,timeoutMs:9e4,runner:s}),k=await Sr({workflow:r,rawYaml:u,recipeDir:n,relPath:e,profile:i?{file:i.filePath,workflowId:i.workflowId,config:i.config}:void 0,onDefinitionLoadFailure:a((S,v)=>{throw new Error(`setup \u65E0\u6CD5\u52A0\u8F7D ${S}: ${v.message}`)},"onDefinitionLoadFailure")}),w=new Map(k.map(S=>[S.key,S]));for(let S of k){let v=nS(S);if(!v)continue;let{kind:x,path:_}=v,R=x==="eventSource"?Jv(f,v):Zv(p,v),T=x==="eventSource"?Yv(i?.config,v.srcName):(v.stepId?i?.config.steps?.[v.stepId]:void 0)??{},M=Ct(R,_),E=Ct(T,_),$=y(E)?{...y(M)?M:{},...E}:y(M)?M:{};if(y($.baseId)||y($.tableId)){await c?.(`\u8DF3\u8FC7\u5F15\u7528\u8868\u300C${Du(S,_)}\u300D\uFF08workflow ref\uFF0C\u8FD0\u884C\u65F6\u89E3\u6790\uFF09`);continue}let N=typeof $.tableId=="string"?$.tableId.trim():"",H=w.get(S.key.replace(/\.tableId$/,".baseId")),U=Qv($,H,o),q=Du(S,_);if(N){await eS(h,{baseId:U,tableId:N,name:q,setup:S.setup,onProgress:c});continue}await c?.(`\u6B63\u5728\u521B\u5EFA\u8F85\u52A9\u8868\u300C${q}\u300D`);let ee=await Xv(h,{baseId:U,name:q,setup:S.setup,onProgress:c}),Q=v.inProfile;m.push({target:Q?"profile":"workflow",basePath:v.basePath,baseId:U,tableId:ee}),await c?.(`\u5DF2\u521B\u5EFA\u8F85\u52A9\u8868\u300C${q}\u300D: ${ee}`)}if(m.length===0)return 0;let b=m.filter(S=>S.target==="workflow"),C=m.filter(S=>S.target==="profile");if(b.length>0){let S=Vs.parseDocument(d);for(let v of b)S.setIn([...v.basePath,"mode"],"owned"),S.setIn([...v.basePath,"baseId"],v.baseId),S.setIn([...v.basePath,"tableId"],v.tableId);await Au(e,S.toString(),"utf8")}if(C.length>0&&i){let S=await Eu(i.filePath,"utf8"),v=Vs.parseDocument(S);for(let x of C)v.setIn([...x.basePath,"mode"],"owned"),v.setIn([...x.basePath,"baseId"],x.baseId),v.setIn([...x.basePath,"tableId"],x.tableId);await Au(i.filePath,v.toString(),"utf8")}return m.length}a(qs,"setupSurfaceTables");function Jv(t,e){let n;return e.idx!==void 0?n=y(t[e.idx])?t[e.idx]:void 0:e.srcName&&(n=t.find(r=>y(r)&&r.name===e.srcName)),n&&y(n.handler_config)?n.handler_config:{}}a(Jv,"findEventSourceContainer");function Zv(t,e){let n;return e.idx!==void 0?n=y(t[e.idx])?t[e.idx]:void 0:e.stepId&&(n=t.find(r=>y(r)&&r.id===e.stepId)),n&&y(n.config)?n.config:{}}a(Zv,"findStepContainer");function Yv(t,e){if(!t||!e)return{};let n=t.event_sources?.[e];if(!n)return{};let r=n.handler_config;return y(r)?r:{}}a(Yv,"profileHandlerConfig");function Qv(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(Qv,"resolveSurfaceTableRefBaseId");async function Xv(t,e){let n=e.setup?.tableSchema?.fields??[],r=await Cu(t,{baseId:e.baseId,name:e.name,fields:tS(e.setup).slice(0,bo),onProgress:e.onProgress}),o=n.slice(bo);return o.length>0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5269\u4F59\u5B57\u6BB5: ${o.map(i=>i.name).join(", ")}`),await Pu(t,{baseId:e.baseId,tableId:r,fields:o})),r}a(Xv,"createSurfaceTable");async function eS(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 Le(t,e.baseId,e.tableId),o=new Set(r.map(s=>s.fieldName)),i=n.filter(s=>!o.has(s.name));i.length!==0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5: ${i.map(s=>s.name).join(", ")}`),await Pu(t,{baseId:e.baseId,tableId:e.tableId,fields:i}))}a(eS,"ensureSurfaceTableSchema");async function Pu(t,e){for(let n=0;n<e.fields.length;n+=bo){let r=e.fields.slice(n,n+bo);await t.runJson(["aitable","field","create","--base-id",e.baseId,"--table-id",e.tableId,"--fields",JSON.stringify(rS(r)),"--timeout","60","--yes"],{timeoutMs:9e4})}}a(Pu,"createSurfaceFields");function tS(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(tS,"buildCreateFields");function nS(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(nS,"parseTableIdSurface");function Du(t,e){let n=t.setup?.tableName?.trim();return n||t.label.replace(/ 的 Table ID.*/,"")||e.join(".")}a(Du,"tableNameFromSurface");function rS(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(rS,"buildFieldCreateFields");function oS(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=y(r[o])?r[o]:{};if(i.type!=="aitable_record")continue;let s=y(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(!y(p)||p.mode!=="reference")continue;let m=typeof p.ref=="string"?p.ref.trim():"",h=Gv.exec(m);if(!h)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${m||"\u7A7A"}\uFF09\uFF0C\u5E94\u4E3A workflow:<workflowId>.tracker`);let k=h[1],w=e.get(k);if(!w)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u300C${k}\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${k}\u300Dtracker \u672A\u914D\u7F6E\u5B8C\u6574\uFF08base_id/table_id \u4E3A\u7A7A\uFF09`)}}a(oS,"validateSourceTableReferences");async function aN(t){let e=await fe(t.config,{lenientEnv:!0}),n=await he(t.config),r=[];for(let l of e.workflowEntries){let d=await Me(l.templatePath,{envSource:e.envSource}),u=e.tracker.base_id==="__placeholder__"?void 0:e.tracker,f=u??d.tracker;if(!f)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${l.id}\u300D\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09`);let p=u?n:l.templatePath;r.push({entry:l,workflow:d,trackerConfig:f,trackerFilePath:p})}let o=new Map;for(let l of r){console.log(`
695
+ \u25B6 \u521D\u59CB\u5316\u5DE5\u4F5C\u6D41\u300C${l.entry.id}\u300D\uFF08${l.workflow.meta.name}\uFF09`);let d=pr(e,l.entry,l.trackerConfig);d=await $s({trackerFilePath:l.trackerFilePath,settings:d,workflow:l.workflow,onProgress:a(u=>console.log(` \u2022 ${u}`),"onProgress")}),o.set(l.entry.id,d)}let i=new Map;for(let l of r){let d=o.get(l.entry.id);i.set(l.entry.id,{base_id:d.tracker.base_id,table_id:d.tracker.table_id})}Nt();let s=xe(e.configDir,e.envSource),c=Hs.resolve(e.configDir,"profile","profile.yml");for(let l of r){let d=o.get(l.entry.id),u=s?.workflows?.[l.entry.id],f=await qs({workflowFilePath:l.entry.templatePath,recipeDir:l.entry.recipeDir,workflow:l.workflow,settings:d,profile:u?{filePath:c,workflowId:l.entry.id,config:u}:void 0,workflowTrackers:i,onProgress:a(p=>console.log(` \u2022 ${p}`),"onProgress")});f>0&&console.log(` \u2022 \u5DF2\u81EA\u52A8\u521B\u5EFA ${f} \u4E2A\u8F85\u52A9\u8868`)}for(let l of r){let d=o.get(l.entry.id);await Ls({settings:d,workflow:l.workflow,cleanEmptyRows:t.clean!==!1})}if(t.kb!==!1){await aS(e.configDir);try{let l=await cs({settings:e,...t.kbFull?{force:!0}:{},onProgress:oo});io(l)}catch(l){console.log(`\u26A0 \u77E5\u8BC6\u5E93\u7F16\u8BD1\u8DF3\u8FC7\uFF08\u975E\u81F4\u547D\uFF09: ${l instanceof Error?l.message:String(l)}`)}}}a(aN,"runSetupCommand");async function aS(t){let e=Hs.resolve(t,"lib","assemble.ts");if(iS(e))try{let n=await import(sS(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=>Hs.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(aS,"runEnsureAssembled");import{mkdir as cS,writeFile as lS}from"fs/promises";import dS from"path";import uS from"yaml";async function wN(t,e){await cS(t,{recursive:!0});let n=[],r=[];for(let o of e){let i=fS(o),s=dS.join(t,`${i.id}.role.yml`),c=uS.stringify(i);await lS(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(wN,"writeRoleDefinitions");function fS(t){let e={id:$u(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:$u(n),name:n,description:""}))};return sn.parse(e)}a(fS,"toRoleDefinition");function $u(t){return t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"role"}a($u,"safeId");function Mu(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=pS(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(Mu,"buildDriftReport");function pS(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(pS,"extractAllStates");import{readdir as gS,readFile as mS}from"fs/promises";import hS from"path";async function ju(t,e){if(e.length===0)return[];let n=[],r;try{r=await gS(t)}catch{return[]}let o=r.filter(i=>i.endsWith(".recipe.ts")||i.endsWith(".ts"));for(let i of o){let s=hS.join(t,i),c;try{c=await mS(s,"utf8")}catch{continue}let l=c.split(`
696
+ `);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(ju,"scanRecipeImpact");async function jN(t){let{configPath:e}=t;g.info("sync","\u52A0\u8F7D\u914D\u7F6E",{configPath:e});let n=await fe(e),r=await Me(n.workflowTemplatePath,{envSource:n.envSource}),{base_id:o,table_id:i}=n.tracker,s=new re({bin:n.tracker.dws_bin});g.info("sync","\u6821\u9A8C recipe schema \u4E0E workflow steps \u5BF9\u9F50");let{issues:c}=await wr(n.recipeDir,r);yS(c);let l=n.tracker.field_definitions?n.tracker.field_definitions.map(m=>({name:m.name,type:m.type,...m.options?{options:m.options}:{}})):[];g.info("sync","L0 \u8BCA\u65AD\uFF1A\u68C0\u6D4B\u914D\u7F6E\u4E0E\u8868\u7684\u504F\u5DEE");let d=await Le(s,o,i),u=Mu(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(`
697
+ \u26A0 \u68C0\u6D4B\u5230\u914D\u7F6E\u504F\u5DEE\uFF1A
698
+ `);for(let m of u.items)wS(m);let f=u.items.flatMap(m=>[...m.added,...m.removed]),p=await ju(n.recipeDir,f);if(p.length>0){console.log(`
699
+ \u26A0 \u53EF\u80FD\u53D7\u5F71\u54CD\u7684 Recipe \u6587\u4EF6\uFF1A
700
+ `);for(let m of p)console.log(` ${m.file}:${m.line} \u2014 \u5F15\u7528\u4E86 "${m.matchedValue}"`),console.log(` ${m.content}`)}return console.log(`
701
+ \u2500\u2500\u2500 \u5EFA\u8BAE\u64CD\u4F5C \u2500\u2500\u2500`),console.log(" \u2022 \u4EE5\u8868\u4E3A\u51C6\u66F4\u65B0\u914D\u7F6E\uFF1A\u624B\u52A8\u4FEE\u6539 workflow.yml \u7684 field_definitions.options"),console.log(" \u2022 \u4EE5\u914D\u7F6E\u4E3A\u51C6\u66F4\u65B0\u8868\uFF1A\u624B\u52A8\u8FD0\u884C dws aitable field update \u4FEE\u6539\u8868\u4E2D\u9009\u9879"),p.length>0&&console.log(" \u2022 Recipe \u53EF\u80FD\u9700\u8981\u66F4\u65B0\uFF1A\u8FD0\u884C aitable-workflow design --step <id> \u91CD\u65B0\u751F\u6210"),{driftReport:u,impacts:p,recipeIssues:c}}a(jN,"runSync");function yS(t){if(t.length===0){console.log("\u2713 Recipe schema \u6821\u9A8C\u901A\u8FC7\uFF1Astep.config / input_mapping / output_mapping \u5747\u5BF9\u9F50");return}let e=t.filter(r=>r.level==="error"),n=t.filter(r=>r.level==="warn");console.log(`
702
+ \u26A0 Recipe schema \u6821\u9A8C\uFF1A${e.length} \u4E2A\u9519\u8BEF\uFF0C${n.length} \u4E2A\u8B66\u544A
703
+ `);for(let r of t){let o=r.level==="error"?"\u2717":"\u26A0";console.log(` ${o} [${r.stepId} \u2192 ${r.recipeId}] ${r.message}`)}console.log()}a(yS,"printRecipeIssues");function wS(t){console.log(` \u5B57\u6BB5: "${t.fieldName}"`),t.tableOptions&&(console.log(` \u914D\u7F6E: [${t.configOptions.join(", ")}]`),console.log(` \u8868\u4E2D: [${t.tableOptions.join(", ")}]`)),t.added.length>0&&console.log(` + \u8868\u4E2D\u65B0\u589E: ${t.added.join(", ")}`),t.removed.length>0&&console.log(` - \u914D\u7F6E\u4E2D\u591A\u4F59: ${t.removed.join(", ")}`),console.log()}a(wS,"printDriftItem");export{Of as AGENT_TO_ENGINE,Xt as BASE_AGENT_DEFS,tr as CronSchedulerSource,Tn as DEPRECATED_TEMPLATES,$e as DingTalkRobotClient,re as DwsClient,de as DwsError,Nn as ENGINE_TO_AGENT,et as InMemoryGlobalVarStore,Dc as InMemoryObjectStore,Mn as KNOWN_AGENT_IDS,ps as LocalSpawnExecutor,xI as RELAY_OVERLOAD_CODE,CI as RELAY_REJECTED_CODE,us as RelayAgentSession,fs as RelayExecutor,Ee as ToolkitError,xo as Tracer,YI as activateGlobalDwsOnPath,ln as agentEngineSchema,Oa as agentToEngine,bS as applyRunExecutionEvent,Ts as buildAgentChoices,DI as buildArtifactKey,vs as buildDesignBrief,yo as buildDiscoveryForm,fr as buildEnvSource,Nc as buildEnvSourceSync,ms as buildFixPrompt,Sn as buildMetaPrompt,$i as checkEnv,wr as checkWorkflowRecipes,Di as checkWorkflows,zc as chooseDetectedEngine,$a as codingAgentsConfigSchema,Cy as coerceJsonValue,gl as coerceYamlValue,dt as collectConfigHints,wd as collectDesignContext,wn as collectEnvRefDetails,wy as collectEnvRefs,vo as commandsInFlight,ti as composeToolkitRegistry,$c as configSchema,pM as createApp,Va as createDingTalkAtUserIdResolver,SM as createLocalSpawnExecutor,pr as createPerWorkflowSettings,wM as createRelayExecutor,wu as createWorkflowTable,vl as credentialsFilePath,G as defaultCommandRunner,De as defaultToolkitRegistry,dl as deriveEnvJsonMapSpec,xS as describeConfigPath,zI as designBlockedStateFixture,VI as designEventsFixture,UI as designFailedStateFixture,xs as detectAgents,Bc as detectCodingEngines,en as detectInstalledAgents,jn as detectInstalledCodingAgents,rs as detectSourceType,ta as drainCommands,oe as dwsPayload,wl as emptyStore,pt as engineToAgent,_s as ensureLatestDws,$s as ensureTableExists,Tt as ensureTsxRegistered,vm as fieldDefinitionSchema,bm as fieldTypeSchema,TS as fileRefConfigSchema,ie as findArrayPayload,vD as findConflictingCredential,Dn as findCursor,bs as formatAnswerDisplay,ge as formatCommandError,ru as generateCodingAgentsConfig,ou as generateMainConfig,RD as getActiveCredential,No as getAgentConfig,Tf as getAgentDef,Ve as getAitableAgentConfigMeta,Js as getConfigHint,Ct as getConfigValueAtPath,ga as getCurrentDwsRunner,ua as getCurrentExecutor,_S as getFileRefHint,wi as getGlobalDwsBinPath,En as getTracer,wt as getZodObjectShape,Ey as globalVarRefPath,MI as hasOssCredentials,ho as heuristicInference,mo as inferSkeleton,Vt as ingest,Ls as initTable,oa as initTracer,ku as initialTableFields,jt as interpolateEnv,AI as isAllowedArtifactPath,un as isEngineDetected,pD as isGlobalVarRef,lt as isOwnedAutoCreateHint,y as isRecord,TI as isRelayMessage,mm as isSafeRelativePath,_f as listCodingAgents,CD as listCredentials,gu as listProfiles,pu as listTemplates,Oo as loadAgentConfig,xi as loadEventHandlerDefinition,yr as loadEventHandlerDefinitionResult,Ci as loadRecipeDefinition,hr as loadRecipeDefinitionResult,fe as loadSettings,Me as loadWorkflowTemplate,g as logger,_D as maskSecret,gi as normalizeArtifactRelPath,sr as normalizeByType,Ln as padStaffId,ll as parseEnvExampleValues,ur as parseEnvValue,ki as prependGlobalDwsToPath,jd as printFieldPlan,oo as printKbProgress,io as printKbSummary,Nd as printViewSyncResult,LI as projectFilesFixture,BI as projectStateResponseFixture,bn as readCredentials,Po as requireAgentDef,lk as resolveAllCollections,Ot as resolveCodingAgentSelection,ro as resolveCompileAgent,he as resolveConfigPath,qa as resolveDingTalkAtUserId,Se as resolveDingTalkStreamMessageEventContext,Zt as resolveDingTalkWebhookMentionEventContext,gD as resolveGlobalVarRef,tF as runAutoDiscovery,iD as runCheck,we as runCodingAgent,On as runCodingAgentViaSpawn,Pd as runDesign,mF as runDesignCommand,zd as runDiscovery,HI as runEventsFixture,lO as runInit,dk as runKbCompileCommand,M$ as runKbIngestCommand,$$ as runKbStatusCommand,P$ as runKbUpdateCommand,aN as runSetupCommand,jN as runSync,tR as runWithDwsRunner,da as runWithExecutor,bD as saveCredential,ko as scaffold,As as scaffoldFromTemplate,Bd as serializeForm,Pb as serializeForms,rn as sessionWebhookRegistry,SD as setActiveAgent,eR as setGlobalDwsRunner,_y as setInJson,qI as setupEventsFixture,cs as setupKnowledgeBases,qs as setupSurfaceTables,ZS as shellToken,Li as snapshotRunRecord,JS as stringOrNull,xn as summarizeForms,Md as syncFieldsFromWorkflow,Od as syncViewsFromDesign,CS as tableRefConfigSchema,bi as trackerSchema,Cn as validateDesignOutput,Hm as validateStateConsistency,dn as viewDefSchema,wm as viewTypeSchema,WI as workflowPreviewFixture,Ae as workspaceAgentConfigPath,dD as writeBack,Sl as writeCredentials,xy as writeEnvFile,Ty as writeJsonFile,wN as writeRoleDefinitions,yu as writeTableIdToConfig,ml as writeYaml,Mi as zodToFormatExample};