aitable-workflow-core 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +101 -1
- package/dist/index.js +188 -186
- package/package.json +2 -2
- package/skills/aitable-workflow/reference/generated/core-api.md +10 -0
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import{a,b as gw,c as mw,d as hw,e as Os,f as yw,g as ww}from"./chunk-XO7TZYYU.js";function We(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(We,"resolveDingTalkStreamMessageEventContext");function tr(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),i=At(e.corpId);if(!(!n||!r||!o))return{type:"dingtalk_webhook_mention",conversationId:n,senderOpenDingTalkId:r,senderName:o,...i?{corpId:i}:{}}}a(tr,"resolveDingTalkWebhookMentionEventContext");function At(t){return typeof t=="string"?t.trim():""}a(At,"stringValue");import{z as Gt}from"zod";var oo="aitableAgentConfig";function E$(t={}){let e=t.ownership==="owned"&&t.autoCreate===!0?Gt.string().optional():Gt.string(),n=t.ownership==="owned"&&t.autoCreate===!0?Gt.enum(["owned","reference","external"]).optional().default("owned"):Gt.enum(["owned","reference","external"]).optional();return Gt.object({mode:n,baseId:e,tableId:e}).describe(t.description??t.label??"AI \u8868\u683C\u5F15\u7528").meta({[oo]:{configType:"tableRef",access:t.access,ownership:t.ownership,autoCreate:t.autoCreate,defaultBase:t.defaultBase,label:t.label,description:t.description,setupSchema:t.setupSchema}})}a(E$,"tableRefConfigSchema");function Ld(t){let e=Et(t);if(!(!e||e.configType!=="tableRef"))return{configType:"tableRef",access:e.access==="read"||e.access==="write"?e.access:void 0,ownership:Wd(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:Bd(e.setupSchema)?e.setupSchema:void 0}}a(Ld,"getConfigHint");function Et(t){let n=Ud(t)?.[oo];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:Wd(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:Bd(r.setupSchema)?r.setupSchema:void 0}}a(Et,"getAitableAgentConfigMeta");function Zt(t){return t.ownership==="owned"&&t.autoCreate===!0}a(Zt,"isOwnedAutoCreateHint");function Wd(t){return t==="owned"||t==="reference"||t==="external"}a(Wd,"isOwnership");function Bd(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(Bd,"isSetupSchema");function Yt(t,e){let n=[];return zd(_t(t),[],n,e),n}a(Yt,"collectConfigHints");function D$(t,e){let n=_t(t),r=Nd(n);for(let o of e){let i=Vd(n);if(!i)break;n=_t(i[o]),r=Nd(n)??r}return r}a(D$,"describeConfigPath");function bn(t,e){let n=t;for(let r of e){if(!n||typeof n!="object")return;n=n[r]}return n}a(bn,"getConfigValueAtPath");function zd(t,e,n,r){if(!t)return;let o=_t(t),i=Ld(o);i&&(!r||r(i))&&n.push({path:e,schema:o,hint:i});let s=Vd(o);if(s)for(let[c,l]of Object.entries(s))zd(_t(l),[...e,c],n,r)}a(zd,"walkSchema");function Nd(t){let e=Ld(t),n=Et(t);return e?.description??e?.label??n?.description??n?.label??t?.description}a(Nd,"descriptionForSchema");function Ud(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(Ud,"getSchemaMeta");function _t(t){if(!t)return;let e=t;return typeof e.unwrap=="function"?_t(e.unwrap()):_t(e._def?.schema??e.def?.schema)??_t(e._def?.innerType??e.def?.innerType)??t}a(_t,"unwrapSchema");function Vd(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(Vd,"objectShape");function P$(t){return(t.required===!1?Gt.string().optional():Gt.string()).describe(t.description??t.label??"\u6587\u4EF6\u8DEF\u5F84\u5F15\u7528").meta({[oo]:{configType:"fileRef",kind:t.kind,required:t.required!==!1,label:t.label,description:t.description}})}a(P$,"fileRefConfigSchema");function $$(t){let e=Et(t);if(!e||e.configType!=="fileRef")return;let r=Ud(t)?.[oo];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($$,"getFileRefHint");import ip from"path";import sp from"fs";import Fs from"cross-spawn";function Jd(t=process.env,e,n=process.platform,r){let o=n==="win32",i={},s=new Map,c=a(l=>{for(let[d,u]of Object.entries(l)){if(!o){i[d]=u;continue}let f=d.toLowerCase(),p=s.get(f);p&&p!==d&&delete i[p],i[d]=u,s.set(f,d)}},"append");if(c(t),r&&r.length>0)for(let l of r)if(o){let d=l.toLowerCase(),u=s.get(d);u&&(delete i[u],s.delete(d))}else delete i[l];return e&&c(e),i}a(Jd,"mergeCommandEnv");function Gd(t=process.platform){return t!=="win32"}a(Gd,"shouldDetachCommand");function io(t){let e=t.detached??Gd(),n=Fs(t.command,[...t.args??[]],{cwd:t.cwd,env:Jd(process.env,t.env,process.platform,t.stripEnv),stdio:t.stdio??["pipe","pipe","pipe"],detached:e,windowsHide:t.windowsHide??!0}),r=new Promise((o,i)=>{n.once("error",i),n.once("close",(s,c)=>o({exitCode:s,signal:c}))});return r.catch(()=>{}),{child:n,wait:a(()=>r,"wait"),terminateTree:a(o=>bw(n,e,o),"terminateTree"),unref:a(()=>n.unref(),"unref")}}a(io,"spawnManagedProcess");function Zd(t){let e={cwd:t.cwd,env:Jd(process.env,t.env,process.platform,t.stripEnv),encoding:"utf8",stdio:["pipe","pipe","pipe"],timeout:t.timeoutMs,input:t.input,windowsHide:t.windowsHide??!0};return Fs.sync(t.command,[...t.args??[]],e)}a(Zd,"spawnManagedProcessSync");async function bw(t,e,n={}){if(js(t)||!t.pid)return;let r=n.gracePeriodMs??2e3;process.platform==="win32"?await qd(t.pid,!1):Kd(t,e,"SIGTERM"),!await Hd(t,r)&&(process.platform==="win32"?await qd(t.pid,!0):Kd(t,e,"SIGKILL"),await Hd(t,1e3))}a(bw,"terminateProcessTree");function js(t){return t.exitCode!==null||t.signalCode!==null}a(js,"hasExited");function Kd(t,e,n){if(t.pid)try{process.kill(e?-t.pid:t.pid,n)}catch{try{t.kill(n)}catch{}}}a(Kd,"signalPosix");async function qd(t,e){let n=["/PID",String(t),"/T",...e?["/F"]:[]],r=Fs("taskkill.exe",n,{stdio:"ignore",windowsHide:!0});await new Promise(o=>{r.once("error",()=>o()),r.once("close",()=>o())})}a(qd,"taskkill");function Hd(t,e){return js(t)?Promise.resolve(!0):new Promise(n=>{let r=setTimeout(()=>{t.removeListener("close",o),n(js(t))},Math.max(0,e));r.unref?.();let o=a(()=>{clearTimeout(r),n(!0)},"onClose");t.once("close",o)})}a(Hd,"waitUntilExit");var kw=32*1024*1024,nr=class extends Error{static{a(this,"CommandTimeoutError")}code="ETIMEDOUT";constructor(e,n){super(`Command timed out after ${n}ms: ${e}`),this.name="CommandTimeoutError"}},so=class extends Error{static{a(this,"CommandAbortedError")}code="ABORT_ERR";constructor(e){super(`Command aborted: ${e}`),this.name="CommandAbortedError"}},kn=new Set;function Ns(){return kn.size}a(Ns,"commandsInFlight");async function Yd(t=15e3){let e=Date.now()+t;for(;kn.size>0&&Date.now()<e;)await Promise.race([Promise.allSettled([...kn]),new Promise(n=>setTimeout(n,200))]);return kn.size===0}a(Yd,"drainCommands");function vw(t,e,n={}){let r=Sw(t,e,n);kn.add(r);let o=a(()=>{kn.delete(r)},"forget");return r.then(o,o),r}a(vw,"runCommand");var K=vw;async function Sw(t,e,n){if(n.signal?.aborted)throw new so(t);let r=n.maxOutputBytes??kw,o=new ao(r),i=new ao(r),s,c,l,d,u=a(p=>{s||(s=p,d&&(c=d.terminateTree()))},"requestTermination"),f=a(()=>u(new so(t)),"abortFromParent");n.signal?.addEventListener("abort",f,{once:!0});try{d=io({command:t,args:e,cwd:n.cwd,env:n.env,stripEnv:n.stripEnv,stdio:n.inheritStdio?["inherit","inherit","inherit"]:["pipe","pipe","pipe"]}),s&&(c=d.terminateTree()),n.timeoutMs&&n.timeoutMs>0&&(l=setTimeout(()=>u(new nr(t,n.timeoutMs)),n.timeoutMs),l.unref?.()),n.inheritStdio||(d.child.stdout?.on("data",g=>o.push(g)),d.child.stderr?.on("data",g=>i.push(g)),d.child.stdin?.end(n.input));let p=await d.wait();if(c&&await c,s)throw s;return{stdout:o.text(),stderr:i.text(),exitCode:p.exitCode,signal:p.signal,truncated:o.truncated||i.truncated}}catch(p){throw s||Qd(p,t)}finally{l&&clearTimeout(l),n.signal?.removeEventListener("abort",f)}}a(Sw,"executeCommand");function rr(t,e=["--version"],n={}){let r=Zd({command:t,args:e,cwd:n.cwd,env:n.env,stripEnv:n.stripEnv,timeoutMs:n.timeoutMs??5e3}),o=r.error?Qd(r.error,t):void 0;return{ok:!o&&r.status===0,stdout:r.stdout??"",stderr:r.stderr??"",exitCode:r.status,signal:r.signal,...o?{error:o}:{}}}a(rr,"probeCommand");function Qd(t,e){let n=t instanceof Error?t:new Error(String(t));if(n.code!=="ENOENT")return n;let o=new Error(`spawn ${e} ENOENT: \u672A\u5728 PATH \u4E2D\u627E\u5230\u53EF\u6267\u884C\u6587\u4EF6\u3002\u8BF7\u786E\u8BA4\u8BE5\u547D\u4EE4\u5DF2\u5B89\u88C5\uFF0C\u6216\u5728\u914D\u7F6E\u4E2D\u6539\u7528\u7EDD\u5BF9\u8DEF\u5F84\u3002`);return o.cause=n,o.code="ENOENT",o.syscall=`spawn ${e}`,o}a(Qd,"normalizeSpawnError");var ao=class{constructor(e){this.maxBytes=e}maxBytes;static{a(this,"BoundedOutput")}chunks=[];bytes=0;truncated=!1;push(e){let n=Buffer.isBuffer(e)?e:Buffer.from(e),r=Math.max(0,this.maxBytes-this.bytes);if(n.byteLength>r&&(this.truncated=!0),r===0)return;let o=n.byteLength<=r?n:n.subarray(0,r);this.chunks.push(o),this.bytes+=o.byteLength}text(){return Buffer.concat(this.chunks,this.bytes).toString("utf8")}};function Se(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(Se,"formatCommandError");var De=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 Xd=!1;async function Dt(){if(!Xd){Xd=!0;try{(await import("tsx/esm/api")).register?.()}catch{}}}a(Dt,"ensureTsxRegistered");import Ls from"path";import{fileURLToPath as xw,pathToFileURL as Rw}from"url";function Qt(t,e){return/^(file|data|node):/i.test(t)?t:Rw(t,e).href}a(Qt,"toModuleUrl");function H$(t,e){return(e?.windows===!0?Ls.win32:e?.windows===!1?Ls.posix:Ls).dirname(xw(t,e))}a(H$,"moduleDir");function Ws(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(Ws,"overlay");import{z as re}from"zod";import{mkdir as Nw,writeFile as Lw,readdir as qs,readFile as Ww}from"fs/promises";import co from"path";import{format as Aw}from"util";import{AsyncLocalStorage as Cw}from"async_hooks";var Bs=new Cw;function Iw(t,e){return Bs.run(t,e)}a(Iw,"runWithLogContext");function Tw(t){let e=Bs.getStore();if(e)for(let[n,r]of Object.entries(t))r!==void 0&&Object.assign(e,{[n]:r})}a(Tw,"enrichLogContext");function zs(){return Bs.getStore()}a(zs,"getLogContext");var eu=a((t,e)=>{t==="error"||t==="warn"?process.stderr.write(`${e}
|
|
1
|
+
import{a,b as Tw,c as _w,d as Aw,e as Ls,f as Ew,g as Dw}from"./chunk-XO7TZYYU.js";function We(t){if(!t||typeof t!="object")return;let e=t;if(e.type!=="dingtalk_stream_message")return;let n=_t(e.openMsgId),r=_t(e.conversationId),o=_t(e.robotCode),i=_t(e.credRef);if(!(!n||!r||!o||!i))return{type:"dingtalk_stream_message",openMsgId:n,conversationId:r,robotCode:o,credRef:i}}a(We,"resolveDingTalkStreamMessageEventContext");function rr(t){if(!t||typeof t!="object")return;let e=t;if(e.type!=="dingtalk_webhook_mention")return;let n=_t(e.conversationId),r=_t(e.senderOpenDingTalkId),o=_t(e.senderName),i=_t(e.corpId);if(!(!n||!r||!o))return{type:"dingtalk_webhook_mention",conversationId:n,senderOpenDingTalkId:r,senderName:o,...i?{corpId:i}:{}}}a(rr,"resolveDingTalkWebhookMentionEventContext");function _t(t){return typeof t=="string"?t.trim():""}a(_t,"stringValue");import{z as Zt}from"zod";var ao="aitableAgentConfig";function rM(t={}){let e=t.ownership==="owned"&&t.autoCreate===!0?Zt.string().optional():Zt.string(),n=t.ownership==="owned"&&t.autoCreate===!0?Zt.enum(["owned","reference","external"]).optional().default("owned"):Zt.enum(["owned","reference","external"]).optional();return Zt.object({mode:n,baseId:e,tableId:e}).describe(t.description??t.label??"AI \u8868\u683C\u5F15\u7528").meta({[ao]:{configType:"tableRef",access:t.access,ownership:t.ownership,autoCreate:t.autoCreate,defaultBase:t.defaultBase,label:t.label,description:t.description,setupSchema:t.setupSchema}})}a(rM,"tableRefConfigSchema");function Kd(t){let e=Et(t);if(!(!e||e.configType!=="tableRef"))return{configType:"tableRef",access:e.access==="read"||e.access==="write"?e.access:void 0,ownership:qd(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:Hd(e.setupSchema)?e.setupSchema:void 0}}a(Kd,"getConfigHint");function Et(t){let n=Gd(t)?.[ao];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:qd(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:Hd(r.setupSchema)?r.setupSchema:void 0}}a(Et,"getAitableAgentConfigMeta");function Yt(t){return t.ownership==="owned"&&t.autoCreate===!0}a(Yt,"isOwnedAutoCreateHint");function qd(t){return t==="owned"||t==="reference"||t==="external"}a(qd,"isOwnership");function Hd(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(Hd,"isSetupSchema");function Qt(t,e){let n=[];return Jd(At(t),[],n,e),n}a(Qt,"collectConfigHints");function oM(t,e){let n=At(t),r=Vd(n);for(let o of e){let i=Zd(n);if(!i)break;n=At(i[o]),r=Vd(n)??r}return r}a(oM,"describeConfigPath");function vn(t,e){let n=t;for(let r of e){if(!n||typeof n!="object")return;n=n[r]}return n}a(vn,"getConfigValueAtPath");function Jd(t,e,n,r){if(!t)return;let o=At(t),i=Kd(o);i&&(!r||r(i))&&n.push({path:e,schema:o,hint:i});let s=Zd(o);if(s)for(let[c,l]of Object.entries(s))Jd(At(l),[...e,c],n,r)}a(Jd,"walkSchema");function Vd(t){let e=Kd(t),n=Et(t);return e?.description??e?.label??n?.description??n?.label??t?.description}a(Vd,"descriptionForSchema");function Gd(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(Gd,"getSchemaMeta");function At(t){if(!t)return;let e=t;return typeof e.unwrap=="function"?At(e.unwrap()):At(e._def?.schema??e.def?.schema)??At(e._def?.innerType??e.def?.innerType)??t}a(At,"unwrapSchema");function Zd(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(Zd,"objectShape");function iM(t){return(t.required===!1?Zt.string().optional():Zt.string()).describe(t.description??t.label??"\u6587\u4EF6\u8DEF\u5F84\u5F15\u7528").meta({[ao]:{configType:"fileRef",kind:t.kind,required:t.required!==!1,label:t.label,description:t.description}})}a(iM,"fileRefConfigSchema");function sM(t){let e=Et(t);if(!e||e.configType!=="fileRef")return;let r=Gd(t)?.[ao];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(sM,"getFileRefHint");import kp from"path";import vp from"fs";import Bs from"cross-spawn";function eu(t=process.env,e,n=process.platform,r){let o=n==="win32",i={},s=new Map,c=a(l=>{for(let[d,u]of Object.entries(l)){if(!o){i[d]=u;continue}let f=d.toLowerCase(),p=s.get(f);p&&p!==d&&delete i[p],i[d]=u,s.set(f,d)}},"append");if(c(t),r&&r.length>0)for(let l of r)if(o){let d=l.toLowerCase(),u=s.get(d);u&&(delete i[u],s.delete(d))}else delete i[l];return e&&c(e),i}a(eu,"mergeCommandEnv");function tu(t=process.platform){return t!=="win32"}a(tu,"shouldDetachCommand");function co(t){let e=t.detached??tu(),n=Bs(t.command,[...t.args??[]],{cwd:t.cwd,env:eu(process.env,t.env,process.platform,t.stripEnv),stdio:t.stdio??["pipe","pipe","pipe"],detached:e,windowsHide:t.windowsHide??!0}),r=new Promise((o,i)=>{n.once("error",i),n.once("close",(s,c)=>o({exitCode:s,signal:c}))});return r.catch(()=>{}),{child:n,wait:a(()=>r,"wait"),terminateTree:a(o=>Pw(n,e,o),"terminateTree"),unref:a(()=>n.unref(),"unref")}}a(co,"spawnManagedProcess");function nu(t){let e={cwd:t.cwd,env:eu(process.env,t.env,process.platform,t.stripEnv),encoding:"utf8",stdio:["pipe","pipe","pipe"],timeout:t.timeoutMs,input:t.input,windowsHide:t.windowsHide??!0};return Bs.sync(t.command,[...t.args??[]],e)}a(nu,"spawnManagedProcessSync");async function Pw(t,e,n={}){if(Ws(t)||!t.pid)return;let r=n.gracePeriodMs??2e3;process.platform==="win32"?await Qd(t.pid,!1):Yd(t,e,"SIGTERM"),!await Xd(t,r)&&(process.platform==="win32"?await Qd(t.pid,!0):Yd(t,e,"SIGKILL"),await Xd(t,1e3))}a(Pw,"terminateProcessTree");function Ws(t){return t.exitCode!==null||t.signalCode!==null}a(Ws,"hasExited");function Yd(t,e,n){if(t.pid)try{process.kill(e?-t.pid:t.pid,n)}catch{try{t.kill(n)}catch{}}}a(Yd,"signalPosix");async function Qd(t,e){let n=["/PID",String(t),"/T",...e?["/F"]:[]],r=Bs("taskkill.exe",n,{stdio:"ignore",windowsHide:!0});await new Promise(o=>{r.once("error",()=>o()),r.once("close",()=>o())})}a(Qd,"taskkill");function Xd(t,e){return Ws(t)?Promise.resolve(!0):new Promise(n=>{let r=setTimeout(()=>{t.removeListener("close",o),n(Ws(t))},Math.max(0,e));r.unref?.();let o=a(()=>{clearTimeout(r),n(!0)},"onClose");t.once("close",o)})}a(Xd,"waitUntilExit");var $w=32*1024*1024,or=class extends Error{static{a(this,"CommandTimeoutError")}code="ETIMEDOUT";constructor(e,n){super(`Command timed out after ${n}ms: ${e}`),this.name="CommandTimeoutError"}},lo=class extends Error{static{a(this,"CommandAbortedError")}code="ABORT_ERR";constructor(e){super(`Command aborted: ${e}`),this.name="CommandAbortedError"}},Sn=new Set;function zs(){return Sn.size}a(zs,"commandsInFlight");async function ru(t=15e3){let e=Date.now()+t;for(;Sn.size>0&&Date.now()<e;)await Promise.race([Promise.allSettled([...Sn]),new Promise(n=>setTimeout(n,200))]);return Sn.size===0}a(ru,"drainCommands");function Us(t,e,n={}){let r=Mw(t,e,n);Sn.add(r);let o=a(()=>{Sn.delete(r)},"forget");return r.then(o,o),r}a(Us,"runCommand");var K=Us;async function Mw(t,e,n){if(n.signal?.aborted)throw new lo(t);let r=n.maxOutputBytes??$w,o=new uo(r),i=new uo(r),s,c,l,d,u=a(p=>{s||(s=p,d&&(c=d.terminateTree()))},"requestTermination"),f=a(()=>u(new lo(t)),"abortFromParent");n.signal?.addEventListener("abort",f,{once:!0});try{d=co({command:t,args:e,cwd:n.cwd,env:n.env,stripEnv:n.stripEnv,stdio:n.inheritStdio?["inherit","inherit","inherit"]:["pipe","pipe","pipe"]}),s&&(c=d.terminateTree()),n.timeoutMs&&n.timeoutMs>0&&(l=setTimeout(()=>u(new or(t,n.timeoutMs)),n.timeoutMs),l.unref?.()),n.inheritStdio||(d.child.stdout?.on("data",g=>o.push(g)),d.child.stderr?.on("data",g=>i.push(g)),d.child.stdin?.end(n.input));let p=await d.wait();if(c&&await c,s)throw s;return{stdout:o.text(),stderr:i.text(),exitCode:p.exitCode,signal:p.signal,truncated:o.truncated||i.truncated}}catch(p){throw s||ou(p,t)}finally{l&&clearTimeout(l),n.signal?.removeEventListener("abort",f)}}a(Mw,"executeCommand");function Xt(t,e=["--version"],n={}){let r=nu({command:t,args:e,cwd:n.cwd,env:n.env,stripEnv:n.stripEnv,timeoutMs:n.timeoutMs??5e3}),o=r.error?ou(r.error,t):void 0;return{ok:!o&&r.status===0,stdout:r.stdout??"",stderr:r.stderr??"",exitCode:r.status,signal:r.signal,...o?{error:o}:{}}}a(Xt,"probeCommand");function ou(t,e){let n=t instanceof Error?t:new Error(String(t));if(n.code!=="ENOENT")return n;let o=new Error(`spawn ${e} ENOENT: \u672A\u5728 PATH \u4E2D\u627E\u5230\u53EF\u6267\u884C\u6587\u4EF6\u3002\u8BF7\u786E\u8BA4\u8BE5\u547D\u4EE4\u5DF2\u5B89\u88C5\uFF0C\u6216\u5728\u914D\u7F6E\u4E2D\u6539\u7528\u7EDD\u5BF9\u8DEF\u5F84\u3002`);return o.cause=n,o.code="ENOENT",o.syscall=`spawn ${e}`,o}a(ou,"normalizeSpawnError");var uo=class{constructor(e){this.maxBytes=e}maxBytes;static{a(this,"BoundedOutput")}chunks=[];bytes=0;truncated=!1;push(e){let n=Buffer.isBuffer(e)?e:Buffer.from(e),r=Math.max(0,this.maxBytes-this.bytes);if(n.byteLength>r&&(this.truncated=!0),r===0)return;let o=n.byteLength<=r?n:n.subarray(0,r);this.chunks.push(o),this.bytes+=o.byteLength}text(){return Buffer.concat(this.chunks,this.bytes).toString("utf8")}};function Se(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(Se,"formatCommandError");var De=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 iu=!1;async function Dt(){if(!iu){iu=!0;try{(await import("tsx/esm/api")).register?.()}catch{}}}a(Dt,"ensureTsxRegistered");import Vs from"path";import{fileURLToPath as Ow,pathToFileURL as jw}from"url";function en(t,e){return/^(file|data|node):/i.test(t)?t:jw(t,e).href}a(en,"toModuleUrl");function kM(t,e){return(e?.windows===!0?Vs.win32:e?.windows===!1?Vs.posix:Vs).dirname(Ow(t,e))}a(kM,"moduleDir");function Ks(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(Ks,"overlay");import{z as re}from"zod";import{mkdir as Zw,writeFile as Yw,readdir as Zs,readFile as Qw}from"fs/promises";import fo from"path";import{format as Ww}from"util";import{AsyncLocalStorage as Fw}from"async_hooks";var qs=new Fw;function Nw(t,e){return qs.run(t,e)}a(Nw,"runWithLogContext");function Lw(t){let e=qs.getStore();if(e)for(let[n,r]of Object.entries(t))r!==void 0&&Object.assign(e,{[n]:r})}a(Lw,"enrichLogContext");function Hs(){return qs.getStore()}a(Hs,"getLogContext");var su=a((t,e)=>{t==="error"||t==="warn"?process.stderr.write(`${e}
|
|
2
2
|
`):process.stdout.write(`${e}
|
|
3
|
-
`)},"stdoutSink"),
|
|
4
|
-
`),process.stderr.write(`${JSON.stringify({ts:
|
|
5
|
-
`)}}buildEntry(e,n,r,o){let i={ts:
|
|
6
|
-
`),l=await this.chat(c,o),d=
|
|
7
|
-
`),i=await this.chat(o,{temperature:0}),s=
|
|
8
|
-
`),h={purpose:n.messages[n.messages.length-1]?.content.slice(0,50)??"chat",model:n.model,prompt_summary:g.slice(0,300),response_summary:u.slice(0,500),prompt_tokens_approx:Math.ceil(g.length/4),duration_ms:f};p.recordLLMCall(r,h)}return u}a(
|
|
9
|
-
${f.stderr}`)),"shouldRetry"),onRetry:a((f,p)=>{let g={cmd:i,retry:p,error:
|
|
10
|
-
${t.stderr}`;if(!sr(e))return t;let n="dws \u767B\u5F55\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `dws auth login` \u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5\uFF08\u660E\u7EC6\u89C1\u7EC8\u7AEF\u65E5\u5FD7\uFF09";return new ge(n,{exitCode:t.exitCode,stderr:t.stderr,raw:t.raw,authExpired:!0})}a(eb,"surfaceAuthFailure");function tb(t,e){if(t instanceof ge)return t;let n=t instanceof Error?t.message:String(t);return t instanceof Error&&t.name==="AbortError"?new ge(`dws timed out after ${e}ms: ${n}`):new ge(`dws runner failed: ${n}`)}a(tb,"wrapRunnerError");function wu(t){if(Array.isArray(t))return t;if(!k(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(wu,"findKnownArray");function bu(t,e){if(!k(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(k(n)){let r=bu(n,e);if(r)return r}return null}a(bu,"findStringByKeys");var nb="alidocs.dingtalk.com",rb=/^v\d+[A-Za-z0-9]+_[A-Za-z0-9]+_[A-Za-z0-9]+$/;function ob(t){return rb.test(t)}a(ob,"isShareFormUuid");function ib(t){return`https://${nb}/notable/share/form/${t}`}a(ib,"buildFormShareUrl");var ku=2,vu=process.env.NODE_ENV==="test"?0:500;async function Su(t,e,n,r){for(let o=1;o<=ku;o++){try{let i=await t.runJson(["aitable","form","share","get","--base-id",e,"--table-id",n,"--view-id",r]),s=le(i);if(k(s))return{enabled:s.enabled===!0,uuid:typeof s.shareFormUuid=="string"?s.shareFormUuid:""};m.warn("setup","form share get \u8FD4\u56DE\u4E0D\u53EF\u89E3\u6790",{viewId:r,attempt:o})}catch(i){m.warn("setup","form share get \u5931\u8D25",{viewId:r,attempt:o,error:String(i)})}o<ku&&vu>0&&await new Promise(i=>setTimeout(i,vu))}}a(Su,"readShareState");function xu(t,e){if(ob(t))return ib(t);m.warn("setup","shareFormUuid \u5F62\u72B6\u4E0D\u5339\u914D\uFF0C\u4E0D\u62FC\u5206\u4EAB\u94FE\u63A5",{uuid:t,viewId:e})}a(xu,"shareUrlOf");async function fo(t,e,n,r,o){let i=await Su(t,e,n,r);if(i?.enabled&&i.uuid)return xu(i.uuid,r);if(!o.autoEnable)return;try{await t.runJson(["aitable","form","share","update","--base-id",e,"--table-id",n,"--view-id",r,"--enabled","true"])}catch(c){m.warn("setup","\u5F00\u542F\u8868\u5355\u5206\u4EAB\u5931\u8D25",{baseId:e,tableId:n,viewId:r,error:String(c)});return}let s=await Su(t,e,n,r);if(!s){m.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u8BFB\u4E0D\u5230\u5206\u4EAB\u914D\u7F6E",{viewId:r});return}if(!s.uuid){m.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u4ECD\u65E0 shareFormUuid",{viewId:r,enabled:s.enabled});return}return xu(s.uuid,r)}a(fo,"ensureFormShare");var lb=300*1e3,Ru=80,Zs=new Map;function db(t){let e=`${t.baseId}/${t.tableId}`;Zs.delete(e)}a(db,"_clearFieldIdCacheFor");async function po(t,e){let n=`${e.baseId}/${e.tableId}`,r=Zs.get(n);if(r&&Date.now()-r.ts<lb)return r.map;let o=await t.runJson(["aitable","field","get","--base-id",e.baseId,"--table-id",e.tableId]),i=ye(o),s=new Map;for(let c of i){if(!k(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 Zs.set(n,{map:s,ts:Date.now()}),m.debug("table","\u5B57\u6BB5\u6620\u5C04\u5DF2\u52A0\u8F7D",{target:e,count:s.size}),s}a(po,"fetchFieldIdMap");function Ys(t){return ye(t).map(n=>{let r=le(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(Ys,"extractRecordIds");function go(t){return ye(t).map(n=>{let r=le(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(go,"extractRecords");function ub(t,e){let n=new Map([...e.entries()].map(([r,o])=>[o,r]));return Object.fromEntries(Object.entries(t).map(([r,o])=>[n.get(r)??r,o]))}a(ub,"normalizeRecordFields");async function Cu(t,e,n,r){let o=[...new Map(r.map(l=>[String(l),l])).values()];if(o.length===0)return[];let i=await po(t,e),s=i.get(n)??n,c=[];for(let l=0;l<o.length;l+=Ru){let d=o.slice(l,l+Ru),u=d.length===1?{operator:"and",operands:[{operator:"eq",operands:[s,d[0]]}]}:{operator:"or",operands:d.map(p=>({operator:"eq",operands:[s,p]}))},f=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(u),"--limit",String(Math.max(2,d.length))]);for(let p of go(f)){let g=ub(p.fields,i);c.push({uniqueValue:g[n],recordId:p.recordId,fields:g})}}return c}a(Cu,"queryRecordsByUniqueValues");function fb(t,e,n,r){return{async readCurrentRow(){let[o]=await t.fetchItemsByIds([e.id]);return o?.fields??e.fields},async updateCurrentRow(o){await t.updateFields(e.id,o),Object.assign(e.fields,o)},async queryRows(o,i){let s=o&&Object.keys(o).length>0,c=s?await t.fetchItemsByFilter(o,i):await t.fetchAllItems();return(!s&&i!==void 0?c.slice(0,i):c).map(d=>d.fields)},async findRowIds(o,i){return!o||Object.keys(o).length===0?[]:(await t.fetchItemsByFilter(o,i)).map(c=>c.id).filter(c=>c.length>0)},async createRecordIn(o,i){rt(n);let s=await n.runJson(["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify([{cells:i}]),"--yes"]),c=Ys(s);if(c.length===0)throw new Error(`createRecordIn: dws \u672A\u8FD4\u56DE recordId\uFF08target=${o.baseId}/${o.tableId}\uFF09`);return m.debug("table","createRecordIn \u6210\u529F",{target:o,recordId:c[0]}),{recordId:c[0]}},async createRecordsIn(o,i){if(rt(n),i.length===0)return{recordIds:[]};let s=await n.runJson(["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify(i.map(l=>({cells:l}))),"--yes"]),c=Ys(s);return m.debug("table","createRecordsIn \u6210\u529F",{target:o,count:c.length}),{recordIds:c}},async findRecordsIn(o,i,s){return rt(n),Cu(n,o,i,s)},async findRecordIn(o,i,s){rt(n);let c=(await Cu(n,o,i,[s]))[0];return c?{recordId:c.recordId,fields:c.fields}:null},async upsertRecordIn(o,i,s){rt(n);let c=s[i];if(c===void 0)throw new Error(`upsertRecordIn: fields \u4E2D\u7F3A\u5C11\u552F\u4E00\u952E "${i}"`);return Tu(n,o,i,c,s,0)},async findRecordIdIn(o,i,s){return rt(n),s==null||s===""?null:pb(n,o,i,s)},async readRecordIn(o,i){if(rt(n),!i)throw new Error(`readRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);let s=await n.runJson(["aitable","record","query","--base-id",o.baseId,"--table-id",o.tableId,"--record-ids",i]),c=go(s);if(c.length===0)return null;let l=await po(n,o),d=new Map;for(let[f,p]of l.entries())d.set(p,f);let u={};for(let[f,p]of Object.entries(c[0].fields)){let g=d.get(f)??f;u[g]=p}return u},async updateRecordsIn(o,i){if(rt(n),i.length!==0){for(let s of i)if(!s.recordId)throw new Error(`updateRecordsIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await n.runJson(["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify(i.map(s=>({recordId:s.recordId,cells:s.fields}))),"--yes"]),m.debug("table","updateRecordsIn \u6210\u529F",{target:o,count:i.length})}},async updateRecordIn(o,i,s){if(rt(n),!i)throw new Error(`updateRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await n.runJson(["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify([{recordId:i,cells:s}]),"--yes"]),m.debug("table","updateRecordIn \u6210\u529F",{target:o,recordId:i})},async uploadAttachmentToCurrentTable(o,i){if(rt(n),!r)throw new Error("uploadAttachmentToCurrentTable: baseId \u672A\u6CE8\u5165\uFF08\u68C0\u67E5 settings.tracker.base_id\uFF09");let c=(await ab(o)).size;if(c>Iu)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08${c} bytes > ${Iu}\uFF09\uFF0C\u8DF3\u8FC7\u4E0A\u4F20`);let l=await n.runJson(["aitable","attachment","upload","--base-id",r,"--file-name",i,"--size",String(c)],{timeoutMs:3e4}),d=le(l),u=Qs(d,["uploadUrl","upload_url"]),f=Qs(d,["fileToken","file_token"]);if(!u||!f)throw new Error(`uploadAttachmentToCurrentTable: dws \u672A\u8FD4\u56DE uploadUrl/fileToken\uFF08response=${JSON.stringify(d)}\uFF09`);let p=await sb(o),g=cb.extname(i).toLowerCase(),h=gb[g]??"application/octet-stream",y=await fetch(u,{method:"PUT",headers:{"Content-Type":h},body:p});if(!y.ok)throw new Error(`uploadAttachmentToCurrentTable: OSS PUT \u5931\u8D25\uFF08status=${y.status}\uFF09`);return m.debug("table","uploadAttachmentToCurrentTable \u6210\u529F",{fileName:i,fileToken:f,size:c}),{fileToken:f}},async formShareUrl(o,i){rt(n);let s=o.viewId;if(!s&&o.viewName)try{let l=await n.runJson(["aitable","view","get","--base-id",o.baseId,"--table-id",o.tableId]),u=ye(l).find(f=>k(f)?(typeof f.name=="string"?f.name:typeof f.viewName=="string"?f.viewName:"").trim()===o.viewName.trim():!1);u&&k(u)&&(s=typeof u.viewId=="string"?u.viewId:typeof u.id=="string"?u.id:void 0)}catch(l){return{url:"",reason:`\u83B7\u53D6\u89C6\u56FE\u5217\u8868\u5931\u8D25: ${String(l)}`}}if(!s)return{url:"",reason:`\u672A\u627E\u5230\u89C6\u56FE: ${o.viewName??"(\u672A\u6307\u5B9A)"}`};let c=await fo(n,o.baseId,o.tableId,s,{autoEnable:i?.autoEnable??!1});return c?{url:c}:{url:"",reason:"\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\u6216\u89E3\u6790\u5931\u8D25"}}}}a(fb,"createTableToolkit");async function pb(t,e,n,r){let s={operator:"and",operands:[{operator:"eq",operands:[(await po(t,e)).get(n)??n,r]}]},c=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(s),"--limit","2"]),l=go(c);return l.length>0?l[0].recordId:null}a(pb,"doFindRecordIdIn");async function Tu(t,e,n,r,o,i){let l={operator:"and",operands:[{operator:"eq",operands:[(await po(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=go(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"]),m.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=Ys(f);if(p.length===0)throw new Error("upsertRecordIn: create \u540E dws \u672A\u8FD4\u56DE recordId");return m.debug("table","upsertRecordIn \u65B0\u5EFA",{target:e,recordId:p[0],uniqueBy:n}),{recordId:p[0]}}catch(f){if(i===0)return db(e),m.debug("table","upsertRecordIn create \u5931\u8D25\uFF0C\u6E05\u9664\u5B57\u6BB5\u7F13\u5B58\u540E\u91CD\u8BD5",{target:e,uniqueBy:n,error:String(f)}),Tu(t,e,n,r,o,1);throw f}}a(Tu,"doUpsertRecordIn");var Iu=20*1024*1024,gb={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml"};function Qs(t,e){if(!k(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=Qs(n,e);if(r)return r}return null}a(Qs,"findStringInPayload");function rt(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(rt,"ensureDws");function mb(t){return new ae({bin:t.tracker.dws_bin})}a(mb,"createDwsFromSettings");var Au={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:P.object({}).strict(),build(t,e){let n=mb(e.settings);return fb(e.tracker,e.item,n,e.settings.tracker.base_id)},methods:[{name:"readCurrentRow",description:"\u8BFB\u53D6\u5F53\u524D\u884C\u6570\u636E",output:P.record(P.string(),P.unknown())},{name:"updateCurrentRow",description:"\u66F4\u65B0\u5F53\u524D\u884C\u5B57\u6BB5",params:P.object({fields:P.record(P.string(),P.unknown()).describe("\u8981\u5199\u5165\u7684\u5B57\u6BB5\u952E\u503C")})},{name:"queryRows",description:"\u67E5\u8BE2\u5176\u4ED6\u884C",params:P.object({filter:P.record(P.string(),P.unknown()).describe("\u67E5\u8BE2\u6761\u4EF6"),limit:P.number().optional().describe("\u8FD4\u56DE\u6761\u6570\u4E0A\u9650")}),output:P.array(P.record(P.string(),P.unknown()))},{name:"readRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6309 recordId \u8BFB\u53D6\u4E00\u884C\uFF08\u5B57\u6BB5\u540D\u4E3A\u952E\uFF09",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),recordId:P.string()}),output:P.record(P.string(),P.unknown()).nullable()},{name:"createRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u521B\u5EFA\u4E00\u6761\u8BB0\u5F55",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),fields:P.record(P.string(),P.unknown())}),output:P.object({recordId:P.string()})},{name:"createRecordsIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6279\u91CF\u521B\u5EFA\u8BB0\u5F55",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),rows:P.array(P.record(P.string(),P.unknown()))}),output:P.object({recordIds:P.array(P.string())})},{name:"findRecordsIn",description:"\u6309\u552F\u4E00\u952E\u6279\u91CF\u67E5\u8BE2\u8BB0\u5F55",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),uniqueBy:P.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),uniqueValues:P.array(P.unknown()).describe("\u552F\u4E00\u952E\u5B57\u6BB5\u503C\u5217\u8868")}),output:P.array(P.object({uniqueValue:P.unknown(),recordId:P.string(),fields:P.record(P.string(),P.unknown())}))},{name:"upsertRecordIn",description:"\u6309\u552F\u4E00\u952E upsert\uFF08\u547D\u4E2D\u5219 update\uFF0C\u672A\u547D\u4E2D\u5219 create\uFF09",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),uniqueBy:P.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),fields:P.record(P.string(),P.unknown())}),output:P.object({recordId:P.string()})},{name:"uploadAttachmentToCurrentTable",description:"\u4E0A\u4F20\u672C\u5730\u6587\u4EF6\u5230\u5F53\u524D\u8868\u6240\u5728 base \u7684\u9644\u4EF6\u5B58\u50A8\uFF0C\u8FD4\u56DE fileToken",params:P.object({filePath:P.string().describe("\u672C\u5730\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84"),fileName:P.string().describe("\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09")}),output:P.object({fileToken:P.string()})},{name:"formShareUrl",description:"\u53D6\u6307\u5B9A\u8868\u5355\u89C6\u56FE\u7684\u5206\u4EAB\u94FE\u63A5\uFF08\u6309 viewName \u6216 viewId \u89E3\u6790\uFF09",params:P.object({target:P.object({baseId:P.string(),tableId:P.string(),viewName:P.string().optional(),viewId:P.string().optional()}),options:P.object({autoEnable:P.boolean().optional()}).optional()}),output:P.object({url:P.string(),reason:P.string().optional()})},{name:"updateRecordsIn",description:"\u6309 recordId \u6279\u91CF\u66F4\u65B0\u5B57\u6BB5",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),rows:P.array(P.object({recordId:P.string(),fields:P.record(P.string(),P.unknown())}))})},{name:"updateRecordIn",description:"\u6309 recordId \u66F4\u65B0\u5B57\u6BB5",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),recordId:P.string(),fields:P.record(P.string(),P.unknown())})}],permissions:[{method:"updateCurrentRow",description:"\u5199\u5165\u8868\u683C\u884C\u6570\u636E(\u9650\u5B9A\u53EF\u5199\u7684\u8868)",scopeSchema:P.array(P.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 pe}from"zod";import Ot from"path";import sn from"fs";import{readFile as zb}from"fs/promises";import ia from"path";import{z as G}from"zod";var hb=/^(Error|ERROR|fatal|FATAL|crash|CRASH|panic|PANIC|exception|EXCEPTION)\b/;function ut(t){return hb.test(t)}a(ut,"isStderrError");function de(t){if(!(!t||typeof t!="object"||Array.isArray(t)))return t}a(de,"asRecord");function N(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim().length>0)return r}}a(N,"pickString");function en(t,e=512){return t.length>e?`${t.slice(0,e)}...`:t}a(en,"truncateText");var yb=["content","text","message","delta","output"];function wb(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(wb,"mapStructuredType");function bb(t){let e=N(t,["type","event","kind","level"])??"text",n=wb(e),r=N(t,["toolName","tool_name","tool","name"]),o=de(t.toolInput)??de(t.input);return{type:n,content:N(t,yb),toolName:r,toolInput:typeof t.toolInput=="string"?t.toolInput:void 0,toolInputRaw:o,sessionId:N(t,["sessionId","session_id","conversationId","conversation_id"]),requestId:N(t,["requestId","request_id","id"]),done:!!t.done||n==="result"}}a(bb,"fromStructuredJson");function kb(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(kb,"fromTextLine");function tn(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:[bb(n)],structured:!0}}catch{}return{events:[kb(e)],structured:!1}}a(tn,"parseAgentLine");function vb(t,e){let n=de(e);if(!n)return"";switch(t){case"Read":case"Edit":case"Write":{let o=N(n,["file_path","filePath","path"]);if(o)return o;break}case"Bash":{let o=N(n,["command","cmd"]);if(o)return o;break}case"Grep":case"Glob":{let o=N(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(vb,"summarizeToolInput");function Sb(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=de(n);if(!r)continue;let o=N(r,["type"])??"";if(o==="text"){let i=N(r,["text"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=N(r,["thinking","text"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"){let i=N(r,["name"])??"unknown";e.push({type:"tool_use",requestId:N(r,["id"]),toolName:i,toolInput:vb(i,r.input),toolInputRaw:de(r.input)})}else if(o==="tool_result"){let i=N(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(Sb,"parseContentBlocks");function xb(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=N(e,["type"])??"",r=N(e,["session_id","sessionId"]),o=a(i=>r?{...i,sessionId:r}:i,"addSession");if(n==="assistant"||n==="user"){let i=de(e.message);return i?Sb(i.content).map(o):[o({type:"text",content:""})]}if(n==="result"){let i=N(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=N(e,["error","message","content"])??"unknown error";return[o({type:"error",content:i,done:!0})]}return null}a(xb,"parseClaudeLine");function Xs(){return(t,e)=>{if(t==="stderr"){let o=e.trim();return o?ut(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=xb(n);return r&&r.length>0?r:tn(n).events}}a(Xs,"createClaudeParser");var _u={id:"claudecode",name:"Claude Code",bin:"claude",versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];if(o.includes("--output-format")||o.push("--output-format","stream-json"),o.includes("--verbose")||o.push("--verbose"),r.model&&!o.includes("--model")&&o.push("--model",r.model),r.permissionMode==="bypassPermissions"&&(o.includes("--dangerously-skip-permissions")||o.push("--dangerously-skip-permissions")),r.allowedTools&&r.allowedTools.length>0)for(let i of r.allowedTools)o.push("--allowedTools",i);return e&&o.push("--resume",e),o.push("-p",t),o},"buildArgs"),createParser:Xs};function ea(t){return N(t,["text","content","message","summary"])??""}a(ea,"extractItemText");function nn(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(nn,"stringifyValue");function ta(t,e){let n=de(t.error);return N(t,["message","error","content"])??(n?N(n,["message","error","content"]):void 0)??nn(t.error)??e}a(ta,"extractErrorText");function Rb(t){return N(t,["command","query","input","arguments"])??nn(t.arguments)??nn(t.input)??nn(t.changes)}a(Rb,"extractToolInput");function Cb(t){let e=N(t,["aggregated_output","output","result","message","text","summary"])??nn(t.output)??nn(t.result)??nn(t.changes);return e||(typeof t.exit_code=="number"?`exit_code=${t.exit_code}`:void 0)}a(Cb,"extractToolResult");function Ib(t,e){if(e!=="mcp_tool_call")return e||"codex_tool";let n=N(t,["server","server_name"]),r=N(t,["tool","tool_name","name"]);return[n,r].filter(Boolean).join(".")||e}a(Ib,"codexToolName");function Tb(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=N(e,["type"])??"";if(n==="thread.started"){let r=N(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:ta(e,"Codex turn failed"),done:!0}];if(n==="item.started"||n==="item.updated"||n==="item.completed"){let r=de(e.item);if(!r)return[];let o=N(r,["type"])??"",i=N(r,["id","call_id"]),s=n==="item.completed";if(o==="agent_message"){if(!s)return[];let l=ea(r);return l?[{type:"result",content:l,requestId:i,done:!0}]:[]}if(o==="reasoning"){if(!s)return[];let l=ea(r);return l?[{type:"thinking",content:l,requestId:i}]:[]}if(o==="error")return[{type:"error",content:ta(r,"Codex item failed"),requestId:i,done:!0}];let c=Ib(r,o);return n==="item.started"?[{type:"tool_use",toolName:c,toolInput:Rb(r),toolInputRaw:r,requestId:i}]:s?[{type:"tool_result",toolName:c,content:Cb(r),requestId:i}]:[]}if(n==="message.delta"){let r=de(e.delta)??de(e.content);if(!r)return[];let o=N(r,["text","content","value"]);return o?(N(r,["role"])??N(e,["role"]))==="system"?[]:[{type:"text",content:o}]:[]}if(n==="message.completed"){let r=de(e.message)??de(e.content);if(!r)return[];let o=Array.isArray(r.content)?r.content.map(i=>{let s=de(i);return s?ea(s):""}).filter(i=>i.length>0).join(`
|
|
11
|
-
`):N(r,["text","content"])??"";return o?[{type:"result",content:o,done:!0}]:[]}if(n==="tool_use"||n==="function_call"){let r=N(e,["name","tool","toolName"])??"unknown",o=N(e,["input","arguments"]);return[{type:"tool_use",toolName:r,toolInput:o,requestId:N(e,["id","call_id"])}]}return n==="tool_result"||n==="function_result"?[{type:"tool_result",content:N(e,["output","result","content"]),requestId:N(e,["tool_use_id","call_id","id"])}]:n==="error"?[{type:"error",content:
|
|
3
|
+
`)},"stdoutSink"),au={debug:0,info:1,warn:2,error:3},Bw=480*60*1e3,zw=new Set(["ts","level","cat","env","msg","traceId","uid"]);function X(t=new Date){return new Date(t.getTime()+Bw).toISOString().replace(/Z$/,"+08:00")}a(X,"formatBeijingTimestamp");function ir(t=process.env){return t.DEPLOY_ENV??t.ENV_TYPE??"local"}a(ir,"resolveLogEnv");function cu(t){if(t===null)return null;let e=typeof t;if(e==="string"||e==="number"||e==="boolean")return t;if(t instanceof Error)return t.stack??String(t);try{return e==="object"?JSON.stringify(t)??String(t):String(t)}catch{return"[unserializable]"}}a(cu,"flattenValue");function Uw(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)&&!(t instanceof Error)}a(Uw,"isFlattenableRecord");function Vw(t){let e={};for(let[n,r]of Object.entries(t))r!==void 0&&(e[zw.has(n)?`d_${n}`:n]=cu(r));return e}a(Vw,"flattenData");var Js=class{static{a(this,"Logger")}minLevel="info";sink=su;setLevel(e){this.minLevel=e}setSink(e){this.sink=e}resetSink(){this.sink=su}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(au[e]<au[this.minLevel])return;let i;try{i=JSON.stringify(this.buildEntry(e,n,r,o))}catch{i=JSON.stringify({ts:X(),level:e,cat:n,env:ir(),msg:r,logError:"serialize failed"})}try{this.sink(e,i)}catch(s){process.stderr.write(`${i}
|
|
4
|
+
`),process.stderr.write(`${JSON.stringify({ts:X(),level:"error",cat:"logger",env:ir(),msg:"\u65E5\u5FD7 sink \u5199\u5165\u5931\u8D25\uFF0C\u5DF2\u9000\u56DE stderr",reason:s instanceof Error?s.message:String(s)})}
|
|
5
|
+
`)}}buildEntry(e,n,r,o){let i={ts:X(),level:e,cat:n,env:ir(),msg:r},s=Hs();if(s?.traceId&&(i.traceId=s.traceId),s?.uid&&(i.uid=s.uid),o!=null&&!Uw(o))i.data=cu(o);else if(o&&Object.keys(o).length>0)try{Object.assign(i,Vw(o))}catch{i.data=o}return i}},m=new Js;function Kw(t){let e=a(n=>(...r)=>{m[n](t,Ww(...r).replace(/\s+$/,""))},"emit");return{debug:e("debug"),info:e("info"),warn:e("warn"),error:e("error")}}a(Kw,"createPrintfLogger");import{createHash as qw}from"crypto";import sr from"path";var uu=/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i,lu=/[<>:"/\\|?*\u0000-\u001f]/g,Hw=/[<>:"/\\|?*\u0000-\u001f]/,ne=class extends Error{constructor(n,r){super(n);this.reason=r;this.name="PathBoundaryError"}reason;static{a(this,"PathBoundaryError")}code="PATH_BOUNDARY_VIOLATION"};function xe(t,e,n={}){let r=Jw(n.flavor??"native");if(typeof t!="string"||t.trim()===""||t.includes("\0"))throw new ne("\u6839\u76EE\u5F55\u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26","INVALID_ROOT");if(typeof e!="string"||e.trim()===""||e.includes("\0"))throw new ne("\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26","INVALID_RELATIVE_PATH");if(fu(e))throw new ne(`\u4E0D\u5141\u8BB8\u7EDD\u5BF9\u8DEF\u5F84: ${e}`,"ABSOLUTE_PATH");let o=e.replace(/[\\/]+/g,r.sep),i=r.resolve(t),s=r.resolve(i,o),c=r.relative(i,s);if(c===".."||c.startsWith(`..${r.sep}`)||r.isAbsolute(c))throw new ne(`\u8DEF\u5F84\u8D8A\u51FA\u6839\u76EE\u5F55: ${e}`,"OUTSIDE_ROOT");if(c===""&&n.allowRoot===!1)throw new ne(`\u8DEF\u5F84\u4E0D\u80FD\u6307\u5411\u6839\u76EE\u5F55\u672C\u8EAB: ${e}`,"ROOT_NOT_ALLOWED");return s}a(xe,"resolveInsideRoot");function Gs(t,e={}){let n=e.label??"ID",r=e.maxLength??128;if(typeof t!="string"||t.length===0||t.trim()!==t)throw new ne(`${n} \u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B\u9996\u5C3E\u7A7A\u767D`,"INVALID_PORTABLE_ID");if(t.length>r)throw new ne(`${n} \u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7 ${r}`,"INVALID_PORTABLE_ID");if(t==="."||t===".."||Hw.test(t))throw new ne(`${n} \u5305\u542B\u4E0D\u53EF\u79FB\u690D\u7684\u6587\u4EF6\u540D\u5B57\u7B26: ${t}`,"INVALID_PORTABLE_ID");if(/[. ]$/.test(t))throw new ne(`${n} \u4E0D\u80FD\u4EE5\u70B9\u6216\u7A7A\u683C\u7ED3\u5C3E: ${t}`,"INVALID_PORTABLE_ID");if(uu.test(t))throw new ne(`${n} \u4F7F\u7528\u4E86 Windows \u4FDD\u7559\u8BBE\u5907\u540D: ${t}`,"INVALID_PORTABLE_ID");return t}a(Gs,"assertPortableId");function Re(t,e={}){let n=e.fallback??"untitled",r=e.maxLength??120;if(!Number.isInteger(r)||r<16||r>255)throw new RangeError("safeFilename maxLength \u5FC5\u987B\u662F 16..255 \u7684\u6574\u6570");let o=String(t??"").normalize("NFC"),i=o.replace(lu,"-").replace(/\s+/g," ").replace(/-+/g,"-").trim().replace(/[. ]+$/g,""),s=i!==o;if((i===""||i==="."||i==="..")&&(i=n.replace(lu,"-").trim().replace(/[. ]+$/g,"")||"untitled",s=!0),uu.test(i)&&(i=`_${i}`,s=!0),i.length>r&&(s=!0),!s)return i;let c=qw("sha256").update(o).digest("hex").slice(0,8);return Gw(i,c,r)}a(Re,"safeFilename");function ar(t){if(typeof t!="string"||t.trim()===""||t.includes("\0"))throw new ne("\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26","INVALID_RELATIVE_PATH");if(fu(t))throw new ne(`\u4E0D\u5141\u8BB8\u7EDD\u5BF9\u8DEF\u5F84: ${t}`,"ABSOLUTE_PATH");let e=[];for(let n of t.replace(/\\/g,"/").split("/"))if(!(n===""||n===".")){if(n==="..")throw new ne(`\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u5305\u542B ..: ${t}`,"INVALID_RELATIVE_PATH");e.push(n)}if(e.length===0)throw new ne(`\u76F8\u5BF9\u8DEF\u5F84\u4E0D\u80FD\u6307\u5411\u5F53\u524D\u76EE\u5F55: ${t}`,"INVALID_RELATIVE_PATH");return e.join("/")}a(ar,"toPortableRelPath");function Jw(t){return t==="win32"?sr.win32:t==="posix"?sr.posix:sr}a(Jw,"selectPathApi");function fu(t){return sr.posix.isAbsolute(t)||sr.win32.isAbsolute(t)||/^[a-zA-Z]:/.test(t)}a(fu,"isAbsoluteOnAnyPlatform");function Gw(t,e,n){let r=t.lastIndexOf("."),o=r>0&&r<t.length-1,i=o?t.slice(r):"",s=o?t.slice(0,r):t,c=`-${e}`;i.length>Math.floor(n/2)&&(i=du(i,Math.floor(n/2)));let l=Math.max(1,n-c.length-i.length);return s=du(s,l).replace(/[. ]+$/g,"")||"_",`${s}${c}${i}`}a(Gw,"fitWithHash");function du(t,e){let n=0,r="";for(let o of t){if(n+o.length>e)break;r+=o,n+=o.length}return r}a(du,"truncateUtf16");var Ys=class{static{a(this,"Tracer")}traceDir;activeSteps=new Map;seqCounters=new Map;writeQueues=new Map;constructor(e){this.traceDir=e}startStep(e,n,r,o){this.activeSteps.set(e,{itemId:e,stepId:n,stepName:r,inputs:o,startedAt:Date.now(),llmCalls:[]})}async endStep(e,n,r,o,i=[]){let s=this.activeSteps.get(e);s&&(this.activeSteps.delete(e),await this.writeStep(s,n,r,o,i))}recordLLMCall(e,n){this.activeSteps.get(e)?.llmCalls.push(n)}isActive(e){return this.activeSteps.has(e)}async getTraces(e){let n=this.itemTraceDir(e),r;try{r=await Zs(n)}catch{return[]}let o=r.filter(s=>s.endsWith(".json")).sort(Xw),i=[];for(let s of o)try{let c=await Qw(fo.join(n,s),"utf8");i.push(JSON.parse(c))}catch{m.warn("tracer","trace \u6587\u4EF6\u4E0D\u53EF\u8BFB\u6216\u635F\u574F\uFF0C\u5DF2\u8DF3\u8FC7",{file:fo.join(n,s)})}return i}async getLatestTraces(e=10){try{let n=await Zs(this.traceDir),r=[];for(let o of n){let i=await this.getTraces(o);r.push(...i)}return r.sort((o,i)=>new Date(i.started_at).getTime()-new Date(o.started_at).getTime()),r.slice(0,e)}catch{return[]}}writeStep(e,n,r,o,i=[]){let s=Date.now(),l=(this.writeQueues.get(e.itemId)??Promise.resolve()).then(async()=>{let d=await this.nextSeq(e.itemId),u={step_id:e.stepId,step_name:e.stepName,item_id:e.itemId,seq:d,started_at:X(new Date(e.startedAt)),ended_at:X(new Date(s)),duration_ms:s-e.startedAt,status:n,llm_calls:e.llmCalls,inputs:e.inputs,outputs:r,logs:i,error:o??null};await this.writeTrace(e.itemId,d,e.stepId,u)}).catch(d=>{m.warn("tracer","trace \u5199\u5165\u5931\u8D25",{itemId:e.itemId,stepId:e.stepId,error:d instanceof Error?d.message:String(d)})}).finally(()=>{this.writeQueues.get(e.itemId)===l&&this.writeQueues.delete(e.itemId)});return this.writeQueues.set(e.itemId,l),l}async nextSeq(e){let n=this.seqCounters.get(e),r=n!==void 0?n+1:await this.countTraceFiles(e)+1;return this.seqCounters.set(e,r),r}async countTraceFiles(e){try{return(await Zs(this.itemTraceDir(e))).filter(r=>r.endsWith(".json")).length}catch{return 0}}async writeTrace(e,n,r,o){let i=this.itemTraceDir(e);await Zw(i,{recursive:!0});let s=X().slice(0,23).replace(/[:.]/g,"-"),c=Re(r,{fallback:"step",maxLength:80}),l=`${String(n).padStart(3,"0")}-${c}-${s}.json`,d=fo.join(i,l);await Yw(d,JSON.stringify(o,null,2),"utf8"),m.debug("tracer","trace \u5DF2\u5199\u5165",{filepath:d})}itemTraceDir(e){return fo.join(this.traceDir,Re(e,{fallback:"item",maxLength:100}))}};function Xw(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(Xw,"compareBySeq");var Qs=null;function pu(t){return Qs=new Ys(t),Qs}a(pu,"initTracer");function po(){return Qs}a(po,"getTracer");function eb(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 m.debug("llm","chat \u8C03\u7528",{model:o,promptLength:n.length}),await tb(e.provider,i,{model:o,messages:[...r?.systemPrompt?[{role:"system",content:r.systemPrompt}]:[],{role:"user",content:n}],temperature:r?.temperature,max_tokens:r?.maxTokens},t.itemId)},async chatJSON(n,r,o){let s=r.type==="array",c=[n,"","\u8BF7\u4EE5\u4E25\u683C JSON \u683C\u5F0F\u8F93\u51FA\uFF0C\u7B26\u5408\u4EE5\u4E0B schema\uFF1A","```json",JSON.stringify(r,null,2),"```",s?"\u53EA\u8F93\u51FA JSON \u6570\u7EC4\uFF08\u4EE5 [ \u5F00\u5934\u3001] \u7ED3\u5C3E\uFF09\uFF0C\u4E0D\u8981\u5305\u88F9\u5728\u4EFB\u4F55\u5BF9\u8C61\u4E2D\uFF0C\u4E0D\u8981\u6709\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002":"\u53EA\u8F93\u51FA JSON\uFF0C\u4E0D\u8981\u6709\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002"].join(`
|
|
6
|
+
`),l=await this.chat(c,o),d=gu(l),u;try{u=JSON.parse(d)}catch{throw new Error(`LLM \u8F93\u51FA\u4E0D\u662F\u6709\u6548 JSON: ${l.slice(0,200)}`)}if(s&&!Array.isArray(u)&&u&&typeof u=="object"){let f=u;for(let p of Object.values(f))if(Array.isArray(p)){u=p;break}}return u},async classify(n,r){let o=[`\u8BF7\u5C06\u4EE5\u4E0B\u6587\u672C\u5206\u7C7B\u5230\u8FD9\u4E9B\u7C7B\u522B\u4E4B\u4E00\uFF1A${r.join("\u3001")}`,"",`\u6587\u672C: ${n}`,"",'\u8BF7\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\uFF1A{"category": "\u7C7B\u522B\u540D", "confidence": 0.95}',"\u53EA\u8F93\u51FA JSON\u3002"].join(`
|
|
7
|
+
`),i=await this.chat(o,{temperature:0}),s=gu(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(eb,"createLLMToolkit");async function tb(t,e,n,r){let{url:o,headers:i,body:s}=nb(t,e,n),c=Date.now(),l=await fetch(o,{method:"POST",headers:i,body:JSON.stringify(s)});if(!l.ok){let g=await l.text().catch(()=>"");throw new Error(`LLM API \u8C03\u7528\u5931\u8D25 (${l.status}): ${g.slice(0,300)}`)}let d=await l.json(),u=rb(t,d),f=Date.now()-c,p=po();if(r&&p?.isActive(r)){let g=n.messages.map(y=>y.content).join(`
|
|
8
|
+
`),h={purpose:n.messages[n.messages.length-1]?.content.slice(0,50)??"chat",model:n.model,prompt_summary:g.slice(0,300),response_summary:u.slice(0,500),prompt_tokens_approx:Math.ceil(g.length/4),duration_ms:f};p.recordLLMCall(r,h)}return u}a(tb,"callLLM");function nb(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(nb,"buildRequest");function rb(t,e){return t==="anthropic"?e.content?.[0]?.text??"":e.choices?.[0]?.message?.content??""}a(rb,"extractLLMContent");function gu(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(gu,"extractJSON");function ob(t,e){return t??e}a(ob,"resolveApiKey");var ib=re.object({model:re.string().min(1).optional().describe("LLM \u6A21\u578B\u540D,\u5982 qwen-max / claude-opus-4-8"),provider:re.enum(["dashscope","openai","anthropic","idealab"]).optional().describe("\u6A21\u578B\u670D\u52A1\u5546"),api_key:re.string().min(1).optional().describe("LLM API Key;\u503C\u7528 ${env.XXX} \u4ECE\u73AF\u5883\u6CE8\u5165(\u52A0\u8F7D\u65F6\u63D2\u503C)")}).strict(),mu=re.object({model:re.string().optional().describe("\u6A21\u578B\u8986\u76D6"),temperature:re.number().optional(),maxTokens:re.number().optional(),systemPrompt:re.string().optional()}).describe("LLM \u8C03\u7528\u9009\u9879"),hu={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:ib,methods:[{name:"chat",description:"\u5355\u6B21 LLM \u5BF9\u8BDD",params:re.object({prompt:re.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),options:mu.optional()}),output:re.string()},{name:"chatJSON",description:"\u7ED3\u6784\u5316 JSON \u8F93\u51FA",params:re.object({prompt:re.string().describe("\u7528\u6237\u63D0\u793A\u8BCD"),schema:re.record(re.string(),re.unknown()).describe("\u671F\u671B\u8F93\u51FA\u7684 JSON Schema"),options:mu.optional()}),output:re.unknown().describe("\u6309\u4F20\u5165 schema \u89E3\u6790\u51FA\u7684\u5BF9\u8C61")},{name:"classify",description:"\u6587\u672C\u5206\u7C7B",params:re.object({text:re.string().describe("\u5F85\u5206\u7C7B\u6587\u672C"),categories:re.array(re.string()).describe("\u5019\u9009\u7C7B\u522B")}),output:re.object({category:re.string(),confidence:re.number()})}],defaultConfig(t){let e=t.recipe.llm;return{model:e?.model??"qwen-max",provider:e?.provider??"dashscope"}},build(t,e){return eb({llm:{provider:t.provider,model:t.model,api_key:ob(t.api_key,e.settings.recipe.llm?.api_key)},itemId:e.item.id})}};import{readFile as wb,stat as bb}from"fs/promises";import kb from"path";import{z as P}from"zod";function k(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(k,"isRecord");function HM(t){return typeof t=="string"&&t.trim()!==""?t:typeof t=="number"||typeof t=="boolean"?String(t):null}a(HM,"stringOrNull");function JM(t){return/^[A-Za-z0-9._/:=@+-]+$/.test(t)?t:`'${t.replace(/'/g,`'"'"'`)}'`}a(JM,"shellToken");var sb=/refresh_token|token exchange failed|authCode\.not|auth expired|not logged in|login first|UNAUTHENTICATED/i;function cr(t){return sb.test(t)}a(cr,"isDwsAuthFailure");import{AsyncLocalStorage as yu}from"async_hooks";var wu=new yu;function Xs(t,e){return wu.run(t,e)}a(Xs,"runWithExecutor");function bu(){return wu.getStore()}a(bu,"getCurrentExecutor");var ku=new yu,vu;function eO(t){vu=t}a(eO,"setGlobalDwsRunner");function tO(t,e){return ku.run(t,e)}a(tO,"runWithDwsRunner");function Su(){return ku.getStore()??vu}a(Su,"getCurrentDwsRunner");var ab=[300,1e3,2e3];async function tn(t,e){let n=e?.retries??2,r=e?.delaysMs??ab;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 cb(l)}}a(tn,"withRetry");var xn=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 cb(t){return new Promise(e=>setTimeout(e,t))}a(cb,"sleep");var lb=3,ge=class extends Error{static{a(this,"DwsError")}exitCode;stderr;raw;authExpired;constructor(e,n){super(e),this.name="DwsError",this.exitCode=n?.exitCode??null,this.stderr=n?.stderr??"",this.raw=n?.raw??null,this.authExpired=n?.authExpired??!1}},ae=class{static{a(this,"DwsClient")}bin;timeoutMs;runner;failures=new xn(lb);constructor(e){this.bin=e.bin,this.timeoutMs=e.timeoutMs??3e4,this.runner=e.runner??K}async runJson(e,n){let r=db(e),o=n?.timeoutMs??this.timeoutMs,i=r.slice(0,3).join(" "),s=Date.now(),c=Su();if(c)return m.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 pb(p,o)}if(d.exitCode!==0)throw new ge(`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 ge("dws did not return valid JSON",{exitCode:d.exitCode,stderr:d.stderr,raw:d.stdout})}return ub(f,d.stderr),f},"attempt");try{let d=await tn(l,{shouldRetry:a(f=>!(f instanceof ge&&cr(`${f.message}
|
|
9
|
+
${f.stderr}`)),"shouldRetry"),onRetry:a((f,p)=>{let g={cmd:i,retry:p,error:xu(f)};p>=2?m.warn("dws","runJson transient failure, retrying",g):m.debug("dws","runJson transient failure, retrying",g)},"onRetry")}),{recovered:u}=this.failures.succeed(i);return u&&m.info("dws","runJson recovered after sustained failures",{cmd:i}),d}catch(d){let u=Date.now()-s,{consecutive:f,escalate:p}=this.failures.fail(i),g=fb(d),h={cmd:i,elapsed:u,consecutive:f,error:xu(g),stderr:g instanceof ge?g.stderr.slice(0,500):void 0};throw p?m.error("dws","runJson sustained failure \u2014 likely real misconfig, not a transient blip",h):g instanceof ge&&g.authExpired?m.warn("dws","runJson failed fast: dws auth expired (no retry)",h):m.warn("dws","runJson failed after retries",h),g}}};function le(t){return k(t)?"body"in t?t.body:"data"in t?t.data:"result"in t?t.result:k(t.response)?"body"in t.response?t.response.body:"data"in t.response?t.response.data:t.response:t:t}a(le,"dwsPayload");function ye(t){let e=le(t),n=Ru(e);if(n)return n;if(k(e))for(let r of Object.values(e)){let o=Ru(r);if(o)return o}return[]}a(ye,"findArrayPayload");function go(t){let e=le(t),n=Cu(e,["nextCursor","next_cursor","cursor"]);return n&&n.trim()!==""?n:null}a(go,"findCursor");function db(t){return t.includes("--format")||t.includes("-f")?t:[...t,"--format","json"]}a(db,"ensureJsonFormat");function ub(t,e){if(!k(t))return;let n=[t];for(let r of["body","data","result","response"]){let o=t[r];k(o)&&n.push(o)}for(let r of n){if(r.success===!1||String(r.success).toLowerCase()==="false")throw new ge("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 ge(o?`dws degraded: ${o}`:"dws response reported degraded",{stderr:e,raw:t})}}}a(ub,"assertDwsSuccess");function xu(t){return t instanceof Error?t.message:String(t)}a(xu,"errorMessage");function fb(t){if(!(t instanceof ge))return t;let e=`${t.message}
|
|
10
|
+
${t.stderr}`;if(!cr(e))return t;let n="dws \u767B\u5F55\u6001\u5DF2\u5931\u6548\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C `dws auth login` \u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5\uFF08\u660E\u7EC6\u89C1\u7EC8\u7AEF\u65E5\u5FD7\uFF09";return new ge(n,{exitCode:t.exitCode,stderr:t.stderr,raw:t.raw,authExpired:!0})}a(fb,"surfaceAuthFailure");function pb(t,e){if(t instanceof ge)return t;let n=t instanceof Error?t.message:String(t);return t instanceof Error&&t.name==="AbortError"?new ge(`dws timed out after ${e}ms: ${n}`):new ge(`dws runner failed: ${n}`)}a(pb,"wrapRunnerError");function Ru(t){if(Array.isArray(t))return t;if(!k(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(Ru,"findKnownArray");function Cu(t,e){if(!k(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(k(n)){let r=Cu(n,e);if(r)return r}return null}a(Cu,"findStringByKeys");var gb="alidocs.dingtalk.com",mb=/^v\d+[A-Za-z0-9]+_[A-Za-z0-9]+_[A-Za-z0-9]+$/;function hb(t){return mb.test(t)}a(hb,"isShareFormUuid");function yb(t){return`https://${gb}/notable/share/form/${t}`}a(yb,"buildFormShareUrl");var Iu=2,Tu=process.env.NODE_ENV==="test"?0:500;async function _u(t,e,n,r){for(let o=1;o<=Iu;o++){try{let i=await t.runJson(["aitable","form","share","get","--base-id",e,"--table-id",n,"--view-id",r]),s=le(i);if(k(s))return{enabled:s.enabled===!0,uuid:typeof s.shareFormUuid=="string"?s.shareFormUuid:""};m.warn("setup","form share get \u8FD4\u56DE\u4E0D\u53EF\u89E3\u6790",{viewId:r,attempt:o})}catch(i){m.warn("setup","form share get \u5931\u8D25",{viewId:r,attempt:o,error:String(i)})}o<Iu&&Tu>0&&await new Promise(i=>setTimeout(i,Tu))}}a(_u,"readShareState");function Au(t,e){if(hb(t))return yb(t);m.warn("setup","shareFormUuid \u5F62\u72B6\u4E0D\u5339\u914D\uFF0C\u4E0D\u62FC\u5206\u4EAB\u94FE\u63A5",{uuid:t,viewId:e})}a(Au,"shareUrlOf");async function mo(t,e,n,r,o){let i=await _u(t,e,n,r);if(i?.enabled&&i.uuid)return Au(i.uuid,r);if(!o.autoEnable)return;try{await t.runJson(["aitable","form","share","update","--base-id",e,"--table-id",n,"--view-id",r,"--enabled","true"])}catch(c){m.warn("setup","\u5F00\u542F\u8868\u5355\u5206\u4EAB\u5931\u8D25",{baseId:e,tableId:n,viewId:r,error:String(c)});return}let s=await _u(t,e,n,r);if(!s){m.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u8BFB\u4E0D\u5230\u5206\u4EAB\u914D\u7F6E",{viewId:r});return}if(!s.uuid){m.warn("setup","\u5F00\u542F\u5206\u4EAB\u540E\u4ECD\u65E0 shareFormUuid",{viewId:r,enabled:s.enabled});return}return Au(s.uuid,r)}a(mo,"ensureFormShare");var vb=300*1e3,Eu=80,ea=new Map;function Sb(t){let e=`${t.baseId}/${t.tableId}`;ea.delete(e)}a(Sb,"_clearFieldIdCacheFor");async function ho(t,e){let n=`${e.baseId}/${e.tableId}`,r=ea.get(n);if(r&&Date.now()-r.ts<vb)return r.map;let o=await t.runJson(["aitable","field","get","--base-id",e.baseId,"--table-id",e.tableId]),i=ye(o),s=new Map;for(let c of i){if(!k(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 ea.set(n,{map:s,ts:Date.now()}),m.debug("table","\u5B57\u6BB5\u6620\u5C04\u5DF2\u52A0\u8F7D",{target:e,count:s.size}),s}a(ho,"fetchFieldIdMap");function ta(t){return ye(t).map(n=>{let r=le(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(ta,"extractRecordIds");function yo(t){return ye(t).map(n=>{let r=le(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(yo,"extractRecords");function xb(t,e){let n=new Map([...e.entries()].map(([r,o])=>[o,r]));return Object.fromEntries(Object.entries(t).map(([r,o])=>[n.get(r)??r,o]))}a(xb,"normalizeRecordFields");async function Du(t,e,n,r){let o=[...new Map(r.map(l=>[String(l),l])).values()];if(o.length===0)return[];let i=await ho(t,e),s=i.get(n)??n,c=[];for(let l=0;l<o.length;l+=Eu){let d=o.slice(l,l+Eu),u=d.length===1?{operator:"and",operands:[{operator:"eq",operands:[s,d[0]]}]}:{operator:"or",operands:d.map(p=>({operator:"eq",operands:[s,p]}))},f=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(u),"--limit",String(Math.max(2,d.length))]);for(let p of yo(f)){let g=xb(p.fields,i);c.push({uniqueValue:g[n],recordId:p.recordId,fields:g})}}return c}a(Du,"queryRecordsByUniqueValues");function Rb(t,e,n,r){return{async readCurrentRow(){let[o]=await t.fetchItemsByIds([e.id]);return o?.fields??e.fields},async updateCurrentRow(o){await t.updateFields(e.id,o),Object.assign(e.fields,o)},async queryRows(o,i){let s=o&&Object.keys(o).length>0,c=s?await t.fetchItemsByFilter(o,i):await t.fetchAllItems();return(!s&&i!==void 0?c.slice(0,i):c).map(d=>d.fields)},async findRowIds(o,i){return!o||Object.keys(o).length===0?[]:(await t.fetchItemsByFilter(o,i)).map(c=>c.id).filter(c=>c.length>0)},async createRecordIn(o,i){rt(n);let s=await n.runJson(["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify([{cells:i}]),"--yes"]),c=ta(s);if(c.length===0)throw new Error(`createRecordIn: dws \u672A\u8FD4\u56DE recordId\uFF08target=${o.baseId}/${o.tableId}\uFF09`);return m.debug("table","createRecordIn \u6210\u529F",{target:o,recordId:c[0]}),{recordId:c[0]}},async createRecordsIn(o,i){if(rt(n),i.length===0)return{recordIds:[]};let s=await n.runJson(["aitable","record","create","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify(i.map(l=>({cells:l}))),"--yes"]),c=ta(s);return m.debug("table","createRecordsIn \u6210\u529F",{target:o,count:c.length}),{recordIds:c}},async findRecordsIn(o,i,s){return rt(n),Du(n,o,i,s)},async findRecordIn(o,i,s){rt(n);let c=(await Du(n,o,i,[s]))[0];return c?{recordId:c.recordId,fields:c.fields}:null},async upsertRecordIn(o,i,s){rt(n);let c=s[i];if(c===void 0)throw new Error(`upsertRecordIn: fields \u4E2D\u7F3A\u5C11\u552F\u4E00\u952E "${i}"`);return $u(n,o,i,c,s,0)},async findRecordIdIn(o,i,s){return rt(n),s==null||s===""?null:Cb(n,o,i,s)},async readRecordIn(o,i){if(rt(n),!i)throw new Error(`readRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);let s=await n.runJson(["aitable","record","query","--base-id",o.baseId,"--table-id",o.tableId,"--record-ids",i]),c=yo(s);if(c.length===0)return null;let l=await ho(n,o),d=new Map;for(let[f,p]of l.entries())d.set(p,f);let u={};for(let[f,p]of Object.entries(c[0].fields)){let g=d.get(f)??f;u[g]=p}return u},async updateRecordsIn(o,i){if(rt(n),i.length!==0){for(let s of i)if(!s.recordId)throw new Error(`updateRecordsIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await n.runJson(["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify(i.map(s=>({recordId:s.recordId,cells:s.fields}))),"--yes"]),m.debug("table","updateRecordsIn \u6210\u529F",{target:o,count:i.length})}},async updateRecordIn(o,i,s){if(rt(n),!i)throw new Error(`updateRecordIn: recordId \u4E3A\u7A7A\uFF08target=${o.baseId}/${o.tableId}\uFF09`);await n.runJson(["aitable","record","update","--base-id",o.baseId,"--table-id",o.tableId,"--records",JSON.stringify([{recordId:i,cells:s}]),"--yes"]),m.debug("table","updateRecordIn \u6210\u529F",{target:o,recordId:i})},async uploadAttachmentToCurrentTable(o,i){if(rt(n),!r)throw new Error("uploadAttachmentToCurrentTable: baseId \u672A\u6CE8\u5165\uFF08\u68C0\u67E5 settings.tracker.base_id\uFF09");let c=(await bb(o)).size;if(c>Pu)throw new Error(`\u6587\u4EF6\u8FC7\u5927\uFF08${c} bytes > ${Pu}\uFF09\uFF0C\u8DF3\u8FC7\u4E0A\u4F20`);let l=await n.runJson(["aitable","attachment","upload","--base-id",r,"--file-name",i,"--size",String(c)],{timeoutMs:3e4}),d=le(l),u=na(d,["uploadUrl","upload_url"]),f=na(d,["fileToken","file_token"]);if(!u||!f)throw new Error(`uploadAttachmentToCurrentTable: dws \u672A\u8FD4\u56DE uploadUrl/fileToken\uFF08response=${JSON.stringify(d)}\uFF09`);let p=await wb(o),g=kb.extname(i).toLowerCase(),h=Ib[g]??"application/octet-stream",y=await fetch(u,{method:"PUT",headers:{"Content-Type":h},body:p});if(!y.ok)throw new Error(`uploadAttachmentToCurrentTable: OSS PUT \u5931\u8D25\uFF08status=${y.status}\uFF09`);return m.debug("table","uploadAttachmentToCurrentTable \u6210\u529F",{fileName:i,fileToken:f,size:c}),{fileToken:f}},async formShareUrl(o,i){rt(n);let s=o.viewId;if(!s&&o.viewName)try{let l=await n.runJson(["aitable","view","get","--base-id",o.baseId,"--table-id",o.tableId]),u=ye(l).find(f=>k(f)?(typeof f.name=="string"?f.name:typeof f.viewName=="string"?f.viewName:"").trim()===o.viewName.trim():!1);u&&k(u)&&(s=typeof u.viewId=="string"?u.viewId:typeof u.id=="string"?u.id:void 0)}catch(l){return{url:"",reason:`\u83B7\u53D6\u89C6\u56FE\u5217\u8868\u5931\u8D25: ${String(l)}`}}if(!s)return{url:"",reason:`\u672A\u627E\u5230\u89C6\u56FE: ${o.viewName??"(\u672A\u6307\u5B9A)"}`};let c=await mo(n,o.baseId,o.tableId,s,{autoEnable:i?.autoEnable??!1});return c?{url:c}:{url:"",reason:"\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\u6216\u89E3\u6790\u5931\u8D25"}}}}a(Rb,"createTableToolkit");async function Cb(t,e,n,r){let s={operator:"and",operands:[{operator:"eq",operands:[(await ho(t,e)).get(n)??n,r]}]},c=await t.runJson(["aitable","record","query","--base-id",e.baseId,"--table-id",e.tableId,"--filters",JSON.stringify(s),"--limit","2"]),l=yo(c);return l.length>0?l[0].recordId:null}a(Cb,"doFindRecordIdIn");async function $u(t,e,n,r,o,i){let l={operator:"and",operands:[{operator:"eq",operands:[(await ho(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=yo(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"]),m.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=ta(f);if(p.length===0)throw new Error("upsertRecordIn: create \u540E dws \u672A\u8FD4\u56DE recordId");return m.debug("table","upsertRecordIn \u65B0\u5EFA",{target:e,recordId:p[0],uniqueBy:n}),{recordId:p[0]}}catch(f){if(i===0)return Sb(e),m.debug("table","upsertRecordIn create \u5931\u8D25\uFF0C\u6E05\u9664\u5B57\u6BB5\u7F13\u5B58\u540E\u91CD\u8BD5",{target:e,uniqueBy:n,error:String(f)}),$u(t,e,n,r,o,1);throw f}}a($u,"doUpsertRecordIn");var Pu=20*1024*1024,Ib={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml"};function na(t,e){if(!k(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=na(n,e);if(r)return r}return null}a(na,"findStringInPayload");function rt(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(rt,"ensureDws");function Tb(t){return new ae({bin:t.tracker.dws_bin})}a(Tb,"createDwsFromSettings");var Mu={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:P.object({}).strict(),build(t,e){let n=Tb(e.settings);return Rb(e.tracker,e.item,n,e.settings.tracker.base_id)},methods:[{name:"readCurrentRow",description:"\u8BFB\u53D6\u5F53\u524D\u884C\u6570\u636E",output:P.record(P.string(),P.unknown())},{name:"updateCurrentRow",description:"\u66F4\u65B0\u5F53\u524D\u884C\u5B57\u6BB5",params:P.object({fields:P.record(P.string(),P.unknown()).describe("\u8981\u5199\u5165\u7684\u5B57\u6BB5\u952E\u503C")})},{name:"queryRows",description:"\u67E5\u8BE2\u5176\u4ED6\u884C",params:P.object({filter:P.record(P.string(),P.unknown()).describe("\u67E5\u8BE2\u6761\u4EF6"),limit:P.number().optional().describe("\u8FD4\u56DE\u6761\u6570\u4E0A\u9650")}),output:P.array(P.record(P.string(),P.unknown()))},{name:"readRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6309 recordId \u8BFB\u53D6\u4E00\u884C\uFF08\u5B57\u6BB5\u540D\u4E3A\u952E\uFF09",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),recordId:P.string()}),output:P.record(P.string(),P.unknown()).nullable()},{name:"createRecordIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u521B\u5EFA\u4E00\u6761\u8BB0\u5F55",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),fields:P.record(P.string(),P.unknown())}),output:P.object({recordId:P.string()})},{name:"createRecordsIn",description:"\u5728\u6307\u5B9A\u8868\u4E2D\u6279\u91CF\u521B\u5EFA\u8BB0\u5F55",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),rows:P.array(P.record(P.string(),P.unknown()))}),output:P.object({recordIds:P.array(P.string())})},{name:"findRecordsIn",description:"\u6309\u552F\u4E00\u952E\u6279\u91CF\u67E5\u8BE2\u8BB0\u5F55",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),uniqueBy:P.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),uniqueValues:P.array(P.unknown()).describe("\u552F\u4E00\u952E\u5B57\u6BB5\u503C\u5217\u8868")}),output:P.array(P.object({uniqueValue:P.unknown(),recordId:P.string(),fields:P.record(P.string(),P.unknown())}))},{name:"upsertRecordIn",description:"\u6309\u552F\u4E00\u952E upsert\uFF08\u547D\u4E2D\u5219 update\uFF0C\u672A\u547D\u4E2D\u5219 create\uFF09",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),uniqueBy:P.string().describe("\u552F\u4E00\u952E\u5B57\u6BB5\u540D"),fields:P.record(P.string(),P.unknown())}),output:P.object({recordId:P.string()})},{name:"uploadAttachmentToCurrentTable",description:"\u4E0A\u4F20\u672C\u5730\u6587\u4EF6\u5230\u5F53\u524D\u8868\u6240\u5728 base \u7684\u9644\u4EF6\u5B58\u50A8\uFF0C\u8FD4\u56DE fileToken",params:P.object({filePath:P.string().describe("\u672C\u5730\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84"),fileName:P.string().describe("\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09")}),output:P.object({fileToken:P.string()})},{name:"formShareUrl",description:"\u53D6\u6307\u5B9A\u8868\u5355\u89C6\u56FE\u7684\u5206\u4EAB\u94FE\u63A5\uFF08\u6309 viewName \u6216 viewId \u89E3\u6790\uFF09",params:P.object({target:P.object({baseId:P.string(),tableId:P.string(),viewName:P.string().optional(),viewId:P.string().optional()}),options:P.object({autoEnable:P.boolean().optional()}).optional()}),output:P.object({url:P.string(),reason:P.string().optional()})},{name:"updateRecordsIn",description:"\u6309 recordId \u6279\u91CF\u66F4\u65B0\u5B57\u6BB5",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),rows:P.array(P.object({recordId:P.string(),fields:P.record(P.string(),P.unknown())}))})},{name:"updateRecordIn",description:"\u6309 recordId \u66F4\u65B0\u5B57\u6BB5",params:P.object({target:P.object({baseId:P.string(),tableId:P.string()}),recordId:P.string(),fields:P.record(P.string(),P.unknown())})}],permissions:[{method:"updateCurrentRow",description:"\u5199\u5165\u8868\u683C\u884C\u6570\u636E(\u9650\u5B9A\u53EF\u5199\u7684\u8868)",scopeSchema:P.array(P.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 pe}from"zod";import Ot from"path";import cn from"fs";import{readFile as ek}from"fs/promises";import la from"path";import{z as G}from"zod";var _b=/^(Error|ERROR|fatal|FATAL|crash|CRASH|panic|PANIC|exception|EXCEPTION)\b/;function ut(t){return _b.test(t)}a(ut,"isStderrError");function de(t){if(!(!t||typeof t!="object"||Array.isArray(t)))return t}a(de,"asRecord");function N(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim().length>0)return r}}a(N,"pickString");function nn(t,e=512){return t.length>e?`${t.slice(0,e)}...`:t}a(nn,"truncateText");var Ab=["content","text","message","delta","output"];function Eb(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(Eb,"mapStructuredType");function Db(t){let e=N(t,["type","event","kind","level"])??"text",n=Eb(e),r=N(t,["toolName","tool_name","tool","name"]),o=de(t.toolInput)??de(t.input);return{type:n,content:N(t,Ab),toolName:r,toolInput:typeof t.toolInput=="string"?t.toolInput:void 0,toolInputRaw:o,sessionId:N(t,["sessionId","session_id","conversationId","conversation_id"]),requestId:N(t,["requestId","request_id","id"]),done:!!t.done||n==="result"}}a(Db,"fromStructuredJson");function Pb(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(Pb,"fromTextLine");function rn(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:[Db(n)],structured:!0}}catch{}return{events:[Pb(e)],structured:!1}}a(rn,"parseAgentLine");function $b(t,e){let n=de(e);if(!n)return"";switch(t){case"Read":case"Edit":case"Write":{let o=N(n,["file_path","filePath","path"]);if(o)return o;break}case"Bash":{let o=N(n,["command","cmd"]);if(o)return o;break}case"Grep":case"Glob":{let o=N(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($b,"summarizeToolInput");function Mb(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=de(n);if(!r)continue;let o=N(r,["type"])??"";if(o==="text"){let i=N(r,["text"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=N(r,["thinking","text"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"){let i=N(r,["name"])??"unknown";e.push({type:"tool_use",requestId:N(r,["id"]),toolName:i,toolInput:$b(i,r.input),toolInputRaw:de(r.input)})}else if(o==="tool_result"){let i=N(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(Mb,"parseContentBlocks");function Ob(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=N(e,["type"])??"",r=N(e,["session_id","sessionId"]),o=a(i=>r?{...i,sessionId:r}:i,"addSession");if(n==="assistant"||n==="user"){let i=de(e.message);return i?Mb(i.content).map(o):[o({type:"text",content:""})]}if(n==="result"){let i=N(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=N(e,["error","message","content"])??"unknown error";return[o({type:"error",content:i,done:!0})]}return null}a(Ob,"parseClaudeLine");function ra(){return(t,e)=>{if(t==="stderr"){let o=e.trim();return o?ut(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=Ob(n);return r&&r.length>0?r:rn(n).events}}a(ra,"createClaudeParser");var Ou={id:"claudecode",name:"Claude Code",bin:"claude",versionArgs:["--version"],promptViaStdin:!1,buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n];if(o.includes("--output-format")||o.push("--output-format","stream-json"),o.includes("--verbose")||o.push("--verbose"),r.model&&!o.includes("--model")&&o.push("--model",r.model),r.permissionMode==="bypassPermissions"&&(o.includes("--dangerously-skip-permissions")||o.push("--dangerously-skip-permissions")),r.allowedTools&&r.allowedTools.length>0)for(let i of r.allowedTools)o.push("--allowedTools",i);return e&&o.push("--resume",e),o.push("-p",t),o},"buildArgs"),createParser:ra};function oa(t){return N(t,["text","content","message","summary"])??""}a(oa,"extractItemText");function on(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(on,"stringifyValue");function ia(t,e){let n=de(t.error);return N(t,["message","error","content"])??(n?N(n,["message","error","content"]):void 0)??on(t.error)??e}a(ia,"extractErrorText");function jb(t){return N(t,["command","query","input","arguments"])??on(t.arguments)??on(t.input)??on(t.changes)}a(jb,"extractToolInput");function Fb(t){let e=N(t,["aggregated_output","output","result","message","text","summary"])??on(t.output)??on(t.result)??on(t.changes);return e||(typeof t.exit_code=="number"?`exit_code=${t.exit_code}`:void 0)}a(Fb,"extractToolResult");function Nb(t,e){if(e!=="mcp_tool_call")return e||"codex_tool";let n=N(t,["server","server_name"]),r=N(t,["tool","tool_name","name"]);return[n,r].filter(Boolean).join(".")||e}a(Nb,"codexToolName");function Lb(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}let n=N(e,["type"])??"";if(n==="thread.started"){let r=N(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:ia(e,"Codex turn failed"),done:!0}];if(n==="item.started"||n==="item.updated"||n==="item.completed"){let r=de(e.item);if(!r)return[];let o=N(r,["type"])??"",i=N(r,["id","call_id"]),s=n==="item.completed";if(o==="agent_message"){if(!s)return[];let l=oa(r);return l?[{type:"result",content:l,requestId:i,done:!0}]:[]}if(o==="reasoning"){if(!s)return[];let l=oa(r);return l?[{type:"thinking",content:l,requestId:i}]:[]}if(o==="error")return[{type:"error",content:ia(r,"Codex item failed"),requestId:i,done:!0}];let c=Nb(r,o);return n==="item.started"?[{type:"tool_use",toolName:c,toolInput:jb(r),toolInputRaw:r,requestId:i}]:s?[{type:"tool_result",toolName:c,content:Fb(r),requestId:i}]:[]}if(n==="message.delta"){let r=de(e.delta)??de(e.content);if(!r)return[];let o=N(r,["text","content","value"]);return o?(N(r,["role"])??N(e,["role"]))==="system"?[]:[{type:"text",content:o}]:[]}if(n==="message.completed"){let r=de(e.message)??de(e.content);if(!r)return[];let o=Array.isArray(r.content)?r.content.map(i=>{let s=de(i);return s?oa(s):""}).filter(i=>i.length>0).join(`
|
|
11
|
+
`):N(r,["text","content"])??"";return o?[{type:"result",content:o,done:!0}]:[]}if(n==="tool_use"||n==="function_call"){let r=N(e,["name","tool","toolName"])??"unknown",o=N(e,["input","arguments"]);return[{type:"tool_use",toolName:r,toolInput:o,requestId:N(e,["id","call_id"])}]}return n==="tool_result"||n==="function_result"?[{type:"tool_result",content:N(e,["output","result","content"]),requestId:N(e,["tool_use_id","call_id","id"])}]:n==="error"?[{type:"error",content:ia(e,"unknown error"),done:!0}]:null}a(Lb,"parseCodexJsonLine");function Wb(){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)?[]:ut(o)?[{type:"error",content:o}]:[]:[]}let n=e.trim();if(!n)return[];let r=Lb(n);return r!==null?r:rn(n).events}}a(Wb,"createCodexParser");var ju={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:Wb};function Bb(t){if(typeof t!="string")return;let e=t.trim();if(!(!e.startsWith("{")||!e.endsWith("}")))try{return de(JSON.parse(e))}catch{return}}a(Bb,"parseRecordString");function wo(t){return de(t)??Bb(t)}a(wo,"parseToolInputRaw");function zb(t){return(t??"").replace(/[^a-z]/gi,"").toLowerCase()==="askuserquestion"}a(zb,"isAskUserQuestionTool");function Ub(t){let e=wo(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=de(o);if(!i)continue;let s=N(i,["header","title"]),c=N(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=de(u);return f?N(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 nn(r.join(" | "))}a(Ub,"summarizeAskUserQuestion");function Fu(t,e){if(zb(t)){let r=Ub(e);if(r)return r}if(typeof e=="string"&&e.trim().length>0)return nn(e);let n=wo(e);if(n)return nn(JSON.stringify(n))}a(Fu,"summarizeToolInput");function Vb(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let r=de(n);if(!r)continue;let o=N(r,["type"])??"";if(o==="text"){let i=N(r,["text","content"]);i&&e.push({type:"text",content:i})}else if(o==="thinking"){let i=N(r,["thinking","text","content"]);i&&e.push({type:"thinking",content:i})}else if(o==="tool_use"||o==="tool_call"){let i=N(r,["name","toolName","tool_name","tool"])??"unknown",s=r.input??r.toolInput??r.arguments;e.push({type:"tool_use",requestId:N(r,["id","requestId","request_id"]),toolName:i,toolInput:Fu(i,s),toolInputRaw:wo(s)})}else if(o==="tool_result"||o==="tool_output"){let i=typeof r.content=="string"?r.content:N(r,["output","result"]),s=!!r.is_error;e.push({type:s?"error":"tool_result",requestId:N(r,["tool_use_id","id","requestId","request_id"]),content:i})}}return e}a(Vb,"parseQoderContentBlocks");function Kb(t,e){if(!t.startsWith("{")||!t.endsWith("}"))return null;let n;try{n=JSON.parse(t)}catch{return null}let r=N(n,["messageId","message_id","id"]);if(r&&e.has(r))return[];r&&e.add(r);let o=N(n,["type","event"])??"",i=N(n,["sessionId","session_id"]),s=a(c=>i?{...c,sessionId:i}:c,"addSession");if(o==="system")return[];if(o==="text"){let c=N(n,["content","text","message","delta"]);return c?[s({type:"text",content:c})]:[]}if(o==="assistant"||o==="message"){let c=de(n.message),l=Vb(c?.content??n.content);if(l.length>0)return l.map(s);let d=N(n,["content","text","message","delta"])??(c?N(c,["content","text","message","delta"]):void 0);return d?[s({type:"text",content:d})]:[]}if(o==="thinking"||o==="thought"||o==="reasoning"){let c=N(n,["content","text","thinking"]);return c?[s({type:"thinking",content:c})]:[]}if(o==="tool_use"||o==="tool_call"){let c=N(n,["toolName","tool_name","name","tool"])??"unknown",l=n.toolInput??n.input??n.arguments;return[s({type:"tool_use",toolName:c,toolInput:Fu(c,l),toolInputRaw:wo(l),requestId:N(n,["requestId","request_id","id"])})]}if(o==="tool_result"||o==="tool_output"){let c=N(n,["content","output","result"]);return[s({type:"tool_result",content:c,requestId:N(n,["requestId","request_id","tool_use_id"])})]}if(o==="result"||o==="final"||o==="done"){let c=N(n,["content","result","text"])??"";return[s({type:"result",content:c,done:!0})]}if(o==="error"){let c=N(n,["content","error","message"])??"unknown error";return[s({type:"error",content:c,done:!0})]}return null}a(Kb,"parseQoderJsonLine");function qb(){let t=new Set,e=!1;return(n,r)=>{if(n==="stderr"){let s=r.trim();return s?ut(s)?[{type:"error",content:s}]:[]:[]}let o=r.trim();if(!o)return[];let i=Kb(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(qb,"createQoderParser");var Nu={id:"qoder",name:"Qoder",bin:"qodercli",fallbackBins:["qoder"],versionArgs:["--version"],promptViaStdin:!1,stripHostEnv:["QODER_AGENT_SDK_ENTRYPOINT","QODER_CONFIG_DIR"],buildArgs:a((t,{sessionId:e,baseArgs:n,options:r})=>{let o=[...n],i=a((...s)=>o.some(c=>s.includes(c)),"hasFlag");return i("--output-format","-o")||o.push("--output-format","stream-json"),i("--print","-p")||o.push("--print"),r.model&&!i("--model","-m")&&o.push("--model",r.model),r.permissionMode==="bypassPermissions"&&!i("--permission-mode","--dangerously-skip-permissions")&&o.push("--permission-mode","bypass_permissions"),e&&!i("--session-id")&&o.push("--session-id",e),o.push("--",t),o},"buildArgs"),createParser:qb};var Lu={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:ra};function Pt(){return(t,e)=>{let n=e.trim();return n?t==="stderr"?ut(n)?[{type:"error",content:n}]:[]:rn(n).events:[]}}a(Pt,"createGenericParser");var Wu={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:Pt};var Bu={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:Pt};var zu={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:Pt};var Uu={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:Pt};import{existsSync as Gb}from"fs";import{homedir as Hb}from"os";import Jb from"path";var sa=".qwenworkcn",aa="mcp-adaptor.config";function Vu(t=Hb()){return Jb.join(t,sa,aa)}a(Vu,"getQwenworkMcpConfigPath");var Ku=String.raw`#!/usr/bin/env node
|
|
12
12
|
import fs from 'node:fs';
|
|
13
13
|
import os from 'node:os';
|
|
14
14
|
import path from 'node:path';
|
|
15
15
|
|
|
16
|
-
const CONFIG_DIRNAME = '${
|
|
17
|
-
const CONFIG_FILENAME = '${
|
|
16
|
+
const CONFIG_DIRNAME = '${sa}';
|
|
17
|
+
const CONFIG_FILENAME = '${aa}';
|
|
18
18
|
const CONFIG_PATH = path.join(os.homedir(), CONFIG_DIRNAME, CONFIG_FILENAME);
|
|
19
19
|
const TERMINAL_STATES = new Set(['completed', 'failed', 'cancelled', 'interrupted']);
|
|
20
20
|
|
|
@@ -241,48 +241,48 @@ run(parseArgs(process.argv.slice(1))).catch((error) => {
|
|
|
241
241
|
process.stderr.write('错误:' + (error.message || error) + '\n');
|
|
242
242
|
process.exit(1);
|
|
243
243
|
});
|
|
244
|
-
`;function
|
|
245
|
-
`)[0]}),r=!0;break}}if(!r){let o=e.detect?.();o&&t.push({id:e.id,cmd:o.cmd,version:o.version})}}return t}a(
|
|
246
|
-
${JSON.stringify(o.error.issues,null,2)}`);return o.data}a(
|
|
247
|
-
`),o.type==="result"&&(r.value=!0),o.type==="error"&&(this.sawError=!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();try{
|
|
248
|
-
`),l.stdin.end();let d={value:""},u={value:!1},f={stdout:!1,stderr:!1},p={value:""},g={value:""},h=a((b,v)=>{f[b]||(f[b]=!0,this.emitLifecycle({phase:b==="stdout"?"first_stdout":"first_stderr",elapsedMs:Date.now()-i,pid:l.pid}));let R=v.toString("utf8"),C=
|
|
249
|
-
`:"")+b.content)}),c.on("lifecycle",b=>{e?.onLifecycle?.(b)});let f=e?.timeoutMs===void 0?6e5:e.timeoutMs,p=f==null?void 0:new Promise((b,v)=>{setTimeout(()=>{c.close().catch(()=>{}),v(new Error(`coding agent \u6267\u884C\u8D85\u65F6 (${f}ms)`))},f).unref?.()}),g=e?.signal,h,y=new Promise((b,v)=>{if(!g)return;let R=a(()=>{c.close().catch(()=>{}),v(new Error("coding agent \u5DF2\u88AB\u4E2D\u6B62 (abort)"))},"fail");if(g.aborted){R();return}h=R,g.addEventListener("abort",R,{once:!0})});try{let b=[c.send(t),y];p&&b.push(p),await Promise.race(b)}finally{g&&h&&g.removeEventListener("abort",h),await c.close().catch(()=>{}),await s.stop().catch(()=>{})}return{response:(u.length>=d.length?u:d).trim(),events:l,sessionId:c.currentSessionId()}}a(
|
|
244
|
+
`;function Zb(){return Gb(Vu())}a(Zb,"hasDesktopMcpConfig");function Yb(){return(t,e)=>{let n=e.trim();return n?t==="stderr"?ut(n)||n.startsWith("\u9519\u8BEF\uFF1A")?[{type:"error",content:n,done:!0}]:[]:[{type:"text",content:n}]:[]}}a(Yb,"createQwenworkParser");var qu={id:"qwenwork",name:"\u5343\u95EE\u529E\u516C",bin:"qwenwork",versionArgs:["--version"],promptViaStdin:!0,resolveCommand:a(()=>({cmd:process.execPath,argsPrefix:["--input-type=module","--eval",Ku]}),"resolveCommand"),detect:a(()=>Zb()?{cmd:"qwenwork",version:"\u5343\u95EE\u529E\u516C\u5185\u7F6E\u65E0\u5934\u5BA2\u6237\u7AEF"}:void 0,"detect"),buildArgs:a((t,{baseArgs:e,options:n})=>{let r=[...e];if(r.includes("run")||r.push("run"),n.workDir&&!r.includes("--dir")&&r.push("--dir",n.workDir),n.addDirs)for(let o of n.addDirs)r.push("--dir",o);return r},"buildArgs"),createParser:Yb};var lr=[Ou,ju,Nu,Lu,Wu,Bu,zu,Uu,qu],Hu=new Map(lr.map(t=>[t.id,t])),bo=lr.map(t=>t.id);function Qb(t){return Hu.get(t)}a(Qb,"getAgentDef");function ca(t){let e=Hu.get(t);if(!e)throw new Error(`\u4E0D\u652F\u6301\u7684 Agent \u7C7B\u578B: ${t}\uFF08\u5DF2\u767B\u8BB0: ${bo.join(", ")}\uFF09`);return e}a(ca,"requireAgentDef");function ko(){let t=[];for(let e of lr){let n=[e.bin,...e.fallbackBins??[]],r=!1;for(let o of n){let i=Xt(o,e.versionArgs,{timeoutMs:5e3,stripEnv:e.stripHostEnv});if(i.ok){let s=i.stdout.trim();t.push({id:e.id,cmd:o,version:s.split(`
|
|
245
|
+
`)[0]}),r=!0;break}}if(!r){let o=e.detect?.();o&&t.push({id:e.id,cmd:o.cmd,version:o.version})}}return t}a(ko,"detectInstalledCodingAgents");function Xb(){let t=ko(),e=new Map(t.map(n=>[n.id,n]));return lr.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(Xb,"listCodingAgents");var $t="bypassPermissions",Ju="gpt-5.5",Gu="full-auto",Zu="high",vo=G.object({enabled:G.boolean().default(!1),cmd:G.string().min(1).optional(),args:G.array(G.string()).default([]),workDir:G.string().min(1).optional(),model:G.string().optional(),env:G.record(G.string(),G.string()).default({})}),tk=vo.extend({permissionMode:G.enum([$t]).optional(),allowedTools:G.array(G.string()).optional()}),nk=vo.extend({model:G.string().min(1).default(Ju),permissionMode:G.enum([$t]).default($t),mode:G.enum(["suggest","full-auto","yolo"]).default(Gu),reasoningEffort:G.enum(["low","medium","high","xhigh"]).default(Zu),search:G.boolean().default(!1),addDirs:G.array(G.string()).optional(),ignoreUserConfig:G.boolean().default(!1)}),rk=vo.extend({permissionMode:G.enum([$t]).default($t)}),ok=vo.extend({permissionMode:G.enum([$t]).optional(),allowedTools:G.array(G.string()).optional(),mode:G.enum(["suggest","full-auto","yolo"]).optional(),reasoningEffort:G.enum(["low","medium","high","xhigh"]).optional(),reasoning:G.string().optional(),search:G.boolean().optional(),addDirs:G.array(G.string()).optional(),ignoreUserConfig:G.boolean().optional()}).passthrough(),da={enabled:!0,args:[],env:{}},ua={enabled:!1,args:[],env:{},model:Ju,permissionMode:$t,mode:Gu,reasoningEffort:Zu,search:!1,ignoreUserConfig:!1},fa={enabled:!1,args:[],env:{},permissionMode:$t},Yu=G.object({version:G.number().int().positive().default(1),agents:G.object({claudecode:tk.default(da),codex:nk.default(ua),qoder:rk.default(fa)}).catchall(ok).default({claudecode:da,codex:ua,qoder:fa})}),ik={version:1,agents:{claudecode:da,codex:ua,qoder:fa}},Qu="coding-agents.config.json";function ft(t){return la.join(t,Qu)}a(ft,"workspaceAgentConfigPath");async function pa(t){let e=t?la.resolve(t):la.resolve(process.cwd(),Qu),n;try{n=await ek(e,"utf8")}catch{return ik}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=Yu.safeParse(r);if(!o.success)throw new Error(`coding-agents \u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25:
|
|
246
|
+
${JSON.stringify(o.error.issues,null,2)}`);return o.data}a(pa,"loadAgentConfig");function ga(t,e){return t.agents[e]??{enabled:!1,args:[],env:{}}}a(ga,"getAgentConfig");function dr(){return ko().map(({id:t,cmd:e,version:n})=>({type:t,cmd:e,version:n}))}a(dr,"detectInstalledAgents");import{EventEmitter as sk}from"events";import ak from"fs";function ck(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(ck,"extractLines");function Xu(t){let e=t.value.trim();return t.value="",e.length>0?[e]:[]}a(Xu,"flushLines");var ur=class extends sk{static{a(this,"BaseCliSession")}currentId;child;alive=!0;sending=!1;interrupted=!1;sawError=!1;stderrTail=[];constructor(e){super(),this.currentId=typeof e=="string"?e.trim():""}currentSessionId(){return this.currentId}isAlive(){return this.alive}pushStderrTail(e){let n=e.trim();n&&(this.stderrTail.push(nn(n,200)),this.stderrTail.length>6&&this.stderrTail.shift())}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}
|
|
247
|
+
`),o.type==="result"&&(r.value=!0),o.type==="error"&&(this.sawError=!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();try{ak.mkdirSync(o,{recursive:!0})}catch(b){throw new Error(`Agent \u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728\u4E14\u65E0\u6CD5\u521B\u5EFA: ${o}\uFF08${b instanceof Error?b.message:String(b)}\uFF09`)}let i=Date.now();this.sawError=!1,this.stderrTail=[];let s={...r.env??{},PWD:o},c=co({command:r.cmd,args:r.args,cwd:o,env:s,stripEnv:r.stripEnv,stdio:["pipe","pipe","pipe"]}),l=c.child;if(!l.stdin||!l.stdout||!l.stderr)throw await c.terminateTree({gracePeriodMs:0}),new Error(`\u65E0\u6CD5\u4E3A ${r.cmd} \u5EFA\u7ACB stdio pipe`);this.child=c,this.emitLifecycle({phase:"process_spawned",elapsedMs:0,pid:l.pid,cmd:r.cmd,cwd:o}),r.stdinPrompt&&l.stdin.write(`${e}
|
|
248
|
+
`),l.stdin.end();let d={value:""},u={value:!1},f={stdout:!1,stderr:!1},p={value:""},g={value:""},h=a((b,v)=>{f[b]||(f[b]=!0,this.emitLifecycle({phase:b==="stdout"?"first_stdout":"first_stderr",elapsedMs:Date.now()-i,pid:l.pid}));let R=v.toString("utf8"),C=ck(b==="stdout"?p:g,R);if(b==="stderr")for(let _ of C)this.pushStderrTail(_);for(let _ of C){let A=this.parseOutputLine(b,_);this.emitEvents(A,d,u)}},"onChunk");l.stdout.on("data",b=>h("stdout",b)),l.stderr.on("data",b=>h("stderr",b));let{exitCode:y}=await c.wait(),w=y??0;for(let b of Xu(p)){let v=this.parseOutputLine("stdout",b);this.emitEvents(v,d,u)}for(let b of Xu(g)){this.pushStderrTail(b);let v=this.parseOutputLine("stderr",b);this.emitEvents(v,d,u)}if(!u.value&&d.value.trim().length>0&&this.emitEvents([{type:"result",content:d.value.trim(),done:!0}],d,u),this.emitLifecycle({phase:"process_closed",elapsedMs:Date.now()-i,pid:l.pid,exitCode:w}),!this.interrupted&&(w===0&&!this.sawError&&!u.value&&d.value.trim().length===0&&this.stderrTail.length>0&&this.emit("event",{type:"error",content:`\u8FDB\u7A0B\u9000\u51FA\u7801 0 \u4F46\u672A\u4EA7\u751F\u4EFB\u4F55\u6709\u6548\u8F93\u51FA\uFF0Cstderr \u5C3E\u90E8\uFF1A${this.stderrTail.join(" | ")}`,done:!0}),w!==0)){let b=d.value.trim()||`process exited with code ${w}`;this.sawError||this.emit("event",{type:"error",content:b,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.interrupted=!0,await this.child.terminateTree()),this.child=void 0,this.emit("close")}};var ma=class extends ur{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?void 0:this.def.resolveCommand?.(this.options),o=this.options.cmd??r?.cmd??this.def.bin,i=[...r?.argsPrefix??[],...this.options.args??[]],s=this.def.buildArgs(e,{sessionId:n,baseArgs:i,options:this.options});return{cmd:o,args:s,stdinPrompt:this.def.promptViaStdin,cwd:this.options.workDir,env:{...this.options.env??{}},stripEnv:this.def.stripHostEnv}}parseOutputLine(e,n){return this.parser(e,n)}};function ef(t,e){return{name:t.id,async startSession(n){return new ma(t,e,n)},async stop(){}}}a(ef,"createDefAdapter");function ha(t,e){let n=ca(t);return ef(n,e)}a(ha,"createCodingAgent");async function pt(t,e){let n=bu();return n?n.run(t,e):So(t,e)}a(pt,"runCodingAgent");async function So(t,e){let n=await pa(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/qwenwork \u7B49\uFF09\uFF1Bllm_only \u65E0\u53EF\u7528 coding agent\u3002");let i={...ga(n,r),...e?.workDir?{workDir:e.workDir}:{},...e?.model?{model:e.model}:{},...e?.adapterOptions??{}},s=ha(r,i),c=await s.startSession(e?.sessionId),l=[],d="",u="";c.on("event",b=>{l.push(b),e?.onEvent?.(b),b.type==="result"&&b.content?u=b.content:b.type==="text"&&b.content&&(d+=(d?`
|
|
249
|
+
`:"")+b.content)}),c.on("lifecycle",b=>{e?.onLifecycle?.(b)});let f=e?.timeoutMs===void 0?6e5:e.timeoutMs,p=f==null?void 0:new Promise((b,v)=>{setTimeout(()=>{c.close().catch(()=>{}),v(new Error(`coding agent \u6267\u884C\u8D85\u65F6 (${f}ms)`))},f).unref?.()}),g=e?.signal,h,y=new Promise((b,v)=>{if(!g)return;let R=a(()=>{c.close().catch(()=>{}),v(new Error("coding agent \u5DF2\u88AB\u4E2D\u6B62 (abort)"))},"fail");if(g.aborted){R();return}h=R,g.addEventListener("abort",R,{once:!0})});try{let b=[c.send(t),y];p&&b.push(p),await Promise.race(b)}finally{g&&h&&g.removeEventListener("abort",h),await c.close().catch(()=>{}),await s.stop().catch(()=>{})}return{response:(u.length>=d.length?u:d).trim(),events:l,sessionId:c.currentSessionId()}}a(So,"runCodingAgentViaSpawn");function fr(t){return t.replace(/\s+/g," ").trim().slice(0,300)}a(fr,"brief");function xo(t){if(/ENOENT|command not found|no such file or directory/i.test(t))return"transport";if(/需要授权|未授权|无权限|unauthorized|authentication_error|permission_error|invalid[_ ]api[_ ]key|\b40[13]\b/i.test(t))return"auth";if(/限流|请求过于频繁|rate[_ ]?limit|too many requests|overloaded_error|\b429\b/i.test(t))return"rate_limit";if(/exited with code|non-zero exit|killed by signal/i.test(t))return"process";if(/\b(4\d{2}|5\d{2})\b|invalid_request_error|api[_ ]error/i.test(t))return"api_error"}a(xo,"classifyText");function tf(t){if(!t.startsWith("{")||!t.endsWith("}"))return null;let e;try{e=JSON.parse(t)}catch{return null}if(!e||typeof e!="object")return null;let n=e,r=n.error;if(!r||typeof r!="object"||n.type!==void 0&&n.type!=="error")return null;let o=r;return{...typeof o.type=="string"?{type:o.type}:{},...typeof o.message=="string"?{message:o.message}:{}}}a(tf,"parseErrorEnvelope");function ya(t,e=[]){let n=e.find(s=>s.type==="error");if(n){let s=n.content??"";return{kind:xo(s)??"process",message:fr(s)||"agent \u62A5\u544A error \u4E8B\u4EF6"}}let r=t.trim();if(!r)return null;let o=/^api error:\s*(\d{3})?/i.exec(r);if(o){let s=tf(r.slice(o[0].length).trim()),c=[s?.type,s?.message].filter(Boolean).join(" ");return{kind:xo(c)??xo(r)??"api_error",message:fr(r)}}let i=tf(r);if(i){let s=[i.type,i.message].filter(Boolean).join(" ");return{kind:xo(s)??"api_error",message:fr(r)}}return/^spawn\b.*\bENOENT\b/i.test(r)||/^.{0,40}command not found/i.test(r)?{kind:"transport",message:fr(r)}:/^process exited with code\s+-?\d+/i.test(r)?{kind:"process",message:fr(r)}:null}a(ya,"detectAgentFailure");var Ro={claude:"claudecode",qoder:"qoder",codex:"codex",codebuddy:"codebuddy",opencode:"opencode",qwen:"qwen",deepseek:"deepseek",trae:"trae",qwenwork:"qwenwork"},lk=Object.fromEntries(Object.entries(Ro).map(([t,e])=>[e,t]));function sn(t){return Ro[t]}a(sn,"engineToAgent");function nf(t){return lk[t]}a(nf,"agentToEngine");function pr(t){let e=[];t.roleContext&&e.push(dk(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(`
|
|
250
250
|
|
|
251
251
|
---
|
|
252
252
|
|
|
253
|
-
`),kbActive:r,...r?{kbRootDir:t.kbRootDir??n.rootDir}:{}}}a(
|
|
254
|
-
`)}a(
|
|
253
|
+
`),kbActive:r,...r?{kbRootDir:t.kbRootDir??n.rootDir}:{}}}a(pr,"buildInjectedContext");function dk(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(`
|
|
254
|
+
`)}a(dk,"renderRoleContext");import{access as pk}from"fs/promises";import Rn from"path";function rf(t){return t.trim().replace(/^\.\//,"").replace(/[\\/]+/g,"__").replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"kb"}a(rf,"slug");function Mt(t,e){return Rn.resolve(t,e)}a(Mt,"sourceDir");function wa(t,e){return Rn.join(Mt(t,e),".kb")}a(wa,"collectionDir");function an(t,e){return Rn.join(wa(t,e),"wiki")}a(an,"wikiDir");function ba(t,e){return Rn.join(an(t,e),"_index.md")}a(ba,"indexPath");function ka(t,e){return Rn.join(wa(t,e),"state.json")}a(ka,"statePath");function Cn(t,e){return Rn.join(an(t,e),"_compile-report.json")}a(Cn,"reportPath");import Io from"fs";import Co from"path";import{createHash as af}from"crypto";import cf from"yaml";var uk=["faq","methodology","simple"];function lf(t){return typeof t=="string"&&uk.includes(t)}a(lf,"isDistillPreset");var Ye="tags",me=class extends Error{constructor(n,r){super(`taxonomy \u914D\u7F6E\u65E0\u6548 (${r}): ${n}`);this.filePath=r;this.name="TaxonomyError"}filePath;static{a(this,"TaxonomyError")}},To=Object.freeze({categories:[{id:"concepts",name:"\u6982\u5FF5",criteria:"\u5177\u4F53\u6709\u754C\u6982\u5FF5"},{id:"topics",name:"\u4E3B\u9898",criteria:"\u5BBD\u6CDB\u4E3B\u9898"},{id:"references",name:"\u53C2\u8003\u8D44\u6E90",criteria:"\u8D44\u6E90\u5217\u8868/\u67E5\u8868\u578B\u77E5\u8BC6"}],routeHints:[],boundary:{include:[],exclude:[]},distillPreset:"faq",tagsIndex:!1,fallbackCategoryId:"references",isDefault:!0});function Qe(t){return t.categories.map(e=>e.id)}a(Qe,"taxonomyCategoryIds");function gr(t){let e=JSON.stringify({categories:t.categories.map(n=>[n.id,n.criteria??""]),distillPreset:t.distillPreset,fallback:t.fallbackCategoryId,boundary:t.boundary});return`sha256:${af("sha256").update(e).digest("hex").slice(0,16)}`}a(gr,"taxonomyFingerprint");function _o(t){let e=JSON.stringify({names:t.categories.map(n=>[n.id,n.name??""]),routeHints:t.routeHints,tagsIndex:t.tagsIndex});return`sha256:${af("sha256").update(e).digest("hex").slice(0,16)}`}a(_o,"taxonomyIndexFingerprint");function In(t,e){let n=e.trim().toLowerCase();for(let r of t.categories)if(r.id.toLowerCase()===n)return r.id;for(let r of t.categories)if(r.id.toLowerCase()===`${n}s`)return r.id;for(let r of t.categories)if(r.name===e.trim())return r.id;return null}a(In,"matchCategory");function va(t,e){return In(t,e)??t.fallbackCategoryId}a(va,"normalizeCategory");function of(t,e,n){if(t==null)return[];if(!Array.isArray(t)||t.some(r=>typeof r!="string"||r.trim()===""))throw new me(`${e} \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32\u6570\u7EC4`,n);return t.map(r=>r.trim())}a(of,"asStringArray");function sf(t){let e;try{e=cf.parse(Io.readFileSync(t,"utf8"))}catch(f){throw new me(`YAML \u89E3\u6790\u5931\u8D25: ${f instanceof Error?f.message:String(f)}`,t)}if(e==null||typeof e!="object")throw new me("\u6839\u8282\u70B9\u5FC5\u987B\u662F\u5BF9\u8C61",t);let n=e,r=n.distill_preset,o=r==null?"faq":lf(r)?r:(()=>{throw new me("distill_preset \u4EC5\u652F\u6301 faq\u3001methodology \u6216 simple",t)})(),i=n.categories;if(!Array.isArray(i)||i.length===0)throw new me("categories \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4",t);let s=i.map((f,p)=>{if(f==null||typeof f!="object")throw new me(`categories[${p}] \u5FC5\u987B\u662F\u5BF9\u8C61`,t);let g=f,h=typeof g.id=="string"?g.id.trim():"";if(!h)throw new me(`categories[${p}].id \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`,t);if(/[\\/]|\.\./.test(h))throw new me(`categories[${p}].id \u4E0D\u80FD\u5305\u542B\u8DEF\u5F84\u5206\u9694\u7B26: ${h}`,t);return{id:h,name:typeof g.name=="string"&&g.name.trim()?g.name.trim():h,...typeof g.criteria=="string"&&g.criteria.trim()?{criteria:g.criteria.trim()}:{}}}),c=new Set;for(let f of s){if(c.has(f.id))throw new me(`\u5206\u7C7B id \u91CD\u590D: ${f.id}`,t);c.add(f.id)}if(c.has(Ye))throw new me(`\u5206\u7C7B id \u4E0D\u5F97\u4F7F\u7528\u4FDD\u7559\u76EE\u5F55\u540D "${Ye}"\uFF08tags \u7D22\u5F15\u4FDD\u7559\uFF09`,t);let l=[];if(n.route_hints!=null){if(!Array.isArray(n.route_hints))throw new me("route_hints \u5FC5\u987B\u662F\u6570\u7EC4",t);n.route_hints.forEach((f,p)=>{if(f==null||typeof f!="object")throw new me(`route_hints[${p}] \u5FC5\u987B\u662F\u5BF9\u8C61`,t);let g=f,h=typeof g.pattern=="string"?g.pattern.trim():"",y=typeof g.category=="string"?g.category.trim():"";if(!h||!y)throw new me(`route_hints[${p}] \u9700\u8981 pattern \u4E0E category`,t);if(!c.has(y))throw new me(`route_hints[${p}].category \u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u5206\u7C7B: ${y}`,t);l.push({pattern:h,category:y})})}let d={include:[],exclude:[]},u=!1;if(n.compile!=null){if(typeof n.compile!="object")throw new me("compile \u5FC5\u987B\u662F\u5BF9\u8C61",t);let f=n.compile;if(d={include:of(f.include,"compile.include",t),exclude:of(f.exclude,"compile.exclude",t)},f.tags_index!=null){if(typeof f.tags_index!="boolean")throw new me("compile.tags_index \u5FC5\u987B\u662F\u5E03\u5C14\u503C",t);u=f.tags_index}}return{categories:s,routeHints:l,boundary:d,distillPreset:o,tagsIndex:u,fallbackCategoryId:s[s.length-1].id,isDefault:!1}}a(sf,"parseTaxonomyFile");function fk(t,e){try{let r=cf.parse(Io.readFileSync(t,"utf8"))?.collections;if(!Array.isArray(r))return!1;let o=e.trim().replace(/^\.\//,"");return r.some(i=>typeof i=="string"&&i.trim().replace(/^\.\//,"")===o)}catch{return!1}}a(fk,"instanceFileAppliesTo");function bt(t){let{configDir:e,entry:n}=t,r=Co.join(Co.resolve(e,n),"taxonomy.yml");if(Io.existsSync(r))return sf(r);let o=Co.join(e,"knowledge","taxonomy.yml");return Io.existsSync(o)&&fk(o,n)?sf(o):To}a(bt,"loadTaxonomy");function df(t,e){if(Co.basename(e)==="taxonomy.yml")return!1;let{include:n,exclude:r}=t.boundary,o=e.split(/[\\/]/,1)[0]??"",i=e.includes("/")||e.includes("\\");return n.length>0?i&&n.includes(o):!(r.length>0&&i&&r.includes(o))}a(df,"isCompilableSource");function Ao(t,e){let n=e?.wikiRootOf??(o=>o.dir);return t.map(o=>{let i=n(o),s=o.categories&&o.categories.length>0?[`\u9700\u4FEF\u77B0\u5206\u7C7B\u65F6\u8BFB _index.md(\u6309 ${o.categories.join("/")} \u7EC4\u7EC7,\u53EF\u80FD\u8F83\u5927,\u52FF\u6574\u7BC7\u901A\u8BFB)\u3002`]:["\u9700\u4FEF\u77B0\u5168\u5C40\u65F6\u8BFB\u6839\u76EE\u5F55\u7684 _index.md(\u5B83\u81EA\u8FF0\u5206\u7C7B\u4E0E\u76EE\u5F55\u7ED3\u6784,\u53EF\u80FD\u8F83\u5927,\u52FF\u6574\u7BC7\u901A\u8BFB)\u3002"];return["# \u77E5\u8BC6\u5E93(\u5DF2\u79BB\u7EBF\u7F16\u8BD1\u4E3A wiki)",`wiki \u6839\u76EE\u5F55:${i}`,"\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;",...i.endsWith("/")?["\u6CE8\u610F:\u4E0A\u9762\u7684\u6839\u76EE\u5F55\u672B\u5C3E\u5E26 `/`,\u5B83\u662F\u8F6F\u94FE\u76EE\u5F55,Grep/Read/find \u65F6\u5FC5\u987B\u4FDD\u7559\u8FD9\u4E2A\u659C\u6760(\u53BB\u6389\u540E\u90E8\u5206\u5DE5\u5177\u4E0D\u4F1A\u9012\u5F52\u8FDB\u53BB,\u4F1A\u5F97\u5230\u7A7A\u7ED3\u679C\u4E14\u4E0D\u62A5\u9519)\u3002"]:[],...s].join(`
|
|
255
255
|
`)}).join(`
|
|
256
256
|
|
|
257
|
-
`)}a(
|
|
257
|
+
`)}a(Ao,"renderKbPromptBlock");async function Sa(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 pk(ba(e,s));let c;try{c=Qe(bt({configDir:e,entry:s}))}catch{c=Qe(To)}o.push({name:s,slug:rf(s),dir:an(e,s),categories:c})}catch{m.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:Ao(o),rootDir:r,collections:o.map(s=>s.name),wikis:o}}a(Sa,"resolveKbContext");function gk(t){let e=sn(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}
|
|
258
258
|
|
|
259
259
|
---
|
|
260
260
|
|
|
261
|
-
${r}`:r,c=o?.workDir??(n?.kbActive?n.kbRootDir:t.workDir);m.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 pt(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"]}:{},...o?.adapterOptions??{}},onEvent:o?.onEvent?y=>o.onEvent({type:y.type,content:y.content}):void 0}),u=d.events.some(y=>y.type==="error"),p=pa(d.response,d.events)??(d.response.trim()?null:{kind:"empty_response",message:"agent \u672A\u8FD4\u56DE\u4EFB\u4F55\u54CD\u5E94"}),g=!u&&!p,h={agent:i,workDir:c,sessionId:d.sessionId,success:g,durationMs:Date.now()-l,...p?{failureKind:p.kind,failureMessage:p.message}:{}};return g?m.info("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210",h):m.warn("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210(\u6709\u9519\u8BEF)",h),{response:d.response,success:g,sessionId:d.sessionId,...p?{failure:p}:{}}}catch(d){let u=d instanceof Error?d.message:String(d);m.error("coding","Agent \u6267\u884C\u5F02\u5E38",{agent:i,error:u});let f=pa("",[{type:"error",content:u}]);return{response:u,success:!1,sessionId:void 0,failure:f}}},activeAgent(){return e},available(){return e!==void 0}}}a(nk,"createCodingToolkit");function rk(){return{async run(){return{response:"\u5F53\u524D\u6A21\u5F0F\u4E3A llm_only\uFF0C\u65E0\u53EF\u7528\u7F16\u7A0B Agent\u3002\u8BF7\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E agent.engine \u4E3A claude/qoder/codex/qwenwork \u7B49 Coding Agent\u3002",success:!1,sessionId:void 0}},activeAgent(){},available(){return!1}}}a(rk,"createNullCodingToolkit");function of(t){return t.name.replace(/[\\/]+$/g,"").split(/[\\/]/).pop()?.trim()||t.slug}a(of,"mountName");function ok(t,e){try{let n=Ot.join(t,"wiki");sn.mkdirSync(n,{recursive:!0});for(let r of e){let o=Ot.join(n,of(r));try{let i=sn.readlinkSync(o);if(Ot.resolve(Ot.dirname(o),i)===Ot.resolve(r.dir))continue;sn.rmSync(o,{force:!0})}catch{sn.existsSync(o)&&sn.rmSync(o,{recursive:!0,force:!0})}sn.symlinkSync(r.dir,o,"dir")}return!0}catch(n){return m.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(ok,"ensureWikiSymlinks");function ik(t){try{return sn.mkdirSync(t,{recursive:!0}),t}catch(e){m.warn("coding","\u89D2\u8272 workspace \u76EE\u5F55\u521B\u5EFA\u5931\u8D25\uFF0C\u56DE\u9000\u5230 cwd",{workspaceDir:t,error:e instanceof Error?e.message:String(e)});return}}a(ik,"ensureWorkspaceDir");var sk=pe.object({engine:pe.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]).optional().describe("\u7F16\u7A0B Agent \u5F15\u64CE;llm_only \u8868\u793A\u4E0D\u542F\u7528 coding agent(\u964D\u7EA7\u4E3A\u4E0D\u53EF\u7528)"),model:pe.string().min(1).optional().describe("coding agent \u4F7F\u7528\u7684\u6A21\u578B\u540D"),cwd:pe.string().min(1).optional().describe("coding agent \u5DE5\u4F5C\u76EE\u5F55"),workspace_dir:pe.string().min(1).optional().describe("agent \u6267\u884C workspace \u76EE\u5F55(\u76F8\u5BF9 configDir)\uFF0C\u7F3A\u7701 workspaces/<role.id>")}).strict(),sf={name:"coding",description:"\u7F16\u7A0B Agent \u80FD\u529B:\u8BA9 recipe \u8C03\u7528 coding agent \u751F\u6210\u4EE3\u7801/\u6587\u4EF6/\u6A21\u677F\u3002",configSchema:sk,methods:[{name:"run",description:"\u53D1\u9001 prompt \u7ED9\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1",params:pe.object({prompt:pe.string().describe("\u4EFB\u52A1\u63D0\u793A\u8BCD"),options:pe.object({agent:pe.string().optional().describe("\u8986\u76D6 Agent \u7C7B\u578B(claudecode/codex/qoder/qwenwork \u7B49)"),workDir:pe.string().optional(),model:pe.string().optional(),timeoutMs:pe.number().optional()}).optional().describe("\u8FD0\u884C\u9009\u9879")}),output:pe.object({response:pe.string(),success:pe.boolean(),sessionId:pe.string().optional()})},{name:"activeAgent",description:"\u8FD4\u56DE\u5F53\u524D\u914D\u7F6E\u7684 Agent \u7C7B\u578B",output:pe.string().optional()},{name:"available",description:"\u662F\u5426\u6709\u53EF\u7528\u7684\u7F16\u7A0B Agent",output:pe.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 rk();let r=e.roleContext?.id?.trim(),o=r&&/^[A-Za-z0-9._-]+$/.test(r)?r:void 0,i=t.workspace_dir?Ot.resolve(e.settings.configDir,t.workspace_dir):o?Ot.resolve(e.settings.configDir,"workspaces",o):void 0,s=i?ik(i):void 0,c=e.kbContext?.present===!0,l;if(c&&s&&(e.kbContext?.wikis?.length??0)>0&&ok(s,e.kbContext.wikis)){let u=Io(e.kbContext.wikis,{wikiRootOf:a(f=>`${Ot.posix.join("wiki",of(f))}/`,"wikiRootOf")});l=ur({...e.roleContext?{roleContext:e.roleContext}:{},kbContext:e.kbContext,kbPromptBlock:u,kbRootDir:s})}return l||(l=ur({...e.roleContext?{roleContext:e.roleContext}:{},...e.kbContext?{kbContext:e.kbContext}:{}})),nk({engine:n,workDir:s??t.cwd,model:t.model,configPath:ft(e.settings.configDir),...l?{injected:l}:{}})},permissions:[{method:"run",description:"\u542F\u52A8\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1(\u9650\u5B9A\u53EF\u7528\u7684 agent \u7C7B\u578B)",scopeSchema:pe.array(pe.string()).describe("\u5141\u8BB8\u4F7F\u7528\u7684 agent \u7C7B\u578B(\u5982 claudecode/codex/qoder/qwenwork)"),check:a((t,e)=>{let n=t,r=e[1]?.agent;return r==null?n.length>0:n.includes(r)},"check")}]};import{createHmac as vk}from"crypto";import{z as E}from"zod";var ba=class{static{a(this,"SessionWebhookRegistry")}map=new Map;register(e){if(!e.conversationId)return;let n=this.map.get(e.conversationId),r=e.sessionWebhook??n?.sessionWebhook,o=e.sessionWebhookExpiredTime??n?.sessionWebhookExpiredTime,i=e.conversationType??n?.conversationType;this.map.set(e.conversationId,{...e,...r?{sessionWebhook:r}:{},...typeof o=="number"?{sessionWebhookExpiredTime:o}:{},...i?{conversationType:i}:{},registeredAt:Date.now()}),this.prune()}lookup(e){if(!e)return;let n=this.map.get(e);if(n){if(this.isExpired(n)){this.map.delete(e);return}return n}}clear(){this.map.clear()}isExpired(e){let n=Date.now();return typeof e.sessionWebhookExpiredTime=="number"?n>=e.sessionWebhookExpiredTime:n-e.registeredAt>=54e5}prune(){for(let[e,n]of this.map)this.isExpired(n)&&this.map.delete(e)}},an=new ba;async function ka(t,e,n){let r=new Array(t.length),o=0,i=Array.from({length:Math.min(e,t.length)},async()=>{for(;o<t.length;){let s=o++;r[s]=await n(t[s])}});return await Promise.all(i),r}a(ka,"mapWithConcurrency");var ak=3600*1e3,ck=300*1e3,lk=1e3,af=15e3;function dk(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(dk,"contactCandidates");function uk(t,e){return async(n,r)=>{let o=r?.trim(),i=["contact","user","search","--query",n];o&&i.push("--profile",o),i.push("--format","json");let s=await t(e,i,{timeoutMs:af});if(s.exitCode!==0)throw new Error(`dws contact user search \u5931\u8D25(exit ${s.exitCode}): ${s.stderr.slice(0,200)}`);return s.stdout.trim()?JSON.parse(s.stdout):{}}}a(uk,"createDwsContactSearch");function To(t={}){let e=t.now??Date.now,n=t.positiveTtlMs??ak,r=t.negativeTtlMs??ck,o=Math.max(1,Math.floor(t.maxCacheEntries??lk)),i=t.searchContacts??uk(t.runner??K,t.dwsBin??"dws"),s=new Map,c=a(u=>{for(let[f,p]of s)p.expiresAt<=u&&s.delete(f)},"pruneExpired"),l=a((u,f)=>{c(f);let p=s.get(u);if(p)return s.delete(u),s.set(u,p),p},"readCache"),d=a((u,f,p)=>{for(c(p),s.delete(u);s.size>=o;){let g=s.keys().next().value;if(g===void 0)break;s.delete(g)}s.set(u,f)},"writeCache");return async(u,f,p)=>{let g=u.trim();if(!g)return;if(/^\d+$/.test(g))return g;let h=f.trim();if(!h)return;let y=p?.trim()??"",w=`${y}\0${g}\0${h}`,b=e(),v=l(w,b);if(v)return v.userId;try{let R=[...new Set(dk(await i(h,y||void 0)).filter(C=>C.openDingTalkId?.trim()===g).map(C=>C.userId?.trim()??"").filter(Boolean))],S=R.length===1?R[0]:void 0;return d(w,{...S?{userId:S}:{},expiresAt:b+(S?n:r)},b),S}catch{d(w,{expiresAt:b+r},b);return}}}a(To,"createDingTalkAtUserIdResolver");var fk=To();function cf(t,e,n,r){let o=typeof n=="string"&&n.trim()||void 0,i=typeof n=="function"?n:r;return i?To({searchContacts:i})(t,e,o):fk(t,e,o)}a(cf,"resolveDingTalkAtUserId");async function lF(t,e={}){let n=e.concurrency??5,r=e.log??(()=>{}),o=e.runner??K,i=e.dwsBin??"dws",s=e.timeoutMs??af,c=[],l=await ka(t,n,async u=>{try{let f=await o(i,["contact","user","get","--ids",u,"--format","json"],{timeoutMs:s});if(f.exitCode!==0)throw new Error(`exit ${f.exitCode}: ${f.stderr.slice(0,200)}`);let g=(f.stdout.trim()?JSON.parse(f.stdout):{}).result?.[0]?.orgEmployeeModel?.orgUserName;if(!g)throw new Error("\u672A\u67E5\u8BE2\u5230\u7EC4\u7EC7\u5185\u59D3\u540D");let h=await o(i,["contact","user","search","--query",g,"--format","json"],{timeoutMs:s});if(h.exitCode!==0)throw new Error(`search exit ${h.exitCode}: ${h.stderr.slice(0,200)}`);let w=((h.stdout.trim()?JSON.parse(h.stdout):{}).result??[]).find(b=>b.userId===u);if(w?.openDingTalkId&&w?.nick)return{userId:u,nick:w.nick,openDingTalkId:w.openDingTalkId};throw new Error("\u672A\u67E5\u8BE2\u5230\u5339\u914D\u7684 openDingTalkId/nick")}catch(f){let p=`${u}: ${f instanceof Error?f.message:String(f)}`;return c.push(p),r(`contact \u89E3\u6790\u5931\u8D25 ${p}`),null}}),d=new Map;for(let u of l)u&&d.set(u.userId,u);return{contacts:d,errors:c}}a(lF,"resolveContactsByUserIds");var pk="#007fff";function va(t){return`<font color="${pk}">@${t}</font>`}a(va,"formatDingTalkAtPlaceholder");function lf(t,e){let n=t,r=[];for(let i of e)if(!n.includes(va(i))){if(n.includes(`@${i}`)){n=n.split(`@${i}`).join(va(i));continue}r.push(i)}return r.length===0?n:`${r.map(va).join(" ")} ${n}`}a(lf,"prependDingTalkAtPlaceholders");var gk="https://api.dingtalk.com",mk=300*1e3,hk=15e3,df=6,kt=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||gk).replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??hk,this.fetchImpl=e.fetchImpl??globalThis.fetch}async getAccessToken(){let e=Date.now();return this.tokenCache&&e<this.tokenCache.expireAt-mk?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 m.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(Ao).filter(Boolean),i=o.length>0?yk(n,o):n,s={msgtype:"markdown",markdown:{title:r?.title??wk(n),text:i},at:{isAtAll:r?.atAll??!1,...o.length>0?{atUserIds:o}:{}}};await this.postJson(e,s,void 0,"sessionWebhook")}async sendGroupMarkdown(e,n,r,o){if(!e||!n)throw new Error("sendGroupMarkdown \u7F3A\u5C11 robotCode/openConversationId");let i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:"sampleMarkdown",msgParam:JSON.stringify({title:r,text:o})};await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi")}async sendGroupText(e,n,r){if(!e||!n)throw new Error("sendGroupText \u7F3A\u5C11 robotCode/openConversationId");let o=await this.getAccessToken(),i=`${this.openApiBase}/v1.0/robot/groupMessages/send`,s={robotCode:e,openConversationId:n,msgKey:"sampleText",msgParam:JSON.stringify({content:r})};await this.postJson(i,s,{"x-acs-dingtalk-access-token":o},"robotApi")}async sendGroupActionCard(e,n,r){if(!e||!n)throw new Error("sendGroupActionCard \u7F3A\u5C11 robotCode/openConversationId");let o=uf(r,"sendGroupActionCard"),i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:o.msgKey,msgParam:o.msgParam},l=await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi.actionCard");return l.processQueryKey?{processQueryKey:l.processQueryKey}:{}}async sendActionCardToUsers(e,n,r){if(!e)throw new Error("sendActionCardToUsers \u7F3A\u5C11 robotCode");if(!Array.isArray(n)||n.length===0)throw new Error("sendActionCardToUsers \u7684 userIds \u4E0D\u80FD\u4E3A\u7A7A");let o=n.map(u=>String(u??"").trim());if(o.some(u=>!u))throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u7A7A\u503C");if(new Set(o).size!==o.length)throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u91CD\u590D\u9879");let i=uf(r,"sendActionCardToUsers"),s=await this.getAccessToken(),c=`${this.openApiBase}/v1.0/robot/oToMessages/batchSend`,l={robotCode:e,userIds:o,msgKey:i.msgKey,msgParam:i.msgParam},d=await this.postJson(c,l,{"x-acs-dingtalk-access-token":s},"robotApi.userActionCard");return d.processQueryKey?{processQueryKey:d.processQueryKey}:{}}async replyEmotion(e){await this.sendEmotion("reply",e)}async recallEmotion(e){await this.sendEmotion("recall",e)}async sendEmotion(e,n){if(!n.robotCode||!n.openMsgId||!n.openConversationId||!n.emotionName)throw new Error(`sendEmotion(${e}) \u7F3A\u5C11 robotCode/openMsgId/openConversationId/emotionName`);let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/emotion/${e}`,i={...n,emotionType:1};await this.postJson(o,i,{"x-acs-dingtalk-access-token":r},`emotion.${e}`,!0)}async downloadMessageFile(e,n){if(!e||!n)throw new Error("downloadMessageFile \u7F3A\u5C11 robotCode/downloadCode");let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/messageFiles/download`,i;try{i=await this.fetchImpl(o,{method:"POST",headers:{"Content-Type":"application/json","x-acs-dingtalk-access-token":r},body:JSON.stringify({downloadCode:n,robotCode:e}),signal:AbortSignal.timeout(this.timeoutMs)})}catch(l){let d=l instanceof Error?l.message:String(l);throw m.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 m.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 m.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 m.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 m.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 m.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}): ${l.message??c.slice(0,200)}`);if(typeof l.code=="string"&&l.code&&l.code!=="0")throw m.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,code:l.code,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) code=${l.code}: ${l.message??""}`);return m.debug("dingtalk-robot-client","sent",{channel:o}),l}};function uf(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length<1||t.buttons.length>5)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u5305\u542B 1\uFF5E5 \u4E2A\u6309\u94AE`);for(let[i,s]of t.buttons.entries())if(!s?.title?.trim()||!s.url?.trim())throw new Error(`${e} \u7684\u7B2C ${i+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`);let n=t.buttons.length,r=t.orientation??(n===2?"horizontal":"vertical");if(r==="horizontal"&&n!==2)throw new Error(`${e} \u4EC5\u53CC\u6309\u94AE\u652F\u6301 horizontal \u6392\u5217`);if(n===1){let[i]=t.buttons;return{msgKey:"sampleActionCard",msgParam:JSON.stringify({title:t.title,text:t.text,singleTitle:i.title,singleURL:i.url})}}if(n===2&&r==="horizontal"){let[i,s]=t.buttons;return{msgKey:"sampleActionCard6",msgParam:JSON.stringify({title:t.title,text:t.text,buttonTitle1:i.title,buttonUrl1:i.url,buttonTitle2:s.title,buttonUrl2:s.url})}}let o={title:t.title,text:t.text};return t.buttons.forEach((i,s)=>{o[`actionTitle${s+1}`]=i.title,o[`actionURL${s+1}`]=i.url}),{msgKey:`sampleActionCard${n}`,msgParam:JSON.stringify(o)}}a(uf,"buildActionCardMessage");function Ao(t){let e=String(t??"").trim();return e&&(e.length<df?e.padStart(df,"0"):e)}a(Ao,"padStaffId");function yk(t,e){let n=e.filter(o=>!t.includes(`@${o}`));return n.length===0?t:`${n.map(o=>`@${o}`).join(" ")} ${t}`}a(yk,"prependAtPlaceholders");function wk(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(wk,"deriveTitle");var bk="1",_o=class{static{a(this,"DingTalkSender")}robotClient;robotCode;registry;constructor(e={},n={}){n.robotClient?this.robotClient=n.robotClient:e.robot?.appKey&&e.robot?.appSecret&&(this.robotClient=new kt({appKey:e.robot.appKey,appSecret:e.robot.appSecret,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})),this.robotCode=e.robotCode??e.robot?.appKey,this.registry=n.registry??an}get canReplyInSession(){return!!this.robotClient}async replyToConversation(e,n,r={}){let o=r.entry??this.registry.lookup(e),i=o?.conversationType===bk,s=i||r.mentionSender===!1?"":typeof r.mentionSender=="string"?r.mentionSender.trim():String(o?.senderStaffId??"").trim(),c=i?[]:[...new Set([s,...(r.mentionUserIds??[]).map(u=>u.trim())].filter(Boolean))],l=c.length>0?{atUserIds:c}:{};if(!r.preferWebhook&&this.robotClient&&o?.sessionWebhook)try{return await this.robotClient.replyViaSessionWebhook(o.sessionWebhook,n,{...c.length>0?{atUserStaffIds:c}:{},...typeof o.sessionWebhookExpiredTime=="number"?{expiredTime:o.sessionWebhookExpiredTime}:{},...r.title?{title:r.title}:{}}),{via:"session",...l}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`session \u5931\u8D25: ${f}${g}`}}if(!r.preferWebhook&&this.robotClient&&this.robotCode&&!o?.sessionWebhook)try{let f=(r.senderName?`${r.senderName}
|
|
261
|
+
${r}`:r,c=o?.workDir??(n?.kbActive?n.kbRootDir:t.workDir);m.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 pt(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"]}:{},...o?.adapterOptions??{}},onEvent:o?.onEvent?y=>o.onEvent({type:y.type,content:y.content}):void 0}),u=d.events.some(y=>y.type==="error"),p=ya(d.response,d.events)??(d.response.trim()?null:{kind:"empty_response",message:"agent \u672A\u8FD4\u56DE\u4EFB\u4F55\u54CD\u5E94"}),g=!u&&!p,h={agent:i,workDir:c,sessionId:d.sessionId,success:g,durationMs:Date.now()-l,...p?{failureKind:p.kind,failureMessage:p.message}:{}};return g?m.info("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210",h):m.warn("coding","\u7F16\u7A0B Agent \u6267\u884C\u5B8C\u6210(\u6709\u9519\u8BEF)",h),{response:d.response,success:g,sessionId:d.sessionId,...p?{failure:p}:{}}}catch(d){let u=d instanceof Error?d.message:String(d);m.error("coding","Agent \u6267\u884C\u5F02\u5E38",{agent:i,error:u});let f=ya("",[{type:"error",content:u}]);return{response:u,success:!1,sessionId:void 0,failure:f}}},activeAgent(){return e},available(){return e!==void 0}}}a(gk,"createCodingToolkit");function mk(){return{async run(){return{response:"\u5F53\u524D\u6A21\u5F0F\u4E3A llm_only\uFF0C\u65E0\u53EF\u7528\u7F16\u7A0B Agent\u3002\u8BF7\u5728\u914D\u7F6E\u4E2D\u8BBE\u7F6E agent.engine \u4E3A claude/qoder/codex/qwenwork \u7B49 Coding Agent\u3002",success:!1,sessionId:void 0}},activeAgent(){},available(){return!1}}}a(mk,"createNullCodingToolkit");function uf(t){return t.name.replace(/[\\/]+$/g,"").split(/[\\/]/).pop()?.trim()||t.slug}a(uf,"mountName");function hk(t,e){try{let n=Ot.join(t,"wiki");cn.mkdirSync(n,{recursive:!0});for(let r of e){let o=Ot.join(n,uf(r));try{let i=cn.readlinkSync(o);if(Ot.resolve(Ot.dirname(o),i)===Ot.resolve(r.dir))continue;cn.rmSync(o,{force:!0})}catch{cn.existsSync(o)&&cn.rmSync(o,{recursive:!0,force:!0})}cn.symlinkSync(r.dir,o,"dir")}return!0}catch(n){return m.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(hk,"ensureWikiSymlinks");function yk(t){try{return cn.mkdirSync(t,{recursive:!0}),t}catch(e){m.warn("coding","\u89D2\u8272 workspace \u76EE\u5F55\u521B\u5EFA\u5931\u8D25\uFF0C\u56DE\u9000\u5230 cwd",{workspaceDir:t,error:e instanceof Error?e.message:String(e)});return}}a(yk,"ensureWorkspaceDir");var wk=pe.object({engine:pe.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]).optional().describe("\u7F16\u7A0B Agent \u5F15\u64CE;llm_only \u8868\u793A\u4E0D\u542F\u7528 coding agent(\u964D\u7EA7\u4E3A\u4E0D\u53EF\u7528)"),model:pe.string().min(1).optional().describe("coding agent \u4F7F\u7528\u7684\u6A21\u578B\u540D"),cwd:pe.string().min(1).optional().describe("coding agent \u5DE5\u4F5C\u76EE\u5F55"),workspace_dir:pe.string().min(1).optional().describe("agent \u6267\u884C workspace \u76EE\u5F55(\u76F8\u5BF9 configDir)\uFF0C\u7F3A\u7701 workspaces/<role.id>")}).strict(),ff={name:"coding",description:"\u7F16\u7A0B Agent \u80FD\u529B:\u8BA9 recipe \u8C03\u7528 coding agent \u751F\u6210\u4EE3\u7801/\u6587\u4EF6/\u6A21\u677F\u3002",configSchema:wk,methods:[{name:"run",description:"\u53D1\u9001 prompt \u7ED9\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1",params:pe.object({prompt:pe.string().describe("\u4EFB\u52A1\u63D0\u793A\u8BCD"),options:pe.object({agent:pe.string().optional().describe("\u8986\u76D6 Agent \u7C7B\u578B(claudecode/codex/qoder/qwenwork \u7B49)"),workDir:pe.string().optional(),model:pe.string().optional(),timeoutMs:pe.number().optional()}).optional().describe("\u8FD0\u884C\u9009\u9879")}),output:pe.object({response:pe.string(),success:pe.boolean(),sessionId:pe.string().optional()})},{name:"activeAgent",description:"\u8FD4\u56DE\u5F53\u524D\u914D\u7F6E\u7684 Agent \u7C7B\u578B",output:pe.string().optional()},{name:"available",description:"\u662F\u5426\u6709\u53EF\u7528\u7684\u7F16\u7A0B Agent",output:pe.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 mk();let r=e.roleContext?.id?.trim(),o=r&&/^[A-Za-z0-9._-]+$/.test(r)?r:void 0,i=t.workspace_dir?Ot.resolve(e.settings.configDir,t.workspace_dir):o?Ot.resolve(e.settings.configDir,"workspaces",o):void 0,s=i?yk(i):void 0,c=e.kbContext?.present===!0,l;if(c&&s&&(e.kbContext?.wikis?.length??0)>0&&hk(s,e.kbContext.wikis)){let u=Ao(e.kbContext.wikis,{wikiRootOf:a(f=>`${Ot.posix.join("wiki",uf(f))}/`,"wikiRootOf")});l=pr({...e.roleContext?{roleContext:e.roleContext}:{},kbContext:e.kbContext,kbPromptBlock:u,kbRootDir:s})}return l||(l=pr({...e.roleContext?{roleContext:e.roleContext}:{},...e.kbContext?{kbContext:e.kbContext}:{}})),gk({engine:n,workDir:s??t.cwd,model:t.model,configPath:ft(e.settings.configDir),...l?{injected:l}:{}})},permissions:[{method:"run",description:"\u542F\u52A8\u7F16\u7A0B Agent \u6267\u884C\u4EFB\u52A1(\u9650\u5B9A\u53EF\u7528\u7684 agent \u7C7B\u578B)",scopeSchema:pe.array(pe.string()).describe("\u5141\u8BB8\u4F7F\u7528\u7684 agent \u7C7B\u578B(\u5982 claudecode/codex/qoder/qwenwork)"),check:a((t,e)=>{let n=t,r=e[1]?.agent;return r==null?n.length>0:n.includes(r)},"check")}]};import{createHmac as $k}from"crypto";import{z as E}from"zod";var xa=class{static{a(this,"SessionWebhookRegistry")}map=new Map;register(e){if(!e.conversationId)return;let n=this.map.get(e.conversationId),r=e.sessionWebhook??n?.sessionWebhook,o=e.sessionWebhookExpiredTime??n?.sessionWebhookExpiredTime,i=e.conversationType??n?.conversationType;this.map.set(e.conversationId,{...e,...r?{sessionWebhook:r}:{},...typeof o=="number"?{sessionWebhookExpiredTime:o}:{},...i?{conversationType:i}:{},registeredAt:Date.now()}),this.prune()}lookup(e){if(!e)return;let n=this.map.get(e);if(n){if(this.isExpired(n)){this.map.delete(e);return}return n}}clear(){this.map.clear()}isExpired(e){let n=Date.now();return typeof e.sessionWebhookExpiredTime=="number"?n>=e.sessionWebhookExpiredTime:n-e.registeredAt>=54e5}prune(){for(let[e,n]of this.map)this.isExpired(n)&&this.map.delete(e)}},ln=new xa;async function Ra(t,e,n){let r=new Array(t.length),o=0,i=Array.from({length:Math.min(e,t.length)},async()=>{for(;o<t.length;){let s=o++;r[s]=await n(t[s])}});return await Promise.all(i),r}a(Ra,"mapWithConcurrency");var bk=3600*1e3,kk=300*1e3,vk=1e3,pf=15e3;function Sk(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(Sk,"contactCandidates");function xk(t,e){return async(n,r)=>{let o=r?.trim(),i=["contact","user","search","--query",n];o&&i.push("--profile",o),i.push("--format","json");let s=await t(e,i,{timeoutMs:pf});if(s.exitCode!==0)throw new Error(`dws contact user search \u5931\u8D25(exit ${s.exitCode}): ${s.stderr.slice(0,200)}`);return s.stdout.trim()?JSON.parse(s.stdout):{}}}a(xk,"createDwsContactSearch");function Eo(t={}){let e=t.now??Date.now,n=t.positiveTtlMs??bk,r=t.negativeTtlMs??kk,o=Math.max(1,Math.floor(t.maxCacheEntries??vk)),i=t.searchContacts??xk(t.runner??K,t.dwsBin??"dws"),s=new Map,c=a(u=>{for(let[f,p]of s)p.expiresAt<=u&&s.delete(f)},"pruneExpired"),l=a((u,f)=>{c(f);let p=s.get(u);if(p)return s.delete(u),s.set(u,p),p},"readCache"),d=a((u,f,p)=>{for(c(p),s.delete(u);s.size>=o;){let g=s.keys().next().value;if(g===void 0)break;s.delete(g)}s.set(u,f)},"writeCache");return async(u,f,p)=>{let g=u.trim();if(!g)return;if(/^\d+$/.test(g))return g;let h=f.trim();if(!h)return;let y=p?.trim()??"",w=`${y}\0${g}\0${h}`,b=e(),v=l(w,b);if(v)return v.userId;try{let R=[...new Set(Sk(await i(h,y||void 0)).filter(C=>C.openDingTalkId?.trim()===g).map(C=>C.userId?.trim()??"").filter(Boolean))],S=R.length===1?R[0]:void 0;return d(w,{...S?{userId:S}:{},expiresAt:b+(S?n:r)},b),S}catch{d(w,{expiresAt:b+r},b);return}}}a(Eo,"createDingTalkAtUserIdResolver");var Rk=Eo();function gf(t,e,n,r){let o=typeof n=="string"&&n.trim()||void 0,i=typeof n=="function"?n:r;return i?Eo({searchContacts:i})(t,e,o):Rk(t,e,o)}a(gf,"resolveDingTalkAtUserId");async function jF(t,e={}){let n=e.concurrency??5,r=e.log??(()=>{}),o=e.runner??K,i=e.dwsBin??"dws",s=e.timeoutMs??pf,c=[],l=await Ra(t,n,async u=>{try{let f=await o(i,["contact","user","get","--ids",u,"--format","json"],{timeoutMs:s});if(f.exitCode!==0)throw new Error(`exit ${f.exitCode}: ${f.stderr.slice(0,200)}`);let g=(f.stdout.trim()?JSON.parse(f.stdout):{}).result?.[0]?.orgEmployeeModel?.orgUserName;if(!g)throw new Error("\u672A\u67E5\u8BE2\u5230\u7EC4\u7EC7\u5185\u59D3\u540D");let h=await o(i,["contact","user","search","--query",g,"--format","json"],{timeoutMs:s});if(h.exitCode!==0)throw new Error(`search exit ${h.exitCode}: ${h.stderr.slice(0,200)}`);let w=((h.stdout.trim()?JSON.parse(h.stdout):{}).result??[]).find(b=>b.userId===u);if(w?.openDingTalkId&&w?.nick)return{userId:u,nick:w.nick,openDingTalkId:w.openDingTalkId};throw new Error("\u672A\u67E5\u8BE2\u5230\u5339\u914D\u7684 openDingTalkId/nick")}catch(f){let p=`${u}: ${f instanceof Error?f.message:String(f)}`;return c.push(p),r(`contact \u89E3\u6790\u5931\u8D25 ${p}`),null}}),d=new Map;for(let u of l)u&&d.set(u.userId,u);return{contacts:d,errors:c}}a(jF,"resolveContactsByUserIds");var Ck="#007fff";function Ca(t){return`<font color="${Ck}">@${t}</font>`}a(Ca,"formatDingTalkAtPlaceholder");function mf(t,e){let n=t,r=[];for(let i of e)if(!n.includes(Ca(i))){if(n.includes(`@${i}`)){n=n.split(`@${i}`).join(Ca(i));continue}r.push(i)}return r.length===0?n:`${r.map(Ca).join(" ")} ${n}`}a(mf,"prependDingTalkAtPlaceholders");var Ik="https://api.dingtalk.com",Tk=300*1e3,_k=15e3,hf=6,kt=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||Ik).replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??_k,this.fetchImpl=e.fetchImpl??globalThis.fetch}async getAccessToken(){let e=Date.now();return this.tokenCache&&e<this.tokenCache.expireAt-Tk?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 m.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(Do).filter(Boolean),i=o.length>0?Ak(n,o):n,s={msgtype:"markdown",markdown:{title:r?.title??Ek(n),text:i},at:{isAtAll:r?.atAll??!1,...o.length>0?{atUserIds:o}:{}}};await this.postJson(e,s,void 0,"sessionWebhook")}async sendGroupMarkdown(e,n,r,o){if(!e||!n)throw new Error("sendGroupMarkdown \u7F3A\u5C11 robotCode/openConversationId");let i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:"sampleMarkdown",msgParam:JSON.stringify({title:r,text:o})};await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi")}async sendGroupText(e,n,r){if(!e||!n)throw new Error("sendGroupText \u7F3A\u5C11 robotCode/openConversationId");let o=await this.getAccessToken(),i=`${this.openApiBase}/v1.0/robot/groupMessages/send`,s={robotCode:e,openConversationId:n,msgKey:"sampleText",msgParam:JSON.stringify({content:r})};await this.postJson(i,s,{"x-acs-dingtalk-access-token":o},"robotApi")}async sendGroupActionCard(e,n,r){if(!e||!n)throw new Error("sendGroupActionCard \u7F3A\u5C11 robotCode/openConversationId");let o=yf(r,"sendGroupActionCard"),i=await this.getAccessToken(),s=`${this.openApiBase}/v1.0/robot/groupMessages/send`,c={robotCode:e,openConversationId:n,msgKey:o.msgKey,msgParam:o.msgParam},l=await this.postJson(s,c,{"x-acs-dingtalk-access-token":i},"robotApi.actionCard");return l.processQueryKey?{processQueryKey:l.processQueryKey}:{}}async sendActionCardToUsers(e,n,r){if(!e)throw new Error("sendActionCardToUsers \u7F3A\u5C11 robotCode");if(!Array.isArray(n)||n.length===0)throw new Error("sendActionCardToUsers \u7684 userIds \u4E0D\u80FD\u4E3A\u7A7A");let o=n.map(u=>String(u??"").trim());if(o.some(u=>!u))throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u7A7A\u503C");if(new Set(o).size!==o.length)throw new Error("sendActionCardToUsers \u7684 userIds \u5305\u542B\u91CD\u590D\u9879");let i=yf(r,"sendActionCardToUsers"),s=await this.getAccessToken(),c=`${this.openApiBase}/v1.0/robot/oToMessages/batchSend`,l={robotCode:e,userIds:o,msgKey:i.msgKey,msgParam:i.msgParam},d=await this.postJson(c,l,{"x-acs-dingtalk-access-token":s},"robotApi.userActionCard");return d.processQueryKey?{processQueryKey:d.processQueryKey}:{}}async replyEmotion(e){await this.sendEmotion("reply",e)}async recallEmotion(e){await this.sendEmotion("recall",e)}async sendEmotion(e,n){if(!n.robotCode||!n.openMsgId||!n.openConversationId||!n.emotionName)throw new Error(`sendEmotion(${e}) \u7F3A\u5C11 robotCode/openMsgId/openConversationId/emotionName`);let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/emotion/${e}`,i={...n,emotionType:1};await this.postJson(o,i,{"x-acs-dingtalk-access-token":r},`emotion.${e}`,!0)}async downloadMessageFile(e,n){if(!e||!n)throw new Error("downloadMessageFile \u7F3A\u5C11 robotCode/downloadCode");let r=await this.getAccessToken(),o=`${this.openApiBase}/v1.0/robot/messageFiles/download`,i;try{i=await this.fetchImpl(o,{method:"POST",headers:{"Content-Type":"application/json","x-acs-dingtalk-access-token":r},body:JSON.stringify({downloadCode:n,robotCode:e}),signal:AbortSignal.timeout(this.timeoutMs)})}catch(l){let d=l instanceof Error?l.message:String(l);throw m.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 m.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 m.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 m.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 m.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 m.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}): ${l.message??c.slice(0,200)}`);if(typeof l.code=="string"&&l.code&&l.code!=="0")throw m.error("dingtalk-robot-client","\u4E1A\u52A1\u5931\u8D25",{channel:o,code:l.code,message:l.message}),new Error(`\u9489\u9489\u51FA\u7AD9\u5931\u8D25 (${o}) code=${l.code}: ${l.message??""}`);return m.debug("dingtalk-robot-client","sent",{channel:o}),l}};function yf(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length<1||t.buttons.length>5)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u5305\u542B 1\uFF5E5 \u4E2A\u6309\u94AE`);for(let[i,s]of t.buttons.entries())if(!s?.title?.trim()||!s.url?.trim())throw new Error(`${e} \u7684\u7B2C ${i+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`);let n=t.buttons.length,r=t.orientation??(n===2?"horizontal":"vertical");if(r==="horizontal"&&n!==2)throw new Error(`${e} \u4EC5\u53CC\u6309\u94AE\u652F\u6301 horizontal \u6392\u5217`);if(n===1){let[i]=t.buttons;return{msgKey:"sampleActionCard",msgParam:JSON.stringify({title:t.title,text:t.text,singleTitle:i.title,singleURL:i.url})}}if(n===2&&r==="horizontal"){let[i,s]=t.buttons;return{msgKey:"sampleActionCard6",msgParam:JSON.stringify({title:t.title,text:t.text,buttonTitle1:i.title,buttonUrl1:i.url,buttonTitle2:s.title,buttonUrl2:s.url})}}let o={title:t.title,text:t.text};return t.buttons.forEach((i,s)=>{o[`actionTitle${s+1}`]=i.title,o[`actionURL${s+1}`]=i.url}),{msgKey:`sampleActionCard${n}`,msgParam:JSON.stringify(o)}}a(yf,"buildActionCardMessage");function Do(t){let e=String(t??"").trim();return e&&(e.length<hf?e.padStart(hf,"0"):e)}a(Do,"padStaffId");function Ak(t,e){let n=e.filter(o=>!t.includes(`@${o}`));return n.length===0?t:`${n.map(o=>`@${o}`).join(" ")} ${t}`}a(Ak,"prependAtPlaceholders");function Ek(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(Ek,"deriveTitle");var Dk="1",Po=class{static{a(this,"DingTalkSender")}robotClient;robotCode;registry;constructor(e={},n={}){n.robotClient?this.robotClient=n.robotClient:e.robot?.appKey&&e.robot?.appSecret&&(this.robotClient=new kt({appKey:e.robot.appKey,appSecret:e.robot.appSecret,...e.fetchImpl?{fetchImpl:e.fetchImpl}:{}})),this.robotCode=e.robotCode??e.robot?.appKey,this.registry=n.registry??ln}get canReplyInSession(){return!!this.robotClient}async replyToConversation(e,n,r={}){let o=r.entry??this.registry.lookup(e),i=o?.conversationType===Dk,s=i||r.mentionSender===!1?"":typeof r.mentionSender=="string"?r.mentionSender.trim():String(o?.senderStaffId??"").trim(),c=i?[]:[...new Set([s,...(r.mentionUserIds??[]).map(u=>u.trim())].filter(Boolean))],l=c.length>0?{atUserIds:c}:{};if(!r.preferWebhook&&this.robotClient&&o?.sessionWebhook)try{return await this.robotClient.replyViaSessionWebhook(o.sessionWebhook,n,{...c.length>0?{atUserStaffIds:c}:{},...typeof o.sessionWebhookExpiredTime=="number"?{expiredTime:o.sessionWebhookExpiredTime}:{},...r.title?{title:r.title}:{}}),{via:"session",...l}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`session \u5931\u8D25: ${f}${g}`}}if(!r.preferWebhook&&this.robotClient&&this.robotCode&&!o?.sessionWebhook)try{let f=(r.senderName?`${r.senderName}
|
|
262
262
|
|
|
263
|
-
`:"")+n,p=r.title??f.slice(0,20).replace(/\n/g," ");return await this.robotClient.sendGroupMarkdown(this.robotCode,e,p,f),{via:"robotApi"}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`robotApi \u5931\u8D25: ${f}${g}`}}let d=await this.tryWebhook(n,c,r);return d||{via:"skipped",reason:"\u65E0\u53EF\u7528 sessionWebhook\uFF08\u672A\u914D\u673A\u5668\u4EBA\u6216\u767B\u8BB0\u8868\u672A\u547D\u4E2D\uFF09\uFF0C\u4E14\u672A\u63D0\u4F9B webhookFallback"}}async tryWebhook(e,n,r){if(r.webhookFallback)try{let o=n.map(i=>Ao(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 Sa=class{static{a(this,"DingTalkRobotClientPool")}entries=new Map;get(e,n,r){let o=this.entries.get(e);if(o&&o.clientId===n.clientId&&o.clientSecret===n.clientSecret&&o.fetchImpl===r)return o.client;let i=new kt({appKey:n.clientId,appSecret:n.clientSecret,fetchImpl:r});return this.entries.set(e,{...n,fetchImpl:r,client:i}),i}clear(){this.entries.clear()}},ff=new Sa;var xa=["\u601D\u8003","\u4E13\u6CE8","\u7B49\u4E00\u7B49"],Ra=class{static{a(this,"DingTalkEmotionFeedbackCoordinator")}states=new Map;begin(e,n){let r=We(e);if(!r||this.states.get(r.openMsgId))return;let i={robotCode:r.robotCode,openMsgId:r.openMsgId,openConversationId:r.conversationId,emotionName:kk()},s={context:r,emotionContext:i,client:n,delivered:!1,addPromise:Promise.resolve().then(()=>n.replyEmotion(i)).then(()=>(m.debug("dingtalk-emotion-feedback","processing emotion added",{messageId:Eo(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName}),!0)).catch(c=>(m.warn("dingtalk-emotion-feedback","add processing emotion failed; workflow continues",{messageId:Eo(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=We(e);if(!r||n!==r.conversationId)return;let o=this.states.get(r.openMsgId);!o||!pf(o.context,r)||o.finalizePromise||(o.delivered=!0)}finalize(e,n){let r=We(e);if(!r)return Promise.resolve();let o=this.states.get(r.openMsgId);return!o||!pf(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),m.debug("dingtalk-emotion-feedback","processing emotion recalled",{messageId:Eo(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName})}catch(i){m.warn("dingtalk-emotion-feedback","recall processing emotion failed; workflow unaffected",{messageId:Eo(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 pf(t,e){return t.openMsgId===e.openMsgId&&t.conversationId===e.conversationId&&t.robotCode===e.robotCode&&t.credRef===e.credRef}a(pf,"sameContext");function Eo(t){return t.length<=8?"***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}a(Eo,"maskMessageId");function kk(){let t=Math.floor(Math.random()*xa.length);return xa[t]??xa[0]}a(kk,"pickProcessingEmotion");var Do=new Ra;var Sk=15e3;function xk(t){let e=t.runner??K,n=t.dwsBin,r=t.timeoutMs,o=t.fetchImpl??globalThis.fetch,i=t.emotionFeedbackCoordinator??Do,s=t.robotClientPool??ff,c=t.atUserIdResolver??cf;async function l(f){let p=Date.now(),g=f.slice(0,3).join(" ");m.debug("messaging","dws call",{cmd:g});let h=await e(n,f,{timeoutMs:r}),y=Date.now()-p;if(h.exitCode!==0)throw m.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:g,exitCode:h.exitCode,stderr:h.stderr.slice(0,300),elapsed:y}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (exit ${h.exitCode}): ${h.stderr.slice(0,200)}`);let w=Ck(h.stdout);if(w)throw m.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:g,code:w.code,desc:w.desc,elapsed:y}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (${w.code}): ${w.desc}`);m.debug("messaging","dws call completed",{cmd:g,elapsed:y})}a(l,"runDws");let d=new _o({...t.robot?{robot:t.robot}:{},...t.robotCode?{robotCode:t.robotCode}:{},...t.fetchImpl?{fetchImpl:t.fetchImpl}:{}}),u={async sendToUser(f,p){m.info("messaging","sendToUser",{userId:f,contentLen:p.length}),await l(["chat","message","send","--user",f,"--title",Ca(p),"--text",p,"-y"])},async sendToGroup(f,p){m.info("messaging","sendToGroup",{groupId:f,contentLen:p.length}),await l(["chat","message","send","--group",f,"--title",Ca(p),"--text",p,"-y"])},async sendCard(f,p){let g=Ik(p);f.type==="user"?await this.sendToUser(f.id,g):await this.sendToGroup(f.id,g)},async sendDingTalkActionCardToGroup(f,p,g){let h=We(t.eventContext),y=h?.conversationId===f?h:void 0,b=g?.credRef?.trim()||y?.credRef;if(!b)throw new Error("sendDingTalkActionCardToGroup \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF1A\u4E3B\u52A8\u6216\u8DE8\u7FA4\u53D1\u9001\u5FC5\u987B\u63D0\u4F9B options.credRef");let v=t.robots?.[b];if(!v?.client_id||!v.client_secret)throw new Error(`sendDingTalkActionCardToGroup \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${b}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let S=await s.get(b,{clientId:v.client_id,clientSecret:v.client_secret},o).sendGroupActionCard(v.client_id,f,p);return i.markDelivered(t.eventContext,f),m.info("messaging","sendDingTalkActionCardToGroup",{conversationId:f,credRef:b,hasProcessQueryKey:!!S.processQueryKey}),S},async sendDingTalkActionCardToUsers(f,p,g){let h=g?.credRef?.trim();if(!h)throw new Error("sendDingTalkActionCardToUsers \u5FC5\u987B\u63D0\u4F9B options.credRef");let y=t.robots?.[h];if(!y?.client_id||!y.client_secret)throw new Error(`sendDingTalkActionCardToUsers \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${h}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let b=await s.get(h,{clientId:y.client_id,clientSecret:y.client_secret},o).sendActionCardToUsers(y.client_id,f,p);return m.info("messaging","sendDingTalkActionCardToUsers",{credRef:h,userCount:f.length,hasProcessQueryKey:!!b.processQueryKey}),b},async sendDingTalkActionCardByWebhook(f,p){let g=f?.trim();if(!g)throw new Error("sendDingTalkActionCardByWebhook \u7F3A\u5C11 credRef");let h=t.webhookCreds?.[g];if(!h?.url){let v=Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0";throw new Error(`sendDingTalkActionCardByWebhook \u7684 Webhook \u51ED\u636E credRef="${g}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574\uFF08\u53EF\u7528: ${v}\uFF09`)}Rk(p,"sendDingTalkActionCardByWebhook");let y=gf(h.url);m.info("messaging","sendDingTalkActionCardByWebhook",{credRef:g,host:y,signed:!!h.secret});let w={msgtype:"actionCard",actionCard:{title:p.title,text:p.text,btnOrientation:"1",btns:p.buttons.map(v=>({title:v.title,actionURL:v.url}))}},b=h.secret?mf(h.url,h.secret):h.url;await hf(o,b,w,r,y)},async reply(f){m.warn("messaging","reply called without target context",{contentLen:f.length})},async replyToConversation(f,p,g){let h=g?.credRef?t.webhookCreds?.[g.credRef]:void 0,y=!!g?.credRef&&!h,w=y?`credRef="${g.credRef}" \u672A\u547D\u4E2D\u547D\u540D\u96C6(\u53EF\u7528: ${Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0"})`:void 0,b=g?.webhook??h,v=b?.url?(C,A)=>u.sendToGroupByWebhook({url:b.url,...b.secret?{secret:b.secret}:{}},C,A):void 0,R=g?.mentionSender;if(g?.preferWebhook&&g.mentionSender!==!1&&typeof g.mentionSender!="string"){let C=tr(t.eventContext);if(C?.conversationId===f)try{R=await c(C.senderOpenDingTalkId,C.senderName,C.corpId)}catch(A){m.warn("messaging","Webhook @\u4EBA\u8EAB\u4EFD\u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u4E0D @ \u4EBA",{conversationId:f,error:A instanceof Error?A.message:String(A)})}(typeof R!="string"||!R.trim())&&(R=!1)}let S=await d.replyToConversation(f,p,{...R!==void 0?{mentionSender:R}:{},...g?.mentionUserIds?.length?{mentionUserIds:g.mentionUserIds}:{},...g?.senderName?{senderName:g.senderName}:{},...g?.title?{title:g.title}:{},...g?.preferWebhook?{preferWebhook:g.preferWebhook}:{},...v?{webhookFallback:v}:{}});return w&&(S.reason=S.reason?`${S.reason}; ${w}`:w),S.via==="session"||S.via==="robotApi"||S.via==="webhook"?i.markDelivered(t.eventContext,f):y&&(S.configError=!0),m.info("messaging","replyToConversation",{conversationId:f,via:S.via,atUserIds:S.atUserIds,reason:S.reason}),S},async replyToConversationWithButtons(f,p,g){try{let h=We(t.eventContext),w=g?.credRef?.trim()||h?.credRef;if(!w)return{via:"skipped",reason:"replyToConversationWithButtons \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF08\u65E0 credRef\uFF09"};let b=t.robots?.[w];if(!b?.client_id||!b.client_secret)return{via:"skipped",reason:`replyToConversationWithButtons credRef="${w}" \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u636E`,configError:!0};let v=an.lookup(f),R=v?.conversationType,S=g?.senderStaffId?.trim()||v?.senderStaffId,C={title:p.title,text:p.text,buttons:p.buttons};return R==="1"?S?(await u.sendDingTalkActionCardToUsers([S],C,{credRef:w}),i.markDelivered(t.eventContext,f),{via:"session"}):{via:"skipped",reason:"\u5355\u804A ActionCard \u9700\u8981 senderStaffId \u4F46\u672A\u53D6\u5230"}:(await u.sendDingTalkActionCardToGroup(f,C,{credRef:w}),i.markDelivered(t.eventContext,f),{via:"session"})}catch(h){let y=h instanceof Error?h.message:String(h);return m.warn("messaging","replyToConversationWithButtons \u5931\u8D25",{conversationId:f,reason:y}),{via:"skipped",reason:y}}},beginDingTalkProcessingFeedback(f){let p=We(f);if(!p)return;let g=t.robots?.[p.credRef];if(!g?.client_id||!g.client_secret){m.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:g.client_id,clientSecret:g.client_secret},o);i.begin(f,h)},async sendToGroupByWebhook(f,p,g){let h=f?.url,y=f?.secret;if(!h)throw new Error("sendToGroupByWebhook \u7F3A\u5C11 url");let w=gf(h);m.info("messaging","sendToGroupByWebhook",{host:w,contentLen:p.length,signed:!!y});let b=g?.title??Ca(p),v=[...g?.atUserIds??[],...g?.atMobiles??[]],R=v.length>0?lf(p,v):p,S={msgtype:"markdown",markdown:{title:b,text:R},at:{isAtAll:g?.atAll??!1,...g?.atUserIds?.length?{atUserIds:g.atUserIds}:{},...g?.atMobiles?.length?{atMobiles:g.atMobiles}:{}}},C=y?mf(h,y):h;await hf(o,C,S,r,w)}};return u}a(xk,"createMessagingToolkitFromConfig");function Rk(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length!==2)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u6070\u597D\u5305\u542B\u4E24\u4E2A\u6309\u94AE`);for(let[n,r]of t.buttons.entries())if(!r?.title?.trim()||!r.url?.trim())throw new Error(`${e} \u7684\u7B2C ${n+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`)}a(Rk,"validateDingTalkActionCard");function gf(t){try{return new URL(t).host}catch{return"webhook"}}a(gf,"safeHost");function mf(t,e){let n=Date.now(),r=`${n}
|
|
264
|
-
${e}`,o
|
|
265
|
-
`)}a(Ik,"formatCardAsMarkdown");var yf={session:"\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D(\u53EF @\u63D0\u95EE\u8005)",robotApi:"\u673A\u5668\u4EBA robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u9489\u9489\u9650\u5236\u65E0\u6CD5 @\u4EBA,\u6539\u4E3A\u6B63\u6587\u524D\u7F6E\u79F0\u547C)",webhook:"\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u964D\u7EA7",skipped:"\u65E0\u53EF\u7528\u51FA\u7AD9\u901A\u9053(\u89C1 reason)"},Tk=Object.keys(yf),wf={name:"messaging",description:"IM \u6D88\u606F\u63A8\u9001:\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u6587\u672C\u6216\u5361\u7247\u3001\u7ECF\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u6216\u7528\u6237\u53D1\u9001 ActionCard\u3001\u7ECF\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 Markdown/ActionCard;replyToConversation \u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF(\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D\u5E76 @\u63D0\u95EE\u8005 \u2192 robot API \u4E3B\u52A8\u63A8\u9001 \u2192 webhook \u964D\u7EA7)\u3002",configSchema:E.object({robot_creds:E.record(E.string(),E.object({client_id:E.string(),client_secret:E.string()})).optional(),webhook_creds:E.record(E.string(),E.object({url:E.string(),secret:E.string().optional()})).optional()}).strict(),build:a((t,e)=>{let n=t.robot_creds,r=Ak(e.item.raw),o=We(r),i=o?n?.[o.credRef]:void 0,s=i?.client_id&&i.client_secret?{appKey:i.client_id,appSecret:i.client_secret}:void 0;if(!s&&!o&&n){let c=Object.keys(n)[0],l=c?n[c]:void 0;l?.client_id&&l.client_secret&&(s={appKey:l.client_id,appSecret:l.client_secret})}return xk({dwsBin:e.settings.tracker.dws_bin,timeoutMs:Sk,...s?{robot:s,robotCode:s.appKey}:{},...n?{robots:n}:{},...r?{eventContext:r}:{},...t.webhook_creds?{webhookCreds:t.webhook_creds}:{}})},"build"),methods:[{name:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6587\u672C\u6D88\u606F",params:E.object({userId:E.string().describe("\u63A5\u6536\u7528\u6237 id"),content:E.string().describe("\u6D88\u606F\u6B63\u6587")})},{name:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6587\u672C\u6D88\u606F",params:E.object({groupId:E.string().describe("\u7FA4 cid"),content:E.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:E.object({target:E.object({type:E.enum(["user","group"]),id:E.string()}).describe("\u63A5\u6536\u76EE\u6807(user/group + id)"),card:E.object({title:E.string(),content:E.string()}).describe("\u5361\u7247\u6807\u9898/\u5185\u5BB9")})},{name:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1B\u53CC\u6309\u94AE\u9ED8\u8BA4\u6A2A\u5411\uFF0C\u53EF\u901A\u8FC7 orientation \u9009\u62E9\u7AD6\u5411\u3002",params:E.object({conversationId:E.string().describe("\u76EE\u6807\u7FA4 openConversationId"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.array(E.object({title:E.string().min(1),url:E.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:E.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:E.object({credRef:E.string().min(1).optional().describe("\u673A\u5668\u4EBA\u547D\u540D\u51ED\u636E\u5F15\u7528\uFF1B\u5F53\u524D Stream \u5165\u7AD9\u7FA4\u53EF\u7701\u7565")}).optional()}),output:E.object({processQueryKey:E.string().optional()})},{name:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u6279\u91CF\u5411\u7528\u6237\u5355\u804A\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1BuserIds \u4E3A\u9489\u9489 userId\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u4ECE\u914D\u7F6E\u89E3\u6790\u3002",params:E.object({userIds:E.array(E.string().min(1)).min(1).describe("\u63A5\u6536\u4EBA\u7684\u9489\u9489 userId \u5217\u8868"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.array(E.object({title:E.string().min(1),url:E.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:E.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:E.object({credRef:E.string().min(1).describe("messaging.robot_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528")})}),output:E.object({processQueryKey:E.string().optional()})},{name:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u914D\u7F6E\u4E2D\u7684\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u6A2A\u5411\u53CC\u6309\u94AE ActionCard\uFF1B\u53EA\u4F20 credRef\uFF0C\u4E0D\u66B4\u9732 URL \u6216\u52A0\u7B7E secret\u3002",params:E.object({credRef:E.string().min(1).describe("messaging.webhook_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.tuple([E.object({title:E.string().min(1),url:E.string().min(1)}),E.object({title:E.string().min(1),url:E.string().min(1)})]).describe("\u56FA\u5B9A\u4E24\u4E2A\u6A2A\u5411\u8DF3\u8F6C\u6309\u94AE")})})},{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:E.object({content:E.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 robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u65E0 sessionWebhook \u65F6,\u5982 DWS \u8F6E\u8BE2\u5165\u7AD9) \u2192 \u7FA4\u673A\u5668\u4EBA webhook \u964D\u7EA7(\u9700\u914D webhook \u6216 options.webhook) \u2192 skipped;\u6052\u4E0D\u629B\u9519\u8FD4\u56DE {via,atUserIds,reason}\u3002\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA\u82E5\u5F00\u542F\u300C\u52A0\u7B7E\u300D,webhook \u5FC5\u987B url+secret \u6210\u5BF9(options.webhook \u662F {url,secret} \u5BF9\u8C61,\u4E0D\u662F url \u5B57\u7B26\u4E32);\u53EA\u4F20 url \u4F1A\u88AB\u9489\u9489\u62D2\u6536(sign not match)\u3002",params:E.object({conversationId:E.string().describe("\u76EE\u6807\u4F1A\u8BDD id(\u7FA4 cid)"),content:E.string().describe("\u56DE\u590D\u6B63\u6587"),options:E.object({mentionSender:E.union([E.boolean(),E.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:E.array(E.string()).optional().describe("\u8FFD\u52A0 @ \u7684 userId \u5217\u8868\uFF0C\u4E0E\u63D0\u95EE\u8005\u5408\u5E76\u53BB\u91CD"),senderName:E.string().optional().describe("\u63D0\u95EE\u8005\u59D3\u540D\uFF1B\u4EC5 robotApi \u901A\u9053\u751F\u6548\uFF0C\u6B63\u6587\u524D\u7F6E\u300Cxxx\u300D\u66FF\u4EE3\u65E0\u6CD5 @\u4EBA"),title:E.string().optional().describe("markdown \u6807\u9898"),webhook:E.object({url:E.string(),secret:E.string().optional()}).optional().describe("\u8986\u76D6\u9ED8\u8BA4\u964D\u7EA7 webhook \u76EE\u6807;\u52A0\u7B7E\u7FA4\u5FC5\u987B\u5E26 secret,url \u4E0E secret \u9700\u6210\u5BF9\u6765\u81EA\u540C\u4E00\u914D\u7F6E\u6E90"),credRef:E.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")}),output:E.object({via:E.enum(Tk).describe(`\u5B9E\u9645\u51FA\u7AD9\u901A\u9053\uFF1A${Object.entries(yf).map(([t,e])=>`${t}=${e}`).join("\uFF1B")}`),atUserIds:E.array(E.string()).optional().describe("\u5B9E\u9645 @ \u7684 userId"),reason:E.string().optional().describe("\u964D\u7EA7/\u8DF3\u8FC7\u539F\u56E0"),configError:E.boolean().optional().describe("\u662F\u5426\u56E0\u914D\u7F6E\u9519\u8BEF\u8DF3\u8FC7(\u91CD\u8BD5\u65E0\u76CA)")})},{name:"replyToConversationWithButtons",description:"\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u5F62\u5F0F\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\uFF08\u7FA4\u804A\u8D70\u7FA4\u5361\u7247\uFF0C\u5355\u804A\u8D70\u7528\u6237\u5355\u804A\u5361\u7247\uFF09\uFF1B\u8DEF\u7531\u5931\u8D25\u8FD4\u56DE skipped\u3002",params:E.object({conversationId:E.string().describe("\u76EE\u6807\u4F1A\u8BDD id"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.array(E.object({title:E.string().min(1),url:E.string().min(1)})).min(1).max(5).describe("\u8DF3\u8F6C\u6309\u94AE")}),options:E.object({credRef:E.string().optional().describe("\u673A\u5668\u4EBA\u51ED\u636E\u5F15\u7528\uFF1B\u7701\u7565\u65F6\u4ECE\u5F53\u524D Stream \u5165\u7AD9\u4E0A\u4E0B\u6587\u63A8\u65AD"),senderStaffId:E.string().optional().describe("\u5355\u804A\u65F6\u7684\u63A5\u6536\u4EBA userId\uFF1B\u7701\u7565\u65F6\u4ECE session registry \u63A8\u65AD")}).optional()})},{name:"sendToGroupByWebhook",description:"\u901A\u8FC7\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u7FA4\u6D88\u606F",params:E.object({target:E.object({url:E.string(),secret:E.string().optional()}).describe("\u76EE\u6807 webhook(url + \u53EF\u9009\u52A0\u7B7E secret)"),content:E.string().describe("\u6D88\u606F\u6B63\u6587"),options:E.object({title:E.string().optional(),atAll:E.boolean().optional(),atUserIds:E.array(E.string()).optional(),atMobiles:E.array(E.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:E.array(E.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:E.array(E.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:E.array(E.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684 user id \u6216\u7FA4 cid \u5217\u8868"),check:a((t,e)=>t.includes(e[0].id),"check")},{method:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u7FA4 cid\uFF09",scopeSchema:E.array(E.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u7FA4 cid \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")||n.includes(e[0])},"check")},{method:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001\u5355\u804A ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u9489\u9489 userId\uFF09",scopeSchema:E.array(E.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u9489\u9489 userId \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let r=Array.isArray(e[0])?e[0]:[];return r.length>0&&r.every(o=>typeof o=="string"&&n.includes(o.trim()))},"check")},{method:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u7528\u7684 credRef\uFF09",scopeSchema:E.array(E.string()).describe('\u5141\u8BB8\u4F7F\u7528\u7684 webhook_creds credRef \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t,r=typeof e[0]=="string"?e[0].trim():"";return n.includes("*")||n.includes(r)},"check")},{method:"reply",description:"\u56DE\u590D\u5F53\u524D\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u76EE\u6807 id)",scopeSchema:E.array(E.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:E.array(E.string()).describe('\u5141\u8BB8\u56DE\u590D\u7684\u7FA4 cid \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")?!0:n.includes(e[0])},"check")},{method:"replyToConversationWithButtons",description:'\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u7FA4 cid;\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:E.array(E.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:E.array(E.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 Ak(t){if(!t||typeof t!="object")return;let e=t.eventContext;return We(e)??tr(e)}a(Ak,"eventContextFromItem");import{z as Pe}from"zod";var _k=15e3,bf=300,Ek=["todo","task","create"],Dk=["todo","task","get"],Pk=["todo","task","done"];function $k(t){let e={dwsBin:t.tracker.dws_bin,timeoutMs:_k};return Mk(e)}a($k,"createTodoToolkit");function Mk(t){let e=t.runner??K,n=t.dwsBin,r=t.timeoutMs;async function o(c){let l=[...c,"--format","json"],d=l.slice(0,4).join(" "),u=Date.now();m.debug("todo","dws call",{cmd:d});let f=await e(n,l,{timeoutMs:r}),p=Date.now()-u;if(f.exitCode!==0)throw m.error("todo","dws todo command failed",{cmd:d,exitCode:f.exitCode,stderr:Se(f.stderr),elapsed:p}),new De(`dws todo failed (exit ${f.exitCode}): ${Se(f.stderr)}`,{retryable:!0});m.debug("todo","dws call completed",{cmd:d,elapsed:p});let g=f.stdout.trim();if(!g)return{};try{return JSON.parse(g)}catch{throw new Error(`dws todo returned invalid JSON: ${g.slice(0,bf)}`)}}a(o,"runDwsJson");function i(c){if(!k(c))throw new Error("dws todo create: unexpected response format");for(let l of[c,c.body,c.data,c.result])if(k(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,bf)}`)}a(i,"extractId");function s(c){if(!k(c))return!1;for(let l of[c,c.body,c.data,c.result])if(k(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){m.info("todo","create",{title:c.title,assignee:c.assignee,recordId:c.recordId,stepId:c.stepId});let l=[...Ek,"--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){m.debug("todo","isCompleted",{todoId:c});let l=await o([...Dk,"--task-id",c]);return s(l)},async complete(c){m.info("todo","complete",{todoId:c}),await o([...Pk,"--task-id",c,"--status","true"])}}}a(Mk,"createTodoToolkitFromConfig");var kf={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:Pe.object({}).strict(),build:a((t,e)=>$k(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:Pe.array(Pe.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:Pe.object({title:Pe.string().describe("\u5F85\u529E\u6807\u9898"),assignee:Pe.string().describe("\u8D1F\u8D23\u4EBA id"),dueDate:Pe.string().optional().describe("\u622A\u6B62\u65F6\u95F4(ISO \u5B57\u7B26\u4E32)"),recordId:Pe.string().describe("\u5173\u8054\u8868\u683C\u8BB0\u5F55 id"),stepId:Pe.string().describe("\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4 id")}),output:Pe.string().describe("\u5F85\u529E id")},{name:"isCompleted",description:"\u67E5\u8BE2\u5F85\u529E\u5B8C\u6210\u72B6\u6001",params:Pe.object({todoId:Pe.string().describe("\u5F85\u529E id")}),output:Pe.boolean()},{name:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210",params:Pe.object({todoId:Pe.string().describe("\u5F85\u529E id")})}]};import{rm as vf,mkdir as Sf}from"fs/promises";import jt from"path";import{z as B}from"zod";var Ok="git",jk=12e4,Fk=1,Nk="master";function Lk(t){let e=t.runner??K,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();m.debug("git","git call",{cmd:f});let g=await e(n,d,{timeoutMs:r,cwd:u}),h=Date.now()-p;if(g.exitCode!==0)throw m.error("git","git command failed",{cmd:f,exitCode:g.exitCode,stderr:g.stderr.slice(0,300),elapsed:h}),new Error(`git failed (exit ${g.exitCode}): ${Se(g.stderr)}`);return m.debug("git","git call completed",{cmd:f,elapsed:h}),g.stdout}return a(l,"runGit"),{async clone(d,u,f){let p=f?.depth??t.cloneDepth;m.info("git","clone",{repoUrl:d,targetDir:u,depth:p}),await vf(u,{recursive:!0,force:!0});try{await l(["clone","--depth",String(p),"--single-branch",d,u])}catch(g){throw await vf(u,{recursive:!0,force:!0}),g}},async createBranch(d,u,f){m.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);m.info("git","push",{repoDir:d,branch:f}),await l(["-C",d,"push","-u","origin",f])},async commit(d,u){return m.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}):(m.info("git","commit skipped: nothing to commit",{repoDir:d}),{committed:!1})},async diff(d,u){let f=["-C",d,"diff","--stat"];u&&f.push(u);let p=await l(f),g=p.trim().split(`
|
|
263
|
+
`:"")+n,p=r.title??f.slice(0,20).replace(/\n/g," ");return await this.robotClient.sendGroupMarkdown(this.robotCode,e,p,f),{via:"robotApi"}}catch(u){let f=u instanceof Error?u.message:String(u),p=await this.tryWebhook(n,c,r);if(p&&p.via==="webhook")return p;let g=p?.reason?` + ${p.reason}`:"";return{via:"skipped",reason:`robotApi \u5931\u8D25: ${f}${g}`}}let d=await this.tryWebhook(n,c,r);return d||{via:"skipped",reason:"\u65E0\u53EF\u7528 sessionWebhook\uFF08\u672A\u914D\u673A\u5668\u4EBA\u6216\u767B\u8BB0\u8868\u672A\u547D\u4E2D\uFF09\uFF0C\u4E14\u672A\u63D0\u4F9B webhookFallback"}}async tryWebhook(e,n,r){if(r.webhookFallback)try{let o=n.map(i=>Do(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 Ia=class{static{a(this,"DingTalkRobotClientPool")}entries=new Map;get(e,n,r){let o=this.entries.get(e);if(o&&o.clientId===n.clientId&&o.clientSecret===n.clientSecret&&o.fetchImpl===r)return o.client;let i=new kt({appKey:n.clientId,appSecret:n.clientSecret,fetchImpl:r});return this.entries.set(e,{...n,fetchImpl:r,client:i}),i}clear(){this.entries.clear()}},wf=new Ia;var Ta=["\u601D\u8003","\u4E13\u6CE8","\u7B49\u4E00\u7B49"],_a=class{static{a(this,"DingTalkEmotionFeedbackCoordinator")}states=new Map;begin(e,n){let r=We(e);if(!r||this.states.get(r.openMsgId))return;let i={robotCode:r.robotCode,openMsgId:r.openMsgId,openConversationId:r.conversationId,emotionName:Pk()},s={context:r,emotionContext:i,client:n,delivered:!1,addPromise:Promise.resolve().then(()=>n.replyEmotion(i)).then(()=>(m.debug("dingtalk-emotion-feedback","processing emotion added",{messageId:$o(r.openMsgId),credRef:r.credRef,emotionName:i.emotionName}),!0)).catch(c=>(m.warn("dingtalk-emotion-feedback","add processing emotion failed; workflow continues",{messageId:$o(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=We(e);if(!r||n!==r.conversationId)return;let o=this.states.get(r.openMsgId);!o||!bf(o.context,r)||o.finalizePromise||(o.delivered=!0)}finalize(e,n){let r=We(e);if(!r)return Promise.resolve();let o=this.states.get(r.openMsgId);return!o||!bf(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),m.debug("dingtalk-emotion-feedback","processing emotion recalled",{messageId:$o(e.context.openMsgId),credRef:e.context.credRef,emotionName:e.emotionContext.emotionName})}catch(i){m.warn("dingtalk-emotion-feedback","recall processing emotion failed; workflow unaffected",{messageId:$o(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 bf(t,e){return t.openMsgId===e.openMsgId&&t.conversationId===e.conversationId&&t.robotCode===e.robotCode&&t.credRef===e.credRef}a(bf,"sameContext");function $o(t){return t.length<=8?"***":`${t.slice(0,4)}\u2026${t.slice(-4)}`}a($o,"maskMessageId");function Pk(){let t=Math.floor(Math.random()*Ta.length);return Ta[t]??Ta[0]}a(Pk,"pickProcessingEmotion");var Mo=new _a;var Mk=15e3;function Ok(t){let e=t.runner??K,n=t.dwsBin,r=t.timeoutMs,o=t.fetchImpl??globalThis.fetch,i=t.emotionFeedbackCoordinator??Mo,s=t.robotClientPool??wf,c=t.atUserIdResolver??gf;async function l(f){let p=Date.now(),g=f.slice(0,3).join(" ");m.debug("messaging","dws call",{cmd:g});let h=await e(n,f,{timeoutMs:r}),y=Date.now()-p;if(h.exitCode!==0)throw m.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:g,exitCode:h.exitCode,stderr:h.stderr.slice(0,300),elapsed:y}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (exit ${h.exitCode}): ${h.stderr.slice(0,200)}`);let w=Fk(h.stdout);if(w)throw m.error("messaging","dws \u6D88\u606F\u53D1\u9001\u5931\u8D25",{cmd:g,code:w.code,desc:w.desc,elapsed:y}),new Error(`dws \u6D88\u606F\u53D1\u9001\u5931\u8D25 (${w.code}): ${w.desc}`);m.debug("messaging","dws call completed",{cmd:g,elapsed:y})}a(l,"runDws");let d=new Po({...t.robot?{robot:t.robot}:{},...t.robotCode?{robotCode:t.robotCode}:{},...t.fetchImpl?{fetchImpl:t.fetchImpl}:{}}),u={async sendToUser(f,p){m.info("messaging","sendToUser",{userId:f,contentLen:p.length}),await l(["chat","message","send","--user",f,"--title",Aa(p),"--text",p,"-y"])},async sendToGroup(f,p){m.info("messaging","sendToGroup",{groupId:f,contentLen:p.length}),await l(["chat","message","send","--group",f,"--title",Aa(p),"--text",p,"-y"])},async sendCard(f,p){let g=Nk(p);f.type==="user"?await this.sendToUser(f.id,g):await this.sendToGroup(f.id,g)},async sendDingTalkActionCardToGroup(f,p,g){let h=We(t.eventContext),y=h?.conversationId===f?h:void 0,b=g?.credRef?.trim()||y?.credRef;if(!b)throw new Error("sendDingTalkActionCardToGroup \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF1A\u4E3B\u52A8\u6216\u8DE8\u7FA4\u53D1\u9001\u5FC5\u987B\u63D0\u4F9B options.credRef");let v=t.robots?.[b];if(!v?.client_id||!v.client_secret)throw new Error(`sendDingTalkActionCardToGroup \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${b}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let S=await s.get(b,{clientId:v.client_id,clientSecret:v.client_secret},o).sendGroupActionCard(v.client_id,f,p);return i.markDelivered(t.eventContext,f),m.info("messaging","sendDingTalkActionCardToGroup",{conversationId:f,credRef:b,hasProcessQueryKey:!!S.processQueryKey}),S},async sendDingTalkActionCardToUsers(f,p,g){let h=g?.credRef?.trim();if(!h)throw new Error("sendDingTalkActionCardToUsers \u5FC5\u987B\u63D0\u4F9B options.credRef");let y=t.robots?.[h];if(!y?.client_id||!y.client_secret)throw new Error(`sendDingTalkActionCardToUsers \u7684\u673A\u5668\u4EBA\u51ED\u636E credRef="${h}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574`);let b=await s.get(h,{clientId:y.client_id,clientSecret:y.client_secret},o).sendActionCardToUsers(y.client_id,f,p);return m.info("messaging","sendDingTalkActionCardToUsers",{credRef:h,userCount:f.length,hasProcessQueryKey:!!b.processQueryKey}),b},async sendDingTalkActionCardByWebhook(f,p){let g=f?.trim();if(!g)throw new Error("sendDingTalkActionCardByWebhook \u7F3A\u5C11 credRef");let h=t.webhookCreds?.[g];if(!h?.url){let v=Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0";throw new Error(`sendDingTalkActionCardByWebhook \u7684 Webhook \u51ED\u636E credRef="${g}" \u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574\uFF08\u53EF\u7528: ${v}\uFF09`)}jk(p,"sendDingTalkActionCardByWebhook");let y=kf(h.url);m.info("messaging","sendDingTalkActionCardByWebhook",{credRef:g,host:y,signed:!!h.secret});let w={msgtype:"actionCard",actionCard:{title:p.title,text:p.text,btnOrientation:"1",btns:p.buttons.map(v=>({title:v.title,actionURL:v.url}))}},b=h.secret?vf(h.url,h.secret):h.url;await Sf(o,b,w,r,y)},async reply(f){m.warn("messaging","reply called without target context",{contentLen:f.length})},async replyToConversation(f,p,g){let h=g?.credRef?t.webhookCreds?.[g.credRef]:void 0,y=!!g?.credRef&&!h,w=y?`credRef="${g.credRef}" \u672A\u547D\u4E2D\u547D\u540D\u96C6(\u53EF\u7528: ${Object.keys(t.webhookCreds??{}).join(", ")||"\u65E0"})`:void 0,b=g?.webhook??h,v=b?.url?(C,_)=>u.sendToGroupByWebhook({url:b.url,...b.secret?{secret:b.secret}:{}},C,_):void 0,R=g?.mentionSender;if(g?.preferWebhook&&g.mentionSender!==!1&&typeof g.mentionSender!="string"){let C=rr(t.eventContext);if(C?.conversationId===f)try{R=await c(C.senderOpenDingTalkId,C.senderName,C.corpId)}catch(_){m.warn("messaging","Webhook @\u4EBA\u8EAB\u4EFD\u89E3\u6790\u5931\u8D25\uFF0C\u964D\u7EA7\u4E3A\u4E0D @ \u4EBA",{conversationId:f,error:_ instanceof Error?_.message:String(_)})}(typeof R!="string"||!R.trim())&&(R=!1)}let S=await d.replyToConversation(f,p,{...R!==void 0?{mentionSender:R}:{},...g?.mentionUserIds?.length?{mentionUserIds:g.mentionUserIds}:{},...g?.senderName?{senderName:g.senderName}:{},...g?.title?{title:g.title}:{},...g?.preferWebhook?{preferWebhook:g.preferWebhook}:{},...v?{webhookFallback:v}:{}});return w&&(S.reason=S.reason?`${S.reason}; ${w}`:w),S.via==="session"||S.via==="robotApi"||S.via==="webhook"?i.markDelivered(t.eventContext,f):y&&(S.configError=!0),m.info("messaging","replyToConversation",{conversationId:f,via:S.via,atUserIds:S.atUserIds,reason:S.reason}),S},async replyToConversationWithButtons(f,p,g){try{let h=We(t.eventContext),w=g?.credRef?.trim()||h?.credRef;if(!w)return{via:"skipped",reason:"replyToConversationWithButtons \u65E0\u6CD5\u786E\u5B9A\u673A\u5668\u4EBA\u8EAB\u4EFD\uFF08\u65E0 credRef\uFF09"};let b=t.robots?.[w];if(!b?.client_id||!b.client_secret)return{via:"skipped",reason:`replyToConversationWithButtons credRef="${w}" \u672A\u547D\u4E2D\u673A\u5668\u4EBA\u51ED\u636E`,configError:!0};let v=ln.lookup(f),R=v?.conversationType,S=g?.senderStaffId?.trim()||v?.senderStaffId,C={title:p.title,text:p.text,buttons:p.buttons};return R==="1"?S?(await u.sendDingTalkActionCardToUsers([S],C,{credRef:w}),i.markDelivered(t.eventContext,f),{via:"session"}):{via:"skipped",reason:"\u5355\u804A ActionCard \u9700\u8981 senderStaffId \u4F46\u672A\u53D6\u5230"}:(await u.sendDingTalkActionCardToGroup(f,C,{credRef:w}),i.markDelivered(t.eventContext,f),{via:"session"})}catch(h){let y=h instanceof Error?h.message:String(h);return m.warn("messaging","replyToConversationWithButtons \u5931\u8D25",{conversationId:f,reason:y}),{via:"skipped",reason:y}}},beginDingTalkProcessingFeedback(f){let p=We(f);if(!p)return;let g=t.robots?.[p.credRef];if(!g?.client_id||!g.client_secret){m.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:g.client_id,clientSecret:g.client_secret},o);i.begin(f,h)},async sendToGroupByWebhook(f,p,g){let h=f?.url,y=f?.secret;if(!h)throw new Error("sendToGroupByWebhook \u7F3A\u5C11 url");let w=kf(h);m.info("messaging","sendToGroupByWebhook",{host:w,contentLen:p.length,signed:!!y});let b=g?.title??Aa(p),v=[...g?.atUserIds??[],...g?.atMobiles??[]],R=v.length>0?mf(p,v):p,S={msgtype:"markdown",markdown:{title:b,text:R},at:{isAtAll:g?.atAll??!1,...g?.atUserIds?.length?{atUserIds:g.atUserIds}:{},...g?.atMobiles?.length?{atMobiles:g.atMobiles}:{}}},C=y?vf(h,y):h;await Sf(o,C,S,r,w)}};return u}a(Ok,"createMessagingToolkitFromConfig");function jk(t,e){if(!t?.title?.trim()||!t.text?.trim())throw new Error(`${e} \u7F3A\u5C11\u5361\u7247 title/text`);if(!Array.isArray(t.buttons)||t.buttons.length!==2)throw new Error(`${e} \u7684 buttons \u5FC5\u987B\u6070\u597D\u5305\u542B\u4E24\u4E2A\u6309\u94AE`);for(let[n,r]of t.buttons.entries())if(!r?.title?.trim()||!r.url?.trim())throw new Error(`${e} \u7684\u7B2C ${n+1} \u4E2A\u6309\u94AE\u7F3A\u5C11 title/url`)}a(jk,"validateDingTalkActionCard");function kf(t){try{return new URL(t).host}catch{return"webhook"}}a(kf,"safeHost");function vf(t,e){let n=Date.now(),r=`${n}
|
|
264
|
+
${e}`,o=$k("sha256",e).update(r,"utf8").digest("base64"),i=t.includes("?")?"&":"?";return`${t}${i}timestamp=${n}&sign=${encodeURIComponent(o)}`}a(vf,"signWebhookUrl");async function Sf(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 m.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 m.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 m.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(Sf,"postWebhook");function Fk(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(Fk,"parseDwsFailure");function Aa(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(Aa,"deriveTitle");function Nk(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(`
|
|
265
|
+
`)}a(Nk,"formatCardAsMarkdown");var xf={session:"\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D(\u53EF @\u63D0\u95EE\u8005)",robotApi:"\u673A\u5668\u4EBA robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u9489\u9489\u9650\u5236\u65E0\u6CD5 @\u4EBA,\u6539\u4E3A\u6B63\u6587\u524D\u7F6E\u79F0\u547C)",webhook:"\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u964D\u7EA7",skipped:"\u65E0\u53EF\u7528\u51FA\u7AD9\u901A\u9053(\u89C1 reason)"},Lk=Object.keys(xf),Rf={name:"messaging",description:"IM \u6D88\u606F\u63A8\u9001:\u5411\u7528\u6237/\u7FA4\u53D1\u9001\u6587\u672C\u6216\u5361\u7247\u3001\u7ECF\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u6216\u7528\u6237\u53D1\u9001 ActionCard\u3001\u7ECF\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 Markdown/ActionCard;replyToConversation \u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\u5E76\u81EA\u52A8\u9009\u8DEF(\u673A\u5668\u4EBA sessionWebhook \u4F1A\u8BDD\u5185\u56DE\u590D\u5E76 @\u63D0\u95EE\u8005 \u2192 robot API \u4E3B\u52A8\u63A8\u9001 \u2192 webhook \u964D\u7EA7)\u3002",configSchema:E.object({robot_creds:E.record(E.string(),E.object({client_id:E.string(),client_secret:E.string()})).optional(),webhook_creds:E.record(E.string(),E.object({url:E.string(),secret:E.string().optional()})).optional()}).strict(),build:a((t,e)=>{let n=t.robot_creds,r=Wk(e.item.raw),o=We(r),i=o?n?.[o.credRef]:void 0,s=i?.client_id&&i.client_secret?{appKey:i.client_id,appSecret:i.client_secret}:void 0;if(!s&&!o&&n){let c=Object.keys(n)[0],l=c?n[c]:void 0;l?.client_id&&l.client_secret&&(s={appKey:l.client_id,appSecret:l.client_secret})}return Ok({dwsBin:e.settings.tracker.dws_bin,timeoutMs:Mk,...s?{robot:s,robotCode:s.appKey}:{},...n?{robots:n}:{},...r?{eventContext:r}:{},...t.webhook_creds?{webhookCreds:t.webhook_creds}:{}})},"build"),methods:[{name:"sendToUser",description:"\u5411\u6307\u5B9A\u7528\u6237\u53D1\u9001\u6587\u672C\u6D88\u606F",params:E.object({userId:E.string().describe("\u63A5\u6536\u7528\u6237 id"),content:E.string().describe("\u6D88\u606F\u6B63\u6587")})},{name:"sendToGroup",description:"\u5411\u6307\u5B9A\u7FA4\u53D1\u9001\u6587\u672C\u6D88\u606F",params:E.object({groupId:E.string().describe("\u7FA4 cid"),content:E.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:E.object({target:E.object({type:E.enum(["user","group"]),id:E.string()}).describe("\u63A5\u6536\u76EE\u6807(user/group + id)"),card:E.object({title:E.string(),content:E.string()}).describe("\u5361\u7247\u6807\u9898/\u5185\u5BB9")})},{name:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u5411\u7FA4\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1B\u53CC\u6309\u94AE\u9ED8\u8BA4\u6A2A\u5411\uFF0C\u53EF\u901A\u8FC7 orientation \u9009\u62E9\u7AD6\u5411\u3002",params:E.object({conversationId:E.string().describe("\u76EE\u6807\u7FA4 openConversationId"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.array(E.object({title:E.string().min(1),url:E.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:E.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:E.object({credRef:E.string().min(1).optional().describe("\u673A\u5668\u4EBA\u547D\u540D\u51ED\u636E\u5F15\u7528\uFF1B\u5F53\u524D Stream \u5165\u7AD9\u7FA4\u53EF\u7701\u7565")}).optional()}),output:E.object({processQueryKey:E.string().optional()})},{name:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u6279\u91CF\u5411\u7528\u6237\u5355\u804A\u53D1\u9001 1\uFF5E5 \u6309\u94AE ActionCard\uFF1BuserIds \u4E3A\u9489\u9489 userId\uFF0C\u673A\u5668\u4EBA\u51ED\u636E\u4ECE\u914D\u7F6E\u89E3\u6790\u3002",params:E.object({userIds:E.array(E.string().min(1)).min(1).describe("\u63A5\u6536\u4EBA\u7684\u9489\u9489 userId \u5217\u8868"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.array(E.object({title:E.string().min(1),url:E.string().min(1)})).min(1).max(5).describe("1\uFF5E5 \u4E2A\u8DF3\u8F6C\u6309\u94AE"),orientation:E.enum(["horizontal","vertical"]).optional().describe("\u4EC5\u53CC\u6309\u94AE\u53EF\u9009\uFF1B\u7F3A\u7701 horizontal\uFF0C\u5176\u4ED6\u6309\u94AE\u6570\u91CF\u56FA\u5B9A vertical")}),options:E.object({credRef:E.string().min(1).describe("messaging.robot_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528")})}),output:E.object({processQueryKey:E.string().optional()})},{name:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u914D\u7F6E\u4E2D\u7684\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u6A2A\u5411\u53CC\u6309\u94AE ActionCard\uFF1B\u53EA\u4F20 credRef\uFF0C\u4E0D\u66B4\u9732 URL \u6216\u52A0\u7B7E secret\u3002",params:E.object({credRef:E.string().min(1).describe("messaging.webhook_creds \u4E2D\u7684\u547D\u540D\u51ED\u636E\u5F15\u7528"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.tuple([E.object({title:E.string().min(1),url:E.string().min(1)}),E.object({title:E.string().min(1),url:E.string().min(1)})]).describe("\u56FA\u5B9A\u4E24\u4E2A\u6A2A\u5411\u8DF3\u8F6C\u6309\u94AE")})})},{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:E.object({content:E.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 robot API \u4E3B\u52A8\u63A8\u9001\u7FA4\u6D88\u606F(\u65E0 sessionWebhook \u65F6,\u5982 DWS \u8F6E\u8BE2\u5165\u7AD9) \u2192 \u7FA4\u673A\u5668\u4EBA webhook \u964D\u7EA7(\u9700\u914D webhook \u6216 options.webhook) \u2192 skipped;\u6052\u4E0D\u629B\u9519\u8FD4\u56DE {via,atUserIds,reason}\u3002\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA\u82E5\u5F00\u542F\u300C\u52A0\u7B7E\u300D,webhook \u5FC5\u987B url+secret \u6210\u5BF9(options.webhook \u662F {url,secret} \u5BF9\u8C61,\u4E0D\u662F url \u5B57\u7B26\u4E32);\u53EA\u4F20 url \u4F1A\u88AB\u9489\u9489\u62D2\u6536(sign not match)\u3002",params:E.object({conversationId:E.string().describe("\u76EE\u6807\u4F1A\u8BDD id(\u7FA4 cid)"),content:E.string().describe("\u56DE\u590D\u6B63\u6587"),options:E.object({mentionSender:E.union([E.boolean(),E.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:E.array(E.string()).optional().describe("\u8FFD\u52A0 @ \u7684 userId \u5217\u8868\uFF0C\u4E0E\u63D0\u95EE\u8005\u5408\u5E76\u53BB\u91CD"),senderName:E.string().optional().describe("\u63D0\u95EE\u8005\u59D3\u540D\uFF1B\u4EC5 robotApi \u901A\u9053\u751F\u6548\uFF0C\u6B63\u6587\u524D\u7F6E\u300Cxxx\u300D\u66FF\u4EE3\u65E0\u6CD5 @\u4EBA"),title:E.string().optional().describe("markdown \u6807\u9898"),webhook:E.object({url:E.string(),secret:E.string().optional()}).optional().describe("\u8986\u76D6\u9ED8\u8BA4\u964D\u7EA7 webhook \u76EE\u6807;\u52A0\u7B7E\u7FA4\u5FC5\u987B\u5E26 secret,url \u4E0E secret \u9700\u6210\u5BF9\u6765\u81EA\u540C\u4E00\u914D\u7F6E\u6E90"),credRef:E.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")}),output:E.object({via:E.enum(Lk).describe(`\u5B9E\u9645\u51FA\u7AD9\u901A\u9053\uFF1A${Object.entries(xf).map(([t,e])=>`${t}=${e}`).join("\uFF1B")}`),atUserIds:E.array(E.string()).optional().describe("\u5B9E\u9645 @ \u7684 userId"),reason:E.string().optional().describe("\u964D\u7EA7/\u8DF3\u8FC7\u539F\u56E0"),configError:E.boolean().optional().describe("\u662F\u5426\u56E0\u914D\u7F6E\u9519\u8BEF\u8DF3\u8FC7(\u91CD\u8BD5\u65E0\u76CA)")})},{name:"replyToConversationWithButtons",description:"\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u5F62\u5F0F\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD\uFF08\u7FA4\u804A\u8D70\u7FA4\u5361\u7247\uFF0C\u5355\u804A\u8D70\u7528\u6237\u5355\u804A\u5361\u7247\uFF09\uFF1B\u8DEF\u7531\u5931\u8D25\u8FD4\u56DE skipped\u3002",params:E.object({conversationId:E.string().describe("\u76EE\u6807\u4F1A\u8BDD id"),card:E.object({title:E.string().min(1).describe("\u5361\u7247\u6807\u9898"),text:E.string().min(1).describe("\u652F\u6301 Markdown \u7684\u5361\u7247\u6B63\u6587"),buttons:E.array(E.object({title:E.string().min(1),url:E.string().min(1)})).min(1).max(5).describe("\u8DF3\u8F6C\u6309\u94AE")}),options:E.object({credRef:E.string().optional().describe("\u673A\u5668\u4EBA\u51ED\u636E\u5F15\u7528\uFF1B\u7701\u7565\u65F6\u4ECE\u5F53\u524D Stream \u5165\u7AD9\u4E0A\u4E0B\u6587\u63A8\u65AD"),senderStaffId:E.string().optional().describe("\u5355\u804A\u65F6\u7684\u63A5\u6536\u4EBA userId\uFF1B\u7701\u7565\u65F6\u4ECE session registry \u63A8\u65AD")}).optional()})},{name:"sendToGroupByWebhook",description:"\u901A\u8FC7\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001\u7FA4\u6D88\u606F",params:E.object({target:E.object({url:E.string(),secret:E.string().optional()}).describe("\u76EE\u6807 webhook(url + \u53EF\u9009\u52A0\u7B7E secret)"),content:E.string().describe("\u6D88\u606F\u6B63\u6587"),options:E.object({title:E.string().optional(),atAll:E.boolean().optional(),atUserIds:E.array(E.string()).optional(),atMobiles:E.array(E.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:E.array(E.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:E.array(E.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:E.array(E.string()).describe("\u5141\u8BB8\u53D1\u9001\u7684 user id \u6216\u7FA4 cid \u5217\u8868"),check:a((t,e)=>t.includes(e[0].id),"check")},{method:"sendDingTalkActionCardToGroup",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u7FA4 cid\uFF09",scopeSchema:E.array(E.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u7FA4 cid \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")||n.includes(e[0])},"check")},{method:"sendDingTalkActionCardToUsers",description:"\u4F7F\u7528\u9489\u9489\u4F01\u4E1A\u673A\u5668\u4EBA\u53D1\u9001\u5355\u804A ActionCard\uFF08\u9650\u5B9A\u53EF\u53D1\u9001\u7684\u9489\u9489 userId\uFF09",scopeSchema:E.array(E.string()).describe('\u5141\u8BB8\u53D1\u9001\u7684\u9489\u9489 userId \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t;if(n.includes("*"))return!0;let r=Array.isArray(e[0])?e[0]:[];return r.length>0&&r.every(o=>typeof o=="string"&&n.includes(o.trim()))},"check")},{method:"sendDingTalkActionCardByWebhook",description:"\u901A\u8FC7\u9489\u9489\u81EA\u5B9A\u4E49\u7FA4\u673A\u5668\u4EBA Webhook \u53D1\u9001 ActionCard\uFF08\u9650\u5B9A\u53EF\u7528\u7684 credRef\uFF09",scopeSchema:E.array(E.string()).describe('\u5141\u8BB8\u4F7F\u7528\u7684 webhook_creds credRef \u5217\u8868\uFF0C\u6216 ["*"]'),check:a((t,e)=>{let n=t,r=typeof e[0]=="string"?e[0].trim():"";return n.includes("*")||n.includes(r)},"check")},{method:"reply",description:"\u56DE\u590D\u5F53\u524D\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u76EE\u6807 id)",scopeSchema:E.array(E.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:E.array(E.string()).describe('\u5141\u8BB8\u56DE\u590D\u7684\u7FA4 cid \u5217\u8868,\u6216 ["*"]'),check:a((t,e)=>{let n=t;return n.includes("*")?!0:n.includes(e[0])},"check")},{method:"replyToConversationWithButtons",description:'\u4EE5 ActionCard \u6309\u94AE\u5361\u7247\u56DE\u590D\u6307\u5B9A\u4F1A\u8BDD(\u9650\u5B9A\u53EF\u56DE\u590D\u7684\u7FA4 cid;\u6216 ["*"] \u653E\u884C\u4EFB\u610F)',scopeSchema:E.array(E.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:E.array(E.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 Wk(t){if(!t||typeof t!="object")return;let e=t.eventContext;return We(e)??rr(e)}a(Wk,"eventContextFromItem");import{z as Pe}from"zod";var Bk=15e3,Cf=300,zk=["todo","task","create"],Uk=["todo","task","get"],Vk=["todo","task","done"];function Kk(t){let e={dwsBin:t.tracker.dws_bin,timeoutMs:Bk};return qk(e)}a(Kk,"createTodoToolkit");function qk(t){let e=t.runner??K,n=t.dwsBin,r=t.timeoutMs;async function o(c){let l=[...c,"--format","json"],d=l.slice(0,4).join(" "),u=Date.now();m.debug("todo","dws call",{cmd:d});let f=await e(n,l,{timeoutMs:r}),p=Date.now()-u;if(f.exitCode!==0)throw m.error("todo","dws todo command failed",{cmd:d,exitCode:f.exitCode,stderr:Se(f.stderr),elapsed:p}),new De(`dws todo failed (exit ${f.exitCode}): ${Se(f.stderr)}`,{retryable:!0});m.debug("todo","dws call completed",{cmd:d,elapsed:p});let g=f.stdout.trim();if(!g)return{};try{return JSON.parse(g)}catch{throw new Error(`dws todo returned invalid JSON: ${g.slice(0,Cf)}`)}}a(o,"runDwsJson");function i(c){if(!k(c))throw new Error("dws todo create: unexpected response format");for(let l of[c,c.body,c.data,c.result])if(k(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,Cf)}`)}a(i,"extractId");function s(c){if(!k(c))return!1;for(let l of[c,c.body,c.data,c.result])if(k(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){m.info("todo","create",{title:c.title,assignee:c.assignee,recordId:c.recordId,stepId:c.stepId});let l=[...zk,"--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){m.debug("todo","isCompleted",{todoId:c});let l=await o([...Uk,"--task-id",c]);return s(l)},async complete(c){m.info("todo","complete",{todoId:c}),await o([...Vk,"--task-id",c,"--status","true"])}}}a(qk,"createTodoToolkitFromConfig");var If={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:Pe.object({}).strict(),build:a((t,e)=>Kk(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:Pe.array(Pe.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:Pe.object({title:Pe.string().describe("\u5F85\u529E\u6807\u9898"),assignee:Pe.string().describe("\u8D1F\u8D23\u4EBA id"),dueDate:Pe.string().optional().describe("\u622A\u6B62\u65F6\u95F4(ISO \u5B57\u7B26\u4E32)"),recordId:Pe.string().describe("\u5173\u8054\u8868\u683C\u8BB0\u5F55 id"),stepId:Pe.string().describe("\u5173\u8054\u6D41\u7A0B\u6B65\u9AA4 id")}),output:Pe.string().describe("\u5F85\u529E id")},{name:"isCompleted",description:"\u67E5\u8BE2\u5F85\u529E\u5B8C\u6210\u72B6\u6001",params:Pe.object({todoId:Pe.string().describe("\u5F85\u529E id")}),output:Pe.boolean()},{name:"complete",description:"\u6807\u8BB0\u5F85\u529E\u5B8C\u6210",params:Pe.object({todoId:Pe.string().describe("\u5F85\u529E id")})}]};import{rm as Tf,mkdir as _f}from"fs/promises";import jt from"path";import{z as B}from"zod";var Hk="git",Jk=12e4,Gk=1,Zk="master";function Yk(t){let e=t.runner??K,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();m.debug("git","git call",{cmd:f});let g=await e(n,d,{timeoutMs:r,cwd:u}),h=Date.now()-p;if(g.exitCode!==0)throw m.error("git","git command failed",{cmd:f,exitCode:g.exitCode,stderr:g.stderr.slice(0,300),elapsed:h}),new Error(`git failed (exit ${g.exitCode}): ${Se(g.stderr)}`);return m.debug("git","git call completed",{cmd:f,elapsed:h}),g.stdout}return a(l,"runGit"),{async clone(d,u,f){let p=f?.depth??t.cloneDepth;m.info("git","clone",{repoUrl:d,targetDir:u,depth:p}),await Tf(u,{recursive:!0,force:!0});try{await l(["clone","--depth",String(p),"--single-branch",d,u])}catch(g){throw await Tf(u,{recursive:!0,force:!0}),g}},async createBranch(d,u,f){m.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);m.info("git","push",{repoDir:d,branch:f}),await l(["-C",d,"push","-u","origin",f])},async commit(d,u){return m.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}):(m.info("git","commit skipped: nothing to commit",{repoDir:d}),{committed:!1})},async diff(d,u){let f=["-C",d,"diff","--stat"];u&&f.push(u);let p=await l(f),g=p.trim().split(`
|
|
266
266
|
`).filter(Boolean),h=[];for(let y of g){let w=y.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(`
|
|
267
|
-
`).filter(p=>p.trim().length>0).map(p=>p.slice(3).trim());return{changed:f.length>0,files:f}},async ensureWorktree(d,u,f,p){let g=p?.depth??t.cloneDepth,h=xf(d),y=jt.join(o,"repos",h),w=jt.join(o,"worktrees",Re(u,{fallback:"item"})),b=jt.join(w,h);return c(h,async()=>{if(await Sf(jt.join(o,"repos"),{recursive:!0}),await Sf(w,{recursive:!0}),(await e(n,["-C",y,"rev-parse","--git-dir"],{timeoutMs:r})).exitCode===0){m.info("git","ensureWorktree: \u590D\u7528\u57FA\u7840\u5E93",{repoKey:h,baseDir:y});let C=await e(n,["-C",y,"fetch","--depth",String(g),"origin"],{timeoutMs:r});C.exitCode!==0&&m.warn("git","fetch \u5931\u8D25,\u4F7F\u7528\u73B0\u6709\u57FA\u7840\u5E93\u72B6\u6001",{repoKey:h,stderr:C.stderr.slice(0,200)})}else m.info("git","ensureWorktree: \u514B\u9686\u57FA\u7840\u5E93",{repoUrl:d,baseDir:y,depth:g}),await l(["clone","--depth",String(g),"--single-branch",d,y]);let R=p?.baseRef;if(!R){let C=await e(n,["-C",y,"rev-parse","--abbrev-ref","origin/HEAD"],{timeoutMs:r});R=C.exitCode===0&&C.stdout.trim()?C.stdout.trim():i}if((await l(["-C",y,"worktree","list","--porcelain"])).includes(b))return m.info("git","ensureWorktree: \u590D\u7528\u5DF2\u5B58\u5728 worktree",{wtDir:b,branch:f}),{dir:b,workspaceDir:w,branch:f,reused:!0,baseRef:R};m.info("git","ensureWorktree: \u521B\u5EFA worktree",{wtDir:b,branch:f,baseRef:R});try{await l(["-C",y,"worktree","add",b,"-b",f,R])}catch(C){m.warn("git","worktree add -b \u5931\u8D25,\u56DE\u843D\u5230\u5DF2\u6709\u5206\u652F",{branch:f,error:String(C)}),await l(["-C",y,"worktree","add",b,f])}return{dir:b,workspaceDir:w,branch:f,reused:!1,baseRef:R}})},async removeWorktree(d,u){let f=xf(d),p=jt.join(o,"repos",f),g=jt.join(o,"worktrees",Re(u,{fallback:"item"}),f);await c(f,async()=>{try{await l(["-C",p,"worktree","remove",g,"--force"])}catch(h){m.warn("git","worktree remove \u5931\u8D25(\u5FFD\u7565)",{wtDir:g,error:String(h)})}try{await l(["-C",p,"worktree","prune"])}catch{}})}}}a(Lk,"createGitToolkitFromConfig");function xf(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(xf,"repoKeyFromUrl");var Wk=B.object({root:B.string().optional().describe("\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55(\u76F8\u5BF9\u8DEF\u5F84\u76F8\u5BF9 configDir)"),default_branch:B.string().optional().describe("worktree \u57FA\u51C6\u5206\u652F\u56DE\u843D\u503C"),clone_depth:B.number().optional().describe("\u9ED8\u8BA4 clone \u6DF1\u5EA6")}).strict(),Rf={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:Wk,build(t,e){return Lk({gitBin:Ok,timeoutMs:jk,cloneDepth:t.clone_depth??Fk,workspaceRoot:t.root?jt.resolve(e.settings.configDir,t.root):jt.resolve(e.settings.configDir,".workspace"),defaultBranch:t.default_branch??Nk})},methods:[{name:"clone",description:"\u514B\u9686\u8FDC\u7A0B\u4ED3\u5E93\u5230\u672C\u5730\u76EE\u5F55",params:B.object({repoUrl:B.string().describe("\u4ED3\u5E93\u5730\u5740"),targetDir:B.string().describe("\u672C\u5730\u76EE\u6807\u76EE\u5F55"),options:B.object({depth:B.number().optional()}).optional()})},{name:"createBranch",description:"\u57FA\u4E8E\u5F53\u524D\u6216\u6307\u5B9A\u5206\u652F\u521B\u5EFA\u65B0\u5206\u652F",params:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branchName:B.string().describe("\u65B0\u5206\u652F\u540D"),baseBranch:B.string().optional().describe("\u57FA\u7840\u5206\u652F")})},{name:"currentBranch",description:"\u83B7\u53D6\u5F53\u524D\u5206\u652F\u540D",params:B.object({repoDir:B.string()}),output:B.string()},{name:"push",description:"\u63A8\u9001\u5206\u652F\u5230\u8FDC\u7A0B",params:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branch:B.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:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),message:B.string().describe("\u63D0\u4EA4\u4FE1\u606F")}),output:B.object({committed:B.boolean()})},{name:"diff",description:"\u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u5217\u8868\u53CA\u6458\u8981",params:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),baseBranch:B.string().optional().describe("\u5BF9\u6BD4\u57FA\u51C6\u5206\u652F")}),output:B.object({files:B.array(B.string()),summary:B.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:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55")}),output:B.object({changed:B.boolean(),files:B.array(B.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:B.object({repoUrl:B.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:B.string().describe("\u5DE5\u5355 ID"),branch:B.string().describe("worktree \u5206\u652F\u540D"),options:B.object({baseRef:B.string().optional().describe("\u57FA\u51C6\u5206\u652F(\u7F3A\u7701\u53D6 origin/HEAD,\u518D\u56DE\u843D default_branch)"),depth:B.number().optional().describe("clone/fetch \u6DF1\u5EA6")}).optional()}),output:B.object({dir:B.string(),workspaceDir:B.string(),branch:B.string(),reused:B.boolean(),baseRef:B.string()})},{name:"removeWorktree",description:"\u6E05\u7406\u67D0\u5DE5\u5355\u5728\u67D0\u4ED3\u5E93\u7684 worktree(best-effort,\u57FA\u7840\u5E93\u4E0D\u5220\u9664)",params:B.object({repoUrl:B.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:B.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 X}from"zod";var Bk="a1",zk=3e4;function Uk(){return Vk({a1Bin:Bk,timeoutMs:zk})}a(Uk,"createCodeReviewToolkit");function Vk(t){let e=t.runner??K,n=t.a1Bin,r=t.timeoutMs;async function o(i){let s=[...i,"--format","json"],c=s.slice(0,4).join(" "),l=Date.now();m.debug("codereview","a1 call",{cmd:c});let d=await e(n,s,{timeoutMs:r}),u=Date.now()-l;if(d.exitCode!==0){let p=Kk(d.stderr),g=!qk(p);m.error("codereview","a1 command failed",{cmd:c,exitCode:d.exitCode,code:p,retryable:g,stderr:Se(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 De(`${h}a1 failed (exit ${d.exitCode}): ${Se(d.stderr)}`,{retryable:g,code:p})}m.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){m.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 Hk(c)},async listUnresolvedComments(i,s){m.debug("codereview","listUnresolvedComments",{mrId:i,repoPath:s});let c=await o(["repo","mr","comment","list","--mr",i,"--repo",s,"--unresolved"]);return Jk(c)},async isReadyToMerge(i,s){m.debug("codereview","isReadyToMerge",{mrId:i,repoPath:s});let c=await o(["repo","mr","status",i,"--repo",s]);return Gk(c)}}}a(Vk,"createCodeReviewToolkitFromConfig");function Kk(t){return t.match(/"errorCode"\s*:\s*"([^"]+)"/)?.[1]}a(Kk,"extractErrorCode");function qk(t){return t?t.startsWith("SYSTEM_CONFLICT")||t.startsWith("SYSTEM_ILLEGAL_ARGUMENT"):!1}a(qk,"isNonRetryableCode");function Ia(t,e){if(k(t))for(let n of[t,t.data,t.body,t.result]){if(!k(n))continue;let r=e(n);if(r!==void 0)return r}}a(Ia,"findInResponse");function Hk(t){let e=Ia(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(Hk,"extractMrInfo");function Jk(t){let e=[];if(Array.isArray(t))e=t;else{let n=Ia(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(k).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(Jk,"parseComments");function Gk(t){return Ia(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(Gk,"extractReadyToMerge");var Cf={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:X.object({}).strict(),build:a(()=>Uk(),"build"),methods:[{name:"createMR",description:"\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42(MR)",params:X.object({repoPath:X.string().describe("\u4ED3\u5E93\u8DEF\u5F84(group/project)"),sourceBranch:X.string().describe("\u6E90\u5206\u652F"),targetBranch:X.string().describe("\u76EE\u6807\u5206\u652F"),title:X.string().describe("MR \u6807\u9898"),description:X.string().optional().describe("MR \u63CF\u8FF0"),assignees:X.array(X.string()).optional().describe("\u8BC4\u5BA1\u4EBA\u82B1\u540D\u5217\u8868")}),output:X.object({mrId:X.string(),mrUrl:X.string()})},{name:"listUnresolvedComments",description:"\u67E5\u8BE2 MR \u4E0A\u672A\u89E3\u51B3\u7684\u8BC4\u8BBA",params:X.object({mrId:X.string().describe("MR ID"),repoPath:X.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:X.array(X.object({id:X.number(),note:X.string(),author:X.string(),path:X.string().nullable(),line:X.number().nullable(),createdAt:X.string()}))},{name:"isReadyToMerge",description:"\u68C0\u67E5 MR \u662F\u5426\u6EE1\u8DB3\u5408\u5E76\u6761\u4EF6",params:X.object({mrId:X.string().describe("MR ID"),repoPath:X.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:X.boolean()}],permissions:[{method:"createMR",description:"\u5141\u8BB8\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42"}]};import{z as Ce}from"zod";var Zk="a1",Yk=3e4;function Qk(){return Xk({a1Bin:Zk,timeoutMs:Yk})}a(Qk,"createCIToolkit");function Xk(t){let e=t.runner??K,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();m.debug("ci","a1 call",{cmd:u});let p=await e(n,d,{timeoutMs:r}),g=Date.now()-f;if(p.exitCode!==0)throw m.error("ci","a1 command failed",{cmd:u,exitCode:p.exitCode,stderr:Se(p.stderr),elapsed:g}),new De(`a1 failed (exit ${p.exitCode}): ${Se(p.stderr)}`,{retryable:!0});return m.debug("ci","a1 call completed",{cmd:u,elapsed:g}),p}a(i,"runA1");async function s(c){let d=(await i(c,{json:!0})).stdout.trim();if(!d)return{};try{return JSON.parse(d)}catch{throw new Error(`a1 returned invalid JSON: ${d.slice(0,o)}`)}}return a(s,"runA1Json"),{async triggerPipeline(c,l){m.info("ci","triggerPipeline",{pipelineId:c,branch:l});let d=await s(["ci","pipeline","run",c,"-b",l]);return nv(d)},async getRunStatus(c){m.debug("ci","getRunStatus",{runId:c});let l=await s(["ci","run","get",c]);return{runId:c,status:rv(l)}},async getJobLog(c,l,d){m.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(Xk,"createCIToolkitFromConfig");var ev=new Set(["running","success","failed","pending","cancelled"]);function tv(t){let e=t.toLowerCase();return ev.has(e)?e:e==="passed"||e==="completed"?"success":e==="error"||e==="failure"?"failed":e==="queued"||e==="waiting"||e==="created"?"pending":"unknown"}a(tv,"normalizeStatus");function nv(t){if(!k(t))throw new Error("a1 ci pipeline run: unexpected response format");for(let e of[t,t.data,t.body,t.result]){if(!k(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(nv,"extractRunId");function rv(t){if(!k(t))return"unknown";for(let e of[t,t.data,t.body,t.result])if(k(e)){let n=e;if(typeof n.status=="string")return tv(n.status)}return"unknown"}a(rv,"extractStatus");var If={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:Ce.object({}).strict(),build:a(()=>Qk(),"build"),methods:[{name:"triggerPipeline",description:"\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C",params:Ce.object({pipelineId:Ce.string().describe("\u6D41\u6C34\u7EBF ID"),branch:Ce.string().describe("\u89E6\u53D1\u5206\u652F")}),output:Ce.object({runId:Ce.string()})},{name:"getRunStatus",description:"\u67E5\u8BE2\u6784\u5EFA\u8FD0\u884C\u72B6\u6001",params:Ce.object({runId:Ce.string().describe("\u8FD0\u884C ID")}),output:Ce.object({runId:Ce.string(),status:Ce.enum(["running","success","failed","pending","cancelled","unknown"])})},{name:"getJobLog",description:"\u62C9\u53D6 Job \u65E5\u5FD7(\u539F\u59CB\u6587\u672C)",params:Ce.object({jobId:Ce.string().describe("Job ID"),runId:Ce.string().describe("\u8FD0\u884C ID"),step:Ce.string().optional().describe("\u6307\u5B9A Step \u540D\u79F0")}),output:Ce.string()}],permissions:[{method:"triggerPipeline",description:"\u5141\u8BB8\u89E6\u53D1 CI \u6D41\u6C34\u7EBF"}]};import{z as Ft}from"zod";import Tf from"path";import Ta from"fs/promises";function ov(t,e){try{return xe(t,e,{allowRoot:!1})}catch(n){throw n instanceof te&&n.reason==="ABSOLUTE_PATH"?new Error(`file toolkit: \u7981\u6B62\u7EDD\u5BF9\u8DEF\u5F84 (${e})`):new Error(`file toolkit: \u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5\uFF0C\u7981\u6B62\u8BBF\u95EE base_dir \u4E4B\u5916 (${e})`)}}a(ov,"resolveInBase");function iv(t,e){let n=t.base_dir?Tf.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=ov(r(),i);await Ta.mkdir(Tf.dirname(l),{recursive:!0}),c==="append"?await Ta.appendFile(l,s,"utf8"):await Ta.writeFile(l,s,"utf8"),m.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(iv,"createFileToolkit");var sv=Ft.object({base_dir:Ft.string().min(1).optional().describe("\u5199\u5165\u6839\u76EE\u5F55\uFF08jail \u8FB9\u754C\uFF09\uFF0C\u76F8\u5BF9 configDir \u89E3\u6790")}).strict(),Af={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:sv,build:a((t,e)=>iv(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:Ft.object({path:Ft.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:Ft.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:Ft.object({path:Ft.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:Ft.string().describe("\u8981\u5199\u5165\u7684\u5185\u5BB9")})}]};import Of from"path";import{z as F}from"zod";import H from"fs";import Ie from"path";import{createHash as av}from"crypto";function Aa(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(Aa,"normalizeScope");function cv(t){let e=Aa(t),n=JSON.stringify(e,Object.keys(e).sort());return av("sha256").update(n).digest("hex").slice(0,16)}a(cv,"scopeHash");function Nt(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 cv(t)}a(Nt,"resolveScopeHash");var lv=30,dv=365;function uv(t){let e=Date.parse(t);return Number.isFinite(e)?new Date(e):null}a(uv,"parseBlockDate");function _f(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0,0)}a(_f,"startOfDay");function fv(t,e){return Math.floor((_f(t).getTime()-_f(e).getTime())/(1440*60*1e3))}a(fv,"diffDays");function Ef(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(`
|
|
267
|
+
`).filter(p=>p.trim().length>0).map(p=>p.slice(3).trim());return{changed:f.length>0,files:f}},async ensureWorktree(d,u,f,p){let g=p?.depth??t.cloneDepth,h=Af(d),y=jt.join(o,"repos",h),w=jt.join(o,"worktrees",Re(u,{fallback:"item"})),b=jt.join(w,h);return c(h,async()=>{if(await _f(jt.join(o,"repos"),{recursive:!0}),await _f(w,{recursive:!0}),(await e(n,["-C",y,"rev-parse","--git-dir"],{timeoutMs:r})).exitCode===0){m.info("git","ensureWorktree: \u590D\u7528\u57FA\u7840\u5E93",{repoKey:h,baseDir:y});let C=await e(n,["-C",y,"fetch","--depth",String(g),"origin"],{timeoutMs:r});C.exitCode!==0&&m.warn("git","fetch \u5931\u8D25,\u4F7F\u7528\u73B0\u6709\u57FA\u7840\u5E93\u72B6\u6001",{repoKey:h,stderr:C.stderr.slice(0,200)})}else m.info("git","ensureWorktree: \u514B\u9686\u57FA\u7840\u5E93",{repoUrl:d,baseDir:y,depth:g}),await l(["clone","--depth",String(g),"--single-branch",d,y]);let R=p?.baseRef;if(!R){let C=await e(n,["-C",y,"rev-parse","--abbrev-ref","origin/HEAD"],{timeoutMs:r});R=C.exitCode===0&&C.stdout.trim()?C.stdout.trim():i}if((await l(["-C",y,"worktree","list","--porcelain"])).includes(b))return m.info("git","ensureWorktree: \u590D\u7528\u5DF2\u5B58\u5728 worktree",{wtDir:b,branch:f}),{dir:b,workspaceDir:w,branch:f,reused:!0,baseRef:R};m.info("git","ensureWorktree: \u521B\u5EFA worktree",{wtDir:b,branch:f,baseRef:R});try{await l(["-C",y,"worktree","add",b,"-b",f,R])}catch(C){m.warn("git","worktree add -b \u5931\u8D25,\u56DE\u843D\u5230\u5DF2\u6709\u5206\u652F",{branch:f,error:String(C)}),await l(["-C",y,"worktree","add",b,f])}return{dir:b,workspaceDir:w,branch:f,reused:!1,baseRef:R}})},async removeWorktree(d,u){let f=Af(d),p=jt.join(o,"repos",f),g=jt.join(o,"worktrees",Re(u,{fallback:"item"}),f);await c(f,async()=>{try{await l(["-C",p,"worktree","remove",g,"--force"])}catch(h){m.warn("git","worktree remove \u5931\u8D25(\u5FFD\u7565)",{wtDir:g,error:String(h)})}try{await l(["-C",p,"worktree","prune"])}catch{}})}}}a(Yk,"createGitToolkitFromConfig");function Af(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(Af,"repoKeyFromUrl");var Qk=B.object({root:B.string().optional().describe("\u5DE5\u4F5C\u533A\u6839\u76EE\u5F55(\u76F8\u5BF9\u8DEF\u5F84\u76F8\u5BF9 configDir)"),default_branch:B.string().optional().describe("worktree \u57FA\u51C6\u5206\u652F\u56DE\u843D\u503C"),clone_depth:B.number().optional().describe("\u9ED8\u8BA4 clone \u6DF1\u5EA6")}).strict(),Ef={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:Qk,build(t,e){return Yk({gitBin:Hk,timeoutMs:Jk,cloneDepth:t.clone_depth??Gk,workspaceRoot:t.root?jt.resolve(e.settings.configDir,t.root):jt.resolve(e.settings.configDir,".workspace"),defaultBranch:t.default_branch??Zk})},methods:[{name:"clone",description:"\u514B\u9686\u8FDC\u7A0B\u4ED3\u5E93\u5230\u672C\u5730\u76EE\u5F55",params:B.object({repoUrl:B.string().describe("\u4ED3\u5E93\u5730\u5740"),targetDir:B.string().describe("\u672C\u5730\u76EE\u6807\u76EE\u5F55"),options:B.object({depth:B.number().optional()}).optional()})},{name:"createBranch",description:"\u57FA\u4E8E\u5F53\u524D\u6216\u6307\u5B9A\u5206\u652F\u521B\u5EFA\u65B0\u5206\u652F",params:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branchName:B.string().describe("\u65B0\u5206\u652F\u540D"),baseBranch:B.string().optional().describe("\u57FA\u7840\u5206\u652F")})},{name:"currentBranch",description:"\u83B7\u53D6\u5F53\u524D\u5206\u652F\u540D",params:B.object({repoDir:B.string()}),output:B.string()},{name:"push",description:"\u63A8\u9001\u5206\u652F\u5230\u8FDC\u7A0B",params:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),branch:B.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:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),message:B.string().describe("\u63D0\u4EA4\u4FE1\u606F")}),output:B.object({committed:B.boolean()})},{name:"diff",description:"\u67E5\u770B\u53D8\u66F4\u6587\u4EF6\u5217\u8868\u53CA\u6458\u8981",params:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55"),baseBranch:B.string().optional().describe("\u5BF9\u6BD4\u57FA\u51C6\u5206\u652F")}),output:B.object({files:B.array(B.string()),summary:B.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:B.object({repoDir:B.string().describe("\u4ED3\u5E93\u76EE\u5F55")}),output:B.object({changed:B.boolean(),files:B.array(B.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:B.object({repoUrl:B.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:B.string().describe("\u5DE5\u5355 ID"),branch:B.string().describe("worktree \u5206\u652F\u540D"),options:B.object({baseRef:B.string().optional().describe("\u57FA\u51C6\u5206\u652F(\u7F3A\u7701\u53D6 origin/HEAD,\u518D\u56DE\u843D default_branch)"),depth:B.number().optional().describe("clone/fetch \u6DF1\u5EA6")}).optional()}),output:B.object({dir:B.string(),workspaceDir:B.string(),branch:B.string(),reused:B.boolean(),baseRef:B.string()})},{name:"removeWorktree",description:"\u6E05\u7406\u67D0\u5DE5\u5355\u5728\u67D0\u4ED3\u5E93\u7684 worktree(best-effort,\u57FA\u7840\u5E93\u4E0D\u5220\u9664)",params:B.object({repoUrl:B.string().describe("\u4ED3\u5E93\u5730\u5740"),itemId:B.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 ee}from"zod";var Xk="a1",ev=3e4;function tv(){return nv({a1Bin:Xk,timeoutMs:ev})}a(tv,"createCodeReviewToolkit");function nv(t){let e=t.runner??K,n=t.a1Bin,r=t.timeoutMs;async function o(i){let s=[...i,"--format","json"],c=s.slice(0,4).join(" "),l=Date.now();m.debug("codereview","a1 call",{cmd:c});let d=await e(n,s,{timeoutMs:r}),u=Date.now()-l;if(d.exitCode!==0){let p=rv(d.stderr),g=!ov(p);m.error("codereview","a1 command failed",{cmd:c,exitCode:d.exitCode,code:p,retryable:g,stderr:Se(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 De(`${h}a1 failed (exit ${d.exitCode}): ${Se(d.stderr)}`,{retryable:g,code:p})}m.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){m.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 iv(c)},async listUnresolvedComments(i,s){m.debug("codereview","listUnresolvedComments",{mrId:i,repoPath:s});let c=await o(["repo","mr","comment","list","--mr",i,"--repo",s,"--unresolved"]);return sv(c)},async isReadyToMerge(i,s){m.debug("codereview","isReadyToMerge",{mrId:i,repoPath:s});let c=await o(["repo","mr","status",i,"--repo",s]);return av(c)}}}a(nv,"createCodeReviewToolkitFromConfig");function rv(t){return t.match(/"errorCode"\s*:\s*"([^"]+)"/)?.[1]}a(rv,"extractErrorCode");function ov(t){return t?t.startsWith("SYSTEM_CONFLICT")||t.startsWith("SYSTEM_ILLEGAL_ARGUMENT"):!1}a(ov,"isNonRetryableCode");function Ea(t,e){if(k(t))for(let n of[t,t.data,t.body,t.result]){if(!k(n))continue;let r=e(n);if(r!==void 0)return r}}a(Ea,"findInResponse");function iv(t){let e=Ea(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(iv,"extractMrInfo");function sv(t){let e=[];if(Array.isArray(t))e=t;else{let n=Ea(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(k).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(sv,"parseComments");function av(t){return Ea(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(av,"extractReadyToMerge");var Df={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:ee.object({}).strict(),build:a(()=>tv(),"build"),methods:[{name:"createMR",description:"\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42(MR)",params:ee.object({repoPath:ee.string().describe("\u4ED3\u5E93\u8DEF\u5F84(group/project)"),sourceBranch:ee.string().describe("\u6E90\u5206\u652F"),targetBranch:ee.string().describe("\u76EE\u6807\u5206\u652F"),title:ee.string().describe("MR \u6807\u9898"),description:ee.string().optional().describe("MR \u63CF\u8FF0"),assignees:ee.array(ee.string()).optional().describe("\u8BC4\u5BA1\u4EBA\u82B1\u540D\u5217\u8868")}),output:ee.object({mrId:ee.string(),mrUrl:ee.string()})},{name:"listUnresolvedComments",description:"\u67E5\u8BE2 MR \u4E0A\u672A\u89E3\u51B3\u7684\u8BC4\u8BBA",params:ee.object({mrId:ee.string().describe("MR ID"),repoPath:ee.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:ee.array(ee.object({id:ee.number(),note:ee.string(),author:ee.string(),path:ee.string().nullable(),line:ee.number().nullable(),createdAt:ee.string()}))},{name:"isReadyToMerge",description:"\u68C0\u67E5 MR \u662F\u5426\u6EE1\u8DB3\u5408\u5E76\u6761\u4EF6",params:ee.object({mrId:ee.string().describe("MR ID"),repoPath:ee.string().describe("\u4ED3\u5E93\u8DEF\u5F84")}),output:ee.boolean()}],permissions:[{method:"createMR",description:"\u5141\u8BB8\u521B\u5EFA\u5408\u5E76\u8BF7\u6C42"}]};import{z as Ce}from"zod";var cv="a1",lv=3e4;function dv(){return uv({a1Bin:cv,timeoutMs:lv})}a(dv,"createCIToolkit");function uv(t){let e=t.runner??K,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();m.debug("ci","a1 call",{cmd:u});let p=await e(n,d,{timeoutMs:r}),g=Date.now()-f;if(p.exitCode!==0)throw m.error("ci","a1 command failed",{cmd:u,exitCode:p.exitCode,stderr:Se(p.stderr),elapsed:g}),new De(`a1 failed (exit ${p.exitCode}): ${Se(p.stderr)}`,{retryable:!0});return m.debug("ci","a1 call completed",{cmd:u,elapsed:g}),p}a(i,"runA1");async function s(c){let d=(await i(c,{json:!0})).stdout.trim();if(!d)return{};try{return JSON.parse(d)}catch{throw new Error(`a1 returned invalid JSON: ${d.slice(0,o)}`)}}return a(s,"runA1Json"),{async triggerPipeline(c,l){m.info("ci","triggerPipeline",{pipelineId:c,branch:l});let d=await s(["ci","pipeline","run",c,"-b",l]);return gv(d)},async getRunStatus(c){m.debug("ci","getRunStatus",{runId:c});let l=await s(["ci","run","get",c]);return{runId:c,status:mv(l)}},async getJobLog(c,l,d){m.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(uv,"createCIToolkitFromConfig");var fv=new Set(["running","success","failed","pending","cancelled"]);function pv(t){let e=t.toLowerCase();return fv.has(e)?e:e==="passed"||e==="completed"?"success":e==="error"||e==="failure"?"failed":e==="queued"||e==="waiting"||e==="created"?"pending":"unknown"}a(pv,"normalizeStatus");function gv(t){if(!k(t))throw new Error("a1 ci pipeline run: unexpected response format");for(let e of[t,t.data,t.body,t.result]){if(!k(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(gv,"extractRunId");function mv(t){if(!k(t))return"unknown";for(let e of[t,t.data,t.body,t.result])if(k(e)){let n=e;if(typeof n.status=="string")return pv(n.status)}return"unknown"}a(mv,"extractStatus");var Pf={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:Ce.object({}).strict(),build:a(()=>dv(),"build"),methods:[{name:"triggerPipeline",description:"\u89E6\u53D1\u6D41\u6C34\u7EBF\u8FD0\u884C",params:Ce.object({pipelineId:Ce.string().describe("\u6D41\u6C34\u7EBF ID"),branch:Ce.string().describe("\u89E6\u53D1\u5206\u652F")}),output:Ce.object({runId:Ce.string()})},{name:"getRunStatus",description:"\u67E5\u8BE2\u6784\u5EFA\u8FD0\u884C\u72B6\u6001",params:Ce.object({runId:Ce.string().describe("\u8FD0\u884C ID")}),output:Ce.object({runId:Ce.string(),status:Ce.enum(["running","success","failed","pending","cancelled","unknown"])})},{name:"getJobLog",description:"\u62C9\u53D6 Job \u65E5\u5FD7(\u539F\u59CB\u6587\u672C)",params:Ce.object({jobId:Ce.string().describe("Job ID"),runId:Ce.string().describe("\u8FD0\u884C ID"),step:Ce.string().optional().describe("\u6307\u5B9A Step \u540D\u79F0")}),output:Ce.string()}],permissions:[{method:"triggerPipeline",description:"\u5141\u8BB8\u89E6\u53D1 CI \u6D41\u6C34\u7EBF"}]};import{z as Ft}from"zod";import $f from"path";import Da from"fs/promises";function hv(t,e){try{return xe(t,e,{allowRoot:!1})}catch(n){throw n instanceof ne&&n.reason==="ABSOLUTE_PATH"?new Error(`file toolkit: \u7981\u6B62\u7EDD\u5BF9\u8DEF\u5F84 (${e})`):new Error(`file toolkit: \u8DEF\u5F84\u8D8A\u754C\u6216\u4E0D\u5408\u6CD5\uFF0C\u7981\u6B62\u8BBF\u95EE base_dir \u4E4B\u5916 (${e})`)}}a(hv,"resolveInBase");function yv(t,e){let n=t.base_dir?$f.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=hv(r(),i);await Da.mkdir($f.dirname(l),{recursive:!0}),c==="append"?await Da.appendFile(l,s,"utf8"):await Da.writeFile(l,s,"utf8"),m.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(yv,"createFileToolkit");var wv=Ft.object({base_dir:Ft.string().min(1).optional().describe("\u5199\u5165\u6839\u76EE\u5F55\uFF08jail \u8FB9\u754C\uFF09\uFF0C\u76F8\u5BF9 configDir \u89E3\u6790")}).strict(),Mf={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:wv,build:a((t,e)=>yv(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:Ft.object({path:Ft.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:Ft.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:Ft.object({path:Ft.string().describe("\u76F8\u5BF9 base_dir \u7684\u76EE\u6807\u6587\u4EF6\u8DEF\u5F84"),content:Ft.string().describe("\u8981\u5199\u5165\u7684\u5185\u5BB9")})}]};import Bf from"path";import{z as F}from"zod";import H from"fs";import Ie from"path";import{createHash as bv}from"crypto";function Pa(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(Pa,"normalizeScope");function kv(t){let e=Pa(t),n=JSON.stringify(e,Object.keys(e).sort());return bv("sha256").update(n).digest("hex").slice(0,16)}a(kv,"scopeHash");function Nt(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 kv(t)}a(Nt,"resolveScopeHash");var vv=30,Sv=365;function xv(t){let e=Date.parse(t);return Number.isFinite(e)?new Date(e):null}a(xv,"parseBlockDate");function Of(t){return new Date(t.getFullYear(),t.getMonth(),t.getDate(),0,0,0,0)}a(Of,"startOfDay");function Rv(t,e){return Math.floor((Of(t).getTime()-Of(e).getTime())/(1440*60*1e3))}a(Rv,"diffDays");function jf(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(`
|
|
268
268
|
|
|
269
269
|
`),i=4e3,s=o.length>i?o.slice(0,i)+`
|
|
270
270
|
|
|
271
271
|
...`:o;return{timestamp:r,body:`## ${e}
|
|
272
272
|
|
|
273
|
-
${s}`}}a(
|
|
273
|
+
${s}`}}a(jf,"compactBlocks");function Cv(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=xv(l.timestamp);if(!d)continue;let u=Rv(e,d);if(u<vv)o.push(l);else if(u<Sv){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(jf(d,`\u5386\u53F2\u5F52\u6863 ${l}`));for(let[l,d]of s)c.push(jf(d,`\u5E74\u5EA6\u5F52\u6863 ${l}`));return c.sort((l,d)=>l.timestamp.localeCompare(d.timestamp)),c.map(l=>`---
|
|
274
274
|
|
|
275
275
|
## \u538B\u7F29 @ ${l.timestamp}
|
|
276
276
|
|
|
277
277
|
${l.body}`).join(`
|
|
278
278
|
|
|
279
|
-
`)}a(
|
|
279
|
+
`)}a(Cv,"applyRollingWindow");var Oo=class{constructor(e){this.rootDir=e}rootDir;static{a(this,"MemoryStore")}pathsFor(e){let n=Nt(e),r=Ie.join(this.rootDir,n);return{dir:r,shortTermFile:Ie.join(r,"short-term.jsonl"),longTermFile:Ie.join(r,"long-term.md"),scopeMetaFile:Ie.join(r,"scope.json"),archiveDir:Ie.join(r,"archive"),processingDir:Ie.join(r,"processing"),locksDir:Ie.join(r,"locks")}}ensureScopeDir(e){let n=this.pathsFor(e);if(H.mkdirSync(n.dir,{recursive:!0}),H.mkdirSync(n.archiveDir,{recursive:!0}),H.mkdirSync(n.processingDir,{recursive:!0}),H.mkdirSync(n.locksDir,{recursive:!0}),typeof e!="string"){let r=Pa(e);try{H.writeFileSync(n.scopeMetaFile,JSON.stringify(r,null,2))}catch{}}return n}appendShortTerm(e,n){let r=JSON.stringify(n)+`
|
|
280
280
|
`;H.appendFileSync(e.shortTermFile,r,"utf-8")}readShortTerm(e){if(!H.existsSync(e.shortTermFile))return{entries:[],errors:0};let r=H.readFileSync(e.shortTermFile,"utf-8").split(`
|
|
281
281
|
`).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){H.existsSync(e.shortTermFile)&&H.writeFileSync(e.shortTermFile,"","utf-8")}readLongTerm(e){return H.existsSync(e.longTermFile)?H.readFileSync(e.longTermFile,"utf-8"):""}appendLongTerm(e,n){let r=new Date().toISOString(),o=this.readLongTerm(e),i;o.trim().length===0?i=`---
|
|
282
282
|
|
|
283
283
|
## \u538B\u7F29 @ ${r}
|
|
284
284
|
|
|
285
|
-
${n}`:i=`${
|
|
285
|
+
${n}`:i=`${Cv(o,new Date)}
|
|
286
286
|
|
|
287
287
|
---
|
|
288
288
|
|
|
@@ -292,109 +292,111 @@ ${n}`,H.writeFileSync(e.longTermFile,i+`
|
|
|
292
292
|
`,"utf-8")}archiveShortTerm(e){if(!H.existsSync(e.shortTermFile))return;let n=new Date().toISOString().replace(/[:.]/g,"-"),r=Ie.join(e.archiveDir,`${n}.jsonl`);return H.renameSync(e.shortTermFile,r),r}moveToProcessing(e){if(!H.existsSync(e.shortTermFile))return;let n=new Date().toISOString().replace(/[:.]/g,"-"),r=Ie.join(e.processingDir,`${n}.jsonl`);return H.renameSync(e.shortTermFile,r),r}extractToProcessing(e,n){if(!n)return this.moveToProcessing(e);if(!H.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=Ie.join(e.processingDir,`${c}.jsonl`);return this.writeJsonl(l,o),s.length>0?this.writeJsonl(e.shortTermFile,s):H.unlinkSync(e.shortTermFile),l}rollbackFromProcessing(e,n){if(H.existsSync(n)){let r=H.readFileSync(n,"utf-8");H.appendFileSync(e.shortTermFile,r,"utf-8"),H.unlinkSync(n)}}archiveProcessing(e,n){if(!H.existsSync(n))return;let r=Ie.basename(n),o=Ie.join(e.archiveDir,r);return H.renameSync(n,o),o}findOrphanProcessing(){if(!H.existsSync(this.rootDir))return[];let e=[];for(let n of H.readdirSync(this.rootDir,{withFileTypes:!0})){if(!n.isDirectory())continue;let r=n.name,o=Ie.join(this.rootDir,r,"processing");if(H.existsSync(o))for(let i of H.readdirSync(o)){if(!i.endsWith(".jsonl"))continue;let s=Ie.join(o,i),{entries:c}=this.readShortTermFile(s);e.push({scopeHash:r,processingFile:s,entries:c})}}return e}readShortTermFile(e){if(!H.existsSync(e))return{entries:[],errors:0};let r=H.readFileSync(e,"utf-8").split(`
|
|
293
293
|
`).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(`
|
|
294
294
|
`);H.writeFileSync(e,r?`${r}
|
|
295
|
-
`:"","utf-8")}cleanExpiredArchives(e){if(e<=0||!H.existsSync(this.rootDir))return 0;let n=Date.now()-e*24*60*60*1e3,r=0;for(let o of H.readdirSync(this.rootDir,{withFileTypes:!0})){if(!o.isDirectory())continue;let i=Ie.join(this.rootDir,o.name,"archive");if(H.existsSync(i))for(let s of H.readdirSync(i)){let c=Ie.join(i,s);H.statSync(c).mtimeMs<n&&(H.unlinkSync(c),r++)}}return r}};import it from"fs";import
|
|
296
|
-
`).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(Mo,"readEntriesFromFile");function mv(t,e){if(!it.existsSync(e.processingDir))return{scopeHash:Ea.basename(e.dir),entries:0,action:"restored"};let n=0;for(let r of it.readdirSync(e.processingDir)){if(!r.endsWith(".jsonl"))continue;let o=Ea.join(e.processingDir,r),i=Mo(o);for(let s of i)t.appendShortTerm(e,s);n+=i.length;try{it.unlinkSync(o)}catch{}}return{scopeHash:Ea.basename(e.dir),entries:n,action:"restored"}}a(mv,"recoverScopeProcessing");var cn=F.object({tenantId:F.string().optional(),baseId:F.string().optional(),channel:F.string(),groupId:F.string().optional(),conversationId:F.string().optional(),roleId:F.string().optional(),scenario:F.string()}),hv=F.object({root_dir:F.string().optional(),default_scope:cn.optional(),retention_days:F.number().optional()}).strict();function yv(t,e){let n=e?.root_dir??"./.memory";return{rootDir:Of.isAbsolute(n)?n:Of.resolve(t.configDir,n),defaultScope:e?.default_scope,retentionDays:e?.retention_days??30}}a(yv,"resolveConfig");function wv(t){let e=new Po(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 $f(e,i,o)},async recover(r){return Mf(e,r!==void 0?r:void 0)}}}a(wv,"createMemoryToolkit");var jf={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:hv,defaultConfig(t){return{root_dir:"./.memory",retention_days:30}},build(t,e){let n=yv(e.settings,t);return wv(n)},methods:[{name:"append",description:"\u8FFD\u52A0\u4E00\u6761\u77ED\u671F\u8BB0\u5FC6",params:F.object({scope:F.union([F.string(),cn]).describe("\u8BB0\u5FC6\u8303\u56F4"),entry:F.object({id:F.string().optional(),timestamp:F.string().describe("ISO 8601 \u65F6\u95F4\u6233"),kind:F.string().describe("\u4E1A\u52A1\u81EA\u5B9A\u4E49\u7C7B\u578B"),content:F.string(),summary:F.string().optional(),meta:F.record(F.string(),F.unknown()).optional()})})},{name:"readShortTerm",description:"\u8BFB\u53D6\u77ED\u671F\u8BB0\u5FC6\uFF08\u53EF\u6309\u65F6\u95F4/kind/limit \u8FC7\u6EE4\uFF09",params:F.object({scope:F.union([F.string(),cn]),query:F.object({since:F.string().optional(),until:F.string().optional(),kinds:F.array(F.string()).optional(),limit:F.number().optional()}).optional()}),output:F.array(F.object({timestamp:F.string(),kind:F.string(),content:F.string()}))},{name:"readLongTerm",description:"\u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6 long-term.md",params:F.object({scope:F.union([F.string(),cn])}),output:F.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:F.object({scope:F.union([F.string(),cn]),options:F.object({summary:F.string().describe("\u9884\u8BA1\u7B97\u7684\u6458\u8981\u6587\u672C"),entries:F.array(F.object({timestamp:F.string(),kind:F.string(),content:F.string()})).optional(),sourceScopes:F.array(F.union([F.string(),cn])).optional(),query:F.object({since:F.string().optional(),until:F.string().optional(),kinds:F.array(F.string()).optional(),limit:F.number().optional()}).optional(),checkpoint:F.boolean().optional(),archive:F.boolean().optional(),clearShortTerm:F.boolean().optional()})})},{name:"recover",description:"\u6062\u590D\u5B64\u513F processing \u6587\u4EF6",params:F.object({scope:F.union([F.string(),cn]).optional()})}]};import{z as J}from"zod";var Lf=3e4,Wf=5*1024*1024,Bf=3,zf=J.object({bin:J.string().describe("\u5141\u8BB8\u6267\u884C\u7684\u53EF\u6267\u884C\u6587\u4EF6\u540D\uFF08\u4E0D\u542B\u8DEF\u5F84\uFF1B\u8DEF\u5F84\u89E3\u6790\u89C1 bins\uFF09"),args_prefix:J.array(J.string()).optional().describe("\u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\u767D\u540D\u5355\uFF1A\u5B9E\u9645 argv \u5FC5\u987B\u4EE5\u8BE5\u5E8F\u5217\u5F00\u5934\uFF0C\u7528\u4E8E\u628A\u6388\u6743\u6536\u7A84\u5230\u67D0\u4E2A\u5B50\u547D\u4EE4\u65CF")}),bv=J.object({allow:J.array(zf).optional().describe("default-deny \u547D\u4EE4\u767D\u540D\u5355\uFF1B\u672A\u5217\u51FA\u7684 bin/\u5B50\u547D\u4EE4\u524D\u7F00\u4E00\u5F8B\u62D2\u7EDD\u3002\u7F3A\u7701=\u5168\u90E8\u62D2\u7EDD"),timeout_ms:J.number().optional().describe("\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF0C\u7F3A\u7701 30000"),max_output_bytes:J.number().optional().describe("\u6355\u83B7\u8F93\u51FA\u4E0A\u9650\uFF08\u5B57\u8282\uFF09\uFF0C\u7F3A\u7701 5242880"),retry:J.object({max_attempts:J.number().optional()}).optional().describe("\u91CD\u8BD5\u7B56\u7565\uFF1Bmax_attempts \u542B\u9996\u6B21\u5C1D\u8BD5\uFF0C\u7F3A\u7701 3"),bins:J.record(J.string(),J.string()).optional().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D \u2192 \u7EDD\u5BF9\u8DEF\u5F84\u8986\u76D6\uFF08\u5982 dws \u88AB\u5BBF\u4E3B PATH \u906E\u853D\u65F6\u663E\u5F0F\u6307\u5B9A\uFF09")}).strict(),Oo=class extends De{static{a(this,"ShellNotAllowedError")}constructor(e){super(`shell: \u547D\u4EE4\u672A\u6388\u6743\u300C${e}\u300D\uFF08toolkit_config.shell.allow \u672A\u5217\u51FA\u8BE5 bin/\u5B50\u547D\u4EE4\u524D\u7F00\uFF09`,{retryable:!1,code:"SHELL_NOT_ALLOWED"}),this.name="ShellNotAllowedError"}};function kv(t,e,n){return t.some(r=>{if(r.bin!==e)return!1;let o=r.args_prefix;return!o||o.length===0?!0:n.length<o.length?!1:o.every((i,s)=>n[s]===i)})}a(kv,"isAllowed");function Da(t,e){if(e.length===0)return t;let n=new Set(e);return t.map(r=>n.has(r)?"***":r)}a(Da,"redactArgs");function Ff(t){return t?.code==="ENOENT"}a(Ff,"isEnoent");function vv(t,e){if(e!==void 0)try{return xe(t,e)}catch(n){throw n instanceof te?new De(`shell: cwd\u300C${e}\u300D\u8D8A\u51FA\u5B9E\u4F8B\u6839\u76EE\u5F55`,{retryable:!1,code:"SHELL_CWD_ESCAPE"}):n}}a(vv,"resolveCwd");function Nf(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?{text:t,truncated:!1}:{text:n.subarray(0,e).toString("utf8"),truncated:!0}}a(Nf,"truncateBytes");function Pa(t){let{allow:e,bins:n,configDir:r,secrets:o,runner:i}=t;async function s(l,d,u){let f=n[l]??l,p=vv(r,u?.cwd);return i(f,d,{cwd:p,input:u?.input,timeoutMs:u?.timeoutMs??t.timeoutMs,maxOutputBytes:u?.maxOutputBytes??t.maxOutputBytes})}a(s,"attempt");function c(l,d,u){if(!kv(e,l,d))throw new Oo(l);m.debug("shell","exec",{bin:l,argv:Da(d,o),cwd:u})}return a(c,"authorizeAndAudit"),{async run(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=u?.maxOutputBytes??t.maxOutputBytes,g=Date.now(),h=0,y=await Xt(async()=>(h++,s(l,d,u)),{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(R=>!Ff(R)),onRetry:a((R,S)=>m.debug("shell","run retry",{bin:l,retry:S,error:String(R)}),"onRetry")}),w=Nf(y.stdout,p),b=Nf(y.stderr,p),v=!!(y.truncated||w.truncated||b.truncated);return m.info("shell","run done",{bin:l,argv:Da(d,o),exitCode:y.exitCode,durationMs:Date.now()-g,attempts:h,truncated:v}),{stdout:w.text,stderr:b.text,exitCode:y.exitCode,truncated:v}},async runJson(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=Date.now(),g=0,h=await Xt(async()=>{g++;let y=await s(l,d,u);if(y.exitCode!==0)throw new De(`shell: \u547D\u4EE4\u975E\u96F6\u9000\u51FA (${y.exitCode})\uFF1A${y.stderr.slice(0,300)}`,{retryable:!0,code:"SHELL_NONZERO_EXIT"});let w=y.stdout.trim();if(w!=="")try{return JSON.parse(w)}catch{throw new De("shell: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON",{retryable:!0,code:"SHELL_BAD_JSON"})}},{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(y=>!Ff(y)),onRetry:a((y,w)=>m.debug("shell","runJson retry",{bin:l,retry:w,error:String(y)}),"onRetry")});return m.info("shell","runJson done",{bin:l,argv:Da(d,o),durationMs:Date.now()-p,attempts:g}),h}}}a(Pa,"createShellToolkitFromConfig");function Sv(t,e){let n=t.raw?.toolkit_config?.shell??{};return Pa(Uf(t,{...n,allow:[{bin:e}]}))}a(Sv,"createExecShellToolkit");function xv(t,e){return Pa({allow:[{bin:t}],timeoutMs:Lf,maxOutputBytes:Wf,maxAttempts:Bf,bins:{},configDir:e?.configDir??process.cwd(),secrets:[],runner:K})}a(xv,"createStandaloneExecShellToolkit");function Uf(t,e){let n=Object.values(t.envSource??{}).filter(r=>typeof r=="string"&&r.length>0);return{allow:e?.allow??[],timeoutMs:e?.timeout_ms??Lf,maxOutputBytes:e?.max_output_bytes??Wf,maxAttempts:e?.retry?.max_attempts??Bf,bins:e?.bins??{},configDir:t.configDir,secrets:n,runner:K}}a(Uf,"resolveConfig");var Vf={name:"shell",description:"\u539F\u5B50\u5316\u547D\u4EE4\u6267\u884C\uFF08dws/git \u7B49 CLI \u7684\u901A\u7528\u9003\u751F\u8231\uFF09\uFF1A\u65E0 shell \u89E3\u91CA\u3001default-deny \u767D\u540D\u5355\u3001\u7EDF\u4E00\u91CD\u8BD5/\u8D85\u65F6/JSON \u89E3\u6790/\u8F93\u51FA\u622A\u65AD/\u5BA1\u8BA1\u8131\u654F\u3002",configSchema:bv,build(t,e){return Pa(Uf(e.settings,t))},methods:[{name:"run",description:"\u6267\u884C\u5355\u4E2A\u53EF\u6267\u884C\u6587\u4EF6\uFF08argv \u6570\u7EC4\uFF0C\u65E0 shell \u89E3\u91CA\uFF09\uFF1B\u975E\u96F6\u9000\u51FA\u4E0D\u629B\u9519\uFF0C\u9000\u51FA\u7801\u539F\u6837\u8FD4\u56DE",params:J.object({bin:J.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:J.array(J.string()).describe("argv \u6570\u7EC4"),options:J.object({cwd:J.string().optional(),input:J.string().optional(),timeoutMs:J.number().optional(),maxOutputBytes:J.number().optional()}).optional()}),output:J.object({stdout:J.string(),stderr:J.string(),exitCode:J.number().nullable(),truncated:J.boolean()})},{name:"runJson",description:"\u540C run\uFF0C\u4F46\u8981\u6C42 exitCode=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u5426\u5219\u629B\u9519\u5E76\u6309\u7B56\u7565\u91CD\u8BD5\uFF1B\u7A7A\u8F93\u51FA\u5F52\u4E00\u4E3A {}",params:J.object({bin:J.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:J.array(J.string()).describe("argv \u6570\u7EC4"),options:J.object({cwd:J.string().optional(),input:J.string().optional(),timeoutMs:J.number().optional()}).optional()})}],permissions:[{method:"run",description:"\u5141\u8BB8\u6267\u884C\u7684\u547D\u4EE4\u767D\u540D\u5355\uFF08default-deny\uFF09\uFF1Abin + \u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\uFF1B\u672C toolkit \u5728 build \u5185\u81EA\u6301\u5F3A\u5236\uFF0C\u672A\u547D\u4E2D\u5373\u62D2\u7EDD\u3002",scopeSchema:J.array(zf)}]};var gt=[du,Au,sf,wf,kf,Rf,Cf,If,Af,jf,Vf];function $a(t=[]){let e=new Map;for(let n of gt)e.set(n.name,n);for(let n of t)e.set(n.name,n);return[...e.values()]}a($a,"composeToolkitRegistry");function jo(t){let{settings:e,tracker:n,item:r,toolkitConfig:o}=t,i=t.registry??gt,s={settings:e,tracker:n,item:r,kbContext:t.kbContext,roleContext:t.roleContext},c={approval:null},l=e.raw.toolkit_config,d=a((u,f,p)=>{if(f===void 0)return;let g=u.configSchema.safeParse(f);if(!g.success){let h=g.error.issues.map(y=>`${y.path.join(".")||"<root>"}: ${y.message}`).join("; ");throw new Error(`${p}toolkit_config.${u.name} \u6821\u9A8C\u5931\u8D25: ${h}`)}return g.data},"parseOverride");for(let u of i){let f=u.defaultConfig?u.defaultConfig(e):{},p=Ws(f,d(u,l?.[u.name],"\u9879\u76EE\u7EA7 ")),g=d(u,o?.[u.name],"");c[u.name]=u.build(Ws(p,g),s)}return c}a(jo,"createToolkit");var Ma=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 Kf(t,e){let{stepConfig:n}=e;if(!n)return t;let r=e.registry??gt,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 Ma(s)}:d[u]=f;i[s]=d}return i}a(Kf,"createScopedToolkit");import Oa from"fs";import Av from"path";import Fo from"fs";import qf from"path";import{createHash as Rv,randomBytes as Cv}from"crypto";var Cn=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??qf.join(process.cwd(),".aitable","media","dingtalk"),this.downloadTimeoutMs=e?.downloadTimeoutMs??2e4,this.imageFetcher=e?.imageFetcher??Tv}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),m.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=Iv(e),o=qf.join(this.mediaDir,`${n}.${r}`);if(Fo.existsSync(o))return o;let i;try{i=await this.imageFetcher(e,this.downloadTimeoutMs)}catch(s){return m.error("media-localizer","image download error",{url:e,error:s instanceof Error?s.message:String(s)}),null}if(!i||i.length===0)return m.warn("media-localizer","image download empty",{url:e}),null;try{Fo.mkdirSync(this.mediaDir,{recursive:!0});let s=`${o}.${Cv(4).toString("hex")}.tmp`;Fo.writeFileSync(s,i),Fo.renameSync(s,o)}catch(s){return m.error("media-localizer","image write failed",{localPath:o,error:s instanceof Error?s.message:String(s)}),null}return m.debug("media-localizer","image localized",{localPath:o}),o}};function No(t){let e=t.replace(/[^A-Za-z0-9_-]/g,"_");return e.length>128?Rv("sha1").update(t).digest("hex"):e}a(No,"safeMediaId");function Iv(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp)$/i);return n?n[1].toLowerCase():"png"}a(Iv,"extFromUrl");async function Tv(t,e){let n=new AbortController,r=setTimeout(()=>n.abort(),e);try{let o=await fetch(t,{signal:n.signal});if(!o.ok)return m.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(Tv,"defaultImageFetcher");var _v=3,Ev=480*60*1e3,Dv=/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/;function ja(t){return t instanceof Error?t.message:String(t)}a(ja,"errorMessage");function Fa(t){let e=t.quotedMessage;if(!vt(e))return{};let n=e.openMessageId??e.messageId;return typeof n!="string"||!n.trim()?{}:{quotedMessageId:n.trim()}}a(Fa,"extractQuotedMessageId");function Jf(t){let e=t.match(Dv);return e?Date.parse(`${e[1]}T${e[2]}${e[3]??""}+08:00`):Date.parse(t)}a(Jf,"parseDwsTime");function Pv(t){let e=typeof t=="string"&&t.trim()?t.trim():"";if(!e)return new Date().toISOString();let n=Jf(e);return Number.isFinite(n)?new Date(n).toISOString():new Date().toISOString()}a(Pv,"normalizeCreateTime");function $v(t){let e=Jf(t);return Number.isFinite(e)?new Date(e+Ev).toISOString().slice(0,19).replace("T"," "):t}a($v,"formatDwsQueryTime");var Mv=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),pr=class{static{a(this,"DwsMediaResolver")}bin;downloadTimeoutMs;downloadAttempts;retryDelayMs;runner;localizer;constructor(e){this.bin=e.dwsBin,this.downloadTimeoutMs=e.downloadTimeoutMs??2e4,this.downloadAttempts=Math.max(1,(e.downloadRetries??2)+1),this.retryDelayMs=Math.max(0,e.retryDelayMs??1e3),this.runner=e.runner??K,this.localizer=new Cn({...e.imageMode?{imageMode:e.imageMode}:{},...e.mediaDir?{mediaDir:e.mediaDir}:{},...e.downloadTimeoutMs!==void 0?{downloadTimeoutMs:e.downloadTimeoutMs}:{}})}get imageMode(){return this.localizer.imageMode}async resolveContent(e,n,r){let o=[];if(this.localizer.imageMode==="off")return{content:e,images:o};let i=[...e.matchAll(jv)];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=No(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 m.warn("dws-media","mediaId missing messageId, cannot download",{conversationId:r}),this.localizer.markFailed(o),null;let i=Av.join(this.localizer.dir,`${o}.png`);try{Oa.mkdirSync(this.localizer.dir,{recursive:!0})}catch(c){return m.error("dws-media","mkdir media dir failed",{error:c instanceof Error?c.message:String(c)}),this.localizer.markFailed(o),null}let s=["chat","message","download-media","--type","mediaId","--resource-id",e,"--message-id",n,"--open-conversation-id",r,"--output",i,"--format","json","-y"];for(let c=1;c<=this.downloadAttempts;c++){let l=await this.tryDownloadOnce(s,i,o,c);if(l.ref)return l.ref;if(!l.retryable)break;c<this.downloadAttempts&&await Mv(this.retryDelayMs*c)}return this.localizer.markFailed(o),null}async tryDownloadOnce(e,n,r,o){let i;try{i=await this.runner(this.bin,e,{timeoutMs:this.downloadTimeoutMs})}catch(s){return m.warn("dws-media","download-media invocation failed",{attempt:o,error:s instanceof Error?s.message:String(s)}),{retryable:!0}}if(i.exitCode!==0)return m.warn("dws-media","download-media non-zero exit",{attempt:o,exitCode:i.exitCode,stderr:i.stderr.slice(0,200)}),{retryable:!0};if(this.localizer.imageMode==="url"){let s=Ov(i.stdout);return s?{ref:this.localizer.register(r,s),retryable:!1}:(m.warn("dws-media","download-media returned no downloadUrl",{attempt:o}),{retryable:!0})}return!Oa.existsSync(n)||Oa.statSync(n).size===0?(m.warn("dws-media","download-media wrote no file",{outPath:n,attempt:o}),{retryable:!0}):{ref:this.localizer.register(r,n),retryable:!1}}},Lo=class{static{a(this,"DwsPullAdapter")}name="dws_pull";bin;timeoutMs;runner;media;failures=new vn(_v);resolveUserIds;contactResolver;constructor(e){this.bin=e.dwsBin,this.timeoutMs=e.timeoutMs??15e3,this.runner=e.runner??K,this.media=new pr({dwsBin:e.dwsBin,...e.imageMode?{imageMode:e.imageMode}:{},...e.mediaDir?{mediaDir:e.mediaDir}:{},...e.downloadTimeoutMs!==void 0?{downloadTimeoutMs:e.downloadTimeoutMs}:{},...e.runner?{runner:e.runner}:{}}),this.resolveUserIds=e.resolveUserIds??!1,this.resolveUserIds&&(this.contactResolver=To({runner:this.runner,dwsBin:this.bin}))}async fetchMessages(e,n,r){let o=["chat","message","list","--group",e,"--time",$v(n),"--limit",String(r),"--format","json"],i=a(async()=>{let l=await this.runner(this.bin,o,{timeoutMs:this.timeoutMs});if(l.exitCode!==0)throw new Error(`dws chat message list exited ${l.exitCode}: ${l.stderr.slice(0,300)}`);let d=l.stdout.trim();if(!d)return{messages:[]};let u;try{u=JSON.parse(d)}catch{throw new Error(`dws chat message list returned invalid JSON: ${d.slice(0,200)}`)}let f=this.parseMessages(u),p=Uv(u);return{messages:f,...p}},"attempt"),s;try{s=await Xt(i,{onRetry:a((d,u)=>{let f={conversationId:e,retry:u,error:ja(d)};u>=2?m.warn("message-adapter","fetch transient failure, retrying",f):m.debug("message-adapter","fetch transient failure, retrying",f)},"onRetry")});let{recovered:l}=this.failures.succeed(e);l&&m.info("message-adapter","message fetch recovered",{conversationId:e})}catch(l){let{consecutive:d,escalate:u}=this.failures.fail(e),f={conversationId:e,consecutive:d,error:ja(l)};return u?m.error("message-adapter","sustained message fetch failure \u2014 check dws identity/permission for this conversation",f):m.warn("message-adapter","message fetch failed after retries",f),{messages:[]}}let c=await this.resolveMedia(s.messages,e);return await this.resolveContacts(c),{messages:c,nextCursor:s.nextCursor,hasMore:s.hasMore}}parseMessages(e){let n=[],r=Bv(e);for(let o of r){if(!vt(o))continue;let i=Bo(zv(o)),s=Wo(i)||Wv(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:Pv(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,...Fa(o)})}return m.debug("message-adapter","parsed messages",{count:n.length}),n}async resolveMedia(e,n){if(this.media.imageMode==="off")return e;for(let r of e){if(!Wo(r.content))continue;let{content:o,images:i}=await this.media.resolveContent(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}return e}async resolveContacts(e){if(!this.resolveUserIds||!this.contactResolver)return;let n=new Map;for(let r of e){let o=r.senderOpenDingTalkId;if(!o)continue;let i=n.get(o);i||(i=this.contactResolver(o,r.senderName??r.sender),n.set(o,i));try{let s=await i;s&&(r.userId=s)}catch(s){m.warn("message-adapter","resolve contact failed",{openId:o,error:ja(s)})}}}};function vt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(vt,"isRecord");function Ov(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(!vt(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))vt(c)&&o.push(c)}return null}a(Ov,"extractDownloadUrl");var jv=/\[图片消息\]\(mediaId=([@$][A-Za-z0-9_$+/=-]+)\)|!\[(?:图片|image)\]\(([@$][A-Za-z0-9_$+/=-]+)\)/g;function Wo(t){return t?t.includes("[\u56FE\u7247\u6D88\u606F](mediaId=")||t.includes("||t.includes("||t.includes("||t.includes(":!1}a(Wo,"hasImageMarker");var Fv=/\[(语音|视频|文件)消息\]\(mediaId=[@$][A-Za-z0-9_$+/=-]+\)/g,Nv=/[ \t]*[^\n\])]{0,24}?dws chat message download-media[^\n]*/g,Lv="[\u8BED\u97F3\u6D88\u606F]";function Bo(t){if(!t)return t;let e=/\[语音消息\]\(mediaId=/.test(t),n=t.replace(Fv,(r,o)=>o==="\u8BED\u97F3"?"":`[${o}]`).replace(Nv,"");return n=n.split(`
|
|
295
|
+
`:"","utf-8")}cleanExpiredArchives(e){if(e<=0||!H.existsSync(this.rootDir))return 0;let n=Date.now()-e*24*60*60*1e3,r=0;for(let o of H.readdirSync(this.rootDir,{withFileTypes:!0})){if(!o.isDirectory())continue;let i=Ie.join(this.rootDir,o.name,"archive");if(H.existsSync(i))for(let s of H.readdirSync(i)){let c=Ie.join(i,s);H.statSync(c).mtimeMs<n&&(H.unlinkSync(c),r++)}}return r}};import it from"fs";import Ma from"path";import ot from"fs";import Ff from"path";var Nf=300*1e3;function jo(t){let e=Ff.join(t.locksDir,"compact.lock");if(ot.mkdirSync(t.locksDir,{recursive:!0}),ot.existsSync(e))try{let n=JSON.parse(ot.readFileSync(e,"utf-8"));if(Date.now()-n.timestamp<Nf)return null;ot.unlinkSync(e)}catch{try{ot.unlinkSync(e)}catch{}}try{let n=ot.openSync(e,"wx"),r={pid:process.pid,timestamp:Date.now()};ot.writeSync(n,JSON.stringify(r)),ot.closeSync(n)}catch(n){if(n instanceof Error&&"code"in n&&n.code==="EEXIST")return null;throw n}return()=>{try{ot.unlinkSync(e)}catch{}}}a(jo,"acquireLock");function $a(t){let e=Ff.join(t.locksDir,"compact.lock");if(!ot.existsSync(e))return!1;try{let n=JSON.parse(ot.readFileSync(e,"utf-8"));return!(Date.now()-n.timestamp>=Nf)}catch{return!1}}a($a,"isLocked");async function Lf(t,e,n){if(n.sourceScopes&&n.sourceScopes.length>0)return Iv(t,e,n);let r=t.ensureScopeDir(e),o=n.archive??!0,i=jo(r);if(!i)throw new Error(`scope ${Nt(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=Fo(c)}if(s.length===0)return c&&it.existsSync(c)&&it.unlinkSync(c),{entryCount:0,summary:n.summary};t.appendLongTerm(r,n.summary);let l;return o?c&&(l=t.archiveProcessing(r,c)):c&&it.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(Lf,"compactScope");async function Iv(t,e,n){let r=t.ensureScopeDir(e),o=n.archive??!0,i=n.checkpoint??!0,s=n.sourceScopes??[],c=[],l=[],d=[],u=jo(r);if(!u)throw new Error(`scope ${Nt(e)} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);d.push(u);try{let f=s.map(g=>({scope:g,hash:Nt(g),paths:t.ensureScopeDir(g)})).sort((g,h)=>g.hash.localeCompare(h.hash));for(let g of f){if(g.hash===Nt(e))continue;let h=jo(g.paths);if(!h)throw new Error(`source scope ${g.hash} \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7`);d.push(h)}for(let g of f)if(i){let h=t.extractToProcessing(g.paths,n.query);if(!h)continue;let y=Fo(h);c.push(...y),l.push({paths:g.paths,file:h})}else c.push(...t.queryShortTerm(g.paths,n.query));if(c.length===0)return{entryCount:0,summary:n.summary,archivePaths:[]};t.appendLongTerm(r,n.summary);let p=[];for(let g of l)if(o){let h=t.archiveProcessing(g.paths,g.file);h&&p.push(h)}else it.existsSync(g.file)&&t.rollbackFromProcessing(g.paths,g.file);return{entryCount:c.length,summary:n.summary,archivePaths:p,archivePath:p[0]}}catch(f){for(let p of l)it.existsSync(p.file)&&t.rollbackFromProcessing(p.paths,p.file);throw f}finally{for(let f of d.reverse())f()}}a(Iv,"compactFromSources");async function Wf(t,e){let n=[],r=0;if(e){let o=t.pathsFor(e);if($a(o))return m.debug("memory","scope \u6B63\u5728\u88AB compact\uFF0C\u8DF3\u8FC7 recover",{scopeHash:Nt(e)}),{recoveredScopes:0,recoveredEntries:0,details:[]};let i=Tv(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($a(s))continue;let c=Fo(i.processingFile);for(let l of c)t.appendShortTerm(s,l);try{it.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(Wf,"recoverOrphans");function Fo(t){if(!it.existsSync(t))return[];let n=it.readFileSync(t,"utf-8").split(`
|
|
296
|
+
`).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(Fo,"readEntriesFromFile");function Tv(t,e){if(!it.existsSync(e.processingDir))return{scopeHash:Ma.basename(e.dir),entries:0,action:"restored"};let n=0;for(let r of it.readdirSync(e.processingDir)){if(!r.endsWith(".jsonl"))continue;let o=Ma.join(e.processingDir,r),i=Fo(o);for(let s of i)t.appendShortTerm(e,s);n+=i.length;try{it.unlinkSync(o)}catch{}}return{scopeHash:Ma.basename(e.dir),entries:n,action:"restored"}}a(Tv,"recoverScopeProcessing");var dn=F.object({tenantId:F.string().optional(),baseId:F.string().optional(),channel:F.string(),groupId:F.string().optional(),conversationId:F.string().optional(),roleId:F.string().optional(),scenario:F.string()}),_v=F.object({root_dir:F.string().optional(),default_scope:dn.optional(),retention_days:F.number().optional()}).strict();function Av(t,e){let n=e?.root_dir??"./.memory";return{rootDir:Bf.isAbsolute(n)?n:Bf.resolve(t.configDir,n),defaultScope:e?.default_scope,retentionDays:e?.retention_days??30}}a(Av,"resolveConfig");function Ev(t){let e=new Oo(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 Lf(e,i,o)},async recover(r){return Wf(e,r!==void 0?r:void 0)}}}a(Ev,"createMemoryToolkit");var zf={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:_v,defaultConfig(t){return{root_dir:"./.memory",retention_days:30}},build(t,e){let n=Av(e.settings,t);return Ev(n)},methods:[{name:"append",description:"\u8FFD\u52A0\u4E00\u6761\u77ED\u671F\u8BB0\u5FC6",params:F.object({scope:F.union([F.string(),dn]).describe("\u8BB0\u5FC6\u8303\u56F4"),entry:F.object({id:F.string().optional(),timestamp:F.string().describe("ISO 8601 \u65F6\u95F4\u6233"),kind:F.string().describe("\u4E1A\u52A1\u81EA\u5B9A\u4E49\u7C7B\u578B"),content:F.string(),summary:F.string().optional(),meta:F.record(F.string(),F.unknown()).optional()})})},{name:"readShortTerm",description:"\u8BFB\u53D6\u77ED\u671F\u8BB0\u5FC6\uFF08\u53EF\u6309\u65F6\u95F4/kind/limit \u8FC7\u6EE4\uFF09",params:F.object({scope:F.union([F.string(),dn]),query:F.object({since:F.string().optional(),until:F.string().optional(),kinds:F.array(F.string()).optional(),limit:F.number().optional()}).optional()}),output:F.array(F.object({timestamp:F.string(),kind:F.string(),content:F.string()}))},{name:"readLongTerm",description:"\u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6 long-term.md",params:F.object({scope:F.union([F.string(),dn])}),output:F.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:F.object({scope:F.union([F.string(),dn]),options:F.object({summary:F.string().describe("\u9884\u8BA1\u7B97\u7684\u6458\u8981\u6587\u672C"),entries:F.array(F.object({timestamp:F.string(),kind:F.string(),content:F.string()})).optional(),sourceScopes:F.array(F.union([F.string(),dn])).optional(),query:F.object({since:F.string().optional(),until:F.string().optional(),kinds:F.array(F.string()).optional(),limit:F.number().optional()}).optional(),checkpoint:F.boolean().optional(),archive:F.boolean().optional(),clearShortTerm:F.boolean().optional()})})},{name:"recover",description:"\u6062\u590D\u5B64\u513F processing \u6587\u4EF6",params:F.object({scope:F.union([F.string(),dn]).optional()})}]};import{z as J}from"zod";var Kf=3e4,qf=5*1024*1024,Hf=3,Jf=J.object({bin:J.string().describe("\u5141\u8BB8\u6267\u884C\u7684\u53EF\u6267\u884C\u6587\u4EF6\u540D\uFF08\u4E0D\u542B\u8DEF\u5F84\uFF1B\u8DEF\u5F84\u89E3\u6790\u89C1 bins\uFF09"),args_prefix:J.array(J.string()).optional().describe("\u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\u767D\u540D\u5355\uFF1A\u5B9E\u9645 argv \u5FC5\u987B\u4EE5\u8BE5\u5E8F\u5217\u5F00\u5934\uFF0C\u7528\u4E8E\u628A\u6388\u6743\u6536\u7A84\u5230\u67D0\u4E2A\u5B50\u547D\u4EE4\u65CF")}),Dv=J.object({allow:J.array(Jf).optional().describe("default-deny \u547D\u4EE4\u767D\u540D\u5355\uFF1B\u672A\u5217\u51FA\u7684 bin/\u5B50\u547D\u4EE4\u524D\u7F00\u4E00\u5F8B\u62D2\u7EDD\u3002\u7F3A\u7701=\u5168\u90E8\u62D2\u7EDD"),timeout_ms:J.number().optional().describe("\u5355\u6B21\u6267\u884C\u8D85\u65F6\uFF0C\u7F3A\u7701 30000"),max_output_bytes:J.number().optional().describe("\u6355\u83B7\u8F93\u51FA\u4E0A\u9650\uFF08\u5B57\u8282\uFF09\uFF0C\u7F3A\u7701 5242880"),retry:J.object({max_attempts:J.number().optional()}).optional().describe("\u91CD\u8BD5\u7B56\u7565\uFF1Bmax_attempts \u542B\u9996\u6B21\u5C1D\u8BD5\uFF0C\u7F3A\u7701 3"),bins:J.record(J.string(),J.string()).optional().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D \u2192 \u7EDD\u5BF9\u8DEF\u5F84\u8986\u76D6\uFF08\u5982 dws \u88AB\u5BBF\u4E3B PATH \u906E\u853D\u65F6\u663E\u5F0F\u6307\u5B9A\uFF09")}).strict(),No=class extends De{static{a(this,"ShellNotAllowedError")}constructor(e){super(`shell: \u547D\u4EE4\u672A\u6388\u6743\u300C${e}\u300D\uFF08toolkit_config.shell.allow \u672A\u5217\u51FA\u8BE5 bin/\u5B50\u547D\u4EE4\u524D\u7F00\uFF09`,{retryable:!1,code:"SHELL_NOT_ALLOWED"}),this.name="ShellNotAllowedError"}};function Pv(t,e,n){return t.some(r=>{if(r.bin!==e)return!1;let o=r.args_prefix;return!o||o.length===0?!0:n.length<o.length?!1:o.every((i,s)=>n[s]===i)})}a(Pv,"isAllowed");function Oa(t,e){if(e.length===0)return t;let n=new Set(e);return t.map(r=>n.has(r)?"***":r)}a(Oa,"redactArgs");function Uf(t){return t?.code==="ENOENT"}a(Uf,"isEnoent");function $v(t,e){if(e!==void 0)try{return xe(t,e)}catch(n){throw n instanceof ne?new De(`shell: cwd\u300C${e}\u300D\u8D8A\u51FA\u5B9E\u4F8B\u6839\u76EE\u5F55`,{retryable:!1,code:"SHELL_CWD_ESCAPE"}):n}}a($v,"resolveCwd");function Vf(t,e){let n=Buffer.from(t,"utf8");return n.byteLength<=e?{text:t,truncated:!1}:{text:n.subarray(0,e).toString("utf8"),truncated:!0}}a(Vf,"truncateBytes");function ja(t){let{allow:e,bins:n,configDir:r,secrets:o,runner:i}=t;async function s(l,d,u){let f=n[l]??l,p=$v(r,u?.cwd);return i(f,d,{cwd:p,input:u?.input,timeoutMs:u?.timeoutMs??t.timeoutMs,maxOutputBytes:u?.maxOutputBytes??t.maxOutputBytes})}a(s,"attempt");function c(l,d,u){if(!Pv(e,l,d))throw new No(l);m.debug("shell","exec",{bin:l,argv:Oa(d,o),cwd:u})}return a(c,"authorizeAndAudit"),{async run(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=u?.maxOutputBytes??t.maxOutputBytes,g=Date.now(),h=0,y=await tn(async()=>(h++,s(l,d,u)),{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(R=>!Uf(R)),onRetry:a((R,S)=>m.debug("shell","run retry",{bin:l,retry:S,error:String(R)}),"onRetry")}),w=Vf(y.stdout,p),b=Vf(y.stderr,p),v=!!(y.truncated||w.truncated||b.truncated);return m.info("shell","run done",{bin:l,argv:Oa(d,o),exitCode:y.exitCode,durationMs:Date.now()-g,attempts:h,truncated:v}),{stdout:w.text,stderr:b.text,exitCode:y.exitCode,truncated:v}},async runJson(l,d,u){c(l,d,u?.cwd);let f=u?.retry?.maxAttempts??t.maxAttempts,p=Date.now(),g=0,h=await tn(async()=>{g++;let y=await s(l,d,u);if(y.exitCode!==0)throw new De(`shell: \u547D\u4EE4\u975E\u96F6\u9000\u51FA (${y.exitCode})\uFF1A${y.stderr.slice(0,300)}`,{retryable:!0,code:"SHELL_NONZERO_EXIT"});let w=y.stdout.trim();if(w!=="")try{return JSON.parse(w)}catch{throw new De("shell: \u547D\u4EE4\u672A\u8FD4\u56DE\u5408\u6CD5 JSON",{retryable:!0,code:"SHELL_BAD_JSON"})}},{retries:Math.max(0,f-1),shouldRetry:u?.retry?.shouldRetry??(y=>!Uf(y)),onRetry:a((y,w)=>m.debug("shell","runJson retry",{bin:l,retry:w,error:String(y)}),"onRetry")});return m.info("shell","runJson done",{bin:l,argv:Oa(d,o),durationMs:Date.now()-p,attempts:g}),h}}}a(ja,"createShellToolkitFromConfig");function Mv(t,e){let n=t.raw?.toolkit_config?.shell??{};return ja(Gf(t,{...n,allow:[{bin:e}]}))}a(Mv,"createExecShellToolkit");function Ov(t,e){return ja({allow:[{bin:t}],timeoutMs:Kf,maxOutputBytes:qf,maxAttempts:Hf,bins:{},configDir:e?.configDir??process.cwd(),secrets:[],runner:K})}a(Ov,"createStandaloneExecShellToolkit");function Gf(t,e){let n=Object.values(t.envSource??{}).filter(r=>typeof r=="string"&&r.length>0);return{allow:e?.allow??[],timeoutMs:e?.timeout_ms??Kf,maxOutputBytes:e?.max_output_bytes??qf,maxAttempts:e?.retry?.max_attempts??Hf,bins:e?.bins??{},configDir:t.configDir,secrets:n,runner:K}}a(Gf,"resolveConfig");var Zf={name:"shell",description:"\u539F\u5B50\u5316\u547D\u4EE4\u6267\u884C\uFF08dws/git \u7B49 CLI \u7684\u901A\u7528\u9003\u751F\u8231\uFF09\uFF1A\u65E0 shell \u89E3\u91CA\u3001default-deny \u767D\u540D\u5355\u3001\u7EDF\u4E00\u91CD\u8BD5/\u8D85\u65F6/JSON \u89E3\u6790/\u8F93\u51FA\u622A\u65AD/\u5BA1\u8BA1\u8131\u654F\u3002",configSchema:Dv,build(t,e){return ja(Gf(e.settings,t))},methods:[{name:"run",description:"\u6267\u884C\u5355\u4E2A\u53EF\u6267\u884C\u6587\u4EF6\uFF08argv \u6570\u7EC4\uFF0C\u65E0 shell \u89E3\u91CA\uFF09\uFF1B\u975E\u96F6\u9000\u51FA\u4E0D\u629B\u9519\uFF0C\u9000\u51FA\u7801\u539F\u6837\u8FD4\u56DE",params:J.object({bin:J.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:J.array(J.string()).describe("argv \u6570\u7EC4"),options:J.object({cwd:J.string().optional(),input:J.string().optional(),timeoutMs:J.number().optional(),maxOutputBytes:J.number().optional()}).optional()}),output:J.object({stdout:J.string(),stderr:J.string(),exitCode:J.number().nullable(),truncated:J.boolean()})},{name:"runJson",description:"\u540C run\uFF0C\u4F46\u8981\u6C42 exitCode=0 \u4E14 stdout \u4E3A\u5408\u6CD5 JSON\uFF0C\u5426\u5219\u629B\u9519\u5E76\u6309\u7B56\u7565\u91CD\u8BD5\uFF1B\u7A7A\u8F93\u51FA\u5F52\u4E00\u4E3A {}",params:J.object({bin:J.string().describe("\u53EF\u6267\u884C\u6587\u4EF6\u540D"),args:J.array(J.string()).describe("argv \u6570\u7EC4"),options:J.object({cwd:J.string().optional(),input:J.string().optional(),timeoutMs:J.number().optional()}).optional()})}],permissions:[{method:"run",description:"\u5141\u8BB8\u6267\u884C\u7684\u547D\u4EE4\u767D\u540D\u5355\uFF08default-deny\uFF09\uFF1Abin + \u53EF\u9009\u5B50\u547D\u4EE4\u524D\u7F00\uFF1B\u672C toolkit \u5728 build \u5185\u81EA\u6301\u5F3A\u5236\uFF0C\u672A\u547D\u4E2D\u5373\u62D2\u7EDD\u3002",scopeSchema:J.array(Jf)}]};var gt=[hu,Mu,ff,Rf,If,Ef,Df,Pf,Mf,zf,Zf];function Fa(t=[]){let e=new Map;for(let n of gt)e.set(n.name,n);for(let n of t)e.set(n.name,n);return[...e.values()]}a(Fa,"composeToolkitRegistry");function Lo(t){let{settings:e,tracker:n,item:r,toolkitConfig:o}=t,i=t.registry??gt,s={settings:e,tracker:n,item:r,kbContext:t.kbContext,roleContext:t.roleContext},c={approval:null},l=e.raw.toolkit_config,d=a((u,f,p)=>{if(f===void 0)return;let g=u.configSchema.safeParse(f);if(!g.success){let h=g.error.issues.map(y=>`${y.path.join(".")||"<root>"}: ${y.message}`).join("; ");throw new Error(`${p}toolkit_config.${u.name} \u6821\u9A8C\u5931\u8D25: ${h}`)}return g.data},"parseOverride");for(let u of i){let f=u.defaultConfig?u.defaultConfig(e):{},p=Ks(f,d(u,l?.[u.name],"\u9879\u76EE\u7EA7 ")),g=d(u,o?.[u.name],"");c[u.name]=u.build(Ks(p,g),s)}return c}a(Lo,"createToolkit");var Na=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 Yf(t,e){let{stepConfig:n}=e;if(!n)return t;let r=e.registry??gt,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 Na(s)}:d[u]=f;i[s]=d}return i}a(Yf,"createScopedToolkit");import Wa from"path";import{existsSync as jv}from"fs";import Xf from"os";import Qf from"path";function La(t=Xf.homedir(),e=process.platform){let n=e==="win32"?["dws.cmd","dws.exe","dws"]:["dws"],r=e==="win32"?Qf.win32.join:Qf.posix.join;return n.map(o=>r(t,".local","bin",o))}a(La,"dwsBinFallbackCandidates");function mr(t,e=Xf.homedir()){return t("dws")?"dws":La(e).find(n=>jv(n)&&t(n))??"dws"}a(mr,"resolveDwsBin");var Fv="cn-wulanchabu.log.aliyuncs.com",Nv="lippi-notable-extension-log",tp="aitable-workflow-cli",Lv=`https://${Nv}.${Fv}/logstores/${tp}/track`,Wv=3e3,Bv=5e3,np="unknown",Ba,ep=null;function zv(t){np=t.version}a(zv,"initSlsReport");function Uv(t){Ba=sp(t)}a(Uv,"setReportProject");function rp(t=process.env){let e=t.AITABLE_WORKFLOW_SLS_REPORT?.trim().toLowerCase();return e==="off"||e==="0"||e==="false"}a(rp,"isSlsReportDisabled");function Lt(t){return typeof t=="string"&&t.trim()?t:void 0}a(Lt,"pickString");function Vv(t){if(!t||typeof t!="object")return null;let e=t,n=[e];e.data&&typeof e.data=="object"&&n.push(e.data);for(let r of n){let o={userId:Lt(r.user_id)??Lt(r.userId),corpId:Lt(r.corp_id)??Lt(r.corpId),userName:Lt(r.user_name)??Lt(r.userName),corpName:Lt(r.corp_name)??Lt(r.corpName)};if(o.userId||o.corpId||o.userName||o.corpName)return o}return null}a(Vv,"extractIdentity");function op(t){let e=t.trim();if(!e)return{};for(let n of[e,...e.split(/\r?\n/).reverse()])try{let r=Vv(JSON.parse(n));if(r)return r}catch{}return{}}a(op,"parseDwsAuthIdentity");function ip(t){return/v?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/.exec(t)?.[1]}a(ip,"parseDwsVersionOutput");function sp(t){return Wa.basename(Wa.dirname(Wa.resolve(t)))}a(sp,"resolveReportProject");async function Kv(t){try{let e=t.prober??(c=>Xt(c,["--version"],{timeoutMs:3e3})),n,r=t.dwsBin??mr(c=>{let l=e(c);return l.ok&&(n=ip(`${l.stdout}
|
|
297
|
+
${l.stderr}`)),l.ok}),i=await(t.runner??((c,l)=>Us(c,l,{timeoutMs:Bv})))(r,["auth","status","--format","json"]),s=op(`${i.stdout}
|
|
298
|
+
${i.stderr}`);return!s.userId&&!s.corpId&&m.debug("cli","SLS \u672A\u4ECE dws auth status \u89E3\u6790\u5230\u8EAB\u4EFD",{bin:r,dwsVersion:n,exitCode:i.exitCode,stdout:i.stdout.slice(0,2e3),stderr:i.stderr.slice(0,2e3)}),{identity:s,dwsVersion:n}}catch(e){return m.debug("cli","SLS dws \u73AF\u5883\u63A2\u6D4B\u5931\u8D25",{error:e instanceof Error?e.message:String(e)}),{identity:{}}}}a(Kv,"probeEnvironment");function qv(t){return ep??=Kv(t),ep}a(qv,"resolveEnvironment");function Hv(t){let e=Object.entries(t).filter(([,n])=>n!==void 0).map(([n,r])=>[n,r instanceof Error?r.message:r]);return e.length?JSON.stringify(Object.fromEntries(e)):void 0}a(Hv,"serializeTrackData");function Jv(t=process.platform){return t==="darwin"?"mac":t==="win32"?"windows":t==="linux"?"linux":t}a(Jv,"normalizePlatform");function Gv(t,e,n,r={}){let o={cat:"cli-track",event:t,ts:X(r.now?.()??new Date),env:ir(r.env),version:np,platform:Jv(),nodeVersion:process.version},{identity:i}=n;i.userId&&(o.uid=i.userId),i.corpId&&(o.corpId=i.corpId),n.dwsVersion&&(o.dwsVersion=n.dwsVersion),Ba&&(o.project=Ba);let s=Hv(e??{});return s&&(o.data=s),o}a(Gv,"buildTrackPayload");async function za(t,e,n={}){let r=n.env??process.env;if(rp(r))return;let o=n.fetchFn??(typeof fetch=="function"?fetch:void 0);if(o)try{let i=await qv(n),s=Gv(t,e,i,n),c=await o(Lv,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({__source__:tp,__logs__:[s]}),signal:AbortSignal.timeout(Wv)});c.ok||m.debug("cli","SLS \u4E0A\u62A5\u8FD4\u56DE\u975E 2xx\uFF08\u5DF2\u5FFD\u7565\uFF09",{status:c.status,event:t})}catch(i){m.debug("cli","SLS \u4E0A\u62A5\u5931\u8D25\uFF08\u5DF2\u5FFD\u7565\uFF09",{event:t,error:i instanceof Error?i.message:String(i)})}}a(za,"reportCliEvent");import Ua from"fs";import eS from"path";import Wo from"fs";import ap from"path";import{createHash as Zv,randomBytes as Yv}from"crypto";var Tn=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??ap.join(process.cwd(),".aitable","media","dingtalk"),this.downloadTimeoutMs=e?.downloadTimeoutMs??2e4,this.imageFetcher=e?.imageFetcher??Xv}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),m.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=Qv(e),o=ap.join(this.mediaDir,`${n}.${r}`);if(Wo.existsSync(o))return o;let i;try{i=await this.imageFetcher(e,this.downloadTimeoutMs)}catch(s){return m.error("media-localizer","image download error",{url:e,error:s instanceof Error?s.message:String(s)}),null}if(!i||i.length===0)return m.warn("media-localizer","image download empty",{url:e}),null;try{Wo.mkdirSync(this.mediaDir,{recursive:!0});let s=`${o}.${Yv(4).toString("hex")}.tmp`;Wo.writeFileSync(s,i),Wo.renameSync(s,o)}catch(s){return m.error("media-localizer","image write failed",{localPath:o,error:s instanceof Error?s.message:String(s)}),null}return m.debug("media-localizer","image localized",{localPath:o}),o}};function Bo(t){let e=t.replace(/[^A-Za-z0-9_-]/g,"_");return e.length>128?Zv("sha1").update(t).digest("hex"):e}a(Bo,"safeMediaId");function Qv(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp)$/i);return n?n[1].toLowerCase():"png"}a(Qv,"extFromUrl");async function Xv(t,e){let n=new AbortController,r=setTimeout(()=>n.abort(),e);try{let o=await fetch(t,{signal:n.signal});if(!o.ok)return m.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(Xv,"defaultImageFetcher");var tS=3,nS=480*60*1e3,rS=/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/;function Va(t){return t instanceof Error?t.message:String(t)}a(Va,"errorMessage");function Ka(t){let e=t.quotedMessage;if(!vt(e))return{};let n=e.openMessageId??e.messageId;return typeof n!="string"||!n.trim()?{}:{quotedMessageId:n.trim()}}a(Ka,"extractQuotedMessageId");function lp(t){let e=t.match(rS);return e?Date.parse(`${e[1]}T${e[2]}${e[3]??""}+08:00`):Date.parse(t)}a(lp,"parseDwsTime");function oS(t){let e=typeof t=="string"&&t.trim()?t.trim():"";if(!e)return new Date().toISOString();let n=lp(e);return Number.isFinite(n)?new Date(n).toISOString():new Date().toISOString()}a(oS,"normalizeCreateTime");function iS(t){let e=lp(t);return Number.isFinite(e)?new Date(e+nS).toISOString().slice(0,19).replace("T"," "):t}a(iS,"formatDwsQueryTime");var sS=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),hr=class{static{a(this,"DwsMediaResolver")}bin;downloadTimeoutMs;downloadAttempts;retryDelayMs;runner;localizer;constructor(e){this.bin=e.dwsBin,this.downloadTimeoutMs=e.downloadTimeoutMs??2e4,this.downloadAttempts=Math.max(1,(e.downloadRetries??2)+1),this.retryDelayMs=Math.max(0,e.retryDelayMs??1e3),this.runner=e.runner??K,this.localizer=new Tn({...e.imageMode?{imageMode:e.imageMode}:{},...e.mediaDir?{mediaDir:e.mediaDir}:{},...e.downloadTimeoutMs!==void 0?{downloadTimeoutMs:e.downloadTimeoutMs}:{}})}get imageMode(){return this.localizer.imageMode}async resolveContent(e,n,r){let o=[];if(this.localizer.imageMode==="off")return{content:e,images:o};let i=[...e.matchAll(cS)];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=Bo(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 m.warn("dws-media","mediaId missing messageId, cannot download",{conversationId:r}),this.localizer.markFailed(o),null;let i=eS.join(this.localizer.dir,`${o}.png`);try{Ua.mkdirSync(this.localizer.dir,{recursive:!0})}catch(c){return m.error("dws-media","mkdir media dir failed",{error:c instanceof Error?c.message:String(c)}),this.localizer.markFailed(o),null}let s=["chat","message","download-media","--type","mediaId","--resource-id",e,"--message-id",n,"--open-conversation-id",r,"--output",i,"--format","json","-y"];for(let c=1;c<=this.downloadAttempts;c++){let l=await this.tryDownloadOnce(s,i,o,c);if(l.ref)return l.ref;if(!l.retryable)break;c<this.downloadAttempts&&await sS(this.retryDelayMs*c)}return this.localizer.markFailed(o),null}async tryDownloadOnce(e,n,r,o){let i;try{i=await this.runner(this.bin,e,{timeoutMs:this.downloadTimeoutMs})}catch(s){return m.warn("dws-media","download-media invocation failed",{attempt:o,error:s instanceof Error?s.message:String(s)}),{retryable:!0}}if(i.exitCode!==0)return m.warn("dws-media","download-media non-zero exit",{attempt:o,exitCode:i.exitCode,stderr:i.stderr.slice(0,200)}),{retryable:!0};if(this.localizer.imageMode==="url"){let s=aS(i.stdout);return s?{ref:this.localizer.register(r,s),retryable:!1}:(m.warn("dws-media","download-media returned no downloadUrl",{attempt:o}),{retryable:!0})}return!Ua.existsSync(n)||Ua.statSync(n).size===0?(m.warn("dws-media","download-media wrote no file",{outPath:n,attempt:o}),{retryable:!0}):{ref:this.localizer.register(r,n),retryable:!1}}},zo=class{static{a(this,"DwsPullAdapter")}name="dws_pull";bin;timeoutMs;runner;media;failures=new xn(tS);resolveUserIds;contactResolver;constructor(e){this.bin=e.dwsBin,this.timeoutMs=e.timeoutMs??15e3,this.runner=e.runner??K,this.media=new hr({dwsBin:e.dwsBin,...e.imageMode?{imageMode:e.imageMode}:{},...e.mediaDir?{mediaDir:e.mediaDir}:{},...e.downloadTimeoutMs!==void 0?{downloadTimeoutMs:e.downloadTimeoutMs}:{},...e.runner?{runner:e.runner}:{}}),this.resolveUserIds=e.resolveUserIds??!1,this.resolveUserIds&&(this.contactResolver=Eo({runner:this.runner,dwsBin:this.bin}))}async fetchMessages(e,n,r){let o=["chat","message","list","--group",e,"--time",iS(n),"--limit",String(r),"--format","json"],i=a(async()=>{let l=await this.runner(this.bin,o,{timeoutMs:this.timeoutMs});if(l.exitCode!==0)throw new Error(`dws chat message list exited ${l.exitCode}: ${l.stderr.slice(0,300)}`);let d=l.stdout.trim();if(!d)return{messages:[]};let u;try{u=JSON.parse(d)}catch{throw new Error(`dws chat message list returned invalid JSON: ${d.slice(0,200)}`)}let f=this.parseMessages(u),p=mS(u);return{messages:f,...p}},"attempt"),s;try{s=await tn(i,{onRetry:a((d,u)=>{let f={conversationId:e,retry:u,error:Va(d)};u>=2?m.warn("message-adapter","fetch transient failure, retrying",f):m.debug("message-adapter","fetch transient failure, retrying",f)},"onRetry")});let{recovered:l}=this.failures.succeed(e);l&&m.info("message-adapter","message fetch recovered",{conversationId:e})}catch(l){let{consecutive:d,escalate:u}=this.failures.fail(e),f={conversationId:e,consecutive:d,error:Va(l)};return u?m.error("message-adapter","sustained message fetch failure \u2014 check dws identity/permission for this conversation",f):m.warn("message-adapter","message fetch failed after retries",f),{messages:[]}}let c=await this.resolveMedia(s.messages,e);return await this.resolveContacts(c),{messages:c,nextCursor:s.nextCursor,hasMore:s.hasMore}}parseMessages(e){let n=[],r=pS(e);for(let o of r){if(!vt(o))continue;let i=Vo(gS(o)),s=Uo(i)||fS(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:oS(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,...Ka(o)})}return m.debug("message-adapter","parsed messages",{count:n.length}),n}async resolveMedia(e,n){if(this.media.imageMode==="off")return e;for(let r of e){if(!Uo(r.content))continue;let{content:o,images:i}=await this.media.resolveContent(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}return e}async resolveContacts(e){if(!this.resolveUserIds||!this.contactResolver)return;let n=new Map;for(let r of e){let o=r.senderOpenDingTalkId;if(!o)continue;let i=n.get(o);i||(i=this.contactResolver(o,r.senderName??r.sender),n.set(o,i));try{let s=await i;s&&(r.userId=s)}catch(s){m.warn("message-adapter","resolve contact failed",{openId:o,error:Va(s)})}}}};function vt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(vt,"isRecord");function aS(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(!vt(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))vt(c)&&o.push(c)}return null}a(aS,"extractDownloadUrl");var cS=/\[图片消息\]\(mediaId=([@$][A-Za-z0-9_$+/=-]+)\)|!\[(?:图片|image)\]\(([@$][A-Za-z0-9_$+/=-]+)\)/g;function Uo(t){return t?t.includes("[\u56FE\u7247\u6D88\u606F](mediaId=")||t.includes("||t.includes("||t.includes("||t.includes(":!1}a(Uo,"hasImageMarker");var lS=/\[(语音|视频|文件)消息\]\(mediaId=[@$][A-Za-z0-9_$+/=-]+\)/g,dS=/[ \t]*[^\n\])]{0,24}?dws chat message download-media[^\n]*/g,uS="[\u8BED\u97F3\u6D88\u606F]";function Vo(t){if(!t)return t;let e=/\[语音消息\]\(mediaId=/.test(t),n=t.replace(lS,(r,o)=>o==="\u8BED\u97F3"?"":`[${o}]`).replace(dS,"");return n=n.split(`
|
|
297
299
|
`).map(r=>r.trim()).filter(Boolean).join(`
|
|
298
|
-
`).trim(),n.includes("download-media")&&m.warn("message-adapter","dws \u5A92\u4F53\u63D0\u793A\u672A\u80FD\u5B8C\u5168\u5265\u79BB\uFF0C\u683C\u5F0F\u53EF\u80FD\u5DF2\u53D8\u66F4",{sample:n.slice(0,120)}),!n&&e?
|
|
299
|
-
`),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString()},i=n.flatMap(s=>s.images??[]);return i.length>0&&(o.images=i),r&&(o.sender=r.id,o.senderName=r.name??r.id,r.openDingTalkId&&(o.senderOpenDingTalkId=r.openDingTalkId),r.userId&&(o.senderUserId=r.userId)),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}sortByCreateTimeAsc(e){return e.map((n,r)=>({msg:n,idx:r,ms:Date.parse(n.createTime)})).sort((n,r)=>{let o=Number.isNaN(n.ms)?-1/0:n.ms,i=Number.isNaN(r.ms)?-1/0:r.ms;return o===i?n.idx-r.idx:o-i}).map(n=>n.msg)}dedup(e){let n=[];for(let r of e){let o=r.messageId??`${r.sender}:${r.createTime}:${r.content.slice(0,50)}`;this.seenIds.has(o)||(this.seenIds.add(o),n.push(r))}if(this.seenIds.size>5e3){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-3e3))this.seenIds.add(o)}return n}filterBySender(e){let n=e;if(this.config.watchSenders&&this.config.watchSenders.length>0){let r=new Set(this.config.watchSenders);n=n.filter(o=>r.has(o.sender)||o.senderName!=null&&r.has(o.senderName))}if(this.config.ignoreSenders&&this.config.ignoreSenders.length>0){let r=new Set(this.config.ignoreSenders);n=n.filter(o=>!r.has(o.sender)&&!(o.senderName!=null&&r.has(o.senderName)))}return n}parseConfig(e){return{conversationIds:e.conversation_ids??e.conversationIds,sourceAdapter:e.source_adapter??e.sourceAdapter??"dws_pull",dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchSenders:Array.isArray(e.watch_senders)?e.watch_senders.map(String):Array.isArray(e.watchSenders)?e.watchSenders.map(String):void 0,ignoreSenders:Array.isArray(e.ignore_senders)?e.ignore_senders.map(String):Array.isArray(e.ignoreSenders)?e.ignoreSenders.map(String):void 0,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0,downloadTimeoutMs:typeof e.download_timeout_ms=="number"?e.download_timeout_ms:typeof e.downloadTimeoutMs=="number"?e.downloadTimeoutMs:void 0,resolveUserIds:typeof e.resolve_user_ids=="boolean"?e.resolve_user_ids:typeof e.resolveUserIds=="boolean"?e.resolveUserIds:void 0}}};function
|
|
300
|
-
`),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString(),source:"user_message",...o?{conversationTitle:o}:{}};return r&&(i.sender=r.id,i.senderName=r.name??r.id,r.openDingTalkId&&(i.senderOpenDingTalkId=r.openDingTalkId)),{type:"message_received",payload:i,timestamp:new Date().toISOString(),itemId:null}}extractContent(e){for(let n of["text","content","body","markdown"]){let r=e[n];if(typeof r=="string"&&r.trim())return Bo(r.trim())}if(e.content&&typeof e.content=="object"){let n=e.content;for(let r of["text","content","markdown"]){let o=n[r];if(typeof o=="string"&&o.trim())return Bo(o.trim())}}return null}normalizeCreateTime(e){let n=typeof e=="string"&&e.trim()?e.trim():"";if(!n)return new Date().toISOString();let r=n.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/);if(r){let i=Date.parse(`${r[1]}T${r[2]}${r[3]??""}+08:00`);return Number.isFinite(i)?new Date(i).toISOString():new Date().toISOString()}let o=Date.parse(n);return Number.isFinite(o)?new Date(o).toISOString():new Date().toISOString()}formatWallClock(e){return new Date(e.getTime()+288e5).toISOString().slice(0,19).replace("T"," ")}parseConfig(e){let n=e.filters&&typeof e.filters=="object"?e.filters:{};return{conversationIds:e.conversation_ids??e.conversationIds??n.conversation_ids??n.conversationIds,excludeAtBot:typeof e.exclude_at_bot=="boolean"?e.exclude_at_bot:typeof e.excludeAtBot=="boolean"?e.excludeAtBot:typeof n.exclude_at_bot=="boolean"?n.exclude_at_bot:typeof n.excludeAtBot=="boolean"?n.excludeAtBot:void 0,conversationTypes:Array.isArray(e.conversation_types)?e.conversation_types.map(String):Array.isArray(e.conversationTypes)?e.conversationTypes.map(String):Array.isArray(n.conversation_types)?n.conversation_types.map(String):Array.isArray(n.conversationTypes)?n.conversationTypes.map(String):void 0,dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,pageSize:typeof e.page_size=="number"?e.page_size:typeof e.pageSize=="number"?e.pageSize:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0}}};import La from"path";var Gf=1e4,qv=100,Hv=600*1e3,Zf=2e3,Jv=1e3,Gv=3e4,Zv=5e3,Yv="1",Yf="__inline__",Uo=class{static{a(this,"DingTalkStreamSource")}name;config;running=!1;onEvent=null;connections=new Map;seenMsgIds=new Map;dropDirectWarned=!1;localizer;injectedDownloader;globalVars;configScope;unsubscribes=[];healthCheckTimer=null;constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.globalVars=n?.globalVars,this.configScope=n?.configScope;let r=typeof e.config.configDir=="string"?e.config.configDir:process.cwd(),o=this.config.mediaDir?La.isAbsolute(this.config.mediaDir)?this.config.mediaDir:La.resolve(r,this.config.mediaDir):La.join(r,".aitable","media","dingtalk");this.localizer=new Cn({...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 kt({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&&(m.info("dingtalk-stream-source","starting (inline)",{name:this.name,clientId:eS(this.config.clientId),...this.config.endpoint?{endpoint:this.config.endpoint}:{}}),this.connectRobot(Yf,this.config.clientId,this.config.clientSecret)),this.config.robotRefs!==void 0){m.info("dingtalk-stream-source","starting (dynamic)",{name:this.name}),this.reconcile();for(let n of[this.config.robotRefs,this.config.robotCreds]){let r=mt(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&&m.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)}m.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)||m.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!==Yf&&(n.has(o)||this.disconnectRobot(o,i))}resolveRef(e){return Lt(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){m.warn("dingtalk-stream-source","ACK failed",{name:this.name,credRef:e.credRef,messageId:c,error:l instanceof Error?l.message:String(l)})}},l=>{m.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,m.info("dingtalk-stream-source","connected",{name:this.name,credRef:e.credRef})}catch(s){e.established=!1,m.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(),Zv),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(m.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(Jv*2**e.reconnectAttempts,Gv);e.reconnectAttempts+=1,m.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){m.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),m.info("dingtalk-stream-source","disconnected",{name:this.name,credRef:e})}async waitForConnected(e){let n=Date.now()+Gf;for(;Date.now()<n;){if(e.connected)return;await new Promise(r=>setTimeout(r,qv))}throw new Error(`dingtalk-stream \u8FDE\u63A5\u8D85\u65F6\uFF08${Gf}ms\uFF09`)}async handleDownstream(e,n){let r;try{r=JSON.parse(e.data)}catch(c){m.warn("dingtalk-stream-source","drop: malformed JSON frame",{name:this.name,error:c instanceof Error?c.message:String(c)});return}if(!r.conversationId){m.warn("dingtalk-stream-source","drop: missing conversationId",{name:this.name});return}if(!this.acceptsConversationType(r.conversationType)){m.debug("dingtalk-stream-source","drop: conversation type filtered",{name:this.name,conversationId:r.conversationId,conversationType:r.conversationType});return}let o=r.msgId||e.headers?.messageId||"";if(o&&!this.rememberMessageId(o)){m.debug("dingtalk-stream-source","drop: duplicate msgId",{name:this.name,messageId:o});return}let i=await this.toChatMessage(r,o,n.mediaDownloader);if(!i){m.debug("dingtalk-stream-source","drop: unparseable",{name:this.name,msgtype:r.msgtype});return}let s=this.buildEvent(r.conversationId,i,this.extractReplyContext(r,o,n.credRef));an.register({conversationId:r.conversationId,...r.conversationType?{conversationType:r.conversationType}:{},...r.sessionWebhook?{sessionWebhook:r.sessionWebhook}:{},...typeof r.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:r.sessionWebhookExpiredTime}:{},...i.sender?{senderStaffId:i.sender}:{},...r.robotCode?{robotCode:r.robotCode}:{}}),m.info("dingtalk-stream-source","emitting message_received",{name:this.name,conversationId:r.conversationId,sender:i.senderName??i.sender,msgtype:r.msgtype}),this.onEvent?.([s])}extractReplyContext(e,n,r){return{conversationId:e.conversationId,...n?{openMsgId:n}:{},...r?{credRef:r}:{},...e.conversationType?{conversationType:e.conversationType}:{},...e.conversationTitle?{conversationTitle:e.conversationTitle}:{},...e.robotCode?{robotCode:e.robotCode}:{},...e.sessionWebhook?{sessionWebhook:e.sessionWebhook}:{},...typeof e.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:e.sessionWebhookExpiredTime}:{},...e.atUsers?{atUsers:e.atUsers}:{},...typeof e.isInAtList=="boolean"?{isInAtList:e.isInAtList}:{}}}async toChatMessage(e,n,r){let{content:o,images:i}=await Xv(e,this.localizer,r);return o===null?null:{sender:e.senderStaffId||e.senderId,senderName:e.senderNick??e.senderStaffId??e.senderId,createTime:new Date(e.createAt||Date.now()).toISOString(),content:o,...n?{messageId:n}:{},...e.msgtype?{msgType:e.msgtype}:{},...i.length>0?{images:i}:{}}}buildEvent(e,n,r){let o={conversationId:e,messages:[n],content:`${n.senderName??n.sender}: ${n.content}`,messageCount:1,firstSender:n.senderName??n.sender,firstSendTime:n.createTime,lastSendTime:n.createTime,sender:n.sender,senderName:n.senderName??n.sender,dingtalk:r};return n.images&&n.images.length>0&&(o.images=n.images),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}acceptsConversationType(e){let n=this.config.conversationTypes??[],r=e===Yv;if(n.length>0){let i=n.includes("1to1"),s=n.includes("group");return i&&s?!0:i?r:s?!r:!0}return this.config.dropDirect!==void 0&&this.warnDropDirectDeprecated(),!((this.config.dropDirect??!0)&&r)}warnDropDirectDeprecated(){this.dropDirectWarned||(this.dropDirectWarned=!0,m.warn("dingtalk-stream-source","drop_direct \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u6539\u7528 conversation_types",{name:this.name,current:this.config.dropDirect,suggested:this.config.dropDirect===!1?["group","1to1"]:["group"],hint:"\u8FD0\u884C aitable-workflow migrate \u53EF\u81EA\u52A8\u8F6C\u5199"}))}rememberMessageId(e){let n=Date.now();if(this.seenMsgIds.size>Zf)for(let[r,o]of this.seenMsgIds)n-o>Hv&&this.seenMsgIds.delete(r);if(this.seenMsgIds.size>Zf){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=Qf(e,"client_id","clientId","client_id_env"),r=Qf(e,"client_secret","clientSecret","client_secret_env"),o=e.robot_refs??e.robotRefs,i=e.robot_creds??e.robotCreds;return{...n?{clientId:n}:{},...r?{clientSecret:r}:{},...o!==void 0?{robotRefs:o}:{},...i!==void 0?{robotCreds:i}:{},endpoint:typeof e.endpoint=="string"?e.endpoint:void 0,conversationTypes:Array.isArray(e.conversation_types)?e.conversation_types.map(String):Array.isArray(e.conversationTypes)?e.conversationTypes.map(String):void 0,dropDirect:typeof e.drop_direct=="boolean"?e.drop_direct:typeof e.dropDirect=="boolean"?e.dropDirect:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0}}};function Qf(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(Qf,"resolveSecret");function Qv(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(Qv,"extractTextContent");async function Xf(t,e,n,r){if(!r||!t)return null;let o=No(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 m.warn("dingtalk-stream-source","downloadMessageFile failed",{error:c instanceof Error?c.message:String(c)}),n.markFailed(o),null}return n.localizeRemoteUrl(s,o)}a(Xf,"localizeDownloadCode");async function Xv(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 Xf(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 Xf(t.robotCode,t.content.downloadCode,e,n);if(r)return{content:``,images:[r]}}return{content:"[\u56FE\u7247\u6D88\u606F]",images:[]}}return{content:Qv(t),images:[]}}a(Xv,"extractStreamContent");function eS(t){return t.length<=8?t:`${t.slice(0,4)}...${t.slice(-4)}`}a(eS,"maskClientId");import{CronExpressionParser as Wa}from"cron-parser";var Vo="0 0 * * *",Ko=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)),m.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){m.error("cron-scheduler","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(n)}m.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 m.info("cron-scheduler","fired",{name:this.name,eventType:this.config.eventType,scheduledFor:n,nextFireAt:this.nextFireAt?.toISOString()}),[r]}computeNextFireAt(e){let n=this.cronExpr??Vo;try{return Wa.parse(n,{currentDate:e,tz:this.timezone}).next().toDate()}catch(r){return m.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)}),Wa.parse(Vo,{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 m.warn("cron-scheduler","dailyAt \u683C\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230 00:00",{dailyAt:e}),Vo}validateCron(e){try{return Wa.parse(e,{tz:this.timezone}),e}catch(n){return m.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)}),Vo}}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 m.warn("cron-scheduler","timezone \u975E\u6CD5\uFF0C\u56DE\u9000 UTC",{timezone:r,error:o instanceof Error?o.message:String(o)}),"UTC"}}parseConfig(e){let n;return typeof e.payload=="object"&&e.payload!==null?n=e.payload:typeof e.metadata=="object"&&e.metadata!==null&&(n={metadata:e.metadata}),{cron:typeof e.cron=="string"?e.cron:void 0,dailyAt:typeof e.daily_at=="string"?e.daily_at:typeof e.dailyAt=="string"?e.dailyAt:void 0,timezone:typeof e.timezone=="string"?e.timezone:typeof e.tz=="string"?e.tz:void 0,intervalMs:typeof e.interval_ms=="number"?e.interval_ms:typeof e.intervalMs=="number"?e.intervalMs:void 0,eventType:String(e.event_type??e.eventType??"scheduled_trigger"),payload:n,fireImmediately:e.fire_immediately===!0||e.fireImmediately===!0}}};function tS(t,e){if(t===void 0)return;let n=Array.isArray(t)?t:[t],r=[];for(let s of n){if(!s||typeof s!="object"||typeof s.field!="string"||s.field.trim()===""){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08field \u7F3A\u5931\uFF09",s);continue}let l=(Array.isArray(s.equals)?s.equals:[s.equals]).filter(d=>d!=null&&d!=="");if(l.length===0){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08equals \u4E3A\u7A7A\uFF09",s);continue}r.push({field:s.field,values:l})}if(r.length===0)return;let o=a((s,c)=>({operator:"eq",operands:[s,c]}),"eqLeaf");if(r.length===1){let s=r[0],c=s.values.map(l=>o(s.field,l));return c.length===1?{operator:"and",operands:c}:{operator:"or",operands:c}}return{operator:"and",operands:r.map(s=>s.values.length===1?o(s.field,s.values[0]):(e?.(`\u591A\u6761\u4EF6 AND \u4E2D\u5B57\u6BB5\u300C${s.field}\u300D\u4E3A\u591A\u503C,\u9000\u5316\u7528 any_of;\u82E5\u8BE5\u5B57\u6BB5\u662F\u5355\u9009(singleSelect),dws \u4F1A\u9759\u9ED8\u5339\u914D 0 \u6761`,s),{operator:"any_of",operands:[s.field,s.values]}))}}a(tS,"compileSimpleFilter");var qo=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 ae({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)&&m.warn("aitable-record-source","missing base_id / table_id",{name:this.name}),m.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){m.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)}m.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=rS(o);if(!i)continue;let s=nS(o),c=this.resolveFieldNames?this.translateCellsToNames(s):s,l=Ba(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&&m.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 ye(e)){if(!k(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))}m.info("aitable-record-source","field mapping resolved",{name:this.name,count:this.idToName.size})}catch(e){m.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:tS(this.config.filter,(l,d)=>m.warn("aitable-record-source",l,{name:this.name,cond:d})),c=s!==void 0?this.translateFilterFieldNames(s):void 0;do{let l=["aitable","record","query","--base-id",this.config.baseId,"--table-id",this.config.tableId,"--limit",String(n)];c!==void 0&&l.push("--filters",JSON.stringify(c)),o&&l.push("--cursor",o);let d=await this.dws.runJson(l),u=ye(d);e.push(...u);let f=uo(d);if(i+=1,u.length<n||f===o)break;o=f}while(o&&i<r);return e}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e))n[this.idToName.get(r)??r]=o;return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}buildEvent(e,n,r,o){return{type:e,payload:{baseId:this.config.baseId,tableId:this.config.tableId,recordId:n,cells:r,raw:o},timestamp:new Date().toISOString(),itemId:n}}pruneSeen(){if(this.seenIds.size<=5e4)return;let e=[...this.seenIds].slice(-3e4);this.seenIds.clear();let n=new Set(e);for(let r of e)this.seenIds.add(r);for(let r of[...this.signatures.keys()])n.has(r)||this.signatures.delete(r)}parseConfig(e){let n=e.watch_mode??e.watchMode,r=n==="created"||n==="updated"||n==="both"?n:void 0;return{baseId:String(e.base_id??e.baseId??""),tableId:String(e.table_id??e.tableId??""),dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchMode:r,filters:e.filters,filter:e.filter,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,resolveFieldNames:typeof e.resolve_field_names=="boolean"?e.resolve_field_names:typeof e.resolveFieldNames=="boolean"?e.resolveFieldNames:void 0,emitExisting:typeof e.emit_existing=="boolean"?e.emit_existing:typeof e.emitExisting=="boolean"?e.emitExisting:void 0}}};function nS(t){let e=le(t);if(!k(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(k(r))return r}return e}a(nS,"recordCells");function rS(t){let e=le(t);if(!k(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(rS,"extractRecordId");function Ba(t){return Array.isArray(t)?`[${t.map(Ba).join(",")}]`:k(t)?`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Ba(t[n])}`).join(",")}}`:JSON.stringify(t)??"null"}a(Ba,"stableStringify");var oS=/^workflow:[A-Za-z0-9_-]+\.tracker$/,mr={field:"conversation_ids",label:"\u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868",valueType:"string[]"};function za(t){return Wt(t)?{requiredFields:[],optionalFields:[],errors:[],summary:`\u4F7F\u7528 ${mt(t).ns} ref \u52A8\u6001\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868`}:t!=null?{requiredFields:[],optionalFields:[mr],errors:[]}:{requiredFields:[mr],optionalFields:[],errors:[]}}a(za,"conversationIdsPolicy");var Ua=[{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 gr(t,e),"factory"),configPolicy:{requiredFields:[mr],validate:a(t=>za(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_group_message",description:"dingtalk_message \u7684\u8BED\u4E49\u5316\u522B\u540D\uFF08\u9010\u7FA4\u8F6E\u8BE2\uFF09\u3002\u65B0\u6A21\u677F\u63A8\u8350\u4F7F\u7528\u6B64\u540D\u79F0\uFF0C\u65E7\u6A21\u677F\u7684 dingtalk_message \u4ECD\u7136\u6709\u6548\u3002",factory:a((t,e)=>new gr(t,e),"factory"),configPolicy:{requiredFields:[mr],validate:a(t=>za(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_user_message",description:"\u9489\u9489\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\u3010dws list-all \u6279\u91CF\u65B9\u5F0F\u3011\uFF1A\u901A\u8FC7 `dws chat message list-all` \u5355\u6B21\u8C03\u7528\u62C9\u53D6\u6240\u6709\u4F1A\u8BDD\u6D88\u606F\uFF0C\u672C\u5730\u6309 conversation_ids \u8FC7\u6EE4\u3002\u9002\u5408 200+ \u7FA4\u6279\u91CF\u573A\u666F\uFF081~5 \u6B21\u5206\u9875\u66FF\u4EE3 200+ \u5B50\u8FDB\u7A0B\uFF09\u3002\u4E0E dingtalk_message / dingtalk_stream \u4EA7\u51FA\u540C\u6784 message_received \u4E8B\u4EF6\u3002",factory:a((t,e)=>new zo(t,e),"factory"),configPolicy:{requiredFields:[mr],validate:a(t=>{let e=k(t.filters)?t.filters:{};return za(t.conversation_ids??t.conversationIds??e.conversation_ids??e.conversationIds)},"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 Uo(t,e),"factory"),configPolicy:{requiredFields:[],validate:sS}},{type:"cron_scheduler",description:"\u5B9A\u65F6\u8C03\u5EA6\u4E8B\u4EF6\u6E90",factory:a(t=>new Ko(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 qo(t),"factory"),configPolicy:{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],validate:aS}}];function iS(t){return Ua.find(e=>e.type===t)}a(iS,"getEventSourceDescriptor");function hr(t,e){let r=iS(t)?.configPolicy;if(!r)return{requiredFields:[],errors:[]};let o=r.validate?.(e);return{requiredFields:o?.requiredFields??r.requiredFields??[],optionalFields:o?.optionalFields??r.optionalFields??[],...r.oneOf?{oneOf:r.oneOf}:{},errors:o?.errors??[],...o?.summary?{summary:o.summary}:{}}}a(hr,"eventSourceConfigPolicy");function sS(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(sS,"validateDingtalkStreamSourceConfig");function aS(t){return cS(t)?lS(t):{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],errors:[]}}a(aS,"validateAitableRecordSourceConfig");function cS(t){let e=t.source_table;return k(e)&&e.mode==="reference"}a(cS,"hasReferenceSourceTable");function lS(t){let e=t.source_table,n=k(e)&&typeof e.ref=="string"?e.ref.trim():"";return n?oS.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(lS,"referenceSourceTablePolicy");var dS=new Map(Ua.map(t=>[t.type,t.factory])),Ho=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)??dS.get(e.type);if(!r)return m.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 m.info("event-source-registry","\u4E8B\u4EF6\u6E90\u5DF2\u521B\u5EFA",{name:e.name,type:e.type}),o}catch(o){return m.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=uS(c,n.configRefs??{}),d=fS(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 uS(t,e){return Object.keys(e).length===0?t:Jo(t,e)}a(uS,"resolveConfigReferences");function ep(t,e){return Object.keys(e).length===0?t:Jo(t,e)}a(ep,"resolvePureRefs");function Jo(t,e){if(Array.isArray(t))return t.map(o=>Jo(o,e));if(!k(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]:(m.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]=Jo(i,e);return r}a(Jo,"resolveReferenceValue");function fS(t,e){if(t.type!=="aitable_record")return t;let n=t.config.source_table;if(!k(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}}:(m.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(fS,"resolveEventSourceReferences");function tp(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,Va(r,`${c}.config`,i.config),i.handler_config&&(r[`${c}.handler_config`]=i.handler_config,Va(r,`${c}.handler_config`,i.handler_config))}return r}a(tp,"collectWorkflowReferenceValues");function Va(t,e,n){if(k(n))for(let[r,o]of Object.entries(n)){let i=`${e}.${r}`;t[i]=o,k(o)&&Va(t,i,o)}}a(Va,"flattenReferenceValues");var Bt=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),m.debug("global-var","set",{key:e});let r=this.listeners.get(e);if(r)for(let o of r)try{o()}catch(i){m.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 O}from"zod";var pS=O.enum(["ambient","task","guardian"]),gS=O.object({id:O.string().min(1),name:O.string().min(1),description:O.string().default("")}),mS=O.enum(["critical","warning"]),hS=O.object({id:O.string().min(1),rule:O.string().min(1),severity:mS.default("warning")}),yS=O.object({format:O.enum(["json","text","markdown"]).default("text"),schema:O.record(O.string(),O.unknown()).optional()}),wS=O.object({auto_execute:O.boolean(),requires_human_review:O.boolean(),can_escalate:O.boolean().optional(),can_delegate:O.boolean().optional(),can_suggest_workflow_change:O.boolean().optional()}),bS=O.object({initial_level:O.number().min(1).default(1),auto_level_up_threshold:O.number().min(1).default(20),level_down_on_failure:O.boolean().default(!0),autonomy_by_level:O.record(O.string(),wS).default({})}),kS=O.object({enabled:O.boolean().default(!1),persistence:O.enum(["file","aitable","none"]).default("none"),max_entries:O.number().min(1).default(100),retention_days:O.number().min(1).default(90),learns_from:O.array(O.enum(["execution_results","human_feedback","peer_corrections"])).default([])}),AW=O.object({source:O.string().url(),collection:O.string().min(1)}),np=O.object({bin:O.string().min(1),args:O.array(O.string()).default([]),timeout_ms:O.number().int().min(1).optional()}),Ka=".kb/wiki/_index.md",vS=O.object({source_kind:O.enum(["aitable","excel","md"]).optional(),inputs:O.array(O.string()).default([]),build:O.array(np).default([]),reflow:np.optional(),artifact:O.string().default(Ka),validate:O.array(O.string()).default([]),custom:O.record(O.string(),O.unknown()).optional()}),SS=O.object({collection:O.string().min(1),source:O.string().url().optional(),compile:vS.optional()}),qa=O.union([O.string(),SS]),xS=O.object({domains:O.array(O.string()).default([]),kb_collections:O.array(qa).default([])}),yr=O.object({id:O.string().min(1),name:O.string().min(1),department:O.string().optional(),version:O.string().default("1.0.0"),archetype:pS.default("task"),persona:O.union([O.string().min(1),O.object({file:O.string().min(1)})]),skills:O.array(gS).default([]),guardrails:O.array(hS).default([]),output_standard:yS.optional(),knowledge_scope:xS.optional(),trust:bS.optional(),memory:kS.optional()});function Ha(t){let e=yr.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(Ha,"parseRoleDefinition");var rp={auto_execute:!1,requires_human_review:!0,can_escalate:!1,can_delegate:!1,can_suggest_workflow_change:!1};var RS="__ephemeral__",Go=class{constructor(e){this.registry=e}registry;static{a(this,"RoleResolver")}async resolve(e){let n=this.registry.get(e);return n?op(n,!1):(m.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=TS(e);return op(n,!0)}};function CS(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}:{...rp}}a(CS,"resolveAutonomy");function op(t,e){let n=t.trust?.initial_level??1;return{definition:t,currentTrustLevel:n,autonomy:CS(t,n),memoryEntries:[],ephemeral:e}}a(op,"buildInstance");function IS(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(IS,"buildRoleContext");async function Ja(t,e){if(!t||!e||!e.trim())return;let r=await t.resolve(e)??t.buildEphemeral(e);return IS(r)}a(Ja,"resolveRoleContext");function TS(t){let e=t.trim()||"\u901A\u7528\u52A9\u624B";return yr.parse({id:RS,name:AS(e),persona:e,archetype:"task"})}a(TS,"ephemeralDefinition");function AS(t){let n=(t.split(`
|
|
301
|
-
`)[0]?.trim()??"")||"\u4E34\u65F6\u89D2\u8272";return n.length>20?`${n.slice(0,20)}\u2026`:n}a(
|
|
300
|
+
`).trim(),n.includes("download-media")&&m.warn("message-adapter","dws \u5A92\u4F53\u63D0\u793A\u672A\u80FD\u5B8C\u5168\u5265\u79BB\uFF0C\u683C\u5F0F\u53EF\u80FD\u5DF2\u53D8\u66F4",{sample:n.slice(0,120)}),!n&&e?uS:n}a(Vo,"normalizeDwsMediaNoise");function fS(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(fS,"isImageMsgType");function pS(t){if(Array.isArray(t))return t;if(!vt(t))return[];for(let e of["body","data","result","response"]){let n=t[e];if(Array.isArray(n))return n;if(vt(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(pS,"findMessageArray");function gS(t){for(let e of["text","content","body","markdown"]){let n=t[e];if(typeof n=="string"&&n.trim())return n.trim()}if(vt(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(gS,"extractTextContent");function mS(t){if(!vt(t))return{};for(let e of["body","data","result","response"]){let n=t[e];if(vt(n)){let r=cp(n);if(r.nextCursor||r.hasMore!==void 0)return r}}return cp(t)}a(mS,"extractCursorInfo");function cp(t){let e=typeof t.nextCursor=="string"&&t.nextCursor.trim()?t.nextCursor.trim():typeof t.next_cursor=="string"&&t.next_cursor.trim()?t.next_cursor.trim():typeof t.nextToken=="string"&&t.nextToken.trim()?t.nextToken.trim():void 0,n=typeof t.hasMore=="boolean"?t.hasMore:typeof t.has_more=="boolean"?t.has_more:void 0;return{nextCursor:e,hasMore:n}}a(cp,"extractCursorFromLevel");import qa from"path";var hS=/^\$\{(env|config|globalVar)\.([^}]+)\}$/;function mt(t){if(typeof t!="string")return null;let e=t.match(hS);return e?{ns:e[1],path:e[2]}:null}a(mt,"runtimeRefTarget");function Wt(t,e){let n=mt(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(Wt,"resolveRuntimeRef");function Bt(t){return mt(t)!==null}a(Bt,"isRuntimeRef");var yr=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=Wt(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(yS(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?qa.isAbsolute(this.config.mediaDir)?this.config.mediaDir:qa.resolve(r,this.config.mediaDir):qa.join(r,".aitable","media","dingtalk");this.adapter=new zo({dwsBin:this.config.dwsBin??"dws",imageMode:this.config.imageMode,mediaDir:o,downloadTimeoutMs:this.config.downloadTimeoutMs,resolveUserIds:this.config.resolveUserIds}),this.refresh();let i=e.config;this.pollIntervalMs=typeof i.poll_interval_ms=="number"?i.poll_interval_ms:typeof i.pollIntervalMs=="number"?i.pollIntervalMs:5e3}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController;let n=mt(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(m.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){m.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)}m.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();m.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):m.error("dingtalk-message-source","conversation fetch failed",{name:this.name,conversationId:e[i],error:o.reason instanceof Error?o.reason.message:String(o.reason)})}),r}async collectConversation(e){let n=this.states.get(e);if(!n)return[];let r=await this.adapter.fetchMessages(e,n.lastFetchTime,this.config.fetchLimit??50),o=r.messages;if(o.length>0){let c=o[0].createTime,l=Date.parse(c);for(let d of o){let u=Date.parse(d.createTime);!Number.isNaN(u)&&(Number.isNaN(l)||u>l)&&(c=d.createTime,l=u)}n.lastFetchTime=c}else if(r.nextCursor){let c=Date.parse(r.nextCursor);if(Number.isFinite(c))n.lastFetchTime=new Date(c).toISOString();else{let l=r.nextCursor.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/);if(l){let d=Date.parse(`${l[1]}T${l[2]}${l[3]??""}+08:00`);Number.isFinite(d)&&(n.lastFetchTime=new Date(d).toISOString())}}m.info("dingtalk-message-source","cursor advanced via nextCursor (empty page)",{name:this.name,conversationId:e,nextCursor:r.nextCursor,newLastFetchTime:n.lastFetchTime})}let i=this.sortByCreateTimeAsc(this.dedup(this.filterBySender(o)));if(i.length===0)return[];let s=this.aggregateBySender?this.groupBySender(i):[{sender:null,messages:i}];return m.info("dingtalk-message-source","emitting message_received",{name:this.name,conversationId:e,eventCount:s.length,messageCount:i.length}),s.map(c=>this.buildEvent(e,c.messages,c.sender))}groupBySender(e){let n=[],r=new Map;for(let o of e){let i=o.sender,s=r.get(i);s||(s=[],r.set(i,s),n.push(i)),s.push(o)}return n.map(o=>{let i=r.get(o);return{sender:{id:o,name:i[0]?.senderName,openDingTalkId:i[0]?.senderOpenDingTalkId,userId:i[0]?.userId},messages:i}})}buildEvent(e,n,r){let o={conversationId:e,messages:n,content:n.map(s=>`${s.senderName??s.sender}: ${s.content}`).join(`
|
|
301
|
+
`),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString()},i=n.flatMap(s=>s.images??[]);return i.length>0&&(o.images=i),r&&(o.sender=r.id,o.senderName=r.name??r.id,r.openDingTalkId&&(o.senderOpenDingTalkId=r.openDingTalkId),r.userId&&(o.senderUserId=r.userId)),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}sortByCreateTimeAsc(e){return e.map((n,r)=>({msg:n,idx:r,ms:Date.parse(n.createTime)})).sort((n,r)=>{let o=Number.isNaN(n.ms)?-1/0:n.ms,i=Number.isNaN(r.ms)?-1/0:r.ms;return o===i?n.idx-r.idx:o-i}).map(n=>n.msg)}dedup(e){let n=[];for(let r of e){let o=r.messageId??`${r.sender}:${r.createTime}:${r.content.slice(0,50)}`;this.seenIds.has(o)||(this.seenIds.add(o),n.push(r))}if(this.seenIds.size>5e3){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-3e3))this.seenIds.add(o)}return n}filterBySender(e){let n=e;if(this.config.watchSenders&&this.config.watchSenders.length>0){let r=new Set(this.config.watchSenders);n=n.filter(o=>r.has(o.sender)||o.senderName!=null&&r.has(o.senderName))}if(this.config.ignoreSenders&&this.config.ignoreSenders.length>0){let r=new Set(this.config.ignoreSenders);n=n.filter(o=>!r.has(o.sender)&&!(o.senderName!=null&&r.has(o.senderName)))}return n}parseConfig(e){return{conversationIds:e.conversation_ids??e.conversationIds,sourceAdapter:e.source_adapter??e.sourceAdapter??"dws_pull",dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchSenders:Array.isArray(e.watch_senders)?e.watch_senders.map(String):Array.isArray(e.watchSenders)?e.watchSenders.map(String):void 0,ignoreSenders:Array.isArray(e.ignore_senders)?e.ignore_senders.map(String):Array.isArray(e.ignoreSenders)?e.ignoreSenders.map(String):void 0,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0,downloadTimeoutMs:typeof e.download_timeout_ms=="number"?e.download_timeout_ms:typeof e.downloadTimeoutMs=="number"?e.downloadTimeoutMs:void 0,resolveUserIds:typeof e.resolve_user_ids=="boolean"?e.resolve_user_ids:typeof e.resolveUserIds=="boolean"?e.resolveUserIds:void 0}}};function yS(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(yS,"extractConversationIds");var Ko=class{static{a(this,"DingTalkUserMessageSource")}name;config;pollIntervalMs;running=!1;abortController=null;aggregateBySender;seenIds=new Set;lastFetchTime;dwsBin;runner;media;conversationIdsRaw;globalVars;configScope;unsubscribes=[];constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.aggregateBySender=this.config.aggregateBySender??!0,this.globalVars=n?.globalVars,this.configScope=n?.configScope,this.conversationIdsRaw=this.config.conversationIds,this.dwsBin=this.config.dwsBin??"dws",this.runner=K,this.media=new hr({dwsBin:this.dwsBin,...this.config.imageMode?{imageMode:this.config.imageMode}:{},...this.config.mediaDir?{mediaDir:this.config.mediaDir}:{}}),this.lastFetchTime=this.formatWallClock(new Date);let r=e.config;this.pollIntervalMs=typeof r.poll_interval_ms=="number"?r.poll_interval_ms:typeof r.pollIntervalMs=="number"?r.pollIntervalMs:3e4}async start(e){if(this.running)return;this.running=!0,this.abortController=new AbortController;let n=mt(this.conversationIdsRaw);if(n){let r=n.path.split(".")[0];n.ns==="globalVar"&&this.globalVars&&this.unsubscribes.push(this.globalVars.subscribe(r,()=>{}))}for(m.info("dingtalk-user-message-source","started",{name:this.name,pollIntervalMs:this.pollIntervalMs});this.running;){try{let r=await this.poll();r.length>0&&e(r)}catch(r){m.error("dingtalk-user-message-source","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.pollIntervalMs)}m.info("dingtalk-user-message-source","stopped",{name:this.name})}stop(){this.running=!1,this.abortController?.abort();for(let e of this.unsubscribes)e();this.unsubscribes=[]}sleep(e){return new Promise(n=>{let r=this.abortController?.signal,o=a(()=>{clearTimeout(i),n()},"onAbort"),i=setTimeout(()=>{r?.removeEventListener("abort",o),n()},e);r?.addEventListener("abort",o,{once:!0})})}resolveConversationIds(){let e=Wt(this.conversationIdsRaw,{configScope:this.configScope,globalVars:this.globalVars}),n=Array.isArray(e)?e:typeof e=="string"&&e.trim()?[e]:[];return new Set(n.map(r=>typeof r=="string"?r.trim():r&&typeof r=="object"?String(r.groupId??"").trim():"").filter(r=>r.length>0))}async poll(){let e=this.resolveConversationIds();if(e.size===0)return m.debug("dingtalk-user-message-source","no conversation_ids configured, skipping poll"),[];let n=new Date,r=this.lastFetchTime,o=this.formatWallClock(n),i=await this.fetchAllPages(r,o,e);if(this.lastFetchTime=o,i.size===0)return[];let s=this.config.excludeAtBot??!0,c=[];for(let[l,d]of i.entries()){let u=this.filterMessages(d.messages,s);if(u.length===0)continue;let f=this.aggregateBySender?this.groupBySender(u):[{sender:null,messages:u}];for(let p of f)c.push(this.buildEvent(l,p.messages,p.sender,d.title))}return m.info("dingtalk-user-message-source","poll complete",{name:this.name,watchedGroups:e.size,eventsEmitted:c.length}),c}async fetchAllPages(e,n,r){let o=new Map,i="0",s=this.config.maxPages??20,c=this.config.pageSize??50;for(let l=0;l<s;l++){let d=["chat","message","list-all","--start",e,"--end",n,"--limit",String(c),"--cursor",i,"--format","json"],u;try{let h=await this.runner(this.dwsBin,d,{timeoutMs:3e4});if(h.exitCode!==0){m.error("dingtalk-user-message-source","list-all failed",{exitCode:h.exitCode,stderr:h.stderr.slice(0,300)});break}u=h.stdout.trim()}catch(h){m.error("dingtalk-user-message-source","list-all command error",{error:h instanceof Error?h.message:String(h)});break}if(!u)break;let f;try{f=JSON.parse(u)}catch{m.error("dingtalk-user-message-source","list-all invalid JSON",{output:u.slice(0,200)});break}let p=f.result?.conversationMessagesList??[],g=this.config.conversationTypes??[];for(let h of p){let y=h.openConversationId??h.conversationId??"";if(!y||!r.has(y))continue;if(g.length>0){let b=h.conversationType,v=b==="2"||h.singleChat===!1,R=b==="1"||h.singleChat===!0,S=g.includes("group"),C=g.includes("1to1");if((S||C)&&!(S&&v||C&&R))continue}let w=this.parseConversationMessages(h.messages??[]);if(w.length>0){await this.resolveMedia(w,y);let b=o.get(y)??{title:typeof h.title=="string"&&h.title.trim()||void 0,messages:[]};b.messages.push(...w),o.set(y,b)}}if(!f.result?.hasMore||(i=f.result?.nextCursor??"",!i))break}return o}async resolveMedia(e,n){if(this.media.imageMode!=="off")for(let r of e){if(!Uo(r.content))continue;let{content:o,images:i}=await this.media.resolveContent(r.content,r.messageId,n);r.content=o,i.length>0&&(r.images=[...r.images??[],...i])}}parseConversationMessages(e){let n=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r,i=this.extractContent(o);if(!i)continue;let s=typeof o.messageId=="string"?o.messageId:typeof o.openMessageId=="string"?o.openMessageId:void 0,c=s??`${o.sender}:${o.createTime}:${(i??"").slice(0,50)}`;this.seenIds.has(c)||(this.seenIds.add(c),n.push({sender:String(o.sender??o.senderId??""),senderName:typeof o.senderName=="string"?o.senderName:typeof o.senderNick=="string"?o.senderNick:void 0,senderOpenDingTalkId:typeof o.senderOpenDingTalkId=="string"?o.senderOpenDingTalkId:typeof o.openDingTalkId=="string"?o.openDingTalkId:void 0,createTime:this.normalizeCreateTime(o.createTime??o.create_time),content:i,messageId:s,msgType:typeof o.msgType=="string"?o.msgType:void 0,...Ka(o)}))}if(this.seenIds.size>1e4){let r=[...this.seenIds];this.seenIds.clear();for(let o of r.slice(-6e3))this.seenIds.add(o)}return n}filterMessages(e,n){return e.filter(r=>!(n&&this.looksLikeAtBot(r.content)))}looksLikeAtBot(e){return/^@[\S]+\s/.test(e)}groupBySender(e){let n=[],r=new Map;for(let o of e){let i=o.sender,s=r.get(i);s||(s=[],r.set(i,s),n.push(i)),s.push(o)}return n.map(o=>{let i=r.get(o);return{sender:{id:o,name:i[0]?.senderName,openDingTalkId:i[0]?.senderOpenDingTalkId},messages:i}})}buildEvent(e,n,r,o){let i={conversationId:e,messages:n,content:n.map(s=>`${s.senderName??s.sender}: ${s.content}`).join(`
|
|
302
|
+
`),messageCount:n.length,firstSender:n[0]?.senderName??n[0]?.sender??"",firstSendTime:n[0]?.createTime??new Date().toISOString(),lastSendTime:n[n.length-1]?.createTime??new Date().toISOString(),source:"user_message",...o?{conversationTitle:o}:{}};return r&&(i.sender=r.id,i.senderName=r.name??r.id,r.openDingTalkId&&(i.senderOpenDingTalkId=r.openDingTalkId)),{type:"message_received",payload:i,timestamp:new Date().toISOString(),itemId:null}}extractContent(e){for(let n of["text","content","body","markdown"]){let r=e[n];if(typeof r=="string"&&r.trim())return Vo(r.trim())}if(e.content&&typeof e.content=="object"){let n=e.content;for(let r of["text","content","markdown"]){let o=n[r];if(typeof o=="string"&&o.trim())return Vo(o.trim())}}return null}normalizeCreateTime(e){let n=typeof e=="string"&&e.trim()?e.trim():"";if(!n)return new Date().toISOString();let r=n.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})(\.\d+)?$/);if(r){let i=Date.parse(`${r[1]}T${r[2]}${r[3]??""}+08:00`);return Number.isFinite(i)?new Date(i).toISOString():new Date().toISOString()}let o=Date.parse(n);return Number.isFinite(o)?new Date(o).toISOString():new Date().toISOString()}formatWallClock(e){return new Date(e.getTime()+288e5).toISOString().slice(0,19).replace("T"," ")}parseConfig(e){let n=e.filters&&typeof e.filters=="object"?e.filters:{};return{conversationIds:e.conversation_ids??e.conversationIds??n.conversation_ids??n.conversationIds,excludeAtBot:typeof e.exclude_at_bot=="boolean"?e.exclude_at_bot:typeof e.excludeAtBot=="boolean"?e.excludeAtBot:typeof n.exclude_at_bot=="boolean"?n.exclude_at_bot:typeof n.excludeAtBot=="boolean"?n.excludeAtBot:void 0,conversationTypes:Array.isArray(e.conversation_types)?e.conversation_types.map(String):Array.isArray(e.conversationTypes)?e.conversationTypes.map(String):Array.isArray(n.conversation_types)?n.conversation_types.map(String):Array.isArray(n.conversationTypes)?n.conversationTypes.map(String):void 0,dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,pageSize:typeof e.page_size=="number"?e.page_size:typeof e.pageSize=="number"?e.pageSize:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,aggregateBySender:typeof e.aggregate_by_sender=="boolean"?e.aggregate_by_sender:typeof e.aggregateBySender=="boolean"?e.aggregateBySender:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0}}};import Ha from"path";var dp=1e4,wS=100,bS=600*1e3,up=2e3,kS=1e3,vS=3e4,SS=5e3,xS="1",fp="__inline__",qo=class{static{a(this,"DingTalkStreamSource")}name;config;running=!1;onEvent=null;connections=new Map;seenMsgIds=new Map;dropDirectWarned=!1;localizer;injectedDownloader;globalVars;configScope;unsubscribes=[];healthCheckTimer=null;constructor(e,n){this.name=e.name,this.config=this.parseConfig(e.config),this.globalVars=n?.globalVars,this.configScope=n?.configScope;let r=typeof e.config.configDir=="string"?e.config.configDir:process.cwd(),o=this.config.mediaDir?Ha.isAbsolute(this.config.mediaDir)?this.config.mediaDir:Ha.resolve(r,this.config.mediaDir):Ha.join(r,".aitable","media","dingtalk");this.localizer=new Tn({...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 kt({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&&(m.info("dingtalk-stream-source","starting (inline)",{name:this.name,clientId:IS(this.config.clientId),...this.config.endpoint?{endpoint:this.config.endpoint}:{}}),this.connectRobot(fp,this.config.clientId,this.config.clientSecret)),this.config.robotRefs!==void 0){m.info("dingtalk-stream-source","starting (dynamic)",{name:this.name}),this.reconcile();for(let n of[this.config.robotRefs,this.config.robotCreds]){let r=mt(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&&m.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)}m.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)||m.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!==fp&&(n.has(o)||this.disconnectRobot(o,i))}resolveRef(e){return Wt(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){m.warn("dingtalk-stream-source","ACK failed",{name:this.name,credRef:e.credRef,messageId:c,error:l instanceof Error?l.message:String(l)})}},l=>{m.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,m.info("dingtalk-stream-source","connected",{name:this.name,credRef:e.credRef})}catch(s){e.established=!1,m.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(),SS),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(m.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(kS*2**e.reconnectAttempts,vS);e.reconnectAttempts+=1,m.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){m.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),m.info("dingtalk-stream-source","disconnected",{name:this.name,credRef:e})}async waitForConnected(e){let n=Date.now()+dp;for(;Date.now()<n;){if(e.connected)return;await new Promise(r=>setTimeout(r,wS))}throw new Error(`dingtalk-stream \u8FDE\u63A5\u8D85\u65F6\uFF08${dp}ms\uFF09`)}async handleDownstream(e,n){let r;try{r=JSON.parse(e.data)}catch(c){m.warn("dingtalk-stream-source","drop: malformed JSON frame",{name:this.name,error:c instanceof Error?c.message:String(c)});return}if(!r.conversationId){m.warn("dingtalk-stream-source","drop: missing conversationId",{name:this.name});return}if(!this.acceptsConversationType(r.conversationType)){m.debug("dingtalk-stream-source","drop: conversation type filtered",{name:this.name,conversationId:r.conversationId,conversationType:r.conversationType});return}let o=r.msgId||e.headers?.messageId||"";if(o&&!this.rememberMessageId(o)){m.debug("dingtalk-stream-source","drop: duplicate msgId",{name:this.name,messageId:o});return}let i=await this.toChatMessage(r,o,n.mediaDownloader);if(!i){m.debug("dingtalk-stream-source","drop: unparseable",{name:this.name,msgtype:r.msgtype});return}let s=this.buildEvent(r.conversationId,i,this.extractReplyContext(r,o,n.credRef));ln.register({conversationId:r.conversationId,...r.conversationType?{conversationType:r.conversationType}:{},...r.sessionWebhook?{sessionWebhook:r.sessionWebhook}:{},...typeof r.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:r.sessionWebhookExpiredTime}:{},...i.sender?{senderStaffId:i.sender}:{},...r.robotCode?{robotCode:r.robotCode}:{}}),m.info("dingtalk-stream-source","emitting message_received",{name:this.name,conversationId:r.conversationId,sender:i.senderName??i.sender,msgtype:r.msgtype}),this.onEvent?.([s])}extractReplyContext(e,n,r){return{conversationId:e.conversationId,...n?{openMsgId:n}:{},...r?{credRef:r}:{},...e.conversationType?{conversationType:e.conversationType}:{},...e.conversationTitle?{conversationTitle:e.conversationTitle}:{},...e.robotCode?{robotCode:e.robotCode}:{},...e.sessionWebhook?{sessionWebhook:e.sessionWebhook}:{},...typeof e.sessionWebhookExpiredTime=="number"?{sessionWebhookExpiredTime:e.sessionWebhookExpiredTime}:{},...e.atUsers?{atUsers:e.atUsers}:{},...typeof e.isInAtList=="boolean"?{isInAtList:e.isInAtList}:{}}}async toChatMessage(e,n,r){let{content:o,images:i}=await CS(e,this.localizer,r);return o===null?null:{sender:e.senderStaffId||e.senderId,senderName:e.senderNick??e.senderStaffId??e.senderId,createTime:new Date(e.createAt||Date.now()).toISOString(),content:o,...n?{messageId:n}:{},...e.msgtype?{msgType:e.msgtype}:{},...i.length>0?{images:i}:{}}}buildEvent(e,n,r){let o={conversationId:e,messages:[n],content:`${n.senderName??n.sender}: ${n.content}`,messageCount:1,firstSender:n.senderName??n.sender,firstSendTime:n.createTime,lastSendTime:n.createTime,sender:n.sender,senderName:n.senderName??n.sender,dingtalk:r};return n.images&&n.images.length>0&&(o.images=n.images),{type:"message_received",payload:o,timestamp:new Date().toISOString(),itemId:null}}acceptsConversationType(e){let n=this.config.conversationTypes??[],r=e===xS;if(n.length>0){let i=n.includes("1to1"),s=n.includes("group");return i&&s?!0:i?r:s?!r:!0}return this.config.dropDirect!==void 0&&this.warnDropDirectDeprecated(),!((this.config.dropDirect??!0)&&r)}warnDropDirectDeprecated(){this.dropDirectWarned||(this.dropDirectWarned=!0,m.warn("dingtalk-stream-source","drop_direct \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u6539\u7528 conversation_types",{name:this.name,current:this.config.dropDirect,suggested:this.config.dropDirect===!1?["group","1to1"]:["group"],hint:"\u8FD0\u884C aitable-workflow migrate \u53EF\u81EA\u52A8\u8F6C\u5199"}))}rememberMessageId(e){let n=Date.now();if(this.seenMsgIds.size>up)for(let[r,o]of this.seenMsgIds)n-o>bS&&this.seenMsgIds.delete(r);if(this.seenMsgIds.size>up){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=pp(e,"client_id","clientId","client_id_env"),r=pp(e,"client_secret","clientSecret","client_secret_env"),o=e.robot_refs??e.robotRefs,i=e.robot_creds??e.robotCreds;return{...n?{clientId:n}:{},...r?{clientSecret:r}:{},...o!==void 0?{robotRefs:o}:{},...i!==void 0?{robotCreds:i}:{},endpoint:typeof e.endpoint=="string"?e.endpoint:void 0,conversationTypes:Array.isArray(e.conversation_types)?e.conversation_types.map(String):Array.isArray(e.conversationTypes)?e.conversationTypes.map(String):void 0,dropDirect:typeof e.drop_direct=="boolean"?e.drop_direct:typeof e.dropDirect=="boolean"?e.dropDirect:void 0,imageMode:e.image_mode==="download"||e.image_mode==="url"||e.image_mode==="off"?e.image_mode:e.imageMode==="download"||e.imageMode==="url"||e.imageMode==="off"?e.imageMode:void 0,mediaDir:typeof e.media_dir=="string"?e.media_dir:typeof e.mediaDir=="string"?e.mediaDir:void 0}}};function pp(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(pp,"resolveSecret");function RS(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(RS,"extractTextContent");async function gp(t,e,n,r){if(!r||!t)return null;let o=Bo(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 m.warn("dingtalk-stream-source","downloadMessageFile failed",{error:c instanceof Error?c.message:String(c)}),n.markFailed(o),null}return n.localizeRemoteUrl(s,o)}a(gp,"localizeDownloadCode");async function CS(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 gp(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 gp(t.robotCode,t.content.downloadCode,e,n);if(r)return{content:``,images:[r]}}return{content:"[\u56FE\u7247\u6D88\u606F]",images:[]}}return{content:RS(t),images:[]}}a(CS,"extractStreamContent");function IS(t){return t.length<=8?t:`${t.slice(0,4)}...${t.slice(-4)}`}a(IS,"maskClientId");import{CronExpressionParser as Ja}from"cron-parser";var Ho="0 0 * * *",Jo=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)),m.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){m.error("cron-scheduler","poll error",{name:this.name,error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(n)}m.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 m.info("cron-scheduler","fired",{name:this.name,eventType:this.config.eventType,scheduledFor:n,nextFireAt:this.nextFireAt?.toISOString()}),[r]}computeNextFireAt(e){let n=this.cronExpr??Ho;try{return Ja.parse(n,{currentDate:e,tz:this.timezone}).next().toDate()}catch(r){return m.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)}),Ja.parse(Ho,{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 m.warn("cron-scheduler","dailyAt \u683C\u5F0F\u975E\u6CD5\uFF0C\u56DE\u9000\u5230 00:00",{dailyAt:e}),Ho}validateCron(e){try{return Ja.parse(e,{tz:this.timezone}),e}catch(n){return m.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)}),Ho}}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 m.warn("cron-scheduler","timezone \u975E\u6CD5\uFF0C\u56DE\u9000 UTC",{timezone:r,error:o instanceof Error?o.message:String(o)}),"UTC"}}parseConfig(e){let n;return typeof e.payload=="object"&&e.payload!==null?n=e.payload:typeof e.metadata=="object"&&e.metadata!==null&&(n={metadata:e.metadata}),{cron:typeof e.cron=="string"?e.cron:void 0,dailyAt:typeof e.daily_at=="string"?e.daily_at:typeof e.dailyAt=="string"?e.dailyAt:void 0,timezone:typeof e.timezone=="string"?e.timezone:typeof e.tz=="string"?e.tz:void 0,intervalMs:typeof e.interval_ms=="number"?e.interval_ms:typeof e.intervalMs=="number"?e.intervalMs:void 0,eventType:String(e.event_type??e.eventType??"scheduled_trigger"),payload:n,fireImmediately:e.fire_immediately===!0||e.fireImmediately===!0}}};function TS(t,e){if(t===void 0)return;let n=Array.isArray(t)?t:[t],r=[];for(let s of n){if(!s||typeof s!="object"||typeof s.field!="string"||s.field.trim()===""){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08field \u7F3A\u5931\uFF09",s);continue}let l=(Array.isArray(s.equals)?s.equals:[s.equals]).filter(d=>d!=null&&d!=="");if(l.length===0){e?.("\u5FFD\u7565\u975E\u6CD5 filter \u6761\u4EF6\uFF08equals \u4E3A\u7A7A\uFF09",s);continue}r.push({field:s.field,values:l})}if(r.length===0)return;let o=a((s,c)=>({operator:"eq",operands:[s,c]}),"eqLeaf");if(r.length===1){let s=r[0],c=s.values.map(l=>o(s.field,l));return c.length===1?{operator:"and",operands:c}:{operator:"or",operands:c}}return{operator:"and",operands:r.map(s=>s.values.length===1?o(s.field,s.values[0]):(e?.(`\u591A\u6761\u4EF6 AND \u4E2D\u5B57\u6BB5\u300C${s.field}\u300D\u4E3A\u591A\u503C,\u9000\u5316\u7528 any_of;\u82E5\u8BE5\u5B57\u6BB5\u662F\u5355\u9009(singleSelect),dws \u4F1A\u9759\u9ED8\u5339\u914D 0 \u6761`,s),{operator:"any_of",operands:[s.field,s.values]}))}}a(TS,"compileSimpleFilter");var Go=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 ae({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)&&m.warn("aitable-record-source","missing base_id / table_id",{name:this.name}),m.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){m.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)}m.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=AS(o);if(!i)continue;let s=_S(o),c=this.resolveFieldNames?this.translateCellsToNames(s):s,l=Ga(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&&m.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 ye(e)){if(!k(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))}m.info("aitable-record-source","field mapping resolved",{name:this.name,count:this.idToName.size})}catch(e){m.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:TS(this.config.filter,(l,d)=>m.warn("aitable-record-source",l,{name:this.name,cond:d})),c=s!==void 0?this.translateFilterFieldNames(s):void 0;do{let l=["aitable","record","query","--base-id",this.config.baseId,"--table-id",this.config.tableId,"--limit",String(n)];c!==void 0&&l.push("--filters",JSON.stringify(c)),o&&l.push("--cursor",o);let d=await this.dws.runJson(l),u=ye(d);e.push(...u);let f=go(d);if(i+=1,u.length<n||f===o)break;o=f}while(o&&i<r);return e}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e))n[this.idToName.get(r)??r]=o;return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}buildEvent(e,n,r,o){return{type:e,payload:{baseId:this.config.baseId,tableId:this.config.tableId,recordId:n,cells:r,raw:o},timestamp:new Date().toISOString(),itemId:n}}pruneSeen(){if(this.seenIds.size<=5e4)return;let e=[...this.seenIds].slice(-3e4);this.seenIds.clear();let n=new Set(e);for(let r of e)this.seenIds.add(r);for(let r of[...this.signatures.keys()])n.has(r)||this.signatures.delete(r)}parseConfig(e){let n=e.watch_mode??e.watchMode,r=n==="created"||n==="updated"||n==="both"?n:void 0;return{baseId:String(e.base_id??e.baseId??""),tableId:String(e.table_id??e.tableId??""),dwsBin:typeof e.dws_bin=="string"?e.dws_bin:typeof e.dwsBin=="string"?e.dwsBin:void 0,watchMode:r,filters:e.filters,filter:e.filter,fetchLimit:typeof e.fetch_limit=="number"?e.fetch_limit:typeof e.fetchLimit=="number"?e.fetchLimit:void 0,maxPages:typeof e.max_pages=="number"?e.max_pages:typeof e.maxPages=="number"?e.maxPages:void 0,resolveFieldNames:typeof e.resolve_field_names=="boolean"?e.resolve_field_names:typeof e.resolveFieldNames=="boolean"?e.resolveFieldNames:void 0,emitExisting:typeof e.emit_existing=="boolean"?e.emit_existing:typeof e.emitExisting=="boolean"?e.emitExisting:void 0}}};function _S(t){let e=le(t);if(!k(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(k(r))return r}return e}a(_S,"recordCells");function AS(t){let e=le(t);if(!k(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(AS,"extractRecordId");function Ga(t){return Array.isArray(t)?`[${t.map(Ga).join(",")}]`:k(t)?`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Ga(t[n])}`).join(",")}}`:JSON.stringify(t)??"null"}a(Ga,"stableStringify");var ES=/^workflow:[A-Za-z0-9_-]+\.tracker$/,wr={field:"conversation_ids",label:"\u76D1\u542C\u7684\u4F1A\u8BDD ID \u5217\u8868",valueType:"string[]"};function Za(t){return Bt(t)?{requiredFields:[],optionalFields:[],errors:[],summary:`\u4F7F\u7528 ${mt(t).ns} ref \u52A8\u6001\u52A0\u8F7D\u4F1A\u8BDD\u5217\u8868`}:t!=null?{requiredFields:[],optionalFields:[wr],errors:[]}:{requiredFields:[wr],optionalFields:[],errors:[]}}a(Za,"conversationIdsPolicy");var Ya=[{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 yr(t,e),"factory"),configPolicy:{requiredFields:[wr],validate:a(t=>Za(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_group_message",description:"dingtalk_message \u7684\u8BED\u4E49\u5316\u522B\u540D\uFF08\u9010\u7FA4\u8F6E\u8BE2\uFF09\u3002\u65B0\u6A21\u677F\u63A8\u8350\u4F7F\u7528\u6B64\u540D\u79F0\uFF0C\u65E7\u6A21\u677F\u7684 dingtalk_message \u4ECD\u7136\u6709\u6548\u3002",factory:a((t,e)=>new yr(t,e),"factory"),configPolicy:{requiredFields:[wr],validate:a(t=>Za(t.conversation_ids??t.conversationIds),"validate")}},{type:"dingtalk_user_message",description:"\u9489\u9489\u6D88\u606F\u5165\u7AD9\u4E8B\u4EF6\u6E90\u3010dws list-all \u6279\u91CF\u65B9\u5F0F\u3011\uFF1A\u901A\u8FC7 `dws chat message list-all` \u5355\u6B21\u8C03\u7528\u62C9\u53D6\u6240\u6709\u4F1A\u8BDD\u6D88\u606F\uFF0C\u672C\u5730\u6309 conversation_ids \u8FC7\u6EE4\u3002\u9002\u5408 200+ \u7FA4\u6279\u91CF\u573A\u666F\uFF081~5 \u6B21\u5206\u9875\u66FF\u4EE3 200+ \u5B50\u8FDB\u7A0B\uFF09\u3002\u4E0E dingtalk_message / dingtalk_stream \u4EA7\u51FA\u540C\u6784 message_received \u4E8B\u4EF6\u3002",factory:a((t,e)=>new Ko(t,e),"factory"),configPolicy:{requiredFields:[wr],validate:a(t=>{let e=k(t.filters)?t.filters:{};return Za(t.conversation_ids??t.conversationIds??e.conversation_ids??e.conversationIds)},"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 qo(t,e),"factory"),configPolicy:{requiredFields:[],validate:PS}},{type:"cron_scheduler",description:"\u5B9A\u65F6\u8C03\u5EA6\u4E8B\u4EF6\u6E90",factory:a(t=>new Jo(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 Go(t),"factory"),configPolicy:{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],validate:$S}}];function DS(t){return Ya.find(e=>e.type===t)}a(DS,"getEventSourceDescriptor");function br(t,e){let r=DS(t)?.configPolicy;if(!r)return{requiredFields:[],errors:[]};let o=r.validate?.(e);return{requiredFields:o?.requiredFields??r.requiredFields??[],optionalFields:o?.optionalFields??r.optionalFields??[],...r.oneOf?{oneOf:r.oneOf}:{},errors:o?.errors??[],...o?.summary?{summary:o.summary}:{}}}a(br,"eventSourceConfigPolicy");function PS(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(PS,"validateDingtalkStreamSourceConfig");function $S(t){return MS(t)?OS(t):{requiredFields:[{field:"base_id",label:"AI \u8868\u683C Base ID"},{field:"table_id",label:"AI \u8868\u683C Table ID"}],errors:[]}}a($S,"validateAitableRecordSourceConfig");function MS(t){let e=t.source_table;return k(e)&&e.mode==="reference"}a(MS,"hasReferenceSourceTable");function OS(t){let e=t.source_table,n=k(e)&&typeof e.ref=="string"?e.ref.trim():"";return n?ES.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(OS,"referenceSourceTablePolicy");var jS=new Map(Ya.map(t=>[t.type,t.factory])),Zo=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)??jS.get(e.type);if(!r)return m.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 m.info("event-source-registry","\u4E8B\u4EF6\u6E90\u5DF2\u521B\u5EFA",{name:e.name,type:e.type}),o}catch(o){return m.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=FS(c,n.configRefs??{}),d=NS(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 FS(t,e){return Object.keys(e).length===0?t:Yo(t,e)}a(FS,"resolveConfigReferences");function mp(t,e){return Object.keys(e).length===0?t:Yo(t,e)}a(mp,"resolvePureRefs");function Yo(t,e){if(Array.isArray(t))return t.map(o=>Yo(o,e));if(!k(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]:(m.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]=Yo(i,e);return r}a(Yo,"resolveReferenceValue");function NS(t,e){if(t.type!=="aitable_record")return t;let n=t.config.source_table;if(!k(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}}:(m.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(NS,"resolveEventSourceReferences");function hp(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,Qa(r,`${c}.config`,i.config),i.handler_config&&(r[`${c}.handler_config`]=i.handler_config,Qa(r,`${c}.handler_config`,i.handler_config))}return r}a(hp,"collectWorkflowReferenceValues");function Qa(t,e,n){if(k(n))for(let[r,o]of Object.entries(n)){let i=`${e}.${r}`;t[i]=o,k(o)&&Qa(t,i,o)}}a(Qa,"flattenReferenceValues");var zt=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),m.debug("global-var","set",{key:e});let r=this.listeners.get(e);if(r)for(let o of r)try{o()}catch(i){m.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 O}from"zod";var LS=O.enum(["ambient","task","guardian"]),WS=O.object({id:O.string().min(1),name:O.string().min(1),description:O.string().default("")}),BS=O.enum(["critical","warning"]),zS=O.object({id:O.string().min(1),rule:O.string().min(1),severity:BS.default("warning")}),US=O.object({format:O.enum(["json","text","markdown"]).default("text"),schema:O.record(O.string(),O.unknown()).optional()}),VS=O.object({auto_execute:O.boolean(),requires_human_review:O.boolean(),can_escalate:O.boolean().optional(),can_delegate:O.boolean().optional(),can_suggest_workflow_change:O.boolean().optional()}),KS=O.object({initial_level:O.number().min(1).default(1),auto_level_up_threshold:O.number().min(1).default(20),level_down_on_failure:O.boolean().default(!0),autonomy_by_level:O.record(O.string(),VS).default({})}),qS=O.object({enabled:O.boolean().default(!1),persistence:O.enum(["file","aitable","none"]).default("none"),max_entries:O.number().min(1).default(100),retention_days:O.number().min(1).default(90),learns_from:O.array(O.enum(["execution_results","human_feedback","peer_corrections"])).default([])}),fB=O.object({source:O.string().url(),collection:O.string().min(1)}),yp=O.object({bin:O.string().min(1),args:O.array(O.string()).default([]),timeout_ms:O.number().int().min(1).optional()}),Xa=".kb/wiki/_index.md",HS=O.object({source_kind:O.enum(["aitable","excel","md"]).optional(),inputs:O.array(O.string()).default([]),build:O.array(yp).default([]),reflow:yp.optional(),artifact:O.string().default(Xa),validate:O.array(O.string()).default([]),custom:O.record(O.string(),O.unknown()).optional()}),JS=O.object({collection:O.string().min(1),source:O.string().url().optional(),compile:HS.optional()}),ec=O.union([O.string(),JS]),GS=O.object({domains:O.array(O.string()).default([]),kb_collections:O.array(ec).default([])}),kr=O.object({id:O.string().min(1),name:O.string().min(1),department:O.string().optional(),version:O.string().default("1.0.0"),archetype:LS.default("task"),persona:O.union([O.string().min(1),O.object({file:O.string().min(1)})]),skills:O.array(WS).default([]),guardrails:O.array(zS).default([]),output_standard:US.optional(),knowledge_scope:GS.optional(),trust:KS.optional(),memory:qS.optional()});function tc(t){let e=kr.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(tc,"parseRoleDefinition");var wp={auto_execute:!1,requires_human_review:!0,can_escalate:!1,can_delegate:!1,can_suggest_workflow_change:!1};var ZS="__ephemeral__",Qo=class{constructor(e){this.registry=e}registry;static{a(this,"RoleResolver")}async resolve(e){let n=this.registry.get(e);return n?bp(n,!1):(m.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=XS(e);return bp(n,!0)}};function YS(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}:{...wp}}a(YS,"resolveAutonomy");function bp(t,e){let n=t.trust?.initial_level??1;return{definition:t,currentTrustLevel:n,autonomy:YS(t,n),memoryEntries:[],ephemeral:e}}a(bp,"buildInstance");function QS(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(QS,"buildRoleContext");async function nc(t,e){if(!t||!e||!e.trim())return;let r=await t.resolve(e)??t.buildEphemeral(e);return QS(r)}a(nc,"resolveRoleContext");function XS(t){let e=t.trim()||"\u901A\u7528\u52A9\u624B";return kr.parse({id:ZS,name:ex(e),persona:e,archetype:"task"})}a(XS,"ephemeralDefinition");function ex(t){let n=(t.split(`
|
|
303
|
+
`)[0]?.trim()??"")||"\u4E34\u65F6\u89D2\u8272";return n.length>20?`${n.slice(0,20)}\u2026`:n}a(ex,"deriveName");var vr=new Set(["ai","coding","messaging","git","codeReview","ci","table","todo","approval","file","memory","shell"]);function Xo(t,e){if(t==null)return"";switch(e){case"user":case"person":case"creator":case"lastModifier":return tx(t);case"department":case"group":return nx(t);case"singleSelect":return rc(t);case"multipleSelect":return rx(t);case"url":return ox(t);case"richText":return ix(t);case"attachment":return sx(t);case"unidirectionalLink":case"bidirectionalLink":return cx(t);case"geolocation":return lx(t);case"text":case"primaryDoc":case"telephone":case"email":case"barcode":case"idCard":return fn(t);case"number":case"currency":case"progress":case"rating":return dx(t);case"date":case"createdTime":case"lastModifiedTime":return fn(t);case"checkbox":return!!t;default:return un(t)}}a(Xo,"normalizeByType");function tx(t){if(Array.isArray(t))return t.map(e=>{if(k(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:un(e)}return un(e)});if(k(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 un(t)}a(tx,"normalizePersonCell");function nx(t){return Array.isArray(t)?t:un(t)}a(nx,"normalizeIdArray");function rc(t){if(typeof t=="string")return t;if(k(t)){let e=t.name;if(typeof e=="string")return e;let n=t.id;if(typeof n=="string")return n}return fn(t)}a(rc,"extractOptionName");function rx(t){return Array.isArray(t)?t.map(e=>rc(e)).filter(Boolean).join(", "):rc(t)}a(rx,"extractOptionNames");function ox(t){if(typeof t=="string")return t;if(k(t)){let e=t.link;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return fn(t)}a(ox,"normalizeUrlCell");function ix(t){if(typeof t=="string")return t;if(k(t)){let e=t.markdown;if(typeof e=="string")return e;let n=t.text;if(typeof n=="string")return n}return fn(t)}a(ix,"extractMarkdown");function sx(t){return Array.isArray(t)?t.map(e=>{if(k(e)){let n=e.filename??e.name;if(typeof n=="string")return n}return""}).filter(Boolean).join(", "):fn(t)}a(sx,"normalizeAttachments");function ax(t){return Array.isArray(t)?t.map(e=>{if(!k(e))return null;let n=e.filename??e.name;if(typeof n!="string")return null;let r=typeof e.url=="string"?e.url:typeof e.resourceUrl=="string"?e.resourceUrl:void 0;return{filename:n,url:r,resourceId:typeof e.resourceId=="string"?e.resourceId:void 0,size:typeof e.size=="number"?e.size:void 0,type:typeof e.type=="string"?e.type:void 0,...typeof e.isLink=="boolean"?{isLink:e.isLink}:{}}}).filter(e=>e!==null):[]}a(ax,"extractAttachmentDetails");function cx(t){if(k(t)){let e=t.linkedRecordIds;if(Array.isArray(e))return e}return un(t)}a(cx,"extractLinkedIds");function lx(t){return k(t)?t:fn(t)}a(lx,"normalizeGeo");function fn(t){return t==null?"":typeof t=="string"?t:String(t)}a(fn,"primitiveToString");function dx(t){if(typeof t=="number")return t;if(typeof t=="string"){let e=Number(t);return Number.isFinite(e)?e:0}return 0}a(dx,"toNumber");function un(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=>un(e)).join(", ");if(k(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(un,"legacyNormalize");function ux(t,e){let n={};for(let[r,o]of Object.entries(t))n[r]=Xo(o,e?.[r]);return n}a(ux,"normalizeFields");var ei=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 zt,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=po();if(!s)return await i();s.startStep(n.id,e.id,e.name,this.resolveInput(e,n,r));try{let c=await i();return await s.endStep(n.id,c.status,c.output,c.error??c.blockReason,c.logs??[]),c}catch(c){throw await s.endStep(n.id,"failed",{},c instanceof Error?c.message:String(c)),c}}async executeCodingAgent(e,n,r,o){let i=[],s=this.resolveEngine(e),c=Ro[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 nc(this.roleResolver,void 0),f=await this.resolveKb(u),p=pr({...u?{roleContext:u}:{},...f?{kbContext:f}:{}}),g=p?`${p.promptBlock}
|
|
302
304
|
|
|
303
305
|
---
|
|
304
306
|
|
|
305
|
-
${l}`:l;m.info("executor","Coding Agent \u6267\u884C",{stepId:e.id,agent:c,promptLen:g.length,contextInjected:!!p}),i.push(`[Agent: ${c}] \u6267\u884C\u4E2D...`);try{let h=await pt(g,{agent:c,configPath:ft(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 y=h instanceof Error?h.message:String(h);return o.aborted?{status:"blocked",output:{},blockReason:"\u4EFB\u52A1\u88AB\u53D6\u6D88",logs:i}:(m.error("executor","Agent \u6267\u884C\u5F02\u5E38",{stepId:e.id,error:y}),{status:"failed",output:{},error:y,logs:[...i,`[ERROR] ${y}`]})}}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 m.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
|
|
307
|
+
${l}`:l;m.info("executor","Coding Agent \u6267\u884C",{stepId:e.id,agent:c,promptLen:g.length,contextInjected:!!p}),i.push(`[Agent: ${c}] \u6267\u884C\u4E2D...`);try{let h=await pt(g,{agent:c,configPath:ft(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 y=h instanceof Error?h.message:String(h);return o.aborted?{status:"blocked",output:{},blockReason:"\u4EFB\u52A1\u88AB\u53D6\u6D88",logs:i}:(m.error("executor","Agent \u6267\u884C\u5F02\u5E38",{stepId:e.id,error:y}),{status:"failed",output:{},error:y,logs:[...i,`[ERROR] ${y}`]})}}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 m.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 nc(this.roleResolver,s.meta.role),u=await this.resolveKb(d),f=this.buildToolkit(n,e,d,u),p={itemId:n.id,stepId:e.id,input:l,variables:r,toolkit:f,signal:o,config:this.resolveStepConfig(e),configDir:this.settings.configDir,trackerRef:{baseId:this.settings.tracker.base_id,tableId:this.settings.tracker.table_id},setGlobalVar:a((w,b)=>this.globalVars.set(w,b),"setGlobalVar"),getGlobalVar:a(w=>this.globalVars.get(w),"getGlobalVar"),report:a((w,b)=>{za(w,b).catch(()=>{})},"report"),roleContext:d,...u?{kbContext:u}:{},log:a(w=>{i.push(w),m.debug("recipe",w,{stepId:e.id,itemId:n.id})},"log")},g=new AbortController,h=setTimeout(()=>g.abort(),c),y=fx(o,g.signal);try{m.info("recipe","\u6267\u884C\u5F00\u59CB",{stepId:e.id,recipe:s.meta.id,itemId:n.id});let w=await s.execute({...p,signal:y});return w.logs=[...i,...w.logs],m.info("recipe","\u6267\u884C\u5B8C\u6210",{stepId:e.id,status:w.status}),w}catch(w){let b=w instanceof Error?w.message:String(w),v=w instanceof De?w.retryable:void 0;return m.error("recipe","\u6267\u884C\u5F02\u5E38",{stepId:e.id,error:b}),{status:"failed",output:{},error:b,...v===!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=Sp(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=kp.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=kp.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=vp.existsSync(r)?r:vp.existsSync(o)?o:r;i.endsWith(".ts")&&await Dt();try{let s=await import(en(i)),c=s.default??s.recipe;if(!c||typeof c.execute!="function")throw new Error(`Recipe "${e}" \u7F3A\u5C11\u6709\u6548\u7684 execute \u51FD\u6570`);return this.recipeCache.set(e,c),c}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`\u65E0\u6CD5\u52A0\u8F7D Recipe "${e}" (${i}): ${c}`)}}resolveInput(e,n,r){let o=e.input_mapping;if(!o)return ux(n.fields,n.fieldTypes);let i={};for(let[s,c]of Object.entries(o))if(c.startsWith("$var."))i[s]=Xo(Sp(r,c.slice(5)));else{let l=n.fieldTypes?.[c];i[s]=Xo(n.fields[c],l)}return i}buildToolkit(e,n,r,o){let i=this.mergeToolkitConfig(n),s=Lo({settings:this.settings,tracker:this.tracker,item:e,toolkitConfig:i,...r?{roleContext:r}:{},...o?{kbContext:o}:{},registry:this.toolkitRegistry});return Yf(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(vr.has(i)&&!(s===!1||s===!0)&&k(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 Sa({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))vr.has(r)||(n[r]=o);return Object.keys(this.configRefs).length>0?mp(n,this.configRefs):n}};function fx(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(fx,"combineSignals");function Sp(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(Sp,"resolveVarPath");import{mkdir as Mp,readFile as Op,rename as gx,writeFile as jp,unlink as mx}from"fs/promises";import{existsSync as hx}from"fs";import _n from"path";import{z as M}from"zod";var xp=3e4;function oc(t,e,n){return cr(n)?`dws \u767B\u5F55\u6001\u5DF2\u8FC7\u671F\uFF1A\u8BF7\u5728\u7EC8\u7AEF\u8FD0\u884C \`dws auth login\` \u91CD\u65B0\u767B\u5F55\u540E\u91CD\u8BD5\u672C\u64CD\u4F5C\u3002
|
|
306
308
|
${t}
|
|
307
309
|
\uFF08\u4EE5\u4E0A\u539F\u59CB\u660E\u7EC6\u4F9B\u8BCA\u65AD\uFF1B\u82E5\u91CD\u65B0\u767B\u5F55\u4ECD\u5931\u8D25\uFF0C\u8BF7\u9644\u660E\u7EC6\u53CD\u9988\uFF09`:`${t}
|
|
308
|
-
${e}`}a(
|
|
310
|
+
${e}`}a(oc,"withAuthDiagnosis");function px(t){if(typeof t.groupType=="string"&&t.groupType.trim())return t.groupType.toUpperCase().includes("INTERNAL")?"internal":"external";if(typeof t.isInternalGroup=="boolean")return t.isInternalGroup?"internal":"external";if(typeof t.externalGroup=="boolean")return t.externalGroup?"external":"internal"}a(px,"resolveGroupType");function Rp(t){let e=[];for(let n of t){if(!n||typeof n!="object")continue;let r=n,o=typeof r.openConversationId=="string"?r.openConversationId.trim():"";if(!o)continue;let i=typeof r.title=="string"?r.title:"",s={conversationId:o,title:i||(typeof r.name=="string"?r.name:"")};typeof r.myRole=="string"&&r.myRole.trim()&&(s.myRole=r.myRole.trim());let c=px(r);c&&(s.groupType=c),e.push(s)}return e}a(Rp,"parseGroupEntries");function Cp(t){if(!t||typeof t!="object")return null;let e=t,n=["data","body"].map(o=>e[o]).find(o=>!!o&&typeof o=="object"),r=n?[n,e]:[e];for(let o of r){let i=o.result,s=i&&typeof i=="object"?i.groups:void 0;if(Array.isArray(s))return s;if(Array.isArray(o.groups))return o.groups}for(let o of Object.values(e))if(Array.isArray(o))return o;return null}a(Cp,"unwrapGroupList");function Ip(t){if(!t||typeof t!="object")return null;let e=[t];for(let n of["data","result","body"]){let r=t[n];r&&typeof r=="object"&&!Array.isArray(r)&&e.push(r)}for(let n of e){if(n.success===!1||String(n.success).toLowerCase()==="false")return{code:n.errorCode==null?void 0:String(n.errorCode),message:typeof n.errorMsg=="string"?n.errorMsg:void 0};if(n.errorCode!=null&&n.errorCode!=="")return{code:String(n.errorCode),message:typeof n.errorMsg=="string"?n.errorMsg:void 0};if(typeof n.errorMsg=="string"&&n.errorMsg.trim()!=="")return{message:n.errorMsg}}return null}a(Ip,"chatFailure");async function Tp(t,e={}){let n=t.trim();if(!n)throw new Error("\u7FA4\u641C\u7D22\u5173\u952E\u8BCD\u4E0D\u80FD\u4E3A\u7A7A");let r=e.runner??K,o=e.timeoutMs??xp,i=e.profile?.trim(),s=e.log??(()=>{}),c=e.probe??(w=>Xt(w,["--version"]).ok),l=e.dwsBin??mr(c,e.homedir);if(!c(l))throw new Error(`dws CLI \u4E0D\u53EF\u7528\uFF08\u63A2\u6D4B \`${l} --version\` \u5931\u8D25\uFF09\u3002\u8BF7\u5148\u5B89\u88C5\u5E76\u767B\u5F55 dws \u540E\u91CD\u8BD5\uFF1B\u65E0\u6CD5\u641C\u7D22\u7FA4\u3002`);let d=["chat","search","--query",n];i&&d.push("--profile",i),d.push("--format","json");let u=await r(l,d,{timeoutMs:o});if(u.exitCode!==0)throw new Error(oc(`\u641C\u7D22\u7FA4\u5931\u8D25\uFF1A${l} ${d.join(" ")} exit ${u.exitCode} ${u.stderr.slice(0,200)}`.trim(),"\u8BF7\u786E\u8BA4 dws \u7248\u672C\u652F\u6301 chat search \u4E14\u767B\u5F55\u6001\u6709\u6548\uFF08\u53EF\u5C1D\u8BD5 `dws auth login`\uFF09\u3002",u.stderr));let f=u.stdout.trim()?JSON.parse(u.stdout):{},p=Ip(f);if(p)throw new Error(oc(`\u641C\u7D22\u7FA4\u5931\u8D25${p.code?`\uFF08errorCode=${p.code}\uFF09`:""}${p.message?`\uFF1A${p.message}`:""}`,"\u8BF7\u786E\u8BA4 dws \u767B\u5F55\u6001\u6709\u6548\uFF08\u53EF\u5C1D\u8BD5 `dws auth login`\uFF09\u3002",`${p.code??""} ${p.message??""}`));let g=Cp(f),h=Rp(g??[]),y=!1;if(f&&typeof f=="object"){let w=f.result;w&&typeof w=="object"&&(y=w.hasMore===!0)}return y&&s("dws chat search \u7ED3\u679C\u672A\u53D6\u5B8C\u6574\uFF08hasMore=true\uFF09\uFF0C\u4EC5\u4F7F\u7528\u5DF2\u8FD4\u56DE\u90E8\u5206"),{groups:h,hasMore:y,via:`${l} ${d.join(" ")}`}}a(Tp,"searchDwsChatGroups");async function HB(t={}){let e=t.runner??K,n=t.timeoutMs??xp,r=t.role??"admin",o=t.profile?.trim(),i=t.log??(()=>{}),s=t.probe??(p=>Xt(p,["--version"]).ok),c=t.dwsBin??mr(s,t.homedir);if(!s(c))throw new Error(`dws CLI \u4E0D\u53EF\u7528\uFF08\u63A2\u6D4B \`${c} --version\` \u5931\u8D25\uFF09\u3002\u8BF7\u5148\u5B89\u88C5\u5E76\u767B\u5F55 dws \u540E\u91CD\u8BD5\uFF1B\u65E0\u6CD5\u5217\u51FA\u7FA4\u4F1A\u8BDD\u3002`);let l=[];r==="owner"&&l.push("--role","OWNER");let d=r==="all"?[["chat","group","list-all"],["chat","+chat-list-all"]]:[["chat","group","list-my-groups",...l],["chat","+chat-list-mine",...l]],u=[];for(let p of d){let g=[...p];o&&g.push("--profile",o),g.push("--format","json");try{let h=await e(c,g,{timeoutMs:n});if(h.exitCode!==0){u.push(`${c} ${p.join(" ")}: exit ${h.exitCode} ${h.stderr.slice(0,200)}`.trim());continue}let y=h.stdout.trim()?JSON.parse(h.stdout):{},w=Ip(y);if(w){u.push(`${c} ${p.join(" ")}: `+`${w.code?`errorCode=${w.code} `:""}${w.message??""}`.trim());continue}let b=Cp(y),v=Rp(b??[]);return r!=="all"||y.hasMore!==!0||i("dws chat group list-all \u7ED3\u679C\u672A\u62C9\u53D6\u5B8C\u6574\uFF08hasMore=true\uFF09\uFF0C\u4EC5\u4F7F\u7528\u5DF2\u8FD4\u56DE\u90E8\u5206"),{conversations:v,via:`${c} ${p.join(" ")}`}}catch(h){u.push(`${c} ${p.join(" ")}: ${h instanceof Error?h.message:String(h)}`)}}let f=`\u5217\u51FA\u7FA4\u4F1A\u8BDD\u5931\u8D25\uFF0C\u5DF2\u5C1D\u8BD5\u4EE5\u4E0B\u5019\u9009\u547D\u4EE4\uFF1A
|
|
309
311
|
${u.map(p=>` - ${p}`).join(`
|
|
310
|
-
`)}`;throw new Error(
|
|
311
|
-
`)))}a(
|
|
312
|
-
\u21B3 \u5B9E\u9645\u8F7D\u8377\uFF08\u8131\u654F\uFF09: ${
|
|
313
|
-
`,"utf8");try{await
|
|
312
|
+
`)}`;throw new Error(oc(f,"\u8BF7\u786E\u8BA4 dws \u7248\u672C\u652F\u6301 chat group \u5217\u4E3E\u547D\u4EE4\uFF0C\u4E14\u767B\u5F55\u6001\u6709\u6548\uFF08\u53EF\u5C1D\u8BD5 `dws auth login`\uFF09\u3002",u.join(`
|
|
313
|
+
`)))}a(HB,"listDwsConversations");var ce=class extends Error{static{a(this,"BotProvisionError")}kind;guidance;raw;constructor(e,n,r){super(n),this.name="BotProvisionError",this.kind=e,this.guidance=r?.guidance??ac(e),this.raw=r?.raw??null}};function ac(t){switch(t){case"auth_required":return"\u4E00\u6B21\u6027\u4EBA\u95E8\uFF1A\u8FD0\u884C `dws auth login` \u91CD\u65B0\u767B\u5F55\uFF08headless \u73AF\u5883\u7528 `dws auth login --device`\uFF09\uFF0C\u7136\u540E\u91CD\u8DD1\u672C\u547D\u4EE4\uFF08\u53EF\u4ECE\u65AD\u70B9\u7EED\u8DD1\uFF09\u3002";case"developer_role_missing":return"\u5F53\u524D\u8D26\u53F7\u7F3A\u5C11\u5F00\u653E\u5E73\u53F0\u5F00\u53D1\u8005\u8EAB\u4EFD\uFF1A\u8BF7\u7BA1\u7406\u5458\u5728\u5F00\u653E\u5E73\u53F0\u300C\u6743\u9650\u7BA1\u7406\u300D\u4E2D\u6DFB\u52A0\u5F00\u53D1\u8005\u540E\u91CD\u8BD5\u3002";case"org_cli_access_denied":return"\u7EC4\u7EC7\u672A\u5F00\u653E CLI \u8BBF\u95EE\uFF1A\u8BF7\u7EC4\u7EC7\u7BA1\u7406\u5458\u5728\u9489\u9489\u5F00\u53D1\u8005\u5E73\u53F0\u300CCLI \u8BBE\u7F6E\u300D\u5F00\u542F\u300C\u5141\u8BB8\u6210\u5458\u901A\u8FC7 CLI \u8BBF\u95EE\u4E2A\u4EBA\u6570\u636E\u300D\u5E76\u914D\u7F6E\u4F7F\u7528\u8303\u56F4\uFF08https://open-dev.dingtalk.com/fe/old?hash=%23%2FdeveloperSettings#/developerSettings\uFF09\uFF0C\u5F00\u901A\u540E\u91CD\u65B0\u767B\u5F55\u5373\u53EF\u3002";case"agent_gate_unified_app_id":return"\u975E\u4EBA\u5BA1\uFF1Alifecycle \u7684 APPROVAL_REQUIRED(provide_unified_app_id) \u53EA\u662F\u8981\u6C42\u663E\u5F0F unifiedAppId\uFF0C\u5F15\u64CE\u4F1A\u7528 `dev app get --app-key` \u81EA\u52A8\u89E3\u9501\uFF0C\u65E0\u9700\u4EBA\u5DE5\u4ECB\u5165\u3002";case"publish_approval_pending":return"\u516C\u5F00\u53D1\u5E03\u9700\u7BA1\u7406\u5458\u5BA1\u6279\uFF1A\u7528 `aitable-workflow bot status` \u67E5\u770B\u5BA1\u6279\u4EBA\u4E0E\u50AC\u529E\u547D\u4EE4\uFF1B\u4E0D\u963B\u585E\u5F15\u64CE\u5EFA\u8054\uFF08bound \u76F8\u5DF2\u53EF\u7528\uFF09\u3002";case"bot_not_published":return"\u673A\u5668\u4EBA\u672A\u53D1\u5E03\u3001\u4F01\u4E1A\u76EE\u5F55\u4E0D\u53EF\u89C1\uFF08RESOURCE_NOT_FOUND 500025\uFF09\uFF1A\u5148\u5B8C\u6210 publish \u76F8\uFF08\u7BA1\u7406\u5458\u5BA1\u6279\u901A\u8FC7\uFF09\uFF0C\u518D\u91CD\u8BD5\u62C9\u7FA4\u3002";case"permission_denied":return"\u5F53\u524D dws \u8D26\u53F7\u65E0\u6743\u6267\u884C\u8BE5\u64CD\u4F5C\uFF08AUTH_PERMISSION_DENIED 500020\uFF09\u3002\u9AD8\u9891\u6210\u56E0\uFF1A\u4F01\u4E1A\u673A\u5668\u4EBA\u7531\u540C\u7EC4\u7EC7\u5176\u4ED6\u8D26\u53F7\u521B\u5EFA\uFF0C\u5F53\u524D\u8D26\u53F7\u4E0D\u662F\u5176 owner/\u5F00\u53D1\u8005\u2014\u2014\u8BF7\u521B\u5EFA\u8005\u5728\u5F00\u653E\u5E73\u53F0\u628A\u4F60\u52A0\u4E3A\u5E94\u7528\u5F00\u53D1\u8005\uFF0C\u6216\u7531\u521B\u5EFA\u8005\u6267\u884C\u672C\u6B65\u9AA4\uFF1B\u53EA\u60F3\u5148\u8DD1\u901A\u6D41\u7A0B\u53EF\u6539\u9009\u300C\u81EA\u5B9A\u4E49\u673A\u5668\u4EBA\u300D\u3002";case"bot_already_installed":return"\u8BE5\u7FA4\u5DF2\u5B89\u88C5\u8FC7\u6B64\u673A\u5668\u4EBA\uFF08500043\uFF09\uFF1A\u65E0\u9700\u91CD\u590D\u6DFB\u52A0\uFF0C\u89C6\u540C\u6210\u529F\u7EE7\u7EED\u540E\u7EED\u6D41\u7A0B\u5373\u53EF\u3002";case"timeout":return"dws \u8C03\u7528\u8D85\u65F6\uFF1A\u68C0\u67E5\u7F51\u7EDC\u540E\u91CD\u8DD1\u672C\u547D\u4EE4\uFF08\u72B6\u6001\u6587\u4EF6\u652F\u6301\u65AD\u70B9\u7EED\u8DD1\uFF09\u3002";default:return"\u67E5\u770B\u4E0A\u65B9\u9519\u8BEF\u8BE6\u60C5\uFF1B\u5FC5\u8981\u65F6 `dws --help` \u6838\u5BF9\u547D\u4EE4\u9762\uFF0C\u6216\u91CD\u8DD1\u672C\u547D\u4EE4\u65AD\u70B9\u7EED\u8DD1\u3002"}}a(ac,"provisionGuidance");function _p(t){let e=[t.code??"",t.message??"",yx(t.raw)].join(" ");return/provide_unified_app_id/i.test(e)?"agent_gate_unified_app_id":/timed?\s*out|ETIMEDOUT/i.test(e)?"timeout":/token_refresh_failed|authenticated\s*:\s*false|auth(entication)?\s*(required|failed|expired)|unauthorized|please\s+(re-?)?login|login\s+required|resolve\s+access\s+token|refresh_token|token\s+exchange|authcode/i.test(e)?"auth_required":/开发者(身份|权限)|developer\s+(identity|role|permission)/i.test(e)?"developer_role_missing":/PERMISSION_DENIED|permission\s+denied|500020/i.test(e)?"permission_denied":/组织.*(禁止.*CLI|CLI.*(访问|开通|申请|使用))|org.*cli.*(access|apply|disabled|forbidden)/i.test(e)?"org_cli_access_denied":/500043|该群已安装过此机器人/.test(e)?"bot_already_installed":/500025|RESOURCE_NOT_FOUND/.test(e)?"bot_not_published":/APPROVAL_REQUIRED|select_approver|审批/i.test(e)?"publish_approval_pending":"unknown"}a(_p,"classifyProvisionError");function yx(t){if(t==null)return"";if(typeof t=="string")return t;if(t instanceof Error)return t.message;try{return JSON.stringify(t)}catch{return""}}a(yx,"errorMessageOf");var wx=M.object({taskId:M.string(),status:M.string().optional(),intervalSeconds:M.number().optional(),expiresInSeconds:M.number().optional(),bindsUnifiedApp:M.boolean().optional()}).passthrough(),bx=M.object({status:M.string().optional(),phase:M.string().optional(),robotTaskDone:M.boolean().optional(),localConnectReady:M.boolean().optional(),localOnlyReady:M.boolean().optional(),publicUseReady:M.boolean().optional(),requiresVersionPublish:M.boolean().optional()}).passthrough(),kx=M.object({clientId:M.string().optional(),clientSecret:M.string().optional(),unifiedAppId:M.string().optional(),lifecycle:bx.optional(),actionRequired:M.string().optional(),mustContinue:M.boolean().optional(),message:M.string().optional()}).passthrough(),vx=M.object({name:M.string().optional(),appName:M.string().optional(),appKey:M.string().optional(),app_key:M.string().optional(),clientId:M.string().optional(),client_id:M.string().optional(),unifiedAppId:M.string().optional(),unified_app_id:M.string().optional()}).passthrough(),Sx=M.object({version:M.string().optional(),versionId:M.string(),versionStatus:M.string().optional()}).passthrough(),xx=M.object({versionId:M.string(),version:M.string().optional(),versionStatus:M.string().optional()}).passthrough(),Rx=M.object({name:M.string().optional(),userId:M.string(),mainAdmin:M.boolean().optional()}).passthrough(),Cx=M.object({requiresApproval:M.boolean().optional(),publishable:M.boolean().optional(),published:M.boolean().optional(),approvalSubmitted:M.boolean().optional(),sensitive:M.boolean().optional(),actionRequired:M.string().optional(),approvalCandidates:M.array(Rx).optional()}).passthrough(),Ix=M.object({versionId:M.string().optional(),version:M.string().optional(),versionStatus:M.string().optional()}).passthrough(),i1=M.object({error:M.object({server_error_code:M.union([M.string(),M.number()]).optional(),code:M.union([M.string(),M.number()]).optional(),message:M.string().optional()}).passthrough().optional()}).passthrough();function Tx(t,e=500){let n;try{n=t===void 0?"(undefined)":JSON.stringify(t)??String(t)}catch{n=String(t)}return n=n.replace(/"(client_?secret|appSecret|app_secret)"\s*:\s*"[^"]*"/gi,'"$1":"***"'),n.length>e?`${n.slice(0,e)}\u2026`:n}a(Tx,"redactPayloadForLog");function Sr(t,e,n){let r=t.safeParse(e);if(!r.success){let o=r.error.issues[0],i=o?`${o.path.join(".")} ${o.message}`:r.error.message;throw new ce("unknown",`dws ${n} \u54CD\u5E94\u4E0E\u9884\u671F\u5951\u7EA6\u4E0D\u7B26: ${i}
|
|
314
|
+
\u21B3 \u5B9E\u9645\u8F7D\u8377\uFF08\u8131\u654F\uFF09: ${Tx(e)}`,{raw:e})}return r.data}a(Sr,"parseWith");var Fp=["preflight","submitted","robot_ready","unified_resolved","bound","version_created","approver_selected","publish_pending","published","grouped"],Oe=Object.fromEntries(Fp.map((t,e)=>[t,e])),_x={submit_accepted:"submitted",robot_ready:"robot_ready",unified_resolved:"unified_resolved",bound:"bound",version_created:"version_created",approver_selected:"approver_selected",publish_submitted:"publish_pending",published:"published",grouped:"grouped"};function Be(t,e){let n=_x[e.type],r=Oe[t.phase],o=Oe[n];if(o===r)return t;let i=e.type==="publish_submitted"&&t.phase==="version_created";if(o!==r+1&&!i)throw new ce("unknown",`\u975E\u6CD5\u72B6\u6001\u8F6C\u79FB: ${t.phase} \u2192 ${n}\uFF08\u4E8B\u4EF6 ${e.type}\uFF09\uFF0Cprovision \u76F8\u4F4D\u5FC5\u987B\u6309\u5E8F\u63A8\u8FDB`);let s={phase:n};switch(e.type){case"submit_accepted":s.taskId=e.taskId;break;case"robot_ready":s.clientId=e.clientId;break;case"unified_resolved":s.unifiedAppId=e.unifiedAppId;break;case"bound":s.credRef=e.credRef;break;case"version_created":s.versionId=e.versionId,e.version&&(s.versionNumber=e.version);break;case"approver_selected":s.approverUserId=e.userId;break;case"grouped":s.openConversationId=e.openConversationId;break;default:break}return{...t,...s,updatedAt:new Date().toISOString()}}a(Be,"applyProvisionEvent");function Ap(t,e){return{schemaVersion:1,appName:t,robotName:e,phase:"preflight",updatedAt:new Date().toISOString()}}a(Ap,"createInitialProvisionState");function Ax(t,e){if(e&&cc(e))return`\u7248\u672C\u5DF2\u53D1\u5E03\uFF08versionStatus=${e}\uFF09\uFF0C\u91CD\u8DD1 provision \u7EED\u8DD1\u5B8C\u6210\u72B6\u6001\u540C\u6B65\u4E0E\u540E\u7EED\u6B65\u9AA4`;switch(t){case"preflight":return"\u8FD0\u884C `aitable-workflow bot provision --name <\u5E94\u7528\u540D>`\uFF08\u5EFA\u53F7\u524D\u4F1A\u5148\u6309\u540D\u63A2\u6D4B\uFF0C\u5E42\u7B49\uFF09";case"submitted":return"\u8F6E\u8BE2 `dws dev app robot result --task-id <taskId> -f json`\uFF08\u91CD\u8DD1 provision \u4F1A\u81EA\u52A8\u7EED\u8DD1\uFF09";case"robot_ready":return"\u89E3\u6790 unifiedAppId\uFF1A`dws dev app get --app-key <clientId>`\uFF08provision \u81EA\u52A8\u5B8C\u6210\uFF09";case"unified_resolved":return"\u7ED1\u5B9A\u51ED\u636E\uFF1Aprovision --bind env \u5199 .env DINGTALK_ROBOTS\uFF08\u5F15\u64CE\u5EFA\u8054\u53EF\u5148\u884C\uFF09";case"bound":return"\u5F15\u64CE\u5EFA\u8054\u5DF2\u53EF\u7528\uFF1B\u771F\u5B9E\u7528\u6237\u6D41\u91CF\u9700\u516C\u5F00\u53D1\u5E03\uFF1A`aitable-workflow bot provision --publish --approver-user-id <id>`";case"version_created":return"\u5BA1\u6279\u9884\u68C0\uFF1A`dws dev app version check-approval --unified-app-id <id> --version-id <id>`\uFF08\u9700\u9009\u5BA1\u6279\u4EBA\u65F6\u7531\u7528\u6237\u786E\u8BA4\uFF09";case"approver_selected":return"\u63D0\u4EA4\u53D1\u5E03\uFF1A`dws dev app version publish --approver-user-id <id> --yes`";case"publish_pending":return"\u7B49\u5F85\u7BA1\u7406\u5458\u5BA1\u6279\uFF1A`aitable-workflow bot status --refresh` \u67E5\u770B\u8FDB\u5EA6\uFF1B\u50AC\u529E\u6A21\u677F\u89C1 status \u8F93\u51FA";case"published":return"\u5DF2\u53D1\u5E03\uFF1B\u53EF\u62C9\u7FA4\uFF1A`aitable-workflow bot provision --group <openConversationId|\u7FA4\u540D>`";case"grouped":return"\u5168\u94FE\u8DEF\u5B8C\u6210\uFF08\u5EFA\u53F7\u2192\u7ED1\u5B9A\u2192\u53D1\u5E03\u2192\u62C9\u7FA4\uFF09"}}a(Ax,"nextStepForPhase");var Ex=M.object({schemaVersion:M.literal(1),appName:M.string(),robotName:M.string().optional(),phase:M.enum(Fp),taskId:M.string().optional(),clientId:M.string().optional(),unifiedAppId:M.string().optional(),credRef:M.string().optional(),versionId:M.string().optional(),versionNumber:M.string().optional(),approverUserId:M.string().optional(),openConversationId:M.string().optional(),updatedAt:M.string()}).strict();function Dx(t){return _n.join(t,".aitable","provision-state.json")}a(Dx,"defaultProvisionStatePath");function Px(t){let e=Ex.safeParse(t);return e.success?e.data:null}a(Px,"parseProvisionState");async function $x(t){try{let e=await Op(t,"utf8");return Px(JSON.parse(e))}catch{return null}}a($x,"loadProvisionState");async function Mx(t,e){await Mp(_n.dirname(t),{recursive:!0});let n=`${t}.tmp`;await jp(n,JSON.stringify(e,null,2)+`
|
|
315
|
+
`,"utf8");try{await gx(n,t)}catch(r){throw await mx(n).catch(()=>{}),r}}a(Mx,"saveProvisionState");function Ep(t,e,n){return Np(t,"DINGTALK_ROBOTS",e,n,"credRef\u2192\u51ED\u636E map")}a(Ep,"mergeEnvRobotCredentials");function Ox(t,e,n){let r=e.trim();if(!r)throw new ce("unknown","corpId \u4E0D\u80FD\u4E3A\u7A7A");return Np(t,"DINGTALK_ENTERPRISE_ROBOTS",r,n,"corpId\u2192\u4F01\u4E1A\u673A\u5668\u4EBA map")}a(Ox,"mergeEnterpriseRobotCredentials");function jx(t){if(!t)return{};let e=t.match(/^\s*DINGTALK_ENTERPRISE_ROBOTS\s*=\s*(.*)$/m);if(!e)return{};let n=Lp(e[1]??"");if(n==="")return{};try{let r=JSON.parse(n);if(!k(r))return{};let o={};for(let[i,s]of Object.entries(r))k(s)&&typeof s.name=="string"&&typeof s.unifiedAppId=="string"&&typeof s.appKey=="string"&&typeof s.appSecret=="string"&&(o[i]=s);return o}catch{return{}}}a(jx,"parseEnterpriseRobots");function Np(t,e,n,r,o){let i=n.trim();if(!i)throw new ce("unknown",`${e} \u7684\u952E\u4E0D\u80FD\u4E3A\u7A7A`);let s=t??"",c=s.includes(`\r
|
|
314
316
|
`)?`\r
|
|
315
317
|
`:`
|
|
316
|
-
`,l=s.split(/\r?\n/),d=new RegExp(`^(\\s*)${e}\\s*=\\s*(.*)$`),u={},f=-1,p="";for(let h=0;h<l.length;h++){let y=d.exec(l[h]);if(!y)continue;if(f>=0)throw new ce("unknown",`.env \u4E2D\u5B58\u5728\u591A\u884C ${e}\uFF0C\u8BF7\u5148\u624B\u5DE5\u5408\u5E76\u540E\u91CD\u8BD5`);f=h,p=y[1];let w=
|
|
317
|
-
\u21B3 ${s.guidance}`};throw s}}async ensureRobotReady(e,n,r){if(e.phase==="preflight"){let i=await this.findAppByName(e.appName);if(i){let c=i.appKey??i.app_key??i.clientId??i.client_id,l=i.unifiedAppId??i.unified_app_id;if(!c&&l){let d=await this.runner.getAppByUnifiedAppId(l);c=d?.appKey??d?.app_key??d?.clientId??d?.client_id,l=l??d?.unifiedAppId??d?.unified_app_id}if(c){m.info("bot-provision","app already exists, skipping submit",{name:e.appName});let d=Be(Be(e,{type:"submit_accepted",taskId:e.taskId??`existing:${e.appName}`}),{type:"robot_ready",clientId:c});return l&&(d=Be(d,{type:"unified_resolved",unifiedAppId:l})),r(d)}}let s=await this.runner.submitRobot({name:e.appName,robotName:n.robotName??e.appName,desc:
|
|
318
|
-
`).sort();return Tp(e.join(""))}a(_p,"computeWorkspaceRevision");function FB(t,e){let n=[...e].sort((o,i)=>o.path<i.path?-1:o.path>i.path?1:0),r={format:Ap,projectId:t,revision:_p(n),files:n};return bx(Buffer.from(JSON.stringify(r),"utf8"))}a(FB,"encodeWorkspaceBundle");function NB(t){let e;try{e=JSON.parse(kx(t).toString("utf8"))}catch(r){throw new Error(`\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u89E3\u7801\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}if(e?.format!==Ap)throw new Error(`\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u683C\u5F0F\u4E0D\u652F\u6301: ${String(e?.format)}`);if(!Array.isArray(e.files))throw new Error("\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u7F3A\u5C11 files");if(_p(e.files)!==e.revision)throw new Error("\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305 revision \u4E0E\u5185\u5BB9\u4E0D\u7B26\uFF08\u5305\u4F53\u635F\u574F\u6216\u88AB\u7BE1\u6539\uFF09");return e}a(NB,"decodeWorkspaceBundle");function BB(t){return!!(t.bucket&&t.accessKeyId&&t.accessKeySecret)}a(BB,"hasOssCredentials");var Ep=class{static{a(this,"InMemoryObjectStore")}store="memory";objects=new Map;expiresSec;constructor(e){this.expiresSec=e?.expiresSec??600}async presignPut(e,n){let r=n?.expiresSec??this.expiresSec,o=new Date(Date.now()+r*1e3).toISOString();return{method:"PUT",url:`memory://${e}`,key:e,expiresAt:o,...n?.contentType?{headers:{"Content-Type":n.contentType}}:{}}}putObject(e,n){this.objects.set(e,Buffer.from(n))}async getObject(e){let n=this.objects.get(e);if(!n)throw new Error(`InMemoryObjectStore: object not found: ${e}`);return Buffer.from(n)}async deleteObject(e){this.objects.delete(e)}keys(){return[...this.objects.keys()]}};import{existsSync as vx}from"fs";import Qo from"path";var Sx=5e3;function rc(t,e=process.platform){let n=e==="win32"?Qo.win32:Qo;return e==="win32"?n.join(t,"dws.cmd"):n.join(t,"bin","dws")}a(rc,"getGlobalDwsBinPath");function oc(t,e=process.env,n=process.platform){let r=n==="win32"?Qo.win32:Qo,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(oc,"prependGlobalDwsToPath");async function GB(t={}){let e=t.npmBin?.trim()||(process.platform==="win32"?"npm.cmd":"npm"),n=t.runner??K,r=t.platform??process.platform,o=t.env??process.env;try{let i=await n(e,["prefix","--global"],{timeoutMs:Sx}),s=i.stdout.trim();if(i.exitCode!==0||!s)return{status:"unavailable"};let c=rc(s,r);return(t.isAvailable??vx)(c)?{status:"activated",bin:c,pathAdjusted:oc(c,o,r)}:{status:"unavailable"}}catch{return{status:"unavailable"}}}a(GB,"activateGlobalDwsOnPath");function Dp(t){return`${t}__empty_streak`}a(Dp,"emptyStreakKey");function xx(t,e,n,r){let o=Math.max(1,Math.trunc(r)||1),i=Dp(e),s=Math.trunc(Number(t.getGlobalVar(i)??0)),c=Number.isFinite(s)&&s>0?s:0,l=t.getGlobalVar(e),d=Array.isArray(l)?l.length:0;if(n>0||d===0)return c!==0&&t.setGlobalVar(i,0),{allow:!0,streak:0,rounds:o};let u=c+1;return t.setGlobalVar(i,u>=o?0:u),{allow:u>=o,streak:u,rounds:o}}a(xx,"gateEmptySnapshot");function Pp(t){let e=[],n=0,r=!1;for(;n<t.length;){let o=t[n];if(!r)e.push(o),o==='"'&&(r=!0),n++;else if(o==="\\")e.push(o,t[n+1]??""),n+=2;else if(o==='"'){let i=n+1;for(;i<t.length&&/\s/.test(t[i]);)i++;let s=t[i];s===":"||s===","||s==="}"||s==="]"||s===void 0?(e.push(o),r=!1,n++):(e.push('\\"'),n++)}else e.push(o),n++}return e.join("")}a(Pp,"repairJsonStringValues");function $p(t){try{return JSON.parse(t)}catch{}try{return JSON.parse(Pp(t))}catch{return null}}a($p,"safeParseJson");function Rx(t,e){if(!t)return null;let n=t.trim(),r=n.match(/```(?:json)?\s*([\s\S]*?)```/i);r?.[1]&&(n=r[1].trim());let o=n.indexOf("{"),i=n.lastIndexOf("}");if(o===-1||i<=o)return null;let s=n.slice(o,i+1),c=$p(s);if(!c||typeof c!="object")return null;let l=e.safeParse(c);return l.success?l.data:null}a(Rx,"extractStructuredJson");function Mp(t,e){let n=new Intl.DateTimeFormat("en-CA",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(t),r=a(o=>Number(n.find(i=>i.type===o)?.value??0),"pick");return{year:r("year"),month:r("month"),day:r("day")}}a(Mp,"zonedDateParts");function Op(t,e){let n=new Intl.DateTimeFormat("en-US",{timeZone:e,hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(t),r={};for(let l of n)l.type!=="literal"&&(r[l.type]=Number(l.value));let o=a(l=>Number(r[l]??0),"get"),i=o("hour"),s=i===24?0:i;return Date.UTC(o("year"),o("month")-1,o("day"),s,o("minute"),o("second"))-t.getTime()}a(Op,"tzOffsetMs");function ic(t,e,n,r,o,i,s,c){let l=Date.UTC(t,e,n,r,o,i,0),d=Op(new Date(l),c);return new Date(l-d+s).toISOString()}a(ic,"zonedWallClockToUtc");function Cx(t,e=new Date){let n=Mp(e,t),r=new Date(Date.UTC(n.year,n.month-1,n.day)-864e5),o=r.getUTCFullYear(),i=r.getUTCMonth(),s=r.getUTCDate(),c=`${o}-${String(i+1).padStart(2,"0")}-${String(s).padStart(2,"0")}`,l=ic(o,i,s,0,0,0,0,t),d=ic(o,i,s,23,59,59,999,t);return{since:l,until:d,dateStr:c}}a(Cx,"yesterdayRange");function Ix(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"--:--";let r=new Intl.DateTimeFormat("en-GB",{timeZone:e,hourCycle:"h23",hour:"2-digit",minute:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("hour")}:${o("minute")}`}a(Ix,"formatZonedHm");function Tx(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"";let r=new Intl.DateTimeFormat("en-CA",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("year")}-${o("month")}-${o("day")} ${o("hour")}:${o("minute")}:${o("second")}`}a(Tx,"formatZonedDateTime");function Ax(t){let e=t?.trim();if(!e)return"Asia/Shanghai";try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(new Date),e}catch{return"Asia/Shanghai"}}a(Ax,"normalizeTimezone");import{createHash as _x}from"crypto";var Ex=600*1e3,Dx=50,jp=300;function Px(t){let e=t.key,n=t.ttlMs??Ex,r=t.capacity??Dx,o=t.maxPartLength??jp;function i(l,d){let u=Array.isArray(o)?o[d]??o[o.length-1]??jp:o;return String(l??"").replace(/\s+/g,"").slice(0,u)}a(i,"normalize");function s(...l){return _x("sha1").update(l.map(i).join("|")).digest("hex")}a(s,"fingerprint");function c(l){let d=l(e);if(!Array.isArray(d))return[];let u=Date.now();return d.filter(f=>f&&typeof f.h=="string"&&typeof f.ts=="number"&&u-f.ts<=n)}return a(c,"load"),{fingerprint:s,mark(l,d,...u){let f=s(...u),p=c(l);if(p.some(g=>g.h===f))return d(e,p),!1;for(p.push({h:f,ts:Date.now()});p.length>r;)p.shift();return d(e,p),!0},has(l,...d){if(!d.some(f=>String(f??"").trim()))return!1;let u=s(...d);return c(l).some(f=>f.h===u)}}}a(Px,"createFingerprintWindow");import{readFile as Yx,stat as lc,readdir as Qx}from"fs/promises";import ht from"path";import Xx from"yaml";import{z as $}from"zod";var kr=$.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]),$x=$.enum(["Grid","FormDesigner","Kanban","Calendar","Gallery","Gantt"]),vr=$.object({id:$.string().min(1),type:$x,name:$.string().min(1),field_order:$.array($.string()).optional(),visible_fields:$.array($.string()).optional(),group_by:$.string().optional(),date_field:$.string().optional(),description:$.string().optional(),for_each_step:$.enum(["needs_human","all"]).optional()}),Mx=$.array(vr).optional(),Ox=$.enum(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]),jx=$.object({name:$.string().min(1),type:Ox,options:$.array($.string()).optional(),formatter:$.string().optional(),description:$.string().optional()}),Fx=$.object({initial:$.string().min(1),active:$.array($.string()).min(1),restart:$.string().min(1).optional(),terminal:$.array($.string()).min(1),blocked:$.string().default("\u5DF2\u963B\u585E"),review:$.string().optional()}),Nx=$.object({state:$.string().min(1),title:$.string().min(1),description:$.string().optional(),current_step:$.string().optional(),owner:$.string().optional(),submitter:$.string().optional(),deadline:$.string().optional(),event_log:$.string().optional()}),sc=$.object({base_id:$.string().min(1),table_id:$.string().default(""),label:$.string().optional(),description:$.string().optional(),states:Fx,fields:Nx,field_definitions:$.array(jx).optional(),views:Mx,dws_bin:$.string().default("dws"),query_limit:$.number().default(50),human_loop:$.object({doc_workspace_id:$.string().min(1)}).optional(),form_share:$.object({enabled:$.boolean().default(!0)}).default({enabled:!0})}),Lx=$.object({template:$.string().min(1).describe("\u76F8\u5BF9\u8DEF\u5F84\u6307\u5411 workflow.yml"),recipe_dir:$.string().default("./recipes")}),Wx=$.object({dir:$.string().min(1).describe("\u5DE5\u4F5C\u6D41\u76EE\u5F55\uFF1A\u6BCF\u4E2A\u542B workflow.yml \u7684\u5B50\u76EE\u5F55 = \u4E00\u4E2A\u5DE5\u4F5C\u6D41")}),Bx=$.object({max_attempts:$.number().min(1).default(3),base_backoff_ms:$.number().min(0).default(2e3),max_backoff_ms:$.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"}),zx=$.object({engine:$.preprocess(t=>t===null||t===""?void 0:t,kr.default("claude")),model:$.string().optional(),max_concurrent:$.number().min(1).default(3),timeout_ms:$.number().default(3e5),max_step_failures:$.number().min(1).default(5),auto_advance:$.boolean().default(!0),retry:Bx,trace_dir:$.string().default("./traces")}),Ux=$.object({default_timeout_ms:$.number().default(3e5),llm:$.object({provider:$.enum(["dashscope","openai","anthropic","idealab"]).default("idealab"),model:$.string().default("Qwen3.7-Max-DogFooding"),api_key:$.string().optional()}).optional()}),Vx=$.object({dir:$.string().default("./roles"),enabled:$.boolean().default(!0)}),Kx=$.object({enabled:$.boolean().default(!1),default_timeout_ms:$.number().default(864e5),escalation_notify:$.array($.string()).default([])}),qx=$.object({interval_ms:$.number().default(5e3)}),Fp=$.object({scene:$.string().optional(),tracker:sc.optional(),workflow:Lx.optional(),workflows:Wx.optional(),agent:zx.optional(),recipe:Ux.optional(),roles:Vx.optional(),sla:Kx.optional(),polling:qx.optional(),toolkit_config:$.record($.string(),$.record($.string(),$.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 Hx}from"fs/promises";import{readFileSync as Jx}from"fs";import Wp from"path";import{parse as Bp}from"dotenv";var ac=new Set;function Np(){return ac}a(Np,"getAppliedEnvKeys");function cc(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 ac)e.has(n)||delete process.env[n];ac=e}a(cc,"applyEnvToProcess");var Gx=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,Zx=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function ei(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(ei,"parseEnvValue");function Tn(t,e,n={}){let r=n.lenient===!0;return o(t);function o(s){if(typeof s=="string"){let c=s.match(Zx);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 ei(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(Gx,(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(Tn,"interpolateEnv");var Lp=(()=>{let t={};for(let[e,n]of Object.entries(process.env))n!==void 0&&(t[e]=n);return t})();async function ti(t){let e=Wp.join(t,".env");try{let n=await Hx(e,"utf8");return{...Xo(),...Bp(n)}}catch{return Xo()}}a(ti,"buildEnvSource");function zp(t){let e=Wp.join(t,".env");try{let n=Jx(e,"utf8");return{...Xo(),...Bp(n)}}catch{return Xo()}}a(zp,"buildEnvSourceSync");function Xo(){let t=Np(),e={...Lp};for(let[n,r]of Object.entries(process.env))r!==void 0&&!(n in Lp)&&!t.has(n)&&(e[n]=r);return e}a(Xo,"envSourceBase");var eR={engine:"claude",max_concurrent:3,timeout_ms:3e5,max_step_failures:5,auto_advance:!0,trace_dir:"./traces"},tR={default_timeout_ms:3e5,llm:{provider:"idealab",model:"Qwen3.7-Max-DogFooding"}},Up={dir:"./roles",enabled:!0},nR={interval_ms:5e4},rR={enabled:!1,default_timeout_ms:864e5,escalation_notify:[]},oR={base_id:"__placeholder__",table_id:"",states:{initial:"__placeholder__",active:["__placeholder__"],terminal:["__placeholder__"],blocked:"__placeholder__"},fields:{state:"__placeholder__",title:"__placeholder__"},dws_bin:"dws",query_limit:50,form_share:{enabled:!0}},iR="aitable-workflow.config.yml";async function Te(t){let e=ht.resolve(t);try{(await lc(e)).isDirectory()&&(e=ht.join(e,iR))}catch{}return e}a(Te,"resolveConfigPath");async function Ae(t,e={}){let n=await Te(t),r=ht.dirname(n),o;try{o=await Yx(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=Xx.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 ti(r),c;try{c=Tn(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=Fp.safeParse(c);if(!l.success)throw new Error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25:
|
|
319
|
-
${JSON.stringify(l.error.issues,null,2)}`);let d=l.data,u=!!d.workflows,f;if(u){if(f=await dc(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`);m.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:ht.resolve(r,d.workflow.template),recipeDir:ht.resolve(r,d.workflow.recipe_dir)}]}let p=d.tracker??oR,g={raw:d,envSource:s,configDir:r,multiWorkflow:u,workflowEntries:f,workflowTemplatePath:f[0].templatePath,recipeDir:f[0].recipeDir,tracker:p,agent:{...eR,...d.agent},recipe:{...tR,...d.recipe},roles:{...Up,...d.roles},rolesDir:ht.resolve(r,d.roles?.dir??Up.dir),polling:{...nR,...d.polling},sla:{...rR,...d.sla}};if(m.info("config","\u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210",{mode:u?"multi-workflow":"single-workflow",workflowCount:f.length,engine:g.agent.engine}),d.tracker)for(let h of sR(d))m.warn("config",h);return g}a(Ae,"loadSettings");async function dc(t,e){let n=ht.resolve(t,e),r;try{r=await Qx(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=ht.join(n,i);try{if(!(await lc(s)).isDirectory())continue}catch{continue}let c=ht.join(s,"workflow.yml");try{await lc(c)}catch{continue}o.push({id:i,templatePath:c,recipeDir:ht.join(s,"recipes")})}return o}a(dc,"scanWorkflowDirs");function sR(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(sR,"validateStateConsistency");function An(t,e,n){return{...t,tracker:n,workflowTemplatePath:e.templatePath,recipeDir:e.recipeDir}}a(An,"createPerWorkflowSettings");import{readFile as Fi}from"fs/promises";import Bn from"path";import _m from"yaml";var _n="aitable-workflow.config.yml";function Vp(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:_n,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:_n,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:_n,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:_n,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:_n,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:_n,yamlPath:["polling","interval_ms"]}}),{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!e.some(o=>o.status==="error"),items:e}}a(Vp,"checkProject");import{readFile as pR}from"fs/promises";import{readFile as aR}from"fs/promises";import cR from"path";import lR from"yaml";async function En(t){let e=await dR(t.workflowEntries,t.configDir),n=t.agent.engine,o=uR(e.map(i=>i.engine))??n;return{projectEngine:n,workflowOverrides:e,configuredEngine:o,...rn(o)?{configuredAgent:rn(o)}:{}}}a(En,"resolveCodingAgentSelection");function Kp(){let t=new Set,e=[];for(let n of cr()){let r=Zu(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(Kp,"detectCodingEngines");function Sr(t,e){return t==="llm_only"?!0:e.available.some(n=>n.engine===t)}a(Sr,"isEngineDetected");function qp(t,e){return Sr(t.configuredEngine,e)?t.configuredEngine:Sr(t.projectEngine,e)?t.projectEngine:e.recommendedEngine}a(qp,"chooseDetectedEngine");async function dR(t,e){let n=[];for(let r of t){let o;try{o=lR.parse(await aR(r.templatePath,"utf8"))}catch{continue}if(!k(o))continue;let i=o.toolkit_config;if(!k(i))continue;let s=i.coding;if(!k(s))continue;let c=s.engine,l=kr.safeParse(c);l.success&&n.push({workflowId:r.id,file:fR(e,r.templatePath),yamlPath:["toolkit_config","coding","engine"],engine:l.data})}return n}a(dR,"readWorkflowCodingEngines");function uR(t){let e=[...new Set(t)];return e.length===1?e[0]:void 0}a(uR,"commonEngine");function fR(t,e){let n=cR.relative(t,e);return n&&!n.startsWith("..")?n:e}a(fR,"relativeTo");var gR="aitable-workflow.config.yml";async function Hp(t,e={}){let n=e.detection??Kp(),r=await En(t),o=e.engineExplicitlySet??!0,i=[];n.available.length===0?i.push({key:"coding_agent.detected",status:"warn",message:"\u672A\u68C0\u6D4B\u5230\u672C\u673A Coding Agent CLI\uFF08\u8BF7\u5B89\u88C5 claude/codex/qoder \u7B49 CLI\uFF0C\u6216\u542F\u52A8\u5DF2\u5B89\u88C5\u7684\u5343\u95EE\u529E\u516C\u684C\u9762\u5E94\u7528\u4EE5\u542F\u7528 qwenwork\uFF0C\u6216\u9009\u62E9 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09"}):i.push({key:"coding_agent.detected",status:"ok",value:n.available.map(g=>g.engine),message:`\u672C\u673A\u53EF\u7528: ${n.available.map(g=>`${g.engine}(${g.cmd})`).join(", ")}`});let s=qp(r,n),c=Sr(r.configuredEngine,n),l=Sr(r.projectEngine,n),u=r.workflowOverrides.length>0&&r.workflowOverrides.some(g=>g.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:xr(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:xr(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:xr(r)}):i.push({key:"coding_agent.engine",status:"ok",value:r.configuredEngine,message:`Coding Agent = ${r.configuredEngine}`,writeTarget:xr(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(g=>g.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:xr(r)});for(let g of r.workflowOverrides)i.push({key:`coding_agent.workflow.${g.workflowId}`,status:g.engine===r.projectEngine?"ok":"warn",value:g.engine,message:`workflow ${g.workflowId} coding.engine = ${g.engine}${g.engine===r.projectEngine?"":"\uFF08\u8986\u76D6\u9879\u76EE\u7EA7\uFF09"}`,writeTarget:{type:"yaml",file:g.file,yamlPath:g.yamlPath}});let f=await mR(t,r.configuredAgent);return f&&i.push(f),{id:"coding_agent",name:"Coding Agent",ok:!i.some(g=>g.status==="error"),items:i}}a(Hp,"checkCodingAgent");async function mR(t,e){if(!e)return;let n=ft(t.configDir),r;try{r=await pR(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(mR,"checkCodingAgentConfigEnabled");function xr(t){return{type:"yamlAll",targets:[{file:gR,yamlPath:["agent","engine"]},...t.workflowOverrides.map(e=>({file:e.file,yamlPath:e.yamlPath}))]}}a(xr,"syncTargets");import{readFile as GR}from"fs/promises";import{existsSync as ZR,readFileSync as YR}from"fs";import Ir from"path";import lg from"yaml";import{readFile as hR}from"fs/promises";import yR from"yaml";async function st(t,e={}){let n;try{n=await hR(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=yR.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,v=a(R=>{if(Array.isArray(R))return R.map(v);if(R&&typeof R=="object"){let S={};for(let[C,A]of Object.entries(R))if(Wt(A)){let _=`__RTREF_${b++}__`;w.set(_,A),S[C]=_}else S[C]=v(A);return S}return R},"shield");if(k(r)&&Array.isArray(r.event_sources))for(let R of r.event_sources)k(R)&&R.config&&(R.config=v(R.config));if(r=Tn(r,e.envSource),w.size>0){let R=a(S=>{if(typeof S=="string")return w.get(S)??S;if(Array.isArray(S))return S.map(R);if(S&&typeof S=="object"){let C={};for(let[A,_]of Object.entries(S))C[A]=R(_);return C}return S},"restore");r=R(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(!k(r))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let o=wR(r.meta),i=bR(r.steps),s=xR(r.edges),c=_R(r.event_sources),l=ER(r.event_handlers),d=AR(i,s),u=DR(r.tracker),f=k(r.toolkit_config)?r.toolkit_config:void 0,p=MR(r.notification),g=r.field_definitions;g!=null&&m.warn("workflow","workflow.yml \u6839\u7EA7 field_definitions \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u5728 tracker.field_definitions \u4E2D\u58F0\u660E");let h=IR(u?.field_definitions??g),y=RR(r.steps,h);return m.info("workflow","\u6A21\u677F\u52A0\u8F7D\u5B8C\u6210",{name:o.name,stepCount:i.length,edgeCount:s.length,eventSourceCount:c.length,hasTracker:!!u,hasToolkitConfig:!!f,notificationChannel:p?.channel??"none",fieldRefs:y.all.size}),{meta:o,steps:i,edges:s,eventSources:c,eventHandlers:l,orderedStepIds:d,referencedFields:y,fieldDefinitions:h,tracker:u,toolkitConfig:f,notification:p}}a(st,"loadWorkflowTemplate");function wR(t){if(!k(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(wR,"parseMeta");function bR(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 steps \u6570\u7EC4");return t.map((e,n)=>{if(!k(e))throw new Error(`steps[${n}] \u5FC5\u987B\u662F\u5BF9\u8C61`);let r=String(e.id??`step_${n}`);return{id:r,name:String(e.name??r),recipe:typeof e.recipe=="string"&&e.recipe.trim()?e.recipe:void 0,engine:Gp(e.engine),auto:e.auto!==!1,needs_human:kR(e.needs_human),sla:vR(e.sla),input_mapping:Jp(e.input_mapping),output_mapping:Jp(e.output_mapping),config:TR(e.config)}})}a(bR,"parseSteps");function kR(t){if(!k(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(kR,"parseNeedsHuman");function Gp(t){if(t==="claude"||t==="codex"||t==="qoder"||t==="codebuddy"||t==="opencode"||t==="qwen"||t==="deepseek"||t==="trae"||t==="llm_only")return t}a(Gp,"parseEngine");function vR(t){if(k(t))return{timeout_ms:typeof t.timeout_ms=="number"?t.timeout_ms:3e5,escalation:SR(t.escalation)}}a(vR,"parseSLA");function SR(t){if(t==="notify"||t==="skip"||t==="block")return t}a(SR,"parseEscalation");function Jp(t){if(!k(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(Jp,"parseMapping");function xR(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 edges \u6570\u7EC4");return t.map((e,n)=>{if(!k(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(xR,"parseEdges");function RR(t,e=[]){let n=new Set,r=new Set,o=new Set,i=new Set(e.filter(l=>CR(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)k(l)&&Zp(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(RR,"extractFieldRefs");function Zp(t,e,n,r){for(let[o,i]of Object.entries(t))if(o.endsWith("_mapping")&&k(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):k(i)&&Zp(i,e,n,r)}a(Zp,"walkStepForFields");var uc=new Set(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]);function CR(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(CR,"isSystemFieldType");function IR(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!k(n))continue;let r=typeof n.name=="string"?n.name:"",o=typeof n.type=="string"?n.type:"text";if(!r)continue;uc.has(o)||m.warn("workflow",`field_definitions \u4E2D\u5B57\u6BB5"${r}"\u7684\u7C7B\u578B "${o}" \u4E0D\u53D7\u652F\u6301\uFF0C\u5DF2\u964D\u7EA7\u4E3A text`,{field:r,declaredType:o,supported:[...uc]});let i=uc.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(IR,"parseFieldDefinitions");function TR(t){if(k(t))return t}a(TR,"parseStepConfig");function AR(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);m.warn("workflow","\u90E8\u5206\u6B65\u9AA4\u672A\u5728\u8FB9\u4E2D\u8FDE\u63A5",{missing:s})}return o}a(AR,"topologicalSort");function _R(t){return!t||!Array.isArray(t)?[]:t.filter(k).map(e=>{let n=String(e.name??""),r=String(e.type??""),o=String(e.handler??"");return(!r||!o)&&m.warn("workflow","\u4E8B\u4EF6\u6E90\u7F3A\u5C11 type \u6216 handler",{item:e}),{name:n,type:r,handler:o,config:k(e.config)?e.config:{},...k(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(_R,"parseEventSources");function ER(t){return!t||!Array.isArray(t)?[]:t.filter(k).map(e=>({trigger:String(e.trigger??""),recipe:String(e.recipe??""),engine:Gp(e.engine)}))}a(ER,"parseEventHandlers");function DR(t){if(!k(t))return;let e=sc.safeParse(t);if(!e.success){if(PR(t))return;m.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(DR,"parseTracker");function PR(t){return t.base_id===""||t.baseId===""}a(PR,"isDraftTracker");var $R=new Set(["none","webhook","im"]);function MR(t){if(!k(t))return;let e=typeof t.channel=="string"?t.channel:"none",n=$R.has(e)?e:"none",r=k(t.webhook)&&typeof t.webhook.url=="string"?{url:t.webhook.url,...k(t.webhook.headers)?{headers:t.webhook.headers}:{}}:void 0,o=k(t.im)?{...typeof t.im.bot_token_env=="string"?{bot_token_env:t.im.bot_token_env}:{}}:void 0,i=k(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(MR,"parseNotification");import Yp from"path";import Qp from"fs";async function Dn(t,e){return eg({recipeDir:t,recipeId:e,exportMethod:"execute",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 execute \u51FD\u6570"})}a(Dn,"loadRecipeDefinitionResult");async function fc(t,e){return(await Dn(t,e)).definition}a(fc,"loadRecipeDefinition");async function oi(t,e){return eg({recipeDir:t,recipeId:e,exportMethod:"create",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 create \u51FD\u6570"})}a(oi,"loadEventHandlerDefinitionResult");async function pc(t,e){return(await oi(t,e)).definition}a(pc,"loadEventHandlerDefinition");async function eg(t){let{recipeDir:e,recipeId:n,exportMethod:r,invalidExportMessage:o}=t,i=Yp.resolve(e,`${n}.recipe.ts`),s=Yp.resolve(e,`${n}.recipe.js`),c=Qp.existsSync(i)?i:Qp.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 Dt();try{let l=await import(Qt(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(eg,"loadDefinition");async function ii(t,e){let n=[],r=[];for(let o of e.steps){let i=o.recipe;if(!i)continue;let s=await Dn(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:ni(o.config),loaded:!1});continue}let l=s.definition.meta;Xp(o.config,l.config,o.id,i,n),r.push({stepId:o.id,recipeId:i,configSummary:ni(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 oi(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:ni(o.handler_config),loaded:!1});continue}let l=c.definition;Xp(o.handler_config,l.meta.config,s,i,n),r.push({stepId:s,recipeId:i,configSummary:ni(o.handler_config),loaded:!0})}return{issues:n,rows:r}}a(ii,"checkWorkflowRecipes");function Xp(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))wr.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=OR(s,d.path);jR(u)||FR(u)||o.push({stepId:n,recipeId:r,level:"error",message:`config.${d.path.join(".")||"<root>"}: ${d.message}`})}let l=ri(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(Xp,"checkConfigAgainstSchema");function OR(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}a(OR,"getValueAtPath");function jR(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(jR,"isRefObject");function FR(t){return typeof t=="string"&&/^\$\{[^}]+\}$/.test(t.trim())}a(FR,"isPlaceholderString");function ri(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"?ri(e.unwrap()):e?._def?.schema?ri(e._def.schema):e?._def?.innerType?ri(e._def.innerType):null}a(ri,"objectShape");function ni(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(ni,"summarizeConfig");async function di(t){let{workflow:e,rawYaml:n,recipeDir:r,relPath:o,profile:i,onDefinitionLoadFailure:s}=t,c=e.tracker,l=[NR(o,c?.label,c?.description),LR(o,c?.label,c?.description)],d=Array.isArray(n?.event_sources)?n.event_sources:[];for(let u=0;u<e.eventSources.length;u++){let f=e.eventSources[u],p=f.name||`event_source[${u}]`,g=k(d[u])?d[u]:{},h=i?.config?.event_sources?.[f.name??""],{handler_config:y,...w}=h??{},b={...k(g.config)?g.config:{},...w},v=!!i&&!!f.name,R=a(x=>v?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,...x]}:{file:o,yamlPath:["event_sources",u,"config",...x]},"evtConfigTarget"),S=a(x=>v?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,"handler_config",...x]}:{file:o,yamlPath:["event_sources",u,"handler_config",...x]},"evtHandlerTarget"),C=hr(f.type,b);for(let x of C.errors){let D=R(x.yamlPath);l.push(si({key:`event_source.${p}.config.${x.key}`,label:x.description,file:D.file,yamlPath:D.yamlPath}))}for(let x of C.requiredFields){let D=R([x.field]);l.push(si({key:`event_source.${p}.config.${x.field}`,label:x.label,file:D.file,yamlPath:D.yamlPath,valueType:x.valueType}))}for(let x of C.optionalFields??[]){let D=R([x.field]);l.push(si({key:`event_source.${p}.config.${x.field}`,label:x.label,file:D.file,yamlPath:D.yamlPath,valueType:x.valueType,required:!1,allowEmpty:!0}))}if(C.oneOf){let x=C.oneOf.fields[0];if(x){let D=R([x]);l.push(si({key:`event_source.${p}.config.${x}`,label:C.oneOf.labels[x]??x,file:D.file,yamlPath:D.yamlPath}))}}if(!f.handler)continue;let A=await oi(r,f.handler);if(!A.definition){s?.(`EventHandler\u300C${f.handler}\u300D`,A.failure);continue}let _=A.definition;if(!_?.meta.config)continue;let T=Yt(_.meta.config,x=>x.configType==="tableRef");for(let x of T){let D=x.path.join("."),j=x.hint.description??x.hint.label??`\u4E8B\u4EF6\u6E90 ${p} \u7684 ${D}`,L=Zt(x.hint),W=L&&x.hint.defaultBase==="workflow.tracker.base_id",V=ng(x.hint),ue=S([...x.path,"baseId"]);l.push(gc({key:`event_source.${p}.handler_config.${D}.baseId`,label:ai(j,"baseId"),file:ue.file,yamlPath:ue.yamlPath,required:!W,allowEmpty:W,defaultStrategy:"workflowTrackerBaseId",setup:V}));let oe=S([...x.path,"tableId"]);l.push(gc({key:`event_source.${p}.handler_config.${D}.tableId`,label:ai(j,"tableId"),file:oe.file,yamlPath:oe.yamlPath,required:!L,allowEmpty:L,setup:V}))}let I=Rr(_.meta.config);if(I)for(let[x,D]of Object.entries(I)){let j=Et(D);if(j?.expose!==!0||BR(D))continue;let L=j.description??j.label??li(D);if(!L)continue;let W=zR(D),V=S([x]);l.push(gc({key:`event_source.${p}.handler_config.${x}`,label:L,file:V.file,yamlPath:V.yamlPath,required:!W,allowEmpty:W,valueType:j.valueType??(ci(D)?"string[]":"string")}))}}for(let u=0;u<e.steps.length;u++){let f=e.steps[u];if(!f.recipe)continue;let p=await Dn(r,f.recipe);if(!p.definition){s?.(`recipe\u300C${f.recipe}\u300D`,p.failure);continue}let g=p.definition;if(!g?.meta.config)continue;let h=a(w=>i?{file:i.file,yamlPath:["workflows",i.workflowId,"steps",f.id,...w]}:{file:o,yamlPath:["steps",u,"config",...w]},"stepTarget"),y=Yt(g.meta.config,w=>w.configType==="tableRef");for(let w of y){let b=w.path.join("."),v=w.hint.description??w.hint.label??`\u6B65\u9AA4 ${f.id} \u7684 ${b}`,R=Zt(w.hint),S=R&&w.hint.defaultBase==="workflow.tracker.base_id",C=ng(w.hint),A=h([...w.path,"baseId"]);l.push(tg({key:`step.${f.id}.config.${b}.baseId`,label:ai(v,"baseId"),file:A.file,yamlPath:A.yamlPath,required:!S,allowEmpty:S,defaultStrategy:"workflowTrackerBaseId",setup:C}));let _=h([...w.path,"tableId"]);l.push(tg({key:`step.${f.id}.config.${b}.tableId`,label:ai(v,"tableId"),file:_.file,yamlPath:_.yamlPath,required:!R,allowEmpty:R,setup:C}))}}return WR(l)}a(di,"buildWorkflowConfigSurface");function Cr(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(Cr,"toCheckItem");function NR(t,e,n){return{key:"tracker.base_id",label:e?`${e} Base ID`:"\u5DE5\u4F5C\u6D41\u6570\u636E\u5E95\u5EA7 Base ID",description:n??"\u672C\u5DE5\u4F5C\u6D41\u6240\u6709\u8868\u683C\u6240\u5728\u7684 AI \u8868\u683C Base ID\uFF1B\u7559\u7A7A\u65F6 setup \u4F1A\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA",owner:"framework",source:"tracker",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"projectTrackerBaseId",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","base_id"]}}}a(NR,"trackerBaseSurface");function LR(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(LR,"trackerTableSurface");function si(t){return{key:t.key,label:t.label,description:t.label,owner:"eventSource",source:"eventSource.config",required:t.required??!0,editable:!0,allowEmpty:t.allowEmpty??!1,defaultStrategy:"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType}}}a(si,"eventSourceConfigSurface");function gc(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(gc,"handlerConfigSurface");function tg(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(tg,"stepConfigSurface");function ng(t){if(!Zt(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(ng,"setupPolicyForTableRefHint");function ai(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(ai,"tableRefFieldDescription");function WR(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(WR,"dedupeSurface");function Rr(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"?Rr(e.unwrap()):e?._def?.schema?Rr(e._def.schema):e?._def?.innerType?Rr(e._def.innerType):null}a(Rr,"getZodObjectShape");function ci(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return ci(e.unwrap());if(e?._def?.innerType)return ci(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(ci):!1}a(ci,"isArraySchema");function li(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 li(e.unwrap());if(e?._def?.innerType)return li(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=li(o);if(i)return i}return null}a(li,"getFieldDescription");function BR(t){let e=Rr(t);return e?"baseId"in e&&"tableId"in e:!1}a(BR,"isTableRefSchema");function zR(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(zR,"isOptionalSchema");import{readFileSync as UR,existsSync as VR}from"fs";import KR from"path";import qR from"yaml";var rg=/^\$\{roles\.([^}]+)\}$/;function HR(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(HR,"getByJsonPath");function fi(t,e,n){if(typeof t=="string"){let r=t.match(rg);if(r){let o=r[1],i=HR(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)=>fi(r,e,`${n}[${o}]`));if(t&&typeof t=="object"){let r={};for(let[o,i]of Object.entries(t))r[o]=fi(i,e,`${n}.${o}`);return r}return t}a(fi,"expandProfileRefs");function pi(t,e="roles"){return typeof t=="string"?rg.test(t)?[`${e} \u2192 ${t}`]:[]:Array.isArray(t)?t.flatMap((n,r)=>pi(n,`${e}[${r}]`)):t&&typeof t=="object"?Object.entries(t).flatMap(([n,r])=>pi(r,`${e}.${n}`)):[]}a(pi,"findPendingRefs");function JR(t){let e=t,n=Object.keys(t).length+1;for(let o=0;o<n;o++){if(pi(e).length===0)return e;e=fi(e,e,"roles")}let r=pi(e);throw new Error(`profile roles \u6BB5\u5FAA\u73AF\u5F15\u7528\uFF1A\u7ECF ${n} \u8F6E\u5C55\u5F00\u4ECD\u6709\u5F15\u7528\u65E0\u6CD5\u6536\u655B\uFF08${r.join("\u3001")}\uFF09`)}a(JR,"expandRolesRefs");var ui=new Map;function Xe(t,e,n={}){let r=`${t}\0${n.lenientEnv?"lenient":"strict"}`,o=ui.get(r);if(o!==void 0)return o;let i=KR.resolve(t,"profile","profile.yml");if(!VR(i))return ui.set(r,null),null;let s;try{s=UR(i,"utf8")}catch(y){throw new Error(`profile.yml \u8BFB\u53D6\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`)}let c;try{c=qR.parse(s)}catch(y){throw new Error(`profile.yml YAML \u89E3\u6790\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`)}try{c=Tn(c,e??zp(t),{lenient:n.lenientEnv===!0})}catch(y){throw new Error(`profile.yml \u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`)}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=mc(l.roles)?JR(l.roles):void 0,f=mc(l.workflows)?l.workflows:void 0,p;f&&u?p=fi(f,u,"workflows"):f&&(p=f);let g=mc(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,...g?{meta:g}:{},...u?{roles:u}:{},...p?{workflows:p}:{}};return ui.set(r,h),m.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 un(){ui.clear()}a(un,"resetProfileCache");function Pn(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(Pn,"injectProfileConfig");function mc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}a(mc,"isRecord");var QR="profile/profile.yml",XR=/\.(ya?ml|json)$/i;function eC(t,e,n){let r=t.trim();if(!r||!XR.test(r)||Ir.isAbsolute(r))return;let o=/\.json$/i.test(r)?"json":"yaml",i;for(let s of n){let c=Ir.resolve(s,r),l=Ir.relative(e,c);if(!l.startsWith("..")){if(ZR(c))return{path:l,format:o,exists:!0,summary:tC(c,o)};i??={path:l,format:o,exists:!1}}}return i}a(eC,"resolveFileRef");function tC(t,e){try{let n=YR(t,"utf8"),r=e==="json"?JSON.parse(n):lg.parse(n);return Array.isArray(r)?[{key:"(\u6570\u7EC4)",count:r.length,kind:"array"}]:k(r)?Object.entries(r).map(([o,i])=>Array.isArray(i)?{key:o,count:i.length,kind:"array"}:k(i)?{key:o,count:Object.keys(i).length,kind:"object"}:{key:o,kind:typeof i}):void 0}catch{return}}a(tC,"summarizeStructuredFile");function mi(t,e){return{...t??{},...e??{}}}a(mi,"overlayConfig");function dg(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:k(r)?r:{}}}a(dg,"profileEventSourceParts");function $e(t,e){return t?{...e,surface:t,writeTarget:e.writeTarget??t.writeTarget}:e}a($e,"withSurfaceFields");async function wc(t,e,n){let r=[];for(let s of t){let c=n?.workflows?.[s.id],l=c?{file:QR,workflowId:s.id,wf:c}:void 0,d=await nC(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(wc,"checkWorkflows");async function nC(t,e,n){let r=[],o=t.templatePath.startsWith(e)?t.templatePath.slice(e.length+1):t.templatePath,i;try{i=await st(t.templatePath)}catch(v){return r.push({key:"workflow.yml",status:"error",message:`\u5DE5\u4F5C\u6D41\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${v instanceof Error?v.message:String(v)}`}),{id:t.id,name:t.id,ok:!1,items:r}}let s=i.meta?.name??t.id;if(n)try{Pn(t.id,n.wf,i)}catch(v){r.push({key:"profile",status:"error",message:`profile \u914D\u7F6E\u6CE8\u5165\u5931\u8D25: ${v instanceof Error?v.message:String(v)}`})}let c,l;try{let v=lg.parse(await GR(t.templatePath,"utf8"));k(v)&&(l=v,k(v.tracker)&&(c=v.tracker))}catch{}let d=await di({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(v=>[v.key,v])),f=u.get("tracker.base_id"),p=c?.base_id??i.tracker?.base_id;!p||typeof p=="string"&&p.trim()===""?r.push(Cr(f,{status:"warn",message:"tracker.base_id \u672A\u914D\u7F6E\uFF0Csetup \u9636\u6BB5\u5C06\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C"})):r.push(Cr(f,{status:"ok",value:p,message:`tracker.base_id = ${p}`}));let g=u.get("tracker.table_id"),h=c?.table_id??i.tracker?.table_id;if(!h||typeof h=="string"&&h.trim()===""?r.push(Cr(g,{status:"warn",message:"tracker.table_id \u672A\u914D\u7F6E\uFF08\u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09"})):r.push(Cr(g,{status:"ok",value:h,message:`tracker.table_id = ${h}`})),i.toolkitConfig&&Object.keys(i.toolkitConfig).length>0){let v=Object.keys(i.toolkitConfig);r.push({key:"toolkit_config",status:"ok",message:`toolkit_config \u5DF2\u914D\u7F6E (${v.join(", ")})`})}if(i.steps.length===0)r.push({key:"steps",status:"error",message:"\u5DE5\u4F5C\u6D41\u65E0\u6B65\u9AA4\u5B9A\u4E49"});else{let v=i.orderedStepIds.join(" \u2192 ");r.push({key:"steps",status:"ok",message:`\u6B65\u9AA4\u94FE: ${i.steps.length} \u6B65 (${v})`})}try{let v=await ii(t.recipeDir,i),R=new Map(i.steps.map((C,A)=>[C.id,A])),S=new Map(i.eventSources.map((C,A)=>[`event:${C.name||C.handler}`,A]));for(let C of v.issues){let A=C.level==="error",_=S.get(C.stepId),T=_!==void 0?i.eventSources[_]:void 0,I={key:`step.${C.stepId}.config`,status:A?"error":"warn",message:`[${C.recipeId}] ${C.message}`};if(A){let x=rC(C.message),D=R.get(C.stepId);if(x&&D!==void 0)I.writeTarget=n?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"steps",C.stepId,...x.split(".")]}:{type:"yaml",file:o,yamlPath:["steps",D,"config",...x.split(".")]};else if(x&&_!==void 0&&T){let j=x.split("."),L=await pc(t.recipeDir,T.handler),W=L?Yt(L.meta.config,V=>V.configType==="tableRef").find(V=>oC(V.path,j)||sg(V.path,j)):void 0;if(W){let V=T.name||T.handler,ue=sg(W.path,j)??["baseId","tableId"];for(let oe of ue){let Ne=`event_source.${V}.handler_config.${W.path.join(".")}.${oe}`,be=u.get(Ne);r.push($e(be,{key:Ne,status:"error",message:yc(C.recipeId,W.path.join("."),oe)}))}continue}I.key=`event_source.${T.name||T.handler}.handler_config.${x}`,I.writeTarget=n&&T.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",T.name,"handler_config",...j]}:{type:"yaml",file:o,yamlPath:["event_sources",_,"handler_config",...j]}}}r.push(I)}if(v.issues.filter(C=>C.level==="error").length===0){let C=v.rows.filter(A=>A.loaded).length;C>0&&r.push({key:"recipe_schema",status:"ok",message:`step.config \u6821\u9A8C\u901A\u8FC7 (${C} \u4E2A recipe)`})}}catch{r.push({key:"recipe_schema",status:"warn",message:"recipe schema \u6821\u9A8C\u8DF3\u8FC7\uFF08\u52A0\u8F7D\u5F02\u5E38\uFF09"})}let y=typeof p=="string"?p:void 0;await iC({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await sC({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await aC({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 v=0;v<i.eventSources.length;v++){let R=i.eventSources[v],S=R.name||`event_source[${v}]`,C=k(w[v])?w[v]:{},A=dg(n,R.name),_=mi(k(C.config)?C.config:void 0,A.config);if(Object.keys(_).length===0){r.push({key:`event_source.${S}.config`,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7684 config \u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u9A71\u52A8\u4E8B\u4EF6\u6E90`,writeTarget:n&&R.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",R.name]}:{type:"yaml",file:o,yamlPath:["event_sources",v,"config"]}});continue}let T=hr(R.type,_);for(let I of T.errors){let x=`event_source.${S}.config.${I.key}`,D=u.get(x);r.push($e(D,{key:x,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D${I.message}`}))}if(T.requiredFields.length>0||(T.optionalFields?.length??0)>0||T.errors.length>0||T.summary||T.oneOf){let I=!0;for(let x of T.requiredFields){let{field:D,valueType:j}=x,L=_[D],W=`event_source.${S}.config.${D}`,V=u.get(W);hc(L)?(I=!1,r.push($e(V,{key:W,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 config.${D}`}))):j&&!og(L,j)?(I=!1,r.push($e(V,{key:W,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${D} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${ig(j)}\uFF09`}))):r.push($e(V,{key:W,status:"ok",value:L,message:`config.${D} = ${cg(L)}`}))}for(let x of T.optionalFields??[]){let{field:D,valueType:j}=x,L=_[D],W=`event_source.${S}.config.${D}`,V=u.get(W);hc(L)?(I=!1,r.push($e(V,{key:W,status:"suggestion",value:L,message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300Dconfig.${D} \u4E3A\u7A7A\u5217\u8868\uFF1A\u76D1\u542C\u505C\u7528\uFF08\u586B\u4F1A\u8BDD ID \u5373\u542F\u7528\uFF09`}))):j&&!og(L,j)?(I=!1,r.push($e(V,{key:W,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${D} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${ig(j)}\uFF09`}))):r.push($e(V,{key:W,status:"ok",value:L,message:`config.${D} = ${cg(L)}`}))}if(T.oneOf&&!T.oneOf.fields.some(D=>!hc(_[D]))){I=!1;let D=T.oneOf.fields[0],j=`event_source.${S}.config.${D}`,L=u.get(j);r.push($e(L,{key:j,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7F3A\u5C11\u8C03\u5EA6\u914D\u7F6E\uFF08\u9700\u914D\u7F6E ${T.oneOf.fields.map(W=>`config.${W}`).join(" / ")} \u4E4B\u4E00\uFF09`}))}I&&T.errors.length===0&&r.push({key:`event_source.${S}`,status:"ok",message:T.summary?`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${R.type}) \u914D\u7F6E\u5B8C\u6574\uFF08${T.summary}\uFF09`:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${R.type}) \u914D\u7F6E\u5B8C\u6574`})}else r.push({key:`event_source.${S}`,status:"ok",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${R.type}) \u5DF2\u914D\u7F6E`})}i.eventSources.length===0&&w.length;let b=r.some(v=>v.status==="error");return{id:t.id,name:s,ok:!b,items:r}}a(nC,"checkSingleWorkflow");function rC(t){let e=t.match(/^config\.([A-Za-z_][A-Za-z0-9_.]*)/);return e?e[1]:null}a(rC,"extractConfigKey");function hc(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(hc,"isMissingConfigValue");function og(t,e){return e==="string[]"?Array.isArray(t):e==="string"?typeof t=="string":!0}a(og,"matchesConfigType");function ig(t){return t==="string[]"?"\u6570\u7EC4":"\u5B57\u7B26\u4E32"}a(ig,"typeLabel");function oC(t,e){return t.length===e.length&&t.every((n,r)=>n===e[r])}a(oC,"samePath");function sg(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(sg,"tableRefFieldFromPath");function ug(t,e){if(t?.defaultStrategy==="workflowTrackerBaseId"&&e)return e}a(ug,"defaultValueForTableRefWarn");async function iC(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 pc(n.recipeDir,u.handler);if(!f?.meta.config)continue;let p=u.name||u.handler,g=k(l[d])?l[d]:{},h=mi(k(g.handler_config)?g.handler_config:void 0,dg(c,u.name).handlerConfig),y=Yt(f.meta.config,b=>b.configType==="tableRef");for(let b of y){let v=bn(h,b.path);if(!k(v))continue;let R=v.baseId,S=v.tableId,C=b.path.join("."),A=Zt(b.hint);if(typeof R=="string"&&!R.trim()){let _=`event_source.${p}.handler_config.${C}.baseId`,T=i.get(_),I=A&&b.hint.defaultBase==="workflow.tracker.base_id",x=I?"warn":"error";e.push($e(T,{key:_,status:x,message:I?`[${u.handler}] handler_config.${C}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:yc(u.handler,C,"baseId"),value:x==="warn"?ug(T,s):void 0}))}if(typeof S=="string"&&!S.trim()){let _=`event_source.${p}.handler_config.${C}.tableId`,T=i.get(_),I=A?"warn":"error";e.push($e(T,{key:_,status:I,message:A?`[${u.handler}] handler_config.${C}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:yc(u.handler,C,"tableId")}))}}let w=$n(f.meta.config);if(w){for(let[b,v]of Object.entries(w)){let S=Et(v)?.expose===!0;if(gi(v)){let C=h[b];if(Array.isArray(C)&&C.length===0){let A=dC(v);if(A&&!S)continue;let _=`event_source.${p}.handler_config.${b}`,T=i.get(_);if(!T)continue;e.push($e(T,{key:_,status:A?"suggestion":"error",message:`[${u.handler}] handler_config.${b} \u4E3A\u7A7A\u6570\u7EC4`}))}}}for(let[b,v]of Object.entries(w)){if(h[b]!==void 0)continue;let R=Et(v);if(R?.expose!==!0)continue;let S=R.description??R.label??Tr(v);if(!S||lC(v))continue;let C=`event_source.${p}.handler_config.${b}`,A=i.get(C);A&&e.push($e(A,{key:C,status:"suggestion",message:`[${u.handler}] handler_config.${b} \u672A\u914D\u7F6E\uFF08${S}\uFF09`}))}}}}a(iC,"checkHandlerConfigEmptiness");async function sC(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 fc(n.recipeDir,u.recipe);if(!f?.meta.config)continue;let p=k(l[d])?l[d]:{},g=mi(k(p.config)?p.config:void 0,c?.wf.steps?.[u.id]),h=Yt(f.meta.config,y=>y.configType==="tableRef");for(let y of h){let w=bn(g,y.path);if(!k(w))continue;let b=w.baseId,v=w.tableId,R=y.path.join("."),S=Zt(y.hint);if(typeof b=="string"&&!b.trim()){let C=`step.${u.id}.config.${R}.baseId`,A=i.get(C),_=S&&y.hint.defaultBase==="workflow.tracker.base_id",T=_?"warn":"error";e.push($e(A,{key:C,status:T,message:_?`[${u.recipe}] step.config.${R}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:ag(u.recipe,R,"baseId"),value:T==="warn"?ug(A,s):void 0}))}if(typeof v=="string"&&!v.trim()){let C=`step.${u.id}.config.${R}.tableId`,A=i.get(C),_=S?"warn":"error";e.push($e(A,{key:C,status:_,message:S?`[${u.recipe}] step.config.${R}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:ag(u.recipe,R,"tableId")}))}}}}a(sC,"checkStepConfigEmptiness");async function aC(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?[Ir.resolve(r,Ir.dirname(c.file)),r]:[r];for(let f=0;f<o.steps.length;f++){let p=o.steps[f],g=k(l[f])?l[f]:{},h=mi(k(g.config)?g.config:void 0,c?.wf.steps?.[p.id]);if(Object.keys(h).length===0)continue;let w=(p.recipe?await fc(n.recipeDir,p.recipe).catch(()=>null):null)?.meta.config,b=a((R,S)=>{let C=`step.${p.id}.config.${R.join(".")}`;if(d.has(C))return;d.add(C);let A=typeof S=="boolean"?"boolean":typeof S=="number"?"number":"string",_=c?{type:"yaml",file:c.file,yamlPath:["workflows",c.workflowId,"steps",p.id,...R],valueType:A}:{type:"yaml",file:s,yamlPath:["steps",f,"config",...R],valueType:A},T=w?cC(w,R):null,I=typeof S=="string"?eC(S,r,u):void 0,x=I?.exists===!0;e.push({key:C,status:"ok",value:S,message:`${R.join(".")} = ${String(S)}`,writeTarget:_,surface:{key:C,label:R.join("."),description:T??void 0,owner:"handler",source:"step.config",required:!1,editable:!x,allowEmpty:!0,defaultStrategy:"none",valueType:A,writeTarget:_,...I?{fileRef:I}:{}}})},"emit"),v=a((R,S)=>{for(let[C,A]of Object.entries(R)){let _=[...S,C];if(typeof A=="string"){if(/^\$\{[^}]+\}$/.test(A.trim()))continue;b(_,A)}else if(typeof A=="number"||typeof A=="boolean")b(_,A);else if(k(A)){if(Object.keys(A).length===1&&typeof A.ref=="string"||"baseId"in A||"tableId"in A)continue;v(A,_)}}},"walk");v(h,[])}}a(aC,"emitStepScalarConfigItems");function ag(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(ag,"stepConfigTableRefMissingMessage");function yc(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(yc,"tableRefMissingMessage");function cC(t,e){let n=t;for(let r=0;r<e.length;r++){let o=$n(n);if(!o||(n=o[e[r]],!n))return null}return Tr(n)}a(cC,"describeSchemaPath");function $n(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"?$n(e.unwrap()):e?._def?.schema?$n(e._def.schema):e?._def?.innerType?$n(e._def.innerType):null}a($n,"getZodObjectShape");function gi(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return gi(e.unwrap());if(e?._def?.innerType)return gi(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(gi):!1}a(gi,"isArraySchema");function Tr(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 Tr(e.unwrap());if(e?._def?.innerType)return Tr(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=Tr(o);if(i)return i}return null}a(Tr,"getFieldDescription");function lC(t){let e=$n(t);return e?"baseId"in e&&"tableId"in e:!1}a(lC,"isTableRefSchema");function dC(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(dC,"isOptionalSchema");function cg(t){return Array.isArray(t)?`${t.length} \u9879`:typeof t=="string"?t:t==null?"\u672A\u8BBE\u7F6E":JSON.stringify(t)}a(cg,"formatConfigValue");import{readdir as yC,stat as wC,readFile as bC}from"fs/promises";import fn from"path";import{readdir as uC,readFile as fC,stat as pC}from"fs/promises";import{readFileSync as gC,existsSync as mC}from"fs";import hi from"path";import hC from"yaml";var yi=".role.yml",xt=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=hi.resolve(this.rolesDir),n=!1;try{n=(await pC(e)).isDirectory()}catch{n=!1}if(!n){m.info("role","\u89D2\u8272\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u6CE8\u518C\u4E2D\u5FC3\u4E3A\u7A7A",{dir:e});return}let o=(await uC(e)).filter(i=>i.endsWith(yi)).sort();for(let i of o){let s=hi.join(e,i),c=await this.validateFile(s);if(!c.ok){this.errors.push({file:s,errors:c.errors}),m.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=fg(l,hi.dirname(s));if(!d.ok){this.errors.push({file:s,errors:[d.error]}),m.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]}),m.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 fC(e,"utf8")}catch(o){return{ok:!1,errors:[`\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6: ${bc(o)}`]}}let r;try{r=hC.parse(n)}catch(o){return{ok:!1,errors:[`YAML \u89E3\u6790\u5931\u8D25: ${bc(o)}`]}}return Ha(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"]}),m.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5DF2\u8DF3\u8FC7",{key:r});continue}let i={...o,id:r},s=Ha(i);if(!s.ok){this.errors.push({file:`profile:roles.${r}`,errors:s.errors}),m.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=fg(c,n);if(!l.ok){this.errors.push({file:`profile:roles.${r}`,errors:[l.error]}),m.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]}),m.warn("role",d,{key:r});continue}this.roles.set(c.id,c)}}};function fg(t,e){let n=t.persona;if(typeof n=="string")return{ok:!0};if(n&&typeof n=="object"&&"file"in n){let r=hi.resolve(e,n.file);if(!mC(r))return{ok:!1,error:`persona file \u4E0D\u5B58\u5728: ${n.file}\uFF08\u76F8\u5BF9 ${e}\uFF09`};try{let o=gC(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: ${bc(o)}`}}}return{ok:!0}}a(fg,"resolvePersonaFile");function bc(t){return t instanceof Error?t.message:String(t)}a(bc,"errMsg");function wi(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(wi,"roleFieldItem");function pg(t,e,n){if(!k(t)||typeof t.file!="string")return null;let r=fn.resolve(e,t.file),o=fn.relative(n,r);return o.startsWith("..")?null:o}a(pg,"personaFileRelPath");async function gg(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?kC(i.roles,n,o):vC(t,o)}a(gg,"checkRoles");async function kC(t,e,n){let r=fn.resolve(e,"profile"),o=new xt(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=k(l)?l.persona:void 0,u=pg(d,r,e),f=u?{type:"textFile",file:u}:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"persona"]};n.push(wi({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(wi({key:`role.${s.id}.persona`,label:"\u4EBA\u8BBE Persona",description:u?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${u}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:"\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 profile.yml\uFF09",value:c,writeTarget:f,multiline:!0})),n.push({key:`role.${s.id}`,status:"ok",message:`\u89D2\u8272 ${s.id} \u6821\u9A8C\u901A\u8FC7`})):n.push({key:`role.${s.id}.persona`,status:"warn",value:"",message:`\u89D2\u8272 ${s.id} \u7684 persona \u4E3A\u7A7A\uFF0C\u5F71\u54CD AI \u8F93\u51FA\u8D28\u91CF`,writeTarget:f});let p=s.knowledge_scope?.kb_collections??[];if(p.length===0)n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"suggestion",message:`\u89D2\u8272 ${s.id} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`});else{let g=p.map(h=>{if(typeof h=="string")return h;let y=h.compile?.build?.length?"\u81EA\u5B9A\u4E49\u7F16\u8BD1":"\u5185\u7F6E\u7F16\u8BD1";return`${h.collection}\uFF08${y}\uFF09`});n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"ok",value:g,message:`\u89D2\u8272 ${s.id} \u5DF2\u914D\u7F6E ${p.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!n.some(s=>s.status==="error"),items:n}}a(kC,"checkProfileRoles");async function vC(t,e){let n=!1;try{n=(await wC(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 yC(t)).filter(c=>c.endsWith(yi)).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 xt(t);for(let c of o){let l=fn.join(t,c),d=await i.validateFile(l),u=c.replace(yi,"");if(!d.ok){e.push({key:`role.${u}`,status:"error",message:`${c} \u6821\u9A8C\u5931\u8D25: ${d.errors.join("; ")}`});continue}let f=d.definition,p=typeof f.persona=="string"?f.persona:"",g=pg(f.persona,t,fn.dirname(t)),h={type:"yaml",file:`roles/${c}`,yamlPath:["persona"]};if(g){h={type:"textFile",file:g};try{p=(await bC(fn.resolve(fn.dirname(t),g),"utf8")).trim()}catch{p=""}}e.push(wi({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(wi({key:`role.${u}.persona`,label:"\u4EBA\u8BBE Persona",description:g?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${g}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 roles/${c}\uFF09`,value:p,writeTarget: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 y=f.knowledge_scope?.kb_collections??[];y.length===0?e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"suggestion",message:`${c} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF08knowledge_scope.kb_collections\uFF09\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`}):e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"ok",value:y,message:`${c} \u5DF2\u914D\u7F6E ${y.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!e.some(c=>c.status==="error"),items:e}}a(vC,"checkDirectoryRoles");import SC from"yaml";var xC=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,RC=/api_key|secret|token|password|^DINGTALK_ROBOTS$/i,mg=/^[A-Za-z_][A-Za-z0-9_]*$/;function CC(t){let e=new Map;if(!t)return e;let n=[];for(let r of t.split(`
|
|
320
|
-
`)){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(
|
|
321
|
-
`)){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();
|
|
318
|
+
`,l=s.split(/\r?\n/),d=new RegExp(`^(\\s*)${e}\\s*=\\s*(.*)$`),u={},f=-1,p="";for(let h=0;h<l.length;h++){let y=d.exec(l[h]);if(!y)continue;if(f>=0)throw new ce("unknown",`.env \u4E2D\u5B58\u5728\u591A\u884C ${e}\uFF0C\u8BF7\u5148\u624B\u5DE5\u5408\u5E76\u540E\u91CD\u8BD5`);f=h,p=y[1];let w=Lp(y[2]??"");if(w!==""){let b;try{b=JSON.parse(w)}catch{throw new ce("unknown",`.env \u73B0\u6709 ${e} \u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u65E0\u6CD5\u5B89\u5168 merge\uFF1B\u8BF7\u624B\u5DE5\u4FEE\u6B63\u8BE5\u884C\u540E\u91CD\u8BD5`)}if(!k(b))throw new ce("unknown",`.env \u73B0\u6709 ${e} \u4E0D\u662F JSON \u5BF9\u8C61\uFF08\u671F\u671B ${o}\uFF09`);u=b}}u[i]=r;let g=`${p}${e}=${JSON.stringify(u)}`;if(f>=0)l[f]=g;else{for(;l.length>0&&l[l.length-1].trim()==="";)l.pop();l.length>0&&l.push(""),l.push(g)}return l.join(c)}a(Np,"mergeEnvJsonCredentials");function Lp(t){let e=t.trim();if(e.length>=2){let n=e[0],r=e[e.length-1];if(n==='"'&&r==='"'||n==="'"&&r==="'")return e.slice(1,-1)}return e}a(Lp,"parseEnvValue");var sc=class{static{a(this,"DwsDevRunner")}bin;timeoutMs;runner;homedir;constructor(e={}){this.bin=e.bin??"dws",this.timeoutMs=e.timeoutMs??6e4,this.runner=e.runner??K,this.homedir=e.homedir}async submitRobot(e){let n=await this.run(["dev","app","robot","submit","--name",e.name,"--robot-name",e.robotName,"--desc",e.desc,"--yes"],"app robot submit");return Sr(wx,St(n),"app robot submit")}async robotResult(e){let n=await this.run(["dev","app","robot","result","--task-id",e],"app robot result");return Sr(kx,St(n),"app robot result")}async listApps(){let e=[],n;for(let r=0;r<100;r++){let o=["dev","app","list"];n&&o.push("--cursor",n);let i=await this.run(o,"app list");if(e.push(...ic(i)),!k(i)||i.hasMore!==!0)break;let s=typeof i.nextCursor=="string"?i.nextCursor:"";if(!s)break;n=s}return e}async getApp(e){let n=await this.run(["dev","app","get","--app-key",e],"app get");return ic(n)[0]??null}async getAppByUnifiedAppId(e){let n=await this.run(["dev","app","get","--unified-app-id",e],"app get");return ic(n)[0]??null}async getCredentials(e){let n=await this.run(["dev","app","credentials","get","--unified-app-id",e],"app credentials get"),r=St(n),o=Dp(r,["clientId","client_id","appKey","app_key"]),i=Dp(r,["clientSecret","client_secret","appSecret","app_secret"]);if(!o||!i)throw new ce("unknown","dws dev app credentials get \u672A\u8FD4\u56DE clientId/clientSecret\uFF08\u51ED\u636E\u53EF\u80FD\u9700\u91CD\u65B0\u751F\u6210\uFF09",{raw:n});return{client_id:o,client_secret:i}}async createVersion(e,n){let r=await this.run(["dev","app","version","create","--unified-app-id",e,"--desc",n,"--yes"],"app version create");return Sr(Sx,St(r),"app version create")}async listVersions(e){let n=await this.run(["dev","app","version","list","--unified-app-id",e],"app version list"),r=St(n),o=Object.values(r).find(Array.isArray),i=[];for(let s of o??[]){let c=xx.safeParse(s);c.success&&i.push(c.data)}return i}async checkApproval(e,n){let r=await this.run(["dev","app","version","check-approval","--unified-app-id",e,"--version-id",n],"app version check-approval");return Sr(Cx,St(r),"app version check-approval")}async publishVersion(e,n,r){let o=["dev","app","version","publish","--unified-app-id",e,"--version-id",n];return r&&o.push("--approver-user-id",r),o.push("--yes"),await this.run(o,"app version publish")}async versionStatus(e,n){let r=await this.run(["dev","app","version","status","--unified-app-id",e,"--version-id",n],"app version status");return Sr(Ix,St(r),"app version status")}async addBotToGroup(e,n){return await this.run(["chat","group","members","add-bot","--robot-code",e,"--id",n],"chat group members add-bot")}async disableRobot(e){return this.run(["dev","app","robot","disable","--unified-app-id",e,"--yes"],"app robot disable")}async enableRobot(e){return this.run(["dev","app","robot","enable","--unified-app-id",e,"--yes"],"app robot enable")}async disableApp(e){return this.run(["dev","app","disable","--unified-app-id",e,"--yes"],"app disable")}async enableApp(e){return this.run(["dev","app","enable","--unified-app-id",e,"--yes"],"app enable")}async getCurrentCorpId(){let e=await this.run(["profile","list"],"profile list"),n=St(e),o=(Array.isArray(n.items)?n.items:Array.isArray(n.profiles)?n.profiles:[]).find(i=>k(i)&&i.isCurrent===!0&&i.isOrgCurrent===!0);return typeof o?.corpId=="string"?o.corpId:void 0}async searchChatGroups(e){try{return(await Tp(e,{runner:this.runner,dwsBin:this.bin,timeoutMs:this.timeoutMs,probe:a(()=>!0,"probe")})).groups.map(r=>({title:r.title,openConversationId:r.conversationId}))}catch(n){let r=n instanceof Error?n.message:String(n);throw new ce(_p({message:r}),`dws chat search \u5931\u8D25: ${r}`,{raw:n})}}async run(e,n){let r=[...e,"--format","json"],o;try{o=await this.runner(this.bin,r,{timeoutMs:this.timeoutMs})}catch(l){let d=l instanceof Error?l.message:String(l);if(/ENOENT/.test(d)&&this.bin==="dws"){let f=La(this.homedir).find(p=>hx(p));if(f)return this.bin=f,this.run(e,n)}let u=/abort|timed?\s*out/i.test(d)?"timeout":"unknown";throw new ce(u,`dws ${n} \u6267\u884C\u5931\u8D25: ${d}`,{guidance:ac(u)})}let i=o.stdout.trim(),s=null;if(i!=="")try{s=JSON.parse(i)}catch{s=null}let c=Fx(s,o);if(c){let l=_p(c),d=c.message??c.code??`exit ${o.exitCode}`;throw m.warn("bot-provision",`dws ${n} failed`,{kind:l,code:c.code}),new ce(l,`dws ${n} \u5931\u8D25: ${d}`,{raw:s??o.stderr})}if(o.exitCode!==0)throw new ce("unknown",`dws ${n} \u9000\u51FA\u7801 ${o.exitCode}: ${o.stderr.slice(0,300)||i.slice(0,300)}`);if(!k(s))throw new ce("unknown",`dws ${n} \u672A\u8FD4\u56DE JSON \u8F7D\u8377: ${i.slice(0,300)||o.stderr.slice(0,300)||"(\u7A7A\u8F93\u51FA)"}`);return s}};function Fx(t,e){let n=[t];k(t)&&k(t.data)&&n.push(t.data);for(let r of n){if(!k(r))continue;let o=r.error;if(typeof o=="string"&&o.trim()!=="")return{message:o,raw:t};if(k(o)){let i=o.server_error_code??o.code??o.upstream_code;return{code:i==null?void 0:String(i),message:typeof o.message=="string"?o.message:void 0,raw:t}}if(typeof r.errcode=="number"&&r.errcode!==0)return{code:String(r.errcode),message:typeof r.errmsg=="string"?r.errmsg:void 0,raw:t};if(r.success===!1){let i=r.errorCode;return{code:i==null?void 0:String(i),message:typeof r.errorMsg=="string"?r.errorMsg:void 0,raw:t}}}return k(t)&&t.ok===!1?{message:typeof t.message=="string"?t.message:typeof t.errorMsg=="string"?t.errorMsg:void 0,raw:t}:e&&e.exitCode!==0&&e.stderr.trim()!==""?{message:e.stderr.slice(0,500),raw:t}:null}a(Fx,"extractErrorInfo");function ic(t){let e=St(t),r=Object.values(e).find(Array.isArray)??(Object.keys(e).length>0?[e]:[]),o=[];for(let i of r){let s=vx.safeParse(i);s.success&&o.push(s.data)}return o}a(ic,"extractAppEntries");function St(t){if(!k(t))return{};for(let e of["data","body","result"]){let n=t[e];if(k(n))return n}return t}a(St,"flattenData");function Dp(t,e){for(let n of e){let r=t[n];if(typeof r=="string"&&r.trim()!=="")return r}}a(Dp,"pickString");function Nx(t){let e=t.trim();return e.length<2||e.length>20?"\u5E94\u7528\u540D\u9700 2-20 \u5B57\uFF08\u4F01\u4E1A\u5185\u552F\u4E00\uFF09\uFF0C\u8BF7\u7528 --name \u6307\u5B9A":null}a(Nx,"validateProvisionName");function Pp(t){return t.replace(/[\u3000-\u303f\uff00-\uffef]/g,"").replace(/\s+/g," ").trim()}a(Pp,"sanitizeProvisionText");var $p=class{static{a(this,"BotProvisioner")}runner;deps;constructor(e={}){this.runner=e.runner??new sc,this.deps={loadState:e.loadState??$x,saveState:e.saveState??Mx,readEnvFile:e.readEnvFile??(async n=>Op(n,"utf8").catch(()=>{})),writeEnvFile:e.writeEnvFile??(async(n,r)=>{await Mp(_n.dirname(n),{recursive:!0}),await jp(n,r,"utf8")}),sleep:e.sleep??(n=>new Promise(r=>setTimeout(r,n)))}}async provision(e){let n=Nx(e.name);if(n)return{status:"failed",state:Ap(e.name),message:n};let r=e.stateFile??Dx(process.cwd()),o=await this.deps.loadState(r)??Ap(e.name,e.robotName);if(o.appName!==e.name)return{status:"failed",state:o,message:`\u72B6\u6001\u6587\u4EF6\u5C5E\u4E8E\u5E94\u7528\u300C${o.appName}\u300D\uFF0C\u4E0E\u672C\u6B21 --name\u300C${e.name}\u300D\u4E0D\u4E00\u81F4\uFF1B\u8BF7\u786E\u8BA4\u540E\u7528 --state-file \u6307\u5B9A\u4E0D\u540C\u72B6\u6001\u6587\u4EF6`};let i=a(async s=>(await this.deps.saveState(r,s),s),"persist");try{if(Oe[o.phase]<Oe.robot_ready&&(o=await this.ensureRobotReady(o,e,i)),Oe[o.phase]<Oe.unified_resolved){let s=await this.runner.getApp(o.clientId),c=s?.unifiedAppId??s?.unified_app_id;if(!c)throw new ce("agent_gate_unified_app_id",`\u65E0\u6CD5\u4ECE dev app get --app-key ${o.clientId} \u89E3\u6790 unifiedAppId`);o=await i(Be(o,{type:"unified_resolved",unifiedAppId:c}))}if(Oe[o.phase]<Oe.bound)if((e.bind??"env")==="env"){let c=await this.runner.getCredentials(o.unifiedAppId),l=e.envFile??_n.join(_n.dirname(r),"..",".env"),d=await this.deps.readEnvFile(l),u=Ep(d,o.clientId,c);await this.deps.writeEnvFile(l,u),o=await i(Be(o,{type:"bound",credRef:o.clientId}))}else o=await i(Be(o,{type:"bound",credRef:o.clientId}));if(e.publish){let s=await this.runPublishPhase(o,e,i);if(o=s.state,s.status==="approver_required"||s.status==="failed"||!e.group)return s}return e.group?o.phase==="grouped"?{status:"grouped",state:o}:o.phase!=="published"?{status:"failed",state:o,message:ac("bot_not_published")}:(o=await this.groupBot(o,e.group,i),{status:"grouped",state:o}):o.phase==="grouped"?{status:"grouped",state:o}:o.phase==="published"?{status:"published",state:o}:{status:"bound",state:o}}catch(s){if(s instanceof ce)return{status:"failed",state:o,message:`${s.message}
|
|
319
|
+
\u21B3 ${s.guidance}`};throw s}}async ensureRobotReady(e,n,r){if(e.phase==="preflight"){let i=await this.findAppByName(e.appName);if(i){let c=i.appKey??i.app_key??i.clientId??i.client_id,l=i.unifiedAppId??i.unified_app_id;if(!c&&l){let d=await this.runner.getAppByUnifiedAppId(l);c=d?.appKey??d?.app_key??d?.clientId??d?.client_id,l=l??d?.unifiedAppId??d?.unified_app_id}if(c){m.info("bot-provision","app already exists, skipping submit",{name:e.appName});let d=Be(Be(e,{type:"submit_accepted",taskId:e.taskId??`existing:${e.appName}`}),{type:"robot_ready",clientId:c});return l&&(d=Be(d,{type:"unified_resolved",unifiedAppId:l})),r(d)}}let s=await this.runner.submitRobot({name:e.appName,robotName:n.robotName??e.appName,desc:Pp(n.desc??`${e.appName} \u673A\u5668\u4EBA - aitable-workflow bot provision`)});e=await r(Be(e,{type:"submit_accepted",taskId:s.taskId}))}let o=Math.max(1,n.pollAttempts??60);for(let i=0;i<o;i++){let c=await this.runner.robotResult(e.taskId);if(c.lifecycle?.robotTaskDone&&c.clientId)return r(Be(e,{type:"robot_ready",clientId:c.clientId,localConnectReady:c.lifecycle.localConnectReady}));await this.deps.sleep(5e3)}throw new ce("timeout",`\u5EFA\u53F7\u4EFB\u52A1 ${e.taskId} \u5728 ${o} \u6B21\u8F6E\u8BE2\u5185\u672A\u5C31\u7EEA\uFF08expiresInSeconds \u901A\u5E38\u4E3A 86400\uFF0C\u53EF\u7A0D\u540E\u91CD\u8DD1\u7EED\u8DD1\uFF09`)}async runPublishPhase(e,n,r){if(Oe[e.phase]<Oe.version_created){let c=null;try{let d=(await this.runner.listVersions(e.unifiedAppId)).find(u=>(u.versionStatus??"").toUpperCase()==="INIT");d&&(m.info("bot-provision","adopting existing INIT version",{versionId:d.versionId}),c=d)}catch{}c=c??await this.runner.createVersion(e.unifiedAppId,n.desc??`${e.appName} \u9996\u4E2A\u53D1\u5E03\u7248\u672C`),e=await r(Be(e,{type:"version_created",versionId:c.versionId,version:c.version}))}let o=null;if(Oe[e.phase]<Oe.approver_selected){o=await this.runner.checkApproval(e.unifiedAppId,e.versionId);let c=o.approvalCandidates??[];if((o.actionRequired==="select_approver"||c.length>0)&&!n.approverUserId)return{status:"approver_required",state:e,candidates:c};n.approverUserId&&(e=await r(Be(e,{type:"approver_selected",userId:n.approverUserId})))}if(Oe[e.phase]<Oe.publish_pending){let c=e.approverUserId??n.approverUserId;if(!c&&o?.requiresApproval!==!1)throw new ce("publish_approval_pending","\u53D1\u5E03\u9700\u663E\u5F0F\u5BA1\u6279\u4EBA\uFF1A\u8BF7\u8FD0\u884C check-approval \u67E5\u770B\u5019\u9009\u540E\uFF0C\u7528 --approver-user-id \u6307\u5B9A");await this.runner.publishVersion(e.unifiedAppId,e.versionId,c),e=await r(Be(e,{type:"publish_submitted"}))}let s=(await this.runner.versionStatus(e.unifiedAppId,e.versionId).catch(()=>null))?.versionStatus;return s&&cc(s)?(e=await r(Be(e,{type:"published"})),{status:"published",state:e}):{status:"publish_pending",state:e}}async groupBot(e,n,r){let o=n.trim();if(!(/^cid/i.test(o)||o.includes("="))){let s=await this.runner.searchChatGroups(o),c=s.find(l=>l.title===o)??s[0];if(!c)throw new ce("unknown",`\u672A\u627E\u5230\u7FA4\u300C${n}\u300D\uFF08dws chat search \u65E0\u7ED3\u679C\uFF09\uFF1B\u53EF\u6539\u7528 --group <openConversationId>`);o=c.openConversationId}return await this.runner.addBotToGroup(e.clientId,o),r(Be(e,{type:"grouped",openConversationId:o}))}async addBotToGroup(e,n){return this.runner.addBotToGroup(e,n)}async resolveEnterpriseRobot(e){let n=e.name.trim();if(!n)throw new ce("unknown","\u4F01\u4E1A\u673A\u5668\u4EBA\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A");let r=e.envFile??_n.join(process.cwd(),".env"),o=await this.runner.getCurrentCorpId();if(!o)throw new ce("auth_required","\u65E0\u6CD5\u83B7\u53D6\u5F53\u524D dws \u7EC4\u7EC7\u7684 corpId\uFF1B\u8BF7\u5148\u8FD0\u884C `dws auth login` \u5E76\u5207\u6362\u7EC4\u7EC7");let i=await this.deps.readEnvFile(r),c=jx(i)[o];if(c?.unifiedAppId&&await this.runner.getAppByUnifiedAppId(c.unifiedAppId).catch(()=>null))return await this.saveEnterpriseRobot(r,i,o,c),{corpId:o,unifiedAppId:c.unifiedAppId,appKey:c.appKey,appSecret:c.appSecret};let l=await this.findAppByName(n);if(l?.unifiedAppId){let h=await this.runner.getCredentials(l.unifiedAppId),y={name:n,unifiedAppId:l.unifiedAppId,appKey:h.client_id,appSecret:h.client_secret};return await this.saveEnterpriseRobot(r,i,o,y),{corpId:o,unifiedAppId:y.unifiedAppId,appKey:y.appKey,appSecret:y.appSecret}}let d=await this.runner.submitRobot({name:n,robotName:n,desc:Pp(e.desc??`${n} \u673A\u5668\u4EBA - aitable-workflow`)}),u=await this.pollRobotReady(d.taskId),f=await this.resolveUnifiedAppId(u),p=await this.runner.getCredentials(f),g={name:n,unifiedAppId:f,appKey:u,appSecret:p.client_secret};return await this.saveEnterpriseRobot(r,i,o,g),{corpId:o,unifiedAppId:f,appKey:g.appKey,appSecret:g.appSecret}}async pollRobotReady(e,n=60){for(let r=0;r<n;r++){let i=await this.runner.robotResult(e);if((k(i.lifecycle)?i.lifecycle:{}).robotTaskDone===!0&&typeof i.clientId=="string")return i.clientId;await this.deps.sleep(5e3)}throw new ce("timeout",`\u5EFA\u53F7\u4EFB\u52A1 ${e} \u5728 ${n} \u6B21\u8F6E\u8BE2\u5185\u672A\u5C31\u7EEA`)}async resolveUnifiedAppId(e){let n=await this.runner.getApp(e),r=n?.unifiedAppId??n?.unified_app_id;if(!r)throw new ce("agent_gate_unified_app_id",`\u65E0\u6CD5\u4ECE dev app get --app-key ${e} \u89E3\u6790 unifiedAppId`);return r}async saveEnterpriseRobot(e,n,r,o){let i=Ox(n,r,o),s=Ep(i,o.appKey,{client_id:o.appKey,client_secret:o.appSecret});await this.deps.writeEnvFile(e,s)}async findAppByName(e){try{return(await this.runner.listApps()).find(r=>(r.name??r.appName)===e)??null}catch{return null}}};function cc(t){return/publish(ed)?|public|release(d)?|success/i.test(t)&&!/pending|init|reject|fail/i.test(t)}a(cc,"isPublishedStatus");function s1(t){let e=[],{state:n}=t;if(!n)return e.push("\u672A\u627E\u5230 provision \u72B6\u6001\u6587\u4EF6\uFF08<configDir>/.aitable/provision-state.json\uFF09\u3002"),e.push("\u5148\u8FD0\u884C: aitable-workflow bot provision --name <\u5E94\u7528\u540D> --robot-name <\u673A\u5668\u4EBA\u540D> --desc <\u63CF\u8FF0>"),e;e.push(`\u5E94\u7528: ${n.appName}`),e.push(`\u76F8\u4F4D: ${n.phase}`),n.clientId&&e.push(`clientId: ${n.clientId}`),n.unifiedAppId&&e.push(`unifiedAppId: ${n.unifiedAppId}`),n.versionId&&e.push(`versionId: ${n.versionId}${n.versionNumber?`\uFF08${n.versionNumber}\uFF09`:""}`),t.error?e.push(`\u67E5\u8BE2\u5931\u8D25: ${t.error}`):t.versionStatus&&e.push(`\u5BA1\u6279\u72B6\u6001: versionStatus = ${t.versionStatus}${cc(t.versionStatus)?"\uFF08\u5DF2\u53D1\u5E03\uFF0C\u53EF\u91CD\u8BD5\u62C9\u7FA4\uFF09":""}`),t.approval?.requiresApproval===!1&&e.push("\u5BA1\u6279\u7B56\u7565: \u672C\u7EC4\u7EC7\u53D1\u5E03\u65E0\u9700\u771F\u4EBA\u5BA1\u6279\uFF08requiresApproval=false\uFF09\uFF0Cprovision --publish \u53EF\u76F4\u63A5\u53D1\u5E03\u3002");let r=t.approval?.approvalCandidates??[];if(r.length>0){e.push("\u5BA1\u6279\u4EBA\u5019\u9009:");for(let s of r)e.push(` - ${s.name??"(\u672A\u77E5)"} userId=${s.userId}${s.mainAdmin?"\uFF08\u4E3B\u7BA1\u7406\u5458\uFF09":""}`);let o=n.appName,i=n.versionNumber??n.versionId??"?";e.push("\u50AC\u529E\u547D\u4EE4\u6A21\u677F\uFF08\u4E2A\u4EBA\u8EAB\u4EFD\u5355\u804A\uFF1B\u7D27\u6025\u7528 `dws ding`\uFF09:");for(let s of r){let c=`\u8BF7\u5E2E\u5FD9\u5BA1\u6279\u5F00\u653E\u5E73\u53F0\u5E94\u7528\u300C${o}\u300D\u7684 ${i} \u7248\u672C\u53D1\u5E03\uFF08aitable-workflow bot provisioning\uFF09\uFF0C\u8C22\u8C22\uFF01`;e.push(` dws chat message send --user ${s.userId} --text "${c}"`)}}else t.approval?.actionRequired&&e.push(`check-approval: actionRequired=${t.approval.actionRequired}`);return e.push(`\u4E0B\u4E00\u6B65: ${Ax(n.phase,t.versionStatus)}`),e}a(s1,"buildBotApprovalReportLines");export*from"aitable-workflow-base";import Lx from"path";var Wx=[/^workflow\.yml$/i,/^views\.yml$/i,/^aitable-workflow\.config\.yml$/i,/^coding-agents\.config\.json$/i,/^design[^/]*\.yml$/i,/^recipes\/.+$/i,/^roles\/.+$/i];function Bx(t){return Lx.normalize(t).replace(/\\/g,"/").replace(/^\.\//,"")}a(Bx,"normalizeArtifactRelPath");function zx(t){try{return ar(t),!0}catch{return!1}}a(zx,"isSafeRelativePath");function u1(t){if(!zx(t))return!1;let e=Bx(t);return Wx.some(n=>n.test(e))}a(u1,"isAllowedArtifactPath");function f1(t,e,n){Gs(t,{label:"projectId"}),Gs(e,{label:"requestId"});let r=ar(n);return`artifacts/${t}/${e}/${r}`}a(f1,"buildArtifactKey");import{createHash as Ux}from"crypto";import{gzipSync as Vx,gunzipSync as Kx}from"zlib";var Bp="aitable-workspace-bundle@1";function Wp(t){return Ux("sha256").update(t).digest("hex")}a(Wp,"sha256Hex");function zp(t){let e=t.map(n=>`${n.path}\0${Wp(n.content)}
|
|
320
|
+
`).sort();return Wp(e.join(""))}a(zp,"computeWorkspaceRevision");function y1(t,e){let n=[...e].sort((o,i)=>o.path<i.path?-1:o.path>i.path?1:0),r={format:Bp,projectId:t,revision:zp(n),files:n};return Vx(Buffer.from(JSON.stringify(r),"utf8"))}a(y1,"encodeWorkspaceBundle");function w1(t){let e;try{e=JSON.parse(Kx(t).toString("utf8"))}catch(r){throw new Error(`\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u89E3\u7801\u5931\u8D25: ${r instanceof Error?r.message:String(r)}`)}if(e?.format!==Bp)throw new Error(`\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u683C\u5F0F\u4E0D\u652F\u6301: ${String(e?.format)}`);if(!Array.isArray(e.files))throw new Error("\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305\u7F3A\u5C11 files");if(zp(e.files)!==e.revision)throw new Error("\u5DE5\u4F5C\u533A\u5FEB\u7167\u5305 revision \u4E0E\u5185\u5BB9\u4E0D\u7B26\uFF08\u5305\u4F53\u635F\u574F\u6216\u88AB\u7BE1\u6539\uFF09");return e}a(w1,"decodeWorkspaceBundle");function v1(t){return!!(t.bucket&&t.accessKeyId&&t.accessKeySecret)}a(v1,"hasOssCredentials");var Up=class{static{a(this,"InMemoryObjectStore")}store="memory";objects=new Map;expiresSec;constructor(e){this.expiresSec=e?.expiresSec??600}async presignPut(e,n){let r=n?.expiresSec??this.expiresSec,o=new Date(Date.now()+r*1e3).toISOString();return{method:"PUT",url:`memory://${e}`,key:e,expiresAt:o,...n?.contentType?{headers:{"Content-Type":n.contentType}}:{}}}putObject(e,n){this.objects.set(e,Buffer.from(n))}async getObject(e){let n=this.objects.get(e);if(!n)throw new Error(`InMemoryObjectStore: object not found: ${e}`);return Buffer.from(n)}async deleteObject(e){this.objects.delete(e)}keys(){return[...this.objects.keys()]}};import{existsSync as qx}from"fs";import ti from"path";var Hx=5e3;function lc(t,e=process.platform){let n=e==="win32"?ti.win32:ti;return e==="win32"?n.join(t,"dws.cmd"):n.join(t,"bin","dws")}a(lc,"getGlobalDwsBinPath");function dc(t,e=process.env,n=process.platform){let r=n==="win32"?ti.win32:ti,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(dc,"prependGlobalDwsToPath");async function A1(t={}){let e=t.npmBin?.trim()||(process.platform==="win32"?"npm.cmd":"npm"),n=t.runner??K,r=t.platform??process.platform,o=t.env??process.env;try{let i=await n(e,["prefix","--global"],{timeoutMs:Hx}),s=i.stdout.trim();if(i.exitCode!==0||!s)return{status:"unavailable"};let c=lc(s,r);return(t.isAvailable??qx)(c)?{status:"activated",bin:c,pathAdjusted:dc(c,o,r)}:{status:"unavailable"}}catch{return{status:"unavailable"}}}a(A1,"activateGlobalDwsOnPath");function Vp(t){return`${t}__empty_streak`}a(Vp,"emptyStreakKey");function Jx(t,e,n,r){let o=Math.max(1,Math.trunc(r)||1),i=Vp(e),s=Math.trunc(Number(t.getGlobalVar(i)??0)),c=Number.isFinite(s)&&s>0?s:0,l=t.getGlobalVar(e),d=Array.isArray(l)?l.length:0;if(n>0||d===0)return c!==0&&t.setGlobalVar(i,0),{allow:!0,streak:0,rounds:o};let u=c+1;return t.setGlobalVar(i,u>=o?0:u),{allow:u>=o,streak:u,rounds:o}}a(Jx,"gateEmptySnapshot");function Kp(t){let e=[],n=0,r=!1;for(;n<t.length;){let o=t[n];if(!r)e.push(o),o==='"'&&(r=!0),n++;else if(o==="\\")e.push(o,t[n+1]??""),n+=2;else if(o==='"'){let i=n+1;for(;i<t.length&&/\s/.test(t[i]);)i++;let s=t[i];s===":"||s===","||s==="}"||s==="]"||s===void 0?(e.push(o),r=!1,n++):(e.push('\\"'),n++)}else e.push(o),n++}return e.join("")}a(Kp,"repairJsonStringValues");function qp(t){try{return JSON.parse(t)}catch{}try{return JSON.parse(Kp(t))}catch{return null}}a(qp,"safeParseJson");function Gx(t,e){if(!t)return null;let n=t.trim(),r=n.match(/```(?:json)?\s*([\s\S]*?)```/i);r?.[1]&&(n=r[1].trim());let o=n.indexOf("{"),i=n.lastIndexOf("}");if(o===-1||i<=o)return null;let s=n.slice(o,i+1),c=qp(s);if(!c||typeof c!="object")return null;let l=e.safeParse(c);return l.success?l.data:null}a(Gx,"extractStructuredJson");function Hp(t,e){let n=new Intl.DateTimeFormat("en-CA",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(t),r=a(o=>Number(n.find(i=>i.type===o)?.value??0),"pick");return{year:r("year"),month:r("month"),day:r("day")}}a(Hp,"zonedDateParts");function Jp(t,e){let n=new Intl.DateTimeFormat("en-US",{timeZone:e,hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(t),r={};for(let l of n)l.type!=="literal"&&(r[l.type]=Number(l.value));let o=a(l=>Number(r[l]??0),"get"),i=o("hour"),s=i===24?0:i;return Date.UTC(o("year"),o("month")-1,o("day"),s,o("minute"),o("second"))-t.getTime()}a(Jp,"tzOffsetMs");function uc(t,e,n,r,o,i,s,c){let l=Date.UTC(t,e,n,r,o,i,0),d=Jp(new Date(l),c);return new Date(l-d+s).toISOString()}a(uc,"zonedWallClockToUtc");function Zx(t,e=new Date){let n=Hp(e,t),r=new Date(Date.UTC(n.year,n.month-1,n.day)-864e5),o=r.getUTCFullYear(),i=r.getUTCMonth(),s=r.getUTCDate(),c=`${o}-${String(i+1).padStart(2,"0")}-${String(s).padStart(2,"0")}`,l=uc(o,i,s,0,0,0,0,t),d=uc(o,i,s,23,59,59,999,t);return{since:l,until:d,dateStr:c}}a(Zx,"yesterdayRange");function Yx(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"--:--";let r=new Intl.DateTimeFormat("en-GB",{timeZone:e,hourCycle:"h23",hour:"2-digit",minute:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("hour")}:${o("minute")}`}a(Yx,"formatZonedHm");function Qx(t,e){let n=t instanceof Date?t:new Date(t);if(Number.isNaN(n.getTime()))return"";let r=new Intl.DateTimeFormat("en-CA",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).formatToParts(n),o=a(i=>r.find(s=>s.type===i)?.value??"","pick");return`${o("year")}-${o("month")}-${o("day")} ${o("hour")}:${o("minute")}:${o("second")}`}a(Qx,"formatZonedDateTime");function Xx(t){let e=t?.trim();if(!e)return"Asia/Shanghai";try{return new Intl.DateTimeFormat("en-US",{timeZone:e}).format(new Date),e}catch{return"Asia/Shanghai"}}a(Xx,"normalizeTimezone");import{createHash as eR}from"crypto";var tR=600*1e3,nR=50,Gp=300;function rR(t){let e=t.key,n=t.ttlMs??tR,r=t.capacity??nR,o=t.maxPartLength??Gp;function i(l,d){let u=Array.isArray(o)?o[d]??o[o.length-1]??Gp:o;return String(l??"").replace(/\s+/g,"").slice(0,u)}a(i,"normalize");function s(...l){return eR("sha1").update(l.map(i).join("|")).digest("hex")}a(s,"fingerprint");function c(l){let d=l(e);if(!Array.isArray(d))return[];let u=Date.now();return d.filter(f=>f&&typeof f.h=="string"&&typeof f.ts=="number"&&u-f.ts<=n)}return a(c,"load"),{fingerprint:s,mark(l,d,...u){let f=s(...u),p=c(l);if(p.some(g=>g.h===f))return d(e,p),!1;for(p.push({h:f,ts:Date.now()});p.length>r;)p.shift();return d(e,p),!0},has(l,...d){if(!d.some(f=>String(f??"").trim()))return!1;let u=s(...d);return c(l).some(f=>f.h===u)}}}a(rR,"createFingerprintWindow");import{readFile as xR,stat as mc,readdir as RR}from"fs/promises";import ht from"path";import CR from"yaml";import{z as $}from"zod";var xr=$.enum(["claude","codex","qoder","codebuddy","opencode","qwen","deepseek","trae","qwenwork","llm_only"]),oR=$.enum(["Grid","FormDesigner","Kanban","Calendar","Gallery","Gantt"]),iR=$.object({field:$.string().min(1),any_of:$.array($.string().min(1)).min(1).optional(),equals:$.string().optional()}).refine(t=>!!t.any_of||typeof t.equals=="string",{message:"\u89C6\u56FE filter \u6761\u4EF6\u5FC5\u987B\u58F0\u660E any_of \u6216 equals \u4E4B\u4E00"}),Rr=$.object({id:$.string().min(1),type:oR,name:$.string().min(1),field_order:$.array($.string()).optional(),visible_fields:$.array($.string()).optional(),group_by:$.string().optional(),date_field:$.string().optional(),description:$.string().optional(),filter:$.array(iR).min(1).optional(),for_each_step:$.enum(["needs_human","all"]).optional()}),sR=$.array(Rr).optional(),aR=$.enum(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]),cR=$.object({name:$.string().min(1),type:aR,options:$.array($.string()).optional(),formatter:$.string().optional(),description:$.string().optional()}),lR=$.object({initial:$.string().min(1),active:$.array($.string()).min(1),restart:$.string().min(1).optional(),terminal:$.array($.string()).min(1),blocked:$.string().default("\u5DF2\u963B\u585E"),review:$.string().optional()}),dR=$.object({state:$.string().min(1),title:$.string().min(1),description:$.string().optional(),current_step:$.string().optional(),owner:$.string().optional(),submitter:$.string().optional(),deadline:$.string().optional(),event_log:$.string().optional()}),fc=$.object({base_id:$.string().min(1),table_id:$.string().default(""),label:$.string().optional(),description:$.string().optional(),states:lR,fields:dR,field_definitions:$.array(cR).optional(),views:sR,dws_bin:$.string().default("dws"),query_limit:$.number().default(50),human_loop:$.object({doc_workspace_id:$.string().min(1)}).optional(),form_share:$.object({enabled:$.boolean().default(!0)}).default({enabled:!0})}),uR=$.object({template:$.string().min(1).describe("\u76F8\u5BF9\u8DEF\u5F84\u6307\u5411 workflow.yml"),recipe_dir:$.string().default("./recipes")}),fR=$.object({dir:$.string().min(1).describe("\u5DE5\u4F5C\u6D41\u76EE\u5F55\uFF1A\u6BCF\u4E2A\u542B workflow.yml \u7684\u5B50\u76EE\u5F55 = \u4E00\u4E2A\u5DE5\u4F5C\u6D41")}),pR=$.object({max_attempts:$.number().min(1).default(3),base_backoff_ms:$.number().min(0).default(2e3),max_backoff_ms:$.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"}),gR=$.object({engine:$.preprocess(t=>t===null||t===""?void 0:t,xr.default("claude")),model:$.string().optional(),max_concurrent:$.number().min(1).default(3),timeout_ms:$.number().default(3e5),max_step_failures:$.number().min(1).default(5),auto_advance:$.boolean().default(!0),retry:pR,trace_dir:$.string().default("./traces")}),mR=$.object({default_timeout_ms:$.number().default(3e5),llm:$.object({provider:$.enum(["dashscope","openai","anthropic","idealab"]).default("idealab"),model:$.string().default("Qwen3.7-Max-DogFooding"),api_key:$.string().optional()}).optional()}),hR=$.object({dir:$.string().default("./roles"),enabled:$.boolean().default(!0)}),yR=$.object({enabled:$.boolean().default(!1),default_timeout_ms:$.number().default(864e5),escalation_notify:$.array($.string()).default([])}),wR=$.object({interval_ms:$.number().default(5e3)}),Zp=$.object({scene:$.string().optional(),base_name:$.string().min(1).optional(),tracker:fc.optional(),workflow:uR.optional(),workflows:fR.optional(),agent:gR.optional(),recipe:mR.optional(),roles:hR.optional(),sla:yR.optional(),polling:wR.optional(),toolkit_config:$.record($.string(),$.record($.string(),$.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 bR}from"fs/promises";import{readFileSync as kR}from"fs";import Xp from"path";import{parse as eg}from"dotenv";var pc=new Set;function Yp(){return pc}a(Yp,"getAppliedEnvKeys");function gc(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 pc)e.has(n)||delete process.env[n];pc=e}a(gc,"applyEnvToProcess");var vR=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,SR=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function ri(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(ri,"parseEnvValue");function An(t,e,n={}){let r=n.lenient===!0;return o(t);function o(s){if(typeof s=="string"){let c=s.match(SR);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 ri(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(vR,(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(An,"interpolateEnv");var Qp=(()=>{let t={};for(let[e,n]of Object.entries(process.env))n!==void 0&&(t[e]=n);return t})();async function oi(t){let e=Xp.join(t,".env");try{let n=await bR(e,"utf8");return{...ni(),...eg(n)}}catch{return ni()}}a(oi,"buildEnvSource");function tg(t){let e=Xp.join(t,".env");try{let n=kR(e,"utf8");return{...ni(),...eg(n)}}catch{return ni()}}a(tg,"buildEnvSourceSync");function ni(){let t=Yp(),e={...Qp};for(let[n,r]of Object.entries(process.env))r!==void 0&&!(n in Qp)&&!t.has(n)&&(e[n]=r);return e}a(ni,"envSourceBase");var IR={engine:"claude",max_concurrent:3,timeout_ms:3e5,max_step_failures:5,auto_advance:!0,trace_dir:"./traces"},TR={default_timeout_ms:3e5,llm:{provider:"idealab",model:"Qwen3.7-Max-DogFooding"}},ng={dir:"./roles",enabled:!0},_R={interval_ms:5e4},AR={enabled:!1,default_timeout_ms:864e5,escalation_notify:[]},ER={base_id:"__placeholder__",table_id:"",states:{initial:"__placeholder__",active:["__placeholder__"],terminal:["__placeholder__"],blocked:"__placeholder__"},fields:{state:"__placeholder__",title:"__placeholder__"},dws_bin:"dws",query_limit:50,form_share:{enabled:!0}},DR="aitable-workflow.config.yml";async function Te(t){let e=ht.resolve(t);try{(await mc(e)).isDirectory()&&(e=ht.join(e,DR))}catch{}return e}a(Te,"resolveConfigPath");async function _e(t,e={}){let n=await Te(t),r=ht.dirname(n),o;try{o=await xR(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=CR.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 oi(r),c;try{c=An(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=Zp.safeParse(c);if(!l.success)throw new Error(`\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25:
|
|
321
|
+
${JSON.stringify(l.error.issues,null,2)}`);let d=l.data,u=!!d.workflows,f;if(u){if(f=await hc(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`);m.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:ht.resolve(r,d.workflow.template),recipeDir:ht.resolve(r,d.workflow.recipe_dir)}]}let p=d.tracker??ER,g={raw:d,envSource:s,configDir:r,multiWorkflow:u,workflowEntries:f,workflowTemplatePath:f[0].templatePath,recipeDir:f[0].recipeDir,tracker:p,agent:{...IR,...d.agent},recipe:{...TR,...d.recipe},roles:{...ng,...d.roles},rolesDir:ht.resolve(r,d.roles?.dir??ng.dir),polling:{..._R,...d.polling},sla:{...AR,...d.sla}};if(m.info("config","\u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210",{mode:u?"multi-workflow":"single-workflow",workflowCount:f.length,engine:g.agent.engine}),d.tracker)for(let h of PR(d))m.warn("config",h);return g}a(_e,"loadSettings");async function hc(t,e){let n=ht.resolve(t,e),r;try{r=await RR(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=ht.join(n,i);try{if(!(await mc(s)).isDirectory())continue}catch{continue}let c=ht.join(s,"workflow.yml");try{await mc(c)}catch{continue}o.push({id:i,templatePath:c,recipeDir:ht.join(s,"recipes")})}return o}a(hc,"scanWorkflowDirs");function PR(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(PR,"validateStateConsistency");function En(t,e,n){return{...t,tracker:n,workflowTemplatePath:e.templatePath,recipeDir:e.recipeDir}}a(En,"createPerWorkflowSettings");import{readFile as Wi}from"fs/promises";import Un from"path";import zm from"yaml";var Dn="aitable-workflow.config.yml";function rg(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:Dn,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:Dn,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:Dn,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:Dn,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:Dn,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:Dn,yamlPath:["polling","interval_ms"]}}),{id:"project",name:"\u9879\u76EE\u7EA7\u914D\u7F6E",ok:!e.some(o=>o.status==="error"),items:e}}a(rg,"checkProject");import{readFile as LR}from"fs/promises";import{readFile as $R}from"fs/promises";import MR from"path";import OR from"yaml";async function Pn(t){let e=await jR(t.workflowEntries,t.configDir),n=t.agent.engine,o=FR(e.map(i=>i.engine))??n;return{projectEngine:n,workflowOverrides:e,configuredEngine:o,...sn(o)?{configuredAgent:sn(o)}:{}}}a(Pn,"resolveCodingAgentSelection");function og(){let t=new Set,e=[];for(let n of dr()){let r=nf(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(og,"detectCodingEngines");function Cr(t,e){return t==="llm_only"?!0:e.available.some(n=>n.engine===t)}a(Cr,"isEngineDetected");function ig(t,e){return Cr(t.configuredEngine,e)?t.configuredEngine:Cr(t.projectEngine,e)?t.projectEngine:e.recommendedEngine}a(ig,"chooseDetectedEngine");async function jR(t,e){let n=[];for(let r of t){let o;try{o=OR.parse(await $R(r.templatePath,"utf8"))}catch{continue}if(!k(o))continue;let i=o.toolkit_config;if(!k(i))continue;let s=i.coding;if(!k(s))continue;let c=s.engine,l=xr.safeParse(c);l.success&&n.push({workflowId:r.id,file:NR(e,r.templatePath),yamlPath:["toolkit_config","coding","engine"],engine:l.data})}return n}a(jR,"readWorkflowCodingEngines");function FR(t){let e=[...new Set(t)];return e.length===1?e[0]:void 0}a(FR,"commonEngine");function NR(t,e){let n=MR.relative(t,e);return n&&!n.startsWith("..")?n:e}a(NR,"relativeTo");var WR="aitable-workflow.config.yml";async function sg(t,e={}){let n=e.detection??og(),r=await Pn(t),o=e.engineExplicitlySet??!0,i=[];n.available.length===0?i.push({key:"coding_agent.detected",status:"warn",message:"\u672A\u68C0\u6D4B\u5230\u672C\u673A Coding Agent CLI\uFF08\u8BF7\u5B89\u88C5 claude/codex/qoder \u7B49 CLI\uFF0C\u6216\u542F\u52A8\u5DF2\u5B89\u88C5\u7684\u5343\u95EE\u529E\u516C\u684C\u9762\u5E94\u7528\u4EE5\u542F\u7528 qwenwork\uFF0C\u6216\u9009\u62E9 llm_only \u8DF3\u8FC7 coding agent \u80FD\u529B\uFF09"}):i.push({key:"coding_agent.detected",status:"ok",value:n.available.map(g=>g.engine),message:`\u672C\u673A\u53EF\u7528: ${n.available.map(g=>`${g.engine}(${g.cmd})`).join(", ")}`});let s=ig(r,n),c=Cr(r.configuredEngine,n),l=Cr(r.projectEngine,n),u=r.workflowOverrides.length>0&&r.workflowOverrides.some(g=>g.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:Ir(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:Ir(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:Ir(r)}):i.push({key:"coding_agent.engine",status:"ok",value:r.configuredEngine,message:`Coding Agent = ${r.configuredEngine}`,writeTarget:Ir(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(g=>g.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:Ir(r)});for(let g of r.workflowOverrides)i.push({key:`coding_agent.workflow.${g.workflowId}`,status:g.engine===r.projectEngine?"ok":"warn",value:g.engine,message:`workflow ${g.workflowId} coding.engine = ${g.engine}${g.engine===r.projectEngine?"":"\uFF08\u8986\u76D6\u9879\u76EE\u7EA7\uFF09"}`,writeTarget:{type:"yaml",file:g.file,yamlPath:g.yamlPath}});let f=await BR(t,r.configuredAgent);return f&&i.push(f),{id:"coding_agent",name:"Coding Agent",ok:!i.some(g=>g.status==="error"),items:i}}a(sg,"checkCodingAgent");async function BR(t,e){if(!e)return;let n=ft(t.configDir),r;try{r=await LR(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(BR,"checkCodingAgentConfigEnabled");function Ir(t){return{type:"yamlAll",targets:[{file:WR,yamlPath:["agent","engine"]},...t.workflowOverrides.map(e=>({file:e.file,yamlPath:e.yamlPath}))]}}a(Ir,"syncTargets");import{readFile as vC}from"fs/promises";import{existsSync as SC,readFileSync as xC}from"fs";import Ar from"path";import Sg from"yaml";import{readFile as zR}from"fs/promises";import UR from"yaml";async function st(t,e={}){let n;try{n=await zR(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=UR.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,v=a(R=>{if(Array.isArray(R))return R.map(v);if(R&&typeof R=="object"){let S={};for(let[C,_]of Object.entries(R))if(Bt(_)){let A=`__RTREF_${b++}__`;w.set(A,_),S[C]=A}else S[C]=v(_);return S}return R},"shield");if(k(r)&&Array.isArray(r.event_sources))for(let R of r.event_sources)k(R)&&R.config&&(R.config=v(R.config));if(r=An(r,e.envSource),w.size>0){let R=a(S=>{if(typeof S=="string")return w.get(S)??S;if(Array.isArray(S))return S.map(R);if(S&&typeof S=="object"){let C={};for(let[_,A]of Object.entries(S))C[_]=R(A);return C}return S},"restore");r=R(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(!k(r))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61");let o=VR(r.meta),i=KR(r.steps),s=GR(r.edges),c=tC(r.event_sources),l=nC(r.event_handlers),d=eC(i,s),u=rC(r.tracker),f=k(r.toolkit_config)?r.toolkit_config:void 0,p=sC(r.notification),g=r.field_definitions;g!=null&&m.warn("workflow","workflow.yml \u6839\u7EA7 field_definitions \u5DF2\u5E9F\u5F03\uFF0C\u8BF7\u5728 tracker.field_definitions \u4E2D\u58F0\u660E");let h=QR(u?.field_definitions??g),y=ZR(r.steps,h);return m.info("workflow","\u6A21\u677F\u52A0\u8F7D\u5B8C\u6210",{name:o.name,stepCount:i.length,edgeCount:s.length,eventSourceCount:c.length,hasTracker:!!u,hasToolkitConfig:!!f,notificationChannel:p?.channel??"none",fieldRefs:y.all.size}),{meta:o,steps:i,edges:s,eventSources:c,eventHandlers:l,orderedStepIds:d,referencedFields:y,fieldDefinitions:h,tracker:u,toolkitConfig:f,notification:p}}a(st,"loadWorkflowTemplate");function VR(t){if(!k(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(VR,"parseMeta");function KR(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 steps \u6570\u7EC4");return t.map((e,n)=>{if(!k(e))throw new Error(`steps[${n}] \u5FC5\u987B\u662F\u5BF9\u8C61`);let r=String(e.id??`step_${n}`);return{id:r,name:String(e.name??r),recipe:typeof e.recipe=="string"&&e.recipe.trim()?e.recipe:void 0,engine:cg(e.engine),auto:e.auto!==!1,needs_human:qR(e.needs_human),sla:HR(e.sla),input_mapping:ag(e.input_mapping),output_mapping:ag(e.output_mapping),config:XR(e.config)}})}a(KR,"parseSteps");function qR(t){if(!k(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(qR,"parseNeedsHuman");function cg(t){if(t==="claude"||t==="codex"||t==="qoder"||t==="codebuddy"||t==="opencode"||t==="qwen"||t==="deepseek"||t==="trae"||t==="llm_only")return t}a(cg,"parseEngine");function HR(t){if(k(t))return{timeout_ms:typeof t.timeout_ms=="number"?t.timeout_ms:3e5,escalation:JR(t.escalation)}}a(HR,"parseSLA");function JR(t){if(t==="notify"||t==="skip"||t==="block")return t}a(JR,"parseEscalation");function ag(t){if(!k(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(ag,"parseMapping");function GR(t){if(!Array.isArray(t))throw new Error("\u5DE5\u4F5C\u6D41\u6A21\u677F\u7F3A\u5C11 edges \u6570\u7EC4");return t.map((e,n)=>{if(!k(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(GR,"parseEdges");function ZR(t,e=[]){let n=new Set,r=new Set,o=new Set,i=new Set(e.filter(l=>YR(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)k(l)&&lg(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(ZR,"extractFieldRefs");function lg(t,e,n,r){for(let[o,i]of Object.entries(t))if(o.endsWith("_mapping")&&k(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):k(i)&&lg(i,e,n,r)}a(lg,"walkStepForFields");var yc=new Set(["text","number","date","singleSelect","multipleSelect","url","rating","currency","progress","user","group","richText","creator","lastModifier","createdTime","lastModifiedTime","attachment","checkbox"]);function YR(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(YR,"isSystemFieldType");function QR(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(!k(n))continue;let r=typeof n.name=="string"?n.name:"",o=typeof n.type=="string"?n.type:"text";if(!r)continue;yc.has(o)||m.warn("workflow",`field_definitions \u4E2D\u5B57\u6BB5"${r}"\u7684\u7C7B\u578B "${o}" \u4E0D\u53D7\u652F\u6301\uFF0C\u5DF2\u964D\u7EA7\u4E3A text`,{field:r,declaredType:o,supported:[...yc]});let i=yc.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(QR,"parseFieldDefinitions");function XR(t){if(k(t))return t}a(XR,"parseStepConfig");function eC(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);m.warn("workflow","\u90E8\u5206\u6B65\u9AA4\u672A\u5728\u8FB9\u4E2D\u8FDE\u63A5",{missing:s})}return o}a(eC,"topologicalSort");function tC(t){return!t||!Array.isArray(t)?[]:t.filter(k).map(e=>{let n=String(e.name??""),r=String(e.type??""),o=String(e.handler??"");return(!r||!o)&&m.warn("workflow","\u4E8B\u4EF6\u6E90\u7F3A\u5C11 type \u6216 handler",{item:e}),{name:n,type:r,handler:o,config:k(e.config)?e.config:{},...k(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(tC,"parseEventSources");function nC(t){return!t||!Array.isArray(t)?[]:t.filter(k).map(e=>({trigger:String(e.trigger??""),recipe:String(e.recipe??""),engine:cg(e.engine)}))}a(nC,"parseEventHandlers");function rC(t){if(!k(t))return;let e=fc.safeParse(t);if(!e.success){if(oC(t))return;m.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(rC,"parseTracker");function oC(t){return t.base_id===""||t.baseId===""}a(oC,"isDraftTracker");var iC=new Set(["none","webhook","im"]);function sC(t){if(!k(t))return;let e=typeof t.channel=="string"?t.channel:"none",n=iC.has(e)?e:"none",r=k(t.webhook)&&typeof t.webhook.url=="string"?{url:t.webhook.url,...k(t.webhook.headers)?{headers:t.webhook.headers}:{}}:void 0,o=k(t.im)?{...typeof t.im.bot_token_env=="string"?{bot_token_env:t.im.bot_token_env}:{}}:void 0,i=k(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(sC,"parseNotification");import dg from"path";import ug from"fs";async function $n(t,e){return pg({recipeDir:t,recipeId:e,exportMethod:"execute",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 execute \u51FD\u6570"})}a($n,"loadRecipeDefinitionResult");async function wc(t,e){return(await $n(t,e)).definition}a(wc,"loadRecipeDefinition");async function ai(t,e){return pg({recipeDir:t,recipeId:e,exportMethod:"create",invalidExportMessage:"\u7F3A\u5C11 default/recipe export \u6216\u6709\u6548\u7684 create \u51FD\u6570"})}a(ai,"loadEventHandlerDefinitionResult");async function bc(t,e){return(await ai(t,e)).definition}a(bc,"loadEventHandlerDefinition");async function pg(t){let{recipeDir:e,recipeId:n,exportMethod:r,invalidExportMessage:o}=t,i=dg.resolve(e,`${n}.recipe.ts`),s=dg.resolve(e,`${n}.recipe.js`),c=ug.existsSync(i)?i:ug.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 Dt();try{let l=await import(en(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(pg,"loadDefinition");async function ci(t,e){let n=[],r=[];for(let o of e.steps){let i=o.recipe;if(!i)continue;let s=await $n(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:ii(o.config),loaded:!1});continue}let l=s.definition.meta;fg(o.config,l.config,o.id,i,n),r.push({stepId:o.id,recipeId:i,configSummary:ii(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 ai(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:ii(o.handler_config),loaded:!1});continue}let l=c.definition;fg(o.handler_config,l.meta.config,s,i,n),r.push({stepId:s,recipeId:i,configSummary:ii(o.handler_config),loaded:!0})}return{issues:n,rows:r}}a(ci,"checkWorkflowRecipes");function fg(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))vr.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=aC(s,d.path);cC(u)||lC(u)||o.push({stepId:n,recipeId:r,level:"error",message:`config.${d.path.join(".")||"<root>"}: ${d.message}`})}let l=si(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(fg,"checkConfigAgainstSchema");function aC(t,e){let n=t;for(let r of e){if(n==null||typeof n!="object")return;n=n[r]}return n}a(aC,"getValueAtPath");function cC(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(cC,"isRefObject");function lC(t){return typeof t=="string"&&/^\$\{[^}]+\}$/.test(t.trim())}a(lC,"isPlaceholderString");function si(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"?si(e.unwrap()):e?._def?.schema?si(e._def.schema):e?._def?.innerType?si(e._def.innerType):null}a(si,"objectShape");function ii(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(ii,"summarizeConfig");async function pi(t){let{workflow:e,rawYaml:n,recipeDir:r,relPath:o,profile:i,onDefinitionLoadFailure:s}=t,c=e.tracker,l=[dC(o,c?.label,c?.description),uC(o,c?.label,c?.description)],d=Array.isArray(n?.event_sources)?n.event_sources:[];for(let u=0;u<e.eventSources.length;u++){let f=e.eventSources[u],p=f.name||`event_source[${u}]`,g=k(d[u])?d[u]:{},h=i?.config?.event_sources?.[f.name??""],{handler_config:y,...w}=h??{},b={...k(g.config)?g.config:{},...w},v=!!i&&!!f.name,R=a(x=>v?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,...x]}:{file:o,yamlPath:["event_sources",u,"config",...x]},"evtConfigTarget"),S=a(x=>v?{file:i.file,yamlPath:["workflows",i.workflowId,"event_sources",f.name,"handler_config",...x]}:{file:o,yamlPath:["event_sources",u,"handler_config",...x]},"evtHandlerTarget"),C=br(f.type,b);for(let x of C.errors){let D=R(x.yamlPath);l.push(li({key:`event_source.${p}.config.${x.key}`,label:x.description,file:D.file,yamlPath:D.yamlPath}))}for(let x of C.requiredFields){let D=R([x.field]);l.push(li({key:`event_source.${p}.config.${x.field}`,label:x.label,file:D.file,yamlPath:D.yamlPath,valueType:x.valueType}))}for(let x of C.optionalFields??[]){let D=R([x.field]);l.push(li({key:`event_source.${p}.config.${x.field}`,label:x.label,file:D.file,yamlPath:D.yamlPath,valueType:x.valueType,required:!1,allowEmpty:!0}))}if(C.oneOf){let x=C.oneOf.fields[0];if(x){let D=R([x]);l.push(li({key:`event_source.${p}.config.${x}`,label:C.oneOf.labels[x]??x,file:D.file,yamlPath:D.yamlPath}))}}if(!f.handler)continue;let _=await ai(r,f.handler);if(!_.definition){s?.(`EventHandler\u300C${f.handler}\u300D`,_.failure);continue}let A=_.definition;if(!A?.meta.config)continue;let T=Qt(A.meta.config,x=>x.configType==="tableRef");for(let x of T){let D=x.path.join("."),j=x.hint.description??x.hint.label??`\u4E8B\u4EF6\u6E90 ${p} \u7684 ${D}`,L=Yt(x.hint),W=L&&x.hint.defaultBase==="workflow.tracker.base_id",V=mg(x.hint),ue=S([...x.path,"baseId"]);l.push(kc({key:`event_source.${p}.handler_config.${D}.baseId`,label:di(j,"baseId"),file:ue.file,yamlPath:ue.yamlPath,required:!W,allowEmpty:W,defaultStrategy:"workflowTrackerBaseId",setup:V}));let oe=S([...x.path,"tableId"]);l.push(kc({key:`event_source.${p}.handler_config.${D}.tableId`,label:di(j,"tableId"),file:oe.file,yamlPath:oe.yamlPath,required:!L,allowEmpty:L,setup:V}))}let I=Tr(A.meta.config);if(I)for(let[x,D]of Object.entries(I)){let j=Et(D);if(j?.expose!==!0||pC(D))continue;let L=j.description??j.label??fi(D);if(!L)continue;let W=gC(D),V=S([x]);l.push(kc({key:`event_source.${p}.handler_config.${x}`,label:L,file:V.file,yamlPath:V.yamlPath,required:!W,allowEmpty:W,valueType:j.valueType??(ui(D)?"string[]":"string")}))}}for(let u=0;u<e.steps.length;u++){let f=e.steps[u];if(!f.recipe)continue;let p=await $n(r,f.recipe);if(!p.definition){s?.(`recipe\u300C${f.recipe}\u300D`,p.failure);continue}let g=p.definition;if(!g?.meta.config)continue;let h=a(w=>i?{file:i.file,yamlPath:["workflows",i.workflowId,"steps",f.id,...w]}:{file:o,yamlPath:["steps",u,"config",...w]},"stepTarget"),y=Qt(g.meta.config,w=>w.configType==="tableRef");for(let w of y){let b=w.path.join("."),v=w.hint.description??w.hint.label??`\u6B65\u9AA4 ${f.id} \u7684 ${b}`,R=Yt(w.hint),S=R&&w.hint.defaultBase==="workflow.tracker.base_id",C=mg(w.hint),_=h([...w.path,"baseId"]);l.push(gg({key:`step.${f.id}.config.${b}.baseId`,label:di(v,"baseId"),file:_.file,yamlPath:_.yamlPath,required:!S,allowEmpty:S,defaultStrategy:"workflowTrackerBaseId",setup:C}));let A=h([...w.path,"tableId"]);l.push(gg({key:`step.${f.id}.config.${b}.tableId`,label:di(v,"tableId"),file:A.file,yamlPath:A.yamlPath,required:!R,allowEmpty:R,setup:C}))}}return fC(l)}a(pi,"buildWorkflowConfigSurface");function _r(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(_r,"toCheckItem");function dC(t,e,n){return{key:"tracker.base_id",label:e?`${e} Base ID`:"\u5DE5\u4F5C\u6D41\u6570\u636E\u5E95\u5EA7 Base ID",description:n??"\u672C\u5DE5\u4F5C\u6D41\u6240\u6709\u8868\u683C\u6240\u5728\u7684 AI \u8868\u683C Base ID\uFF1B\u7559\u7A7A\u65F6 setup \u4F1A\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA",owner:"framework",source:"tracker",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"projectTrackerBaseId",writeTarget:{type:"yaml",file:t,yamlPath:["tracker","base_id"]}}}a(dC,"trackerBaseSurface");function uC(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(uC,"trackerTableSurface");function li(t){return{key:t.key,label:t.label,description:t.label,owner:"eventSource",source:"eventSource.config",required:t.required??!0,editable:!0,allowEmpty:t.allowEmpty??!1,defaultStrategy:"current",writeTarget:{type:"yaml",file:t.file,yamlPath:t.yamlPath,valueType:t.valueType}}}a(li,"eventSourceConfigSurface");function kc(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(kc,"handlerConfigSurface");function gg(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(gg,"stepConfigSurface");function mg(t){if(!Yt(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(mg,"setupPolicyForTableRefHint");function di(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(di,"tableRefFieldDescription");function fC(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(fC,"dedupeSurface");function Tr(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"?Tr(e.unwrap()):e?._def?.schema?Tr(e._def.schema):e?._def?.innerType?Tr(e._def.innerType):null}a(Tr,"getZodObjectShape");function ui(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return ui(e.unwrap());if(e?._def?.innerType)return ui(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(ui):!1}a(ui,"isArraySchema");function fi(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 fi(e.unwrap());if(e?._def?.innerType)return fi(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=fi(o);if(i)return i}return null}a(fi,"getFieldDescription");function pC(t){let e=Tr(t);return e?"baseId"in e&&"tableId"in e:!1}a(pC,"isTableRefSchema");function gC(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(gC,"isOptionalSchema");import{readFileSync as mC,existsSync as hC}from"fs";import yC from"path";import wC from"yaml";var hg=/^\$\{roles\.([^}]+)\}$/;function bC(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(bC,"getByJsonPath");function mi(t,e,n){if(typeof t=="string"){let r=t.match(hg);if(r){let o=r[1],i=bC(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)=>mi(r,e,`${n}[${o}]`));if(t&&typeof t=="object"){let r={};for(let[o,i]of Object.entries(t))r[o]=mi(i,e,`${n}.${o}`);return r}return t}a(mi,"expandProfileRefs");function hi(t,e="roles"){return typeof t=="string"?hg.test(t)?[`${e} \u2192 ${t}`]:[]:Array.isArray(t)?t.flatMap((n,r)=>hi(n,`${e}[${r}]`)):t&&typeof t=="object"?Object.entries(t).flatMap(([n,r])=>hi(r,`${e}.${n}`)):[]}a(hi,"findPendingRefs");function kC(t){let e=t,n=Object.keys(t).length+1;for(let o=0;o<n;o++){if(hi(e).length===0)return e;e=mi(e,e,"roles")}let r=hi(e);throw new Error(`profile roles \u6BB5\u5FAA\u73AF\u5F15\u7528\uFF1A\u7ECF ${n} \u8F6E\u5C55\u5F00\u4ECD\u6709\u5F15\u7528\u65E0\u6CD5\u6536\u655B\uFF08${r.join("\u3001")}\uFF09`)}a(kC,"expandRolesRefs");var gi=new Map;function Xe(t,e,n={}){let r=`${t}\0${n.lenientEnv?"lenient":"strict"}`,o=gi.get(r);if(o!==void 0)return o;let i=yC.resolve(t,"profile","profile.yml");if(!hC(i))return gi.set(r,null),null;let s;try{s=mC(i,"utf8")}catch(y){throw new Error(`profile.yml \u8BFB\u53D6\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`)}let c;try{c=wC.parse(s)}catch(y){throw new Error(`profile.yml YAML \u89E3\u6790\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`)}try{c=An(c,e??tg(t),{lenient:n.lenientEnv===!0})}catch(y){throw new Error(`profile.yml \u53D8\u91CF\u63D2\u503C\u5931\u8D25: ${y instanceof Error?y.message:String(y)}`)}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=vc(l.roles)?kC(l.roles):void 0,f=vc(l.workflows)?l.workflows:void 0,p;f&&u?p=mi(f,u,"workflows"):f&&(p=f);let g=vc(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,...g?{meta:g}:{},...u?{roles:u}:{},...p?{workflows:p}:{}};return gi.set(r,h),m.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 pn(){gi.clear()}a(pn,"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 vc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}a(vc,"isRecord");var RC="profile/profile.yml",CC=/\.(ya?ml|json)$/i;function IC(t,e,n){let r=t.trim();if(!r||!CC.test(r)||Ar.isAbsolute(r))return;let o=/\.json$/i.test(r)?"json":"yaml",i;for(let s of n){let c=Ar.resolve(s,r),l=Ar.relative(e,c);if(!l.startsWith("..")){if(SC(c))return{path:l,format:o,exists:!0,summary:TC(c,o)};i??={path:l,format:o,exists:!1}}}return i}a(IC,"resolveFileRef");function TC(t,e){try{let n=xC(t,"utf8"),r=e==="json"?JSON.parse(n):Sg.parse(n);return Array.isArray(r)?[{key:"(\u6570\u7EC4)",count:r.length,kind:"array"}]:k(r)?Object.entries(r).map(([o,i])=>Array.isArray(i)?{key:o,count:i.length,kind:"array"}:k(i)?{key:o,count:Object.keys(i).length,kind:"object"}:{key:o,kind:typeof i}):void 0}catch{return}}a(TC,"summarizeStructuredFile");function wi(t,e){return{...t??{},...e??{}}}a(wi,"overlayConfig");function xg(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:k(r)?r:{}}}a(xg,"profileEventSourceParts");function $e(t,e){return t?{...e,surface:t,writeTarget:e.writeTarget??t.writeTarget}:e}a($e,"withSurfaceFields");async function Rc(t,e,n){let r=[];for(let s of t){let c=n?.workflows?.[s.id],l=c?{file:RC,workflowId:s.id,wf:c}:void 0,d=await _C(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(Rc,"checkWorkflows");async function _C(t,e,n){let r=[],o=t.templatePath.startsWith(e)?t.templatePath.slice(e.length+1):t.templatePath,i;try{i=await st(t.templatePath)}catch(v){return r.push({key:"workflow.yml",status:"error",message:`\u5DE5\u4F5C\u6D41\u6A21\u677F\u52A0\u8F7D\u5931\u8D25: ${v instanceof Error?v.message:String(v)}`}),{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(v){r.push({key:"profile",status:"error",message:`profile \u914D\u7F6E\u6CE8\u5165\u5931\u8D25: ${v instanceof Error?v.message:String(v)}`})}let c,l;try{let v=Sg.parse(await vC(t.templatePath,"utf8"));k(v)&&(l=v,k(v.tracker)&&(c=v.tracker))}catch{}let d=await pi({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(v=>[v.key,v])),f=u.get("tracker.base_id"),p=c?.base_id??i.tracker?.base_id;!p||typeof p=="string"&&p.trim()===""?r.push(_r(f,{status:"warn",message:"tracker.base_id \u672A\u914D\u7F6E\uFF0Csetup \u9636\u6BB5\u5C06\u81EA\u52A8\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C"})):r.push(_r(f,{status:"ok",value:p,message:`tracker.base_id = ${p}`}));let g=u.get("tracker.table_id"),h=c?.table_id??i.tracker?.table_id;if(!h||typeof h=="string"&&h.trim()===""?r.push(_r(g,{status:"warn",message:"tracker.table_id \u672A\u914D\u7F6E\uFF08\u53EF\u7531 setup \u81EA\u52A8\u5EFA\u8868\uFF09"})):r.push(_r(g,{status:"ok",value:h,message:`tracker.table_id = ${h}`})),i.toolkitConfig&&Object.keys(i.toolkitConfig).length>0){let v=Object.keys(i.toolkitConfig);r.push({key:"toolkit_config",status:"ok",message:`toolkit_config \u5DF2\u914D\u7F6E (${v.join(", ")})`})}if(i.steps.length===0)r.push({key:"steps",status:"error",message:"\u5DE5\u4F5C\u6D41\u65E0\u6B65\u9AA4\u5B9A\u4E49"});else{let v=i.orderedStepIds.join(" \u2192 ");r.push({key:"steps",status:"ok",message:`\u6B65\u9AA4\u94FE: ${i.steps.length} \u6B65 (${v})`})}try{let v=await ci(t.recipeDir,i),R=new Map(i.steps.map((C,_)=>[C.id,_])),S=new Map(i.eventSources.map((C,_)=>[`event:${C.name||C.handler}`,_]));for(let C of v.issues){let _=C.level==="error",A=S.get(C.stepId),T=A!==void 0?i.eventSources[A]:void 0,I={key:`step.${C.stepId}.config`,status:_?"error":"warn",message:`[${C.recipeId}] ${C.message}`};if(_){let x=AC(C.message),D=R.get(C.stepId);if(x&&D!==void 0)I.writeTarget=n?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"steps",C.stepId,...x.split(".")]}:{type:"yaml",file:o,yamlPath:["steps",D,"config",...x.split(".")]};else if(x&&A!==void 0&&T){let j=x.split("."),L=await bc(t.recipeDir,T.handler),W=L?Qt(L.meta.config,V=>V.configType==="tableRef").find(V=>EC(V.path,j)||bg(V.path,j)):void 0;if(W){let V=T.name||T.handler,ue=bg(W.path,j)??["baseId","tableId"];for(let oe of ue){let Ne=`event_source.${V}.handler_config.${W.path.join(".")}.${oe}`,be=u.get(Ne);r.push($e(be,{key:Ne,status:"error",message:xc(C.recipeId,W.path.join("."),oe)}))}continue}I.key=`event_source.${T.name||T.handler}.handler_config.${x}`,I.writeTarget=n&&T.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",T.name,"handler_config",...j]}:{type:"yaml",file:o,yamlPath:["event_sources",A,"handler_config",...j]}}}r.push(I)}if(v.issues.filter(C=>C.level==="error").length===0){let C=v.rows.filter(_=>_.loaded).length;C>0&&r.push({key:"recipe_schema",status:"ok",message:`step.config \u6821\u9A8C\u901A\u8FC7 (${C} \u4E2A recipe)`})}}catch{r.push({key:"recipe_schema",status:"warn",message:"recipe schema \u6821\u9A8C\u8DF3\u8FC7\uFF08\u52A0\u8F7D\u5F02\u5E38\uFF09"})}let y=typeof p=="string"?p:void 0;await DC({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await PC({items:r,entry:t,workflow:i,rawYaml:l,surfaceByKey:u,workflowBaseId:y,profileCtx:n}),await $C({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 v=0;v<i.eventSources.length;v++){let R=i.eventSources[v],S=R.name||`event_source[${v}]`,C=k(w[v])?w[v]:{},_=xg(n,R.name),A=wi(k(C.config)?C.config:void 0,_.config);if(Object.keys(A).length===0){r.push({key:`event_source.${S}.config`,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7684 config \u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u9A71\u52A8\u4E8B\u4EF6\u6E90`,writeTarget:n&&R.name?{type:"yaml",file:n.file,yamlPath:["workflows",n.workflowId,"event_sources",R.name]}:{type:"yaml",file:o,yamlPath:["event_sources",v,"config"]}});continue}let T=br(R.type,A);for(let I of T.errors){let x=`event_source.${S}.config.${I.key}`,D=u.get(x);r.push($e(D,{key:x,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D${I.message}`}))}if(T.requiredFields.length>0||(T.optionalFields?.length??0)>0||T.errors.length>0||T.summary||T.oneOf){let I=!0;for(let x of T.requiredFields){let{field:D,valueType:j}=x,L=A[D],W=`event_source.${S}.config.${D}`,V=u.get(W);Sc(L)?(I=!1,r.push($e(V,{key:W,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5 config.${D}`}))):j&&!yg(L,j)?(I=!1,r.push($e(V,{key:W,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${D} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${wg(j)}\uFF09`}))):r.push($e(V,{key:W,status:"ok",value:L,message:`config.${D} = ${vg(L)}`}))}for(let x of T.optionalFields??[]){let{field:D,valueType:j}=x,L=A[D],W=`event_source.${S}.config.${D}`,V=u.get(W);Sc(L)?(I=!1,r.push($e(V,{key:W,status:"suggestion",value:L,message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300Dconfig.${D} \u4E3A\u7A7A\u5217\u8868\uFF1A\u76D1\u542C\u505C\u7528\uFF08\u586B\u4F1A\u8BDD ID \u5373\u542F\u7528\uFF09`}))):j&&!yg(L,j)?(I=!1,r.push($e(V,{key:W,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u5B57\u6BB5 config.${D} \u7C7B\u578B\u9519\u8BEF\uFF08\u5E94\u4E3A${wg(j)}\uFF09`}))):r.push($e(V,{key:W,status:"ok",value:L,message:`config.${D} = ${vg(L)}`}))}if(T.oneOf&&!T.oneOf.fields.some(D=>!Sc(A[D]))){I=!1;let D=T.oneOf.fields[0],j=`event_source.${S}.config.${D}`,L=u.get(j);r.push($e(L,{key:j,status:"error",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D\u7F3A\u5C11\u8C03\u5EA6\u914D\u7F6E\uFF08\u9700\u914D\u7F6E ${T.oneOf.fields.map(W=>`config.${W}`).join(" / ")} \u4E4B\u4E00\uFF09`}))}I&&T.errors.length===0&&r.push({key:`event_source.${S}`,status:"ok",message:T.summary?`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${R.type}) \u914D\u7F6E\u5B8C\u6574\uFF08${T.summary}\uFF09`:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${R.type}) \u914D\u7F6E\u5B8C\u6574`})}else r.push({key:`event_source.${S}`,status:"ok",message:`\u4E8B\u4EF6\u6E90\u300C${S}\u300D(${R.type}) \u5DF2\u914D\u7F6E`})}i.eventSources.length===0&&w.length;let b=r.some(v=>v.status==="error");return{id:t.id,name:s,ok:!b,items:r}}a(_C,"checkSingleWorkflow");function AC(t){let e=t.match(/^config\.([A-Za-z_][A-Za-z0-9_.]*)/);return e?e[1]:null}a(AC,"extractConfigKey");function Sc(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(Sc,"isMissingConfigValue");function yg(t,e){return e==="string[]"?Array.isArray(t):e==="string"?typeof t=="string":!0}a(yg,"matchesConfigType");function wg(t){return t==="string[]"?"\u6570\u7EC4":"\u5B57\u7B26\u4E32"}a(wg,"typeLabel");function EC(t,e){return t.length===e.length&&t.every((n,r)=>n===e[r])}a(EC,"samePath");function bg(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(bg,"tableRefFieldFromPath");function Rg(t,e){if(t?.defaultStrategy==="workflowTrackerBaseId"&&e)return e}a(Rg,"defaultValueForTableRefWarn");async function DC(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 bc(n.recipeDir,u.handler);if(!f?.meta.config)continue;let p=u.name||u.handler,g=k(l[d])?l[d]:{},h=wi(k(g.handler_config)?g.handler_config:void 0,xg(c,u.name).handlerConfig),y=Qt(f.meta.config,b=>b.configType==="tableRef");for(let b of y){let v=vn(h,b.path);if(!k(v))continue;let R=v.baseId,S=v.tableId,C=b.path.join("."),_=Yt(b.hint);if(typeof R=="string"&&!R.trim()){let A=`event_source.${p}.handler_config.${C}.baseId`,T=i.get(A),I=_&&b.hint.defaultBase==="workflow.tracker.base_id",x=I?"warn":"error";e.push($e(T,{key:A,status:x,message:I?`[${u.handler}] handler_config.${C}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:xc(u.handler,C,"baseId"),value:x==="warn"?Rg(T,s):void 0}))}if(typeof S=="string"&&!S.trim()){let A=`event_source.${p}.handler_config.${C}.tableId`,T=i.get(A),I=_?"warn":"error";e.push($e(T,{key:A,status:I,message:_?`[${u.handler}] handler_config.${C}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:xc(u.handler,C,"tableId")}))}}let w=On(f.meta.config);if(w){for(let[b,v]of Object.entries(w)){let S=Et(v)?.expose===!0;if(yi(v)){let C=h[b];if(Array.isArray(C)&&C.length===0){let _=jC(v);if(_&&!S)continue;let A=`event_source.${p}.handler_config.${b}`,T=i.get(A);if(!T)continue;e.push($e(T,{key:A,status:_?"suggestion":"error",message:`[${u.handler}] handler_config.${b} \u4E3A\u7A7A\u6570\u7EC4`}))}}}for(let[b,v]of Object.entries(w)){if(h[b]!==void 0)continue;let R=Et(v);if(R?.expose!==!0)continue;let S=R.description??R.label??Er(v);if(!S||OC(v))continue;let C=`event_source.${p}.handler_config.${b}`,_=i.get(C);_&&e.push($e(_,{key:C,status:"suggestion",message:`[${u.handler}] handler_config.${b} \u672A\u914D\u7F6E\uFF08${S}\uFF09`}))}}}}a(DC,"checkHandlerConfigEmptiness");async function PC(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 wc(n.recipeDir,u.recipe);if(!f?.meta.config)continue;let p=k(l[d])?l[d]:{},g=wi(k(p.config)?p.config:void 0,c?.wf.steps?.[u.id]),h=Qt(f.meta.config,y=>y.configType==="tableRef");for(let y of h){let w=vn(g,y.path);if(!k(w))continue;let b=w.baseId,v=w.tableId,R=y.path.join("."),S=Yt(y.hint);if(typeof b=="string"&&!b.trim()){let C=`step.${u.id}.config.${R}.baseId`,_=i.get(C),A=S&&y.hint.defaultBase==="workflow.tracker.base_id",T=A?"warn":"error";e.push($e(_,{key:C,status:T,message:A?`[${u.recipe}] step.config.${R}.baseId \u4E3A\u7A7A\uFF08setup \u5C06\u7EE7\u627F tracker.base_id\uFF09`:kg(u.recipe,R,"baseId"),value:T==="warn"?Rg(_,s):void 0}))}if(typeof v=="string"&&!v.trim()){let C=`step.${u.id}.config.${R}.tableId`,_=i.get(C),A=S?"warn":"error";e.push($e(_,{key:C,status:A,message:S?`[${u.recipe}] step.config.${R}.tableId \u672A\u914D\u7F6E\uFF08setup \u5C06\u81EA\u52A8\u5EFA\u8868\uFF09`:kg(u.recipe,R,"tableId")}))}}}}a(PC,"checkStepConfigEmptiness");async function $C(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?[Ar.resolve(r,Ar.dirname(c.file)),r]:[r];for(let f=0;f<o.steps.length;f++){let p=o.steps[f],g=k(l[f])?l[f]:{},h=wi(k(g.config)?g.config:void 0,c?.wf.steps?.[p.id]);if(Object.keys(h).length===0)continue;let w=(p.recipe?await wc(n.recipeDir,p.recipe).catch(()=>null):null)?.meta.config,b=a((R,S)=>{let C=`step.${p.id}.config.${R.join(".")}`;if(d.has(C))return;d.add(C);let _=typeof S=="boolean"?"boolean":typeof S=="number"?"number":"string",A=c?{type:"yaml",file:c.file,yamlPath:["workflows",c.workflowId,"steps",p.id,...R],valueType:_}:{type:"yaml",file:s,yamlPath:["steps",f,"config",...R],valueType:_},T=w?MC(w,R):null,I=typeof S=="string"?IC(S,r,u):void 0,x=I?.exists===!0;e.push({key:C,status:"ok",value:S,message:`${R.join(".")} = ${String(S)}`,writeTarget:A,surface:{key:C,label:R.join("."),description:T??void 0,owner:"handler",source:"step.config",required:!1,editable:!x,allowEmpty:!0,defaultStrategy:"none",valueType:_,writeTarget:A,...I?{fileRef:I}:{}}})},"emit"),v=a((R,S)=>{for(let[C,_]of Object.entries(R)){let A=[...S,C];if(typeof _=="string"){if(/^\$\{[^}]+\}$/.test(_.trim()))continue;b(A,_)}else if(typeof _=="number"||typeof _=="boolean")b(A,_);else if(k(_)){if(Object.keys(_).length===1&&typeof _.ref=="string"||"baseId"in _||"tableId"in _)continue;v(_,A)}}},"walk");v(h,[])}}a($C,"emitStepScalarConfigItems");function kg(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(kg,"stepConfigTableRefMissingMessage");function xc(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(xc,"tableRefMissingMessage");function MC(t,e){let n=t;for(let r=0;r<e.length;r++){let o=On(n);if(!o||(n=o[e[r]],!n))return null}return Er(n)}a(MC,"describeSchemaPath");function On(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"?On(e.unwrap()):e?._def?.schema?On(e._def.schema):e?._def?.innerType?On(e._def.innerType):null}a(On,"getZodObjectShape");function yi(t){let e=t,n=e?._def?.typeName??e?._def?.type;if(n==="ZodArray"||n==="array")return!0;if(typeof e.unwrap=="function")return yi(e.unwrap());if(e?._def?.innerType)return yi(e._def.innerType);let r=e?._def?.options;return Array.isArray(r)?r.some(yi):!1}a(yi,"isArraySchema");function Er(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 Er(e.unwrap());if(e?._def?.innerType)return Er(e._def.innerType);let r=e?._def?.options;if(Array.isArray(r))for(let o of r){let i=Er(o);if(i)return i}return null}a(Er,"getFieldDescription");function OC(t){let e=On(t);return e?"baseId"in e&&"tableId"in e:!1}a(OC,"isTableRefSchema");function jC(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(jC,"isOptionalSchema");function vg(t){return Array.isArray(t)?`${t.length} \u9879`:typeof t=="string"?t:t==null?"\u672A\u8BBE\u7F6E":JSON.stringify(t)}a(vg,"formatConfigValue");import{readdir as UC,stat as VC,readFile as KC}from"fs/promises";import gn from"path";import{readdir as FC,readFile as NC,stat as LC}from"fs/promises";import{readFileSync as WC,existsSync as BC}from"fs";import bi from"path";import zC from"yaml";var ki=".role.yml",xt=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=bi.resolve(this.rolesDir),n=!1;try{n=(await LC(e)).isDirectory()}catch{n=!1}if(!n){m.info("role","\u89D2\u8272\u76EE\u5F55\u4E0D\u5B58\u5728\uFF0C\u6CE8\u518C\u4E2D\u5FC3\u4E3A\u7A7A",{dir:e});return}let o=(await FC(e)).filter(i=>i.endsWith(ki)).sort();for(let i of o){let s=bi.join(e,i),c=await this.validateFile(s);if(!c.ok){this.errors.push({file:s,errors:c.errors}),m.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=Cg(l,bi.dirname(s));if(!d.ok){this.errors.push({file:s,errors:[d.error]}),m.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]}),m.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 NC(e,"utf8")}catch(o){return{ok:!1,errors:[`\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6: ${Cc(o)}`]}}let r;try{r=zC.parse(n)}catch(o){return{ok:!1,errors:[`YAML \u89E3\u6790\u5931\u8D25: ${Cc(o)}`]}}return tc(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"]}),m.warn("role","profile \u89D2\u8272\u5B9A\u4E49\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5DF2\u8DF3\u8FC7",{key:r});continue}let i={...o,id:r},s=tc(i);if(!s.ok){this.errors.push({file:`profile:roles.${r}`,errors:s.errors}),m.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=Cg(c,n);if(!l.ok){this.errors.push({file:`profile:roles.${r}`,errors:[l.error]}),m.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]}),m.warn("role",d,{key:r});continue}this.roles.set(c.id,c)}}};function Cg(t,e){let n=t.persona;if(typeof n=="string")return{ok:!0};if(n&&typeof n=="object"&&"file"in n){let r=bi.resolve(e,n.file);if(!BC(r))return{ok:!1,error:`persona file \u4E0D\u5B58\u5728: ${n.file}\uFF08\u76F8\u5BF9 ${e}\uFF09`};try{let o=WC(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: ${Cc(o)}`}}}return{ok:!0}}a(Cg,"resolvePersonaFile");function Cc(t){return t instanceof Error?t.message:String(t)}a(Cc,"errMsg");function vi(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(vi,"roleFieldItem");function Ig(t,e,n){if(!k(t)||typeof t.file!="string")return null;let r=gn.resolve(e,t.file),o=gn.relative(n,r);return o.startsWith("..")?null:o}a(Ig,"personaFileRelPath");async function Tg(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?qC(i.roles,n,o):HC(t,o)}a(Tg,"checkRoles");async function qC(t,e,n){let r=gn.resolve(e,"profile"),o=new xt(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=k(l)?l.persona:void 0,u=Ig(d,r,e),f=u?{type:"textFile",file:u}:{type:"yaml",file:"profile/profile.yml",yamlPath:["roles",s.id,"persona"]};n.push(vi({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(vi({key:`role.${s.id}.persona`,label:"\u4EBA\u8BBE Persona",description:u?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${u}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:"\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 profile.yml\uFF09",value:c,writeTarget:f,multiline:!0})),n.push({key:`role.${s.id}`,status:"ok",message:`\u89D2\u8272 ${s.id} \u6821\u9A8C\u901A\u8FC7`})):n.push({key:`role.${s.id}.persona`,status:"warn",value:"",message:`\u89D2\u8272 ${s.id} \u7684 persona \u4E3A\u7A7A\uFF0C\u5F71\u54CD AI \u8F93\u51FA\u8D28\u91CF`,writeTarget:f});let p=s.knowledge_scope?.kb_collections??[];if(p.length===0)n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"suggestion",message:`\u89D2\u8272 ${s.id} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`});else{let g=p.map(h=>{if(typeof h=="string")return h;let y=h.compile?.build?.length?"\u81EA\u5B9A\u4E49\u7F16\u8BD1":"\u5185\u7F6E\u7F16\u8BD1";return`${h.collection}\uFF08${y}\uFF09`});n.push({key:`role.${s.id}.knowledge_scope.kb_collections`,status:"ok",value:g,message:`\u89D2\u8272 ${s.id} \u5DF2\u914D\u7F6E ${p.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!n.some(s=>s.status==="error"),items:n}}a(qC,"checkProfileRoles");async function HC(t,e){let n=!1;try{n=(await VC(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 UC(t)).filter(c=>c.endsWith(ki)).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 xt(t);for(let c of o){let l=gn.join(t,c),d=await i.validateFile(l),u=c.replace(ki,"");if(!d.ok){e.push({key:`role.${u}`,status:"error",message:`${c} \u6821\u9A8C\u5931\u8D25: ${d.errors.join("; ")}`});continue}let f=d.definition,p=typeof f.persona=="string"?f.persona:"",g=Ig(f.persona,t,gn.dirname(t)),h={type:"yaml",file:`roles/${c}`,yamlPath:["persona"]};if(g){h={type:"textFile",file:g};try{p=(await KC(gn.resolve(gn.dirname(t),g),"utf8")).trim()}catch{p=""}}e.push(vi({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(vi({key:`role.${u}.persona`,label:"\u4EBA\u8BBE Persona",description:g?`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u6765\u81EA ${g}\uFF0C\u4FDD\u5B58\u540E\u76F4\u63A5\u66F4\u65B0\u8BE5\u6587\u4EF6\uFF09`:`\u89D2\u8272\u4EBA\u8BBE\u63CF\u8FF0\uFF08\u5185\u8054\u5728 roles/${c}\uFF09`,value:p,writeTarget: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 y=f.knowledge_scope?.kb_collections??[];y.length===0?e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"suggestion",message:`${c} \u672A\u914D\u7F6E\u77E5\u8BC6\u5E93\uFF08knowledge_scope.kb_collections\uFF09\uFF0C\u5982\u9700 AI \u4F9D\u636E\u77E5\u8BC6\u5E93\u56DE\u7B54\uFF0C\u5EFA\u8BAE\u6DFB\u52A0`}):e.push({key:`role.${u}.knowledge_scope.kb_collections`,status:"ok",value:y,message:`${c} \u5DF2\u914D\u7F6E ${y.length} \u4E2A\u77E5\u8BC6\u5E93\u96C6\u5408`})}return{id:"roles",name:"\u89D2\u8272\u914D\u7F6E",ok:!e.some(c=>c.status==="error"),items:e}}a(HC,"checkDirectoryRoles");import JC from"yaml";var GC=/\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}/g,ZC=/api_key|secret|token|password|^DINGTALK_ROBOTS$/i,_g=/^[A-Za-z_][A-Za-z0-9_]*$/;function YC(t){let e=new Map;if(!t)return e;let n=[];for(let r of t.split(`
|
|
322
|
+
`)){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(_g.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(YC,"parseEnvExampleDescriptions");function Ag(t){let e=new Map;if(!t)return e;for(let n of t.split(`
|
|
323
|
+
`)){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();_g.test(i)&&/^[{[]/.test(s)&&!e.has(i)&&e.set(i,s)}return e}a(Ag,"parseEnvExampleValues");function Eg(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(Eg,"deriveEnvJsonMapSpec");function QC(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(QC,"envSurface");function XC(t){let e=[];for(let n of t.split(`
|
|
322
324
|
`)){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(`
|
|
323
|
-
`)}a(
|
|
324
|
-
`,"utf8"),await
|
|
325
|
-
`);return`sha256:${
|
|
326
|
-
`)){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(
|
|
327
|
-
\u6216\u8FD0\u884C: a1 ext install dws`)}throw t}a(
|
|
328
|
-
\u6216\u8FD0\u884C: a1 ext install dws`)}throw t}a(
|
|
329
|
-
`))}if(s==="transcription"||s==="summary-and-transcription"){let u=await
|
|
325
|
+
`)}a(XC,"stripYamlComments");function Dr(t){let e=new Map;for(let n of t)for(let r of XC(n).matchAll(GC)){let o=r[1],i=r[2]==="?",s=e.get(o);e.set(o,{optional:s?s.optional&&i:i})}return e}a(Dr,"collectEnvRefDetails");function eI(t){return new Set(Dr(t).keys())}a(eI,"collectEnvRefs");var tI=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function Dg(t,e){let n=new Map;for(let r of[t,...e.map(o=>o.text)]){let o;try{o=JC.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(tI);u&&n.set(u[1],{toolkit:s,field:l})}}}return n}a(Dg,"collectToolkitEnvRefs");function Ic(t,e,n,r="",o,i){let s=[],c=YC(r),l=Ag(r),d=o?new Map(o):Dr([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,g=n[f],h=ZC.test(f),y=c.get(f),w=i?.get(f),b;y&&w?b=`${y}\uFF1B\u683C\u5F0F: ${w}`:w?b=`\u683C\u5F0F: ${w}`:b=y;let v=QC(f,b,Eg([l.get(f),w,g],b),p);g===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:v,writeTarget:{type:"env",file:".env",envKey:f}}):g.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:v,writeTarget:{type:"env",file:".env",envKey:f}}):s.push({key:f,status:"ok",value:h?"***":g,message:"\u5DF2\u5B9A\u4E49",sensitive:h,surface:v,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(Ic,"checkEnv");function Pr(t){return t?._def?.typeName??t?._def?.type}a(Pr,"typeName");function mn(t){if(!t)return null;let e=t,n=Pr(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"?mn(e.unwrap()):e?._def?.schema?mn(e._def.schema):e?._def?.innerType?mn(e._def.innerType):null}a(mn,"getZodObjectShape");function jn(t){let e=Pr(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?jn(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?[jn(n)]:["..."]}if(e==="ZodRecord"||e==="record"){let n=t._def?.valueType??t._def?.valueSchema;return{"<name>":n?jn(n):"..."}}if(e==="ZodObject"||e==="object"){let n=mn(t);if(!n)return{};let r={};for(let[o,i]of Object.entries(n))r[o]=jn(i);return r}return typeof t.unwrap=="function"?jn(t.unwrap()):"..."}a(jn,"toExample");function Tc(t){if(!Pr(t))return;let n=Pg(t),r=Pr(n);if(r==="ZodString"||r==="string"||r==="ZodNumber"||r==="number"||r==="ZodBoolean"||r==="boolean")return;let o=jn(t);if(!(o==="..."||o===void 0))return JSON.stringify(o)}a(Tc,"zodToFormatExample");function Pg(t){let e=Pr(t);if(e==="ZodOptional"||e==="optional"||e==="ZodDefault"||e==="default"||e==="ZodNullable"||e==="nullable"){let n=t._def?.innerType??t._def?.schema;return n?Pg(n):t}return t}a(Pg,"unwrapWrapper");import{existsSync as nI}from"fs";import rI from"path";import{pathToFileURL as oI}from"url";var iI="preflight";function sI(t){for(let e of[".ts",".js"]){let n=rI.resolve(t,"lib",`${iI}${e}`);if(nI(n))return n}return null}a(sI,"resolvePreflightPath");function aI(t){if(!t||typeof t!="object")return null;let e=t,n=typeof e.message=="string"?e.message.trim():"";if(!n)return null;let r=e.level==="fatal"||e.level==="error"||e.level==="warn"?e.level:"error",o=typeof e.workflowId=="string"&&e.workflowId.trim()?e.workflowId.trim():void 0;return{level:r,message:n,...o?{workflowId:o}:{}}}a(aI,"normalizeIssue");async function $r(t){let e=sI(t);if(!e)return{issues:[],hasFatal:!1,blockedWorkflowIds:[],present:!1};let n;try{e.endsWith(".ts")&&await Dt();let i=await import(oI(e).href);if(typeof i.preflight!="function")return{issues:[{level:"fatal",message:`lib/preflight \u672A\u5BFC\u51FA preflight(configDir) \u51FD\u6570: ${e}`}],hasFatal:!0,blockedWorkflowIds:[],present:!0};let s=await i.preflight(t);n=(Array.isArray(s)?s:[]).flatMap(c=>{let l=aI(c);return l?[l]:[]})}catch(i){return{issues:[{level:"fatal",message:`lib/preflight \u6267\u884C\u5931\u8D25: ${i instanceof Error?i.message:String(i)}`}],hasFatal:!0,blockedWorkflowIds:[],present:!0}}let r=n.some(i=>i.level==="fatal"),o=[...new Set(n.filter(i=>i.level==="error"&&i.workflowId).map(i=>i.workflowId))];return{issues:n,hasFatal:r,blockedWorkflowIds:o,present:!0}}a($r,"runInstancePreflight");function $g(t,e){if(e.length===0)return t;let n=[...t.issues,...e];return{issues:n,hasFatal:n.some(r=>r.level==="fatal"),blockedWorkflowIds:[...new Set(n.filter(r=>r.level==="error"&&r.workflowId).map(r=>r.workflowId))],present:t.present}}a($g,"extendPreflight");function _c(t){let e=t.issues.map((n,r)=>({key:`preflight.${r}`,status:n.level==="warn"?"warn":"error",message:n.workflowId?`[${n.workflowId}] ${n.message}`:n.message}));return t.present&&e.length===0&&e.push({key:"preflight",status:"ok",message:"\u5B9E\u4F8B\u81EA\u5B9A\u4E49\u6821\u9A8C\u901A\u8FC7"}),{id:"profile",name:"\u5B9E\u4F8B\u81EA\u5B9A\u4E49\u6821\u9A8C(preflight)",ok:!t.issues.some(n=>n.level!=="warn"),items:e}}a(_c,"preflightModuleResult");function Ac(t){for(let e of t.issues){let n=e.workflowId?`${e.workflowId}: `:"";e.level==="warn"?m.warn("preflight",`\u26A0 ${n}${e.message}`):m.error("preflight",`\u2717 ${e.level==="fatal"?"[\u5B9E\u4F8B\u7EA7] ":""}${n}${e.message}`)}return t}a(Ac,"logPreflightSummary");import S_ from"path";import{readdirSync as x_,readFileSync as R_}from"fs";import C_ from"yaml";import{mkdir as cI,readFile as lI,rename as dI,writeFile as uI}from"fs/promises";import{randomBytes as fI}from"crypto";import pI from"path";async function hn(t,e){try{let n=await lI(ka(t,e),"utf8");return JSON.parse(n)}catch{return null}}a(hn,"readState");async function Ut(t,e,n){let r=ka(t,e);await cI(pI.dirname(r),{recursive:!0});let o=`${r}.tmp-${fI(4).toString("hex")}`;await uI(o,JSON.stringify(n,null,2)+`
|
|
326
|
+
`,"utf8"),await dI(o,r)}a(Ut,"writeState");import{createHash as gI}from"crypto";import{readdir as mI,stat as hI}from"fs/promises";import Ec from"path";var yI=new Set([".md",".txt",".text",".rst",".csv",".json",".yaml",".yml",".html",".htm",".xml"]),Dc=new Set(["node_modules",".git",".kb",".DS_Store","thumbs.db"]);async function Mg(t,e){let n;try{n=await mI(t,{withFileTypes:!0})}catch{return[]}let r=[];for(let o of n){if(Dc.has(o.name))continue;let i=Ec.join(t,o.name);if(o.isDirectory())r.push(...await Mg(i,e));else if(o.isFile()){let s=Ec.extname(o.name).toLowerCase();if(!yI.has(s)||o.name.startsWith("_"))continue;let c=await hI(i);r.push({relativePath:Ec.relative(e,i),size:c.size,mtimeMs:Math.floor(c.mtimeMs)})}}return r}a(Mg,"collectSourceFiles");async function Rt(t){let e=await Mg(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(`
|
|
327
|
+
`);return`sha256:${gI("sha256").update(n).digest("hex")}`}a(Rt,"computeSourceHash");function Si(t,e){return!t||t.status!=="done"?!0:t.sourceHash!==e}a(Si,"needsRecompile");import U from"fs";import q from"path";import{createHash as JT}from"crypto";import{mkdir as Ln,writeFile as ji,readFile as Fi,stat as TT,access as _T,copyFile as AT}from"fs/promises";import je from"path";var wI=6e4,bI=3,kI=1e3;function vI(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(vI,"isTransientDwsError");function xi(t){return t?.runner??K}a(xi,"resolveRunner");function Ri(t){return t?.dwsBinPath??"dws"}a(Ri,"resolveBin");function Ci(t){return t?.timeoutMs??wI}a(Ci,"resolveTimeout");function yn(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(`
|
|
328
|
+
`)){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(yn,"parseDwsResponse");function Vt(t,e,n){let r=n?.trim()?` | ${n.slice(0,300)}`:"";return new Error(`dws doc ${t} \u5931\u8D25: ${e}${r}`)}a(Vt,"makeDwsError");function Ii(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
|
|
329
|
+
\u6216\u8FD0\u884C: a1 ext install dws`)}throw t}a(Ii,"checkDwsMissing");async function Og(t,e){let n=xi(e),r=Ri(e),o=Ci(e),i;try{i=await n(r,["doc","info","--node",t,"--format","json"],{timeoutMs:o})}catch(c){Ii(c)}if(i.exitCode!==0)throw Vt("info",`exit code ${i.exitCode}`,i.stderr);let s=yn(i.stdout);if(!s||!s.nodeId)throw Vt("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(Og,"dwsDocInfo");async function jg(t,e,n){let r=xi(n),o=Ri(n),i=Ci(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){Ii(d)}if(c.exitCode!==0)throw Vt("list",`exit code ${c.exitCode}`,c.stderr);return yn(c.stdout)?.nodes??[]}a(jg,"dwsDocList");async function Fg(t,e){let n=xi(e),r=Ri(e),o=Ci(e),i=e?.maxReadAttempts??bI,s=e?.retryBaseDelayMs??kI,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(g){Ii(g)}if(d.exitCode!==0){let g=d.stderr.toLowerCase();if(g.includes("unauthorized")||g.includes("401")||g.includes("login"))throw new Error("dws \u672A\u6388\u6743\uFF0C\u8BF7\u5148\u6267\u884C: dws auth login");if(vI(d.stderr)&&l<i){await c(s*l);continue}throw Vt("read",`exit code ${d.exitCode}`,d.stderr)}let u=yn(d.stdout);if(!u)throw Vt("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 Vt("read","\u6587\u6863\u5185\u5BB9\u4E3A\u7A7A");return{title:f,markdown:p}}throw Vt("read","\u91CD\u8BD5\u8017\u5C3D")}a(Fg,"dwsDocRead");async function Ng(t,e,n){let r=xi(n),o=Ri(n),i=Ci(n),s;try{s=await r(o,["drive","download","--node",t,"--output",e],{timeoutMs:i})}catch(c){Ii(c)}if(s.exitCode!==0)throw Vt("drive download",`exit code ${s.exitCode}`,s.stderr)}a(Ng,"dwsDriveDownload");var SI=6e4,xI="> \u539F\u6587\u8F6C\u5199\u4E3A\u7A7A\u6216\u5F53\u524D\u8D26\u53F7\u65E0\u6743\u9650\u8BFB\u53D6\u3002";function RI(t){return t?.runner??K}a(RI,"resolveRunner");function CI(t){return t?.dwsBinPath??"dws"}a(CI,"resolveBin");function II(t){return t?.timeoutMs??SI}a(II,"resolveTimeout");function Mr(t,e,n){let r=n?.trim()?` | ${n.slice(0,300)}`:"";return new Error(`dws minutes ${t} \u5931\u8D25: ${e}${r}`)}a(Mr,"makeDwsMinutesError");function TI(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
|
|
330
|
+
\u6216\u8FD0\u884C: a1 ext install dws`)}throw t}a(TI,"checkDwsMissing");async function Ug(t,e){let n=PI(t),r=RI(e),o=CI(e),i=II(e),s=e?.contentMode??"summary-and-transcription",c=await _I(n,r,o,i),l=[];if(s==="summary"||s==="summary-and-transcription"){let u=await AI(n,r,o,i);s==="summary"?l.push(u):l.push(["## AI \u6458\u8981","",u].join(`
|
|
331
|
+
`))}if(s==="transcription"||s==="summary-and-transcription"){let u=await EI(n,r,o,i,s);s==="transcription"?l.push(u):l.push(["## \u539F\u6587\u8F6C\u5199","",u].join(`
|
|
330
332
|
`))}let d=l.filter(u=>u.trim()).join(`
|
|
331
333
|
|
|
332
|
-
`);if(!d.trim())throw
|
|
334
|
+
`);if(!d.trim())throw Mr("read","\u542C\u8BB0\u5185\u5BB9\u4E3A\u7A7A");return{title:c.title,markdown:d,info:c}}a(Ug,"dwsMinutesRead");async function _I(t,e,n,r){let o=await Pc(e,n,["minutes","get","info","--id",t,"--format","json"],r,"info"),i=yn(o.stdout),s=i?.result??i??null;if(!s?.taskUuid&&!s?.title)throw Mr("info",`\u65E0\u6CD5\u89E3\u6790\u54CD\u5E94: ${o.stdout.slice(0,200)}`);return{taskUuid:String(s.taskUuid??t),title:String(s.title??t),...typeof s.url=="string"?{url:s.url}:{},...typeof s.startTime=="number"?{startTime:s.startTime}:{},...typeof s.endTime=="number"?{endTime:s.endTime}:{},...typeof s.duration=="number"?{duration:s.duration}:{}}}a(_I,"dwsMinutesInfo");async function AI(t,e,n,r){let o=await Pc(e,n,["minutes","get","summary","--id",t,"--format","json"],r,"summary"),i=yn(o.stdout),s=i?.result??i,c=s?.fullSummary??s?.markdown??s?.summary??"";if(!c.trim())throw Mr("summary","\u542C\u8BB0\u7EAA\u8981\u5185\u5BB9\u4E3A\u7A7A");return c.trim()}a(AI,"dwsMinutesSummary");async function EI(t,e,n,r,o){try{return await DI(t,e,n,r)}catch(i){if(o==="summary-and-transcription")return xI;throw i}}a(EI,"readMinutesTranscriptionForMode");async function DI(t,e,n,r){let o=await Pc(e,n,["minutes","get","transcription","--id",t,"--format","json"],r,"transcription"),i=yn(o.stdout),s=$I(i);if(s.length===0)throw Mr("transcription","\u542C\u8BB0\u539F\u6587\u8F6C\u5199\u4E3A\u7A7A");return s.map(OI).join(`
|
|
333
335
|
|
|
334
|
-
`)}a(
|
|
336
|
+
`)}a(DI,"dwsMinutesTranscription");async function Pc(t,e,n,r,o){let i;try{i=await t(e,n,{timeoutMs:r})}catch(s){TI(s)}if(i.exitCode!==0){let s=i.stderr.toLowerCase();throw s.includes("unauthorized")||s.includes("401")||s.includes("login")?new Error("dws \u672A\u6388\u6743\uFF0C\u8BF7\u5148\u6267\u884C: dws auth login"):Mr(o,`exit code ${i.exitCode}`,i.stderr)}return i}a(Pc,"runDwsMinutesCommand");function PI(t){let e;try{e=new URL(t)}catch{throw new Error(`\u65E0\u6548\u7684\u9489\u9489 AI \u542C\u8BB0 URL: ${t}`)}if(!e.hostname.toLowerCase().includes("shanji.dingtalk.com"))throw new Error(`\u4E0D\u652F\u6301\u7684\u9489\u9489 AI \u542C\u8BB0\u57DF\u540D: ${e.hostname}`);let r=e.pathname.match(/\/app\/transcribes\/([^/?#]+)/)?.[1]?.trim();if(!r)throw new Error(`\u65E0\u6CD5\u89E3\u6790\u9489\u9489 AI \u542C\u8BB0 taskUuid: ${t}`);return decodeURIComponent(r)}a(PI,"parseDingtalkMinutesId");function $I(t){let e=MI(t),n=[e,at(e,"records"),at(e,"items"),at(e,"list"),at(e,"sentences"),at(e,"paragraphs"),at(e,"transcriptions"),at(e,"data")];for(let r of n){let o=Vg(r);if(o.length>0)return o}return[]}a($I,"extractTranscriptionSegments");function MI(t){return at(t,"result")??t}a(MI,"unwrapResult");function Vg(t){return Array.isArray(t)?t.flatMap(Lg):Lg(t)}a(Vg,"normalizeSegments");function Lg(t){if(!t||typeof t!="object")return[];let e=["records","items","list","sentences","paragraphs","segments"].map(r=>at(t,r)).find(r=>Array.isArray(r));if(e)return Vg(e);let n=Bg(t,["text","content","sentence","transcription","words","paragraph"]);return n?[{speaker:Bg(t,["speakerName","speaker","userName","nick","name"]),text:n,startTime:zg(t,["startTime","beginTime","start","timestamp"]),endTime:zg(t,["endTime","end"])}]:[]}a(Lg,"normalizeSegmentValue");function OI(t){let e=[jI(t),t.speaker].filter(Boolean).join(" ");return e?`- ${e}\uFF1A${t.text}`:`- ${t.text}`}a(OI,"formatTranscriptionSegment");function jI(t){let e=Wg(t.startTime),n=Wg(t.endTime);return e&&n?`[${e}-${n}]`:e?`[${e}]`:""}a(jI,"formatTimeRange");function Wg(t){if(t==null||t==="")return"";if(typeof t=="string")return t;let e=Math.max(0,Math.floor(t/1e3)),n=Math.floor(e/60).toString().padStart(2,"0"),r=(e%60).toString().padStart(2,"0");return`${n}:${r}`}a(Wg,"formatTimeValue");function Bg(t,e){for(let n of e){let r=at(t,n);if(typeof r=="string"&&r.trim())return r.trim()}}a(Bg,"firstString");function zg(t,e){for(let n of e){let r=at(t,n);if(typeof r=="number")return r;if(typeof r=="string"&&r.trim())return r.trim()}}a(zg,"firstStringOrNumber");function at(t,e){if(!(!t||typeof t!="object"))return t[e]}a(at,"getProp");var FI="https://alidocs.dingtalk.com/i/nodes/",NI=new Set(["adoc","docx","pdf","md","txt","text","rst","csv","json","yaml","yml","xml","html","htm","xlsx"]);function Mc(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(Mc,"parseDingtalkUrl");async function Ti(t,e,n,r){let o=await jg(t,e,r),i=[],s=0;for(let c of o){let l=n?`${n}/${$c(c.name)}`:$c(c.name);if(c.nodeType==="folder"){let d=await Ti(t,c.nodeId,l,r);i.push(...d.nodes),s+=d.skippedUnsupported}else{if(c.extension&&!NI.has(c.extension)){s++;continue}i.push({id:c.nodeId,title:c.name,relativePath:l,sourceUrl:`${FI}${c.nodeId}`,updateTime:c.updateTime,extension:c.extension})}}return{nodes:i,skippedUnsupported:s}}a(Ti,"listRecursive");function $c(t){return Re(t,{fallback:"untitled"})}a($c,"sanitizeDirName");async function Kg(t,e){let n=Mc(t);if(n.type==="my-space")return{scope:"space",...await Ti(void 0,void 0,"",e)};if(n.type==="space"){let i=await Ti(n.id,void 0,"",e);return{scope:"space",workspaceId:n.id,...i}}let r=await Og(t,e);if(r.nodeType==="file")return{scope:"document",workspaceId:r.workspaceId,skippedUnsupported:0,nodes:[{id:r.nodeId,title:r.name,relativePath:$c(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 Ti(r.workspaceId,r.nodeId,"",e);return{scope:"folder",workspaceId:r.workspaceId,...o}}a(Kg,"crawlDingtalk");import{readFile as qI,writeFile as uV}from"fs/promises";import HI from"path";var LI=["script","style","noscript","template","head","nav","footer","iframe","svg","form","button"],WI={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" ",copy:"\xA9",reg:"\xAE",trade:"\u2122",hellip:"\u2026",mdash:"\u2014",ndash:"\u2013",lsquo:"\u2018",rsquo:"\u2019",ldquo:"\u201C",rdquo:"\u201D",middot:"\xB7",bull:"\u2022",times:"\xD7",divide:"\xF7"};function _i(t){return t.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g,(e,n)=>{if(n.startsWith("#x")||n.startsWith("#X")){let r=Number.parseInt(n.slice(2),16);return Number.isFinite(r)?String.fromCodePoint(r):e}if(n.startsWith("#")){let r=Number.parseInt(n.slice(1),10);return Number.isFinite(r)?String.fromCodePoint(r):e}return WI[n.toLowerCase()]??e})}a(_i,"decodeHtmlEntities");function BI(t){let e=t.replace(/<!--[\s\S]*?-->/g,"");for(let n of LI){let r=new RegExp(`<${n}\\b[^>]*>[\\s\\S]*?<\\/${n}>`,"gi");e=e.replace(r,`
|
|
335
337
|
`),e=e.replace(new RegExp(`<${n}\\b[^>]*\\/?>`,"gi"),`
|
|
336
|
-
`)}return e}a(
|
|
338
|
+
`)}return e}a(BI,"stripNoise");function Oc(t,e){let n=t.match(new RegExp(`${e}\\s*=\\s*("[^"]*"|'[^']*'|[^\\s>]+)`,"i"));if(!n)return"";let r=n[1].trim();return(r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'"))&&(r=r.slice(1,-1)),_i(r)}a(Oc,"attrOf");function Fn(t){let e=t;return e=e.replace(/<img\b[^>]*\/?>/gi,n=>{let r=Oc(n,"src");return!r||/^(data:|javascript:)/i.test(r)?"":``}),e=e.replace(/<a\b[^>]*>([\s\S]*?)<\/a>/gi,(n,r)=>{let o=Oc(n,"href"),i=r.replace(/<[^>]+>/g,"").trim();return!o||/^(javascript:|#)/i.test(o)?i:i?`[${i}](${o})`:o}),e=e.replace(/<(strong|b)\b[^>]*>([\s\S]*?)<\/\1>/gi,(n,r,o)=>`**${o.trim()}**`),e=e.replace(/<(em|i)\b[^>]*>([\s\S]*?)<\/\1>/gi,(n,r,o)=>`*${o.trim()}*`),e=e.replace(/<(del|s|strike)\b[^>]*>([\s\S]*?)<\/\1>/gi,(n,r,o)=>`~~${o.trim()}~~`),e=e.replace(/<code\b[^>]*>([\s\S]*?)<\/code>/gi,(n,r)=>`\`${r.replace(/<[^>]+>/g,"").trim()}\``),e=e.replace(/<br\s*\/?>/gi,`
|
|
337
339
|
`),e=e.replace(/<hr\s*\/?>/gi,`
|
|
338
340
|
---
|
|
339
|
-
`),e=e.replace(/<(strong|b)\b[^>]*>/gi,"**").replace(/<\/(strong|b)>/gi,"**"),e=e.replace(/<(em|i)\b[^>]*>/gi,"*").replace(/<\/(em|i)>/gi,"*"),e=e.replace(/<\/?[a-zA-Z][^>]*>/g,""),e=
|
|
341
|
+
`),e=e.replace(/<(strong|b)\b[^>]*>/gi,"**").replace(/<\/(strong|b)>/gi,"**"),e=e.replace(/<(em|i)\b[^>]*>/gi,"*").replace(/<\/(em|i)>/gi,"*"),e=e.replace(/<\/?[a-zA-Z][^>]*>/g,""),e=_i(e),e=e.split(`
|
|
340
342
|
`).map(n=>n.replace(/[ \t]+/g," ").trim()).join(`
|
|
341
|
-
`),e.trim()}a(
|
|
343
|
+
`),e.trim()}a(Fn,"inlineToMarkdown");function zI(t){return t.replace(/<pre\b[^>]*>([\s\S]*?)<\/pre>/gi,(e,n)=>{let r=_i(n.replace(/<[^>]+>/g,"")).replace(/\n{2,}/g,`
|
|
342
344
|
`).trim();return r?`
|
|
343
345
|
|
|
344
346
|
\`\`\`
|
|
345
347
|
${r}
|
|
346
348
|
\`\`\`
|
|
347
349
|
|
|
348
|
-
`:""})}a(
|
|
350
|
+
`:""})}a(zI,"convertPreBlocks");function UI(t){return t.replace(/<table\b[^>]*>([\s\S]*?)<\/table>/gi,(e,n)=>{let r=[],o=/<tr\b[^>]*>([\s\S]*?)<\/tr>/gi,i;for(;(i=o.exec(n))!==null;){let d=[],u=/<(td|th)\b[^>]*>([\s\S]*?)<\/\1>/gi,f;for(;(f=u.exec(i[1]))!==null;)d.push(Fn(f[2]).replace(/\n+/g," ").replace(/\|/g,"\\|").trim());d.length>0&&r.push(d)}if(r.length===0)return"";let s=Math.max(...r.map(d=>d.length)),c=a(d=>{let u=d.slice(0,s);for(;u.length<s;)u.push("");return u},"pad");return`
|
|
349
351
|
|
|
350
352
|
${[`| ${c(r[0]).join(" | ")} |`,`| ${new Array(s).fill("---").join(" | ")} |`,...r.slice(1).map(d=>`| ${c(d).join(" | ")} |`)].join(`
|
|
351
353
|
`)}
|
|
352
354
|
|
|
353
|
-
`})}a(
|
|
354
|
-
- ${
|
|
355
|
+
`})}a(UI,"convertTables");function VI(t){let e=t;for(let n=0;n<3;n++){let r=e.replace(/<(ul|ol)\b[^>]*>\s*((?:<li\b[\s\S]*?<\/li>\s*)+)<\/\1>/gi,(o,i,s)=>{let c=[],l=/<li\b[^>]*>([\s\S]*?)<\/li>/gi,d;for(;(d=l.exec(s))!==null;)c.push(`
|
|
356
|
+
- ${Fn(d[1]).replace(/\n+/g," ")}`);return c.join("")});if(r===e)break;e=r}return e}a(VI,"convertLists");function KI(t){let e=t;for(let n=1;n<=6;n++)e=e.replace(new RegExp(`<h${n}\\b[^>]*>([\\s\\S]*?)<\\/h${n}>`,"gi"),(r,o)=>{let i=Fn(o).replace(/\n+/g," ");return i?`
|
|
355
357
|
|
|
356
358
|
${"#".repeat(n)} ${i}
|
|
357
359
|
|
|
358
|
-
`:""});return e=e.replace(/<blockquote\b[^>]*>([\s\S]*?)<\/blockquote>/gi,(n,r)=>{let o=
|
|
360
|
+
`:""});return e=e.replace(/<blockquote\b[^>]*>([\s\S]*?)<\/blockquote>/gi,(n,r)=>{let o=Fn(r);return o?`
|
|
359
361
|
|
|
360
362
|
${o.split(`
|
|
361
363
|
`).map(i=>i?`> ${i}`:">").join(`
|
|
362
364
|
`)}
|
|
363
365
|
|
|
364
|
-
`:""}),e=e.replace(/<p\b[^>]*>([\s\S]*?)<\/p>/gi,(n,r)=>{let o=
|
|
366
|
+
`:""}),e=e.replace(/<p\b[^>]*>([\s\S]*?)<\/p>/gi,(n,r)=>{let o=Fn(r);return o?`
|
|
365
367
|
|
|
366
368
|
${o}
|
|
367
369
|
|
|
368
|
-
`:""}),e=e.replace(/<li\b[^>]*>([\s\S]*?)<\/li>/gi,(n,r)=>{let o=
|
|
370
|
+
`:""}),e=e.replace(/<li\b[^>]*>([\s\S]*?)<\/li>/gi,(n,r)=>{let o=Fn(r).replace(/\n+/g," ");return o?`
|
|
369
371
|
- ${o}
|
|
370
372
|
`:""}),e=e.replace(/<\/(div|section|article|main|aside|header|li|ul|ol|tr|tbody|thead)>/gi,`
|
|
371
373
|
`),e=e.replace(/<(div|section|article|main|aside|header|ul|ol|tbody|thead)\b[^>]*>/gi,`
|
|
372
|
-
`),e=e.replace(/<(strong|b)\b[^>]*>/gi,"**"),e=e.replace(/<(em|i)\b[^>]*>/gi,"*"),e}a(
|
|
374
|
+
`),e=e.replace(/<(strong|b)\b[^>]*>/gi,"**"),e=e.replace(/<(em|i)\b[^>]*>/gi,"*"),e}a(KI,"convertBlocks");function jc(t){let e=BI(t);return e=zI(e),e=UI(e),e=VI(e),e=KI(e),e=e.replace(/<\/?[a-zA-Z][^>]*>/g," "),e=_i(e),e=e.split(`
|
|
373
375
|
`).map(n=>n.replace(/[ \t]+/g," ").trimEnd()).join(`
|
|
374
376
|
`).replace(/\n{3,}/g,`
|
|
375
377
|
|
|
376
|
-
`).trim(),e}a(
|
|
377
|
-
`)}a(
|
|
378
|
+
`).trim(),e}a(jc,"convertHtmlToMd");function Fc(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t")}a(Fc,"yamlEscapeTitle");async function Nc(t){let n=(await import("mammoth")).convertToMarkdown;if(!n)throw new Error("mammoth.convertToMarkdown not found");return(await n({path:t})).value}a(Nc,"convertDocxToMd");async function Lc(t){let e=await import("pdf-parse"),n=await qI(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(Lc,"convertPdfToMd");function JI(t){let e=t.toString("utf8").trimStart();return/^<(!doctype|html)/i.test(e)?"HTML \u9875\u9762":e.startsWith("{")||e.startsWith("[")?"JSON \u6587\u672C":e.startsWith("%PDF")?"PDF":t[0]===80&&t[1]===75?"zip \u5BB9\u5668":"\u7EAF\u6587\u672C/\u5176\u4ED6\u5185\u5BB9"}a(JI,"sniffContentKind");function GI(t,e){let n=HI.extname(e).toLowerCase(),r=t.subarray(0,1024);if(n===".pdf"){if(r.indexOf("%PDF")!==-1)return}else if(n===".zip"||n===".docx"||n===".xlsx"||n===".pptx"){if(r[0]===80&&r[1]===75&&r[2]===3&&r[3]===4)return}else return;let o=JI(r);throw new Error(`\u9644\u4EF6\u300C${e}\u300D\u4E0B\u8F7D\u5185\u5BB9\u4E0E\u6269\u5C55\u540D\u4E0D\u7B26\uFF08\u58F0\u660E ${n}\uFF0C\u5B9E\u9645\u6536\u5230${o}\uFF09\u2014\u2014\u4E0B\u8F7D\u94FE\u63A5\u53EF\u80FD\u5DF2\u5931\u6548\u6216\u9700\u8981\u767B\u5F55\uFF0C\u8BF7\u91CD\u65B0\u4E0A\u4F20\u9644\u4EF6\u6216\u6539\u7528\u300C\u6765\u6E90\u94FE\u63A5\u300D\u5165\u53E3`)}a(GI,"assertDownloadMatchesExtension");function ZI(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(ZI,"xlsxCellText");function YI(t){return t.replace(/\r?\n/g,"<br>").replace(/\|/g,"\\|").trim()}a(YI,"escapeTableCell");function QI(t,e){let n=a(s=>{let c=s.slice(0,e);for(;c.length<e;)c.push("");return c.map(YI)},"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(`
|
|
379
|
+
`)}a(QI,"renderMarkdownTable");async function Wc(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 g=1;g<p;g++)f.push(ZI(u[g]));f.some(g=>g.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}
|
|
378
380
|
|
|
379
|
-
${
|
|
381
|
+
${QI(c,l)}`)}),i.join(`
|
|
380
382
|
|
|
381
|
-
`)}a(
|
|
383
|
+
`)}a(Wc,"convertXlsxToMd");import{mkdir as XI,readdir as eT,stat as qg,readFile as Ei,access as Hg,writeFile as tT}from"fs/promises";import{existsSync as Di,readFileSync as nT}from"fs";import Ae from"path";import{fileURLToPath as rT}from"url";var Ai=Ae.dirname(rT(import.meta.url));function Kt(){let t=Ai;for(let e=0;e<12;e++){let n=Ae.join(t,"package.json");if(Di(n))try{let o=JSON.parse(nT(n,"utf-8"));if(o.name==="aitable-workflow-monorepo"||o.workspaces)return t}catch{}let r=Ae.dirname(t);if(r===t)break;t=r}return Ae.resolve(Ai,"../../../../..")}a(Kt,"findRepoRoot");function Bc(){let t=[Ae.resolve(Ai,"..","wolai-crawler","run.js"),Ae.join(Kt(),"packages","core","src","kb","wolai-crawler","run.js")];for(let e of t)if(Di(e))return e;return t[0]}a(Bc,"resolveCrawlerScript");function oT(){let t=[Ae.resolve(Ai,"..","wolai-crawler","config.default.json"),Ae.join(Kt(),"packages","core","src","kb","wolai-crawler","config.default.json")];for(let e of t)if(Di(e))return e;return t[0]}a(oT,"resolveDefaultConfigPath");function zc(){let t=Kt(),e=Ae.join(t,".sandbox","kb-validate","wolai-crawler-config.json"),n=oT();return Di(e)?e:n}a(zc,"resolveConfigPath");async function iT(){let t=zc();try{return JSON.parse(await Ei(t,"utf8")).storageState??null}catch{return null}}a(iT,"resolveStorageStatePath");async function sT(t){let e=await iT(),n=zc();if(!e)throw new Error(`\u672A\u627E\u5230 wolai-crawler \u7684 storageState \u914D\u7F6E\u3002
|
|
382
384
|
\u8BF7\u68C0\u67E5\u914D\u7F6E\u6587\u4EF6\u4E2D\u662F\u5426\u5305\u542B storageState \u5B57\u6BB5\uFF1A
|
|
383
|
-
${n}`);let r=
|
|
385
|
+
${n}`);let r=Ae.isAbsolute(e)?e:Ae.join(Kt(),e);try{await Hg(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",[Bc(),"--config",n,"--login","--login-wait-ms","600000","--repo-root",Kt()],{cwd:Kt(),timeoutMs:9e5,inheritStdio:!0});if(o.exitCode!==0)throw new Error(`wolai \u767B\u5F55\u6D41\u7A0B\u5931\u8D25\uFF1A
|
|
384
386
|
`+Se(o.stderr||o.stdout,{max:800})+`
|
|
385
|
-
\u8BF7\u786E\u8BA4\u4F60\u5BF9\u76EE\u6807\u9875\u9762\u5177\u6709\u5BFC\u51FA\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`);try{await
|
|
387
|
+
\u8BF7\u786E\u8BA4\u4F60\u5BF9\u76EE\u6807\u9875\u9762\u5177\u6709\u5BFC\u51FA\u6743\u9650\uFF0C\u7136\u540E\u91CD\u8BD5\u3002`);try{await Hg(r)}catch{throw new Error(`\u767B\u5F55\u540E\u4ECD\u672A\u751F\u6210\u767B\u5F55\u6001\u6587\u4EF6: ${r}
|
|
386
388
|
\u8BF7\u91CD\u65B0\u8FD0\u884C\u767B\u5F55\u547D\u4EE4\uFF1A
|
|
387
|
-
node ${Oc()} --config ${n} --login`)}}a(MI,"ensureStorageStateExists");async function OI(t){try{let e=await Ti(t,"utf8");return!!Ee(e).ingested}catch{return!1}}a(OI,"shouldSkip");async function Fc(t){let e=[],n;try{n=await AI(t,{withFileTypes:!0})}catch{return e}for(let r of n){let o=_e.join(t,r.name);r.isDirectory()?e.push(...await Fc(o)):r.name.endsWith(".md")&&e.push(o)}return e}a(Fc,"scanMarkdownFiles");async function jI(t,e){let n=e.runner??K,r=Oc(),o=jc(),i=e.outputDir;await TI(i,{recursive:!0});let s=[r,"--config",o,"--url",t,"--output",i,"--repo-root",Vt()],c=await n("node",s,{cwd:Vt(),timeoutMs:e.timeoutMs??36e5,inheritStdio:!0});if(c.exitCode!==0)throw new Error(Se(c.stderr||c.stdout,{max:800}));let l=await Fc(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 $g(h)).mtimeMs})));d.sort((h,y)=>y.mtimeMs-h.mtimeMs);let u=d[0].path,f=_e.relative(i,u),p=_e.basename(u,".md"),g=await Ti(u,"utf8");return Kt(g)||await _I(u,ze(p,t,"wolai")+g,"utf8"),{success:!0,action:"created",relativePath:f,filePath:u,title:p,sourceType:"wolai",sourceUrl:t,contentLength:(await $g(u)).size}}a(jI,"ingestSingleWolaiPage");async function Og(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 MI(t.runner??K);let n=await Fc(t.outputDir);for(let o of n)try{let i=await Ti(o,"utf8"),s=Ee(i);if(s.source===t.url&&!t.force&&await OI(o))return{success:!0,action:"skipped",relativePath:_e.relative(t.outputDir,o),filePath:o,title:s.title||_e.basename(o,".md"),sourceType:"wolai",sourceUrl:t.url}}catch{}return await jI(t.url,t)}a(Og,"ingestWolai");import{mkdir as Ng,writeFile as FI}from"fs/promises";import NI from"path";var he=class extends Error{static{a(this,"IngestError")}retryable;constructor(e,n){super(e),this.name="IngestError",this.retryable=n?.retryable??!0}};var Lg="yuque-api.antfin-inc.com",jg=`https://${Lg}/api/v2`,LI={"yuque.com":"https://www.yuque.com/api/v2","www.yuque.com":"https://www.yuque.com/api/v2","aliyuque.antfin.com":jg,"yuque.antfin.com":jg};function Wg(t){try{return new URL(t).hostname===Lg}catch{return!1}}a(Wg,"isInternalApiBase");function Bg(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=LI[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(Bg,"parseYuqueUrl");function Nc(t,e){if(e?.yuqueToken)return e.yuqueToken;let n=Wg(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 he(`\u8BED\u96C0 Token \u7F3A\u5931\u3002${i}`,{retryable:!1})}a(Nc,"resolveToken");async function Lc(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:{...Wg(t)?{"X-Auth-Token":n}:{Authorization:`Bearer ${n}`},"User-Agent":"aitable-workflow","Content-Type":"application/json"},signal:d.signal})}catch(g){if(clearTimeout(u),g instanceof Error&&g.name==="AbortError")throw new Error(`\u8BED\u96C0 API \u8BF7\u6C42\u8D85\u65F6 (${i}ms): ${e}`);if(c=g instanceof Error?g:new Error(String(g)),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 g=Math.pow(2,l)*1e3;await new Promise(h=>setTimeout(h,g));continue}if(f.status===401)throw new he("\u8BED\u96C0 Token \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\u3002\u8BF7\u5728\u8BED\u96C0\u8BBE\u7F6E\u4E2D\u91CD\u65B0\u751F\u6210 Token",{retryable:!1});if(f.status===404)throw new he(`\u8BED\u96C0\u6587\u6863\u4E0D\u5B58\u5728\u6216\u65E0\u8BBF\u95EE\u6743\u9650: ${e}`,{retryable:!1});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(Lc,"yuqueFetch");async function zg(t,e,n,r){let o=Nc(t,r),i=await Lc(t,`/repos/${e}/docs/${n}`,o,r);return{title:i.title,markdown:i.body??"",updatedAt:new Date(i.updated_at).getTime()}}a(zg,"yuqueDocRead");async function WI(t,e,n){let r=Nc(t,n);return Lc(t,`/repos/${e}/docs`,r,n)}a(WI,"yuqueDocList");async function BI(t,e,n){let r=Nc(t,n);return Lc(t,`/repos/${e}/toc`,r,n)}a(BI,"yuqueTocTree");function zI(t,e){let n=new Map,r=[];for(let o of t){if(r.length=o.depth,o.type==="TITLE"){r.push(_i(o.title));continue}o.type==="LINK"||!o.slug||o.type==="DOC"&&e.has(o.slug)&&(r.push(_i(o.title)),n.set(o.slug,r.join("/")),r.pop())}return n}a(zI,"buildRelativePaths");function _i(t){return Re(t,{fallback:"untitled"})}a(_i,"sanitizeDirName");async function UI(t,e){let n=Bg(t),{namespace:r,slug:o,host:i,apiBase:s}=n;if(o){let p=await zg(s,r,o,e);return{scope:"document",skippedUnsupported:0,nodes:[{id:o,title:p.title,relativePath:_i(p.title),sourceUrl:`https://${i}/${r}/${o}`,updateTime:p.updatedAt,cachedMarkdown:p.markdown}]}}let[c,l]=await Promise.all([BI(s,r,e).catch(()=>[]),WI(s,r,e)]),d=new Set(l.map(p=>p.slug)),u=zI(c,d);return{scope:"space",skippedUnsupported:0,nodes:l.map(p=>({id:p.slug,title:p.title,relativePath:u.get(p.slug)??_i(p.title),sourceUrl:`https://${i}/${r}/${p.slug}`,updateTime:new Date(p.updated_at).getTime()}))}}a(UI,"crawlYuque");async function Fg(t,e,n,r){try{let o=e.outputFileName??(e.preserveStructure!==!1?t.relativePath:Ei(t.title)),{filePath:i,relPath:s}=$r(e.outputDir,o);if(!e.force&&await Wc(i,t.updateTime))return{success:!0,action:"skipped",relativePath:s,filePath:i,title:t.title,sourceType:"yuque",sourceUrl:t.sourceUrl};let c=await Pr(i);await Ng(NI.dirname(i),{recursive:!0});let l,d;if(t.cachedMarkdown!==void 0)l=t.title,d=t.cachedMarkdown;else{let f=await zg(n,r,t.id,{yuqueToken:e.yuqueToken,fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs});l=f.title,d=f.markdown}let u=d;return Kt(u)||(u=ze(l,t.sourceUrl,"yuque")+u),await FI(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),retryable:o instanceof he?o.retryable:!0}}}a(Fg,"ingestSingleYuqueDoc");async function Ug(t){await Ng(t.outputDir,{recursive:!0});let e=Bg(t.url),{namespace:n,apiBase:r}=e,o;try{o=await UI(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),retryable:c instanceof he?c.retryable:!0}}if(o.scope==="document")return o.nodes.length===0?{success:!1,sourceType:"yuque",sourceUrl:t.url,error:"\u672A\u627E\u5230\u6587\u6863",retryable:!1}:Fg(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 Fg(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(Ug,"ingestYuque");import{mkdir as VI,writeFile as KI,rename as qI}from"fs/promises";import{existsSync as HI}from"fs";import Di from"path";import{createHash as JI,randomBytes as GI}from"crypto";var Vg=String.raw`!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)`;async function Pi(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??2e4,i=n.imageDirName??"image",s=Di.join(Di.dirname(e),i),c=new Set;for(let p of t.matchAll(new RegExp(Vg,"g"))){let g=Kg(p[2]??"");/^https?:\/\//i.test(g)&&c.add(g)}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 g=ZI(p),h=Di.join(s,g),y=`${i}/${g}`;if(HI(h)){l.set(p,y),d++;continue}await QI(p,h,s,r,o)?(l.set(p,y),d++):(l.set(p,null),u++)}return{markdown:t.replace(new RegExp(Vg,"g"),(p,g,h)=>{let y=Kg(h),w=l.get(y);return w?``:p}),imageCount:d,failedCount:u}}a(Pi,"localizeMarkdownImages");function Kg(t){let e=t.trim();return e.startsWith("<")&&e.endsWith(">")?e.slice(1,-1):e}a(Kg,"unwrapUrl");function ZI(t){let e=t,n="img",r=YI(t);try{let i=new URL(t);e=i.origin+i.pathname;let c=Di.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=JI("sha1").update(e).digest("hex").slice(0,8);return`${n}-${o}.${r}`}a(ZI,"imageFilename");function YI(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp|svg)$/i);return n?n[1].toLowerCase():"png"}a(YI,"extFromUrl");async function QI(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 m.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 m.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u4E3A\u7A7A",{url:t}),!1;await VI(n,{recursive:!0});let d=`${e}.${GI(4).toString("hex")}.tmp`;return await KI(d,l),await qI(d,e),m.debug("image-localizer","\u56FE\u7247\u5DF2\u672C\u5730\u5316",{dest:e}),!0}catch(c){return m.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u5F02\u5E38",{url:t,error:c instanceof Error?c.message:String(c)}),!1}finally{clearTimeout(s)}}a(QI,"downloadImage");import{lstat as qg,readdir as XI}from"fs/promises";import jn from"path";function eT(t){return t.split(jn.sep).join("/")}a(eT,"normalizeRelativePath");async function Hg(t){if(!jn.isAbsolute(t.root))throw new Error(`\u6765\u6E90\u6839\u76EE\u5F55\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84: ${t.root}`);if(t.maxDocuments!==void 0&&(!Number.isInteger(t.maxDocuments)||t.maxDocuments<1))throw new Error(`maxDocuments \u5FC5\u987B\u662F\u6B63\u6574\u6570: ${t.maxDocuments}`);let e=jn.resolve(t.root),n;try{n=await qg(e)}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`\u65E0\u6CD5\u8BBF\u95EE\u6765\u6E90\u6839\u76EE\u5F55 ${e}: ${c}`)}if(n.isSymbolicLink())throw new Error(`\u6765\u6E90\u6839\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5: ${e}`);if(!n.isDirectory())throw new Error(`\u6765\u6E90\u6839\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55: ${e}`);let r=[],o=[];async function i(s){let c;try{c=await XI(s,{withFileTypes:!0})}catch(l){let d=l instanceof Error?l.message:String(l);throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u6765\u6E90\u76EE\u5F55 ${s}: ${d}`)}for(let l of c){let d=jn.join(s,l.name),u=eT(jn.relative(e,d)),f=await qg(d);if(f.isSymbolicLink()){o.push({path:u,reason:"symlink"});continue}if(f.isDirectory()){if(l.name.startsWith(".")||t.ignoredDirectoryNames.has(l.name)){o.push({path:u,reason:"ignored"});continue}await i(d);continue}if(!f.isFile()){o.push({path:u,reason:"unsupported"});continue}let p=jn.extname(l.name).toLowerCase();if(!t.supportedExtensions.has(p)){o.push({path:u,reason:"unsupported"});continue}if(r.push({documentKey:u,absolutePath:d,relativePath:u,extension:p,byteLength:f.size}),t.maxDocuments!==void 0&&r.length>t.maxDocuments)throw new Error(`\u6765\u6E90\u6587\u6863\u6570\u8D85\u8FC7\u4E0A\u9650 ${t.maxDocuments}\uFF0C\u8BF7\u62C6\u5206\u6765\u6E90`)}}return a(i,"scan"),await i(e),r.sort((s,c)=>s.documentKey.localeCompare(c.documentKey)),o.sort((s,c)=>s.path.localeCompare(c.path)),{documents:r,skipped:o}}a(Hg,"discoverLocalSources");var oT=new Set(["docx","pdf","xlsx"]);function Bc(t){let e;try{e=new URL(t).hostname.toLowerCase()}catch{throw new he(`\u65E0\u6548\u7684 URL: ${t}`,{retryable:!1})}if(e.includes("alidocs.dingtalk.com"))return"dingtalk-doc";if(e.includes("shanji.dingtalk.com"))return"dingtalk-minutes";if(e.includes("yuque.com")||e.includes("yuque.antfin.com")||e.includes("aliyuque.antfin.com"))throw new he(`\u8BED\u96C0\u94FE\u63A5\u6682\u4E0D\u652F\u6301\u76F4\u63A5\u5BFC\u5165: ${t}\u3002\u8BF7\u5728\u8BED\u96C0\u4E2D\u5C06\u6587\u6863\u5BFC\u51FA\u4E3A Markdown\uFF0C\u518D\u4EE5\u6587\u4EF6\u9644\u4EF6\u65B9\u5F0F\u4E0A\u4F20\u3002`,{retryable:!1});return e.includes("wolai.dingtalk.com")?"wolai":"web"}a(Bc,"detectSourceType");function iT(t,e){if(e==="dingtalk-doc"){let{type:n}=Ac(t);return n==="space"?"space":"document"}return e==="yuque"?new URL(t).pathname.replace(/\/edit\/?$/,"").replace(/\/$/,"").split("/").filter(Boolean).length>=3?"document":"space":"document"}a(iT,"detectScope");function Ei(t){let e=t.trim().replace(/\s+/g,"-").replace(/[<>:"/\\|?*\x00-\x1f]/g,"").replace(/[^\p{L}\p{N}._-]/gu,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"untitled";return Re(e,{fallback:"untitled",maxLength:80})}a(Ei,"slugify");function ze(t,e,n){let r=ne();return["---",`title: "${Dc(t)}"`,`source: "${Dc(e)}"`,`source_type: ${n}`,`ingested: "${r}"`,"---",""].join(`
|
|
388
|
-
`)}a(ze,"buildFrontmatter");function
|
|
389
|
+
node ${Bc()} --config ${n} --login`)}}a(sT,"ensureStorageStateExists");async function aT(t){try{let e=await Ei(t,"utf8");return!!Ee(e).ingested}catch{return!1}}a(aT,"shouldSkip");async function Uc(t){let e=[],n;try{n=await eT(t,{withFileTypes:!0})}catch{return e}for(let r of n){let o=Ae.join(t,r.name);r.isDirectory()?e.push(...await Uc(o)):r.name.endsWith(".md")&&e.push(o)}return e}a(Uc,"scanMarkdownFiles");async function cT(t,e){let n=e.runner??K,r=Bc(),o=zc(),i=e.outputDir;await XI(i,{recursive:!0});let s=[r,"--config",o,"--url",t,"--output",i,"--repo-root",Kt()],c=await n("node",s,{cwd:Kt(),timeoutMs:e.timeoutMs??36e5,inheritStdio:!0});if(c.exitCode!==0)throw new Error(Se(c.stderr||c.stdout,{max:800}));let l=await Uc(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 qg(h)).mtimeMs})));d.sort((h,y)=>y.mtimeMs-h.mtimeMs);let u=d[0].path,f=Ae.relative(i,u),p=Ae.basename(u,".md"),g=await Ei(u,"utf8");return qt(g)||await tT(u,ze(p,t,"wolai")+g,"utf8"),{success:!0,action:"created",relativePath:f,filePath:u,title:p,sourceType:"wolai",sourceUrl:t,contentLength:(await qg(u)).size}}a(cT,"ingestSingleWolaiPage");async function Jg(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 sT(t.runner??K);let n=await Uc(t.outputDir);for(let o of n)try{let i=await Ei(o,"utf8"),s=Ee(i);if(s.source===t.url&&!t.force&&await aT(o))return{success:!0,action:"skipped",relativePath:Ae.relative(t.outputDir,o),filePath:o,title:s.title||Ae.basename(o,".md"),sourceType:"wolai",sourceUrl:t.url}}catch{}return await cT(t.url,t)}a(Jg,"ingestWolai");import{mkdir as Yg,writeFile as lT}from"fs/promises";import dT from"path";var he=class extends Error{static{a(this,"IngestError")}retryable;constructor(e,n){super(e),this.name="IngestError",this.retryable=n?.retryable??!0}};var Qg="yuque-api.antfin-inc.com",Gg=`https://${Qg}/api/v2`,uT={"yuque.com":"https://www.yuque.com/api/v2","www.yuque.com":"https://www.yuque.com/api/v2","aliyuque.antfin.com":Gg,"yuque.antfin.com":Gg};function Xg(t){try{return new URL(t).hostname===Qg}catch{return!1}}a(Xg,"isInternalApiBase");function em(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=uT[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(em,"parseYuqueUrl");function Vc(t,e){if(e?.yuqueToken)return e.yuqueToken;let n=Xg(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 he(`\u8BED\u96C0 Token \u7F3A\u5931\u3002${i}`,{retryable:!1})}a(Vc,"resolveToken");async function Kc(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:{...Xg(t)?{"X-Auth-Token":n}:{Authorization:`Bearer ${n}`},"User-Agent":"aitable-workflow","Content-Type":"application/json"},signal:d.signal})}catch(g){if(clearTimeout(u),g instanceof Error&&g.name==="AbortError")throw new Error(`\u8BED\u96C0 API \u8BF7\u6C42\u8D85\u65F6 (${i}ms): ${e}`);if(c=g instanceof Error?g:new Error(String(g)),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 g=Math.pow(2,l)*1e3;await new Promise(h=>setTimeout(h,g));continue}if(f.status===401)throw new he("\u8BED\u96C0 Token \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\u3002\u8BF7\u5728\u8BED\u96C0\u8BBE\u7F6E\u4E2D\u91CD\u65B0\u751F\u6210 Token",{retryable:!1});if(f.status===404)throw new he(`\u8BED\u96C0\u6587\u6863\u4E0D\u5B58\u5728\u6216\u65E0\u8BBF\u95EE\u6743\u9650: ${e}`,{retryable:!1});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(Kc,"yuqueFetch");async function tm(t,e,n,r){let o=Vc(t,r),i=await Kc(t,`/repos/${e}/docs/${n}`,o,r);return{title:i.title,markdown:i.body??"",updatedAt:new Date(i.updated_at).getTime()}}a(tm,"yuqueDocRead");async function fT(t,e,n){let r=Vc(t,n);return Kc(t,`/repos/${e}/docs`,r,n)}a(fT,"yuqueDocList");async function pT(t,e,n){let r=Vc(t,n);return Kc(t,`/repos/${e}/toc`,r,n)}a(pT,"yuqueTocTree");function gT(t,e){let n=new Map,r=[];for(let o of t){if(r.length=o.depth,o.type==="TITLE"){r.push(Pi(o.title));continue}o.type==="LINK"||!o.slug||o.type==="DOC"&&e.has(o.slug)&&(r.push(Pi(o.title)),n.set(o.slug,r.join("/")),r.pop())}return n}a(gT,"buildRelativePaths");function Pi(t){return Re(t,{fallback:"untitled"})}a(Pi,"sanitizeDirName");async function mT(t,e){let n=em(t),{namespace:r,slug:o,host:i,apiBase:s}=n;if(o){let p=await tm(s,r,o,e);return{scope:"document",skippedUnsupported:0,nodes:[{id:o,title:p.title,relativePath:Pi(p.title),sourceUrl:`https://${i}/${r}/${o}`,updateTime:p.updatedAt,cachedMarkdown:p.markdown}]}}let[c,l]=await Promise.all([pT(s,r,e).catch(()=>[]),fT(s,r,e)]),d=new Set(l.map(p=>p.slug)),u=gT(c,d);return{scope:"space",skippedUnsupported:0,nodes:l.map(p=>({id:p.slug,title:p.title,relativePath:u.get(p.slug)??Pi(p.title),sourceUrl:`https://${i}/${r}/${p.slug}`,updateTime:new Date(p.updated_at).getTime()}))}}a(mT,"crawlYuque");async function Zg(t,e,n,r){try{let o=e.outputFileName??(e.preserveStructure!==!1?t.relativePath:$i(t.title)),{filePath:i,relPath:s}=jr(e.outputDir,o);if(!e.force&&await qc(i,t.updateTime))return{success:!0,action:"skipped",relativePath:s,filePath:i,title:t.title,sourceType:"yuque",sourceUrl:t.sourceUrl};let c=await Or(i);await Yg(dT.dirname(i),{recursive:!0});let l,d;if(t.cachedMarkdown!==void 0)l=t.title,d=t.cachedMarkdown;else{let f=await tm(n,r,t.id,{yuqueToken:e.yuqueToken,fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs});l=f.title,d=f.markdown}let u=d;return qt(u)||(u=ze(l,t.sourceUrl,"yuque")+u),await lT(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),retryable:o instanceof he?o.retryable:!0}}}a(Zg,"ingestSingleYuqueDoc");async function nm(t){await Yg(t.outputDir,{recursive:!0});let e=em(t.url),{namespace:n,apiBase:r}=e,o;try{o=await mT(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),retryable:c instanceof he?c.retryable:!0}}if(o.scope==="document")return o.nodes.length===0?{success:!1,sourceType:"yuque",sourceUrl:t.url,error:"\u672A\u627E\u5230\u6587\u6863",retryable:!1}:Zg(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 Zg(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(nm,"ingestYuque");import{mkdir as hT,writeFile as yT,rename as wT}from"fs/promises";import{existsSync as bT}from"fs";import Mi from"path";import{createHash as kT,randomBytes as vT}from"crypto";var rm=String.raw`!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)`;async function Oi(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??2e4,i=n.imageDirName??"image",s=Mi.join(Mi.dirname(e),i),c=new Set;for(let p of t.matchAll(new RegExp(rm,"g"))){let g=om(p[2]??"");/^https?:\/\//i.test(g)&&c.add(g)}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 g=ST(p),h=Mi.join(s,g),y=`${i}/${g}`;if(bT(h)){l.set(p,y),d++;continue}await RT(p,h,s,r,o)?(l.set(p,y),d++):(l.set(p,null),u++)}return{markdown:t.replace(new RegExp(rm,"g"),(p,g,h)=>{let y=om(h),w=l.get(y);return w?``:p}),imageCount:d,failedCount:u}}a(Oi,"localizeMarkdownImages");function om(t){let e=t.trim();return e.startsWith("<")&&e.endsWith(">")?e.slice(1,-1):e}a(om,"unwrapUrl");function ST(t){let e=t,n="img",r=xT(t);try{let i=new URL(t);e=i.origin+i.pathname;let c=Mi.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=kT("sha1").update(e).digest("hex").slice(0,8);return`${n}-${o}.${r}`}a(ST,"imageFilename");function xT(t){let n=(t.split(/[?#]/)[0]??t).match(/\.(png|jpe?g|gif|webp|bmp|svg)$/i);return n?n[1].toLowerCase():"png"}a(xT,"extFromUrl");async function RT(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 m.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 m.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u4E3A\u7A7A",{url:t}),!1;await hT(n,{recursive:!0});let d=`${e}.${vT(4).toString("hex")}.tmp`;return await yT(d,l),await wT(d,e),m.debug("image-localizer","\u56FE\u7247\u5DF2\u672C\u5730\u5316",{dest:e}),!0}catch(c){return m.warn("image-localizer","\u56FE\u7247\u4E0B\u8F7D\u5F02\u5E38",{url:t,error:c instanceof Error?c.message:String(c)}),!1}finally{clearTimeout(s)}}a(RT,"downloadImage");import{lstat as im,readdir as CT}from"fs/promises";import Nn from"path";function IT(t){return t.split(Nn.sep).join("/")}a(IT,"normalizeRelativePath");async function sm(t){if(!Nn.isAbsolute(t.root))throw new Error(`\u6765\u6E90\u6839\u76EE\u5F55\u5FC5\u987B\u662F\u7EDD\u5BF9\u8DEF\u5F84: ${t.root}`);if(t.maxDocuments!==void 0&&(!Number.isInteger(t.maxDocuments)||t.maxDocuments<1))throw new Error(`maxDocuments \u5FC5\u987B\u662F\u6B63\u6574\u6570: ${t.maxDocuments}`);let e=Nn.resolve(t.root),n;try{n=await im(e)}catch(s){let c=s instanceof Error?s.message:String(s);throw new Error(`\u65E0\u6CD5\u8BBF\u95EE\u6765\u6E90\u6839\u76EE\u5F55 ${e}: ${c}`)}if(n.isSymbolicLink())throw new Error(`\u6765\u6E90\u6839\u76EE\u5F55\u4E0D\u80FD\u662F\u7B26\u53F7\u94FE\u63A5: ${e}`);if(!n.isDirectory())throw new Error(`\u6765\u6E90\u6839\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55: ${e}`);let r=[],o=[];async function i(s){let c;try{c=await CT(s,{withFileTypes:!0})}catch(l){let d=l instanceof Error?l.message:String(l);throw new Error(`\u65E0\u6CD5\u8BFB\u53D6\u6765\u6E90\u76EE\u5F55 ${s}: ${d}`)}for(let l of c){let d=Nn.join(s,l.name),u=IT(Nn.relative(e,d)),f=await im(d);if(f.isSymbolicLink()){o.push({path:u,reason:"symlink"});continue}if(f.isDirectory()){if(l.name.startsWith(".")||t.ignoredDirectoryNames.has(l.name)){o.push({path:u,reason:"ignored"});continue}await i(d);continue}if(!f.isFile()){o.push({path:u,reason:"unsupported"});continue}let p=Nn.extname(l.name).toLowerCase();if(!t.supportedExtensions.has(p)){o.push({path:u,reason:"unsupported"});continue}if(r.push({documentKey:u,absolutePath:d,relativePath:u,extension:p,byteLength:f.size}),t.maxDocuments!==void 0&&r.length>t.maxDocuments)throw new Error(`\u6765\u6E90\u6587\u6863\u6570\u8D85\u8FC7\u4E0A\u9650 ${t.maxDocuments}\uFF0C\u8BF7\u62C6\u5206\u6765\u6E90`)}}return a(i,"scan"),await i(e),r.sort((s,c)=>s.documentKey.localeCompare(c.documentKey)),o.sort((s,c)=>s.path.localeCompare(c.path)),{documents:r,skipped:o}}a(sm,"discoverLocalSources");var ET=new Set(["docx","pdf","xlsx"]);function Hc(t){let e;try{e=new URL(t).hostname.toLowerCase()}catch{throw new he(`\u65E0\u6548\u7684 URL: ${t}`,{retryable:!1})}if(e.includes("alidocs.dingtalk.com"))return"dingtalk-doc";if(e.includes("shanji.dingtalk.com"))return"dingtalk-minutes";if(e.includes("yuque.com")||e.includes("yuque.antfin.com")||e.includes("aliyuque.antfin.com"))throw new he(`\u8BED\u96C0\u94FE\u63A5\u6682\u4E0D\u652F\u6301\u76F4\u63A5\u5BFC\u5165: ${t}\u3002\u8BF7\u5728\u8BED\u96C0\u4E2D\u5C06\u6587\u6863\u5BFC\u51FA\u4E3A Markdown\uFF0C\u518D\u4EE5\u6587\u4EF6\u9644\u4EF6\u65B9\u5F0F\u4E0A\u4F20\u3002`,{retryable:!1});return e.includes("wolai.dingtalk.com")?"wolai":"web"}a(Hc,"detectSourceType");function DT(t,e){if(e==="dingtalk-doc"){let{type:n}=Mc(t);return n==="space"?"space":"document"}return e==="yuque"?new URL(t).pathname.replace(/\/edit\/?$/,"").replace(/\/$/,"").split("/").filter(Boolean).length>=3?"document":"space":"document"}a(DT,"detectScope");function $i(t){let e=t.trim().replace(/\s+/g,"-").replace(/[<>:"/\\|?*\x00-\x1f]/g,"").replace(/[^\p{L}\p{N}._-]/gu,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"untitled";return Re(e,{fallback:"untitled",maxLength:80})}a($i,"slugify");function ze(t,e,n){let r=X();return["---",`title: "${Fc(t)}"`,`source: "${Fc(e)}"`,`source_type: ${n}`,`ingested: "${r}"`,"---",""].join(`
|
|
390
|
+
`)}a(ze,"buildFrontmatter");function qt(t){return t.startsWith("---")}a(qt,"hasFrontmatter");function Ee(t){let e={};if(!t.startsWith("---"))return e;let n=t.indexOf(`
|
|
389
391
|
---`,3);if(n===-1)return e;for(let r of t.slice(3,n).trim().split(`
|
|
390
|
-
`)){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(Ee,"parseFrontmatter");async function
|
|
392
|
+
`)){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(Ee,"parseFrontmatter");async function qc(t,e){if(e===void 0)return!1;try{let n=await Fi(t,"utf8"),r=Ee(n);if(!r.ingested)return!1;let o=new Date(r.ingested).getTime();return e<=o}catch{return!1}}a(qc,"shouldSkip");async function Or(t){try{return await _T(t),!0}catch{return!1}}a(Or,"fileExists");function jr(t,e){let n=e.replace(/\.[^.]+$/,""),r=ar(`${n}.md`);return{filePath:xe(t,r,{allowRoot:!1}),relPath:r}}a(jr,"resolveMdPath");async function am(t,e){let n=t.extension&&t.extension!=="adoc";try{let r=e.outputFileName??(e.preserveStructure!==!1?t.relativePath:$i(t.title)),{filePath:o,relPath:i}=jr(e.outputDir,r);if(!e.force&&await qc(o,t.updateTime))return{success:!0,action:"skipped",relativePath:i,filePath:o,title:t.title,sourceType:"dingtalk-doc",sourceUrl:t.sourceUrl};let s=await Or(o);if(await Ln(je.dirname(o),{recursive:!0}),n){let u=je.join(e.outputDir,".ingest-tmp");await Ln(u,{recursive:!0});let f=je.join(u,Re(`${t.id}.${t.extension}`,{maxLength:120}));await Ng(t.id,f,{runner:e.runner,dwsBinPath:e.dwsBinPath,timeoutMs:e.timeoutMs});let p=t.extension.toLowerCase(),g;p==="pdf"&&e.rawCopyDir&&(await Ln(e.rawCopyDir,{recursive:!0}),g=je.join(e.rawCopyDir,Re(`${t.title}.pdf`,{maxLength:120})),await AT(f,g));let h;ET.has(p)?(p==="docx"?h=await Nc(f):p==="xlsx"?h=await Wc(f):h=await Lc(f),h=ze(t.title,t.sourceUrl,"dingtalk-doc")+h):(h=await Fi(f,"utf8"),qt(h)||(h=ze(t.title,t.sourceUrl,"dingtalk-doc")+h));let{unlink:y}=await import("fs/promises");return await y(f).catch(()=>{}),h=(await Oi(h,o,{fetchImpl:e.fetchImpl})).markdown,await ji(o,h,"utf8"),{success:!0,action:s?"updated":"created",relativePath:i,filePath:o,title:t.title,sourceType:"dingtalk-doc",sourceUrl:t.sourceUrl,contentLength:h.length,...g?{rawPath:g}:{}}}let c=await Fg(t.sourceUrl,{runner:e.runner,dwsBinPath:e.dwsBinPath,timeoutMs:e.timeoutMs}),l=c.title||t.title,d=c.markdown;return qt(d)||(d=ze(l,t.sourceUrl,"dingtalk-doc")+d),d=(await Oi(d,o,{fetchImpl:e.fetchImpl})).markdown,await ji(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),retryable:r instanceof he?r.retryable:!0}}}a(am,"ingestSingleDingtalkDoc");async function PT(t){try{let e=await Ug(t.url,{runner:t.runner,dwsBinPath:t.dwsBinPath,timeoutMs:t.timeoutMs,contentMode:t.minutesContentMode}),n=t.outputFileName??$i(e.title),{filePath:r,relPath:o}=jr(t.outputDir,n),i=await Or(r);await Ln(je.dirname(r),{recursive:!0});let s=e.markdown;return qt(s)||(s=ze(e.title,t.url,"dingtalk-minutes")+s),s=(await Oi(s,r,{fetchImpl:t.fetchImpl})).markdown,await ji(r,s,"utf8"),{success:!0,action:i?"updated":"created",relativePath:o,filePath:r,title:e.title,sourceType:"dingtalk-minutes",sourceUrl:t.url,contentLength:s.length}}catch(e){return{success:!1,sourceType:"dingtalk-minutes",sourceUrl:t.url,title:t.url,error:e instanceof Error?e.message:String(e),retryable:e instanceof he?e.retryable:!0}}}a(PT,"ingestSingleDingtalkMinutes");async function cm(t,e,n){try{let r=je.extname(t).toLowerCase(),{filePath:o,relPath:i}=jr(n,e),s=await Or(o);await Ln(je.dirname(o),{recursive:!0});let c=je.basename(t,r),l;if(r===".docx")l=await Nc(t),l=ze(c,t,"local")+l;else if(r===".pdf")l=await Lc(t),l=ze(c,t,"local")+l;else if(r===".xlsx")l=await Wc(t),l=ze(c,t,"local")+l;else if(r===".html"||r===".htm"){if(l=await jc(await Fi(t,"utf8")),!l.trim())return{success:!1,sourceType:"local",sourceUrl:t,title:c,error:`HTML \u6587\u4EF6\u65E0\u53EF\u63D0\u53D6\u6B63\u6587\uFF08\u811A\u672C/\u6837\u5F0F\u58F3\u4E4B\u5916\u6CA1\u6709\u5185\u5BB9\uFF09: ${je.basename(t)}`,retryable:!1};l=ze(c,t,"local")+l}else l=await Fi(t,"utf8"),qt(l)||(l=ze(c,t,"local")+l);return await ji(o,l,"utf8"),{success:!0,action:s?"updated":"created",relativePath:i,filePath:o,title:c,sourceType:"local",sourceUrl:t,contentLength:l.length,...r===".pdf"?{rawPath:t}:{}}}catch(r){return{success:!1,sourceType:"local",sourceUrl:t,title:je.basename(t),error:r instanceof Error?r.message:String(r),retryable:r instanceof he?r.retryable:!0}}}a(cm,"ingestLocalFile");function $T(t){try{return new URL(t),!1}catch{return!0}}a($T,"isLocalPath");var lm=new Set([".md",".txt",".text",".rst",".csv",".json",".yaml",".yml",".xml",".html",".htm",".docx",".pdf",".xlsx"]),MT=new Set([".git",".kb",".kb-ingest","node_modules"]);async function Wn(t){if(await Ln(t.outputDir,{recursive:!0}),$T(t.url)){let i=je.resolve(t.url),s;try{s=await TT(i)}catch(d){let u=d instanceof Error?d.message:String(d);throw new he(`\u65E0\u6CD5\u8BBF\u95EE\u672C\u5730\u6765\u6E90 ${i}: ${u}`,{retryable:!1})}if(s.isFile()){let d=je.extname(i).toLowerCase();if(!lm.has(d))return{success:!1,sourceType:"local",sourceUrl:i,title:je.basename(i),error:`\u4E0D\u652F\u6301\u7684\u672C\u5730\u6587\u4EF6\u6269\u5C55\u540D ${d||"\uFF08\u65E0\u6269\u5C55\u540D\uFF09"}: ${i}`,retryable:!1};let u=t.outputFileName??je.basename(i);return cm(i,u,t.outputDir)}if(!s.isDirectory())throw new he(`\u672C\u5730\u6765\u6E90\u65E2\u4E0D\u662F\u6587\u4EF6\u4E5F\u4E0D\u662F\u76EE\u5F55: ${i}`,{retryable:!1});let c=await sm({root:i,supportedExtensions:lm,ignoredDirectoryNames:MT,maxDocuments:t.maxDocuments}),l=[];for(let d=0;d<c.documents.length;d++){let u=c.documents[d];t.onProgress?.(d,c.documents.length,u.documentKey);let f=await cm(u.absolutePath,u.relativePath,t.outputDir);l.push(f)}return t.onProgress?.(c.documents.length,c.documents.length,"\u5B8C\u6210"),{sourceUrl:i,scope:"space",totalDocs:c.documents.length,successCount:l.filter(d=>d.success).length,failureCount:l.filter(d=>!d.success).length,skippedCount:0,skippedUnsupported:c.skipped.length,results:l}}let e=t.type??Hc(t.url);if(e==="wolai")return Jg(t);if(e==="yuque")return nm(t);if(e==="dingtalk-minutes")return PT(t);if(e!=="dingtalk-doc")throw new he(`\u6682\u4E0D\u652F\u6301 ${e} \u7C7B\u578B\u7684\u5BFC\u5165\uFF0C\u5F53\u524D\u94FE\u63A5\u4EC5\u652F\u6301 dingtalk-doc\u3001dingtalk-minutes \u548C wolai\uFF1B\u5176\u4ED6\u5185\u5BB9\u8BF7\u5BFC\u51FA\u4E3A Markdown \u540E\u4EE5\u6587\u4EF6\u9644\u4EF6\u4E0A\u4F20\u3002`,{retryable:!1});let n=await Kg(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",retryable:!1}:am(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 am(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(Wn,"ingest");import Ue from"fs";import Q from"path";function Zc(t){try{return Ue.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&!e.name.startsWith("_")&&!e.name.startsWith(".")).map(e=>e.name)}catch{return[]}}a(Zc,"listCategoryDirs");function wn(t){let e=[];if(!Ue.existsSync(t))return e;for(let n of Ue.readdirSync(t,{withFileTypes:!0})){let r=Q.join(t,n.name);if(n.isDirectory()){if(n.name.startsWith("."))continue;e.push(...wn(r))}else n.name.endsWith(".md")&&e.push(r)}return e}a(wn,"walkMarkdown");function Fr(t){let e=t.match(/^---\n([\s\S]*?)\n---/);return e?e[1]:null}a(Fr,"frontmatterBlock");function Nr(t,e){let n=t.match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return n?n[1].trim().replace(/^["']|["']$/g,""):null}a(Nr,"fmField");function OT(t){let e=t.match(/^sources:\s*\[([^\]]*)\]/m);return e?e[1].split(",").map(n=>n.trim().replace(/^["']|["']$/g,"")).filter(Boolean):[]}a(OT,"parseSourcesList");function jT(t,e){let n=Fr(t);return n?Nr(n,"title")??e:e}a(jT,"fmTitle");function Yc(t){let e=Fr(t);return e?Nr(e,"curated")==="true"||Nr(e,"curated")==="yes":!1}a(Yc,"isCuratedArticle");function um(t){return t.replace(/[\[\]()]/g,"\\$&")}a(um,"escapeMdLinkText");function FT(t,e){let n=new Map;for(let s of wn(e)){let c=Q.relative(e,s),l=Ue.readFileSync(s,"utf8"),d=Fr(l)??"",u=Nr(d,"source");if(!u){let f=l.match(/https?:\/\/(?:wolai|[\w.]*dingtalk)[^\s)"']+/);f&&(u=f[0])}n.set(c,{title:Nr(d,"title")??Q.basename(c,".md"),url:u})}let r=0,o=0,i=0;for(let s of Zc(t))for(let c of wn(Q.join(t,s))){if(Q.basename(c).startsWith("_"))continue;let l=Ue.readFileSync(c,"utf8");if(Yc(l))continue;let d=Fr(l);if(!d)continue;let u=OT(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 v=um(b.title);p.push(`- [${v}](${b.url})`),o++}else i++,p.push(`- ${b?.title??w}`)}if(!p.length)continue;let g=`## Sources
|
|
391
393
|
|
|
392
394
|
${p.join(`
|
|
393
395
|
`)}
|
|
394
396
|
`,h=l.indexOf("## Sources"),y;if(h!==-1){let b=l.slice(h+10).match(/\n## /);y=b?.index!==void 0?l.slice(0,h)+g+`
|
|
395
397
|
`+l.slice(h+10+b.index+1):l.slice(0,h)+g}else y=l.trimEnd()+`
|
|
396
398
|
|
|
397
|
-
`+g;Ue.writeFileSync(c,y,"utf8"),r++}return{enrichedArticles:r,linksWritten:o,sourcesWithoutUrl:i}}a(
|
|
399
|
+
`+g;Ue.writeFileSync(c,y,"utf8"),r++}return{enrichedArticles:r,linksWritten:o,sourcesWithoutUrl:i}}a(FT,"enrichWikiSources");function NT(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;)if(o[1]){n.add(o[1]);try{let i=decodeURI(o[1]);i!==o[1]&&n.add(i)}catch{}}return[...n]}a(NT,"extractSeeAlsoSlugs");function LT(t){let e=new Map;for(let o of Zc(t)){let i=Q.join(t,o);for(let s of wn(i)){if(Q.basename(s).startsWith("_"))continue;let c=Q.basename(s,".md");e.set(c,{category:o,title:jT(Ue.readFileSync(s,"utf8"),c),abs:s})}}let n=new Map;for(let[o,i]of e)n.set(o,new Set(NT(Ue.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=Ue.readFileSync(l.abs,"utf8");if(Yc(u))continue;let f=um(s.title),p=`- [[${o}|${f}]] ([${f}](../${s.category}/${o}.md))`,g,h=u.indexOf("## See Also");if(h!==-1){let w=u.slice(h).match(/\n## (?!See Also)/);g=w?.index!==void 0?`${u.slice(0,h+w.index)}${p}
|
|
398
400
|
${u.slice(h+w.index)}`:`${u.trimEnd()}
|
|
399
401
|
${p}
|
|
400
402
|
`}else{let y=u.indexOf("## Sources");g=y!==-1?`${u.slice(0,y)}## See Also
|
|
@@ -406,88 +408,88 @@ ${u.slice(y)}`:`${u.trimEnd()}
|
|
|
406
408
|
## See Also
|
|
407
409
|
|
|
408
410
|
${p}
|
|
409
|
-
`}Ue.writeFileSync(l.abs,g,"utf8"),d?d.add(o):n.set(c,new Set([o])),r++}}return r}a(
|
|
410
|
-
---`,3),w=y!==-1?y+4:0,b=p.slice(0,w),v=p.slice(w),R=/(!?)\[((?:[^\]\\]|\\.)*)\]\((<[^>]*>|[^)]+)\)/g,S=v.replace(R,(C,A,
|
|
411
|
+
`}Ue.writeFileSync(l.abs,g,"utf8"),d?d.add(o):n.set(c,new Set([o])),r++}}return r}a(LT,"maintainBidirectionalLinks");function dm(t){let e=[];for(let n of Zc(t))if(n!=="tags")for(let r of wn(Q.join(t,n)))Q.basename(r).startsWith("_")||e.push(r);return e}a(dm,"listWikiArticleAbs");function Jc(t){let e=new Map;for(let r of t){let o=Q.basename(r);e.set(o,(e.get(o)??0)+1)}let n=new Map;for(let r of t){let o=Q.basename(r);e.get(o)===1&&n.set(o,r)}return n}a(Jc,"uniqueByBasename");function Ni(t,e){try{return Ue.existsSync(decodeURI(Q.resolve(e,t)))}catch{return!1}}a(Ni,"resolvableFrom");function Gc(t,e){let n=t.get(e);if(n)return n;try{let r=decodeURI(e);return r!==e?t.get(r):void 0}catch{return}}a(Gc,"lookupDecoded");function WT(t,e){let n=Jc(wn(e)),r=dm(t),o=Jc([...wn(e),...r.filter(l=>!n.has(Q.basename(l)))]),i=Jc(r),s=0,c=0;for(let l of dm(t)){let d=Ue.readFileSync(l,"utf8");if(Yc(d)||!Fr(d))continue;let f=Q.dirname(l),p=d,g=!1,h=p.match(/^sources:\s*\[([^\]]*)\]/m);if(h){let _=h[1].split(",").map(A=>A.trim()).filter(Boolean).map(A=>{let T=A.replace(/^["']|["']$/g,"");if(/^(https?|dingtalk):/.test(T)||Ni(T,e)||Ni(T,f)||Ni(T,t))return A;let x=[...o.values()].filter(j=>{let L=Q.relative(e,j).split(Q.sep).join("/"),W=Q.relative(t,j).split(Q.sep).join("/");return L.includes("/")&&T.endsWith(`/${L}`)||W.includes("/")&&T.endsWith(`/${W}`)}),D=x.length===1?x[0]:Gc(o,Q.basename(T));return D?(s++,g=!0,Q.relative(f,D).split(Q.sep).join("/")):A});p=p.replace(h[0],`sources: [${_.join(", ")}]`)}let y=p.indexOf(`
|
|
412
|
+
---`,3),w=y!==-1?y+4:0,b=p.slice(0,w),v=p.slice(w),R=/(!?)\[((?:[^\]\\]|\\.)*)\]\((<[^>]*>|[^)]+)\)/g,S=v.replace(R,(C,_,A,T)=>{if(_)return C;let I=T;if(I.startsWith("<")&&I.endsWith(">")&&(I=I.slice(1,-1)),/^(https?|dingtalk):/.test(I)||I.startsWith("#"))return C;if(/\s/.test(I)&&!T.startsWith("<")){let V=Gc(i,Q.basename(I));if(!V)return C;c++,g=!0;let ue=Q.relative(f,V).split(Q.sep).join("/");return`[${A}](<${ue}>)`}if(Ni(I.split("#")[0],f))return C;let x=I.indexOf("#"),D=x!==-1?I.slice(0,x):I,j=x!==-1?I.slice(x):"",L=Gc(i,Q.basename(D));if(!L)return C;c++,g=!0;let W=Q.relative(f,L).split(Q.sep).join("/");return W.includes(" ")?W=`<${W}${j}>`:W=`${W}${j}`,`[${A}](${W})`});p=b+S,g&&Ue.writeFileSync(l,p,"utf8")}return{sourcesFixed:s,linksFixed:c}}a(WT,"normalizeWikiProvenance");function fm(t){let e=FT(t.wikiDir,t.sourceDir),n=WT(t.wikiDir,t.sourceDir),r=LT(t.wikiDir);return{sources:e,normalized:n,backlinksAdded:r}}a(fm,"postProcessWiki");import Bn from"fs";import Fe from"path";function pm(t){try{let e=Ee(Bn.readFileSync(t,"utf8"));return e.curated==="true"||e.curated==="yes"}catch{return!1}}a(pm,"isCuratedSource");function BT(t){if(t.startsWith("---")){let e=t.indexOf(`
|
|
411
413
|
---`,3);if(e!==-1){let n=t.slice(4,e),r=e+4;return t[r]===`
|
|
412
414
|
`&&(r+=1),{fmLines:n.split(`
|
|
413
|
-
`),body:t.slice(r)}}}return{fmLines:[],body:t}}a(
|
|
414
|
-
${v.filter(
|
|
415
|
+
`),body:t.slice(r)}}}return{fmLines:[],body:t}}a(BT,"splitFrontmatter");function zT(t,e,n){return t.replace(/(\]\()([^)\s]+)(\))/g,(r,o,i,s)=>{if(/^(https?|mailto|dingtalk|file):/.test(i)||i.startsWith("#"))return r;let[c,l=""]=(()=>{let f=i.indexOf("#");return f===-1?[i,""]:[i.slice(0,f),i.slice(f)]})(),d;try{d=Fe.resolve(e,decodeURI(c))}catch{return r}if(!Bn.existsSync(d))return r;let u=Fe.relative(n,d).split(Fe.sep).join("/");return`${o}${u}${l}${s}`})}a(zT,"rewriteRelativeLinks");function UT(t,e,n){let r=[],o=/\]\(([^)\s]+)\)/g,i;for(;(i=o.exec(t))!==null;){let s=i[1];if(/^(https?|mailto|dingtalk|file):/.test(s)||s.startsWith("#"))continue;let c=s.split("#",1)[0];if(!c)continue;let l;try{l=Fe.resolve(e,decodeURI(c))}catch{continue}if(!Bn.existsSync(l))continue;let d=Fe.relative(n,l).split(Fe.sep).join("/");d.startsWith("..")||r.includes(d)||r.push(d)}return r}a(UT,"extractProvenanceTargets");function gm(t){let{sourceAbsPath:e,sourceRelPath:n,wikiDirPath:r,taxonomy:o,today:i,categorySuggestion:s}=t,c=Bn.readFileSync(e,"utf8"),{fmLines:l,body:d}=BT(c),u=Ee(c),f=Fe.basename(e).replace(/\.[^.]+$/,".md"),p=t.sourceRootDir??Fe.dirname(e),g=!1,h,y=u.category?In(o,u.category):null,w=!!u.category&&y===null,b=s?In(o,s):null;y?h=y:b?h=b:(h=o.fallbackCategoryId,g=!0);let v=l.filter(_=>!/^category:\s*/.test(_));v.push(`category: ${h}`),u.title||v.push(`title: ${Fe.basename(f,".md")}`);let R=UT(d,Fe.dirname(e),p).filter(_=>_!==n);!u.sources&&R.length>0&&v.push(`sources: [${R.join(", ")}]`),u.updated||v.push(`updated: ${i}`);let S=Fe.join(r,h,f);Bn.mkdirSync(Fe.dirname(S),{recursive:!0});let C=zT(d,Fe.dirname(e),Fe.dirname(S));return Bn.writeFileSync(S,`---
|
|
416
|
+
${v.filter(_=>_.trim()!=="").join(`
|
|
415
417
|
`)}
|
|
416
418
|
---
|
|
417
|
-
${C}`,"utf8"),{category:h,outAbsPath:S,usedFallbackCategory:g,sourceCategoryInvalid:w}}a(
|
|
418
|
-
`)}a(
|
|
419
|
+
${C}`,"utf8"),{category:h,outAbsPath:S,usedFallbackCategory:g,sourceCategoryInvalid:w}}a(gm,"compileCuratedFile");function mm(t,e){return["\u4F60\u662F\u77E5\u8BC6\u5E93\u5206\u7C7B\u52A9\u624B\u3002\u4EE5\u4E0B curated \u6587\u6863\u7F3A\u5C11\u5206\u7C7B\uFF0C\u8BF7\u7528 Read \u5DE5\u5177\u9010\u4E2A\u8BFB\u53D6\uFF0C\u6309\u5206\u7C7B\u5224\u5B9A\u6807\u51C6\u7ED9\u51FA\u5206\u7C7B\u5EFA\u8BAE\u3002","","\u3010\u5206\u7C7B\u95ED\u96C6\uFF08\u53EA\u80FD\u4ECE\u4E2D\u9009\u62E9\uFF09\u3011",...e.categories.map(r=>`- ${r.id}${r.criteria?`\uFF1A${r.criteria}`:""}`),"","\u3010\u5F85\u5206\u7C7B\u6587\u4EF6\u3011",...t.map((r,o)=>`${o+1}. ${r}`),"","\u3010\u8F93\u51FA\u8981\u6C42\u3011","\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u5BF9\u8C61\uFF0C\u4E0D\u8981\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57\u3002\u952E\u4E3A\u6587\u4EF6\u540D\uFF08\u542B\u6269\u5C55\u540D\uFF09\uFF0C\u503C\u4E3A\u5206\u7C7B id\uFF1A",'{"\u6587\u4EF6\u540D.md": "\u5206\u7C7Bid"}',"\u4E0D\u8981\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\u3002"].join(`
|
|
420
|
+
`)}a(mm,"buildCuratedClassifyPrompt");function hm(t){let e=t.match(/\{[\s\S]*\}/);if(!e)return{};try{let n=JSON.parse(e[0]);if(n==null||typeof n!="object"||Array.isArray(n))return{};let r={};for(let[o,i]of Object.entries(n))typeof i=="string"&&(r[o]=i);return r}catch{return{}}}a(hm,"parseCuratedClassification");import Ve from"fs";import we from"path";var VT=/(?:^|[\s("'`((])(?:\/Users\/|\/home\/|[A-Za-z]:\\|file:\/\/)/;function KT(t,e){let n=[];if(!Ve.existsSync(t))return n;for(let r of Ve.readdirSync(t,{withFileTypes:!0})){if(!r.isDirectory()||r.name.startsWith("_")||r.name.startsWith(".")||e.has(r.name))continue;let o=we.join(t,r.name);for(let i of Ve.readdirSync(o))i.endsWith(".md")&&!i.startsWith("_")&&n.push(we.join(o,i))}return n}a(KT,"walkArticles");function ym(t){let e=[],n=/(?<!!)\[[^\]]*\]\((<[^>]*>|[^)\s]+)\)/g,r;for(;(r=n.exec(t))!==null;){let o=r[1];o.startsWith("<")&&o.endsWith(">")&&(o=o.slice(1,-1)),!/^(https?|mailto|dingtalk):/.test(o)&&(o.startsWith("#")||e.push(o.split("#",1)[0]))}return e}a(ym,"extractLocalLinkTargets");function qT(t){let e=[],n=t.startsWith("---")?t.indexOf(`
|
|
419
421
|
---`,3):-1,r=n===-1?"":t.slice(0,n),o=r.match(/^(?:sources|original_sources):\s*\[(.*)\]\s*$/m);if(o?.[1])for(let s of o[1].split(",")){let c=s.trim().replace(/^["']|["']$/g,"");c&&e.push(c)}let i=r.match(/^(?:sources|original_sources):\s*\n((?:\s*-\s*.+\n?)+)/m);if(i?.[1])for(let s of i[1].split(`
|
|
420
|
-
`)){let c=s.replace(/^\s*-\s*/,"").trim().replace(/^["']|["']$/g,"");c&&e.push(c)}return e}a(
|
|
421
|
-
`);for(let g of l){let h=we.relative(e,g),y=we.basename(h);!d.has(h)&&!f.includes(y)&&i.push({rule:"orphan-page",file:h,detail:"\u4E0D\u88AB\u4EFB\u4F55\u6587\u7AE0\u6216\u7D22\u5F15\u5F15\u7528"})}let p={"broken-link":0,"absolute-path":0,"invalid-category":0,"missing-sources":0,"orphan-page":0};for(let g of i)p[g.rule]++;return{issues:i,counts:p,checkedArticles:l.length}}a(
|
|
422
|
+
`)){let c=s.replace(/^\s*-\s*/,"").trim().replace(/^["']|["']$/g,"");c&&e.push(c)}return e}a(qT,"parseSourceEntries");function HT(t){let e=[];if(!Ve.existsSync(t))return e;let n=we.join(t,"_index.md");Ve.existsSync(n)&&e.push(n);for(let r of Ve.readdirSync(t,{withFileTypes:!0})){if(!r.isDirectory()||r.name.startsWith("."))continue;let o=we.join(t,r.name,"_index.md");Ve.existsSync(o)&&e.push(o)}return e}a(HT,"walkIndexFiles");function wm(t){let{wikiDirPath:e,taxonomy:n,categoryInputIssues:r,sourceDirPath:o}=t,i=[],s=new Set(Qe(n)),c=s.has(Ye)?new Set:new Set([Ye]),l=KT(e,c),d=new Set;for(let g of l){let h=we.relative(e,g),y=h.split(we.sep,1)[0],w=Ve.readFileSync(g,"utf8");s.has(y)?r?.has(h)&&i.push({rule:"invalid-category",file:h,detail:r.get(h)}):i.push({rule:"invalid-category",file:h,detail:`\u76EE\u5F55 ${y} \u4E0D\u5728 taxonomy \u95ED\u96C6\u5185`}),VT.test(w)&&i.push({rule:"absolute-path",file:h,detail:"\u6B63\u6587\u542B\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84"});let b=qT(w);b.length===0?i.push({rule:"missing-sources",file:h,detail:"frontmatter \u7F3A sources/original_sources \u6EAF\u6E90"}):b.some(R=>/^(https?|dingtalk):/.test(R)?!0:[...o?[we.resolve(o,R)]:[],we.resolve(we.dirname(g),R),we.resolve(e,R)].some(C=>{try{return Ve.existsSync(decodeURI(C))}catch{return!1}}))||i.push({rule:"missing-sources",file:h,detail:`sources \u6761\u76EE\u5168\u90E8\u65E0\u6CD5\u89E3\u6790: ${b.join(", ")}`});for(let v of ym(w)){let R=we.resolve(we.dirname(g),decodeURI(v));Ve.existsSync(R)?R.startsWith(e)&&d.add(we.relative(e,R)):i.push({rule:"broken-link",file:h,detail:`\u5931\u6548\u94FE\u63A5: ${v}`})}}let u=HT(e);for(let g of u){let h=we.relative(e,g),y=Ve.readFileSync(g,"utf8");for(let w of ym(y)){let b=we.resolve(we.dirname(g),decodeURI(w));Ve.existsSync(b)||i.push({rule:"broken-link",file:h,detail:`\u7D22\u5F15\u5931\u6548\u94FE\u63A5: ${w}`})}}let f=u.map(g=>Ve.readFileSync(g,"utf8")).join(`
|
|
423
|
+
`);for(let g of l){let h=we.relative(e,g),y=we.basename(h);!d.has(h)&&!f.includes(y)&&i.push({rule:"orphan-page",file:h,detail:"\u4E0D\u88AB\u4EFB\u4F55\u6587\u7AE0\u6216\u7D22\u5F15\u5F15\u7528"})}let p={"broken-link":0,"absolute-path":0,"invalid-category":0,"missing-sources":0,"orphan-page":0};for(let g of i)p[g.rule]++;return{issues:i,counts:p,checkedArticles:l.length}}a(wm,"lintWiki");var GT=new Set([".md",".txt",".text",".rst",".csv",".json",".yaml",".yml",".html",".htm",".xml"]),ZT=new Set(["node_modules",".git",".kb",".DS_Store","thumbs.db"]);function Im(t,e){if(!U.existsSync(t))return[];let n=[];for(let r of U.readdirSync(t,{withFileTypes:!0})){if(ZT.has(r.name))continue;let o=q.join(t,r.name);if(r.isDirectory())n.push(...Im(o,e));else if(r.isFile()){let i=q.extname(r.name).toLowerCase();GT.has(i)&&!r.name.startsWith("_")&&n.push(q.relative(e,o))}}return n}a(Im,"scanSourceFiles");function Tm(t){let e=t.startsWith("---")?t.indexOf(`
|
|
422
424
|
---`,3)+4:0,n=t.slice(e).split(`
|
|
423
|
-
`).filter(o=>o.trim().length>0);return(n.find(o=>!o.startsWith("#")&&!o.startsWith(">"))??n[0]??"").replace(/^\*+|\*+$/g,"").trim().slice(0,120)}a(
|
|
425
|
+
`).filter(o=>o.trim().length>0);return(n.find(o=>!o.startsWith("#")&&!o.startsWith(">"))??n[0]??"").replace(/^\*+|\*+$/g,"").trim().slice(0,120)}a(Tm,"extractFallbackSummary");function YT(t){try{let e=U.readFileSync(t,"utf8"),n=Ee(e);if(n.source)return{url:n.source,type:n.source_type??"unknown"}}catch{}}a(YT,"extractSourceOrigin");function QT(t,e,n){let r=Qe(n),o=t.map((s,c)=>{let l=s.candidateOutputs.map(u=>` - ${u.category}: ${u.absPath}`).join(`
|
|
424
426
|
`),d=s.origin?` \u539F\u59CB\u6765\u6E90: ${s.origin.url} (${s.origin.type})`:null;return[`${c+1}. \u6E90\u6587\u4EF6: ${s.sourceAbsPath}`,...d?[d]:[]," \u5019\u9009\u8F93\u51FA\u8DEF\u5F84\uFF08\u6839\u636E\u4F60\u5224\u5B9A\u7684 category \u9009\u62E9\u5176\u4E00\u5199\u5165\uFF09\uFF1A",l].join(`
|
|
425
427
|
`)});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 \u9009\u62E9\u5BF9\u5E94\u5019\u9009\u8F93\u51FA\u8DEF\u5F84\uFF0C\u5206\u7C7B\u5224\u5B9A\u6807\u51C6\uFF1A",...n.categories.map(s=>` - ${s.id}${s.criteria?`\uFF1A${s.criteria}`:""}`)," 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","- \u94FE\u63A5\u4E0E\u8DEF\u5F84\uFF1A\u6B63\u6587\u4E2D\u4E0D\u5F97\u51FA\u73B0\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF1B\u4E0D\u8981\u81EA\u884C\u7F16\u9020\u4E0D\u5B58\u5728\u7684\u76F8\u5BF9\u94FE\u63A5","- \u5FE0\u5B9E\u6E90\u6750\u6599\uFF1A\u4E0D\u8981\u6DFB\u52A0\u6E90\u6587\u4EF6\u4E2D\u4E0D\u5B58\u5728\u7684\u4E8B\u5B9E\u3001FAQ \u6216\u7ED3\u8BBA","","\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: <${r.join("|")} \u5176\u4E00\uFF0C\u6309\u4E0A\u65B9\u5206\u7C7B\u5224\u5B9A\u6807\u51C6\u9009\u62E9>`,"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","",...o,"","\u73B0\u5728\u5F00\u59CB\u6279\u91CF\u7F16\u8BD1\u3002"].join(`
|
|
426
|
-
`)}a(
|
|
427
|
-
`),"utf8"),s.length}a(
|
|
428
|
-
`),"utf8");return}i.push("| File | Summary | Tags | Updated |","|------|---------|------|---------|");for(let s of o){let c=U.readFileSync(q.join(r,s),"utf8"),l=Ee(c),d=(l.summary??
|
|
429
|
-
`),"utf8")}a(
|
|
430
|
-
`),"utf8")}}}a(
|
|
428
|
+
`)}a(QT,"buildBatchCompilePrompt");function ol(t,e){let n=[];for(let r of e){let o=q.join(t,r);if(U.existsSync(o))for(let i of U.readdirSync(o).filter(s=>s.endsWith(".md")&&!s.startsWith("_"))){let s=U.readFileSync(q.join(o,i),"utf8"),c=Ee(s);n.push({relativePath:`${r}/${i}`,title:c.title??q.basename(i,".md"),summary:(c.summary??Tm(s)).slice(0,120),tags:(c.tags??"").replace(/[[\]]/g,""),updated:c.updated??rl()})}}return n}a(ol,"collectWikiPageEntries");function rl(){return X().slice(0,10)}a(rl,"today");function Qc(t,e,n,r,o){let i=Qe(o),s=ol(t,i),c=new Map;for(let d of s){let u=d.relativePath.split("/",1)[0]??"";c.set(u,(c.get(u)??0)+1)}let l=["# \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\uFF08\u542B\u9010\u7BC7 Contents \u8868\uFF09\uFF0C\u6700\u540E\u8BFB\u5177\u4F53\u6587\u7AE0\u3002`,"",`Last updated: ${n.slice(0,10)}`,"","## Statistics","",`- Sources: ${r} \u4E2A\u539F\u59CB\u6587\u6863`,`- Articles: ${s.length} \u7BC7 wiki \u6587\u7AE0`,`- Last compiled: ${n}`,"","## Quick Navigation",""];for(let d of o.categories){let u=c.get(d.id)??0;l.push(`- [${d.name}](${d.id}/_index.md)\uFF08${u} \u7BC7${d.criteria?`\uFF1B${d.criteria}`:""}\uFF09`)}if(o.routeHints.length>0){l.push("","## \u95EE\u9898\u8DEF\u7531\u8868","","| \u95EE\u9898\u6A21\u5F0F | \u53BB\u54EA\u67E5 |","|---------|--------|");for(let d of o.routeHints)l.push(`| ${d.pattern.replace(/\|/g,"\\|")} | [${d.category}](${d.category}/_index.md) |`)}if(o.tagsIndex){let d=Am(s);if(d.length>0){l.push("","## Tags","");for(let{tag:u,count:f}of d)l.push(`- [${u}](${Ye}/${_m(u)})\uFF08${f} \u7BC7\uFF09`)}}return l.push(""),U.writeFileSync(q.join(t,"_index.md"),l.join(`
|
|
429
|
+
`),"utf8"),s.length}a(Qc,"generateMasterIndex");function Xc(t,e,n){let r=q.join(t,e.id);if(!U.existsSync(r))return;let o=U.readdirSync(r).filter(s=>s.endsWith(".md")&&!s.startsWith("_")),i=[`# ${e.name}\u7D22\u5F15`,"",`> \u672C\u76EE\u5F55\u5305\u542B\u6240\u6709\u300C${e.name}\u300D\u5206\u7C7B\u7684 wiki \u6587\u7AE0\u3002${e.criteria?`\u5206\u7C7B\u6807\u51C6\uFF1A${e.criteria}\u3002`:""}`,"",`Last updated: ${n.slice(0,10)}`,"","## Contents",""];if(o.length===0){i.push("\uFF08\u6682\u65E0\u6587\u7AE0\uFF09",""),U.writeFileSync(q.join(r,"_index.md"),i.join(`
|
|
430
|
+
`),"utf8");return}i.push("| File | Summary | Tags | Updated |","|------|---------|------|---------|");for(let s of o){let c=U.readFileSync(q.join(r,s),"utf8"),l=Ee(c),d=(l.summary??Tm(c)).slice(0,120).replace(/\|/g,"\\|"),u=(l.tags??"").replace(/[[\]]/g,"");i.push(`| [${s}](${s}) | ${d} | ${u} | ${l.updated??n.slice(0,10)} |`)}i.push(""),U.writeFileSync(q.join(r,"_index.md"),i.join(`
|
|
431
|
+
`),"utf8")}a(Xc,"generateCategoryIndex");function bm(t,e){U.mkdirSync(t,{recursive:!0});for(let n of e)U.mkdirSync(q.join(t,n),{recursive:!0})}a(bm,"ensureWikiSubdirs");function XT(t){return t.split(/[,,]/).map(e=>e.trim()).filter(e=>e.length>0)}a(XT,"splitTags");function _m(t){return`${t.replace(/[\\/]/g,"-")}.md`}a(_m,"tagFileName");function Am(t){let e=new Map;for(let n of t)for(let r of XT(n.tags)){let o=e.get(r)??[];o.push(n),e.set(r,o)}return[...e.entries()].map(([n,r])=>({tag:n,count:r.length,items:r})).sort((n,r)=>r.count-n.count||n.tag.localeCompare(r.tag,"zh"))}a(Am,"groupEntriesByTag");function el(t,e,n){let r=q.join(t,Ye);if(U.existsSync(r)&&U.rmSync(r,{recursive:!0,force:!0}),!e.tagsIndex)return;let o=ol(t,Qe(e)),i=Am(o);if(i.length!==0){U.mkdirSync(r,{recursive:!0});for(let{tag:s,items:c}of i){let l=[`# \u6807\u7B7E\uFF1A${s}`,"","> \u6309\u6807\u7B7E\u805A\u5408\u7684\u6587\u7AE0\uFF0C\u7531 wiki-compiler \u81EA\u52A8\u751F\u6210\u3002","",`Last updated: ${n.slice(0,10)}`,"","## Contents","","| File | Category | Summary | Updated |","|------|----------|---------|---------|"];for(let d of c){let u=d.summary.replace(/\|/g,"\\|");l.push(`| [${d.title}](../${d.relativePath}) | ${d.relativePath.split("/",1)[0]??""} | ${u} | ${d.updated} |`)}l.push(""),U.writeFileSync(q.join(r,_m(s)),l.join(`
|
|
432
|
+
`),"utf8")}}}a(el,"syncTagsIndex");var e_=20;function Ct(t){return q.basename(t).replace(/\.[^.]+$/,".md")}a(Ct,"wikiBaseNameOf");function t_(t){let e=U.readFileSync(t,"utf-8");return`sha256:${JT("sha256").update(e).digest("hex").slice(0,16)}`}a(t_,"fileFingerprint");function km(t,e,n){return n.some(r=>U.existsSync(q.join(t,r,e)))}a(km,"findExistingWikiPage");function Em(t){return U.existsSync(t)?U.statSync(t,{bigint:!0}).mtimeNs:null}a(Em,"fileMtimeNs");function vm(t,e,n){for(let r of n){let o=Em(q.join(t,r,e));if(o!==null)return o}return null}a(vm,"wikiPageMtime");function il(t){try{return U.readdirSync(t,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}a(il,"listWikiSubdirs");function tl(t,e,n){let r=[];for(let s of il(t)){if(s===Ye)continue;let c=q.join(t,s,e),l=Em(c);l!==null&&r.push({abs:c,dir:s,mtimeNs:l})}if(r.length===0)return null;r.sort((s,c)=>c.mtimeNs>s.mtimeNs?1:c.mtimeNs<s.mtimeNs?-1:0);let o=n_(r,n),i=q.join(t,va(n,o.dir),e);q.resolve(o.abs)!==q.resolve(i)&&(U.mkdirSync(q.dirname(i),{recursive:!0}),U.copyFileSync(o.abs,i),U.rmSync(o.abs,{force:!0}));for(let s of r)q.resolve(s.abs)!==q.resolve(i)&&U.rmSync(s.abs,{force:!0});return i}a(tl,"normalizeWikiPage");function n_(t,e){let n=t[0].mtimeNs,r=t.filter(i=>i.mtimeNs===n);if(r.length===1)return r[0];let o=new Set(Qe(e));for(let i of r)try{let s=Ee(U.readFileSync(i.abs,"utf8"));if(typeof s.category=="string"&&s.category===i.dir&&o.has(i.dir))return i}catch{}return r[0]}a(n_,"pickAuthoritativeCopy");function Sm(t,e,n){let r=new Set(e);for(let o of il(t)){if(r.has(o)||o===Ye)continue;let i=q.join(t,o);try{let s=U.readdirSync(i);if(s.every(c=>c.startsWith("_")||c.startsWith("."))){for(let c of s)U.rmSync(q.join(i,c),{force:!0});U.rmdirSync(i),m.info("kb","\u6E05\u7406 taxonomy \u5916\u7684\u7A7A\u5206\u7C7B\u76EE\u5F55",{collection:n,dir:o,removed:s})}}catch{}}}a(Sm,"removeEmptyIllegalDirs");function r_(t,e){let n=[];for(let r=0;r<t.length;r+=e)n.push(t.slice(r,r+e));return n}a(r_,"chunk");function nl(t,e,n,r){let o=q.join(t,"log.md");U.existsSync(o)||U.writeFileSync(o,`# Wiki \u7F16\u8BD1\u65E5\u5FD7
|
|
431
433
|
|
|
432
434
|
`,"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(", ");U.appendFileSync(o,`## [${e.slice(0,10)}] ${i}\u7F16\u8BD1 | ${s}
|
|
433
|
-
`,"utf8")}a(
|
|
435
|
+
`,"utf8")}a(nl,"appendCompileLog");function o_(t,e,n,r){for(let o of r){let i=q.join(t,o,e);if(!U.existsSync(i))continue;let s=U.readFileSync(i,"utf8");if(s.includes("original_sources:")||!s.startsWith("---"))return;let c=s.indexOf(`
|
|
434
436
|
---`,3);if(c===-1)return;U.writeFileSync(i,`${s.slice(0,c)}
|
|
435
|
-
original_sources: [${n.url}]${s.slice(c)}`,"utf8");return}}a(
|
|
436
|
-
`,"utf8"),await
|
|
437
|
-
`,"utf8"),await
|
|
438
|
-
${h}`:"");return m.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5931\u8D25",{collection:n,bin:u.bin,exitCode:g.exitCode}),i?.("failed",`${f} \u9000\u51FA\u7801 ${g.exitCode}`),{collection:n,action:"failed",error:y}}}let c=qt.resolve(e,n),l;try{l=xe(c,r.artifact)}catch(d){let u=d instanceof Error?d.message:String(d);return{collection:n,action:"failed",error:`compile.artifact \u914D\u7F6E\u975E\u6CD5: ${u}`}}try{await $T(l)}catch{let d=`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5168\u90E8\u6210\u529F\uFF0C\u4F46\u672A\u4EA7\u51FA\u58F0\u660E\u7684\u4EA7\u7269: ${r.artifact}\uFF08\u671F\u671B\u4F4D\u7F6E ${qt.relative(e,l)||r.artifact}\uFF09\u3002\u8BF7\u68C0\u67E5 build \u811A\u672C\u662F\u5426\u771F\u7684\u5199\u4E86\u8BE5\u6587\u4EF6\u3002`;return i?.("failed",`\u4EA7\u7269\u7F3A\u5931: ${r.artifact}`),{collection:n,action:"failed",error:d}}return i?.("done",`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210\uFF08${r.build.length} \u6761\u547D\u4EE4\uFF09`),m.info("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210",{collection:n,commands:r.build.length}),{collection:n,action:"compiled"}}a(vm,"runCustomBuild");function zT(t,e,n){if(n instanceof nr)return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u8D85\u65F6\uFF08collection=${t}\uFF09: ${e}\uFF08\u53EF\u7528 compile.build[].timeout_ms \u8C03\u5927\uFF09`;let r=n instanceof Error?n.message:String(n);return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u6267\u884C\u5931\u8D25\uFF08collection=${t}\uFF09: ${e} \u2014 ${r}`}a(zT,"toBuildError");async function UT(t,e,n){let r=[];for(let o of e){let i=Mt(t,o.collection);n?.({collection:o.collection,index:0,total:0,phase:"ingest",detail:o.source});try{let s=await Nn({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`;m.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?(m.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})):(m.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);m.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(UT,"ingestRemoteSources");function VT(t){return typeof t=="string"?{collection:t}:t}a(VT,"normalizeEntry");function It(t){return(t.compile?.build?.length??0)>0}a(It,"isCustomCompile");async function Ht(t){let{configDir:e,force:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,batchSize:c,bins:l,onProgress:d}=t,u=t.collections.map(VT),f=[];for(let h of u)typeof h.source=="string"&&h.source.length>0&&f.push({source:h.source,collection:h.collection});f.length>0&&await UT(e,f,d);let p=[],g=u.length;for(let[h,y]of u.entries()){let w=y.collection;if(It(y)){let _=await vm({configDir:e,collection:w,compile:y.compile,...l?{bins:l}:{},onProgress:a((T,I)=>d?.({collection:w,index:h,total:g,phase:T,detail:I}),"onProgress")});p.push(_);continue}let b=await Rt(Mt(e,w)),v=await gn(e,w),R=bt({configDir:e,entry:w}),S=v?.taxonomyHash!==void 0&&v.taxonomyHash!==fr(R),C=v?.taxonomyIndexHash!==void 0&&v.taxonomyIndexHash!==Co(R);if(!n&&!S&&!C&&!bi(v,b)){d?.({collection:w,index:h,total:g,phase:"skipped",detail:"\u6E90\u672A\u53D8\u66F4"}),p.push({collection:w,action:"skipped"});continue}(S||C)&&m.info("kb","taxonomy \u53D8\u66F4\uFF0C\u6E90\u672A\u53D8\u66F4\u4E5F\u91CD\u65B0\u7F16\u8BD1",{collection:w,scope:S?"structure":"index-only"});let A=await wm({configDir:e,entry:w,...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},...s?{timeoutMsPerFile:s}:{},...c?{batchSize:c}:{},...n?{forceFull:!0}:{},onProgress:a(((_,T)=>d?.({collection:w,index:h,total:g,phase:_,detail:T})),"onProgress")});A.status==="failed"?p.push({collection:w,action:"failed",report:A,...A.error?{error:A.error}:{}}):p.push({collection:w,action:"compiled",report:A})}return p}a(Ht,"refreshKnowledgeBases");import{access as KT,readdir as qT}from"fs/promises";import HT from"path";async function ji(t){let{configDir:e,targets:n,workflows:r}=t,o=[];if(n.length===0)return o;let i=null;for(let s of n){let c;try{c=xe(HT.resolve(e,s.collection),s.artifact)}catch(f){let p=f instanceof te?`\u77E5\u8BC6\u5E93 compile.artifact \u914D\u7F6E\u8D8A\u754C\uFF08${s.collection}: ${s.artifact}\uFF09`:`\u77E5\u8BC6\u5E93 compile.artifact \u89E3\u6790\u5931\u8D25\uFF08${s.collection}\uFF09: ${f instanceof Error?f.message:String(f)}`;o.push({level:"error",message:p,collection:s.collection});continue}let l=!0;try{await KT(c)}catch{l=!1}if(l)continue;i??=await JT(r);let d=[...i.entries()].filter(([,f])=>f.some(p=>s.roleIds.includes(p))).map(([f])=>f),u=`\u77E5\u8BC6\u5E93\u4EA7\u7269\u7F3A\u5931: ${s.collection} \u7684\u7F16\u8BD1\u4EA7\u7269 ${s.artifact} \u4E0D\u5B58\u5728\uFF08\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u4E86 compile.build \u5374\u672A\u4EA7\u51FA artifact\uFF09\u2014\u2014\u8BF7\u5148\u8DD1 setup \u6216 kb compile`;if(d.length===0)o.push({level:"error",message:u,collection:s.collection});else for(let f of d)o.push({level:"error",workflowId:f,message:u,collection:s.collection});m.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u4EA7\u7269\u7F3A\u5931",{collection:s.collection,artifact:s.artifact,consumers:d})}return o}a(ji,"checkKbCompileArtifacts");async function JT(t){let e=await Promise.all(t.map(async n=>{let r=await GT(n.recipeDir),o=await Promise.all(r.map(async s=>(await Dn(n.recipeDir,s)).definition?.meta?.role)),i=new Set;for(let s of o)typeof s=="string"&&s.trim()&&i.add(s.trim());return{id:n.id,roles:[...i]}}));return new Map(e.map(n=>[n.id,n.roles]))}a(JT,"resolveWorkflowRoleBindings");async function GT(t){let e;try{e=await qT(t)}catch{return[]}let n=new Set;for(let r of e){let o=r.match(/^(.+)\.recipe\.(?:ts|js)$/);o&&n.add(o[1])}return[...n]}a(GT,"listRecipeIds");var eA=/^\$\{globalVar\.[^}]+\}$/,tA=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function nA(t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:typeof t=="object"?Object.keys(t).length===0:!1}a(nA,"isKbValidateValueEmpty");function rA(t,e){if(!t)return{found:!1,reason:"missing"};let n=e.split(".").filter(o=>o.length>0);if(n.length===0)return{found:!1,reason:"invalid_path"};let r=t;for(let o of n){if(r===null||typeof r!="object"||Array.isArray(r))return{found:!1,reason:"invalid_path"};let i=r;if(!(o in i))return{found:!1,reason:"missing"};r=i[o]}return{found:!0,value:r}}a(rA,"getKbCustomByPath");function Sm(t,e,n,r){Array.isArray(r)&&r.forEach((o,i)=>{let s=qa.safeParse(o);!s.success||typeof s.data=="string"||s.data.compile&&t.push({roleId:e,file:n,index:i,entry:s.data})})}a(Sm,"pushParsedEntries");function xm(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t.knowledge_scope;if(!(!e||typeof e!="object"||Array.isArray(e)))return e.kb_collections}a(xm,"rawKbCollectionsOf");function oA(t,e,n){let r=[];if(e?.roles){for(let[i,s]of Object.entries(e.roles))Sm(r,i,"profile/profile.yml",xm(s));return r}let o;try{o=YT(n)}catch{return r}for(let i of o.sort()){if(!i.endsWith(".role.yml"))continue;let s;try{s=XT.parse(QT(ZT.join(n,i),"utf8"))}catch{continue}let c=s&&typeof s=="object"&&typeof s.id=="string"?s.id:i.replace(/\.role\.yml$/,"");Sm(r,c,`roles/${i}`,xm(s))}return r}a(oA,"collectEntryContexts");function Im(t){return[...t.file==="profile/profile.yml"?["roles",t.roleId,"knowledge_scope","kb_collections",t.index]:["knowledge_scope","kb_collections",t.index],"compile","custom"]}a(Im,"yamlPathPrefixFor");function Rm(t,e){let n=e.split(".").filter(r=>r.length>0);return{type:"yaml",file:t.file,yamlPath:[...Im(t),...n],valueType:"string"}}a(Rm,"yamlWriteTargetFor");function Tm(t,e,n,r,o,i){if(n==null||r&&i.has(r))return;let s=typeof n=="string"||typeof n=="number"||typeof n=="boolean",c=Array.isArray(n)&&n.every(u=>typeof u=="string");if(!s&&!c){if(Array.isArray(n))return;for(let[u,f]of Object.entries(n))Tm(t,e,f,r?`${r}.${u}`:u,[...o,u],i);return}let l={type:"yaml",file:e.file,yamlPath:[...Im(e),...o],...c?{valueType:"string[]"}:{valueType:"string"}},d=`kb_compile.${e.roleId}.${e.entry.collection}.custom.${r}`;t.push({key:d,status:"ok",value:n,writeTarget:l,surface:{key:d,label:`${e.entry.collection} \xB7 ${r}`,description:`\u77E5\u8BC6\u5E93 ${e.entry.collection} \u79C1\u6709\u914D\u7F6E compile.custom.${r}\uFF08\u53EF\u7559\u7A7A\uFF09`,owner:"framework",source:"project",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"none",valueType:c?"string[]":"string",writeTarget:l}})}a(Tm,"pushCustomLeafItems");function Cm(t,e,n){return{key:t.key,label:`\u77E5\u8BC6\u5E93 ${t.collection} \xB7 ${t.dotPath}`,description:`\u77E5\u8BC6\u5E93 ${t.collection} \u7684\u5FC5\u586B\u914D\u7F6E compile.custom.${t.dotPath}`+(n?"\uFF08\u5F53\u524D\u5F15\u7528\u4E86\u672A\u8BBE\u7F6E\u7684\u73AF\u5883\u53D8\u91CF\uFF0C\u586B\u5199\u540E\u5199\u5165 .env\uFF09":"\uFF08\u5199\u5165 profile \u7684 compile.custom\uFF09"),owner:n?"env":"framework",source:n?"env":"project",required:!0,editable:!0,allowEmpty:!1,defaultStrategy:"none",valueType:"string",writeTarget:e}}a(Cm,"validateSurface");async function Am(t){let{configDir:e,profileConfig:n,rolesDir:r,workflowEntries:o}=t,i=oA(e,n,r);if(i.length===0)return null;let s=[],c=a(y=>`kb_compile.${y.roleId}.${y.entry.collection}`,"keyPrefixOf"),l=new Map,d=a((y,w)=>{let b=l.get(y);b||l.set(y,b=new Set),b.add(w)},"rememberEmitted");for(let y of i){let w=y.entry.compile;for(let b of w.validate){let v=`${c(y)}.validate.${b}`,R=rA(w.custom,b);if(!R.found){let A=Rm(y,b),_=R.reason==="invalid_path"?"validate \u8DEF\u5F84\u4E2D\u9014\u7A7F\u8FC7\u6807\u91CF/\u6570\u7EC4\uFF0C\u4E0E compile.custom \u7684\u5B9E\u9645\u7ED3\u6784\u4E0D\u5339\u914D\uFF08\u586B\u5199\u5C06\u6309 validate \u8DEF\u5F84\u91CD\u5EFA\u7ED3\u6784\uFF09":"compile.custom \u4E2D\u4E0D\u5B58\u5728\u8BE5\u8DEF\u5F84\uFF08\u586B\u5199\u540E\u81EA\u52A8\u521B\u5EFA\uFF09";s.push({key:v,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: validate \u767B\u8BB0\u7684\u5FC5\u586B\u8DEF\u5F84\u300C${b}\u300D\u65E0\u6CD5\u53D6\u503C \u2014\u2014 ${_}`,writeTarget:A,surface:Cm({key:v,collection:y.entry.collection,dotPath:b},A,!1)}),d(y,b);continue}let S=R.value;if(typeof S=="string"&&eA.test(S))continue;let C=typeof S=="string"?S.match(tA):null;if(C||nA(S)){let A=C?{type:"env",file:".env",envKey:C[1]}:Rm(y,b);s.push({key:v,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: \u5FC5\u586B\u503C\u4E3A\u7A7A compile.custom.${b}`+(C?`\uFF08\u5F15\u7528\u7684\u73AF\u5883\u53D8\u91CF\u672A\u8BBE\u7F6E: ${S}\uFF0C\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\u5199\u5165 .env\uFF0C\u6216\u76F4\u63A5\u5728\u73AF\u5883\u4E2D\u914D\u7F6E\uFF09`:"\uFF08\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\uFF0C\u5199\u5165 profile \u7684 compile.custom\uFF09"),writeTarget:A,surface:Cm({key:v,collection:y.entry.collection,dotPath:b},A,!!C)}),d(y,b)}}}for(let y of i)Tm(s,y,y.entry.compile.custom??{},"",[],l.get(y)??new Set);let u=new Map;for(let y of i){let w=u.get(y.entry.collection);w?w.roleIds.push(y.roleId):u.set(y.entry.collection,{collection:y.entry.collection,compile:y.entry.compile,roleIds:[y.roleId]})}let f=[...u.values()],p=f.filter(It).map(y=>({collection:y.collection,artifact:y.compile.artifact,roleIds:y.roleIds})),g=await ji({configDir:e,targets:p,workflows:o.map(y=>({id:y.id,recipeDir:y.recipeDir}))}),h=new Map(f.map(y=>[y.collection,y.roleIds[0]??""]));for(let y of g)s.push({key:`kb_compile.${h.get(y.collection)??""}.artifact.${s.length}`,status:"warn",message:(y.workflowId?`[${y.workflowId}] `:"")+`\u7F16\u8BD1\u4EA7\u7269\u5C1A\u672A\u751F\u6210: ${y.message.replace(/^知识库产物缺失: /,"")}\uFF08config \u9636\u6BB5\u672A\u7F16\u8BD1\u5C5E\u9884\u671F\uFF1Bsetup \u7684 KB \u9636\u6BB5\u4F1A\u7F16\u8BD1\u4EA7\u51FA\uFF0C\u82E5 setup \u540E\u4ECD\u7F3A\u5931\uFF0Crun \u542F\u52A8\u5C06\u963B\u65AD\u5BF9\u5E94\u5DE5\u4F5C\u6D41\uFF09`});for(let y of f){let w=`kb_compile.${y.roleIds[0]??""}.${y.collection}.`;s.some(v=>v.status==="error"&&v.key.startsWith(w))||s.push({key:`kb_compile.${y.roleIds[0]??""}.${y.collection}`,status:"ok",message:`\u77E5\u8BC6\u5E93 ${y.collection}: \u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u5B8C\u6574\uFF08${y.compile.build.length} \u6761 build \u547D\u4EE4\uFF0Cvalidate ${y.compile.validate.length} \u9879\u901A\u8FC7\uFF09`})}return{id:"profile",name:"\u77E5\u8BC6\u5E93\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E",ok:!s.some(y=>y.status==="error"),items:s}}a(Am,"checkKbCompile");async function Ni(t){let e=await Te(t.configPath),n=Bn.dirname(e),r;try{r=await Fi(e,"utf8")}catch(x){return iA(t.configPath,`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6: ${x instanceof Error?x.message:String(x)}`)}let o=await ti(n);un();let i=null,s=null;try{i=Xe(n,o,{lenientEnv:!0})}catch(x){s=x instanceof Error?x.message:String(x)}let c="";try{c=await Fi(Bn.resolve(n,"profile","profile.yml"),"utf8")}catch{}let l=null,d=null;try{l=await Ae(t.configPath)}catch(x){d=x instanceof Error?x.message:String(x)}let u=[];l?u=l.workflowEntries:u=aA(n,r),t.workflowId&&(u=u.filter(x=>x.id===t.workflowId));let f=[];for(let x of u)try{let D=await Fi(x.templatePath,"utf8");f.push({id:x.id,text:D})}catch{}let p=[];l?(p.push(Vp(l)),p.push(await Hp(l,{engineExplicitlySet:sA(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 wc(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 g=l?l.rolesDir:Bn.resolve(n,"./roles"),h=l?l.roles.enabled:!0;p.push(await gg(g,h,n,i));let y=await Er(n);y.present&&p.push(Sc(y));let w=await Am({configDir:n,profileConfig:i,rolesDir:g,workflowEntries:u});w&&p.push(w);let b=Ar([r,c,...f.map(x=>x.text)]),v="";try{v=await Fi(Bn.resolve(n,".env.example"),"utf8")}catch{}let R=c?[...f,{id:"__profile__",text:c}]:f,S=wg(r,R),C=new Map;for(let[x,{toolkit:D,field:j}]of S){let L=gt.find(ue=>ue.name===D);if(!L)continue;let W=pn(L.configSchema);if(!W||!W[j])continue;let V=vc(W[j]);V&&C.set(x,V)}p.push(kc(r,R,o,v,b,C));let A=p.reduce((x,D)=>x+D.items.filter(j=>j.status==="error").length,0),_=p.reduce((x,D)=>x+D.items.filter(j=>j.status==="warn").length,0),T=p.reduce((x,D)=>x+D.items.filter(j=>j.status==="suggestion").length,0),I=p.filter(x=>x.ok).length;return{projectPath:t.configPath,ok:p.every(x=>x.ok),modules:p,summary:{totalModules:p.length,passedModules:I,errors:A,warnings:_,suggestions:T}}}a(Ni,"runCheck");function iA(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(iA,"errorResult");function sA(t){try{let e=_m.parse(t);if(!k(e))return!1;let n=e.agent;if(!k(n))return!1;let r=n.engine;return typeof r=="string"&&r.trim().length>0}catch{return!1}}a(sA,"isEngineExplicitlySet");function aA(t,e){try{let n=_m.parse(e);if(!k(n))return[];if(k(n.workflow)){let r=n.workflow.template,o=n.workflow.recipe_dir??"./recipes";if(typeof r=="string")return[{id:"default",templatePath:Bn.resolve(t,r),recipeDir:Bn.resolve(t,String(o))}]}if(k(n.workflows)&&typeof n.workflows.dir=="string")return[]}catch{}return[]}a(aA,"inferWorkflowEntries");import{readFile as el,writeFile as Wi}from"fs/promises";import cA from"yaml";function Em(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(Em,"coerceYamlValue");function lA(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(lA,"coerceJsonValue");async function Li(t,e,n){let r;try{r=await el(t,"utf8")}catch{r=""}let o=cA.parseDocument(r);o.setIn(e,n),await Wi(t,o.toString(),"utf8")}a(Li,"writeYaml");async function dA(t,e,n){let r;try{r=await el(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(`^${fA(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?`
|
|
437
|
+
original_sources: [${n.url}]${s.slice(c)}`,"utf8");return}}a(o_,"backfillOriginalSources");function xm(t,e){let n=0;for(let r of il(t)){if(r===Ye)continue;let o=q.join(t,r);for(let i of U.readdirSync(o).filter(s=>s.endsWith(".md")&&!s.startsWith("_")))e.has(i)||(U.rmSync(q.join(o,i),{force:!0}),n++)}return n}a(xm,"pruneOrphanWikiPages");function Rm(t,e,n,r){try{let o=fm({wikiDir:t,sourceDir:e});r?.("indexing",`\u540E\u5904\u7406\uFF1A\u6765\u6E90\u5BCC\u5316 ${o.sources.enrichedArticles} \u7BC7/${o.sources.linksWritten} \u94FE\u63A5\uFF0C\u5F52\u4E00\u5316\u6EAF\u6E90 ${o.normalized.sourcesFixed}/\u94FE\u63A5 ${o.normalized.linksFixed}\uFF0C\u53CD\u5411\u94FE\u63A5 ${o.backlinksAdded} \u6761`),m.info("kb","wiki \u540E\u5904\u7406\u5B8C\u6210",{collection:n,...o.sources,normalized:o.normalized,backlinksAdded:o.backlinksAdded})}catch(o){let i=o instanceof Error?o.message:String(o);m.warn("kb","wiki \u540E\u5904\u7406\u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7)",{collection:n,error:i})}}a(Rm,"runPostProcess");function Cm(t,e,n,r,o,i){try{let s=wm({wikiDirPath:t,taxonomy:e,categoryInputIssues:r,sourceDirPath:o}),c=s.issues.length;return c>0&&(i?.("indexing",`lint\uFF1A${c} \u4E2A\u95EE\u9898\uFF08\u89C1 _compile-report.json\uFF09`),m.warn("kb","\u7F16\u8BD1\u4EA7\u7269 lint \u53D1\u73B0\u95EE\u9898",{collection:n,counts:s.counts})),{lint:s}}catch(s){let c=s instanceof Error?s.message:String(s);return m.warn("kb","\u7F16\u8BD1\u4EA7\u7269 lint \u5931\u8D25(\u964D\u7EA7\u8DF3\u8FC7\uFF0C\u8BB0\u5165\u62A5\u544A)",{collection:n,error:c}),i?.("indexing",`lint \u672A\u80FD\u5B8C\u6210\uFF1A${c}`),{lintError:c}}}a(Cm,"runLint");async function Dm(t){let{configDir:e,entry:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,onProgress:c}=t,l=Math.max(1,t.batchSize??e_),d=Mt(e,n),u=an(e,n),f=X(),p;try{p=bt({configDir:e,entry:n})}catch(z){let te=z instanceof Error?z.message:String(z),Z=X();return c?.("failed",te),m.error("kb","taxonomy \u914D\u7F6E\u65E0\u6548",{collection:n,error:te}),{collection:n,startedAt:f,finishedAt:Z,sourceFileCount:0,articleCount:0,status:"failed",error:te}}let g=Qe(p),h=gr(p),y=_o(p),w=new Map,b=await hn(e,n),v=b?.fileHashes??{},R=b!=null&&(b.taxonomyHash!=null?b.taxonomyHash!==h:!p.isDefault),S=t.forceFull===!0||R;R&&(c?.("scanning","taxonomy \u53D8\u66F4\uFF0C\u81EA\u52A8\u5347\u7EA7\u4E3A\u5168\u91CF\u91CD\u7F16\u4EE5\u91CD\u65B0\u5206\u7C7B"),m.info("kb","taxonomy \u53D8\u66F4\uFF0C\u5F3A\u5236\u5168\u91CF\u91CD\u7F16",{collection:n,taxonomyHash:h}));let C={...b,collection:n,sourceDir:d,wikiDir:u,status:"compiling",startedAt:f,taxonomyHash:h,taxonomyIndexHash:y,lastError:void 0};c?.("scanning",d);let _=Im(d,d),A=_.filter(z=>df(p,z)),T={};for(let z of _)T[z]=t_(q.join(d,z));if(await Ut(e,n,{...C,fileCount:_.length,compiledCount:0}),_.length===0){let z=X();if(U.existsSync(u)){let te=xm(u,new Set);Sm(u,g,n),bm(u,g);let Z=X();Qc(u,n,Z,0,p);for(let se of p.categories)Xc(u,se,Z);el(u,p,Z),te>0&&(nl(u,Z,"incremental",{created:0,updated:0,skipped:0,failed:0,pruned:te}),m.warn("kb","\u6E90\u76EE\u5F55\u5DF2\u6E05\u7A7A\uFF0C\u540C\u6B65\u6E05\u7406\u65E7\u4EA7\u7269",{collection:n,pruned:te}))}return c?.("skipped","\u6E90\u76EE\u5F55\u4E3A\u7A7A"),await Ut(e,n,{...C,status:"done",finishedAt:z,fileCount:0,compiledCount:0,sourceHash:await Rt(d),fileHashes:{}}),m.warn("kb","\u6E90\u76EE\u5F55\u65E0\u53EF\u7F16\u8BD1\u6587\u4EF6",{collection:n,src:d}),{collection:n,startedAt:f,finishedAt:z,sourceFileCount:0,articleCount:0,status:"done"}}bm(u,g);let I=new Set(A.map(Ct)),x=xm(u,I);for(let z of I)tl(u,z,p);Sm(u,g,n);let D=A.filter(z=>S||!km(u,Ct(z),g)?!0:v[z]!==T[z]),j=new Set(D.filter(z=>km(u,Ct(z),g))),L=A.length-D.length,W=S?"full":"incremental",V=S?"\u5168\u91CF":"\u589E\u91CF";if(D.length===0){c?.("indexing");let z=X();Rm(u,d,n,c);let te=Qc(u,n,z,A.length,p);for(let Ze of p.categories)Xc(u,Ze,z);el(u,p,z);let Z=X(),{lint:se,lintError:Me}=Cm(u,p,n,w,d,c),Y={collection:n,startedAt:f,finishedAt:Z,sourceFileCount:_.length,articleCount:te,status:"done",...se?{lint:se}:{},...Me?{lintError:Me}:{}};return U.writeFileSync(Cn(e,n),JSON.stringify(Y,null,2)+`
|
|
438
|
+
`,"utf8"),await Ut(e,n,{...C,status:"done",finishedAt:Z,fileCount:_.length,compiledCount:te,sourceHash:await Rt(d),fileHashes:T}),nl(u,z,W,{created:0,updated:0,skipped:L,failed:0,pruned:x}),c?.("done",`${V}\u7F16\u8BD1\uFF1A\u5168\u90E8\u547D\u4E2D\u7F13\u5B58\uFF0C${L} \u8DF3\u8FC7\uFF08${te} \u7BC7\u6587\u7AE0\uFF09`),m.info("kb","\u7F16\u8BD1\u5B8C\u6210(\u65E0\u53D8\u66F4)",{collection:n,mode:W,sourceFiles:_.length,skipped:L,articles:te,pruned:x}),Y}let ue=s??180*1e3,oe=new Set(D.filter(z=>pm(q.join(d,z)))),Ne=D.filter(z=>!oe.has(z)),be=new Set,Le=new Set,nt="",ie=[];if(oe.size>0){c?.("compiling",`curated \u786E\u5B9A\u6027\u7F16\u8BD1 ${oe.size} \u7BC7\uFF08\u6B63\u6587\u4E0D\u7ECF LLM\uFF09`);let z=[...oe].filter(Z=>{let se=Ee(U.readFileSync(q.join(d,Z),"utf8"));return!se.category||In(p,se.category)===null}),te={};if(z.length>0)try{let Z=await pt(mm(z.map(se=>q.join(d,se)),p),{...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},workDir:u,timeoutMs:ue*z.length,adapterOptions:{allowedTools:["Read"]}});te=hm(Z.response??"")}catch(Z){let se=Z instanceof Error?Z.message:String(Z);m.warn("kb","curated \u5206\u7C7B\u5EFA\u8BAE\u5931\u8D25(\u964D\u7EA7\u56DE\u9000\u5206\u7C7B)",{collection:n,error:se})}for(let Z of oe)try{let se=te[q.basename(Z)]??te[Ct(Z)],Me=gm({sourceAbsPath:q.join(d,Z),sourceRelPath:Z,wikiDirPath:u,sourceRootDir:d,taxonomy:p,today:rl(),...se?{categorySuggestion:se}:{}});tl(u,Ct(Z),p),be.add(Z);let Y=q.relative(u,Me.outAbsPath);Me.usedFallbackCategory?(w.set(Y,`\u6E90\u6587\u6863\u65E0\u6709\u6548\u5206\u7C7B\uFF0C\u5DF2\u56DE\u9000\u5230 ${Me.category}\uFF08\u9700\u5728\u6E90\u6587\u6863\u8865\u5408\u6CD5 category\uFF09`),m.warn("kb","curated \u6587\u6863\u65E0\u6709\u6548\u5206\u7C7B\uFF0C\u56DE\u9000",{collection:n,file:Z,fallback:p.fallbackCategoryId})):Me.sourceCategoryInvalid&&(w.set(Y,`\u6E90\u6587\u6863 category \u4E0D\u5728 taxonomy \u95ED\u96C6\u5185\uFF0C\u5DF2\u6309\u5206\u7C7B\u5EFA\u8BAE\u843D\u5230 ${Me.category}\uFF08\u9700\u4FEE\u6B63\u6E90\u6587\u6863 category\uFF09`),m.warn("kb","curated \u6587\u6863\u5206\u7C7B\u975E\u6CD5\uFF0C\u5DF2\u6309\u5EFA\u8BAE\u7EA0\u6B63",{collection:n,file:Z,category:Me.category}))}catch(se){Le.add(Z);let Me=se instanceof Error?se.message:String(se);m.warn("kb","curated \u7F16\u8BD1\u5931\u8D25",{collection:n,file:Z,error:Me})}await Ut(e,n,{...C,fileCount:_.length,compiledCount:be.size})}let ve=r_(Ne,l);c?.("compiling",`${V}\u7F16\u8BD1 ${D.length}/${A.length} \u4E2A\u6E90\u6587\u4EF6\uFF08curated ${oe.size}\uFF09\uFF0C\u5206 ${ve.length} \u6279`);for(let z=0;z<ve.length;z++){let te=ve[z];c?.("compiling",`\u6279 ${z+1}/${ve.length}\uFF08${te.length} \u6587\u4EF6\uFF09`);let Z=te.map(Y=>{let Ze=Ct(Y);return{sourceAbsPath:q.join(d,Y),wikiBaseName:Ze,candidateOutputs:g.map(nr=>({category:nr,absPath:q.join(u,nr,Ze)})),origin:YT(q.join(d,Y))}}),se=QT(Z,rl(),p),Me=new Map;for(let Y of te)Me.set(Y,vm(u,Ct(Y),g));try{let Y=await pt(se,{...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},workDir:u,timeoutMs:ue*te.length,adapterOptions:{allowedTools:["Read","Write","Glob"]}});nt=Y.response??nt,Y.events.some(Ze=>Ze.type==="error")&&m.warn("kb","\u7F16\u8BD1\u8FC7\u7A0B\u51FA\u73B0 error \u4E8B\u4EF6",{collection:n,batch:z+1})}catch(Y){let Ze=Y instanceof Error?Y.message:String(Y);ie.push(`\u6279 ${z+1}: ${Ze}`),m.warn("kb","\u6279\u6B21\u7F16\u8BD1\u5931\u8D25",{collection:n,batch:z+1,error:Ze})}for(let Y of te)tl(u,Ct(Y),p);for(let Y of te){let Ze=vm(u,Ct(Y),g),nr=Me.get(Y)??null;Ze!==null&&(nr===null||Ze!==nr)?be.add(Y):Le.add(Y)}for(let Y of Z)Y.origin&&o_(u,Y.wikiBaseName,Y.origin,g);await Ut(e,n,{...C,fileCount:_.length,compiledCount:be.size})}if(ol(u,g).length===0){let z=X(),te=nt.replace(/\s+/g," ").trim().slice(0,300),se=`coding agent \u672A\u4EA7\u51FA\u4EFB\u4F55 wiki \u6587\u7AE0(\u53EF\u80FD\u6A21\u578B\u672A\u6388\u6743/\u6743\u9650\u4E0D\u8DB3/\u8D85\u65F6)\u3002${ie.length>0?`\u6279\u6B21\u9519\u8BEF: ${ie.join("; ")}\u3002`:""}agent \u8FD4\u56DE: ${te||"(\u7A7A)"}`;return c?.("failed",se),await Ut(e,n,{...C,status:"failed",finishedAt:z,fileCount:_.length,compiledCount:0,lastError:se}),m.error("kb","\u7F16\u8BD1\u672A\u4EA7\u51FA\u6587\u7AE0",{collection:n,response:te}),{collection:n,startedAt:f,finishedAt:z,sourceFileCount:_.length,articleCount:0,status:"failed",error:se}}c?.("indexing");let Ge=X();Rm(u,d,n,c);let Ns=Qc(u,n,Ge,A.length,p);for(let z of p.categories)Xc(u,z,Ge);el(u,p,Ge);let Ld={};for(let z of _)Le.has(z)||(Ld[z]=T[z]);let Iw=Le.size===0?await Rt(d):`${await Rt(d)}:partial`,io=0,so=0;for(let z of be)j.has(z)?so++:io++;let Wd=X(),{lint:Bd,lintError:zd}=Cm(u,p,n,w,d,c),Ud={collection:n,startedAt:f,finishedAt:Wd,sourceFileCount:_.length,articleCount:Ns,status:"done",...Le.size>0?{failedFileCount:Le.size}:{},...Bd?{lint:Bd}:{},...zd?{lintError:zd}:{}};return U.writeFileSync(Cn(e,n),JSON.stringify(Ud,null,2)+`
|
|
439
|
+
`,"utf8"),await Ut(e,n,{...C,status:"done",finishedAt:Wd,fileCount:_.length,compiledCount:Ns,sourceHash:Iw,fileHashes:Ld}),nl(u,Ge,W,{created:io,updated:so,skipped:L,failed:Le.size,pruned:x}),c?.("done",`${V}\u7F16\u8BD1\uFF1A${io} \u65B0\u5EFA, ${so} \u66F4\u65B0, ${L} \u8DF3\u8FC7${Le.size>0?`, ${Le.size} \u5931\u8D25`:""}`),m.info("kb","\u7F16\u8BD1\u5B8C\u6210",{collection:n,mode:W,sourceFiles:_.length,created:io,updated:so,skipped:L,failed:Le.size,pruned:x,articles:Ns}),Ud}a(Dm,"compileWiki");import Ht from"path";import{access as i_,readdir as s_}from"fs/promises";var a_=18e4,c_={tsx:"./node_modules/.bin/tsx"};function l_(t,e){let n=e.bins?.[t]??c_[t]??t;return!/^[./\\]/.test(n)&&!n.includes("/")&&!n.includes("\\")||(e.flavor==="win32"?Ht.win32:e.flavor==="posix"?Ht.posix:Ht).isAbsolute(n)||/^[a-zA-Z]:/.test(n)?n:xe(e.configDir,n,{flavor:e.flavor??"native"})}a(l_,"resolveBuildBin");function zn(t){let e=t?.shell,n=e&&typeof e=="object"?e.bins:void 0;if(!n||typeof n!="object"||Array.isArray(n))return;let r={};for(let[o,i]of Object.entries(n))typeof i=="string"&&i.length>0&&(r[o]=i);return Object.keys(r).length>0?r:void 0}a(zn,"shellToolkitBins");var d_=/[*?]/,Pm=64;async function u_(t,e){let n=e.replace(/\\/g,"/").replace(/^\.\//,"");if(!n||n.includes("\0"))throw new ne(`glob \u4E0D\u80FD\u4E3A\u7A7A\u6216\u5305\u542B NUL \u5B57\u7B26: ${e}`,"INVALID_RELATIVE_PATH");if(Ht.posix.isAbsolute(n)||/^[a-zA-Z]:/.test(n))throw new ne(`glob \u4E0D\u5141\u8BB8\u7EDD\u5BF9\u8DEF\u5F84: ${e}`,"ABSOLUTE_PATH");let r=n.split("/").filter(f=>f!==""&&f!==".");if(r.some(f=>f===".."))throw new ne(`glob \u4E0D\u80FD\u5305\u542B ..: ${e}`,"OUTSIDE_ROOT");let o=r.findIndex(f=>d_.test(f));o===-1&&(o=r.length-1);let i=r.slice(0,o),s=r.slice(o),c=i.length>0?xe(t,i.join("/")):Ht.resolve(t),l=f_(s),d=[];await $m(c,"",s.includes("**")?Pm:Math.min(s.length,Pm),l,d);let u=i.join("/");return d.map(f=>u?`${u}/${f}`:f).sort()}a(u_,"globMatches");function f_(t){let e="^";return t.forEach((n,r)=>{let o=r===t.length-1;if(n==="**")e+=o?"(?:[^/]+/)*[^/]+":"(?:[^/]+/)*";else for(let i of n)i==="*"?e+="[^/]*":i==="?"?e+="[^/]":e+=p_(i);!o&&n!=="**"&&(e+="/")}),new RegExp(`${e}$`)}a(f_,"globSegmentsToRegExp");function p_(t){return/[.+^${}()|[\]\\]/.test(t)?`\\${t}`:t}a(p_,"escapeRegExpChar");async function $m(t,e,n,r,o){if(n<=0)return;let i;try{i=await s_(t,{withFileTypes:!0})}catch{return}for(let s of i){if(s.name.startsWith(".")||Dc.has(s.name))continue;let c=e?`${e}/${s.name}`:s.name;s.isDirectory()?await $m(Ht.join(t,s.name),c,n-1,r,o):s.isFile()&&r.test(c)&&o.push(c)}}a($m,"walkForGlob");async function Mm(t){let{configDir:e,collection:n,compile:r,bins:o,onProgress:i}=t,s=t.runner??K;if(r.inputs.length>0){let d=[];for(let u of r.inputs)(await u_(e,u)).length>0&&d.push(u);if(d.length===0){let u=`\u77E5\u8BC6\u6E90\u7F3A\u5931: ${r.inputs.join(", ")}\uFF08configDir \u4E0B\u5168\u90E8\u96F6\u547D\u4E2D\uFF09`;return m.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u524D\u7F6E\u68C0\u67E5\u5931\u8D25",{collection:n,inputs:r.inputs}),i?.("failed",u),{collection:n,action:"failed",error:u}}}for(let[d,u]of r.build.entries()){let f=`${u.bin}${u.args.length>0?` ${u.args.join(" ")}`:""}`;i?.("building",`[${d+1}/${r.build.length}] ${f}`);let p;try{p=l_(u.bin,{...o?{bins:o}:{},configDir:e})}catch(h){let y=h instanceof Error?h.message:String(h);return{collection:n,action:"failed",error:`bin \u89E3\u6790\u5931\u8D25\uFF08${u.bin}\uFF09: ${y}`}}let g;try{g=await s(p,[...u.args],{cwd:e,timeoutMs:u.timeout_ms??a_})}catch(h){let y=g_(n,f,h);return m.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5F02\u5E38",{collection:n,bin:u.bin,error:y}),i?.("failed",f),{collection:n,action:"failed",error:y}}if(g.exitCode!==0){let h=Se(g.stderr),y=`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u975E\u96F6\u9000\u51FA\uFF08collection=${n}, exitCode=${g.exitCode}\uFF09: ${f}`+(h?`
|
|
440
|
+
${h}`:"");return m.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5931\u8D25",{collection:n,bin:u.bin,exitCode:g.exitCode}),i?.("failed",`${f} \u9000\u51FA\u7801 ${g.exitCode}`),{collection:n,action:"failed",error:y}}}let c=Ht.resolve(e,n),l;try{l=xe(c,r.artifact)}catch(d){let u=d instanceof Error?d.message:String(d);return{collection:n,action:"failed",error:`compile.artifact \u914D\u7F6E\u975E\u6CD5: ${u}`}}try{await i_(l)}catch{let d=`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u5168\u90E8\u6210\u529F\uFF0C\u4F46\u672A\u4EA7\u51FA\u58F0\u660E\u7684\u4EA7\u7269: ${r.artifact}\uFF08\u671F\u671B\u4F4D\u7F6E ${Ht.relative(e,l)||r.artifact}\uFF09\u3002\u8BF7\u68C0\u67E5 build \u811A\u672C\u662F\u5426\u771F\u7684\u5199\u4E86\u8BE5\u6587\u4EF6\u3002`;return i?.("failed",`\u4EA7\u7269\u7F3A\u5931: ${r.artifact}`),{collection:n,action:"failed",error:d}}return i?.("done",`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210\uFF08${r.build.length} \u6761\u547D\u4EE4\uFF09`),m.info("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u5B8C\u6210",{collection:n,commands:r.build.length}),{collection:n,action:"compiled"}}a(Mm,"runCustomBuild");function g_(t,e,n){if(n instanceof or)return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u8D85\u65F6\uFF08collection=${t}\uFF09: ${e}\uFF08\u53EF\u7528 compile.build[].timeout_ms \u8C03\u5927\uFF09`;let r=n instanceof Error?n.message:String(n);return`\u81EA\u5B9A\u4E49\u7F16\u8BD1\u547D\u4EE4\u6267\u884C\u5931\u8D25\uFF08collection=${t}\uFF09: ${e} \u2014 ${r}`}a(g_,"toBuildError");async function m_(t,e,n){let r=[];for(let o of e){let i=Mt(t,o.collection);n?.({collection:o.collection,index:0,total:0,phase:"ingest",detail:o.source});try{let s=await Wn({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`;m.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?(m.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})):(m.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);m.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(m_,"ingestRemoteSources");function h_(t){return typeof t=="string"?{collection:t}:t}a(h_,"normalizeEntry");function It(t){return(t.compile?.build?.length??0)>0}a(It,"isCustomCompile");async function Jt(t){let{configDir:e,force:n,agent:r,configPath:o,model:i,timeoutMsPerFile:s,batchSize:c,bins:l,onProgress:d}=t,u=t.collections.map(h_),f=[];for(let h of u)typeof h.source=="string"&&h.source.length>0&&f.push({source:h.source,collection:h.collection});f.length>0&&await m_(e,f,d);let p=[],g=u.length;for(let[h,y]of u.entries()){let w=y.collection;if(It(y)){let A=await Mm({configDir:e,collection:w,compile:y.compile,...l?{bins:l}:{},onProgress:a((T,I)=>d?.({collection:w,index:h,total:g,phase:T,detail:I}),"onProgress")});p.push(A);continue}let b=await Rt(Mt(e,w)),v=await hn(e,w),R=bt({configDir:e,entry:w}),S=v?.taxonomyHash!==void 0&&v.taxonomyHash!==gr(R),C=v?.taxonomyIndexHash!==void 0&&v.taxonomyIndexHash!==_o(R);if(!n&&!S&&!C&&!Si(v,b)){d?.({collection:w,index:h,total:g,phase:"skipped",detail:"\u6E90\u672A\u53D8\u66F4"}),p.push({collection:w,action:"skipped"});continue}(S||C)&&m.info("kb","taxonomy \u53D8\u66F4\uFF0C\u6E90\u672A\u53D8\u66F4\u4E5F\u91CD\u65B0\u7F16\u8BD1",{collection:w,scope:S?"structure":"index-only"});let _=await Dm({configDir:e,entry:w,...r?{agent:r}:{},...o?{configPath:o}:{},...i?{model:i}:{},...s?{timeoutMsPerFile:s}:{},...c?{batchSize:c}:{},...n?{forceFull:!0}:{},onProgress:a(((A,T)=>d?.({collection:w,index:h,total:g,phase:A,detail:T})),"onProgress")});_.status==="failed"?p.push({collection:w,action:"failed",report:_,..._.error?{error:_.error}:{}}):p.push({collection:w,action:"compiled",report:_})}return p}a(Jt,"refreshKnowledgeBases");import{access as y_,readdir as w_}from"fs/promises";import b_ from"path";async function Li(t){let{configDir:e,targets:n,workflows:r}=t,o=[];if(n.length===0)return o;let i=null;for(let s of n){let c;try{c=xe(b_.resolve(e,s.collection),s.artifact)}catch(f){let p=f instanceof ne?`\u77E5\u8BC6\u5E93 compile.artifact \u914D\u7F6E\u8D8A\u754C\uFF08${s.collection}: ${s.artifact}\uFF09`:`\u77E5\u8BC6\u5E93 compile.artifact \u89E3\u6790\u5931\u8D25\uFF08${s.collection}\uFF09: ${f instanceof Error?f.message:String(f)}`;o.push({level:"error",message:p,collection:s.collection});continue}let l=!0;try{await y_(c)}catch{l=!1}if(l)continue;i??=await k_(r);let d=[...i.entries()].filter(([,f])=>f.some(p=>s.roleIds.includes(p))).map(([f])=>f),u=`\u77E5\u8BC6\u5E93\u4EA7\u7269\u7F3A\u5931: ${s.collection} \u7684\u7F16\u8BD1\u4EA7\u7269 ${s.artifact} \u4E0D\u5B58\u5728\uFF08\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u4E86 compile.build \u5374\u672A\u4EA7\u51FA artifact\uFF09\u2014\u2014\u8BF7\u5148\u8DD1 setup \u6216 kb compile`;if(d.length===0)o.push({level:"error",message:u,collection:s.collection});else for(let f of d)o.push({level:"error",workflowId:f,message:u,collection:s.collection});m.warn("kb","\u81EA\u5B9A\u4E49\u7F16\u8BD1\u4EA7\u7269\u7F3A\u5931",{collection:s.collection,artifact:s.artifact,consumers:d})}return o}a(Li,"checkKbCompileArtifacts");async function k_(t){let e=await Promise.all(t.map(async n=>{let r=await v_(n.recipeDir),o=await Promise.all(r.map(async s=>(await $n(n.recipeDir,s)).definition?.meta?.role)),i=new Set;for(let s of o)typeof s=="string"&&s.trim()&&i.add(s.trim());return{id:n.id,roles:[...i]}}));return new Map(e.map(n=>[n.id,n.roles]))}a(k_,"resolveWorkflowRoleBindings");async function v_(t){let e;try{e=await w_(t)}catch{return[]}let n=new Set;for(let r of e){let o=r.match(/^(.+)\.recipe\.(?:ts|js)$/);o&&n.add(o[1])}return[...n]}a(v_,"listRecipeIds");var I_=/^\$\{globalVar\.[^}]+\}$/,T_=/^\$\{env\.([A-Za-z_][A-Za-z0-9_]*)(\?)?\}$/;function __(t){return t==null?!0:typeof t=="string"?t.trim()==="":Array.isArray(t)?t.length===0:typeof t=="object"?Object.keys(t).length===0:!1}a(__,"isKbValidateValueEmpty");function A_(t,e){if(!t)return{found:!1,reason:"missing"};let n=e.split(".").filter(o=>o.length>0);if(n.length===0)return{found:!1,reason:"invalid_path"};let r=t;for(let o of n){if(r===null||typeof r!="object"||Array.isArray(r))return{found:!1,reason:"invalid_path"};let i=r;if(!(o in i))return{found:!1,reason:"missing"};r=i[o]}return{found:!0,value:r}}a(A_,"getKbCustomByPath");function Om(t,e,n,r){Array.isArray(r)&&r.forEach((o,i)=>{let s=ec.safeParse(o);!s.success||typeof s.data=="string"||s.data.compile&&t.push({roleId:e,file:n,index:i,entry:s.data})})}a(Om,"pushParsedEntries");function jm(t){if(!t||typeof t!="object"||Array.isArray(t))return;let e=t.knowledge_scope;if(!(!e||typeof e!="object"||Array.isArray(e)))return e.kb_collections}a(jm,"rawKbCollectionsOf");function E_(t,e,n){let r=[];if(e?.roles){for(let[i,s]of Object.entries(e.roles))Om(r,i,"profile/profile.yml",jm(s));return r}let o;try{o=x_(n)}catch{return r}for(let i of o.sort()){if(!i.endsWith(".role.yml"))continue;let s;try{s=C_.parse(R_(S_.join(n,i),"utf8"))}catch{continue}let c=s&&typeof s=="object"&&typeof s.id=="string"?s.id:i.replace(/\.role\.yml$/,"");Om(r,c,`roles/${i}`,jm(s))}return r}a(E_,"collectEntryContexts");function Lm(t){return[...t.file==="profile/profile.yml"?["roles",t.roleId,"knowledge_scope","kb_collections",t.index]:["knowledge_scope","kb_collections",t.index],"compile","custom"]}a(Lm,"yamlPathPrefixFor");function Fm(t,e){let n=e.split(".").filter(r=>r.length>0);return{type:"yaml",file:t.file,yamlPath:[...Lm(t),...n],valueType:"string"}}a(Fm,"yamlWriteTargetFor");function Wm(t,e,n,r,o,i){if(n==null||r&&i.has(r))return;let s=typeof n=="string"||typeof n=="number"||typeof n=="boolean",c=Array.isArray(n)&&n.every(u=>typeof u=="string");if(!s&&!c){if(Array.isArray(n))return;for(let[u,f]of Object.entries(n))Wm(t,e,f,r?`${r}.${u}`:u,[...o,u],i);return}let l={type:"yaml",file:e.file,yamlPath:[...Lm(e),...o],...c?{valueType:"string[]"}:{valueType:"string"}},d=`kb_compile.${e.roleId}.${e.entry.collection}.custom.${r}`;t.push({key:d,status:"ok",value:n,writeTarget:l,surface:{key:d,label:`${e.entry.collection} \xB7 ${r}`,description:`\u77E5\u8BC6\u5E93 ${e.entry.collection} \u79C1\u6709\u914D\u7F6E compile.custom.${r}\uFF08\u53EF\u7559\u7A7A\uFF09`,owner:"framework",source:"project",required:!1,editable:!0,allowEmpty:!0,defaultStrategy:"none",valueType:c?"string[]":"string",writeTarget:l}})}a(Wm,"pushCustomLeafItems");function Nm(t,e,n){return{key:t.key,label:`\u77E5\u8BC6\u5E93 ${t.collection} \xB7 ${t.dotPath}`,description:`\u77E5\u8BC6\u5E93 ${t.collection} \u7684\u5FC5\u586B\u914D\u7F6E compile.custom.${t.dotPath}`+(n?"\uFF08\u5F53\u524D\u5F15\u7528\u4E86\u672A\u8BBE\u7F6E\u7684\u73AF\u5883\u53D8\u91CF\uFF0C\u586B\u5199\u540E\u5199\u5165 .env\uFF09":"\uFF08\u5199\u5165 profile \u7684 compile.custom\uFF09"),owner:n?"env":"framework",source:n?"env":"project",required:!0,editable:!0,allowEmpty:!1,defaultStrategy:"none",valueType:"string",writeTarget:e}}a(Nm,"validateSurface");async function Bm(t){let{configDir:e,profileConfig:n,rolesDir:r,workflowEntries:o}=t,i=E_(e,n,r);if(i.length===0)return null;let s=[],c=a(y=>`kb_compile.${y.roleId}.${y.entry.collection}`,"keyPrefixOf"),l=new Map,d=a((y,w)=>{let b=l.get(y);b||l.set(y,b=new Set),b.add(w)},"rememberEmitted");for(let y of i){let w=y.entry.compile;for(let b of w.validate){let v=`${c(y)}.validate.${b}`,R=A_(w.custom,b);if(!R.found){let _=Fm(y,b),A=R.reason==="invalid_path"?"validate \u8DEF\u5F84\u4E2D\u9014\u7A7F\u8FC7\u6807\u91CF/\u6570\u7EC4\uFF0C\u4E0E compile.custom \u7684\u5B9E\u9645\u7ED3\u6784\u4E0D\u5339\u914D\uFF08\u586B\u5199\u5C06\u6309 validate \u8DEF\u5F84\u91CD\u5EFA\u7ED3\u6784\uFF09":"compile.custom \u4E2D\u4E0D\u5B58\u5728\u8BE5\u8DEF\u5F84\uFF08\u586B\u5199\u540E\u81EA\u52A8\u521B\u5EFA\uFF09";s.push({key:v,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: validate \u767B\u8BB0\u7684\u5FC5\u586B\u8DEF\u5F84\u300C${b}\u300D\u65E0\u6CD5\u53D6\u503C \u2014\u2014 ${A}`,writeTarget:_,surface:Nm({key:v,collection:y.entry.collection,dotPath:b},_,!1)}),d(y,b);continue}let S=R.value;if(typeof S=="string"&&I_.test(S))continue;let C=typeof S=="string"?S.match(T_):null;if(C||__(S)){let _=C?{type:"env",file:".env",envKey:C[1]}:Fm(y,b);s.push({key:v,status:"error",message:`\u77E5\u8BC6\u5E93 ${y.entry.collection}: \u5FC5\u586B\u503C\u4E3A\u7A7A compile.custom.${b}`+(C?`\uFF08\u5F15\u7528\u7684\u73AF\u5883\u53D8\u91CF\u672A\u8BBE\u7F6E: ${S}\uFF0C\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\u5199\u5165 .env\uFF0C\u6216\u76F4\u63A5\u5728\u73AF\u5883\u4E2D\u914D\u7F6E\uFF09`:"\uFF08\u8BF7\u5728\u4E0B\u65B9\u586B\u5199\uFF0C\u5199\u5165 profile \u7684 compile.custom\uFF09"),writeTarget:_,surface:Nm({key:v,collection:y.entry.collection,dotPath:b},_,!!C)}),d(y,b)}}}for(let y of i)Wm(s,y,y.entry.compile.custom??{},"",[],l.get(y)??new Set);let u=new Map;for(let y of i){let w=u.get(y.entry.collection);w?w.roleIds.push(y.roleId):u.set(y.entry.collection,{collection:y.entry.collection,compile:y.entry.compile,roleIds:[y.roleId]})}let f=[...u.values()],p=f.filter(It).map(y=>({collection:y.collection,artifact:y.compile.artifact,roleIds:y.roleIds})),g=await Li({configDir:e,targets:p,workflows:o.map(y=>({id:y.id,recipeDir:y.recipeDir}))}),h=new Map(f.map(y=>[y.collection,y.roleIds[0]??""]));for(let y of g)s.push({key:`kb_compile.${h.get(y.collection)??""}.artifact.${s.length}`,status:"warn",message:(y.workflowId?`[${y.workflowId}] `:"")+`\u7F16\u8BD1\u4EA7\u7269\u5C1A\u672A\u751F\u6210: ${y.message.replace(/^知识库产物缺失: /,"")}\uFF08config \u9636\u6BB5\u672A\u7F16\u8BD1\u5C5E\u9884\u671F\uFF1Bsetup \u7684 KB \u9636\u6BB5\u4F1A\u7F16\u8BD1\u4EA7\u51FA\uFF0C\u82E5 setup \u540E\u4ECD\u7F3A\u5931\uFF0Crun \u542F\u52A8\u5C06\u963B\u65AD\u5BF9\u5E94\u5DE5\u4F5C\u6D41\uFF09`});for(let y of f){let w=`kb_compile.${y.roleIds[0]??""}.${y.collection}.`;s.some(v=>v.status==="error"&&v.key.startsWith(w))||s.push({key:`kb_compile.${y.roleIds[0]??""}.${y.collection}`,status:"ok",message:`\u77E5\u8BC6\u5E93 ${y.collection}: \u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E\u5B8C\u6574\uFF08${y.compile.build.length} \u6761 build \u547D\u4EE4\uFF0Cvalidate ${y.compile.validate.length} \u9879\u901A\u8FC7\uFF09`})}return{id:"profile",name:"\u77E5\u8BC6\u5E93\u81EA\u5B9A\u4E49\u7F16\u8BD1\u58F0\u660E",ok:!s.some(y=>y.status==="error"),items:s}}a(Bm,"checkKbCompile");async function Bi(t){let e=await Te(t.configPath),n=Un.dirname(e),r;try{r=await Wi(e,"utf8")}catch(x){return D_(t.configPath,`\u65E0\u6CD5\u8BFB\u53D6\u914D\u7F6E\u6587\u4EF6: ${x instanceof Error?x.message:String(x)}`)}let o=await oi(n);pn();let i=null,s=null;try{i=Xe(n,o,{lenientEnv:!0})}catch(x){s=x instanceof Error?x.message:String(x)}let c="";try{c=await Wi(Un.resolve(n,"profile","profile.yml"),"utf8")}catch{}let l=null,d=null;try{l=await _e(t.configPath)}catch(x){d=x instanceof Error?x.message:String(x)}let u=[];l?u=l.workflowEntries:u=$_(n,r),t.workflowId&&(u=u.filter(x=>x.id===t.workflowId));let f=[];for(let x of u)try{let D=await Wi(x.templatePath,"utf8");f.push({id:x.id,text:D})}catch{}let p=[];l?(p.push(rg(l)),p.push(await sg(l,{engineExplicitlySet:P_(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 Rc(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 g=l?l.rolesDir:Un.resolve(n,"./roles"),h=l?l.roles.enabled:!0;p.push(await Tg(g,h,n,i));let y=await $r(n);y.present&&p.push(_c(y));let w=await Bm({configDir:n,profileConfig:i,rolesDir:g,workflowEntries:u});w&&p.push(w);let b=Dr([r,c,...f.map(x=>x.text)]),v="";try{v=await Wi(Un.resolve(n,".env.example"),"utf8")}catch{}let R=c?[...f,{id:"__profile__",text:c}]:f,S=Dg(r,R),C=new Map;for(let[x,{toolkit:D,field:j}]of S){let L=gt.find(ue=>ue.name===D);if(!L)continue;let W=mn(L.configSchema);if(!W||!W[j])continue;let V=Tc(W[j]);V&&C.set(x,V)}p.push(Ic(r,R,o,v,b,C));let _=p.reduce((x,D)=>x+D.items.filter(j=>j.status==="error").length,0),A=p.reduce((x,D)=>x+D.items.filter(j=>j.status==="warn").length,0),T=p.reduce((x,D)=>x+D.items.filter(j=>j.status==="suggestion").length,0),I=p.filter(x=>x.ok).length;return{projectPath:t.configPath,ok:p.every(x=>x.ok),modules:p,summary:{totalModules:p.length,passedModules:I,errors:_,warnings:A,suggestions:T}}}a(Bi,"runCheck");function D_(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(D_,"errorResult");function P_(t){try{let e=zm.parse(t);if(!k(e))return!1;let n=e.agent;if(!k(n))return!1;let r=n.engine;return typeof r=="string"&&r.trim().length>0}catch{return!1}}a(P_,"isEngineExplicitlySet");function $_(t,e){try{let n=zm.parse(e);if(!k(n))return[];if(k(n.workflow)){let r=n.workflow.template,o=n.workflow.recipe_dir??"./recipes";if(typeof r=="string")return[{id:"default",templatePath:Un.resolve(t,r),recipeDir:Un.resolve(t,String(o))}]}if(k(n.workflows)&&typeof n.workflows.dir=="string")return[]}catch{}return[]}a($_,"inferWorkflowEntries");import{readFile as sl,writeFile as Ui}from"fs/promises";import M_ from"yaml";function Um(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(Um,"coerceYamlValue");function O_(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(O_,"coerceJsonValue");async function zi(t,e,n){let r;try{r=await sl(t,"utf8")}catch{r=""}let o=M_.parseDocument(r);o.setIn(e,n),await Ui(t,o.toString(),"utf8")}a(zi,"writeYaml");async function j_(t,e,n){let r;try{r=await sl(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(`^${N_(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?`
|
|
439
441
|
`:"")+i+`
|
|
440
|
-
`,await
|
|
441
|
-
`,"utf8")}a(
|
|
442
|
+
`,await Ui(t,r,"utf8")}a(j_,"writeEnvFile");async function al(t,e,n){let r;try{r=await sl(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)}F_(o,e,n),await Ui(t,JSON.stringify(o,null,2)+`
|
|
443
|
+
`,"utf8")}a(al,"writeJsonFile");function F_(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(F_,"setInJson");async function cl(t,e,n){let r=await import("path");if(t.type==="yaml")await zi(r.resolve(n,t.file),t.yamlPath,Um(e,t.valueType));else if(t.type==="yamlAll")for(let o of t.targets)await zi(r.resolve(n,o.file),o.yamlPath,Um(e,t.valueType));else t.type==="json"?await al(r.resolve(n,t.file),t.jsonPath,O_(e,t.valueType)):t.type==="textFile"?await Ui(r.resolve(n,t.file),e.endsWith(`
|
|
442
444
|
`)?e:e+`
|
|
443
|
-
`,"utf8"):await
|
|
444
|
-
`}a(
|
|
445
|
-
`)}a(
|
|
445
|
+
`,"utf8"):await j_(r.resolve(n,t.file),t.envKey,e)}a(cl,"writeBack");function N_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(N_,"escapeRegex");import{readFile as Vm,writeFile as L_,readdir as W_,stat as B_}from"fs/promises";import Vi from"path";import Km,{isScalar as Ki,visit as z_}from"yaml";var U_=new Set(["baseId","base_id"]),V_=new Set(["tableId","table_id"]);async function ll(t,e){let n;try{n=await Vm(t,"utf8")}catch{return}let r;try{r=Km.parse(n)}catch{return}let o=r;for(let i of e)if(Array.isArray(o)&&typeof i=="number")o=o[i];else if(k(o))o=o[String(i)];else return;return typeof o=="string"?o:void 0}a(ll,"readYamlValueAt");async function dl(t,e=[]){let n=[...e,Vi.join(t,"aitable-workflow.config.yml"),Vi.join(t,"profile","profile.yml")],r=Vi.join(t,"workflows");try{let i=await W_(r,{withFileTypes:!0});for(let s of i)s.isDirectory()&&n.push(Vi.join(r,s.name,"workflow.yml"))}catch{}let o=[];for(let i of n)try{(await B_(i)).isFile()&&o.push(i)}catch{}return[...new Set(o)]}a(dl,"collectBaseIdCandidateFiles");async function ul(t,e,n){let r=e.trim(),o=n.trim();if(!r||!o||r===o)return{migratedFields:0,clearedTableIds:0,changedFiles:[]};let i=0,s=0,c=[];for(let l of t){let d;try{d=await Vm(l,"utf8")}catch{continue}let u;try{u=Km.parseDocument(d)}catch{continue}if(u.contents===null)continue;let f=0,p=0;z_(u,{Map(g,h){let y=!1;for(let w of h.items)Ki(w.key)&&U_.has(String(w.key.value))&&Ki(w.value)&&typeof w.value.value=="string"&&w.value.value.trim()===r&&(w.value.value=o,f++,y=!0);if(y)for(let w of h.items)Ki(w.key)&&V_.has(String(w.key.value))&&Ki(w.value)&&typeof w.value.value=="string"&&w.value.value.trim()!==""&&!Bt(w.value.value)&&(w.value.value="",p++)}}),f>0&&(await L_(l,u.toString(),"utf8"),i+=f,s+=p,c.push(l))}return{migratedFields:i,clearedTableIds:s,changedFiles:c}}a(ul,"migrateBaseIdInFiles");import fl from"path";import{writeFile as K_,mkdir as q_,access as H_}from"fs/promises";import qi from"path";function et(t){switch(t){case"claudecode":return{enabled:!0,cmd:"claude"};case"codex":return{enabled:!0,cmd:"codex",model:"gpt-5.5",permissionMode:"bypassPermissions",mode:"full-auto",ignoreUserConfig:!0};case"qoder":return{enabled:!0,cmd:"qodercli",permissionMode:"bypassPermissions"};case"codebuddy":return{enabled:!0,cmd:"codebuddy"};case"opencode":return{enabled:!0,cmd:"opencode"};case"qwen":return{enabled:!0,cmd:"qwen"};case"deepseek":return{enabled:!0,cmd:"deepseek"};case"trae":return{enabled:!0,cmd:"trae-cli"};default:return{enabled:!0}}}a(et,"getDefaultAgentEntry");function qm(t){let e={version:1,agents:{claudecode:t==="claudecode"?et("claudecode"):{enabled:!1},codex:t==="codex"?et("codex"):{enabled:!1},qoder:t==="qoder"?et("qoder"):{enabled:!1},codebuddy:t==="codebuddy"?et("codebuddy"):{enabled:!1},opencode:t==="opencode"?et("opencode"):{enabled:!1},qwen:t==="qwen"?et("qwen"):{enabled:!1},deepseek:t==="deepseek"?et("deepseek"):{enabled:!1},trae:t==="trae"?et("trae"):{enabled:!1},qwenwork:t==="qwenwork"?et("qwenwork"):{enabled:!1}}};return JSON.stringify(e,null,2)+`
|
|
446
|
+
`}a(qm,"generateCodingAgentsConfig");function Hm(t){let e=J_(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: |",G_(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","workflows:",' dir: "./workflows"',"","# \u2500\u2500\u2500 Agent \u5F15\u64CE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500","# agent.engine: Coding Agent \u9009\u578B\u7684\u552F\u4E00\u771F\u6E90\uFF08design \u4E0E\u8FD0\u884C\u65F6\u7EDF\u4E00\u8D70\u5B83\uFF09\uFF1B","# coding-agents.config.json \u53EA\u63D0\u4F9B\u8BE5\u5F15\u64CE\u7684 CLI \u9002\u914D\u53C2\u6570\uFF08cmd/args/permissionMode \u7B49\uFF09","# agent.timeout_ms: Design \u9636\u6BB5\u4E0E Coding Agent \u6267\u884C\u8D85\u65F6\uFF1B\u8FD0\u884C\u65F6\u4EE5\u672C\u914D\u7F6E\u6587\u4EF6\u4E3A\u51C6","agent:",` engine: ${e}`," max_concurrent: 3"," timeout_ms: 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(`
|
|
447
|
+
`)}a(Hm,"generateMainConfig");async function Hi(t){let{answers:e,cwd:n,force:r=!1}=t,o={files:[],dirs:[],skipped:[]},i=[qi.join(n,"workflows")];for(let c of i)await q_(c,{recursive:!0}),o.dirs.push(c);let s=[{path:qi.join(n,"coding-agents.config.json"),content:qm(e.agentType)},{path:qi.join(n,"aitable-workflow.config.yml"),content:Hm(e)},{path:qi.join(n,"workflows",".gitkeep"),content:""}];for(let c of s){if(!r&&await Z_(c.path)){o.skipped.push(c.path);continue}await K_(c.path,c.content,"utf8"),o.files.push(c.path)}return o}a(Hi,"scaffold");function J_(t){switch(t){case"claudecode":return"claude";case"codex":return"codex";case"qoder":return"qoder";case"codebuddy":return"codebuddy";case"opencode":return"opencode";case"qwen":return"qwen";case"deepseek":return"deepseek";case"trae":return"trae";case"qwenwork":return"qwenwork";default:return"claude"}}a(J_,"agentTypeToEngine");function G_(t,e){let n=" ".repeat(e);return t.split(`
|
|
446
448
|
`).map(r=>n+r).join(`
|
|
447
|
-
`)}a(
|
|
448
|
-
`))n.push(`${e}${o}`);return n.length===0&&n.push(`${e}(\u7A7A\u6D88\u606F)`),n}a(
|
|
449
|
-
`)}a(
|
|
450
|
-
`,"utf8"),this.pruneOnce()}catch(n){this.onError?.(`thread \u65E5\u5FD7\u5199\u5165\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u5165\u7AD9\u5904\u7406\uFF09: ${n instanceof Error?n.message:String(n)}`)}}pruneOnce(){let e=
|
|
451
|
-
`)){if(!g.trim())continue;let h;try{h=JSON.parse(g)}catch{continue}h.kind==="msg"&&(d.push({openMessageId:h.openMessageId,conversationId:h.cid,groupName:h.groupName,senderName:h.senderName,senderOpenDingTalkId:h.senderOpenDingTalkId,createTime:h.ts,content:h.content,images:h.images,...h.quotedMessageId?{quotedMessageId:h.quotedMessageId}:{},role:h.identity==="bot"?"bot":"unknown"}),s+=1)}}}d.sort((u,f)=>u.createTime-f.createTime);for(let u of d)this.onMessage(u,o),c.push(...this.drainClosed(u.createTime,o));return{files:i,messages:s,drainedSnapshots:c}}decide(e,n){let r=[],o=[];n.answererIds.size===0&&n.answererNameKeys.size===0&&r.push("missing_answerers"),n.botNameKeys.size===0&&r.push("missing_bots");let i=this.msgIndex.get(e.openMessageId);if(i&&this.open.has(i))return{reason:"duplicate",threadId:i,candidateThreadIds:[],warnings:r};if(e.quotedMessageId){let d=this.msgIndex.get(e.quotedMessageId);if(d&&this.open.has(d))return{reason:"quoted_message",threadId:d,matchedMessageId:e.quotedMessageId,candidateThreadIds:[],warnings:r};r.push("quoted_parent_missing")}let s=e.conversationId,c=Ke(e.senderName),l=[...this.byConversation.get(s)??[]].filter(d=>this.open.has(d));if(this.opts.enableMentionMerge){let d=this.matchMention(e,c,l,o,r);if(d)return{...d,candidateThreadIds:o,warnings:r}}if(this.opts.enableHeuristicMerge){let d=this.lastBySender.get(this.senderKey(e));if(d!==void 0&&e.createTime-d<=this.opts.sameSenderWindowMs){let u=this.latestThreadOf(l,o,f=>f.messages.some(p=>(p.senderOpenDingTalkId||p.senderName)===(e.senderOpenDingTalkId||e.senderName)));if(u)return r.push("heuristic_merge","same_sender_window"),{reason:"same_sender_window",threadId:u,candidateThreadIds:o,warnings:r}}if(l.length===1){let u=this.open.get(l[0]);if(o.push(u.threadId),e.createTime-u.lastActivityAt<=this.opts.adjacentWindowMs)return r.push("heuristic_merge","single_active_adjacent"),{reason:"single_active_adjacent",threadId:u.threadId,candidateThreadIds:o,warnings:r}}}if(e.role!=="bot"){let d=this.forcedAskerFor(e,n);if(d)return r.push("answerer_forced_asker"),{reason:"answerer_mentions_user",matchedName:d,forcedAskerName:d,candidateThreadIds:o,warnings:r}}return{reason:"new_thread",candidateThreadIds:o,warnings:r}}matchMention(e,n,r,o,i){let s=a(u=>{let f,p=0;for(let g of r){let h=this.open.get(g);!h||!u(h)||(p+=1,o.includes(h.threadId)||o.push(h.threadId),(!f||h.lastActivityAt>f.lastActivityAt)&&(f=h))}return f?{thread:f,hits:p}:null},"pick"),l=s(u=>Ke(u.askerName)===n||u.participants.has(n)?this.addressesName(e.content,u.askerName)||[...u.participants].some(p=>p!==n&&this.addressesName(e.content,p)):!1)??s(u=>!u.askerIsBot&&this.addressesName(e.content,u.askerName));if(l)return i.push("mention_merge"),l.hits>1&&i.push("multiple_name_candidates"),this.opts.maxOpenMs-(e.createTime-l.thread.openedAt)<
|
|
452
|
-
`,"utf8"),await
|
|
453
|
-
`);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=ye(c);n.push(...l);let d=
|
|
454
|
-
\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 f_={maxAttempts:3,baseBackoffMs:2e3,maxBackoffMs:6e4,maxStepFailures:5},es=class{static{a(this,"RetryScheduler")}config;failureCounter=new Map;constructor(e){this.config={...f_,...e}}getBackoffMs(e){return Math.min(this.config.baseBackoffMs*2**e,this.config.maxBackoffMs)}shouldRetry(e){return e<this.config.maxAttempts-1}isExhausted(e,n){let r=this.failureCounter.get(e);return!!(r&&r.stepId===n&&r.count>=this.config.maxStepFailures)}hasFailures(e){return this.failureCounter.has(e)}recordFailure(e,n){let r=this.failureCounter.get(e);r&&r.stepId===n?r.count+=1:this.failureCounter.set(e,{stepId:n,count:1})}clearFailures(e){this.failureCounter.delete(e)}};function Ym(t){return t.steps.some(e=>!e.auto)}a(Ym,"hasHumanStep");function Qm(t,e){if(!Ym(e))return{kind:"none"};let n=t.tracker.states.review;if(n)return{kind:"explicit",state:n};let r=t.tracker.states.active;if(r[1])return{kind:"legacy",state:r[1],source:"active[1]"};if(r[0])return{kind:"legacy",state:r[0],source:"active[0]"};throw new Error(`\u5DE5\u4F5C\u6D41 ${e.meta.name} \u542B\u4EBA\u5DE5\u6B65\u9AA4\uFF0C\u4F46 tracker \u65E2\u672A\u58F0\u660E states.review\u3001active \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u786E\u5B9A\u4EBA\u5DE5\u5BA1\u6838\u72B6\u6001`)}a(Qm,"resolveReviewStateDetailed");var Zm=new WeakSet;function Br(t,e){let n=Qm(t,e);return n.kind==="none"?null:(n.kind==="legacy"&&!Zm.has(e)&&(Zm.add(e),m.warn("review-state",`\u5DE5\u4F5C\u6D41\u542B\u4EBA\u5DE5\u6B65\u9AA4\u4F46\u672A\u58F0\u660E tracker.states.review\uFF0C\u5DF2\u56DE\u9000\u5230 ${n.source}="${n.state}"\uFF08\u65E7\u5DE5\u4F5C\u6D41\u517C\u5BB9\uFF09\uFF0C\u8BF7\u663E\u5F0F\u58F0\u660E states.review`,{workflow:e.meta.name,fallbackSource:n.source,reviewState:n.state,...n.source==="active[0]"?{risk:"\u5BA1\u6838\u6001\u4E0E\u5904\u7406\u4E2D\u72B6\u6001\u91CD\u5408\uFF0C\u4EBA\u5DE5\u6B65\u9AA4\u4F1A\u6C38\u4E45\u505C\u5728\u7B49\u5F85\u5BA1\u6838"}:{}})),n.state)}a(Br,"resolveReviewState");var Xm="__human_prepared",ts=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 Yo({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 es(r)}get reviewState(){let e=Br(this.settings,this.workflow);if(e===null)throw new Error(`\u5DE5\u4F5C\u6D41 ${this.workflow.meta.name} \u4E0D\u542B\u4EBA\u5DE5\u6B65\u9AA4\uFF0C\u4E0D\u5E94\u8BBF\u95EE\u4EBA\u5DE5\u5BA1\u6838\u72B6\u6001`);return e}async processItem(e,n){let r={},o={recorded:!1,forceReplay:!!this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart},i=this.resolveCurrentStep(e);if(!i)return m.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 m.debug("step-engine","\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838",{itemId:e.id,stepId:n.id}),null;if(n.recipe&&!this.hasHumanStepPrepared(e,n,r))return await this.executeHumanStepRecipe(e,n,r,o,i),null;if(this.settings.tracker.states.review){let l=this.settings.tracker.states.active.slice(1).filter(d=>d!==this.reviewState);if(l.length>0&&!l.includes(e.state))return m.warn("step-engine","\u4EBA\u5DE5\u6B65\u9AA4\u72B6\u6001\u672A\u660E\u786E\u786E\u8BA4\uFF0C\u62D2\u7EDD\u63A8\u8FDB",{itemId:e.id,stepId:n.id,state:e.state,confirmedStates:l}),null}i.recorded=!0,m.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(!i.forceReplay&&!this.retry.hasFailures(e.id)&&n.output_mapping&&this.isStepAlreadyComplete(e,n,r))return i.recorded=!0,m.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"&&(i.forceReplay=!0,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){m.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;m.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 p_(this.retry.getBackoffMs(s))}}return i}async prepareExecution(e,n){let r=this.settings.tracker.states.active[0],o=this.settings.tracker.states.restart,i={};r&&(e.state===this.settings.tracker.states.initial||e.state===o)&&(i.state=r),e.currentStep!==n.id&&(i.currentStep=n.id),(i.state!==void 0||i.currentStep!==void 0)&&await this.updateCheckpoint(e,i),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`;m.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):m.warn("step-engine","\u672A\u914D\u7F6E tracker.states.blocked\uFF0C\u5DE5\u5355\u65E0\u6CD5\u8F6C\u5165\u963B\u585E\u6001\u3001\u53EF\u80FD\u88AB\u6301\u7EED\u91CD\u8BD5",{itemId:e.id,stepId:n.id}),this.retry.clearFailures(e.id)}resolveCurrentStep(e){let n=this.workflow.orderedStepIds[0],r=n?this.stepsMap.get(n)??null:null;if(this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart)return r;if(e.currentStep){let o=this.stepsMap.get(e.currentStep);if(o)return o}return e.state===this.settings.tracker.states.initial||this.settings.tracker.states.active.includes(e.state)?r:null}async handleFailureOrBlock(e,n,r){switch(r.status){case"failed":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"),m.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}`),m.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}`),m.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 k(o)?Object.keys(n.output_mapping).every(i=>{let s=o[i];return s!=null&&s!==""}):this.hasRecipeOutput(e,n)}hasRecipeOutput(e,n){if(!n.output_mapping)return!1;let r=Object.values(n.output_mapping);return r.length>0&&r.every(o=>{let i=e.fields[o];return i!=null&&i!==""})}hasHumanStepPrepared(e,n,r){let o=r[n.id];return k(o)&&o[Xm]===!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}`),m.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=k(e[n.id])?e[n.id]:{};e[n.id]={...o,...r}}markHumanStepPrepared(e,n){let r=k(e[n.id])?e[n.id]:{};e[n.id]={...r,[Xm]:!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 p_(t){return new Promise(e=>setTimeout(e,t))}a(p_,"sleep");var ns=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):m.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 g_}from"crypto";var m_="__transient_",rs=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=`${m_}${g_(8).toString("hex")}`;return this.buffers.set(n,{cells:{...e}}),n}async finalize(e,n){let r=this.buffers.get(e);this.buffers.delete(e),r&&n.materialize&&await this.inner.updateFields("__new__",r.cells)}async fetchItemsByIds(e){let n=e.filter(i=>this.buffers.has(i)),r=e.filter(i=>!this.buffers.has(i)),o=n.map(i=>this.bufferToItem(i));return r.length>0&&o.push(...await this.inner.fetchItemsByIds(r)),o}fetchCandidateItems(){return this.inner.fetchCandidateItems()}fetchItemsByStates(e){return this.inner.fetchItemsByStates(e)}fetchAllItems(){return this.inner.fetchAllItems()}fetchItemsByFilter(e,n){return this.inner.fetchItemsByFilter(e,n)}async updateState(e,n){let r=this.buffers.get(e);if(r){r.cells[this.fields.state]=n;return}await this.inner.updateState(e,n)}async updateCurrentStep(e,n){let r=this.buffers.get(e);if(r){this.fields.current_step&&(r.cells[this.fields.current_step]=n);return}await this.inner.updateCurrentStep(e,n)}async updateFields(e,n){let r=this.buffers.get(e);if(r){Object.assign(r.cells,n);return}await this.inner.updateFields(e,n)}async appendEvent(e,n){let r=this.buffers.get(e);if(r){if(!this.fields.event_log)return;let o=String(r.cells[this.fields.event_log]??""),i=ne();r.cells[this.fields.event_log]=[o,`[${i}] ${n}`].filter(Boolean).join(`
|
|
455
|
-
`);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 vl(t){return{id:t.id,title:t.title,state:t.state,currentStep:t.currentStep}}a(vl,"snapshotRunRecord");function eh(t){return We(t)!==void 0||tr(t)!==void 0}a(eh,"eventContextRequiresTransient");async function th(t,e){We(t)&&await Do.finalize(t,e)}a(th,"finalizeEventContext");var h_=500,os=class{static{a(this,"Orchestrator")}settings;workflow;tracker;deferredTracker;stepEngine;eventHandlerExecutor;schedulerSources=[];eventBindings;queue=new Yi;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 rs(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 ts({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 Xi({settings:e.settings,tracker:this.deferredTracker,toolkitFactory:e.toolkitFactory,toolkitRegistry:e.toolkitRegistry,globalVars:e.globalVars,configScope:e.configScope}),this.taskPool=new ns({capacity:e.settings.agent.max_concurrent,onError:a((n,r)=>{m.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(nh(c,i)),r.name)}catch(c){m.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){m.error("orchestrator","handler.onEvent \u5F02\u5E38",{source:r.name,error:d instanceof Error?d.message:String(d)})}}).catch(c=>{m.error("orchestrator","source.start \u5F02\u5E38",{source:r.name,error:c instanceof Error?c.message:String(c)})})}let e=new Qi({timer_fired:a(async()=>{await this.reconcile()},"timer_fired")}),n=new Zi({intervalMs:this.settings.polling.interval_ms});this.schedulerSources.push(n),m.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()),m.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)&&m.info("orchestrator","\u7B49\u5F85\u5728\u9014\u4EFB\u52A1\u7ED3\u675F",{running:this.taskPool.running,queued:this.taskPool.depth}),await this.taskPool.drain();let e=Ns();e>0&&m.info("orchestrator","\u7B49\u5F85\u8FDB\u884C\u4E2D\u7684\u5B50\u8FDB\u7A0B\u7ED3\u675F",{pending:e}),await Yd(this.drainTimeoutMs)||(m.warn("orchestrator","drain \u8D85\u65F6\uFF0C\u5F3A\u5236\u4E2D\u6B62\u6B8B\u7559\u5B50\u8FDB\u7A0B",{remaining:Ns()}),this.abortController?.abort())}async triggerOnce(e={}){let n=Date.now(),r=e.sourceName?this.eventBindings.find(u=>u.source.name===e.sourceName):this.eventBindings[0];if(!r){if(this.eventBindings.length===0)throw new Error("\u8BE5\u5DE5\u4F5C\u6D41\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 event_sources\uFF0C\u65E0\u6CD5\u5355\u6B21\u89E6\u53D1");let u=this.eventBindings.map(f=>f.source.name).join("\u3001");throw new Error(`\u4E8B\u4EF6\u6E90 "${e.sourceName}" \u4E0D\u5B58\u5728\u3002\u8BE5\u5DE5\u4F5C\u6D41\u53EF\u7528\u4E8B\u4EF6\u6E90\uFF1A${u}`)}let o=[],i=await this.eventHandlerExecutor.createHandler(r.handlerRecipe,u=>o.push(nh(u,r.recordPolicy)),r.source.name);try{i.onEvent({type:e.event?.type??"manual_trigger",payload:e.event?.payload??{},timestamp:e.event?.timestamp??new Date().toISOString(),...e.event?.itemId!==void 0?{itemId:e.event.itemId}:{}});let u=e.graceMs??h_;o.length===0&&u>0&&await y_(o,u)}finally{i.stop()}let s=e.signal??new AbortController().signal,c=0,l=0;for(let u of o)u.action==="create_record"&&u.defer?(await this.runTransient(u,s),l++):(await this.eventHandlerExecutor.applyAction(u),c++);let d={sourceName:r.source.name,handlerRecipe:r.handlerRecipe,actions:o.length,applied:c,transient:l,durationMs:Date.now()-n};return m.info("orchestrator","\u5355\u6B21\u89E6\u53D1\u5B8C\u6210",d),d}async reconcile(){let e=this.queue.drainAll(),n=[];for(let d of e){if(d.action==="create_record"&&d.defer){n.push(d);continue}try{await this.eventHandlerExecutor.applyAction(d)}catch(u){m.error("orchestrator","\u843D\u5E93\u5931\u8D25",{action:d.action,error:u instanceof Error?u.message:String(u)})}}let r=await this.tracker.fetchCandidateItems(),o=Br(this.settings,this.workflow),i=o===null?r:r.filter(d=>d.state!==o);for(let d of r)this.emitRunRecordSnapshot(d,o);let s=this.abortController?.signal??new AbortController().signal,c=[...n.map(d=>({key:`seed:${++this.seedSeq}`,run:a(()=>this.runTransient(d,s),"run")})),...i.map(d=>({key:d.id,run:a(async()=>{await this.stepEngine.processItem(d,s)},"run")}))];if(c.length===0)return;let l=this.taskPool.submit(c);m.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=kl(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){m.error("orchestrator","\u77AC\u6001\u8FD0\u884C\u5F02\u5E38",{transientId:o,error:l instanceof Error?l.message:String(l)}),s=!0,c=!1}try{await th(e.eventContext,{completed:c,recorded:s})}catch(l){m.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:vl(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 nh(t,e){return t.action==="create_record"&&(e==="on_demand"||eh(t.eventContext))?{...t,defer:!0}:t}a(nh,"tagDeferred");async function y_(t,e){let n=Date.now()+e,r=25;for(;t.length===0&&Date.now()<n;)await new Promise(o=>setTimeout(o,r))}a(y_,"waitForFirstAction");import Dh from"path";var Sl=3e5,is=class{static{a(this,"KbAutoRefresher")}options;timer=null;inFlight=!1;stopped=!1;constructor(e){this.options=e}start(){this.stopped||(m.info("kb-watcher","\u542F\u52A8\u81EA\u52A8\u5237\u65B0",{intervalMs:Sl}),this.scheduleNext(0))}stop(){this.stopped=!0,this.timer&&(clearTimeout(this.timer),this.timer=null),m.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(Sl);return}this.inFlight=!0;try{let e=await this.options.resolveCollections();if(e.length===0)m.debug("kb-watcher","\u65E0 collection,\u8DF3\u8FC7\u672C\u8F6E");else{let n=await Ht({configDir:this.options.configDir,collections:e,...this.options.agent?{agent:this.options.agent}:{},...this.options.configPath?{configPath:this.options.configPath}:{},...this.options.model?{model:this.options.model}:{},...this.options.bins?{bins:this.options.bins}:{}}),r=n.filter(i=>i.action==="compiled").length,o=n.filter(i=>i.action==="failed").length;if(r>0||o>0){m.info("kb-watcher","\u5237\u65B0\u5B8C\u6210",{total:n.length,compiled:r,skipped:n.length-r-o,failed:o});for(let i of n.filter(s=>s.action==="failed"))m.warn("kb-watcher","\u7F16\u8BD1\u5931\u8D25",{collection:i.collection,error:i.error})}else m.debug("kb-watcher","\u65E0\u53D8\u66F4",{total:n.length})}}catch(e){m.error("kb-watcher","\u81EA\u52A8\u5237\u65B0\u5F02\u5E38",{error:e instanceof Error?e.message:String(e)})}finally{this.inFlight=!1,this.scheduleNext(Sl)}}}};import{existsSync as w_}from"fs";import rh from"path";function oh(t){return t.map(e=>e.collection)}a(oh,"collectionNames");var b_="knowledge-steward",Kn=class extends Error{static{a(this,"RequiredTaxonomyError")}constructor(e){super(e),this.name="RequiredTaxonomyError"}};function k_(t){let e=new Map;for(let n of t)for(let r of n.knowledge_scope?.kb_collections??[]){let o=typeof r=="string"?{collection:r,roleIds:[n.id]}:{collection:r.collection,...r.source?{source:r.source}:{},...r.compile?{compile:r.compile}:{},roleIds:[n.id]},i=e.get(o.collection);if(!i){e.set(o.collection,o);continue}i.roleIds=[...i.roleIds??[],n.id],o.source&&i.source&&o.source!==i.source&&m.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C\u8FDC\u7A0B\u6E90\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),o.compile&&i.compile&&JSON.stringify(o.compile)!==JSON.stringify(i.compile)&&m.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C compile\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),!i.source&&o.source&&(i.source=o.source),!i.compile&&o.compile&&(i.compile=o.compile)}return[...e.values()]}a(k_,"resolveKbCollectionsFromRoles");async function qn(t){let e=new xt(t.rolesDir),n=Xe(t.configDir,t.envSource);if(n?.roles){let c=rh.resolve(t.configDir,"profile");e.loadFromProfile(n.roles,c)}else await e.loadAll();let r=e.list(),o=k_(r),s=(r.find(c=>c.id===b_)?.knowledge_scope?.kb_collections??[]).map(c=>typeof c=="string"?c:c.collection);return{collections:oh(o),resolved:o,remoteSources:o.filter(c=>c.source!==void 0).map(c=>({source:c.source,collection:c.collection})),requiredTaxonomyCollections:s}}a(qn,"collectKbCollections");function v_(t,e){for(let n of e){let r=rh.resolve(t,n,"taxonomy.yml");if(!w_(r))throw new Kn(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7F3A\u5C11\u81EA\u5DF1\u7684 taxonomy.yml: ${r}`);try{bt({configDir:t,entry:n})}catch(o){let i=o instanceof Error?o.message:String(o);throw new Kn(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7684 taxonomy.yml \u975E\u6CD5: ${i}`)}}}a(v_,"validateRequiredTaxonomies");async function xl(t){let{settings:e,force:n,onProgress:r}=t,o=await qn(e),i=o.resolved,s=o.collections;if(v_(e.configDir,o.requiredTaxonomyCollections),i.length===0)return{collections:s,results:[],skippedReason:"no-collections"};let c=await En(e),l=c.configuredAgent,d=Wn(e.raw?.toolkit_config);if(!l){let f=i.filter(It);if(f.length===0)return m.warn("kb","engine \u4E3A llm_only,\u65E0 coding agent \u53EF\u7528,\u8DF3\u8FC7 KB \u7F16\u8BD1",{collections:s,engine:c.configuredEngine}),{collections:s,results:[],skippedReason:"llm_only"};let p=await Ht({configDir:e.configDir,collections:f,...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:oh(f),results:p}}let u=await Ht({configDir:e.configDir,collections:i,...n?{force:n}:{},agent:l,...e.agent.model?{model:e.agent.model}:{},configPath:ft(e.configDir),...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:s,results:u}}a(xl,"setupKnowledgeBases");import{readFile as R_,writeFile as C_}from"fs/promises";import I_ from"yaml";var S_=10;async function ss(t,e){let{baseId:n,fields:r}=e,o=e.name,i=await Cl(t,n,o,e.onProgress);if(i)return await e.onProgress?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${o}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${i.tableId}`),{tableId:i.tableId,reused:!0};try{return{tableId:await ih(t,{baseId:n,name:o,fields:r}),reused:!1}}catch(s){if(!sh(s))throw s;await e.onProgress?.(`\u8868\u540D\u300C${o}\u300D\u51B2\u7A81\uFF0C\u5C1D\u8BD5\u590D\u7528\u5DF2\u5B58\u5728\u8868`);let c=await Il(t,n,o);if(c)return await e.onProgress?.(`\u590D\u7528\u5DF2\u6709\u8868\u300C${o}\u300D: ${c.tableId}`),{tableId:c.tableId,reused:!0};let l=await x_(t,{baseId:n,name:o,fields:r,onProgress:e.onProgress});if(l)return l;throw s}}a(ss,"createTableWithConflictResolution");async function x_(t,e){let{baseId:n,fields:r}=e;for(let o=2;o<=S_+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 ih(t,{baseId:n,name:i,fields:r});return await e.onProgress?.(`\u5DF2\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA\u8868: ${s}`),{tableId:s,reused:!1}}catch(s){if(!sh(s))throw s;let c=await Il(t,n,i);if(c)return{tableId:c.tableId,reused:!0}}}return null}a(x_,"createTableWithRename");async function ih(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=ah(n);if(!r)throw new Error(`\u521B\u5EFA\u8868\u300C${e.name}\u300D\u540E\u672A\u8FD4\u56DE tableId`);return r}a(ih,"createTable");async function Cl(t,e,n,r){try{return await Il(t,e,n)}catch(o){let i=o instanceof Error?o.message:String(o);return await r?.(`\u65E0\u6CD5\u5217\u51FA base \u5DF2\u6709\u8868\uFF08${i}\uFF09\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u65B0\u5EFA\u300C${n}\u300D`),null}}a(Cl,"findExistingTableByName");async function Il(t,e,n){let r=await Tl(t,e),o=n.trim();return r.find(i=>i.name.trim()===o)??null}a(Il,"findTableByName");async function Tl(t,e){let n=await t.runJson(["aitable","table","get","--base-id",e,"--timeout","60"],{timeoutMs:9e4}),r=le(n);return ye(r).filter(k).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(Tl,"listTablesInBase");function sh(t){if(!(t instanceof ge))return!1;let e=`${t.message}
|
|
456
|
-
${t.stderr}`.toLowerCase();return e.includes("already exist")||e.includes("\u5DF2\u5B58\u5728")||e.includes("duplicate")||e.includes("exist")}a(sh,"isTableNameConflictError");function ah(t){let e=le(t),n=Rl(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=ah(r);if(o)return o}return null}a(ah,"findTableId");function Rl(t,e){if(!k(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=>Rl(o,e)).find(Boolean)??null:Rl(n,e);if(r)return r}return null}a(Rl,"findStringByKeys");async function _l(t){let{trackerFilePath:e,settings:n,workflow:r,onProgress:o}=t;if(n.tracker.table_id.trim())return n;await o?.("\u672A\u586B\u5199 Table Id\uFF0C\u4F18\u5148\u590D\u7528 base \u5185\u540C\u540D\u8868\uFF0C\u5426\u5219\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868","create_table");let i=await lh(n,r,o);return await ch(e,i),await o?.(`\u6570\u636E\u8868\u5DF2\u5C31\u7EEA\uFF1A${i}`,"create_table"),{...n,tracker:{...n.tracker,table_id:i}}}a(_l,"ensureTableExists");async function ch(t,e){let n=await R_(t,"utf8"),r=I_.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 C_(t,r.toString(),"utf8")}a(ch,"writeTableIdToConfig");async function lh(t,e,n){let r=new ae({bin:t.tracker.dws_bin,timeoutMs:6e4}),o="dws aitable table create",i=T_(e.tracker?.label??e.meta.name??"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"),s=await Cl(r,t.tracker.base_id,i,d=>n?.(d,"create_table"));if(s)return m.info("setup","\u590D\u7528 base \u4E0B\u540C\u540D AI \u8868\u683C\u6570\u636E\u8868",{baseId:t.tracker.base_id,tableName:i,tableId:s.tableId}),await n?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${i}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${s.tableId}`,"create_table"),s.tableId;await n?.("\u6B63\u5728\u8C03\u7528 dws \u521B\u5EFA\u6570\u636E\u8868","create_table"),m.info("setup","\u8C03\u7528 dws \u521B\u5EFA AI \u8868\u683C\u6570\u636E\u8868",{command:o,dwsBin:t.tracker.dws_bin,baseId:t.tracker.base_id,tableName:i});let c=await r.runJson(["aitable","table","create","--base-id",t.tracker.base_id,"--name",i,"--fields",JSON.stringify(dh(t)),"--timeout","60","--yes"],{timeoutMs:9e4}),l=uh(c);if(!l){let d=le(c);throw m.warn("setup","dws \u521B\u5EFA\u6570\u636E\u8868\u540E\u672A\u8FD4\u56DE tableId",{command:o,baseId:t.tracker.base_id,response:d}),Object.assign(new Error("dws \u5EFA\u8868\u547D\u4EE4\u672A\u8FD4\u56DE tableId\uFF0C\u65E0\u6CD5\u786E\u8BA4\u6570\u636E\u8868\u662F\u5426\u521B\u5EFA\u6210\u529F\uFF1B\u8BF7\u68C0\u67E5 dws CLI \u8F93\u51FA\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u786E\u8BA4\u540E\u624B\u52A8\u8865\u5145 table_id"),{code:"TABLE_ID_NOT_RETURNED",status:502,details:{command:o,response:d}})}return l}a(lh,"createWorkflowTable");function T_(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"}a(T_,"sanitizeTableName");function dh(t){let e=[t.tracker.states.initial,...t.tracker.states.active,...t.tracker.states.terminal,t.tracker.states.blocked,t.tracker.states.review].filter((l,d,u)=>!!l&&u.indexOf(l)===d),n=t.tracker.fields.title,r=t.tracker.fields.state,o=[],i=new Set,s=a(l=>{i.has(l.fieldName)||(o.push(l),i.add(l.fieldName))},"addField"),c=a(l=>(t.tracker.field_definitions??[]).find(d=>d.name===l)?.description,"descOf");if(n===r)return s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),o;s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),s({fieldName:r,type:"singleSelect",config:{options:e.map(l=>({name:l}))},...c(r)?{description:c(r)}:{}});for(let l of t.tracker.field_definitions??[])s(A_(l));return o}a(dh,"initialTableFields");function A_(t){let e={fieldName:t.name,type:t.type},n={};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),t.formatter&&(n.formatter=t.formatter),Object.keys(n).length>0&&(e.config=n),t.description&&(e.description=t.description),e}a(A_,"fieldDefinitionToCreatePayload");function uh(t){let e=le(t),n=Al(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=uh(r);if(o)return o}return null}a(uh,"findTableId");function Al(t,e){if(!k(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=>Al(o,e)).find(Boolean)??null:Al(n,e);if(r)return r}return null}a(Al,"findStringByKeys");async function zr(t,e,n,r){let o=r?.get(e);if(o||(o=await Tl(t,e),r?.set(e,o)),!o.some(s=>s.tableId===n))throw new Error(`tracker.table_id="${n}" \u4E0D\u5C5E\u4E8E tracker.base_id="${e}"\uFF08\u53EF\u80FD\u662F\u6539\u4E86 base_id \u4F46\u6CA1\u6E05\u7A7A\u65E7 table_id\uFF09\u3002\u8BF7\u6E05\u7A7A table_id \u540E\u91CD\u8DD1 setup\u3002`)}a(zr,"assertTableBelongsToBase");import Hr from"path";import{access as oE}from"fs/promises";import iE from"fs";var vh={};gw(vh,{ASSETS_DIR:()=>Fl,HASH_VERSION:()=>Tt,MANIFEST_NAME:()=>jl,MAX_PAGE_SIZE:()=>ks,ROWS_DIR:()=>yn,SchemaChangeError:()=>Zn,TableScanStuckError:()=>qr,VOLATILE_FIELD_TYPES:()=>as,assetsPath:()=>ph,collectPendingAttachments:()=>ws,computeRowHash:()=>ds,computeSchemaFingerprint:()=>fs,computeSnapshotFingerprint:()=>us,createDwsTableReader:()=>vs,describeSchemaChange:()=>ys,diffSchemas:()=>ms,extOf:()=>Dl,hasAttachmentFailure:()=>wh,isBlockingSchemaChange:()=>hs,isVolatileType:()=>Ol,localizeAttachments:()=>bs,localizeInlineImages:()=>Pl,manifestPath:()=>Vr,normalizeCell:()=>$l,normalizeCells:()=>cs,parseFieldSchemas:()=>ls,parseNextCursor:()=>Gn,parseRawRecords:()=>Jn,pullTable:()=>yh,readAllRowSnapshots:()=>kh,readManifest:()=>gs,readRowSnapshot:()=>Wl,resourceIdFromUrl:()=>Hn,rowPath:()=>wn,sniffImageExt:()=>Ll,writeJsonAtomic:()=>Kr});var as=["formula","button","createdTime","lastModifiedTime","creator","lastModifier"];import{createHash as __}from"crypto";var E_=new Set(["unidirectionalLink","bidirectionalLink"]);function ke(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(ke,"isRecord");function fe(t){return typeof t=="string"?t:t==null?"":String(t)}a(fe,"str");function El(t){if(!ke(t))return null;let e=fe(t.name).trim();return e?{id:fe(t.id),name:e}:null}a(El,"toOption");function D_(t,e){if(!ke(t))return null;let n=fe(t.resourceId).trim(),r=fe(t.filename).trim(),o=typeof t.size=="number"?t.size:Number(t.size??0)||0,i=fe(t.type);if(!n){let s=fe(t.resourceUrl||t.url).trim();return s?{filename:r,resourceId:Hn(s),asset:"",size:o,mediaType:i,url:s,link:!0}:null}return{filename:r,resourceId:n,asset:`${e}/${n}${Dl(r)}`,size:o,mediaType:i}}a(D_,"toAttachment");function Dl(t){let e=/(\.[A-Za-z0-9]{1,10})$/.exec(String(t??""));return e?e[1].toLowerCase():""}a(Dl,"extOf");function P_(t){return t.map(e=>e.filename).filter(Boolean).join(", ")}a(P_,"attachmentsText");var $_=/!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)/g;function Hn(t){let n=String(t??"").split("?")[0]??"",o=(n.split("/").pop()??"").replace(/\.[A-Za-z0-9]{1,10}$/,"");return/^[0-9a-fA-F-]{16,}$/.test(o)?o:o?o.replace(/[^\w.-]/g,"_"):__("sha1").update(n).digest("hex").slice(0,32)}a(Hn,"resourceIdFromUrl");function Pl(t,e){let n=[],r=new Set;return{markdown:String(t??"").replace($_,(i,s,c)=>{let l=c.startsWith("<")&&c.endsWith(">")?c.slice(1,-1):c;if(!/^https?:\/\//i.test(l))return i;let d=Hn(l),u=`${e}/${d}`;return r.has(d)||(r.add(d),n.push({filename:s||d,resourceId:d,asset:u,size:0,mediaType:"image"})),``}),images:n}}a(Pl,"localizeInlineImages");function $l(t,e,n,r){let o=n.fields.get(t),i=o?.type??"text",s=n.assetsDir??"assets";if(e==null||e==="")return null;if(i==="attachment"){if(!Array.isArray(e))return null;let l=[];for(let d of e){let u=D_(d,s);u?l.push(u):r(`\u9644\u4EF6\u9879\u65E2\u65E0 resourceId \u4E5F\u65E0\u53EF\u7528 URL\uFF0C\u65E0\u4ECE\u5F15\u7528\uFF0C\u5DF2\u8DF3\u8FC7\uFF1A${JSON.stringify(d).slice(0,120)}`)}return l.length===0?null:{type:i,value:l,text:P_(l)}}if(E_.has(i)){let l=ke(e)&&Array.isArray(e.linkedRecordIds)?e.linkedRecordIds.map(fe).filter(Boolean):[];if(l.length===0)return null;let d=l.map(f=>({recordId:f})),u={type:i,value:d,text:""};return o?.linkedTableId&&o.linkedTableId===n.sheetId&&(u.selfLink=!0),u}if(i==="richText"){let l=ke(e)?fe(e.markdown):fe(e);if(!l.trim())return null;let{markdown:d,images:u}=Pl(l,s),p={type:i,value:{markdown:d},text:d};return u.length>0&&(p.embeddedImages=u),p}if(i==="url"){let l=ke(e)?fe(e.link||e.text).trim():fe(e).trim();if(!l)return null;let d=ke(e)&&fe(e.text).trim()||l;return{type:i,value:l,text:d===l?l:`${d} ${l}`}}if(i==="singleSelect"){let l=El(e);return l?{type:i,value:l,text:l.name}:null}if(i==="multipleSelect"){if(!Array.isArray(e))return null;let l=e.map(El).filter(d=>d!==null);return l.length===0?null:{type:i,value:l,text:l.map(d=>d.name).join(", ")}}if(i==="user"||i==="department"||i==="group"||i==="creator"||i==="lastModifier"){if(!Array.isArray(e))return null;let l=e.map(d=>ke(d)?fe(d.userRef||d.userId||d.ref||d.id):fe(d)).filter(Boolean).map(d=>({userRef:d}));return l.length===0?null:{type:i,value:l,text:l.map(d=>d.userRef).join(", ")}}if(i==="checkbox")return e===!0||e==="true"?{type:i,value:!0,text:"true"}:null;if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"){let l=fe(e);return l.trim()?{type:i,value:l,text:l}:null}r(`\u5B57\u6BB5\u7C7B\u578B ${i} \u7684\u8FD4\u56DE\u7ED3\u6784\u672A\u8BC6\u522B\uFF0C\u5DF2\u6309 JSON \u6587\u672C\u515C\u5E95`);let c=JSON.stringify(e);return{type:i,value:c,text:c}}a($l,"normalizeCell");function cs(t,e,n,r){let o={};for(let[i,s]of Object.entries(e??{})){let c=$l(i,s,n,l=>r.push({recordId:t,fieldId:i,message:l}));c&&(o[i]=c)}return o}a(cs,"normalizeCells");function ls(t){let e=ke(t)?t.data:void 0,n=ke(e)&&Array.isArray(e.fields)?e.fields:[],r=[];for(let o of n){if(!ke(o))continue;let i=fe(o.fieldId).trim();if(!i)continue;let s=ke(o.config)?o.config:void 0,c=s&&Array.isArray(s.options)?s.options:void 0,l={id:i,name:fe(o.fieldName).trim(),type:fe(o.type).trim()||"text"};if(c){let d=c.map(El).filter(u=>u!==null);d.length&&(l.options=d)}s&&s.linkedTableId&&(l.linkedTableId=fe(s.linkedTableId)),r.push(l)}return r}a(ls,"parseFieldSchemas");function Jn(t){let e=ke(t)?t.data:void 0,n=ke(e)&&Array.isArray(e.records)?e.records:[],r=[];for(let o of n){if(!ke(o))continue;let i=fe(o.recordId).trim();i&&r.push({recordId:i,cells:ke(o.cells)?o.cells:{}})}return r}a(Jn,"parseRawRecords");function Gn(t){let e=ke(t)?t.data:void 0;return ke(e)?fe(e.nextCursor).trim():""}a(Gn,"parseNextCursor");import{createHash as M_}from"crypto";var Tt="1";function Ml(t){return`sha256:${M_("sha256").update(t,"utf8").digest("hex")}`}a(Ml,"sha256");function Ur(t){return String(t??"").replace(/\r\n/g,`
|
|
457
|
-
`).trim()}a(
|
|
458
|
-
${r}`)}a(
|
|
449
|
+
`)}a(G_,"formatYamlBlock");async function Z_(t){try{return await H_(t),!0}catch{return!1}}a(Z_,"fileExists");function Lr(t){let e=[];for(let n of t.modules)if(n.workflows)for(let r of n.workflows)e.push(...r.items);else e.push(...n.items);return e}a(Lr,"collectAllItems");function Ji(t){let e=t.key,n=e.lastIndexOf("."),r=n>=0?e.slice(n+1):e;return r==="base_id"||r==="baseId"?"baseId":r==="table_id"||r==="tableId"?"tableId":r}a(Ji,"getSemanticKey");function Gi(t){return Ji(t)==="baseId"}a(Gi,"canOfferDefaultFor");var Wr=class extends Error{static{a(this,"ConfigSaveError")}status;constructor(e,n){super(n),this.name="ConfigSaveError",this.status=e}};function Y_(t,e){for(let n of t){let r=Lr(e).find(o=>{if(!o.writeTarget)return!1;let i=o.writeTarget,s=n.writeTarget;return i.type!==s.type?!1:i.type==="yaml"&&s.type==="yaml"?i.file===s.file&&JSON.stringify(i.yamlPath)===JSON.stringify(s.yamlPath):!1});if(r&&Gi(r)&&n.value.trim().length>0)return n.value.trim()}return null}a(Y_,"findSavedBaseId");async function Q_(t,e,n){if(!Array.isArray(t.updates))throw new Wr(400,"updates must be an array");for(let l of t.updates){let d=[];if(l.writeTarget.type==="yamlAll")for(let u of l.writeTarget.targets)d.push(u.file);else d.push(l.writeTarget.file);for(let u of d)try{xe(e,u,{allowRoot:!1})}catch{throw new Wr(403,`\u8DEF\u5F84\u8D8A\u754C: ${u}`)}}let r=0,o=new Map;for(let l of t.updates){let d=l.writeTarget.type==="yaml"?[l.writeTarget]:l.writeTarget.type==="yamlAll"?l.writeTarget.targets:[],u=l.value.trim();if(u)for(let f of d){let p=f.yamlPath[f.yamlPath.length-1];if(p!=="base_id"&&p!=="baseId")continue;let g=(await ll(fl.resolve(e,f.file),f.yamlPath))?.trim();g&&g!==u&&o.set(g,u)}}if(o.size>0){let l=await dl(e,[fl.resolve(n)]);for(let[d,u]of o){let f=await ul(l,d,u);r+=f.migratedFields+f.clearedTableIds}}for(let l of t.updates)await cl(l.writeTarget,l.value,e),r++;let i=await Bi({configPath:n}),s=Y_(t.updates,i);if(s){let l=0;for(let d of Lr(i))d.writeTarget&&(d.status==="error"||d.status==="warn")&&Gi(d)&&Ji(d)==="baseId"&&(!d.value||typeof d.value=="string"&&!d.value.trim())&&(await cl(d.writeTarget,s,e),l++);l>0&&(i=await Bi({configPath:n}),r+=l)}let c=0;for(let l of Lr(i))if(l.key==="coding_agent.config.enabled"&&l.status==="error"&&l.writeTarget?.type==="json"){let d=l.writeTarget.jsonPath[1];if(!d)continue;let u=et(d),f=fl.resolve(e,"coding-agents.config.json");for(let[p,g]of Object.entries(u))(typeof g=="string"||typeof g=="boolean")&&await al(f,["agents",d,p],g);c++}return c>0&&(i=await Bi({configPath:n}),r+=c),{written:r,recheck:i}}a(Q_,"applyConfigSave");var Jm=/^\$\{globalVar\.([^}]+)\}$/;function cH(t){return typeof t=="string"&&Jm.test(t)}a(cH,"isGlobalVarRef");function X_(t){if(typeof t!="string")return null;let e=t.match(Jm);return e?e[1]:null}a(X_,"globalVarRefPath");function lH(t,e){let n=X_(t);return n===null?t:e?.(n)}a(lH,"resolveGlobalVarRef");var gl=1,eA=["asker","answerer","bot","unknown"],tA=["idle","forced"],nA=new Set(["heuristic_merge","same_sender_window","single_active_adjacent","multiple_name_candidates","quoted_parent_missing","missing_answerers","missing_bots","near_max_open","forced_close"]),rA=["high","medium","low"];function Br(t){return t.some(e=>nA.has(e))}a(Br,"threadNeedsReview");var Gm={high:3,medium:2,low:1};function Zi(t,e){return Gm[t]<=Gm[e]?t:e}a(Zi,"lowerConfidence");function ml(t,e){return e.includes("heuristic_merge")||e.includes("multiple_name_candidates")||e.includes("quoted_parent_missing")?"low":e.includes("near_max_open")?Zi(t,"medium"):t}a(ml,"degradeConfidence");function hl(t){if(t.length===0)return{};let e=[...t].sort((s,c)=>s.createTime-c.createTime),n=e[0],r=n.createTime,o=n.senderOpenDingTalkId||n.senderName,i=e.find(s=>s.role==="answerer"&&(s.senderOpenDingTalkId||s.senderName)!==o&&s.createTime>=r);return i?{firstAnswerAt:i.createTime,firstAnswererName:i.senderName,firstResponseMs:i.createTime-r}:{}}a(hl,"computeFirstResponse");function yl(t){let e=new Map;for(let n of t){let r=n.senderOpenDingTalkId||n.senderName,o=e.get(r);if(o){o.messageCount+=1,o.role==="unknown"&&n.role!=="unknown"&&(o.role=n.role);continue}e.set(r,{name:n.senderName,openId:n.senderOpenDingTalkId,role:n.role,messageCount:1})}return[...e.values()]}a(yl,"computeParticipants");function wl(t,e){if(t.length===0)return;let n=new Set(e.answererIds??[]),r=new Set(e.answererNames??[]),o=new Set(e.botNames??[]),i=[...t].sort((d,u)=>d.createTime-u.createTime),s=i[0].senderOpenDingTalkId||i[0].senderName,c=e.forcedAskerKey,l=a(d=>c?d.senderOpenDingTalkId===c||d.senderName===c:(d.senderOpenDingTalkId||d.senderName)===s,"isAsker");for(let d of t){if(o.has(d.senderName)){d.role="bot";continue}if(l(d)){d.role="asker";continue}d.role=n.has(d.senderOpenDingTalkId)||r.has(d.senderName)?"answerer":"unknown"}}a(wl,"assignThreadRoles");function pl(t){let e=new Date(t),n=String(e.getHours()).padStart(2,"0"),r=String(e.getMinutes()).padStart(2,"0");return`${n}:${r}`}a(pl,"formatClock");function oA(t,e){let n=[];for(let o of t.images)n.push(`${e}`);let r=t.content.trim();if(r)for(let o of r.split(`
|
|
450
|
+
`))n.push(`${e}${o}`);return n.length===0&&n.push(`${e}(\u7A7A\u6D88\u606F)`),n}a(oA,"renderBody");function iA(t){let e=new Map(t.messages.map(b=>[b.openMessageId,b])),n=new Map,r=new Map;for(let b of t.edges){if(!e.has(b.child)||(n.set(b.child,b.parent),!e.has(b.parent)))continue;let v=r.get(b.parent)??[];v.push(b.child),r.set(b.parent,v)}for(let b of r.values())b.sort((v,R)=>e.get(v).createTime-e.get(R).createTime);let o=a(b=>{let v=n.get(b);return v!==void 0&&e.has(v)},"isAttached"),i=[...r.values()].filter(b=>b.length>=2).length,s=[],c=new Set,l=a((b,v,R)=>{if(c.has(b))return v;c.add(b);let S=e.get(b),C=" ".repeat(v),_=v===0?"":R?"\u2517\u2501 ":"\u2514\u2500 ";s.push(`${C}${_}[${pl(S.createTime)}] ${S.senderName}(${S.role}) msg=${S.openMessageId}`),s.push(...oA(S,`${C}${v===0?"":" "}\u2502 `));let A=v,T=r.get(b)??[];for(let I of T)A=Math.max(A,l(I,v+1,T.length>=2));return A},"walk"),d=[t.rootMsgId,...t.messages.map(b=>b.openMessageId).filter(b=>b!==t.rootMsgId&&!o(b))].filter(b=>e.has(b)),u=0;for(let[b,v]of d.entries()){let R=s.length,S=l(v,0,!1);u=Math.max(u,S),b>0&&s.length>R&&s.splice(R,0,"","\u2014 \u4EE5\u4E0B\u6D88\u606F\u65E0\u5F15\u7528\u951A\u70B9\uFF0C\u4EC5\u540C\u7FA4\u65F6\u95F4\u90BB\u8FD1\uFF0C\u5F52\u5C5E\u53EF\u80FD\u4E0D\u51C6 \u2014")}let f=t.participants.map(b=>`${b.name}(${b.role})`).join(" / "),p=t.messages[0],g=t.messages[t.messages.length-1],h=p&&g?`${pl(p.createTime)} ~ ${pl(g.createTime)}`:"-",y=t.firstResponseMs===void 0?"\u4E0D\u9002\u7528\uFF08\u65E0 answerer \u6216\u7B54\u7591\u4EBA\u5458\u540D\u5355\u7F3A\u5931\uFF09":`${Math.round(t.firstResponseMs/6e4)} \u5206\u949F\uFF08\u9996\u6B21\u54CD\u5E94\u4EBA\uFF1A${t.firstAnswererName}\uFF09`,w=t.review.warnings.length>0?t.review.warnings.join(", "):"-";return[`# thread ${t.threadId}`,`\u7FA4: ${t.groupName} (${t.conversationId})`,`\u8282\u70B9\u6570: ${t.messages.length} \u6811\u6700\u5927\u6DF1\u5EA6: ${u+1} \u5206\u53C9\u6570: ${i}`,`\u5F52\u5E76: ${t.review.reason} / ${t.review.confidence} \u7591\u70B9: ${w}`,`\u53C2\u4E0E\u4EBA: ${f||"-"}`,`\u65F6\u95F4\u8303\u56F4: ${h}`,`\u9996\u6B21\u54CD\u5E94: ${y}`,"",...s].join(`
|
|
451
|
+
`)}a(iA,"renderThread");import{createHash as sA}from"crypto";import{appendFileSync as aA,existsSync as cA,mkdirSync as lA,readdirSync as dA,rmSync as uA,statSync as fA}from"fs";import Yi from"path";var pA=/^\d{4}-\d{2}-\d{2}$/;function Vn(t){let e=new Date(t),n=a(r=>String(r).padStart(2,"0"),"pad");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}a(Vn,"logDateDir");function Zm(t){let e=sA("sha1").update(t).digest("hex").slice(0,8);return`${Re(t,{fallback:"conv",maxLength:16}).slice(0,16)}-${e}.jsonl`}a(Zm,"threadLogFileName");var bl=class{static{a(this,"ThreadLog")}rootDir;retainDays;now;onError;prunedFor=null;constructor(e){this.rootDir=Yi.resolve(e.rootDir),this.retainDays=e.retainDays??2,this.now=e.now??(()=>Date.now()),e.onError&&(this.onError=e.onError)}filePathFor(e,n=this.now()){return xe(this.rootDir,Yi.posix.join(Vn(n),Zm(e)))}append(e){try{let n=this.filePathFor(e.cid);lA(Yi.dirname(n),{recursive:!0}),aA(n,`${JSON.stringify(e)}
|
|
452
|
+
`,"utf8"),this.pruneOnce()}catch(n){this.onError?.(`thread \u65E5\u5FD7\u5199\u5165\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u5165\u7AD9\u5904\u7406\uFF09: ${n instanceof Error?n.message:String(n)}`)}}pruneOnce(){let e=Vn(this.now());if(this.prunedFor===e||(this.prunedFor=e,!cA(this.rootDir)))return;let n=this.now()-this.retainDays*24*60*60*1e3,r=Vn(n);for(let o of dA(this.rootDir)){if(!pA.test(o)||o>=r)continue;let i=Yi.join(this.rootDir,o);try{if(!fA(i).isDirectory())continue;uA(i,{recursive:!0,force:!0})}catch(s){this.onError?.(`thread \u65E5\u5FD7\u6E05\u7406\u5931\u8D25 ${o}: ${s instanceof Error?s.message:String(s)}`)}}}};import{existsSync as gA,readFileSync as mA,readdirSync as Ym}from"fs";import Qm from"path";var hA={duplicate:"high",quoted_message:"high",mention_asker:"medium",answerer_mentions_user:"medium",same_sender_window:"low",single_active_adjacent:"low",new_thread:"high"},yA=1800*1e3,kl=0;function wA(){return kl=(kl+1)%1e6,`t-${Date.now().toString(36)}-${kl.toString(36)}`}a(wA,"newThreadId");function bA(t){return{answererIds:new Set(t.answererIds??[]),answererNameKeys:new Set((t.answererNames??[]).map(Ke)),botNameKeys:new Set((t.botNames??[]).map(Ke))}}a(bA,"normalizeRoster");var zr=class{static{a(this,"ThreadStore")}opts;addressPrefixes;open=new Map;msgIndex=new Map;byConversation=new Map;lastBySender=new Map;byAsker=new Map;constructor(e={}){this.opts={idleCloseMs:e.idleCloseMs??1800*1e3,maxOpenMs:e.maxOpenMs??360*60*1e3,sameSenderWindowMs:e.sameSenderWindowMs??600*1e3,adjacentWindowMs:e.adjacentWindowMs??300*1e3,enableHeuristicMerge:e.enableHeuristicMerge??!1,enableMentionMerge:e.enableMentionMerge??!1},this.addressPrefixes=(e.addressPatterns??[]).map(n=>n.split("{name}")[0]??"").filter(n=>n.length>0)}onMessage(e,n={}){let r=this.decide(e,bA(n));return this.apply(e,r)}drainClosed(e,n={}){let r=[];for(let[o,i]of[...this.open.entries()]){let s=e-i.lastActivityAt>=this.opts.idleCloseMs,c=e-i.openedAt>=this.opts.maxOpenMs;if(!s&&!c)continue;r.push(this.toSnapshot(i,e,s?"idle":"forced",n)),this.open.delete(o),this.byConversation.get(i.conversationId)?.delete(o);let l=`${i.conversationId}\0${Ke(i.askerName)}`;this.byAsker.get(l)===o&&this.byAsker.delete(l)}return this.pruneIndex(),r}get openCount(){return this.open.size}recoverFromLog(e,n,r=Date.now(),o={}){let i=0,s=0,c=[];if(!gA(e))return{files:i,messages:s,drainedSnapshots:c};let l=new Set;for(let u=0;u<n;u++)l.add(Vn(r-u*24*60*60*1e3));let d=[];for(let u of Ym(e)){if(!l.has(u))continue;let f=Qm.join(e,u);for(let p of Ym(f))if(p.endsWith(".jsonl")){i+=1;for(let g of mA(Qm.join(f,p),"utf8").split(`
|
|
453
|
+
`)){if(!g.trim())continue;let h;try{h=JSON.parse(g)}catch{continue}h.kind==="msg"&&(d.push({openMessageId:h.openMessageId,conversationId:h.cid,groupName:h.groupName,senderName:h.senderName,senderOpenDingTalkId:h.senderOpenDingTalkId,createTime:h.ts,content:h.content,images:h.images,...h.quotedMessageId?{quotedMessageId:h.quotedMessageId}:{},role:h.identity==="bot"?"bot":"unknown"}),s+=1)}}}d.sort((u,f)=>u.createTime-f.createTime);for(let u of d)this.onMessage(u,o),c.push(...this.drainClosed(u.createTime,o));return{files:i,messages:s,drainedSnapshots:c}}decide(e,n){let r=[],o=[];n.answererIds.size===0&&n.answererNameKeys.size===0&&r.push("missing_answerers"),n.botNameKeys.size===0&&r.push("missing_bots");let i=this.msgIndex.get(e.openMessageId);if(i&&this.open.has(i))return{reason:"duplicate",threadId:i,candidateThreadIds:[],warnings:r};if(e.quotedMessageId){let d=this.msgIndex.get(e.quotedMessageId);if(d&&this.open.has(d))return{reason:"quoted_message",threadId:d,matchedMessageId:e.quotedMessageId,candidateThreadIds:[],warnings:r};r.push("quoted_parent_missing")}let s=e.conversationId,c=Ke(e.senderName),l=[...this.byConversation.get(s)??[]].filter(d=>this.open.has(d));if(this.opts.enableMentionMerge){let d=this.matchMention(e,c,l,o,r);if(d)return{...d,candidateThreadIds:o,warnings:r}}if(this.opts.enableHeuristicMerge){let d=this.lastBySender.get(this.senderKey(e));if(d!==void 0&&e.createTime-d<=this.opts.sameSenderWindowMs){let u=this.latestThreadOf(l,o,f=>f.messages.some(p=>(p.senderOpenDingTalkId||p.senderName)===(e.senderOpenDingTalkId||e.senderName)));if(u)return r.push("heuristic_merge","same_sender_window"),{reason:"same_sender_window",threadId:u,candidateThreadIds:o,warnings:r}}if(l.length===1){let u=this.open.get(l[0]);if(o.push(u.threadId),e.createTime-u.lastActivityAt<=this.opts.adjacentWindowMs)return r.push("heuristic_merge","single_active_adjacent"),{reason:"single_active_adjacent",threadId:u.threadId,candidateThreadIds:o,warnings:r}}}if(e.role!=="bot"){let d=this.forcedAskerFor(e,n);if(d)return r.push("answerer_forced_asker"),{reason:"answerer_mentions_user",matchedName:d,forcedAskerName:d,candidateThreadIds:o,warnings:r}}return{reason:"new_thread",candidateThreadIds:o,warnings:r}}matchMention(e,n,r,o,i){let s=a(u=>{let f,p=0;for(let g of r){let h=this.open.get(g);!h||!u(h)||(p+=1,o.includes(h.threadId)||o.push(h.threadId),(!f||h.lastActivityAt>f.lastActivityAt)&&(f=h))}return f?{thread:f,hits:p}:null},"pick"),l=s(u=>Ke(u.askerName)===n||u.participants.has(n)?this.addressesName(e.content,u.askerName)||[...u.participants].some(p=>p!==n&&this.addressesName(e.content,p)):!1)??s(u=>!u.askerIsBot&&this.addressesName(e.content,u.askerName));if(l)return i.push("mention_merge"),l.hits>1&&i.push("multiple_name_candidates"),this.opts.maxOpenMs-(e.createTime-l.thread.openedAt)<yA&&i.push("near_max_open"),{reason:"mention_asker",threadId:l.thread.threadId,matchedName:l.thread.askerName};let d=this.byAsker.get(`${e.conversationId}\0${n}`);return d&&this.open.has(d)?(o.includes(d)||o.push(d),i.push("mention_merge"),{reason:"mention_asker",threadId:d,matchedName:e.senderName}):null}forcedAskerFor(e,n){if(!(!!e.senderOpenDingTalkId&&n.answererIds.has(e.senderOpenDingTalkId)||n.answererNameKeys.has(Ke(e.senderName))))return;let o=e.content,i=0;for(;;){let s=o.indexOf("@",i);if(s<0)return;i=s+1;let c=(o.slice(i,i+30).split(/[ \u3000\n,,]/)[0]??"").trim();if(c&&!n.botNameKeys.has(Ke(c))&&Ke(c)!==Ke(e.senderName))return c}}apply(e,n){let r=ml(hA[n.reason],n.warnings),o={reason:n.reason,confidence:r,...n.threadId?{matchedThreadId:n.threadId}:{},...n.matchedMessageId?{matchedMessageId:n.matchedMessageId}:{},...n.matchedName?{matchedName:n.matchedName}:{},...n.candidateThreadIds.length>0?{candidateThreadIds:n.candidateThreadIds}:{},warnings:n.warnings,needsReview:Br(n.warnings)};if(n.reason==="duplicate")return{threadId:n.threadId,isNew:!1,trace:o};let i=n.threadId??wA(),s=!this.open.has(i),c=n.forcedAskerName??e.senderName,l=this.open.get(i)??{threadId:i,conversationId:e.conversationId,groupName:e.groupName,askerName:c,askerIsBot:e.role==="bot",participants:new Set,messages:[],edges:[],openedAt:e.createTime,lastActivityAt:e.createTime,review:{reason:n.reason,confidence:r,warnings:[],candidateThreadIds:[],needsReview:!1},...n.forcedAskerName?{forcedAskerKey:n.forcedAskerName}:{}};l.messages.push(e),l.messages.sort((u,f)=>u.createTime-f.createTime),e.quotedMessageId&&l.edges.push({child:e.openMessageId,parent:e.quotedMessageId}),!l.groupName&&e.groupName&&(l.groupName=e.groupName),l.lastActivityAt=Math.max(l.lastActivityAt,e.createTime),e.senderName&&l.participants.add(Ke(e.senderName)),l.review.reason=n.reason,l.review.confidence=Zi(l.review.confidence,r);for(let u of n.warnings)l.review.warnings.includes(u)||l.review.warnings.push(u);for(let u of n.candidateThreadIds)l.review.candidateThreadIds.includes(u)||l.review.candidateThreadIds.push(u);l.review.needsReview=Br(l.review.warnings),this.open.set(i,l),this.msgIndex.set(e.openMessageId,i);let d=this.byConversation.get(e.conversationId)??new Set;return d.add(i),this.byConversation.set(e.conversationId,d),this.lastBySender.set(this.senderKey(e),e.createTime),s&&c&&!l.askerIsBot&&this.byAsker.set(`${e.conversationId}\0${Ke(c)}`,i),{threadId:i,isNew:s,trace:o}}senderKey(e){return`${e.conversationId}\0${e.senderOpenDingTalkId||e.senderName}`}addressesName(e,n){let r=Ke(n);if(!r||!e)return!1;for(let o of["@",...this.addressPrefixes]){let i=0;for(;;){let s=e.indexOf(o,i);if(s<0)break;if(i=s+o.length,Ke(e.slice(i,i+r.length+24)).startsWith(r))return!0}}return!1}latestThreadOf(e,n,r){let o=null;for(let i of e){let s=this.open.get(i);!s||!r(s)||(n.includes(s.threadId)||n.push(s.threadId),(!o||s.lastActivityAt>o.lastActivityAt)&&(o=s))}return o?.threadId??null}toSnapshot(e,n,r,o){let i=e.messages.map(l=>({...l}));wl(i,{...o,...e.forcedAskerKey?{forcedAskerKey:e.forcedAskerKey}:{}});let s=[...e.review.warnings];r==="forced"&&!s.includes("forced_close")&&s.push("forced_close");let c=i[0];return{contractVersion:1,threadId:e.threadId,conversationId:e.conversationId,groupName:e.groupName,rootMsgId:c.openMessageId,messages:i,edges:e.edges,participants:yl(i),...hl(i),openedAt:e.openedAt,closedAt:n,closeReason:r,review:{reason:e.review.reason,confidence:e.review.confidence,warnings:s,candidateThreadIds:[...e.review.candidateThreadIds],needsReview:Br(s)}}}pruneIndex(){if(this.msgIndex.size<=2e4)return;let n=Math.floor(2e4/2),r=[...this.msgIndex.entries()];this.msgIndex.clear();for(let[o,i]of r.slice(r.length-n))this.msgIndex.set(o,i)}};function Ke(t){let e=(t??"").trim();return e?e.replace(/\s+/g,"")||e:""}a(Ke,"nameKey");var vl=new Map,Sl=new Set;function Xm(t,e){let n=vl.get(t);if(n)return n;let r=new zr(e??{});return vl.set(t,r),r}a(Xm,"getThreadStore");function kA(){vl.clear(),Sl.clear()}a(kA,"_resetThreadStoreRegistry");function vA(t,e){let n=`${t}::${e.logDir}`;if(Sl.has(n))return{files:0,messages:0,drainedSnapshots:[]};Sl.add(n);let o=Xm(t,e.storeOptions).recoverFromLog(e.logDir,e.days,e.now,e.roster);return eh(t,o.drainedSnapshots),o}a(vA,"recoverThreadStoreOnce");var xl=new Map;function Kn(t){let e=xl.get(t);return e||(e=[],xl.set(t,e)),e}a(Kn,"getQueue");function eh(t,e){if(e.length===0)return;let n=Kn(t);for(let r of e)n.some(o=>o.snapshot.threadId===r.threadId)||n.push({snapshot:r,attempts:0,failCount:0,nextRetryAt:0})}a(eh,"enqueueForDigest");function SA(t){return[...Kn(t)]}a(SA,"getPendingItems");function xA(t){return Kn(t).length===0}a(xA,"isDigestQueueEmpty");function RA(t,e){let n=Kn(t),r=n.findIndex(o=>o.snapshot.threadId===e);r>=0&&n.splice(r,1)}a(RA,"removeFromDigestQueue");function CA(t,e){let n=Kn(t).find(r=>r.snapshot.threadId===e);return n?(n.attempts+=1,n.attempts):0}a(CA,"incrementDigestAttempts");function IA(t,e,n){let r=Kn(t),o=r.findIndex(s=>s.snapshot.threadId===e);if(o<0)return{dropped:!1,failCount:0};let i=r[o];return i.failCount+=1,i.failCount>n.maxRetries?(r.splice(o,1),{dropped:!0,failCount:i.failCount}):(i.nextRetryAt=(n.now??Date.now())+n.backoffMs,{dropped:!1,failCount:i.failCount})}a(IA,"markDigestFailure");function TA(){xl.clear()}a(TA,"_resetDigestQueues");import{mkdir as _A,readFile as AA,writeFile as EA,chmod as th,rename as DA}from"fs/promises";import rh from"path";import PA from"os";var oh=rh.join(PA.homedir(),".aitable-workflow"),$A="credentials.json";function ih(t=oh){return rh.join(t,$A)}a(ih,"credentialsFilePath");function nh(){return{version:1,agents:[],activeAgent:null}}a(nh,"emptyStore");async function Ur(t){let e=ih(t);try{let n=await AA(e,"utf8"),r=JSON.parse(n);return r.version!==1||!Array.isArray(r.agents)?nh():r}catch{return nh()}}a(Ur,"readCredentials");async function sh(t,e){let n=e??oh,r=ih(n),o=`${r}.tmp`;await _A(n,{recursive:!0}),await EA(o,JSON.stringify(t,null,2)+`
|
|
454
|
+
`,"utf8"),await th(o,384),await DA(o,r),await th(r,384)}a(sh,"writeCredentials");async function FH(t,e){let n=await Ur(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 sh(n,e),n}a(FH,"saveCredential");async function NH(t,e,n){let o=(await Ur(n)).agents.find(i=>i.name===t);return o&&o.serverUrl!==e?o:null}a(NH,"findConflictingCredential");async function LH(t,e){let n=await Ur(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 sh(n,e),n}a(LH,"setActiveAgent");async function WH(t){let e=await Ur(t);return e.activeAgent?e.agents.find(n=>n.name===e.activeAgent)??null:null}a(WH,"getActiveCredential");async function BH(t){return(await Ur(t)).agents}a(BH,"listCredentials");function VH(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(VH,"maskSecret");var Qi=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 ae({bin:e.dws_bin})}async init(){if(this.initialized)return;m.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=ye(e);for(let r of n){if(!k(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))}m.info("tracker","field mapping resolved",{count:this.nameToId.size,mappings:Object.fromEntries(this.nameToId)}),this.initialized=!0}translateCellsToNames(e){let n={};for(let[r,o]of Object.entries(e)){let i=this.idToName.get(r)??r;n[i]=o}return n}translateCellsToIds(e){let n={};for(let[r,o]of Object.entries(e)){let i=this.nameToId.get(r)??r;n[i]=o}return n}translateFilterFieldNames(e){if(!e||typeof e!="object")return e;let n=e,r=n.operands;if(!Array.isArray(r))return e;let o=r[0];if(o&&typeof o=="object")return{...n,operands:r.map(i=>this.translateFilterFieldNames(i))};if(typeof o=="string"){let i=this.nameToId.get(o)??o;return{...n,operands:[i,...r.slice(1)]}}return e}async fetchCandidateItems(){let e=[...new Set([this.config.states.initial,...this.config.states.active])].filter(i=>typeof i=="string"&&i.length>0),n=[],r=new Set;if(e.length===0)return n;let o={operator:"or",operands:e.map(i=>({operator:"eq",operands:[this.fields.state,i]}))};for(let i of await this.queryRecords({filters:o})){let s=this.recordToWorkItem(i);r.has(s.id)||(r.add(s.id),n.push(s))}return n}async fetchItemsByIds(e){return e.length===0?[]:(await this.queryRecords({recordIds:e})).map(r=>this.recordToWorkItem(r))}async fetchItemsByStates(e){let n=[],r=new Set;for(let o of e){let i={operator:"and",operands:[{operator:"eq",operands:[this.fields.state,o]}]};for(let s of await this.queryRecords({filters:i})){let c=this.recordToWorkItem(s);r.has(c.id)||(r.add(c.id),n.push(c))}}return n}async fetchItemsByFilter(e,n){let r=Object.entries(e).filter(([c])=>c.length>0);if(r.length===0)return[];let o={operator:"and",operands:r.map(([c,l])=>({operator:"eq",operands:[c,l]}))},s=(await this.queryRecords({filters:o})).map(c=>this.recordToWorkItem(c));return n!==void 0?s.slice(0,n):s}async fetchAllItems(){let e=[this.config.states.initial,...this.config.states.active,...this.config.states.terminal,this.config.states.blocked,this.config.states.review].filter(i=>typeof i=="string"&&i.length>0),n=[...new Set(e)];if(n.length===0)return[];let r={operator:"or",operands:n.map(i=>({operator:"eq",operands:[this.fields.state,i]}))};return(await this.queryRecords({filters:r})).map(i=>this.recordToWorkItem(i))}async updateState(e,n){m.info("tracker","updating state",{itemId:e,state:n}),await this.updateRecord(e,{[this.fields.state]:n})}async updateCurrentStep(e,n){this.fields.current_step&&(m.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&&(m.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&&(m.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=>{m.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?qn(c.fields[r]):""}let i=X(),s=[o,`[${i}] ${n}`].filter(Boolean).join(`
|
|
455
|
+
`);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=ye(c);n.push(...l);let d=go(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=MA(e),r=this.translateCellsToNames(n);this.fillSubmitterFromMetadata(e,r);let o=OA(e);if(!o)throw new Error(`AI \u8868\u683C\u8BB0\u5F55\u7F3A\u5C11 recordId: ${JSON.stringify(e).slice(0,200)}`);let i=Object.fromEntries(this.nameToType);return{id:o,title:qn(r[this.fields.title])||"(\u65E0\u6807\u9898)",state:qn(r[this.fields.state])||"Unknown",currentStep:this.fields.current_step&&qn(r[this.fields.current_step])||null,owner:this.fields.owner&&qn(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=jA(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 MA(t){let e=le(t);if(!k(e))return{};for(let n of["cells","fields","fieldValues","values"]){let r=e[n];if(k(r))return r}return e}a(MA,"recordCells");function OA(t){let e=le(t);if(!k(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(OA,"extractRecordId");function jA(t){let e=le(t);return Cl(e)}a(jA,"extractSubmitterIdentity");function Cl(t){if(Array.isArray(t)){for(let n of t){let r=Cl(n);if(r)return r}return null}if(!k(t))return null;let e=Rl(t,["userId","user_id","createUserId","create_user_id","createdUserId","created_user_id","creatorUserId","creator_user_id"]);if(e){let n=Rl(t,["corpId","corp_id","corpID"]),r=Rl(t,["name","userName","user_name"]);return{userId:e,...n?{corpId:n}:{},...r?{name:r}:{}}}for(let n of Object.values(t)){let r=Cl(n);if(r)return r}return null}a(Cl,"findUserIdentityDeep");function Rl(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(Rl,"firstStringByKeys");function qn(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(qn).filter(Boolean).join(", ");if(k(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(qn,"cellToString");var Xi=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,m.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){m.error("event-source","PollingSource handler error",{error:r instanceof Error?r.message:String(r)})}if(!this.running)break;await this.sleep(this.intervalMs)}m.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 es=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),m.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 ts=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){m.debug("event-router","\u672A\u6CE8\u518C\u7684\u4E8B\u4EF6\u7C7B\u578B\uFF0C\u8DF3\u8FC7",{type:e.type});return}await n(e)}};import ah from"path";import ch from"fs";var FA={id:"",title:"",state:"",currentStep:null,owner:null,fields:{},raw:{}};function Il(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(Il,"buildCreateCells");var ns=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 zt,this.configScope=e.configScope;let n=e.toolkitRegistry;this.toolkitFactory=e.toolkitFactory??(()=>Lo({settings:this.settings,tracker:this.tracker,item:FA,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=>m.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=Il(this.settings,e.fields);m.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){m.warn("event-handler","update_record \u7F3A\u5C11 itemId");return}m.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=ah.resolve(this.settings.recipeDir,`${e}.recipe.ts`),o=ah.resolve(this.settings.recipeDir,`${e}.recipe.js`),i=ch.existsSync(r)?r:ch.existsSync(o)?o:r,s;i.endsWith(".ts")&&await Dt();try{s=await import(en(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(en(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
|
|
456
|
+
\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 NA={maxAttempts:3,baseBackoffMs:2e3,maxBackoffMs:6e4,maxStepFailures:5},rs=class{static{a(this,"RetryScheduler")}config;failureCounter=new Map;constructor(e){this.config={...NA,...e}}getBackoffMs(e){return Math.min(this.config.baseBackoffMs*2**e,this.config.maxBackoffMs)}shouldRetry(e){return e<this.config.maxAttempts-1}isExhausted(e,n){let r=this.failureCounter.get(e);return!!(r&&r.stepId===n&&r.count>=this.config.maxStepFailures)}hasFailures(e){return this.failureCounter.has(e)}recordFailure(e,n){let r=this.failureCounter.get(e);r&&r.stepId===n?r.count+=1:this.failureCounter.set(e,{stepId:n,count:1})}clearFailures(e){this.failureCounter.delete(e)}};function dh(t){return t.steps.some(e=>!e.auto)}a(dh,"hasHumanStep");function uh(t,e){if(!dh(e))return{kind:"none"};let n=t.tracker.states.review;if(n)return{kind:"explicit",state:n};let r=t.tracker.states.active;if(r[1])return{kind:"legacy",state:r[1],source:"active[1]"};if(r[0])return{kind:"legacy",state:r[0],source:"active[0]"};throw new Error(`\u5DE5\u4F5C\u6D41 ${e.meta.name} \u542B\u4EBA\u5DE5\u6B65\u9AA4\uFF0C\u4F46 tracker \u65E2\u672A\u58F0\u660E states.review\u3001active \u4E5F\u4E3A\u7A7A\uFF0C\u65E0\u6CD5\u786E\u5B9A\u4EBA\u5DE5\u5BA1\u6838\u72B6\u6001`)}a(uh,"resolveReviewStateDetailed");var lh=new WeakSet;function Vr(t,e){let n=uh(t,e);return n.kind==="none"?null:(n.kind==="legacy"&&!lh.has(e)&&(lh.add(e),m.warn("review-state",`\u5DE5\u4F5C\u6D41\u542B\u4EBA\u5DE5\u6B65\u9AA4\u4F46\u672A\u58F0\u660E tracker.states.review\uFF0C\u5DF2\u56DE\u9000\u5230 ${n.source}="${n.state}"\uFF08\u65E7\u5DE5\u4F5C\u6D41\u517C\u5BB9\uFF09\uFF0C\u8BF7\u663E\u5F0F\u58F0\u660E states.review`,{workflow:e.meta.name,fallbackSource:n.source,reviewState:n.state,...n.source==="active[0]"?{risk:"\u5BA1\u6838\u6001\u4E0E\u5904\u7406\u4E2D\u72B6\u6001\u91CD\u5408\uFF0C\u4EBA\u5DE5\u6B65\u9AA4\u4F1A\u6C38\u4E45\u505C\u5728\u7B49\u5F85\u5BA1\u6838"}:{}})),n.state)}a(Vr,"resolveReviewState");var fh="__human_prepared",os=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 ei({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 rs(r)}get reviewState(){let e=Vr(this.settings,this.workflow);if(e===null)throw new Error(`\u5DE5\u4F5C\u6D41 ${this.workflow.meta.name} \u4E0D\u542B\u4EBA\u5DE5\u6B65\u9AA4\uFF0C\u4E0D\u5E94\u8BBF\u95EE\u4EBA\u5DE5\u5BA1\u6838\u72B6\u6001`);return e}async processItem(e,n){let r={},o={recorded:!1,forceReplay:!!this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart},i=this.resolveCurrentStep(e);if(!i)return m.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 m.debug("step-engine","\u7B49\u5F85\u4EBA\u5DE5\u5BA1\u6838",{itemId:e.id,stepId:n.id}),null;if(n.recipe&&!this.hasHumanStepPrepared(e,n,r))return await this.executeHumanStepRecipe(e,n,r,o,i),null;if(this.settings.tracker.states.review){let l=this.settings.tracker.states.active.slice(1).filter(d=>d!==this.reviewState);if(l.length>0&&!l.includes(e.state))return m.warn("step-engine","\u4EBA\u5DE5\u6B65\u9AA4\u72B6\u6001\u672A\u660E\u786E\u786E\u8BA4\uFF0C\u62D2\u7EDD\u63A8\u8FDB",{itemId:e.id,stepId:n.id,state:e.state,confirmedStates:l}),null}i.recorded=!0,m.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(!i.forceReplay&&!this.retry.hasFailures(e.id)&&n.output_mapping&&this.isStepAlreadyComplete(e,n,r))return i.recorded=!0,m.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"&&(i.forceReplay=!0,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){m.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;m.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 LA(this.retry.getBackoffMs(s))}}return i}async prepareExecution(e,n){let r=this.settings.tracker.states.active[0],o=this.settings.tracker.states.restart,i={};r&&(e.state===this.settings.tracker.states.initial||e.state===o)&&(i.state=r),e.currentStep!==n.id&&(i.currentStep=n.id),(i.state!==void 0||i.currentStep!==void 0)&&await this.updateCheckpoint(e,i),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`;m.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):m.warn("step-engine","\u672A\u914D\u7F6E tracker.states.blocked\uFF0C\u5DE5\u5355\u65E0\u6CD5\u8F6C\u5165\u963B\u585E\u6001\u3001\u53EF\u80FD\u88AB\u6301\u7EED\u91CD\u8BD5",{itemId:e.id,stepId:n.id}),this.retry.clearFailures(e.id)}resolveCurrentStep(e){let n=this.workflow.orderedStepIds[0],r=n?this.stepsMap.get(n)??null:null;if(this.settings.tracker.states.restart&&e.state===this.settings.tracker.states.restart)return r;if(e.currentStep){let o=this.stepsMap.get(e.currentStep);if(o)return o}return e.state===this.settings.tracker.states.initial||this.settings.tracker.states.active.includes(e.state)?r:null}async handleFailureOrBlock(e,n,r){switch(r.status){case"failed":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"),m.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}`),m.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}`),m.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 k(o)?Object.keys(n.output_mapping).every(i=>{let s=o[i];return s!=null&&s!==""}):this.hasRecipeOutput(e,n)}hasRecipeOutput(e,n){if(!n.output_mapping)return!1;let r=Object.values(n.output_mapping);return r.length>0&&r.every(o=>{let i=e.fields[o];return i!=null&&i!==""})}hasHumanStepPrepared(e,n,r){let o=r[n.id];return k(o)&&o[fh]===!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}`),m.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=k(e[n.id])?e[n.id]:{};e[n.id]={...o,...r}}markHumanStepPrepared(e,n){let r=k(e[n.id])?e[n.id]:{};e[n.id]={...r,[fh]:!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 LA(t){return new Promise(e=>setTimeout(e,t))}a(LA,"sleep");var is=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):m.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 WA}from"crypto";var BA="__transient_",ss=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=`${BA}${WA(8).toString("hex")}`;return this.buffers.set(n,{cells:{...e}}),n}async finalize(e,n){let r=this.buffers.get(e);this.buffers.delete(e),r&&n.materialize&&await this.inner.updateFields("__new__",r.cells)}async fetchItemsByIds(e){let n=e.filter(i=>this.buffers.has(i)),r=e.filter(i=>!this.buffers.has(i)),o=n.map(i=>this.bufferToItem(i));return r.length>0&&o.push(...await this.inner.fetchItemsByIds(r)),o}fetchCandidateItems(){return this.inner.fetchCandidateItems()}fetchItemsByStates(e){return this.inner.fetchItemsByStates(e)}fetchAllItems(){return this.inner.fetchAllItems()}fetchItemsByFilter(e,n){return this.inner.fetchItemsByFilter(e,n)}async updateState(e,n){let r=this.buffers.get(e);if(r){r.cells[this.fields.state]=n;return}await this.inner.updateState(e,n)}async updateCurrentStep(e,n){let r=this.buffers.get(e);if(r){this.fields.current_step&&(r.cells[this.fields.current_step]=n);return}await this.inner.updateCurrentStep(e,n)}async updateFields(e,n){let r=this.buffers.get(e);if(r){Object.assign(r.cells,n);return}await this.inner.updateFields(e,n)}async appendEvent(e,n){let r=this.buffers.get(e);if(r){if(!this.fields.event_log)return;let o=String(r.cells[this.fields.event_log]??""),i=X();r.cells[this.fields.event_log]=[o,`[${i}] ${n}`].filter(Boolean).join(`
|
|
457
|
+
`);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 Tl(t){return{id:t.id,title:t.title,state:t.state,currentStep:t.currentStep}}a(Tl,"snapshotRunRecord");function ph(t){return We(t)!==void 0||rr(t)!==void 0}a(ph,"eventContextRequiresTransient");async function gh(t,e){We(t)&&await Mo.finalize(t,e)}a(gh,"finalizeEventContext");var zA=500,as=class{static{a(this,"Orchestrator")}settings;workflow;tracker;deferredTracker;stepEngine;eventHandlerExecutor;schedulerSources=[];eventBindings;queue=new es;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 ss(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 os({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 ns({settings:e.settings,tracker:this.deferredTracker,toolkitFactory:e.toolkitFactory,toolkitRegistry:e.toolkitRegistry,globalVars:e.globalVars,configScope:e.configScope}),this.taskPool=new is({capacity:e.settings.agent.max_concurrent,onError:a((n,r)=>{m.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(mh(c,i)),r.name)}catch(c){m.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){m.error("orchestrator","handler.onEvent \u5F02\u5E38",{source:r.name,error:d instanceof Error?d.message:String(d)})}}).catch(c=>{m.error("orchestrator","source.start \u5F02\u5E38",{source:r.name,error:c instanceof Error?c.message:String(c)})})}let e=new ts({timer_fired:a(async()=>{await this.reconcile()},"timer_fired")}),n=new Xi({intervalMs:this.settings.polling.interval_ms});this.schedulerSources.push(n),m.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()),m.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)&&m.info("orchestrator","\u7B49\u5F85\u5728\u9014\u4EFB\u52A1\u7ED3\u675F",{running:this.taskPool.running,queued:this.taskPool.depth}),await this.taskPool.drain();let e=zs();e>0&&m.info("orchestrator","\u7B49\u5F85\u8FDB\u884C\u4E2D\u7684\u5B50\u8FDB\u7A0B\u7ED3\u675F",{pending:e}),await ru(this.drainTimeoutMs)||(m.warn("orchestrator","drain \u8D85\u65F6\uFF0C\u5F3A\u5236\u4E2D\u6B62\u6B8B\u7559\u5B50\u8FDB\u7A0B",{remaining:zs()}),this.abortController?.abort())}async triggerOnce(e={}){let n=Date.now(),r=e.sourceName?this.eventBindings.find(u=>u.source.name===e.sourceName):this.eventBindings[0];if(!r){if(this.eventBindings.length===0)throw new Error("\u8BE5\u5DE5\u4F5C\u6D41\u6CA1\u6709\u914D\u7F6E\u4EFB\u4F55 event_sources\uFF0C\u65E0\u6CD5\u5355\u6B21\u89E6\u53D1");let u=this.eventBindings.map(f=>f.source.name).join("\u3001");throw new Error(`\u4E8B\u4EF6\u6E90 "${e.sourceName}" \u4E0D\u5B58\u5728\u3002\u8BE5\u5DE5\u4F5C\u6D41\u53EF\u7528\u4E8B\u4EF6\u6E90\uFF1A${u}`)}let o=[],i=await this.eventHandlerExecutor.createHandler(r.handlerRecipe,u=>o.push(mh(u,r.recordPolicy)),r.source.name);try{i.onEvent({type:e.event?.type??"manual_trigger",payload:e.event?.payload??{},timestamp:e.event?.timestamp??new Date().toISOString(),...e.event?.itemId!==void 0?{itemId:e.event.itemId}:{}});let u=e.graceMs??zA;o.length===0&&u>0&&await UA(o,u)}finally{i.stop()}let s=e.signal??new AbortController().signal,c=0,l=0;for(let u of o)u.action==="create_record"&&u.defer?(await this.runTransient(u,s),l++):(await this.eventHandlerExecutor.applyAction(u),c++);let d={sourceName:r.source.name,handlerRecipe:r.handlerRecipe,actions:o.length,applied:c,transient:l,durationMs:Date.now()-n};return m.info("orchestrator","\u5355\u6B21\u89E6\u53D1\u5B8C\u6210",d),d}async reconcile(){let e=this.queue.drainAll(),n=[];for(let d of e){if(d.action==="create_record"&&d.defer){n.push(d);continue}try{await this.eventHandlerExecutor.applyAction(d)}catch(u){m.error("orchestrator","\u843D\u5E93\u5931\u8D25",{action:d.action,error:u instanceof Error?u.message:String(u)})}}let r=await this.tracker.fetchCandidateItems(),o=Vr(this.settings,this.workflow),i=o===null?r:r.filter(d=>d.state!==o);for(let d of r)this.emitRunRecordSnapshot(d,o);let s=this.abortController?.signal??new AbortController().signal,c=[...n.map(d=>({key:`seed:${++this.seedSeq}`,run:a(()=>this.runTransient(d,s),"run")})),...i.map(d=>({key:d.id,run:a(async()=>{await this.stepEngine.processItem(d,s)},"run")}))];if(c.length===0)return;let l=this.taskPool.submit(c);m.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=Il(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){m.error("orchestrator","\u77AC\u6001\u8FD0\u884C\u5F02\u5E38",{transientId:o,error:l instanceof Error?l.message:String(l)}),s=!0,c=!1}try{await gh(e.eventContext,{completed:c,recorded:s})}catch(l){m.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:Tl(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 mh(t,e){return t.action==="create_record"&&(e==="on_demand"||ph(t.eventContext))?{...t,defer:!0}:t}a(mh,"tagDeferred");async function UA(t,e){let n=Date.now()+e,r=25;for(;t.length===0&&Date.now()<n;)await new Promise(o=>setTimeout(o,r))}a(UA,"waitForFirstAction");import Vh from"path";var _l=3e5,cs=class{static{a(this,"KbAutoRefresher")}options;timer=null;inFlight=!1;stopped=!1;constructor(e){this.options=e}start(){this.stopped||(m.info("kb-watcher","\u542F\u52A8\u81EA\u52A8\u5237\u65B0",{intervalMs:_l}),this.scheduleNext(0))}stop(){this.stopped=!0,this.timer&&(clearTimeout(this.timer),this.timer=null),m.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(_l);return}this.inFlight=!0;try{let e=await this.options.resolveCollections();if(e.length===0)m.debug("kb-watcher","\u65E0 collection,\u8DF3\u8FC7\u672C\u8F6E");else{let n=await Jt({configDir:this.options.configDir,collections:e,...this.options.agent?{agent:this.options.agent}:{},...this.options.configPath?{configPath:this.options.configPath}:{},...this.options.model?{model:this.options.model}:{},...this.options.bins?{bins:this.options.bins}:{}}),r=n.filter(i=>i.action==="compiled").length,o=n.filter(i=>i.action==="failed").length;if(r>0||o>0){m.info("kb-watcher","\u5237\u65B0\u5B8C\u6210",{total:n.length,compiled:r,skipped:n.length-r-o,failed:o});for(let i of n.filter(s=>s.action==="failed"))m.warn("kb-watcher","\u7F16\u8BD1\u5931\u8D25",{collection:i.collection,error:i.error})}else m.debug("kb-watcher","\u65E0\u53D8\u66F4",{total:n.length})}}catch(e){m.error("kb-watcher","\u81EA\u52A8\u5237\u65B0\u5F02\u5E38",{error:e instanceof Error?e.message:String(e)})}finally{this.inFlight=!1,this.scheduleNext(_l)}}}};import{existsSync as VA}from"fs";import hh from"path";function yh(t){return t.map(e=>e.collection)}a(yh,"collectionNames");var KA="knowledge-steward",Hn=class extends Error{static{a(this,"RequiredTaxonomyError")}constructor(e){super(e),this.name="RequiredTaxonomyError"}};function qA(t){let e=new Map;for(let n of t)for(let r of n.knowledge_scope?.kb_collections??[]){let o=typeof r=="string"?{collection:r,roleIds:[n.id]}:{collection:r.collection,...r.source?{source:r.source}:{},...r.compile?{compile:r.compile}:{},roleIds:[n.id]},i=e.get(o.collection);if(!i){e.set(o.collection,o);continue}i.roleIds=[...i.roleIds??[],n.id],o.source&&i.source&&o.source!==i.source&&m.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C\u8FDC\u7A0B\u6E90\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),o.compile&&i.compile&&JSON.stringify(o.compile)!==JSON.stringify(i.compile)&&m.warn("kb","\u540C\u4E00 collection \u58F0\u660E\u4E86\u4E0D\u540C compile\uFF0C\u4FDD\u7559\u5148\u58F0\u660E\u8005",{collection:o.collection,roles:i.roleIds}),!i.source&&o.source&&(i.source=o.source),!i.compile&&o.compile&&(i.compile=o.compile)}return[...e.values()]}a(qA,"resolveKbCollectionsFromRoles");async function Jn(t){let e=new xt(t.rolesDir),n=Xe(t.configDir,t.envSource);if(n?.roles){let c=hh.resolve(t.configDir,"profile");e.loadFromProfile(n.roles,c)}else await e.loadAll();let r=e.list(),o=qA(r),s=(r.find(c=>c.id===KA)?.knowledge_scope?.kb_collections??[]).map(c=>typeof c=="string"?c:c.collection);return{collections:yh(o),resolved:o,remoteSources:o.filter(c=>c.source!==void 0).map(c=>({source:c.source,collection:c.collection})),requiredTaxonomyCollections:s}}a(Jn,"collectKbCollections");function HA(t,e){for(let n of e){let r=hh.resolve(t,n,"taxonomy.yml");if(!VA(r))throw new Hn(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7F3A\u5C11\u81EA\u5DF1\u7684 taxonomy.yml: ${r}`);try{bt({configDir:t,entry:n})}catch(o){let i=o instanceof Error?o.message:String(o);throw new Hn(`knowledge-steward \u53EF\u5199 collection\u300C${n}\u300D\u7684 taxonomy.yml \u975E\u6CD5: ${i}`)}}}a(HA,"validateRequiredTaxonomies");async function Al(t){let{settings:e,force:n,onProgress:r}=t,o=await Jn(e),i=o.resolved,s=o.collections;if(HA(e.configDir,o.requiredTaxonomyCollections),i.length===0)return{collections:s,results:[],skippedReason:"no-collections"};let c=await Pn(e),l=c.configuredAgent,d=zn(e.raw?.toolkit_config);if(!l){let f=i.filter(It);if(f.length===0)return m.warn("kb","engine \u4E3A llm_only,\u65E0 coding agent \u53EF\u7528,\u8DF3\u8FC7 KB \u7F16\u8BD1",{collections:s,engine:c.configuredEngine}),{collections:s,results:[],skippedReason:"llm_only"};let p=await Jt({configDir:e.configDir,collections:f,...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:yh(f),results:p}}let u=await Jt({configDir:e.configDir,collections:i,...n?{force:n}:{},agent:l,...e.agent.model?{model:e.agent.model}:{},configPath:ft(e.configDir),...d?{bins:d}:{},...r?{onProgress:r}:{}});return{collections:s,results:u}}a(Al,"setupKnowledgeBases");import{readFile as ZA,writeFile as YA}from"fs/promises";import QA from"yaml";var JA=10;async function ls(t,e){let{baseId:n,fields:r}=e,o=e.name,i=await Dl(t,n,o,e.onProgress);if(i)return await e.onProgress?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${o}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${i.tableId}`),{tableId:i.tableId,reused:!0};try{return{tableId:await wh(t,{baseId:n,name:o,fields:r}),reused:!1}}catch(s){if(!bh(s))throw s;await e.onProgress?.(`\u8868\u540D\u300C${o}\u300D\u51B2\u7A81\uFF0C\u5C1D\u8BD5\u590D\u7528\u5DF2\u5B58\u5728\u8868`);let c=await Pl(t,n,o);if(c)return await e.onProgress?.(`\u590D\u7528\u5DF2\u6709\u8868\u300C${o}\u300D: ${c.tableId}`),{tableId:c.tableId,reused:!0};let l=await GA(t,{baseId:n,name:o,fields:r,onProgress:e.onProgress});if(l)return l;throw s}}a(ls,"createTableWithConflictResolution");async function GA(t,e){let{baseId:n,fields:r}=e;for(let o=2;o<=JA+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 wh(t,{baseId:n,name:i,fields:r});return await e.onProgress?.(`\u5DF2\u4F7F\u7528\u8868\u540D\u300C${i}\u300D\u521B\u5EFA\u8868: ${s}`),{tableId:s,reused:!1}}catch(s){if(!bh(s))throw s;let c=await Pl(t,n,i);if(c)return{tableId:c.tableId,reused:!0}}}return null}a(GA,"createTableWithRename");async function wh(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=kh(n);if(!r)throw new Error(`\u521B\u5EFA\u8868\u300C${e.name}\u300D\u540E\u672A\u8FD4\u56DE tableId`);return r}a(wh,"createTable");async function Dl(t,e,n,r){try{return await Pl(t,e,n)}catch(o){let i=o instanceof Error?o.message:String(o);return await r?.(`\u65E0\u6CD5\u5217\u51FA base \u5DF2\u6709\u8868\uFF08${i}\uFF09\uFF0C\u7EE7\u7EED\u5C1D\u8BD5\u65B0\u5EFA\u300C${n}\u300D`),null}}a(Dl,"findExistingTableByName");async function Pl(t,e,n){let r=await $l(t,e),o=n.trim();return r.find(i=>i.name.trim()===o)??null}a(Pl,"findTableByName");async function $l(t,e){let n=await t.runJson(["aitable","table","get","--base-id",e,"--timeout","60"],{timeoutMs:9e4}),r=le(n);return ye(r).filter(k).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($l,"listTablesInBase");function bh(t){if(!(t instanceof ge))return!1;let e=`${t.message}
|
|
458
|
+
${t.stderr}`.toLowerCase();return e.includes("already exist")||e.includes("\u5DF2\u5B58\u5728")||e.includes("duplicate")||e.includes("exist")}a(bh,"isTableNameConflictError");function kh(t){let e=le(t),n=El(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=kh(r);if(o)return o}return null}a(kh,"findTableId");function El(t,e){if(!k(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=>El(o,e)).find(Boolean)??null:El(n,e);if(r)return r}return null}a(El,"findStringByKeys");async function Ol(t){let{trackerFilePath:e,settings:n,workflow:r,onProgress:o}=t;if(n.tracker.table_id.trim())return n;await o?.("\u672A\u586B\u5199 Table Id\uFF0C\u4F18\u5148\u590D\u7528 base \u5185\u540C\u540D\u8868\uFF0C\u5426\u5219\u81EA\u52A8\u65B0\u5EFA\u6570\u636E\u8868","create_table");let i=await Sh(n,r,o);return await vh(e,i),await o?.(`\u6570\u636E\u8868\u5DF2\u5C31\u7EEA\uFF1A${i}`,"create_table"),{...n,tracker:{...n.tracker,table_id:i}}}a(Ol,"ensureTableExists");async function vh(t,e){let n=await ZA(t,"utf8"),r=QA.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 YA(t,r.toString(),"utf8")}a(vh,"writeTableIdToConfig");async function Sh(t,e,n){let r=new ae({bin:t.tracker.dws_bin,timeoutMs:6e4}),o="dws aitable table create",i=XA(e.tracker?.label??e.meta.name??"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"),s=await Dl(r,t.tracker.base_id,i,d=>n?.(d,"create_table"));if(s)return m.info("setup","\u590D\u7528 base \u4E0B\u540C\u540D AI \u8868\u683C\u6570\u636E\u8868",{baseId:t.tracker.base_id,tableName:i,tableId:s.tableId}),await n?.(`base \u5185\u5DF2\u6709\u540C\u540D\u8868\u300C${i}\u300D\uFF0C\u76F4\u63A5\u590D\u7528: ${s.tableId}`,"create_table"),s.tableId;await n?.("\u6B63\u5728\u8C03\u7528 dws \u521B\u5EFA\u6570\u636E\u8868","create_table"),m.info("setup","\u8C03\u7528 dws \u521B\u5EFA AI \u8868\u683C\u6570\u636E\u8868",{command:o,dwsBin:t.tracker.dws_bin,baseId:t.tracker.base_id,tableName:i});let c=await r.runJson(["aitable","table","create","--base-id",t.tracker.base_id,"--name",i,"--fields",JSON.stringify(xh(t)),"--timeout","60","--yes"],{timeoutMs:9e4}),l=Rh(c);if(!l){let d=le(c);throw m.warn("setup","dws \u521B\u5EFA\u6570\u636E\u8868\u540E\u672A\u8FD4\u56DE tableId",{command:o,baseId:t.tracker.base_id,response:d}),Object.assign(new Error("dws \u5EFA\u8868\u547D\u4EE4\u672A\u8FD4\u56DE tableId\uFF0C\u65E0\u6CD5\u786E\u8BA4\u6570\u636E\u8868\u662F\u5426\u521B\u5EFA\u6210\u529F\uFF1B\u8BF7\u68C0\u67E5 dws CLI \u8F93\u51FA\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u786E\u8BA4\u540E\u624B\u52A8\u8865\u5145 table_id"),{code:"TABLE_ID_NOT_RETURNED",status:502,details:{command:o,response:d}})}return l}a(Sh,"createWorkflowTable");function XA(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"\u5DE5\u4F5C\u6D41\u4EFB\u52A1"}a(XA,"sanitizeTableName");function xh(t){let e=[t.tracker.states.initial,...t.tracker.states.active,...t.tracker.states.terminal,t.tracker.states.blocked,t.tracker.states.review].filter((l,d,u)=>!!l&&u.indexOf(l)===d),n=t.tracker.fields.title,r=t.tracker.fields.state,o=[],i=new Set,s=a(l=>{i.has(l.fieldName)||(o.push(l),i.add(l.fieldName))},"addField"),c=a(l=>(t.tracker.field_definitions??[]).find(d=>d.name===l)?.description,"descOf");if(n===r)return s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),o;s({fieldName:n,type:"primaryDoc",...c(n)?{description:c(n)}:{}}),s({fieldName:r,type:"singleSelect",config:{options:e.map(l=>({name:l}))},...c(r)?{description:c(r)}:{}});for(let l of t.tracker.field_definitions??[])s(eE(l));return o}a(xh,"initialTableFields");function eE(t){let e={fieldName:t.name,type:t.type},n={};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),t.formatter&&(n.formatter=t.formatter),Object.keys(n).length>0&&(e.config=n),t.description&&(e.description=t.description),e}a(eE,"fieldDefinitionToCreatePayload");function Rh(t){let e=le(t),n=Ml(e,["tableId","table_id","sheetId","id"]);if(n)return n;if(Array.isArray(e))for(let r of e){let o=Rh(r);if(o)return o}return null}a(Rh,"findTableId");function Ml(t,e){if(!k(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=>Ml(o,e)).find(Boolean)??null:Ml(n,e);if(r)return r}return null}a(Ml,"findStringByKeys");async function Kr(t,e,n,r){let o=r?.get(e);if(o||(o=await $l(t,e),r?.set(e,o)),!o.some(s=>s.tableId===n))throw new Error(`tracker.table_id="${n}" \u4E0D\u5C5E\u4E8E tracker.base_id="${e}"\uFF08\u53EF\u80FD\u662F\u6539\u4E86 base_id \u4F46\u6CA1\u6E05\u7A7A\u65E7 table_id\uFF09\u3002\u8BF7\u6E05\u7A7A table_id \u540E\u91CD\u8DD1 setup\u3002`)}a(Kr,"assertTableBelongsToBase");import Zr from"path";import{access as EE}from"fs/promises";import DE from"fs";var Mh={};Tw(Mh,{ASSETS_DIR:()=>Ul,HASH_VERSION:()=>Tt,MANIFEST_NAME:()=>zl,MAX_PAGE_SIZE:()=>xs,ROWS_DIR:()=>bn,SchemaChangeError:()=>Qn,TableScanStuckError:()=>Gr,VOLATILE_FIELD_TYPES:()=>ds,assetsPath:()=>Ih,collectPendingAttachments:()=>vs,computeRowHash:()=>ps,computeSchemaFingerprint:()=>ms,computeSnapshotFingerprint:()=>gs,createDwsTableReader:()=>Rs,describeSchemaChange:()=>ks,diffSchemas:()=>ws,extOf:()=>Fl,hasAttachmentFailure:()=>Dh,isBlockingSchemaChange:()=>bs,isVolatileType:()=>Bl,localizeAttachments:()=>Ss,localizeInlineImages:()=>Nl,manifestPath:()=>Hr,normalizeCell:()=>Ll,normalizeCells:()=>us,parseFieldSchemas:()=>fs,parseNextCursor:()=>Yn,parseRawRecords:()=>Zn,pullTable:()=>Eh,readAllRowSnapshots:()=>$h,readManifest:()=>ys,readRowSnapshot:()=>ql,resourceIdFromUrl:()=>Gn,rowPath:()=>kn,sniffImageExt:()=>Kl,writeJsonAtomic:()=>Jr});var ds=["formula","button","createdTime","lastModifiedTime","creator","lastModifier"];import{createHash as tE}from"crypto";var nE=new Set(["unidirectionalLink","bidirectionalLink"]);function ke(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(ke,"isRecord");function fe(t){return typeof t=="string"?t:t==null?"":String(t)}a(fe,"str");function jl(t){if(!ke(t))return null;let e=fe(t.name).trim();return e?{id:fe(t.id),name:e}:null}a(jl,"toOption");function rE(t,e){if(!ke(t))return null;let n=fe(t.resourceId).trim(),r=fe(t.filename).trim(),o=typeof t.size=="number"?t.size:Number(t.size??0)||0,i=fe(t.type);if(!n){let s=fe(t.resourceUrl||t.url).trim();return s?{filename:r,resourceId:Gn(s),asset:"",size:o,mediaType:i,url:s,link:!0}:null}return{filename:r,resourceId:n,asset:`${e}/${n}${Fl(r)}`,size:o,mediaType:i}}a(rE,"toAttachment");function Fl(t){let e=/(\.[A-Za-z0-9]{1,10})$/.exec(String(t??""));return e?e[1].toLowerCase():""}a(Fl,"extOf");function oE(t){return t.map(e=>e.filename).filter(Boolean).join(", ")}a(oE,"attachmentsText");var iE=/!\[([^\]]*)\]\(\s*(<[^>]+>|[^)\s]+)(?:\s+(?:"[^"]*"|'[^']*'|\([^)]*\)))?\s*\)/g;function Gn(t){let n=String(t??"").split("?")[0]??"",o=(n.split("/").pop()??"").replace(/\.[A-Za-z0-9]{1,10}$/,"");return/^[0-9a-fA-F-]{16,}$/.test(o)?o:o?o.replace(/[^\w.-]/g,"_"):tE("sha1").update(n).digest("hex").slice(0,32)}a(Gn,"resourceIdFromUrl");function Nl(t,e){let n=[],r=new Set;return{markdown:String(t??"").replace(iE,(i,s,c)=>{let l=c.startsWith("<")&&c.endsWith(">")?c.slice(1,-1):c;if(!/^https?:\/\//i.test(l))return i;let d=Gn(l),u=`${e}/${d}`;return r.has(d)||(r.add(d),n.push({filename:s||d,resourceId:d,asset:u,size:0,mediaType:"image"})),``}),images:n}}a(Nl,"localizeInlineImages");function Ll(t,e,n,r){let o=n.fields.get(t),i=o?.type??"text",s=n.assetsDir??"assets";if(e==null||e==="")return null;if(i==="attachment"){if(!Array.isArray(e))return null;let l=[];for(let d of e){let u=rE(d,s);u?l.push(u):r(`\u9644\u4EF6\u9879\u65E2\u65E0 resourceId \u4E5F\u65E0\u53EF\u7528 URL\uFF0C\u65E0\u4ECE\u5F15\u7528\uFF0C\u5DF2\u8DF3\u8FC7\uFF1A${JSON.stringify(d).slice(0,120)}`)}return l.length===0?null:{type:i,value:l,text:oE(l)}}if(nE.has(i)){let l=ke(e)&&Array.isArray(e.linkedRecordIds)?e.linkedRecordIds.map(fe).filter(Boolean):[];if(l.length===0)return null;let d=l.map(f=>({recordId:f})),u={type:i,value:d,text:""};return o?.linkedTableId&&o.linkedTableId===n.sheetId&&(u.selfLink=!0),u}if(i==="richText"){let l=ke(e)?fe(e.markdown):fe(e);if(!l.trim())return null;let{markdown:d,images:u}=Nl(l,s),p={type:i,value:{markdown:d},text:d};return u.length>0&&(p.embeddedImages=u),p}if(i==="url"){let l=ke(e)?fe(e.link||e.text).trim():fe(e).trim();if(!l)return null;let d=ke(e)&&fe(e.text).trim()||l;return{type:i,value:l,text:d===l?l:`${d} ${l}`}}if(i==="singleSelect"){let l=jl(e);return l?{type:i,value:l,text:l.name}:null}if(i==="multipleSelect"){if(!Array.isArray(e))return null;let l=e.map(jl).filter(d=>d!==null);return l.length===0?null:{type:i,value:l,text:l.map(d=>d.name).join(", ")}}if(i==="user"||i==="department"||i==="group"||i==="creator"||i==="lastModifier"){if(!Array.isArray(e))return null;let l=e.map(d=>ke(d)?fe(d.userRef||d.userId||d.ref||d.id):fe(d)).filter(Boolean).map(d=>({userRef:d}));return l.length===0?null:{type:i,value:l,text:l.map(d=>d.userRef).join(", ")}}if(i==="checkbox")return e===!0||e==="true"?{type:i,value:!0,text:"true"}:null;if(typeof e=="string"||typeof e=="number"||typeof e=="boolean"){let l=fe(e);return l.trim()?{type:i,value:l,text:l}:null}r(`\u5B57\u6BB5\u7C7B\u578B ${i} \u7684\u8FD4\u56DE\u7ED3\u6784\u672A\u8BC6\u522B\uFF0C\u5DF2\u6309 JSON \u6587\u672C\u515C\u5E95`);let c=JSON.stringify(e);return{type:i,value:c,text:c}}a(Ll,"normalizeCell");function us(t,e,n,r){let o={};for(let[i,s]of Object.entries(e??{})){let c=Ll(i,s,n,l=>r.push({recordId:t,fieldId:i,message:l}));c&&(o[i]=c)}return o}a(us,"normalizeCells");function fs(t){let e=ke(t)?t.data:void 0,n=ke(e)&&Array.isArray(e.fields)?e.fields:[],r=[];for(let o of n){if(!ke(o))continue;let i=fe(o.fieldId).trim();if(!i)continue;let s=ke(o.config)?o.config:void 0,c=s&&Array.isArray(s.options)?s.options:void 0,l={id:i,name:fe(o.fieldName).trim(),type:fe(o.type).trim()||"text"};if(c){let d=c.map(jl).filter(u=>u!==null);d.length&&(l.options=d)}s&&s.linkedTableId&&(l.linkedTableId=fe(s.linkedTableId)),r.push(l)}return r}a(fs,"parseFieldSchemas");function Zn(t){let e=ke(t)?t.data:void 0,n=ke(e)&&Array.isArray(e.records)?e.records:[],r=[];for(let o of n){if(!ke(o))continue;let i=fe(o.recordId).trim();i&&r.push({recordId:i,cells:ke(o.cells)?o.cells:{}})}return r}a(Zn,"parseRawRecords");function Yn(t){let e=ke(t)?t.data:void 0;return ke(e)?fe(e.nextCursor).trim():""}a(Yn,"parseNextCursor");import{createHash as sE}from"crypto";var Tt="1";function Wl(t){return`sha256:${sE("sha256").update(t,"utf8").digest("hex")}`}a(Wl,"sha256");function qr(t){return String(t??"").replace(/\r\n/g,`
|
|
459
|
+
`).trim()}a(qr,"canonText");function aE(t){return t.replace(/(assets\/[\w-]+)\.[A-Za-z0-9]{1,10}/g,"$1")}a(aE,"canonAssetRefs");function cE(t){return{filename:qr(t.filename),size:t.size,resourceId:t.resourceId}}a(cE,"canonAttachment");function lE(t){let e=t.value;if(typeof e=="string")return qr(e);if(typeof e=="boolean")return e;if(Array.isArray(e))return e.map(n=>{if(n&&typeof n=="object"){if("resourceId"in n)return cE(n);if("recordId"in n)return{recordId:n.recordId};if("userRef"in n)return{userRef:n.userRef};if("name"in n){let r=n;return{id:r.id??"",name:qr(r.name)}}}return n});if(e&&typeof e=="object"){if("markdown"in e)return{markdown:aE(qr(e.markdown))};if("name"in e){let n=e;return{id:n.id??"",name:qr(n.name)}}}return e}a(lE,"canonCellValue");function Bl(t,e){return e?.includes(t)?!1:ds.includes(t)}a(Bl,"isVolatileType");function ps(t,e={}){let n=[];for(let o of Object.keys(t).sort()){let i=t[o];if(Bl(i.type,e.includeVolatileTypes))continue;let s=lE(i);s===""||Array.isArray(s)&&s.length===0||n.push([o,{type:i.type,value:s}])}let r=JSON.stringify(n);return Wl(`${Tt}
|
|
460
|
+
${r}`)}a(ps,"computeRowHash");function gs(t){let e=Object.entries(t).map(([n,r])=>`${n}:${r}`).sort();return Wl(`${Tt}
|
|
459
461
|
${e.join(`
|
|
460
|
-
`)}`)}a(
|
|
462
|
+
`)}`)}a(gs,"computeSnapshotFingerprint");function ms(t){let e=t.map(n=>{let r=(n.options??[]).map(o=>`${o.id}=${o.name}`).sort().join("|");return`${n.id}:${n.name}:${n.type}:${r}:${n.linkedTableId??""}`}).sort();return Wl(`${Tt}
|
|
461
463
|
${e.join(`
|
|
462
|
-
`)}`)}a(
|
|
463
|
-
`,"utf8"),
|
|
464
|
-
`)}a(ys,"describeSchemaChange");import{mkdir as U_,writeFile as V_,rename as K_,stat as u2,readdir as q_}from"fs/promises";import Nl from"path";import{randomBytes as H_}from"crypto";function ws(t,e){let n=[];for(let[r,o]of Object.entries(e)){if(o.type==="attachment"){let s=t[r];if(!Array.isArray(s))continue;let c=new Map;for(let l of s)if(l&&typeof l=="object"){let d=l,u=typeof d.resourceId=="string"?d.resourceId:"",f=typeof d.url=="string"?d.url:"";u&&f&&c.set(u,f)}for(let l of o.value){if(l.link||!l.asset)continue;let d=c.get(l.resourceId);d&&n.push({attachment:l,url:d})}continue}let i=o.embeddedImages;if(i?.length){let s=t[r],c=s&&typeof s=="object"&&"markdown"in s?String(s.markdown??""):String(s??""),l=new Map;for(let d of c.matchAll(/!\[[^\]]*\]\(\s*(<[^>]+>|[^)\s]+)/g)){let u=d[1];u.startsWith("<")&&u.endsWith(">")&&(u=u.slice(1,-1)),/^https?:\/\//i.test(u)&&l.set(Hn(u),u)}for(let d of i){let u=l.get(d.resourceId);u&&n.push({attachment:d,url:u})}}}return n}a(ws,"collectPendingAttachments");function Ll(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?".png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?".jpg":t.length>=6&&t.subarray(0,3).toString("latin1")==="GIF"?".gif":t.length>=12&&t.subarray(0,4).toString("latin1")==="RIFF"&&t.subarray(8,12).toString("latin1")==="WEBP"?".webp":t.length>=5&&t.subarray(0,5).toString("latin1")==="<?xml"||t.length>=4&&t.subarray(0,4).toString("latin1")==="<svg"?".svg":".png"}a(Ll,"sniffImageExt");async function bs(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??3e4,i=Math.max(1,n.concurrency??4),s={downloaded:0,skipped:0,failed:[],resolved:{}},c=new Map;for(let g of e)c.has(g.attachment.resourceId)||c.set(g.attachment.resourceId,g);let l=[...c.values()];if(l.length===0)return s;let d=Nl.join(t,"assets");await U_(d,{recursive:!0});let u=new Map;for(let g of await q_(d).catch(()=>[]))g.includes(".tmp-")||u.set(g.replace(/\.[A-Za-z0-9]{1,10}$/,""),g);let f=0,p=a(async()=>{for(;;){let g=f++;if(g>=l.length)return;let{attachment:h,url:y}=l[g],w=/\.[A-Za-z0-9]{1,10}$/.test(h.asset),b=u.get(h.resourceId);if(b){s.skipped+=1,s.resolved[h.resourceId]=`assets/${b}`;continue}let v=new AbortController,R=setTimeout(()=>v.abort(),o);try{let S=await r(y,{signal:v.signal});if(!S.ok)throw new Error(`HTTP ${S.status}`);let C=Buffer.from(await S.arrayBuffer());if(C.byteLength===0)throw new Error("\u7A7A\u54CD\u5E94\u4F53");let A=w?h.asset:`assets/${h.resourceId}${Ll(C)}`,_=Nl.join(t,A),T=`${_}.tmp-${H_(4).toString("hex")}`;await V_(T,C),await K_(T,_),s.downloaded+=1,s.resolved[h.resourceId]=A,u.set(h.resourceId,Nl.basename(A))}catch(S){s.failed.push({resourceId:h.resourceId,filename:h.filename,reason:S instanceof Error?S.message:String(S)})}finally{clearTimeout(R)}}},"worker");return await Promise.all(Array.from({length:Math.min(i,l.length)},()=>p())),s}a(bs,"localizeAttachments");import{readdir as J_,unlink as G_}from"fs/promises";import{existsSync as hh}from"fs";import gh from"path";var ks=100,Z_=1,Y_=4,mh=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),qr=class extends Error{static{a(this,"TableScanStuckError")}rowsRead;pages;cursor;lastOkRecordId;lastOkCells;limitsTried;cause;constructor(e){let n=e.cause instanceof Error?e.cause.message:String(e.cause);super(`\u53D6\u6570\u5728\u7B2C ${e.rowsRead+1} \u6761\u5904\u5361\u4F4F\u4E14\u65E0\u6CD5\u7ED5\u8FC7\uFF08\u5DF2\u6210\u529F\u8BFB\u53D6 ${e.rowsRead} \u884C / ${e.pages} \u9875\uFF09\u3002\u5DF2\u8BD5 limit=${e.limitsTried.join("/")} \u5747\u5931\u8D25 \u2192 \u4E0E\u9875\u5927\u5C0F\u65E0\u5173\uFF0C\u5224\u5B9A\u4E3A\u8BE5\u884C\u6570\u636E\u672C\u8EAB\u7684\u95EE\u9898\u3002\u539F\u56E0\uFF1A${n}`),this.name="TableScanStuckError",this.rowsRead=e.rowsRead,this.pages=e.pages,this.cursor=e.cursor,this.lastOkRecordId=e.lastOkRecordId,this.lastOkCells=e.lastOkCells,this.limitsTried=e.limitsTried,this.cause=e.cause}};async function Q_(t,e){let n=t.maxPages??2e3,r=Math.min(t.pageSize??ks,ks),o=[],i,s=0,c=r,l=0,d=Z_;for(;;){let u=[],f=t.backoffMs?.retry??2e3,p=t.backoffMs?.degrade??3e3,g,h,y=!1;for(let b=0;b<3;b++){if(b===1)t.onProgress?.(`\u5355\u9875\u53D6\u6570\u5931\u8D25\uFF08limit=${c}\uFF09\u2192 \u7B49 ${f}ms \u539F\u503C\u91CD\u8BD5\uFF08\u6392\u9664\u62D6\u5EF6/\u9650\u6D41\uFF09`),await mh(f);else if(b===2){if(c<=1||d<=0)break;let v=Math.max(1,Math.floor(c/Y_));t.onProgress?.(`\u4ECD\u5931\u8D25 \u2192 \u7B49 ${p}ms \u540E\u964D\u7EA7\u5230 limit=${v} \u63A2\u8DEF\u4E00\u6B21\uFF08\u9274\u522B\u201C\u9875\u592A\u5927\u201D\u8FD8\u662F\u201C\u810F\u6570\u636E\u201D\uFF09`),await mh(p),c=v,d-=1}u.push(c);try{g=await t.reader.queryRecords({baseId:t.baseId,sheetId:t.sheetId,limit:c,...i?{cursor:i}:{}}),y=!0,b===2&&(l=c);break}catch(v){h=v}}if(!y){let b=o[o.length-1];throw new qr({rowsRead:o.length,pages:s,cursor:i,lastOkRecordId:b?.recordId,lastOkCells:b?.cells,limitsTried:u,cause:h})}s+=1,o.push(...Jn(g));let w=Gn(g);if(t.onProgress?.(`\u7B2C ${s} \u9875\uFF08limit=${c}\uFF09\uFF1A\u7D2F\u8BA1 ${o.length} \u884C`),!w||w===i)break;if(i=w,s>=n)throw new Error(`\u5206\u9875\u8D85\u8FC7\u4FDD\u9669\u4E1D ${n} \u9875\uFF08\u5DF2\u53D6 ${o.length} \u884C\uFF09\u3002\u82E5\u8868\u786E\u5B9E\u66F4\u5927\uFF0C\u8BF7\u8C03\u9AD8 maxPages\u3002`)}return l>0&&e(`\u5355\u9875\u6761\u6570\u5DF2\u964D\u7EA7\u5230 ${l}\uFF08\u539F ${r}\uFF09\uFF1A\u8BE5\u8868\u5355\u884C\u6570\u636E\u8F83\u5927\uFF08\u5185\u5D4C\u56FE/\u957F\u5BCC\u6587\u672C\uFF09\uFF0C\u5927 limit \u4F1A\u88AB\u670D\u52A1\u7AEF\u62D2\u7EDD\u3002\u5EFA\u8BAE\u5728 profile \u91CC\u56FA\u5316 page_size=${l} \u4EE5\u7701\u53BB\u6BCF\u8F6E\u8BD5\u9519\u3002`),{rows:o,pages:s}}a(Q_,"scanAll");async function X_(t,e){let n=gh.join(t,yn);if(!hh(n))return[];let r=[];for(let o of await J_(n)){if(!o.endsWith(".json"))continue;let i=o.slice(0,-5);e.has(i)||(await G_(gh.join(n,o)),r.push(i))}return r}a(X_,"pruneRows");function eE(t,e){if(Object.keys(e).length!==0)for(let n of t)for(let r of Object.values(n.cells)){let o=r.embeddedImages;if(!o?.length)continue;let i=r.value&&typeof r.value=="object"&&"markdown"in r.value?r.value.markdown:"";for(let s of o){let c=e[s.resourceId];!c||c===s.asset||(i=i.split(`(${s.asset})`).join(`(${c})`),s.asset=c)}i&&(r.value.markdown=i,r.text=i)}}a(eE,"applyResolvedAssets");async function yh(t){let{snapshotDir:e,baseId:n,sheetId:r}=t,o=new Date().toISOString(),i=[],s=ls(await t.reader.getFields({baseId:n,sheetId:r}));if(s.length===0)throw new Error(`\u672A\u8BFB\u5230\u4EFB\u4F55\u5B57\u6BB5\uFF08baseId=${n} sheetId=${r}\uFF09`);let c=gs(e);if(c){let _=ms(c.fields,s);if(hs(_)){let T=ys(_,c.fields);if(!t.acceptSchemaChange)throw new Zn(T,_);i.push(`[\u5DF2\u6309 --accept-schema-change \u653E\u884C] ${T}`)}_.optionsChanged.length>0&&i.push(`\u5355\u9009\u9009\u9879\u6709\u589E\u51CF\uFF08${_.optionsChanged.join(", ")}\uFF09\uFF1A\u76EE\u5F55\u96C6\u5408\u53EF\u80FD\u53D8\u5316\uFF0C\u9700\u91CD\u5EFA\u7D22\u5F15`)}let{rows:l,pages:d}=await Q_(t,_=>i.push(_));t.onProgress?.(`scan \u5B8C\u6210\uFF1A${l.length} \u884C / ${d} \u9875`);let u={fields:new Map(s.map(_=>[_.id,_])),sheetId:r},f=[],p=[],g=[];for(let _ of l){let T=cs(_.recordId,_.cells,u,f);p.push({recordId:_.recordId,cells:T}),g.push(...ws(_.cells,T))}for(let _ of f)i.push(`${_.recordId}/${_.fieldId}: ${_.message}`);let h=await bs(e,g,t.attachmentOptions);for(let _ of h.failed)i.push(`\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${_.filename}\uFF08${_.resourceId}\uFF09\u2014\u2014 ${_.reason}`);eE(p,h.resolved);let y=[],w={};for(let _ of p){let T=ds(_.cells,t.hashOptions);y.push({recordId:_.recordId,rowHash:T,fetchedAt:o,cells:_.cells}),w[_.recordId]=T}let b=us(w),v=fs(s);if(!t.force&&c?.snapshotFingerprint===b&&c?.schemaFingerprint===v&&c?.hashVersion===Tt)return t.onProgress?.("\u5FEB\u7167\u6307\u7EB9\u672A\u53D8 \u2192 \u8DF3\u8FC7\u5199\u76D8\u4E0E\u7F16\u8BD1"),{manifest:c,changed:[],removed:[],unchanged:!0,attachmentsDownloaded:h.downloaded,attachmentsSkipped:h.skipped,warnings:i};let S=[];for(let _ of y){let T=c?.rows[_.recordId],I=c?.hashVersion!==Tt;!t.force&&!I&&T===_.rowHash&&hh(wn(e,_.recordId))||(Kr(wn(e,_.recordId),_),S.push(_.recordId))}let C=await X_(e,new Set(Object.keys(w))),A={baseId:n,sheetId:r,hashVersion:Tt,fetchedAt:o,fields:s,rows:w,snapshotFingerprint:b,schemaFingerprint:v};return Kr(Vr(e),A),{manifest:A,changed:S,removed:C,unchanged:!1,attachmentsDownloaded:h.downloaded,attachmentsSkipped:h.skipped,warnings:i}}a(yh,"pullTable");function wh(t){return t.warnings.some(e=>e.startsWith("\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25"))}a(wh,"hasAttachmentFailure");function vs(t){let e=t.timeoutSeconds??120,n=(e+30)*1e3;return{async getFields({baseId:r,sheetId:o}){return t.client.runJson(["aitable","+field-get","--baseId",r,"--tableId",o,"--timeout",String(e)],{timeoutMs:n})},async queryRecords({baseId:r,sheetId:o,limit:i,cursor:s}){let c=["aitable","+record-query","--base-id",r,"--table-id",o,"--limit",String(i),"--timeout",String(e)];return s&&c.push("--cursor",s),t.client.runJson(c,{timeoutMs:n})}}}a(vs,"createDwsTableReader");import{readFileSync as tE,existsSync as bh}from"fs";import{readdirSync as nE}from"fs";import rE from"path";function Wl(t,e){let n=wn(t,e);if(!bh(n))return null;try{return JSON.parse(tE(n,"utf8"))}catch{return null}}a(Wl,"readRowSnapshot");function kh(t){let e=rE.join(t,yn);if(!bh(e))return[];let n=[];for(let r of nE(e).sort()){if(!r.endsWith(".json"))continue;let o=Wl(t,r.slice(0,-5));o&&n.push(o)}return n}a(kh,"readAllRowSnapshots");import Bl from"fs/promises";import Sh from"path";async function zl(t){let{collectionDir:e,activeRowIds:n}=t,r=Sh.join(e,"articles"),o=[],i=[],s;try{s=await Bl.readdir(r)}catch{return{removed:o,kept:i}}for(let c of s){if(!c.endsWith(".md")||c.startsWith("_"))continue;let l=Sh.join(r,c),d;try{d=await Bl.readFile(l,"utf8")}catch{continue}let f=Ee(d).sourceRowId;f&&!n.has(f)?(await Bl.rm(l,{force:!0}),o.push(c)):i.push(c)}return{removed:o,kept:i}}a(zl,"cleanupOrphanArticles");async function xh(t,e){let n=await gn(t,e),r=await Rt(Mt(t,e));return{collection:e,state:n,currentHash:r,sourceChanged:bi(n,r)}}a(xh,"getKbStatus");async function sE(t){return(await qn(t)).resolved}a(sE,"resolveAllCollections");function aE(t){return Wn(t.raw?.toolkit_config)}a(aE,"shellBins");async function Ul(t){let n=(await En(t)).configuredAgent;return{...n?{agent:n}:{},...t.agent.model?{model:t.agent.model}:{},configPath:ft(t.configDir)}}a(Ul,"resolveCompileAgent");function Vl(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(Vl,"printKbProgress");function Kl(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(Kl,"printKbSummary");var cE=["broken-link","absolute-path","invalid-category","missing-sources"];function lE(t){let e=[];for(let n of t){if(n.action==="failed"){e.push(`${n.collection}: \u7F16\u8BD1\u5931\u8D25\uFF08${n.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}let r=n.report;if(!r){n.action==="skipped"&&e.push(`${n.collection}: \u8DF3\u8FC7\u7F16\u8BD1\u4E14\u65E0\u5386\u53F2\u7F16\u8BD1\u62A5\u544A\uFF0C\u65E0\u6CD5\u786E\u8BA4\u4EA7\u7269\u8D28\u91CF`);continue}let o=n.action==="skipped"?`${n.collection}\uFF08\u4E0A\u6B21\u7F16\u8BD1\uFF09`:n.collection;if(r.status==="failed"){e.push(`${o}: \u4E0A\u6B21\u7F16\u8BD1\u5931\u8D25\uFF08${r.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}if((r.failedFileCount??0)>0&&e.push(`${o}: ${r.failedFileCount} \u4E2A\u6E90\u6587\u4EF6\u7F16\u8BD1\u5931\u8D25`),r.lintError)e.push(`${o}: lint \u672A\u80FD\u6267\u884C\uFF08${r.lintError}\uFF09\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`);else if(r.lint)for(let i of cE){let s=r.lint.counts[i]??0;s>0&&e.push(`${o}: lint ${i} \xD7${s}`)}else e.push(`${o}: \u7F16\u8BD1\u62A5\u544A\u65E0 lint \u7ED3\u679C\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`)}return e}a(lE,"evaluateStrictGate");function dE(t,e){return e.map(n=>{if(n.action!=="skipped"||n.report)return n;try{let r=iE.readFileSync(xn(t,n.collection),"utf8");return{...n,report:JSON.parse(r)}}catch{return n}})}a(dE,"attachHistoricalReports");function Ch(t,e){let n=lE(dE(e,t));if(n.length!==0){console.error(`
|
|
465
|
-
\u2717 strict \u95E8\u7981\u672A\u901A\u8FC7\uFF08${n.length} \u9879\uFF09\uFF1A`);for(let r of n)console.error(` - ${r}`);process.exit(1)}}a(
|
|
466
|
-
\u77E5\u8BC6\u5E93\u72B6\u6001:`);for(let o of r){if(It(o)){let u=o.compile.artifact,f=
|
|
464
|
+
`)}`)}a(ms,"computeSchemaFingerprint");import{mkdirSync as dE,readFileSync as uE,writeFileSync as fE,existsSync as pE,renameSync as gE}from"fs";import hs from"path";var zl="manifest.json",bn="rows",Ul="assets",Qn=class extends Error{constructor(n,r){super(n);this.diff=r;this.name="SchemaChangeError"}diff;static{a(this,"SchemaChangeError")}};function Hr(t){return hs.join(t,zl)}a(Hr,"manifestPath");function kn(t,e){return hs.join(t,bn,`${e}.json`)}a(kn,"rowPath");function Ih(t){return hs.join(t,Ul)}a(Ih,"assetsPath");function ys(t){let e=Hr(t);if(!pE(e))return null;try{return JSON.parse(uE(e,"utf8"))}catch{return null}}a(ys,"readManifest");function Jr(t,e){dE(hs.dirname(t),{recursive:!0});let n=`${t}.tmp`;fE(n,`${JSON.stringify(e,null,2)}
|
|
465
|
+
`,"utf8"),gE(n,t)}a(Jr,"writeJsonAtomic");function ws(t,e){let n=new Map(t.map(i=>[i.id,i])),r=new Map(e.map(i=>[i.id,i])),o={added:[],removed:[],renamed:[],retyped:[],optionsChanged:[]};for(let[i,s]of r){let c=n.get(i);if(!c){o.added.push(i);continue}c.name!==s.name&&o.renamed.push({id:i,from:c.name,to:s.name}),c.type!==s.type&&o.retyped.push({id:i,from:c.type,to:s.type}),Ch(c)!==Ch(s)&&o.optionsChanged.push(i)}for(let i of n.keys())r.has(i)||o.removed.push(i);return o}a(ws,"diffSchemas");function Ch(t){return(t.options??[]).map(e=>`${e.id}=${e.name}`).sort().join("|")}a(Ch,"optionsKey");function bs(t){return t.removed.length>0||t.renamed.length>0||t.retyped.length>0}a(bs,"isBlockingSchemaChange");function ks(t,e){let n=a(o=>e.find(i=>i.id===o)?.name??o,"nameOf"),r=["\u8868\u7ED3\u6784\u53D1\u751F\u4E86\u9700\u8981\u4EBA\u5DE5\u786E\u8BA4\u7684\u53D8\u5316\uFF0C\u5DF2\u505C\u6B62\u62C9\u53D6\uFF1A"];for(let o of t.renamed)r.push(` \xB7 \u5217\u6539\u540D\uFF1A${o.id}\u300C${o.from}\u300D\u2192\u300C${o.to}\u300D`);for(let o of t.removed)r.push(` \xB7 \u5217\u88AB\u5220\u9664\uFF1A${o}\u300C${n(o)}\u300D`);for(let o of t.retyped)r.push(` \xB7 \u5217\u7C7B\u578B\u53D8\u66F4\uFF1A${o.id}\u300C${n(o.id)}\u300D${o.from} \u2192 ${o.to}`);return r.push(""),r.push("\u6309\u5B57\u6BB5\u540D\u4E66\u5199\u7684\u6295\u5F71\u58F0\u660E\u4F1A\u9759\u9ED8\u89E3\u6790\u4E0D\u5230\u503C\uFF08\u6574\u5217\u6570\u636E\u6D88\u5931\uFF0C\u4F46\u7F16\u8BD1\u770B\u8D77\u6765\u6210\u529F\uFF09\uFF0C"),r.push("\u6545\u5FC5\u987B\u5148\u786E\u8BA4\u6620\u5C04\uFF1A\u66F4\u65B0 template \u7684\u5217\u540D\u6620\u5C04\u540E\u91CD\u8DD1\uFF0C\u6216\u7528 --accept-schema-change \u5F3A\u5236\u7EE7\u7EED\u3002"),r.join(`
|
|
466
|
+
`)}a(ks,"describeSchemaChange");import{mkdir as mE,writeFile as hE,rename as yE,stat as K2,readdir as wE}from"fs/promises";import Vl from"path";import{randomBytes as bE}from"crypto";function vs(t,e){let n=[];for(let[r,o]of Object.entries(e)){if(o.type==="attachment"){let s=t[r];if(!Array.isArray(s))continue;let c=new Map;for(let l of s)if(l&&typeof l=="object"){let d=l,u=typeof d.resourceId=="string"?d.resourceId:"",f=typeof d.url=="string"?d.url:"";u&&f&&c.set(u,f)}for(let l of o.value){if(l.link||!l.asset)continue;let d=c.get(l.resourceId);d&&n.push({attachment:l,url:d})}continue}let i=o.embeddedImages;if(i?.length){let s=t[r],c=s&&typeof s=="object"&&"markdown"in s?String(s.markdown??""):String(s??""),l=new Map;for(let d of c.matchAll(/!\[[^\]]*\]\(\s*(<[^>]+>|[^)\s]+)/g)){let u=d[1];u.startsWith("<")&&u.endsWith(">")&&(u=u.slice(1,-1)),/^https?:\/\//i.test(u)&&l.set(Gn(u),u)}for(let d of i){let u=l.get(d.resourceId);u&&n.push({attachment:d,url:u})}}}return n}a(vs,"collectPendingAttachments");function Kl(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71?".png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?".jpg":t.length>=6&&t.subarray(0,3).toString("latin1")==="GIF"?".gif":t.length>=12&&t.subarray(0,4).toString("latin1")==="RIFF"&&t.subarray(8,12).toString("latin1")==="WEBP"?".webp":t.length>=5&&t.subarray(0,5).toString("latin1")==="<?xml"||t.length>=4&&t.subarray(0,4).toString("latin1")==="<svg"?".svg":".png"}a(Kl,"sniffImageExt");async function Ss(t,e,n={}){let r=n.fetchImpl??fetch,o=n.timeoutMs??3e4,i=Math.max(1,n.concurrency??4),s={downloaded:0,skipped:0,failed:[],resolved:{}},c=new Map;for(let g of e)c.has(g.attachment.resourceId)||c.set(g.attachment.resourceId,g);let l=[...c.values()];if(l.length===0)return s;let d=Vl.join(t,"assets");await mE(d,{recursive:!0});let u=new Map;for(let g of await wE(d).catch(()=>[]))g.includes(".tmp-")||u.set(g.replace(/\.[A-Za-z0-9]{1,10}$/,""),g);let f=0,p=a(async()=>{for(;;){let g=f++;if(g>=l.length)return;let{attachment:h,url:y}=l[g],w=/\.[A-Za-z0-9]{1,10}$/.test(h.asset),b=u.get(h.resourceId);if(b){s.skipped+=1,s.resolved[h.resourceId]=`assets/${b}`;continue}let v=new AbortController,R=setTimeout(()=>v.abort(),o);try{let S=await r(y,{signal:v.signal});if(!S.ok)throw new Error(`HTTP ${S.status}`);let C=Buffer.from(await S.arrayBuffer());if(C.byteLength===0)throw new Error("\u7A7A\u54CD\u5E94\u4F53");let _=w?h.asset:`assets/${h.resourceId}${Kl(C)}`,A=Vl.join(t,_),T=`${A}.tmp-${bE(4).toString("hex")}`;await hE(T,C),await yE(T,A),s.downloaded+=1,s.resolved[h.resourceId]=_,u.set(h.resourceId,Vl.basename(_))}catch(S){s.failed.push({resourceId:h.resourceId,filename:h.filename,reason:S instanceof Error?S.message:String(S)})}finally{clearTimeout(R)}}},"worker");return await Promise.all(Array.from({length:Math.min(i,l.length)},()=>p())),s}a(Ss,"localizeAttachments");import{readdir as kE,unlink as vE}from"fs/promises";import{existsSync as Ah}from"fs";import Th from"path";var xs=100,SE=1,xE=4,_h=a(t=>new Promise(e=>setTimeout(e,t)),"sleep"),Gr=class extends Error{static{a(this,"TableScanStuckError")}rowsRead;pages;cursor;lastOkRecordId;lastOkCells;limitsTried;cause;constructor(e){let n=e.cause instanceof Error?e.cause.message:String(e.cause);super(`\u53D6\u6570\u5728\u7B2C ${e.rowsRead+1} \u6761\u5904\u5361\u4F4F\u4E14\u65E0\u6CD5\u7ED5\u8FC7\uFF08\u5DF2\u6210\u529F\u8BFB\u53D6 ${e.rowsRead} \u884C / ${e.pages} \u9875\uFF09\u3002\u5DF2\u8BD5 limit=${e.limitsTried.join("/")} \u5747\u5931\u8D25 \u2192 \u4E0E\u9875\u5927\u5C0F\u65E0\u5173\uFF0C\u5224\u5B9A\u4E3A\u8BE5\u884C\u6570\u636E\u672C\u8EAB\u7684\u95EE\u9898\u3002\u539F\u56E0\uFF1A${n}`),this.name="TableScanStuckError",this.rowsRead=e.rowsRead,this.pages=e.pages,this.cursor=e.cursor,this.lastOkRecordId=e.lastOkRecordId,this.lastOkCells=e.lastOkCells,this.limitsTried=e.limitsTried,this.cause=e.cause}};async function RE(t,e){let n=t.maxPages??2e3,r=Math.min(t.pageSize??xs,xs),o=[],i,s=0,c=r,l=0,d=SE;for(;;){let u=[],f=t.backoffMs?.retry??2e3,p=t.backoffMs?.degrade??3e3,g,h,y=!1;for(let b=0;b<3;b++){if(b===1)t.onProgress?.(`\u5355\u9875\u53D6\u6570\u5931\u8D25\uFF08limit=${c}\uFF09\u2192 \u7B49 ${f}ms \u539F\u503C\u91CD\u8BD5\uFF08\u6392\u9664\u62D6\u5EF6/\u9650\u6D41\uFF09`),await _h(f);else if(b===2){if(c<=1||d<=0)break;let v=Math.max(1,Math.floor(c/xE));t.onProgress?.(`\u4ECD\u5931\u8D25 \u2192 \u7B49 ${p}ms \u540E\u964D\u7EA7\u5230 limit=${v} \u63A2\u8DEF\u4E00\u6B21\uFF08\u9274\u522B\u201C\u9875\u592A\u5927\u201D\u8FD8\u662F\u201C\u810F\u6570\u636E\u201D\uFF09`),await _h(p),c=v,d-=1}u.push(c);try{g=await t.reader.queryRecords({baseId:t.baseId,sheetId:t.sheetId,limit:c,...i?{cursor:i}:{}}),y=!0,b===2&&(l=c);break}catch(v){h=v}}if(!y){let b=o[o.length-1];throw new Gr({rowsRead:o.length,pages:s,cursor:i,lastOkRecordId:b?.recordId,lastOkCells:b?.cells,limitsTried:u,cause:h})}s+=1,o.push(...Zn(g));let w=Yn(g);if(t.onProgress?.(`\u7B2C ${s} \u9875\uFF08limit=${c}\uFF09\uFF1A\u7D2F\u8BA1 ${o.length} \u884C`),!w||w===i)break;if(i=w,s>=n)throw new Error(`\u5206\u9875\u8D85\u8FC7\u4FDD\u9669\u4E1D ${n} \u9875\uFF08\u5DF2\u53D6 ${o.length} \u884C\uFF09\u3002\u82E5\u8868\u786E\u5B9E\u66F4\u5927\uFF0C\u8BF7\u8C03\u9AD8 maxPages\u3002`)}return l>0&&e(`\u5355\u9875\u6761\u6570\u5DF2\u964D\u7EA7\u5230 ${l}\uFF08\u539F ${r}\uFF09\uFF1A\u8BE5\u8868\u5355\u884C\u6570\u636E\u8F83\u5927\uFF08\u5185\u5D4C\u56FE/\u957F\u5BCC\u6587\u672C\uFF09\uFF0C\u5927 limit \u4F1A\u88AB\u670D\u52A1\u7AEF\u62D2\u7EDD\u3002\u5EFA\u8BAE\u5728 profile \u91CC\u56FA\u5316 page_size=${l} \u4EE5\u7701\u53BB\u6BCF\u8F6E\u8BD5\u9519\u3002`),{rows:o,pages:s}}a(RE,"scanAll");async function CE(t,e){let n=Th.join(t,bn);if(!Ah(n))return[];let r=[];for(let o of await kE(n)){if(!o.endsWith(".json"))continue;let i=o.slice(0,-5);e.has(i)||(await vE(Th.join(n,o)),r.push(i))}return r}a(CE,"pruneRows");function IE(t,e){if(Object.keys(e).length!==0)for(let n of t)for(let r of Object.values(n.cells)){let o=r.embeddedImages;if(!o?.length)continue;let i=r.value&&typeof r.value=="object"&&"markdown"in r.value?r.value.markdown:"";for(let s of o){let c=e[s.resourceId];!c||c===s.asset||(i=i.split(`(${s.asset})`).join(`(${c})`),s.asset=c)}i&&(r.value.markdown=i,r.text=i)}}a(IE,"applyResolvedAssets");async function Eh(t){let{snapshotDir:e,baseId:n,sheetId:r}=t,o=new Date().toISOString(),i=[],s=fs(await t.reader.getFields({baseId:n,sheetId:r}));if(s.length===0)throw new Error(`\u672A\u8BFB\u5230\u4EFB\u4F55\u5B57\u6BB5\uFF08baseId=${n} sheetId=${r}\uFF09`);let c=ys(e);if(c){let A=ws(c.fields,s);if(bs(A)){let T=ks(A,c.fields);if(!t.acceptSchemaChange)throw new Qn(T,A);i.push(`[\u5DF2\u6309 --accept-schema-change \u653E\u884C] ${T}`)}A.optionsChanged.length>0&&i.push(`\u5355\u9009\u9009\u9879\u6709\u589E\u51CF\uFF08${A.optionsChanged.join(", ")}\uFF09\uFF1A\u76EE\u5F55\u96C6\u5408\u53EF\u80FD\u53D8\u5316\uFF0C\u9700\u91CD\u5EFA\u7D22\u5F15`)}let{rows:l,pages:d}=await RE(t,A=>i.push(A));t.onProgress?.(`scan \u5B8C\u6210\uFF1A${l.length} \u884C / ${d} \u9875`);let u={fields:new Map(s.map(A=>[A.id,A])),sheetId:r},f=[],p=[],g=[];for(let A of l){let T=us(A.recordId,A.cells,u,f);p.push({recordId:A.recordId,cells:T}),g.push(...vs(A.cells,T))}for(let A of f)i.push(`${A.recordId}/${A.fieldId}: ${A.message}`);let h=await Ss(e,g,t.attachmentOptions);for(let A of h.failed)i.push(`\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${A.filename}\uFF08${A.resourceId}\uFF09\u2014\u2014 ${A.reason}`);IE(p,h.resolved);let y=[],w={};for(let A of p){let T=ps(A.cells,t.hashOptions);y.push({recordId:A.recordId,rowHash:T,fetchedAt:o,cells:A.cells}),w[A.recordId]=T}let b=gs(w),v=ms(s);if(!t.force&&c?.snapshotFingerprint===b&&c?.schemaFingerprint===v&&c?.hashVersion===Tt)return t.onProgress?.("\u5FEB\u7167\u6307\u7EB9\u672A\u53D8 \u2192 \u8DF3\u8FC7\u5199\u76D8\u4E0E\u7F16\u8BD1"),{manifest:c,changed:[],removed:[],unchanged:!0,attachmentsDownloaded:h.downloaded,attachmentsSkipped:h.skipped,warnings:i};let S=[];for(let A of y){let T=c?.rows[A.recordId],I=c?.hashVersion!==Tt;!t.force&&!I&&T===A.rowHash&&Ah(kn(e,A.recordId))||(Jr(kn(e,A.recordId),A),S.push(A.recordId))}let C=await CE(e,new Set(Object.keys(w))),_={baseId:n,sheetId:r,hashVersion:Tt,fetchedAt:o,fields:s,rows:w,snapshotFingerprint:b,schemaFingerprint:v};return Jr(Hr(e),_),{manifest:_,changed:S,removed:C,unchanged:!1,attachmentsDownloaded:h.downloaded,attachmentsSkipped:h.skipped,warnings:i}}a(Eh,"pullTable");function Dh(t){return t.warnings.some(e=>e.startsWith("\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25"))}a(Dh,"hasAttachmentFailure");function Rs(t){let e=t.timeoutSeconds??120,n=(e+30)*1e3;return{async getFields({baseId:r,sheetId:o}){return t.client.runJson(["aitable","+field-get","--baseId",r,"--tableId",o,"--timeout",String(e)],{timeoutMs:n})},async queryRecords({baseId:r,sheetId:o,limit:i,cursor:s}){let c=["aitable","+record-query","--base-id",r,"--table-id",o,"--limit",String(i),"--timeout",String(e)];return s&&c.push("--cursor",s),t.client.runJson(c,{timeoutMs:n})}}}a(Rs,"createDwsTableReader");import{readFileSync as TE,existsSync as Ph}from"fs";import{readdirSync as _E}from"fs";import AE from"path";function ql(t,e){let n=kn(t,e);if(!Ph(n))return null;try{return JSON.parse(TE(n,"utf8"))}catch{return null}}a(ql,"readRowSnapshot");function $h(t){let e=AE.join(t,bn);if(!Ph(e))return[];let n=[];for(let r of _E(e).sort()){if(!r.endsWith(".json"))continue;let o=ql(t,r.slice(0,-5));o&&n.push(o)}return n}a($h,"readAllRowSnapshots");import Hl from"fs/promises";import Oh from"path";async function Jl(t){let{collectionDir:e,activeRowIds:n}=t,r=Oh.join(e,"articles"),o=[],i=[],s;try{s=await Hl.readdir(r)}catch{return{removed:o,kept:i}}for(let c of s){if(!c.endsWith(".md")||c.startsWith("_"))continue;let l=Oh.join(r,c),d;try{d=await Hl.readFile(l,"utf8")}catch{continue}let f=Ee(d).sourceRowId;f&&!n.has(f)?(await Hl.rm(l,{force:!0}),o.push(c)):i.push(c)}return{removed:o,kept:i}}a(Jl,"cleanupOrphanArticles");async function jh(t,e){let n=await hn(t,e),r=await Rt(Mt(t,e));return{collection:e,state:n,currentHash:r,sourceChanged:Si(n,r)}}a(jh,"getKbStatus");async function PE(t){return(await Jn(t)).resolved}a(PE,"resolveAllCollections");function $E(t){return zn(t.raw?.toolkit_config)}a($E,"shellBins");async function Gl(t){let n=(await Pn(t)).configuredAgent;return{...n?{agent:n}:{},...t.agent.model?{model:t.agent.model}:{},configPath:ft(t.configDir)}}a(Gl,"resolveCompileAgent");function Zl(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(Zl,"printKbProgress");function Yl(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(Yl,"printKbSummary");var ME=["broken-link","absolute-path","invalid-category","missing-sources"];function OE(t){let e=[];for(let n of t){if(n.action==="failed"){e.push(`${n.collection}: \u7F16\u8BD1\u5931\u8D25\uFF08${n.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}let r=n.report;if(!r){n.action==="skipped"&&e.push(`${n.collection}: \u8DF3\u8FC7\u7F16\u8BD1\u4E14\u65E0\u5386\u53F2\u7F16\u8BD1\u62A5\u544A\uFF0C\u65E0\u6CD5\u786E\u8BA4\u4EA7\u7269\u8D28\u91CF`);continue}let o=n.action==="skipped"?`${n.collection}\uFF08\u4E0A\u6B21\u7F16\u8BD1\uFF09`:n.collection;if(r.status==="failed"){e.push(`${o}: \u4E0A\u6B21\u7F16\u8BD1\u5931\u8D25\uFF08${r.error??"\u672A\u77E5\u9519\u8BEF"}\uFF09`);continue}if((r.failedFileCount??0)>0&&e.push(`${o}: ${r.failedFileCount} \u4E2A\u6E90\u6587\u4EF6\u7F16\u8BD1\u5931\u8D25`),r.lintError)e.push(`${o}: lint \u672A\u80FD\u6267\u884C\uFF08${r.lintError}\uFF09\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`);else if(r.lint)for(let i of ME){let s=r.lint.counts[i]??0;s>0&&e.push(`${o}: lint ${i} \xD7${s}`)}else e.push(`${o}: \u7F16\u8BD1\u62A5\u544A\u65E0 lint \u7ED3\u679C\uFF0C\u4EA7\u7269\u8D28\u91CF\u672A\u7ECF\u68C0\u9A8C`)}return e}a(OE,"evaluateStrictGate");function jE(t,e){return e.map(n=>{if(n.action!=="skipped"||n.report)return n;try{let r=DE.readFileSync(Cn(t,n.collection),"utf8");return{...n,report:JSON.parse(r)}}catch{return n}})}a(jE,"attachHistoricalReports");function Nh(t,e){let n=OE(jE(e,t));if(n.length!==0){console.error(`
|
|
467
|
+
\u2717 strict \u95E8\u7981\u672A\u901A\u8FC7\uFF08${n.length} \u9879\uFF09\uFF1A`);for(let r of n)console.error(` - ${r}`);process.exit(1)}}a(Nh,"enforceStrictGate");async function Lh(t,e){let n=await PE(e);if(t.length>0){let r=n.filter(o=>t.includes(o.collection));for(let o of t)r.some(i=>i.collection===o)||r.push({collection:o});return r}return n.length===0?(console.log("\u26A0 \u672A\u53D1\u73B0\u4EFB\u4F55 kb_collections\uFF08\u68C0\u67E5 roles \u7684 knowledge_scope.kb_collections\uFF09"),null):n}a(Lh,"resolveTargets");async function Wh(t,e,n){let r=await _e(e.config),o=await Lh(t,r);if(!o)return{results:[],configDir:r.configDir};let i=$E(r),s=await Jt({configDir:r.configDir,collections:o,force:n,...await Gl(r),...i?{bins:i}:{},onProgress:Zl});return Yl({collections:o.map(c=>c.collection),results:s}),{results:s,configDir:r.configDir}}a(Wh,"runKbRefresh");async function FE(t,e){let{results:n,configDir:r}=await Wh(t,e,e.full??!1);e.strict&&Nh(n,r)}a(FE,"runKbCompileCommand");async function GG(t,e){let{results:n,configDir:r}=await Wh(t,e,!1);e.strict&&Nh(n,r)}a(GG,"runKbUpdateCommand");async function ZG(t,e){let n=await _e(e.config),r=await Lh(t,n);if(r){console.log(`
|
|
468
|
+
\u77E5\u8BC6\u5E93\u72B6\u6001:`);for(let o of r){if(It(o)){let u=o.compile.artifact,f=Zr.resolve(n.configDir,o.collection,u),p=!1;try{await EE(f),p=!0}catch{p=!1}console.log(` \xB7 ${o.collection}: \u81EA\u5B9A\u4E49\u7F16\u8BD1\uFF08${o.compile.build.length} \u6761\u547D\u4EE4\uFF09\xB7 \u4EA7\u7269${p?"\u5DF2\u5C31\u7EEA":"\u7F3A\u5931"}: ${u}`),p||console.log(" \u21B3 \u4EA7\u7269\u7F3A\u5931\uFF1A\u5148\u8DD1 setup \u6216 kb compile \u89E6\u53D1\u7F16\u8BD1\u547D\u4EE4\u94FE");continue}let i=await jh(n.configDir,o.collection),s=i.state?.status??"\u672A\u7F16\u8BD1",c=i.sourceChanged?"\uFF08\u6E90\u5DF2\u53D8\u66F4\uFF0C\u9700\u91CD\u7F16\u8BD1\uFF09":"",l=i.state?.compiledCount!=null?` \xB7 ${i.state.compiledCount} \u7BC7`:"",d=i.state?.finishedAt?` \xB7 ${i.state.finishedAt}`:"";console.log(` \xB7 ${o.collection}: ${s}${l}${d} ${c}`),i.state?.lastError&&console.log(` \u21B3 \u9519\u8BEF: ${i.state.lastError}`)}}}a(ZG,"runKbStatusCommand");function NE(t){return"totalDocs"in t}a(NE,"isIngestReport");async function YG(t,e){let n=Zr.dirname(Zr.resolve(e.config)),r=e.output??Zr.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 Wn({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(NE(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(`
|
|
467
469
|
\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(`
|
|
468
470
|
\u2713 ${c}: ${s.title??s.relativePath}`),s.action!=="skipped"&&console.log(` \u6587\u4EF6: ${s.filePath}`)}else console.error(`
|
|
469
471
|
\u2717 \u5BFC\u5165\u5931\u8D25: ${s.error}`),process.exit(1);e.compile&&(console.log(`
|
|
470
|
-
\u89E6\u53D1\u7F16\u8BD1...`),await uE([],{config:e.config}))}a(yG,"runKbIngestCommand");var pE=100,Rh=200;async function wG(t,e){let n=await Ae(e.config),r=Hr.resolve(n.configDir,t),o=new Set;for(let c of n.workflowEntries){let l=await st(c.templatePath,{envSource:n.envSource}),u=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??l.tracker;if(!u)continue;let f=An(n,c,u),{base_id:p,table_id:g}=f.tracker;if(!p.trim()||!g.trim())continue;let h=vs({client:new ae({bin:f.tracker.dws_bin})}),y;for(let w=0;;w++){if(w>=Rh)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${c.id}\u300Dtracker \u8868\u5206\u9875\u8D85\u4FDD\u9669\u4E1D ${Rh} \u9875\uFF0C\u5DF2\u62D2\u7EDD\u6E05\u7406`);let b=await h.queryRecords({baseId:p,sheetId:g,limit:pE,...y?{cursor:y}:{}});for(let R of Jn(b))o.add(R.recordId);let v=Gn(b);if(!v||v===y)break;y=v}}let{removed:i,kept:s}=await zl({collectionDir:r,activeRowIds:o});console.log(`\u6E05\u7406\u4E86 ${i.length} \u7BC7\u5B64\u513F\u6587\u7AE0\uFF0C\u4FDD\u7559 ${s.length} \u7BC7`);for(let c of i)console.log(` - ${c}`)}a(wG,"runKbCleanupCommand");import{watch as gE}from"fs";function mE(t){return t?t===".env"||t.endsWith(".yml")||t.endsWith(".yaml"):!0}a(mE,"isRelevantFile");function Ah(t){return JSON.stringify({raw:t.raw,env:t.envSource})}a(Ah,"snapshot");function _h(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??(()=>Ae(t.configPath)),o=t.debounceMs??300,i=a(async()=>{let p=await r(),g=Ah(n.current());n.applyReload(p);let h=Ah(n.current())!==g;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 g=await i();for(;c;)c=!1,g=await i();return g}finally{s=null}})();return s=p,p},"refresh"),d=null,u=a(()=>{d&&clearTimeout(d),d=setTimeout(()=>{d=null,l().then(p=>{p&&m.info("config-watcher","\u914D\u7F6E\u5DF2\u70ED\u66F4(env/config),\u65E0\u9700\u91CD\u542F\u5373\u751F\u6548",{})}).catch(p=>{m.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=gE(e,{persistent:!1},(p,g)=>{mE(g)&&u()})}catch(p){m.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(_h,"startConfigHotReload");function Eh(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(Eh,"getByPath");var Ss=class{static{a(this,"InMemoryConfigCenter")}settings;globalVars;listeners=new Map;workflows=new Map;constructor(e,n){this.settings=e,this.globalVars=n}getConfig(e){return Eh(this.settings.raw,e)}getEnv(e){let n=this.settings.envSource[e];if(n!==void 0)return ei(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){m.warn("config-center","listener \u629B\u9519",{nsPath:o,error:l instanceof Error?l.message:String(l)})}}current(){return this.settings}getToolkitConfig(e){let n=this.workflows.get(e)?.toolkitConfig??{};return this.resolveToolkitRefs(n)}resolveFieldRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=Wt(o)?Lt(o,{configScope:this,...this.globalVars?{globalVars:this.globalVars}:{}}):o;return n}resolveToolkitRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=this.resolveFieldRefs(o);return n}getHandlerConfig(e,n){let r=this.workflows.get(e)?.handlerConfigs.get(n);return r===void 0?void 0:this.resolveFieldRefs(r)}applyWorkflow(e,n,r){this.workflows.set(e,{toolkitConfig:n,handlerConfigs:r})}scope(e){return{getEnv:a(n=>this.getEnv(n),"getEnv"),getConfig:a(n=>this.getConfig(n),"getConfig"),subscribe:a((n,r)=>this.subscribe(n,r),"subscribe"),getToolkitConfig:a(()=>this.getToolkitConfig(e),"getToolkitConfig"),getHandlerConfig:a(n=>this.getHandlerConfig(e,n),"getHandlerConfig")}}resolveNsPath(e,n){let r=e.indexOf(".");if(r<0)return;let o=e.slice(0,r),i=e.slice(r+1);if(o==="config")return Eh(n.raw,i);if(o==="env"){let s=n.envSource[i];return s===void 0?void 0:ei(s)}}};import{readdirSync as hE}from"fs";function Ph(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(Ph,"collectHandlerConfigs");function yE(t,e,n){let r=t.find(c=>c.id===n);if(r)return r;let o=t.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09",i=e.find(c=>c.id===n),s=i?`\u3002\u8BE5\u5DE5\u4F5C\u6D41\u542F\u52A8\u65F6\u88AB\u8DF3\u8FC7\uFF1A${i.reason}`:"";throw new Error(`\u5DE5\u4F5C\u6D41 "${n}" \u4E0D\u53EF\u89E6\u53D1\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${o}${s}`)}a(yE,"resolveTriggerTarget");async function i8(t,e={}){let n=await Ae(t);cc(n.envSource);let r=Dh.resolve(n.configDir,n.agent.trace_dir);au(r);let o,i=Xe(n.configDir,n.envSource);if(n.roles.enabled){let T=new xt(n.rolesDir);if(i?.roles){let I=Dh.resolve(n.configDir,"profile"),x=!1;try{x=hE(n.rolesDir).some(j=>j.endsWith(".role.yml"))}catch{}if(x)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`);T.loadFromProfile(i.roles,I)}else await T.loadAll();o=new Go(T)}let s=$a(),c=new Bt,l=new Ss(n,c),d=[],u=new Map,f={},p={};for(let T of n.workflowEntries){let I=await st(T.templatePath,{envSource:n.envSource});i?.workflows?.[T.id]&&Pn(T.id,i.workflows[T.id],I),u.set(T.id,I);let D=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??I.tracker;D&&(f[`workflow:${T.id}.tracker`]={base_id:D.base_id,table_id:D.table_id},Object.assign(p,tp(T.id,I,{base_id:D.base_id,table_id:D.table_id})))}let g=[],h=(await qn(n)).resolved,y=await ji({configDir:n.configDir,targets:h.filter(It).map(T=>({collection:T.collection,artifact:T.compile?.artifact??Ka,roleIds:T.roleIds??[]})),workflows:n.workflowEntries.map(T=>({id:T.id,recipeDir:T.recipeDir}))}),w=xc(kg(await Er(n.configDir),y));if(w.hasFatal){let T=w.issues.find(I=>I.level==="fatal");throw new Error(`\u5B9E\u4F8B\u6821\u9A8C\u5931\u8D25(preflight fatal)\uFF0C\u62D2\u7EDD\u542F\u52A8: ${T.message}`)}for(let T of w.blockedWorkflowIds){let I=w.issues.filter(x=>x.workflowId===T&&x.level==="error").map(x=>x.message).join("; ");g.push({id:T,reason:`preflight \u6821\u9A8C\u5931\u8D25: ${I}`})}let b=new Set(w.blockedWorkflowIds),v=new Map;await Promise.all(n.workflowEntries.map(async T=>{if(!b.has(T.id))try{let I=u.get(T.id),D=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??I.tracker;if(!D)throw new Error("\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09");let j=An(n,T,D);if(j.tracker.base_id&&j.tracker.table_id){let W=new ae({bin:j.tracker.dws_bin});await zr(W,j.tracker.base_id,j.tracker.table_id)}let L=new Gi(j.tracker);await L.init(),v.set(T.id,{perSettings:j,tracker:L})}catch(I){let x=I instanceof Error?I.message:String(I);g.push({id:T.id,reason:x}),m.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:T.id,error:x})}}));for(let T of n.workflowEntries){let I=v.get(T.id);if(I)try{let x=u.get(T.id),{perSettings:D,tracker:j}=I,L=l.scope(T.id);l.applyWorkflow(T.id,x.toolkitConfig??{},Ph(x));let V=new Ho().createAll(x.eventSources,{pollIntervalMs:D.polling.interval_ms,configDir:D.configDir,tableRefs:f,configRefs:p,globalVars:c,configScope:L}),ue=new os({settings:D,workflow:x,tracker:j,eventBindings:V,roleResolver:o,toolkitRegistry:s,onRunEvent:e.onRunEvent,globalVars:c,configScope:L,configRefs:p});d.push({id:T.id,settings:D,workflow:x,tracker:j,orchestrator:ue,entry:T}),m.info("app","\u5DE5\u4F5C\u6D41\u7EC4\u88C5\u5B8C\u6210",{id:T.id,workflow:x.meta.name,domain:x.meta.domain,steps:x.orderedStepIds,eventSources:V.map(oe=>oe.source.name)})}catch(x){let D=x instanceof Error?x.message:String(x);g.push({id:T.id,reason:D}),m.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:T.id,error:D})}}for(let T of d)m.info("app",`[preflight] ${T.id} \u2713 \u5DF2\u542F\u52A8`,{workflow:T.workflow.meta.name});for(let T of g)m.error("app",`[preflight] ${T.id} \u2717 \u672A\u542F\u52A8\uFF1A${T.reason}`,{id:T.id});if(d.length===0){let T=g.map(I=>`${I.id}: ${I.reason}`).join("; ");throw new Error(`\u6CA1\u6709\u4EFB\u4F55\u5DE5\u4F5C\u6D41\u80FD\u542F\u52A8\uFF08\u5171 ${g.length} \u4E2A\u5747\u88C5\u914D\u5931\u8D25\uFF09\u3002${T}`)}m.info("app","\u5E94\u7528\u7EC4\u88C5\u5B8C\u6210",{mode:n.multiWorkflow?"multi-workflow":"single-workflow",workflowCount:d.length,skippedCount:g.length,rolesEnabled:n.roles.enabled,toolkitsLoaded:s.length});let R=await Ul(n),S=Wn(n.raw?.toolkit_config),C=R.agent?new is({configDir:n.configDir,resolveCollections:a(async()=>(await qn(n)).resolved,"resolveCollections"),...R,...S?{bins:S}:{}}):null;R.agent||m.warn("app","\u5F53\u524D engine \u65E0\u53EF\u7528 coding agent(\u5982 llm_only),\u8DF3\u8FC7 KB \u81EA\u52A8\u5237\u65B0");let A=d[0],_;return{settings:n,instances:d,skippedWorkflows:g,workflow:A.workflow,tracker:A.tracker,orchestrator:A.orchestrator,triggerWorkflowOnce:a((T,I)=>yE(d,g,T).orchestrator.triggerOnce(I),"triggerWorkflowOnce"),start:a(async()=>{C?.start(),_=_h({watchDir:n.configDir,configCenter:l,reload:a(()=>Ae(t),"reload"),onReloaded:a(async T=>{cc(T.envSource),un();let I=Xe(n.configDir,T.envSource);for(let x of d)try{let D=await st(x.entry.templatePath,{envSource:T.envSource});I?.workflows?.[x.id]&&Pn(x.id,I.workflows[x.id],D),(JSON.stringify(D.steps)!==JSON.stringify(x.workflow.steps)||JSON.stringify(D.edges??null)!==JSON.stringify(x.workflow.edges??null))&&m.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:x.id}),l.applyWorkflow(x.id,D.toolkitConfig??{},Ph(D))}catch(D){m.warn("app","workflow \u91CD\u89E3\u6790\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{id:x.id,error:D instanceof Error?D.message:String(D)})}},"onReloaded")}),await Promise.all(d.map(T=>T.orchestrator.start()))},"start"),stop:a(async()=>{_?.stop(),_=void 0,C?.stop(),await Promise.all(d.map(T=>T.orchestrator.stop()))},"stop")}}a(i8,"createApp");async function ct(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return ye(r).filter(k).map(i=>({fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??"")})).filter(i=>i.fieldId&&i.fieldName)}a(ct,"fetchFields");function wE(t){for(let e of["config","property"]){let n=t[e];if(k(n)&&Array.isArray(n.options))return n.options}return Array.isArray(t.options)?t.options:[]}a(wE,"pickOptions");async function ql(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return ye(r).filter(k).map(i=>{let c=wE(i).filter(k).map(l=>({id:String(l.id??""),name:String(l.name??"")})).filter(l=>l.id&&l.name);return{fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??""),options:c}}).filter(i=>i.fieldId&&i.fieldName)}a(ql,"fetchFieldsWithOptions");import{EventEmitter as bE}from"events";import{randomUUID as kE}from"crypto";var Hl=class extends bE{static{a(this,"RelayAgentSession")}transport;requestId;projectId;agent;workDir;permissionMode;timeoutMs;sessionId;finalResponse;artifacts;pending=null;closed=!1;unsubscribe;constructor(e,n){super(),this.transport=e,this.requestId=n.requestId,this.projectId=n.projectId,this.agent=n.agent,this.workDir=n.workDir,this.permissionMode=n.permissionMode,this.timeoutMs=n.timeoutMs,this.sessionId=n.sessionId??"",this.unsubscribe=e.onMessage(r=>this.handleMessage(r))}send(e){return this.closed?Promise.reject(new Error("relay session already closed")):new Promise((n,r)=>{this.pending={resolve:n,reject:r},this.transport.send({type:"run:agent",requestId:this.requestId,projectId:this.projectId,agent:this.agent,prompt:e,...this.workDir?{workDir:this.workDir}:{},...this.sessionId?{sessionId:this.sessionId}:{},...this.permissionMode?{permissionMode:this.permissionMode}:{},...this.timeoutMs!==void 0?{timeoutMs:this.timeoutMs}:{}})})}currentSessionId(){return this.sessionId}isAlive(){return!this.closed}async close(){if(!this.closed&&(this.closed=!0,this.unsubscribe(),this.transport.close(),this.pending)){let e=this.pending;this.pending=null,e.reject(new Error("relay session closed before completion"))}}lastResponse(){return this.finalResponse}artifactManifest(){return this.artifacts}handleMessage(e){if(!(!("requestId"in e)||e.requestId!==this.requestId))switch(e.type){case"event":this.emit("event",e.event);break;case"result":{e.sessionId&&(this.sessionId=e.sessionId),this.finalResponse=e.response,this.artifacts=e.artifacts,this.settleResolve();break}case"error":{let n=new Error(e.message);n.code=e.code,this.settleReject(n);break}default:break}}settleResolve(){if(!this.pending)return;let e=this.pending;this.pending=null,e.resolve()}settleReject(e){if(!this.pending)return;let n=this.pending;this.pending=null,n.reject(e)}},Jl=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??(()=>kE()),this.landArtifacts=n.landArtifacts}async run(e,n){let r=n?.adapterOptions?.permissionMode==="bypassPermissions"?"bypassPermissions":void 0,o=new Hl(this.transport,{requestId:this.requestIdFactory(),projectId:this.projectId,agent:this.agent,sessionId:n?.sessionId,workDir:n?.workDir,...r?{permissionMode:r}:{},...n?.timeoutMs!==void 0?{timeoutMs:n.timeoutMs}:{}}),i=[];o.on("event",c=>{i.push(c),n?.onEvent?.(c)});try{await o.send(e)}finally{await o.close().catch(()=>{})}let s=o.artifactManifest();return s&&this.landArtifacts&&await this.landArtifacts(this.projectId,s),{response:(o.lastResponse()??"").trim(),events:i,sessionId:o.currentSessionId()}}};function m8(t,e){return new Jl(t,e)}a(m8,"createRelayExecutor");var Gl=class{static{a(this,"LocalSpawnExecutor")}kind="local-spawn";defaults;runner;constructor(e={},n=bo){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 b8(t,e){return new Gl(t??{},e??bo)}a(b8,"createLocalSpawnExecutor");import ry from"path";import{access as sP,readFile as aP}from"fs/promises";import cP from"yaml";import{readFile as Mh,readdir as vE,access as SE,stat as xE}from"fs/promises";import qe from"path";import Oh from"yaml";import{input as RE}from"@inquirer/prompts";async function xs(t){let e=await Te(t),n=qe.dirname(e),r=await Fh(e),o=await Nh(qe.join(n,"profile","profile.yml")),i=k(r.workflows)&&typeof r.workflows.dir=="string"?r.workflows.dir:void 0;if(!i)throw new Error("design \u4EC5\u652F\u6301 profile + \u591A workflow \u7684\u65B0\u5F62\u6001\uFF1A\u5F53\u524D config \u7F3A\u5C11 workflows.dir\uFF0C\u7591\u4F3C\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF08\u9876\u5C42\u5355 workflow \u6216\u65E0 profile \u7684\u81EA\u8DB3\u6A21\u5F0F\uFF09\u3002design \u4E0D\u518D\u652F\u6301\u7F16\u8F91\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF0C\u8BF7\u5148\u624B\u52A8\u8FC1\u79FB\u5230\u591A workflow + profile\u3002");let s=await CE(n,i);return{mode:s.some(l=>l.exists)?"brownfield":"greenfield",profileExists:o,workflows:s}}a(xs,"probeProjectShape");async function CE(t,e){let n;try{n=await dc(t,e)}catch{n=[]}return n.map(r=>({id:r.id,workflowRelPath:$h(t,r.templatePath),recipeDirRelPath:$h(t,r.recipeDir),workflowPath:r.templatePath,recipeDir:r.recipeDir,exists:!0}))}a(CE,"scanExistingWorkflows");function $h(t,e){let n=qe.relative(t,e);return n.startsWith(".")?n:`./${n}`}a($h,"toRelPath");async function jh(t){let e=await Te(t.configPath),n=qe.dirname(e);try{await xE(e)}catch{throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}
|
|
472
|
+
\u89E6\u53D1\u7F16\u8BD1...`),await FE([],{config:e.config}))}a(YG,"runKbIngestCommand");var LE=100,Fh=200;async function QG(t,e){let n=await _e(e.config),r=Zr.resolve(n.configDir,t),o=new Set;for(let c of n.workflowEntries){let l=await st(c.templatePath,{envSource:n.envSource}),u=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??l.tracker;if(!u)continue;let f=En(n,c,u),{base_id:p,table_id:g}=f.tracker;if(!p.trim()||!g.trim())continue;let h=Rs({client:new ae({bin:f.tracker.dws_bin})}),y;for(let w=0;;w++){if(w>=Fh)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${c.id}\u300Dtracker \u8868\u5206\u9875\u8D85\u4FDD\u9669\u4E1D ${Fh} \u9875\uFF0C\u5DF2\u62D2\u7EDD\u6E05\u7406`);let b=await h.queryRecords({baseId:p,sheetId:g,limit:LE,...y?{cursor:y}:{}});for(let R of Zn(b))o.add(R.recordId);let v=Yn(b);if(!v||v===y)break;y=v}}let{removed:i,kept:s}=await Jl({collectionDir:r,activeRowIds:o});console.log(`\u6E05\u7406\u4E86 ${i.length} \u7BC7\u5B64\u513F\u6587\u7AE0\uFF0C\u4FDD\u7559 ${s.length} \u7BC7`);for(let c of i)console.log(` - ${c}`)}a(QG,"runKbCleanupCommand");import{watch as WE}from"fs";function BE(t){return t?t===".env"||t.endsWith(".yml")||t.endsWith(".yaml"):!0}a(BE,"isRelevantFile");function Bh(t){return JSON.stringify({raw:t.raw,env:t.envSource})}a(Bh,"snapshot");function zh(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??(()=>_e(t.configPath)),o=t.debounceMs??300,i=a(async()=>{let p=await r(),g=Bh(n.current());n.applyReload(p);let h=Bh(n.current())!==g;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 g=await i();for(;c;)c=!1,g=await i();return g}finally{s=null}})();return s=p,p},"refresh"),d=null,u=a(()=>{d&&clearTimeout(d),d=setTimeout(()=>{d=null,l().then(p=>{p&&m.info("config-watcher","\u914D\u7F6E\u5DF2\u70ED\u66F4(env/config),\u65E0\u9700\u91CD\u542F\u5373\u751F\u6548",{})}).catch(p=>{m.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=WE(e,{persistent:!1},(p,g)=>{BE(g)&&u()})}catch(p){m.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(zh,"startConfigHotReload");function Uh(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(Uh,"getByPath");var Cs=class{static{a(this,"InMemoryConfigCenter")}settings;globalVars;listeners=new Map;workflows=new Map;constructor(e,n){this.settings=e,this.globalVars=n}getConfig(e){return Uh(this.settings.raw,e)}getEnv(e){let n=this.settings.envSource[e];if(n!==void 0)return ri(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){m.warn("config-center","listener \u629B\u9519",{nsPath:o,error:l instanceof Error?l.message:String(l)})}}current(){return this.settings}getToolkitConfig(e){let n=this.workflows.get(e)?.toolkitConfig??{};return this.resolveToolkitRefs(n)}resolveFieldRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=Bt(o)?Wt(o,{configScope:this,...this.globalVars?{globalVars:this.globalVars}:{}}):o;return n}resolveToolkitRefs(e){let n={};for(let[r,o]of Object.entries(e))n[r]=this.resolveFieldRefs(o);return n}getHandlerConfig(e,n){let r=this.workflows.get(e)?.handlerConfigs.get(n);return r===void 0?void 0:this.resolveFieldRefs(r)}applyWorkflow(e,n,r){this.workflows.set(e,{toolkitConfig:n,handlerConfigs:r})}scope(e){return{getEnv:a(n=>this.getEnv(n),"getEnv"),getConfig:a(n=>this.getConfig(n),"getConfig"),subscribe:a((n,r)=>this.subscribe(n,r),"subscribe"),getToolkitConfig:a(()=>this.getToolkitConfig(e),"getToolkitConfig"),getHandlerConfig:a(n=>this.getHandlerConfig(e,n),"getHandlerConfig")}}resolveNsPath(e,n){let r=e.indexOf(".");if(r<0)return;let o=e.slice(0,r),i=e.slice(r+1);if(o==="config")return Uh(n.raw,i);if(o==="env"){let s=n.envSource[i];return s===void 0?void 0:ri(s)}}};import{readdirSync as zE}from"fs";function Kh(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(Kh,"collectHandlerConfigs");function UE(t,e,n){let r=t.find(c=>c.id===n);if(r)return r;let o=t.map(c=>c.id).join("\u3001")||"\uFF08\u65E0\uFF09",i=e.find(c=>c.id===n),s=i?`\u3002\u8BE5\u5DE5\u4F5C\u6D41\u542F\u52A8\u65F6\u88AB\u8DF3\u8FC7\uFF1A${i.reason}`:"";throw new Error(`\u5DE5\u4F5C\u6D41 "${n}" \u4E0D\u53EF\u89E6\u53D1\u3002\u5F53\u524D\u53EF\u89E6\u53D1\uFF1A${o}${s}`)}a(UE,"resolveTriggerTarget");async function L8(t,e={}){let n=await _e(t);gc(n.envSource);let r=Vh.resolve(n.configDir,n.agent.trace_dir);pu(r);let o,i=Xe(n.configDir,n.envSource);if(n.roles.enabled){let T=new xt(n.rolesDir);if(i?.roles){let I=Vh.resolve(n.configDir,"profile"),x=!1;try{x=zE(n.rolesDir).some(j=>j.endsWith(".role.yml"))}catch{}if(x)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`);T.loadFromProfile(i.roles,I)}else await T.loadAll();o=new Qo(T)}let s=Fa(),c=new zt,l=new Cs(n,c),d=[],u=new Map,f={},p={};for(let T of n.workflowEntries){let I=await st(T.templatePath,{envSource:n.envSource});i?.workflows?.[T.id]&&Mn(T.id,i.workflows[T.id],I),u.set(T.id,I);let D=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??I.tracker;D&&(f[`workflow:${T.id}.tracker`]={base_id:D.base_id,table_id:D.table_id},Object.assign(p,hp(T.id,I,{base_id:D.base_id,table_id:D.table_id})))}let g=[],h=(await Jn(n)).resolved,y=await Li({configDir:n.configDir,targets:h.filter(It).map(T=>({collection:T.collection,artifact:T.compile?.artifact??Xa,roleIds:T.roleIds??[]})),workflows:n.workflowEntries.map(T=>({id:T.id,recipeDir:T.recipeDir}))}),w=Ac($g(await $r(n.configDir),y));if(w.hasFatal){let T=w.issues.find(I=>I.level==="fatal");throw new Error(`\u5B9E\u4F8B\u6821\u9A8C\u5931\u8D25(preflight fatal)\uFF0C\u62D2\u7EDD\u542F\u52A8: ${T.message}`)}for(let T of w.blockedWorkflowIds){let I=w.issues.filter(x=>x.workflowId===T&&x.level==="error").map(x=>x.message).join("; ");g.push({id:T,reason:`preflight \u6821\u9A8C\u5931\u8D25: ${I}`})}let b=new Set(w.blockedWorkflowIds),v=new Map;await Promise.all(n.workflowEntries.map(async T=>{if(!b.has(T.id))try{let I=u.get(T.id),D=(n.tracker.base_id==="__placeholder__"?void 0:n.tracker)??I.tracker;if(!D)throw new Error("\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09");let j=En(n,T,D);if(j.tracker.base_id&&j.tracker.table_id){let W=new ae({bin:j.tracker.dws_bin});await Kr(W,j.tracker.base_id,j.tracker.table_id)}let L=new Qi(j.tracker);await L.init(),v.set(T.id,{perSettings:j,tracker:L})}catch(I){let x=I instanceof Error?I.message:String(I);g.push({id:T.id,reason:x}),m.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:T.id,error:x})}}));for(let T of n.workflowEntries){let I=v.get(T.id);if(I)try{let x=u.get(T.id),{perSettings:D,tracker:j}=I,L=l.scope(T.id);l.applyWorkflow(T.id,x.toolkitConfig??{},Kh(x));let V=new Zo().createAll(x.eventSources,{pollIntervalMs:D.polling.interval_ms,configDir:D.configDir,tableRefs:f,configRefs:p,globalVars:c,configScope:L}),ue=new as({settings:D,workflow:x,tracker:j,eventBindings:V,roleResolver:o,toolkitRegistry:s,onRunEvent:e.onRunEvent,globalVars:c,configScope:L,configRefs:p});d.push({id:T.id,settings:D,workflow:x,tracker:j,orchestrator:ue,entry:T}),m.info("app","\u5DE5\u4F5C\u6D41\u7EC4\u88C5\u5B8C\u6210",{id:T.id,workflow:x.meta.name,domain:x.meta.domain,steps:x.orderedStepIds,eventSources:V.map(oe=>oe.source.name)})}catch(x){let D=x instanceof Error?x.message:String(x);g.push({id:T.id,reason:D}),m.error("app","\u5DE5\u4F5C\u6D41\u88C5\u914D\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\uFF08\u5176\u4F59\u5DE5\u4F5C\u6D41\u7EE7\u7EED\uFF09",{id:T.id,error:D})}}for(let T of d)m.info("app",`[preflight] ${T.id} \u2713 \u5DF2\u542F\u52A8`,{workflow:T.workflow.meta.name});for(let T of g)m.error("app",`[preflight] ${T.id} \u2717 \u672A\u542F\u52A8\uFF1A${T.reason}`,{id:T.id});if(d.length===0){let T=g.map(I=>`${I.id}: ${I.reason}`).join("; ");throw new Error(`\u6CA1\u6709\u4EFB\u4F55\u5DE5\u4F5C\u6D41\u80FD\u542F\u52A8\uFF08\u5171 ${g.length} \u4E2A\u5747\u88C5\u914D\u5931\u8D25\uFF09\u3002${T}`)}m.info("app","\u5E94\u7528\u7EC4\u88C5\u5B8C\u6210",{mode:n.multiWorkflow?"multi-workflow":"single-workflow",workflowCount:d.length,skippedCount:g.length,rolesEnabled:n.roles.enabled,toolkitsLoaded:s.length});let R=await Gl(n),S=zn(n.raw?.toolkit_config),C=R.agent?new cs({configDir:n.configDir,resolveCollections:a(async()=>(await Jn(n)).resolved,"resolveCollections"),...R,...S?{bins:S}:{}}):null;R.agent||m.warn("app","\u5F53\u524D engine \u65E0\u53EF\u7528 coding agent(\u5982 llm_only),\u8DF3\u8FC7 KB \u81EA\u52A8\u5237\u65B0");let _=d[0],A;return{settings:n,instances:d,skippedWorkflows:g,workflow:_.workflow,tracker:_.tracker,orchestrator:_.orchestrator,triggerWorkflowOnce:a((T,I)=>UE(d,g,T).orchestrator.triggerOnce(I),"triggerWorkflowOnce"),start:a(async()=>{C?.start(),A=zh({watchDir:n.configDir,configCenter:l,reload:a(()=>_e(t),"reload"),onReloaded:a(async T=>{gc(T.envSource),pn();let I=Xe(n.configDir,T.envSource);for(let x of d)try{let D=await st(x.entry.templatePath,{envSource:T.envSource});I?.workflows?.[x.id]&&Mn(x.id,I.workflows[x.id],D),(JSON.stringify(D.steps)!==JSON.stringify(x.workflow.steps)||JSON.stringify(D.edges??null)!==JSON.stringify(x.workflow.edges??null))&&m.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:x.id}),l.applyWorkflow(x.id,D.toolkitConfig??{},Kh(D))}catch(D){m.warn("app","workflow \u91CD\u89E3\u6790\u5931\u8D25,\u4FDD\u7559\u65E7\u914D\u7F6E",{id:x.id,error:D instanceof Error?D.message:String(D)})}},"onReloaded")}),await Promise.all(d.map(T=>T.orchestrator.start()))},"start"),stop:a(async()=>{A?.stop(),A=void 0,C?.stop(),await Promise.all(d.map(T=>T.orchestrator.stop()))},"stop")}}a(L8,"createApp");async function ct(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return ye(r).filter(k).map(i=>({fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??"")})).filter(i=>i.fieldId&&i.fieldName)}a(ct,"fetchFields");function VE(t){for(let e of["config","property"]){let n=t[e];if(k(n)&&Array.isArray(n.options))return n.options}return Array.isArray(t.options)?t.options:[]}a(VE,"pickOptions");async function Ql(t,e,n){let r=await t.runJson(["aitable","field","get","--base-id",e,"--table-id",n]);return ye(r).filter(k).map(i=>{let c=VE(i).filter(k).map(l=>({id:String(l.id??""),name:String(l.name??"")})).filter(l=>l.id&&l.name);return{fieldId:String(i.fieldId??""),fieldName:String(i.fieldName??""),type:String(i.type??""),options:c}}).filter(i=>i.fieldId&&i.fieldName)}a(Ql,"fetchFieldsWithOptions");import{EventEmitter as KE}from"events";import{randomUUID as qE}from"crypto";var Xl=class extends KE{static{a(this,"RelayAgentSession")}transport;requestId;projectId;agent;workDir;permissionMode;timeoutMs;sessionId;finalResponse;artifacts;pending=null;closed=!1;unsubscribe;constructor(e,n){super(),this.transport=e,this.requestId=n.requestId,this.projectId=n.projectId,this.agent=n.agent,this.workDir=n.workDir,this.permissionMode=n.permissionMode,this.timeoutMs=n.timeoutMs,this.sessionId=n.sessionId??"",this.unsubscribe=e.onMessage(r=>this.handleMessage(r))}send(e){return this.closed?Promise.reject(new Error("relay session already closed")):new Promise((n,r)=>{this.pending={resolve:n,reject:r},this.transport.send({type:"run:agent",requestId:this.requestId,projectId:this.projectId,agent:this.agent,prompt:e,...this.workDir?{workDir:this.workDir}:{},...this.sessionId?{sessionId:this.sessionId}:{},...this.permissionMode?{permissionMode:this.permissionMode}:{},...this.timeoutMs!==void 0?{timeoutMs:this.timeoutMs}:{}})})}currentSessionId(){return this.sessionId}isAlive(){return!this.closed}async close(){if(!this.closed&&(this.closed=!0,this.unsubscribe(),this.transport.close(),this.pending)){let e=this.pending;this.pending=null,e.reject(new Error("relay session closed before completion"))}}lastResponse(){return this.finalResponse}artifactManifest(){return this.artifacts}handleMessage(e){if(!(!("requestId"in e)||e.requestId!==this.requestId))switch(e.type){case"event":this.emit("event",e.event);break;case"result":{e.sessionId&&(this.sessionId=e.sessionId),this.finalResponse=e.response,this.artifacts=e.artifacts,this.settleResolve();break}case"error":{let n=new Error(e.message);n.code=e.code,this.settleReject(n);break}default:break}}settleResolve(){if(!this.pending)return;let e=this.pending;this.pending=null,e.resolve()}settleReject(e){if(!this.pending)return;let n=this.pending;this.pending=null,n.reject(e)}},ed=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??(()=>qE()),this.landArtifacts=n.landArtifacts}async run(e,n){let r=n?.adapterOptions?.permissionMode==="bypassPermissions"?"bypassPermissions":void 0,o=new Xl(this.transport,{requestId:this.requestIdFactory(),projectId:this.projectId,agent:this.agent,sessionId:n?.sessionId,workDir:n?.workDir,...r?{permissionMode:r}:{},...n?.timeoutMs!==void 0?{timeoutMs:n.timeoutMs}:{}}),i=[];o.on("event",c=>{i.push(c),n?.onEvent?.(c)});try{await o.send(e)}finally{await o.close().catch(()=>{})}let s=o.artifactManifest();return s&&this.landArtifacts&&await this.landArtifacts(this.projectId,s),{response:(o.lastResponse()??"").trim(),events:i,sessionId:o.currentSessionId()}}};function G8(t,e){return new ed(t,e)}a(G8,"createRelayExecutor");var td=class{static{a(this,"LocalSpawnExecutor")}kind="local-spawn";defaults;runner;constructor(e={},n=So){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 X8(t,e){return new td(t??{},e??So)}a(X8,"createLocalSpawnExecutor");import hy from"path";import{access as PP,readFile as $P}from"fs/promises";import MP from"yaml";import{readFile as Hh,readdir as HE,access as JE,stat as GE}from"fs/promises";import qe from"path";import Jh from"yaml";import{input as ZE}from"@inquirer/prompts";async function Is(t){let e=await Te(t),n=qe.dirname(e),r=await Zh(e),o=await Yh(qe.join(n,"profile","profile.yml")),i=k(r.workflows)&&typeof r.workflows.dir=="string"?r.workflows.dir:void 0;if(!i)throw new Error("design \u4EC5\u652F\u6301 profile + \u591A workflow \u7684\u65B0\u5F62\u6001\uFF1A\u5F53\u524D config \u7F3A\u5C11 workflows.dir\uFF0C\u7591\u4F3C\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF08\u9876\u5C42\u5355 workflow \u6216\u65E0 profile \u7684\u81EA\u8DB3\u6A21\u5F0F\uFF09\u3002design \u4E0D\u518D\u652F\u6301\u7F16\u8F91\u65E7\u5F62\u6001\u5B9E\u4F8B\uFF0C\u8BF7\u5148\u624B\u52A8\u8FC1\u79FB\u5230\u591A workflow + profile\u3002");let s=await YE(n,i);return{mode:s.some(l=>l.exists)?"brownfield":"greenfield",profileExists:o,workflows:s}}a(Is,"probeProjectShape");async function YE(t,e){let n;try{n=await hc(t,e)}catch{n=[]}return n.map(r=>({id:r.id,workflowRelPath:qh(t,r.templatePath),recipeDirRelPath:qh(t,r.recipeDir),workflowPath:r.templatePath,recipeDir:r.recipeDir,exists:!0}))}a(YE,"scanExistingWorkflows");function qh(t,e){let n=qe.relative(t,e);return n.startsWith(".")?n:`./${n}`}a(qh,"toRelPath");async function Gh(t){let e=await Te(t.configPath),n=qe.dirname(e);try{await GE(e)}catch{throw new Error(`\u914D\u7F6E\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}
|
|
471
473
|
|
|
472
|
-
\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
|
|
474
|
+
\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 Zh(e),o=typeof r.scene=="string"?r.scene:"";if(!o)throw new Error("\u914D\u7F6E\u6587\u4EF6\u4E2D\u7F3A\u5C11 scene \u5B57\u6BB5\u3002\u8BF7\u5148\u8FD0\u884C `aitable-workflow init` \u521B\u5EFA\u914D\u7F6E\u3002");let i=await Is(t.configPath),s=i.workflows[0]??tD(n),c=k(r.agent)?r.agent:void 0,l=xr.default("claude").parse(c?.engine),d=sn(l),u=k(r.agent)&&typeof r.agent.timeout_ms=="number"?r.agent.timeout_ms:6e5,f="";if(!t.yes){if(console.log(`
|
|
473
475
|
\u{1F4CB} \u5F53\u524D\u573A\u666F\u63CF\u8FF0:`),console.log(` ${o}
|
|
474
476
|
`),i.mode==="brownfield"){let b=i.workflows.filter(v=>v.exists).map(v=>v.id).join(" / ");console.log(` \u68C0\u6D4B\u5230\u5DF2\u6709\u4EA7\u7269\uFF08${b}\uFF09\uFF0C\u672C\u6B21\u5C06\u589E\u91CF\u4FEE\u6539\u800C\u975E\u91CD\u65B0\u751F\u6210\u3002
|
|
475
|
-
`)}f=await
|
|
477
|
+
`)}f=await ZE({message:"\u8FFD\u52A0\u8865\u5145\u9700\u6C42\uFF08\u76F4\u63A5\u56DE\u8F66\u8DF3\u8FC7\uFF09",default:""}),f=f.trim()}let p=f?`${o}
|
|
476
478
|
|
|
477
|
-
\u8865\u5145\u9700\u6C42\uFF1A${f}`:o,g=await
|
|
478
|
-
`):"- (\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}(${
|
|
479
|
-
`).trim()}a(
|
|
480
|
-
`)}a(
|
|
479
|
+
\u8865\u5145\u9700\u6C42\uFF1A${f}`:o,g=await nD(n),h=QE(r),y=await XE(n),w=await eD(n);return{scene:o,supplements:f,fullRequirement:p,workDir:n,configPath:e,projectRoot:g,agentType:d,agentTimeoutMs:u,mode:i.mode,profileExists:i.profileExists,workflows:i.workflows,trackerFacts:h,roles:y,strayRoleFiles:w,recipeDir:s.recipeDir,workflowPath:s.workflowPath,workflowRelPath:s.workflowRelPath,recipeDirRelPath:s.recipeDirRelPath}}a(Gh,"collectDesignContext");function QE(t){if(!k(t.tracker))return[];let e=t.tracker,n=[];if(k(e.states)){let r=e.states,o=[typeof r.initial=="string"?`initial=${r.initial}`:"",Array.isArray(r.active)?`active=${r.active.join(" / ")}`:"",Array.isArray(r.terminal)?`terminal=${r.terminal.join(" / ")}`:"",typeof r.review=="string"?`review=${r.review}`:"",typeof r.blocked=="string"?`blocked=${r.blocked}`:""].filter(Boolean);o.length>0&&n.push(`- Tracker \u72B6\u6001\uFF1A${o.join("; ")}`)}if(k(e.fields)){let r=Object.entries(e.fields).filter(o=>typeof o[1]=="string").map(([o,i])=>`${o}=${i}`);r.length>0&&n.push(`- \u7CFB\u7EDF\u9AA8\u67B6\u5B57\u6BB5\uFF1A${r.join("; ")}`)}return n}a(QE,"buildTrackerFacts");async function XE(t){try{let e=Jh.parse(await Hh(qe.join(t,"profile","profile.yml"),"utf8"));return!k(e)||!k(e.roles)?[]:Object.entries(e.roles).slice(0,8).map(([n,r])=>({id:n,name:k(r)&&typeof r.name=="string"?r.name:void 0}))}catch{return[]}}a(XE,"loadProfileRoles");async function eD(t){try{return(await HE(qe.join(t,"roles"))).filter(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return[]}}a(eD,"listStrayRoleFiles");async function Zh(t){let e=Jh.parse(await Hh(t,"utf8"));if(!k(e))throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u65E0\u6548");return e}a(Zh,"readRawConfig");function tD(t){return{id:"default",workflowRelPath:"./workflow.yml",recipeDirRelPath:"./recipes",workflowPath:qe.resolve(t,"./workflow.yml"),recipeDir:qe.resolve(t,"./recipes"),exists:!1}}a(tD,"fallbackTarget");async function Yh(t){try{return await JE(t),!0}catch{return!1}}a(Yh,"fileExists");async function nD(t){let e=qe.resolve(t),n=qe.parse(e).root;for(;e!==n;){if(await Yh(qe.join(e,"package.json")))return e;e=qe.dirname(e)}return qe.resolve(t)}a(nD,"findProjectRoot");import{serializeForm as vD}from"aitable-workflow-base";import{cpSync as lD,existsSync as dD,lstatSync as uD,mkdirSync as fD,rmSync as pD,writeFileSync as gD}from"fs";import yt from"path";import{fileURLToPath as mD}from"url";import{z as Ts}from"zod";function nd(t=gt){return t.map(e=>{let n=oD(e);return{name:e.name,description:e.description??"",config:{schema:Ts.toJSONSchema(e.configSchema)},methods:rD(e),permissions:n,readOnly:n.length===0}})}a(nd,"buildToolkitManifest");function rD(t){return(t.methods??[]).map(e=>({name:e.name,description:e.description,params:e.params?Ts.toJSONSchema(e.params):void 0,output:e.output?Ts.toJSONSchema(e.output):void 0}))}a(rD,"collectMethods");function oD(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=Ts.toJSONSchema(n.scopeSchema))}return[...e.values()]}a(oD,"collectPermissions");var iD=3;function Yr(t,e){if(!t||typeof t!="object")return"unknown";if(Array.isArray(t.enum))return t.enum.map(String).join("|");let n=t.anyOf??t.oneOf;if(Array.isArray(n))return n.map(i=>Yr(i,e)).join("|");let r=t.type;if(r==="array"){let i=Yr(t.items??{},e);return`${i.includes("|")?`(${i})`:i}[]`}let o=t.properties;return r==="object"||o&&typeof o=="object"?e>=iD?"object":sD(t,e+1)||"object":typeof r=="string"?r:"unknown"}a(Yr,"renderTypeExpr");function sD(t,e){let n=t.properties;if(!n||typeof n!="object")return"";let r=new Set(Array.isArray(t.required)?t.required:[]),o=[];for(let[i,s]of Object.entries(n))o.push(`${i}${r.has(i)?"":"?"}: ${Yr(s??{},e)}`);return o.length?`{ ${o.join(", ")} }`:""}a(sD,"renderObjectShape");function aD(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))r.push(`${o}${n.has(o)?"":"?"}: ${Yr(i??{},1)}`);return r.join(", ")}a(aD,"renderParams");function Qh(t){return t?Yr(t,1):"void"}a(Qh,"renderType");function Xh(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=cD(n.config.schema);if(e.push("","**\u53EF\u914D\u7F6E\u9879(toolkit_config):**"),e.push(r.length?r.map(o=>`- ${o}`).join(`
|
|
480
|
+
`):"- (\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}(${aD(o.params)}): ${Qh(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 | ${Qh(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(`
|
|
481
|
+
`).trim()}a(Xh,"renderManifest");function cD(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(cD,"renderConfigFields");var hD="aitable-workflow",yD="aitable-workflow-design",rd=yt.join(".aitable","skills"),ey="toolkits.md";function wD(t){let e=yt.dirname(mD(import.meta.url));for(let n=0;n<8;n++){let r=yt.join(e,"skills",t);if(dD(yt.join(r,"SKILL.md")))return r;let o=yt.dirname(e);if(o===e)break;e=o}}a(wD,"resolveSkillDir");function id(t,e){let n={},r=yt.resolve(t,rd);try{fD(r,{recursive:!0})}catch(o){return e?.(`Skill \u6302\u8F7D\u76EE\u5F55\u521B\u5EFA\u5931\u8D25(\u4E0D\u963B\u65AD): ${od(o)}`),n}n.frameworkSkillRelPath=ty(r,hD,e),n.designSkillRelPath=ty(r,yD,e);try{gD(yt.join(r,ey),bD(),"utf8"),n.toolkitManifestRelPath=yt.join(rd,ey)}catch(o){e?.(`toolkit \u6E05\u5355\u5199\u5165\u5931\u8D25(\u4E0D\u963B\u65AD): ${od(o)}`)}return n}a(id,"mountDesignSkills");function ty(t,e,n){let r=wD(e);if(!r){n?.(`\u672A\u627E\u5230\u5185\u7F6E Skill \u76EE\u5F55(skills/${e})\uFF0Cdesign \u9000\u5316\u4E3A\u4EC5\u5185\u8054\u7EA6\u675F`);return}let o=yt.join(rd,e),i=yt.join(t,e);try{if(!uD(i).isSymbolicLink())return o;pD(i,{recursive:!0,force:!0})}catch{}try{return lD(r,i,{recursive:!0}),o}catch(s){n?.(`Skill \u590D\u5236\u5931\u8D25(\u4E0D\u963B\u65AD, ${e}): ${od(s)}`);return}}a(ty,"mountOne");function bD(t=nd()){return["# \u53EF\u7528 Toolkit \u80FD\u529B\u6E05\u5355","","> \u672C\u6587\u4EF6\u7531 design \u8FD0\u884C\u65F6\u4ECE toolkit \u6CE8\u518C\u8868\u751F\u6210\uFF0C\u5305\u542B\u5F53\u524D\u9879\u76EE\u5B9E\u9645\u53EF\u7528\u7684\u5168\u90E8 toolkit","> \uFF08\u542B\u81EA\u5B9A\u4E49\u6CE8\u518C\u7684\uFF09\u3002recipe \u901A\u8FC7 `ctx.toolkit.<name>.<method>` \u8C03\u7528\uFF1B\u6709\u526F\u4F5C\u7528\u7684","> \u80FD\u529B\u9700 binding \u6388\u6743\uFF08permissions\uFF09\u3002","",Xh(t)].join(`
|
|
482
|
+
`)}a(bD,"renderToolkitManifestDoc");function ny(t=nd()){return t.map(e=>{let n=e.methods.length>0?e.methods.map(i=>i.name).join(", "):"(\u672A\u58F0\u660E\u65B9\u6CD5\u9762)",r=e.readOnly?"":" [\u6709\u526F\u4F5C\u7528\uFF0C\u9700\u6388\u6743]",o=kD(e.description);return`- \`${e.name}\`${r}${o?` \u2014 ${o}`:""}
|
|
481
483
|
\u65B9\u6CD5\uFF1A${n}`}).join(`
|
|
482
|
-
`)}a(
|
|
484
|
+
`)}a(ny,"renderToolkitIndex");function kD(t){let e=t.trim();if(!e)return"";let n=e.search(/[。;;\n]/);return n>0?e.slice(0,n):e}a(kD,"firstSentence");function od(t){return t instanceof Error?t.message:String(t)}a(od,"errText");function _s(t,e,n){let r=n?.interactive??!0,o=!!(e?.designSkillRelPath||e?.frameworkSkillRelPath);return[SD,xD(e),r?CD:ID,ED(t),o?"":RD,AD(e),DD(t),PD(t)].filter(Boolean).join(`
|
|
483
485
|
|
|
484
|
-
`)}a(
|
|
485
|
-
`)}a(
|
|
486
|
+
`)}a(_s,"buildMetaPrompt");function ad(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(`
|
|
487
|
+
`)}a(ad,"buildFixPrompt");function As(t){return["\u4EE5\u4E0B\u662F\u7528\u6237\u5BF9\u4F60\u4E0A\u4E00\u8F6E\u63D0\u95EE\u7684\u7B54\u590D\uFF1A","",t.map(({form:e,answers:n})=>vD(e,n)).join(`
|
|
486
488
|
|
|
487
489
|
`),"","\u5982\u679C\u8FD9\u4E9B\u4FE1\u606F\u5DF2\u8DB3\u591F\u628A\u9700\u6C42\u62C6\u6210 workflow \u4E0E recipe\uFF0C**\u73B0\u5728\u5C31\u5F00\u59CB\u751F\u6210\u4EA7\u7269**\uFF0C\u4E0D\u8981\u518D\u63D0\u95EE\u3002","\u4ECD\u6709\u4F1A\u6539\u53D8\u67B6\u6784\u7684\u5173\u952E\u7F3A\u53E3\u65F6\uFF0C\u624D\u518D\u53D1\u4E00\u5F20 <question-form>\uFF08\u6BCF\u6B21\u53EA\u53D1\u4E00\u5F20\uFF0C\u53D1\u5B8C\u505C\u4E0B\u7B49\u7B54\u590D\uFF09\u3002"].join(`
|
|
488
|
-
`)}a(
|
|
490
|
+
`)}a(As,"buildClarifyReply");function cd(t,e,n){if(n.resume){let o=(n.resume.answered??[]).filter(i=>i.form.questions.length>0);return o.length>0?As(o):TD}let r=_s(t,e,{interactive:n.interactive});return n.judgeOnly?`${r}
|
|
489
491
|
|
|
490
|
-
${
|
|
492
|
+
${_D}`:r}a(cd,"buildOpeningMessage");var SD=`## \u7CFB\u7EDF\u89D2\u8272
|
|
491
493
|
|
|
492
494
|
\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
|
|
493
495
|
\u5728\u9879\u76EE\u76EE\u5F55\u4E2D\u751F\u6210\u6216\u589E\u91CF\u4FEE\u6539 workflow.yml\u3001recipe \u6587\u4EF6\u3001views.yml \u53CA\u914D\u5957\u7684\u89D2\u8272\u4E0E\u5DE5\u4F5C\u533A\u6587\u4EF6\u3002
|
|
@@ -498,8 +500,8 @@ ${nD}`:r}a(nd,"buildOpeningMessage");var ZE=`## \u7CFB\u7EDF\u89D2\u8272
|
|
|
498
500
|
|
|
499
501
|
\u53EA\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u5185\u8BFB\u53D6\u548C\u5199\u5165\u6587\u4EF6\uFF1B\u5DF2\u6302\u8F7D\u8D44\u6599\u4F4D\u4E8E\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u7684 \`.aitable/skills/\` \u4E0B\u3002
|
|
500
502
|
\u4E0D\u8981 \`cd\` \u5230\u5DE5\u4F5C\u76EE\u5F55\u4E4B\u5916\uFF0C\u4E0D\u8981\u8BFB\u53D6 aitable-workflow \u6E90\u7801\u4ED3\u5E93\u3001packages\u3001examples \u6216\u6A21\u677F\u76EE\u5F55\u6765\u8865\u8D44\u6599\u3002
|
|
501
|
-
\u5982\u679C\u5DF2\u6302\u8F7D Skill \u4E0E toolkit \u6E05\u5355\u4E0D\u8DB3\u4EE5\u5224\u65AD\u67D0\u4E2A\u5951\u7EA6\uFF0C\u505C\u6B62\u7EE7\u7EED\u63A2\u67E5\uFF0C\u5728\u56DE\u590D\u4E2D\u660E\u786E\u6807\u8BB0 \`DOC_GAP\` \u5E76\u8BF4\u660E\u7F3A\u53E3\u3002`;function
|
|
502
|
-
`)}a(
|
|
503
|
+
\u5982\u679C\u5DF2\u6302\u8F7D Skill \u4E0E toolkit \u6E05\u5355\u4E0D\u8DB3\u4EE5\u5224\u65AD\u67D0\u4E2A\u5951\u7EA6\uFF0C\u505C\u6B62\u7EE7\u7EED\u63A2\u67E5\uFF0C\u5728\u56DE\u590D\u4E2D\u660E\u786E\u6807\u8BB0 \`DOC_GAP\` \u5E76\u8BF4\u660E\u7F3A\u53E3\u3002`;function xD(t){let e=t?.designSkillRelPath,n=t?.frameworkSkillRelPath;if(!e&&!n)return"";let r=["## \u5FC5\u8BFB\u8D44\u6599\uFF08\u5DF2\u6302\u8F7D\u5728\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF0C\u6309\u9700\u52A0\u8F7D\uFF09",""];return e&&r.push(`- \`${e}/SKILL.md\` \u2014 **\u52A8\u624B\u4E4B\u524D\u5FC5\u987B\u5148\u5B8C\u6574\u8BFB\u8FD9\u4E00\u4EFD**\u3002\u5B83\u662F\u5DE5\u4F5C\u65B9\u6CD5\u8DEF\u7531\u8868\uFF1A`," \u9700\u6C42\u6F84\u6E05\u4E0E\u53D1\u95EE\u534F\u8BAE\u3001\u5168\u65B0/\u5DF2\u6709\u9879\u76EE\u7684\u6267\u884C\u6E05\u5355\u3001\u67B6\u6784\u51B3\u7B56\u6A21\u5F0F\u3001\u4EA7\u51FA\u4E0E\u6C47\u62A5\u89C4\u8303\u3002"),n&&r.push(`- \`${n}/SKILL.md\` \u2014 \u6846\u67B6\u5951\u7EA6\u4E0E\u8BED\u6CD5\u7684\u8DEF\u7531\u8868\u3002\u5B57\u6BB5\u540D\u3001\u9ED8\u8BA4\u503C\u4E0E\u7EA6\u675F\u90FD\u5728\u6301\u7EED\u6F14\u8FDB\uFF0C`," \u8FD9\u91CC\u7684\u6587\u4EF6\u662F**\u6743\u5A01**\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E\u4F60\u8BB0\u5FC6\u4E2D\u7684\u4EFB\u4F55\u6846\u67B6\u5370\u8C61\u3002",`- \`${n}/reference/invariants.md\` \u2014 \u4E0D\u53EF\u8FDD\u53CD\u9879\uFF08\u7ED3\u6784\u786C\u7EA6\u675F + \u300C\u7EDD\u4E0D\u300D\u6E05\u5355\uFF09\uFF0C\u5199\u4EE3\u7801\u524D\u8FC7\u4E00\u904D\u3002`),r.push("","\u4E0D\u8981\u4E00\u6B21\u8BFB\u5B8C\u5168\u90E8\u6587\u4EF6\uFF1B\u6309\u8DEF\u7531\u8868\u53EA\u8BFB\u547D\u4E2D\u7684 2-4 \u4E2A\u3002"),r.join(`
|
|
504
|
+
`)}a(xD,"buildSkillInstruction");var RD="## \u7EDD\u4E0D\uFF08Skill \u672A\u6302\u8F7D\uFF0C\u4EE5\u4E0B\u662F\u6700\u4F4E\u62A4\u680F\uFF09\n\n1. **\u7EDD\u4E0D**\u4EA7\u51FA\u6CA1\u6709 `filter` / `filters` \u7684 `aitable_record` \u4E8B\u4EF6\u6E90\u2014\u2014\u6570\u636E\u91CF\u6DA8\u4E0A\u6765\u540E\u67E5\u8BE2\u8D85\u65F6\uFF0C\u94FE\u8DEF\u9759\u9ED8\u505C\u6446\n2. **\u7EDD\u4E0D**\u628A step \u7684\u8F93\u51FA\u5217\u4E0E\u5C55\u793A/\u4EBA\u5DE5\u7F16\u8F91\u5217\u5408\u5E76\u6210\u540C\u4E00\u5B57\u6BB5\u2014\u2014StepEngine \u4EE5\u300C\u8F93\u51FA\u5B57\u6BB5\u975E\u7A7A\u300D\u5224\u5B9A\u5B8C\u6210\uFF0C\u6B65\u9AA4\u4F1A\u88AB\u6C38\u4E45\u8DF3\u8FC7\n3. **\u7EDD\u4E0D**\u540C\u65F6\u5B58\u5728 profile \u7684 `roles` \u6BB5\u4E0E `roles/*.role.yml`\u2014\u2014\u4E24\u8005\u4E92\u65A5\uFF0C\u5B9E\u4F8B\u542F\u52A8\u5373\u62A5\u9519\n4. **\u7EDD\u4E0D**\u5220\u9664\u6216\u6539\u540D\u5DF2\u6709\u7684 `field_definitions`\uFF0C\u4E5F\u7EDD\u4E0D\u6539\u5199 setup \u5DF2\u56DE\u5199\u7684 `table_id` / `base_id`\n5. **\u7EDD\u4E0D**\u5728\u9700\u6C42\u4E0D\u660E\u786E\u65F6\u9759\u9ED8\u731C\u6D4B\u2014\u2014\u5728\u4EA7\u7269\u6CE8\u91CA\u91CC\u5199\u660E\u5047\u8BBE\uFF0C\u5E76\u5728\u6C47\u62A5\u7684\u300C\u9700\u786E\u8BA4\u9879\u300D\u91CC\u5217\u51FA",CD=`## \u7B2C\u4E00\u6B65\uFF1A\u5224\u65AD\u9700\u6C42\u662F\u5426\u8DB3\u591F\u660E\u786E\uFF08\u52A8\u624B\u524D\u5FC5\u505A\uFF09
|
|
503
505
|
|
|
504
506
|
\u4E0D\u8981\u95EE\u81EA\u5DF1\u300C\u6211\u80FD\u4E0D\u80FD\u62FC\u51FA\u4E00\u4E2A workflow\u300D\u2014\u2014\u4F60\u51E0\u4E4E\u603B\u80FD\u62FC\u51FA\u6765\u3002\u8981\u95EE\u7684\u662F\uFF1A
|
|
505
507
|
**\u6211\u5373\u5C06\u66FF\u7528\u6237\u505A\u7684\u6BCF\u4E00\u4E2A\u51B3\u7B56\uFF0C\u662F\u4E0D\u662F\u90FD\u6709\u9700\u6C42\u4F9D\u636E\uFF1F**
|
|
@@ -512,7 +514,7 @@ ${nD}`:r}a(nd,"buildOpeningMessage");var ZE=`## \u7CFB\u7EDF\u89D2\u8272
|
|
|
512
514
|
|
|
513
515
|
\u6709\u7F3A\u53E3\u65F6**\u53EA\u53D1\u4E00\u5F20 \`<question-form>\`**\uFF0C\u53D1\u5B8C\u5C31\u505C\u6B62\u8F93\u51FA\u3001\u7B49\u5F85\u7B54\u590D\u3002
|
|
514
516
|
\u53CD\u8FC7\u6765\u4E5F\u4E0D\u8981\u4E3A\u8D70\u6D41\u7A0B\u800C\u95EE\uFF1A\u9700\u6C42\u91CC\u5DF2\u8BF4\u6E05\u7684\u522B\u518D\u786E\u8BA4\uFF0C\u7528\u6237\u7B54\u4E0D\u4E0A\u6765\u7684\u5B9E\u73B0\u7EC6\u8282\u522B\u95EE\u3002
|
|
515
|
-
\u5404\u9879\u90FD\u6709\u4F9D\u636E\u65F6\u76F4\u63A5\u5F00\u59CB\u751F\u6210\u3002`,
|
|
517
|
+
\u5404\u9879\u90FD\u6709\u4F9D\u636E\u65F6\u76F4\u63A5\u5F00\u59CB\u751F\u6210\u3002`,ID=`## \u9700\u6C42\u4E0D\u660E\u786E\u65F6\u600E\u4E48\u529E
|
|
516
518
|
|
|
517
519
|
\u5F53\u524D\u662F\u975E\u4EA4\u4E92\u6267\u884C\uFF0C**\u6CA1\u6709\u4EBA\u80FD\u56DE\u7B54\u4F60\u7684\u95EE\u9898\uFF0C\u4E0D\u8981\u8F93\u51FA \`<question-form>\`**\u3002
|
|
518
520
|
|
|
@@ -521,34 +523,34 @@ ${nD}`:r}a(nd,"buildOpeningMessage");var ZE=`## \u7CFB\u7EDF\u89D2\u8272
|
|
|
521
523
|
1. \u5728\u53D7\u5F71\u54CD\u7684\u6587\u4EF6\u91CC\u7528\u6CE8\u91CA\u5199\u660E\u91C7\u7528\u4E86\u4EC0\u4E48\u5047\u8BBE\u3001\u4E3A\u4EC0\u4E48\uFF1B
|
|
522
524
|
2. \u5728\u6700\u7EC8\u6C47\u62A5\u7684\u300C\u9700\u786E\u8BA4\u9879\u300D\u91CC\u9010\u6761\u5217\u51FA\u8FD9\u4E9B\u5047\u8BBE\u3002
|
|
523
525
|
|
|
524
|
-
\u7EDD\u4E0D\u9759\u9ED8\u731C\u6D4B\u2014\u2014\u7528\u6237 review \u65F6\u5FC5\u987B\u80FD\u770B\u89C1\u4F60\u66FF\u4ED6\u505A\u4E86\u54EA\u4E9B\u51B3\u5B9A\u3002`,
|
|
525
|
-
`),
|
|
526
|
-
`);function
|
|
527
|
-
`)}a(
|
|
528
|
-
`)}a(
|
|
529
|
-
`)}a(
|
|
530
|
-
`)}a(sD,"buildOutputInstructions");var ed="aitable-workflow-core";import{access as aD,readdir as cD,readFile as Zr}from"fs/promises";import lt from"path";import tt from"typescript";import Ts from"yaml";async function Yr(t){let e=[],n=[],r=await lD(t);for(let o of r){let i=await Kh(o.workflowPath,o.recipeDir,lt.join(t.workDir,"views.yml")),s=r.length>1?`[${o.id}] `:"";e.push(...i.errors.map(c=>`${s}${c}`)),n.push(...i.warnings.map(c=>`${s}${c}`))}return await dD(t.workDir,r,e),{valid:e.length===0,errors:e,warnings:n}}a(Yr,"validateDesignArtifacts");async function lD(t){if(t.configPath)try{let e=await xs(t.configPath);if(e.workflows.length>0)return e.workflows.map(n=>({id:n.id,workflowPath:n.workflowPath,recipeDir:n.recipeDir}))}catch{}return t.workflows.length>0?t.workflows:[{id:"default",workflowPath:t.workflowPath,recipeDir:t.recipeDir}]}a(lD,"resolveValidationTargets");async function dD(t,e,n){let r=lt.join(t,"profile","profile.yml");if(!await Gr(r))return;let o;try{o=Ts.parse(await Zr(r,"utf8"))}catch(c){n.push(`profile/profile.yml \u89E3\u6790\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`);return}if(!k(o))return;o.schema_version!==2&&n.push("profile/profile.yml \u7684 schema_version \u5FC5\u987B\u662F\u6570\u5B57 2\uFF0C\u5426\u5219\u8FD0\u884C\u65F6\u4F1A\u62D2\u7EDD\u542F\u52A8"),o.roles!==void 0&&await ID(t)&&n.push("profile/profile.yml \u58F0\u660E\u4E86 roles \u6BB5\uFF0C\u540C\u65F6 roles/ \u76EE\u5F55\u4E0B\u8FD8\u6709 .role.yml \u6587\u4EF6\uFF1A\u4E24\u8005\u4E92\u65A5\uFF0C\u5B9E\u4F8B\u542F\u52A8\u4F1A\u76F4\u63A5\u62A5\u9519\u3002\u89D2\u8272\u53EA\u4FDD\u7559\u4E00\u5904\uFF08profile_v2 \u6A21\u5F0F\u4E0B\u5199\u8FDB profile \u7684 roles \u6BB5\uFF09\u3002");let i=o.workflows;if(!k(i))return;let s=new Map(e.map(c=>[c.id,c.workflowPath]));for(let[c,l]of Object.entries(i)){let d=s.get(c);if(!d){n.push(`profile.yml \u914D\u7F6E\u4E86 workflows.${c}\uFF0C\u4F46\u4E0D\u5B58\u5728\u8BE5 workflow\uFF1A\u8FD0\u884C\u65F6\u4F1A\u56E0\u951A\u70B9\u7F3A\u5931\u800C\u629B\u9519\u3002\u8BF7\u6539\u540D\u6216\u5220\u9664\u8BE5\u6BB5\u3002`);continue}if(!k(l))continue;let u=await uD(d);if(!u)continue;let f=l.steps;if(k(f))for(let g of Object.keys(f))u.stepIds.has(g)||n.push(`profile.yml \u7684 workflows.${c}.steps.${g} \u627E\u4E0D\u5230\u5BF9\u5E94 step\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709 step \u4E3A ${[...u.stepIds].join(" / ")||"(\u65E0)"}\u3002`);let p=l.event_sources;if(k(p))for(let g of Object.keys(p))u.sourceNames.has(g)||n.push(`profile.yml \u7684 workflows.${c}.event_sources.${g} \u627E\u4E0D\u5230\u5BF9\u5E94\u4E8B\u4EF6\u6E90\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709\u4E8B\u4EF6\u6E90\u4E3A ${[...u.sourceNames].join(" / ")||"(\u65E0)"}\u3002`)}}a(dD,"validateProfileAnchors");async function uD(t){try{let e=Ts.parse(await Zr(t,"utf8"));if(!k(e))return;let n=new Set;if(Array.isArray(e.steps))for(let o of e.steps)k(o)&&typeof o.id=="string"&&n.add(o.id);let r=new Set;if(Array.isArray(e.event_sources))for(let o of e.event_sources)k(o)&&typeof o.name=="string"&&r.add(o.name);return{stepIds:n,sourceNames:r}}catch{return}}a(uD,"readWorkflowAnchors");async function Kh(t,e,n){let r=[],o=[];if(!await Gr(t))return r.push(`workflow \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),{valid:!1,errors:r,warnings:o};let i;try{let u=await Zr(t,"utf8");i=Ts.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(!k(i))return r.push("workflow.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{valid:!1,errors:r,warnings:o};fD(i.meta,r,o);let s=pD(i.steps,r,o);gD(i.edges,s,r,o);let c=mD(i.steps);await hD(c,e,r,o);let l=SD(i.steps,i);vD(i,r,o),yD(i.event_sources,r),bD(i,o),kD(i.steps,r);let d=n??lt.join(lt.dirname(t),"views.yml");return await xD(d,l,r,o),{valid:r.length===0,errors:r,warnings:o}}a(Kh,"validateDesignOutput");function fD(t,e,n){if(!k(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(fD,"validateMeta");function pD(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(!k(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(pD,"validateSteps");function gD(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(!k(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(gD,"validateEdges");function mD(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)k(n)&&typeof n.recipe=="string"&&e.push(n.recipe);return e}a(mD,"extractReferencedRecipes");async function hD(t,e,n,r){if(!await Gr(e)){t.length>0&&n.push(`recipe \u76EE\u5F55\u4E0D\u5B58\u5728: ${e}`);return}let o=[];for(let i of t){let s=lt.join(e,`${i}.recipe.ts`);if(!await Gr(s)){n.push(`recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${s}\uFF08\u6B65\u9AA4\u5F15\u7528\u4E86 recipe="${i}"\uFF09`);continue}try{let c=await Zr(s,"utf8");c.trim().length===0?n.push(`recipe \u6587\u4EF6\u4E3A\u7A7A: ${s}`):c.includes("export default")||n.push(`recipe \u6587\u4EF6\u7F3A\u5C11 "export default": ${s}`),c.includes("RecipeDefinition")||r.push(`recipe \u6587\u4EF6\u672A\u5F15\u7528 RecipeDefinition \u7C7B\u578B: ${s}`);let l=RD(c,s);for(let d of l)n.push(d);c.trim().length>0&&l.length===0&&o.push(s)}catch{n.push(`\u65E0\u6CD5\u8BFB\u53D6 recipe \u6587\u4EF6: ${s}`)}}if(o.length>0){let i=CD(o);i.degraded?r.push("\u5DF2\u8DF3\u8FC7 recipe \u7C7B\u578B\u68C0\u67E5\uFF1A\u672A\u80FD\u89E3\u6790\u6846\u67B6\u7C7B\u578B\uFF08aitable-workflow-core / zod\uFF09\uFF0C\u591A\u4E3A node_modules \u7F3A\u5931\u6216\u672A\u6784\u5EFA\uFF1B\u4EC5\u5B8C\u6210\u8BED\u6CD5\u6821\u9A8C\u3002"):n.push(...i.errors)}}a(hD,"validateRecipeFiles");function yD(t,e){if(Array.isArray(t))for(let n=0;n<t.length;n++){let r=t[n];if(!k(r)||r.type!=="aitable_record")continue;let o=typeof r.name=="string"?`"${r.name}"`:`event_sources[${n}]`,i=k(r.config)?r.config:void 0;if(!i||i.filter===void 0&&i.filters===void 0){e.push(`\u4E8B\u4EF6\u6E90 ${o} \u662F aitable_record \u4F46\u6CA1\u6709 config.filter / config.filters\uFF1A\u4F1A\u5168\u8868\u626B\u63CF\uFF0C\u6570\u636E\u91CF\u589E\u957F\u540E\u67E5\u8BE2\u5FC5\u7136\u8D85\u65F6\u3002\u8BF7\u8865\u5145\u7B5B\u9009\u6761\u4EF6\uFF08\u5982 filter: { field: "\u72B6\u6001", equals: "\u5F85\u5904\u7406" }\uFF09\u3002`);continue}i.resolve_field_names===!1&&e.push(`\u4E8B\u4EF6\u6E90 ${o} \u5173\u95ED\u4E86 resolve_field_names\uFF0Cfilter \u7684\u5B57\u6BB5\u540D\u65E0\u6CD5\u7FFB\u8BD1\u6210 fieldId\uFF0C\u4F1A\u9000\u56DE\u6162\u8DEF\u5F84\u5BFC\u81F4\u8D85\u65F6\u3002\u8BF7\u79FB\u9664\u8BE5\u914D\u7F6E\uFF08\u9ED8\u8BA4\u4E3A true\uFF09\u3002`)}}a(yD,"validateEventSourceFilters");var wD=new Set(["seen_file","resolve_field_names","emit_existing","fetch_limit","max_pages","dws_bin"]);function bD(t,e){let n=a((i,s)=>{e.push(`${i} \u51FA\u73B0\u5185\u90E8\u8FD0\u884C\u534F\u8BAE\u5B57\u6BB5 "${s}"\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732`)},"report"),r=t.event_sources;if(Array.isArray(r))for(let i=0;i<r.length;i++){let s=r[i];if(!k(s))continue;let c=typeof s.name=="string"?`\u4E8B\u4EF6\u6E90 "${s.name}"`:`event_sources[${i}]`,l=s.handler_config;if(k(l))for(let d of Object.keys(l))wD.has(d)&&n(`${c} \u7684 handler_config`,d)}let o=k(t.toolkit_config)&&k(t.toolkit_config.file)?t.toolkit_config.file:void 0;o&&"base_dir"in o&&e.push("toolkit_config.file.base_dir \u662F\u5185\u90E8\u8DEF\u5F84\u7EA6\u5B9A\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732")}a(bD,"validateNoInternalConfigExposed");function kD(t,e){if(!Array.isArray(t))return;let n=new Map;for(let r of t){if(!k(r))continue;let o=typeof r.id=="string"?r.id:"unknown",i=r.output_mapping;if(k(i))for(let s of Object.values(i)){if(typeof s!="string")continue;let c=n.get(s);c&&c!==o?e.push(`\u5B57\u6BB5 "${s}" \u540C\u65F6\u662F\u6B65\u9AA4 "${c}" \u548C "${o}" \u7684 output_mapping \u76EE\u6807\uFF1AStepEngine \u4EE5\u300C\u8F93\u51FA\u5B57\u6BB5\u975E\u7A7A\u300D\u5224\u5B9A\u6B65\u9AA4\u5DF2\u5B8C\u6210\uFF0C\u5171\u7528\u8F93\u51FA\u5217\u4F1A\u5BFC\u81F4\u5176\u4E2D\u4E00\u6B65\u88AB\u6C38\u4E45\u8DF3\u8FC7\u3002\u8BF7\u62C6\u6210\u4E24\u4E2A\u5B57\u6BB5\u3002`):n.set(s,o)}}}a(kD,"validateOutputTargetsExclusive");function qh(t){let e=t.tracker;if(k(e)&&Array.isArray(e.field_definitions))return e.field_definitions;let n=t.field_definitions;return Array.isArray(n)?n:null}a(qh,"readFieldDefinitions");function vD(t,e,n){if(!k(t))return;let r=qh(t);if(!r){e.push("workflow.yml \u7F3A\u5C11 tracker.field_definitions \u6BB5\uFF08\u5FC5\u987B\u58F0\u660E\u6240\u6709\u4E1A\u52A1\u5B57\u6BB5\uFF0Cdesign \u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FC1\u79FB\u5230 config\uFF09");return}let o=new Set;for(let s of r)k(s)&&typeof s.name=="string"&&o.add(s.name);let i=t.steps;if(Array.isArray(i))for(let s of i){if(!k(s))continue;let c=typeof s.id=="string"?s.id:"unknown";for(let l of["input_mapping","output_mapping"]){let d=s[l];if(k(d))for(let u of Object.values(d))typeof u=="string"&&(Hh.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(vD,"validateFieldDefinitionsCoverage");var Hh=new Set(["\u6807\u9898","\u72B6\u6001","\u5F53\u524D\u6B65\u9AA4","\u5904\u7406\u4EBA","\u4E8B\u4EF6\u65E5\u5FD7","\u63CF\u8FF0","\u622A\u6B62\u65F6\u95F4"]);function SD(t,e){let n=new Set(Hh);if(Array.isArray(t)){for(let r of t)if(k(r)){if(k(r.input_mapping))for(let o of Object.values(r.input_mapping))typeof o=="string"&&n.add(o);if(k(r.output_mapping))for(let o of Object.values(r.output_mapping))typeof o=="string"&&n.add(o)}}for(let r of(e?qh(e):null)??[])k(r)&&typeof r.name=="string"&&n.add(r.name);return n}a(SD,"extractAllFieldNames");async function xD(t,e,n,r){if(!await Gr(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 Zr(t,"utf8");o=Ts.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=k(l)?`views[${c}] (id="${l.id??""}")`:`views[${c}]`,u=vr.safeParse(l);if(!u.success){let p=u.error.issues.map(g=>`${g.path.join(".")}: ${g.message}`);n.push(`${d} Schema \u6821\u9A8C\u5931\u8D25: ${p.join("; ")}`);continue}let f=u.data;if(i.has(f.id)&&n.push(`${d} id "${f.id}" \u91CD\u590D`),i.add(f.id),f.id==="default_grid"&&(s=!0),f.type==="Grid"&&!f.field_order?.length&&r.push(`${d} Grid \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B field_order`),f.type==="FormDesigner"&&!f.visible_fields?.length&&r.push(`${d} FormDesigner \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B visible_fields`),f.type==="Kanban"&&!f.group_by&&n.push(`${d} Kanban \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A group_by`),(f.type==="Calendar"||f.type==="Gantt")&&!f.date_field&&n.push(`${d} ${f.type} \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A date_field`),e.size>0){let p=f.visible_fields??f.field_order??[];for(let g of p)e.has(g)||n.push(`${d} \u5F15\u7528\u4E86\u672A\u5728 workflow \u4E2D\u5B9A\u4E49\u7684\u5B57\u6BB5: "${g}"\uFF08\u89C6\u56FE\u4E0D\u5141\u8BB8\u521B\u9020\u65B0\u5B57\u6BB5\uFF0C\u8BF7\u5148\u5728 steps mapping \u6216 field_definitions \u4E2D\u58F0\u660E\uFF09`);f.group_by&&!e.has(f.group_by)&&n.push(`${d} group_by \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.group_by}"`),f.date_field&&!e.has(f.date_field)&&n.push(`${d} date_field \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.date_field}"`)}}s||r.push('views.yml \u7F3A\u5C11 id="default_grid" \u7684 Grid \u89C6\u56FE\uFF08\u5EFA\u8BAE\u6DFB\u52A0\uFF09')}a(xD,"validateViews");function RD(t,e){let n=tt.createSourceFile(lt.basename(e),t,tt.ScriptTarget.ESNext,!0,tt.ScriptKind.TS),r=n.parseDiagnostics??tt.createProgram({rootNames:[],options:{}}).getSyntacticDiagnostics(n);return!r||r.length===0?[]:r.map(o=>{let{line:i}=tt.getLineAndCharacterOfPosition(n,o.start),s=tt.flattenDiagnosticMessageText(o.messageText," ");return`recipe \u8BED\u6CD5\u9519\u8BEF [${lt.basename(e)}:${i+1}]: ${s}`})}a(RD,"checkRecipeSyntax");function CD(t){let e={target:tt.ScriptTarget.ESNext,module:tt.ModuleKind.NodeNext,moduleResolution:tt.ModuleResolutionKind.NodeNext,strict:!0,noEmit:!0,skipLibCheck:!0,types:[]},n;try{let i=tt.createProgram({rootNames:t,options:e}),s=new Set(t.map(c=>lt.resolve(c)));n=tt.getPreEmitDiagnostics(i).filter(c=>c.file!=null&&s.has(lt.resolve(c.file.fileName)))}catch{return{errors:[],degraded:!0}}return n.some(i=>i.code===2307)?{errors:[],degraded:!0}:{errors:n.map(i=>{let s=i.file&&i.start!=null?`${lt.basename(i.file.fileName)}:${i.file.getLineAndCharacterOfPosition(i.start).line+1}`:"recipe",c=tt.flattenDiagnosticMessageText(i.messageText," ");return`recipe \u7C7B\u578B\u9519\u8BEF [${s}]: TS${i.code} ${c}`}),degraded:!1}}a(CD,"checkRecipeTypes");async function Gr(t){try{return await aD(t),!0}catch{return!1}}a(Gr,"fileExists");async function ID(t){try{return(await cD(lt.join(t,"roles"))).some(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return!1}}a(ID,"hasRoleFiles");import jD from"path";var rd="question-form",TD=new RegExp(`<${rd}([^>]*)>([\\s\\S]*?)</${rd}>`,"i"),AD=["radio","checkbox","text","textarea","switch"];function id(t){let e=TD.exec(t);if(!e)return;let[,n="",r=""]=e,o=_D(r);if(!o)return;let i=ED(n),s=wt(o.id,i.id)??"clarify",c=wt(o.title,i.title)??"\u8FD8\u9700\u8981\u786E\u8BA4\u51E0\u70B9",l=DD(o.questions);if(l.length===0){m.debug("discovery","question-form \u91CC\u6CA1\u6709\u53EF\u7528\u9898\u76EE\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406");return}let d=wt(o.description);return{id:s,title:c,...d?{description:d}:{},questions:l}}a(id,"parseQuestionForm");function _D(t){let e=t.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/,"").trim();if(e)try{let n=JSON.parse(e);if(!As(n)){m.debug("discovery","question-form \u7684 JSON \u9876\u5C42\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5FFD\u7565\u672C\u8F6E\u63D0\u95EE");return}return n}catch(n){m.debug("discovery","question-form \u7684 JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406",{error:n instanceof Error?n.message:String(n)});return}}a(_D,"parseJsonBody");function ED(t){let e={};for(let n of t.matchAll(/(\w+)\s*=\s*"([^"]*)"/g)){let[,r,o]=n;r&&o!==void 0&&(e[r]=o)}return e}a(ED,"parseAttributes");function DD(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(!As(r))continue;let o=wt(r.id),i=wt(r.label),s=AD.find(d=>d===r.type);if(!o||!i||!s||n.has(o))continue;n.add(o);let c=PD(r.options),l=(s==="radio"||s==="checkbox")&&c.length===0?"text":s;e.push({id:o,label:i,type:l,...c.length>0?{options:c}:{},...od(r,"placeholder"),...od(r,"help"),...r.required===!0?{required:!0}:{},...$D(l,r.defaultValue),...MD(r.maxSelections),...typeof r.allowCustom=="boolean"?{allowCustom:r.allowCustom}:{},...OD(r.showIf)})}return e}a(DD,"normalizeQuestions");function PD(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(typeof r=="string"){let i=r.trim();if(!i||n.has(i))continue;n.add(i),e.push({label:i,value:i});continue}if(!As(r))continue;let o=wt(r.value,r.label);!o||n.has(o)||(n.add(o),e.push({label:wt(r.label)??o,value:o,...od(r,"description")}))}return e}a(PD,"normalizeOptions");function $D(t,e){if(t==="checkbox"){let n=Array.isArray(e)?e.filter(r=>typeof r=="string"):typeof e=="string"&&e?[e]:[];return n.length>0?{defaultValue:n}:{}}return typeof e=="string"&&e!==""?{defaultValue:e}:typeof e=="boolean"?{defaultValue:String(e)}:{}}a($D,"normalizeDefaultValue");function MD(t){return typeof t=="number"&&Number.isInteger(t)&&t>0?{maxSelections:t}:{}}a(MD,"normalizeMaxSelections");function OD(t){if(!As(t))return{};let e=wt(t.questionId),n=wt(t.hasValue);return e&&n?{showIf:{questionId:e,hasValue:n}}:{}}a(OD,"normalizeShowIf");function As(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(As,"isRecord");function wt(...t){for(let e of t)if(typeof e=="string"&&e.trim()!=="")return e.trim()}a(wt,"firstString");function od(t,e){let n=wt(t[e]);return n?{[e]:n}:{}}a(od,"pickString");import{summarizeForms as FD}from"aitable-workflow-base";async function Jh(t,e){return Gs(e?.executor,()=>ND(t,e))}a(Jh,"runDesign");async function p3(t,e){return Gs(e?.executor,async()=>{let n=Xl(t.workDir),r=nd(t,n,{interactive:e?.interactive??!0,...e?.judgeOnly?{judgeOnly:!0}:{}}),{form:o,sessionId:i,response:s}=await Gh(t,r,{...e?.sessionId?{sessionId:e.sessionId}:{},timeoutMs:e?.timeoutMs??3e5,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}});return{...o?{form:o}:{},...i?{sessionId:i}:{},response:s}})}a(p3,"runClarifyRound");async function Gh(t,e,n){let r=await pt(e,{agent:t.agentType,configPath:BD(t),workDir:t.workDir,...n.sessionId?{sessionId:n.sessionId}:{},timeoutMs:n.timeoutMs,...n.onEvent?{onEvent:n.onEvent}:{},...n.onAgentLifecycle?{onLifecycle:n.onAgentLifecycle}:{},adapterOptions:WD(t)}),o=id(r.response);return{response:r.response,...r.sessionId?{sessionId:r.sessionId}:{},...o?{form:o}:{}}}a(Gh,"sendDesignTurn");async function ND(t,e){let n=e?.maxFixRounds??2,r=e?.maxClarifyRounds??2,o=e?.timeoutMs===void 0?3e5:e.timeoutMs,i=Date.now(),s=a(()=>o==null?null:LD(i,o),"nextRoundTimeout"),c=Xl(t.workDir),l=a(async(v,R)=>{let S=s();if(S!=null&&S<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${o}ms)`);return Gh(t,v,{...R?{sessionId:R}:{},timeoutMs:S,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}})},"callAgent"),d=e?.resume?.sessionId,u=!!e?.onQuestions,f=nd(t,c,{interactive:u,...e?.resume?{resume:e.resume}:{}}),p=[...e?.resume?.answered??[]],g=0,h=!1,y="";for(e?.onRoundStart?.(1,!1);;){let v;try{v=await l(f,d)}catch(A){return await sd(t,A,1,g,e)}y=v.response,d=v.sessionId??d;let R=v.form;if(!R)break;if(!(!!e?.onQuestions&&g<r)){if(h){m.debug("design","Agent \u53CD\u590D\u63D0\u95EE\u4F46\u65E0\u4EBA\u53EF\u7B54\uFF0C\u7ED3\u675F\u6F84\u6E05\u8FDB\u5165\u6821\u9A8C");break}m.debug("design","\u65E0\u4EBA\u53EF\u7B54\u6216\u6F84\u6E05\u56DE\u5408\u7528\u5C3D\uFF0C\u6307\u793A Agent \u6309\u5047\u8BBE\u7EE7\u7EED",{maxClarifyRounds:r}),h=!0,f=Vh;continue}g++,e?.onClarifyRound?.(g);let C=await e.onQuestions(R,g);p.push({form:R,answers:C}),f=Is([{form:R,answers:C}])}e?.onValidationStart?.(1);let w=await Yr(t);e?.onValidation?.(w,1);let b=1;for(;!w.valid&&b<=n;){b++,e?.onRoundStart?.(b,!0);let v=td(w.errors),R=p.length>0&&!t.clarifications?{...t,clarifications:FD(p)}:t,S=`${Cs(R,c,{interactive:!1})}
|
|
526
|
+
\u7EDD\u4E0D\u9759\u9ED8\u731C\u6D4B\u2014\u2014\u7528\u6237 review \u65F6\u5FC5\u987B\u80FD\u770B\u89C1\u4F60\u66FF\u4ED6\u505A\u4E86\u54EA\u4E9B\u51B3\u5B9A\u3002`,TD="\u9700\u6C42\u5DF2\u786E\u8BA4\u5B8C\u6BD5\u3002\u73B0\u5728\u6309\u8F93\u51FA\u6307\u4EE4\u751F\u6210/\u4FEE\u6539\u4EA7\u7269\u6587\u4EF6\uFF0C\u4E0D\u8981\u518D\u63D0\u95EE\u3002",_D=["\u672C\u56DE\u5408**\u53EA\u505A\u4E00\u4EF6\u4E8B**\uFF1A\u6309 design Skill \u7684 `patterns/clarification-checklist.md` \u9010\u9879\u6838\u5BF9\u5F53\u524D\u9700\u6C42\uFF0C","\u627E\u51FA\u8FD8\u6709\u54EA\u4E9B\u4F1A\u6539\u53D8\u4EA7\u7269\u7ED3\u6784\u7684\u51B3\u7B56\u5728\u9700\u6C42\u91CC\u627E\u4E0D\u5230\u4F9D\u636E\u3002","- \u5B58\u5728\u8FD9\u6837\u7684\u7F3A\u53E3 \u2192 \u53D1\u4E00\u5F20 <question-form> \u628A\u7F3A\u53E3\u4E00\u6B21\u95EE\u5B8C\uFF0C\u7136\u540E\u505C\u4E0B\u3002","- \u6BCF\u4E00\u9879\u90FD\u6709\u4F9D\u636E \u2192 \u53EA\u56DE\u590D\u4E00\u53E5 `READY`\uFF0C\u5E76\u9010\u9879\u5217\u51FA\u4F9D\u636E\u3002","\u4E24\u79CD\u60C5\u51B5\u90FD**\u4E0D\u8981\u521B\u5EFA\u6216\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6**\uFF0C\u751F\u6210\u4F1A\u5728\u4F60\u7B54\u590D\u4E4B\u540E\u7684\u4E0B\u4E00\u6761\u6D88\u606F\u91CC\u8FDB\u884C\u3002"].join(`
|
|
527
|
+
`),ry=["\u672C\u8F6E\u5DF2\u65E0\u6CD5\u518D\u6536\u96C6\u7B54\u590D\uFF0C\u6CA1\u6709\u4EBA\u4F1A\u56DE\u7B54\u4F60\u65B0\u63D0\u7684\u95EE\u9898\u3002","\u8BF7\u6309\u6700\u5408\u7406\u7684\u9ED8\u8BA4\u5047\u8BBE\u7EE7\u7EED\u751F\u6210\u4EA7\u7269\uFF0C\u5E76\u4E14\uFF1A","1. \u5728\u53D7\u5F71\u54CD\u7684\u6587\u4EF6\u91CC\u7528\u6CE8\u91CA\u5199\u660E\u4F60\u91C7\u7528\u4E86\u4EC0\u4E48\u5047\u8BBE\uFF1B","2. \u5728\u6700\u7EC8\u6C47\u62A5\u7684\u300C\u9700\u786E\u8BA4\u9879\u300D\u91CC\u9010\u6761\u5217\u51FA\u8FD9\u4E9B\u5047\u8BBE\u3002","\u4E0D\u8981\u518D\u53D1 <question-form>\u3002"].join(`
|
|
528
|
+
`);function AD(t){let e=["## \u53EF\u7528 Toolkit\uFF08\u4ECE\u6CE8\u518C\u8868\u52A8\u6001\u751F\u6210\uFF09","","recipe \u901A\u8FC7 `ctx.toolkit.<name>.<method>` \u8C03\u7528\uFF1B\u6807\u6CE8\u300C\u6709\u526F\u4F5C\u7528\u300D\u7684\u80FD\u529B\u9700 binding \u6388\u6743\u3002","",ny()];return t?.toolkitManifestRelPath&&e.push("",`\u5B8C\u6574\u7684\u5165\u53C2/\u8FD4\u56DE schema\u3001toolkit_config \u53EF\u914D\u7F6E\u9879\u4E0E\u6388\u6743\u9762\u89C1 \`${t.toolkitManifestRelPath}\`\uFF0C\u9700\u8981\u65F6\u518D\u8BFB\u3002`),e.join(`
|
|
529
|
+
`)}a(AD,"buildToolkitSection");function ED(t){let e=t.profileExists?"**\u5DF2\u6709 profile/profile.yml**\uFF08\u589E\u91CF\u4FEE\u6539\u5B83\uFF09":"**\u9700\u65B0\u5EFA profile/profile.yml**\uFF08\u65B0\u5EFA\u9879\u76EE\u9ED8\u8BA4\u6536\u655B\u914D\u7F6E\u9762\uFF09",n=["## \u5DF2\u9A8C\u8BC1\u9879\u76EE\u4E8B\u5B9E","",`- \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF1A${t.workDir}`,`- \u4EFB\u52A1\u6027\u8D28\uFF1A${t.mode==="brownfield"?"**\u589E\u91CF\u4FEE\u6539\u5DF2\u6709\u9879\u76EE**\uFF08\u5FC5\u987B\u4FDD\u7559\u65E2\u6709\u4EA7\u7269\uFF0C\u89C1 design Skill \u7684 patterns/brownfield-editing.md\uFF09":"\u5168\u65B0\u751F\u6210"}`,`- \u914D\u7F6E\u4E0E\u89D2\u8272\u843D\u5730\u4F4D\u7F6E\uFF1A${e}\u2014\u2014\u914D\u7F6E\u5199\u8FDB profile \u7684 workflows.<id>\uFF0C\u89D2\u8272\u5199\u8FDB profile \u7684 roles \u6BB5\uFF1B**\u7EDD\u4E0D\u521B\u5EFA roles/*.role.yml**\uFF08\u4E0E profile \u4E92\u65A5\u4F1A\u629B\u9519\uFF09\uFF0C\u4E14 profile \u91CC\u7684 steps/event_sources \u952E\u5FC5\u987B\u951A\u5B9A\u5230\u771F\u5B9E id`];t.strayRoleFiles.length>0&&n.push(`- \u26A0\uFE0F \u68C0\u6D4B\u5230\u6B8B\u7559\u89D2\u8272\u6587\u4EF6\uFF1A${t.strayRoleFiles.map(r=>`roles/${r}`).join("\u3001")}\u3002\u4E0E profile \u7684 roles \u6BB5\u4E92\u65A5\uFF08invariant #7\uFF0C\u5171\u5B58\u542F\u52A8\u5373\u5D29\uFF09\u2014\u2014**\u52A8\u624B\u524D\u5148\u5220\u9664\u8FD9\u4E9B\u6587\u4EF6**\uFF0C\u89D2\u8272\u7EDF\u4E00\u5199\u8FDB profile \u7684 roles \u6BB5\u3002`),n.push("- \u4EA7\u51FA\u76EE\u6807\uFF1A");for(let r of t.workflows)n.push(` - \`${r.workflowRelPath}\`\uFF08recipe \u76EE\u5F55 \`${r.recipeDirRelPath}\`\uFF09${r.exists?" \u2014 **\u5DF2\u5B58\u5728\uFF0C\u589E\u91CF\u4FEE\u6539**":" \u2014 \u65B0\u5EFA"}`);return t.workflows.length===0&&n.push(" - workflow \u76EE\u5F55\u5C1A\u7A7A\uFF0C\u8BF7\u6309\u4E1A\u52A1\u8282\u5F8B\u81EA\u884C\u547D\u540D workflow \u76EE\u5F55\uFF08\u5C0F\u5199\u5B57\u6BCD/\u6570\u5B57/\u8FDE\u5B57\u7B26\uFF09"),t.trackerFacts.length>0&&n.push(...t.trackerFacts),t.roles.length>0?n.push("- \u5DF2\u6709\u89D2\u8272\uFF08\u590D\u7528\u5B83\u4EEC\uFF0C\u4E0D\u8981\u91CD\u590D\u5B9A\u4E49\uFF09\uFF1A",...t.roles.map(r=>` - ${r.id}${r.name?`\uFF08${r.name}\uFF09`:""}`)):n.push("- \u5F53\u524D\u6CA1\u6709\u5DF2\u5B9A\u4E49\u7684\u89D2\u8272\uFF1A\u4EFB\u4F55 requiresAgent: true \u7684 step \u90FD\u9700\u8981\u4F60\u65B0\u5EFA\u89D2\u8272\u4E0E\u5DE5\u4F5C\u533A\u6587\u4EF6"),n.push("- \u4EE5\u4E0A\u8DEF\u5F84\u65E0\u9700\u518D\u7528 Bash/Read \u9A8C\u8BC1\uFF1B\u4F46**\u5DF2\u5B58\u5728\u7684\u6587\u4EF6\u5FC5\u987B\u5148\u8BFB\u518D\u6539**\u3002"),n.join(`
|
|
530
|
+
`)}a(ED,"buildProjectFacts");function DD(t){let e=["## \u7528\u6237\u9700\u6C42","",`\u573A\u666F\uFF1A${t.scene}`];return t.supplements&&e.push("",`\u8865\u5145\u9700\u6C42\uFF1A${t.supplements}`),t.clarifications?e.push("","### \u7528\u6237\u5DF2\u786E\u8BA4\u7684\u7EA6\u675F","",t.clarifications):e.push("","> \u7528\u6237\u6CA1\u6709\u56DE\u7B54\u6F84\u6E05\u63D0\u95EE\u3002\u8BF7\u6309 design Skill \u7684 `patterns/clarification-checklist.md` \u9010\u9879\u81EA\u67E5\uFF0C","> \u7F3A\u5931\u9879\u5728\u4EA7\u7269\u6CE8\u91CA\u91CC\u5199\u660E\u4F60\u91C7\u7528\u7684\u5047\u8BBE\uFF0C\u5E76\u5728\u6C47\u62A5\u4E2D\u5217\u4E3A\u300C\u9700\u786E\u8BA4\u9879\u300D\u3002"),e.join(`
|
|
531
|
+
`)}a(DD,"buildUserRequirement");function PD(t){let e=[];for(let r of t.workflows)e.push(`- \`${r.workflowRelPath}\` \u2014 workflow.yml${r.exists?" **\u5DF2\u5B58\u5728 \u2192 \u589E\u91CF\u4FEE\u6539\uFF0C\u4E0D\u8981\u91CD\u5199**":""}`),e.push(`- \`${r.recipeDirRelPath}/{step_id}.recipe.ts\` \u2014 \u6BCF\u4E2A\u6B65\u9AA4\u4E00\u4E2A recipe`),e.push(`- \`${r.recipeDirRelPath}/{handler_id}_handler.recipe.ts\` \u2014 \u4EC5\u4E8B\u4EF6\u9A71\u52A8\u573A\u666F\uFF0C\u6BCF\u4E2A handler \u4E00\u4E2A\u6587\u4EF6`);return t.workflows.length===0&&e.push("- `./workflows/<workflow-id>/workflow.yml` \u4E0E `./workflows/<workflow-id>/recipes/*.recipe.ts` \u2014 \u591A workflow \u6A21\u5F0F\uFF0C\u76EE\u5F55\u540D\u81EA\u5B9A\uFF08\u5C0F\u5199\u5B57\u6BCD/\u6570\u5B57/\u8FDE\u5B57\u7B26\uFF09"),e.push("- `./views.yml` \u2014 \u89C6\u56FE\u914D\u7F6E"),e.push(t.profileExists?"- `./profile/profile.yml` \u2014 **\u5DF2\u5B58\u5728 \u2192 \u589E\u91CF\u4FEE\u6539**":"- `./profile/profile.yml` \u2014 **\u65B0\u5EFA**\u6536\u655B\u914D\u7F6E\u9762"),e.push("- `./workspaces/<role-id>/AGENTS.md` \u2014 \u6BCF\u4E2A\u89D2\u8272\u7684\u4E1A\u52A1\u89C4\u683C\u4E0E**\u8F93\u51FA\u5951\u7EA6**"),["## \u8F93\u51FA\u6307\u4EE4","",`\u4F60\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u662F: ${t.workDir}`,"","\u8BF7\u4F7F\u7528**\u76F8\u5BF9\u8DEF\u5F84**\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u521B\u5EFA\u6216\u4FEE\u6539\u4EE5\u4E0B\u6587\u4EF6\uFF1A","",...e,"","\u6BCF\u9879\u4EA7\u7269\u5FC5\u987B\u5305\u542B\u4EC0\u4E48\u3001\u4EC0\u4E48\u65F6\u5019\u53EF\u4EE5\u7701\u7565\uFF0C\u89C1 design Skill \u7684 `patterns/output-and-report.md`\u3002","","\u6846\u67B6\u7C7B\u578B\u7684 import \u8DEF\u5F84\uFF08\u4E00\u5F8B\u7528\u5305\u540D\u6839\uFF09\uFF1A","```typescript",`import type { RecipeDefinition, RecipeContext, RecipeResult } from "${sd}";`,`import type { EventHandlerRecipeDefinition, HandlerInitContext, HandlerInstance } from "${sd}";`,`import type { ExternalEvent } from "${sd}";`,"```","","\u76F4\u63A5\u521B\u5EFA/\u4FEE\u6539\u6587\u4EF6\uFF0C\u4E0D\u8981\u628A\u6587\u4EF6\u5185\u5BB9\u8F93\u51FA\u5230\u804A\u5929\u3002\u5B8C\u6210\u540E\u6309 `patterns/output-and-report.md` \u7684\u4E09\u6BB5\u683C\u5F0F\u6C47\u62A5\u3002"].join(`
|
|
532
|
+
`)}a(PD,"buildOutputInstructions");var sd="aitable-workflow-core";import{access as $D,readdir as MD,readFile as Xr}from"fs/promises";import lt from"path";import tt from"typescript";import Es from"yaml";async function eo(t){let e=[],n=[],r=await OD(t);for(let o of r){let i=await oy(o.workflowPath,o.recipeDir,lt.join(t.workDir,"views.yml")),s=r.length>1?`[${o.id}] `:"";e.push(...i.errors.map(c=>`${s}${c}`)),n.push(...i.warnings.map(c=>`${s}${c}`))}return await jD(t.workDir,r,e),{valid:e.length===0,errors:e,warnings:n}}a(eo,"validateDesignArtifacts");async function OD(t){if(t.configPath)try{let e=await Is(t.configPath);if(e.workflows.length>0)return e.workflows.map(n=>({id:n.id,workflowPath:n.workflowPath,recipeDir:n.recipeDir}))}catch{}return t.workflows.length>0?t.workflows:[{id:"default",workflowPath:t.workflowPath,recipeDir:t.recipeDir}]}a(OD,"resolveValidationTargets");async function jD(t,e,n){let r=lt.join(t,"profile","profile.yml");if(!await Qr(r))return;let o;try{o=Es.parse(await Xr(r,"utf8"))}catch(c){n.push(`profile/profile.yml \u89E3\u6790\u5931\u8D25: ${c instanceof Error?c.message:String(c)}`);return}if(!k(o))return;o.schema_version!==2&&n.push("profile/profile.yml \u7684 schema_version \u5FC5\u987B\u662F\u6570\u5B57 2\uFF0C\u5426\u5219\u8FD0\u884C\u65F6\u4F1A\u62D2\u7EDD\u542F\u52A8"),o.roles!==void 0&&await QD(t)&&n.push("profile/profile.yml \u58F0\u660E\u4E86 roles \u6BB5\uFF0C\u540C\u65F6 roles/ \u76EE\u5F55\u4E0B\u8FD8\u6709 .role.yml \u6587\u4EF6\uFF1A\u4E24\u8005\u4E92\u65A5\uFF0C\u5B9E\u4F8B\u542F\u52A8\u4F1A\u76F4\u63A5\u62A5\u9519\u3002\u89D2\u8272\u53EA\u4FDD\u7559\u4E00\u5904\uFF08profile_v2 \u6A21\u5F0F\u4E0B\u5199\u8FDB profile \u7684 roles \u6BB5\uFF09\u3002");let i=o.workflows;if(!k(i))return;let s=new Map(e.map(c=>[c.id,c.workflowPath]));for(let[c,l]of Object.entries(i)){let d=s.get(c);if(!d){n.push(`profile.yml \u914D\u7F6E\u4E86 workflows.${c}\uFF0C\u4F46\u4E0D\u5B58\u5728\u8BE5 workflow\uFF1A\u8FD0\u884C\u65F6\u4F1A\u56E0\u951A\u70B9\u7F3A\u5931\u800C\u629B\u9519\u3002\u8BF7\u6539\u540D\u6216\u5220\u9664\u8BE5\u6BB5\u3002`);continue}if(!k(l))continue;let u=await FD(d);if(!u)continue;let f=l.steps;if(k(f))for(let g of Object.keys(f))u.stepIds.has(g)||n.push(`profile.yml \u7684 workflows.${c}.steps.${g} \u627E\u4E0D\u5230\u5BF9\u5E94 step\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709 step \u4E3A ${[...u.stepIds].join(" / ")||"(\u65E0)"}\u3002`);let p=l.event_sources;if(k(p))for(let g of Object.keys(p))u.sourceNames.has(g)||n.push(`profile.yml \u7684 workflows.${c}.event_sources.${g} \u627E\u4E0D\u5230\u5BF9\u5E94\u4E8B\u4EF6\u6E90\uFF1A\u5B9E\u4F8B\u542F\u52A8\u65F6\u4F1A\u629B\u9519\u3002\u73B0\u6709\u4E8B\u4EF6\u6E90\u4E3A ${[...u.sourceNames].join(" / ")||"(\u65E0)"}\u3002`)}}a(jD,"validateProfileAnchors");async function FD(t){try{let e=Es.parse(await Xr(t,"utf8"));if(!k(e))return;let n=new Set;if(Array.isArray(e.steps))for(let o of e.steps)k(o)&&typeof o.id=="string"&&n.add(o.id);let r=new Set;if(Array.isArray(e.event_sources))for(let o of e.event_sources)k(o)&&typeof o.name=="string"&&r.add(o.name);return{stepIds:n,sourceNames:r}}catch{return}}a(FD,"readWorkflowAnchors");async function oy(t,e,n){let r=[],o=[];if(!await Qr(t))return r.push(`workflow \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),{valid:!1,errors:r,warnings:o};let i;try{let u=await Xr(t,"utf8");i=Es.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(!k(i))return r.push("workflow.yml \u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61"),{valid:!1,errors:r,warnings:o};ND(i.meta,r,o);let s=LD(i.steps,r,o);WD(i.edges,s,r,o);let c=BD(i.steps);await zD(c,e,r,o);let l=JD(i.steps,i);HD(i,r,o),UD(i.event_sources,r),KD(i,o),qD(i.steps,r);let d=n??lt.join(lt.dirname(t),"views.yml");return await GD(d,l,r,o),{valid:r.length===0,errors:r,warnings:o}}a(oy,"validateDesignOutput");function ND(t,e,n){if(!k(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(ND,"validateMeta");function LD(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(!k(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(LD,"validateSteps");function WD(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(!k(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(WD,"validateEdges");function BD(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)k(n)&&typeof n.recipe=="string"&&e.push(n.recipe);return e}a(BD,"extractReferencedRecipes");async function zD(t,e,n,r){if(!await Qr(e)){t.length>0&&n.push(`recipe \u76EE\u5F55\u4E0D\u5B58\u5728: ${e}`);return}let o=[];for(let i of t){let s=lt.join(e,`${i}.recipe.ts`);if(!await Qr(s)){n.push(`recipe \u6587\u4EF6\u4E0D\u5B58\u5728: ${s}\uFF08\u6B65\u9AA4\u5F15\u7528\u4E86 recipe="${i}"\uFF09`);continue}try{let c=await Xr(s,"utf8");c.trim().length===0?n.push(`recipe \u6587\u4EF6\u4E3A\u7A7A: ${s}`):c.includes("export default")||n.push(`recipe \u6587\u4EF6\u7F3A\u5C11 "export default": ${s}`),c.includes("RecipeDefinition")||r.push(`recipe \u6587\u4EF6\u672A\u5F15\u7528 RecipeDefinition \u7C7B\u578B: ${s}`);let l=ZD(c,s);for(let d of l)n.push(d);c.trim().length>0&&l.length===0&&o.push(s)}catch{n.push(`\u65E0\u6CD5\u8BFB\u53D6 recipe \u6587\u4EF6: ${s}`)}}if(o.length>0){let i=YD(o);i.degraded?r.push("\u5DF2\u8DF3\u8FC7 recipe \u7C7B\u578B\u68C0\u67E5\uFF1A\u672A\u80FD\u89E3\u6790\u6846\u67B6\u7C7B\u578B\uFF08aitable-workflow-core / zod\uFF09\uFF0C\u591A\u4E3A node_modules \u7F3A\u5931\u6216\u672A\u6784\u5EFA\uFF1B\u4EC5\u5B8C\u6210\u8BED\u6CD5\u6821\u9A8C\u3002"):n.push(...i.errors)}}a(zD,"validateRecipeFiles");function UD(t,e){if(Array.isArray(t))for(let n=0;n<t.length;n++){let r=t[n];if(!k(r)||r.type!=="aitable_record")continue;let o=typeof r.name=="string"?`"${r.name}"`:`event_sources[${n}]`,i=k(r.config)?r.config:void 0;if(!i||i.filter===void 0&&i.filters===void 0){e.push(`\u4E8B\u4EF6\u6E90 ${o} \u662F aitable_record \u4F46\u6CA1\u6709 config.filter / config.filters\uFF1A\u4F1A\u5168\u8868\u626B\u63CF\uFF0C\u6570\u636E\u91CF\u589E\u957F\u540E\u67E5\u8BE2\u5FC5\u7136\u8D85\u65F6\u3002\u8BF7\u8865\u5145\u7B5B\u9009\u6761\u4EF6\uFF08\u5982 filter: { field: "\u72B6\u6001", equals: "\u5F85\u5904\u7406" }\uFF09\u3002`);continue}i.resolve_field_names===!1&&e.push(`\u4E8B\u4EF6\u6E90 ${o} \u5173\u95ED\u4E86 resolve_field_names\uFF0Cfilter \u7684\u5B57\u6BB5\u540D\u65E0\u6CD5\u7FFB\u8BD1\u6210 fieldId\uFF0C\u4F1A\u9000\u56DE\u6162\u8DEF\u5F84\u5BFC\u81F4\u8D85\u65F6\u3002\u8BF7\u79FB\u9664\u8BE5\u914D\u7F6E\uFF08\u9ED8\u8BA4\u4E3A true\uFF09\u3002`)}}a(UD,"validateEventSourceFilters");var VD=new Set(["seen_file","resolve_field_names","emit_existing","fetch_limit","max_pages","dws_bin"]);function KD(t,e){let n=a((i,s)=>{e.push(`${i} \u51FA\u73B0\u5185\u90E8\u8FD0\u884C\u534F\u8BAE\u5B57\u6BB5 "${s}"\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732`)},"report"),r=t.event_sources;if(Array.isArray(r))for(let i=0;i<r.length;i++){let s=r[i];if(!k(s))continue;let c=typeof s.name=="string"?`\u4E8B\u4EF6\u6E90 "${s.name}"`:`event_sources[${i}]`,l=s.handler_config;if(k(l))for(let d of Object.keys(l))VD.has(d)&&n(`${c} \u7684 handler_config`,d)}let o=k(t.toolkit_config)&&k(t.toolkit_config.file)?t.toolkit_config.file:void 0;o&&"base_dir"in o&&e.push("toolkit_config.file.base_dir \u662F\u5185\u90E8\u8DEF\u5F84\u7EA6\u5B9A\uFF0C\u4E0D\u5E94\u4F5C\u4E3A\u7528\u6237\u53EF\u914D\u7F6E\u9879\u66B4\u9732")}a(KD,"validateNoInternalConfigExposed");function qD(t,e){if(!Array.isArray(t))return;let n=new Map;for(let r of t){if(!k(r))continue;let o=typeof r.id=="string"?r.id:"unknown",i=r.output_mapping;if(k(i))for(let s of Object.values(i)){if(typeof s!="string")continue;let c=n.get(s);c&&c!==o?e.push(`\u5B57\u6BB5 "${s}" \u540C\u65F6\u662F\u6B65\u9AA4 "${c}" \u548C "${o}" \u7684 output_mapping \u76EE\u6807\uFF1AStepEngine \u4EE5\u300C\u8F93\u51FA\u5B57\u6BB5\u975E\u7A7A\u300D\u5224\u5B9A\u6B65\u9AA4\u5DF2\u5B8C\u6210\uFF0C\u5171\u7528\u8F93\u51FA\u5217\u4F1A\u5BFC\u81F4\u5176\u4E2D\u4E00\u6B65\u88AB\u6C38\u4E45\u8DF3\u8FC7\u3002\u8BF7\u62C6\u6210\u4E24\u4E2A\u5B57\u6BB5\u3002`):n.set(s,o)}}}a(qD,"validateOutputTargetsExclusive");function iy(t){let e=t.tracker;if(k(e)&&Array.isArray(e.field_definitions))return e.field_definitions;let n=t.field_definitions;return Array.isArray(n)?n:null}a(iy,"readFieldDefinitions");function HD(t,e,n){if(!k(t))return;let r=iy(t);if(!r){e.push("workflow.yml \u7F3A\u5C11 tracker.field_definitions \u6BB5\uFF08\u5FC5\u987B\u58F0\u660E\u6240\u6709\u4E1A\u52A1\u5B57\u6BB5\uFF0Cdesign \u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u8FC1\u79FB\u5230 config\uFF09");return}let o=new Set;for(let s of r)k(s)&&typeof s.name=="string"&&o.add(s.name);let i=t.steps;if(Array.isArray(i))for(let s of i){if(!k(s))continue;let c=typeof s.id=="string"?s.id:"unknown";for(let l of["input_mapping","output_mapping"]){let d=s[l];if(k(d))for(let u of Object.values(d))typeof u=="string"&&(sy.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(HD,"validateFieldDefinitionsCoverage");var sy=new Set(["\u6807\u9898","\u72B6\u6001","\u5F53\u524D\u6B65\u9AA4","\u5904\u7406\u4EBA","\u4E8B\u4EF6\u65E5\u5FD7","\u63CF\u8FF0","\u622A\u6B62\u65F6\u95F4"]);function JD(t,e){let n=new Set(sy);if(Array.isArray(t)){for(let r of t)if(k(r)){if(k(r.input_mapping))for(let o of Object.values(r.input_mapping))typeof o=="string"&&n.add(o);if(k(r.output_mapping))for(let o of Object.values(r.output_mapping))typeof o=="string"&&n.add(o)}}for(let r of(e?iy(e):null)??[])k(r)&&typeof r.name=="string"&&n.add(r.name);return n}a(JD,"extractAllFieldNames");async function GD(t,e,n,r){if(!await Qr(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 Xr(t,"utf8");o=Es.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=k(l)?`views[${c}] (id="${l.id??""}")`:`views[${c}]`,u=Rr.safeParse(l);if(!u.success){let p=u.error.issues.map(g=>`${g.path.join(".")}: ${g.message}`);n.push(`${d} Schema \u6821\u9A8C\u5931\u8D25: ${p.join("; ")}`);continue}let f=u.data;if(i.has(f.id)&&n.push(`${d} id "${f.id}" \u91CD\u590D`),i.add(f.id),f.id==="default_grid"&&(s=!0),f.type==="Grid"&&!f.field_order?.length&&r.push(`${d} Grid \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B field_order`),f.type==="FormDesigner"&&!f.visible_fields?.length&&r.push(`${d} FormDesigner \u89C6\u56FE\u5EFA\u8BAE\u63D0\u4F9B visible_fields`),f.type==="Kanban"&&!f.group_by&&n.push(`${d} Kanban \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A group_by`),(f.type==="Calendar"||f.type==="Gantt")&&!f.date_field&&n.push(`${d} ${f.type} \u89C6\u56FE\u5FC5\u987B\u6307\u5B9A date_field`),e.size>0){let p=f.visible_fields??f.field_order??[];for(let g of p)e.has(g)||n.push(`${d} \u5F15\u7528\u4E86\u672A\u5728 workflow \u4E2D\u5B9A\u4E49\u7684\u5B57\u6BB5: "${g}"\uFF08\u89C6\u56FE\u4E0D\u5141\u8BB8\u521B\u9020\u65B0\u5B57\u6BB5\uFF0C\u8BF7\u5148\u5728 steps mapping \u6216 field_definitions \u4E2D\u58F0\u660E\uFF09`);f.group_by&&!e.has(f.group_by)&&n.push(`${d} group_by \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.group_by}"`),f.date_field&&!e.has(f.date_field)&&n.push(`${d} date_field \u5F15\u7528\u4E86\u672A\u5B9A\u4E49\u7684\u5B57\u6BB5: "${f.date_field}"`)}}s||r.push('views.yml \u7F3A\u5C11 id="default_grid" \u7684 Grid \u89C6\u56FE\uFF08\u5EFA\u8BAE\u6DFB\u52A0\uFF09')}a(GD,"validateViews");function ZD(t,e){let n=tt.createSourceFile(lt.basename(e),t,tt.ScriptTarget.ESNext,!0,tt.ScriptKind.TS),r=n.parseDiagnostics??tt.createProgram({rootNames:[],options:{}}).getSyntacticDiagnostics(n);return!r||r.length===0?[]:r.map(o=>{let{line:i}=tt.getLineAndCharacterOfPosition(n,o.start),s=tt.flattenDiagnosticMessageText(o.messageText," ");return`recipe \u8BED\u6CD5\u9519\u8BEF [${lt.basename(e)}:${i+1}]: ${s}`})}a(ZD,"checkRecipeSyntax");function YD(t){let e={target:tt.ScriptTarget.ESNext,module:tt.ModuleKind.NodeNext,moduleResolution:tt.ModuleResolutionKind.NodeNext,strict:!0,noEmit:!0,skipLibCheck:!0,types:[]},n;try{let i=tt.createProgram({rootNames:t,options:e}),s=new Set(t.map(c=>lt.resolve(c)));n=tt.getPreEmitDiagnostics(i).filter(c=>c.file!=null&&s.has(lt.resolve(c.file.fileName)))}catch{return{errors:[],degraded:!0}}return n.some(i=>i.code===2307)?{errors:[],degraded:!0}:{errors:n.map(i=>{let s=i.file&&i.start!=null?`${lt.basename(i.file.fileName)}:${i.file.getLineAndCharacterOfPosition(i.start).line+1}`:"recipe",c=tt.flattenDiagnosticMessageText(i.messageText," ");return`recipe \u7C7B\u578B\u9519\u8BEF [${s}]: TS${i.code} ${c}`}),degraded:!1}}a(YD,"checkRecipeTypes");async function Qr(t){try{return await $D(t),!0}catch{return!1}}a(Qr,"fileExists");async function QD(t){try{return(await MD(lt.join(t,"roles"))).some(n=>n.endsWith(".role.yml")||n.endsWith(".role.yaml"))}catch{return!1}}a(QD,"hasRoleFiles");import cP from"path";var ld="question-form",XD=new RegExp(`<${ld}([^>]*)>([\\s\\S]*?)</${ld}>`,"i"),eP=["radio","checkbox","text","textarea","switch"];function ud(t){let e=XD.exec(t);if(!e)return;let[,n="",r=""]=e,o=tP(r);if(!o)return;let i=nP(n),s=wt(o.id,i.id)??"clarify",c=wt(o.title,i.title)??"\u8FD8\u9700\u8981\u786E\u8BA4\u51E0\u70B9",l=rP(o.questions);if(l.length===0){m.debug("discovery","question-form \u91CC\u6CA1\u6709\u53EF\u7528\u9898\u76EE\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406");return}let d=wt(o.description);return{id:s,title:c,...d?{description:d}:{},questions:l}}a(ud,"parseQuestionForm");function tP(t){let e=t.trim().replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/,"").trim();if(e)try{let n=JSON.parse(e);if(!Ds(n)){m.debug("discovery","question-form \u7684 JSON \u9876\u5C42\u4E0D\u662F\u5BF9\u8C61\uFF0C\u5FFD\u7565\u672C\u8F6E\u63D0\u95EE");return}return n}catch(n){m.debug("discovery","question-form \u7684 JSON \u89E3\u6790\u5931\u8D25\uFF0C\u6309\u300C\u65E0\u9700\u6F84\u6E05\u300D\u5904\u7406",{error:n instanceof Error?n.message:String(n)});return}}a(tP,"parseJsonBody");function nP(t){let e={};for(let n of t.matchAll(/(\w+)\s*=\s*"([^"]*)"/g)){let[,r,o]=n;r&&o!==void 0&&(e[r]=o)}return e}a(nP,"parseAttributes");function rP(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(!Ds(r))continue;let o=wt(r.id),i=wt(r.label),s=eP.find(d=>d===r.type);if(!o||!i||!s||n.has(o))continue;n.add(o);let c=oP(r.options),l=(s==="radio"||s==="checkbox")&&c.length===0?"text":s;e.push({id:o,label:i,type:l,...c.length>0?{options:c}:{},...dd(r,"placeholder"),...dd(r,"help"),...r.required===!0?{required:!0}:{},...iP(l,r.defaultValue),...sP(r.maxSelections),...typeof r.allowCustom=="boolean"?{allowCustom:r.allowCustom}:{},...aP(r.showIf)})}return e}a(rP,"normalizeQuestions");function oP(t){if(!Array.isArray(t))return[];let e=[],n=new Set;for(let r of t){if(typeof r=="string"){let i=r.trim();if(!i||n.has(i))continue;n.add(i),e.push({label:i,value:i});continue}if(!Ds(r))continue;let o=wt(r.value,r.label);!o||n.has(o)||(n.add(o),e.push({label:wt(r.label)??o,value:o,...dd(r,"description")}))}return e}a(oP,"normalizeOptions");function iP(t,e){if(t==="checkbox"){let n=Array.isArray(e)?e.filter(r=>typeof r=="string"):typeof e=="string"&&e?[e]:[];return n.length>0?{defaultValue:n}:{}}return typeof e=="string"&&e!==""?{defaultValue:e}:typeof e=="boolean"?{defaultValue:String(e)}:{}}a(iP,"normalizeDefaultValue");function sP(t){return typeof t=="number"&&Number.isInteger(t)&&t>0?{maxSelections:t}:{}}a(sP,"normalizeMaxSelections");function aP(t){if(!Ds(t))return{};let e=wt(t.questionId),n=wt(t.hasValue);return e&&n?{showIf:{questionId:e,hasValue:n}}:{}}a(aP,"normalizeShowIf");function Ds(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}a(Ds,"isRecord");function wt(...t){for(let e of t)if(typeof e=="string"&&e.trim()!=="")return e.trim()}a(wt,"firstString");function dd(t,e){let n=wt(t[e]);return n?{[e]:n}:{}}a(dd,"pickString");import{summarizeForms as lP}from"aitable-workflow-base";async function ay(t,e){return Xs(e?.executor,()=>dP(t,e))}a(ay,"runDesign");async function H3(t,e){return Xs(e?.executor,async()=>{let n=id(t.workDir),r=cd(t,n,{interactive:e?.interactive??!0,...e?.judgeOnly?{judgeOnly:!0}:{}}),{form:o,sessionId:i,response:s}=await cy(t,r,{...e?.sessionId?{sessionId:e.sessionId}:{},timeoutMs:e?.timeoutMs??3e5,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}});return{...o?{form:o}:{},...i?{sessionId:i}:{},response:s}})}a(H3,"runClarifyRound");async function cy(t,e,n){let r=await pt(e,{agent:t.agentType,configPath:pP(t),workDir:t.workDir,...n.sessionId?{sessionId:n.sessionId}:{},timeoutMs:n.timeoutMs,...n.onEvent?{onEvent:n.onEvent}:{},...n.onAgentLifecycle?{onLifecycle:n.onAgentLifecycle}:{},adapterOptions:fP(t)}),o=ud(r.response);return{response:r.response,...r.sessionId?{sessionId:r.sessionId}:{},...o?{form:o}:{}}}a(cy,"sendDesignTurn");async function dP(t,e){let n=e?.maxFixRounds??2,r=e?.maxClarifyRounds??2,o=e?.timeoutMs===void 0?3e5:e.timeoutMs,i=Date.now(),s=a(()=>o==null?null:uP(i,o),"nextRoundTimeout"),c=id(t.workDir),l=a(async(v,R)=>{let S=s();if(S!=null&&S<=0)throw new Error(`design \u6267\u884C\u8D85\u65F6 (${o}ms)`);return cy(t,v,{...R?{sessionId:R}:{},timeoutMs:S,...e?.onEvent?{onEvent:e.onEvent}:{},...e?.onAgentLifecycle?{onAgentLifecycle:e.onAgentLifecycle}:{}})},"callAgent"),d=e?.resume?.sessionId,u=!!e?.onQuestions,f=cd(t,c,{interactive:u,...e?.resume?{resume:e.resume}:{}}),p=[...e?.resume?.answered??[]],g=0,h=!1,y="";for(e?.onRoundStart?.(1,!1);;){let v;try{v=await l(f,d)}catch(_){return await fd(t,_,1,g,e)}y=v.response,d=v.sessionId??d;let R=v.form;if(!R)break;if(!(!!e?.onQuestions&&g<r)){if(h){m.debug("design","Agent \u53CD\u590D\u63D0\u95EE\u4F46\u65E0\u4EBA\u53EF\u7B54\uFF0C\u7ED3\u675F\u6F84\u6E05\u8FDB\u5165\u6821\u9A8C");break}m.debug("design","\u65E0\u4EBA\u53EF\u7B54\u6216\u6F84\u6E05\u56DE\u5408\u7528\u5C3D\uFF0C\u6307\u793A Agent \u6309\u5047\u8BBE\u7EE7\u7EED",{maxClarifyRounds:r}),h=!0,f=ry;continue}g++,e?.onClarifyRound?.(g);let C=await e.onQuestions(R,g);p.push({form:R,answers:C}),f=As([{form:R,answers:C}])}e?.onValidationStart?.(1);let w=await eo(t);e?.onValidation?.(w,1);let b=1;for(;!w.valid&&b<=n;){b++,e?.onRoundStart?.(b,!0);let v=ad(w.errors),R=p.length>0&&!t.clarifications?{...t,clarifications:lP(p)}:t,S=`${_s(R,c,{interactive:!1})}
|
|
531
533
|
|
|
532
|
-
${v}`,C;try{C=await l(v,d),C.response.includes("already in use")&&(C=await l(S))}catch(
|
|
534
|
+
${v}`,C;try{C=await l(v,d),C.response.includes("already in use")&&(C=await l(S))}catch(_){if(!gP(_))return await fd(t,_,b,g,e);try{C=await l(S)}catch(A){return await fd(t,A,b,g,e)}}y=C.response,d=C.sessionId??d,e?.onValidationStart?.(b),w=await eo(t),e?.onValidation?.(w,b)}return{success:w.valid,validation:w,rounds:b,response:y,clarifyRounds:g}}a(dP,"runDesignInner");function uP(t,e,n=Date.now()){return Math.max(0,e-(n-t))}a(uP,"remainingDesignTimeoutMs");function fP(t){return{permissionMode:"bypassPermissions",...t.agentType==="codex"?{ignoreUserConfig:!0}:{}}}a(fP,"adapterOptionsFor");function pP(t){return cP.resolve(t.workDir,"coding-agents.config.json")}a(pP,"agentConfigPathFor");function gP(t){let e=t instanceof Error?t.message:String(t);return e.includes("already in use")||e.includes("session")}a(gP,"isSessionConflict");async function fd(t,e,n,r,o){o?.onValidationStart?.(n);let i=await eo(t);o?.onValidation?.(i,n);let s=e instanceof Error?e.message:String(e);return{success:i.valid,validation:i,rounds:n,clarifyRounds:r,response:i.valid?`Coding Agent \u6536\u5C3E\u8D85\u65F6\uFF0C\u4F46\u5DF2\u751F\u6210\u5E76\u6821\u9A8C\u901A\u8FC7\u672C\u5730\u6587\u4EF6\uFF1A${s}`:`Coding Agent \u6267\u884C\u4E2D\u65AD\uFF0C\u5DF2\u4FDD\u7559\u5F53\u524D\u751F\u6210\u6587\u4EF6\uFF1A${s}`}}a(fd,"recoverGeneratedDesign");import{readFile as ly,writeFile as mP}from"fs/promises";import Ps from"yaml";var hP=["state","title","description","current_step","owner","event_log"],yP=["\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 dy(t){let{workflowPath:e,autoUpdate:n=!0}=t,r=await Te(t.configPath),o=await ly(e,"utf8"),i=Ps.parse(o);if(!k(i)||!Array.isArray(i.steps))throw new Error("workflow.yml \u683C\u5F0F\u65E0\u6548\uFF1A\u7F3A\u5C11 steps \u6570\u7EC4");let s=new Set,c=new Map;for(let S of i.steps){if(!k(S))continue;let C=typeof S.id=="string"?S.id:"unknown",_=typeof S.name=="string"?S.name:C;if(k(S.input_mapping))for(let A of Object.values(S.input_mapping))typeof A=="string"&&s.add(A);if(k(S.output_mapping))for(let[A,T]of Object.entries(S.output_mapping))typeof T=="string"&&c.set(T,{sourceStep:_,variable:A})}let l=await ly(r,"utf8"),d=Ps.parse(l);if(!k(d)||!k(d.tracker)||!k(d.tracker.fields))throw new Error("config.yml \u683C\u5F0F\u65E0\u6548\uFF1A\u7F3A\u5C11 tracker.fields");let u=d.tracker,f=d.tracker.fields,p=[];for(let S of hP){let C=f[S];C&&p.push({role:S,fieldName:C})}let g=null,h=f.description;for(let S of s)if(yP.includes(S)){(!h||h!==S)&&(g=S);break}let y=new Set(p.map(S=>S.fieldName)),w=[],b=new Set;for(let[S,C]of c)y.has(S)||(w.push({fieldName:S,sourceStep:C.sourceStep,type:"text",direction:"output"}),b.add(S));for(let S of s)!y.has(S)&&!b.has(S)&&(w.push({fieldName:S,sourceStep:"(\u7528\u6237\u8F93\u5165)",type:"text",direction:"input"}),b.add(S));let v=!1,R=!1;if(n){if(k(i)&&Array.isArray(i.field_definitions)){let S=i.field_definitions.filter(C=>k(C)&&typeof C.name=="string").map(C=>{let _=C,A={name:_.name,type:_.type??"text"};return Array.isArray(_.options)&&_.options.length>0&&(A.options=_.options),A});S.length>0&&(u.field_definitions=S,R=!0,v=!0,m.info("field-sync","\u540C\u6B65 field_definitions \u5230 config",{count:S.length}))}if(g&&h!==g&&(f.description=g,v=!0,m.info("field-sync","\u66F4\u65B0 description \u5B57\u6BB5",{from:h??"(\u7A7A)",to:g})),v){let S=Ps.stringify(d);Ps.parse(S),await mP(r,S,"utf8")}}return{scaffold:p,business:w,inputs:[...s],inferredDescription:g,configUpdated:v,fieldDefinitionsSynced:R}}a(dy,"syncFieldsFromWorkflow");function uy(t){console.log(`
|
|
533
535
|
\u{1F4CB} \u5B57\u6BB5\u8BA1\u5212:
|
|
534
536
|
`),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(`
|
|
535
537
|
\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(`
|
|
536
538
|
\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(`
|
|
537
539
|
\u{1F4A1} \u63A8\u65AD\u63CF\u8FF0\u5B57\u6BB5: "${t.inferredDescription}"`),t.configUpdated&&(console.log(`
|
|
538
540
|
\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(`
|
|
539
|
-
\u5171 ${r} \u4E2A\u5B57\u6BB5\uFF08${t.scaffold.length} \u9AA8\u67B6 + ${e.length} \u8F93\u5165 + ${n.length} \u8F93\u51FA\uFF09`),console.log("")}a(
|
|
541
|
+
\u5171 ${r} \u4E2A\u5B57\u6BB5\uFF08${t.scaffold.length} \u9AA8\u67B6 + ${e.length} \u8F93\u5165 + ${n.length} \u8F93\u51FA\uFF09`),console.log("")}a(uy,"printFieldPlan");import{readFile as fy,writeFile as wP}from"fs/promises";import $s from"yaml";async function py(t){let{viewsPath:e,autoUpdate:n=!0,knownFieldNames:r}=t,o=await Te(t.configPath),i;try{i=await fy(e,"utf8")}catch{return m.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=$s.parse(i)}catch(f){return m.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 m.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],g=k(p)?String(p.id??`view_${f}`):`view_${f}`,h=Rr.safeParse(p);if(!h.success){let w=h.error.issues.map(b=>b.message).join("; ");l.push({id:g,reason:`Schema \u6821\u9A8C\u5931\u8D25: ${w}`});continue}let y=h.data;if(d.has(y.id)){l.push({id:y.id,reason:"id \u91CD\u590D"});continue}if(d.add(y.id),r){let w=bP(y,r);w.length>0&&m.warn("view-sync",`\u89C6\u56FE "${y.id}" \u5F15\u7528\u4E86\u672A\u77E5\u5B57\u6BB5`,{unknownFields:w})}c.push(y)}let u=!1;return n&&c.length>0&&(u=await kP(o,c)),{syncedCount:c.length,skippedViews:l,configUpdated:u,views:c}}a(py,"syncViewsFromDesign");function gy(t){if(!(t.syncedCount===0&&t.skippedViews.length===0)){if(console.log(`
|
|
540
542
|
\u{1F4D0} \u89C6\u56FE\u914D\u7F6E:
|
|
541
543
|
`),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(`
|
|
542
544
|
\u26A0 \u8DF3\u8FC7\u7684\u89C6\u56FE:`);for(let{id:e,reason:n}of t.skippedViews)console.log(` \u2717 ${e}: ${n}`)}t.configUpdated&&console.log(`
|
|
543
545
|
\u2713 \u89C6\u56FE\u914D\u7F6E\u5DF2\u5199\u5165 config`),console.log(`
|
|
544
|
-
\u5171 ${t.syncedCount} \u4E2A\u89C6\u56FE\u914D\u7F6E\u5DF2\u540C\u6B65`),console.log("")}}a(
|
|
546
|
+
\u5171 ${t.syncedCount} \u4E2A\u89C6\u56FE\u914D\u7F6E\u5DF2\u540C\u6B65`),console.log("")}}a(gy,"printViewSyncResult");function bP(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(bP,"findUnknownFields");async function kP(t,e){try{let n=await fy(t,"utf8"),r=$s.parse(n);if(!k(r)||!k(r.tracker))return m.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=$s.stringify(r);return $s.parse(i),await wP(t,i,"utf8"),m.info("view-sync","\u89C6\u56FE\u914D\u7F6E\u5DF2\u5199\u5165 config",{count:e.length}),!0}catch(n){return m.warn("view-sync","\u5199\u5165 config \u5931\u8D25",{error:String(n)}),!1}}a(kP,"mergeViewsToConfig");import{select as vP,checkbox as SP,input as pd,confirm as xP}from"@inquirer/prompts";import{isQuestionVisible as RP}from"aitable-workflow-base";var my="__custom__";async function Ms(t){console.log(`
|
|
545
547
|
\u{1F4DD} ${t.title}`),t.description&&console.log(` ${t.description}
|
|
546
|
-
`);let e={};for(let n of t.questions)
|
|
547
|
-
(${t.placeholder})`:t.label;return(await
|
|
548
|
+
`);let e={};for(let n of t.questions)RP(n,e)&&(n.help&&console.log(` \u2139\uFE0F ${n.help}`),e[n.id]=await IP(n));return e}a(Ms,"renderForm");async function CP(t){let e=[];for(let n of t)e.push(await Ms(n));return e}a(CP,"renderForms");async function IP(t){switch(t.type){case"radio":return TP(t);case"checkbox":return _P(t);case"switch":return AP(t);default:return EP(t)}}a(IP,"renderQuestion");async function TP(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:my});let n=typeof t.defaultValue=="string"?t.defaultValue:void 0,r=await vP({message:t.label,choices:e,default:n});return r===my?(await pd({message:`${t.label}\uFF08\u8BF7\u8F93\u5165\uFF09`})).trim():r}a(TP,"renderRadio");async function _P(t){let e=new Set(DP(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 SP({message:t.label,choices:n}):[];if(t.allowCustom!==!1){let o=(await pd({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(_P,"renderCheckbox");async function AP(t){let e=t.defaultValue==="true"||t.defaultValue===!0;return xP({message:t.label,default:e})}a(AP,"renderSwitch");async function EP(t){let e=typeof t.defaultValue=="string"?t.defaultValue:"",n=t.placeholder?`${t.label}
|
|
549
|
+
(${t.placeholder})`:t.label;return(await pd({message:n,default:e,validate:t.required?o=>o.trim()?!0:"\u6B64\u9879\u5FC5\u586B\uFF0C\u8BF7\u586B\u5199":void 0})).trim()}a(EP,"renderText");function DP(t){return Array.isArray(t)?t:typeof t=="string"&&t?[t]:[]}a(DP,"toStringArray");async function TZ(t){let e=t.config??"./aitable-workflow.config.yml";console.log(`
|
|
548
550
|
\u{1F3A8} Design \u2014 \u8BA9 Coding Agent \u751F\u6210\u5DE5\u4F5C\u6D41\u548C\u5904\u65B9
|
|
549
|
-
`);let n=await
|
|
551
|
+
`);let n=await Gh({configPath:e,yes:t.yes});console.log(`
|
|
550
552
|
\u{1F4DD} \u573A\u666F: ${n.scene}`),n.supplements&&console.log(` \u8865\u5145: ${n.supplements}`),console.log(` Agent: ${n.agentType??"(llm_only\uFF0C\u65E0 coding agent)"}`),console.log(` \u6A21\u5F0F: ${n.mode==="brownfield"?"\u589E\u91CF\u4FEE\u6539\u5DF2\u6709\u4EA7\u7269":"\u5168\u65B0\u751F\u6210"}\uFF08\u591A workflow + profile\uFF09`),console.log(" \u8F93\u51FA:");for(let i of n.workflows)console.log(` ${i.workflowRelPath}${i.exists?"\uFF08\u5DF2\u5B58\u5728\uFF0C\u5C06\u589E\u91CF\u4FEE\u6539\uFF09":""}`),console.log(` ${i.recipeDirRelPath}/`);console.log(""),console.log(`\u{1F680} \u5F00\u59CB\u8C03\u7528 Coding Agent \u751F\u6210...
|
|
551
|
-
`);let r=!t.yes&&!t.skipQuestions,o=await
|
|
553
|
+
`);let r=!t.yes&&!t.skipQuestions,o=await ay(n,{timeoutMs:n.agentTimeoutMs,...r?{onQuestions:a(i=>Ms(i),"onQuestions")}:{},onClarifyRound:a(i=>{console.log(`
|
|
552
554
|
\u{1F50E} \u6F84\u6E05\u9700\u6C42\uFF08\u7B2C ${i} \u8F6E\uFF09\u2014 Agent \u8BA4\u4E3A\u8FD8\u6709\u4FE1\u606F\u9700\u8981\u4F60\u786E\u8BA4
|
|
553
555
|
`)},"onClarifyRound"),onRoundStart:a((i,s)=>{s&&console.log(`
|
|
554
556
|
\u{1F527} \u4FEE\u6B63\u8F6E\u6B21 ${i-1}...
|
|
@@ -560,19 +562,19 @@ ${v}`,C;try{C=await l(v,d),C.response.includes("already in use")&&(C=await l(S))
|
|
|
560
562
|
\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,`
|
|
561
563
|
`)}`)}else!o.success&&!o.response&&(console.log(`
|
|
562
564
|
\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(`
|
|
563
|
-
\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){for(let i of n.workflows)try{let s=await
|
|
564
|
-
[${i.id}]`),
|
|
565
|
-
\u26A0\uFE0F \u5B57\u6BB5\u540C\u6B65\u8DF3\u8FC7\uFF08${i.id}\uFF09: ${s instanceof Error?s.message:String(s)}`)}try{let i=
|
|
565
|
+
\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){for(let i of n.workflows)try{let s=await dy({workflowPath:i.workflowPath,configPath:e,autoUpdate:!0});n.workflows.length>1&&console.log(`
|
|
566
|
+
[${i.id}]`),uy(s)}catch(s){console.log(`
|
|
567
|
+
\u26A0\uFE0F \u5B57\u6BB5\u540C\u6B65\u8DF3\u8FC7\uFF08${i.id}\uFF09: ${s instanceof Error?s.message:String(s)}`)}try{let i=hy.resolve(n.workDir,"views.yml"),s=await py({viewsPath:i,configPath:e,autoUpdate:!0});gy(s)}catch(i){console.log(`
|
|
566
568
|
\u26A0\uFE0F \u89C6\u56FE\u540C\u6B65\u8DF3\u8FC7: ${i instanceof Error?i.message:String(i)}`)}}if(console.log(`
|
|
567
569
|
`+"\u2500".repeat(50)),o.success){console.log("\u{1F389} Design \u5B8C\u6210\uFF01\u751F\u6210\u7684\u6587\u4EF6\u5DF2\u5C31\u7EEA\u3002"),console.log(` \u8F6E\u6B21: ${o.rounds}`),o.validation.warnings.length>0&&console.log(` \uFF08\u53E6\u6709 ${o.validation.warnings.length} \u6761\u5EFA\u8BAE\uFF0C\u89C1\u4E0A\u65B9 \u26A1 \u6807\u8BB0\uFF09`),console.log(`
|
|
568
|
-
\u4E0B\u4E00\u6B65:`);let i=1;n.mode==="brownfield"?console.log(` ${i++}. \u5148 review \u6539\u52A8\uFF1A\`git diff\`\uFF08\u672C\u6B21\u4E3A\u589E\u91CF\u4FEE\u6539\u5DF2\u6709\u4EA7\u7269\uFF09`):console.log(` ${i++}. \u68C0\u67E5\u751F\u6210\u7684 workflow\u3001recipes\u3001roles \u4E0E views`);for(let s of await
|
|
569
|
-
`)}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(
|
|
570
|
-
`)||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
|
|
570
|
+
\u4E0B\u4E00\u6B65:`);let i=1;n.mode==="brownfield"?console.log(` ${i++}. \u5148 review \u6539\u52A8\uFF1A\`git diff\`\uFF08\u672C\u6B21\u4E3A\u589E\u91CF\u4FEE\u6539\u5DF2\u6709\u4EA7\u7269\uFF09`):console.log(` ${i++}. \u68C0\u67E5\u751F\u6210\u7684 workflow\u3001recipes\u3001roles \u4E0E views`);for(let s of await OP(e,n))console.log(` ${i++}. ${s}`);console.log(` ${i++}. \u8FD0\u884C \`aitable-workflow setup\` \u521D\u59CB\u5316\u8868\u7ED3\u6784\u548C\u89C6\u56FE`),console.log(` ${i++}. \u8FD0\u884C \`aitable-workflow run\` \u542F\u52A8\u5F15\u64CE
|
|
571
|
+
`)}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(TZ,"runDesignCommand");async function OP(t,e){let n=[];try{let r=await Te(t),o=MP.parse(await $P(r,"utf8"));k(o)&&((k(o.agent)?o.agent:void 0)?.engine||n.push("\u786E\u8BA4 `aitable-workflow.config.yml` \u7684 `agent.engine`\uFF08\u672A\u8BBE\u7F6E\u65F6\u9ED8\u8BA4 claude\uFF09"))}catch{}return await jP(hy.resolve(e.workDir,".env.example"))&&n.push("\u6309 `.env.example` \u7684\u8BF4\u660E\u5728 `.env` \u91CC\u8865\u9F50\u51ED\u636E\uFF08run \u9636\u6BB5\u7F3A\u5931\u4F1A\u76F4\u63A5\u5931\u8D25\uFF09"),n.push("\u8FD0\u884C `aitable-workflow check` \u786E\u8BA4\u914D\u7F6E\u5B8C\u6574"),n}a(OP,"collectRunnableGaps");async function jP(t){try{return await PP(t),!0}catch{return!1}}a(jP,"fileExists");import Gt from"path";import{access as XP,mkdir as jy,stat as e0}from"fs/promises";import{readFile as FP,writeFile as NP}from"fs/promises";import{homedir as LP}from"os";import Xn from"path";var gd="# >>> aitable-workflow DWS PATH >>>",md="# <<< aitable-workflow DWS PATH <<<",WP=new RegExp(`${wy(gd)}[\\s\\S]*?${wy(md)}(?:\\r?\\n)?`,"g");async function ky(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??BP(e.env??process.env,e.homeDir??LP(),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=Xn.dirname(t);if(o.includes(`
|
|
572
|
+
`)||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 FP(r,"utf8")}catch(p){if(!zP(p)||p.code!=="ENOENT")return{status:"failed",configPath:r,detail:by(p)}}let s=yy(i,gd),c=yy(i,md);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
|
|
571
573
|
`)?`\r
|
|
572
574
|
`:`
|
|
573
|
-
`,d=i.replace(
|
|
575
|
+
`,d=i.replace(WP,"").trimEnd(),u=[gd,"# Managed by aitable-workflow init; changes inside this block may be replaced.",`export PATH=${hd(o)}:"$PATH"`,md].join(l),f=`${d}${d?`${l}${l}`:""}${u}${l}`;if(f===i)return{status:"persisted",configPath:r,changed:!1};try{return await NP(r,f,"utf8"),{status:"persisted",configPath:r,changed:!0}}catch(p){return{status:"failed",configPath:r,detail:by(p)}}}a(ky,"persistGlobalDwsPath");function vy(t){return`source ${hd(t)}`}a(vy,"buildShellReloadCommand");function Sy(t){return`export PATH=${hd(Xn.dirname(t))}:"$PATH"`}a(Sy,"buildShellPathCommand");function BP(t,e,n){let r=Xn.basename(t.SHELL||"");return r==="zsh"?Xn.join(e,".zshrc"):r==="bash"?Xn.join(e,n==="darwin"?".bash_profile":".bashrc"):r==="sh"||r==="dash"||r==="ksh"?Xn.join(e,".profile"):null}a(BP,"resolveShellConfigPath");function hd(t){return`'${t.replace(/'/g,`'"'"'`)}'`}a(hd,"quotePosixShell");function yy(t,e){return t.split(e).length-1}a(yy,"countOccurrences");function wy(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}a(wy,"escapeRegExp");function zP(t){return t instanceof Error&&"code"in t}a(zP,"isNodeError");function by(t){return t instanceof Error?t.message:String(t)}a(by,"errorMessage");var xy={claudecode:"Claude Code",codex:"Codex CLI",qoder:"Qoder CLI",codebuddy:"Codebuddy Code",opencode:"OpenCode",qwen:"Qwen Code",deepseek:"DeepSeek",trae:"Trae CLI",qwenwork:"\u5343\u95EE\u529E\u516C"};function yd(){let e=dr().map(r=>({type:r.type,cmd:r.cmd,version:r.version,label:xy[r.type]??r.type})),n=e[0]?.type??"claudecode";return{available:e,recommended:n}}a(yd,"detectAgents");function wd(t){let e=bo,n=new Map(t.available.map(r=>[r.type,r]));return e.map(r=>{let o=n.get(r),i=xy[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(wd,"buildAgentChoices");import{select as Ry,input as er,confirm as UP,editor as VP}from"@inquirer/prompts";async function Cy(t){let e=wd(t);return await Ry({message:"\u9009\u62E9\u7528\u4E8E\u8BBE\u8BA1\u9636\u6BB5\u7684 Coding Agent",choices:e,default:t.recommended})}a(Cy,"promptAgentType");async function Iy(){return console.log(`
|
|
574
576
|
\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
|
|
575
|
-
`),(await
|
|
577
|
+
`),(await VP({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
|
|
576
578
|
|
|
577
579
|
\u5BA2\u670D\u5DE5\u5355\u81EA\u52A8\u5904\u7406\u7CFB\u7EDF\u3002
|
|
578
580
|
\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
|
|
@@ -581,50 +583,50 @@ ${v}`,C;try{C=await l(v,d),C.response.includes("already in use")&&(C=await l(S))
|
|
|
581
583
|
3. \u8349\u62DF\u56DE\u590D\uFF1A\u751F\u6210\u9762\u5411\u5BA2\u6237\u7684\u56DE\u590D\u6587\u6848
|
|
582
584
|
4. \u8D28\u91CF\u5BA1\u6838\uFF1A\u4EBA\u5DE5\u5BA1\u6838\u56DE\u590D\u5185\u5BB9\uFF08\u4EBA\u5DE5\u6B65\u9AA4\uFF09
|
|
583
585
|
5. \u53D1\u9001\u56DE\u590D\uFF1A\u786E\u8BA4\u540E\u6807\u8BB0\u5B8C\u6210
|
|
584
|
-
`,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(
|
|
585
|
-
\u{1F4CA} \u8FDE\u63A5 AI \u8868\u683C Base\uFF08tableId \u53EF\u5728 setup \u9636\u6BB5\u81EA\u52A8\u521B\u5EFA\uFF09`);let t=await
|
|
586
|
-
\u{1F916} \u914D\u7F6E LLM\uFF08\u7528\u4E8E\u5DE5\u4F5C\u6D41\u6B65\u9AA4\u4E2D\u7684 AI \u63A8\u7406\uFF09`);let t=await
|
|
587
|
-
\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: ${
|
|
588
|
-
`),await
|
|
589
|
-
\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(
|
|
586
|
+
`,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(Iy,"promptScene");async function Ty(){console.log(`
|
|
587
|
+
\u{1F4CA} \u8FDE\u63A5 AI \u8868\u683C Base\uFF08tableId \u53EF\u5728 setup \u9636\u6BB5\u81EA\u52A8\u521B\u5EFA\uFF09`);let t=await er({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 er({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(Ty,"promptTableConnection");async function _y(){console.log(`
|
|
588
|
+
\u{1F916} \u914D\u7F6E LLM\uFF08\u7528\u4E8E\u5DE5\u4F5C\u6D41\u6B65\u9AA4\u4E2D\u7684 AI \u63A8\u7406\uFF09`);let t=await Ry({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 er({message:"\u6A21\u578B\u540D\u79F0",default:"Qwen3.7-Max-DogFooding"}),n="IDEALAB_API_KEY"):t==="openai"?(e=await er({message:"\u6A21\u578B\u540D\u79F0",default:"gpt-4o"}),n="OPENAI_API_KEY"):(e=await er({message:"\u6A21\u578B\u540D\u79F0",validate:a(r=>r.trim().length>0||"\u6A21\u578B\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A","validate")}),n=await er({message:"API Key \u73AF\u5883\u53D8\u91CF\u540D",default:"LLM_API_KEY"})),{provider:t,model:e,apiKeyEnv:n}}a(_y,"promptLlmConfig");var KP={claudecode:"Claude Code",codex:"Codex CLI",qoder:"Qoder CLI",codebuddy:"Codebuddy Code",opencode:"OpenCode",qwen:"Qwen Code",deepseek:"DeepSeek",trae:"Trae CLI",qwenwork:"\u5343\u95EE\u529E\u516C"};async function Ay(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(`
|
|
589
|
+
\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: ${KP[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
|
|
590
|
+
`),await UP({message:"\u786E\u8BA4\u751F\u6210\u914D\u7F6E\u6587\u4EF6\uFF1F",default:!0})}a(Ay,"promptConfirm");function qP(t){return{agentType:t.recommended,scene:`\u901A\u7528\u4E1A\u52A1\u81EA\u52A8\u5316\u573A\u666F\u3002
|
|
591
|
+
\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(qP,"buildDefaultAnswers");async function Ey(t){let{cwd:e,force:n=!1,yes:r=!1}=t;console.log(`
|
|
590
592
|
\u{1F50D} \u68C0\u6D4B\u5DF2\u5B89\u88C5\u7684 Coding Agent...
|
|
591
|
-
`);let o=
|
|
592
|
-
`);if(r){let y=
|
|
593
|
+
`);let o=yd();if(o.available.length>0)for(let y of o.available){let w=y.version?` (${y.version})`:"";console.log(` \u2713 ${y.label}${w} \u2014 ${y.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
|
|
594
|
+
`);if(r){let y=qP(o);console.log(`
|
|
593
595
|
\u{1F4CB} \u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\uFF08--yes \u6A21\u5F0F\uFF09`),console.log(` Agent: ${y.agentType}`),console.log(` LLM: ${y.llmProvider} / ${y.llmModel}`),console.log(` \u573A\u666F: ${y.scene.split(`
|
|
594
596
|
`)[0]}
|
|
595
|
-
`);let w=await
|
|
597
|
+
`);let w=await Hi({answers:y,cwd:e,force:n});return{answers:y,scaffold:w}}let i=await Cy(o),s=await Iy(),{baseId:c,tableId:l}=await Ty(),{provider:d,model:u,apiKeyEnv:f}=await _y(),p={agentType:i,scene:s,baseId:c,tableId:l,llmProvider:d,llmModel:u,llmApiKeyEnv:f,confirmed:!1},g=await Ay(p);if(p.confirmed=g,!g)return console.log(`
|
|
596
598
|
\u274C \u5DF2\u53D6\u6D88\u521D\u59CB\u5316\u3002
|
|
597
599
|
`),{answers:p,scaffold:{files:[],dirs:[],skipped:[]}};console.log(`
|
|
598
600
|
\u{1F4C1} \u751F\u6210\u914D\u7F6E\u6587\u4EF6...
|
|
599
|
-
`);let h=await
|
|
601
|
+
`);let h=await Hi({answers:p,cwd:e,force:n});return HP(h),{answers:p,scaffold:h}}a(Ey,"runWizard");function HP(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(`
|
|
600
602
|
\u2705 \u521D\u59CB\u5316\u5B8C\u6210\uFF01
|
|
601
|
-
`),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(
|
|
602
|
-
\u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${f}`)),!e&&await
|
|
603
|
+
`),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(HP,"printResult");var JP=12e4,Py=5e3,Dy=300,GP="dingtalk-workspace-cli@latest";function $y(t){return t.status==="succeeded"&&t.action==="upgraded"&&t.pathAdjusted}a($y,"shouldPersistDwsPath");async function bd(t={}){let e=t.bin?.trim()||"dws",n=t.runner??K,r=await QP(e,n);return ZP({...t,bin:e,runner:n},r)}a(bd,"ensureLatestDws");async function ZP(t,e){let n=t.bin?.trim()||"dws",r=t.npmBin?.trim()||(process.platform==="win32"?"npm.cmd":"npm"),o=t.runner??K,i=e?"upgrade":"install",s=e?"upgraded":"installed";try{let l=await o(r,["install","--global",GP],{timeoutMs:t.timeoutMs??JP});if(l.exitCode!==0)return{status:"failed",action:i,detail:Oy(l,"npm install")}}catch(l){return{status:"failed",action:i,detail:kd(l instanceof Error?l.message:String(l))}}let c=await YP(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(ZP,"installLatestDws");async function YP(t,e,n,r){let o;try{o=await e(t,["prefix","--global"],{timeoutMs:Py})}catch(l){return{detail:`npm \u5B89\u88C5\u5DF2\u5B8C\u6210\uFF0C\u4F46\u65E0\u6CD5\u83B7\u53D6\u5168\u5C40\u5B89\u88C5\u76EE\u5F55\uFF1A${kd(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${Oy(o,"npm prefix --global")}`};let s=lc(i,r);return await My(s,e)?{globalBin:s,pathAdjusted:dc(s,n,r)}:{detail:`npm \u5B89\u88C5\u5DF2\u5B8C\u6210\uFF0C\u4F46\u65E0\u6CD5\u8FD0\u884C ${s}`}}a(YP,"verifyInstalledDws");async function My(t,e){try{let n=await e(t,["version"],{timeoutMs:Py});return n.exitCode!==0?null:n.stdout.match(/^\s*Version:\s*(\S+)/mi)?.[1]??null}catch{return null}}a(My,"readDwsVersion");async function QP(t,e){return await My(t,e)!==null}a(QP,"isDwsAvailable");function Oy(t,e){let n=t.stderr.trim()||t.stdout.trim();return n?kd(n):`${e} \u9000\u51FA\u7801 ${t.exitCode??"unknown"}`}a(Oy,"commandFailureDetail");function kd(t){let e=t.replace(/\s+/g," ").trim()||"\u672A\u77E5\u9519\u8BEF";return e.length>Dy?`${e.slice(0,Dy-1)}\u2026`:e}a(kd,"compactDetail");async function g5(t={}){let{force:e=!1,yes:n=!1,config:r,template:o,profile:i,templatesDir:s,templatePackageVersions:c,cliVersion:l}=t;if(o){let f=r?await Fy(r):Gt.join(process.cwd(),o);if(await to(f)||(await jy(f,{recursive:!0}),console.log(`
|
|
604
|
+
\u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${f}`)),!e&&await to(Gt.join(f,"aitable-workflow.config.yml"))){let{select:g}=await import("@inquirer/prompts"),h=await g({message:`\u68C0\u6D4B\u5230 ${f} \u5DF2\u5305\u542B aitable-workflow.config.yml\u3002
|
|
603
605
|
\u8BE5\u76EE\u5F55\u662F\u4E00\u4E2A\u5DF2\u521D\u59CB\u5316\u7684\u9879\u76EE\u3002\u4F60\u60F3\u8981\uFF1A`,choices:[{name:"\u5347\u7EA7\u5230\u6700\u65B0\u6A21\u677F\uFF08\u4FDD\u7559\u4F60\u7684\u914D\u7F6E\uFF09\u2190 \u63A8\u8350",value:"migrate"},{name:"\u5F3A\u5236\u8986\u76D6\uFF08\u4E22\u5F03\u6240\u6709\u81EA\u5B9A\u4E49\u914D\u7F6E\uFF09",value:"force"},{name:"\u53D6\u6D88",value:"cancel"}]});if(h==="migrate"){let{runMigrate:y}=await import("./migrate-YTP5SOEG.js");await y({config:f,template:o,profile:i,templatesDir:s,templatePackageVersions:c,cliVersion:l});return}if(h==="cancel")throw new Error("cancelled")}console.log(`
|
|
604
|
-
\u{1F4E6} \u4ECE\u6A21\u677F\u811A\u624B\u67B6: ${o}${i?` (profile: ${i})`:""}`);let p=await
|
|
606
|
+
\u{1F4E6} \u4ECE\u6A21\u677F\u811A\u624B\u67B6: ${o}${i?` (profile: ${i})`:""}`);let p=await Ls(o,f,e||await to(Gt.join(f,"aitable-workflow.config.yml")),s,c,i,l);console.log(` \u2713 \u5DF2\u62F7\u8D1D\u6A21\u677F\u5230: ${p.target}`),p.profile&&console.log(` \u2713 \u5DF2\u53E0\u52A0 profile \u4E1A\u52A1\u5305: ${p.profile}`),console.log(`
|
|
605
607
|
\u4E0B\u4E00\u6B65:`),console.log(` 1. cd ${f}`),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
|
|
606
608
|
`);return}console.log(`
|
|
607
|
-
\u2B06\uFE0F \u68C0\u67E5\u5E76\u66F4\u65B0 DWS CLI...`);let d=await
|
|
608
|
-
`)):(console.warn(` \u26A0 \u672A\u80FD\u81EA\u52A8\u6301\u4E45\u5316 DWS PATH\uFF1A${f.detail}`),console.warn(` \u5F53\u524D\u7EC8\u7AEF\u53EF\u8FD0\u884C \`${
|
|
609
|
-
`))}}else{let f=d.action==="install"?"\u5B89\u88C5":"\u66F4\u65B0";console.warn(` \u26A0 DWS \u81EA\u52A8${f}\u672A\u5B8C\u6210\uFF1A${d.detail}`),console.warn(" \u5DF2\u7EE7\u7EED\u521D\u59CB\u5316\uFF1B\u53EF\u7A0D\u540E\u624B\u52A8\u8FD0\u884C `npm install --global dingtalk-workspace-cli@latest`\u3002\n")}let u;if(r?u=await
|
|
610
|
-
\u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${u}`)),!e&&!n){let f=
|
|
609
|
+
\u2B06\uFE0F \u68C0\u67E5\u5E76\u66F4\u65B0 DWS CLI...`);let d=await bd();if(d.status==="succeeded"){if(console.log(d.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"),$y(d)){let f=await ky(d.globalBin);f.status==="persisted"?(f.changed&&console.log(` \u2713 \u5DF2\u66F4\u65B0 shell PATH \u914D\u7F6E\uFF1A${f.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 \`${vy(f.configPath)}\`\u3002
|
|
610
|
+
`)):(console.warn(` \u26A0 \u672A\u80FD\u81EA\u52A8\u6301\u4E45\u5316 DWS PATH\uFF1A${f.detail}`),console.warn(` \u5F53\u524D\u7EC8\u7AEF\u53EF\u8FD0\u884C \`${Sy(d.globalBin)}\`\u3002`),console.warn(` \u5DF2\u7EE7\u7EED\u521D\u59CB\u5316\u3002
|
|
611
|
+
`))}}else{let f=d.action==="install"?"\u5B89\u88C5":"\u66F4\u65B0";console.warn(` \u26A0 DWS \u81EA\u52A8${f}\u672A\u5B8C\u6210\uFF1A${d.detail}`),console.warn(" \u5DF2\u7EE7\u7EED\u521D\u59CB\u5316\uFF1B\u53EF\u7A0D\u540E\u624B\u52A8\u8FD0\u884C `npm install --global dingtalk-workspace-cli@latest`\u3002\n")}let u;if(r?u=await Fy(r):u=process.cwd(),await to(u)||(await jy(u,{recursive:!0}),console.log(`
|
|
612
|
+
\u{1F4C1} \u5DF2\u521B\u5EFA\u76EE\u5F55: ${u}`)),!e&&!n){let f=Gt.join(u,"aitable-workflow.config.yml");await to(f)&&(console.log(`
|
|
611
613
|
\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
|
|
612
|
-
`))}return
|
|
613
|
-
\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 I of T)b.has(I.fieldName)&&console.log(` \u2713 [${I.type}] ${I.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 I of T)v.has(I.fieldName)&&!b.has(I.fieldName)&&console.log(` [${I.type}] ${I.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 I of T)if(w.has(I.fieldName)||I.type==="primaryDoc"){let x
|
|
614
|
-
\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`),_?.some(I=>I.type==="FormDesigner"&&I.id==="input_form")){let I=_.find(x=>x.id==="input_form");console.log(` \u63A8\u8350\u4F7F\u7528\u89C6\u56FE "${I?.name}" \u65B0\u5EFA\u5DE5\u5355\u3002`)}return{warnings:l}}a(kd,"initTable");function hd(t){return new Promise(e=>setTimeout(e,t))}a(hd,"sleep");async function PP(t,e,n){m.info("setup","\u68C0\u67E5\u7A7A\u767D\u884C");let r=await t.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--limit","100"]),o=ye(r),i=[];for(let s of o){if(!k(s))continue;let c=typeof s.recordId=="string"?s.recordId:null,l=k(s.cells)?s.cells:{},d=Object.values(l).some(u=>u!=null&&u!=="");c&&!d&&i.push(c)}i.length>0?(m.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(PP,"cleanupEmptyRows");function $P(t,e){for(let[n,r]of Object.entries(e))if(r===t)return n;return null}a($P,"findRole");function MP(t){if(t instanceof ge){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(MP,"describeViewError");async function OP(t,e,n,r,o,i,s,c){let l=new Map(r.map(v=>[v.fieldName,v.fieldId])),d=new Map(r.map(v=>[v.fieldName,v.type])),f=jP(r,s)?.fieldId??"",p=await _y(t,e,n),g=new Map(p.map(v=>[String(v.viewName??""),v])),h=NP(o,i),y=[],w=[],b=!1;for(let v of h)try{switch(v.type){case"Grid":{let R=!b;b=!0,await LP(t,e,n,v,l,f,p,i,R,g);break}case"FormDesigner":await zP(t,e,n,v,l,d,f,g,c??!0,w);break;case"Kanban":case"Calendar":case"Gallery":case"Gantt":await HP(t,e,n,v,l,f,g);break}}catch(R){let S=MP(R);if(v.type==="FormDesigner"){let C={code:"FORM_VIEW_CREATE_FAILED",message:`\u8868\u5355\u89C6\u56FE "${v.name}" \u672A\u81EA\u52A8\u521B\u5EFA\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6DFB\u52A0\u8868\u5355\u89C6\u56FE\uFF08\u539F\u56E0\uFF1A${ZP(S)}\uFF09`,details:{id:v.id,name:v.name,type:v.type,retryable:!0,errorDetail:S}};m.warn("setup","\u975E\u5173\u952E\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF0C\u7EE7\u7EED setup",{...C.details,error:S}),console.log(`\u26A0 ${C.message}`),console.log(` \u21B3 \u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u540D\u4E3A "${v.name}" \u7684\u8868\u5355\u89C6\u56FE`),w.push(C);continue}m.warn("setup",`\u89C6\u56FE "${v.name}" \u914D\u7F6E\u5931\u8D25`,{error:S}),console.log(`\u26A0 \u89C6\u56FE "${v.name}" \u521B\u5EFA\u5931\u8D25: ${S}`),y.push({id:v.id,name:v.name,type:v.type,errorMessage:S})}if(y.length>0)throw Object.assign(new Error(`\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF1A${y.map(v=>v.name).join(", ")}`),{code:"VIEW_CREATE_FAILED",status:502,details:{requestedCount:h.length,failedCount:y.length,failedViews:y}});return w}a(OP,"configureViews");function jP(t,e){return t.find(n=>FP(n.type))??(e?t.find(n=>n.fieldName===e):void 0)??t[0]}a(jP,"resolvePrimaryField");function FP(t){let e=t.replace(/[_-]/g,"").toLowerCase();return e==="primarydoc"||e==="primary"}a(FP,"isPrimaryFieldType");function NP(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(NP,"expandForEachStep");async function LP(t,e,n,r,o,i,s,c,l,d){if(!l){await WP(t,e,n,r,o,i,d);return}let u=s.find(y=>y.viewType==="Grid");if(!u)return;let f=String(u.viewId??"");if(!f)return;let p=r.field_order?.length?r.field_order:BP(o,c),g=Sd(p,o,i);if(g.length===0)return;await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",f,"--config",JSON.stringify({visibleFieldIds:g}),"--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${g.length} \u4E2A\u5B57\u6BB5\uFF0C\u6765\u6E90: ${h}\uFF09`)}a(LP,"applyGridView");async function WP(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}m.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",bd("Grid"),"--yes"],{timeoutMs:6e4}),l=await vd(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=xd(c)||String(l.viewId??""),u=r.field_order?.length?r.field_order:r.visible_fields??[];if(d&&u.length){let f=Sd(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(WP,"applyAdditionalGridView");function BP(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(BP,"buildDefaultFieldOrder");async function zP(t,e,n,r,o,i,s,c,l,d){if(c.has(r.name)){console.log(`\u2713 \u8868\u5355\u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"\uFF0C\u540C\u6B65\u53EF\u89C1\u5B57\u6BB5`);let w=c.get(r.name),b=k(w)?String(w.viewId??w.id??""):"";b&&r.visible_fields?.length&&await Ty(t,e,n,b,r.visible_fields,o,i,s),l&&b&&await Iy(t,e,n,b,r,d);return}m.info("setup",`\u521B\u5EFA\u8868\u5355\u89C6\u56FE: ${r.name}`,{visibleFieldCount:r.visible_fields?.length??0,baseId:e,tableId:n});let u=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",bd("FormDesigner"),"--yes"],{timeoutMs:6e4}),f=xd(u),p=yd(u);m.info("setup","\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u8FD4\u56DE",{name:r.name,viewId:f||void 0,success:p,rawResult:JSON.stringify(u).slice(0,2e3)});let g=await vd(t,e,n,r.name);if(!g){let w=JSON.stringify(u).slice(0,500);if(!f&&!p)throw new Error(`dws \u672A\u8FD4\u56DE\u53EF\u9A8C\u8BC1\u7684\u6210\u529F\u4FE1\u53F7\uFF08\u65E0 viewId\u3001\u65E0 success=true\uFF09\uFF0C\u8868\u5355\u89C6\u56FE "${r.name}" \u53EF\u80FD\u672A\u521B\u5EFA\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}\u3002\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u8868\u5355\u89C6\u56FE\uFF0C\u6216\u4F7F\u7528 dws aitable view create --verbose \u6392\u67E5`);let b=[f?`viewId=${f}`:"",p?"success=true":"",`\u5DF2\u91CD\u8BD5 ${md} \u6B21 view get`].filter(Boolean).join("\uFF1B");throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF08${b}\uFF09\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}`)}c.set(r.name,g);let h=f||String(g.viewId??"");h&&r.visible_fields?.length&&(await UP(t,e,n,h,r,o,i,s),await Ty(t,e,n,h,r.visible_fields,o,i,s));let y=r.visible_fields?.length??0;if(console.log(`\u2713 \u5DF2\u521B\u5EFA\u8868\u5355\u89C6\u56FE: "${r.name}"\uFF08${y} \u4E2A\u5B57\u6BB5\uFF09`),l){let w=h||f||"";w&&await Iy(t,e,n,w,r,d)}}a(zP,"applyFormView");async function UP(t,e,n,r,o,i,s,c){let l=o.visible_fields??[],d=[];c&&l.some(u=>i.get(u)===c)&&d.push(c);for(let u of l){if(Ay(s.get(u)))continue;let f=i.get(u);f&&f!==c&&d.push(f)}d.length!==0&&(m.info("setup",`\u66F4\u65B0\u8868\u5355\u89C6\u56FE\u53EF\u89C1\u5B57\u6BB5: ${o.name}`,{viewId:r,visibleCount:d.length}),await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",r,"--config",JSON.stringify({visibleFieldIds:d}),"--yes"],{timeoutMs:6e4}).catch(u=>{m.warn("setup",`\u8868\u5355\u53EF\u89C1\u5B57\u6BB5\u4E00\u6B21\u6027\u4E0B\u53D1\u5931\u8D25\uFF0C\u6539\u7531\u9010\u5B57\u6BB5\u540C\u6B65\u5BF9\u9F50: ${o.name}`,{viewId:r,error:u instanceof Error?u.message:String(u)})}))}a(UP,"applyFormVisibleFieldIds");async function Iy(t,e,n,r,o,i){let s=await fo(t,e,n,r,{autoEnable:!0});if(s){console.log(`\u2713 \u5DF2\u5F00\u542F\u8868\u5355\u5206\u4EAB \u2192 ${s}`),console.log(" \uFF08\u94FE\u63A5\u4E0D\u5199\u5165\u914D\u7F6E\uFF0C\u8FD0\u884C\u671F\u81EA\u52A8\u89E3\u6790\uFF1B\u6B64\u5904\u4EC5\u4F9B\u6838\u5BF9\uFF09");return}let c={code:"FORM_SHARE_DISABLED",message:`\u8868\u5355\u89C6\u56FE "${o.name}" \u7684\u5206\u4EAB\u672A\u5F00\u542F\uFF0C\u8FD0\u884C\u671F\u89E3\u6790\u4E0D\u51FA\u8868\u5355\u94FE\u63A5\uFF08\u56DE\u590D\u91CC\u4E0D\u4F1A\u51FA\u73B0\u586B\u5355\u5165\u53E3\uFF09\uFF1B\u8BF7\u91CD\u8DD1 setup\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6253\u5F00\u8BE5\u8868\u5355\u7684\u5206\u4EAB`,details:{id:o.id,name:o.name,viewId:r,retryable:!0}};m.warn("setup","\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\uFF0Csetup \u7EE7\u7EED",c.details),console.log(`\u26A0 ${c.message}`),i.push(c)}a(Iy,"applyFormShare");async function Ty(t,e,n,r,o,i,s,c){let l=new Set(o),d=[],u=[],f=o.length===0;for(let[y,w]of i){if(w===c&&f)continue;let b=s.get(y);if(Ay(b)){u.push(w);continue}l.has(y)?d.push(w):u.push(w)}let p=await VP(t,e,n,r),g=p?d.filter(y=>!p.has(y)):d,h=p?u.filter(y=>p.has(y)):u;for(let y of g)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","false","--yes"],{timeoutMs:3e4}).catch(w=>{m.warn("setup",`form field unhide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});for(let y of h)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","true","--yes"],{timeoutMs:3e4}).catch(w=>{m.warn("setup",`form field hide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})}),await t.runJson(["aitable","form","field","update","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--required","false","--yes"],{timeoutMs:3e4}).catch(w=>{m.warn("setup",`form field required=false \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});m.info("setup",`\u8868\u5355\u5B57\u6BB5\u540C\u6B65\u5B8C\u6210: viewId=${r}`,{mode:p?"incremental":"full",shown:g.length,hidden:h.length,skipped:d.length-g.length+(u.length-h.length)})}a(Ty,"syncFormFieldVisibility");async function VP(t,e,n,r){let o;try{o=await t.runJson(["aitable","form","field","list","--base-id",e,"--table-id",n,"--view-id",r],{timeoutMs:3e4})}catch(c){m.warn("setup","form field list \u5931\u8D25\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r,error:c instanceof Error?c.message:String(c)});return}let i=KP(o);if(!i){m.warn("setup","form field list \u8FD4\u56DE\u4E2D\u672A\u627E\u5230\u5B57\u6BB5\u6570\u7EC4\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}let s=new Map;for(let c of i){if(!k(c))continue;let l=typeof c.fieldId=="string"?c.fieldId.trim():"";l&&s.set(l,c.required===!0)}if(i.length>0&&s.size===0){m.warn("setup","form field list \u8FD4\u56DE\u5F62\u72B6\u4E0D\u7B26\u9884\u671F\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}return s}a(VP,"fetchFormVisibleFields");function KP(t){let e=le(t);if(Array.isArray(e))return e;if(!k(e))return;let n=["formFields","fields","items","list","records","results"];for(let r of n){let o=e[r];if(Array.isArray(o))return o}for(let r of Object.values(e))if(k(r))for(let o of n){let i=r[o];if(Array.isArray(i))return i}}a(KP,"extractFormFieldArray");function qP(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(qP,"isSystemReadonlyFieldType");function Ay(t){return qP(t)||t==="formula"||t==="lookup"||t==="filterUp"}a(Ay,"isFormExcludedFieldType");async function HP(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}m.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",bd(r.type),"--yes"],{timeoutMs:6e4}),l=await vd(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=xd(c)||String(l.viewId??"");if(d&&r.visible_fields?.length){let u=Sd(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(HP,"applyGenericView");async function _y(t,e,n){let r=await t.runJson(["aitable","view","get","--base-id",e,"--table-id",n]),o=k(r)&&k(r.data)?r.data:null,i=Array.isArray(o?.views)?Ey(o.views):[];if(i.length>0)return i;try{let s=await JP(t,e,n);return s.length>0&&m.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 m.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(_y,"fetchViews");async function JP(t,e,n){let r=await t.runJson(["aitable","table","get","--base-id",e]),o=k(r)&&k(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 Ey(c)}a(JP,"fetchViewsFromTableList");function Ey(t){return t.map(e=>{let n=e.viewType??e.type;return{...e,...n?{viewType:n}:{}}})}a(Ey,"normalizeViews");async function GP(t,e,n,r){return(await _y(t,e,n)).find(i=>String(i.viewName??"")===r)??null}a(GP,"fetchViewByName");async function vd(t,e,n,r){for(let o=0;o<md;o++){let i=await GP(t,e,n,r);if(i)return i;o+1<md&&Cy>0&&await hd(Cy)}return null}a(vd,"fetchViewByNameWithRetry");function Sd(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(Sd,"resolveFieldIds");function xd(t){return wd(t,["viewId","view_id"])||""}a(xd,"extractViewId");function yd(t){return k(t)?t.success===!0?!0:k(t.data)?yd(t.data):k(t.result)?yd(t.result):!1:!1}a(yd,"hasSuccessSignal");function wd(t,e){if(Array.isArray(t)){for(let n of t){let r=wd(n,e);if(r)return r}return null}if(!k(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=wd(n,e);if(r)return r}return null}a(wd,"findStringByKeys");function ZP(t){let e=t.replace(/\s+/g," ").trim();return e.length<=180?e:`${e.slice(0,177)}...`}a(ZP,"summarizeWarningReason");import{readFile as Dy,writeFile as Py}from"fs/promises";import Rd from"yaml";var YP=/^workflow:([A-Za-z0-9_-]+)\.tracker$/,Ps=15;async function Cd(t){let{workflowFilePath:e,recipeDir:n,workflow:r,settings:o,profile:i,dwsRunner:s,onProgress:c,workflowTrackers:l}=t,d=await Dy(e,"utf8"),u=Rd.parse(d);if(!k(u))return 0;a0(u,l,i?.config);let f=Array.isArray(u.event_sources)?u.event_sources:[],p=Array.isArray(u.steps)?u.steps:[],g=[],h=new ae({bin:o.tracker.dws_bin,timeoutMs:9e4,runner:s}),y=await di({workflow:r,rawYaml:u,recipeDir:n,relPath:e,profile:i?{file:i.filePath,workflowId:i.workflowId,config:i.config}:void 0,onDefinitionLoadFailure:a((R,S)=>{throw new Error(`setup \u65E0\u6CD5\u52A0\u8F7D ${R}: ${S.message}`)},"onDefinitionLoadFailure")}),w=new Map(y.map(R=>[R.key,R]));for(let R of y){let S=i0(R);if(!S)continue;let{kind:C,path:A}=S,_=C==="eventSource"?QP(f,S):XP(p,S),T=C==="eventSource"?e0(i?.config,S.srcName):(S.stepId?i?.config.steps?.[S.stepId]:void 0)??{},I=bn(_,A),x=bn(T,A),D=k(x)?{...k(I)?I:{},...x}:k(I)?I:{};if(k(D.baseId)||k(D.tableId)){await c?.(`\u8DF3\u8FC7\u5F15\u7528\u8868\u300C${$y(R,A)}\u300D\uFF08workflow ref\uFF0C\u8FD0\u884C\u65F6\u89E3\u6790\uFF09`);continue}let j=typeof D.tableId=="string"?D.tableId.trim():"",L=w.get(R.key.replace(/\.tableId$/,".baseId")),W=t0(D,L,o),V=$y(R,A);if(j){await My(h,{baseId:W,tableId:j,name:V,setup:R.setup,onProgress:c});continue}await c?.(`\u6B63\u5728\u521B\u5EFA\u8F85\u52A9\u8868\u300C${V}\u300D`);let ue=await n0(h,{baseId:W,name:V,setup:R.setup,onProgress:c}),oe=S.inProfile;g.push({target:oe?"profile":"workflow",basePath:S.basePath,baseId:W,tableId:ue}),await c?.(`\u5DF2\u521B\u5EFA\u8F85\u52A9\u8868\u300C${V}\u300D: ${ue}`)}if(g.length===0)return 0;let b=g.filter(R=>R.target==="workflow"),v=g.filter(R=>R.target==="profile");if(b.length>0){let R=Rd.parseDocument(d);for(let S of b)R.setIn([...S.basePath,"mode"],"owned"),R.setIn([...S.basePath,"baseId"],S.baseId),R.setIn([...S.basePath,"tableId"],S.tableId);await Py(e,R.toString(),"utf8")}if(v.length>0&&i){let R=await Dy(i.filePath,"utf8"),S=Rd.parseDocument(R);for(let C of v)S.setIn([...C.basePath,"mode"],"owned"),S.setIn([...C.basePath,"baseId"],C.baseId),S.setIn([...C.basePath,"tableId"],C.tableId);await Py(i.filePath,S.toString(),"utf8")}return g.length}a(Cd,"setupSurfaceTables");function QP(t,e){let n;return e.idx!==void 0?n=k(t[e.idx])?t[e.idx]:void 0:e.srcName&&(n=t.find(r=>k(r)&&r.name===e.srcName)),n&&k(n.handler_config)?n.handler_config:{}}a(QP,"findEventSourceContainer");function XP(t,e){let n;return e.idx!==void 0?n=k(t[e.idx])?t[e.idx]:void 0:e.stepId&&(n=t.find(r=>k(r)&&r.id===e.stepId)),n&&k(n.config)?n.config:{}}a(XP,"findStepContainer");function e0(t,e){if(!t||!e)return{};let n=t.event_sources?.[e];if(!n)return{};let r=n.handler_config;return k(r)?r:{}}a(e0,"profileHandlerConfig");function t0(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(t0,"resolveSurfaceTableRefBaseId");async function n0(t,e){let n=e.setup?.tableSchema?.fields??[],{tableId:r,reused:o}=await ss(t,{baseId:e.baseId,name:e.name,fields:o0(e.setup).slice(0,Ps),onProgress:e.onProgress});if(o)return await My(t,{baseId:e.baseId,tableId:r,name:e.name,setup:e.setup,onProgress:e.onProgress}),r;let i=n.slice(Ps);return i.length>0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5269\u4F59\u5B57\u6BB5: ${i.map(s=>s.name).join(", ")}`),await Oy(t,{baseId:e.baseId,tableId:r,fields:i})),r}a(n0,"createSurfaceTable");async function My(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 ct(t,e.baseId,e.tableId),o=new Map(r.map(l=>[l.fieldName,l])),i=[];for(let l of n){let d=o.get(l.name);d&&(r0(l.type,d.type)||i.push(`\u300C${l.name}\u300D\u58F0\u660E\u4E3A ${l.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${d.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(i.length>0)throw new Error(`\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${i.join("; ")}`);let s=new Set(r.map(l=>l.fieldName)),c=n.filter(l=>!s.has(l.name));c.length!==0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5: ${c.map(l=>l.name).join(", ")}`),await Oy(t,{baseId:e.baseId,tableId:e.tableId,fields:c}))}a(My,"ensureSurfaceTableSchema");function r0(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(r0,"isSurfaceFieldTypeCompatible");async function Oy(t,e){for(let n=0;n<e.fields.length;n+=Ps){let r=e.fields.slice(n,n+Ps);await t.runJson(["aitable","field","create","--base-id",e.baseId,"--table-id",e.tableId,"--fields",JSON.stringify(s0(r)),"--timeout","60","--yes"],{timeoutMs:9e4})}}a(Oy,"createSurfaceFields");function o0(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(o0,"buildCreateFields");function i0(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(i0,"parseTableIdSurface");function $y(t,e){let n=t.setup?.tableName?.trim();return n||t.label.replace(/ 的 Table ID.*/,"")||e.join(".")}a($y,"tableNameFromSurface");function s0(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(s0,"buildFieldCreateFields");function a0(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=k(r[o])?r[o]:{};if(i.type!=="aitable_record")continue;let s=k(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(!k(p)||p.mode!=="reference")continue;let g=typeof p.ref=="string"?p.ref.trim():"",h=YP.exec(g);if(!h)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${g||"\u7A7A"}\uFF09\uFF0C\u5E94\u4E3A workflow:<workflowId>.tracker`);let y=h[1],w=e.get(y);if(!w)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300D`);if(!w.base_id||!w.table_id)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300Dtracker \u672A\u914D\u7F6E\u5B8C\u6574\uFF08base_id/table_id \u4E3A\u7A7A\uFF09`)}}a(a0,"validateSourceTableReferences");import{existsSync as c0,readdirSync as l0,readFileSync as d0,writeFileSync as u0,unlinkSync as f0}from"fs";import Id from"path";var $s=15,p0=/^([A-Za-z][A-Za-z0-9]*)_(.+)$/;function jy(t){return`https://docs.dingtalk.com/i/nodes/${t.baseId}?iframeQuery=sheetId%3D${t.tableId}`}a(jy,"tableUrl");function g0(t,e){return t.find(r=>r.fieldName===e)?.fieldId??null}a(g0,"resolveFieldId");function Ly(t){return t.includes("\u540D\u79F0\u91CD\u590D")||t.includes("\u5DF2\u5B58\u5728")||t.includes("already exist")||t.includes("duplicate")}a(Ly,"isAlreadyExists");async function m0(t,e,n){let r=new Map;try{let o=await t.runJson(["aitable","workflow","list","--base-id",e,"--yes"],{timeoutMs:3e4}),i=k(o)&&k(o.data)&&Array.isArray(o.data.list)?o.data.list:[];for(let s of i){if(!k(s))continue;let c=typeof s.name=="string"?s.name:"",l=typeof s.flowId=="string"?s.flowId:typeof s.workflowId=="string"?s.workflowId:"";c&&l&&r.set(c,l)}}catch(o){n?.(`\u5217\u51FA\u5DF2\u6709\u6D41\u7A0B\u5931\u8D25\uFF0C\u9000\u5316\u4E3A\u53EA create: ${o instanceof Error?o.message:String(o)}`)}return r}a(m0,"listExistingFlows");function h0(t){let e=k(t)&&k(t.data)?t.data:k(t)?t:null;if(!e||e.valid!==!1)return null;let r=(Array.isArray(e.issues)?e.issues:[]).filter(k).map(o=>{let i=typeof o.path=="string"?o.path:"",s=typeof o.message=="string"?o.message:String(o.code??"\u672A\u77E5\u95EE\u9898");return i?`${i}: ${s}`:s});return r.length>0?`DSL \u6821\u9A8C\u5931\u8D25 \u2014 ${r.join("; ")}`:"DSL \u6821\u9A8C\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u5177\u4F53\u539F\u56E0\uFF09"}a(h0,"extractValidationError");function Fy(t,e,n){let r=n?t.filter(o=>o.fieldName===n):t;for(let o of r){if(!o.options.length)continue;let i=o.options.find(s=>s.name===e);if(i)return i.id}return null}a(Fy,"resolveOptionId");function y0(t){let e=new Map,n=[];if(!k(t))return{decls:e,errors:n};for(let[r,o]of Object.entries(t)){if(!k(o)){n.push(`_tables.${r} \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}if(o.ref==="tracker"){e.set(r,{ref:"tracker"});continue}let i=typeof o.name=="string"?o.name.trim():"";if(!i){n.push(`_tables.${r} \u9700\u8981 name\uFF08\u8868\u540D\uFF09\u6216 ref: "tracker"`);continue}e.set(r,{name:i,fields:w0(o.fields,r,n)})}return{decls:e,errors:n}}a(y0,"parseTableDecls");function w0(t,e,n){if(t===void 0)return[];if(!Array.isArray(t))return n.push(`_tables.${e}.fields \u5FC5\u987B\u662F\u6570\u7EC4`),[];let r=[];for(let o of t){if(!k(o))continue;let i=typeof o.name=="string"?o.name.trim():"",s=typeof o.type=="string"?o.type.trim():"";if(!i||!s){n.push(`_tables.${e}.fields \u4E2D\u6709\u6761\u76EE\u7F3A\u5C11 name \u6216 type`);continue}let c={name:i,type:s};Array.isArray(o.options)&&(c.options=o.options.map(l=>String(l))),k(o.config)&&(c.config=o.config),r.push(c)}return r}a(w0,"parseDeclFields");async function b0(t){let{dws:e,baseId:n,tracker:r,decls:o,cache:i,onProgress:s}=t,c=new Map,l=[];for(let[d,u]of o){if("ref"in u){c.set(d,r);continue}let f=`${n}::${u.name}`,p=i.get(f);if(p){c.set(d,p);continue}try{let g=await k0(e,{baseId:n,name:u.name,fields:u.fields??[],onProgress:s});i.set(f,g),c.set(d,g)}catch(g){l.push(`\u4F9D\u8D56\u8868\u300C${u.name}\u300D\u51C6\u5907\u5931\u8D25: ${g instanceof Error?g.message:String(g)}`)}}return{tables:c,errors:l}}a(b0,"resolveDeclaredTables");async function k0(t,e){let{baseId:n,name:r,fields:o,onProgress:i}=e,{tableId:s,reused:c}=await ss(t,{baseId:n,name:r,fields:x0(o).slice(0,$s),onProgress:i});if(c)await v0(t,{baseId:n,tableId:s,name:r,fields:o,onProgress:i});else{i?.(`\u81EA\u52A8\u5316\u4F9D\u8D56\u8868\u300C${r}\u300D: \u5DF2\u521B\u5EFA ${s}`);let l=o.slice($s);l.length>0&&(i?.(`\u6B63\u5728\u8865\u9F50\u4F9D\u8D56\u8868\u300C${r}\u300D\u5269\u4F59\u5B57\u6BB5: ${l.map(d=>d.name).join(", ")}`),await Wy(t,n,s,l))}return{baseId:n,tableId:s,label:r,fields:await ql(t,n,s)}}a(k0,"ensureDeclaredTable");async function v0(t,e){if(e.fields.length===0)return;let n=await ct(t,e.baseId,e.tableId),r=new Map(n.map(c=>[c.fieldName,c])),o=[];for(let c of e.fields){let l=r.get(c.name);l&&(S0(c.type,l.type)||o.push(`\u300C${c.name}\u300D\u58F0\u660E\u4E3A ${c.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${l.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(o.length>0)throw new Error(`\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${o.join("; ")}`);let i=new Set(n.map(c=>c.fieldName)),s=e.fields.filter(c=>!i.has(c.name));s.length!==0&&(e.onProgress?.(`\u6B63\u5728\u4E3A\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u8865\u9F50\u5B57\u6BB5: ${s.map(c=>c.name).join(", ")}`),await Wy(t,e.baseId,e.tableId,s))}a(v0,"ensureFields");function S0(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(S0,"isFieldTypeCompatible");async function Wy(t,e,n,r){for(let o=0;o<r.length;o+=$s)await t.runJson(["aitable","field","create","--base-id",e,"--table-id",n,"--fields",JSON.stringify(r.slice(o,o+$s).map(By)),"--timeout","60","--yes"],{timeoutMs:9e4})}a(Wy,"createFields");function x0(t){return t.length===0?[{fieldName:"\u6807\u9898",type:"primaryDoc"}]:t.map((e,n)=>{let r=By(e);return n===0&&e.type==="text"&&(r.type="primaryDoc"),r})}a(x0,"buildCreateFields");function By(t){let e={fieldName:t.name,type:t.type},n={...t.config??{}};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),Object.keys(n).length>0&&(e.config=n),e}a(By,"fieldPayload");function R0(t,e,n=new Map){let r=[],o=new Set,i=a(c=>{o.has(c)||(o.add(c),r.push(c))},"fail");return{resolved:t.replace(/<([^<>]+)>/g,(c,l)=>{if(l==="sheetId")return e.tableId;if(l==="table_url")return jy(e);for(let[d,u]of[["_sheetId",f=>f.tableId],["_table_url",f=>jy(f)]]){if(!l.endsWith(d))continue;let f=l.slice(0,-d.length),p=n.get(f);return p?u(p):(i(`\u8868\u524D\u7F00\u300C${f}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),c)}if(l.endsWith("_fieldId")){let d=Ny(l.slice(0,-8),n,e,i);if(!d)return c;let u=g0(d.table.fields,d.rest);return u||(i(`\u5B57\u6BB5\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u4E0D\u5B58\u5728`),c)}if(l.endsWith("_optionId")){let d=Ny(l.slice(0,-9),n,e,i);if(!d)return c;let u=C0(d.table,d.rest);return u||(i(`\u9009\u9879\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u672A\u627E\u5230`),c)}return c}),errors:r}}a(R0,"resolvePlaceholders");function Ny(t,e,n,r){if(e.size===0)return{table:n,rest:t};let o=p0.exec(t);if(!o)return{table:n,rest:t};let[,i,s]=o,c=e.get(i);return c?{table:c,rest:s}:(r(`\u8868\u524D\u7F00\u300C${i}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),null)}a(Ny,"locate");function C0(t,e){let n=e.lastIndexOf("_");if(n>0){let r=Fy(t.fields,e.slice(n+1),e.slice(0,n));if(r)return r}return Fy(t.fields,e)}a(C0,"resolveOptionIdFlexible");async function Td(t){let{configDir:e,baseId:n,tableId:r,dws:o,onProgress:i}=t,s=i??(()=>{}),c=Id.resolve(e,"automations"),l={deployed:[],updated:[],skipped:[],failed:[]};if(!c0(c))return l;let d=l0(c).filter(g=>g.endsWith(".json"));if(d.length===0)return l;s(`\u53D1\u73B0 ${d.length} \u4E2A\u81EA\u52A8\u5316 DSL \u6587\u4EF6`);let u={baseId:n,tableId:r,label:"\u5DE5\u4F5C\u6D41\u8BB0\u5F55\u8868",fields:await ql(o,n,r)};s(`\u5DF2\u83B7\u53D6\u8868\u7ED3\u6784: ${u.fields.length} \u4E2A\u5B57\u6BB5`);let f=new Map,p=await m0(o,n,s);p.size>0&&s(`\u5DF2\u5217\u51FA ${p.size} \u4E2A\u5DF2\u6709\u6D41\u7A0B\uFF0C\u540C\u540D\u6D41\u7A0B\u5C06\u81EA\u52A8 update`);for(let g of d){let h=Id.join(c,g),y;try{y=d0(h,"utf-8")}catch{l.failed.push({name:g,error:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"});continue}let w;try{w=JSON.parse(y)}catch{l.failed.push({name:g,error:"JSON \u89E3\u6790\u5931\u8D25"});continue}let b=String(w.name??g),{decls:v,errors:R}=y0(w._tables);if(delete w._deploy_notes,delete w._tables,R.length>0){s(`\u8DF3\u8FC7 ${b}: ${R.join("; ")}`),l.skipped.push(b);continue}let{tables:S,errors:C}=await b0({dws:o,baseId:n,tracker:u,decls:v,cache:f,onProgress:i});if(C.length>0){s(`\u8DF3\u8FC7 ${b}: ${C.join("; ")}`),l.skipped.push(b);continue}let A=JSON.stringify(w,null,2),{resolved:_,errors:T}=R0(A,u,S);if(T.length>0){s(`\u8DF3\u8FC7 ${b}: ${T.join("; ")}`),l.skipped.push(b);continue}if(_.includes("<")&&/<[^>]+>/.test(_)){let x=_.match(/<[^>]+>/g)??[];s(`\u8DF3\u8FC7 ${b}: \u4ECD\u6709\u672A\u89E3\u6790\u5360\u4F4D\u7B26 ${x.slice(0,3).join(", ")}`),l.skipped.push(b);continue}let I=Id.join(c,`.${g}.resolved.tmp`);u0(I,_,"utf-8");try{await I0({dws:o,baseId:n,dslName:b,tmpFile:I,existing:p,result:l,log:s})}catch(x){let D=x instanceof Error?x.message:String(x);Ly(D)?(s(`\u8DF3\u8FC7 ${b}\uFF08\u5DF2\u5B58\u5728\uFF0Clist \u672A\u547D\u4E2D\u4F46 create \u62A5\u91CD\u540D\uFF09`),l.skipped.push(b)):(s(`\u90E8\u7F72\u5931\u8D25 ${b}: ${D}`),l.failed.push({name:b,error:D}))}finally{try{f0(I)}catch{}}}return l}a(Td,"setupAutomations");async function I0(t){let{dws:e,baseId:n,dslName:r,tmpFile:o,existing:i,result:s,log:c}=t,l=i.get(r),d=l?["aitable","workflow","update","--base-id",n,"--workflow-id",l,"--dsl",`@${o}`]:["aitable","workflow","create","--base-id",n,"--dsl",`@${o}`],u=await e.runJson(d,{timeoutMs:6e4}),f=h0(u);if(f){if(Ly(f)){c(`\u8DF3\u8FC7 ${r}\uFF08\u540C\u540D\u5DF2\u5B58\u5728\uFF0Cupdate \u4ECD\u62A5\u91CD\u590D\uFF09`),s.skipped.push(r);return}c(`${l?"\u66F4\u65B0":"\u90E8\u7F72"}\u5931\u8D25 ${r}: ${f}`),s.failed.push({name:r,error:f});return}l?(c(`\u5DF2\u66F4\u65B0: ${r}`),s.updated.push(r),i.delete(r)):(c(`\u5DF2\u90E8\u7F72: ${r}`),s.deployed.push(r))}a(I0,"publishFlow");async function E0(t){let{configPath:e,settings:n,onProgress:r}=t,o=n.tracker.base_id?.trim();if(o&&o!=="__placeholder__")return{baseId:o,created:!1};if(n.multiWorkflow){let u=await $0(n);if(u)return await zy(n,u),await r?.(`\u590D\u7528 workflow.yml \u5DF2\u58F0\u660E\u7684 AI \u8868\u683C\uFF1A${u}`,"create_base"),{baseId:u,created:!1}}let i=Xn.dirname(await Te(e)),s=D0(Xn.basename(i)),c=new ae({bin:n.tracker.dws_bin,timeoutMs:6e4});await r?.(`tracker.base_id \u4E3A\u7A7A\uFF0C\u6B63\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C\uFF1A${s}`,"create_base");let l=await c.runJson(["aitable","base","create","--name",s,"--yes"],{timeoutMs:9e4}),d=P0(l);if(!d)throw Object.assign(new Error("dws \u521B\u5EFA AI \u8868\u683C\u672A\u8FD4\u56DE baseId"),{code:"BASE_ID_NOT_RETURNED",details:{response:l}});return await r?.(`AI \u8868\u683C\u5DF2\u521B\u5EFA\uFF1A${d}`,"create_base"),await zy(n,d,{clearStaleTableIds:!0}),{baseId:d,created:!0}}a(E0,"ensureBaseExists");function D0(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"AI \u8868\u683C\u5DE5\u4F5C\u6D41"}a(D0,"sanitizeBaseName");function P0(t){if(k(t)){let e=t.data;if(k(e)){let n=e.baseId??e.base_id??e.id;if(typeof n=="string"&&n.trim())return n.trim()}}return null}a(P0,"findBaseId");async function $0(t){for(let e of t.workflowEntries)try{let n=Ky.parse(await Vy(e.templatePath,"utf8")),r=k(n?.tracker)?n.tracker:null,o=typeof r?.base_id=="string"?r.base_id.trim():"";if(o&&o!=="__placeholder__")return o}catch{}return null}a($0,"findBaseIdInWorkflows");async function zy(t,e,n){let r=n?.clearStaleTableIds===!0;if(!t.multiWorkflow){let i=await Te(t.configDir);await Uy(i,e,r);return}let o=new Set;for(let i of t.workflowEntries)o.has(i.templatePath)||(o.add(i.templatePath),await Uy(i.templatePath,e,r))}a(zy,"writeBaseIdToWorkflows");async function Uy(t,e,n){if(!n){await Li(t,["tracker","base_id"],e);return}let r="";try{r=await Vy(t,"utf8")}catch{}let o=Ky.parseDocument(r);o.setIn(["tracker","base_id"],e),o.getIn(["tracker","table_id"])!==void 0&&o.setIn(["tracker","table_id"],""),await A0(t,o.toString(),"utf8")}a(Uy,"writeBaseIdWithOptionalTableClear");async function AY(t){let e=await Ae(t.config,{lenientEnv:!0}),n=await Te(t.config),{baseId:r}=await E0({configPath:t.config,settings:e,onProgress:a(f=>console.log(` \u2022 ${f}`),"onProgress")});e.tracker.base_id!==r&&(e=await Ae(t.config,{lenientEnv:!0}));let o=[];for(let f of e.workflowEntries){let p=await st(f.templatePath,{envSource:e.envSource}),g=e.tracker.base_id==="__placeholder__"?void 0:e.tracker,h=g??p.tracker;if(!h)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${f.id}\u300D\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09`);let y=g?n:f.templatePath;o.push({entry:f,workflow:p,trackerConfig:h,trackerFilePath:y})}let i=new Map,s=new Set;for(let f of o){console.log(`
|
|
615
|
-
\u25B6 \u521D\u59CB\u5316\u5DE5\u4F5C\u6D41\u300C${f.entry.id}\u300D\uFF08${f.workflow.meta.name}\uFF09`);let p=
|
|
616
|
-
`);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(
|
|
614
|
+
`))}return Ey({cwd:u,force:e,yes:n})}a(g5,"runInit");async function Fy(t){let e=Gt.resolve(t);try{return(await e0(e)).isDirectory()?e:Gt.dirname(e)}catch{let n=Gt.extname(e).toLowerCase();return n===".yml"||n===".yaml"?Gt.dirname(e):e}}a(Fy,"resolveInitCwd");async function to(t){try{return await XP(t),!0}catch{return!1}}a(to,"pathExists");import{existsSync as e$}from"fs";import{readFile as rw,writeFile as t$}from"fs/promises";import tr from"path";import{pathToFileURL as n$}from"url";import ow from"yaml";var vd=process.env.NODE_ENV==="test"?2:5,Ny=process.env.NODE_ENV==="test"?0:500,t0={Grid:"Grid",FormDesigner:"FormDesigner",Kanban:"Kanban",Calendar:"Calendar",Gallery:"Gallery",Gantt:"Gantt"};function Id(t){return t0[t]??t}a(Id,"toDwsViewType");var n0={state:"singleSelect",description:"text",current_step:"text",owner:"text",event_log:"text"};function r0(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(r0,"extractStateOptions");async function Td(t){let{settings:e,workflow:n,cleanEmptyRows:r=!0}=t,{base_id:o,table_id:i,fields:s}=e.tracker,c=t.dws??new ae({bin:e.tracker.dws_bin}),l=[];m.info("setup","\u83B7\u53D6\u8868\u7ED3\u6784",{baseId:o,tableId:i});let d=await ct(c,o,i),u=new Set(d.map(I=>I.fieldName));m.info("setup","\u73B0\u6709\u5B57\u6BB5",{count:d.length,names:d.map(I=>I.fieldName)});let f=[],p=e.tracker.field_definitions,g=p?p.map(I=>({name:I.name,type:I.type,...I.options?{options:I.options}:{},...I.formatter?{formatter:I.formatter}:{},...I.description?{description:I.description}:{}})):[],h=new Map(g.map(I=>[I.name,I])),y=[{role:"description",name:s.description},{role:"state",name:s.state},{role:"current_step",name:s.current_step},{role:"owner",name:s.owner},{role:"event_log",name:s.event_log}],w=new Set(y.map(I=>I.name).filter(Boolean)),{userInput:b,output:v,other:R}=n.referencedFields,S=new Set([...u]);for(let I of b){if(S.has(I)||w.has(I))continue;let x=h.get(I);f.push({fieldName:I,type:x?.type??"text",...x?.options?{options:x.options}:{},...x?.formatter?{formatter:x.formatter}:{},...x?.description?{description:x.description}:{}}),S.add(I)}for(let I of v){if(S.has(I)||w.has(I))continue;let x=h.get(I);f.push({fieldName:I,type:x?.type??"text",...x?.options?{options:x.options}:{},...x?.formatter?{formatter:x.formatter}:{},...x?.description?{description:x.description}:{}}),S.add(I)}for(let I of R){if(S.has(I)||w.has(I))continue;let x=h.get(I);f.push({fieldName:I,type:x?.type??"text",...x?.options?{options:x.options}:{},...x?.formatter?{formatter:x.formatter}:{},...x?.description?{description:x.description}:{}}),S.add(I)}for(let I of g)S.has(I.name)||w.has(I.name)||(f.push({fieldName:I.name,type:I.type??"text",...I.options?{options:I.options}:{},...I.formatter?{formatter:I.formatter}:{},...I.description?{description:I.description}:{}}),S.add(I.name));for(let{role:I,name:x}of y){if(!x)continue;if(S.has(x)){m.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${x}`);continue}let D=h.get(x),j=D?.type??n0[I]??"text";f.push({fieldName:x,type:j,...D?.options?{options:D.options}:{},...D?.description?{description:D.description}:{},...!D?.options&&I==="state"?{options:r0(e.tracker.states)}:{}}),S.add(x)}if(f.length>0){m.info("setup","\u521B\u5EFA\u5B57\u6BB5",{count:f.length,fields:f.map(L=>L.fieldName)});let I=5,x=2,D=0,j=[];for(let L=0;L<f.length;L+=I){let W=f.slice(L,L+I),V=!1;for(let ue=0;ue<=x;ue++)try{let oe=W.map(ie=>{let ve={fieldName:ie.fieldName,type:ie.type},Je={};return ie.options&&ie.options.length>0&&(Je.options=ie.options.map(Ge=>({name:Ge}))),ie.formatter&&(Je.formatter=ie.formatter),Object.keys(Je).length>0&&(ve.config=Je),ie.description&&(ve.description=ie.description),ve}),Ne=await c.runJson(["aitable","field","create","--base-id",o,"--table-id",i,"--fields",JSON.stringify(oe),"--timeout","60","--yes"],{timeoutMs:9e4}),be=k(Ne)&&k(Ne.data)?Ne.data:null,Le=typeof be?.successCount=="number"?be.successCount:W.length,nt=typeof be?.failedCount=="number"?be.failedCount:0;if(D+=Le,nt>0&&Array.isArray(be?.results)){for(let ie of be.results)if(k(ie)&&ie.success===!1){let ve=String(ie.fieldName??"");if(String(ie.errorCode??"").includes("Forbidden"))m.info("setup",`\u5B57\u6BB5\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7: ${ve}`),D++;else{let Je={fieldName:ve||"<unknown>",...typeof ie.errorCode=="string"?{errorCode:ie.errorCode}:{},...typeof ie.errorMessage=="string"?{errorMessage:ie.errorMessage}:{}};j.push(Je),m.warn("setup","\u5B57\u6BB5\u521B\u5EFA\u8FD4\u56DE\u5931\u8D25",Je)}}}V=!0;break}catch(oe){let Ne=oe instanceof Error?oe.message:String(oe),be=oe instanceof ge?oe.stderr:"";if((Ne.includes("TIMEOUT")||Ne.includes("timeout")||be.includes("TIMEOUT")||be.includes("timeout"))&&ue<x){m.warn("setup",`\u6279\u6B21\u8D85\u65F6\uFF0C\u68C0\u67E5\u5B9E\u9645\u72B6\u6001\u540E\u91CD\u8BD5 ${ue+1}/${x}`,{batch:W.map(Ge=>Ge.fieldName)}),await Sd(3e3);let nt=await ct(c,o,i),ie=new Set(nt.map(Ge=>Ge.fieldName)),ve=W.filter(Ge=>!ie.has(Ge.fieldName));if(ve.length===0){m.info("setup","\u8D85\u65F6\u4F46\u5B57\u6BB5\u5DF2\u5168\u90E8\u521B\u5EFA\u6210\u529F"),D+=W.length,V=!0;break}let Je=W.length-ve.length;Je>0&&(m.info("setup",`\u5176\u4E2D ${Je} \u4E2A\u5DF2\u521B\u5EFA\uFF0C\u4EC5\u91CD\u8BD5\u5269\u4F59 ${ve.length} \u4E2A`),D+=Je),W=ve}else{m.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25",{batch:W.map(nt=>nt.fieldName),error:Ne}),j.push(...W.map(nt=>({fieldName:nt.fieldName,errorMessage:Ne})));break}}V&&L+I<f.length&&await Sd(500)}if(j.length===0)m.info("setup","\u5B57\u6BB5\u521B\u5EFA\u5B8C\u6210",{createdCount:D,fields:f.map(L=>L.fieldName)}),console.log(`\u2713 \u5DF2\u521B\u5EFA ${D} \u4E2A\u5B57\u6BB5: ${f.map(L=>L.fieldName).join(", ")}`);else throw m.error("setup","\u5B57\u6BB5\u521B\u5EFA\u5B58\u5728\u5931\u8D25\u9879\uFF0C\u7EC8\u6B62\u642D\u5EFA",{requestedCount:f.length,createdCount:D,failedCount:j.length,failedFields:j}),Object.assign(new Error(`\u5B57\u6BB5\u521B\u5EFA\u5931\u8D25\uFF1A${j.map(L=>L.fieldName).join(", ")}`),{code:"FIELD_CREATE_FAILED",status:502,details:{requestedCount:f.length,createdCount:D,failedCount:j.length,failedFields:j}})}else console.log("\u2713 \u6240\u6709\u5B57\u6BB5\u5DF2\u5C31\u7EEA\uFF0C\u65E0\u9700\u521B\u5EFA");if(r&&(f.length>0||t.tableJustCreated===!0))try{await o0(c,o,i)}catch(I){let x=I instanceof Error?I.message:String(I);m.warn("setup","\u7A7A\u767D\u884C\u6E05\u7406\u5931\u8D25\uFF08\u975E\u81F4\u547D\uFF09",{error:x}),console.log("\u26A0 \u7A7A\u767D\u884C\u6E05\u7406\u8DF3\u8FC7\uFF08API \u8D85\u65F6\uFF09")}let _=f.length>0?await ct(c,o,i):d,A=e.tracker.views;if(A&&A.length>0)try{l.push(...await a0(c,o,i,_,A,n,s.title,e.tracker.form_share?.enabled))}catch(I){let x=I instanceof Error?I.message:String(I);throw m.error("setup","\u89C6\u56FE\u914D\u7F6E\u5931\u8D25",{error:x}),console.log("\u2717 \u89C6\u56FE\u914D\u7F6E\u5931\u8D25"),I}else m.info("setup","\u672A\u914D\u7F6E tracker.views\uFF0C\u8DF3\u8FC7\u89C6\u56FE\u521B\u5EFA");let T=_;console.log(`
|
|
615
|
+
\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 I of T)b.has(I.fieldName)&&console.log(` \u2713 [${I.type}] ${I.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 I of T)v.has(I.fieldName)&&!b.has(I.fieldName)&&console.log(` [${I.type}] ${I.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 I of T)if(w.has(I.fieldName)||I.type==="primaryDoc"){let x=i0(I.fieldName,s),D=x?` \u2190 ${x}`:"";console.log(` [${I.type}] ${I.fieldName}${D}`)}if(console.log(`
|
|
616
|
+
\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`),A?.some(I=>I.type==="FormDesigner"&&I.id==="input_form")){let I=A.find(x=>x.id==="input_form");console.log(` \u63A8\u8350\u4F7F\u7528\u89C6\u56FE "${I?.name}" \u65B0\u5EFA\u5DE5\u5355\u3002`)}return{warnings:l}}a(Td,"initTable");function Sd(t){return new Promise(e=>setTimeout(e,t))}a(Sd,"sleep");async function o0(t,e,n){m.info("setup","\u68C0\u67E5\u7A7A\u767D\u884C");let r=await t.runJson(["aitable","record","query","--base-id",e,"--table-id",n,"--limit","100"]),o=ye(r),i=[];for(let s of o){if(!k(s))continue;let c=typeof s.recordId=="string"?s.recordId:null,l=k(s.cells)?s.cells:{},d=Object.values(l).some(u=>u!=null&&u!=="");c&&!d&&i.push(c)}i.length>0?(m.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(o0,"cleanupEmptyRows");function i0(t,e){for(let[n,r]of Object.entries(e))if(r===t)return n;return null}a(i0,"findRole");function s0(t){if(t instanceof ge){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(s0,"describeViewError");async function a0(t,e,n,r,o,i,s,c){let l=new Map(r.map(v=>[v.fieldName,v.fieldId])),d=new Map(r.map(v=>[v.fieldName,v.type])),f=c0(r,s)?.fieldId??"",p=await zy(t,e,n),g=new Map(p.map(v=>[String(v.viewName??""),v])),h=d0(o,i),y=[],w=[],b=!1;for(let v of h){v.filter?.length&&v.type!=="Grid"&&(m.warn("setup",`\u89C6\u56FE "${v.name}" \u975E Grid \u89C6\u56FE\uFF0Cfilter \u58F0\u660E\u88AB\u5FFD\u7565`,{type:v.type}),console.log(`\u26A0 \u89C6\u56FE "${v.name}"\uFF08${v.type}\uFF09\u6682\u4E0D\u652F\u6301\u58F0\u660E\u5F0F\u8FC7\u6EE4\uFF0C\u5DF2\u5FFD\u7565`));try{switch(v.type){case"Grid":{let R=!b;b=!0,await u0(t,e,n,v,l,f,p,i,R,g);break}case"FormDesigner":await m0(t,e,n,v,l,d,f,g,c??!0,w);break;case"Kanban":case"Calendar":case"Gallery":case"Gantt":await k0(t,e,n,v,l,f,g);break}}catch(R){let S=s0(R);if(v.type==="FormDesigner"){let C={code:"FORM_VIEW_CREATE_FAILED",message:`\u8868\u5355\u89C6\u56FE "${v.name}" \u672A\u81EA\u52A8\u521B\u5EFA\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6DFB\u52A0\u8868\u5355\u89C6\u56FE\uFF08\u539F\u56E0\uFF1A${x0(S)}\uFF09`,details:{id:v.id,name:v.name,type:v.type,retryable:!0,errorDetail:S}};m.warn("setup","\u975E\u5173\u952E\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF0C\u7EE7\u7EED setup",{...C.details,error:S}),console.log(`\u26A0 ${C.message}`),console.log(` \u21B3 \u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u540D\u4E3A "${v.name}" \u7684\u8868\u5355\u89C6\u56FE`),w.push(C);continue}m.warn("setup",`\u89C6\u56FE "${v.name}" \u914D\u7F6E\u5931\u8D25`,{error:S}),console.log(`\u26A0 \u89C6\u56FE "${v.name}" \u521B\u5EFA\u5931\u8D25: ${S}`),y.push({id:v.id,name:v.name,type:v.type,errorMessage:S})}}if(y.length>0)throw Object.assign(new Error(`\u89C6\u56FE\u521B\u5EFA\u5931\u8D25\uFF1A${y.map(v=>v.name).join(", ")}`),{code:"VIEW_CREATE_FAILED",status:502,details:{requestedCount:h.length,failedCount:y.length,failedViews:y}});return w}a(a0,"configureViews");function c0(t,e){return t.find(n=>l0(n.type))??(e?t.find(n=>n.fieldName===e):void 0)??t[0]}a(c0,"resolvePrimaryField");function l0(t){let e=t.replace(/[_-]/g,"").toLowerCase();return e==="primarydoc"||e==="primary"}a(l0,"isPrimaryFieldType");function d0(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(d0,"expandForEachStep");async function u0(t,e,n,r,o,i,s,c,l,d){if(!l){await f0(t,e,n,r,o,i,d);return}let u=s.find(h=>h.viewType==="Grid");if(!u)return;let f=String(u.viewId??"");if(!f)return;let p=r.field_order?.length?r.field_order:g0(o,c),g=Ad(p,o,i);if(g.length>0){await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",f,"--config",JSON.stringify({visibleFieldIds:g}),"--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${g.length} \u4E2A\u5B57\u6BB5\uFF0C\u6765\u6E90: ${h}\uFF09`)}await xd(t,e,n,f,r.name,r,o)}a(u0,"applyGridView");async function f0(t,e,n,r,o,i,s){if(s.has(r.name)){await xd(t,e,n,Os(s.get(r.name)),r.name,r,o),console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}m.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",Id("Grid"),"--yes"],{timeoutMs:6e4}),l=await _d(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=Os(c)||String(l.viewId??""),u=r.field_order?.length?r.field_order:r.visible_fields??[];if(d&&u.length){let f=Ad(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})}await xd(t,e,n,d,r.name,r,o),console.log(`\u2713 \u5DF2\u521B\u5EFA Grid \u89C6\u56FE: "${r.name}"\uFF08${u.length} \u4E2A\u5B57\u6BB5\uFF09`)}a(f0,"applyAdditionalGridView");function p0(t,e){if(!t?.length)return;let n=[];for(let r of t){let o=e.get(r.field);if(!o){m.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u5B57\u6BB5\u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u6761\u4EF6: ${r.field}`);continue}r.any_of&&r.any_of.length>1?n.push({operator:"anyof",operands:[o,r.any_of]}):r.any_of?.length===1?n.push({operator:"eq",operands:[o,r.any_of[0]]}):typeof r.equals=="string"&&n.push({operator:"eq",operands:[o,r.equals]})}return n.length?JSON.stringify(n):void 0}a(p0,"buildViewFilterJson");async function xd(t,e,n,r,o,i,s){if(!r||!i.filter?.length)return!1;let c=p0(i.filter,s);if(!c)return!1;try{return await t.runJson(["aitable","view","update","filter","--base-id",e,"--table-id",n,"--view-id",r,"--json",c,"--yes"],{timeoutMs:6e4}),console.log(`\u2713 \u5DF2\u5E94\u7528\u89C6\u56FE\u8FC7\u6EE4: "${o}"\uFF08${i.filter.length} \u4E2A\u6761\u4EF6\uFF09`),!0}catch(l){return m.warn("setup",`\u89C6\u56FE\u8FC7\u6EE4\u4E0B\u53D1\u5931\u8D25\uFF08\u4E0D\u963B\u65AD\uFF09: ${o}`,{viewId:r,filter:c,error:l instanceof Error?l.message:String(l)}),console.log(`\u26A0 \u89C6\u56FE "${o}" \u8FC7\u6EE4\u4E0B\u53D1\u5931\u8D25\uFF0C\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u8BBE\u7F6E`),!1}}a(xd,"applyViewFilter");function g0(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(g0,"buildDefaultFieldOrder");async function m0(t,e,n,r,o,i,s,c,l,d){if(c.has(r.name)){console.log(`\u2713 \u8868\u5355\u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"\uFF0C\u540C\u6B65\u53EF\u89C1\u5B57\u6BB5`);let w=c.get(r.name),b=k(w)?String(w.viewId??w.id??""):"";b&&r.visible_fields?.length&&await Wy(t,e,n,b,r.visible_fields,o,i,s),l&&b&&await Ly(t,e,n,b,r,d);return}m.info("setup",`\u521B\u5EFA\u8868\u5355\u89C6\u56FE: ${r.name}`,{visibleFieldCount:r.visible_fields?.length??0,baseId:e,tableId:n});let u=await t.runJson(["aitable","view","create","--base-id",e,"--table-id",n,"--name",r.name,"--view-type",Id("FormDesigner"),"--yes"],{timeoutMs:6e4}),f=Os(u),p=Rd(u);m.info("setup","\u8868\u5355\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u8FD4\u56DE",{name:r.name,viewId:f||void 0,success:p,rawResult:JSON.stringify(u).slice(0,2e3)});let g=await _d(t,e,n,r.name);if(!g){let w=JSON.stringify(u).slice(0,500);if(!f&&!p)throw new Error(`dws \u672A\u8FD4\u56DE\u53EF\u9A8C\u8BC1\u7684\u6210\u529F\u4FE1\u53F7\uFF08\u65E0 viewId\u3001\u65E0 success=true\uFF09\uFF0C\u8868\u5355\u89C6\u56FE "${r.name}" \u53EF\u80FD\u672A\u521B\u5EFA\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}\u3002\u8BF7\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u521B\u5EFA\u8868\u5355\u89C6\u56FE\uFF0C\u6216\u4F7F\u7528 dws aitable view create --verbose \u6392\u67E5`);let b=[f?`viewId=${f}`:"",p?"success=true":"",`\u5DF2\u91CD\u8BD5 ${vd} \u6B21 view get`].filter(Boolean).join("\uFF1B");throw new Error(`\u89C6\u56FE\u521B\u5EFA\u547D\u4EE4\u5DF2\u8FD4\u56DE\uFF08${b}\uFF09\uFF0C\u4F46\u8FDC\u7AEF\u89C6\u56FE\u5217\u8868\u4E2D\u672A\u627E\u5230 "${r.name}"\u3002dws \u539F\u59CB\u8FD4\u56DE: ${w}`)}c.set(r.name,g);let h=f||String(g.viewId??"");h&&r.visible_fields?.length&&(await h0(t,e,n,h,r,o,i,s),await Wy(t,e,n,h,r.visible_fields,o,i,s));let y=r.visible_fields?.length??0;if(console.log(`\u2713 \u5DF2\u521B\u5EFA\u8868\u5355\u89C6\u56FE: "${r.name}"\uFF08${y} \u4E2A\u5B57\u6BB5\uFF09`),l){let w=h||f||"";w&&await Ly(t,e,n,w,r,d)}}a(m0,"applyFormView");async function h0(t,e,n,r,o,i,s,c){let l=o.visible_fields??[],d=[];c&&l.some(u=>i.get(u)===c)&&d.push(c);for(let u of l){if(By(s.get(u)))continue;let f=i.get(u);f&&f!==c&&d.push(f)}d.length!==0&&(m.info("setup",`\u66F4\u65B0\u8868\u5355\u89C6\u56FE\u53EF\u89C1\u5B57\u6BB5: ${o.name}`,{viewId:r,visibleCount:d.length}),await t.runJson(["aitable","view","update","--base-id",e,"--table-id",n,"--view-id",r,"--config",JSON.stringify({visibleFieldIds:d}),"--yes"],{timeoutMs:6e4}).catch(u=>{m.warn("setup",`\u8868\u5355\u53EF\u89C1\u5B57\u6BB5\u4E00\u6B21\u6027\u4E0B\u53D1\u5931\u8D25\uFF0C\u6539\u7531\u9010\u5B57\u6BB5\u540C\u6B65\u5BF9\u9F50: ${o.name}`,{viewId:r,error:u instanceof Error?u.message:String(u)})}))}a(h0,"applyFormVisibleFieldIds");async function Ly(t,e,n,r,o,i){let s=await mo(t,e,n,r,{autoEnable:!0});if(s){console.log(`\u2713 \u5DF2\u5F00\u542F\u8868\u5355\u5206\u4EAB \u2192 ${s}`),console.log(" \uFF08\u94FE\u63A5\u4E0D\u5199\u5165\u914D\u7F6E\uFF0C\u8FD0\u884C\u671F\u81EA\u52A8\u89E3\u6790\uFF1B\u6B64\u5904\u4EC5\u4F9B\u6838\u5BF9\uFF09");return}let c={code:"FORM_SHARE_DISABLED",message:`\u8868\u5355\u89C6\u56FE "${o.name}" \u7684\u5206\u4EAB\u672A\u5F00\u542F\uFF0C\u8FD0\u884C\u671F\u89E3\u6790\u4E0D\u51FA\u8868\u5355\u94FE\u63A5\uFF08\u56DE\u590D\u91CC\u4E0D\u4F1A\u51FA\u73B0\u586B\u5355\u5165\u53E3\uFF09\uFF1B\u8BF7\u91CD\u8DD1 setup\uFF0C\u6216\u5728 AI \u8868\u683C\u4E2D\u624B\u52A8\u6253\u5F00\u8BE5\u8868\u5355\u7684\u5206\u4EAB`,details:{id:o.id,name:o.name,viewId:r,retryable:!0}};m.warn("setup","\u8868\u5355\u5206\u4EAB\u672A\u5F00\u542F\uFF0Csetup \u7EE7\u7EED",c.details),console.log(`\u26A0 ${c.message}`),i.push(c)}a(Ly,"applyFormShare");async function Wy(t,e,n,r,o,i,s,c){let l=new Set(o),d=[],u=[],f=o.length===0;for(let[y,w]of i){if(w===c&&f)continue;let b=s.get(y);if(By(b)){u.push(w);continue}l.has(y)?d.push(w):u.push(w)}let p=await y0(t,e,n,r),g=p?d.filter(y=>!p.has(y)):d,h=p?u.filter(y=>p.has(y)):u;for(let y of g)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","false","--yes"],{timeoutMs:3e4}).catch(w=>{m.warn("setup",`form field unhide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});for(let y of h)await t.runJson(["aitable","form","field","hide","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--hidden","true","--yes"],{timeoutMs:3e4}).catch(w=>{m.warn("setup",`form field hide \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})}),await t.runJson(["aitable","form","field","update","--base-id",e,"--table-id",n,"--view-id",r,"--field-id",y,"--required","false","--yes"],{timeoutMs:3e4}).catch(w=>{m.warn("setup",`form field required=false \u5931\u8D25: ${y}`,{error:w instanceof Error?w.message:String(w)})});m.info("setup",`\u8868\u5355\u5B57\u6BB5\u540C\u6B65\u5B8C\u6210: viewId=${r}`,{mode:p?"incremental":"full",shown:g.length,hidden:h.length,skipped:d.length-g.length+(u.length-h.length)})}a(Wy,"syncFormFieldVisibility");async function y0(t,e,n,r){let o;try{o=await t.runJson(["aitable","form","field","list","--base-id",e,"--table-id",n,"--view-id",r],{timeoutMs:3e4})}catch(c){m.warn("setup","form field list \u5931\u8D25\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r,error:c instanceof Error?c.message:String(c)});return}let i=w0(o);if(!i){m.warn("setup","form field list \u8FD4\u56DE\u4E2D\u672A\u627E\u5230\u5B57\u6BB5\u6570\u7EC4\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}let s=new Map;for(let c of i){if(!k(c))continue;let l=typeof c.fieldId=="string"?c.fieldId.trim():"";l&&s.set(l,c.required===!0)}if(i.length>0&&s.size===0){m.warn("setup","form field list \u8FD4\u56DE\u5F62\u72B6\u4E0D\u7B26\u9884\u671F\uFF0C\u9000\u56DE\u5168\u91CF\u8868\u5355\u5B57\u6BB5\u64CD\u4F5C",{viewId:r});return}return s}a(y0,"fetchFormVisibleFields");function w0(t){let e=le(t);if(Array.isArray(e))return e;if(!k(e))return;let n=["formFields","fields","items","list","records","results"];for(let r of n){let o=e[r];if(Array.isArray(o))return o}for(let r of Object.values(e))if(k(r))for(let o of n){let i=r[o];if(Array.isArray(i))return i}}a(w0,"extractFormFieldArray");function b0(t){return t==="creator"||t==="lastModifier"||t==="createdTime"||t==="lastModifiedTime"}a(b0,"isSystemReadonlyFieldType");function By(t){return b0(t)||t==="formula"||t==="lookup"||t==="filterUp"}a(By,"isFormExcludedFieldType");async function k0(t,e,n,r,o,i,s){if(s.has(r.name)){console.log(`\u2713 \u89C6\u56FE\u5DF2\u5B58\u5728: "${r.name}"`);return}m.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",Id(r.type),"--yes"],{timeoutMs:6e4}),l=await _d(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=Os(c)||String(l.viewId??"");if(d&&r.visible_fields?.length){let u=Ad(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(k0,"applyGenericView");async function zy(t,e,n){let r=await t.runJson(["aitable","view","get","--base-id",e,"--table-id",n]),o=k(r)&&k(r.data)?r.data:null,i=Array.isArray(o?.views)?Uy(o.views):[];if(i.length>0)return i;try{let s=await v0(t,e,n);return s.length>0&&m.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 m.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(zy,"fetchViews");async function v0(t,e,n){let r=await t.runJson(["aitable","table","get","--base-id",e]),o=k(r)&&k(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 Uy(c)}a(v0,"fetchViewsFromTableList");function Uy(t){return t.map(e=>{let n=e.viewType??e.type;return{...e,...n?{viewType:n}:{}}})}a(Uy,"normalizeViews");async function S0(t,e,n,r){return(await zy(t,e,n)).find(i=>String(i.viewName??"")===r)??null}a(S0,"fetchViewByName");async function _d(t,e,n,r){for(let o=0;o<vd;o++){let i=await S0(t,e,n,r);if(i)return i;o+1<vd&&Ny>0&&await Sd(Ny)}return null}a(_d,"fetchViewByNameWithRetry");function Ad(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(Ad,"resolveFieldIds");function Os(t){return Cd(t,["viewId","view_id"])||""}a(Os,"extractViewId");function Rd(t){return k(t)?t.success===!0?!0:k(t.data)?Rd(t.data):k(t.result)?Rd(t.result):!1:!1}a(Rd,"hasSuccessSignal");function Cd(t,e){if(Array.isArray(t)){for(let n of t){let r=Cd(n,e);if(r)return r}return null}if(!k(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=Cd(n,e);if(r)return r}return null}a(Cd,"findStringByKeys");function x0(t){let e=t.replace(/\s+/g," ").trim();return e.length<=180?e:`${e.slice(0,177)}...`}a(x0,"summarizeWarningReason");import{readFile as Vy,writeFile as Ky}from"fs/promises";import Ed from"yaml";var R0=/^workflow:([A-Za-z0-9_-]+)\.tracker$/,js=15;async function Dd(t){let{workflowFilePath:e,recipeDir:n,workflow:r,settings:o,profile:i,dwsRunner:s,onProgress:c,workflowTrackers:l}=t,d=await Vy(e,"utf8"),u=Ed.parse(d);if(!k(u))return 0;M0(u,l,i?.config);let f=Array.isArray(u.event_sources)?u.event_sources:[],p=Array.isArray(u.steps)?u.steps:[],g=[],h=new ae({bin:o.tracker.dws_bin,timeoutMs:9e4,runner:s}),y=await pi({workflow:r,rawYaml:u,recipeDir:n,relPath:e,profile:i?{file:i.filePath,workflowId:i.workflowId,config:i.config}:void 0,onDefinitionLoadFailure:a((R,S)=>{throw new Error(`setup \u65E0\u6CD5\u52A0\u8F7D ${R}: ${S.message}`)},"onDefinitionLoadFailure")}),w=new Map(y.map(R=>[R.key,R]));for(let R of y){let S=P0(R);if(!S)continue;let{kind:C,path:_}=S,A=C==="eventSource"?C0(f,S):I0(p,S),T=C==="eventSource"?T0(i?.config,S.srcName):(S.stepId?i?.config.steps?.[S.stepId]:void 0)??{},I=vn(A,_),x=vn(T,_),D=k(x)?{...k(I)?I:{},...x}:k(I)?I:{};if(k(D.baseId)||k(D.tableId)){await c?.(`\u8DF3\u8FC7\u5F15\u7528\u8868\u300C${qy(R,_)}\u300D\uFF08workflow ref\uFF0C\u8FD0\u884C\u65F6\u89E3\u6790\uFF09`);continue}let j=typeof D.tableId=="string"?D.tableId.trim():"",L=w.get(R.key.replace(/\.tableId$/,".baseId")),W=_0(D,L,o),V=qy(R,_);if(j){await Hy(h,{baseId:W,tableId:j,name:V,setup:R.setup,onProgress:c});continue}await c?.(`\u6B63\u5728\u521B\u5EFA\u8F85\u52A9\u8868\u300C${V}\u300D`);let ue=await A0(h,{baseId:W,name:V,setup:R.setup,onProgress:c}),oe=S.inProfile;g.push({target:oe?"profile":"workflow",basePath:S.basePath,baseId:W,tableId:ue}),await c?.(`\u5DF2\u521B\u5EFA\u8F85\u52A9\u8868\u300C${V}\u300D: ${ue}`)}if(g.length===0)return 0;let b=g.filter(R=>R.target==="workflow"),v=g.filter(R=>R.target==="profile");if(b.length>0){let R=Ed.parseDocument(d);for(let S of b)R.setIn([...S.basePath,"mode"],"owned"),R.setIn([...S.basePath,"baseId"],S.baseId),R.setIn([...S.basePath,"tableId"],S.tableId);await Ky(e,R.toString(),"utf8")}if(v.length>0&&i){let R=await Vy(i.filePath,"utf8"),S=Ed.parseDocument(R);for(let C of v)S.setIn([...C.basePath,"mode"],"owned"),S.setIn([...C.basePath,"baseId"],C.baseId),S.setIn([...C.basePath,"tableId"],C.tableId);await Ky(i.filePath,S.toString(),"utf8")}return g.length}a(Dd,"setupSurfaceTables");function C0(t,e){let n;return e.idx!==void 0?n=k(t[e.idx])?t[e.idx]:void 0:e.srcName&&(n=t.find(r=>k(r)&&r.name===e.srcName)),n&&k(n.handler_config)?n.handler_config:{}}a(C0,"findEventSourceContainer");function I0(t,e){let n;return e.idx!==void 0?n=k(t[e.idx])?t[e.idx]:void 0:e.stepId&&(n=t.find(r=>k(r)&&r.id===e.stepId)),n&&k(n.config)?n.config:{}}a(I0,"findStepContainer");function T0(t,e){if(!t||!e)return{};let n=t.event_sources?.[e];if(!n)return{};let r=n.handler_config;return k(r)?r:{}}a(T0,"profileHandlerConfig");function _0(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(_0,"resolveSurfaceTableRefBaseId");async function A0(t,e){let n=e.setup?.tableSchema?.fields??[],{tableId:r,reused:o}=await ls(t,{baseId:e.baseId,name:e.name,fields:D0(e.setup).slice(0,js),onProgress:e.onProgress});if(o)return await Hy(t,{baseId:e.baseId,tableId:r,name:e.name,setup:e.setup,onProgress:e.onProgress}),r;let i=n.slice(js);return i.length>0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5269\u4F59\u5B57\u6BB5: ${i.map(s=>s.name).join(", ")}`),await Jy(t,{baseId:e.baseId,tableId:r,fields:i})),r}a(A0,"createSurfaceTable");async function Hy(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 ct(t,e.baseId,e.tableId),o=new Map(r.map(l=>[l.fieldName,l])),i=[];for(let l of n){let d=o.get(l.name);d&&(E0(l.type,d.type)||i.push(`\u300C${l.name}\u300D\u58F0\u660E\u4E3A ${l.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${d.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(i.length>0)throw new Error(`\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${i.join("; ")}`);let s=new Set(r.map(l=>l.fieldName)),c=n.filter(l=>!s.has(l.name));c.length!==0&&(await e.onProgress?.(`\u6B63\u5728\u8865\u9F50\u8F85\u52A9\u8868\u300C${e.name}\u300D\u5B57\u6BB5: ${c.map(l=>l.name).join(", ")}`),await Jy(t,{baseId:e.baseId,tableId:e.tableId,fields:c}))}a(Hy,"ensureSurfaceTableSchema");function E0(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(E0,"isSurfaceFieldTypeCompatible");async function Jy(t,e){for(let n=0;n<e.fields.length;n+=js){let r=e.fields.slice(n,n+js);await t.runJson(["aitable","field","create","--base-id",e.baseId,"--table-id",e.tableId,"--fields",JSON.stringify($0(r)),"--timeout","60","--yes"],{timeoutMs:9e4})}}a(Jy,"createSurfaceFields");function D0(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(D0,"buildCreateFields");function P0(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(P0,"parseTableIdSurface");function qy(t,e){let n=t.setup?.tableName?.trim();return n||t.label.replace(/ 的 Table ID.*/,"")||e.join(".")}a(qy,"tableNameFromSurface");function $0(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($0,"buildFieldCreateFields");function M0(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=k(r[o])?r[o]:{};if(i.type!=="aitable_record")continue;let s=k(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(!k(p)||p.mode!=="reference")continue;let g=typeof p.ref=="string"?p.ref.trim():"",h=R0.exec(g);if(!h)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u683C\u5F0F\u65E0\u6548\uFF08\u5F53\u524D: ${g||"\u7A7A"}\uFF09\uFF0C\u5E94\u4E3A workflow:<workflowId>.tracker`);let y=h[1],w=e.get(y);if(!w)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u4E0D\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300D`);if(!w.base_id||!w.table_id)throw new Error(`\u4E8B\u4EF6\u6E90[${o}] source_table.ref \u5F15\u7528\u7684\u5DE5\u4F5C\u6D41\u300C${y}\u300Dtracker \u672A\u914D\u7F6E\u5B8C\u6574\uFF08base_id/table_id \u4E3A\u7A7A\uFF09`)}}a(M0,"validateSourceTableReferences");import{existsSync as O0,readdirSync as j0,readFileSync as F0,writeFileSync as N0,unlinkSync as L0}from"fs";import Pd from"path";var Fs=15,W0=/^([A-Za-z][A-Za-z0-9]*)_(.+)$/;function Gy(t){return`https://docs.dingtalk.com/i/nodes/${t.baseId}?iframeQuery=sheetId%3D${t.tableId}`}a(Gy,"tableUrl");function B0(t,e){return t.find(r=>r.fieldName===e)?.fieldId??null}a(B0,"resolveFieldId");function Qy(t){return t.includes("\u540D\u79F0\u91CD\u590D")||t.includes("\u5DF2\u5B58\u5728")||t.includes("already exist")||t.includes("duplicate")}a(Qy,"isAlreadyExists");async function z0(t,e,n){let r=new Map;try{let o=await t.runJson(["aitable","workflow","list","--base-id",e,"--yes"],{timeoutMs:3e4}),i=k(o)&&k(o.data)&&Array.isArray(o.data.list)?o.data.list:[];for(let s of i){if(!k(s))continue;let c=typeof s.name=="string"?s.name:"",l=typeof s.flowId=="string"?s.flowId:typeof s.workflowId=="string"?s.workflowId:"";c&&l&&r.set(c,l)}}catch(o){n?.(`\u5217\u51FA\u5DF2\u6709\u6D41\u7A0B\u5931\u8D25\uFF0C\u9000\u5316\u4E3A\u53EA create: ${o instanceof Error?o.message:String(o)}`)}return r}a(z0,"listExistingFlows");function U0(t){let e=k(t)&&k(t.data)?t.data:k(t)?t:null;if(!e||e.valid!==!1)return null;let r=(Array.isArray(e.issues)?e.issues:[]).filter(k).map(o=>{let i=typeof o.path=="string"?o.path:"",s=typeof o.message=="string"?o.message:String(o.code??"\u672A\u77E5\u95EE\u9898");return i?`${i}: ${s}`:s});return r.length>0?`DSL \u6821\u9A8C\u5931\u8D25 \u2014 ${r.join("; ")}`:"DSL \u6821\u9A8C\u5931\u8D25\uFF08\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u5177\u4F53\u539F\u56E0\uFF09"}a(U0,"extractValidationError");function Zy(t,e,n){let r=n?t.filter(o=>o.fieldName===n):t;for(let o of r){if(!o.options.length)continue;let i=o.options.find(s=>s.name===e);if(i)return i.id}return null}a(Zy,"resolveOptionId");function V0(t){let e=new Map,n=[];if(!k(t))return{decls:e,errors:n};for(let[r,o]of Object.entries(t)){if(!k(o)){n.push(`_tables.${r} \u5FC5\u987B\u662F\u5BF9\u8C61`);continue}if(o.ref==="tracker"){e.set(r,{ref:"tracker"});continue}let i=typeof o.name=="string"?o.name.trim():"";if(!i){n.push(`_tables.${r} \u9700\u8981 name\uFF08\u8868\u540D\uFF09\u6216 ref: "tracker"`);continue}e.set(r,{name:i,fields:K0(o.fields,r,n)})}return{decls:e,errors:n}}a(V0,"parseTableDecls");function K0(t,e,n){if(t===void 0)return[];if(!Array.isArray(t))return n.push(`_tables.${e}.fields \u5FC5\u987B\u662F\u6570\u7EC4`),[];let r=[];for(let o of t){if(!k(o))continue;let i=typeof o.name=="string"?o.name.trim():"",s=typeof o.type=="string"?o.type.trim():"";if(!i||!s){n.push(`_tables.${e}.fields \u4E2D\u6709\u6761\u76EE\u7F3A\u5C11 name \u6216 type`);continue}let c={name:i,type:s};Array.isArray(o.options)&&(c.options=o.options.map(l=>String(l))),k(o.config)&&(c.config=o.config),r.push(c)}return r}a(K0,"parseDeclFields");async function q0(t){let{dws:e,baseId:n,tracker:r,decls:o,cache:i,onProgress:s}=t,c=new Map,l=[];for(let[d,u]of o){if("ref"in u){c.set(d,r);continue}let f=`${n}::${u.name}`,p=i.get(f);if(p){c.set(d,p);continue}try{let g=await H0(e,{baseId:n,name:u.name,fields:u.fields??[],onProgress:s});i.set(f,g),c.set(d,g)}catch(g){l.push(`\u4F9D\u8D56\u8868\u300C${u.name}\u300D\u51C6\u5907\u5931\u8D25: ${g instanceof Error?g.message:String(g)}`)}}return{tables:c,errors:l}}a(q0,"resolveDeclaredTables");async function H0(t,e){let{baseId:n,name:r,fields:o,onProgress:i}=e,{tableId:s,reused:c}=await ls(t,{baseId:n,name:r,fields:Z0(o).slice(0,Fs),onProgress:i});if(c)await J0(t,{baseId:n,tableId:s,name:r,fields:o,onProgress:i});else{i?.(`\u81EA\u52A8\u5316\u4F9D\u8D56\u8868\u300C${r}\u300D: \u5DF2\u521B\u5EFA ${s}`);let l=o.slice(Fs);l.length>0&&(i?.(`\u6B63\u5728\u8865\u9F50\u4F9D\u8D56\u8868\u300C${r}\u300D\u5269\u4F59\u5B57\u6BB5: ${l.map(d=>d.name).join(", ")}`),await Xy(t,n,s,l))}return{baseId:n,tableId:s,label:r,fields:await Ql(t,n,s)}}a(H0,"ensureDeclaredTable");async function J0(t,e){if(e.fields.length===0)return;let n=await ct(t,e.baseId,e.tableId),r=new Map(n.map(c=>[c.fieldName,c])),o=[];for(let c of e.fields){let l=r.get(c.name);l&&(G0(c.type,l.type)||o.push(`\u300C${c.name}\u300D\u58F0\u660E\u4E3A ${c.type}\uFF0C\u4F46\u8868\u4E2D\u5DF2\u662F ${l.type}\uFF0C\u9700\u624B\u52A8\u6539\u7C7B\u578B\u6216\u5220\u8868\u91CD\u5EFA`))}if(o.length>0)throw new Error(`\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u5B57\u6BB5\u7C7B\u578B\u51B2\u7A81: ${o.join("; ")}`);let i=new Set(n.map(c=>c.fieldName)),s=e.fields.filter(c=>!i.has(c.name));s.length!==0&&(e.onProgress?.(`\u6B63\u5728\u4E3A\u4F9D\u8D56\u8868\u300C${e.name}\u300D\u8865\u9F50\u5B57\u6BB5: ${s.map(c=>c.name).join(", ")}`),await Xy(t,e.baseId,e.tableId,s))}a(J0,"ensureFields");function G0(t,e){return t===e||t==="text"&&e==="primaryDoc"}a(G0,"isFieldTypeCompatible");async function Xy(t,e,n,r){for(let o=0;o<r.length;o+=Fs)await t.runJson(["aitable","field","create","--base-id",e,"--table-id",n,"--fields",JSON.stringify(r.slice(o,o+Fs).map(ew)),"--timeout","60","--yes"],{timeoutMs:9e4})}a(Xy,"createFields");function Z0(t){return t.length===0?[{fieldName:"\u6807\u9898",type:"primaryDoc"}]:t.map((e,n)=>{let r=ew(e);return n===0&&e.type==="text"&&(r.type="primaryDoc"),r})}a(Z0,"buildCreateFields");function ew(t){let e={fieldName:t.name,type:t.type},n={...t.config??{}};return(t.type==="singleSelect"||t.type==="multipleSelect")&&t.options?.length&&(n.options=t.options.map(r=>({name:r}))),Object.keys(n).length>0&&(e.config=n),e}a(ew,"fieldPayload");function Y0(t,e,n=new Map){let r=[],o=new Set,i=a(c=>{o.has(c)||(o.add(c),r.push(c))},"fail");return{resolved:t.replace(/<([^<>]+)>/g,(c,l)=>{if(l==="sheetId")return e.tableId;if(l==="table_url")return Gy(e);for(let[d,u]of[["_sheetId",f=>f.tableId],["_table_url",f=>Gy(f)]]){if(!l.endsWith(d))continue;let f=l.slice(0,-d.length),p=n.get(f);return p?u(p):(i(`\u8868\u524D\u7F00\u300C${f}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),c)}if(l.endsWith("_fieldId")){let d=Yy(l.slice(0,-8),n,e,i);if(!d)return c;let u=B0(d.table.fields,d.rest);return u||(i(`\u5B57\u6BB5\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u4E0D\u5B58\u5728`),c)}if(l.endsWith("_optionId")){let d=Yy(l.slice(0,-9),n,e,i);if(!d)return c;let u=Q0(d.table,d.rest);return u||(i(`\u9009\u9879\u300C${d.rest}\u300D\u5728\u8868\u300C${d.table.label}\u300D\u4E2D\u672A\u627E\u5230`),c)}return c}),errors:r}}a(Y0,"resolvePlaceholders");function Yy(t,e,n,r){if(e.size===0)return{table:n,rest:t};let o=W0.exec(t);if(!o)return{table:n,rest:t};let[,i,s]=o,c=e.get(i);return c?{table:c,rest:s}:(r(`\u8868\u524D\u7F00\u300C${i}\u300D\u672A\u5728 _tables \u4E2D\u58F0\u660E`),null)}a(Yy,"locate");function Q0(t,e){let n=e.lastIndexOf("_");if(n>0){let r=Zy(t.fields,e.slice(n+1),e.slice(0,n));if(r)return r}return Zy(t.fields,e)}a(Q0,"resolveOptionIdFlexible");async function $d(t){let{configDir:e,baseId:n,tableId:r,dws:o,onProgress:i}=t,s=i??(()=>{}),c=Pd.resolve(e,"automations"),l={deployed:[],updated:[],skipped:[],failed:[]};if(!O0(c))return l;let d=j0(c).filter(g=>g.endsWith(".json"));if(d.length===0)return l;s(`\u53D1\u73B0 ${d.length} \u4E2A\u81EA\u52A8\u5316 DSL \u6587\u4EF6`);let u={baseId:n,tableId:r,label:"\u5DE5\u4F5C\u6D41\u8BB0\u5F55\u8868",fields:await Ql(o,n,r)};s(`\u5DF2\u83B7\u53D6\u8868\u7ED3\u6784: ${u.fields.length} \u4E2A\u5B57\u6BB5`);let f=new Map,p=await z0(o,n,s);p.size>0&&s(`\u5DF2\u5217\u51FA ${p.size} \u4E2A\u5DF2\u6709\u6D41\u7A0B\uFF0C\u540C\u540D\u6D41\u7A0B\u5C06\u81EA\u52A8 update`);for(let g of d){let h=Pd.join(c,g),y;try{y=F0(h,"utf-8")}catch{l.failed.push({name:g,error:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25"});continue}let w;try{w=JSON.parse(y)}catch{l.failed.push({name:g,error:"JSON \u89E3\u6790\u5931\u8D25"});continue}let b=String(w.name??g),{decls:v,errors:R}=V0(w._tables);if(delete w._deploy_notes,delete w._tables,R.length>0){s(`\u8DF3\u8FC7 ${b}: ${R.join("; ")}`),l.skipped.push(b);continue}let{tables:S,errors:C}=await q0({dws:o,baseId:n,tracker:u,decls:v,cache:f,onProgress:i});if(C.length>0){s(`\u8DF3\u8FC7 ${b}: ${C.join("; ")}`),l.skipped.push(b);continue}let _=JSON.stringify(w,null,2),{resolved:A,errors:T}=Y0(_,u,S);if(T.length>0){s(`\u8DF3\u8FC7 ${b}: ${T.join("; ")}`),l.skipped.push(b);continue}if(A.includes("<")&&/<[^>]+>/.test(A)){let x=A.match(/<[^>]+>/g)??[];s(`\u8DF3\u8FC7 ${b}: \u4ECD\u6709\u672A\u89E3\u6790\u5360\u4F4D\u7B26 ${x.slice(0,3).join(", ")}`),l.skipped.push(b);continue}let I=Pd.join(c,`.${g}.resolved.tmp`);N0(I,A,"utf-8");try{await X0({dws:o,baseId:n,dslName:b,tmpFile:I,existing:p,result:l,log:s})}catch(x){let D=x instanceof Error?x.message:String(x);Qy(D)?(s(`\u8DF3\u8FC7 ${b}\uFF08\u5DF2\u5B58\u5728\uFF0Clist \u672A\u547D\u4E2D\u4F46 create \u62A5\u91CD\u540D\uFF09`),l.skipped.push(b)):(s(`\u90E8\u7F72\u5931\u8D25 ${b}: ${D}`),l.failed.push({name:b,error:D}))}finally{try{L0(I)}catch{}}}return l}a($d,"setupAutomations");async function X0(t){let{dws:e,baseId:n,dslName:r,tmpFile:o,existing:i,result:s,log:c}=t,l=i.get(r),d=l?["aitable","workflow","update","--base-id",n,"--workflow-id",l,"--dsl",`@${o}`]:["aitable","workflow","create","--base-id",n,"--dsl",`@${o}`],u=await e.runJson(d,{timeoutMs:6e4}),f=U0(u);if(f){if(Qy(f)){c(`\u8DF3\u8FC7 ${r}\uFF08\u540C\u540D\u5DF2\u5B58\u5728\uFF0Cupdate \u4ECD\u62A5\u91CD\u590D\uFF09`),s.skipped.push(r);return}c(`${l?"\u66F4\u65B0":"\u90E8\u7F72"}\u5931\u8D25 ${r}: ${f}`),s.failed.push({name:r,error:f});return}l?(c(`\u5DF2\u66F4\u65B0: ${r}`),s.updated.push(r),i.delete(r)):(c(`\u5DF2\u90E8\u7F72: ${r}`),s.deployed.push(r))}a(X0,"publishFlow");async function r$(t){let{configPath:e,settings:n,onProgress:r}=t,o=n.tracker.base_id?.trim();if(o&&o!=="__placeholder__")return{baseId:o,created:!1};if(n.multiWorkflow){let u=await s$(n);if(u)return await tw(n,u),await r?.(`\u590D\u7528 workflow.yml \u5DF2\u58F0\u660E\u7684 AI \u8868\u683C\uFF1A${u}`,"create_base"),{baseId:u,created:!1}}let i=tr.dirname(await Te(e)),s=o$(n.raw?.base_name??tr.basename(i)),c=new ae({bin:n.tracker.dws_bin,timeoutMs:6e4});await r?.(`tracker.base_id \u4E3A\u7A7A\uFF0C\u6B63\u5728\u300C\u6211\u7684\u6587\u6863\u300D\u521B\u5EFA AI \u8868\u683C\uFF1A${s}`,"create_base");let l=await c.runJson(["aitable","base","create","--name",s,"--yes"],{timeoutMs:9e4}),d=i$(l);if(!d)throw Object.assign(new Error("dws \u521B\u5EFA AI \u8868\u683C\u672A\u8FD4\u56DE baseId"),{code:"BASE_ID_NOT_RETURNED",details:{response:l}});return await r?.(`AI \u8868\u683C\u5DF2\u521B\u5EFA\uFF1A${d}`,"create_base"),await tw(n,d,{clearStaleTableIds:!0}),{baseId:d,created:!0}}a(r$,"ensureBaseExists");function o$(t){return t.replace(/[\\/:*?"<>|]/g,"-").trim()||"AI \u8868\u683C\u5DE5\u4F5C\u6D41"}a(o$,"sanitizeBaseName");function i$(t){if(k(t)){let e=t.data;if(k(e)){let n=e.baseId??e.base_id??e.id;if(typeof n=="string"&&n.trim())return n.trim()}}return null}a(i$,"findBaseId");async function s$(t){for(let e of t.workflowEntries)try{let n=ow.parse(await rw(e.templatePath,"utf8")),r=k(n?.tracker)?n.tracker:null,o=typeof r?.base_id=="string"?r.base_id.trim():"";if(o&&o!=="__placeholder__")return o}catch{}return null}a(s$,"findBaseIdInWorkflows");async function tw(t,e,n){let r=n?.clearStaleTableIds===!0;if(!t.multiWorkflow){let i=await Te(t.configDir);await nw(i,e,r);return}let o=new Set;for(let i of t.workflowEntries)o.has(i.templatePath)||(o.add(i.templatePath),await nw(i.templatePath,e,r))}a(tw,"writeBaseIdToWorkflows");async function nw(t,e,n){if(!n){await zi(t,["tracker","base_id"],e);return}let r="";try{r=await rw(t,"utf8")}catch{}let o=ow.parseDocument(r);o.setIn(["tracker","base_id"],e),o.getIn(["tracker","table_id"])!==void 0&&o.setIn(["tracker","table_id"],""),await t$(t,o.toString(),"utf8")}a(nw,"writeBaseIdWithOptionalTableClear");async function cY(t){let e=await _e(t.config,{lenientEnv:!0}),n=await Te(t.config),{baseId:r}=await r$({configPath:t.config,settings:e,onProgress:a(f=>console.log(` \u2022 ${f}`),"onProgress")});e.tracker.base_id!==r&&(e=await _e(t.config,{lenientEnv:!0}));let o=[];for(let f of e.workflowEntries){let p=await st(f.templatePath,{envSource:e.envSource}),g=e.tracker.base_id==="__placeholder__"?void 0:e.tracker,h=g??p.tracker;if(!h)throw new Error(`\u5DE5\u4F5C\u6D41\u300C${f.id}\u300D\u7F3A\u5C11 tracker \u914D\u7F6E\uFF08config.yml \u4E0E workflow.yml \u5747\u672A\u63D0\u4F9B\uFF09`);let y=g?n:f.templatePath;o.push({entry:f,workflow:p,trackerConfig:h,trackerFilePath:y})}let i=new Map,s=new Set;for(let f of o){console.log(`
|
|
617
|
+
\u25B6 \u521D\u59CB\u5316\u5DE5\u4F5C\u6D41\u300C${f.entry.id}\u300D\uFF08${f.workflow.meta.name}\uFF09`);let p=En(e,f.entry,f.trackerConfig);p.tracker.table_id.trim()||s.add(f.entry.id),p=await Ol({trackerFilePath:f.trackerFilePath,settings:p,workflow:f.workflow,onProgress:a(g=>console.log(` \u2022 ${g}`),"onProgress")}),i.set(f.entry.id,p)}let c=new Map;for(let f of o){let p=i.get(f.entry.id);c.set(f.entry.id,{base_id:p.tracker.base_id,table_id:p.tracker.table_id})}let l=new Map;for(let f of o){let p=i.get(f.entry.id),{base_id:g,table_id:h}=p.tracker;if(g&&h){let y=new ae({bin:p.tracker.dws_bin});await Kr(y,g,h,l)}}pn();let d=Xe(e.configDir,e.envSource),u=tr.resolve(e.configDir,"profile","profile.yml");for(let f of o){let p=i.get(f.entry.id),g=d?.workflows?.[f.entry.id],h=await Dd({workflowFilePath:f.entry.templatePath,recipeDir:f.entry.recipeDir,workflow:f.workflow,settings:p,profile:g?{filePath:u,workflowId:f.entry.id,config:g}:void 0,workflowTrackers:c,onProgress:a(y=>console.log(` \u2022 ${y}`),"onProgress")});h>0&&console.log(` \u2022 \u5DF2\u81EA\u52A8\u521B\u5EFA ${h} \u4E2A\u8F85\u52A9\u8868`)}for(let f of o){let p=i.get(f.entry.id);await Td({settings:p,workflow:f.workflow,cleanEmptyRows:t.clean!==!1,tableJustCreated:s.has(f.entry.id)})}for(let f of o){let p=i.get(f.entry.id),{base_id:g,table_id:h,dws_bin:y}=p.tracker;if(!g||!h)continue;let w=tr.dirname(f.entry.templatePath),b=new ae({bin:y}),v=await $d({configDir:w,baseId:g,tableId:h,dws:b,onProgress:a(S=>console.log(` \u2022 ${S}`),"onProgress")});v.deployed.length+v.skipped.length+v.failed.length>0&&console.log(` \u2022 \u81EA\u52A8\u5316: ${v.deployed.length} \u90E8\u7F72, ${v.skipped.length} \u8DF3\u8FC7, ${v.failed.length} \u5931\u8D25`)}if(t.kb!==!1){await a$(e.configDir);try{let f=await Al({settings:e,...t.kbFull?{force:!0}:{},onProgress:Zl});Yl(f)}catch(f){if(f instanceof Hn)throw f;console.log(`\u26A0 \u77E5\u8BC6\u5E93\u7F16\u8BD1\u8DF3\u8FC7\uFF08\u975E\u81F4\u547D\uFF09: ${f instanceof Error?f.message:String(f)}`)}}}a(cY,"runSetupCommand");async function a$(t){let e=tr.resolve(t,"lib","assemble.ts");if(e$(e))try{let n=await import(n$(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=>tr.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(a$,"runEnsureAssembled");import{mkdir as iw,readFile as c$,writeFile as sw}from"fs/promises";import aw from"path";import Md from"yaml";async function vY(t,e){let n=[],r=e.filter(d=>d.name?.trim()&&d.persona?.trim());if(r.length===0)return{written:!1,profilePath:t,roleIds:[],skippedKnowledgeBindings:n};let o=await c$(t,"utf8").then(d=>{try{return Md.parse(d)}catch{return}},()=>{}),i=k(o)?{...o}:{},s=k(i.roles)?{...i.roles}:{},c=[],l=new Set;for(let d of r){let u=Od(d.id||d.name),f=u;for(let p=2;l.has(f);p++)f=`${u}-${p}`;l.add(f),s[f]={name:d.name.trim(),persona:d.persona.trim()},c.push(f),d.knowledge&&d.knowledge.length>0&&n.push({roleId:f,knowledge:d.knowledge})}return i.schema_version=2,i.roles=s,await iw(aw.dirname(t),{recursive:!0}),await sw(t,Md.stringify(i),"utf8"),{written:!0,profilePath:t,roleIds:c,skippedKnowledgeBindings:n}}a(vY,"writeProfileRoles");async function SY(t,e){await iw(t,{recursive:!0});let n=[],r=[];for(let o of e){let i=l$(o),s=aw.join(t,`${i.id}.role.yml`),c=Md.stringify(i);await sw(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(SY,"writeRoleDefinitions");function l$(t){let e={id:Od(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:Od(n),name:n,description:""}))};return kr.parse(e)}a(l$,"toRoleDefinition");function Od(t){return t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"role"}a(Od,"safeId");function cw(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=d$(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(cw,"buildDriftReport");function d$(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(d$,"extractAllStates");import{readdir as u$,readFile as f$}from"fs/promises";import p$ from"path";async function lw(t,e){if(e.length===0)return[];let n=[],r;try{r=await u$(t)}catch{return[]}let o=r.filter(i=>i.endsWith(".recipe.ts")||i.endsWith(".ts"));for(let i of o){let s=p$.join(t,i),c;try{c=await f$(s,"utf8")}catch{continue}let l=c.split(`
|
|
618
|
+
`);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(lw,"scanRecipeImpact");async function LY(t){let{configPath:e}=t;m.info("sync","\u52A0\u8F7D\u914D\u7F6E",{configPath:e});let n=await _e(e),r=await st(n.workflowTemplatePath,{envSource:n.envSource}),{base_id:o,table_id:i}=n.tracker,s=new ae({bin:n.tracker.dws_bin});m.info("sync","\u6821\u9A8C recipe schema \u4E0E workflow steps \u5BF9\u9F50");let{issues:c}=await ci(n.recipeDir,r);g$(c);let l=n.tracker.field_definitions?n.tracker.field_definitions.map(g=>({name:g.name,type:g.type,...g.options?{options:g.options}:{}})):[];m.info("sync","L0 \u8BCA\u65AD\uFF1A\u68C0\u6D4B\u914D\u7F6E\u4E0E\u8868\u7684\u504F\u5DEE");let d=await ct(s,o,i),u=cw(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(`
|
|
617
619
|
\u26A0 \u68C0\u6D4B\u5230\u914D\u7F6E\u504F\u5DEE\uFF1A
|
|
618
|
-
`);for(let g of u.items)
|
|
620
|
+
`);for(let g of u.items)m$(g);let f=u.items.flatMap(g=>[...g.added,...g.removed]),p=await lw(n.recipeDir,f);if(p.length>0){console.log(`
|
|
619
621
|
\u26A0 \u53EF\u80FD\u53D7\u5F71\u54CD\u7684 Recipe \u6587\u4EF6\uFF1A
|
|
620
622
|
`);for(let g of p)console.log(` ${g.file}:${g.line} \u2014 \u5F15\u7528\u4E86 "${g.matchedValue}"`),console.log(` ${g.content}`)}return console.log(`
|
|
621
|
-
\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(
|
|
623
|
+
\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(LY,"runSync");function g$(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(`
|
|
622
624
|
\u26A0 Recipe schema \u6821\u9A8C\uFF1A${e.length} \u4E2A\u9519\u8BEF\uFF0C${n.length} \u4E2A\u8B66\u544A
|
|
623
|
-
`);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(
|
|
624
|
-
`)}a(
|
|
625
|
+
`);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(g$,"printRecipeIssues");function m$(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(m$,"printDriftItem");var dw=Object.freeze({faq:{compare:!0,extractTags:!1},methodology:{compare:!0,extractTags:!1},simple:{compare:!1,extractTags:!0}});function h$(t){return dw[t]}a(h$,"distillPresetSpec");function y$(t,e,n){if(t==="simple")return uw(e,n);throw new Error(`distill preset "${t}" \u7684\u84B8\u998F prompt \u7531\u5B8C\u6574\u7248\u5DE5\u4F5C\u6D41\u6A21\u677F\u627F\u8F7D\uFF0Ccore \u4EC5\u63D0\u4F9B simple preset`)}a(y$,"renderDistillPrompt");function uw(t,e){let n=t.categories.map(o=>`- ${o.id}${o.criteria?`\uFF1A${o.criteria}`:""}`),r=e?.fileOutput?["\u3010\u8F93\u51FA\u65B9\u5F0F\u3011\uFF08\u5FC5\u987B\u4E25\u683C\u9075\u5B88\uFF0C\u6B63\u6587\u4E0E manifest \u90FD\u4E0D\u8981\u51FA\u73B0\u5728\u56DE\u590D\u91CC\uFF09","1. \u5C06\u6BCF\u7BC7\u6587\u7AE0\u7684\u6B63\u6587\uFF08\u4EC5 Markdown \u6587\u672C\uFF0C\u4E0D\u542B\u6807\u9898/\u6458\u8981/\u5206\u7C7B\u7B49\u5143\u6570\u636E\uFF09\u5404\u5199\u4E3A\u4E00\u4E2A\u6587\u4EF6\uFF0C\u653E\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u7684 raw/ \u5B50\u76EE\u5F55\u4E0B\uFF0C\u6587\u4EF6\u540D\u4ECE article-01.md \u8D77\u4F9D\u5E8F\u7F16\u53F7\uFF08article-02.md\u3001article-03.md \u2026\uFF09","2. \u5168\u90E8\u6B63\u6587\u6587\u4EF6\u5199\u5165\u5B8C\u6210\u540E\uFF0C\u628A\u4EE5\u4E0B JSON\uFF08\u4E0D\u542B body\uFF09\u5199\u5165\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u7684 manifest.json \u6587\u4EF6\uFF1A","{",' "articles": [{ "file": "article-01.md", "title": "...", "summary": "...", "category": "...", "tags": ["..."] }],',' "tags": ["...", "..."]',"}","3. articles \u6761\u76EE\u987A\u5E8F\u4E0E\u6587\u4EF6\u7F16\u53F7\u4E00\u4E00\u5BF9\u5E94","4. manifest.json \u5199\u5165\u5B8C\u6210\u540E\uFF0C\u56DE\u590D\u53EA\u8F93\u51FA MANIFEST_WRITTEN \u8FD9\u4E00\u4E2A\u8BCD\uFF1B\u4E0D\u8981\u5728\u56DE\u590D\u91CC\u8F93\u51FA JSON\u3001\u89E3\u91CA\u6216\u4EFB\u4F55\u5176\u4ED6\u6587\u5B57"]:["5. \u4E25\u683C\u6309\u4EE5\u4E0B JSON \u8F93\u51FA\uFF0C\u4E0D\u8981\u8F93\u51FA\u5176\u4ED6\u4EFB\u4F55\u6587\u5B57\uFF1A","{",' "articles": [{ "title": "...", "summary": "...", "body": "...", "category": "...", "tags": ["..."] }],',' "tags": ["...", "..."]',"}"];return["\u4F60\u662F\u77E5\u8BC6\u84B8\u998F\u5F15\u64CE\u3002\u8BF7\u4ECE\u6E90\u5185\u5BB9\u4E2D\u63D0\u53D6\u77E5\u8BC6\u6587\u7AE0\u4E0E\u6761\u76EE\u7EA7\u6807\u7B7E\u3002","","\u3010\u5206\u7C7B\u4F53\u7CFB\u3011\uFF08\u6309\u6B64\u4E3A\u6587\u7AE0\u5206\u7C7B\uFF0Ccategory \u53EA\u80FD\u53D6\u4EE5\u4E0B\u5176\u4E00\uFF09",...n,"","\u3010\u8981\u6C42\u3011","1. \u6309\u5185\u5BB9\u8FB9\u754C\u62C6\u5206\u4E3A\u4E00\u7BC7\u6216\u591A\u7BC7\u6587\u7AE0\uFF0C\u6BCF\u7BC7\u5305\u542B\uFF1Atitle\uFF08\u6807\u9898\uFF09\u3001summary\uFF082-3 \u53E5\u6458\u8981\uFF09\u3001body\uFF08Markdown \u6B63\u6587\uFF09\u3001category\uFF08\u4E0A\u8FF0\u5206\u7C7B id \u5176\u4E00\uFF09\u3001tags\uFF082-5 \u4E2A\u5173\u952E\u8BCD\uFF09","2. \u540C\u65F6\u63D0\u53D6 2-5 \u4E2A\u4EE3\u8868\u6574\u4EFD\u5185\u5BB9\u7684\u5173\u952E\u8BCD\u4F5C\u4E3A\u6761\u76EE\u7EA7 tags","3. \u5FE0\u5B9E\u6E90\u6750\u6599\uFF1A\u4E0D\u8981\u6DFB\u52A0\u6E90\u5185\u5BB9\u4E2D\u4E0D\u5B58\u5728\u7684\u4E8B\u5B9E\u6216\u7ED3\u8BBA","4. \u65E0\u9700\u4E0E\u5B58\u91CF\u77E5\u8BC6\u6BD4\u5BF9\uFF0C\u76F4\u63A5\u4EA7\u51FA\u65B0\u6587\u7AE0",...r].join(`
|
|
626
|
+
`)}a(uw,"renderSimpleDistillPrompt");var fw=/^\s*--\s*(\d+)\s+of\s+(\d+)\s*--\s*$/gm;function pw(t){let e=0;for(let n of String(t??"").matchAll(fw)){let r=Number(n[2]);Number.isFinite(r)&&r>e&&(e=r)}return e}a(pw,"extractPdfPageCount");function gw(t){return String(t??"").replace(fw,"")}a(gw,"stripPdfSeparators");function w$(t,e={}){let n=e.minTextChars??40,r=e.sparseCharsPerPage??300,o=pw(t),i=gw(t).replace(/\s+/g,"").length;if(o===0)return{tier:"text",pageCount:0,netChars:i,charsPerPage:0};let s=i/o;return{tier:i<n?"empty":s<r?"sparse":"text",pageCount:o,netChars:i,charsPerPage:Math.round(s*10)/10}}a(w$,"assessPdfDensity");function b$(t){let e=t.tier==="empty"?"\u626B\u63CF\u7248 PDF\uFF08\u65E0\u6587\u5B57\u5C42\uFF0C\u9700\u8981\u5B8C\u5168\u4F9D\u9760\u89C6\u89C9\u8BFB\u53D6\u9875\u9762\u56FE\u50CF\uFF09":"\u56FE\u7247\u91CD\u578B PDF\uFF08\u6587\u5B57\u5C42\u53EA\u6709\u6807\u9898/\u6807\u7B7E\u7B49\u7A00\u758F\u788E\u7247\uFF0C\u6838\u5FC3\u5185\u5BB9\u5728\u56FE\u793A\u4E0E\u6807\u6CE8\u91CC\uFF09",n=t.maxPages&&t.maxPages>0?`
|
|
625
627
|
- \u53EA\u5904\u7406\u524D ${t.maxPages} \u9875\uFF1B\u8D85\u51FA\u7684\u9875\u8DF3\u8FC7\u5E76\u5728\u4EA7\u7269\u672B\u5C3E\u6CE8\u660E\u300C\u7B2C N \u9875\u8D77\u672A\u5904\u7406\u300D\u3002`:"";return["\u3010\u4EFB\u52A1\uFF1APDF \u89C6\u89C9\u6807\u51C6\u5316\u3011",`\u672C\u6765\u6E90\u662F${e}\uFF0C\u5171 ${t.pageCount} \u9875\u3002`,`PDF \u539F\u4EF6\u8DEF\u5F84\uFF1A${t.pdfPath}`,"","\u8BF7\u7528\u4F60\u7684 PDF \u5904\u7406\u80FD\u529B\uFF08\u5982\u5185\u7F6E pdf skill\uFF09\u5B8C\u6210\uFF1A","1. \u5C06 PDF \u9875\u9762\u6E32\u67D3\u4E3A\u56FE\u7247\uFF08\u9010\u9875\uFF09\uFF1B","2. \u89C6\u89C9\u8BFB\u53D6\u6BCF\u9875\u56FE\u50CF\u5185\u5BB9\uFF1B",t.tier==="sparse"?"3. \u5F53\u524D\u76EE\u5F55\u5DF2\u6709 pdf-parse \u62BD\u51FA\u7684\u6587\u5B57\u5C42\u788E\u7247\uFF08.md \u6587\u4EF6\uFF0C\u542B\u300C-- n of m --\u300D\u9875\u5206\u9694\u7B26\uFF09\uFF0C\u6309\u9875\u7801\u4E0E\u89C6\u89C9\u5185\u5BB9\u5BF9\u7167\u5408\u5E76\uFF1B":"3. \u6309\u9875\u5E8F\u628A\u89C6\u89C9\u8BFB\u53D6\u7684\u5185\u5BB9\u8F6C\u5199\u4E3A Markdown\uFF1B","4. \u5C06\u5408\u5E76\u540E\u7684\u5B8C\u6574\u6807\u51C6\u5316 Markdown \u5199\u5165\u5F53\u524D\u76EE\u5F55\u7684 vision-normalized.md\u3002",n,"","\u8981\u6C42\uFF1A","- \u6570\u5B57\u3001\u5C3A\u5BF8\u3001\u8868\u683C\u6570\u636E\u4E25\u683C\u6309\u56FE\u9762\u5982\u5B9E\u8F6C\u5199\uFF0C\u4E0D\u5F97\u7F16\u9020\u6216\u81C6\u6D4B\uFF1B","- \u4FDD\u6301\u9875\u5E8F\u7ED3\u6784\uFF08\u53EF\u7528\u300C## \u7B2C N \u9875\u300D\u5206\u8282\uFF09\uFF1B","- \u82E5\u4F60\u7684\u73AF\u5883\u65E0\u6CD5\u6E32\u67D3\u6216\u8BFB\u53D6 PDF \u56FE\u50CF\uFF0C\u4E0D\u8981\u4EA7\u51FA\u6587\u4EF6\uFF0C\u76F4\u63A5\u5728\u56DE\u590D\u4E2D\u8BF4\u660E\u539F\u56E0\u3002","","\u5B8C\u6210\u540E\u53EA\u56DE\u590D\u4E00\u53E5\u786E\u8BA4\uFF08\u5982\u300C\u89C6\u89C9\u6807\u51C6\u5316\u5B8C\u6210\u300D\uFF09\uFF0C\u4E0D\u8981\u5728\u804A\u5929\u4E2D\u5185\u8054\u6B63\u6587\u3002"].join(`
|
|
626
|
-
`)}a(
|
|
627
|
-
`)}a(
|
|
628
|
-
`)){let r=n.trim();r.startsWith("|")&&(/^\|[\s:|-]+\|?$/.test(r)||(e+=1))}return Math.max(0,e-1)}a(
|
|
629
|
-
`);for(let g of d)p.includes(g)||c("index-missing-card",`cards/**/${g}.md`,"\u5361\u7247\u672A\u88AB\u4EFB\u4F55\u7D22\u5F15\u5217\u5230\uFF0C\u7B49\u4E8E\u8FD9\u6761\u77E5\u8BC6\u4E0D\u5B58\u5728")}return{issues:o,counts:i,checkedCards:l.length,indexEntries:s}}a(
|
|
630
|
-
`)}a(k$,"formatArtifactLint");import{createHash as v$}from"crypto";var S$=1,x$=1;function R$(t){return JSON.stringify(t,(e,n)=>n===null||typeof n!="object"||Array.isArray(n)?n:Object.fromEntries(Object.entries(n).sort(([r],[o])=>r.localeCompare(o))))}a(R$,"canonicalJson");function fw(t){return v$("sha256").update(R$(t)).digest("hex")}a(fw,"hashCanonical");function T5(t){return fw({contractVersion:S$,targetCollection:t.targetCollection,sourceId:t.sourceId,documentId:t.documentId,cardId:t.cardId})}a(T5,"buildCandidateId");function A5(t){return fw({contractVersion:x$,candidateId:t.candidateId,contentHash:t.contentHash,distillFingerprint:t.distillFingerprint,compareFingerprint:t.compareFingerprint,proposedCandidate:t.proposedCandidate,comparisonDecision:t.comparisonDecision,targetContentHash:t.targetContentHash})}a(A5,"buildCandidateRevision");function _5(t,e){return`${t}::${e}`}a(_5,"buildReviewKey");export{Yb as AGENT_TO_ENGINE,ar as BASE_AGENT_DEFS,ce as BotProvisionError,kp as BotProvisioner,S$ as CANDIDATE_IDENTITY_CONTRACT_VERSION,x$ as CANDIDATE_REVISION_CONTRACT_VERSION,so as CommandAbortedError,nr as CommandTimeoutError,Fr as ConfigSaveError,Ko as CronSchedulerSource,Ro as DEFAULT_TAXONOMY,nw as DEFAULT_VISION_BASE_MS,rw as DEFAULT_VISION_PER_PAGE_MS,Yy as DISTILL_PRESETS,kt as DingTalkRobotClient,ae as DwsClient,ec as DwsDevRunner,ge as DwsError,vo as ENGINE_TO_AGENT,Bt as InMemoryGlobalVarStore,Ep as InMemoryObjectStore,he as IngestError,ho as KNOWN_AGENT_IDS,Gl as LocalSpawnExecutor,Rp as PROVISION_PHASES,te as PathBoundaryError,rd as QUESTION_FORM_TAG,Hl as RelayAgentSession,Jl as RelayExecutor,Oo as ShellNotAllowedError,Ye as TAGS_INDEX_DIR,_A as THREAD_CLOSE_REASONS,DA as THREAD_CONFIDENCES,cl as THREAD_CONTRACT_VERSION,AA as THREAD_ROLES,me as TaxonomyError,pl as ThreadLog,Lr as ThreadStore,De as ToolkitError,Hs as Tracer,J0 as VISION_META_NAME,H0 as VISION_NORMALIZED_NAME,Ap as WORKSPACE_BUNDLE_FORMAT,t_ as _resetDigestQueues,JA as _resetThreadStoreRegistry,GB as activateGlobalDwsOnPath,kr as agentEngineSchema,Zu as agentToEngine,IA as applyConfigSave,Be as applyProvisionEvent,XS as approvalCandidateSchema,xI as assertDownloadMatchesExtension,Ks as assertPortableId,zr as assertTableBelongsToBase,K0 as assessPdfDensity,fl as assignThreadRoles,fd as buildAgentChoices,PB as buildArtifactKey,IB as buildBotApprovalReportLines,T5 as buildCandidateId,A5 as buildCandidateRevision,Is as buildClarifyReply,ti as buildEnvSource,zp as buildEnvSourceSync,td as buildFixPrompt,Cs as buildMetaPrompt,_5 as buildReviewKey,qi as canOfferDefaultFor,R$ as canonicalJson,ex as checkApprovalSchema,kc as checkEnv,ww as checkMigrateHint,ii as checkWorkflowRecipes,wc as checkWorkflows,qp as chooseDetectedEngine,mp as classifyProvisionError,zl as cleanupOrphanArticles,Ku as codingAgentsConfigSchema,lA as coerceJsonValue,Em as coerceYamlValue,jr as collectAllItems,ol as collectBaseIdCandidateFiles,Yt as collectConfigHints,jh as collectDesignContext,Ar as collectEnvRefDetails,AC as collectEnvRefs,ga as collectionDir,Ns as commandsInFlight,$a as composeToolkitRegistry,dl as computeFirstResponse,ul as computeParticipants,_p as computeWorkspaceRevision,Fp as configSchema,cw as contentIndexKey,i8 as createApp,To as createDingTalkAtUserIdResolver,Sv as createExecShellToolkit,Px as createFingerprintWindow,hp as createInitialProvisionState,b8 as createLocalSpawnExecutor,An as createPerWorkflowSettings,$w as createPrintfLogger,m8 as createRelayExecutor,xv as createStandaloneExecShellToolkit,lh as createWorkflowTable,qm as credentialsFilePath,NB as decodeWorkspaceBundle,K as defaultCommandRunner,sx as defaultProvisionStatePath,gt as defaultToolkitRegistry,ll as degradeConfidence,yg as deriveEnvJsonMapSpec,D$ as describeConfigPath,pa as detectAgentFailure,ud as detectAgents,Kp as detectCodingEngines,cr as detectInstalledAgents,yo as detectInstalledCodingAgents,iT as detectScope,Bc as detectSourceType,ZS as devAppEntrySchema,Hg as discoverLocalSources,U0 as distillPresetSpec,Yd as drainCommands,CB as dwsErrorEnvelopeSchema,le as dwsPayload,Dd as emptyContentIndex,Um as emptyStore,Dp as emptyStreakKey,FB as encodeWorkspaceBundle,rn as engineToAgent,Bm as enqueueForDigest,Tw as enrichLogContext,E0 as ensureBaseExists,pd as ensureLatestDws,_l as ensureTableExists,Dt as ensureTsxRegistered,lE as evaluateStrictGate,OS as extractAttachmentDetails,fx as extractErrorInfo,ew as extractPdfPageCount,Rx as extractStructuredJson,ct as fetchFields,jx as fieldDefinitionSchema,Ox as fieldTypeSchema,P$ as fileRefConfigSchema,ye as findArrayPayload,oH as findConflictingCredential,uo as findCursor,k$ as formatArtifactLint,Se as formatCommandError,Tx as formatZonedDateTime,Ix as formatZonedHm,xx as gateEmptySnapshot,$m as generateCodingAgentsConfig,Mm as generateMainConfig,sH as getActiveCredential,da as getAgentConfig,Wb as getAgentDef,Et as getAitableAgentConfigMeta,Ld as getConfigHint,bn as getConfigValueAtPath,hu as getCurrentDwsRunner,pu as getCurrentExecutor,et as getDefaultAgentEntry,$$ as getFileRefHint,rc as getGlobalDwsBinPath,zs as getLogContext,ZA as getPendingItems,Ki as getSemanticKey,Wm as getThreadStore,lo as getTracer,pn as getZodObjectShape,TA as globalVarRefPath,b$ as hasArtifactError,Ym as hasHumanStep,BB as hasOssCredentials,d$ as hashNormalizedContent,XA as incrementDigestAttempts,ma as indexPath,Nn as ingest,kd as initTable,au as initTracer,dh as initialTableFields,Pn as injectProfileConfig,Tn as interpolateEnv,DB as isAllowedArtifactPath,YA as isDigestQueueEmpty,nf as isDistillPreset,Sr as isEngineDetected,Aq as isGlobalVarRef,Zt as isOwnedAutoCreateHint,nc as isPublishedStatus,k as isRecord,yx as isSafeRelativePath,w$ as lintArtifacts,Bb as listCodingAgents,aH as listCredentials,pB as listDwsConversations,hw as listProfiles,mw as listTemplates,la as loadAgentConfig,pc as loadEventHandlerDefinition,oi as loadEventHandlerDefinitionResult,Xe as loadProfileConfig,cx as loadProvisionState,fc as loadRecipeDefinition,Dn as loadRecipeDefinitionResult,Ae as loadSettings,bt as loadTaxonomy,st as loadWorkflowTemplate,zn as logDateDir,xc as logPreflightSummary,m as logger,Hi as lowerConfidence,ka as mapWithConcurrency,e_ as markDigestFailure,dH as maskSecret,Jd as mergeCommandEnv,dx as mergeEnterpriseRobotCredentials,yp as mergeEnvRobotCredentials,il as migrateBaseIdInFiles,H$ as moduleDir,ox as nextStepForPhase,hx as normalizeArtifactRelPath,Zo as normalizeByType,ya as normalizeCategory,Xr as normalizeEol,Ax as normalizeTimezone,Ao as padStaffId,ux as parseEnterpriseRobots,hg as parseEnvExampleValues,ei as parseEnvValue,Ee as parseFrontmatter,ax as parseProvisionState,id as parseQuestionForm,G0 as parseVisionMeta,Sc as preflightModuleResult,oc as prependGlobalDwsToPath,Qh as printFieldPlan,Vl as printKbProgress,Kl as printKbSummary,ty as printViewSyncResult,rr as probeCommand,xs as probeProjectShape,tc as provisionGuidance,ix as provisionStateFileSchema,lw as readContentIndex,Wr as readCredentials,e$ as readSection,gn as readState,Ed as readTitle,rl as readYamlValueAt,GA as recoverThreadStoreOnce,nx as redactPayloadForLog,Ht as refreshKnowledgeBases,LD as remainingDesignTimeoutMs,QA as removeFromDigestQueue,V0 as renderDistillPrompt,Ds as renderForm,XD as renderForms,Io as renderKbPromptBlock,Qy as renderSimpleDistillPrompt,$A as renderThread,q0 as renderVisionNormalizePrompt,Pp as repairJsonStringValues,xn as reportPath,oa as requireAgentDef,un as resetProfileCache,sE as resolveAllCollections,En as resolveCodingAgentSelection,Ul as resolveCompileAgent,Te as resolveConfigPath,lF as resolveContactsByUserIds,cf as resolveDingTalkAtUserId,We as resolveDingTalkStreamMessageEventContext,tr as resolveDingTalkWebhookMentionEventContext,_q as resolveGlobalVarRef,xe as resolveInsideRoot,wa as resolveKbContext,Br as resolveReviewState,Qm as resolveReviewStateDetailed,yE as resolveTriggerTarget,JS as robotLifecycleSchema,GS as robotResultSchema,HS as robotSubmitSchema,Ni as runCheck,p3 as runClarifyRound,pt as runCodingAgent,bo as runCodingAgentViaSpawn,vw as runCommand,Jh as runDesign,H3 as runDesignCommand,MZ as runInit,Er as runInstancePreflight,wG as runKbCleanupCommand,uE as runKbCompileCommand,yG as runKbIngestCommand,hG as runKbStatusCommand,mG as runKbUpdateCommand,yw as runMigrate,AY as runSetupCommand,i5 as runSync,AM as runWithDwsRunner,Gs as runWithExecutor,Iw as runWithLogContext,Re as safeFilename,$p as safeParseJson,bp as sanitizeProvisionText,rH as saveCredential,lx as saveProvisionState,Vi as scaffold,Os as scaffoldFromTemplate,dc as scanWorkflowDirs,gp as searchDwsChatGroups,an as sessionWebhookRegistry,iH as setActiveAgent,TM as setGlobalDwsRunner,uA as setInJson,Td as setupAutomations,xl as setupKnowledgeBases,Cd as setupSurfaceTables,vM as shellToken,Gd as shouldDetachCommand,Z0 as shouldRunVisionRound,vl as snapshotRunRecord,io as spawnManagedProcess,Zd as spawnManagedProcessSync,eo as splitFrontmatter,kM as stringOrNull,tw as stripPdfSeparators,Yh as syncFieldsFromWorkflow,ey as syncViewsFromDesign,E$ as tableRefConfigSchema,vh as tableSource,Qe as taxonomyCategoryIds,fr as taxonomyFingerprint,Fm as threadLogFileName,Nr as threadNeedsReview,ow as tidySection,Qt as toModuleUrl,ir as toPortableRelPath,t$ as toStringList,sc as trackerSchema,f$ as tryReuseStagingArticles,Op as tzOffsetMs,u$ as upsertContentIndexEntry,Yr as validateDesignArtifacts,Kh as validateDesignOutput,px as validateProvisionName,sR as validateStateConsistency,YS as versionCreateSchema,QS as versionListItemSchema,tx as versionStatusSchema,vr as viewDefSchema,$x as viewTypeSchema,Y0 as visionTimeoutMs,on as wikiDir,ft as workspaceAgentConfigPath,nl as writeBack,dw as writeContentIndex,Hm as writeCredentials,dA as writeEnvFile,tl as writeJsonFile,BY as writeProfileRoles,zY as writeRoleDefinitions,ch as writeTableIdToConfig,Li as writeYaml,X0 as yamlFlowList,Q0 as yamlScalar,Cx as yesterdayRange,vc as zodToFormatExample,Mp as zonedDateParts,ic as zonedWallClockToUtc};
|
|
628
|
+
`)}a(b$,"renderVisionNormalizePrompt");var k$="vision-normalized.md",v$="vision-meta.json";function S$(t){try{let e=JSON.parse(t);if(typeof e!="object"||e===null)return null;let n=e;return typeof n.textDocHash!="string"||typeof n.pageCount!="number"?null:{textDocHash:n.textDocHash,pageCount:n.pageCount,tier:n.tier==="empty"||n.tier==="sparse"?n.tier:"sparse",completedAt:typeof n.completedAt=="string"?n.completedAt:""}}catch{return null}}a(S$,"parseVisionMeta");function x$(t){return!t.visionBody||!t.meta||t.meta.textDocHash!==t.textDocHash||t.meta.pageCount!==t.pageCount}a(x$,"shouldRunVisionRound");var mw=12e4,hw=6e4;function R$(t,e){let n=e?.vision_base_ms??mw,r=e?.vision_per_page_ms??hw;return n+r*Math.max(0,t)}a(R$,"visionTimeoutMs");import{createHash as A$}from"crypto";import{access as E$,copyFile as D$,mkdir as bw,readdir as P$,readFile as kw,rename as $$,rm as M$,stat as O$,writeFile as j$}from"fs/promises";import dt from"path";function no(t){return String(t??"").replace(/\r\n/g,`
|
|
629
|
+
`)}a(no,"normalizeEol");function yw(t){return no(t).replace(/^\s+|\s+$/g,"")}a(yw,"tidySection");function C$(t){let e=String(t??"");return e===""?'""':/[:#[\]{}&*!|>'"%@`,\n\r\t]/.test(e)||e!==e.trim()?JSON.stringify(e):e}a(C$,"yamlScalar");function I$(t){return`[${(t??[]).map(n=>String(n??"").trim()).filter(Boolean).map(n=>JSON.stringify(n)).join(", ")}]`}a(I$,"yamlFlowList");function ro(t){let e=/^---\n([\s\S]*?)\n---\n([\s\S]*)$/.exec(no(t));return e?{frontmatter:e[1],body:e[2]}:null}a(ro,"splitFrontmatter");function T$(t,e){let n=String(e??"").replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`^##\\s*${n}\\s*$([\\s\\S]*?)(?=^##\\s|(?![\\s\\S]))`,"m").exec(no(String(t??"")));return o?yw(o[1]):""}a(T$,"readSection");function jd(t){return/^#\s+(.+)$/m.exec(no(String(t??"")))?.[1]?.trim()??""}a(jd,"readTitle");function _$(t){return t==null?[]:(Array.isArray(t)?t:[t]).map(n=>String(n??"").trim()).filter(Boolean)}a(_$,"toStringList");function ww(t){return A$("sha256").update(t).digest("hex")}a(ww,"sha256");async function F$(t,e){let n=e?.exclude&&e.exclude.length>0?new Set(e.exclude):null,r=[];async function o(i,s){let c=await P$(i).catch(()=>[]);for(let l of c.sort()){let d=dt.join(i,l),u=s?`${s}/${l}`:l,f=await O$(d).catch(()=>null);if(f){if(f.isDirectory())await o(d,u);else if(l.endsWith(".md")){if(n?.has(u))continue;let p=await kw(d,"utf8"),g=ro(p)?.body??p;r.push([u,ww(g)])}}}}return a(o,"walk"),await o(t,""),ww(JSON.stringify(r))}a(F$,"hashNormalizedContent");function vw(t,e){return`${t}::${e}`}a(vw,"contentIndexKey");function Fd(){return{version:1,entries:{}}}a(Fd,"emptyContentIndex");async function Sw(t){try{let e=await kw(t,"utf8"),n=JSON.parse(e);return typeof n=="object"&&n!==null&&n.version===1&&typeof n.entries=="object"?n:Fd()}catch{return Fd()}}a(Sw,"readContentIndex");async function xw(t,e){await bw(dt.dirname(t),{recursive:!0});let n=`${t}.tmp-${process.pid}`;await j$(n,JSON.stringify(e,null,2),"utf8"),await $$(n,t)}a(xw,"writeContentIndex");async function N$(t,e,n){let r=await Sw(t);r.entries[vw(e,n.contentHash)]=n,await xw(t,r)}a(N$,"upsertContentIndexEntry");async function L$(t,e,n){let r=t.articles.map(s=>({id:s.id,abs:dt.join(e,s.path),name:dt.basename(s.path)}));for(let s of r){if(!s.name.endsWith(".md")||s.name.startsWith("_"))return null;try{await E$(s.abs)}catch{return null}}r.every(s=>dt.resolve(dt.dirname(s.abs))===dt.resolve(n))||(await M$(n,{recursive:!0,force:!0}),await bw(n,{recursive:!0}));let i=[];for(let s of r){let c=dt.join(n,s.name);dt.resolve(s.abs)!==dt.resolve(c)&&await D$(s.abs,c),i.push({id:s.id,path:dt.relative(e,c)})}return i}a(L$,"tryReuseStagingArticles");import{existsSync as oo,readFileSync as Rw,readdirSync as Nd}from"fs";import He from"path";var W$=/(?:^|[\s("'`(])(?:\/Users\/|\/home\/|[A-Za-z]:\\|file:\/\/)/;function B$(){return{"missing-frontmatter":0,"missing-title":0,"missing-source":0,"index-missing-card":0,"index-orphan-entry":0,"index-too-large":0,"broken-asset":0,"absolute-path":0}}a(B$,"emptyCounts");function z$(t){let e=He.join(t,"cards");if(!oo(e))return[];let n=[];for(let r of Nd(e,{withFileTypes:!0})){if(!r.isDirectory()||r.name.startsWith("_")||r.name.startsWith("."))continue;let o=He.join(e,r.name);for(let i of Nd(o))!i.endsWith(".md")||i.startsWith("_")||i.startsWith(".")||n.push(He.join("cards",r.name,i))}return n.sort()}a(z$,"listCards");function U$(t){let e=[];oo(He.join(t,"_index.md"))&&e.push("_index.md");let n=He.join(t,"cards");if(!oo(n))return e;for(let r of Nd(n,{withFileTypes:!0})){if(!r.isDirectory())continue;let o=He.join("cards",r.name,"_index.md");oo(He.join(t,o))&&e.push(o)}return e}a(U$,"listIndexes");function V$(t){let e=0;for(let n of t.split(`
|
|
630
|
+
`)){let r=n.trim();r.startsWith("|")&&(/^\|[\s:|-]+\|?$/.test(r)||(e+=1))}return Math.max(0,e-1)}a(V$,"countTableRows");function K$(t){let{wikiDir:e}=t,n=t.indexEntryWarn??300,r=t.sourcePrefixes??["> \u6765\u6E90","> Source"],o=[],i=B$(),s={},c=a((p,g,h,y="error")=>{o.push({rule:p,file:g,detail:h,level:y}),i[p]+=1},"push"),l=z$(e),d=[];for(let p of l){let g=Rw(He.join(e,p),"utf8"),h=He.basename(p,".md");d.push(h);let y=ro(g);if(!y){c("missing-frontmatter",p,"\u7F3A\u5C11 --- \u5305\u88F9\u7684 frontmatter");continue}jd(y.body)||c("missing-title",p,"\u6B63\u6587\u7F3A\u5C11\u4E00\u7EA7\u6807\u9898\uFF08# ...\uFF09"),r.some(w=>y.body.includes(w))||c("missing-source",p,`\u6B63\u6587\u7F3A\u5C11\u6EAF\u6E90\u884C\uFF08\u5E94\u542B ${r.join(" \u6216 ")}\uFF09\u2014\u2014 \u65E0\u6CD5\u56DE\u67E5\u8FD9\u6761\u77E5\u8BC6\u6765\u81EA\u54EA\u91CC`),W$.test(g)&&c("absolute-path",p,"\u51FA\u73B0\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u4EA7\u7269\u5FC5\u987B\u53EF\u8FC1\u79FB\uFF09");for(let w of g.matchAll(/!\[[^\]]*\]\(([^)\s]+)\)/g)){let b=w[1];if(/^(https?|data):/.test(b))continue;let v=He.resolve(He.dirname(He.join(e,p)),b);oo(v)||c("broken-asset",p,`\u56FE\u7247\u4E0D\u5B58\u5728\uFF1A${b}`)}}let u=U$(e),f=new Map;for(let p of u){let g=Rw(He.join(e,p),"utf8");f.set(p,g);let h=V$(g);s[p]=h,h>n&&c("index-too-large",p,`\u7D22\u5F15 ${h} \u6761\uFF0C\u8D85\u8FC7\u53EF\u6574\u8BFB\u9608\u503C ${n}\u3002agent \u65E0\u6CD5\u6574\u7BC7\u8BFB\u53D6 \u2192 \u8BED\u4E49\u5339\u914D\u5C42\u5931\u6548\uFF08\u662F\u5426\u8BE5\u518D\u5206\u5C42\u7531\u6A21\u677F\u51B3\u5B9A\uFF09`,"warn")}if(u.length===0&&l.length>0)c("index-missing-card","_index.md","\u6CA1\u6709\u4EFB\u4F55\u7D22\u5F15\u6587\u4EF6\uFF0C\u5168\u90E8\u5361\u7247\u90FD\u4E0D\u53EF\u5BFC\u822A");else{let p=[...f.values()].join(`
|
|
631
|
+
`);for(let g of d)p.includes(g)||c("index-missing-card",`cards/**/${g}.md`,"\u5361\u7247\u672A\u88AB\u4EFB\u4F55\u7D22\u5F15\u5217\u5230\uFF0C\u7B49\u4E8E\u8FD9\u6761\u77E5\u8BC6\u4E0D\u5B58\u5728")}return{issues:o,counts:i,checkedCards:l.length,indexEntries:s}}a(K$,"lintArtifacts");function q$(t){return t.issues.some(e=>e.level==="error")}a(q$,"hasArtifactError");function H$(t){if(t.issues.length===0)return`\u4EA7\u7269\u6821\u9A8C\u901A\u8FC7\uFF1A${t.checkedCards} \u5F20\u5361\u7247\uFF0C\u7D22\u5F15 ${Object.keys(t.indexEntries).length} \u4E2A\uFF0C\u5168\u90E8\u4E0D\u53D8\u91CF\u6EE1\u8DB3\u3002`;let e=[`\u4EA7\u7269\u6821\u9A8C\u53D1\u73B0 ${t.issues.length} \u4E2A\u95EE\u9898\uFF08\u5361\u7247 ${t.checkedCards} \u5F20\uFF09\uFF1A`];for(let n of t.issues)e.push(` ${n.level==="error"?"\u2716":"\u26A0"} [${n.rule}] ${n.file}\uFF1A${n.detail}`);return e.join(`
|
|
632
|
+
`)}a(H$,"formatArtifactLint");import{createHash as J$}from"crypto";var G$=1,Z$=1;function Y$(t){return JSON.stringify(t,(e,n)=>n===null||typeof n!="object"||Array.isArray(n)?n:Object.fromEntries(Object.entries(n).sort(([r],[o])=>r.localeCompare(o))))}a(Y$,"canonicalJson");function Cw(t){return J$("sha256").update(Y$(t)).digest("hex")}a(Cw,"hashCanonical");function a6(t){return Cw({contractVersion:G$,targetCollection:t.targetCollection,sourceId:t.sourceId,documentId:t.documentId,cardId:t.cardId})}a(a6,"buildCandidateId");function c6(t){return Cw({contractVersion:Z$,candidateId:t.candidateId,contentHash:t.contentHash,distillFingerprint:t.distillFingerprint,compareFingerprint:t.compareFingerprint,proposedCandidate:t.proposedCandidate,comparisonDecision:t.comparisonDecision,targetContentHash:t.targetContentHash})}a(c6,"buildCandidateRevision");function l6(t,e){return`${t}::${e}`}a(l6,"buildReviewKey");export{lk as AGENT_TO_ENGINE,lr as BASE_AGENT_DEFS,ce as BotProvisionError,$p as BotProvisioner,G$ as CANDIDATE_IDENTITY_CONTRACT_VERSION,Z$ as CANDIDATE_REVISION_CONTRACT_VERSION,lo as CommandAbortedError,or as CommandTimeoutError,Wr as ConfigSaveError,Jo as CronSchedulerSource,To as DEFAULT_TAXONOMY,mw as DEFAULT_VISION_BASE_MS,hw as DEFAULT_VISION_PER_PAGE_MS,dw as DISTILL_PRESETS,kt as DingTalkRobotClient,ae as DwsClient,sc as DwsDevRunner,ge as DwsError,Ro as ENGINE_TO_AGENT,zt as InMemoryGlobalVarStore,Up as InMemoryObjectStore,he as IngestError,bo as KNOWN_AGENT_IDS,td as LocalSpawnExecutor,Fp as PROVISION_PHASES,ne as PathBoundaryError,ld as QUESTION_FORM_TAG,Xl as RelayAgentSession,ed as RelayExecutor,No as ShellNotAllowedError,Ye as TAGS_INDEX_DIR,tA as THREAD_CLOSE_REASONS,rA as THREAD_CONFIDENCES,gl as THREAD_CONTRACT_VERSION,eA as THREAD_ROLES,me as TaxonomyError,bl as ThreadLog,zr as ThreadStore,De as ToolkitError,Ys as Tracer,v$ as VISION_META_NAME,k$ as VISION_NORMALIZED_NAME,Bp as WORKSPACE_BUNDLE_FORMAT,TA as _resetDigestQueues,kA as _resetThreadStoreRegistry,A1 as activateGlobalDwsOnPath,xr as agentEngineSchema,nf as agentToEngine,Q_ as applyConfigSave,Be as applyProvisionEvent,Rx as approvalCandidateSchema,GI as assertDownloadMatchesExtension,Gs as assertPortableId,Kr as assertTableBelongsToBase,w$ as assessPdfDensity,wl as assignThreadRoles,wd as buildAgentChoices,f1 as buildArtifactKey,s1 as buildBotApprovalReportLines,a6 as buildCandidateId,c6 as buildCandidateRevision,As as buildClarifyReply,oi as buildEnvSource,tg as buildEnvSourceSync,ad as buildFixPrompt,_s as buildMetaPrompt,l6 as buildReviewKey,Gi as canOfferDefaultFor,Y$ as canonicalJson,Cx as checkApprovalSchema,Ic as checkEnv,Dw as checkMigrateHint,ci as checkWorkflowRecipes,Rc as checkWorkflows,ig as chooseDetectedEngine,_p as classifyProvisionError,Jl as cleanupOrphanArticles,Yu as codingAgentsConfigSchema,O_ as coerceJsonValue,Um as coerceYamlValue,Lr as collectAllItems,dl as collectBaseIdCandidateFiles,Qt as collectConfigHints,Gh as collectDesignContext,Dr as collectEnvRefDetails,eI as collectEnvRefs,wa as collectionDir,zs as commandsInFlight,Fa as composeToolkitRegistry,hl as computeFirstResponse,yl as computeParticipants,zp as computeWorkspaceRevision,Zp as configSchema,vw as contentIndexKey,L8 as createApp,Eo as createDingTalkAtUserIdResolver,Mv as createExecShellToolkit,rR as createFingerprintWindow,Ap as createInitialProvisionState,X8 as createLocalSpawnExecutor,En as createPerWorkflowSettings,Kw as createPrintfLogger,G8 as createRelayExecutor,Ov as createStandaloneExecShellToolkit,Sh as createWorkflowTable,ih as credentialsFilePath,w1 as decodeWorkspaceBundle,K as defaultCommandRunner,Dx as defaultProvisionStatePath,gt as defaultToolkitRegistry,ml as degradeConfidence,Eg as deriveEnvJsonMapSpec,oM as describeConfigPath,ya as detectAgentFailure,yd as detectAgents,og as detectCodingEngines,dr as detectInstalledAgents,ko as detectInstalledCodingAgents,DT as detectScope,Hc as detectSourceType,vx as devAppEntrySchema,sm as discoverLocalSources,h$ as distillPresetSpec,ru as drainCommands,i1 as dwsErrorEnvelopeSchema,le as dwsPayload,Fd as emptyContentIndex,nh as emptyStore,Vp as emptyStreakKey,y1 as encodeWorkspaceBundle,sn as engineToAgent,eh as enqueueForDigest,Lw as enrichLogContext,r$ as ensureBaseExists,bd as ensureLatestDws,Ol as ensureTableExists,Dt as ensureTsxRegistered,OE as evaluateStrictGate,ax as extractAttachmentDetails,Fx as extractErrorInfo,pw as extractPdfPageCount,Gx as extractStructuredJson,ct as fetchFields,cR as fieldDefinitionSchema,aR as fieldTypeSchema,iM as fileRefConfigSchema,ye as findArrayPayload,NH as findConflictingCredential,go as findCursor,H$ as formatArtifactLint,Se as formatCommandError,Qx as formatZonedDateTime,Yx as formatZonedHm,Jx as gateEmptySnapshot,qm as generateCodingAgentsConfig,Hm as generateMainConfig,WH as getActiveCredential,ga as getAgentConfig,Qb as getAgentDef,Et as getAitableAgentConfigMeta,Kd as getConfigHint,vn as getConfigValueAtPath,Su as getCurrentDwsRunner,bu as getCurrentExecutor,et as getDefaultAgentEntry,sM as getFileRefHint,lc as getGlobalDwsBinPath,Hs as getLogContext,SA as getPendingItems,Ji as getSemanticKey,Xm as getThreadStore,po as getTracer,mn as getZodObjectShape,X_ as globalVarRefPath,q$ as hasArtifactError,dh as hasHumanStep,v1 as hasOssCredentials,F$ as hashNormalizedContent,CA as incrementDigestAttempts,ba as indexPath,Wn as ingest,zv as initSlsReport,Td as initTable,pu as initTracer,xh as initialTableFields,Mn as injectProfileConfig,An as interpolateEnv,u1 as isAllowedArtifactPath,xA as isDigestQueueEmpty,lf as isDistillPreset,Cr as isEngineDetected,cH as isGlobalVarRef,Yt as isOwnedAutoCreateHint,cc as isPublishedStatus,k as isRecord,zx as isSafeRelativePath,rp as isSlsReportDisabled,K$ as lintArtifacts,Xb as listCodingAgents,BH as listCredentials,HB as listDwsConversations,Aw as listProfiles,_w as listTemplates,pa as loadAgentConfig,bc as loadEventHandlerDefinition,ai as loadEventHandlerDefinitionResult,Xe as loadProfileConfig,$x as loadProvisionState,wc as loadRecipeDefinition,$n as loadRecipeDefinitionResult,_e as loadSettings,bt as loadTaxonomy,st as loadWorkflowTemplate,Vn as logDateDir,Ac as logPreflightSummary,m as logger,Zi as lowerConfidence,Ra as mapWithConcurrency,IA as markDigestFailure,VH as maskSecret,eu as mergeCommandEnv,Ox as mergeEnterpriseRobotCredentials,Ep as mergeEnvRobotCredentials,ul as migrateBaseIdInFiles,kM as moduleDir,Ax as nextStepForPhase,Bx as normalizeArtifactRelPath,Xo as normalizeByType,va as normalizeCategory,no as normalizeEol,Xx as normalizeTimezone,Do as padStaffId,op as parseDwsAuthIdentity,ip as parseDwsVersionOutput,jx as parseEnterpriseRobots,Ag as parseEnvExampleValues,ri as parseEnvValue,Ee as parseFrontmatter,Px as parseProvisionState,ud as parseQuestionForm,S$ as parseVisionMeta,_c as preflightModuleResult,dc as prependGlobalDwsToPath,uy as printFieldPlan,Zl as printKbProgress,Yl as printKbSummary,gy as printViewSyncResult,Xt as probeCommand,Is as probeProjectShape,ac as provisionGuidance,Ex as provisionStateFileSchema,Sw as readContentIndex,Ur as readCredentials,T$ as readSection,hn as readState,jd as readTitle,ll as readYamlValueAt,vA as recoverThreadStoreOnce,Tx as redactPayloadForLog,Jt as refreshKnowledgeBases,uP as remainingDesignTimeoutMs,RA as removeFromDigestQueue,y$ as renderDistillPrompt,Ms as renderForm,CP as renderForms,Ao as renderKbPromptBlock,uw as renderSimpleDistillPrompt,iA as renderThread,b$ as renderVisionNormalizePrompt,Kp as repairJsonStringValues,za as reportCliEvent,Cn as reportPath,ca as requireAgentDef,pn as resetProfileCache,PE as resolveAllCollections,Pn as resolveCodingAgentSelection,Gl as resolveCompileAgent,Te as resolveConfigPath,jF as resolveContactsByUserIds,gf as resolveDingTalkAtUserId,We as resolveDingTalkStreamMessageEventContext,rr as resolveDingTalkWebhookMentionEventContext,lH as resolveGlobalVarRef,xe as resolveInsideRoot,Sa as resolveKbContext,sp as resolveReportProject,Vr as resolveReviewState,uh as resolveReviewStateDetailed,UE as resolveTriggerTarget,bx as robotLifecycleSchema,kx as robotResultSchema,wx as robotSubmitSchema,Bi as runCheck,H3 as runClarifyRound,pt as runCodingAgent,So as runCodingAgentViaSpawn,Us as runCommand,ay as runDesign,TZ as runDesignCommand,g5 as runInit,$r as runInstancePreflight,QG as runKbCleanupCommand,FE as runKbCompileCommand,YG as runKbIngestCommand,ZG as runKbStatusCommand,GG as runKbUpdateCommand,Ew as runMigrate,cY as runSetupCommand,LY as runSync,tO as runWithDwsRunner,Xs as runWithExecutor,Nw as runWithLogContext,Re as safeFilename,qp as safeParseJson,Pp as sanitizeProvisionText,FH as saveCredential,Mx as saveProvisionState,Hi as scaffold,Ls as scaffoldFromTemplate,hc as scanWorkflowDirs,Tp as searchDwsChatGroups,ln as sessionWebhookRegistry,LH as setActiveAgent,eO as setGlobalDwsRunner,F_ as setInJson,Uv as setReportProject,$d as setupAutomations,Al as setupKnowledgeBases,Dd as setupSurfaceTables,JM as shellToken,tu as shouldDetachCommand,x$ as shouldRunVisionRound,Tl as snapshotRunRecord,co as spawnManagedProcess,nu as spawnManagedProcessSync,ro as splitFrontmatter,HM as stringOrNull,gw as stripPdfSeparators,dy as syncFieldsFromWorkflow,py as syncViewsFromDesign,rM as tableRefConfigSchema,Mh as tableSource,Qe as taxonomyCategoryIds,gr as taxonomyFingerprint,Zm as threadLogFileName,Br as threadNeedsReview,yw as tidySection,en as toModuleUrl,ar as toPortableRelPath,_$ as toStringList,fc as trackerSchema,L$ as tryReuseStagingArticles,Jp as tzOffsetMs,N$ as upsertContentIndexEntry,eo as validateDesignArtifacts,oy as validateDesignOutput,Nx as validateProvisionName,PR as validateStateConsistency,Sx as versionCreateSchema,xx as versionListItemSchema,Ix as versionStatusSchema,Rr as viewDefSchema,iR as viewFilterConditionSchema,oR as viewTypeSchema,R$ as visionTimeoutMs,an as wikiDir,ft as workspaceAgentConfigPath,cl as writeBack,xw as writeContentIndex,sh as writeCredentials,j_ as writeEnvFile,al as writeJsonFile,vY as writeProfileRoles,SY as writeRoleDefinitions,vh as writeTableIdToConfig,zi as writeYaml,I$ as yamlFlowList,C$ as yamlScalar,Zx as yesterdayRange,Tc as zodToFormatExample,Hp as zonedDateParts,uc as zonedWallClockToUtc};
|