qlogicagent 2.20.6 → 2.20.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +27 -54
  2. package/dist/agent-contract.js +1 -1
  3. package/dist/agent.js +42 -41
  4. package/dist/cli.js +1 -1
  5. package/dist/host-contract.js +1 -1
  6. package/dist/index.js +539 -565
  7. package/dist/orchestration.js +14 -14
  8. package/dist/project-memory-host.js +30 -33
  9. package/dist/protocol.js +1 -1
  10. package/dist/types/agent/memory-recall-context.d.ts +7 -0
  11. package/dist/types/agent/tool-loop/artifact-final-contract.d.ts +2 -0
  12. package/dist/types/agent/tool-loop/direct-response-contract.d.ts +12 -0
  13. package/dist/types/agent/tool-loop/final-status-stream-suppressor.d.ts +22 -0
  14. package/dist/types/agent/tool-loop/loop-helpers.d.ts +2 -2
  15. package/dist/types/agent/tool-loop.d.ts +5 -1
  16. package/dist/types/agent/types.d.ts +27 -15
  17. package/dist/types/cli/acp-commands.d.ts +1 -1
  18. package/dist/types/cli/acp-extended-handlers.d.ts +13 -3
  19. package/dist/types/cli/agent-runtime-session-state.d.ts +1 -0
  20. package/dist/types/cli/base-tool-bootstrap.d.ts +0 -7
  21. package/dist/types/cli/community-skill-installer.d.ts +2 -0
  22. package/dist/types/cli/core-tool-coordinator.d.ts +0 -3
  23. package/dist/types/cli/core-tools/registry.d.ts +1 -4
  24. package/dist/types/cli/handlers/config-handler.d.ts +0 -1
  25. package/dist/types/cli/handlers/goal-handler.d.ts +24 -0
  26. package/dist/types/cli/handlers/memory-handler.d.ts +1 -2
  27. package/dist/types/cli/handlers/skill-curator-handler.d.ts +8 -0
  28. package/dist/types/cli/handlers/turn-handler.d.ts +9 -12
  29. package/dist/types/cli/memory-candidate-service.d.ts +1 -8
  30. package/dist/types/cli/memory-coordinator.d.ts +1 -13
  31. package/dist/types/cli/product-acp-params.d.ts +1 -0
  32. package/dist/types/cli/provider-core-facade.d.ts +2 -30
  33. package/dist/types/cli/rpc-registry.d.ts +2 -4
  34. package/dist/types/cli/runtime-hook-bootstrap.d.ts +1 -2
  35. package/dist/types/cli/stdio-acp-request-host.d.ts +1 -2
  36. package/dist/types/cli/stdio-rpc-handler-hosts.d.ts +0 -2
  37. package/dist/types/cli/stdio-runtime-bootstrap.d.ts +0 -7
  38. package/dist/types/cli/stdio-runtime-services.d.ts +1 -8
  39. package/dist/types/cli/stdio-server.d.ts +0 -4
  40. package/dist/types/cli/tool-bootstrap-core-registration.d.ts +0 -4
  41. package/dist/types/cli/tool-bootstrap.d.ts +0 -17
  42. package/dist/types/contracts/memory-recall-packet.d.ts +31 -0
  43. package/dist/types/contracts/memory-response-contract.d.ts +2 -0
  44. package/dist/types/contracts/tool-execution-evidence.d.ts +8 -0
  45. package/dist/types/contracts/tool-name.d.ts +10 -0
  46. package/dist/types/contracts/turn-event.d.ts +36 -3
  47. package/dist/types/host-contract/acp-content.d.ts +45 -0
  48. package/dist/types/host-contract/index.d.ts +59 -48
  49. package/dist/types/orchestration/agent-instance.d.ts +21 -1
  50. package/dist/types/orchestration/agent-roster.d.ts +14 -15
  51. package/dist/types/orchestration/dag-scheduler.d.ts +4 -0
  52. package/dist/types/orchestration/goal-context-envelope.d.ts +7 -0
  53. package/dist/types/orchestration/goal-loop-coordinator.d.ts +55 -12
  54. package/dist/types/orchestration/goal-mode-adapters.d.ts +13 -1
  55. package/dist/types/orchestration/goal-run-persistence.d.ts +9 -2
  56. package/dist/types/orchestration/goal-run-types.d.ts +127 -13
  57. package/dist/types/orchestration/index.d.ts +1 -1
  58. package/dist/types/orchestration/product-persistence.d.ts +10 -1
  59. package/dist/types/orchestration/product-planner.d.ts +3 -3
  60. package/dist/types/orchestration/testing/delegate-test-bridge.d.ts +1 -0
  61. package/dist/types/orchestration/workflow/data-item.d.ts +1 -1
  62. package/dist/types/orchestration/workflow/expression.d.ts +1 -2
  63. package/dist/types/orchestration/workflow/workflow-patch.d.ts +1 -2
  64. package/dist/types/orchestration/workflow/workflow-render.d.ts +1 -2
  65. package/dist/types/project-memory-host.d.ts +1 -0
  66. package/dist/types/protocol/agent-contract.d.ts +10 -8
  67. package/dist/types/protocol/methods.d.ts +2 -19
  68. package/dist/types/protocol/notifications.d.ts +1 -1
  69. package/dist/types/protocol/wire/acp-agent-management.d.ts +48 -6
  70. package/dist/types/protocol/wire/acp-protocol.d.ts +11 -24
  71. package/dist/types/protocol/wire/agent-methods.d.ts +5 -142
  72. package/dist/types/protocol/wire/chat-types.d.ts +50 -0
  73. package/dist/types/protocol/wire/index.d.ts +2 -2
  74. package/dist/types/protocol/wire/notification-payloads.d.ts +73 -122
  75. package/dist/types/protocol/wire/thread-protocol.d.ts +4 -40
  76. package/dist/types/runtime/community/community-consent-client.d.ts +0 -13
  77. package/dist/types/runtime/context/context-compression-strategies.d.ts +29 -0
  78. package/dist/types/runtime/context/context-envelope.d.ts +3 -0
  79. package/dist/types/runtime/execution/dream-agent.d.ts +4 -5
  80. package/dist/types/runtime/execution/mcp-capability-selection.d.ts +54 -0
  81. package/dist/types/runtime/execution/memory-decay.d.ts +1 -1
  82. package/dist/types/runtime/execution/search-result-quality.d.ts +22 -0
  83. package/dist/types/runtime/execution/streaming-tool-executor.d.ts +2 -0
  84. package/dist/types/runtime/execution/tool-result-storage.d.ts +44 -0
  85. package/dist/types/runtime/hooks/memory-hooks.d.ts +3 -2
  86. package/dist/types/runtime/infra/agent-paths.d.ts +0 -8
  87. package/dist/types/runtime/infra/default-path-service.d.ts +0 -2
  88. package/dist/types/runtime/infra/llmrouter-managed-inference.d.ts +54 -1
  89. package/dist/types/runtime/infra/media-persistence.d.ts +6 -36
  90. package/dist/types/runtime/memory/implicit-extraction.d.ts +7 -15
  91. package/dist/types/runtime/memory/memory-recall-attribution.d.ts +24 -0
  92. package/dist/types/runtime/ports/agent-runtime-ports.d.ts +14 -0
  93. package/dist/types/runtime/ports/index.d.ts +1 -3
  94. package/dist/types/runtime/ports/memory-provider.d.ts +2 -19
  95. package/dist/types/runtime/ports/memory-writer.d.ts +1 -1
  96. package/dist/types/runtime/ports/path-service.d.ts +0 -2
  97. package/dist/types/runtime/prompt/capability-routing-policy.d.ts +13 -0
  98. package/dist/types/runtime/prompt/environment-context.d.ts +3 -6
  99. package/dist/types/runtime/prompt/fresh-workspace-evidence.d.ts +8 -13
  100. package/dist/types/runtime/prompt/tool-necessity-policy.d.ts +12 -0
  101. package/dist/types/skills/mcp/mcp-manager.d.ts +29 -4
  102. package/dist/types/skills/memory/host-memory-provider.d.ts +3 -9
  103. package/dist/types/skills/memory/memdir.d.ts +1 -1
  104. package/dist/types/skills/memory/memory-content-safety.d.ts +1 -0
  105. package/dist/types/skills/permissions/hook-runner.d.ts +3 -3
  106. package/dist/types/skills/portable-tool.d.ts +5 -0
  107. package/dist/types/skills/skill-system/skill-lifecycle.d.ts +1 -0
  108. package/dist/types/skills/tools/exec-tool.d.ts +1 -5
  109. package/dist/types/skills/tools/shell/command-compatibility.d.ts +3 -0
  110. package/dist/types/skills/tools/shell/index.d.ts +4 -3
  111. package/dist/types/skills/tools/shell/shell-exec.d.ts +15 -8
  112. package/dist/types/skills/tools/shell/shell-provider.d.ts +26 -0
  113. package/dist/types/transport/acp-server.d.ts +4 -1
  114. package/dist/types/transport/host-community-client.d.ts +0 -1
  115. package/dist/types/transport/host-request-client.d.ts +1 -0
  116. package/dist/types/transport/host-run-state-client.d.ts +1 -1
  117. package/dist/workflow-host.js +6 -6
  118. package/package.json +4 -3
  119. package/dist/skills/mcp/astraclaw-native-mcp-server.js +0 -12
  120. package/dist/types/cli/core-tools/checkpoint-tool-bootstrap.d.ts +0 -9
  121. package/dist/types/cli/core-tools/checkpoint-tool-service.d.ts +0 -7
  122. package/dist/types/cli/core-tools/config-tool-bootstrap.d.ts +0 -7
  123. package/dist/types/cli/core-tools/config-tool-service.d.ts +0 -13
  124. package/dist/types/cli/core-tools/monitor-tool-bootstrap.d.ts +0 -7
  125. package/dist/types/cli/core-tools/monitor-tool-service.d.ts +0 -6
  126. package/dist/types/cli/dev-tool-bootstrap.d.ts +0 -9
  127. package/dist/types/cli/dev-tools/dev-tool-bootstrap-service.d.ts +0 -7
  128. package/dist/types/cli/dev-tools/dev-tool-registry.d.ts +0 -8
  129. package/dist/types/cli/dev-tools/incremental-repo-map.d.ts +0 -81
  130. package/dist/types/cli/dev-tools/lsp-supervisor.d.ts +0 -59
  131. package/dist/types/cli/dev-tools/lsp-tool-service.d.ts +0 -7
  132. package/dist/types/cli/handlers/media-handler.d.ts +0 -19
  133. package/dist/types/cli/handlers/skills-handler.d.ts +0 -37
  134. package/dist/types/cli/industrial-runtime-store.d.ts +0 -16
  135. package/dist/types/cli/media-capability-schema.d.ts +0 -49
  136. package/dist/types/cli/media-file-api-service.d.ts +0 -73
  137. package/dist/types/cli/media-file-tool-service.d.ts +0 -13
  138. package/dist/types/cli/media-inline.d.ts +0 -31
  139. package/dist/types/cli/media-runtime-facade.d.ts +0 -51
  140. package/dist/types/cli/media-understanding.d.ts +0 -102
  141. package/dist/types/cli/skill-invocation-service.d.ts +0 -10
  142. package/dist/types/cli/skill-tools-bootstrap.d.ts +0 -35
  143. package/dist/types/cli/skills-query-service.d.ts +0 -41
  144. package/dist/types/cli/tool-bootstrap-media-registration.d.ts +0 -20
  145. package/dist/types/cli/turn-media-setup.d.ts +0 -34
  146. package/dist/types/cli/turn-preview-browser-setup.d.ts +0 -15
  147. package/dist/types/runtime/infra/astraclaw-capabilities.d.ts +0 -33
  148. package/dist/types/runtime/infra/builtin-skills-seed.d.ts +0 -31
  149. package/dist/types/runtime/infra/checkpoint-backend.d.ts +0 -9
  150. package/dist/types/runtime/infra/industrial-runtime-session-server.d.ts +0 -20
  151. package/dist/types/runtime/infra/migrate-project-skills.d.ts +0 -24
  152. package/dist/types/runtime/infra/project-skill-manifest.d.ts +0 -21
  153. package/dist/types/runtime/infra/skill-resolver.d.ts +0 -74
  154. package/dist/types/runtime/infra/worktree-backend.d.ts +0 -86
  155. package/dist/types/runtime/ports/checkpoint-contracts.d.ts +0 -19
  156. package/dist/types/runtime/ports/worktree-contracts.d.ts +0 -22
  157. package/dist/types/skills/mcp/astraclaw-native-mcp-server.d.ts +0 -1
  158. package/dist/types/skills/memory/memory-tool.d.ts +0 -87
  159. package/dist/types/skills/tools/checkpoint-tool.d.ts +0 -66
  160. package/dist/types/skills/tools/config-tool.d.ts +0 -61
  161. package/dist/types/skills/tools/file-management-tool.d.ts +0 -90
  162. package/dist/types/skills/tools/image-generate-tool.d.ts +0 -98
  163. package/dist/types/skills/tools/instructions-tool.d.ts +0 -65
  164. package/dist/types/skills/tools/lsp-tool.d.ts +0 -153
  165. package/dist/types/skills/tools/media-cancel-tool.d.ts +0 -30
  166. package/dist/types/skills/tools/media-understand-tool.d.ts +0 -28
  167. package/dist/types/skills/tools/monitor-tool.d.ts +0 -113
  168. package/dist/types/skills/tools/music-generate-tool.d.ts +0 -80
  169. package/dist/types/skills/tools/notebook-edit-tool.d.ts +0 -15
  170. package/dist/types/skills/tools/preview-browser-tool.d.ts +0 -136
  171. package/dist/types/skills/tools/repo-map-tool.d.ts +0 -52
  172. package/dist/types/skills/tools/skill-tool.d.ts +0 -142
  173. package/dist/types/skills/tools/sleep-tool.d.ts +0 -49
  174. package/dist/types/skills/tools/stt-tool.d.ts +0 -33
  175. package/dist/types/skills/tools/subagent-decision-tool.d.ts +0 -15
  176. package/dist/types/skills/tools/three-d-generate-tool.d.ts +0 -46
  177. package/dist/types/skills/tools/tts-tool.d.ts +0 -50
  178. package/dist/types/skills/tools/video-edit-tool.d.ts +0 -72
  179. package/dist/types/skills/tools/video-generate-tool.d.ts +0 -162
  180. package/dist/types/skills/tools/video-merge-tool.d.ts +0 -105
  181. package/dist/types/skills/tools/video-upscale-tool.d.ts +0 -45
  182. package/dist/types/skills/tools/voice-clone-tool.d.ts +0 -40
  183. package/dist/types/skills/tools/worktree-tool.d.ts +0 -69
@@ -1,11 +1,11 @@
1
- import{join as D}from"node:path";import{mkdir as ht,readdir as wt,rm as yt}from"node:fs/promises";import{readFile as fn,writeFile as pn,mkdir as gn,rename as mn,unlink as hn}from"node:fs/promises";import{dirname as wn,join as yn}from"node:path";import{randomUUID as kn}from"node:crypto";async function bn(n,e){let t=wn(n);await gn(t,{recursive:!0});let r=yn(t,`.tmp-${kn()}`);try{await pn(r,e,"utf-8");let o;for(let i=0;i<3;i++)try{await mn(r,n);return}catch(s){if(o=s,s.code!=="EPERM")throw s;await new Promise(a=>setTimeout(a,50*(i+1)))}throw o}catch(o){throw await hn(r).catch(()=>{}),o}}async function W(n){try{let e=await fn(n,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function M(n,e){await bn(n,JSON.stringify(e,null,2)+`
2
- `)}import{resolve as Cn}from"node:path";import{join as Tn}from"node:path";import{homedir as En}from"node:os";import{join as y}from"node:path";import{existsSync as ei}from"node:fs";import{createHash as vn}from"node:crypto";import{resolve as xn}from"node:path";function ye(n){return vn("sha256").update(xn(n).toLowerCase()).digest("hex").slice(0,16)}var et=".qlogicagent";function $(){return process.env.QLOGICAGENT_HOME||y(En(),et)}function ne(){let n=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(n)return n;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let t=process.env.QLOGIC_DEVICE_ID?.trim();return t?`oc_${t}`:"oc_local"}function Pn(n){let e=n.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function re(n=ne()){return y($(),"profiles",Pn(n))}function tt(n=ne()){return y(re(n),"memory")}var Rn="projectData";function nt(){return y($(),Rn)}function ke(n){if(!n)throw new Error("getProjectDataDirById: projectId is required");return y(nt(),n)}function rt(){return y($(),"plugins")}function ot(){return y($(),"skills")}function it(){return y(re(),"settings.json")}function st(){return y($(),"plugin-cache")}function at(){return y($(),"mcp.json")}function dt(){return y($(),"marketplace.json")}function U(n){if(!n)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return y(n,et)}function ut(n){return y(U(n),"plugins")}function ct(n){return y(U(n),"settings.json")}function lt(n){return y(U(n),"INSTRUCTIONS.md")}function ft(n){return y(U(n),"rules")}import{resolve as ii}from"node:path";var Sn=()=>{},be;function pt(){if(In(),!be)throw new Error("host project authority negotiated but snapshot is not hydrated");return{activeProjectId:be.activeProjectId,projects:be.projects.map(n=>({...n}))}}function In(){let n=Sn();if(!n)throw new Error("gateway project authority is not available");return n}function An(){let n=pt();return{activeProjectId:n.activeProjectId,projects:n.projects.map(e=>({...e}))}}function gt(n){return An().projects.find(e=>e.id===n)??null}function $n(n){return gt(n)?n:ye(n)}function jn(n){return ke($n(n))}function mt(n){return Tn(jn(n),"sessions")}var ve=class{constructor(e={}){this.options=e}options;lastActiveWorkdir=null;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){let t=Cn(e);this.lastActiveWorkdir=t,this.options.setActiveWorkdir?.(t)}getActiveWorkdir(){return this.lastActiveWorkdir??this.getActiveProjectRoot()}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return ne()}getUserAgentHome(){return $()}getOwnerProfileDir(e){return re(e)}getProfileMemoryDir(e){return tt(e)}getUserSettingsPath(){return it()}getUserSkillsDir(){return ot()}getUserPluginsDir(){return rt()}getUserMcpConfigPath(){return at()}getUserPluginCacheDir(){return st()}getUserMarketplaceConfigPath(){return dt()}getProjectAgentDir(e=this.getActiveProjectRoot()){return U(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return ct(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return lt(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return ut(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return ft(e)}getProjectSessionDataRoot(e=this.getActiveProjectRoot()){return mt(e)}},Dn=new ve;function oe(){return Dn}function j(n){return D(oe().getProjectAgentDir(n),"workflows")}function kt(n,e){return D(j(e),n,"workflow.json")}function xe(n,e){return D(j(e),n,"revisions")}var Wn=20,Ee=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowStore requires a project cwd")}cwd;async save(e){if(!e.id)throw new Error("WorkflowRecord.id is required");let t=D(j(this.cwd),e.id);await ht(t,{recursive:!0}),await M(kt(e.id,this.cwd),e),await this.snapshotRevision(e)}async snapshotRevision(e){try{let t=xe(e.id,this.cwd);await ht(t,{recursive:!0}),await M(D(t,`${e.rev}.json`),e);let r=await this.revisionNumbers(e.id);for(let o of r.slice(Wn))await yt(D(t,`${o}.json`),{force:!0})}catch{}}async revisionNumbers(e){let t;try{t=await wt(xe(e,this.cwd))}catch{return[]}return t.map(r=>Number(r.replace(/\.json$/,""))).filter(r=>Number.isInteger(r)&&r>0).sort((r,o)=>o-r)}async listRevisions(e){let t=[];for(let r of await this.revisionNumbers(e)){let o=await this.loadRevision(e,r);o&&t.push({rev:r,updatedAt:o.updatedAt,name:o.name,nodeCount:o.def.nodes.length})}return t}async loadRevision(e,t){return W(D(xe(e,this.cwd),`${t}.json`))}async load(e){return W(kt(e,this.cwd))}async require(e){let t=await this.load(e);if(!t)throw new Error(`Workflow "${e}" not found`);return t}async list(){let e;try{e=await wt(j(this.cwd))}catch{return[]}let t=[];for(let r of e){let o=await this.load(r);o&&t.push(o)}return t}async listActive(){return(await this.list()).filter(e=>e.active)}async delete(e){await yt(D(j(this.cwd),e),{recursive:!0,force:!0})}};var B=class{nodes=new Map;edges=[];constructor(e){for(let t of e){if(this.nodes.has(t.id))throw new Error(`Duplicate node ID: ${t.id}`);this.nodes.set(t.id,{id:t.id,kind:t.kind??"agent",params:t.params??{},status:"pending",outPorts:t.outPorts??["default"],joinPolicy:t.joinPolicy??"all",runIndex:0,maxIterations:t.maxIterations})}for(let t of e)for(let r of t.dependsOn??[]){if(!this.nodes.has(r))throw new Error(`Node "${t.id}" depends on unknown node "${r}"`);this.edges.push({from:r,to:t.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let t of this.nodes.values()){if(t.status!=="pending"||this.isBlockedByFailed(t.id))continue;let r=this.incomingForwardEdges(t.id);if(r.length===0){e.push(t);continue}t.joinPolicy==="any"?r.some(o=>this.edgeSatisfied(o))&&e.push(t):r.every(o=>this.edgeSatisfied(o))&&e.push(t)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,t=0,r=0,o=0,i=0,s=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":t++;break;case"failed":r++;break;case"pending":o++;break;case"paused":i++;break;case"skipped":s++;break}return{total:this.nodes.size,completed:e,running:t,failed:r,pending:o,paused:i,skipped:s}}markRunning(e){let t=this.requireNode(e);if(t.status!=="pending")throw new Error(`Node "${e}" is ${t.status}, cannot start`);t.status="running",t.startedAt=Date.now()}markCompleted(e,t){let r=this.requireNode(e);if(r.status!=="running"&&r.status!=="paused")throw new Error(`Node "${e}" is ${r.status}, cannot complete`);r.status="completed",r.output=t.output,r.completedAt=Date.now(),r.firedPorts=t.firedPorts??r.outPorts,t.inputTokens!==void 0&&(r.inputTokens=t.inputTokens),t.outputTokens!==void 0&&(r.outputTokens=t.outputTokens),t.changedFiles!==void 0&&(r.changedFiles=t.changedFiles),r.acceptanceUnverified=t.acceptanceUnverified,this.propagateSkips()}markFailed(e,t){let r=this.requireNode(e);r.status==="completed"||r.status==="skipped"||r.status==="failed"||(r.status="failed",r.error=t,r.completedAt=Date.now(),this.propagateSkips())}markPaused(e){let t=this.requireNode(e);t.status==="running"&&(t.status="paused")}resumePaused(e){let t=this.requireNode(e);t.status==="paused"&&(t.status="pending")}markSkipped(e){let t=this.requireNode(e);if(t.status!=="pending")throw new Error(`Node "${e}" is ${t.status}, cannot skip`);t.status="skipped",t.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,t){let r=this.requireNode(e);if(r.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!r.maxIterations||r.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=r.iteration??0;t&&o<r.maxIterations?(r.iteration=o+1,r.firedPorts=["loop"],this.resetLoopScope(e)):(r.firedPorts=["done"],t&&(r.error=`loop_cap_reached:${r.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let t of e.dependsOn??[])if(!this.nodes.has(t))throw new Error(`Node "${e.id}" depends on unknown node "${t}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let t of e.dependsOn??[])this.edges.push({from:t,to:e.id,fromPort:"default"});try{this.validateDag()}catch(t){throw this.nodes.delete(e.id),this.edges=this.edges.filter(r=>r.to!==e.id||!e.dependsOn?.includes(r.from)),t}}addNodes(e){let t=[],r=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let s of o.dependsOn??[])if(!this.nodes.has(s))throw new Error(`Unknown dep "${s}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),t.push(o.id);let i=(o.dependsOn??[]).map(s=>({from:s,to:o.id,fromPort:"default"}));this.edges.push(...i),r.push(...i)}this.validateDag()}catch(o){for(let i of t)this.nodes.delete(i);throw this.edges=this.edges.filter(i=>!r.includes(i)),o}}removeNode(e){let t=this.requireNode(e);if(t.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(t.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(r=>r.from!==e&&r.to!==e),this.nodes.delete(e)}retryNode(e,t){let r=this.requireNode(e);if(r.status!=="failed")throw new Error(`Node "${e}" is ${r.status}, only failed nodes can be retried`);r.status="pending",r.error=void 0,r.output=void 0,r.firedPorts=void 0,r.startedAt=void 0,r.completedAt=void 0,r.inputTokens=void 0,r.outputTokens=void 0,r.changedFiles=void 0,t&&Object.assign(r.params,t)}resetForReplay(e){if(!this.nodes.has(e))throw new Error(`Node "${e}" not found`);let t=new Set([e]),r=!0;for(;r;){r=!1;for(let i of this.nodes.values()){if(t.has(i.id))continue;this.incomingForwardEdges(i.id).map(a=>a.from).some(a=>t.has(a))&&(t.add(i.id),r=!0)}}let o=[...t].filter(i=>this.nodes.get(i).status==="running");if(o.length>0)throw new Error(`Cannot replay "${e}": task(s) still running in the subtree: ${o.join(", ")}`);for(let i of t){let s=this.nodes.get(i);s.status="pending",s.output=void 0,s.firedPorts=void 0,s.error=void 0,s.startedAt=void 0,s.completedAt=void 0,s.inputTokens=void 0,s.outputTokens=void 0,s.changedFiles=void 0,s.acceptanceUnverified=void 0}return[...t]}updateNodeParams(e,t){let r=this.requireNode(e);if(r.status!=="pending"&&r.status!=="failed")throw new Error(`Node "${e}" is ${r.status}, can only update pending or failed nodes`);Object.assign(r.params,t)}addEdge(e){let{from:t,to:r,fromPort:o="default",loopBack:i=!1}=e;if(!this.nodes.has(t))throw new Error(`Unknown source node "${t}"`);if(!this.nodes.has(r))throw new Error(`Unknown target node "${r}"`);let s=this.nodes.get(t);if(!i&&!s.outPorts.includes(o))throw new Error(`Node "${t}" has no outPort "${o}"`);if(!this.edges.find(u=>u.from===t&&u.to===r&&(u.fromPort??"default")===o))if(this.edges.push({from:t,to:r,fromPort:o,loopBack:i}),i){let u=this.nodes.get(r);if(!u.maxIterations||u.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${r}" requires maxIterations > 0`)}else try{this.validateDag()}catch(u){throw this.edges=this.edges.filter(c=>!(c.from===t&&c.to===r&&(c.fromPort??"default")===o)),u}}removeEdge(e,t,r){let o=r??"default";this.edges=this.edges.filter(i=>!(i.from===e&&i.to===t&&(i.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let t=this.incomingForwardEdges(e.id).map(r=>r.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:t,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,inputTokens:e.inputTokens,outputTokens:e.outputTokens,changedFiles:e.changedFiles,acceptanceUnverified:e.acceptanceUnverified,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let t of e){let r=this.nodes.get(t.id);r&&(r.status=t.status==="running"?"pending":t.status,r.output=t.output,r.error=t.error,r.firedPorts=t.firedPorts,r.startedAt=t.startedAt,r.completedAt=t.completedAt,r.inputTokens=t.inputTokens,r.outputTokens=t.outputTokens,r.changedFiles=t.changedFiles,r.acceptanceUnverified=t.acceptanceUnverified,r.runIndex=t.runIndex??0,r.iteration=t.iteration)}}getUpstreamOutputs(e){if(!this.nodes.get(e))return[];let r=this.incomingForwardEdges(e),o=new Set,i=[];for(let s of r){let a=s.from;if(o.has(a))continue;o.add(a);let u=this.nodes.get(a);if(u&&u.status==="completed"&&u.output!=null){let c=typeof u.output=="string"?u.output:JSON.stringify(u.output);c.trim()&&i.push({taskId:a,output:c})}}return i}edgeSatisfied(e){let t=this.nodes.get(e.from);if(!t||t.status!=="completed")return!1;let r=e.fromPort??"default";return(t.firedPorts??t.outPorts).includes(r)}edgeDead(e){let t=this.nodes.get(e.from);if(!t)return!1;if(t.status==="skipped")return!0;if(t.status==="completed"){if(t.kind==="loop"&&!(t.firedPorts??[]).includes("done"))return!1;let r=e.fromPort??"default";return!(t.firedPorts??t.outPorts).includes(r)}return!1}incomingForwardEdges(e){return this.edges.filter(t=>t.to===e&&!t.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(t=>this.nodes.get(t.from)?.status==="failed")}isSkippable(e){let t=this.incomingForwardEdges(e);return t.length===0?!1:this.nodes.get(e).joinPolicy==="any"?t.every(o=>this.edgeDead(o)):t.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let t of this.nodes.values())t.status==="pending"&&this.isSkippable(t.id)&&(t.status="skipped",t.firedPorts=[],e=!0)}}resetLoopScope(e){let t=this.loopBodyNodes(e);for(let r of t){let o=this.nodes.get(r);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0,o.inputTokens=void 0,o.outputTokens=void 0,o.changedFiles=void 0}}loopBodyNodes(e){let t=new Set,r=(o,i)=>{for(let s of this.edges)s.from!==o||s.loopBack||i&&(s.fromPort??"default")!=="loop"||s.to!==e&&(t.has(s.to)||(t.add(s.to),r(s.to,!1)))};return r(e,!0),t}validateDag(){for(let i of this.edges){if(!this.nodes.has(i.from))throw new Error(`Edge references unknown source "${i.from}"`);if(!this.nodes.has(i.to))throw new Error(`Edge references unknown target "${i.to}"`)}let e=this.edges.filter(i=>!i.loopBack),t=new Set,r=new Set,o=i=>{if(r.has(i))throw new Error(`Cycle detected involving node "${i}"`);if(!t.has(i)){r.add(i);for(let s of e)s.from===i&&o(s.to);r.delete(i),t.add(i)}};for(let i of this.nodes.keys())o(i);for(let i of this.edges){if(!i.loopBack)continue;let s=this.nodes.get(i.to);if(!s?.maxIterations||s.maxIterations<=0)throw new Error(`LoopBack controller "${i.to}" must have maxIterations > 0`)}for(let i of this.nodes.values())if(i.maxIterations!==void 0&&i.maxIterations>1e3)throw new Error(`Loop "${i.id}" maxIterations ${i.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown node: "${e}"`);return t}};function O(n,e){return e?{json:n,binary:e}:{json:n}}function bt(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t].map(r=>({json:r.json,binary:r.binary?Object.fromEntries(Object.keys(r.binary).sort().map(o=>[o,r.binary[o].ref])):void 0}));return Re(e)}function Re(n){return JSON.stringify(Pe(n))}function Pe(n){if(Array.isArray(n))return n.map(Pe);if(n&&typeof n=="object"){let e={};for(let t of Object.keys(n).sort())e[t]=Pe(n[t]);return e}return n}var Pt=new Set(["__proto__","prototype","constructor"]);function vt(n,e){let t=St(n),r=new ae(t,n),o=r.parseExpression();return r.expectEnd(),F(o,e)}function de(n){try{let e=St(n),t=new ae(e,n),r=t.parseExpression();return t.expectEnd(),z(r),null}catch(e){return e instanceof Error?e.message:String(e)}}var Mn=new Set(["input","json","node","now","vars","trigger"]),xt=new Set(["len","upper","lower","default","jsonpath","date","eq","ne","gt","gte","lt","lte","not","and","or","contains"]);function z(n){switch(n.type){case"root":if(!Mn.has(n.name))throw new Error(`Unknown context root "$${n.name}" (allowed: $input $json $node $now $vars $trigger)`);return;case"lit":return;case"func":if(!xt.has(n.name))throw new Error(`Unknown function "${n.name}" (whitelist: ${[...xt].join(", ")})`);n.args.forEach(z);return;case"prop":z(n.target);return;case"index":if(z(n.target),typeof n.key!="number"&&typeof n.key!="string")throw new Error("index key must be a number or string literal");return;case"call":if(!(n.target.type==="root"&&n.target.name==="node"))throw new Error("Only $node(...) is callable in this position");n.args.forEach(z);return}}function I(n,e){let t=n.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return t?vt(t[1],e):n.includes("{{")?n.replace(/\{\{([\s\S]*?)\}\}/g,(r,o)=>{let i=vt(o,e);if(i==null)throw new Error(`Expression "{{${o.trim()}}}" resolved to ${i} in string interpolation`);return typeof i=="object"?JSON.stringify(i):String(i)}):n}function Rt(n,e){return Ie(n,e)}function Ie(n,e){if(typeof n=="string")return I(n,e);if(Array.isArray(n))return n.map(t=>Ie(t,e));if(n&&typeof n=="object"){let t={};for(let[r,o]of Object.entries(n))t[r]=Ie(o,e);return t}return n}function St(n){let e=[],t=0,r=i=>/[A-Za-z_]/.test(i),o=i=>/[A-Za-z0-9_]/.test(i);for(;t<n.length;){let i=n[t];if(/\s/.test(i)){t++;continue}if(i==="$"){t++;let s="";for(;t<n.length&&o(n[t]);)s+=n[t++];if(!s)throw new Error('Bare "$" is not a valid expression');e.push({t:"dollar",v:s});continue}if(r(i)){let s="";for(;t<n.length&&o(n[t]);)s+=n[t++];e.push({t:"id",v:s});continue}if(/[0-9]/.test(i)||i==="-"&&/[0-9]/.test(n[t+1]??"")){let s=n[t++];for(;t<n.length&&/[0-9.]/.test(n[t]);)s+=n[t++];e.push({t:"num",v:s});continue}if(i==='"'||i==="'"){let s=i;t++;let a="";for(;t<n.length&&n[t]!==s;)n[t]==="\\"&&t+1<n.length?(a+=n[t+1],t+=2):a+=n[t++];if(n[t]!==s)throw new Error("Unterminated string literal in expression");t++,e.push({t:"str",v:a});continue}if(".[](),".includes(i)){e.push({t:"punc",v:i}),t++;continue}throw new Error(`Unexpected character "${i}" in expression`)}return e}var ae=class{constructor(e,t){this.toks=e;this.src=t}toks;src;pos=0;parseExpression(){return this.parseAccessors(this.parseAtom())}peek(){return this.toks[this.pos]}next(){return this.toks[this.pos++]}expectEnd(){if(this.pos!==this.toks.length)throw new Error(`Unexpected trailing tokens in expression "${this.src.trim()}"`)}parseAtom(){let e=this.peek();if(!e)throw new Error("Empty expression");if(e.t==="dollar")return this.next(),{type:"root",name:e.v};if(e.t==="num")return this.next(),{type:"lit",value:Number(e.v)};if(e.t==="str")return this.next(),{type:"lit",value:e.v};if(e.t==="id"){if(e.v==="true")return this.next(),{type:"lit",value:!0};if(e.v==="false")return this.next(),{type:"lit",value:!1};if(e.v==="null")return this.next(),{type:"lit",value:null};if(this.next(),this.peek()?.t==="punc"&&this.peek().v==="("){let t=this.parseArgs();return{type:"func",name:e.v,args:t}}throw new Error(`Bare identifier "${e.v}" is not allowed (only whitelist function calls)`)}if(e.t==="punc"&&e.v==="("){this.next();let t=this.parseExpression();return this.expectPunc(")"),t}throw new Error(`Unexpected token "${e.v}" in expression`)}parseAccessors(e){let t=e;for(;;){let r=this.peek();if(!r||r.t!=="punc")break;if(r.v==="."){this.next();let o=this.next();if(!o||o.t!=="id"&&o.t!=="num")throw new Error('Expected property name after "."');t={type:"prop",target:t,key:o.v}}else if(r.v==="["){this.next();let o=this.next(),i;if(o.t==="num")i=Number(o.v);else if(o.t==="str")i=o.v;else throw new Error("Index must be a number or string literal");this.expectPunc("]"),t={type:"index",target:t,key:i}}else if(r.v==="("){let o=this.parseArgs();t={type:"call",target:t,args:o}}else break}return t}parseArgs(){this.expectPunc("(");let e=[];if(this.peek()?.t==="punc"&&this.peek().v===")")return this.next(),e;for(;;){e.push(this.parseExpression());let t=this.next();if(!t)throw new Error("Unterminated argument list");if(t.t==="punc"&&t.v===")")break;if(!(t.t==="punc"&&t.v===","))throw new Error('Expected "," or ")" in argument list')}return e}expectPunc(e){let t=this.next();if(!t||t.t!=="punc"||t.v!==e)throw new Error(`Expected "${e}" in expression`)}},It=Symbol("nodeAccessor");function F(n,e){switch(n.type){case"lit":return n.value;case"root":return On(n.name,e);case"func":return _n(n.name,n.args.map(t=>F(t,e)));case"prop":return Et(F(n.target,e),n.key);case"index":return Et(F(n.target,e),n.key);case"call":{if(F(n.target,e)===It){let r=n.args.map(i=>F(i,e));if(r.length!==1||typeof r[0]!="string")throw new Error("$node(...) takes exactly one string argument");let o=e.nodes?.[r[0]];if(!o)throw new Error(`$node("${r[0]}") not found (not completed or unknown)`);return o}throw new Error("Only $node(...) is callable in this position")}}}function On(n,e){switch(n){case"input":return e.input??{};case"json":return e.json??{};case"vars":return e.vars??{};case"trigger":return e.trigger??{};case"now":return(e.now?e.now():new Date).toISOString();case"node":return It;default:throw new Error(`Unknown context root "$${n}" (allowed: $input $json $node $now $vars $trigger)`)}}function Et(n,e){if(typeof e=="string"&&Pt.has(e))throw new Error(`Access to "${e}" is forbidden`);if(n==null)throw new Error(`Cannot read "${e}" of ${n}`);if(typeof e=="number"){if(!Array.isArray(n))throw new Error(`Cannot index non-array with [${e}]`);return n[e]}return n[e]}function _n(n,e){switch(n){case"len":{let t=e[0];if(typeof t=="string"||Array.isArray(t))return t.length;if(t&&typeof t=="object")return Object.keys(t).length;throw new Error(`len() expects string/array/object, got ${typeof t}`)}case"upper":return String(se(e,0,"upper")).toUpperCase();case"lower":return String(se(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return Hn(e[0],String(se(e,1,"jsonpath")));case"date":return Un(e);case"eq":return Ae(e[0],e[1]);case"ne":return!Ae(e[0],e[1]);case"gt":return ie(e[0],e[1])>0;case"gte":return ie(e[0],e[1])>=0;case"lt":return ie(e[0],e[1])<0;case"lte":return ie(e[0],e[1])<=0;case"not":return!Se(se(e,0,"not"));case"and":return e.every(Se);case"or":return e.some(Se);case"contains":return qn(e[0],e[1]);default:throw new Error(`Unknown function "${n}()" (whitelist: len upper lower default jsonpath date eq ne gt gte lt lte not and or contains)`)}}function Se(n){return!!n}function Ae(n,e){return n===e?!0:typeof n!=typeof e?!1:n&&e&&typeof n=="object"?JSON.stringify(n)===JSON.stringify(e):!1}function ie(n,e){if(typeof n=="number"&&typeof e=="number")return n-e;if(typeof n=="string"&&typeof e=="string")return n<e?-1:n>e?1:0;throw new Error(`Cannot compare ${typeof n} with ${typeof e}`)}function qn(n,e){if(typeof n=="string")return n.includes(String(e));if(Array.isArray(n))return n.some(t=>Ae(t,e));throw new Error("contains() expects string/array as first argument")}function se(n,e,t){if(n.length<=e||n[e]===void 0)throw new Error(`${t}() missing required argument #${e+1}`);return n[e]}function Hn(n,e){let t=e.match(/[^.[\]]+/g)??[],r=n;for(let o of t){if(Pt.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(r==null)return;let i=/^\d+$/.test(o)?Number(o):o;r=r[i]}return r}function Un(n){let e=n.length===0?new Date:new Date(n[0]);if(Number.isNaN(e.getTime()))throw new Error(`date() received an invalid date: ${String(n[0])}`);if(n.length<2)return e.toISOString();let t=String(n[1]),r=o=>String(o).padStart(2,"0");return t.replace(/YYYY/g,String(e.getUTCFullYear())).replace(/MM/g,r(e.getUTCMonth()+1)).replace(/DD/g,r(e.getUTCDate())).replace(/HH/g,r(e.getUTCHours())).replace(/mm/g,r(e.getUTCMinutes())).replace(/ss/g,r(e.getUTCSeconds()))}import{mkdirSync as Bn,writeFileSync as Fn}from"node:fs";import{dirname as Ln,resolve as Kn}from"node:path";var At={filter:["condition"],transform:["mapping"],script:["*"],n8nNode:["*"],agentBinding:["*"],modelBinding:["*"],toolBinding:["*"],integration:["*"],file:["*"],form:["*"],documentLoader:["*"],parser:["*"],retriever:["*"],textSplitter:["*"],vectorStore:["*"],extract:["*"],limit:["*"],split:["*"],respond:["*"]};function ue(n,e){return{json:e.json,vars:n.vars,trigger:n.trigger,now:n.now}}var Jn=(n,e)=>{let t=e.assignments?.assignments;if(Array.isArray(t)){let o={};for(let i of t){if(!i||typeof i!="object")continue;let s=i;typeof s.name!="string"||!s.name||(o[s.name]=or(s.value,s.type))}return{outputs:{default:[{json:o}]}}}return{outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}},Vn=n=>({outputs:{default:n.default??[]}}),Gn=n=>{let e=[];for(let t of Object.keys(n))e.push(...n[t]);return{outputs:{default:e}}},zn=(n,e)=>{let r=!!e.condition?"true":"false",o=n.default??[],i={true:[],false:[]};return i[r]=o,{outputs:i,firedPorts:[r]}},Yn=(n,e,t)=>({outputs:{default:[{json:t.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),Zn=(n,e,t)=>{let r=e.condition;if(typeof r!="string"||!r.trim())throw new Error('filter node requires string param "condition" (per-item {{ }} expression over $json)');return{outputs:{default:(n.default??[]).filter(s=>!!I(r,ue(t,s)))}}},Qn=(n,e)=>{let t=Array.isArray(e.cases)?e.cases:[];if(t.length===0)throw new Error('switch node requires non-empty param "cases" ([{port, condition}])');let r=n.default??[],o=typeof e.defaultPort=="string"&&e.defaultPort?e.defaultPort:"default",i=o;for(let a of t){if(typeof a.port!="string"||!a.port)throw new Error('switch case requires string "port"');if(a.condition){i=a.port;break}}let s={};for(let a of t)typeof a.port=="string"&&(s[a.port]=[]);return s[o]=s[o]??[],s[i]=r,{outputs:s,firedPorts:[i]}},Xn=n=>{let e=n.default??[];return{outputs:{default:[{json:{items:e.map(t=>t.json),count:e.length}}]}}},er=(n,e,t)=>{let r=e.mapping;if(typeof r!="object"||r===null||Array.isArray(r))throw new Error('transform node requires object param "mapping" ({outKey: "{{ expr }}"})');let o=Object.entries(r);if(o.length===0)throw new Error('transform node: "mapping" must have at least one key');return{outputs:{default:(n.default??[]).map(a=>{let u={};for(let[c,g]of o)u[c]=typeof g=="string"?I(g,ue(t,a)):g;return{json:u}})}}},tr=async(n,e,t)=>{if(e.until==="webhook"){let o=t.host;if(!o?.waitWebhook)throw new Error("wait(until=webhook) requires an ExecutorHost with waitWebhook");let i=typeof e.path=="string"&&e.path.trim()?e.path.trim():"";if(!i)throw new Error('wait(until=webhook) requires param "path" (the webhook path to wait for)');let s=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:void 0,a=await o.waitWebhook({path:i.startsWith("/")?i:`/${i}`,nodeId:t.nodeId,workflowId:t.workflowId,timeoutMs:s,signal:t.signal});return{outputs:{default:[...n.default??[],{json:{webhook:a}}]}}}let r=Number(e.ms);if(!Number.isFinite(r)||r<1||r>36e5)throw new Error('wait node requires param "ms" in 1..3600000');return await new Promise((o,i)=>{let s=setTimeout(()=>{t.signal?.removeEventListener("abort",a),o()},r),a=()=>{clearTimeout(s),i(new Error("wait node canceled"))};t.signal?.addEventListener("abort",a,{once:!0})}),{outputs:{default:n.default??[]}}},nr=(n,e,t)=>{let r=typeof e._n8nType=="string"?`(\u6765\u81EA n8n \u8282\u70B9\u300C${e._n8nType}\u300D)`:"";throw new Error(`\u8282\u70B9\u300C${t.nodeId}\u300D${r}\u5BFC\u5165\u65F6\u672A\u80FD\u81EA\u52A8\u8F6C\u6362,\u8BF7\u6253\u5F00\u8282\u70B9\u5B8C\u6210\u4EBA\u5DE5\u8FC1\u79FB\u540E\u518D\u8FD0\u884C`)},k=(n,e,t)=>{let r=typeof e._n8nType=="string"?` (${e._n8nType})`:"",i=(Array.isArray(e._n8nOutPorts)?e._n8nOutPorts:["default"]).filter(c=>typeof c=="string"&&c.length>0),s=n.default??[],a=s.length>0?s:[{json:{imported:!0,nodeId:t.nodeId,kind:t.kind,n8nType:e._n8nType}}],u={};for(let c of i.length>0?i:["default"])u[c]=a;if(u.default||(u.default=a),e._importMode==="n8n-strict-template")throw new Error(`Imported n8n node "${t.nodeId}"${r} requires a native executor or binding before live runs.`);return{outputs:u}},rr=(n,e,t)=>{if((typeof e.operation=="string"?e.operation:"write")!=="write")throw new Error(`Imported file node "${t.nodeId}" supports operation "write" only for live runs`);let o=n.default?.[0];if(!o)throw new Error(`Imported file node "${t.nodeId}" requires an input item`);let i=sr(e.fileName,o,t);if(!i)throw new Error(`Imported file node "${t.nodeId}" requires fileName`);let s=Kn(i);return Bn(Ln(s),{recursive:!0}),Fn(s,ir(o)),{outputs:{default:[{json:{...o.json,fileName:s,written:!0}}]}}},Nt={set:Jn,passthrough:Vn,merge:Gn,if:zn,trigger:Yn,filter:Zn,switch:Qn,aggregate:Xn,transform:er,wait:tr,manual:nr,script:k,n8nNode:k,agentBinding:k,modelBinding:k,toolBinding:k,integration:k,file:rr,form:k,documentLoader:k,parser:k,retriever:k,textSplitter:k,vectorStore:k,extract:k,limit:k,split:k,respond:k};function or(n,e){if(e==="number"){let t=Number(n);return Number.isFinite(t)?t:n}if(e==="boolean"){if(typeof n=="boolean")return n;if(n==="true")return!0;if(n==="false")return!1}return n}function ir(n){return typeof n.json.bodyBase64=="string"?Buffer.from(n.json.bodyBase64,"base64"):typeof n.json.body=="string"?n.json.body:n.json.body!==void 0?JSON.stringify(n.json.body,null,2):typeof n.json.data=="string"?n.json.data:JSON.stringify(n.json,null,2)}function sr(n,e,t){if(typeof n!="string")return"";let r=n.startsWith("=")?n.slice(1):n,o=r.match(/^\{\{\s*([\s\S]*?)\s*\}\}$/);return o?String(ar(o[1],e,t)??""):r.includes("{{")?String(I(r,ue(t,e))):r}function ar(n,e,t){let r=n.match(/^\$json\.([A-Za-z_][A-Za-z0-9_]*)$/);if(r)return e.json[r[1]];let o=n.match(/^(["'])([\s\S]*)\1\s*\+\s*\$json\.([A-Za-z_][A-Za-z0-9_]*)$/);if(o)return`${dr(o[1],o[2])}${String(e.json[o[3]]??"")}`;if(n.startsWith("$json."))return I(`{{ ${n} }}`,ue(t,e));throw new Error(`Imported n8n expression is unsupported at node "${t.nodeId}": ${n}`)}function dr(n,e){if(n==='"')try{return JSON.parse(`"${e}"`)}catch{return e}return e.replace(/\\'/g,"'").replace(/\\\\/g,"\\")}var ur=new Set(["agentBinding","modelBinding","n8nNode","integration"]),Y=class{executors=new Map;constructor(e=!0){if(e)for(let[t,r]of Object.entries(Nt))this.executors.set(t,r)}register(e,t){if(this.executors.has(e))throw new Error(`NodeExecutor for kind "${e}" already registered`);this.executors.set(e,t)}override(e,t){if(!this.executors.has(e))throw new Error(`Cannot override unregistered kind "${e}"`);this.executors.set(e,t)}installHostExecutors(e){for(let[t,r]of Object.entries(e))this.executors.has(t)?ur.has(t)&&this.override(t,r):this.register(t,r)}has(e){return this.executors.has(e)}get(e){let t=this.executors.get(e);if(!t)throw new Error(`No NodeExecutor registered for kind "${e}"`);return t}kinds(){return[...this.executors.keys()]}};function Tt(n,e){let t=n??"any",r=e??"any";return t==="any"||r==="any"||t===r?!0:r==="binary"&&(t==="image"||t==="video"||t==="audio")}function $t(n){return n!=="manual"&&n!=="intent"&&n!=="form"}function Z(n){let e=typeof n=="string"?n.trim():"";if(!e||e==="self")throw new Error('Workflow agent nodes require an explicit agentId; "self" is not a valid identity');return e}function C(n,e){if(!n)throw new Error(`Node kind "${e}" requires a host (ExecutorHost) but none was injected. Provide one via WorkflowRuntimeOptions.host.`);return n}function L(n,e,t){let r=n[e];if(typeof r!="string"||r.length===0)throw new Error(`Node kind "${t}" requires string param "${e}"`);return r}var cr=async(n,e,t)=>({outputs:{default:await C(t.host,"agent").runAgent({agentId:Z(e.agentId),prompt:L(e,"prompt","agent"),input:n.default??[],signal:t.signal})}}),lr=async(n,e,t)=>{let r=C(t.host,"agentBinding"),o=Wt(e,n.default??[],t,"agentBinding");return{outputs:{default:await r.runAgent({agentId:Z(e.agentId),prompt:o,input:n.default??[],signal:t.signal})}}},fr=async(n,e,t)=>{let r=C(t.host,"modelBinding");if(!r.runModel)throw new Error('Node kind "modelBinding" requires an ExecutorHost with runModel');return{outputs:{default:await r.runModel({prompt:Wt(e,n.default??[],t,"modelBinding"),modelHint:Er(e),temperature:Ct(e.temperature),maxTokens:Ct(e.maxTokens),input:n.default??[],signal:t.signal})}}},pr=async(n,e,t)=>{let r=C(t.host,"http"),o=typeof e.method=="string"?e.method:"GET",i=await r.httpRequest({method:o,url:L(e,"url","http"),headers:br(e),body:kr(e),idempotencyKey:Ne(t),signal:t.signal}),s=n.default?.[0]?.json??{};return{outputs:{default:i.map(a=>({...a,json:{...s,...a.json}}))}}},jt=async(n,e,t)=>{if(e._n8nLifecycle===!0&&t.trigger&&typeof t.trigger=="object"){let a=t.trigger.__n8nOutputs;if(a&&typeof a=="object"&&!Array.isArray(a))return{outputs:a}}let r=C(t.host,t.kind);if(!r.runN8nNode)throw new Error(`Node kind "${t.kind}" requires an ExecutorHost with runN8nNode`);let o=L(e,"_n8nType",t.kind),i=Object.fromEntries(Object.entries(e._n8nConnections&&typeof e._n8nConnections=="object"?e._n8nConnections:{}).filter(a=>typeof a[1]=="string"&&a[1].length>0));return{outputs:await r.runN8nNode({n8nType:o,version:typeof e._n8nVersion=="number"?e._n8nVersion:void 0,parameters:Object.fromEntries(Object.entries(e).filter(([a])=>!a.startsWith("_n8n")&&!a.startsWith("_binding"))),...Object.keys(i).length>0?{connectionIds:i}:{},input:n.default??[],idempotencyKey:Ne(t),signal:t.signal})}},gr=async(n,e,t)=>({outputs:{default:await C(t.host,"channel").sendChannel({channel:L(e,"channel","channel"),target:typeof e.target=="string"?e.target:void 0,payload:e.payload??n.default?.[0]?.json??{},input:n.default??[],idempotencyKey:Ne(t),signal:t.signal})}}),mr=async(n,e,t)=>{let r=C(t.host,"memory");if(!r.memory)throw new Error('Node kind "memory" requires an ExecutorHost with a memory backend');let o=L(e,"op","memory");if(o!=="read"&&o!=="write"&&o!=="search")throw new Error(`memory node: op must be "read"|"write"|"search", got "${o}"`);if(e.scope==="global")throw new Error('memory node: scope "global" \u9700\u7ECF\u6743\u9650\u95F8\u95E8(\u672A\u5F00\u653E);\u9ED8\u8BA4\u9879\u76EE\u7EA7\u8BF7\u79FB\u9664 scope');return{outputs:{default:await r.memory({op:o,key:typeof e.key=="string"&&e.key?e.key:void 0,value:e.value!==void 0?e.value:n.default?.[0]?.json,query:typeof e.query=="string"?e.query:void 0,input:n.default??[],signal:t.signal})}}},hr=async(n,e,t)=>{let r=C(t.host,"subworkflow");if(!r.runSubworkflow)throw new Error('Node kind "subworkflow" requires an ExecutorHost with runSubworkflow');let o=e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:n.default?.[0]?.json;return{outputs:{default:await r.runSubworkflow({workflowId:L(e,"workflowId","subworkflow"),callerWorkflowId:t.workflowId,projectId:typeof e.projectId=="string"&&e.projectId?e.projectId:void 0,payload:o,input:n.default??[],signal:t.signal})}}},wr=async(n,e,t)=>{let r=C(t.host,"approval");if(!r.approval)throw new Error('Node kind "approval" requires an ExecutorHost with approval');let o=await r.approval({nodeId:t.nodeId,workflowId:t.workflowId,prompt:typeof e.prompt=="string"&&e.prompt?e.prompt:void 0,timeoutMs:typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:void 0,timeoutAction:e.timeoutAction==="approve"||e.timeoutAction==="reject"||e.timeoutAction==="keepPending"?e.timeoutAction:void 0,input:n.default??[],signal:t.signal});if(!o.approved)throw new Error(`approval node "${t.nodeId}" denied${o.note?`: ${o.note}`:""} (${o.decidedAt})`);return{outputs:{default:[...n.default??[],{json:{approved:!0,decidedAt:o.decidedAt,...o.note?{note:o.note}:{}}}]}}},ce={agent:cr,agentBinding:lr,modelBinding:fr,n8nNode:jt,integration:jt,http:pr,channel:gr,memory:mr,subworkflow:hr,approval:wr},yr=Object.keys(ce);function Ne(n){if(!(!n.workflowId||!n.runId))return`workflow:${n.workflowId}:${n.runId}:${n.nodeId}:${n.runIndex}`}function kr(n){if(n.body!==void 0)return n.body;if(n.sendBody!==!0)return;let e=Dt(n.bodyParameters);if(e.length!==0)return Object.fromEntries(e)}function br(n){let e={};if(n.headers&&typeof n.headers=="object"&&!Array.isArray(n.headers))for(let[t,r]of Object.entries(n.headers))typeof r=="string"&&(e[t]=r);for(let[t,r]of Dt(n.headerParameters))e[t]=String(r);return Object.keys(e).length>0?e:void 0}function Dt(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?n.parameters:void 0;if(!Array.isArray(e))return[];let t=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r;typeof o.name!="string"||!o.name||t.push([o.name,o.value??""])}return t}function Wt(n,e,t,r){let o=xr(n.prompt,n.text,n.message,n.input);if(!o)throw new Error(`Node kind "${r}" requires a prompt/text parameter`);return vr(o,{json:e[0]?.json??{},input:{default:e},vars:t.vars,trigger:t.trigger,now:t.now})}function vr(n,e){let t=n.startsWith("=")?n.slice(1):n;return t.includes("{{")?String(I(t,e)):t}function xr(...n){for(let e of n)if(typeof e=="string"&&e.trim())return e}function Er(n){let e=n.model??n.modelName;if(typeof e=="string"&&e)return e;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e.value??e.cachedResultName;if(typeof t=="string"&&t)return t}}function Ct(n){let e=typeof n=="number"?n:typeof n=="string"?Number(n):NaN;return Number.isFinite(e)?e:void 0}var K=class extends Error{constructor(t){super(t?`Workflow paused at "${t}"`:"Workflow paused");this.atNodeId=t;this.name="WorkflowPauseSignal"}atNodeId},E=class extends Error{constructor(e="Workflow run canceled"){super(e),this.name="WorkflowRunCanceled"}},Q=class{constructor(e,t={}){this.def=e;this.registry=t.registry??new Y,this.gate=t.gate,this.now=t.now??(()=>new Date),this.trigger=t.trigger,this.triggerKind=t.triggerKind,this.runId=t.runId,this.log=t.log,this.host=t.host,this.abortController=t.signal?void 0:new AbortController,this.signal=t.signal??this.abortController.signal,this.checkpoint=t.checkpoint,this.preserveCheckpoint=t.preserveCheckpoint===!0,this.onNodeStatus=t.onNodeStatus,this.host&&!t.registry&&this.registry.installHostExecutors(ce);for(let r of e.nodes)this.nodeDefs.set(r.id,r);for(let r of e.edges)r.loopBack&&this.loopBackOf.set(r.from,r.to)}def;registry;gate;now;trigger;triggerKind;runId;log;host;abortController;signal;checkpoint;preserveCheckpoint;onNodeStatus;checkpointWriteChain=Promise.resolve();dag;nodeDefs=new Map;nodeOutputs=new Map;cache=new Map;loopBackOf=new Map;pauseRequested=!1;nodeStats={};statsSeq=0;checkpointLoaded=!1;setNodeParams(e,t){let r=this.nodeDefs.get(e);if(!r)throw new Error(`Unknown node "${e}"`);r.params={...r.params??{},...t}}pause(){this.pauseRequested=!0}cancel(e="Workflow run canceled"){let t=new E(e);this.abortController&&!this.abortController.signal.aborted&&this.abortController.abort(t)}extendBudget(e){if(!this.gate?.extend)throw new Error("WorkflowRuntime has no extensible budget gate to raise");this.gate.extend(e)}async run(){await this.loadCheckpoint(),this.throwIfCanceled(),this.dag=this.buildDag(),this.nodeOutputs.clear(),this.pauseRequested=!1;let e=new Set,t;try{let i=0;for(;!this.dag.isFinished();){if(++i>1e5)throw new Error("WorkflowRuntime did not converge");let s=this.dag.getReadyNodes();if(s.length===0)break;let u=(await Promise.allSettled(s.map(c=>this.executeNode(c,e)))).find(c=>c.status==="rejected");if(u)throw u.reason}}catch(i){if(i instanceof K)t=i.atNodeId;else throw i}let r={};for(let[i,s]of this.nodeOutputs)r[i]=s;let o=t?"paused":this.dag.isAllCompleted()?"completed":"failed";return o==="completed"&&this.checkpoint&&(this.preserveCheckpoint?await this.persistCheckpoint():await this.checkpoint.clear()),{status:o,outputs:r,executed:e,progress:this.dag.getProgress(),pausedAt:t,nodeStats:{...this.nodeStats}}}async loadCheckpoint(){if(!this.checkpoint||this.checkpointLoaded)return;this.checkpointLoaded=!0;let e=await this.checkpoint.load();if(e)for(let t of e.entries)this.cache.set(t.key,t.result)}async persistCheckpoint(){this.checkpoint&&(this.checkpointWriteChain=this.checkpointWriteChain.then(async()=>{let e=[...this.cache.entries()].map(([t,r])=>({key:t,result:r}));await this.checkpoint.persist(e)}),await this.checkpointWriteChain)}async executeNode(e,t){if(this.throwIfCanceled(),this.pauseRequested)throw new K(e.id);if(e.kind==="loop"){this.enterLoop(e);return}let r=this.collectInputs(e.id),o=this.buildExprContext(r),i=this.nodeDefs.get(e.id)?.params??{},s=At[e.kind]??[],a=s.includes("*"),u=a?{}:s.length>0?Object.fromEntries(Object.entries(i).filter(([w])=>!s.includes(w))):i,c={...Rt(u,o),...a?i:Object.fromEntries(s.filter(w=>w in i).map(w=>[w,i[w]]))},g=this.cacheKey(e.kind,c,r,e.runIndex),p=Date.now(),d=0,f=(w,x)=>{let R=Date.now();this.nodeStats[e.id]={seq:++this.statsSeq,startedAt:new Date(p).toISOString(),finishedAt:new Date(R).toISOString(),durationMs:R-p,attempts:d,cacheHit:x,status:w}},l=this.cache.get(g),m=l!==void 0,h=!1;if(l)this.dag.markRunning(e.id);else{this.gate?.check(e.id,e.kind),this.dag.markRunning(e.id),this.onNodeStatus?.(e.id,"running");let w=this.nodeDefs.get(e.id),x=Math.max(1,w?.retry?.maxTries??1),R=Math.max(0,w?.retry?.backoffMs??1e3),we=w?.timeoutMs,S;for(let N=0;N<x;N++){d++,this.throwIfCanceled();let T={nodeId:e.id,kind:e.kind,workflowId:this.def.id,runId:this.runId,triggerKind:this.triggerKind,runIndex:e.runIndex,vars:this.def.vars??{},trigger:this.trigger,now:this.now,log:this.log,host:this.host,signal:we!==void 0&&we>0?AbortSignal.any([this.signal,AbortSignal.timeout(we)]):this.signal};try{if(l=await this.registry.get(e.kind)(r,c,T),T.signal?.aborted)throw T.signal.reason instanceof Error?T.signal.reason:new Error(`node "${e.id}" execution was aborted`);S=void 0;break}catch(G){if(this.isCanceled())throw this.canceledError(G);S=G;let Xe=N+1<x;this.log?.warn(`node "${e.id}" attempt ${N+1}/${x} failed: ${G instanceof Error?G.message:String(G)}`+(Xe?` \u2014 retrying in ${R*2**N}ms`:"")),Xe&&await this.cancellableDelay(R*2**N)}}if(S!==void 0){let N=w?.onError??"stop",T=S instanceof Error?S.message:String(S);if(N==="errorPort")this.onNodeStatus?.(e.id,"failed",T),l={outputs:{error:[{json:{error:T,nodeId:e.id,kind:e.kind,attempts:x}}]},firedPorts:["error"]},h=!0;else if(N==="continue")this.onNodeStatus?.(e.id,"failed",T),l={outputs:{},firedPorts:[]},h=!0;else throw this.onNodeStatus?.(e.id,"failed",T),f("failed",!1),S&&typeof S=="object"&&!S.nodeId&&(S.nodeId=e.id),S}this.throwIfCanceled(),h?t.add(e.id):(this.cache.set(g,l),t.add(e.id),await this.persistCheckpoint())}this.nodeOutputs.set(e.id,l.outputs),this.dag.markCompleted(e.id,{output:l.outputs,firedPorts:l.firedPorts}),h||this.onNodeStatus?.(e.id,"completed"),f(h?"failed":"completed",m);let v=this.loopBackOf.get(e.id);v&&this.decideLoopBack(v)}enterLoop(e){this.dag.markRunning(e.id);let t={loop:[{json:{iteration:e.iteration??0}}],done:[]};this.nodeOutputs.set(e.id,t),this.dag.markCompleted(e.id,{output:t,firedPorts:["loop"]}),this.onNodeStatus?.(e.id,"completed")}decideLoopBack(e){let t=this.evalLoopCondition(e);this.dag.decideLoop(e,t);let r=this.dag.getNode(e);this.surfaceLoopCap(r);let o=r.firedPorts??[];this.nodeOutputs.set(e,{loop:o.includes("loop")?[{json:{iteration:r.iteration??0}}]:[],done:o.includes("done")?[{json:{iteration:r.iteration??0}}]:[]})}surfaceLoopCap(e){if(!e.error?.startsWith("loop_cap_reached:")||this.nodeStats[e.id]?.warning)return;let t=`loop "${e.id}" hit its maxIterations cap (${e.maxIterations}) \u2014 forced exit via "done" while the loop condition still asked to continue`;this.log?.warn(t);let r=this.nodeStats[e.id],o=new Date().toISOString();this.nodeStats[e.id]=r?{...r,warning:t}:{seq:++this.statsSeq,startedAt:o,finishedAt:o,durationMs:0,attempts:0,cacheHit:!1,status:"completed",warning:t}}evalLoopCondition(e){let r=this.nodeDefs.get(e)?.params?.condition;if(r==null||r==="")return!0;let o=this.buildExprContext({});return!!(typeof r=="string"?I(r,o):r)}collectInputs(e){let t={};for(let r of this.def.edges){if(r.to!==e||r.loopBack)continue;let o=r.fromPort??"default",i=r.toPort??"default",s=this.nodeOutputs.get(r.from);if(!s)continue;let a=s[o];a&&(t[i]??=[]).push(...a)}return t}buildExprContext(e){let t={};for(let[r,o]of this.nodeOutputs)t[r]={output:o};return{input:e,json:e.default?.[0]?.json??{},nodes:t,vars:this.def.vars??{},trigger:this.trigger,now:this.now}}cacheKey(e,t,r,o){return Re([e,t,bt(r),o])}isCanceled(){return this.signal.aborted}canceledError(e){let t=this.signal.reason;return t instanceof E?t:t instanceof Error?new E(t.message):e instanceof E?e:e instanceof Error&&this.signal.aborted?new E(e.message):new E(t===void 0?"Workflow run canceled":String(t))}throwIfCanceled(){if(this.isCanceled())throw this.canceledError()}cancellableDelay(e){return e<=0?Promise.resolve():new Promise((t,r)=>{let o=setTimeout(()=>{this.signal.removeEventListener("abort",i),t()},e),i=()=>{clearTimeout(o),r(this.canceledError())};this.signal.addEventListener("abort",i,{once:!0})})}buildDag(){let e=this.def.nodes.map(r=>{let o=r.outPorts??Pr(r.kind);return r.onError==="errorPort"&&!o.includes("error")&&(o=[...o,"error"]),{id:r.id,kind:r.kind,params:r.params??{},outPorts:o,joinPolicy:r.joinPolicy??"all",maxIterations:r.maxIterations}}),t=new B(e);for(let r of this.def.edges)r.loopBack||t.addEdge({from:r.from,to:r.to,fromPort:r.fromPort??"default"});for(let r of this.def.edges)r.loopBack&&t.addEdge({from:r.from,to:r.to,loopBack:!0});return t}};function Pr(n){return n==="if"?["true","false"]:n==="loop"?["loop","done"]:["default"]}var Rr=new Set(["agent","action","http","channel","im"]);var Te=class extends Error{constructor(t,r,o){super(`Permission denied: node "${t}" (kind "${r}") may not run under unattended trigger "${o}". Authorize it by adding "${r}" to allowUnattendedKinds.`);this.nodeId=t;this.kind=r;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},le=class extends K{constructor(t,r,o){super(t);this.reason=r;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${r} limit ${o}) before node "${t}"`}reason;limit},fe=class{trigger;maxNodeExecutions;maxDurationMs;allow;now;executions=0;startedAt=-1;constructor(e){if(!Number.isInteger(e.maxNodeExecutions)||e.maxNodeExecutions<=0)throw new Error(`BudgetPermissionGate: maxNodeExecutions must be a positive integer, got ${e.maxNodeExecutions}`);if(e.maxDurationMs!==void 0&&!(e.maxDurationMs>0))throw new Error(`BudgetPermissionGate: maxDurationMs must be greater than 0 when provided, got ${e.maxDurationMs}`);this.trigger=e.trigger,this.maxNodeExecutions=e.maxNodeExecutions,this.maxDurationMs=e.maxDurationMs,this.allow=new Set(e.allowUnattendedKinds??[]),this.now=e.now??(()=>Date.now())}get unattended(){return $t(this.trigger)}check(e,t){if(this.unattended&&Rr.has(t)&&!this.allow.has(t))throw new Te(e,t,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new le(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new le(e,"executions",this.maxNodeExecutions);this.executions++}extend(e){if(e.executions!==void 0){if(!Number.isInteger(e.executions)||e.executions<=0)throw new Error(`BudgetPermissionGate.extend: executions delta must be a positive integer, got ${e.executions}`);this.maxNodeExecutions+=e.executions}if(e.durationMs!==void 0){if(!(e.durationMs>0))throw new Error(`BudgetPermissionGate.extend: durationMs delta must be greater than 0, got ${e.durationMs}`);if(this.maxDurationMs===void 0)throw new Error("BudgetPermissionGate.extend: cannot extend duration on a gate with no duration cap");this.maxDurationMs+=e.durationMs}}};function _t(n){switch(n.type){case"manual":return[];case"schedule":return[...$r(n.cron),...Sr(n.timezone,n.misfirePolicy)];case"im-message":return Dr(n.channel,n.match);case"webhook":return Wr(n.path);case"intent":return Ar(n.phrases,n.aliases,n.surfaces);case"form":return Tr(n.fields);default:return[`unknown trigger type: ${JSON.stringify(n)}`]}}function Sr(n,e){let t=[];if(n!==void 0)if(typeof n!="string"||!n.trim())t.push("schedule.timezone must be a non-empty IANA timezone");else try{new Intl.DateTimeFormat("en",{timeZone:n}).format(0)}catch{t.push(`schedule.timezone is not a supported IANA timezone: ${JSON.stringify(n)}`)}return e!==void 0&&e!=="run-once"&&e!=="skip"&&t.push('schedule.misfirePolicy must be "run-once" or "skip"'),t}var Ir=new Set(["welcome","chat"]);function Ar(n,e,t){let r=[];if(!Array.isArray(n)||n.length===0)r.push("intent.phrases must be a non-empty array of trigger phrases");else for(let o of n)(typeof o!="string"||o.trim()==="")&&r.push(`intent.phrases entries must be non-empty strings, got ${JSON.stringify(o)}`);if(e!==void 0)if(!Array.isArray(e))r.push("intent.aliases must be an array when present");else for(let o of e)(typeof o!="string"||o.trim()==="")&&r.push(`intent.aliases entries must be non-empty strings, got ${JSON.stringify(o)}`);if(t!==void 0)if(!Array.isArray(t)||t.length===0)r.push("intent.surfaces must be a non-empty array when present");else for(let o of t)(typeof o!="string"||!Ir.has(o))&&r.push(`intent.surfaces entries must be "welcome"|"chat", got ${JSON.stringify(o)}`);return r}var Nr=new Set(["text","number","select"]);function Tr(n){let e=[];if(!Array.isArray(n)||n.length===0)return["form.fields must be a non-empty array"];let t=new Set;for(let r of n){if(typeof r?.key!="string"||!/^[\w-]+$/.test(r.key)){e.push(`form field key must be a [\\w-]+ string, got ${JSON.stringify(r?.key)}`);continue}t.has(r.key)&&e.push(`duplicate form field key "${r.key}"`),t.add(r.key),r.type!==void 0&&(typeof r.type!="string"||!Nr.has(r.type))&&e.push(`form field "${r.key}": type must be text|number|select`),r.type==="select"&&(!Array.isArray(r.options)||r.options.length===0)&&e.push(`form field "${r.key}": select requires non-empty options`)}return e}var Mt=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Ot=["SUN","MON","TUE","WED","THU","FRI","SAT"];function $r(n){if(typeof n!="string"||n.trim()==="")return["schedule.cron must be a non-empty string"];let e=n.trim().split(/\s+/);if(e.length!==5&&e.length!==6)return[`schedule.cron must have 5 or 6 fields, got ${e.length}: "${n}"`];let r=e.length===6?[{label:"second",min:0,max:59},{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Mt},{label:"day-of-week",min:0,max:7,names:Ot}]:[{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Mt},{label:"day-of-week",min:0,max:7,names:Ot}],o=[];for(let i=0;i<r.length;i++){let s=jr(e[i],r[i]);s&&o.push(`schedule.cron ${s}`)}return o}function jr(n,e){for(let t of n.split(",")){let r=Cr(t,e);if(r)return r}}function Cr(n,e){if(n==="")return`${e.label} has an empty list element`;let t=n,r,o=n.indexOf("/");if(o!==-1&&(t=n.slice(0,o),r=n.slice(o+1),!/^\d+$/.test(r)||Number(r)<=0))return`${e.label} has an invalid step "/${r}"`;if(t==="*")return;let i=t.indexOf("-");if(i!==-1){let a=$e(t.slice(0,i),e),u=$e(t.slice(i+1),e);return a===void 0||u===void 0?`${e.label} has an invalid range "${t}"`:a>u?`${e.label} range "${t}" is descending`:void 0}if(t===""&&r!==void 0)return`${e.label} step "${n}" needs a base ("*" or a range)`;if($e(t,e)===void 0)return`${e.label} value "${t}" is out of range ${e.min}-${e.max}`}function $e(n,e){let t;if(/^\d+$/.test(n))t=Number(n);else if(e.names){let r=e.names.indexOf(n.toUpperCase());if(r===-1)return;t=e.label==="month"?r+1:r}else return;if(!(t<e.min||t>e.max))return t}function Dr(n,e){let t=[];if((typeof n!="string"||n.trim()==="")&&t.push("im-message.channel must be a non-empty string"),e!==void 0)if(typeof e!="string")t.push("im-message.match must be a string regex");else try{new RegExp(e)}catch(r){t.push(`im-message.match is not a valid regex: ${r.message}`)}return t}function Wr(n){return typeof n!="string"||n===""?["webhook.path must be a non-empty string"]:n.startsWith("/")?/\s/.test(n)?[`webhook.path must not contain whitespace: "${n}"`]:n.includes("..")?[`webhook.path must not contain "..": "${n}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(n)?[]:[`webhook.path contains illegal characters: "${n}"`]:[`webhook.path must start with "/": "${n}"`]}var P=class extends Error{constructor(t){super(`Patch rejected: ${t.join("; ")}`);this.errors=t;this.name="PatchError"}errors};function Ce(n,e){let t=[],r=qr(n),o=new Map(r.def.nodes.map(p=>[p.id,p])),i=e.scope?new Set(e.scope):void 0,s=new Set,a=p=>!i||i.has(p)||s.has(p),u=[];for(let[p,d]of e.patch.entries()){let f=`op[${p}] ${d.op}`;switch(d.op){case"add_node":{d.node?.id?o.has(d.node.id)?t.push(`${f}: node "${d.node.id}" already exists`):(r.def.nodes.push(d.node),o.set(d.node.id,d.node),i&&s.add(d.node.id)):t.push(`${f}: node.id is required`);break}case"remove_node":{o.has(d.nodeId)?a(d.nodeId)?(r.def.nodes=r.def.nodes.filter(l=>l.id!==d.nodeId),o.delete(d.nodeId),r.def.edges=r.def.edges.filter(l=>l.from!==d.nodeId&&l.to!==d.nodeId)):t.push(`${f}: node "${d.nodeId}" is outside the edit scope`):t.push(`${f}: node "${d.nodeId}" not found`);break}case"update_params":{let l=o.get(d.nodeId);l?a(d.nodeId)?l.params=Mr(l.params,d.params):t.push(`${f}: node "${d.nodeId}" is outside the edit scope`):t.push(`${f}: node "${d.nodeId}" not found`);break}case"rename_node":{let l=o.get(d.nodeId);l?a(d.nodeId)?l.name=d.name:t.push(`${f}: node "${d.nodeId}" is outside the edit scope`):t.push(`${f}: node "${d.nodeId}" not found`);break}case"set_node_options":{let l=o.get(d.nodeId);if(!l){t.push(`${f}: node "${d.nodeId}" not found`);break}if(!a(d.nodeId)){t.push(`${f}: node "${d.nodeId}" is outside the edit scope`);break}d.retry!==void 0&&(d.retry===null?delete l.retry:!Number.isInteger(d.retry.maxTries)||d.retry.maxTries<1||d.retry.maxTries>10?t.push(`${f}: retry.maxTries must be an integer 1..10`):d.retry.backoffMs!==void 0&&(!Number.isFinite(d.retry.backoffMs)||d.retry.backoffMs<0)?t.push(`${f}: retry.backoffMs must be a non-negative number`):l.retry={maxTries:d.retry.maxTries,...d.retry.backoffMs!==void 0?{backoffMs:d.retry.backoffMs}:{}}),d.timeoutMs!==void 0&&(d.timeoutMs===null?delete l.timeoutMs:!Number.isFinite(d.timeoutMs)||d.timeoutMs<=0?t.push(`${f}: timeoutMs must be a positive number`):l.timeoutMs=d.timeoutMs),d.onError!==void 0&&(d.onError===null?delete l.onError:d.onError!=="stop"&&d.onError!=="continue"&&d.onError!=="errorPort"?t.push(`${f}: onError must be "stop"|"continue"|"errorPort"`):l.onError=d.onError);break}case"set_node_ui":{if(!d.positions||typeof d.positions!="object"){t.push(`${f}: positions is required`);break}for(let[l,m]of Object.entries(d.positions)){let h=o.get(l);if(!h){t.push(`${f}: node "${l}" not found`);continue}if(!a(l)){t.push(`${f}: node "${l}" is outside the edit scope`);continue}if(m===null){delete h.ui;continue}if(!Number.isFinite(m?.x)||!Number.isFinite(m?.y)){t.push(`${f}: position for "${l}" must be finite {x,y}`);continue}h.ui={x:m.x,y:m.y}}break}case"add_edge":{let l=d.edge;if(!l?.from||!l?.to){t.push(`${f}: edge.from and edge.to are required`);break}if(i&&!a(l.from)&&!a(l.to)){t.push(`${f}: edge ${l.from}\u2192${l.to} has no endpoint in the edit scope`);break}let m=l.fromPort??"default";if(r.def.edges.some(R=>R.from===l.from&&R.to===l.to&&(R.fromPort??"default")===m)){t.push(`${f}: \u8FDE\u7EBF\u5DF2\u5B58\u5728(${l.from} \u2192 ${l.to})`);break}let h=o.get(l.from),v=o.get(l.to),w=h?.outPortTypes?.[m],x=v?.inPorts?.find(R=>R.name===(l.toPort??"default"))?.type;if(!Tt(w,x)){t.push(`${f}: \u7AEF\u53E3\u7C7B\u578B\u4E0D\u5339\u914D:\u300C${h?.name??l.from}\u300D\u8F93\u51FA ${w??"any"},\u300C${v?.name??l.to}\u300D\u9700\u8981 ${x??"any"} \u2014\u2014 \u63A5\u4E0D\u4E0A,\u8BF7\u6362\u4E2A\u76EE\u6807\u7AEF\u53E3`);break}r.def.edges.push(l);break}case"remove_edge":{let l=d.edge;if(!l?.from||!l?.to){t.push(`${f}: edge.from and edge.to are required`);break}let{from:m,to:h,fromPort:v}=l;if(i&&!a(m)&&!a(h))t.push(`${f}: edge ${m}\u2192${h} has no endpoint in the edit scope`);else{let w=r.def.edges.length;r.def.edges=r.def.edges.filter(x=>!(x.from===m&&x.to===h&&(x.fromPort??"default")===(v??"default"))),r.def.edges.length===w&&t.push(`${f}: edge ${m}\u2192${h} not found`)}break}case"set_trigger":{if(i)t.push(`${f}: trigger is workflow-global and cannot be changed in a scoped edit`);else if(d.trigger){let l=_t(d.trigger);if(l.length>0)for(let m of l)t.push(`${f}: ${m}`);else r.meta.trigger=d.trigger}else r.meta.trigger=d.trigger;break}case"set_meta":{i?t.push(`${f}: meta is workflow-global and cannot be changed in a scoped edit`):(d.meta.name!==void 0&&(r.meta.name=d.meta.name),d.meta.active!==void 0&&(r.meta.active=d.meta.active));break}default:t.push(`${f}: unknown op`)}t.length===0&&u.push(d)}if(t.length>0)throw new P(t);qt(r.def,t);let c=je(r.def),g=[];if(i){let p=new Set(je(n.def).map(d=>d.message));for(let d of c)i.has(d.nodeId)||s.has(d.nodeId)||!p.has(d.message)?t.push(d.message):g.push({classification:"preexisting",nodeId:d.nodeId,message:d.message})}else t.push(...c.map(p=>p.message));if(t.length>0)throw new P(t);return{target:r,applied:u,diagnostics:g}}function Mr(n,e){let t={...n??{}};for(let[r,o]of Object.entries(e))o===null?delete t[r]:t[r]=o;return t}function J(n){let e=[];for(let t of n.nodes)(t.kind==="tool"||t.kind==="skill"||t.kind==="mcp")&&e.push(`\u8282\u70B9\u300C${t.id}\u300D\u4F7F\u7528\u4E86\u4E0D\u53D7\u652F\u6301\u7684\u975E\u6807\u51C6 kind "${t.kind}";\u8BF7\u6539\u7528 Agent \u63D2\u4EF6\u6216 canonical Action \u8282\u70B9`);return qt(n,e),Or(n,e),e}function Or(n,e){e.push(...je(n).map(t=>t.message))}function je(n){let e=[],t=(r,o,i)=>{if(typeof r=="string"){if(r.startsWith("="))return;for(let s of r.matchAll(/\{\{([\s\S]*?)\}\}/g)){let a=de(s[1].trim());a&&e.push({nodeId:o,message:`\u8282\u70B9\u300C${o}\u300D\u53C2\u6570 ${i} \u7684\u8868\u8FBE\u5F0F\u300C{{ ${s[1].trim()} }}\u300D\u8D85\u51FA\u53D7\u9650\u8BED\u8A00:${a}`})}return}if(Array.isArray(r)){r.forEach((s,a)=>t(s,o,`${i}[${a}]`));return}if(r&&typeof r=="object")for(let[s,a]of Object.entries(r))t(a,o,i?`${i}.${s}`:s)};for(let r of n.nodes)r.params?._importMode!=="n8n-strict-template"&&r.params&&t(r.params,r.id,"");return e}function qt(n,e){try{let t=n.nodes.map(o=>{let i=o.outPorts??_r(o.kind);return o.onError==="errorPort"&&!i.includes("error")&&(i=[...i,"error"]),{id:o.id,kind:o.kind,params:o.params??{},outPorts:i,joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations}}),r=new B(t);for(let o of n.edges)o.loopBack||r.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of n.edges)o.loopBack&&r.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(t){e.push(`graph invalid: ${t.message}`)}}function _r(n){return n==="if"?["true","false"]:n==="loop"?["loop","done"]:["default"]}function qr(n){return{def:{...n.def,nodes:n.def.nodes.map(e=>({...e,params:e.params?{...e.params}:void 0})),edges:n.def.edges.map(e=>({...e})),vars:n.def.vars?{...n.def.vars}:void 0},meta:{...n.meta}}}function De(n,e={}){let t=e.maxNodes??50,r=e.maxValueLen??60,o=`Workflow ${JSON.stringify(n.name)} (rev ${n.rev}, trigger: ${Hr(n.trigger)}, ${n.active?"active":"inactive"})`,i=n.def.nodes,a=i.slice(0,t).map(p=>" "+Ur(p,r)),u=i.length===0?"nodes: (none)":["nodes:",...a].join(`
1
+ import{join as C}from"node:path";import{mkdir as gt,readdir as mt,rm as ht}from"node:fs/promises";import{readFile as cn,writeFile as ln,mkdir as fn,rename as pn,unlink as gn}from"node:fs/promises";import{dirname as mn,join as hn}from"node:path";import{randomUUID as wn}from"node:crypto";async function yn(n,e){let t=mn(n);await fn(t,{recursive:!0});let r=hn(t,`.tmp-${wn()}`);try{await ln(r,e,"utf-8");let o;for(let i=0;i<3;i++)try{await pn(r,n);return}catch(s){if(o=s,s.code!=="EPERM")throw s;await new Promise(a=>setTimeout(a,50*(i+1)))}throw o}catch(o){throw await gn(r).catch(()=>{}),o}}async function D(n){try{let e=await cn(n,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function W(n,e){await yn(n,JSON.stringify(e,null,2)+`
2
+ `)}import{resolve as $n}from"node:path";import{join as An}from"node:path";import{homedir as vn}from"node:os";import{join as b}from"node:path";import{existsSync as Qo}from"node:fs";import{createHash as kn}from"node:crypto";import{resolve as bn}from"node:path";function ye(n){return kn("sha256").update(bn(n).toLowerCase()).digest("hex").slice(0,16)}var et=".qlogicagent";function M(){return process.env.QLOGICAGENT_HOME||b(vn(),et)}function ne(){let n=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(n)return n;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let t=process.env.QLOGIC_DEVICE_ID?.trim();return t?`oc_${t}`:"oc_local"}function xn(n){let e=n.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function re(n=ne()){return b(M(),"profiles",xn(n))}function tt(n=ne()){return b(re(n),"memory")}var En="projectData";function nt(){return b(M(),En)}function ke(n){if(!n)throw new Error("getProjectDataDirById: projectId is required");return b(nt(),n)}function rt(){return b(M(),"plugins")}function ot(){return b(re(),"settings.json")}function it(){return b(M(),"plugin-cache")}function st(){return b(M(),"marketplace.json")}function U(n){if(!n)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return b(n,et)}function at(n){return b(U(n),"plugins")}function dt(n){return b(U(n),"settings.json")}function ut(n){return b(U(n),"INSTRUCTIONS.md")}function ct(n){return b(U(n),"rules")}import{resolve as ri}from"node:path";var Pn=()=>{},be;function lt(){if(Rn(),!be)throw new Error("host project authority negotiated but snapshot is not hydrated");return{activeProjectId:be.activeProjectId,projects:be.projects.map(n=>({...n}))}}function Rn(){let n=Pn();if(!n)throw new Error("gateway project authority is not available");return n}function Sn(){let n=lt();return{activeProjectId:n.activeProjectId,projects:n.projects.map(e=>({...e}))}}function ft(n){return Sn().projects.find(e=>e.id===n)??null}function Nn(n){return ft(n)?n:ye(n)}function Tn(n){return ke(Nn(n))}function pt(n){return An(Tn(n),"sessions")}var ve=class{constructor(e={}){this.options=e}options;lastActiveWorkdir=null;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){let t=$n(e);this.lastActiveWorkdir=t,this.options.setActiveWorkdir?.(t)}getActiveWorkdir(){return this.lastActiveWorkdir??this.getActiveProjectRoot()}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return ne()}getUserAgentHome(){return M()}getOwnerProfileDir(e){return re(e)}getProfileMemoryDir(e){return tt(e)}getUserSettingsPath(){return ot()}getUserPluginsDir(){return rt()}getUserPluginCacheDir(){return it()}getUserMarketplaceConfigPath(){return st()}getProjectAgentDir(e=this.getActiveProjectRoot()){return U(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return dt(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return ut(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return at(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return ct(e)}getProjectSessionDataRoot(e=this.getActiveProjectRoot()){return pt(e)}},jn=new ve;function oe(){return jn}function $(n){return C(oe().getProjectAgentDir(n),"workflows")}function wt(n,e){return C($(e),n,"workflow.json")}function xe(n,e){return C($(e),n,"revisions")}var Cn=20,Ee=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowStore requires a project cwd")}cwd;async save(e){if(!e.id)throw new Error("WorkflowRecord.id is required");let t=C($(this.cwd),e.id);await gt(t,{recursive:!0}),await W(wt(e.id,this.cwd),e),await this.snapshotRevision(e)}async snapshotRevision(e){try{let t=xe(e.id,this.cwd);await gt(t,{recursive:!0}),await W(C(t,`${e.rev}.json`),e);let r=await this.revisionNumbers(e.id);for(let o of r.slice(Cn))await ht(C(t,`${o}.json`),{force:!0})}catch{}}async revisionNumbers(e){let t;try{t=await mt(xe(e,this.cwd))}catch{return[]}return t.map(r=>Number(r.replace(/\.json$/,""))).filter(r=>Number.isInteger(r)&&r>0).sort((r,o)=>o-r)}async listRevisions(e){let t=[];for(let r of await this.revisionNumbers(e)){let o=await this.loadRevision(e,r);o&&t.push({rev:r,updatedAt:o.updatedAt,name:o.name,nodeCount:o.def.nodes.length})}return t}async loadRevision(e,t){return D(C(xe(e,this.cwd),`${t}.json`))}async load(e){return D(wt(e,this.cwd))}async require(e){let t=await this.load(e);if(!t)throw new Error(`Workflow "${e}" not found`);return t}async list(){let e;try{e=await mt($(this.cwd))}catch{return[]}let t=[];for(let r of e){let o=await this.load(r);o&&t.push(o)}return t}async listActive(){return(await this.list()).filter(e=>e.active)}async delete(e){await ht(C($(this.cwd),e),{recursive:!0,force:!0})}};var B=class{nodes=new Map;edges=[];constructor(e){for(let t of e){if(this.nodes.has(t.id))throw new Error(`Duplicate node ID: ${t.id}`);this.nodes.set(t.id,{id:t.id,kind:t.kind??"agent",params:t.params??{},status:"pending",outPorts:t.outPorts??["default"],joinPolicy:t.joinPolicy??"all",runIndex:0,maxIterations:t.maxIterations})}for(let t of e)for(let r of t.dependsOn??[]){if(!this.nodes.has(r))throw new Error(`Node "${t.id}" depends on unknown node "${r}"`);this.edges.push({from:r,to:t.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let t of this.nodes.values()){if(t.status!=="pending"||this.isBlockedByFailed(t.id))continue;let r=this.incomingForwardEdges(t.id);if(r.length===0){e.push(t);continue}t.joinPolicy==="any"?r.some(o=>this.edgeSatisfied(o))&&e.push(t):r.every(o=>this.edgeSatisfied(o))&&e.push(t)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,t=0,r=0,o=0,i=0,s=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":t++;break;case"failed":r++;break;case"pending":o++;break;case"paused":i++;break;case"skipped":s++;break}return{total:this.nodes.size,completed:e,running:t,failed:r,pending:o,paused:i,skipped:s}}markRunning(e){let t=this.requireNode(e);if(t.status!=="pending")throw new Error(`Node "${e}" is ${t.status}, cannot start`);t.status="running",t.startedAt=Date.now()}markCompleted(e,t){let r=this.requireNode(e);if(r.status!=="running"&&r.status!=="paused")throw new Error(`Node "${e}" is ${r.status}, cannot complete`);r.status="completed",r.output=t.output,r.completedAt=Date.now(),r.firedPorts=t.firedPorts??r.outPorts,t.inputTokens!==void 0&&(r.inputTokens=t.inputTokens),t.outputTokens!==void 0&&(r.outputTokens=t.outputTokens),t.changedFiles!==void 0&&(r.changedFiles=t.changedFiles),r.acceptanceUnverified=t.acceptanceUnverified,this.propagateSkips()}markFailed(e,t){let r=this.requireNode(e);r.status==="completed"||r.status==="skipped"||r.status==="failed"||(r.status="failed",r.error=t,r.completedAt=Date.now(),this.propagateSkips())}markPaused(e){let t=this.requireNode(e);t.status==="running"&&(t.status="paused")}resumePaused(e){let t=this.requireNode(e);t.status==="paused"&&(t.status="pending")}markSkipped(e){let t=this.requireNode(e);if(t.status!=="pending")throw new Error(`Node "${e}" is ${t.status}, cannot skip`);t.status="skipped",t.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,t){let r=this.requireNode(e);if(r.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!r.maxIterations||r.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=r.iteration??0;t&&o<r.maxIterations?(r.iteration=o+1,r.firedPorts=["loop"],this.resetLoopScope(e)):(r.firedPorts=["done"],t&&(r.error=`loop_cap_reached:${r.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let t of e.dependsOn??[])if(!this.nodes.has(t))throw new Error(`Node "${e.id}" depends on unknown node "${t}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let t of e.dependsOn??[])this.edges.push({from:t,to:e.id,fromPort:"default"});try{this.validateDag()}catch(t){throw this.nodes.delete(e.id),this.edges=this.edges.filter(r=>r.to!==e.id||!e.dependsOn?.includes(r.from)),t}}addNodes(e){let t=[],r=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let s of o.dependsOn??[])if(!this.nodes.has(s))throw new Error(`Unknown dep "${s}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),t.push(o.id);let i=(o.dependsOn??[]).map(s=>({from:s,to:o.id,fromPort:"default"}));this.edges.push(...i),r.push(...i)}this.validateDag()}catch(o){for(let i of t)this.nodes.delete(i);throw this.edges=this.edges.filter(i=>!r.includes(i)),o}}removeNode(e){let t=this.requireNode(e);if(t.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(t.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(r=>r.from!==e&&r.to!==e),this.nodes.delete(e)}addDependency(e,t){this.requireNode(e);let r=this.requireNode(t);if(r.status!=="pending"&&r.status!=="failed")throw new Error(`Cannot edit dependencies of ${r.status} node "${t}"`);if(e===t)throw new Error(`Node "${t}" cannot depend on itself`);if(this.edges.some(i=>i.from===e&&i.to===t&&i.fromPort==="default"))throw new Error(`Dependency "${e}" -> "${t}" already exists`);let o={from:e,to:t,fromPort:"default"};this.edges.push(o);try{this.validateDag()}catch(i){throw this.edges=this.edges.filter(s=>s!==o),i}}removeDependency(e,t){this.requireNode(e);let r=this.requireNode(t);if(r.status!=="pending"&&r.status!=="failed")throw new Error(`Cannot edit dependencies of ${r.status} node "${t}"`);let o=this.edges.findIndex(i=>i.from===e&&i.to===t&&i.fromPort==="default");if(o<0)throw new Error(`Dependency "${e}" -> "${t}" does not exist`);this.edges.splice(o,1)}retryNode(e,t){let r=this.requireNode(e);if(r.status!=="failed")throw new Error(`Node "${e}" is ${r.status}, only failed nodes can be retried`);r.status="pending",r.error=void 0,r.output=void 0,r.firedPorts=void 0,r.startedAt=void 0,r.completedAt=void 0,r.inputTokens=void 0,r.outputTokens=void 0,r.changedFiles=void 0,t&&Object.assign(r.params,t)}resetForReplay(e){if(!this.nodes.has(e))throw new Error(`Node "${e}" not found`);let t=new Set([e]),r=!0;for(;r;){r=!1;for(let i of this.nodes.values()){if(t.has(i.id))continue;this.incomingForwardEdges(i.id).map(a=>a.from).some(a=>t.has(a))&&(t.add(i.id),r=!0)}}let o=[...t].filter(i=>this.nodes.get(i).status==="running");if(o.length>0)throw new Error(`Cannot replay "${e}": task(s) still running in the subtree: ${o.join(", ")}`);for(let i of t){let s=this.nodes.get(i);s.status="pending",s.output=void 0,s.firedPorts=void 0,s.error=void 0,s.startedAt=void 0,s.completedAt=void 0,s.inputTokens=void 0,s.outputTokens=void 0,s.changedFiles=void 0,s.acceptanceUnverified=void 0}return[...t]}updateNodeParams(e,t){let r=this.requireNode(e);if(r.status!=="pending"&&r.status!=="failed")throw new Error(`Node "${e}" is ${r.status}, can only update pending or failed nodes`);Object.assign(r.params,t)}addEdge(e){let{from:t,to:r,fromPort:o="default",loopBack:i=!1}=e;if(!this.nodes.has(t))throw new Error(`Unknown source node "${t}"`);if(!this.nodes.has(r))throw new Error(`Unknown target node "${r}"`);let s=this.nodes.get(t);if(!i&&!s.outPorts.includes(o))throw new Error(`Node "${t}" has no outPort "${o}"`);if(!this.edges.find(u=>u.from===t&&u.to===r&&(u.fromPort??"default")===o))if(this.edges.push({from:t,to:r,fromPort:o,loopBack:i}),i){let u=this.nodes.get(r);if(!u.maxIterations||u.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${r}" requires maxIterations > 0`)}else try{this.validateDag()}catch(u){throw this.edges=this.edges.filter(c=>!(c.from===t&&c.to===r&&(c.fromPort??"default")===o)),u}}removeEdge(e,t,r){let o=r??"default";this.edges=this.edges.filter(i=>!(i.from===e&&i.to===t&&(i.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let t=this.incomingForwardEdges(e.id).map(r=>r.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:t,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,inputTokens:e.inputTokens,outputTokens:e.outputTokens,changedFiles:e.changedFiles,acceptanceUnverified:e.acceptanceUnverified,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let t of e){let r=this.nodes.get(t.id);r&&(r.status=t.status==="running"?"pending":t.status,r.output=t.output,r.error=t.error,r.firedPorts=t.firedPorts,r.startedAt=t.startedAt,r.completedAt=t.completedAt,r.inputTokens=t.inputTokens,r.outputTokens=t.outputTokens,r.changedFiles=t.changedFiles,r.acceptanceUnverified=t.acceptanceUnverified,r.runIndex=t.runIndex??0,r.iteration=t.iteration)}}getUpstreamOutputs(e){if(!this.nodes.get(e))return[];let r=this.incomingForwardEdges(e),o=new Set,i=[];for(let s of r){let a=s.from;if(o.has(a))continue;o.add(a);let u=this.nodes.get(a);if(u&&u.status==="completed"&&u.output!=null){let c=typeof u.output=="string"?u.output:JSON.stringify(u.output);c.trim()&&i.push({taskId:a,output:c})}}return i}edgeSatisfied(e){let t=this.nodes.get(e.from);if(!t||t.status!=="completed")return!1;let r=e.fromPort??"default";return(t.firedPorts??t.outPorts).includes(r)}edgeDead(e){let t=this.nodes.get(e.from);if(!t)return!1;if(t.status==="skipped")return!0;if(t.status==="completed"){if(t.kind==="loop"&&!(t.firedPorts??[]).includes("done"))return!1;let r=e.fromPort??"default";return!(t.firedPorts??t.outPorts).includes(r)}return!1}incomingForwardEdges(e){return this.edges.filter(t=>t.to===e&&!t.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(t=>this.nodes.get(t.from)?.status==="failed")}isSkippable(e){let t=this.incomingForwardEdges(e);return t.length===0?!1:this.nodes.get(e).joinPolicy==="any"?t.every(o=>this.edgeDead(o)):t.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let t of this.nodes.values())t.status==="pending"&&this.isSkippable(t.id)&&(t.status="skipped",t.firedPorts=[],e=!0)}}resetLoopScope(e){let t=this.loopBodyNodes(e);for(let r of t){let o=this.nodes.get(r);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0,o.inputTokens=void 0,o.outputTokens=void 0,o.changedFiles=void 0}}loopBodyNodes(e){let t=new Set,r=(o,i)=>{for(let s of this.edges)s.from!==o||s.loopBack||i&&(s.fromPort??"default")!=="loop"||s.to!==e&&(t.has(s.to)||(t.add(s.to),r(s.to,!1)))};return r(e,!0),t}validateDag(){for(let i of this.edges){if(!this.nodes.has(i.from))throw new Error(`Edge references unknown source "${i.from}"`);if(!this.nodes.has(i.to))throw new Error(`Edge references unknown target "${i.to}"`)}let e=this.edges.filter(i=>!i.loopBack),t=new Set,r=new Set,o=i=>{if(r.has(i))throw new Error(`Cycle detected involving node "${i}"`);if(!t.has(i)){r.add(i);for(let s of e)s.from===i&&o(s.to);r.delete(i),t.add(i)}};for(let i of this.nodes.keys())o(i);for(let i of this.edges){if(!i.loopBack)continue;let s=this.nodes.get(i.to);if(!s?.maxIterations||s.maxIterations<=0)throw new Error(`LoopBack controller "${i.to}" must have maxIterations > 0`)}for(let i of this.nodes.values())if(i.maxIterations!==void 0&&i.maxIterations>1e3)throw new Error(`Loop "${i.id}" maxIterations ${i.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let t=this.nodes.get(e);if(!t)throw new Error(`Unknown node: "${e}"`);return t}};function O(n,e){return e?{json:n,binary:e}:{json:n}}function yt(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t].map(r=>({json:r.json,binary:r.binary?Object.fromEntries(Object.keys(r.binary).sort().map(o=>[o,r.binary[o].ref])):void 0}));return Re(e)}function Re(n){return JSON.stringify(Pe(n))}function Pe(n){if(Array.isArray(n))return n.map(Pe);if(n&&typeof n=="object"){let e={};for(let t of Object.keys(n).sort())e[t]=Pe(n[t]);return e}return n}var xt=new Set(["__proto__","prototype","constructor"]);function kt(n,e){let t=Pt(n),r=new ae(t,n),o=r.parseExpression();return r.expectEnd(),F(o,e)}function de(n){try{let e=Pt(n),t=new ae(e,n),r=t.parseExpression();return t.expectEnd(),z(r),null}catch(e){return e instanceof Error?e.message:String(e)}}var Dn=new Set(["input","json","node","now","vars","trigger"]),bt=new Set(["len","upper","lower","default","jsonpath","date","eq","ne","gt","gte","lt","lte","not","and","or","contains"]);function z(n){switch(n.type){case"root":if(!Dn.has(n.name))throw new Error(`Unknown context root "$${n.name}" (allowed: $input $json $node $now $vars $trigger)`);return;case"lit":return;case"func":if(!bt.has(n.name))throw new Error(`Unknown function "${n.name}" (whitelist: ${[...bt].join(", ")})`);n.args.forEach(z);return;case"prop":z(n.target);return;case"index":if(z(n.target),typeof n.key!="number"&&typeof n.key!="string")throw new Error("index key must be a number or string literal");return;case"call":if(!(n.target.type==="root"&&n.target.name==="node"))throw new Error("Only $node(...) is callable in this position");n.args.forEach(z);return}}function I(n,e){let t=n.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return t?kt(t[1],e):n.includes("{{")?n.replace(/\{\{([\s\S]*?)\}\}/g,(r,o)=>{let i=kt(o,e);if(i==null)throw new Error(`Expression "{{${o.trim()}}}" resolved to ${i} in string interpolation`);return typeof i=="object"?JSON.stringify(i):String(i)}):n}function Et(n,e){return Ie(n,e)}function Ie(n,e){if(typeof n=="string")return I(n,e);if(Array.isArray(n))return n.map(t=>Ie(t,e));if(n&&typeof n=="object"){let t={};for(let[r,o]of Object.entries(n))t[r]=Ie(o,e);return t}return n}function Pt(n){let e=[],t=0,r=i=>/[A-Za-z_]/.test(i),o=i=>/[A-Za-z0-9_]/.test(i);for(;t<n.length;){let i=n[t];if(/\s/.test(i)){t++;continue}if(i==="$"){t++;let s="";for(;t<n.length&&o(n[t]);)s+=n[t++];if(!s)throw new Error('Bare "$" is not a valid expression');e.push({t:"dollar",v:s});continue}if(r(i)){let s="";for(;t<n.length&&o(n[t]);)s+=n[t++];e.push({t:"id",v:s});continue}if(/[0-9]/.test(i)||i==="-"&&/[0-9]/.test(n[t+1]??"")){let s=n[t++];for(;t<n.length&&/[0-9.]/.test(n[t]);)s+=n[t++];e.push({t:"num",v:s});continue}if(i==='"'||i==="'"){let s=i;t++;let a="";for(;t<n.length&&n[t]!==s;)n[t]==="\\"&&t+1<n.length?(a+=n[t+1],t+=2):a+=n[t++];if(n[t]!==s)throw new Error("Unterminated string literal in expression");t++,e.push({t:"str",v:a});continue}if(".[](),".includes(i)){e.push({t:"punc",v:i}),t++;continue}throw new Error(`Unexpected character "${i}" in expression`)}return e}var ae=class{constructor(e,t){this.toks=e;this.src=t}toks;src;pos=0;parseExpression(){return this.parseAccessors(this.parseAtom())}peek(){return this.toks[this.pos]}next(){return this.toks[this.pos++]}expectEnd(){if(this.pos!==this.toks.length)throw new Error(`Unexpected trailing tokens in expression "${this.src.trim()}"`)}parseAtom(){let e=this.peek();if(!e)throw new Error("Empty expression");if(e.t==="dollar")return this.next(),{type:"root",name:e.v};if(e.t==="num")return this.next(),{type:"lit",value:Number(e.v)};if(e.t==="str")return this.next(),{type:"lit",value:e.v};if(e.t==="id"){if(e.v==="true")return this.next(),{type:"lit",value:!0};if(e.v==="false")return this.next(),{type:"lit",value:!1};if(e.v==="null")return this.next(),{type:"lit",value:null};if(this.next(),this.peek()?.t==="punc"&&this.peek().v==="("){let t=this.parseArgs();return{type:"func",name:e.v,args:t}}throw new Error(`Bare identifier "${e.v}" is not allowed (only whitelist function calls)`)}if(e.t==="punc"&&e.v==="("){this.next();let t=this.parseExpression();return this.expectPunc(")"),t}throw new Error(`Unexpected token "${e.v}" in expression`)}parseAccessors(e){let t=e;for(;;){let r=this.peek();if(!r||r.t!=="punc")break;if(r.v==="."){this.next();let o=this.next();if(!o||o.t!=="id"&&o.t!=="num")throw new Error('Expected property name after "."');t={type:"prop",target:t,key:o.v}}else if(r.v==="["){this.next();let o=this.next(),i;if(o.t==="num")i=Number(o.v);else if(o.t==="str")i=o.v;else throw new Error("Index must be a number or string literal");this.expectPunc("]"),t={type:"index",target:t,key:i}}else if(r.v==="("){let o=this.parseArgs();t={type:"call",target:t,args:o}}else break}return t}parseArgs(){this.expectPunc("(");let e=[];if(this.peek()?.t==="punc"&&this.peek().v===")")return this.next(),e;for(;;){e.push(this.parseExpression());let t=this.next();if(!t)throw new Error("Unterminated argument list");if(t.t==="punc"&&t.v===")")break;if(!(t.t==="punc"&&t.v===","))throw new Error('Expected "," or ")" in argument list')}return e}expectPunc(e){let t=this.next();if(!t||t.t!=="punc"||t.v!==e)throw new Error(`Expected "${e}" in expression`)}},Rt=Symbol("nodeAccessor");function F(n,e){switch(n.type){case"lit":return n.value;case"root":return Wn(n.name,e);case"func":return Mn(n.name,n.args.map(t=>F(t,e)));case"prop":return vt(F(n.target,e),n.key);case"index":return vt(F(n.target,e),n.key);case"call":{if(F(n.target,e)===Rt){let r=n.args.map(i=>F(i,e));if(r.length!==1||typeof r[0]!="string")throw new Error("$node(...) takes exactly one string argument");let o=e.nodes?.[r[0]];if(!o)throw new Error(`$node("${r[0]}") not found (not completed or unknown)`);return o}throw new Error("Only $node(...) is callable in this position")}}}function Wn(n,e){switch(n){case"input":return e.input??{};case"json":return e.json??{};case"vars":return e.vars??{};case"trigger":return e.trigger??{};case"now":return(e.now?e.now():new Date).toISOString();case"node":return Rt;default:throw new Error(`Unknown context root "$${n}" (allowed: $input $json $node $now $vars $trigger)`)}}function vt(n,e){if(typeof e=="string"&&xt.has(e))throw new Error(`Access to "${e}" is forbidden`);if(n==null)throw new Error(`Cannot read "${e}" of ${n}`);if(typeof e=="number"){if(!Array.isArray(n))throw new Error(`Cannot index non-array with [${e}]`);return n[e]}return n[e]}function Mn(n,e){switch(n){case"len":{let t=e[0];if(typeof t=="string"||Array.isArray(t))return t.length;if(t&&typeof t=="object")return Object.keys(t).length;throw new Error(`len() expects string/array/object, got ${typeof t}`)}case"upper":return String(se(e,0,"upper")).toUpperCase();case"lower":return String(se(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return _n(e[0],String(se(e,1,"jsonpath")));case"date":return qn(e);case"eq":return Ae(e[0],e[1]);case"ne":return!Ae(e[0],e[1]);case"gt":return ie(e[0],e[1])>0;case"gte":return ie(e[0],e[1])>=0;case"lt":return ie(e[0],e[1])<0;case"lte":return ie(e[0],e[1])<=0;case"not":return!Se(se(e,0,"not"));case"and":return e.every(Se);case"or":return e.some(Se);case"contains":return On(e[0],e[1]);default:throw new Error(`Unknown function "${n}()" (whitelist: len upper lower default jsonpath date eq ne gt gte lt lte not and or contains)`)}}function Se(n){return!!n}function Ae(n,e){return n===e?!0:typeof n!=typeof e?!1:n&&e&&typeof n=="object"?JSON.stringify(n)===JSON.stringify(e):!1}function ie(n,e){if(typeof n=="number"&&typeof e=="number")return n-e;if(typeof n=="string"&&typeof e=="string")return n<e?-1:n>e?1:0;throw new Error(`Cannot compare ${typeof n} with ${typeof e}`)}function On(n,e){if(typeof n=="string")return n.includes(String(e));if(Array.isArray(n))return n.some(t=>Ae(t,e));throw new Error("contains() expects string/array as first argument")}function se(n,e,t){if(n.length<=e||n[e]===void 0)throw new Error(`${t}() missing required argument #${e+1}`);return n[e]}function _n(n,e){let t=e.match(/[^.[\]]+/g)??[],r=n;for(let o of t){if(xt.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(r==null)return;let i=/^\d+$/.test(o)?Number(o):o;r=r[i]}return r}function qn(n){let e=n.length===0?new Date:new Date(n[0]);if(Number.isNaN(e.getTime()))throw new Error(`date() received an invalid date: ${String(n[0])}`);if(n.length<2)return e.toISOString();let t=String(n[1]),r=o=>String(o).padStart(2,"0");return t.replace(/YYYY/g,String(e.getUTCFullYear())).replace(/MM/g,r(e.getUTCMonth()+1)).replace(/DD/g,r(e.getUTCDate())).replace(/HH/g,r(e.getUTCHours())).replace(/mm/g,r(e.getUTCMinutes())).replace(/ss/g,r(e.getUTCSeconds()))}import{mkdirSync as Hn,writeFileSync as Un}from"node:fs";import{dirname as Bn,resolve as Fn}from"node:path";var St={filter:["condition"],transform:["mapping"],script:["*"],n8nNode:["*"],agentBinding:["*"],modelBinding:["*"],toolBinding:["*"],integration:["*"],file:["*"],form:["*"],documentLoader:["*"],parser:["*"],retriever:["*"],textSplitter:["*"],vectorStore:["*"],extract:["*"],limit:["*"],split:["*"],respond:["*"]};function ue(n,e){return{json:e.json,vars:n.vars,trigger:n.trigger,now:n.now}}var Ln=(n,e)=>{let t=e.assignments?.assignments;if(Array.isArray(t)){let o={};for(let i of t){if(!i||typeof i!="object")continue;let s=i;typeof s.name!="string"||!s.name||(o[s.name]=nr(s.value,s.type))}return{outputs:{default:[{json:o}]}}}return{outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}},Kn=n=>({outputs:{default:n.default??[]}}),Jn=n=>{let e=[];for(let t of Object.keys(n))e.push(...n[t]);return{outputs:{default:e}}},Vn=(n,e)=>{let r=!!e.condition?"true":"false",o=n.default??[],i={true:[],false:[]};return i[r]=o,{outputs:i,firedPorts:[r]}},Gn=(n,e,t)=>({outputs:{default:[{json:t.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),zn=(n,e,t)=>{let r=e.condition;if(typeof r!="string"||!r.trim())throw new Error('filter node requires string param "condition" (per-item {{ }} expression over $json)');return{outputs:{default:(n.default??[]).filter(s=>!!I(r,ue(t,s)))}}},Yn=(n,e)=>{let t=Array.isArray(e.cases)?e.cases:[];if(t.length===0)throw new Error('switch node requires non-empty param "cases" ([{port, condition}])');let r=n.default??[],o=typeof e.defaultPort=="string"&&e.defaultPort?e.defaultPort:"default",i=o;for(let a of t){if(typeof a.port!="string"||!a.port)throw new Error('switch case requires string "port"');if(a.condition){i=a.port;break}}let s={};for(let a of t)typeof a.port=="string"&&(s[a.port]=[]);return s[o]=s[o]??[],s[i]=r,{outputs:s,firedPorts:[i]}},Zn=n=>{let e=n.default??[];return{outputs:{default:[{json:{items:e.map(t=>t.json),count:e.length}}]}}},Qn=(n,e,t)=>{let r=e.mapping;if(typeof r!="object"||r===null||Array.isArray(r))throw new Error('transform node requires object param "mapping" ({outKey: "{{ expr }}"})');let o=Object.entries(r);if(o.length===0)throw new Error('transform node: "mapping" must have at least one key');return{outputs:{default:(n.default??[]).map(a=>{let u={};for(let[c,g]of o)u[c]=typeof g=="string"?I(g,ue(t,a)):g;return{json:u}})}}},Xn=async(n,e,t)=>{if(e.until==="webhook"){let o=t.host;if(!o?.waitWebhook)throw new Error("wait(until=webhook) requires an ExecutorHost with waitWebhook");let i=typeof e.path=="string"&&e.path.trim()?e.path.trim():"";if(!i)throw new Error('wait(until=webhook) requires param "path" (the webhook path to wait for)');let s=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:void 0,a=await o.waitWebhook({path:i.startsWith("/")?i:`/${i}`,nodeId:t.nodeId,workflowId:t.workflowId,timeoutMs:s,signal:t.signal});return{outputs:{default:[...n.default??[],{json:{webhook:a}}]}}}let r=Number(e.ms);if(!Number.isFinite(r)||r<1||r>36e5)throw new Error('wait node requires param "ms" in 1..3600000');return await new Promise((o,i)=>{let s=setTimeout(()=>{t.signal?.removeEventListener("abort",a),o()},r),a=()=>{clearTimeout(s),i(new Error("wait node canceled"))};t.signal?.addEventListener("abort",a,{once:!0})}),{outputs:{default:n.default??[]}}},er=(n,e,t)=>{let r=typeof e._n8nType=="string"?`(\u6765\u81EA n8n \u8282\u70B9\u300C${e._n8nType}\u300D)`:"";throw new Error(`\u8282\u70B9\u300C${t.nodeId}\u300D${r}\u5BFC\u5165\u65F6\u672A\u80FD\u81EA\u52A8\u8F6C\u6362,\u8BF7\u6253\u5F00\u8282\u70B9\u5B8C\u6210\u4EBA\u5DE5\u8FC1\u79FB\u540E\u518D\u8FD0\u884C`)},y=(n,e,t)=>{let r=typeof e._n8nType=="string"?` (${e._n8nType})`:"",i=(Array.isArray(e._n8nOutPorts)?e._n8nOutPorts:["default"]).filter(c=>typeof c=="string"&&c.length>0),s=n.default??[],a=s.length>0?s:[{json:{imported:!0,nodeId:t.nodeId,kind:t.kind,n8nType:e._n8nType}}],u={};for(let c of i.length>0?i:["default"])u[c]=a;if(u.default||(u.default=a),e._importMode==="n8n-strict-template")throw new Error(`Imported n8n node "${t.nodeId}"${r} requires a native executor or binding before live runs.`);return{outputs:u}},tr=(n,e,t)=>{if((typeof e.operation=="string"?e.operation:"write")!=="write")throw new Error(`Imported file node "${t.nodeId}" supports operation "write" only for live runs`);let o=n.default?.[0];if(!o)throw new Error(`Imported file node "${t.nodeId}" requires an input item`);let i=or(e.fileName,o,t);if(!i)throw new Error(`Imported file node "${t.nodeId}" requires fileName`);let s=Fn(i);return Hn(Bn(s),{recursive:!0}),Un(s,rr(o)),{outputs:{default:[{json:{...o.json,fileName:s,written:!0}}]}}},It={set:Ln,passthrough:Kn,merge:Jn,if:Vn,trigger:Gn,filter:zn,switch:Yn,aggregate:Zn,transform:Qn,wait:Xn,manual:er,script:y,n8nNode:y,agentBinding:y,modelBinding:y,toolBinding:y,integration:y,file:tr,form:y,documentLoader:y,parser:y,retriever:y,textSplitter:y,vectorStore:y,extract:y,limit:y,split:y,respond:y};function nr(n,e){if(e==="number"){let t=Number(n);return Number.isFinite(t)?t:n}if(e==="boolean"){if(typeof n=="boolean")return n;if(n==="true")return!0;if(n==="false")return!1}return n}function rr(n){return typeof n.json.bodyBase64=="string"?Buffer.from(n.json.bodyBase64,"base64"):typeof n.json.body=="string"?n.json.body:n.json.body!==void 0?JSON.stringify(n.json.body,null,2):typeof n.json.data=="string"?n.json.data:JSON.stringify(n.json,null,2)}function or(n,e,t){if(typeof n!="string")return"";let r=n.startsWith("=")?n.slice(1):n,o=r.match(/^\{\{\s*([\s\S]*?)\s*\}\}$/);return o?String(ir(o[1],e,t)??""):r.includes("{{")?String(I(r,ue(t,e))):r}function ir(n,e,t){let r=n.match(/^\$json\.([A-Za-z_][A-Za-z0-9_]*)$/);if(r)return e.json[r[1]];let o=n.match(/^(["'])([\s\S]*)\1\s*\+\s*\$json\.([A-Za-z_][A-Za-z0-9_]*)$/);if(o)return`${sr(o[1],o[2])}${String(e.json[o[3]]??"")}`;if(n.startsWith("$json."))return I(`{{ ${n} }}`,ue(t,e));throw new Error(`Imported n8n expression is unsupported at node "${t.nodeId}": ${n}`)}function sr(n,e){if(n==='"')try{return JSON.parse(`"${e}"`)}catch{return e}return e.replace(/\\'/g,"'").replace(/\\\\/g,"\\")}var ar=new Set(["agentBinding","modelBinding","n8nNode","integration"]),Y=class{executors=new Map;constructor(e=!0){if(e)for(let[t,r]of Object.entries(It))this.executors.set(t,r)}register(e,t){if(this.executors.has(e))throw new Error(`NodeExecutor for kind "${e}" already registered`);this.executors.set(e,t)}override(e,t){if(!this.executors.has(e))throw new Error(`Cannot override unregistered kind "${e}"`);this.executors.set(e,t)}installHostExecutors(e){for(let[t,r]of Object.entries(e))this.executors.has(t)?ar.has(t)&&this.override(t,r):this.register(t,r)}has(e){return this.executors.has(e)}get(e){let t=this.executors.get(e);if(!t)throw new Error(`No NodeExecutor registered for kind "${e}"`);return t}kinds(){return[...this.executors.keys()]}};function At(n,e){let t=n??"any",r=e??"any";return t==="any"||r==="any"||t===r?!0:r==="binary"&&(t==="image"||t==="video"||t==="audio")}function Nt(n){return n!=="manual"&&n!=="intent"&&n!=="form"}function Z(n){let e=typeof n=="string"?n.trim():"";if(!e||e==="self")throw new Error('Workflow agent nodes require an explicit agentId; "self" is not a valid identity');return e}function j(n,e){if(!n)throw new Error(`Node kind "${e}" requires a host (ExecutorHost) but none was injected. Provide one via WorkflowRuntimeOptions.host.`);return n}function L(n,e,t){let r=n[e];if(typeof r!="string"||r.length===0)throw new Error(`Node kind "${t}" requires string param "${e}"`);return r}var dr=async(n,e,t)=>({outputs:{default:await j(t.host,"agent").runAgent({agentId:Z(e.agentId),prompt:L(e,"prompt","agent"),input:n.default??[],signal:t.signal})}}),ur=async(n,e,t)=>{let r=j(t.host,"agentBinding"),o=Ct(e,n.default??[],t,"agentBinding");return{outputs:{default:await r.runAgent({agentId:Z(e.agentId),prompt:o,input:n.default??[],signal:t.signal})}}},cr=async(n,e,t)=>{let r=j(t.host,"modelBinding");if(!r.runModel)throw new Error('Node kind "modelBinding" requires an ExecutorHost with runModel');return{outputs:{default:await r.runModel({prompt:Ct(e,n.default??[],t,"modelBinding"),modelHint:vr(e),temperature:$t(e.temperature),maxTokens:$t(e.maxTokens),input:n.default??[],signal:t.signal})}}},lr=async(n,e,t)=>{let r=j(t.host,"http"),o=typeof e.method=="string"?e.method:"GET",i=await r.httpRequest({method:o,url:L(e,"url","http"),headers:yr(e),body:wr(e),idempotencyKey:Ne(t),signal:t.signal}),s=n.default?.[0]?.json??{};return{outputs:{default:i.map(a=>({...a,json:{...s,...a.json}}))}}},Tt=async(n,e,t)=>{if(e._n8nLifecycle===!0&&t.trigger&&typeof t.trigger=="object"){let a=t.trigger.__n8nOutputs;if(a&&typeof a=="object"&&!Array.isArray(a))return{outputs:a}}let r=j(t.host,t.kind);if(!r.runN8nNode)throw new Error(`Node kind "${t.kind}" requires an ExecutorHost with runN8nNode`);let o=L(e,"_n8nType",t.kind),i=Object.fromEntries(Object.entries(e._n8nConnections&&typeof e._n8nConnections=="object"?e._n8nConnections:{}).filter(a=>typeof a[1]=="string"&&a[1].length>0));return{outputs:await r.runN8nNode({n8nType:o,version:typeof e._n8nVersion=="number"?e._n8nVersion:void 0,parameters:Object.fromEntries(Object.entries(e).filter(([a])=>!a.startsWith("_n8n")&&!a.startsWith("_binding"))),...Object.keys(i).length>0?{connectionIds:i}:{},input:n.default??[],idempotencyKey:Ne(t),signal:t.signal})}},fr=async(n,e,t)=>({outputs:{default:await j(t.host,"channel").sendChannel({channel:L(e,"channel","channel"),target:typeof e.target=="string"?e.target:void 0,payload:e.payload??n.default?.[0]?.json??{},input:n.default??[],idempotencyKey:Ne(t),signal:t.signal})}}),pr=async(n,e,t)=>{let r=j(t.host,"memory");if(!r.memory)throw new Error('Node kind "memory" requires an ExecutorHost with a memory backend');let o=L(e,"op","memory");if(o!=="read"&&o!=="write"&&o!=="search")throw new Error(`memory node: op must be "read"|"write"|"search", got "${o}"`);if(e.scope==="global")throw new Error('memory node: scope "global" \u9700\u7ECF\u6743\u9650\u95F8\u95E8(\u672A\u5F00\u653E);\u9ED8\u8BA4\u9879\u76EE\u7EA7\u8BF7\u79FB\u9664 scope');return{outputs:{default:await r.memory({op:o,key:typeof e.key=="string"&&e.key?e.key:void 0,value:e.value!==void 0?e.value:n.default?.[0]?.json,query:typeof e.query=="string"?e.query:void 0,input:n.default??[],signal:t.signal})}}},gr=async(n,e,t)=>{let r=j(t.host,"subworkflow");if(!r.runSubworkflow)throw new Error('Node kind "subworkflow" requires an ExecutorHost with runSubworkflow');let o=e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:n.default?.[0]?.json;return{outputs:{default:await r.runSubworkflow({workflowId:L(e,"workflowId","subworkflow"),callerWorkflowId:t.workflowId,projectId:typeof e.projectId=="string"&&e.projectId?e.projectId:void 0,payload:o,input:n.default??[],signal:t.signal})}}},mr=async(n,e,t)=>{let r=j(t.host,"approval");if(!r.approval)throw new Error('Node kind "approval" requires an ExecutorHost with approval');let o=await r.approval({nodeId:t.nodeId,workflowId:t.workflowId,prompt:typeof e.prompt=="string"&&e.prompt?e.prompt:void 0,timeoutMs:typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:void 0,timeoutAction:e.timeoutAction==="approve"||e.timeoutAction==="reject"||e.timeoutAction==="keepPending"?e.timeoutAction:void 0,input:n.default??[],signal:t.signal});if(!o.approved)throw new Error(`approval node "${t.nodeId}" denied${o.note?`: ${o.note}`:""} (${o.decidedAt})`);return{outputs:{default:[...n.default??[],{json:{approved:!0,decidedAt:o.decidedAt,...o.note?{note:o.note}:{}}}]}}},ce={agent:dr,agentBinding:ur,modelBinding:cr,n8nNode:Tt,integration:Tt,http:lr,channel:fr,memory:pr,subworkflow:gr,approval:mr},hr=Object.keys(ce);function Ne(n){if(!(!n.workflowId||!n.runId))return`workflow:${n.workflowId}:${n.runId}:${n.nodeId}:${n.runIndex}`}function wr(n){if(n.body!==void 0)return n.body;if(n.sendBody!==!0)return;let e=jt(n.bodyParameters);if(e.length!==0)return Object.fromEntries(e)}function yr(n){let e={};if(n.headers&&typeof n.headers=="object"&&!Array.isArray(n.headers))for(let[t,r]of Object.entries(n.headers))typeof r=="string"&&(e[t]=r);for(let[t,r]of jt(n.headerParameters))e[t]=String(r);return Object.keys(e).length>0?e:void 0}function jt(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?n.parameters:void 0;if(!Array.isArray(e))return[];let t=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r;typeof o.name!="string"||!o.name||t.push([o.name,o.value??""])}return t}function Ct(n,e,t,r){let o=br(n.prompt,n.text,n.message,n.input);if(!o)throw new Error(`Node kind "${r}" requires a prompt/text parameter`);return kr(o,{json:e[0]?.json??{},input:{default:e},vars:t.vars,trigger:t.trigger,now:t.now})}function kr(n,e){let t=n.startsWith("=")?n.slice(1):n;return t.includes("{{")?String(I(t,e)):t}function br(...n){for(let e of n)if(typeof e=="string"&&e.trim())return e}function vr(n){let e=n.model??n.modelName;if(typeof e=="string"&&e)return e;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=e.value??e.cachedResultName;if(typeof t=="string"&&t)return t}}function $t(n){let e=typeof n=="number"?n:typeof n=="string"?Number(n):NaN;return Number.isFinite(e)?e:void 0}var K=class extends Error{constructor(t){super(t?`Workflow paused at "${t}"`:"Workflow paused");this.atNodeId=t;this.name="WorkflowPauseSignal"}atNodeId},E=class extends Error{constructor(e="Workflow run canceled"){super(e),this.name="WorkflowRunCanceled"}},Q=class{constructor(e,t={}){this.def=e;this.registry=t.registry??new Y,this.gate=t.gate,this.now=t.now??(()=>new Date),this.trigger=t.trigger,this.triggerKind=t.triggerKind,this.runId=t.runId,this.log=t.log,this.host=t.host,this.abortController=t.signal?void 0:new AbortController,this.signal=t.signal??this.abortController.signal,this.checkpoint=t.checkpoint,this.preserveCheckpoint=t.preserveCheckpoint===!0,this.onNodeStatus=t.onNodeStatus,this.host&&!t.registry&&this.registry.installHostExecutors(ce);for(let r of e.nodes)this.nodeDefs.set(r.id,r);for(let r of e.edges)r.loopBack&&this.loopBackOf.set(r.from,r.to)}def;registry;gate;now;trigger;triggerKind;runId;log;host;abortController;signal;checkpoint;preserveCheckpoint;onNodeStatus;checkpointWriteChain=Promise.resolve();dag;nodeDefs=new Map;nodeOutputs=new Map;cache=new Map;loopBackOf=new Map;pauseRequested=!1;nodeStats={};statsSeq=0;checkpointLoaded=!1;setNodeParams(e,t){let r=this.nodeDefs.get(e);if(!r)throw new Error(`Unknown node "${e}"`);r.params={...r.params??{},...t}}pause(){this.pauseRequested=!0}cancel(e="Workflow run canceled"){let t=new E(e);this.abortController&&!this.abortController.signal.aborted&&this.abortController.abort(t)}extendBudget(e){if(!this.gate?.extend)throw new Error("WorkflowRuntime has no extensible budget gate to raise");this.gate.extend(e)}async run(){await this.loadCheckpoint(),this.throwIfCanceled(),this.dag=this.buildDag(),this.nodeOutputs.clear(),this.pauseRequested=!1;let e=new Set,t;try{let i=0;for(;!this.dag.isFinished();){if(++i>1e5)throw new Error("WorkflowRuntime did not converge");let s=this.dag.getReadyNodes();if(s.length===0)break;let u=(await Promise.allSettled(s.map(c=>this.executeNode(c,e)))).find(c=>c.status==="rejected");if(u)throw u.reason}}catch(i){if(i instanceof K)t=i.atNodeId;else throw i}let r={};for(let[i,s]of this.nodeOutputs)r[i]=s;let o=t?"paused":this.dag.isAllCompleted()?"completed":"failed";return o==="completed"&&this.checkpoint&&(this.preserveCheckpoint?await this.persistCheckpoint():await this.checkpoint.clear()),{status:o,outputs:r,executed:e,progress:this.dag.getProgress(),pausedAt:t,nodeStats:{...this.nodeStats}}}async loadCheckpoint(){if(!this.checkpoint||this.checkpointLoaded)return;this.checkpointLoaded=!0;let e=await this.checkpoint.load();if(e)for(let t of e.entries)this.cache.set(t.key,t.result)}async persistCheckpoint(){this.checkpoint&&(this.checkpointWriteChain=this.checkpointWriteChain.then(async()=>{let e=[...this.cache.entries()].map(([t,r])=>({key:t,result:r}));await this.checkpoint.persist(e)}),await this.checkpointWriteChain)}async executeNode(e,t){if(this.throwIfCanceled(),this.pauseRequested)throw new K(e.id);if(e.kind==="loop"){this.enterLoop(e);return}let r=this.collectInputs(e.id),o=this.buildExprContext(r),i=this.nodeDefs.get(e.id)?.params??{},s=St[e.kind]??[],a=s.includes("*"),u=a?{}:s.length>0?Object.fromEntries(Object.entries(i).filter(([w])=>!s.includes(w))):i,c={...Et(u,o),...a?i:Object.fromEntries(s.filter(w=>w in i).map(w=>[w,i[w]]))},g=this.cacheKey(e.kind,c,r,e.runIndex),p=Date.now(),d=0,f=(w,x)=>{let R=Date.now();this.nodeStats[e.id]={seq:++this.statsSeq,startedAt:new Date(p).toISOString(),finishedAt:new Date(R).toISOString(),durationMs:R-p,attempts:d,cacheHit:x,status:w}},l=this.cache.get(g),m=l!==void 0,h=!1;if(l)this.dag.markRunning(e.id);else{this.gate?.check(e.id,e.kind),this.dag.markRunning(e.id),this.onNodeStatus?.(e.id,"running");let w=this.nodeDefs.get(e.id),x=Math.max(1,w?.retry?.maxTries??1),R=Math.max(0,w?.retry?.backoffMs??1e3),we=w?.timeoutMs,S;for(let N=0;N<x;N++){d++,this.throwIfCanceled();let T={nodeId:e.id,kind:e.kind,workflowId:this.def.id,runId:this.runId,triggerKind:this.triggerKind,runIndex:e.runIndex,vars:this.def.vars??{},trigger:this.trigger,now:this.now,log:this.log,host:this.host,signal:we!==void 0&&we>0?AbortSignal.any([this.signal,AbortSignal.timeout(we)]):this.signal};try{if(l=await this.registry.get(e.kind)(r,c,T),T.signal?.aborted)throw T.signal.reason instanceof Error?T.signal.reason:new Error(`node "${e.id}" execution was aborted`);S=void 0;break}catch(G){if(this.isCanceled())throw this.canceledError(G);S=G;let Xe=N+1<x;this.log?.warn(`node "${e.id}" attempt ${N+1}/${x} failed: ${G instanceof Error?G.message:String(G)}`+(Xe?` \u2014 retrying in ${R*2**N}ms`:"")),Xe&&await this.cancellableDelay(R*2**N)}}if(S!==void 0){let N=w?.onError??"stop",T=S instanceof Error?S.message:String(S);if(N==="errorPort")this.onNodeStatus?.(e.id,"failed",T),l={outputs:{error:[{json:{error:T,nodeId:e.id,kind:e.kind,attempts:x}}]},firedPorts:["error"]},h=!0;else if(N==="continue")this.onNodeStatus?.(e.id,"failed",T),l={outputs:{},firedPorts:[]},h=!0;else throw this.onNodeStatus?.(e.id,"failed",T),f("failed",!1),S&&typeof S=="object"&&!S.nodeId&&(S.nodeId=e.id),S}this.throwIfCanceled(),h?t.add(e.id):(this.cache.set(g,l),t.add(e.id),await this.persistCheckpoint())}this.nodeOutputs.set(e.id,l.outputs),this.dag.markCompleted(e.id,{output:l.outputs,firedPorts:l.firedPorts}),h||this.onNodeStatus?.(e.id,"completed"),f(h?"failed":"completed",m);let v=this.loopBackOf.get(e.id);v&&this.decideLoopBack(v)}enterLoop(e){this.dag.markRunning(e.id);let t={loop:[{json:{iteration:e.iteration??0}}],done:[]};this.nodeOutputs.set(e.id,t),this.dag.markCompleted(e.id,{output:t,firedPorts:["loop"]}),this.onNodeStatus?.(e.id,"completed")}decideLoopBack(e){let t=this.evalLoopCondition(e);this.dag.decideLoop(e,t);let r=this.dag.getNode(e);this.surfaceLoopCap(r);let o=r.firedPorts??[];this.nodeOutputs.set(e,{loop:o.includes("loop")?[{json:{iteration:r.iteration??0}}]:[],done:o.includes("done")?[{json:{iteration:r.iteration??0}}]:[]})}surfaceLoopCap(e){if(!e.error?.startsWith("loop_cap_reached:")||this.nodeStats[e.id]?.warning)return;let t=`loop "${e.id}" hit its maxIterations cap (${e.maxIterations}) \u2014 forced exit via "done" while the loop condition still asked to continue`;this.log?.warn(t);let r=this.nodeStats[e.id],o=new Date().toISOString();this.nodeStats[e.id]=r?{...r,warning:t}:{seq:++this.statsSeq,startedAt:o,finishedAt:o,durationMs:0,attempts:0,cacheHit:!1,status:"completed",warning:t}}evalLoopCondition(e){let r=this.nodeDefs.get(e)?.params?.condition;if(r==null||r==="")return!0;let o=this.buildExprContext({});return!!(typeof r=="string"?I(r,o):r)}collectInputs(e){let t={};for(let r of this.def.edges){if(r.to!==e||r.loopBack)continue;let o=r.fromPort??"default",i=r.toPort??"default",s=this.nodeOutputs.get(r.from);if(!s)continue;let a=s[o];a&&(t[i]??=[]).push(...a)}return t}buildExprContext(e){let t={};for(let[r,o]of this.nodeOutputs)t[r]={output:o};return{input:e,json:e.default?.[0]?.json??{},nodes:t,vars:this.def.vars??{},trigger:this.trigger,now:this.now}}cacheKey(e,t,r,o){return Re([e,t,yt(r),o])}isCanceled(){return this.signal.aborted}canceledError(e){let t=this.signal.reason;return t instanceof E?t:t instanceof Error?new E(t.message):e instanceof E?e:e instanceof Error&&this.signal.aborted?new E(e.message):new E(t===void 0?"Workflow run canceled":String(t))}throwIfCanceled(){if(this.isCanceled())throw this.canceledError()}cancellableDelay(e){return e<=0?Promise.resolve():new Promise((t,r)=>{let o=setTimeout(()=>{this.signal.removeEventListener("abort",i),t()},e),i=()=>{clearTimeout(o),r(this.canceledError())};this.signal.addEventListener("abort",i,{once:!0})})}buildDag(){let e=this.def.nodes.map(r=>{let o=r.outPorts??xr(r.kind);return r.onError==="errorPort"&&!o.includes("error")&&(o=[...o,"error"]),{id:r.id,kind:r.kind,params:r.params??{},outPorts:o,joinPolicy:r.joinPolicy??"all",maxIterations:r.maxIterations}}),t=new B(e);for(let r of this.def.edges)r.loopBack||t.addEdge({from:r.from,to:r.to,fromPort:r.fromPort??"default"});for(let r of this.def.edges)r.loopBack&&t.addEdge({from:r.from,to:r.to,loopBack:!0});return t}};function xr(n){return n==="if"?["true","false"]:n==="loop"?["loop","done"]:["default"]}var Er=new Set(["agent","action","http","channel","im"]);var Te=class extends Error{constructor(t,r,o){super(`Permission denied: node "${t}" (kind "${r}") may not run under unattended trigger "${o}". Authorize it by adding "${r}" to allowUnattendedKinds.`);this.nodeId=t;this.kind=r;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},le=class extends K{constructor(t,r,o){super(t);this.reason=r;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${r} limit ${o}) before node "${t}"`}reason;limit},fe=class{trigger;maxNodeExecutions;maxDurationMs;allow;now;executions=0;startedAt=-1;constructor(e){if(!Number.isInteger(e.maxNodeExecutions)||e.maxNodeExecutions<=0)throw new Error(`BudgetPermissionGate: maxNodeExecutions must be a positive integer, got ${e.maxNodeExecutions}`);if(e.maxDurationMs!==void 0&&!(e.maxDurationMs>0))throw new Error(`BudgetPermissionGate: maxDurationMs must be greater than 0 when provided, got ${e.maxDurationMs}`);this.trigger=e.trigger,this.maxNodeExecutions=e.maxNodeExecutions,this.maxDurationMs=e.maxDurationMs,this.allow=new Set(e.allowUnattendedKinds??[]),this.now=e.now??(()=>Date.now())}get unattended(){return Nt(this.trigger)}check(e,t){if(this.unattended&&Er.has(t)&&!this.allow.has(t))throw new Te(e,t,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new le(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new le(e,"executions",this.maxNodeExecutions);this.executions++}extend(e){if(e.executions!==void 0){if(!Number.isInteger(e.executions)||e.executions<=0)throw new Error(`BudgetPermissionGate.extend: executions delta must be a positive integer, got ${e.executions}`);this.maxNodeExecutions+=e.executions}if(e.durationMs!==void 0){if(!(e.durationMs>0))throw new Error(`BudgetPermissionGate.extend: durationMs delta must be greater than 0, got ${e.durationMs}`);if(this.maxDurationMs===void 0)throw new Error("BudgetPermissionGate.extend: cannot extend duration on a gate with no duration cap");this.maxDurationMs+=e.durationMs}}};function Mt(n){switch(n.type){case"manual":return[];case"schedule":return[...Nr(n.cron),...Pr(n.timezone,n.misfirePolicy)];case"im-message":return jr(n.channel,n.match);case"webhook":return Cr(n.path);case"intent":return Sr(n.phrases,n.aliases,n.surfaces);case"form":return Ar(n.fields);default:return[`unknown trigger type: ${JSON.stringify(n)}`]}}function Pr(n,e){let t=[];if(n!==void 0)if(typeof n!="string"||!n.trim())t.push("schedule.timezone must be a non-empty IANA timezone");else try{new Intl.DateTimeFormat("en",{timeZone:n}).format(0)}catch{t.push(`schedule.timezone is not a supported IANA timezone: ${JSON.stringify(n)}`)}return e!==void 0&&e!=="run-once"&&e!=="skip"&&t.push('schedule.misfirePolicy must be "run-once" or "skip"'),t}var Rr=new Set(["welcome","chat"]);function Sr(n,e,t){let r=[];if(!Array.isArray(n)||n.length===0)r.push("intent.phrases must be a non-empty array of trigger phrases");else for(let o of n)(typeof o!="string"||o.trim()==="")&&r.push(`intent.phrases entries must be non-empty strings, got ${JSON.stringify(o)}`);if(e!==void 0)if(!Array.isArray(e))r.push("intent.aliases must be an array when present");else for(let o of e)(typeof o!="string"||o.trim()==="")&&r.push(`intent.aliases entries must be non-empty strings, got ${JSON.stringify(o)}`);if(t!==void 0)if(!Array.isArray(t)||t.length===0)r.push("intent.surfaces must be a non-empty array when present");else for(let o of t)(typeof o!="string"||!Rr.has(o))&&r.push(`intent.surfaces entries must be "welcome"|"chat", got ${JSON.stringify(o)}`);return r}var Ir=new Set(["text","number","select"]);function Ar(n){let e=[];if(!Array.isArray(n)||n.length===0)return["form.fields must be a non-empty array"];let t=new Set;for(let r of n){if(typeof r?.key!="string"||!/^[\w-]+$/.test(r.key)){e.push(`form field key must be a [\\w-]+ string, got ${JSON.stringify(r?.key)}`);continue}t.has(r.key)&&e.push(`duplicate form field key "${r.key}"`),t.add(r.key),r.type!==void 0&&(typeof r.type!="string"||!Ir.has(r.type))&&e.push(`form field "${r.key}": type must be text|number|select`),r.type==="select"&&(!Array.isArray(r.options)||r.options.length===0?e.push(`form field "${r.key}": select requires non-empty options`):(r.options.some(o=>typeof o!="string"||o.trim()==="")||new Set(r.options).size!==r.options.length)&&e.push(`form field "${r.key}": select options must be unique non-empty strings`))}return e}var Dt=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Wt=["SUN","MON","TUE","WED","THU","FRI","SAT"];function Nr(n){if(typeof n!="string"||n.trim()==="")return["schedule.cron must be a non-empty string"];let e=n.trim().split(/\s+/);if(e.length!==5&&e.length!==6)return[`schedule.cron must have 5 or 6 fields, got ${e.length}: "${n}"`];let r=e.length===6?[{label:"second",min:0,max:59},{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Dt},{label:"day-of-week",min:0,max:7,names:Wt}]:[{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Dt},{label:"day-of-week",min:0,max:7,names:Wt}],o=[];for(let i=0;i<r.length;i++){let s=Tr(e[i],r[i]);s&&o.push(`schedule.cron ${s}`)}return o}function Tr(n,e){for(let t of n.split(",")){let r=$r(t,e);if(r)return r}}function $r(n,e){if(n==="")return`${e.label} has an empty list element`;let t=n,r,o=n.indexOf("/");if(o!==-1&&(t=n.slice(0,o),r=n.slice(o+1),!/^\d+$/.test(r)||Number(r)<=0))return`${e.label} has an invalid step "/${r}"`;if(t==="*")return;let i=t.indexOf("-");if(i!==-1){let a=$e(t.slice(0,i),e),u=$e(t.slice(i+1),e);return a===void 0||u===void 0?`${e.label} has an invalid range "${t}"`:a>u?`${e.label} range "${t}" is descending`:void 0}if(t===""&&r!==void 0)return`${e.label} step "${n}" needs a base ("*" or a range)`;if($e(t,e)===void 0)return`${e.label} value "${t}" is out of range ${e.min}-${e.max}`}function $e(n,e){let t;if(/^\d+$/.test(n))t=Number(n);else if(e.names){let r=e.names.indexOf(n.toUpperCase());if(r===-1)return;t=e.label==="month"?r+1:r}else return;if(!(t<e.min||t>e.max))return t}function jr(n,e){let t=[];if((typeof n!="string"||n.trim()==="")&&t.push("im-message.channel must be a non-empty string"),e!==void 0)if(typeof e!="string")t.push("im-message.match must be a string regex");else try{new RegExp(e)}catch(r){t.push(`im-message.match is not a valid regex: ${r.message}`)}return t}function Cr(n){return typeof n!="string"||n===""?["webhook.path must be a non-empty string"]:n.startsWith("/")?/\s/.test(n)?[`webhook.path must not contain whitespace: "${n}"`]:n.includes("..")?[`webhook.path must not contain "..": "${n}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(n)?[]:[`webhook.path contains illegal characters: "${n}"`]:[`webhook.path must start with "/": "${n}"`]}var P=class extends Error{constructor(t){super(`Patch rejected: ${t.join("; ")}`);this.errors=t;this.name="PatchError"}errors};function Ce(n,e){let t=[],r=Or(n),o=new Map(r.def.nodes.map(p=>[p.id,p])),i=e.scope?new Set(e.scope):void 0,s=new Set,a=p=>!i||i.has(p)||s.has(p),u=[];for(let[p,d]of e.patch.entries()){let f=`op[${p}] ${d.op}`;switch(d.op){case"add_node":{d.node?.id?o.has(d.node.id)?t.push(`${f}: node "${d.node.id}" already exists`):(r.def.nodes.push(d.node),o.set(d.node.id,d.node),i&&s.add(d.node.id)):t.push(`${f}: node.id is required`);break}case"remove_node":{o.has(d.nodeId)?a(d.nodeId)?(r.def.nodes=r.def.nodes.filter(l=>l.id!==d.nodeId),o.delete(d.nodeId),r.def.edges=r.def.edges.filter(l=>l.from!==d.nodeId&&l.to!==d.nodeId)):t.push(`${f}: node "${d.nodeId}" is outside the edit scope`):t.push(`${f}: node "${d.nodeId}" not found`);break}case"update_params":{let l=o.get(d.nodeId);l?a(d.nodeId)?l.params=Dr(l.params,d.params):t.push(`${f}: node "${d.nodeId}" is outside the edit scope`):t.push(`${f}: node "${d.nodeId}" not found`);break}case"rename_node":{let l=o.get(d.nodeId);l?a(d.nodeId)?l.name=d.name:t.push(`${f}: node "${d.nodeId}" is outside the edit scope`):t.push(`${f}: node "${d.nodeId}" not found`);break}case"set_node_options":{let l=o.get(d.nodeId);if(!l){t.push(`${f}: node "${d.nodeId}" not found`);break}if(!a(d.nodeId)){t.push(`${f}: node "${d.nodeId}" is outside the edit scope`);break}d.retry!==void 0&&(d.retry===null?delete l.retry:!Number.isInteger(d.retry.maxTries)||d.retry.maxTries<1||d.retry.maxTries>10?t.push(`${f}: retry.maxTries must be an integer 1..10`):d.retry.backoffMs!==void 0&&(!Number.isFinite(d.retry.backoffMs)||d.retry.backoffMs<0)?t.push(`${f}: retry.backoffMs must be a non-negative number`):l.retry={maxTries:d.retry.maxTries,...d.retry.backoffMs!==void 0?{backoffMs:d.retry.backoffMs}:{}}),d.timeoutMs!==void 0&&(d.timeoutMs===null?delete l.timeoutMs:!Number.isFinite(d.timeoutMs)||d.timeoutMs<=0?t.push(`${f}: timeoutMs must be a positive number`):l.timeoutMs=d.timeoutMs),d.onError!==void 0&&(d.onError===null?delete l.onError:d.onError!=="stop"&&d.onError!=="continue"&&d.onError!=="errorPort"?t.push(`${f}: onError must be "stop"|"continue"|"errorPort"`):l.onError=d.onError);break}case"set_node_ui":{if(!d.positions||typeof d.positions!="object"){t.push(`${f}: positions is required`);break}for(let[l,m]of Object.entries(d.positions)){let h=o.get(l);if(!h){t.push(`${f}: node "${l}" not found`);continue}if(!a(l)){t.push(`${f}: node "${l}" is outside the edit scope`);continue}if(m===null){delete h.ui;continue}if(!Number.isFinite(m?.x)||!Number.isFinite(m?.y)){t.push(`${f}: position for "${l}" must be finite {x,y}`);continue}h.ui={x:m.x,y:m.y}}break}case"add_edge":{let l=d.edge;if(!l?.from||!l?.to){t.push(`${f}: edge.from and edge.to are required`);break}if(i&&!a(l.from)&&!a(l.to)){t.push(`${f}: edge ${l.from}\u2192${l.to} has no endpoint in the edit scope`);break}let m=l.fromPort??"default";if(r.def.edges.some(R=>R.from===l.from&&R.to===l.to&&(R.fromPort??"default")===m)){t.push(`${f}: \u8FDE\u7EBF\u5DF2\u5B58\u5728(${l.from} \u2192 ${l.to})`);break}let h=o.get(l.from),v=o.get(l.to),w=h?.outPortTypes?.[m],x=v?.inPorts?.find(R=>R.name===(l.toPort??"default"))?.type;if(!At(w,x)){t.push(`${f}: \u7AEF\u53E3\u7C7B\u578B\u4E0D\u5339\u914D:\u300C${h?.name??l.from}\u300D\u8F93\u51FA ${w??"any"},\u300C${v?.name??l.to}\u300D\u9700\u8981 ${x??"any"} \u2014\u2014 \u63A5\u4E0D\u4E0A,\u8BF7\u6362\u4E2A\u76EE\u6807\u7AEF\u53E3`);break}r.def.edges.push(l);break}case"remove_edge":{let l=d.edge;if(!l?.from||!l?.to){t.push(`${f}: edge.from and edge.to are required`);break}let{from:m,to:h,fromPort:v}=l;if(i&&!a(m)&&!a(h))t.push(`${f}: edge ${m}\u2192${h} has no endpoint in the edit scope`);else{let w=r.def.edges.length;r.def.edges=r.def.edges.filter(x=>!(x.from===m&&x.to===h&&(x.fromPort??"default")===(v??"default"))),r.def.edges.length===w&&t.push(`${f}: edge ${m}\u2192${h} not found`)}break}case"set_trigger":{if(i)t.push(`${f}: trigger is workflow-global and cannot be changed in a scoped edit`);else if(d.trigger){let l=Mt(d.trigger);if(l.length>0)for(let m of l)t.push(`${f}: ${m}`);else r.meta.trigger=d.trigger}else r.meta.trigger=d.trigger;break}case"set_meta":{i?t.push(`${f}: meta is workflow-global and cannot be changed in a scoped edit`):(d.meta.name!==void 0&&(r.meta.name=d.meta.name),d.meta.active!==void 0&&(r.meta.active=d.meta.active));break}default:t.push(`${f}: unknown op`)}t.length===0&&u.push(d)}if(t.length>0)throw new P(t);Ot(r.def,t);let c=je(r.def),g=[];if(i){let p=new Set(je(n.def).map(d=>d.message));for(let d of c)i.has(d.nodeId)||s.has(d.nodeId)||!p.has(d.message)?t.push(d.message):g.push({classification:"preexisting",nodeId:d.nodeId,message:d.message})}else t.push(...c.map(p=>p.message));if(t.length>0)throw new P(t);return{target:r,applied:u,diagnostics:g}}function Dr(n,e){let t={...n??{}};for(let[r,o]of Object.entries(e))o===null?delete t[r]:t[r]=o;return t}function J(n){let e=[];for(let t of n.nodes)(t.kind==="tool"||t.kind==="skill"||t.kind==="mcp")&&e.push(`\u8282\u70B9\u300C${t.id}\u300D\u4F7F\u7528\u4E86\u4E0D\u53D7\u652F\u6301\u7684\u975E\u6807\u51C6 kind "${t.kind}";\u8BF7\u6539\u7528 Agent \u63D2\u4EF6\u6216 canonical Action \u8282\u70B9`);return Ot(n,e),Wr(n,e),e}function Wr(n,e){e.push(...je(n).map(t=>t.message))}function je(n){let e=[],t=(r,o,i)=>{if(typeof r=="string"){if(r.startsWith("="))return;for(let s of r.matchAll(/\{\{([\s\S]*?)\}\}/g)){let a=de(s[1].trim());a&&e.push({nodeId:o,message:`\u8282\u70B9\u300C${o}\u300D\u53C2\u6570 ${i} \u7684\u8868\u8FBE\u5F0F\u300C{{ ${s[1].trim()} }}\u300D\u8D85\u51FA\u53D7\u9650\u8BED\u8A00:${a}`})}return}if(Array.isArray(r)){r.forEach((s,a)=>t(s,o,`${i}[${a}]`));return}if(r&&typeof r=="object")for(let[s,a]of Object.entries(r))t(a,o,i?`${i}.${s}`:s)};for(let r of n.nodes)r.params?._importMode!=="n8n-strict-template"&&r.params&&t(r.params,r.id,"");return e}function Ot(n,e){try{let t=n.nodes.map(o=>{let i=o.outPorts??Mr(o.kind);return o.onError==="errorPort"&&!i.includes("error")&&(i=[...i,"error"]),{id:o.id,kind:o.kind,params:o.params??{},outPorts:i,joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations}}),r=new B(t);for(let o of n.edges)o.loopBack||r.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of n.edges)o.loopBack&&r.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(t){e.push(`graph invalid: ${t.message}`)}}function Mr(n){return n==="if"?["true","false"]:n==="loop"?["loop","done"]:["default"]}function Or(n){return{def:{...n.def,nodes:n.def.nodes.map(e=>({...e,params:e.params?{...e.params}:void 0})),edges:n.def.edges.map(e=>({...e})),vars:n.def.vars?{...n.def.vars}:void 0},meta:{...n.meta}}}function De(n,e={}){let t=e.maxNodes??50,r=e.maxValueLen??60,o=`Workflow ${JSON.stringify(n.name)} (rev ${n.rev}, trigger: ${_r(n.trigger)}, ${n.active?"active":"inactive"})`,i=n.def.nodes,a=i.slice(0,t).map(p=>" "+qr(p,r)),u=i.length===0?"nodes: (none)":["nodes:",...a].join(`
3
3
  `),c=i.length>t?`
4
- \u2026 ${i.length-t} more node(s); fetch the full definition from the Gateway Host`:"",g=Lr(n.def.edges);return`${o}
4
+ \u2026 ${i.length-t} more node(s); fetch the full definition from the Gateway Host`:"",g=Br(n.def.edges);return`${o}
5
5
  ${u}${c}
6
- ${g}`}function Hr(n){if(!n)return"none";switch(n.type){case"manual":return"manual";case"schedule":return`schedule ${JSON.stringify(n.cron)}`;case"im-message":return n.match?`im-message ${n.channel} match=${JSON.stringify(n.match)}`:`im-message ${n.channel}`;case"webhook":return`webhook ${n.path}`;case"intent":return`intent ${n.phrases.map(e=>JSON.stringify(e)).join(" / ")}${n.semantic?" +semantic":""}`;case"form":return`form [${n.fields.map(e=>e.key).join(", ")}]`}}function Ur(n,e){let t=n.name?` "${n.name}"`:"",r=Br(n.params,e),o=(n.outPorts??Kr(n.kind)).join(","),i=[`${n.id} [${n.kind}]${t}`];return r&&i.push(r),i.push(`out: ${o}`),i.join(" ")}function Br(n,e){if(!n)return"";let t=Object.keys(n).sort();return t.length===0?"":t.map(r=>`${r}=${Fr(n[r],e)}`).join(" ")}function Fr(n,e){let t;return typeof n=="string"?t=n.includes("{{")?n:JSON.stringify(n):t=JSON.stringify(n),t.length>e&&(t=t.slice(0,e-1)+"\u2026"),t}function Lr(n){return n.length===0?"edges: (none)":`edges:
7
- ${n.map(t=>{let r=t.fromPort??"default",o=t.toPort??"default",i=t.loopBack?" (loopBack)":"";return`${t.from}.${r}\u2192${t.to}.${o}${i}`}).join(" ; ")}`}function Kr(n){return n==="if"?["true","false"]:n==="loop"?["loop","done"]:["default"]}function Jr(n){let e=[],t=n;return t=t.replace(/\$node\[\s*(['"])([^'"\]]+)\1\s*\]\.json/g,'$node("$2").output.default[0].json'),t=t.replace(/\$\(\s*(['"])([^'")]+)\1\s*\)(?:\.item|\.first\(\))?\.json/g,'$node("$2").output.default[0].json'),t=t.replace(/\$items\(\s*(['"])([^'")]+)\1\s*\)\[(\d+)\]\.json/g,'$node("$2").output.default[$3].json'),t=t.replace(/\$input(?:\.item|\.first\(\))\.json/g,"$json"),/\$now\b/.test(t)&&e.push("$now:n8n \u4E3A Luxon DateTime,\u6B64\u5904\u4E3A Date(\u683C\u5F0F\u5316\u51FD\u6570\u7528 date(...))"),{body:t,notes:e}}function Vr(n){if(!n.startsWith("="))return null;let e=n.slice(1);if(!e.includes("{{"))return{ok:!0,converted:e,notes:[]};let t=[],r=null,o=e.replace(/\{\{([\s\S]*?)\}\}/g,(i,s)=>{if(r)return i;let{body:a,notes:u}=Jr(s.trim()),c=de(a);return c?(r=`\u8868\u8FBE\u5F0F\u300C{{ ${s.trim()} }}\u300D\u8D85\u51FA\u53D7\u9650\u8BED\u8A00(${c})`,i):(t.push(...u),`{{ ${a} }}`)});return r?{ok:!1,reason:r}:{ok:!0,converted:o,notes:t}}function Ht(n,e,t=""){let r=(o,i)=>{if(typeof o=="string"){let s=Vr(o);return s===null?o:s.ok?(e.converted++,e.notes.push(...s.notes),s.converted):(e.manual.push({path:i,raw:o,reason:s.reason}),o)}return Array.isArray(o)?o.map((s,a)=>r(s,`${i}[${a}]`)):o&&typeof o=="object"?Object.fromEntries(Object.entries(o).map(([s,a])=>[s,r(a,i?`${i}.${s}`:s)])):o};return r(n,t)}var Ut={"@n8n/n8n-nodes-langchain.agent":"agentBinding","@n8n/n8n-nodes-langchain.chainLlm":"agentBinding","@n8n/n8n-nodes-langchain.chainRetrievalQa":"agentBinding","@n8n/n8n-nodes-langchain.chainSummarization":"agentBinding","@n8n/n8n-nodes-langchain.chatTrigger":"trigger","@n8n/n8n-nodes-langchain.documentDefaultDataLoader":"documentLoader","@n8n/n8n-nodes-langchain.embeddingsOpenAi":"modelBinding","@n8n/n8n-nodes-langchain.informationExtractor":"agentBinding","@n8n/n8n-nodes-langchain.lmChatGoogleGemini":"modelBinding","@n8n/n8n-nodes-langchain.lmChatOpenAi":"modelBinding","@n8n/n8n-nodes-langchain.lmChatOpenRouter":"modelBinding","@n8n/n8n-nodes-langchain.lmOpenAi":"modelBinding","@n8n/n8n-nodes-langchain.memoryBufferWindow":"memory","@n8n/n8n-nodes-langchain.openAi":"modelBinding","@n8n/n8n-nodes-langchain.outputParserStructured":"parser","@n8n/n8n-nodes-langchain.retrieverVectorStore":"retriever","@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter":"textSplitter","@n8n/n8n-nodes-langchain.textSplitterTokenSplitter":"textSplitter","@n8n/n8n-nodes-langchain.toolCode":"script","@n8n/n8n-nodes-langchain.toolSerpApi":"toolBinding","@n8n/n8n-nodes-langchain.toolVectorStore":"toolBinding","@n8n/n8n-nodes-langchain.toolWorkflow":"subworkflow","@n8n/n8n-nodes-langchain.vectorStoreInMemory":"vectorStore","@n8n/n8n-nodes-langchain.vectorStoreQdrant":"vectorStore","n8n-nodes-base.aggregate":"aggregate","n8n-nodes-base.code":"script","n8n-nodes-base.convertToFile":"file","n8n-nodes-base.discord":"channel","n8n-nodes-base.executeWorkflow":"subworkflow","n8n-nodes-base.executeWorkflowTrigger":"trigger","n8n-nodes-base.extractFromFile":"file","n8n-nodes-base.facebookGraphApi":"channel","n8n-nodes-base.filter":"filter","n8n-nodes-base.form":"form","n8n-nodes-base.formTrigger":"trigger","n8n-nodes-base.gmail":"integration","n8n-nodes-base.gmailTool":"toolBinding","n8n-nodes-base.gmailTrigger":"trigger","n8n-nodes-base.googleDocs":"integration","n8n-nodes-base.googleDocsTool":"toolBinding","n8n-nodes-base.googleDrive":"integration","n8n-nodes-base.googleSheets":"integration","n8n-nodes-base.googleSheetsTrigger":"trigger","n8n-nodes-base.html":"transform","n8n-nodes-base.htmlExtract":"extract","n8n-nodes-base.httpRequest":"http","n8n-nodes-base.if":"if","n8n-nodes-base.limit":"limit","n8n-nodes-base.linkedIn":"channel","n8n-nodes-base.localFileTrigger":"trigger","n8n-nodes-base.manualTrigger":"trigger","n8n-nodes-base.merge":"merge","n8n-nodes-base.noOp":"passthrough","n8n-nodes-base.openAi":"modelBinding","n8n-nodes-base.postgres":"integration","n8n-nodes-base.postgresTool":"toolBinding","n8n-nodes-base.readBinaryFile":"file","n8n-nodes-base.readWriteFile":"file","n8n-nodes-base.respondToWebhook":"respond","n8n-nodes-base.s3":"integration","n8n-nodes-base.scheduleTrigger":"trigger","n8n-nodes-base.set":"set","n8n-nodes-base.splitInBatches":"split","n8n-nodes-base.splitOut":"split","n8n-nodes-base.spreadsheetFile":"file","n8n-nodes-base.supabaseTool":"toolBinding","n8n-nodes-base.switch":"switch","n8n-nodes-base.telegram":"channel","n8n-nodes-base.telegramTrigger":"trigger","n8n-nodes-base.twitter":"channel","n8n-nodes-base.wait":"wait","n8n-nodes-base.whatsApp":"channel","n8n-nodes-base.whatsAppTrigger":"trigger","n8n-nodes-base.writeBinaryFile":"file","n8n-nodes-base.writeFile":"file","n8n-nodes-base.youTube":"integration"},Gr=new Set(["openAiApi","googlePalmApi","openRouterApi","mistralCloudApi","anthropicApi"]),zr=new Set(["agentBinding"]);function Bt(n){return Gr.has(n)}function Ft(n){return zr.has(n)}function Lt(n){return"workflow"}function Kt(n,e){let t=`${n} ${e}`.toLowerCase();return t.includes("gmail")?"gmail":t.includes("slack")?"slack":t.includes("googlesheets")?"google-sheets":t.includes("googledrive")?"google-drive":t.includes("googledocs")?"google-docs":t.includes("telegram")?"telegram":t.includes("whatsapp")?"whatsapp":t.includes("youtube")?"youtube":t.includes("postgres")?"postgres":t.includes("supabase")?"supabase":t.includes("qdrant")?"qdrant":t.includes("s3")?"s3":t.includes("twitter")||t.includes("xapi")?"x":t.includes("facebook")?"facebook":t.includes("linkedin")?"linkedin":t.includes("discord")?"discord":t.includes("serp")?"serpapi":t.includes("firecrawl")?"firecrawl":t.includes("elevenlabs")?"elevenlabs":"custom"}var Jt={"n8n-nodes-base.set":"set","n8n-nodes-base.if":"if","n8n-nodes-base.merge":"merge","n8n-nodes-base.noOp":"passthrough","n8n-nodes-base.httpRequest":"http","n8n-nodes-base.manualTrigger":"trigger","n8n-nodes-base.scheduleTrigger":"trigger","n8n-nodes-base.cron":"trigger","n8n-nodes-base.webhook":"trigger","n8n-nodes-base.formTrigger":"trigger","n8n-nodes-base.switch":"switch","n8n-nodes-base.filter":"filter","n8n-nodes-base.wait":"wait","n8n-nodes-base.aggregate":"aggregate","n8n-nodes-base.executeWorkflow":"subworkflow"},Yr=new Set(["n8n-nodes-base.stickyNote"]),Zr=new Set(["n8n-nodes-base.code","n8n-nodes-base.function","n8n-nodes-base.functionItem","@n8n/n8n-nodes-langchain.toolCode"]);function Vt(n){let e=new Map;for(let r of n.bindings.connections){let o=`${r.nodeId}\0${r.n8nCredentialType}`;e.has(o)||e.set(o,r)}if(e.size===0)return;let t=[...e.values()];return{version:1,title:"\u5BFC\u5165\u5DE5\u4F5C\u6D41\u5FEB\u901F\u8BBE\u7F6E",description:"\u4E3A\u9700\u8981\u8BBF\u95EE\u5916\u90E8\u670D\u52A1\u7684\u6B65\u9AA4\u9009\u62E9\u672C\u673A\u8FDE\u63A5\uFF1B\u51ED\u636E\u7531 Host \u52A0\u5BC6\u4FDD\u5B58\uFF0C\u4E0D\u5199\u5165\u5DE5\u4F5C\u6D41\u3002",fields:t.map((r,o)=>({id:`connection_${o+1}`,label:r.label?`${r.nodeId}\uFF08\u539F\u8FDE\u63A5\uFF1A${r.label}\uFF09`:`${r.nodeId} \u8FDE\u63A5`,group:"\u5916\u90E8\u670D\u52A1\u8FDE\u63A5",type:"connection",required:!0,connectionType:r.connectionType})),bindings:t.map((r,o)=>({fieldId:`connection_${o+1}`,target:{kind:"node",nodeId:r.nodeId,path:`_n8nConnections.${r.n8nCredentialType}`}}))}}var q=class extends Error{constructor(t){super(`n8n import rejected: ${t.join("; ")}`);this.errors=t;this.name="N8nImportError"}errors};function Gt(n,e,t={}){let r=to(n),o=t.strictTemplates===!0,i=[],s={status:"full",nodes:[],expressions:{converted:0,manual:[]},credentials:[],bindings:{models:[],agents:[],connections:[]},notes:[]},a=new Set,u=new Set,c=[];for(let[p,d]of r.nodes.entries()){if(typeof d?.name!="string"||d.name===""){i.push(`nodes[${p}] has a missing/empty name`);continue}if(a.has(d.name)){i.push(`duplicate node name "${d.name}"`);continue}if(a.add(d.name),typeof d.type!="string"||d.type===""){i.push(`node "${d.name}" has a missing/empty type`);continue}if(Yr.has(d.type)){u.add(d.name),s.nodes.push({id:d.name,n8nType:d.type,outcome:"skipped",notes:["annotation node skipped"]});continue}let f={id:d.name,n8nType:d.type,outcome:"converted",notes:[]};s.nodes.push(f);let l=Qr(d.type,o);Zr.has(d.type)&&!o?(l="manual",f.outcome="manual",f.notes.push("Code node contains imported script; default import keeps it as a fail-loud manual placeholder.")):l||(o?(l="n8nNode",f.outcome="unsupported",f.notes.push(`unsupported n8n node type "${d.type}" preserved as raw n8nNode`)):(l="manual",f.outcome="manual",f.notes.push(`unmapped n8n node type "${d.type}", please replace it manually`)));let m={converted:0,manual:[],notes:[]},h=Ht({...d.parameters??{}},m);s.expressions.converted+=m.converted;for(let w of m.manual)s.expressions.manual.push({nodeId:d.name,...w}),f.notes.push(`parameter ${w.path}: ${w.reason}`),f.outcome==="converted"&&(f.outcome="partial");for(let w of m.notes)s.notes.includes(w)||s.notes.push(w);eo(d,l,s,o),o&&Ft(l)&&(s.bindings.agents.push({nodeId:d.name,fallback:!0,label:d.name}),f.outcome=f.outcome==="converted"?"partial":f.outcome,f.notes.push("agent capability will be resolved from the configured Agent panel, not from n8n credentials"));let v={id:d.name,kind:l,name:d.name,params:{...h,_n8nType:d.type}};o&&(v.params={...v.params,_importMode:"n8n-strict-template",_bindingKind:l}),Array.isArray(d.position)&&Number.isFinite(d.position[0])&&Number.isFinite(d.position[1])&&(v.ui={x:d.position[0],y:d.position[1]}),Xr(v,l,f,o),c.push(v)}let g=r.connections?no(r.connections,a,u,c,i,o):[];if(o&&io(g,c),oo(c),c.length===0&&i.length===0&&i.push("workflow has no nodes"),i.length>0)throw new q(i);return s.status=s.nodes.some(p=>p.outcome==="manual"||p.outcome==="unsupported")?"manual":s.nodes.some(p=>p.outcome==="partial")||s.expressions.manual.length>0?"partial":"full",{name:typeof r.name=="string"&&r.name!==""?r.name:e,def:{id:e,nodes:c,edges:g},report:s}}function Qr(n,e){return e?Ut[n]??Jt[n]??"n8nNode":Jt[n]}function Xr(n,e,t,r){let o=n.params;if(e==="if"){n.outPorts=["true","false"];return}if(e==="wait"){let i=typeof o.amount=="number"?o.amount:Number(o.amount),s=typeof o.unit=="string"?o.unit:"seconds",a=s==="hours"?36e5:s==="minutes"?6e4:1e3;Number.isFinite(i)&&i>0?o.ms=Math.min(36e5,Math.round(i*a)):r||(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push("wait duration could not be parsed"));return}if(e==="subworkflow"){let i=typeof o.workflowId=="object"&&o.workflowId!==null?o.workflowId.value:o.workflowId;typeof i=="string"&&i?(o.workflowId=i,t.outcome=t.outcome==="converted"?"partial":t.outcome,t.notes.push("subworkflow target keeps the n8n workflow id and must be rebound to a local workflow")):r||(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push("subworkflow target is missing"));return}(e==="switch"||e==="filter")&&!r&&(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push(`${e} conditions preserve n8n params and may need review`))}function eo(n,e,t,r){if(!(!n.credentials||typeof n.credentials!="object")){for(let[o,i]of Object.entries(n.credentials)){if(r&&Bt(o)){t.bindings.models.push({nodeId:n.name,n8nCredentialType:o,modelPurpose:Lt(o),label:i?.name});continue}let s=Kt(n.type,o);r&&t.bindings.connections.push({nodeId:n.name,n8nCredentialType:o,connectionType:s,label:i?.name}),t.credentials.push({nodeId:n.name,n8nCredentialType:o,label:i?.name})}r&&e==="modelBinding"&&t.bindings.models.push({nodeId:n.name,n8nCredentialType:"model-registry",modelPurpose:"workflow"})}}function to(n){let e;if(typeof n=="string")try{e=JSON.parse(n)}catch(r){throw new q([`invalid JSON: ${r.message}`])}else e=n;if(!e||typeof e!="object")throw new q(["workflow must be a JSON object"]);let t=e;if(!Array.isArray(t.nodes))throw new q(["workflow.nodes must be an array"]);if(t.connections!==void 0&&(typeof t.connections!="object"||t.connections===null))throw new q(["workflow.connections must be an object"]);return{name:t.name,nodes:t.nodes,connections:t.connections??{}}}function no(n,e,t,r,o,i){let s=new Map(r.map(u=>[u.id,u.kind])),a=[];for(let u of Object.keys(n).sort()){if(t.has(u))continue;if(!e.has(u)){o.push(`connection source "${u}" is not a declared node`);continue}let c=n[u]??{};for(let g of Object.keys(c).sort()){let p=c[g];if(Array.isArray(p))for(let d=0;d<p.length;d++){let f=ro(u,s.get(u),g,d,r,o,i),l=p[d];if(Array.isArray(l))for(let m of l){if(!m||typeof m.node!="string"){o.push(`connection from "${u}" has a malformed target`);continue}if(t.has(m.node))continue;if(!e.has(m.node)){o.push(`connection from "${u}" targets missing node "${m.node}"`);continue}let h={from:u,to:m.node};f!=="default"&&(h.fromPort=f),i&&typeof m.type=="string"&&m.type&&m.type!=="main"&&(h.toPort=m.type),a.push(h)}}}}return a}function ro(n,e,t,r,o,i,s){return t!=="main"?_(o,n,r===0?t:`${t}_${r}`):e==="if"?r===0?"true":r===1?"false":(s||i.push(`if node "${n}" has an unsupported output index ${r}`),_(o,n,`out_${r}`)):e==="switch"?_(o,n,`case_${r}`):e==="filter"?r===0?_(o,n,"default"):(s||i.push(`filter node "${n}" has an unsupported discarded output`),_(o,n,r===1?"discarded":`out_${r}`)):r===0?_(o,n,"default"):(s||i.push(`node "${n}" has an unmodeled multi-output index ${r} (only single-output supported)`),_(o,n,`out_${r}`))}function _(n,e,t){let r=n.find(o=>o.id===e);return r&&(r.outPorts=r.outPorts??[],r.outPorts.includes(t)||r.outPorts.push(t)),t}function oo(n){for(let e of n)e.outPorts&&e.outPorts.length>0&&(e.params={...e.params??{},_n8nOutPorts:e.outPorts})}function io(n,e){let t=[];for(let r of n)if(so(t,r.to,r.from)){r.loopBack=!0;let o=e.find(i=>i.id===r.to);o&&(!o.maxIterations||o.maxIterations<=0)&&(o.maxIterations=100)}else t.push(r)}function so(n,e,t){let r=[e],o=new Set;for(;r.length>0;){let i=r.pop();if(i===t)return!0;if(!o.has(i)){o.add(i);for(let s of n)s.from===i&&r.push(s.to)}}return!1}var ao=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,uo=/^[A-Za-z_$][A-Za-z0-9_$-]*$/,co=new Set(["__proto__","prototype","constructor"]),We=/token|secret|authorization|api[-_]?key|apikey|password|credential|cookie|passphrase|private[-_]?key/i,lo=/^(agentId|mcpPlugins|server|tool|toolName|target|kind)$/i;function A(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function X(n,e,t=500){if(typeof n!="string"||!n.trim()||n.length>t)throw new Error(`workflow setup: ${e} must be a non-empty string up to ${t} characters`)}function Me(n,e){if(n.type==="boolean"){if(typeof e!="boolean")throw new Error(`workflow setup: "${n.id}" must be a boolean`);return}if(n.type==="number"){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`workflow setup: "${n.id}" must be a finite number`);return}if(typeof e!="string")throw new Error(`workflow setup: "${n.id}" must be a string`);if(e.length>1e4)throw new Error(`workflow setup: "${n.id}" is too long`);if(n.type==="url"&&e&&!/^https?:\/\//i.test(e))throw new Error(`workflow setup: "${n.id}" must be an http(s) URL`);if(n.type==="select"&&e&&!n.options?.some(t=>t.value===e))throw new Error(`workflow setup: "${n.id}" is not one of the declared options`)}function _e(n){X(n,"binding path",256);let e=n.split(".");if(e.some(t=>!uo.test(t)||co.has(t)))throw new Error(`workflow setup: unsafe binding path "${n}"`);return e}function Oe(n,e,t){let r=_e(e),o=n;for(let i of r.slice(0,-1)){let s=o[i];if(s!==void 0&&!A(s))throw new Error(`workflow setup: binding path "${e}" crosses a non-object value`);A(s)||(o[i]={}),o=o[i]}o[r.at(-1)]=t}function fo(n,e){let t=_e(e),r=[],o=n;for(let i of t.slice(0,-1)){let s=o[i];if(!A(s))return;r.push({parent:o,key:i}),o=s}delete o[t.at(-1)];for(let{parent:i,key:s}of r.reverse()){let a=i[s];if(!A(a)||Object.keys(a).length>0)break;delete i[s]}}function H(n,e){if(!A(n)||n.version!==1||!Array.isArray(n.fields)||!Array.isArray(n.bindings))throw new Error("workflow setup: version 1 fields and bindings are required");if(n.fields.length>100||n.bindings.length>500)throw new Error("workflow setup: manifest exceeds the supported size");let t=new Set(e.nodes.map(s=>s.id)),r=n.fields.map(s=>{if(!A(s))throw new Error("workflow setup: every field must be an object");if(X(s.id,"field id",128),!ao.test(s.id))throw new Error(`workflow setup: invalid field id "${s.id}"`);X(s.label,`field "${s.id}" label`,200);let a=s.type;if(!["text","textarea","url","number","boolean","select","connection"].includes(String(a)))throw new Error(`workflow setup: unsupported field type "${String(a)}"`);let u=structuredClone(s);if(u.type!=="connection"&&(We.test(u.id)||We.test(u.label)))throw new Error(`workflow setup: secret input "${u.id}" must use a Host-owned connection`);if(u.type==="select"){if(!Array.isArray(u.options)||u.options.length===0)throw new Error(`workflow setup: select field "${u.id}" requires options`);for(let c of u.options)X(c?.label,`field "${u.id}" option label`,200),X(c?.value,`field "${u.id}" option value`,500)}return u.defaultValue!==void 0&&Me(u,u.defaultValue),u}),o=new Set;for(let s of r){if(o.has(s.id))throw new Error(`workflow setup: duplicate field id "${s.id}"`);o.add(s.id)}let i=n.bindings.map(s=>{if(!A(s)||typeof s.fieldId!="string"||!o.has(s.fieldId))throw new Error("workflow setup: every binding must reference a declared field");let a=s.target;if(!A(a)||a.kind!=="node"&&a.kind!=="trigger")throw new Error(`workflow setup: field "${s.fieldId}" has an invalid target`);let u=String(a.path??""),c=_e(u);if(We.test(String(a.path??"")))throw new Error(`workflow setup: binding "${String(a.path)}" must reference an opaque connection, not a credential or secret field`);if(c.some(g=>lo.test(g)))throw new Error(`workflow setup: binding "${u}" cannot change workflow capability identity`);if(a.kind==="node"&&(typeof a.nodeId!="string"||!t.has(a.nodeId)))throw new Error(`workflow setup: field "${s.fieldId}" targets a missing node`);return structuredClone(s)});for(let s of r)if(!i.some(a=>a.fieldId===s.id))throw new Error(`workflow setup: field "${s.id}" has no binding`);return{version:1,...typeof n.title=="string"&&n.title.trim()?{title:n.title}:{},...typeof n.description=="string"&&n.description.trim()?{description:n.description}:{},fields:r,bindings:i}}function zt(n,e){let t={};for(let o of n.fields){let i=e?.values[o.id]??o.defaultValue;i!==void 0&&(t[o.id]=i)}let r=n.fields.filter(o=>o.required&&(t[o.id]===void 0||t[o.id]==="")).map(o=>o.id);return{manifest:n,values:t,status:r.length===0?"complete":"pending",missingRequired:r}}function qe(n,e,t,r,o,i=new Date().toISOString()){let s=new Map(t.fields.map(d=>[d.id,d]));for(let d of Object.keys(o))if(!s.has(d))throw new Error(`workflow setup: unknown field "${d}"`);let a={};for(let d of t.fields){let f=r?.values[d.id];if(f!==void 0)try{Me(d,f),a[d.id]=f}catch{}}for(let d of t.fields){let f=o[d.id]??a[d.id]??d.defaultValue;f!==void 0&&(Me(d,f),a[d.id]=f)}let u=zt(t,{values:a}),c=structuredClone(n),g=e==null?e:structuredClone(e),p=new Map(c.nodes.map(d=>[d.id,d]));for(let d of t.bindings){let f=a[d.fieldId];if(f!==void 0)if(d.target.kind==="node"){let l=p.get(d.target.nodeId);if(!l)throw new Error(`workflow setup: binding node "${d.target.nodeId}" no longer exists`);l.params=A(l.params)?structuredClone(l.params):{},Oe(l.params,d.target.path,f)}else{if(!g)throw new Error("workflow setup: trigger binding requires a workflow trigger");Oe(g,d.target.path,f)}}return{def:c,trigger:g,state:{values:a,updatedAt:i,...u.missingRequired.length===0?{completedAt:i}:{}},missingRequired:u.missingRequired}}function Yt(n,e,t){let r=structuredClone(n),o=e==null?e:structuredClone(e),i=new Map(r.nodes.map(a=>[a.id,a])),s=new Map(t.fields.map(a=>[a.id,a]));for(let a of t.bindings){let u=s.get(a.fieldId);if(!u)continue;let c=a.target.kind==="node"?i.get(a.target.nodeId)?.params:o;A(c)&&(u.defaultValue===void 0?fo(c,a.target.path):Oe(c,a.target.path,u.defaultValue))}return{def:r,trigger:o}}import{join as Xt}from"node:path";import{mkdir as po}from"node:fs/promises";function ee(n,...e){let t=n.toLowerCase();return e.some(r=>t.includes(r.toLowerCase()))}function pe(n,e){let t=(n??"").trim(),r=t.length>300?`${t.slice(0,300)}\u2026`:t||void 0;return ee(t,"stream closed before a terminal event","likely truncated upstream","RETRYABLE_TRANSIENT")?{class:"network",message:"\u6A21\u578B\u54CD\u5E94\u6D41\u63D0\u524D\u4E2D\u65AD\uFF0C\u672A\u6536\u5230\u5B8C\u6574\u7684\u7ED3\u675F\u4FE1\u53F7\u3002",hint:"\u672C\u6B21\u4E0D\u5B8C\u6574\u7ED3\u679C\u5DF2\u4E22\u5F03\uFF1B\u901A\u5E38\u662F\u6A21\u578B\u670D\u52A1\u6216\u7F51\u7EDC\u4E34\u65F6\u6296\u52A8\uFF0C\u76F4\u63A5\u91CD\u8DD1\u5373\u53EF\u3002",actions:["rerun_node","rerun_all"],detail:r}:ee(t,"credential","\u51ED\u8BC1","unauthorized","forbidden","401","403","auth")?{class:"user",message:"\u9274\u6743\u6CA1\u901A\u8FC7 \u2014\u2014 \u51ED\u8BC1\u7F3A\u5931\u6216\u5DF2\u5931\u6548\u3002",hint:"\u68C0\u67E5\u5BF9\u5E94\u8282\u70B9\u6216 MCP \u63D2\u4EF6\u7684\u8FDE\u63A5\u914D\u7F6E\u540E\u91CD\u8DD1\u3002",actions:["ai_fix","rerun_node"],detail:r}:ee(t,"\u4E0D\u5B58\u5728\u7684","\u5F15\u7528\u4E86\u4E0D\u5B58\u5728","no nodeexecutor","\u76EE\u5F55\u5916","not registered","unknown kind","\u672A\u80FD\u81EA\u52A8\u8F6C\u6362","\u4EBA\u5DE5\u8FC1\u79FB")?{class:"capability",message:"\u8FD9\u4E00\u6B65\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u80FD\u529B / \u5DE5\u5177\u3002",hint:"\u6362\u4E00\u4E2A\u771F\u5B9E\u5B58\u5728\u7684\u5DE5\u5177,\u6216\u8BA9 AI \u6539\u8FD9\u4E00\u6B65\u3002",actions:["ai_fix","swap_capability","rerun_node"],detail:r}:ee(t,"econnrefused","enotfound","etimedout","fetch failed","network","timeout","timed out","socket","getaddrinfo","invalid url","request failed","5xx","502","503","504")?{class:"network",message:"\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25 \u2014\u2014 \u5730\u5740\u4E0D\u901A\u3001\u8D85\u65F6\u6216\u5BF9\u65B9\u62A5\u9519\u3002",hint:"\u786E\u8BA4\u5730\u5740/\u7F51\u7EDC\u540E\u91CD\u8DD1;\u5730\u5740\u4E0D\u5BF9\u5C31\u8BA9 AI \u6539\u3002",actions:["rerun_node","ai_fix"],detail:r}:ee(t,"requires string param","requires param","requires object param","requires non-empty","\u7F3A\u5C11\u5FC5\u586B","required","must be","\u5FC5\u586B","in 1..","must have at least")?{class:"user",message:"\u8FD9\u4E00\u6B65\u7F3A\u5C11\u5FC5\u8981\u4FE1\u606F(\u5FC5\u586B\u53C2\u6570\u6CA1\u586B\u5168\u6216\u683C\u5F0F\u4E0D\u5BF9)\u3002",hint:"\u8BA9 AI \u8865\u5168,\u6216\u5728\u300C\u9AD8\u7EA7\u300D\u91CC\u624B\u52A8\u586B\u3002",actions:["ai_fix","rerun_node"],detail:r}:{class:"system",message:"\u8FD9\u4E00\u6B65\u6267\u884C\u51FA\u9519\u4E86\u3002",hint:"\u53EF\u4EE5\u91CD\u8DD1;\u82E5\u53CD\u590D\u5931\u8D25,\u8BA9 AI \u770B\u770B\u8FD9\u4E00\u6B65\u3002",actions:["rerun_node","ai_fix","rerun_all"],detail:r}}var go=20,Zt=2e3;function Qt(n,e){return Xt(j(n),e,"runs","history.json")}function Ue(n){let e={};for(let[t,r]of Object.entries(n.outputs)){let o={};for(let[a,u]of Object.entries(r))o[a]=u.map(c=>c.json);let i=JSON.stringify(o);i.length>Zt&&(i=`${i.slice(0,Zt)}\u2026(truncated)`);let s=n.nodeStats?.[t];e[t]={executed:n.executed.has(t),preview:i,...s?{seq:s.seq,startedAt:s.startedAt,durationMs:s.durationMs,attempts:s.attempts,cacheHit:s.cacheHit,nodeStatus:s.status,...s.warning!==void 0?{warning:s.warning}:{}}:{}}}return e}var He=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowRunHistoryStore requires a project cwd")}cwd;mutationChains=new Map;async begin(e,t){await this.mutate(e,r=>{let{triggerPayload:o,...i}=t;r.unshift({...i,status:"running",...o?{recovery:{triggerPayload:structuredClone(o)}}:{}}),r.splice(go)})}async finish(e,t,r){await this.mutate(e,o=>{let i=o.find(a=>a.runId===t);if(!i)return;let s=i.nodes??{};Object.assign(i,r),r.nodes&&(i.nodes=Object.fromEntries(Object.entries(r.nodes).map(([a,u])=>[a,{...s[a]??{},...u,activities:s[a]?.activities}]))),i.status!=="running"&&delete i.recovery,i.errorInfo=i.status==="failed"&&i.error?pe(i.error):void 0})}async recordNodeStatus(e,t,r,o,i){let s=new Date().toISOString();await this.mutate(e,a=>{let u=a.find(m=>m.runId===t);if(!u)return;u.nodes??={};let c=u.nodes[r],g=c?.startedAt??s,p=c?.activities??[],d=o==="running"?"started":o,f=o==="running"?"\u8282\u70B9\u5F00\u59CB\u6267\u884C":o==="completed"?"\u8282\u70B9\u6267\u884C\u5B8C\u6210":"\u8282\u70B9\u6267\u884C\u5931\u8D25",l=i?pe(i).message:void 0;p.at(-1)?.phase!==d&&p.push({ts:s,phase:d,label:f,...l?{detail:l}:{}}),u.nodes[r]={...c??{},executed:o!=="running",preview:c?.preview??"",startedAt:g,nodeStatus:o,activities:p.slice(-50),...o!=="running"?{durationMs:Math.max(0,Date.parse(s)-Date.parse(g))}:{},...i?{error:i}:{}}})}async recordNodeActivity(e,t,r,o){await this.mutate(e,i=>{let s=i.find(p=>p.runId===t);if(!s)return;s.nodes??={};let a=s.nodes[r]??{executed:!1,preview:"",startedAt:new Date().toISOString(),nodeStatus:"running"},u={...o,ts:o.ts??new Date().toISOString()},c=a.activities??[],g=c.at(-1);g?.phase===u.phase&&g.label===u.label&&g.detail===u.detail||(s.nodes[r]={...a,activities:[...c,u].slice(-50)})})}async list(e){return await this.waitForMutations(e),(await this.read(e)).map(t=>{let{nodes:r,recovery:o,...i}=this.withCurrentErrorInfo(t);return i})}async get(e,t){await this.waitForMutations(e);let r=(await this.read(e)).find(s=>s.runId===t);if(!r)return;let{recovery:o,...i}=this.withCurrentErrorInfo(r);return i}async recoverableRunning(e){return await this.waitForMutations(e),(await this.read(e)).filter(t=>t.status==="running").map(t=>({runId:t.runId,triggerType:t.triggerType,startedAt:t.startedAt,...t.recovery?.triggerPayload?{triggerPayload:structuredClone(t.recovery.triggerPayload)}:{}}))}withCurrentErrorInfo(e){return e.status!=="failed"||!e.error?e:{...e,errorInfo:pe(e.error)}}async waitForMutations(e){await this.mutationChains.get(e)?.catch(()=>{})}async mutate(e,t){let o=(this.mutationChains.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{let i=await this.read(e);t(i),await this.write(e,i)});this.mutationChains.set(e,o);try{await o}finally{this.mutationChains.get(e)===o&&this.mutationChains.delete(e)}}async read(e){try{let t=await W(Qt(this.cwd,e));return Array.isArray(t)?t:[]}catch{return[]}}async write(e,t){let r=Qt(this.cwd,e);await po(Xt(j(this.cwd),e,"runs"),{recursive:!0}),await M(r,t)}};import{randomUUID as mo}from"node:crypto";var Be=class{constructor(e,t,r){this.store=e;this.runtimeFactory=t;this.runHistory=r}store;runtimeFactory;runHistory;slots=new Map;activeRuns=new Map;activeRunIdsByWorkflow=new Map;suppressedHistoryRunIds=new Set;async create(e){let t=J(e.def);if(t.length>0)throw new P(t);let r=new Date().toISOString(),o={id:e.id,name:e.name,...e.owner?{owner:e.owner}:{},...e.setup?{setup:H(e.setup,e.def)}:{},...e.setupState?{setupState:structuredClone(e.setupState)}:{},def:e.def,active:e.active??!1,concurrency:e.concurrency??"queue",rev:1,createdAt:r,updatedAt:r};return await this.store.save(o),o}async update(e,t){let o={...await this.store.require(e),...t,updatedAt:new Date().toISOString()};if(t.def!==void 0){let i=J(o.def);if(i.length>0)throw new P(i)}return o.setup&&(o.setup=H(o.setup,o.def)),await this.store.save(o),o}async configureTemplate(e,t){let r=await this.store.require(e);if(r.rev!==t.baseRev)return{ok:!1,conflict:{latestRev:r.rev}};if(!r.setup)throw new Error(`Workflow "${e}" has no template setup manifest`);let o=qe(r.def,r.trigger,r.setup,r.setupState,t.values),i={...r,def:o.def,trigger:o.trigger,setupState:o.state,rev:r.rev+1,updatedAt:new Date().toISOString()},s=J(i.def);if(s.length>0)throw new P(s);return await this.store.save(i),{ok:!0,rev:i.rev,applied:[],missingRequired:o.missingRequired}}async setActive(e,t){if(t){let r=await this.store.require(e);if(!r.publishedDef)throw new Error(`Workflow "${e}" has no published version \u2014 publish the draft before activating`);if(r.archived)throw new Error(`Workflow "${e}" is archived \u2014 restore it before activating`)}return this.update(e,{active:t})}async publish(e){let t=await this.store.require(e);if(t.archived)throw new Error(`Workflow "${e}" is archived \u2014 restore it before publishing`);let r=J(t.def);if(r.length>0)throw new P(r);let o={...t,publishedDef:structuredClone(t.def),publishedRev:t.rev,updatedAt:new Date().toISOString()};return await this.store.save(o),o}async archive(e,t){let o={...await this.store.require(e),archived:t,...t?{active:!1}:{},updatedAt:new Date().toISOString()};return await this.store.save(o),o}async revertTo(e,t){let r=await this.store.require(e),o=await this.store.loadRevision(e,t);if(!o)throw new Error(`Workflow "${e}" has no stored revision ${t}`);let i=J(o.def);if(i.length>0)throw new P(i);let s={...r,def:o.def,name:o.name,trigger:o.trigger??null,rev:r.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(s),s}async importN8n(e,t,r={}){let{name:o,def:i,report:s}=Gt(t,e,{strictTemplates:!0}),a=Vt(s);return{record:await this.create({id:e,name:o,def:i,concurrency:r.concurrency,owner:r.owner,...a?{setup:a,setupState:{values:{}}}:{}}),report:s}}async get(e){return this.store.require(e)}async describe(e,t){let r=await this.store.require(e);return De(r,t)}async patch(e,t){let r=await this.store.require(e),o=t.baseRev!==void 0&&t.baseRev<r.rev,i={def:r.def,meta:{name:r.name,active:r.active,trigger:r.trigger??null}},s,a;try{let g=Ce(i,t);s=g.applied,a=g.target}catch(g){if(o&&g instanceof P)return{ok:!1,conflict:{latestRev:r.rev}};throw g}if(a.meta.active===!0&&!r.active&&!r.publishedDef)throw new P([`workflow "${e}" has no published version \u2014 publish the draft before activating (set_meta.active)`]);let c={...r,def:a.def,name:a.meta.name??r.name,active:a.meta.active??r.active,trigger:a.meta.trigger??null,rev:r.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(c),{ok:!0,rev:c.rev,applied:s}}async run(e,t,r={}){let o=await this.store.require(e);if(o.archived)throw new Error(`Workflow "${e}" is archived and cannot run`);let i=t?.type??"manual",s=i==="manual"||i==="intent"||i==="form",a;if(s)a=o.def;else{if(!o.publishedDef)throw new Error(`Workflow "${e}" has no published version \u2014 unattended trigger "${i}" refused`);a=o.publishedDef}let u={workflowId:e,runId:r.recoverRunId??mo(),type:i,payload:t?.payload,permissionScope:o.permissionScope,reuseCache:r.reuseCache===!0},c=this.slotFor(e),g=()=>{if(c.pending>0)switch(o.concurrency){case"skip":return Promise.resolve({workflowId:e,status:"skipped"});case"parallel":return this.startParallel(e,a,u);case"queue":return this.track(e,c,a,u,!0)}return this.track(e,c,a,u,!1)};return this.recordRun(e,u,g,r.recordHistory===!1,r.onStarted,r.recoverRunId!==void 0)}async recordRun(e,t,r,o=!1,i,s=!1){let a=Date.now(),u={workflowId:e,runId:t.runId,triggerType:t.type};if(!this.runHistory||o)try{await i?.(u);let p=await r();return{...p,runId:p.runId??t.runId}}catch(p){if(p instanceof E)return{workflowId:e,status:"canceled",runId:t.runId};throw p}if(s){let p=(await this.runHistory.recoverableRunning(e)).find(f=>f.runId===t.runId);if(!p)throw new Error(`Workflow "${e}" has no recoverable running history for "${t.runId}"`);let d=Date.parse(p.startedAt);Number.isFinite(d)&&(a=d)}else await this.runHistory.begin(e,{runId:t.runId,triggerType:t.type,startedAt:new Date(a).toISOString(),...t.payload?{triggerPayload:t.payload}:{}});let c=p=>this.finishRunHistory(e,t.runId,a,p),g;try{await i?.(u),g=await r()}catch(p){if(p instanceof E)return await c({status:"canceled",error:p.message}),{workflowId:e,status:"canceled",runId:t.runId};throw await c({status:"failed",error:p instanceof Error?p.message:String(p),failedNodeId:p?.nodeId}),p}return await c({status:g.status,...g.result?{nodes:Ue(g.result)}:{}}),{...g,runId:t.runId}}pause(e,t={}){this.requireActiveRun(e,t.runId).runtime.pause()}async resume(e,t={}){let r=this.requireActiveRun(e,t.runId);if(r.status!=="paused")throw new Error(`Workflow "${e}" run "${r.runId}" is not paused`);t.extraBudget&&r.runtime.extendBudget(t.extraBudget),r.status="running";let o=this.slotFor(e);o.pending++;let i=r.runtime.run().then(async s=>{let a={workflowId:e,runId:r.runId,status:s.status,result:s};return s.status==="paused"?r.status="paused":this.unregisterActiveRun(r.runId),await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:a.status,nodes:Ue(s)}),a}).catch(async s=>{if(this.unregisterActiveRun(r.runId),s instanceof E)return await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:"canceled",error:s.message}),{workflowId:e,runId:r.runId,status:"canceled"};throw await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:"failed",error:s instanceof Error?s.message:String(s),failedNodeId:s?.nodeId}),s}).finally(()=>{o.pending--});return o.tail=i.catch(()=>{}),i}async cancelRun(e,t={}){let r=this.requireActiveRun(e,t.runId),o=t.reason??`Workflow "${e}" run "${r.runId}" canceled`,i=new E(o);return r.runtime.cancel(o),r.abortController.signal.aborted||r.abortController.abort(i),this.unregisterActiveRun(r.runId),r.status==="paused"&&await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:"canceled",error:o}),{workflowId:e,runId:r.runId,status:"canceled"}}async delete(e){let t=[...this.activeRunIdsByWorkflow.get(e)??[]];for(let r of t)this.suppressedHistoryRunIds.add(r),await this.cancelRun(e,{runId:r,reason:`Workflow "${e}" deleted`}).catch(()=>{});this.slots.delete(e),await this.store.delete(e)}async listActive(){return this.store.listActive()}slotFor(e){let t=this.slots.get(e);return t||(t={tail:Promise.resolve(),pending:0},this.slots.set(e,t)),t}registerActiveRun(e){this.activeRuns.set(e.runId,e);let t=this.activeRunIdsByWorkflow.get(e.workflowId);t||(t=new Set,this.activeRunIdsByWorkflow.set(e.workflowId,t)),t.add(e.runId)}unregisterActiveRun(e){let t=this.activeRuns.get(e);if(!t)return;this.activeRuns.delete(e);let r=this.activeRunIdsByWorkflow.get(t.workflowId);r&&(r.delete(e),r.size===0&&this.activeRunIdsByWorkflow.delete(t.workflowId))}requireActiveRun(e,t){if(t){let s=this.activeRuns.get(t);if(!s||s.workflowId!==e)throw new Error(`Workflow "${e}" has no active run "${t}"`);return s}let r=[...this.activeRunIdsByWorkflow.get(e)??[]],o=this.slots.get(e)?.latestRunId;if(o&&r.includes(o))return this.activeRuns.get(o);let i=r.at(-1);if(!i)throw new Error(`Workflow "${e}" has no active run`);return this.activeRuns.get(i)}async finishRunHistory(e,t,r,o){!this.runHistory||this.suppressedHistoryRunIds.has(t)||await this.runHistory.finish(e,t,{finishedAt:new Date().toISOString(),durationMs:Date.now()-r,...o})}track(e,t,r,o,i){t.pending++;let s=()=>this.startTrackedRuntime(e,t,r,o),u=(i?t.tail.then(s):s()).finally(()=>{t.pending--});return t.tail=u.catch(()=>{}),u}async startParallel(e,t,r){return this.startTrackedRuntime(e,void 0,t,r)}async startTrackedRuntime(e,t,r,o){let i=new AbortController,s=this.runtimeFactory(r,{...o,signal:i.signal}),a={workflowId:e,runId:o.runId,startedAtMs:Date.now(),runtime:s,abortController:i,status:"running"};this.registerActiveRun(a),t&&(t.runtime=s,t.latestRunId=o.runId);try{let u=await s.run(),c={workflowId:e,runId:o.runId,status:u.status,result:u};return u.status==="paused"?a.status="paused":this.unregisterActiveRun(o.runId),c}catch(u){throw this.unregisterActiveRun(o.runId),u}}};function ho(n){return(e,t)=>new Q(e,{registry:n.registry,host:n.host,signal:t.signal,checkpoint:n.checkpoint?.(t.workflowId,t.reuseCache?"shared-cache":t.runId),preserveCheckpoint:t.reuseCache===!0,trigger:t.payload,triggerKind:t.type,runId:t.runId,now:n.now,onNodeStatus:n.emitNodeStatus?(r,o,i)=>n.emitNodeStatus(t.workflowId,r,o,i):void 0,gate:new fe({trigger:t.type,maxNodeExecutions:n.budget.maxNodeExecutions,maxDurationMs:n.budget.maxDurationMs,allowUnattendedKinds:t.permissionScope?.allowUnattendedKinds??n.allowUnattendedKinds,now:n.now?()=>n.now().getTime():void 0})})}function wo(n){let e=n.fetchImpl??fetch;return{async runAgent(t){let r=await n.runAgent({agentId:t.agentId,prompt:t.prompt,signal:t.signal});return[O({text:r,output:r})]},async runModel(t){if(!n.resolveClientForPurpose)throw new Error("workflow model node: no configured model resolver is wired");let r=n.resolveClientForPurpose("textGeneration");if(!r)throw new Error("workflow model node: no textGeneration model is configured");let o="";for await(let i of r.transport.stream({model:r.model,messages:[{role:"user",content:t.prompt}],temperature:t.temperature,maxTokens:t.maxTokens,tools:[]},r.apiKey,t.signal))if(i.type==="delta"&&(o+=i.text),i.type==="error")throw new Error(i.message);return[O({text:o,output:o,model:r.model,...t.modelHint?{importedModel:t.modelHint}:{},choices:[{text:o}]})]},async httpRequest(t){let r={...t.headers??{}};t.idempotencyKey&&t.method.toUpperCase()!=="GET"&&t.method.toUpperCase()!=="HEAD"&&!Object.keys(r).some(u=>u.toLowerCase()==="idempotency-key")&&(r["Idempotency-Key"]=t.idempotencyKey);let o=await e(t.url,{method:t.method||"GET",headers:Object.keys(r).length>0?r:void 0,body:t.body===void 0?void 0:typeof t.body=="string"?t.body:JSON.stringify(t.body),signal:t.signal}),i=o.headers.get("content-type")??"";if(i.includes("application/json")){let u=await o.text(),c=u;try{u.length>0&&(c=JSON.parse(u))}catch{c={__unparsedJson:u}}return[O({status:o.status,ok:o.ok,body:c})]}let s=Buffer.from(await o.arrayBuffer()),a=yo(o.headers.get("content-disposition"));return[O({status:o.status,ok:o.ok,bodyBase64:s.toString("base64"),mimeType:i||"application/octet-stream",size:s.byteLength,...a?{filename:a}:{}})]},async invokeMcp(t){let r=await n.invokeMcp({server:t.server,tool:t.tool,args:t.args,signal:t.signal});return[O({result:r})]},async runN8nNode(t){if(!n.runN8nNode)throw new Error("workflow n8n node: no n8n compatibility service is wired");return n.runN8nNode(t)},async sendChannel(t){if(!n.sendChannel)throw new Error("workflow channel node: sendChannel requires the xiaozhiclaw gateway host, none injected (channel/IM nodes are unavailable in standalone qlogicagent \u2014 D12/D13).");let r=await n.sendChannel({channel:t.channel,target:t.target,payload:t.payload,idempotencyKey:t.idempotencyKey,signal:t.signal});return[O({sent:!0,result:r})]},async memory(t){if(!n.memory)throw new Error("workflow memory node: no memory backend injected (handler host wires the project memdir)");return n.memory(t)},async runSubworkflow(t){if(!n.runSubworkflow)throw new Error("workflow subworkflow node: no sub-run backend injected (handler host wires the controller)");return n.runSubworkflow(t)},async approval(t){if(!n.approval)throw new Error("workflow approval node: no approval backend injected (handler host wires the notify/await loop)");return n.approval(t)},async waitWebhook(t){if(!n.waitWebhook)throw new Error("workflow wait(until=webhook): no webhook-wait backend injected (handler host wires the wake registry)");return n.waitWebhook(t)}}}function yo(n){if(!n)return;let e=n.match(/filename\*=UTF-8''([^;]+)/i);if(e)return decodeURIComponent(e[1].trim().replace(/^"|"$/g,""));let t=n.match(/filename=([^;]+)/i);return t?t[1].trim().replace(/^"|"$/g,""):void 0}var en=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],tn=["SUN","MON","TUE","WED","THU","FRI","SAT"];function ko(n){if(typeof n!="string"||n.trim()==="")throw new Error("cron must be a non-empty string");let e=n.trim().split(/\s+/);if(e.length!==5&&e.length!==6)throw new Error(`cron must have 5 or 6 fields, got ${e.length}: "${n}"`);let t=e.length===6,r=t?[{label:"second",min:0,max:59},{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:en},{label:"day-of-week",min:0,max:7,names:tn}]:[{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:en},{label:"day-of-week",min:0,max:7,names:tn}],o=r.map((u,c)=>({spec:u,raw:e[c],set:bo(e[c],r[c])})),i=u=>{let c=o.find(g=>g.spec.label===u);if(!c)throw new Error(`internal: missing cron field ${u}`);return c},s=i("day-of-week"),a=new Set;for(let u of s.set)a.add(u===7?0:u);return{hasSeconds:t,seconds:t?i("second").set:new Set([0]),minutes:i("minute").set,hours:i("hour").set,doms:i("day-of-month").set,months:i("month").set,dows:a,domRestricted:i("day-of-month").raw.trim()!=="*",dowRestricted:s.raw.trim()!=="*"}}function bo(n,e){let t=new Set;for(let r of n.split(","))vo(r,e,t);if(t.size===0)throw new Error(`cron ${e.label} expanded to an empty set: "${n}"`);return t}function vo(n,e,t){if(n==="")throw new Error(`cron ${e.label} has an empty list element`);let r=n,o=1,i=n.indexOf("/");if(i!==-1){r=n.slice(0,i);let u=n.slice(i+1);if(!/^\d+$/.test(u)||Number(u)<=0)throw new Error(`cron ${e.label} has an invalid step "/${u}"`);o=Number(u)}let s,a;if(r==="*")s=e.min,a=e.max;else{let u=r.indexOf("-");if(u!==-1){let c=Fe(r.slice(0,u),e),g=Fe(r.slice(u+1),e);if(c===void 0||g===void 0)throw new Error(`cron ${e.label} has an invalid range "${r}"`);if(c>g)throw new Error(`cron ${e.label} range "${r}" is descending`);s=c,a=g}else{let c=Fe(r,e);if(c===void 0)throw new Error(`cron ${e.label} value "${r}" is out of range ${e.min}-${e.max}`);s=c,a=o===1?c:e.max}}for(let u=s;u<=a;u+=o)t.add(u)}function Fe(n,e){let t;if(/^\d+$/.test(n))t=Number(n);else if(e.names){let r=e.names.indexOf(n.toUpperCase());if(r===-1)return;t=e.label==="month"?r+1:r}else return;if(!(t<e.min||t>e.max))return t}var sn=5*366+32;function ge(n,e,t="UTC"){let r=ko(n);if(xo(t),t!=="UTC"&&t!=="Etc/UTC")return Ro(r,n,e,t);let o=new Date(e);r.hasSeconds?(o.setUTCMilliseconds(0),o.setUTCSeconds(o.getUTCSeconds()+1)):(o.setUTCSeconds(0,0),o.setUTCMinutes(o.getUTCMinutes()+1));for(let i=0;i<sn;i++){if(!r.months.has(o.getUTCMonth()+1)){o.setUTCMonth(o.getUTCMonth()+1,1),o.setUTCHours(0,0,0,0);continue}if(!Je(r,o)){o.setUTCDate(o.getUTCDate()+1),o.setUTCHours(0,0,0,0);continue}if(!r.hours.has(o.getUTCHours())){o.setUTCHours(o.getUTCHours()+1,0,0,0);continue}if(!r.minutes.has(o.getUTCMinutes())){o.setUTCMinutes(o.getUTCMinutes()+1,0,0);continue}if(r.hasSeconds&&!r.seconds.has(o.getUTCSeconds())){o.setUTCSeconds(o.getUTCSeconds()+1,0);continue}return o.getTime()}throw new Error(`cron "${n}" has no matching time within ~5 years of ${new Date(e).toISOString()}`)}var nn=new Map;function xo(n){try{an(n).format(0)}catch{throw new Error(`Invalid or unsupported timezone: ${JSON.stringify(n)}`)}}function an(n){let e=nn.get(n);return e||(e=new Intl.DateTimeFormat("en-CA-u-ca-gregory-nu-latn",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),nn.set(n,e)),e}function Le(n,e){let t={};for(let r of an(e).formatToParts(n))r.type!=="literal"&&(t[r.type]=Number(r.value));return{year:t.year,month:t.month,day:t.day,hour:t.hour===24?0:t.hour,minute:t.minute,second:t.second}}function Ke(n){return Date.UTC(n.year,n.month-1,n.day,n.hour,n.minute,n.second)}function Eo(n,e){return n.year===e.year&&n.month===e.month&&n.day===e.day&&n.hour===e.hour&&n.minute===e.minute&&n.second===e.second}function rn(n,e){let t=Ke(n),r=new Set;for(let i=-36;i<=36;i+=6){let s=t+i*36e5;r.add(Ke(Le(s,e))-s)}let o=[...r].map(i=>t-i).filter(i=>Eo(Le(i,e),n));return[...new Set(o)].sort((i,s)=>i-s)}function on(n){return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:n.getUTCHours(),minute:n.getUTCMinutes(),second:n.getUTCSeconds()}}function Po(n,e){return n.months.has(e.getUTCMonth()+1)&&Je(n,e)&&n.hours.has(e.getUTCHours())&&n.minutes.has(e.getUTCMinutes())&&(!n.hasSeconds||n.seconds.has(e.getUTCSeconds()))}function Ro(n,e,t,r){let o=Le(t,r),i=Ke(o),s=n.hasSeconds?1e3:6e4;for(let u=i-4*36e5;u<=i;u+=s){let c=new Date(u);if(!Po(n,c))continue;let g=rn(on(c),r).find(p=>p>t);if(g!==void 0)return g}let a=new Date(i);n.hasSeconds?(a.setUTCMilliseconds(0),a.setUTCSeconds(a.getUTCSeconds()+1)):(a.setUTCSeconds(0,0),a.setUTCMinutes(a.getUTCMinutes()+1));for(let u=0;u<sn;u++){if(!n.months.has(a.getUTCMonth()+1)){a.setUTCMonth(a.getUTCMonth()+1,1),a.setUTCHours(0,0,0,0);continue}if(!Je(n,a)){a.setUTCDate(a.getUTCDate()+1),a.setUTCHours(0,0,0,0);continue}if(!n.hours.has(a.getUTCHours())){a.setUTCHours(a.getUTCHours()+1,0,0,0);continue}if(!n.minutes.has(a.getUTCMinutes())){a.setUTCMinutes(a.getUTCMinutes()+1,0,0);continue}if(n.hasSeconds&&!n.seconds.has(a.getUTCSeconds())){a.setUTCSeconds(a.getUTCSeconds()+1,0);continue}let c=rn(on(a),r).find(g=>g>t);if(c!==void 0)return c;n.hasSeconds?a.setUTCSeconds(a.getUTCSeconds()+1,0):a.setUTCMinutes(a.getUTCMinutes()+1,0,0)}throw new Error(`cron "${e}" has no matching time within ~5 years of ${new Date(t).toISOString()} in ${r}`)}function Je(n,e){let t=n.doms.has(e.getUTCDate()),r=n.dows.has(e.getUTCDay());return n.domRestricted&&n.dowRestricted?t||r:n.domRestricted?t:n.dowRestricted?r:!0}var So={now:()=>Date.now(),setTimer:(n,e)=>setTimeout(n,e),clearTimer:n=>clearTimeout(n)},dn=2e9,Ve=class{controller;clock;onError;onRunStarted;onRunCompleted;onRunFailed;defaultTimezone;getLastScheduledAt;triggers=new Map;cronArms=new Map;lastFireAt=new Map;minTriggerIntervalMs;onTriggerDropped;started=!1;constructor(e){if(!e.controller)throw new Error("WorkflowScheduler requires a controller");if(typeof e.onError!="function")throw new Error("WorkflowScheduler requires an onError handler");this.controller=e.controller,this.clock=e.clock??So,this.onError=e.onError,this.onRunStarted=e.onRunStarted,this.onRunCompleted=e.onRunCompleted,this.onRunFailed=e.onRunFailed,this.defaultTimezone=e.defaultTimezone??"UTC",this.getLastScheduledAt=e.getLastScheduledAt;try{new Intl.DateTimeFormat("en",{timeZone:this.defaultTimezone}).format(0)}catch{throw new Error(`WorkflowScheduler defaultTimezone is invalid: ${JSON.stringify(this.defaultTimezone)}`)}if(this.minTriggerIntervalMs=e.minTriggerIntervalMs??0,this.onTriggerDropped=e.onTriggerDropped,this.minTriggerIntervalMs>0&&!this.onTriggerDropped)throw new Error("WorkflowScheduler: minTriggerIntervalMs > 0 requires onTriggerDropped (drops must never be silent, \xA71.5)")}async start(){if(this.started)throw new Error("WorkflowScheduler already started");this.started=!0;let e=await this.controller.listActive();for(let t of e){let r;if(t.trigger?.type==="schedule"&&this.getLastScheduledAt&&(r=await this.getLastScheduledAt(t.id),r===void 0)){let o=Date.parse(t.createdAt);Number.isFinite(o)&&(r=o)}this.registerTrigger(t.id,t.trigger??{type:"manual"},r)}}stop(){for(let e of this.cronArms.values())this.clock.clearTimer(e.handle);this.cronArms.clear(),this.triggers.clear(),this.started=!1}async refresh(e){let t;try{t=await this.controller.get(e)}catch{this.unregister(e);return}if(!t.active){this.unregister(e);return}this.registerTrigger(e,t.trigger??{type:"manual"})}unregister(e){let t=this.cronArms.get(e);t&&(this.clock.clearTimer(t.handle),this.cronArms.delete(e)),this.triggers.delete(e)}registeredIds(){return[...this.triggers.keys()]}nextFireAt(e){return this.cronArms.get(e)?.fireAt}async onWebhook(e,t){let r=this.matchingIds(o=>o.type==="webhook"&&o.path===e).filter(o=>this.passesRateLimit(o,"webhook"));return Promise.all(r.map(o=>this.runWithLifecycle(o,{type:"webhook",payload:t})))}async onImMessage(e,t,r){let o=this.matchingIds(s=>s.type==="im-message"&&s.channel===e&&Io(s.match,t)).filter(s=>this.passesRateLimit(s,"im-message")),i={...r,channel:e,text:t};return Promise.all(o.map(s=>this.runWithLifecycle(s,{type:"im-message",payload:i})))}async triggerManual(e,t){return this.runWithLifecycle(e,{type:"manual",payload:t})}matchingIds(e){let t=[];for(let[r,o]of this.triggers)e(o)&&t.push(r);return t}registerTrigger(e,t,r){if(this.unregister(e),this.triggers.set(e,t),t.type==="schedule"){let o=t.timezone??this.defaultTimezone,i=t.misfirePolicy??"run-once",s=this.clock.now(),a=r===void 0?void 0:ge(t.cron,r,o),u=a!==void 0&&a<=s?a:ge(t.cron,s,o);this.armCron(e,t.cron,o,i,u)}}armCron(e,t,r,o,i){let s=Math.max(0,i-this.clock.now()),a={cron:t,timezone:r,misfirePolicy:o,fireAt:i,handle:void 0};s>dn?a.handle=this.clock.setTimer(()=>{this.cronArms.get(e)===a&&this.armCron(e,t,r,o,i)},dn):a.handle=this.clock.setTimer(()=>this.fireCron(e,a),s),this.cronArms.set(e,a)}fireCron(e,t){if(this.cronArms.get(e)!==t)return;let r=this.clock.now(),o=r>t.fireAt,i;try{i=ge(t.cron,o?r:t.fireAt,t.timezone)}catch(s){this.cronArms.delete(e),this.onError(s,e);return}if(this.armCron(e,t.cron,t.timezone,t.misfirePolicy,i),o&&t.misfirePolicy==="skip"){this.onTriggerDropped?.(e,"schedule",{sinceLastMs:r-t.fireAt,minIntervalMs:this.minTriggerIntervalMs,reason:"misfire",scheduledAt:t.fireAt});return}this.passesRateLimit(e,"schedule")&&this.runWithLifecycle(e,{type:"schedule"}).catch(s=>this.onError(s,e))}passesRateLimit(e,t){if(this.minTriggerIntervalMs<=0)return!0;let r=this.clock.now(),o=this.lastFireAt.get(e);return o!==void 0&&r-o<this.minTriggerIntervalMs?(this.onTriggerDropped?.(e,t,{sinceLastMs:r-o,minIntervalMs:this.minTriggerIntervalMs}),!1):(this.lastFireAt.set(e,r),!0)}async runWithLifecycle(e,t){let r;try{r=await this.controller.run(e,t,{onStarted:({runId:o})=>this.onRunStarted?.(e,t.type,o)})}catch(o){try{this.onRunFailed?.(e,t.type,o)}catch(i){this.reportLifecycleCallbackError(e,"failure",i)}throw o}try{this.onRunCompleted?.(r,t.type)}catch(o){this.reportLifecycleCallbackError(e,"completion",o)}return r}reportLifecycleCallbackError(e,t,r){let o=r instanceof Error?r.message:String(r);try{this.onError(new Error(`Workflow ${e} ${t} notification failed: ${o}`),e)}catch{}}};function Io(n,e){return n===void 0?!0:new RegExp(n).test(e)}import{join as un}from"node:path";import{mkdir as Ao,rm as No}from"node:fs/promises";function To(n,e,t){return un(oe().getProjectAgentDir(n),"workflows",e,"runs",t)}var Ge=class{constructor(e,t,r){this.workflowId=t;this.runId=r;if(!e)throw new Error("FileRunCheckpoint requires a project cwd");if(!t)throw new Error("FileRunCheckpoint requires a workflowId");if(!r)throw new Error("FileRunCheckpoint requires a runId");this.dir=To(e,t,r),this.file=un(this.dir,"cache.json")}workflowId;runId;dir;file;async load(){return W(this.file)}async persist(e){await Ao(this.dir,{recursive:!0});let t={workflowId:this.workflowId,runId:this.runId,entries:e,updatedAt:new Date().toISOString()};await M(this.file,t)}async clear(){await No(this.dir,{recursive:!0,force:!0})}};import*as V from"node:fs";import*as me from"node:path";var ze=class{file;constructor(e){this.file=me.join(e,"audit.jsonl")}append(e){try{V.mkdirSync(me.dirname(this.file),{recursive:!0}),V.appendFileSync(this.file,`${JSON.stringify(e)}
6
+ ${g}`}function _r(n){if(!n)return"none";switch(n.type){case"manual":return"manual";case"schedule":return`schedule ${JSON.stringify(n.cron)}`;case"im-message":return n.match?`im-message ${n.channel} match=${JSON.stringify(n.match)}`:`im-message ${n.channel}`;case"webhook":return`webhook ${n.path}`;case"intent":return`intent ${n.phrases.map(e=>JSON.stringify(e)).join(" / ")}${n.semantic?" +semantic":""}`;case"form":return`form [${n.fields.map(e=>e.key).join(", ")}]`}}function qr(n,e){let t=n.name?` "${n.name}"`:"",r=Hr(n.params,e),o=(n.outPorts??Fr(n.kind)).join(","),i=[`${n.id} [${n.kind}]${t}`];return r&&i.push(r),i.push(`out: ${o}`),i.join(" ")}function Hr(n,e){if(!n)return"";let t=Object.keys(n).sort();return t.length===0?"":t.map(r=>`${r}=${Ur(n[r],e)}`).join(" ")}function Ur(n,e){let t;return typeof n=="string"?t=n.includes("{{")?n:JSON.stringify(n):t=JSON.stringify(n),t.length>e&&(t=t.slice(0,e-1)+"\u2026"),t}function Br(n){return n.length===0?"edges: (none)":`edges:
7
+ ${n.map(t=>{let r=t.fromPort??"default",o=t.toPort??"default",i=t.loopBack?" (loopBack)":"";return`${t.from}.${r}\u2192${t.to}.${o}${i}`}).join(" ; ")}`}function Fr(n){return n==="if"?["true","false"]:n==="loop"?["loop","done"]:["default"]}function Lr(n){let e=[],t=n;return t=t.replace(/\$node\[\s*(['"])([^'"\]]+)\1\s*\]\.json/g,'$node("$2").output.default[0].json'),t=t.replace(/\$\(\s*(['"])([^'")]+)\1\s*\)(?:\.item|\.first\(\))?\.json/g,'$node("$2").output.default[0].json'),t=t.replace(/\$items\(\s*(['"])([^'")]+)\1\s*\)\[(\d+)\]\.json/g,'$node("$2").output.default[$3].json'),t=t.replace(/\$input(?:\.item|\.first\(\))\.json/g,"$json"),/\$now\b/.test(t)&&e.push("$now:n8n \u4E3A Luxon DateTime,\u6B64\u5904\u4E3A Date(\u683C\u5F0F\u5316\u51FD\u6570\u7528 date(...))"),{body:t,notes:e}}function Kr(n){if(!n.startsWith("="))return null;let e=n.slice(1);if(!e.includes("{{"))return{ok:!0,converted:e,notes:[]};let t=[],r=null,o=e.replace(/\{\{([\s\S]*?)\}\}/g,(i,s)=>{if(r)return i;let{body:a,notes:u}=Lr(s.trim()),c=de(a);return c?(r=`\u8868\u8FBE\u5F0F\u300C{{ ${s.trim()} }}\u300D\u8D85\u51FA\u53D7\u9650\u8BED\u8A00(${c})`,i):(t.push(...u),`{{ ${a} }}`)});return r?{ok:!1,reason:r}:{ok:!0,converted:o,notes:t}}function _t(n,e,t=""){let r=(o,i)=>{if(typeof o=="string"){let s=Kr(o);return s===null?o:s.ok?(e.converted++,e.notes.push(...s.notes),s.converted):(e.manual.push({path:i,raw:o,reason:s.reason}),o)}return Array.isArray(o)?o.map((s,a)=>r(s,`${i}[${a}]`)):o&&typeof o=="object"?Object.fromEntries(Object.entries(o).map(([s,a])=>[s,r(a,i?`${i}.${s}`:s)])):o};return r(n,t)}var qt={"@n8n/n8n-nodes-langchain.agent":"agentBinding","@n8n/n8n-nodes-langchain.chainLlm":"agentBinding","@n8n/n8n-nodes-langchain.chainRetrievalQa":"agentBinding","@n8n/n8n-nodes-langchain.chainSummarization":"agentBinding","@n8n/n8n-nodes-langchain.chatTrigger":"trigger","@n8n/n8n-nodes-langchain.documentDefaultDataLoader":"documentLoader","@n8n/n8n-nodes-langchain.embeddingsOpenAi":"modelBinding","@n8n/n8n-nodes-langchain.informationExtractor":"agentBinding","@n8n/n8n-nodes-langchain.lmChatGoogleGemini":"modelBinding","@n8n/n8n-nodes-langchain.lmChatOpenAi":"modelBinding","@n8n/n8n-nodes-langchain.lmChatOpenRouter":"modelBinding","@n8n/n8n-nodes-langchain.lmOpenAi":"modelBinding","@n8n/n8n-nodes-langchain.memoryBufferWindow":"memory","@n8n/n8n-nodes-langchain.openAi":"modelBinding","@n8n/n8n-nodes-langchain.outputParserStructured":"parser","@n8n/n8n-nodes-langchain.retrieverVectorStore":"retriever","@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter":"textSplitter","@n8n/n8n-nodes-langchain.textSplitterTokenSplitter":"textSplitter","@n8n/n8n-nodes-langchain.toolCode":"script","@n8n/n8n-nodes-langchain.toolSerpApi":"toolBinding","@n8n/n8n-nodes-langchain.toolVectorStore":"toolBinding","@n8n/n8n-nodes-langchain.toolWorkflow":"subworkflow","@n8n/n8n-nodes-langchain.vectorStoreInMemory":"vectorStore","@n8n/n8n-nodes-langchain.vectorStoreQdrant":"vectorStore","n8n-nodes-base.aggregate":"aggregate","n8n-nodes-base.code":"script","n8n-nodes-base.convertToFile":"file","n8n-nodes-base.discord":"channel","n8n-nodes-base.executeWorkflow":"subworkflow","n8n-nodes-base.executeWorkflowTrigger":"trigger","n8n-nodes-base.extractFromFile":"file","n8n-nodes-base.facebookGraphApi":"channel","n8n-nodes-base.filter":"filter","n8n-nodes-base.form":"form","n8n-nodes-base.formTrigger":"trigger","n8n-nodes-base.gmail":"integration","n8n-nodes-base.gmailTool":"toolBinding","n8n-nodes-base.gmailTrigger":"trigger","n8n-nodes-base.googleDocs":"integration","n8n-nodes-base.googleDocsTool":"toolBinding","n8n-nodes-base.googleDrive":"integration","n8n-nodes-base.googleSheets":"integration","n8n-nodes-base.googleSheetsTrigger":"trigger","n8n-nodes-base.html":"transform","n8n-nodes-base.htmlExtract":"extract","n8n-nodes-base.httpRequest":"http","n8n-nodes-base.if":"if","n8n-nodes-base.limit":"limit","n8n-nodes-base.linkedIn":"channel","n8n-nodes-base.localFileTrigger":"trigger","n8n-nodes-base.manualTrigger":"trigger","n8n-nodes-base.merge":"merge","n8n-nodes-base.noOp":"passthrough","n8n-nodes-base.openAi":"modelBinding","n8n-nodes-base.postgres":"integration","n8n-nodes-base.postgresTool":"toolBinding","n8n-nodes-base.readBinaryFile":"file","n8n-nodes-base.readWriteFile":"file","n8n-nodes-base.respondToWebhook":"respond","n8n-nodes-base.s3":"integration","n8n-nodes-base.scheduleTrigger":"trigger","n8n-nodes-base.set":"set","n8n-nodes-base.splitInBatches":"split","n8n-nodes-base.splitOut":"split","n8n-nodes-base.spreadsheetFile":"file","n8n-nodes-base.supabaseTool":"toolBinding","n8n-nodes-base.switch":"switch","n8n-nodes-base.telegram":"channel","n8n-nodes-base.telegramTrigger":"trigger","n8n-nodes-base.twitter":"channel","n8n-nodes-base.wait":"wait","n8n-nodes-base.whatsApp":"channel","n8n-nodes-base.whatsAppTrigger":"trigger","n8n-nodes-base.writeBinaryFile":"file","n8n-nodes-base.writeFile":"file","n8n-nodes-base.youTube":"integration"},Jr=new Set(["openAiApi","googlePalmApi","openRouterApi","mistralCloudApi","anthropicApi"]),Vr=new Set(["agentBinding"]);function Ht(n){return Jr.has(n)}function Ut(n){return Vr.has(n)}function Bt(n){return"workflow"}function Ft(n,e){let t=`${n} ${e}`.toLowerCase();return t.includes("gmail")?"gmail":t.includes("slack")?"slack":t.includes("googlesheets")?"google-sheets":t.includes("googledrive")?"google-drive":t.includes("googledocs")?"google-docs":t.includes("telegram")?"telegram":t.includes("whatsapp")?"whatsapp":t.includes("youtube")?"youtube":t.includes("postgres")?"postgres":t.includes("supabase")?"supabase":t.includes("qdrant")?"qdrant":t.includes("s3")?"s3":t.includes("twitter")||t.includes("xapi")?"x":t.includes("facebook")?"facebook":t.includes("linkedin")?"linkedin":t.includes("discord")?"discord":t.includes("serp")?"serpapi":t.includes("firecrawl")?"firecrawl":t.includes("elevenlabs")?"elevenlabs":"custom"}var Lt={"n8n-nodes-base.set":"set","n8n-nodes-base.if":"if","n8n-nodes-base.merge":"merge","n8n-nodes-base.noOp":"passthrough","n8n-nodes-base.httpRequest":"http","n8n-nodes-base.manualTrigger":"trigger","n8n-nodes-base.scheduleTrigger":"trigger","n8n-nodes-base.cron":"trigger","n8n-nodes-base.webhook":"trigger","n8n-nodes-base.formTrigger":"trigger","n8n-nodes-base.switch":"switch","n8n-nodes-base.filter":"filter","n8n-nodes-base.wait":"wait","n8n-nodes-base.aggregate":"aggregate","n8n-nodes-base.executeWorkflow":"subworkflow"},Gr=new Set(["n8n-nodes-base.stickyNote"]),zr=new Set(["n8n-nodes-base.code","n8n-nodes-base.function","n8n-nodes-base.functionItem","@n8n/n8n-nodes-langchain.toolCode"]);function Kt(n){let e=new Map;for(let r of n.bindings.connections){let o=`${r.nodeId}\0${r.n8nCredentialType}`;e.has(o)||e.set(o,r)}if(e.size===0)return;let t=[...e.values()];return{version:1,title:"\u5BFC\u5165\u5DE5\u4F5C\u6D41\u5FEB\u901F\u8BBE\u7F6E",description:"\u4E3A\u9700\u8981\u8BBF\u95EE\u5916\u90E8\u670D\u52A1\u7684\u6B65\u9AA4\u9009\u62E9\u672C\u673A\u8FDE\u63A5\uFF1B\u51ED\u636E\u7531 Host \u52A0\u5BC6\u4FDD\u5B58\uFF0C\u4E0D\u5199\u5165\u5DE5\u4F5C\u6D41\u3002",fields:t.map((r,o)=>({id:`connection_${o+1}`,label:r.label?`${r.nodeId}\uFF08\u539F\u8FDE\u63A5\uFF1A${r.label}\uFF09`:`${r.nodeId} \u8FDE\u63A5`,group:"\u5916\u90E8\u670D\u52A1\u8FDE\u63A5",type:"connection",required:!0,connectionType:r.connectionType})),bindings:t.map((r,o)=>({fieldId:`connection_${o+1}`,target:{kind:"node",nodeId:r.nodeId,path:`_n8nConnections.${r.n8nCredentialType}`}}))}}var q=class extends Error{constructor(t){super(`n8n import rejected: ${t.join("; ")}`);this.errors=t;this.name="N8nImportError"}errors};function Jt(n,e,t={}){let r=Xr(n),o=t.strictTemplates===!0,i=[],s={status:"full",nodes:[],expressions:{converted:0,manual:[]},credentials:[],bindings:{models:[],agents:[],connections:[]},notes:[]},a=new Set,u=new Set,c=[];for(let[p,d]of r.nodes.entries()){if(typeof d?.name!="string"||d.name===""){i.push(`nodes[${p}] has a missing/empty name`);continue}if(a.has(d.name)){i.push(`duplicate node name "${d.name}"`);continue}if(a.add(d.name),typeof d.type!="string"||d.type===""){i.push(`node "${d.name}" has a missing/empty type`);continue}if(Gr.has(d.type)){u.add(d.name),s.nodes.push({id:d.name,n8nType:d.type,outcome:"skipped",notes:["annotation node skipped"]});continue}let f={id:d.name,n8nType:d.type,outcome:"converted",notes:[]};s.nodes.push(f);let l=Yr(d.type,o);zr.has(d.type)&&!o?(l="manual",f.outcome="manual",f.notes.push("Code node contains imported script; default import keeps it as a fail-loud manual placeholder.")):l||(o?(l="n8nNode",f.outcome="unsupported",f.notes.push(`unsupported n8n node type "${d.type}" preserved as raw n8nNode`)):(l="manual",f.outcome="manual",f.notes.push(`unmapped n8n node type "${d.type}", please replace it manually`)));let m={converted:0,manual:[],notes:[]},h=_t({...d.parameters??{}},m);s.expressions.converted+=m.converted;for(let w of m.manual)s.expressions.manual.push({nodeId:d.name,...w}),f.notes.push(`parameter ${w.path}: ${w.reason}`),f.outcome==="converted"&&(f.outcome="partial");for(let w of m.notes)s.notes.includes(w)||s.notes.push(w);Qr(d,l,s,o),o&&Ut(l)&&(s.bindings.agents.push({nodeId:d.name,fallback:!0,label:d.name}),f.outcome=f.outcome==="converted"?"partial":f.outcome,f.notes.push("agent capability will be resolved from the configured Agent panel, not from n8n credentials"));let v={id:d.name,kind:l,name:d.name,params:{...h,_n8nType:d.type}};o&&(v.params={...v.params,_importMode:"n8n-strict-template",_bindingKind:l}),Array.isArray(d.position)&&Number.isFinite(d.position[0])&&Number.isFinite(d.position[1])&&(v.ui={x:d.position[0],y:d.position[1]}),Zr(v,l,f,o),c.push(v)}let g=r.connections?eo(r.connections,a,u,c,i,o):[];if(o&&ro(g,c),no(c),c.length===0&&i.length===0&&i.push("workflow has no nodes"),i.length>0)throw new q(i);return s.status=s.nodes.some(p=>p.outcome==="manual"||p.outcome==="unsupported")?"manual":s.nodes.some(p=>p.outcome==="partial")||s.expressions.manual.length>0?"partial":"full",{name:typeof r.name=="string"&&r.name!==""?r.name:e,def:{id:e,nodes:c,edges:g},report:s}}function Yr(n,e){return e?qt[n]??Lt[n]??"n8nNode":Lt[n]}function Zr(n,e,t,r){let o=n.params;if(e==="if"){n.outPorts=["true","false"];return}if(e==="wait"){let i=typeof o.amount=="number"?o.amount:Number(o.amount),s=typeof o.unit=="string"?o.unit:"seconds",a=s==="hours"?36e5:s==="minutes"?6e4:1e3;Number.isFinite(i)&&i>0?o.ms=Math.min(36e5,Math.round(i*a)):r||(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push("wait duration could not be parsed"));return}if(e==="subworkflow"){let i=typeof o.workflowId=="object"&&o.workflowId!==null?o.workflowId.value:o.workflowId;typeof i=="string"&&i?(o.workflowId=i,t.outcome=t.outcome==="converted"?"partial":t.outcome,t.notes.push("subworkflow target keeps the n8n workflow id and must be rebound to a local workflow")):r||(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push("subworkflow target is missing"));return}(e==="switch"||e==="filter")&&!r&&(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push(`${e} conditions preserve n8n params and may need review`))}function Qr(n,e,t,r){if(!(!n.credentials||typeof n.credentials!="object")){for(let[o,i]of Object.entries(n.credentials)){if(r&&Ht(o)){t.bindings.models.push({nodeId:n.name,n8nCredentialType:o,modelPurpose:Bt(o),label:i?.name});continue}let s=Ft(n.type,o);r&&t.bindings.connections.push({nodeId:n.name,n8nCredentialType:o,connectionType:s,label:i?.name}),t.credentials.push({nodeId:n.name,n8nCredentialType:o,label:i?.name})}r&&e==="modelBinding"&&t.bindings.models.push({nodeId:n.name,n8nCredentialType:"model-registry",modelPurpose:"workflow"})}}function Xr(n){let e;if(typeof n=="string")try{e=JSON.parse(n)}catch(r){throw new q([`invalid JSON: ${r.message}`])}else e=n;if(!e||typeof e!="object")throw new q(["workflow must be a JSON object"]);let t=e;if(!Array.isArray(t.nodes))throw new q(["workflow.nodes must be an array"]);if(t.connections!==void 0&&(typeof t.connections!="object"||t.connections===null))throw new q(["workflow.connections must be an object"]);return{name:t.name,nodes:t.nodes,connections:t.connections??{}}}function eo(n,e,t,r,o,i){let s=new Map(r.map(u=>[u.id,u.kind])),a=[];for(let u of Object.keys(n).sort()){if(t.has(u))continue;if(!e.has(u)){o.push(`connection source "${u}" is not a declared node`);continue}let c=n[u]??{};for(let g of Object.keys(c).sort()){let p=c[g];if(Array.isArray(p))for(let d=0;d<p.length;d++){let f=to(u,s.get(u),g,d,r,o,i),l=p[d];if(Array.isArray(l))for(let m of l){if(!m||typeof m.node!="string"){o.push(`connection from "${u}" has a malformed target`);continue}if(t.has(m.node))continue;if(!e.has(m.node)){o.push(`connection from "${u}" targets missing node "${m.node}"`);continue}let h={from:u,to:m.node};f!=="default"&&(h.fromPort=f),i&&typeof m.type=="string"&&m.type&&m.type!=="main"&&(h.toPort=m.type),a.push(h)}}}}return a}function to(n,e,t,r,o,i,s){return t!=="main"?_(o,n,r===0?t:`${t}_${r}`):e==="if"?r===0?"true":r===1?"false":(s||i.push(`if node "${n}" has an unsupported output index ${r}`),_(o,n,`out_${r}`)):e==="switch"?_(o,n,`case_${r}`):e==="filter"?r===0?_(o,n,"default"):(s||i.push(`filter node "${n}" has an unsupported discarded output`),_(o,n,r===1?"discarded":`out_${r}`)):r===0?_(o,n,"default"):(s||i.push(`node "${n}" has an unmodeled multi-output index ${r} (only single-output supported)`),_(o,n,`out_${r}`))}function _(n,e,t){let r=n.find(o=>o.id===e);return r&&(r.outPorts=r.outPorts??[],r.outPorts.includes(t)||r.outPorts.push(t)),t}function no(n){for(let e of n)e.outPorts&&e.outPorts.length>0&&(e.params={...e.params??{},_n8nOutPorts:e.outPorts})}function ro(n,e){let t=[];for(let r of n)if(oo(t,r.to,r.from)){r.loopBack=!0;let o=e.find(i=>i.id===r.to);o&&(!o.maxIterations||o.maxIterations<=0)&&(o.maxIterations=100)}else t.push(r)}function oo(n,e,t){let r=[e],o=new Set;for(;r.length>0;){let i=r.pop();if(i===t)return!0;if(!o.has(i)){o.add(i);for(let s of n)s.from===i&&r.push(s.to)}}return!1}var io=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,so=/^[A-Za-z_$][A-Za-z0-9_$-]*$/,ao=new Set(["__proto__","prototype","constructor"]),We=/token|secret|authorization|api[-_]?key|apikey|password|credential|cookie|passphrase|private[-_]?key/i,uo=/^(agentId|mcpPlugins|server|tool|toolName|target|kind)$/i;function A(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function X(n,e,t=500){if(typeof n!="string"||!n.trim()||n.length>t)throw new Error(`workflow setup: ${e} must be a non-empty string up to ${t} characters`)}function Me(n,e){if(n.type==="boolean"){if(typeof e!="boolean")throw new Error(`workflow setup: "${n.id}" must be a boolean`);return}if(n.type==="number"){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`workflow setup: "${n.id}" must be a finite number`);return}if(typeof e!="string")throw new Error(`workflow setup: "${n.id}" must be a string`);if(e.length>1e4)throw new Error(`workflow setup: "${n.id}" is too long`);if(n.type==="url"&&e&&!/^https?:\/\//i.test(e))throw new Error(`workflow setup: "${n.id}" must be an http(s) URL`);if(n.type==="select"&&e&&!n.options?.some(t=>t.value===e))throw new Error(`workflow setup: "${n.id}" is not one of the declared options`)}function _e(n){X(n,"binding path",256);let e=n.split(".");if(e.some(t=>!so.test(t)||ao.has(t)))throw new Error(`workflow setup: unsafe binding path "${n}"`);return e}function Oe(n,e,t){let r=_e(e),o=n;for(let i of r.slice(0,-1)){let s=o[i];if(s!==void 0&&!A(s))throw new Error(`workflow setup: binding path "${e}" crosses a non-object value`);A(s)||(o[i]={}),o=o[i]}o[r.at(-1)]=t}function co(n,e){let t=_e(e),r=[],o=n;for(let i of t.slice(0,-1)){let s=o[i];if(!A(s))return;r.push({parent:o,key:i}),o=s}delete o[t.at(-1)];for(let{parent:i,key:s}of r.reverse()){let a=i[s];if(!A(a)||Object.keys(a).length>0)break;delete i[s]}}function H(n,e){if(!A(n)||n.version!==1||!Array.isArray(n.fields)||!Array.isArray(n.bindings))throw new Error("workflow setup: version 1 fields and bindings are required");if(n.fields.length>100||n.bindings.length>500)throw new Error("workflow setup: manifest exceeds the supported size");let t=new Set(e.nodes.map(s=>s.id)),r=n.fields.map(s=>{if(!A(s))throw new Error("workflow setup: every field must be an object");if(X(s.id,"field id",128),!io.test(s.id))throw new Error(`workflow setup: invalid field id "${s.id}"`);X(s.label,`field "${s.id}" label`,200);let a=s.type;if(!["text","textarea","url","number","boolean","select","connection"].includes(String(a)))throw new Error(`workflow setup: unsupported field type "${String(a)}"`);let u=structuredClone(s);if(u.type!=="connection"&&(We.test(u.id)||We.test(u.label)))throw new Error(`workflow setup: secret input "${u.id}" must use a Host-owned connection`);if(u.type==="select"){if(!Array.isArray(u.options)||u.options.length===0)throw new Error(`workflow setup: select field "${u.id}" requires options`);for(let c of u.options)X(c?.label,`field "${u.id}" option label`,200),X(c?.value,`field "${u.id}" option value`,500)}return u.defaultValue!==void 0&&Me(u,u.defaultValue),u}),o=new Set;for(let s of r){if(o.has(s.id))throw new Error(`workflow setup: duplicate field id "${s.id}"`);o.add(s.id)}let i=n.bindings.map(s=>{if(!A(s)||typeof s.fieldId!="string"||!o.has(s.fieldId))throw new Error("workflow setup: every binding must reference a declared field");let a=s.target;if(!A(a)||a.kind!=="node"&&a.kind!=="trigger")throw new Error(`workflow setup: field "${s.fieldId}" has an invalid target`);let u=String(a.path??""),c=_e(u);if(We.test(String(a.path??"")))throw new Error(`workflow setup: binding "${String(a.path)}" must reference an opaque connection, not a credential or secret field`);if(c.some(g=>uo.test(g)))throw new Error(`workflow setup: binding "${u}" cannot change workflow capability identity`);if(a.kind==="node"&&(typeof a.nodeId!="string"||!t.has(a.nodeId)))throw new Error(`workflow setup: field "${s.fieldId}" targets a missing node`);return structuredClone(s)});for(let s of r)if(!i.some(a=>a.fieldId===s.id))throw new Error(`workflow setup: field "${s.id}" has no binding`);return{version:1,...typeof n.title=="string"&&n.title.trim()?{title:n.title}:{},...typeof n.description=="string"&&n.description.trim()?{description:n.description}:{},fields:r,bindings:i}}function Vt(n,e){let t={};for(let o of n.fields){let i=e?.values[o.id]??o.defaultValue;i!==void 0&&(t[o.id]=i)}let r=n.fields.filter(o=>o.required&&(t[o.id]===void 0||t[o.id]==="")).map(o=>o.id);return{manifest:n,values:t,status:r.length===0?"complete":"pending",missingRequired:r}}function qe(n,e,t,r,o,i=new Date().toISOString()){let s=new Map(t.fields.map(d=>[d.id,d]));for(let d of Object.keys(o))if(!s.has(d))throw new Error(`workflow setup: unknown field "${d}"`);let a={};for(let d of t.fields){let f=r?.values[d.id];if(f!==void 0)try{Me(d,f),a[d.id]=f}catch{}}for(let d of t.fields){let f=o[d.id]??a[d.id]??d.defaultValue;f!==void 0&&(Me(d,f),a[d.id]=f)}let u=Vt(t,{values:a}),c=structuredClone(n),g=e==null?e:structuredClone(e),p=new Map(c.nodes.map(d=>[d.id,d]));for(let d of t.bindings){let f=a[d.fieldId];if(f!==void 0)if(d.target.kind==="node"){let l=p.get(d.target.nodeId);if(!l)throw new Error(`workflow setup: binding node "${d.target.nodeId}" no longer exists`);l.params=A(l.params)?structuredClone(l.params):{},Oe(l.params,d.target.path,f)}else{if(!g)throw new Error("workflow setup: trigger binding requires a workflow trigger");Oe(g,d.target.path,f)}}return{def:c,trigger:g,state:{values:a,updatedAt:i,...u.missingRequired.length===0?{completedAt:i}:{}},missingRequired:u.missingRequired}}function Gt(n,e,t){let r=structuredClone(n),o=e==null?e:structuredClone(e),i=new Map(r.nodes.map(a=>[a.id,a])),s=new Map(t.fields.map(a=>[a.id,a]));for(let a of t.bindings){let u=s.get(a.fieldId);if(!u)continue;let c=a.target.kind==="node"?i.get(a.target.nodeId)?.params:o;A(c)&&(u.defaultValue===void 0?co(c,a.target.path):Oe(c,a.target.path,u.defaultValue))}return{def:r,trigger:o}}import{join as Zt}from"node:path";import{mkdir as lo}from"node:fs/promises";function ee(n,...e){let t=n.toLowerCase();return e.some(r=>t.includes(r.toLowerCase()))}function pe(n,e){let t=(n??"").trim(),r=t.length>300?`${t.slice(0,300)}\u2026`:t||void 0;return ee(t,"stream closed before a terminal event","likely truncated upstream","RETRYABLE_TRANSIENT")?{class:"network",message:"\u6A21\u578B\u54CD\u5E94\u6D41\u63D0\u524D\u4E2D\u65AD\uFF0C\u672A\u6536\u5230\u5B8C\u6574\u7684\u7ED3\u675F\u4FE1\u53F7\u3002",hint:"\u672C\u6B21\u4E0D\u5B8C\u6574\u7ED3\u679C\u5DF2\u4E22\u5F03\uFF1B\u901A\u5E38\u662F\u6A21\u578B\u670D\u52A1\u6216\u7F51\u7EDC\u4E34\u65F6\u6296\u52A8\uFF0C\u76F4\u63A5\u91CD\u8DD1\u5373\u53EF\u3002",actions:["rerun_node","rerun_all"],detail:r}:ee(t,"credential","\u51ED\u8BC1","unauthorized","forbidden","401","403","auth")?{class:"user",message:"\u9274\u6743\u6CA1\u901A\u8FC7 \u2014\u2014 \u51ED\u8BC1\u7F3A\u5931\u6216\u5DF2\u5931\u6548\u3002",hint:"\u68C0\u67E5\u5BF9\u5E94\u8282\u70B9\u6216 MCP \u63D2\u4EF6\u7684\u8FDE\u63A5\u914D\u7F6E\u540E\u91CD\u8DD1\u3002",actions:["ai_fix","rerun_node"],detail:r}:ee(t,"\u4E0D\u5B58\u5728\u7684","\u5F15\u7528\u4E86\u4E0D\u5B58\u5728","no nodeexecutor","\u76EE\u5F55\u5916","not registered","unknown kind","\u672A\u80FD\u81EA\u52A8\u8F6C\u6362","\u4EBA\u5DE5\u8FC1\u79FB")?{class:"capability",message:"\u8FD9\u4E00\u6B65\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u80FD\u529B / \u5DE5\u5177\u3002",hint:"\u6362\u4E00\u4E2A\u771F\u5B9E\u5B58\u5728\u7684\u5DE5\u5177,\u6216\u8BA9 AI \u6539\u8FD9\u4E00\u6B65\u3002",actions:["ai_fix","swap_capability","rerun_node"],detail:r}:ee(t,"econnrefused","enotfound","etimedout","fetch failed","network","timeout","timed out","socket","getaddrinfo","invalid url","request failed","5xx","502","503","504")?{class:"network",message:"\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25 \u2014\u2014 \u5730\u5740\u4E0D\u901A\u3001\u8D85\u65F6\u6216\u5BF9\u65B9\u62A5\u9519\u3002",hint:"\u786E\u8BA4\u5730\u5740/\u7F51\u7EDC\u540E\u91CD\u8DD1;\u5730\u5740\u4E0D\u5BF9\u5C31\u8BA9 AI \u6539\u3002",actions:["rerun_node","ai_fix"],detail:r}:ee(t,"requires string param","requires param","requires object param","requires non-empty","\u7F3A\u5C11\u5FC5\u586B","required","must be","\u5FC5\u586B","in 1..","must have at least")?{class:"user",message:"\u8FD9\u4E00\u6B65\u7F3A\u5C11\u5FC5\u8981\u4FE1\u606F(\u5FC5\u586B\u53C2\u6570\u6CA1\u586B\u5168\u6216\u683C\u5F0F\u4E0D\u5BF9)\u3002",hint:"\u8BA9 AI \u8865\u5168,\u6216\u5728\u300C\u9AD8\u7EA7\u300D\u91CC\u624B\u52A8\u586B\u3002",actions:["ai_fix","rerun_node"],detail:r}:{class:"system",message:"\u8FD9\u4E00\u6B65\u6267\u884C\u51FA\u9519\u4E86\u3002",hint:"\u53EF\u4EE5\u91CD\u8DD1;\u82E5\u53CD\u590D\u5931\u8D25,\u8BA9 AI \u770B\u770B\u8FD9\u4E00\u6B65\u3002",actions:["rerun_node","ai_fix","rerun_all"],detail:r}}var fo=20,zt=2e3;function Yt(n,e){return Zt($(n),e,"runs","history.json")}function Ue(n){let e={};for(let[t,r]of Object.entries(n.outputs)){let o={};for(let[a,u]of Object.entries(r))o[a]=u.map(c=>c.json);let i=JSON.stringify(o);i.length>zt&&(i=`${i.slice(0,zt)}\u2026(truncated)`);let s=n.nodeStats?.[t];e[t]={executed:n.executed.has(t),preview:i,...s?{seq:s.seq,startedAt:s.startedAt,durationMs:s.durationMs,attempts:s.attempts,cacheHit:s.cacheHit,nodeStatus:s.status,...s.warning!==void 0?{warning:s.warning}:{}}:{}}}return e}var He=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowRunHistoryStore requires a project cwd")}cwd;mutationChains=new Map;async begin(e,t){await this.mutate(e,r=>{let{triggerPayload:o,...i}=t;r.unshift({...i,status:"running",...o?{recovery:{triggerPayload:structuredClone(o)}}:{}}),r.splice(fo)})}async finish(e,t,r){await this.mutate(e,o=>{let i=o.find(a=>a.runId===t);if(!i)return;let s=i.nodes??{};Object.assign(i,r),r.nodes&&(i.nodes=Object.fromEntries(Object.entries(r.nodes).map(([a,u])=>[a,{...s[a]??{},...u,activities:s[a]?.activities}]))),i.status!=="running"&&delete i.recovery,i.errorInfo=i.status==="failed"&&i.error?pe(i.error):void 0})}async recordNodeStatus(e,t,r,o,i){let s=new Date().toISOString();await this.mutate(e,a=>{let u=a.find(m=>m.runId===t);if(!u)return;u.nodes??={};let c=u.nodes[r],g=c?.startedAt??s,p=c?.activities??[],d=o==="running"?"started":o,f=o==="running"?"\u8282\u70B9\u5F00\u59CB\u6267\u884C":o==="completed"?"\u8282\u70B9\u6267\u884C\u5B8C\u6210":"\u8282\u70B9\u6267\u884C\u5931\u8D25",l=i?pe(i).message:void 0;p.at(-1)?.phase!==d&&p.push({ts:s,phase:d,label:f,...l?{detail:l}:{}}),u.nodes[r]={...c??{},executed:o!=="running",preview:c?.preview??"",startedAt:g,nodeStatus:o,activities:p.slice(-50),...o!=="running"?{durationMs:Math.max(0,Date.parse(s)-Date.parse(g))}:{},...i?{error:i}:{}}})}async recordNodeActivity(e,t,r,o){await this.mutate(e,i=>{let s=i.find(p=>p.runId===t);if(!s)return;s.nodes??={};let a=s.nodes[r]??{executed:!1,preview:"",startedAt:new Date().toISOString(),nodeStatus:"running"},u={...o,ts:o.ts??new Date().toISOString()},c=a.activities??[],g=c.at(-1);g?.phase===u.phase&&g.label===u.label&&g.detail===u.detail||(s.nodes[r]={...a,activities:[...c,u].slice(-50)})})}async list(e){return await this.waitForMutations(e),(await this.read(e)).map(t=>{let{nodes:r,recovery:o,...i}=this.withCurrentErrorInfo(t);return i})}async get(e,t){await this.waitForMutations(e);let r=(await this.read(e)).find(s=>s.runId===t);if(!r)return;let{recovery:o,...i}=this.withCurrentErrorInfo(r);return i}async recoverableRunning(e){return await this.waitForMutations(e),(await this.read(e)).filter(t=>t.status==="running").map(t=>({runId:t.runId,triggerType:t.triggerType,startedAt:t.startedAt,...t.recovery?.triggerPayload?{triggerPayload:structuredClone(t.recovery.triggerPayload)}:{}}))}withCurrentErrorInfo(e){return e.status!=="failed"||!e.error?e:{...e,errorInfo:pe(e.error)}}async waitForMutations(e){await this.mutationChains.get(e)?.catch(()=>{})}async mutate(e,t){let o=(this.mutationChains.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{let i=await this.read(e);t(i),await this.write(e,i)});this.mutationChains.set(e,o);try{await o}finally{this.mutationChains.get(e)===o&&this.mutationChains.delete(e)}}async read(e){try{let t=await D(Yt(this.cwd,e));return Array.isArray(t)?t:[]}catch{return[]}}async write(e,t){let r=Yt(this.cwd,e);await lo(Zt($(this.cwd),e,"runs"),{recursive:!0}),await W(r,t)}};import{randomUUID as po}from"node:crypto";var Be=class{constructor(e,t,r){this.store=e;this.runtimeFactory=t;this.runHistory=r}store;runtimeFactory;runHistory;slots=new Map;activeRuns=new Map;activeRunIdsByWorkflow=new Map;suppressedHistoryRunIds=new Set;async create(e){let t=J(e.def);if(t.length>0)throw new P(t);let r=new Date().toISOString(),o={id:e.id,name:e.name,...e.owner?{owner:e.owner}:{},...e.setup?{setup:H(e.setup,e.def)}:{},...e.setupState?{setupState:structuredClone(e.setupState)}:{},def:e.def,active:e.active??!1,concurrency:e.concurrency??"queue",rev:1,createdAt:r,updatedAt:r};return await this.store.save(o),o}async update(e,t){let o={...await this.store.require(e),...t,updatedAt:new Date().toISOString()};if(t.def!==void 0){let i=J(o.def);if(i.length>0)throw new P(i)}return o.setup&&(o.setup=H(o.setup,o.def)),await this.store.save(o),o}async configureTemplate(e,t){let r=await this.store.require(e);if(r.rev!==t.baseRev)return{ok:!1,conflict:{latestRev:r.rev}};if(!r.setup)throw new Error(`Workflow "${e}" has no template setup manifest`);let o=qe(r.def,r.trigger,r.setup,r.setupState,t.values),i={...r,def:o.def,trigger:o.trigger,setupState:o.state,rev:r.rev+1,updatedAt:new Date().toISOString()},s=J(i.def);if(s.length>0)throw new P(s);return await this.store.save(i),{ok:!0,rev:i.rev,applied:[],missingRequired:o.missingRequired}}async setActive(e,t){if(t){let r=await this.store.require(e);if(!r.publishedDef)throw new Error(`Workflow "${e}" has no published version \u2014 publish the draft before activating`);if(r.archived)throw new Error(`Workflow "${e}" is archived \u2014 restore it before activating`)}return this.update(e,{active:t})}async publish(e){let t=await this.store.require(e);if(t.archived)throw new Error(`Workflow "${e}" is archived \u2014 restore it before publishing`);let r=J(t.def);if(r.length>0)throw new P(r);let o={...t,publishedDef:structuredClone(t.def),publishedRev:t.rev,updatedAt:new Date().toISOString()};return await this.store.save(o),o}async archive(e,t){let o={...await this.store.require(e),archived:t,...t?{active:!1}:{},updatedAt:new Date().toISOString()};return await this.store.save(o),o}async revertTo(e,t){let r=await this.store.require(e),o=await this.store.loadRevision(e,t);if(!o)throw new Error(`Workflow "${e}" has no stored revision ${t}`);let i=J(o.def);if(i.length>0)throw new P(i);let s={...r,def:o.def,name:o.name,trigger:o.trigger??null,rev:r.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(s),s}async importN8n(e,t,r={}){let{name:o,def:i,report:s}=Jt(t,e,{strictTemplates:!0}),a=Kt(s);return{record:await this.create({id:e,name:o,def:i,concurrency:r.concurrency,owner:r.owner,...a?{setup:a,setupState:{values:{}}}:{}}),report:s}}async get(e){return this.store.require(e)}async describe(e,t){let r=await this.store.require(e);return De(r,t)}async patch(e,t){let r=await this.store.require(e),o=t.baseRev!==void 0&&t.baseRev<r.rev,i={def:r.def,meta:{name:r.name,active:r.active,trigger:r.trigger??null}},s,a;try{let g=Ce(i,t);s=g.applied,a=g.target}catch(g){if(o&&g instanceof P)return{ok:!1,conflict:{latestRev:r.rev}};throw g}if(a.meta.active===!0&&!r.active&&!r.publishedDef)throw new P([`workflow "${e}" has no published version \u2014 publish the draft before activating (set_meta.active)`]);let c={...r,def:a.def,name:a.meta.name??r.name,active:a.meta.active??r.active,trigger:a.meta.trigger??null,rev:r.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(c),{ok:!0,rev:c.rev,applied:s}}async run(e,t,r={}){let o=await this.store.require(e);if(o.archived)throw new Error(`Workflow "${e}" is archived and cannot run`);let i=t?.type??"manual",s=i==="manual"||i==="intent"||i==="form",a;if(s)a=o.def;else{if(!o.publishedDef)throw new Error(`Workflow "${e}" has no published version \u2014 unattended trigger "${i}" refused`);a=o.publishedDef}let u={workflowId:e,runId:r.recoverRunId??po(),type:i,payload:t?.payload,permissionScope:o.permissionScope,reuseCache:r.reuseCache===!0},c=this.slotFor(e),g=()=>{if(c.pending>0)switch(o.concurrency){case"skip":return Promise.resolve({workflowId:e,status:"skipped"});case"parallel":return this.startParallel(e,a,u);case"queue":return this.track(e,c,a,u,!0)}return this.track(e,c,a,u,!1)};return this.recordRun(e,u,g,r.recordHistory===!1,r.onStarted,r.recoverRunId!==void 0)}async recordRun(e,t,r,o=!1,i,s=!1){let a=Date.now(),u={workflowId:e,runId:t.runId,triggerType:t.type};if(!this.runHistory||o)try{await i?.(u);let p=await r();return{...p,runId:p.runId??t.runId}}catch(p){if(p instanceof E)return{workflowId:e,status:"canceled",runId:t.runId};throw p}if(s){let p=(await this.runHistory.recoverableRunning(e)).find(f=>f.runId===t.runId);if(!p)throw new Error(`Workflow "${e}" has no recoverable running history for "${t.runId}"`);let d=Date.parse(p.startedAt);Number.isFinite(d)&&(a=d)}else await this.runHistory.begin(e,{runId:t.runId,triggerType:t.type,startedAt:new Date(a).toISOString(),...t.payload?{triggerPayload:t.payload}:{}});let c=p=>this.finishRunHistory(e,t.runId,a,p),g;try{await i?.(u),g=await r()}catch(p){if(p instanceof E)return await c({status:"canceled",error:p.message}),{workflowId:e,status:"canceled",runId:t.runId};throw await c({status:"failed",error:p instanceof Error?p.message:String(p),failedNodeId:p?.nodeId}),p}return await c({status:g.status,...g.result?{nodes:Ue(g.result)}:{}}),{...g,runId:t.runId}}pause(e,t={}){this.requireActiveRun(e,t.runId).runtime.pause()}async resume(e,t={}){let r=this.requireActiveRun(e,t.runId);if(r.status!=="paused")throw new Error(`Workflow "${e}" run "${r.runId}" is not paused`);t.extraBudget&&r.runtime.extendBudget(t.extraBudget),r.status="running";let o=this.slotFor(e);o.pending++;let i=r.runtime.run().then(async s=>{let a={workflowId:e,runId:r.runId,status:s.status,result:s};return s.status==="paused"?r.status="paused":this.unregisterActiveRun(r.runId),await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:a.status,nodes:Ue(s)}),a}).catch(async s=>{if(this.unregisterActiveRun(r.runId),s instanceof E)return await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:"canceled",error:s.message}),{workflowId:e,runId:r.runId,status:"canceled"};throw await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:"failed",error:s instanceof Error?s.message:String(s),failedNodeId:s?.nodeId}),s}).finally(()=>{o.pending--});return o.tail=i.catch(()=>{}),i}async cancelRun(e,t={}){let r=this.requireActiveRun(e,t.runId),o=t.reason??`Workflow "${e}" run "${r.runId}" canceled`,i=new E(o);return r.runtime.cancel(o),r.abortController.signal.aborted||r.abortController.abort(i),this.unregisterActiveRun(r.runId),r.status==="paused"&&await this.finishRunHistory(e,r.runId,r.startedAtMs,{status:"canceled",error:o}),{workflowId:e,runId:r.runId,status:"canceled"}}async delete(e){let t=[...this.activeRunIdsByWorkflow.get(e)??[]];for(let r of t)this.suppressedHistoryRunIds.add(r),await this.cancelRun(e,{runId:r,reason:`Workflow "${e}" deleted`}).catch(()=>{});this.slots.delete(e),await this.store.delete(e)}async listActive(){return this.store.listActive()}slotFor(e){let t=this.slots.get(e);return t||(t={tail:Promise.resolve(),pending:0},this.slots.set(e,t)),t}registerActiveRun(e){this.activeRuns.set(e.runId,e);let t=this.activeRunIdsByWorkflow.get(e.workflowId);t||(t=new Set,this.activeRunIdsByWorkflow.set(e.workflowId,t)),t.add(e.runId)}unregisterActiveRun(e){let t=this.activeRuns.get(e);if(!t)return;this.activeRuns.delete(e);let r=this.activeRunIdsByWorkflow.get(t.workflowId);r&&(r.delete(e),r.size===0&&this.activeRunIdsByWorkflow.delete(t.workflowId))}requireActiveRun(e,t){if(t){let s=this.activeRuns.get(t);if(!s||s.workflowId!==e)throw new Error(`Workflow "${e}" has no active run "${t}"`);return s}let r=[...this.activeRunIdsByWorkflow.get(e)??[]],o=this.slots.get(e)?.latestRunId;if(o&&r.includes(o))return this.activeRuns.get(o);let i=r.at(-1);if(!i)throw new Error(`Workflow "${e}" has no active run`);return this.activeRuns.get(i)}async finishRunHistory(e,t,r,o){!this.runHistory||this.suppressedHistoryRunIds.has(t)||await this.runHistory.finish(e,t,{finishedAt:new Date().toISOString(),durationMs:Date.now()-r,...o})}track(e,t,r,o,i){t.pending++;let s=()=>this.startTrackedRuntime(e,t,r,o),u=(i?t.tail.then(s):s()).finally(()=>{t.pending--});return t.tail=u.catch(()=>{}),u}async startParallel(e,t,r){return this.startTrackedRuntime(e,void 0,t,r)}async startTrackedRuntime(e,t,r,o){let i=new AbortController,s=this.runtimeFactory(r,{...o,signal:i.signal}),a={workflowId:e,runId:o.runId,startedAtMs:Date.now(),runtime:s,abortController:i,status:"running"};this.registerActiveRun(a),t&&(t.runtime=s,t.latestRunId=o.runId);try{let u=await s.run(),c={workflowId:e,runId:o.runId,status:u.status,result:u};return u.status==="paused"?a.status="paused":this.unregisterActiveRun(o.runId),c}catch(u){throw this.unregisterActiveRun(o.runId),u}}};function go(n){return(e,t)=>new Q(e,{registry:n.registry,host:n.host,signal:t.signal,checkpoint:n.checkpoint?.(t.workflowId,t.reuseCache?"shared-cache":t.runId),preserveCheckpoint:t.reuseCache===!0,trigger:t.payload,triggerKind:t.type,runId:t.runId,now:n.now,onNodeStatus:n.emitNodeStatus?(r,o,i)=>n.emitNodeStatus(t.workflowId,r,o,i):void 0,gate:new fe({trigger:t.type,maxNodeExecutions:n.budget.maxNodeExecutions,maxDurationMs:n.budget.maxDurationMs,allowUnattendedKinds:t.permissionScope?.allowUnattendedKinds??n.allowUnattendedKinds,now:n.now?()=>n.now().getTime():void 0})})}function mo(n){let e=n.fetchImpl??fetch;return{async runAgent(t){let r=await n.runAgent({agentId:t.agentId,prompt:t.prompt,signal:t.signal});return[O({text:r,output:r})]},async runModel(t){if(!n.resolveClientForPurpose)throw new Error("workflow model node: no configured model resolver is wired");let r=n.resolveClientForPurpose("textGeneration");if(!r)throw new Error("workflow model node: no textGeneration model is configured");let o="";for await(let i of r.transport.stream({model:r.model,messages:[{role:"user",content:t.prompt}],temperature:t.temperature,maxTokens:t.maxTokens,tools:[]},r.apiKey,t.signal))if(i.type==="delta"&&(o+=i.text),i.type==="error")throw new Error(i.message);return[O({text:o,output:o,model:r.model,...t.modelHint?{importedModel:t.modelHint}:{},choices:[{text:o}]})]},async httpRequest(t){let r={...t.headers??{}};t.idempotencyKey&&t.method.toUpperCase()!=="GET"&&t.method.toUpperCase()!=="HEAD"&&!Object.keys(r).some(u=>u.toLowerCase()==="idempotency-key")&&(r["Idempotency-Key"]=t.idempotencyKey);let o=await e(t.url,{method:t.method||"GET",headers:Object.keys(r).length>0?r:void 0,body:t.body===void 0?void 0:typeof t.body=="string"?t.body:JSON.stringify(t.body),signal:t.signal}),i=o.headers.get("content-type")??"";if(i.includes("application/json")){let u=await o.text(),c=u;try{u.length>0&&(c=JSON.parse(u))}catch{c={__unparsedJson:u}}return[O({status:o.status,ok:o.ok,body:c})]}let s=Buffer.from(await o.arrayBuffer()),a=ho(o.headers.get("content-disposition"));return[O({status:o.status,ok:o.ok,bodyBase64:s.toString("base64"),mimeType:i||"application/octet-stream",size:s.byteLength,...a?{filename:a}:{}})]},async invokeMcp(t){let r=await n.invokeMcp({server:t.server,tool:t.tool,args:t.args,signal:t.signal});return[O({result:r})]},async runN8nNode(t){if(!n.runN8nNode)throw new Error("workflow n8n node: no n8n compatibility service is wired");return n.runN8nNode(t)},async sendChannel(t){if(!n.sendChannel)throw new Error("workflow channel node: sendChannel requires the xiaozhiclaw gateway host, none injected (channel/IM nodes are unavailable in standalone qlogicagent \u2014 D12/D13).");let r=await n.sendChannel({channel:t.channel,target:t.target,payload:t.payload,idempotencyKey:t.idempotencyKey,signal:t.signal});return[O({sent:!0,result:r})]},async memory(t){if(!n.memory)throw new Error("workflow memory node: no memory backend injected (handler host wires the project memdir)");return n.memory(t)},async runSubworkflow(t){if(!n.runSubworkflow)throw new Error("workflow subworkflow node: no sub-run backend injected (handler host wires the controller)");return n.runSubworkflow(t)},async approval(t){if(!n.approval)throw new Error("workflow approval node: no approval backend injected (handler host wires the notify/await loop)");return n.approval(t)},async waitWebhook(t){if(!n.waitWebhook)throw new Error("workflow wait(until=webhook): no webhook-wait backend injected (handler host wires the wake registry)");return n.waitWebhook(t)}}}function ho(n){if(!n)return;let e=n.match(/filename\*=UTF-8''([^;]+)/i);if(e)return decodeURIComponent(e[1].trim().replace(/^"|"$/g,""));let t=n.match(/filename=([^;]+)/i);return t?t[1].trim().replace(/^"|"$/g,""):void 0}var Qt=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Xt=["SUN","MON","TUE","WED","THU","FRI","SAT"];function wo(n){if(typeof n!="string"||n.trim()==="")throw new Error("cron must be a non-empty string");let e=n.trim().split(/\s+/);if(e.length!==5&&e.length!==6)throw new Error(`cron must have 5 or 6 fields, got ${e.length}: "${n}"`);let t=e.length===6,r=t?[{label:"second",min:0,max:59},{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Qt},{label:"day-of-week",min:0,max:7,names:Xt}]:[{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Qt},{label:"day-of-week",min:0,max:7,names:Xt}],o=r.map((u,c)=>({spec:u,raw:e[c],set:yo(e[c],r[c])})),i=u=>{let c=o.find(g=>g.spec.label===u);if(!c)throw new Error(`internal: missing cron field ${u}`);return c},s=i("day-of-week"),a=new Set;for(let u of s.set)a.add(u===7?0:u);return{hasSeconds:t,seconds:t?i("second").set:new Set([0]),minutes:i("minute").set,hours:i("hour").set,doms:i("day-of-month").set,months:i("month").set,dows:a,domRestricted:i("day-of-month").raw.trim()!=="*",dowRestricted:s.raw.trim()!=="*"}}function yo(n,e){let t=new Set;for(let r of n.split(","))ko(r,e,t);if(t.size===0)throw new Error(`cron ${e.label} expanded to an empty set: "${n}"`);return t}function ko(n,e,t){if(n==="")throw new Error(`cron ${e.label} has an empty list element`);let r=n,o=1,i=n.indexOf("/");if(i!==-1){r=n.slice(0,i);let u=n.slice(i+1);if(!/^\d+$/.test(u)||Number(u)<=0)throw new Error(`cron ${e.label} has an invalid step "/${u}"`);o=Number(u)}let s,a;if(r==="*")s=e.min,a=e.max;else{let u=r.indexOf("-");if(u!==-1){let c=Fe(r.slice(0,u),e),g=Fe(r.slice(u+1),e);if(c===void 0||g===void 0)throw new Error(`cron ${e.label} has an invalid range "${r}"`);if(c>g)throw new Error(`cron ${e.label} range "${r}" is descending`);s=c,a=g}else{let c=Fe(r,e);if(c===void 0)throw new Error(`cron ${e.label} value "${r}" is out of range ${e.min}-${e.max}`);s=c,a=o===1?c:e.max}}for(let u=s;u<=a;u+=o)t.add(u)}function Fe(n,e){let t;if(/^\d+$/.test(n))t=Number(n);else if(e.names){let r=e.names.indexOf(n.toUpperCase());if(r===-1)return;t=e.label==="month"?r+1:r}else return;if(!(t<e.min||t>e.max))return t}var rn=5*366+32;function ge(n,e,t="UTC"){let r=wo(n);if(bo(t),t!=="UTC"&&t!=="Etc/UTC")return Eo(r,n,e,t);let o=new Date(e);r.hasSeconds?(o.setUTCMilliseconds(0),o.setUTCSeconds(o.getUTCSeconds()+1)):(o.setUTCSeconds(0,0),o.setUTCMinutes(o.getUTCMinutes()+1));for(let i=0;i<rn;i++){if(!r.months.has(o.getUTCMonth()+1)){o.setUTCMonth(o.getUTCMonth()+1,1),o.setUTCHours(0,0,0,0);continue}if(!Je(r,o)){o.setUTCDate(o.getUTCDate()+1),o.setUTCHours(0,0,0,0);continue}if(!r.hours.has(o.getUTCHours())){o.setUTCHours(o.getUTCHours()+1,0,0,0);continue}if(!r.minutes.has(o.getUTCMinutes())){o.setUTCMinutes(o.getUTCMinutes()+1,0,0);continue}if(r.hasSeconds&&!r.seconds.has(o.getUTCSeconds())){o.setUTCSeconds(o.getUTCSeconds()+1,0);continue}return o.getTime()}throw new Error(`cron "${n}" has no matching time within ~5 years of ${new Date(e).toISOString()}`)}var en=new Map;function bo(n){try{on(n).format(0)}catch{throw new Error(`Invalid or unsupported timezone: ${JSON.stringify(n)}`)}}function on(n){let e=en.get(n);return e||(e=new Intl.DateTimeFormat("en-CA-u-ca-gregory-nu-latn",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23"}),en.set(n,e)),e}function Le(n,e){let t={};for(let r of on(e).formatToParts(n))r.type!=="literal"&&(t[r.type]=Number(r.value));return{year:t.year,month:t.month,day:t.day,hour:t.hour===24?0:t.hour,minute:t.minute,second:t.second}}function Ke(n){return Date.UTC(n.year,n.month-1,n.day,n.hour,n.minute,n.second)}function vo(n,e){return n.year===e.year&&n.month===e.month&&n.day===e.day&&n.hour===e.hour&&n.minute===e.minute&&n.second===e.second}function tn(n,e){let t=Ke(n),r=new Set;for(let i=-36;i<=36;i+=6){let s=t+i*36e5;r.add(Ke(Le(s,e))-s)}let o=[...r].map(i=>t-i).filter(i=>vo(Le(i,e),n));return[...new Set(o)].sort((i,s)=>i-s)}function nn(n){return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:n.getUTCHours(),minute:n.getUTCMinutes(),second:n.getUTCSeconds()}}function xo(n,e){return n.months.has(e.getUTCMonth()+1)&&Je(n,e)&&n.hours.has(e.getUTCHours())&&n.minutes.has(e.getUTCMinutes())&&(!n.hasSeconds||n.seconds.has(e.getUTCSeconds()))}function Eo(n,e,t,r){let o=Le(t,r),i=Ke(o),s=n.hasSeconds?1e3:6e4;for(let u=i-4*36e5;u<=i;u+=s){let c=new Date(u);if(!xo(n,c))continue;let g=tn(nn(c),r).find(p=>p>t);if(g!==void 0)return g}let a=new Date(i);n.hasSeconds?(a.setUTCMilliseconds(0),a.setUTCSeconds(a.getUTCSeconds()+1)):(a.setUTCSeconds(0,0),a.setUTCMinutes(a.getUTCMinutes()+1));for(let u=0;u<rn;u++){if(!n.months.has(a.getUTCMonth()+1)){a.setUTCMonth(a.getUTCMonth()+1,1),a.setUTCHours(0,0,0,0);continue}if(!Je(n,a)){a.setUTCDate(a.getUTCDate()+1),a.setUTCHours(0,0,0,0);continue}if(!n.hours.has(a.getUTCHours())){a.setUTCHours(a.getUTCHours()+1,0,0,0);continue}if(!n.minutes.has(a.getUTCMinutes())){a.setUTCMinutes(a.getUTCMinutes()+1,0,0);continue}if(n.hasSeconds&&!n.seconds.has(a.getUTCSeconds())){a.setUTCSeconds(a.getUTCSeconds()+1,0);continue}let c=tn(nn(a),r).find(g=>g>t);if(c!==void 0)return c;n.hasSeconds?a.setUTCSeconds(a.getUTCSeconds()+1,0):a.setUTCMinutes(a.getUTCMinutes()+1,0,0)}throw new Error(`cron "${e}" has no matching time within ~5 years of ${new Date(t).toISOString()} in ${r}`)}function Je(n,e){let t=n.doms.has(e.getUTCDate()),r=n.dows.has(e.getUTCDay());return n.domRestricted&&n.dowRestricted?t||r:n.domRestricted?t:n.dowRestricted?r:!0}var Po={now:()=>Date.now(),setTimer:(n,e)=>setTimeout(n,e),clearTimer:n=>clearTimeout(n)},sn=2e9,Ve=class{controller;clock;onError;onRunStarted;onRunCompleted;onRunFailed;defaultTimezone;getLastScheduledAt;triggers=new Map;cronArms=new Map;lastFireAt=new Map;minTriggerIntervalMs;onTriggerDropped;started=!1;constructor(e){if(!e.controller)throw new Error("WorkflowScheduler requires a controller");if(typeof e.onError!="function")throw new Error("WorkflowScheduler requires an onError handler");this.controller=e.controller,this.clock=e.clock??Po,this.onError=e.onError,this.onRunStarted=e.onRunStarted,this.onRunCompleted=e.onRunCompleted,this.onRunFailed=e.onRunFailed,this.defaultTimezone=e.defaultTimezone??"UTC",this.getLastScheduledAt=e.getLastScheduledAt;try{new Intl.DateTimeFormat("en",{timeZone:this.defaultTimezone}).format(0)}catch{throw new Error(`WorkflowScheduler defaultTimezone is invalid: ${JSON.stringify(this.defaultTimezone)}`)}if(this.minTriggerIntervalMs=e.minTriggerIntervalMs??0,this.onTriggerDropped=e.onTriggerDropped,this.minTriggerIntervalMs>0&&!this.onTriggerDropped)throw new Error("WorkflowScheduler: minTriggerIntervalMs > 0 requires onTriggerDropped (drops must never be silent, \xA71.5)")}async start(){if(this.started)throw new Error("WorkflowScheduler already started");this.started=!0;let e=await this.controller.listActive();for(let t of e){let r;if(t.trigger?.type==="schedule"&&this.getLastScheduledAt&&(r=await this.getLastScheduledAt(t.id),r===void 0)){let o=Date.parse(t.createdAt);Number.isFinite(o)&&(r=o)}this.registerTrigger(t.id,t.trigger??{type:"manual"},r)}}stop(){for(let e of this.cronArms.values())this.clock.clearTimer(e.handle);this.cronArms.clear(),this.triggers.clear(),this.started=!1}async refresh(e){let t;try{t=await this.controller.get(e)}catch{this.unregister(e);return}if(!t.active){this.unregister(e);return}this.registerTrigger(e,t.trigger??{type:"manual"})}unregister(e){let t=this.cronArms.get(e);t&&(this.clock.clearTimer(t.handle),this.cronArms.delete(e)),this.triggers.delete(e)}registeredIds(){return[...this.triggers.keys()]}nextFireAt(e){return this.cronArms.get(e)?.fireAt}async onWebhook(e,t){let r=this.matchingIds(o=>o.type==="webhook"&&o.path===e).filter(o=>this.passesRateLimit(o,"webhook"));return Promise.all(r.map(o=>this.runWithLifecycle(o,{type:"webhook",payload:t})))}async onImMessage(e,t,r){let o=this.matchingIds(s=>s.type==="im-message"&&s.channel===e&&Ro(s.match,t)).filter(s=>this.passesRateLimit(s,"im-message")),i={...r,channel:e,text:t};return Promise.all(o.map(s=>this.runWithLifecycle(s,{type:"im-message",payload:i})))}async triggerManual(e,t){return this.runWithLifecycle(e,{type:"manual",payload:t})}matchingIds(e){let t=[];for(let[r,o]of this.triggers)e(o)&&t.push(r);return t}registerTrigger(e,t,r){if(this.unregister(e),this.triggers.set(e,t),t.type==="schedule"){let o=t.timezone??this.defaultTimezone,i=t.misfirePolicy??"run-once",s=this.clock.now(),a=r===void 0?void 0:ge(t.cron,r,o),u=a!==void 0&&a<=s?a:ge(t.cron,s,o);this.armCron(e,t.cron,o,i,u)}}armCron(e,t,r,o,i){let s=Math.max(0,i-this.clock.now()),a={cron:t,timezone:r,misfirePolicy:o,fireAt:i,handle:void 0};s>sn?a.handle=this.clock.setTimer(()=>{this.cronArms.get(e)===a&&this.armCron(e,t,r,o,i)},sn):a.handle=this.clock.setTimer(()=>this.fireCron(e,a),s),this.cronArms.set(e,a)}fireCron(e,t){if(this.cronArms.get(e)!==t)return;let r=this.clock.now(),o=r>t.fireAt,i;try{i=ge(t.cron,o?r:t.fireAt,t.timezone)}catch(s){this.cronArms.delete(e),this.onError(s,e);return}if(this.armCron(e,t.cron,t.timezone,t.misfirePolicy,i),o&&t.misfirePolicy==="skip"){this.onTriggerDropped?.(e,"schedule",{sinceLastMs:r-t.fireAt,minIntervalMs:this.minTriggerIntervalMs,reason:"misfire",scheduledAt:t.fireAt});return}this.passesRateLimit(e,"schedule")&&this.runWithLifecycle(e,{type:"schedule"}).catch(s=>this.onError(s,e))}passesRateLimit(e,t){if(this.minTriggerIntervalMs<=0)return!0;let r=this.clock.now(),o=this.lastFireAt.get(e);return o!==void 0&&r-o<this.minTriggerIntervalMs?(this.onTriggerDropped?.(e,t,{sinceLastMs:r-o,minIntervalMs:this.minTriggerIntervalMs}),!1):(this.lastFireAt.set(e,r),!0)}async runWithLifecycle(e,t){let r;try{r=await this.controller.run(e,t,{onStarted:({runId:o})=>this.onRunStarted?.(e,t.type,o)})}catch(o){try{this.onRunFailed?.(e,t.type,o)}catch(i){this.reportLifecycleCallbackError(e,"failure",i)}throw o}try{this.onRunCompleted?.(r,t.type)}catch(o){this.reportLifecycleCallbackError(e,"completion",o)}return r}reportLifecycleCallbackError(e,t,r){let o=r instanceof Error?r.message:String(r);try{this.onError(new Error(`Workflow ${e} ${t} notification failed: ${o}`),e)}catch{}}};function Ro(n,e){return n===void 0?!0:new RegExp(n).test(e)}import{join as an}from"node:path";import{mkdir as So,rm as Io}from"node:fs/promises";function Ao(n,e,t){return an(oe().getProjectAgentDir(n),"workflows",e,"runs",t)}var Ge=class{constructor(e,t,r){this.workflowId=t;this.runId=r;if(!e)throw new Error("FileRunCheckpoint requires a project cwd");if(!t)throw new Error("FileRunCheckpoint requires a workflowId");if(!r)throw new Error("FileRunCheckpoint requires a runId");this.dir=Ao(e,t,r),this.file=an(this.dir,"cache.json")}workflowId;runId;dir;file;async load(){return D(this.file)}async persist(e){await So(this.dir,{recursive:!0});let t={workflowId:this.workflowId,runId:this.runId,entries:e,updatedAt:new Date().toISOString()};await W(this.file,t)}async clear(){await Io(this.dir,{recursive:!0,force:!0})}};import*as V from"node:fs";import*as me from"node:path";var ze=class{file;constructor(e){this.file=me.join(e,"audit.jsonl")}append(e){try{V.mkdirSync(me.dirname(this.file),{recursive:!0}),V.appendFileSync(this.file,`${JSON.stringify(e)}
8
8
  `,"utf8")}catch(t){process.stderr.write(`[workflow:audit] WRITE FAILED (${t instanceof Error?t.message:String(t)}) \u2014 entry: ${JSON.stringify(e)}
9
9
  `)}}list(e,t=100){let r;try{r=V.readFileSync(this.file,"utf8")}catch{return[]}let o=[];for(let i of r.split(`
10
10
  `))if(i.trim())try{let s=JSON.parse(i);(!e||s.workflowId===e)&&o.push(s)}catch{process.stderr.write(`[workflow:audit] skipping malformed line: ${i.slice(0,120)}
11
- `)}return o.reverse().slice(0,t)}};var he={agent:{type:"object",required:["agentId","prompt"],properties:{prompt:{type:"string","x-widget":"textarea",description:"\u8BA9 AI \u505A\u4EC0\u4E48(\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38)"},agentId:{type:"string",description:"\u5FC5\u586B:\u660E\u786E\u6267\u884C\u8BE5\u8282\u70B9\u7684 agent id(self \u4E0D\u5408\u6CD5)"}}},action:{type:"object",required:["target","server","tool","toolName"],properties:{target:{type:"string",enum:["mcp"],description:"\u56FA\u5B9A\u4E3A mcp"},server:{type:"string",description:"MCP \u63D2\u4EF6/\u670D\u52A1\u5668 id"},tool:{type:"string",description:"MCP \u5DE5\u5177\u77ED\u540D"},toolName:{type:"string",description:"\u76EE\u5F55\u4E2D\u7684\u7CBE\u786E\u89C4\u8303\u5DE5\u5177\u540D"},args:{type:"object",description:"\u5DE5\u5177\u53C2\u6570"}}},http:{type:"object",required:["url"],properties:{method:{type:"string",enum:["GET","POST","PUT","PATCH","DELETE"],default:"GET",description:"\u8BF7\u6C42\u65B9\u6CD5"},url:{type:"string",description:"\u8BF7\u6C42\u5730\u5740,\u53EF\u7528 {{ $node(...) }} \u6A21\u677F"},headers:{type:"object",description:"\u8BF7\u6C42\u5934(\u952E\u503C\u5BF9\u5BF9\u8C61)"},body:{type:"string","x-widget":"textarea",description:"\u8BF7\u6C42\u4F53(\u6587\u672C/JSON \u5B57\u7B26\u4E32,\u53EF\u542B\u6A21\u677F\u8868\u8FBE\u5F0F)"}}},channel:{type:"object",required:["channel"],properties:{channel:{type:"string",description:"\u6E20\u9053\u540D,\u5982 feishu / wechat"},target:{type:"string",description:"\u76EE\u6807\u7FA4/\u7528\u6237 id(\u53EF\u9009)"},payload:{type:"string","x-widget":"textarea",description:"\u8981\u53D1\u9001\u7684\u5185\u5BB9,\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38"}}},memory:{type:"object",required:["op"],properties:{op:{type:"string",enum:["read","write","search"],description:"\u64CD\u4F5C"},key:{type:"string",description:"\u4E3B\u9898 key(\u53EF\u9009;\u7F3A\u7701\u64CD\u4F5C\u8BB0\u5FC6\u7D22\u5F15)"},value:{type:"string","x-widget":"textarea",description:"\u5199\u5165\u5185\u5BB9(write;\u7559\u7A7A\u53D6\u4E0A\u6E38\u8F93\u51FA)"},query:{type:"string",description:"\u641C\u7D22\u8BCD(search)"}}},if:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u6761\u4EF6\u8868\u8FBE\u5F0F;\u771F\u8D70 true \u7AEF\u53E3\u3001\u5047\u8D70 false \u7AEF\u53E3"}}},filter:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u9010\u6761\u4FDD\u7559\u6761\u4EF6($json \u6307\u5F53\u524D\u6761);\u771F\u4FDD\u7559\u3001\u5047\u4E22\u5F03"}}},switch:{type:"object",required:["cases"],properties:{cases:{type:"array",description:"[{ port, condition }];\u9996\u4E2A\u4E3A\u771F\u7684\u5206\u652F\u751F\u6548"},defaultPort:{type:"string",default:"default",description:"\u90FD\u4E0D\u547D\u4E2D\u65F6\u8D70\u7684\u7AEF\u53E3"}}},transform:{type:"object",required:["mapping"],properties:{mapping:{type:"object",description:'\u9010\u6761\u6620\u5C04 { \u8F93\u51FA\u5B57\u6BB5: "{{ $json.\u5B57\u6BB5 }}" }'}}},aggregate:{type:"object",properties:{}},merge:{type:"object",properties:{}},passthrough:{type:"object",properties:{}},set:{type:"object",properties:{json:{type:"object",description:"\u4EA7\u51FA\u7684\u4E00\u6761\u56FA\u5B9A/\u8868\u8FBE\u5F0F\u6570\u636E"}}},wait:{type:"object",properties:{until:{type:"string",enum:["delay","webhook"],default:"delay",description:"\u7B49\u5F85\u65B9\u5F0F"},ms:{type:"integer",minimum:1,maximum:36e5,description:"\u5EF6\u65F6\u6BEB\u79D2(delay \u6A21\u5F0F,1..3600000)"},path:{type:"string",description:"\u7B49\u5F85\u7684 webhook \u8DEF\u5F84(webhook \u6A21\u5F0F)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u6BEB\u79D2(webhook \u6A21\u5F0F;\u9ED8\u8BA4 24h)"}}},subworkflow:{type:"object",required:["workflowId"],properties:{workflowId:{type:"string",description:"\u8981\u8C03\u7528\u7684\u5DE5\u4F5C\u6D41 id"},projectId:{type:"string",description:"\u8DE8\u9879\u76EE\u76EE\u6807(\u53EF\u9009)"},payload:{type:"object",description:"\u4F20\u5165\u5B50\u6D41\u7A0B\u7684 $trigger \u8F7D\u8377(\u53EF\u9009)"}}},approval:{type:"object",properties:{prompt:{type:"string",description:"\u5BA1\u6279\u95EE\u9898(\u9ED8\u8BA4 \u7EE7\u7EED\u6267\u884C?)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u81EA\u52A8\u62D2(\u6BEB\u79D2;\u9ED8\u8BA4 24h)"},timeoutAction:{type:"string",enum:["approve","reject","keepPending"],description:"\u8D85\u65F6\u7B56\u7565(\u9ED8\u8BA4 reject):reject \u62D2\u7EDD\u5E76\u901A\u77E5 owner(\u975E\u9759\u9ED8) / approve \u81EA\u52A8\u6279\u51C6 / keepPending \u4FDD\u6301\u6302\u8D77\u5F85\u4EBA\u5DE5\u51B3\u5B9A"}}}};var cn={type:"object",additionalProperties:!0},$o=[{name:"default",type:"any"}];function b(n){return{...n,paramsSchema:he[n.kind],inputSchema:cn,outputSchema:n.outputSchema??cn,inputPorts:[{name:"default",type:"any",required:n.kind!=="set"}],outputPorts:n.outputPorts??$o,requiredParams:Array.isArray(he[n.kind]?.required)?he[n.kind].required:[]}}var jo=[b({category:"action",kind:"action",id:"action",label:"Action",description:"\u7CBE\u786E\u8C03\u7528\u76EE\u5F55\u4E2D\u7684\u4E00\u4E2A MCP \u5DE5\u5177",paramsTemplate:{target:"mcp",server:"",tool:"",toolName:"",args:{}},useWhen:["\u5DF2\u660E\u786E\u5177\u4F53 MCP \u5DE5\u5177\u5E76\u9700\u8981\u786E\u5B9A\u6027\u8C03\u7528"],avoidWhen:["\u5C1A\u672A\u9009\u62E9\u5177\u4F53\u5DE5\u5177\u6216\u4EFB\u52A1\u9700\u8981\u5F00\u653E\u5F0F\u63A8\u7406"],keywords:["MCP","\u5DE5\u5177","\u52A8\u4F5C","\u8C03\u7528"],sideEffectLevel:"external",constraints:["\u4F18\u5148\u9009\u62E9\u5177\u4F53 MCP capabilityId\uFF0C\u800C\u4E0D\u662F\u7A7A\u767D action"]}),b({category:"control",kind:"http",id:"http",label:"HTTP",description:"\u8C03\u7528 HTTP API \u6216\u8BFB\u53D6\u516C\u5F00 URL\uFF1B\u54CD\u5E94\u56FA\u5B9A\u5305\u88C5\u4E3A {status, ok, headers, body}\uFF0C\u4E1A\u52A1\u5B57\u6BB5\u4ECE $json.body \u8BFB\u53D6",paramsTemplate:{method:"GET",url:""},outputSchema:{type:"object",properties:{status:{type:"integer"},ok:{type:"boolean"},headers:{type:"object",additionalProperties:{type:"string"}},body:{type:["object","array","string","number","boolean","null"]}},required:["status","ok","body"]},useWhen:["\u5DF2\u77E5 URL/API \u4E14\u53EF\u76F4\u63A5\u8BF7\u6C42","\u540E\u7EED\u8868\u8FBE\u5F0F\u7528 $json.body.<field> \u5F15\u7528 JSON \u54CD\u5E94\u4E1A\u52A1\u5B57\u6BB5"],avoidWhen:["\u9875\u9762\u9700\u8981\u767B\u5F55\u3001\u6D4F\u89C8\u5668\u4EA4\u4E92\u6216\u5B58\u5728\u53CD\u722C\u9650\u5236"],keywords:["HTTP","API","URL","\u8BF7\u6C42","\u6293\u53D6","\u65B0\u95FB"],sideEffectLevel:"external",permissionHints:["\u8054\u7F51\u8BF7\u6C42\u53EF\u80FD\u89E6\u53D1\u7F51\u7EDC\u6743\u9650"],constraints:["\u4E0B\u6E38\u4E0D\u5F97\u628A\u54CD\u5E94 body \u7684\u5B57\u6BB5\u8BEF\u5199\u6210 $json.<field>\uFF1B\u5E94\u4F7F\u7528 $json.body.<field>"]}),b({category:"control",kind:"if",id:"if",label:"Condition",description:"\u6309\u4E00\u4E2A\u5E03\u5C14\u6761\u4EF6\u5206\u6210 true/false \u4E24\u8DEF",paramsTemplate:{condition:""},useWhen:["\u9700\u8981\u4E8C\u9009\u4E00\u6761\u4EF6\u5206\u652F"],avoidWhen:["\u9700\u8981\u4E09\u4E2A\u4EE5\u4E0A\u5206\u652F\u65F6\u4F7F\u7528 switch"],keywords:["\u6761\u4EF6","\u5982\u679C","\u5224\u65AD","\u5206\u652F"],sideEffectLevel:"none",outputPorts:[{name:"true",type:"any"},{name:"false",type:"any"}]}),b({category:"control",kind:"switch",id:"switch",label:"Switch",description:"\u6309\u591A\u7EC4\u6761\u4EF6\u5206\u6D41",paramsTemplate:{cases:[{port:"case1",condition:""}],defaultPort:"default"},useWhen:["\u9700\u8981\u4E09\u4E2A\u4EE5\u4E0A\u4E92\u65A5\u6216\u4F18\u5148\u5339\u914D\u5206\u652F"],avoidWhen:["\u4EC5 true/false \u4E24\u8DEF\u65F6\u4F7F\u7528 if"],keywords:["\u591A\u8DEF","\u5206\u652F","\u8DEF\u7531","\u5206\u7C7B"],sideEffectLevel:"none"}),b({category:"control",kind:"filter",id:"filter",label:"Filter",description:"\u9010\u6761\u4FDD\u7559\u6EE1\u8DB3\u6761\u4EF6\u7684\u6570\u636E",paramsTemplate:{condition:""},useWhen:["\u9700\u8981\u8FC7\u6EE4\u5217\u8868\u4E2D\u7684\u9879\u76EE"],avoidWhen:["\u9700\u8981\u5BF9\u6574\u6279\u6570\u636E\u505A\u6C47\u603B"],keywords:["\u8FC7\u6EE4","\u7B5B\u9009","\u4FDD\u7559","\u5254\u9664"],sideEffectLevel:"none"}),b({category:"control",kind:"transform",id:"transform",label:"Transform",description:"\u9010\u6761\u6620\u5C04\u6216\u91CD\u547D\u540D\u5B57\u6BB5",paramsTemplate:{mapping:{}},useWhen:["\u5B57\u6BB5\u6620\u5C04\u89C4\u5219\u53EF\u4EE5\u786E\u5B9A\u8868\u8FBE"],avoidWhen:["\u8F6C\u6362\u9700\u8981\u8BED\u4E49\u7406\u89E3\u6216\u81EA\u7531\u6587\u672C\u751F\u6210\u65F6\u4F7F\u7528 Agent"],keywords:["\u5B57\u6BB5","\u8F6C\u6362","\u6620\u5C04","\u683C\u5F0F"],sideEffectLevel:"none"}),b({category:"control",kind:"aggregate",id:"aggregate",label:"Aggregate",description:"\u628A\u591A\u6761\u8F93\u5165\u6536\u62E2\u4E3A\u4E00\u6761\u6279\u6B21",paramsTemplate:{},outputSchema:{type:"object",properties:{items:{type:"array"},count:{type:"integer"}},required:["items","count"]},useWhen:["\u591A\u6765\u6E90\u7ED3\u679C\u9700\u8981\u5148\u6C47\u603B\u518D\u7EE7\u7EED\u5904\u7406"],avoidWhen:["\u4ECD\u9700\u9010\u6761\u5E76\u884C\u5904\u7406"],keywords:["\u6C47\u603B","\u805A\u5408","\u5408\u5E76\u65B0\u95FB\u6E90","\u6536\u62E2"],sideEffectLevel:"none"}),b({category:"control",kind:"passthrough",id:"passthrough",label:"Passthrough",description:"\u4E0D\u6539\u53D8\u6570\u636E\u7684\u7ED3\u6784\u5360\u4F4D\u6216\u8FDE\u7EBF\u8282\u70B9",paramsTemplate:{},useWhen:["\u9700\u8981\u663E\u5F0F\u6D41\u7A0B\u8FB9\u754C\u4F46\u4E0D\u8F6C\u6362\u6570\u636E"],avoidWhen:["\u5DF2\u6709\u66F4\u5177\u4F53\u7684\u5904\u7406\u80FD\u529B"],keywords:["\u539F\u6837","\u4F20\u9012","\u5360\u4F4D"],sideEffectLevel:"none"}),b({category:"control",kind:"set",id:"set",label:"Set",description:"\u751F\u6210\u56FA\u5B9A\u5BF9\u8C61\u6216\u8BBE\u7F6E\u786E\u5B9A\u5B57\u6BB5",paramsTemplate:{json:{}},useWhen:["\u9700\u8981\u6CE8\u5165\u56FA\u5B9A\u914D\u7F6E\u6216\u5E38\u91CF\u5B57\u6BB5"],avoidWhen:["\u503C\u4F9D\u8D56\u5F00\u653E\u5F0F\u8BED\u4E49\u751F\u6210"],keywords:["\u8D4B\u503C","\u8BBE\u7F6E","\u5E38\u91CF"],sideEffectLevel:"none"}),b({category:"control",kind:"merge",id:"merge",label:"Merge",description:"\u5408\u5E76\u591A\u4E2A\u5BF9\u8C61\u5B57\u6BB5",paramsTemplate:{},useWhen:["\u591A\u4E2A\u5BF9\u8C61\u9700\u8981\u5408\u5E76\u6210\u4E00\u4E2A\u5BF9\u8C61"],avoidWhen:["\u591A\u6761\u5217\u8868\u9700\u8981\u6536\u62E2\u65F6\u4F7F\u7528 aggregate"],keywords:["\u5408\u5E76","\u5BF9\u8C61","\u5B57\u6BB5"],sideEffectLevel:"none"}),b({category:"control",kind:"wait",id:"wait",label:"Wait",description:"\u5EF6\u65F6\u6216\u7B49\u5F85 webhook",paramsTemplate:{until:"delay",ms:6e4},useWhen:["\u540E\u7EED\u6B65\u9AA4\u5FC5\u987B\u5EF6\u8FDF\u6216\u7B49\u5F85\u5916\u90E8\u56DE\u8C03"],avoidWhen:["\u53EA\u9700\u6309\u8BA1\u5212\u542F\u52A8\u6D41\u7A0B\u65F6\u4F7F\u7528 schedule trigger"],keywords:["\u7B49\u5F85","\u5EF6\u65F6","\u7A0D\u540E","\u56DE\u8C03"],sideEffectLevel:"none"}),b({category:"control",kind:"subworkflow",id:"subworkflow",label:"Subworkflow",description:"\u8C03\u7528\u4E00\u4E2A\u5DF2\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41",paramsTemplate:{workflowId:""},useWhen:["\u5DF2\u6709\u53EF\u590D\u7528\u5DE5\u4F5C\u6D41\u4E14\u8FB9\u754C\u6E05\u6670"],avoidWhen:["\u76EE\u6807\u903B\u8F91\u5C1A\u672A\u5B58\u5728\u6216\u53EA\u4F7F\u7528\u4E00\u6B21"],keywords:["\u5B50\u6D41\u7A0B","\u590D\u7528","\u5DE5\u4F5C\u6D41"],sideEffectLevel:"local"}),b({category:"control",kind:"approval",id:"approval",label:"Approval",description:"\u6682\u505C\u5E76\u7B49\u5F85\u4EBA\u5DE5\u6279\u51C6\u6216\u62D2\u7EDD",paramsTemplate:{prompt:"Continue?"},outputSchema:{type:"object",properties:{approved:{type:"boolean"},decidedAt:{type:"string"},note:{type:"string"}},required:["approved","decidedAt"]},useWhen:["\u9AD8\u98CE\u9669\u5916\u90E8\u52A8\u4F5C\u524D\u786E\u5B9E\u9700\u8981\u4EBA\u5DE5\u51B3\u5B9A"],avoidWhen:["\u53EA\u8BFB\u3001\u4F4E\u98CE\u9669\u6216\u5B8C\u5168\u81EA\u52A8\u5316\u6B65\u9AA4"],keywords:["\u5BA1\u6279","\u786E\u8BA4","\u4EBA\u5DE5","\u6279\u51C6"],sideEffectLevel:"external",permissionHints:["\u4F1A\u5411\u7528\u6237\u53D1\u8D77\u4EBA\u5DE5\u5BA1\u6279"]}),b({category:"memory",kind:"memory",id:"memory.read",label:"Read memory",description:"\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6",paramsTemplate:{op:"read"},useWhen:["\u540E\u7EED\u6B65\u9AA4\u9700\u8981\u5DF2\u4FDD\u5B58\u7684\u9879\u76EE\u80CC\u666F"],avoidWhen:["\u4FE1\u606F\u53EA\u5728\u5F53\u524D\u4E0A\u6E38\u8F93\u51FA\u4E2D"],keywords:["\u8BB0\u5FC6","\u8BFB\u53D6","\u4E0A\u4E0B\u6587"],sideEffectLevel:"none"}),b({category:"memory",kind:"memory",id:"memory.write",label:"Write memory",description:"\u4FDD\u5B58\u5185\u5BB9\u5230\u9879\u76EE\u8BB0\u5FC6",paramsTemplate:{op:"write",value:""},useWhen:["\u7ED3\u679C\u9700\u8981\u8DE8\u8FD0\u884C\u4FDD\u7559"],avoidWhen:["\u4E34\u65F6\u4E2D\u95F4\u7ED3\u679C\u4E0D\u5E94\u957F\u671F\u4FDD\u5B58"],keywords:["\u8BB0\u5FC6","\u4FDD\u5B58","\u6C89\u6DC0"],sideEffectLevel:"local"}),b({category:"memory",kind:"memory",id:"memory.search",label:"Search memory",description:"\u5728\u9879\u76EE\u8BB0\u5FC6\u4E2D\u641C\u7D22",paramsTemplate:{op:"search",query:""},useWhen:["\u9700\u8981\u4ECE\u5386\u53F2\u9879\u76EE\u77E5\u8BC6\u4E2D\u68C0\u7D22\u76F8\u5173\u5185\u5BB9"],avoidWhen:["\u9700\u8981\u8054\u7F51\u641C\u7D22\u6216\u4ED3\u5E93\u4EE3\u7801\u68C0\u7D22"],keywords:["\u8BB0\u5FC6","\u641C\u7D22","\u5386\u53F2","\u77E5\u8BC6"],sideEffectLevel:"none"})];function Co(){return jo.map(n=>({...n,paramsTemplate:n.paramsTemplate?{...n.paramsTemplate}:void 0,paramsSchema:n.paramsSchema?{...n.paramsSchema}:void 0,inputSchema:n.inputSchema?{...n.inputSchema}:void 0,outputSchema:n.outputSchema?{...n.outputSchema}:void 0,inputPorts:n.inputPorts?.map(e=>({...e})),outputPorts:n.outputPorts?.map(e=>({...e}))}))}function Do(n){let e=n?.properties;return e&&typeof e=="object"&&!Array.isArray(e)?Object.keys(e):[]}function Wo(n){if(!n)return[];try{let e=JSON.parse(n),r=Object.values(e).find(Array.isArray)?.[0];return r&&typeof r=="object"&&!Array.isArray(r)?Object.keys(r):[]}catch{return[]}}function Mo(n,e){return n.kind==="agent"&&typeof n.params?.agentId=="string"?e.find(t=>t.category==="agent"&&t.id===n.params?.agentId):n.kind==="action"&&typeof n.params?.toolName=="string"?e.find(t=>t.category==="mcp"&&t.id===n.params?.toolName):n.kind==="channel"&&typeof n.params?.channel=="string"?e.find(t=>t.category==="channel"&&t.id===n.params?.channel):e.find(t=>t.kind===n.kind)}function Oo(n,e,t){let r=new Set([...Do(Mo(n,e)?.outputSchema),...Wo(t)]),o=n.params?.json;if(o&&typeof o=="object"&&!Array.isArray(o))for(let s of Object.keys(o))r.add(s);let i=n.params?.mapping;if(i&&typeof i=="object"&&!Array.isArray(i))for(let s of Object.keys(i))r.add(s);return n.kind==="aggregate"&&(r.add("items"),r.add("count")),[...r].slice(0,24)}function _o(n){let e=n.catalog??[],t=new Set(n.scope?.length?n.scope:n.def.nodes.map(d=>d.id)),r=new Set(t);if(n.scope?.length)for(let d of n.def.edges)t.has(d.from)&&r.add(d.to),t.has(d.to)&&r.add(d.from);let o=Math.max(1,n.maxNodes??48),i=n.def.nodes.filter(d=>r.has(d.id)).slice(0,o),s=new Set(i.map(d=>d.id)),a=n.def.edges.filter(d=>s.has(d.from)&&s.has(d.to)),u=new Map(n.def.nodes.map(d=>[d.id,d])),c={};for(let d of i)c[d.id]={upstream:n.def.edges.filter(f=>f.to===d.id).flatMap(f=>{let l=u.get(f.from);if(!l)return[];let m=Oo(l,e,n.latestRun?.nodes?.[l.id]?.preview);return[{nodeId:l.id,...l.name?{name:l.name}:{},fields:m,expressionExamples:m.map(h=>`{{ $node("${l.id}").output.default[0].json.${h} }}`).slice(0,8)}]})};let g=new Set([...s,...n.scope??[]]),p=Object.entries(n.latestRun?.nodes??{}).filter(([d])=>g.has(d)).map(([d,f])=>({nodeId:d,...f.preview?{preview:f.preview.slice(0,800)}:{},...f.error?{error:f.error.slice(0,400)}:{}}));return{workflowId:n.def.id,...n.trigger!==void 0?{trigger:n.trigger}:{},selectedNodeIds:[...t],nodes:i,edges:a,omittedNodeCount:Math.max(0,n.def.nodes.length-i.length),lineage:c,...n.latestRun?{latestRun:{status:n.latestRun.status,...n.latestRun.failedNodeId?{failedNodeId:n.latestRun.failedNodeId}:{},...n.latestRun.error?{error:n.latestRun.error.slice(0,500)}:{},nodeEvidence:p}}:{}}}var Ye=3,qo=/token|secret|authorization|api[-_]?key|apikey|password|credential|cookie|passphrase|private[-_]?key/i,Ho=new Set(["tool","skill","mcp"]);function te(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Uo(n){if(Ho.has(n.kind))throw new Error(`workflow bundle: node "${n.name??n.id}" uses unsupported non-canonical kind "${n.kind}"; use an Agent plugin or canonical Action node`)}function Ze(n,e,t){if(Array.isArray(n)){for(let r=0;r<n.length;r+=1)Ze(n[r],`${e}[${r}]`,t);return}if(te(n))for(let[r,o]of Object.entries(n)){if(qo.test(r)&&o!==void 0&&o!==null&&o!=="")throw new Error(`workflow bundle: node "${t.name??t.id}" contains embedded authentication or secret field "${e}.${r}"; configure it in the owning MCP or Provider module`);Ze(o,`${e}.${r}`,t)}}function Qe(n){for(let e of n.nodes)Uo(e),e.params!==void 0&&Ze(e.params,"params",e)}function ln(n){Qe(n);let e=new Map,t=(r,o)=>{let i=`${r.category}:${r.ref}`,s=e.get(i);s?s.nodeIds.includes(o)||s.nodeIds.push(o):e.set(i,{...r,nodeIds:[o]})};for(let r of n.nodes){let o=r.params??{};switch(r.kind){case"agent":{let i=Z(o.agentId);if(t({category:"agent",kind:"agent",ref:i,label:`Agent: ${i}`},r.id),Array.isArray(o.mcpPlugins))for(let s of o.mcpPlugins)!te(s)||typeof s.id!="string"||!s.id||t({category:"mcp",kind:"plugin",ref:s.id,label:`MCP plugin: ${s.id}`},r.id);break}case"action":{let i=typeof o.toolName=="string"?o.toolName:"";i&&t({category:"mcp",kind:"action",ref:i,label:`MCP action: ${i}`},r.id);break}case"channel":{let i=typeof o.channel=="string"?o.channel:"";i&&t({category:"channel",kind:"channel",ref:i,label:`Channel: ${i}`},r.id);break}case"memory":t({category:"memory",kind:"memory",ref:"memory",label:"Memory"},r.id);break;default:break}}return[...e.values()]}function Bo(n){Qe(n.def);let e=n.setup?H(n.setup,n.def):void 0,t=e?Yt(n.def,n.trigger,e):{def:structuredClone(n.def),trigger:n.trigger?structuredClone(n.trigger):void 0},r=t.def;return{schemaVersion:Ye,name:n.name,def:r,...t.trigger?{trigger:t.trigger}:{},concurrency:n.concurrency,requires:ln(r),...e?{setup:e}:{},meta:{source:"native"}}}function Fo(n){let e=typeof n=="string"?JSON.parse(n):n;if(!te(e))throw new Error("workflow bundle: payload must be an object");if(e.schemaVersion!==Ye)throw new Error(`workflow bundle: unsupported schemaVersion ${String(e.schemaVersion)} (expected ${Ye})`);if(typeof e.name!="string"||!e.name)throw new Error("workflow bundle: `name` is required");let t=e.def;if(!te(t)||!Array.isArray(t.nodes)||!Array.isArray(t.edges))throw new Error("workflow bundle: `def.nodes` and `def.edges` are required arrays");let r=e.concurrency;if(r!==void 0&&r!=="queue"&&r!=="skip"&&r!=="parallel")throw new Error(`workflow bundle: invalid concurrency "${String(r)}"`);let o=t;return Qe(o),{name:e.name,def:o,trigger:te(e.trigger)?e.trigger:void 0,concurrency:r,requires:ln(o),...e.setup!==void 0?{setup:H(e.setup,o)}:{}}}export{Ge as FileRunCheckpoint,yr as HOST_BACKED_KINDS,Y as NodeRegistry,P as PatchError,ze as WorkflowAuditStore,Be as WorkflowController,He as WorkflowRunHistoryStore,Q as WorkflowRuntime,Ve as WorkflowScheduler,Ee as WorkflowStore,Ce as applyPatch,qe as applyWorkflowTemplateSetup,_o as buildWorkflowEditContextCapsule,Co as builtinWorkflowCapabilities,wo as createQlaExecutorHost,ho as defaultRuntimeFactory,Fo as fromWorkflowBundle,ce as hostExecutors,zt as projectWorkflowTemplateSetup,De as renderWorkflow,Bo as toWorkflowBundle,H as validateWorkflowTemplateSetup,j as workflowsDir};
11
+ `)}return o.reverse().slice(0,t)}};var he={agent:{type:"object",required:["agentId","prompt"],properties:{prompt:{type:"string","x-widget":"textarea",description:"\u8BA9 AI \u505A\u4EC0\u4E48(\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38)"},agentId:{type:"string",description:"\u5FC5\u586B:\u660E\u786E\u6267\u884C\u8BE5\u8282\u70B9\u7684 agent id(self \u4E0D\u5408\u6CD5)"}}},action:{type:"object",required:["target","server","tool","toolName"],properties:{target:{type:"string",enum:["mcp"],description:"\u56FA\u5B9A\u4E3A mcp"},server:{type:"string",description:"MCP \u63D2\u4EF6/\u670D\u52A1\u5668 id"},tool:{type:"string",description:"MCP \u5DE5\u5177\u77ED\u540D"},toolName:{type:"string",description:"\u76EE\u5F55\u4E2D\u7684\u7CBE\u786E\u89C4\u8303\u5DE5\u5177\u540D"},args:{type:"object",description:"\u5DE5\u5177\u53C2\u6570"}}},http:{type:"object",required:["url"],properties:{method:{type:"string",enum:["GET","POST","PUT","PATCH","DELETE"],default:"GET",description:"\u8BF7\u6C42\u65B9\u6CD5"},url:{type:"string",description:"\u8BF7\u6C42\u5730\u5740,\u53EF\u7528 {{ $node(...) }} \u6A21\u677F"},headers:{type:"object",description:"\u8BF7\u6C42\u5934(\u952E\u503C\u5BF9\u5BF9\u8C61)"},body:{type:"string","x-widget":"textarea",description:"\u8BF7\u6C42\u4F53(\u6587\u672C/JSON \u5B57\u7B26\u4E32,\u53EF\u542B\u6A21\u677F\u8868\u8FBE\u5F0F)"}}},channel:{type:"object",required:["channel"],properties:{channel:{type:"string",description:"\u6E20\u9053\u540D,\u5982 feishu / wechat"},target:{type:"string",description:"\u76EE\u6807\u7FA4/\u7528\u6237 id(\u53EF\u9009)"},payload:{type:"string","x-widget":"textarea",description:"\u8981\u53D1\u9001\u7684\u5185\u5BB9,\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38"}}},memory:{type:"object",required:["op"],properties:{op:{type:"string",enum:["read","write","search"],description:"\u64CD\u4F5C"},key:{type:"string",description:"\u4E3B\u9898 key(\u53EF\u9009;\u7F3A\u7701\u64CD\u4F5C\u8BB0\u5FC6\u7D22\u5F15)"},value:{type:"string","x-widget":"textarea",description:"\u5199\u5165\u5185\u5BB9(write;\u7559\u7A7A\u53D6\u4E0A\u6E38\u8F93\u51FA)"},query:{type:"string",description:"\u641C\u7D22\u8BCD(search)"}}},if:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u6761\u4EF6\u8868\u8FBE\u5F0F;\u771F\u8D70 true \u7AEF\u53E3\u3001\u5047\u8D70 false \u7AEF\u53E3"}}},filter:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u9010\u6761\u4FDD\u7559\u6761\u4EF6($json \u6307\u5F53\u524D\u6761);\u771F\u4FDD\u7559\u3001\u5047\u4E22\u5F03"}}},switch:{type:"object",required:["cases"],properties:{cases:{type:"array",description:"[{ port, condition }];\u9996\u4E2A\u4E3A\u771F\u7684\u5206\u652F\u751F\u6548"},defaultPort:{type:"string",default:"default",description:"\u90FD\u4E0D\u547D\u4E2D\u65F6\u8D70\u7684\u7AEF\u53E3"}}},transform:{type:"object",required:["mapping"],properties:{mapping:{type:"object",description:'\u9010\u6761\u6620\u5C04 { \u8F93\u51FA\u5B57\u6BB5: "{{ $json.\u5B57\u6BB5 }}" }'}}},aggregate:{type:"object",properties:{}},merge:{type:"object",properties:{}},passthrough:{type:"object",properties:{}},set:{type:"object",properties:{json:{type:"object",description:"\u4EA7\u51FA\u7684\u4E00\u6761\u56FA\u5B9A/\u8868\u8FBE\u5F0F\u6570\u636E"}}},wait:{type:"object",properties:{until:{type:"string",enum:["delay","webhook"],default:"delay",description:"\u7B49\u5F85\u65B9\u5F0F"},ms:{type:"integer",minimum:1,maximum:36e5,description:"\u5EF6\u65F6\u6BEB\u79D2(delay \u6A21\u5F0F,1..3600000)"},path:{type:"string",description:"\u7B49\u5F85\u7684 webhook \u8DEF\u5F84(webhook \u6A21\u5F0F)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u6BEB\u79D2(webhook \u6A21\u5F0F;\u9ED8\u8BA4 24h)"}}},subworkflow:{type:"object",required:["workflowId"],properties:{workflowId:{type:"string",description:"\u8981\u8C03\u7528\u7684\u5DE5\u4F5C\u6D41 id"},projectId:{type:"string",description:"\u8DE8\u9879\u76EE\u76EE\u6807(\u53EF\u9009)"},payload:{type:"object",description:"\u4F20\u5165\u5B50\u6D41\u7A0B\u7684 $trigger \u8F7D\u8377(\u53EF\u9009)"}}},approval:{type:"object",properties:{prompt:{type:"string",description:"\u5BA1\u6279\u95EE\u9898(\u9ED8\u8BA4 \u7EE7\u7EED\u6267\u884C?)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u81EA\u52A8\u62D2(\u6BEB\u79D2;\u9ED8\u8BA4 24h)"},timeoutAction:{type:"string",enum:["approve","reject","keepPending"],description:"\u8D85\u65F6\u7B56\u7565(\u9ED8\u8BA4 reject):reject \u62D2\u7EDD\u5E76\u901A\u77E5 owner(\u975E\u9759\u9ED8) / approve \u81EA\u52A8\u6279\u51C6 / keepPending \u4FDD\u6301\u6302\u8D77\u5F85\u4EBA\u5DE5\u51B3\u5B9A"}}}};var dn={type:"object",additionalProperties:!0},No=[{name:"default",type:"any"}];function k(n){return{...n,paramsSchema:he[n.kind],inputSchema:dn,outputSchema:n.outputSchema??dn,inputPorts:[{name:"default",type:"any",required:n.kind!=="set"}],outputPorts:n.outputPorts??No,requiredParams:Array.isArray(he[n.kind]?.required)?he[n.kind].required:[]}}var To=[k({category:"action",kind:"action",id:"action",label:"Action",description:"\u7CBE\u786E\u8C03\u7528\u76EE\u5F55\u4E2D\u7684\u4E00\u4E2A MCP \u5DE5\u5177",paramsTemplate:{target:"mcp",server:"",tool:"",toolName:"",args:{}},useWhen:["\u5DF2\u660E\u786E\u5177\u4F53 MCP \u5DE5\u5177\u5E76\u9700\u8981\u786E\u5B9A\u6027\u8C03\u7528"],avoidWhen:["\u5C1A\u672A\u9009\u62E9\u5177\u4F53\u5DE5\u5177\u6216\u4EFB\u52A1\u9700\u8981\u5F00\u653E\u5F0F\u63A8\u7406"],keywords:["MCP","\u5DE5\u5177","\u52A8\u4F5C","\u8C03\u7528"],sideEffectLevel:"external",constraints:["\u4F18\u5148\u9009\u62E9\u5177\u4F53 MCP capabilityId\uFF0C\u800C\u4E0D\u662F\u7A7A\u767D action"]}),k({category:"control",kind:"http",id:"http",label:"HTTP",description:"\u8C03\u7528 HTTP API \u6216\u8BFB\u53D6\u516C\u5F00 URL\uFF1B\u54CD\u5E94\u56FA\u5B9A\u5305\u88C5\u4E3A {status, ok, headers, body}\uFF0C\u4E1A\u52A1\u5B57\u6BB5\u4ECE $json.body \u8BFB\u53D6",paramsTemplate:{method:"GET",url:""},outputSchema:{type:"object",properties:{status:{type:"integer"},ok:{type:"boolean"},headers:{type:"object",additionalProperties:{type:"string"}},body:{type:["object","array","string","number","boolean","null"]}},required:["status","ok","body"]},useWhen:["\u5DF2\u77E5 URL/API \u4E14\u53EF\u76F4\u63A5\u8BF7\u6C42","\u540E\u7EED\u8868\u8FBE\u5F0F\u7528 $json.body.<field> \u5F15\u7528 JSON \u54CD\u5E94\u4E1A\u52A1\u5B57\u6BB5"],avoidWhen:["\u9875\u9762\u9700\u8981\u767B\u5F55\u3001\u6D4F\u89C8\u5668\u4EA4\u4E92\u6216\u5B58\u5728\u53CD\u722C\u9650\u5236"],keywords:["HTTP","API","URL","\u8BF7\u6C42","\u6293\u53D6","\u65B0\u95FB"],sideEffectLevel:"external",permissionHints:["\u8054\u7F51\u8BF7\u6C42\u53EF\u80FD\u89E6\u53D1\u7F51\u7EDC\u6743\u9650"],constraints:["\u4E0B\u6E38\u4E0D\u5F97\u628A\u54CD\u5E94 body \u7684\u5B57\u6BB5\u8BEF\u5199\u6210 $json.<field>\uFF1B\u5E94\u4F7F\u7528 $json.body.<field>"]}),k({category:"control",kind:"if",id:"if",label:"Condition",description:"\u6309\u4E00\u4E2A\u5E03\u5C14\u6761\u4EF6\u5206\u6210 true/false \u4E24\u8DEF",paramsTemplate:{condition:""},useWhen:["\u9700\u8981\u4E8C\u9009\u4E00\u6761\u4EF6\u5206\u652F"],avoidWhen:["\u9700\u8981\u4E09\u4E2A\u4EE5\u4E0A\u5206\u652F\u65F6\u4F7F\u7528 switch"],keywords:["\u6761\u4EF6","\u5982\u679C","\u5224\u65AD","\u5206\u652F"],sideEffectLevel:"none",outputPorts:[{name:"true",type:"any"},{name:"false",type:"any"}]}),k({category:"control",kind:"switch",id:"switch",label:"Switch",description:"\u6309\u591A\u7EC4\u6761\u4EF6\u5206\u6D41",paramsTemplate:{cases:[{port:"case1",condition:""}],defaultPort:"default"},useWhen:["\u9700\u8981\u4E09\u4E2A\u4EE5\u4E0A\u4E92\u65A5\u6216\u4F18\u5148\u5339\u914D\u5206\u652F"],avoidWhen:["\u4EC5 true/false \u4E24\u8DEF\u65F6\u4F7F\u7528 if"],keywords:["\u591A\u8DEF","\u5206\u652F","\u8DEF\u7531","\u5206\u7C7B"],sideEffectLevel:"none"}),k({category:"control",kind:"filter",id:"filter",label:"Filter",description:"\u9010\u6761\u4FDD\u7559\u6EE1\u8DB3\u6761\u4EF6\u7684\u6570\u636E",paramsTemplate:{condition:""},useWhen:["\u9700\u8981\u8FC7\u6EE4\u5217\u8868\u4E2D\u7684\u9879\u76EE"],avoidWhen:["\u9700\u8981\u5BF9\u6574\u6279\u6570\u636E\u505A\u6C47\u603B"],keywords:["\u8FC7\u6EE4","\u7B5B\u9009","\u4FDD\u7559","\u5254\u9664"],sideEffectLevel:"none"}),k({category:"control",kind:"transform",id:"transform",label:"Transform",description:"\u9010\u6761\u6620\u5C04\u6216\u91CD\u547D\u540D\u5B57\u6BB5",paramsTemplate:{mapping:{}},useWhen:["\u5B57\u6BB5\u6620\u5C04\u89C4\u5219\u53EF\u4EE5\u786E\u5B9A\u8868\u8FBE"],avoidWhen:["\u8F6C\u6362\u9700\u8981\u8BED\u4E49\u7406\u89E3\u6216\u81EA\u7531\u6587\u672C\u751F\u6210\u65F6\u4F7F\u7528 Agent"],keywords:["\u5B57\u6BB5","\u8F6C\u6362","\u6620\u5C04","\u683C\u5F0F"],sideEffectLevel:"none"}),k({category:"control",kind:"aggregate",id:"aggregate",label:"Aggregate",description:"\u628A\u591A\u6761\u8F93\u5165\u6536\u62E2\u4E3A\u4E00\u6761\u6279\u6B21",paramsTemplate:{},outputSchema:{type:"object",properties:{items:{type:"array"},count:{type:"integer"}},required:["items","count"]},useWhen:["\u591A\u6765\u6E90\u7ED3\u679C\u9700\u8981\u5148\u6C47\u603B\u518D\u7EE7\u7EED\u5904\u7406"],avoidWhen:["\u4ECD\u9700\u9010\u6761\u5E76\u884C\u5904\u7406"],keywords:["\u6C47\u603B","\u805A\u5408","\u5408\u5E76\u65B0\u95FB\u6E90","\u6536\u62E2"],sideEffectLevel:"none"}),k({category:"control",kind:"passthrough",id:"passthrough",label:"Passthrough",description:"\u4E0D\u6539\u53D8\u6570\u636E\u7684\u7ED3\u6784\u5360\u4F4D\u6216\u8FDE\u7EBF\u8282\u70B9",paramsTemplate:{},useWhen:["\u9700\u8981\u663E\u5F0F\u6D41\u7A0B\u8FB9\u754C\u4F46\u4E0D\u8F6C\u6362\u6570\u636E"],avoidWhen:["\u5DF2\u6709\u66F4\u5177\u4F53\u7684\u5904\u7406\u80FD\u529B"],keywords:["\u539F\u6837","\u4F20\u9012","\u5360\u4F4D"],sideEffectLevel:"none"}),k({category:"control",kind:"set",id:"set",label:"Set",description:"\u751F\u6210\u56FA\u5B9A\u5BF9\u8C61\u6216\u8BBE\u7F6E\u786E\u5B9A\u5B57\u6BB5",paramsTemplate:{json:{}},useWhen:["\u9700\u8981\u6CE8\u5165\u56FA\u5B9A\u914D\u7F6E\u6216\u5E38\u91CF\u5B57\u6BB5"],avoidWhen:["\u503C\u4F9D\u8D56\u5F00\u653E\u5F0F\u8BED\u4E49\u751F\u6210"],keywords:["\u8D4B\u503C","\u8BBE\u7F6E","\u5E38\u91CF"],sideEffectLevel:"none"}),k({category:"control",kind:"merge",id:"merge",label:"Merge",description:"\u5408\u5E76\u591A\u4E2A\u5BF9\u8C61\u5B57\u6BB5",paramsTemplate:{},useWhen:["\u591A\u4E2A\u5BF9\u8C61\u9700\u8981\u5408\u5E76\u6210\u4E00\u4E2A\u5BF9\u8C61"],avoidWhen:["\u591A\u6761\u5217\u8868\u9700\u8981\u6536\u62E2\u65F6\u4F7F\u7528 aggregate"],keywords:["\u5408\u5E76","\u5BF9\u8C61","\u5B57\u6BB5"],sideEffectLevel:"none"}),k({category:"control",kind:"wait",id:"wait",label:"Wait",description:"\u5EF6\u65F6\u6216\u7B49\u5F85 webhook",paramsTemplate:{until:"delay",ms:6e4},useWhen:["\u540E\u7EED\u6B65\u9AA4\u5FC5\u987B\u5EF6\u8FDF\u6216\u7B49\u5F85\u5916\u90E8\u56DE\u8C03"],avoidWhen:["\u53EA\u9700\u6309\u8BA1\u5212\u542F\u52A8\u6D41\u7A0B\u65F6\u4F7F\u7528 schedule trigger"],keywords:["\u7B49\u5F85","\u5EF6\u65F6","\u7A0D\u540E","\u56DE\u8C03"],sideEffectLevel:"none"}),k({category:"control",kind:"subworkflow",id:"subworkflow",label:"Subworkflow",description:"\u8C03\u7528\u4E00\u4E2A\u5DF2\u5B58\u5728\u7684\u5DE5\u4F5C\u6D41",paramsTemplate:{workflowId:""},useWhen:["\u5DF2\u6709\u53EF\u590D\u7528\u5DE5\u4F5C\u6D41\u4E14\u8FB9\u754C\u6E05\u6670"],avoidWhen:["\u76EE\u6807\u903B\u8F91\u5C1A\u672A\u5B58\u5728\u6216\u53EA\u4F7F\u7528\u4E00\u6B21"],keywords:["\u5B50\u6D41\u7A0B","\u590D\u7528","\u5DE5\u4F5C\u6D41"],sideEffectLevel:"local"}),k({category:"control",kind:"approval",id:"approval",label:"Approval",description:"\u6682\u505C\u5E76\u7B49\u5F85\u4EBA\u5DE5\u6279\u51C6\u6216\u62D2\u7EDD",paramsTemplate:{prompt:"Continue?"},outputSchema:{type:"object",properties:{approved:{type:"boolean"},decidedAt:{type:"string"},note:{type:"string"}},required:["approved","decidedAt"]},useWhen:["\u9AD8\u98CE\u9669\u5916\u90E8\u52A8\u4F5C\u524D\u786E\u5B9E\u9700\u8981\u4EBA\u5DE5\u51B3\u5B9A"],avoidWhen:["\u53EA\u8BFB\u3001\u4F4E\u98CE\u9669\u6216\u5B8C\u5168\u81EA\u52A8\u5316\u6B65\u9AA4"],keywords:["\u5BA1\u6279","\u786E\u8BA4","\u4EBA\u5DE5","\u6279\u51C6"],sideEffectLevel:"external",permissionHints:["\u4F1A\u5411\u7528\u6237\u53D1\u8D77\u4EBA\u5DE5\u5BA1\u6279"]}),k({category:"memory",kind:"memory",id:"memory.read",label:"Read memory",description:"\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6",paramsTemplate:{op:"read"},useWhen:["\u540E\u7EED\u6B65\u9AA4\u9700\u8981\u5DF2\u4FDD\u5B58\u7684\u9879\u76EE\u80CC\u666F"],avoidWhen:["\u4FE1\u606F\u53EA\u5728\u5F53\u524D\u4E0A\u6E38\u8F93\u51FA\u4E2D"],keywords:["\u8BB0\u5FC6","\u8BFB\u53D6","\u4E0A\u4E0B\u6587"],sideEffectLevel:"none"}),k({category:"memory",kind:"memory",id:"memory.write",label:"Write memory",description:"\u4FDD\u5B58\u5185\u5BB9\u5230\u9879\u76EE\u8BB0\u5FC6",paramsTemplate:{op:"write",value:""},useWhen:["\u7ED3\u679C\u9700\u8981\u8DE8\u8FD0\u884C\u4FDD\u7559"],avoidWhen:["\u4E34\u65F6\u4E2D\u95F4\u7ED3\u679C\u4E0D\u5E94\u957F\u671F\u4FDD\u5B58"],keywords:["\u8BB0\u5FC6","\u4FDD\u5B58","\u6C89\u6DC0"],sideEffectLevel:"local"}),k({category:"memory",kind:"memory",id:"memory.search",label:"Search memory",description:"\u5728\u9879\u76EE\u8BB0\u5FC6\u4E2D\u641C\u7D22",paramsTemplate:{op:"search",query:""},useWhen:["\u9700\u8981\u4ECE\u5386\u53F2\u9879\u76EE\u77E5\u8BC6\u4E2D\u68C0\u7D22\u76F8\u5173\u5185\u5BB9"],avoidWhen:["\u9700\u8981\u8054\u7F51\u641C\u7D22\u6216\u4ED3\u5E93\u4EE3\u7801\u68C0\u7D22"],keywords:["\u8BB0\u5FC6","\u641C\u7D22","\u5386\u53F2","\u77E5\u8BC6"],sideEffectLevel:"none"})];function $o(){return To.map(n=>({...n,paramsTemplate:n.paramsTemplate?{...n.paramsTemplate}:void 0,paramsSchema:n.paramsSchema?{...n.paramsSchema}:void 0,inputSchema:n.inputSchema?{...n.inputSchema}:void 0,outputSchema:n.outputSchema?{...n.outputSchema}:void 0,inputPorts:n.inputPorts?.map(e=>({...e})),outputPorts:n.outputPorts?.map(e=>({...e}))}))}function jo(n){let e=n?.properties;return e&&typeof e=="object"&&!Array.isArray(e)?Object.keys(e):[]}function Co(n){if(!n)return[];try{let e=JSON.parse(n),r=Object.values(e).find(Array.isArray)?.[0];return r&&typeof r=="object"&&!Array.isArray(r)?Object.keys(r):[]}catch{return[]}}function Do(n,e){return n.kind==="agent"&&typeof n.params?.agentId=="string"?e.find(t=>t.category==="agent"&&t.id===n.params?.agentId):n.kind==="action"&&typeof n.params?.toolName=="string"?e.find(t=>t.category==="mcp"&&t.id===n.params?.toolName):n.kind==="channel"&&typeof n.params?.channel=="string"?e.find(t=>t.category==="channel"&&t.id===n.params?.channel):e.find(t=>t.kind===n.kind)}function Wo(n,e,t){let r=new Set([...jo(Do(n,e)?.outputSchema),...Co(t)]),o=n.params?.json;if(o&&typeof o=="object"&&!Array.isArray(o))for(let s of Object.keys(o))r.add(s);let i=n.params?.mapping;if(i&&typeof i=="object"&&!Array.isArray(i))for(let s of Object.keys(i))r.add(s);return n.kind==="aggregate"&&(r.add("items"),r.add("count")),[...r].slice(0,24)}function Mo(n){let e=n.catalog??[],t=new Set(n.scope?.length?n.scope:n.def.nodes.map(d=>d.id)),r=new Set(t);if(n.scope?.length)for(let d of n.def.edges)t.has(d.from)&&r.add(d.to),t.has(d.to)&&r.add(d.from);let o=Math.max(1,n.maxNodes??48),i=n.def.nodes.filter(d=>r.has(d.id)).slice(0,o),s=new Set(i.map(d=>d.id)),a=n.def.edges.filter(d=>s.has(d.from)&&s.has(d.to)),u=new Map(n.def.nodes.map(d=>[d.id,d])),c={};for(let d of i)c[d.id]={upstream:n.def.edges.filter(f=>f.to===d.id).flatMap(f=>{let l=u.get(f.from);if(!l)return[];let m=Wo(l,e,n.latestRun?.nodes?.[l.id]?.preview);return[{nodeId:l.id,...l.name?{name:l.name}:{},fields:m,expressionExamples:m.map(h=>`{{ $node("${l.id}").output.default[0].json.${h} }}`).slice(0,8)}]})};let g=new Set([...s,...n.scope??[]]),p=Object.entries(n.latestRun?.nodes??{}).filter(([d])=>g.has(d)).map(([d,f])=>({nodeId:d,...f.preview?{preview:f.preview.slice(0,800)}:{},...f.error?{error:f.error.slice(0,400)}:{}}));return{workflowId:n.def.id,...n.trigger!==void 0?{trigger:n.trigger}:{},selectedNodeIds:[...t],nodes:i,edges:a,omittedNodeCount:Math.max(0,n.def.nodes.length-i.length),lineage:c,...n.latestRun?{latestRun:{status:n.latestRun.status,...n.latestRun.failedNodeId?{failedNodeId:n.latestRun.failedNodeId}:{},...n.latestRun.error?{error:n.latestRun.error.slice(0,500)}:{},nodeEvidence:p}}:{}}}var Ye=3,Oo=/token|secret|authorization|api[-_]?key|apikey|password|credential|cookie|passphrase|private[-_]?key/i,_o=new Set(["tool","skill","mcp"]);function te(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function qo(n){if(_o.has(n.kind))throw new Error(`workflow bundle: node "${n.name??n.id}" uses unsupported non-canonical kind "${n.kind}"; use an Agent plugin or canonical Action node`)}function Ze(n,e,t){if(Array.isArray(n)){for(let r=0;r<n.length;r+=1)Ze(n[r],`${e}[${r}]`,t);return}if(te(n))for(let[r,o]of Object.entries(n)){if(Oo.test(r)&&o!==void 0&&o!==null&&o!=="")throw new Error(`workflow bundle: node "${t.name??t.id}" contains embedded authentication or secret field "${e}.${r}"; configure it in the owning MCP or Provider module`);Ze(o,`${e}.${r}`,t)}}function Qe(n){for(let e of n.nodes)qo(e),e.params!==void 0&&Ze(e.params,"params",e)}function un(n){Qe(n);let e=new Map,t=(r,o)=>{let i=`${r.category}:${r.ref}`,s=e.get(i);s?s.nodeIds.includes(o)||s.nodeIds.push(o):e.set(i,{...r,nodeIds:[o]})};for(let r of n.nodes){let o=r.params??{};switch(r.kind){case"agent":{let i=Z(o.agentId);if(t({category:"agent",kind:"agent",ref:i,label:`Agent: ${i}`},r.id),Array.isArray(o.mcpPlugins))for(let s of o.mcpPlugins)!te(s)||typeof s.id!="string"||!s.id||t({category:"mcp",kind:"plugin",ref:s.id,label:`MCP plugin: ${s.id}`},r.id);break}case"action":{let i=typeof o.toolName=="string"?o.toolName:"";i&&t({category:"mcp",kind:"action",ref:i,label:`MCP action: ${i}`},r.id);break}case"channel":{let i=typeof o.channel=="string"?o.channel:"";i&&t({category:"channel",kind:"channel",ref:i,label:`Channel: ${i}`},r.id);break}case"memory":t({category:"memory",kind:"memory",ref:"memory",label:"Memory"},r.id);break;default:break}}return[...e.values()]}function Ho(n){Qe(n.def);let e=n.setup?H(n.setup,n.def):void 0,t=e?Gt(n.def,n.trigger,e):{def:structuredClone(n.def),trigger:n.trigger?structuredClone(n.trigger):void 0},r=t.def;return{schemaVersion:Ye,name:n.name,def:r,...t.trigger?{trigger:t.trigger}:{},concurrency:n.concurrency,requires:un(r),...e?{setup:e}:{},meta:{source:"native"}}}function Uo(n){let e=typeof n=="string"?JSON.parse(n):n;if(!te(e))throw new Error("workflow bundle: payload must be an object");if(e.schemaVersion!==Ye)throw new Error(`workflow bundle: unsupported schemaVersion ${String(e.schemaVersion)} (expected ${Ye})`);if(typeof e.name!="string"||!e.name)throw new Error("workflow bundle: `name` is required");let t=e.def;if(!te(t)||!Array.isArray(t.nodes)||!Array.isArray(t.edges))throw new Error("workflow bundle: `def.nodes` and `def.edges` are required arrays");let r=e.concurrency;if(r!==void 0&&r!=="queue"&&r!=="skip"&&r!=="parallel")throw new Error(`workflow bundle: invalid concurrency "${String(r)}"`);let o=t;return Qe(o),{name:e.name,def:o,trigger:te(e.trigger)?e.trigger:void 0,concurrency:r,requires:un(o),...e.setup!==void 0?{setup:H(e.setup,o)}:{}}}export{Ge as FileRunCheckpoint,hr as HOST_BACKED_KINDS,Y as NodeRegistry,P as PatchError,ze as WorkflowAuditStore,Be as WorkflowController,He as WorkflowRunHistoryStore,Q as WorkflowRuntime,Ve as WorkflowScheduler,Ee as WorkflowStore,Ce as applyPatch,qe as applyWorkflowTemplateSetup,Mo as buildWorkflowEditContextCapsule,$o as builtinWorkflowCapabilities,mo as createQlaExecutorHost,go as defaultRuntimeFactory,Uo as fromWorkflowBundle,ce as hostExecutors,Vt as projectWorkflowTemplateSetup,De as renderWorkflow,Ho as toWorkflowBundle,H as validateWorkflowTemplateSetup,$ as workflowsDir};