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/chunk-J5QGFP2Q.js +1 -0
- package/dist/index.d.ts +6163 -0
- package/dist/index.js +703 -0
- package/dist/shared/run-state.d.ts +71 -0
- package/dist/shared/run-state.js +1 -0
- package/package.json +43 -0
- package/wolai-crawler/config.default.json +16 -0
- package/wolai-crawler/debug.js +11 -0
- package/wolai-crawler/lib/browser.js +118 -0
- package/wolai-crawler/lib/crawler.js +699 -0
- package/wolai-crawler/lib/debug-page.js +71 -0
- package/wolai-crawler/lib/md-processor.js +223 -0
- package/wolai-crawler/lib/runtime.js +167 -0
- package/wolai-crawler/package.json +20 -0
- package/wolai-crawler/run.js +140 -0
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(``)):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("||t.includes("||t.includes("||t.includes(":!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(``),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:``,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?``: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 \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};
|