qlogicagent 2.20.2 → 2.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-contract.js +1 -1
- package/dist/agent.js +39 -35
- package/dist/cli.js +1 -1
- package/dist/host-contract.js +1 -1
- package/dist/host-session-collection-contract.js +1 -1
- package/dist/index.js +624 -549
- package/dist/memory-category-contract.js +1 -0
- package/dist/orchestration.js +1 -1
- package/dist/project-memory-host.js +21 -21
- package/dist/protocol.js +1 -1
- package/dist/skill-category-contract.js +1 -0
- package/dist/skills/builtin/web-research/SKILL.md +37 -0
- package/dist/skills/mcp/astraclaw-native-mcp-server.js +1 -1
- package/dist/tunables.js +1 -1
- package/dist/types/agent/memory-recall-context.d.ts +6 -9
- package/dist/types/agent/memory-recall-injection.d.ts +1 -6
- package/dist/types/agent/tool-loop/agent-argument-normalizer.d.ts +12 -0
- package/dist/types/agent/tool-loop/artifact-final-contract.d.ts +8 -0
- package/dist/types/agent/tool-loop.d.ts +5 -0
- package/dist/types/agent/types.d.ts +5 -0
- package/dist/types/cli/acp-extended-handlers.d.ts +11 -9
- package/dist/types/cli/acp-session-handlers.d.ts +1 -1
- package/dist/types/cli/acp-session-host.d.ts +8 -0
- package/dist/types/cli/agent-runtime-bootstrap.d.ts +7 -1
- package/dist/types/cli/agent-runtime-session-state.d.ts +23 -6
- package/dist/types/cli/atomic-text-file.d.ts +31 -0
- package/dist/types/cli/background-context-capsule.d.ts +12 -0
- package/dist/types/cli/base-tool-bootstrap.d.ts +1 -0
- package/dist/types/cli/cli-acp-request-handler.d.ts +3 -1
- package/dist/types/cli/community-workflow-installer.d.ts +1 -1
- package/dist/types/cli/core-tool-coordinator.d.ts +1 -0
- package/dist/types/cli/core-tools/agent-tool-service.d.ts +17 -1
- package/dist/types/cli/dev-tool-bootstrap.d.ts +3 -2
- package/dist/types/cli/dev-tools/dev-tool-bootstrap-service.d.ts +1 -0
- package/dist/types/cli/dev-tools/dev-tool-registry.d.ts +3 -1
- package/dist/types/cli/dev-tools/incremental-repo-map.d.ts +81 -0
- package/dist/types/cli/dev-tools/lsp-supervisor.d.ts +59 -0
- package/dist/types/cli/dev-tools/lsp-tool-service.d.ts +2 -0
- package/dist/types/cli/handlers/dream-handler.d.ts +1 -1
- package/dist/types/cli/handlers/memory-handler.d.ts +2 -14
- package/dist/types/cli/handlers/product-handler.d.ts +6 -24
- package/dist/types/cli/handlers/turn-handler.d.ts +1 -0
- package/dist/types/cli/idle-dream-coordinator.d.ts +9 -5
- package/dist/types/cli/memory-background-coordinator.d.ts +26 -0
- package/dist/types/cli/memory-candidate-service.d.ts +2 -3
- package/dist/types/cli/memory-coordinator.d.ts +12 -8
- package/dist/types/cli/permission-bootstrap.d.ts +10 -1
- package/dist/types/cli/product-acp-params.d.ts +29 -0
- package/dist/types/cli/resolved-agent-cache.d.ts +18 -7
- package/dist/types/cli/rpc-registry.d.ts +2 -1
- package/dist/types/cli/runtime-hook-bootstrap.d.ts +2 -0
- package/dist/types/cli/stdio-acp-request-host.d.ts +7 -4
- package/dist/types/cli/stdio-agent-session-bootstrap.d.ts +8 -2
- package/dist/types/cli/stdio-rpc-handler-hosts.d.ts +4 -2
- package/dist/types/cli/stdio-runtime-bootstrap.d.ts +1 -0
- package/dist/types/cli/stdio-server.d.ts +49 -16
- package/dist/types/cli/stdio-session-runtime-coordinator.d.ts +0 -2
- package/dist/types/cli/task-distillation-coordinator.d.ts +42 -14
- package/dist/types/cli/tool-bootstrap-core-registration.d.ts +14 -4
- package/dist/types/cli/tool-bootstrap.d.ts +2 -1
- package/dist/types/cli/turn-core.d.ts +4 -0
- package/dist/types/cli/turn-lifecycle.d.ts +1 -0
- package/dist/types/contracts/hooks.d.ts +3 -2
- package/dist/types/contracts/turn-event.d.ts +7 -0
- package/dist/types/host-contract/index.d.ts +111 -12
- package/dist/types/host-contract/memory-category.d.ts +8 -0
- package/dist/types/host-contract/skill-category.d.ts +5 -0
- package/dist/types/host-session-collection-contract.d.ts +1 -0
- package/dist/types/orchestration/agent-instance.d.ts +15 -0
- package/dist/types/orchestration/dag-scheduler.d.ts +18 -0
- package/dist/types/orchestration/delegate-approval-policy.d.ts +8 -0
- package/dist/types/orchestration/goal-acceptance.d.ts +2 -5
- package/dist/types/orchestration/goal-loop-coordinator.d.ts +4 -2
- package/dist/types/orchestration/goal-mode-adapters.d.ts +16 -0
- package/dist/types/orchestration/goal-run-types.d.ts +6 -1
- package/dist/types/orchestration/product-budget.d.ts +35 -16
- package/dist/types/orchestration/product-persistence.d.ts +5 -14
- package/dist/types/orchestration/product-planner.d.ts +38 -0
- package/dist/types/orchestration/product-worktree.d.ts +4 -2
- package/dist/types/orchestration/solo-evaluator.d.ts +42 -2
- package/dist/types/orchestration/solo-spec-builder.d.ts +3 -0
- package/dist/types/orchestration/testing/delegate-test-bridge.d.ts +6 -0
- package/dist/types/orchestration/testing/run-state-client-double.d.ts +13 -0
- package/dist/types/orchestration/workflow/builtin-capabilities.d.ts +3 -0
- package/dist/types/orchestration/workflow/capability-catalog.d.ts +31 -0
- package/dist/types/orchestration/workflow/cron-schedule.d.ts +3 -4
- package/dist/types/orchestration/workflow/expression.d.ts +2 -1
- package/dist/types/orchestration/workflow/n8n-import.d.ts +3 -0
- package/dist/types/orchestration/workflow/node-registry.d.ts +2 -2
- package/dist/types/orchestration/workflow/node-schema.d.ts +20 -4
- package/dist/types/orchestration/workflow/params-schema.d.ts +7 -6
- package/dist/types/orchestration/workflow/qla-executor-host.d.ts +4 -1
- package/dist/types/orchestration/workflow/run-history-store.d.ts +33 -3
- package/dist/types/orchestration/workflow/semantic-acceptance.d.ts +65 -0
- package/dist/types/orchestration/workflow/workflow-authoring.d.ts +74 -0
- package/dist/types/orchestration/workflow/workflow-bundle.d.ts +4 -0
- package/dist/types/orchestration/workflow/workflow-controller.d.ts +16 -4
- package/dist/types/orchestration/workflow/workflow-edit-context.d.ts +46 -0
- package/dist/types/orchestration/workflow/workflow-intent-contract.d.ts +56 -0
- package/dist/types/orchestration/workflow/workflow-patch.d.ts +7 -0
- package/dist/types/orchestration/workflow/workflow-runtime.d.ts +5 -0
- package/dist/types/orchestration/workflow/workflow-scheduler.d.ts +11 -0
- package/dist/types/orchestration/workflow/workflow-store.d.ts +5 -0
- package/dist/types/orchestration/workflow/workflow-template-setup.d.ts +65 -0
- package/dist/types/orchestration/workflow/workflow-trigger.d.ts +4 -0
- package/dist/types/orchestration/workflow-chat-builder.d.ts +105 -20
- package/dist/types/orchestration/worktree-task-prompt.d.ts +1 -0
- package/dist/types/protocol/agent-contract.d.ts +49 -8
- package/dist/types/protocol/notifications.d.ts +1 -1
- package/dist/types/protocol/wire/acp-agent-management.d.ts +97 -9
- package/dist/types/protocol/wire/acp-protocol.d.ts +7 -1
- package/dist/types/protocol/wire/agent-methods.d.ts +15 -1
- package/dist/types/protocol/wire/index.d.ts +2 -4
- package/dist/types/protocol/wire/memory-provider-lifecycle.d.ts +1 -39
- package/dist/types/protocol/wire/notification-payloads.d.ts +96 -1
- package/dist/types/protocol/wire/web-capability.d.ts +2 -2
- package/dist/types/runtime/config/tunable-defaults.d.ts +0 -6
- package/dist/types/runtime/execution/bounded-output-tail.d.ts +7 -0
- package/dist/types/runtime/execution/dream-agent.d.ts +8 -5
- package/dist/types/runtime/execution/dream-category-context.d.ts +3 -3
- package/dist/types/runtime/execution/structured-tool-progress.d.ts +21 -0
- package/dist/types/runtime/hooks/memory-hooks.d.ts +20 -8
- package/dist/types/runtime/infra/background-tasks.d.ts +5 -1
- package/dist/types/runtime/infra/subagent-turn-snapshot.d.ts +32 -0
- package/dist/types/runtime/infra/turn-telemetry-store.d.ts +22 -0
- package/dist/types/runtime/memory/implicit-extraction.d.ts +23 -7
- package/dist/types/runtime/ports/agent-runtime-ports.d.ts +0 -5
- package/dist/types/runtime/ports/index.d.ts +2 -3
- package/dist/types/runtime/ports/memory-provider.d.ts +31 -16
- package/dist/types/runtime/ports/memory-writer.d.ts +55 -6
- package/dist/types/runtime/ports/permission-contracts.d.ts +2 -0
- package/dist/types/runtime/ports/tool-contracts.d.ts +3 -1
- package/dist/types/runtime/prompt/identity-section.d.ts +2 -0
- package/dist/types/runtime/session/session-permission-store.d.ts +6 -0
- package/dist/types/runtime/tasks/task-types.d.ts +2 -0
- package/dist/types/skills/memory/host-memory-provider.d.ts +59 -9
- package/dist/types/skills/memory/memory-tool.d.ts +3 -1
- package/dist/types/skills/memory/task-distillation.d.ts +22 -3
- package/dist/types/skills/permissions/hook-runner.d.ts +8 -0
- package/dist/types/skills/permissions/operation-classifier.d.ts +7 -0
- package/dist/types/skills/skill-system/skill-category.d.ts +10 -0
- package/dist/types/skills/tools/agent-tool.d.ts +13 -21
- package/dist/types/skills/tools/edit-tool.d.ts +10 -2
- package/dist/types/skills/tools/exec-tool.d.ts +2 -2
- package/dist/types/skills/tools/file-text-snapshot.d.ts +24 -0
- package/dist/types/skills/tools/lsp-tool.d.ts +1 -1
- package/dist/types/skills/tools/patch-tool.d.ts +10 -3
- package/dist/types/skills/tools/read-tool.d.ts +23 -1
- package/dist/types/skills/tools/repo-map-tool.d.ts +52 -0
- package/dist/types/skills/tools/search-tool.d.ts +10 -1
- package/dist/types/skills/tools/shell/index.d.ts +1 -2
- package/dist/types/skills/tools/shell/shell-command.d.ts +1 -1
- package/dist/types/skills/tools/shell/shell-exec.d.ts +2 -2
- package/dist/types/skills/tools/shell/task-output.d.ts +12 -3
- package/dist/types/skills/tools/subagent-decision-tool.d.ts +15 -0
- package/dist/types/skills/tools/task-tool.d.ts +16 -2
- package/dist/types/skills/tools/write-tool.d.ts +2 -1
- package/dist/types/transport/acp-server.d.ts +1 -0
- package/dist/types/transport/host-run-state-client.d.ts +6 -0
- package/dist/types/workflow-host.d.ts +8 -1
- package/dist/workflow-host.js +9 -9
- package/package.json +25 -6
- package/dist/types/cli/tool-bootstrap-web-registration.d.ts +0 -14
- package/dist/types/orchestration/tool-cascade.d.ts +0 -49
- package/dist/types/protocol/wire/channel-ingress.d.ts +0 -29
- package/dist/types/protocol/wire/channel.d.ts +0 -89
- package/dist/types/runtime/infra/native-mcp-config-sync.d.ts +0 -16
- package/dist/types/runtime/memory/categories.d.ts +0 -5
- package/dist/types/runtime/memory/recall-category-filter.d.ts +0 -42
- package/dist/types/runtime/ports/source-provider.d.ts +0 -39
- package/dist/types/runtime/ports/web-search-contracts.d.ts +0 -21
- package/dist/types/server/search-svc.d.ts +0 -1
- package/dist/types/skills/memory/local-embedding.d.ts +0 -80
- package/dist/types/skills/memory/memory-config-resolver.d.ts +0 -4
- package/dist/types/skills/memory/memory-embedding-config.d.ts +0 -31
- package/dist/types/skills/tools/web-answer-tool.d.ts +0 -27
- package/dist/types/skills/tools/web-fetch-tool.d.ts +0 -80
- package/dist/types/skills/tools/web-research-tool.d.ts +0 -48
- package/dist/types/skills/tools/web-search-tool.d.ts +0 -46
- package/dist/types/skills/web-search/brave-source.d.ts +0 -3
- package/dist/types/skills/web-search/crawl4ai-extractor.d.ts +0 -16
- package/dist/types/skills/web-search/embedding-rerank.d.ts +0 -13
- package/dist/types/skills/web-search/exa-source.d.ts +0 -3
- package/dist/types/skills/web-search/multi-source-backend.d.ts +0 -23
- package/dist/types/skills/web-search/redis-source-cache.d.ts +0 -6
- package/dist/types/skills/web-search/search-svc-source.d.ts +0 -5
- package/dist/types/skills/web-search/searxng-source.d.ts +0 -4
- package/dist/types/skills/web-search/serper-source.d.ts +0 -3
- package/dist/types/skills/web-search/source-factory.d.ts +0 -6
- package/dist/types/skills/web-search/stability.d.ts +0 -26
- package/dist/types/skills/web-search/web-tunable-resolver.d.ts +0 -16
package/dist/workflow-host.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{join as
|
|
2
|
-
`)}import{resolve as dn}from"node:path";import{join as sn}from"node:path";import{homedir as Xt}from"node:os";import{join as y}from"node:path";import{existsSync as go}from"node:fs";import{createHash as Yt}from"node:crypto";import{resolve as Qt}from"node:path";function le(r){return Yt("sha256").update(Qt(r).toLowerCase()).digest("hex").slice(0,16)}var He=".qlogicagent";function S(){return process.env.QLOGICAGENT_HOME||y(Xt(),He)}function Q(){let r=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(r)return r;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 Zt(r){let e=r.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function X(r=Q()){return y(S(),"profiles",Zt(r))}function _e(r=Q()){return y(X(r),"memory")}var en="projectData";function qe(){return y(S(),en)}function fe(r){if(!r)throw new Error("getProjectDataDirById: projectId is required");return y(qe(),r)}function Be(){return y(S(),"plugins")}function Ue(){return y(S(),"skills")}function Fe(){return y(X(),"settings.json")}function Le(){return y(S(),"plugin-cache")}function Ke(){return y(S(),"mcp.json")}function Je(){return y(S(),"marketplace.json")}function O(r){if(!r)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return y(r,He)}function Ge(r){return y(O(r),"plugins")}function Ve(r){return y(O(r),"settings.json")}function ze(r){return y(O(r),"INSTRUCTIONS.md")}function Ye(r){return y(O(r),"rules")}import{resolve as yo}from"node:path";var tn=()=>{},ge;function Qe(){if(nn(),!ge)throw new Error("host project authority negotiated but snapshot is not hydrated");return{activeProjectId:ge.activeProjectId,projects:ge.projects.map(r=>({...r}))}}function nn(){let r=tn();if(!r)throw new Error("gateway project authority is not available");return r}function rn(){let r=Qe();return{activeProjectId:r.activeProjectId,projects:r.projects.map(e=>({...e}))}}function Xe(r){return rn().projects.find(e=>e.id===r)??null}function an(r){return Xe(r)?r:le(r)}function un(r){return fe(an(r))}function Ze(r){return sn(un(r),"sessions")}var pe=class{constructor(e={}){this.options=e}options;lastActiveWorkdir=null;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){let t=dn(e);this.lastActiveWorkdir=t,this.options.setActiveWorkdir?.(t)}getActiveWorkdir(){return this.lastActiveWorkdir??this.getActiveProjectRoot()}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return Q()}getUserAgentHome(){return S()}getOwnerProfileDir(e){return X(e)}getProfileMemoryDir(e){return _e(e)}getUserSettingsPath(){return Fe()}getUserSkillsDir(){return Ue()}getUserPluginsDir(){return Be()}getUserMcpConfigPath(){return Ke()}getUserPluginCacheDir(){return Le()}getUserMarketplaceConfigPath(){return Je()}getProjectAgentDir(e=this.getActiveProjectRoot()){return O(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return Ve(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return ze(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return Ge(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Ye(e)}getProjectSessionDataRoot(e=this.getActiveProjectRoot()){return Ze(e)}},cn=new pe;function Z(){return cn}function N(r){return A(Z().getProjectAgentDir(r),"workflows")}function rt(r,e){return A(N(e),r,"workflow.json")}function me(r,e){return A(N(e),r,"revisions")}var ln=20,he=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=A(N(this.cwd),e.id);await et(t,{recursive:!0}),await D(rt(e.id,this.cwd),e),await this.snapshotRevision(e)}async snapshotRevision(e){try{let t=me(e.id,this.cwd);await et(t,{recursive:!0}),await D(A(t,`${e.rev}.json`),e);let n=await this.revisionNumbers(e.id);for(let o of n.slice(ln))await nt(A(t,`${o}.json`),{force:!0})}catch{}}async revisionNumbers(e){let t;try{t=await tt(me(e,this.cwd))}catch{return[]}return t.map(n=>Number(n.replace(/\.json$/,""))).filter(n=>Number.isInteger(n)&&n>0).sort((n,o)=>o-n)}async listRevisions(e){let t=[];for(let n of await this.revisionNumbers(e)){let o=await this.loadRevision(e,n);o&&t.push({rev:n,updatedAt:o.updatedAt,name:o.name,nodeCount:o.def.nodes.length})}return t}async loadRevision(e,t){return j(A(me(e,this.cwd),`${t}.json`))}async load(e){return j(rt(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 tt(N(this.cwd))}catch{return[]}let t=[];for(let n of e){let o=await this.load(n);o&&t.push(o)}return t}async listActive(){return(await this.list()).filter(e=>e.active)}async delete(e){await nt(A(N(this.cwd),e),{recursive:!0,force:!0})}};var H=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 n of t.dependsOn??[]){if(!this.nodes.has(n))throw new Error(`Node "${t.id}" depends on unknown node "${n}"`);this.edges.push({from:n,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 n=this.incomingForwardEdges(t.id);if(n.length===0){e.push(t);continue}t.joinPolicy==="any"?n.some(o=>this.edgeSatisfied(o))&&e.push(t):n.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,n=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":n++;break;case"pending":o++;break;case"paused":i++;break;case"skipped":s++;break}return{total:this.nodes.size,completed:e,running:t,failed:n,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 n=this.requireNode(e);if(n.status!=="running")throw new Error(`Node "${e}" is ${n.status}, cannot complete`);n.status="completed",n.output=t.output,n.completedAt=Date.now(),n.firedPorts=t.firedPorts??n.outPorts,t.inputTokens!==void 0&&(n.inputTokens=t.inputTokens),t.outputTokens!==void 0&&(n.outputTokens=t.outputTokens),t.changedFiles!==void 0&&(n.changedFiles=t.changedFiles),n.acceptanceUnverified=t.acceptanceUnverified,this.propagateSkips()}markFailed(e,t){let n=this.requireNode(e);n.status="failed",n.error=t,n.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 n=this.requireNode(e);if(n.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!n.maxIterations||n.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=n.iteration??0;t&&o<n.maxIterations?(n.iteration=o+1,n.firedPorts=["loop"],this.resetLoopScope(e)):(n.firedPorts=["done"],t&&(n.error=`loop_cap_reached:${n.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(n=>n.to!==e.id||!e.dependsOn?.includes(n.from)),t}}addNodes(e){let t=[],n=[];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),n.push(...i)}this.validateDag()}catch(o){for(let i of t)this.nodes.delete(i);throw this.edges=this.edges.filter(i=>!n.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(n=>n.from!==e&&n.to!==e),this.nodes.delete(e)}retryNode(e,t){let n=this.requireNode(e);if(n.status!=="failed")throw new Error(`Node "${e}" is ${n.status}, only failed nodes can be retried`);n.status="pending",n.error=void 0,n.output=void 0,n.firedPorts=void 0,n.startedAt=void 0,n.completedAt=void 0,n.inputTokens=void 0,n.outputTokens=void 0,n.changedFiles=void 0,t&&Object.assign(n.params,t)}resetForReplay(e){if(!this.nodes.has(e))throw new Error(`Node "${e}" not found`);let t=new Set([e]),n=!0;for(;n;){n=!1;for(let o of this.nodes.values()){if(t.has(o.id))continue;this.incomingForwardEdges(o.id).map(s=>s.from).some(s=>t.has(s))&&(t.add(o.id),n=!0)}}for(let o of t){let i=this.nodes.get(o);i.status="pending",i.output=void 0,i.firedPorts=void 0,i.error=void 0,i.startedAt=void 0,i.completedAt=void 0,i.inputTokens=void 0,i.outputTokens=void 0,i.changedFiles=void 0}return[...t]}updateNodeParams(e,t){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, can only update pending nodes`);Object.assign(n.params,t)}addEdge(e){let{from:t,to:n,fromPort:o="default",loopBack:i=!1}=e;if(!this.nodes.has(t))throw new Error(`Unknown source node "${t}"`);if(!this.nodes.has(n))throw new Error(`Unknown target node "${n}"`);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(d=>d.from===t&&d.to===n&&(d.fromPort??"default")===o))if(this.edges.push({from:t,to:n,fromPort:o,loopBack:i}),i){let d=this.nodes.get(n);if(!d.maxIterations||d.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${n}" requires maxIterations > 0`)}else try{this.validateDag()}catch(d){throw this.edges=this.edges.filter(l=>!(l.from===t&&l.to===n&&(l.fromPort??"default")===o)),d}}removeEdge(e,t,n){let o=n??"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(n=>n.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 n=this.nodes.get(t.id);n&&(n.status=t.status==="running"?"pending":t.status,n.output=t.output,n.error=t.error,n.firedPorts=t.firedPorts,n.startedAt=t.startedAt,n.completedAt=t.completedAt,n.inputTokens=t.inputTokens,n.outputTokens=t.outputTokens,n.changedFiles=t.changedFiles,n.acceptanceUnverified=t.acceptanceUnverified,n.runIndex=t.runIndex??0,n.iteration=t.iteration)}}getUpstreamOutputs(e){if(!this.nodes.get(e))return[];let n=this.incomingForwardEdges(e),o=new Set,i=[];for(let s of n){let a=s.from;if(o.has(a))continue;o.add(a);let d=this.nodes.get(a);if(d&&d.status==="completed"&&d.output!=null){let l=typeof d.output=="string"?d.output:JSON.stringify(d.output);l.trim()&&i.push({taskId:a,output:l})}}return i}edgeSatisfied(e){let t=this.nodes.get(e.from);if(!t||t.status!=="completed")return!1;let n=e.fromPort??"default";return(t.firedPorts??t.outPorts).includes(n)}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 n=e.fromPort??"default";return!(t.firedPorts??t.outPorts).includes(n)}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 n of t){let o=this.nodes.get(n);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,n=(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),n(s.to,!1)))};return n(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,n=new Set,o=i=>{if(n.has(i))throw new Error(`Cycle detected involving node "${i}"`);if(!t.has(i)){n.add(i);for(let s of e)s.from===i&&o(s.to);n.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 C(r,e){return e?{json:r,binary:e}:{json:r}}function ot(r){let e={};for(let t of Object.keys(r).sort())e[t]=r[t].map(n=>({json:n.json,binary:n.binary?Object.fromEntries(Object.keys(n.binary).sort().map(o=>[o,n.binary[o].ref])):void 0}));return ye(e)}function ye(r){return JSON.stringify(we(r))}function we(r){if(Array.isArray(r))return r.map(we);if(r&&typeof r=="object"){let e={};for(let t of Object.keys(r).sort())e[t]=we(r[t]);return e}return r}var ut=new Set(["__proto__","prototype","constructor"]);function it(r,e){let t=ct(r),n=new ne(t,r),o=n.parseExpression();return n.expectEnd(),_(o,e)}function re(r){try{let e=ct(r),t=new ne(e,r),n=t.parseExpression();return t.expectEnd(),L(n),null}catch(e){return e instanceof Error?e.message:String(e)}}var fn=new Set(["input","json","node","now","vars","trigger"]),st=new Set(["len","upper","lower","default","jsonpath","date"]);function L(r){switch(r.type){case"root":if(!fn.has(r.name))throw new Error(`Unknown context root "$${r.name}" (allowed: $input $json $node $now $vars $trigger)`);return;case"lit":return;case"func":if(!st.has(r.name))throw new Error(`Unknown function "${r.name}" (whitelist: ${[...st].join(", ")})`);r.args.forEach(L);return;case"prop":L(r.target);return;case"index":if(L(r.target),typeof r.key!="number"&&typeof r.key!="string")throw new Error("index key must be a number or string literal");return;case"call":if(!(r.target.type==="root"&&r.target.name==="node"))throw new Error("Only $node(...) is callable in this position");r.args.forEach(L);return}}function E(r,e){let t=r.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return t?it(t[1],e):r.includes("{{")?r.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let i=it(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)}):r}function dt(r,e){return be(r,e)}function be(r,e){if(typeof r=="string")return E(r,e);if(Array.isArray(r))return r.map(t=>be(t,e));if(r&&typeof r=="object"){let t={};for(let[n,o]of Object.entries(r))t[n]=be(o,e);return t}return r}function ct(r){let e=[],t=0,n=i=>/[A-Za-z_]/.test(i),o=i=>/[A-Za-z0-9_]/.test(i);for(;t<r.length;){let i=r[t];if(/\s/.test(i)){t++;continue}if(i==="$"){t++;let s="";for(;t<r.length&&o(r[t]);)s+=r[t++];if(!s)throw new Error('Bare "$" is not a valid expression');e.push({t:"dollar",v:s});continue}if(n(i)){let s="";for(;t<r.length&&o(r[t]);)s+=r[t++];e.push({t:"id",v:s});continue}if(/[0-9]/.test(i)||i==="-"&&/[0-9]/.test(r[t+1]??"")){let s=r[t++];for(;t<r.length&&/[0-9.]/.test(r[t]);)s+=r[t++];e.push({t:"num",v:s});continue}if(i==='"'||i==="'"){let s=i;t++;let a="";for(;t<r.length&&r[t]!==s;)r[t]==="\\"&&t+1<r.length?(a+=r[t+1],t+=2):a+=r[t++];if(r[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 ne=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 n=this.peek();if(!n||n.t!=="punc")break;if(n.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(n.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(n.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`)}},lt=Symbol("nodeAccessor");function _(r,e){switch(r.type){case"lit":return r.value;case"root":return gn(r.name,e);case"func":return pn(r.name,r.args.map(t=>_(t,e)));case"prop":return at(_(r.target,e),r.key);case"index":return at(_(r.target,e),r.key);case"call":{if(_(r.target,e)===lt){let n=r.args.map(i=>_(i,e));if(n.length!==1||typeof n[0]!="string")throw new Error("$node(...) takes exactly one string argument");let o=e.nodes?.[n[0]];if(!o)throw new Error(`$node("${n[0]}") not found (not completed or unknown)`);return o}throw new Error("Only $node(...) is callable in this position")}}}function gn(r,e){switch(r){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 lt;default:throw new Error(`Unknown context root "$${r}" (allowed: $input $json $node $now $vars $trigger)`)}}function at(r,e){if(typeof e=="string"&&ut.has(e))throw new Error(`Access to "${e}" is forbidden`);if(r==null)throw new Error(`Cannot read "${e}" of ${r}`);if(typeof e=="number"){if(!Array.isArray(r))throw new Error(`Cannot index non-array with [${e}]`);return r[e]}return r[e]}function pn(r,e){switch(r){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(te(e,0,"upper")).toUpperCase();case"lower":return String(te(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(te(e,1,"jsonpath")));case"date":return wn(e);case"eq":return ve(e[0],e[1]);case"ne":return!ve(e[0],e[1]);case"gt":return ee(e[0],e[1])>0;case"gte":return ee(e[0],e[1])>=0;case"lt":return ee(e[0],e[1])<0;case"lte":return ee(e[0],e[1])<=0;case"not":return!ke(te(e,0,"not"));case"and":return e.every(ke);case"or":return e.some(ke);case"contains":return mn(e[0],e[1]);default:throw new Error(`Unknown function "${r}()" (whitelist: len upper lower default jsonpath date eq ne gt gte lt lte not and or contains)`)}}function ke(r){return!!r}function ve(r,e){return r===e?!0:typeof r!=typeof e?!1:r&&e&&typeof r=="object"?JSON.stringify(r)===JSON.stringify(e):!1}function ee(r,e){if(typeof r=="number"&&typeof e=="number")return r-e;if(typeof r=="string"&&typeof e=="string")return r<e?-1:r>e?1:0;throw new Error(`Cannot compare ${typeof r} with ${typeof e}`)}function mn(r,e){if(typeof r=="string")return r.includes(String(e));if(Array.isArray(r))return r.some(t=>ve(t,e));throw new Error("contains() expects string/array as first argument")}function te(r,e,t){if(r.length<=e||r[e]===void 0)throw new Error(`${t}() missing required argument #${e+1}`);return r[e]}function hn(r,e){let t=e.match(/[^.[\]]+/g)??[],n=r;for(let o of t){if(ut.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(n==null)return;let i=/^\d+$/.test(o)?Number(o):o;n=n[i]}return n}function wn(r){let e=r.length===0?new Date:new Date(r[0]);if(Number.isNaN(e.getTime()))throw new Error(`date() received an invalid date: ${String(r[0])}`);if(r.length<2)return e.toISOString();let t=String(r[1]),n=o=>String(o).padStart(2,"0");return t.replace(/YYYY/g,String(e.getUTCFullYear())).replace(/MM/g,n(e.getUTCMonth()+1)).replace(/DD/g,n(e.getUTCDate())).replace(/HH/g,n(e.getUTCHours())).replace(/mm/g,n(e.getUTCMinutes())).replace(/ss/g,n(e.getUTCSeconds()))}import{mkdirSync as yn,writeFileSync as kn}from"node:fs";import{dirname as bn,resolve as vn}from"node:path";var ft={filter:["condition"],transform:["mapping"],script:["*"],n8nNode:["*"],agentBinding:["*"],modelBinding:["*"],toolBinding:["*"],integration:["*"],file:["*"],form:["*"],documentLoader:["*"],parser:["*"],retriever:["*"],textSplitter:["*"],vectorStore:["*"],extract:["*"],limit:["*"],split:["*"],respond:["*"]};function oe(r,e){return{json:e.json,vars:r.vars,trigger:r.trigger,now:r.now}}var xn=(r,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]=Tn(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}}]}}},Pn=r=>({outputs:{default:r.default??[]}}),En=r=>{let e=[];for(let t of Object.keys(r))e.push(...r[t]);return{outputs:{default:e}}},Rn=(r,e)=>{let n=!!e.condition?"true":"false",o=r.default??[],i={true:[],false:[]};return i[n]=o,{outputs:i,firedPorts:[n]}},In=(r,e,t)=>({outputs:{default:[{json:t.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),Sn=(r,e,t)=>{let n=e.condition;if(typeof n!="string"||!n.trim())throw new Error('filter node requires string param "condition" (per-item {{ }} expression over $json)');return{outputs:{default:(r.default??[]).filter(s=>!!E(n,oe(t,s)))}}},Nn=(r,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 n=r.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]=n,{outputs:s,firedPorts:[i]}},An=r=>{let e=r.default??[];return{outputs:{default:[{json:{items:e.map(t=>t.json),count:e.length}}]}}},$n=(r,e,t)=>{let n=e.mapping;if(typeof n!="object"||n===null||Array.isArray(n))throw new Error('transform node requires object param "mapping" ({outKey: "{{ expr }}"})');let o=Object.entries(n);if(o.length===0)throw new Error('transform node: "mapping" must have at least one key');return{outputs:{default:(r.default??[]).map(a=>{let d={};for(let[l,u]of o)d[l]=typeof u=="string"?E(u,oe(t,a)):u;return{json:d}})}}},jn=async(r,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:[...r.default??[],{json:{webhook:a}}]}}}let n=Number(e.ms);if(!Number.isFinite(n)||n<1||n>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()},n),a=()=>{clearTimeout(s),i(new Error("wait node canceled"))};t.signal?.addEventListener("abort",a,{once:!0})}),{outputs:{default:r.default??[]}}},Dn=(r,e,t)=>{let n=typeof e._n8nType=="string"?`(\u6765\u81EA n8n \u8282\u70B9\u300C${e._n8nType}\u300D)`:"";throw new Error(`\u8282\u70B9\u300C${t.nodeId}\u300D${n}\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=(r,e,t)=>{let n=typeof e._n8nType=="string"?` (${e._n8nType})`:"",i=(Array.isArray(e._n8nOutPorts)?e._n8nOutPorts:["default"]).filter(l=>typeof l=="string"&&l.length>0),s=r.default??[],a=s.length>0?s:[{json:{imported:!0,nodeId:t.nodeId,kind:t.kind,n8nType:e._n8nType}}],d={};for(let l of i.length>0?i:["default"])d[l]=a;if(d.default||(d.default=a),e._importMode==="n8n-strict-template")throw new Error(`Imported n8n node "${t.nodeId}"${n} requires a native executor or binding before live runs.`);return{outputs:d}},Cn=(r,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=r.default?.[0];if(!o)throw new Error(`Imported file node "${t.nodeId}" requires an input item`);let i=Mn(e.fileName,o,t);if(!i)throw new Error(`Imported file node "${t.nodeId}" requires fileName`);let s=vn(i);return yn(bn(s),{recursive:!0}),kn(s,Wn(o)),{outputs:{default:[{json:{...o.json,fileName:s,written:!0}}]}}},gt={set:xn,passthrough:Pn,merge:En,if:Rn,trigger:In,filter:Sn,switch:Nn,aggregate:An,transform:$n,wait:jn,manual:Dn,script:k,n8nNode:k,agentBinding:k,modelBinding:k,toolBinding:k,integration:k,file:Cn,form:k,documentLoader:k,parser:k,retriever:k,textSplitter:k,vectorStore:k,extract:k,limit:k,split:k,respond:k};function Tn(r,e){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:r}if(e==="boolean"){if(typeof r=="boolean")return r;if(r==="true")return!0;if(r==="false")return!1}return r}function Wn(r){return typeof r.json.bodyBase64=="string"?Buffer.from(r.json.bodyBase64,"base64"):typeof r.json.body=="string"?r.json.body:r.json.body!==void 0?JSON.stringify(r.json.body,null,2):typeof r.json.data=="string"?r.json.data:JSON.stringify(r.json,null,2)}function Mn(r,e,t){if(typeof r!="string")return"";let n=r.startsWith("=")?r.slice(1):r,o=n.match(/^\{\{\s*([\s\S]*?)\s*\}\}$/);return o?String(On(o[1],e,t)??""):n.includes("{{")?String(E(n,oe(t,e))):n}function On(r,e,t){let n=r.match(/^\$json\.([A-Za-z_][A-Za-z0-9_]*)$/);if(n)return e.json[n[1]];let o=r.match(/^(["'])([\s\S]*)\1\s*\+\s*\$json\.([A-Za-z_][A-Za-z0-9_]*)$/);if(o)return`${Hn(o[1],o[2])}${String(e.json[o[3]]??"")}`;if(r.startsWith("$json."))return E(`{{ ${r} }}`,oe(t,e));throw new Error(`Imported n8n expression is unsupported at node "${t.nodeId}": ${r}`)}function Hn(r,e){if(r==='"')try{return JSON.parse(`"${e}"`)}catch{return e}return e.replace(/\\'/g,"'").replace(/\\\\/g,"\\")}var _n=new Set(["agentBinding","modelBinding"]),K=class{executors=new Map;constructor(e=!0){if(e)for(let[t,n]of Object.entries(gt))this.executors.set(t,n)}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,n]of Object.entries(e))this.executors.has(t)?_n.has(t)&&this.override(t,n):this.register(t,n)}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 pt(r,e){let t=r??"any",n=e??"any";return t==="any"||n==="any"||t===n?!0:n==="binary"&&(t==="image"||t==="video"||t==="audio")}function mt(r){return r!=="manual"&&r!=="intent"&&r!=="form"}function J(r){let e=typeof r=="string"?r.trim():"";if(!e||e==="self")throw new Error('Workflow agent nodes require an explicit agentId; "self" is not a valid identity');return e}function $(r,e){if(!r)throw new Error(`Node kind "${e}" requires a host (ExecutorHost) but none was injected. Provide one via WorkflowRuntimeOptions.host.`);return r}function G(r,e,t){let n=r[e];if(typeof n!="string"||n.length===0)throw new Error(`Node kind "${t}" requires string param "${e}"`);return n}var qn=async(r,e,t)=>({outputs:{default:await $(t.host,"agent").runAgent({agentId:J(e.agentId),prompt:G(e,"prompt","agent"),input:r.default??[],signal:t.signal})}}),Bn=async(r,e,t)=>{let n=$(t.host,"agentBinding"),o=yt(e,r.default??[],t,"agentBinding");return{outputs:{default:await n.runAgent({agentId:J(e.agentId),prompt:o,input:r.default??[],signal:t.signal})}}},Un=async(r,e,t)=>{let n=$(t.host,"modelBinding");if(!n.runModel)throw new Error('Node kind "modelBinding" requires an ExecutorHost with runModel');return{outputs:{default:await n.runModel({prompt:yt(e,r.default??[],t,"modelBinding"),modelHint:Zn(e),temperature:ht(e.temperature),maxTokens:ht(e.maxTokens),input:r.default??[],signal:t.signal})}}},Fn=async(r,e,t)=>{let n=$(t.host,"http"),o=typeof e.method=="string"?e.method:"GET",i=await n.httpRequest({method:o,url:G(e,"url","http"),headers:Yn(e),body:zn(e),signal:t.signal}),s=r.default?.[0]?.json??{};return{outputs:{default:i.map(a=>({...a,json:{...s,...a.json}}))}}},Ln=async(r,e,t)=>({outputs:{default:await $(t.host,"channel").sendChannel({channel:G(e,"channel","channel"),target:typeof e.target=="string"?e.target:void 0,payload:e.payload??r.default?.[0]?.json??{},input:r.default??[],signal:t.signal})}}),Kn=async(r,e,t)=>{let n=$(t.host,"memory");if(!n.memory)throw new Error('Node kind "memory" requires an ExecutorHost with a memory backend');let o=G(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 n.memory({op:o,key:typeof e.key=="string"&&e.key?e.key:void 0,value:e.value!==void 0?e.value:r.default?.[0]?.json,query:typeof e.query=="string"?e.query:void 0,input:r.default??[],signal:t.signal})}}},Jn=async(r,e,t)=>{let n=$(t.host,"subworkflow");if(!n.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:r.default?.[0]?.json;return{outputs:{default:await n.runSubworkflow({workflowId:G(e,"workflowId","subworkflow"),callerWorkflowId:t.workflowId,projectId:typeof e.projectId=="string"&&e.projectId?e.projectId:void 0,payload:o,input:r.default??[],signal:t.signal})}}},Gn=async(r,e,t)=>{let n=$(t.host,"approval");if(!n.approval)throw new Error('Node kind "approval" requires an ExecutorHost with approval');let o=await n.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:r.default??[],signal:t.signal});if(!o.approved)throw new Error(`approval node "${t.nodeId}" denied${o.note?`: ${o.note}`:""} (${o.decidedAt})`);return{outputs:{default:[...r.default??[],{json:{approved:!0,decidedAt:o.decidedAt,...o.note?{note:o.note}:{}}}]}}},ie={agent:qn,agentBinding:Bn,modelBinding:Un,http:Fn,channel:Ln,memory:Kn,subworkflow:Jn,approval:Gn},Vn=Object.keys(ie);function zn(r){if(r.body!==void 0)return r.body;if(r.sendBody!==!0)return;let e=wt(r.bodyParameters);if(e.length!==0)return Object.fromEntries(e)}function Yn(r){let e={};if(r.headers&&typeof r.headers=="object"&&!Array.isArray(r.headers))for(let[t,n]of Object.entries(r.headers))typeof n=="string"&&(e[t]=n);for(let[t,n]of wt(r.headerParameters))e[t]=String(n);return Object.keys(e).length>0?e:void 0}function wt(r){let e=r&&typeof r=="object"&&!Array.isArray(r)?r.parameters:void 0;if(!Array.isArray(e))return[];let t=[];for(let n of e){if(!n||typeof n!="object")continue;let o=n;typeof o.name!="string"||!o.name||t.push([o.name,o.value??""])}return t}function yt(r,e,t,n){let o=Xn(r.prompt,r.text,r.message,r.input);if(!o)throw new Error(`Node kind "${n}" requires a prompt/text parameter`);return Qn(o,{json:e[0]?.json??{},input:{default:e},vars:t.vars,trigger:t.trigger,now:t.now})}function Qn(r,e){let t=r.startsWith("=")?r.slice(1):r;return t.includes("{{")?String(E(t,e)):t}function Xn(...r){for(let e of r)if(typeof e=="string"&&e.trim())return e}function Zn(r){let e=r.model??r.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 ht(r){let e=typeof r=="number"?r:typeof r=="string"?Number(r):NaN;return Number.isFinite(e)?e:void 0}var q=class extends Error{constructor(t){super(t?`Workflow paused at "${t}"`:"Workflow paused");this.atNodeId=t;this.name="WorkflowPauseSignal"}atNodeId},b=class extends Error{constructor(e="Workflow run canceled"){super(e),this.name="WorkflowRunCanceled"}},V=class{constructor(e,t={}){this.def=e;this.registry=t.registry??new K,this.gate=t.gate,this.now=t.now??(()=>new Date),this.trigger=t.trigger,this.triggerKind=t.triggerKind,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(ie);for(let n of e.nodes)this.nodeDefs.set(n.id,n);for(let n of e.edges)n.loopBack&&this.loopBackOf.set(n.from,n.to)}def;registry;gate;now;trigger;triggerKind;log;host;abortController;signal;checkpoint;preserveCheckpoint;onNodeStatus;dag;nodeDefs=new Map;nodeOutputs=new Map;cache=new Map;loopBackOf=new Map;pauseRequested=!1;nodeStats={};statsSeq=0;checkpointLoaded=!1;setNodeParams(e,t){let n=this.nodeDefs.get(e);if(!n)throw new Error(`Unknown node "${e}"`);n.params={...n.params??{},...t}}pause(){this.pauseRequested=!0}cancel(e="Workflow run canceled"){let t=new b(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;for(let a of s)await this.executeNode(a,e)}}catch(i){if(i instanceof q)t=i.atNodeId;else throw i}let n={};for(let[i,s]of this.nodeOutputs)n[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:n,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(){if(!this.checkpoint)return;let e=[...this.cache.entries()].map(([t,n])=>({key:t,result:n}));await this.checkpoint.persist(e)}async executeNode(e,t){if(this.throwIfCanceled(),this.pauseRequested)throw new q(e.id);if(e.kind==="loop"){this.enterLoop(e);return}let n=this.collectInputs(e.id),o=this.buildExprContext(n),i=this.nodeDefs.get(e.id)?.params??{},s=ft[e.kind]??[],a=s.includes("*"),d=a?{}:s.length>0?Object.fromEntries(Object.entries(i).filter(([m])=>!s.includes(m))):i,l={...dt(d,o),...a?i:Object.fromEntries(s.filter(m=>m in i).map(m=>[m,i[m]]))},u=this.cacheKey(e.kind,l,n,e.runIndex),f=Date.now(),c=0,g=(m,M)=>{let U=Date.now();this.nodeStats[e.id]={seq:++this.statsSeq,startedAt:new Date(f).toISOString(),finishedAt:new Date(U).toISOString(),durationMs:U-f,attempts:c,cacheHit:M,status:m}},p=this.cache.get(u),h=p!==void 0,w=!1;if(p)this.dag.markRunning(e.id);else{this.gate?.check(e.id,e.kind),this.dag.markRunning(e.id),this.onNodeStatus?.(e.id,"running");let m=this.nodeDefs.get(e.id),M=Math.max(1,m?.retry?.maxTries??1),U=Math.max(0,m?.retry?.backoffMs??1e3),ce=m?.timeoutMs,P;for(let R=0;R<M;R++){c++,this.throwIfCanceled();let I={nodeId:e.id,kind:e.kind,workflowId:this.def.id,triggerKind:this.triggerKind,runIndex:e.runIndex,vars:this.def.vars??{},trigger:this.trigger,now:this.now,log:this.log,host:this.host,signal:ce!==void 0&&ce>0?AbortSignal.any([this.signal,AbortSignal.timeout(ce)]):this.signal};try{if(p=await this.registry.get(e.kind)(n,l,I),I.signal?.aborted)throw I.signal.reason instanceof Error?I.signal.reason:new Error(`node "${e.id}" execution was aborted`);P=void 0;break}catch(F){if(this.isCanceled())throw this.canceledError(F);P=F;let Oe=R+1<M;this.log?.warn(`node "${e.id}" attempt ${R+1}/${M} failed: ${F instanceof Error?F.message:String(F)}`+(Oe?` \u2014 retrying in ${U*2**R}ms`:"")),Oe&&await this.cancellableDelay(U*2**R)}}if(P!==void 0){let R=m?.onError??"stop",I=P instanceof Error?P.message:String(P);if(R==="errorPort")this.onNodeStatus?.(e.id,"failed",I),p={outputs:{error:[{json:{error:I,nodeId:e.id,kind:e.kind,attempts:M}}]},firedPorts:["error"]},w=!0;else if(R==="continue")this.onNodeStatus?.(e.id,"failed",I),p={outputs:{},firedPorts:[]},w=!0;else throw this.onNodeStatus?.(e.id,"failed",I),g("failed",!1),P&&typeof P=="object"&&!P.nodeId&&(P.nodeId=e.id),P}this.throwIfCanceled(),w?t.add(e.id):(this.cache.set(u,p),t.add(e.id),await this.persistCheckpoint())}this.nodeOutputs.set(e.id,p.outputs),this.dag.markCompleted(e.id,{output:p.outputs,firedPorts:p.firedPorts}),w||this.onNodeStatus?.(e.id,"completed"),g(w?"failed":"completed",h);let x=this.loopBackOf.get(e.id);x&&this.decideLoopBack(x)}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 n=this.dag.getNode(e);this.surfaceLoopCap(n);let o=n.firedPorts??[];this.nodeOutputs.set(e,{loop:o.includes("loop")?[{json:{iteration:n.iteration??0}}]:[],done:o.includes("done")?[{json:{iteration:n.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 n=this.nodeStats[e.id],o=new Date().toISOString();this.nodeStats[e.id]=n?{...n,warning:t}:{seq:++this.statsSeq,startedAt:o,finishedAt:o,durationMs:0,attempts:0,cacheHit:!1,status:"completed",warning:t}}evalLoopCondition(e){let n=this.nodeDefs.get(e)?.params?.condition;if(n==null||n==="")return!0;let o=this.buildExprContext({});return!!(typeof n=="string"?E(n,o):n)}collectInputs(e){let t={};for(let n of this.def.edges){if(n.to!==e||n.loopBack)continue;let o=n.fromPort??"default",i=n.toPort??"default",s=this.nodeOutputs.get(n.from);if(!s)continue;let a=s[o];a&&(t[i]??=[]).push(...a)}return t}buildExprContext(e){let t={};for(let[n,o]of this.nodeOutputs)t[n]={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,n,o){return ye([e,t,ot(n),o])}isCanceled(){return this.signal.aborted}canceledError(e){let t=this.signal.reason;return t instanceof b?t:t instanceof Error?new b(t.message):e instanceof b?e:e instanceof Error&&this.signal.aborted?new b(e.message):new b(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,n)=>{let o=setTimeout(()=>{this.signal.removeEventListener("abort",i),t()},e),i=()=>{clearTimeout(o),n(this.canceledError())};this.signal.addEventListener("abort",i,{once:!0})})}buildDag(){let e=this.def.nodes.map(n=>{let o=n.outPorts??er(n.kind);return n.onError==="errorPort"&&!o.includes("error")&&(o=[...o,"error"]),{id:n.id,kind:n.kind,params:n.params??{},outPorts:o,joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations}}),t=new H(e);for(let n of this.def.edges)n.loopBack||t.addEdge({from:n.from,to:n.to,fromPort:n.fromPort??"default"});for(let n of this.def.edges)n.loopBack&&t.addEdge({from:n.from,to:n.to,loopBack:!0});return t}};function er(r){return r==="if"?["true","false"]:r==="loop"?["loop","done"]:["default"]}var tr=new Set(["agent","action","http","channel","im"]);var xe=class extends Error{constructor(t,n,o){super(`Permission denied: node "${t}" (kind "${n}") may not run under unattended trigger "${o}". Authorize it by adding "${n}" to allowUnattendedKinds.`);this.nodeId=t;this.kind=n;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},se=class extends q{constructor(t,n,o){super(t);this.reason=n;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${n} limit ${o}) before node "${t}"`}reason;limit},ae=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 mt(this.trigger)}check(e,t){if(this.unattended&&tr.has(t)&&!this.allow.has(t))throw new xe(e,t,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new se(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new se(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 vt(r){switch(r.type){case"manual":return[];case"schedule":return sr(r.cron);case"im-message":return dr(r.channel,r.match);case"webhook":return cr(r.path);case"intent":return rr(r.phrases,r.aliases,r.surfaces);case"form":return ir(r.fields);default:return[`unknown trigger type: ${JSON.stringify(r)}`]}}var nr=new Set(["welcome","chat"]);function rr(r,e,t){let n=[];if(!Array.isArray(r)||r.length===0)n.push("intent.phrases must be a non-empty array of trigger phrases");else for(let o of r)(typeof o!="string"||o.trim()==="")&&n.push(`intent.phrases entries must be non-empty strings, got ${JSON.stringify(o)}`);if(e!==void 0)if(!Array.isArray(e))n.push("intent.aliases must be an array when present");else for(let o of e)(typeof o!="string"||o.trim()==="")&&n.push(`intent.aliases entries must be non-empty strings, got ${JSON.stringify(o)}`);if(t!==void 0)if(!Array.isArray(t)||t.length===0)n.push("intent.surfaces must be a non-empty array when present");else for(let o of t)(typeof o!="string"||!nr.has(o))&&n.push(`intent.surfaces entries must be "welcome"|"chat", got ${JSON.stringify(o)}`);return n}var or=new Set(["text","number","select"]);function ir(r){let e=[];if(!Array.isArray(r)||r.length===0)return["form.fields must be a non-empty array"];let t=new Set;for(let n of r){if(typeof n?.key!="string"||!/^[\w-]+$/.test(n.key)){e.push(`form field key must be a [\\w-]+ string, got ${JSON.stringify(n?.key)}`);continue}t.has(n.key)&&e.push(`duplicate form field key "${n.key}"`),t.add(n.key),n.type!==void 0&&(typeof n.type!="string"||!or.has(n.type))&&e.push(`form field "${n.key}": type must be text|number|select`),n.type==="select"&&(!Array.isArray(n.options)||n.options.length===0)&&e.push(`form field "${n.key}": select requires non-empty options`)}return e}var kt=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],bt=["SUN","MON","TUE","WED","THU","FRI","SAT"];function sr(r){if(typeof r!="string"||r.trim()==="")return["schedule.cron must be a non-empty string"];let e=r.trim().split(/\s+/);if(e.length!==5&&e.length!==6)return[`schedule.cron must have 5 or 6 fields, got ${e.length}: "${r}"`];let n=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:kt},{label:"day-of-week",min:0,max:7,names:bt}]:[{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:kt},{label:"day-of-week",min:0,max:7,names:bt}],o=[];for(let i=0;i<n.length;i++){let s=ar(e[i],n[i]);s&&o.push(`schedule.cron ${s}`)}return o}function ar(r,e){for(let t of r.split(",")){let n=ur(t,e);if(n)return n}}function ur(r,e){if(r==="")return`${e.label} has an empty list element`;let t=r,n,o=r.indexOf("/");if(o!==-1&&(t=r.slice(0,o),n=r.slice(o+1),!/^\d+$/.test(n)||Number(n)<=0))return`${e.label} has an invalid step "/${n}"`;if(t==="*")return;let i=t.indexOf("-");if(i!==-1){let a=Pe(t.slice(0,i),e),d=Pe(t.slice(i+1),e);return a===void 0||d===void 0?`${e.label} has an invalid range "${t}"`:a>d?`${e.label} range "${t}" is descending`:void 0}if(t===""&&n!==void 0)return`${e.label} step "${r}" needs a base ("*" or a range)`;if(Pe(t,e)===void 0)return`${e.label} value "${t}" is out of range ${e.min}-${e.max}`}function Pe(r,e){let t;if(/^\d+$/.test(r))t=Number(r);else if(e.names){let n=e.names.indexOf(r.toUpperCase());if(n===-1)return;t=e.label==="month"?n+1:n}else return;if(!(t<e.min||t>e.max))return t}function dr(r,e){let t=[];if((typeof r!="string"||r.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(n){t.push(`im-message.match is not a valid regex: ${n.message}`)}return t}function cr(r){return typeof r!="string"||r===""?["webhook.path must be a non-empty string"]:r.startsWith("/")?/\s/.test(r)?[`webhook.path must not contain whitespace: "${r}"`]:r.includes("..")?[`webhook.path must not contain "..": "${r}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(r)?[]:[`webhook.path contains illegal characters: "${r}"`]:[`webhook.path must start with "/": "${r}"`]}var v=class extends Error{constructor(t){super(`Patch rejected: ${t.join("; ")}`);this.errors=t;this.name="PatchError"}errors};function Ee(r,e){let t=[],n=gr(r),o=new Map(n.def.nodes.map(l=>[l.id,l])),i=e.scope?new Set(e.scope):void 0,s=new Set,a=l=>!i||i.has(l)||s.has(l),d=[];for(let[l,u]of e.patch.entries()){let f=`op[${l}] ${u.op}`;switch(u.op){case"add_node":{u.node?.id?o.has(u.node.id)?t.push(`${f}: node "${u.node.id}" already exists`):(n.def.nodes.push(u.node),o.set(u.node.id,u.node),i&&s.add(u.node.id)):t.push(`${f}: node.id is required`);break}case"remove_node":{o.has(u.nodeId)?a(u.nodeId)?(n.def.nodes=n.def.nodes.filter(c=>c.id!==u.nodeId),o.delete(u.nodeId),n.def.edges=n.def.edges.filter(c=>c.from!==u.nodeId&&c.to!==u.nodeId)):t.push(`${f}: node "${u.nodeId}" is outside the edit scope`):t.push(`${f}: node "${u.nodeId}" not found`);break}case"update_params":{let c=o.get(u.nodeId);c?a(u.nodeId)?c.params=lr(c.params,u.params):t.push(`${f}: node "${u.nodeId}" is outside the edit scope`):t.push(`${f}: node "${u.nodeId}" not found`);break}case"rename_node":{let c=o.get(u.nodeId);c?a(u.nodeId)?c.name=u.name:t.push(`${f}: node "${u.nodeId}" is outside the edit scope`):t.push(`${f}: node "${u.nodeId}" not found`);break}case"set_node_options":{let c=o.get(u.nodeId);if(!c){t.push(`${f}: node "${u.nodeId}" not found`);break}if(!a(u.nodeId)){t.push(`${f}: node "${u.nodeId}" is outside the edit scope`);break}u.retry!==void 0&&(u.retry===null?delete c.retry:!Number.isInteger(u.retry.maxTries)||u.retry.maxTries<1||u.retry.maxTries>10?t.push(`${f}: retry.maxTries must be an integer 1..10`):u.retry.backoffMs!==void 0&&(!Number.isFinite(u.retry.backoffMs)||u.retry.backoffMs<0)?t.push(`${f}: retry.backoffMs must be a non-negative number`):c.retry={maxTries:u.retry.maxTries,...u.retry.backoffMs!==void 0?{backoffMs:u.retry.backoffMs}:{}}),u.timeoutMs!==void 0&&(u.timeoutMs===null?delete c.timeoutMs:!Number.isFinite(u.timeoutMs)||u.timeoutMs<=0?t.push(`${f}: timeoutMs must be a positive number`):c.timeoutMs=u.timeoutMs),u.onError!==void 0&&(u.onError===null?delete c.onError:u.onError!=="stop"&&u.onError!=="continue"&&u.onError!=="errorPort"?t.push(`${f}: onError must be "stop"|"continue"|"errorPort"`):c.onError=u.onError);break}case"set_node_ui":{if(!u.positions||typeof u.positions!="object"){t.push(`${f}: positions is required`);break}for(let[c,g]of Object.entries(u.positions)){let p=o.get(c);if(!p){t.push(`${f}: node "${c}" not found`);continue}if(!a(c)){t.push(`${f}: node "${c}" is outside the edit scope`);continue}if(g===null){delete p.ui;continue}if(!Number.isFinite(g?.x)||!Number.isFinite(g?.y)){t.push(`${f}: position for "${c}" must be finite {x,y}`);continue}p.ui={x:g.x,y:g.y}}break}case"add_edge":{let c=u.edge;if(!c?.from||!c?.to){t.push(`${f}: edge.from and edge.to are required`);break}if(i&&!a(c.from)&&!a(c.to)){t.push(`${f}: edge ${c.from}\u2192${c.to} has no endpoint in the edit scope`);break}let g=c.fromPort??"default";if(n.def.edges.some(m=>m.from===c.from&&m.to===c.to&&(m.fromPort??"default")===g)){t.push(`${f}: \u8FDE\u7EBF\u5DF2\u5B58\u5728(${c.from} \u2192 ${c.to})`);break}let p=o.get(c.from),h=o.get(c.to),w=p?.outPortTypes?.[g],x=h?.inPorts?.find(m=>m.name===(c.toPort??"default"))?.type;if(!pt(w,x)){t.push(`${f}: \u7AEF\u53E3\u7C7B\u578B\u4E0D\u5339\u914D:\u300C${p?.name??c.from}\u300D\u8F93\u51FA ${w??"any"},\u300C${h?.name??c.to}\u300D\u9700\u8981 ${x??"any"} \u2014\u2014 \u63A5\u4E0D\u4E0A,\u8BF7\u6362\u4E2A\u76EE\u6807\u7AEF\u53E3`);break}n.def.edges.push(c);break}case"remove_edge":{let{from:c,to:g,fromPort:p}=u.edge;if(i&&!a(c)&&!a(g))t.push(`${f}: edge ${c}\u2192${g} has no endpoint in the edit scope`);else{let h=n.def.edges.length;n.def.edges=n.def.edges.filter(w=>!(w.from===c&&w.to===g&&(w.fromPort??"default")===(p??"default"))),n.def.edges.length===h&&t.push(`${f}: edge ${c}\u2192${g} 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(u.trigger){let c=vt(u.trigger);if(c.length>0)for(let g of c)t.push(`${f}: ${g}`);else n.meta.trigger=u.trigger}else n.meta.trigger=u.trigger;break}case"set_meta":{i?t.push(`${f}: meta is workflow-global and cannot be changed in a scoped edit`):(u.meta.name!==void 0&&(n.meta.name=u.meta.name),u.meta.active!==void 0&&(n.meta.active=u.meta.active));break}default:t.push(`${f}: unknown op`)}t.length===0&&d.push(u)}if(t.length>0)throw new v(t);if(Pt(n.def,t),xt(n.def,t),t.length>0)throw new v(t);return{target:n,applied:d}}function lr(r,e){let t={...r??{}};for(let[n,o]of Object.entries(e))o===null?delete t[n]:t[n]=o;return t}function z(r){let e=[];for(let t of r.nodes)(t.kind==="tool"||t.kind==="skill"||t.kind==="mcp")&&e.push(`\u8282\u70B9\u300C${t.id}\u300D\u4F7F\u7528\u4E86 legacy kind "${t.kind}";\u8BF7\u6539\u7528 Agent \u63D2\u4EF6\u6216 canonical Action \u8282\u70B9`);return Pt(r,e),xt(r,e),e}function xt(r,e){let t=(n,o,i)=>{if(typeof n=="string"){if(n.startsWith("="))return;for(let s of n.matchAll(/\{\{([\s\S]*?)\}\}/g)){let a=re(s[1].trim());a&&e.push(`\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(n)){n.forEach((s,a)=>t(s,o,`${i}[${a}]`));return}if(n&&typeof n=="object")for(let[s,a]of Object.entries(n))t(a,o,i?`${i}.${s}`:s)};for(let n of r.nodes)n.params?._importMode!=="n8n-strict-template"&&n.params&&t(n.params,n.id,"")}function Pt(r,e){try{let t=r.nodes.map(o=>{let i=o.outPorts??fr(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}}),n=new H(t);for(let o of r.edges)o.loopBack||n.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of r.edges)o.loopBack&&n.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(t){e.push(`graph invalid: ${t.message}`)}}function fr(r){return r==="if"?["true","false"]:r==="loop"?["loop","done"]:["default"]}function gr(r){return{def:{...r.def,nodes:r.def.nodes.map(e=>({...e,params:e.params?{...e.params}:void 0})),edges:r.def.edges.map(e=>({...e})),vars:r.def.vars?{...r.def.vars}:void 0},meta:{...r.meta}}}function Re(r,e={}){let t=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(r.name)} (rev ${r.rev}, trigger: ${pr(r.trigger)}, ${r.active?"active":"inactive"})`,i=r.def.nodes,a=i.slice(0,t).map(f=>" "+mr(f,n)),d=i.length===0?"nodes: (none)":["nodes:",...a].join(`
|
|
3
|
-
`),
|
|
4
|
-
\u2026 ${i.length-t} more node(s); fetch the full definition from the Gateway Host`:"",
|
|
5
|
-
${
|
|
6
|
-
${
|
|
7
|
-
${r.map(t=>{let n=t.fromPort??"default",o=t.toPort??"default",i=t.loopBack?" (loopBack)":"";return`${t.from}.${n}\u2192${t.to}.${o}${i}`}).join(" ; ")}`}function kr(r){return r==="if"?["true","false"]:r==="loop"?["loop","done"]:["default"]}function br(r){let e=[],t=r;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(r){if(!r.startsWith("="))return null;let e=r.slice(1);if(!e.includes("{{"))return{ok:!0,converted:e,notes:[]};let t=[],n=null,o=e.replace(/\{\{([\s\S]*?)\}\}/g,(i,s)=>{if(n)return i;let{body:a,notes:d}=br(s.trim()),l=re(a);return l?(n=`\u8868\u8FBE\u5F0F\u300C{{ ${s.trim()} }}\u300D\u8D85\u51FA\u53D7\u9650\u8BED\u8A00(${l})`,i):(t.push(...d),`{{ ${a} }}`)});return n?{ok:!1,reason:n}:{ok:!0,converted:o,notes:t}}function Et(r,e,t=""){let n=(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)=>n(s,`${i}[${a}]`)):o&&typeof o=="object"?Object.fromEntries(Object.entries(o).map(([s,a])=>[s,n(a,i?`${i}.${s}`:s)])):o};return n(r,t)}var Rt={"@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"},xr=new Set(["openAiApi","googlePalmApi","openRouterApi","mistralCloudApi","anthropicApi"]),Pr=new Set(["agentBinding"]);function It(r){return xr.has(r)}function St(r){return Pr.has(r)}function Nt(r){return"workflow"}function At(r,e){let t=`${r} ${e}`.toLowerCase();return t.includes("gmail")?"gmail":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 $t={"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"},Er=new Set(["n8n-nodes-base.stickyNote"]),Rr=new Set(["n8n-nodes-base.code","n8n-nodes-base.function","n8n-nodes-base.functionItem","@n8n/n8n-nodes-langchain.toolCode"]),W=class extends Error{constructor(t){super(`n8n import rejected: ${t.join("; ")}`);this.errors=t;this.name="N8nImportError"}errors};function jt(r,e,t={}){let n=Ar(r),o=t.strictTemplates===!0,i=[],s={status:"full",nodes:[],expressions:{converted:0,manual:[]},credentials:[],bindings:{models:[],agents:[],connections:[]},notes:[]},a=new Set,d=new Set,l=[];for(let[f,c]of n.nodes.entries()){if(typeof c?.name!="string"||c.name===""){i.push(`nodes[${f}] has a missing/empty name`);continue}if(a.has(c.name)){i.push(`duplicate node name "${c.name}"`);continue}if(a.add(c.name),typeof c.type!="string"||c.type===""){i.push(`node "${c.name}" has a missing/empty type`);continue}if(Er.has(c.type)){d.add(c.name),s.nodes.push({id:c.name,n8nType:c.type,outcome:"skipped",notes:["annotation node skipped"]});continue}let g={id:c.name,n8nType:c.type,outcome:"converted",notes:[]};s.nodes.push(g);let p=Ir(c.type,o);Rr.has(c.type)&&!o?(p="manual",g.outcome="manual",g.notes.push("Code node contains imported script; default import keeps it as a fail-loud manual placeholder.")):p||(o?(p="n8nNode",g.outcome="unsupported",g.notes.push(`unsupported n8n node type "${c.type}" preserved as raw n8nNode`)):(p="manual",g.outcome="manual",g.notes.push(`unmapped n8n node type "${c.type}", please replace it manually`)));let h={converted:0,manual:[],notes:[]},w=Et({...c.parameters??{}},h);s.expressions.converted+=h.converted;for(let m of h.manual)s.expressions.manual.push({nodeId:c.name,...m}),g.notes.push(`parameter ${m.path}: ${m.reason}`),g.outcome==="converted"&&(g.outcome="partial");for(let m of h.notes)s.notes.includes(m)||s.notes.push(m);Nr(c,p,s,o),o&&St(p)&&(s.bindings.agents.push({nodeId:c.name,fallback:!0,label:c.name}),g.outcome=g.outcome==="converted"?"partial":g.outcome,g.notes.push("agent capability will be resolved from the configured Agent panel, not from n8n credentials"));let x={id:c.name,kind:p,name:c.name,params:{...w,_n8nType:c.type}};o&&(x.params={...x.params,_importMode:"n8n-strict-template",_bindingKind:p}),Array.isArray(c.position)&&Number.isFinite(c.position[0])&&Number.isFinite(c.position[1])&&(x.ui={x:c.position[0],y:c.position[1]}),Sr(x,p,g,o),l.push(x)}let u=n.connections?$r(n.connections,a,d,l,i,o):[];if(o&&Cr(u,l),Dr(l),l.length===0&&i.length===0&&i.push("workflow has no nodes"),i.length>0)throw new W(i);return s.status=s.nodes.some(f=>f.outcome==="manual"||f.outcome==="unsupported")?"manual":s.nodes.some(f=>f.outcome==="partial")||s.expressions.manual.length>0?"partial":"full",{name:typeof n.name=="string"&&n.name!==""?n.name:e,def:{id:e,nodes:l,edges:u},report:s}}function Ir(r,e){return e?Rt[r]??$t[r]??"n8nNode":$t[r]}function Sr(r,e,t,n){let o=r.params;if(e==="if"){r.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)):n||(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")):n||(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push("subworkflow target is missing"));return}(e==="switch"||e==="filter")&&!n&&(t.outcome=t.outcome==="manual"?"manual":"partial",t.notes.push(`${e} conditions preserve n8n params and may need review`))}function Nr(r,e,t,n){if(!(!r.credentials||typeof r.credentials!="object")){for(let[o,i]of Object.entries(r.credentials)){if(n&&It(o)){t.bindings.models.push({nodeId:r.name,n8nCredentialType:o,modelPurpose:Nt(o),label:i?.name});continue}let s=At(r.type,o);n&&t.bindings.connections.push({nodeId:r.name,n8nCredentialType:o,connectionType:s,label:i?.name}),t.credentials.push({nodeId:r.name,n8nCredentialType:o,label:i?.name})}n&&e==="modelBinding"&&t.bindings.models.push({nodeId:r.name,n8nCredentialType:"model-registry",modelPurpose:"workflow"})}}function Ar(r){let e;if(typeof r=="string")try{e=JSON.parse(r)}catch(n){throw new W([`invalid JSON: ${n.message}`])}else e=r;if(!e||typeof e!="object")throw new W(["workflow must be a JSON object"]);let t=e;if(!Array.isArray(t.nodes))throw new W(["workflow.nodes must be an array"]);if(t.connections!==void 0&&(typeof t.connections!="object"||t.connections===null))throw new W(["workflow.connections must be an object"]);return{name:t.name,nodes:t.nodes,connections:t.connections??{}}}function $r(r,e,t,n,o,i){let s=new Map(n.map(d=>[d.id,d.kind])),a=[];for(let d of Object.keys(r).sort()){if(t.has(d))continue;if(!e.has(d)){o.push(`connection source "${d}" is not a declared node`);continue}let l=r[d]??{};for(let u of Object.keys(l).sort()){let f=l[u];if(Array.isArray(f))for(let c=0;c<f.length;c++){let g=jr(d,s.get(d),u,c,n,o,i),p=f[c];if(Array.isArray(p))for(let h of p){if(!h||typeof h.node!="string"){o.push(`connection from "${d}" has a malformed target`);continue}if(t.has(h.node))continue;if(!e.has(h.node)){o.push(`connection from "${d}" targets missing node "${h.node}"`);continue}let w={from:d,to:h.node};g!=="default"&&(w.fromPort=g),i&&typeof h.type=="string"&&h.type&&h.type!=="main"&&(w.toPort=h.type),a.push(w)}}}}return a}function jr(r,e,t,n,o,i,s){return t!=="main"?T(o,r,n===0?t:`${t}_${n}`):e==="if"?n===0?"true":n===1?"false":(s||i.push(`if node "${r}" has an unsupported output index ${n}`),T(o,r,`out_${n}`)):e==="switch"?T(o,r,`case_${n}`):e==="filter"?n===0?T(o,r,"default"):(s||i.push(`filter node "${r}" has an unsupported discarded output`),T(o,r,n===1?"discarded":`out_${n}`)):n===0?T(o,r,"default"):(s||i.push(`node "${r}" has an unmodeled multi-output index ${n} (only single-output supported)`),T(o,r,`out_${n}`))}function T(r,e,t){let n=r.find(o=>o.id===e);return n&&(n.outPorts=n.outPorts??[],n.outPorts.includes(t)||n.outPorts.push(t)),t}function Dr(r){for(let e of r)e.outPorts&&e.outPorts.length>0&&(e.params={...e.params??{},_n8nOutPorts:e.outPorts})}function Cr(r,e){let t=[];for(let n of r)if(Tr(t,n.to,n.from)){n.loopBack=!0;let o=e.find(i=>i.id===n.to);o&&(!o.maxIterations||o.maxIterations<=0)&&(o.maxIterations=100)}else t.push(n)}function Tr(r,e,t){let n=[e],o=new Set;for(;n.length>0;){let i=n.pop();if(i===t)return!0;if(!o.has(i)){o.add(i);for(let s of r)s.from===i&&n.push(s.to)}}return!1}import{join as Wt}from"node:path";import{mkdir as Wr}from"node:fs/promises";function ue(r,...e){let t=r.toLowerCase();return e.some(n=>t.includes(n.toLowerCase()))}function Dt(r,e){let t=(r??"").trim(),n=t.length>300?`${t.slice(0,300)}\u2026`:t||void 0;return ue(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:n}:ue(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:n}:ue(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:n}:ue(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:n}:{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:n}}var Mr=20,Ct=2e3;function Tt(r,e){return Wt(N(r),e,"runs","history.json")}function Se(r){let e={};for(let[t,n]of Object.entries(r.outputs)){let o={};for(let[a,d]of Object.entries(n))o[a]=d.map(l=>l.json);let i=JSON.stringify(o);i.length>Ct&&(i=`${i.slice(0,Ct)}\u2026(truncated)`);let s=r.nodeStats?.[t];e[t]={executed:r.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 Ie=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowRunHistoryStore requires a project cwd")}cwd;async begin(e,t){let n=await this.read(e);n.unshift({...t,status:"running"}),await this.write(e,n.slice(0,Mr))}async finish(e,t,n){let o=await this.read(e),i=o.find(s=>s.runId===t);i&&(Object.assign(i,n),i.errorInfo=i.status==="failed"&&i.error?Dt(i.error):void 0,await this.write(e,o))}async list(e){return(await this.read(e)).map(({nodes:t,...n})=>n)}async get(e,t){return(await this.read(e)).find(n=>n.runId===t)}async read(e){try{let t=await j(Tt(this.cwd,e));return Array.isArray(t)?t:[]}catch{return[]}}async write(e,t){let n=Tt(this.cwd,e);await Wr(Wt(N(this.cwd),e,"runs"),{recursive:!0}),await D(n,t)}};import{randomUUID as Or}from"node:crypto";var Ne=class{constructor(e,t,n){this.store=e;this.runtimeFactory=t;this.runHistory=n}store;runtimeFactory;runHistory;slots=new Map;activeRuns=new Map;activeRunIdsByWorkflow=new Map;suppressedHistoryRunIds=new Set;async create(e){let t=z(e.def);if(t.length>0)throw new v(t);let n=new Date().toISOString(),o={id:e.id,name:e.name,...e.owner?{owner:e.owner}:{},def:e.def,active:e.active??!1,concurrency:e.concurrency??"queue",rev:1,createdAt:n,updatedAt:n};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=z(o.def);if(i.length>0)throw new v(i)}return await this.store.save(o),o}async setActive(e,t){if(t){let n=await this.store.require(e);if(!n.publishedDef)throw new Error(`Workflow "${e}" has no published version \u2014 publish the draft before activating`);if(n.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 n=z(t.def);if(n.length>0)throw new v(n);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 n=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=z(o.def);if(i.length>0)throw new v(i);let s={...n,def:o.def,name:o.name,trigger:o.trigger??null,rev:n.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(s),s}async importN8n(e,t,n={}){let{name:o,def:i,report:s}=jt(t,e,{strictTemplates:!0});return{record:await this.create({id:e,name:o,def:i,concurrency:n.concurrency,owner:n.owner}),report:s}}async get(e){return this.store.require(e)}async describe(e,t){let n=await this.store.require(e);return Re(n,t)}async patch(e,t){let n=await this.store.require(e),o=t.baseRev!==void 0&&t.baseRev<n.rev,i={def:n.def,meta:{name:n.name,active:n.active,trigger:n.trigger??null}},s,a;try{let u=Ee(i,t);s=u.applied,a=u.target}catch(u){if(o&&u instanceof v)return{ok:!1,conflict:{latestRev:n.rev}};throw u}if(a.meta.active===!0&&!n.active&&!n.publishedDef)throw new v([`workflow "${e}" has no published version \u2014 publish the draft before activating (set_meta.active)`]);let l={...n,def:a.def,name:a.meta.name??n.name,active:a.meta.active??n.active,trigger:a.meta.trigger??null,rev:n.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(l),{ok:!0,rev:l.rev,applied:s}}async run(e,t,n={}){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 d={workflowId:e,runId:Or(),type:i,payload:t?.payload,permissionScope:o.permissionScope,reuseCache:n.reuseCache===!0},l=this.slotFor(e),u=()=>{if(l.pending>0)switch(o.concurrency){case"skip":return Promise.resolve({workflowId:e,status:"skipped"});case"parallel":return this.startParallel(e,a,d);case"queue":return this.track(e,l,a,d,!0)}return this.track(e,l,a,d,!1)};return this.recordRun(e,d,u,n.recordHistory===!1,n.onStarted)}async recordRun(e,t,n,o=!1,i){let s=Date.now(),a={workflowId:e,runId:t.runId,triggerType:t.type};if(!this.runHistory||o)try{await i?.(a);let u=await n();return{...u,runId:u.runId??t.runId}}catch(u){if(u instanceof b)return{workflowId:e,status:"canceled",runId:t.runId};throw u}await this.runHistory.begin(e,{runId:t.runId,triggerType:t.type,startedAt:new Date(s).toISOString()});let d=u=>this.finishRunHistory(e,t.runId,s,u),l;try{await i?.(a),l=await n()}catch(u){if(u instanceof b)return await d({status:"canceled",error:u.message}),{workflowId:e,status:"canceled",runId:t.runId};throw await d({status:"failed",error:u instanceof Error?u.message:String(u),failedNodeId:u?.nodeId}),u}return await d({status:l.status,...l.result?{nodes:Se(l.result)}:{}}),{...l,runId:t.runId}}pause(e,t={}){this.requireActiveRun(e,t.runId).runtime.pause()}async resume(e,t={}){let n=this.requireActiveRun(e,t.runId);if(n.status!=="paused")throw new Error(`Workflow "${e}" run "${n.runId}" is not paused`);t.extraBudget&&n.runtime.extendBudget(t.extraBudget),n.status="running";let o=this.slotFor(e);o.pending++;let i=n.runtime.run().then(async s=>{let a={workflowId:e,runId:n.runId,status:s.status,result:s};return s.status==="paused"?n.status="paused":this.unregisterActiveRun(n.runId),await this.finishRunHistory(e,n.runId,n.startedAtMs,{status:a.status,nodes:Se(s)}),a}).catch(async s=>{if(this.unregisterActiveRun(n.runId),s instanceof b)return await this.finishRunHistory(e,n.runId,n.startedAtMs,{status:"canceled",error:s.message}),{workflowId:e,runId:n.runId,status:"canceled"};throw await this.finishRunHistory(e,n.runId,n.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 n=this.requireActiveRun(e,t.runId),o=t.reason??`Workflow "${e}" run "${n.runId}" canceled`,i=new b(o);return n.runtime.cancel(o),n.abortController.signal.aborted||n.abortController.abort(i),this.unregisterActiveRun(n.runId),n.status==="paused"&&await this.finishRunHistory(e,n.runId,n.startedAtMs,{status:"canceled",error:o}),{workflowId:e,runId:n.runId,status:"canceled"}}async delete(e){let t=[...this.activeRunIdsByWorkflow.get(e)??[]];for(let n of t)this.suppressedHistoryRunIds.add(n),await this.cancelRun(e,{runId:n,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 n=this.activeRunIdsByWorkflow.get(t.workflowId);n&&(n.delete(e),n.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 n=[...this.activeRunIdsByWorkflow.get(e)??[]],o=this.slots.get(e)?.latestRunId;if(o&&n.includes(o))return this.activeRuns.get(o);let i=n.at(-1);if(!i)throw new Error(`Workflow "${e}" has no active run`);return this.activeRuns.get(i)}async finishRunHistory(e,t,n,o){!this.runHistory||this.suppressedHistoryRunIds.has(t)||await this.runHistory.finish(e,t,{finishedAt:new Date().toISOString(),durationMs:Date.now()-n,...o})}track(e,t,n,o,i){t.pending++;let s=()=>this.startTrackedRuntime(e,t,n,o),d=(i?t.tail.then(s):s()).finally(()=>{t.pending--});return t.tail=d.catch(()=>{}),d}async startParallel(e,t,n){return this.startTrackedRuntime(e,void 0,t,n)}async startTrackedRuntime(e,t,n,o){let i=new AbortController,s=this.runtimeFactory(n,{...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 d=await s.run(),l={workflowId:e,runId:o.runId,status:d.status,result:d};return d.status==="paused"?a.status="paused":this.unregisterActiveRun(o.runId),l}catch(d){throw this.unregisterActiveRun(o.runId),d}}};function Hr(r){return(e,t)=>new V(e,{registry:r.registry,host:r.host,signal:t.signal,checkpoint:r.checkpoint?.(t.workflowId,t.reuseCache?"shared-cache":t.runId),preserveCheckpoint:t.reuseCache===!0,trigger:t.payload,triggerKind:t.type,now:r.now,onNodeStatus:r.emitNodeStatus?(n,o,i)=>r.emitNodeStatus(t.workflowId,n,o,i):void 0,gate:new ae({trigger:t.type,maxNodeExecutions:r.budget.maxNodeExecutions,maxDurationMs:r.budget.maxDurationMs,allowUnattendedKinds:t.permissionScope?.allowUnattendedKinds??r.allowUnattendedKinds,now:r.now?()=>r.now().getTime():void 0})})}function _r(r){let e=r.fetchImpl??fetch;return{async runAgent(t){let n=await r.runAgent({agentId:t.agentId,prompt:t.prompt,signal:t.signal});return[C({text:n,output:n})]},async runModel(t){if(!r.resolveClientForPurpose)throw new Error("workflow model node: no configured model resolver is wired");let n=r.resolveClientForPurpose("textGeneration");if(!n)throw new Error("workflow model node: no textGeneration model is configured");let o="";for await(let i of n.transport.stream({model:n.model,messages:[{role:"user",content:t.prompt}],temperature:t.temperature,maxTokens:t.maxTokens,tools:[]},n.apiKey,t.signal))if(i.type==="delta"&&(o+=i.text),i.type==="error")throw new Error(i.message);return[C({text:o,output:o,model:n.model,...t.modelHint?{importedModel:t.modelHint}:{},choices:[{text:o}]})]},async httpRequest(t){let n=await e(t.url,{method:t.method||"GET",headers:t.headers,body:t.body===void 0?void 0:typeof t.body=="string"?t.body:JSON.stringify(t.body),signal:t.signal}),o=n.headers.get("content-type")??"";if(o.includes("application/json")){let a=await n.text(),d=a;try{a.length>0&&(d=JSON.parse(a))}catch{d={__unparsedJson:a}}return[C({status:n.status,ok:n.ok,body:d})]}let i=Buffer.from(await n.arrayBuffer()),s=qr(n.headers.get("content-disposition"));return[C({status:n.status,ok:n.ok,bodyBase64:i.toString("base64"),mimeType:o||"application/octet-stream",size:i.byteLength,...s?{filename:s}:{}})]},async invokeMcp(t){let n=await r.invokeMcp({server:t.server,tool:t.tool,args:t.args,signal:t.signal});return[C({result:n})]},async sendChannel(t){if(!r.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 n=await r.sendChannel({channel:t.channel,target:t.target,payload:t.payload,signal:t.signal});return[C({sent:!0,result:n})]},async memory(t){if(!r.memory)throw new Error("workflow memory node: no memory backend injected (handler host wires the project memdir)");return r.memory(t)},async runSubworkflow(t){if(!r.runSubworkflow)throw new Error("workflow subworkflow node: no sub-run backend injected (handler host wires the controller)");return r.runSubworkflow(t)},async approval(t){if(!r.approval)throw new Error("workflow approval node: no approval backend injected (handler host wires the notify/await loop)");return r.approval(t)},async waitWebhook(t){if(!r.waitWebhook)throw new Error("workflow wait(until=webhook): no webhook-wait backend injected (handler host wires the wake registry)");return r.waitWebhook(t)}}}function qr(r){if(!r)return;let e=r.match(/filename\*=UTF-8''([^;]+)/i);if(e)return decodeURIComponent(e[1].trim().replace(/^"|"$/g,""));let t=r.match(/filename=([^;]+)/i);return t?t[1].trim().replace(/^"|"$/g,""):void 0}var Mt=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Ot=["SUN","MON","TUE","WED","THU","FRI","SAT"];function Br(r){if(typeof r!="string"||r.trim()==="")throw new Error("cron must be a non-empty string");let e=r.trim().split(/\s+/);if(e.length!==5&&e.length!==6)throw new Error(`cron must have 5 or 6 fields, got ${e.length}: "${r}"`);let t=e.length===6,n=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: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=n.map((d,l)=>({spec:d,raw:e[l],set:Ur(e[l],n[l])})),i=d=>{let l=o.find(u=>u.spec.label===d);if(!l)throw new Error(`internal: missing cron field ${d}`);return l},s=i("day-of-week"),a=new Set;for(let d of s.set)a.add(d===7?0:d);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 Ur(r,e){let t=new Set;for(let n of r.split(","))Fr(n,e,t);if(t.size===0)throw new Error(`cron ${e.label} expanded to an empty set: "${r}"`);return t}function Fr(r,e,t){if(r==="")throw new Error(`cron ${e.label} has an empty list element`);let n=r,o=1,i=r.indexOf("/");if(i!==-1){n=r.slice(0,i);let d=r.slice(i+1);if(!/^\d+$/.test(d)||Number(d)<=0)throw new Error(`cron ${e.label} has an invalid step "/${d}"`);o=Number(d)}let s,a;if(n==="*")s=e.min,a=e.max;else{let d=n.indexOf("-");if(d!==-1){let l=Ae(n.slice(0,d),e),u=Ae(n.slice(d+1),e);if(l===void 0||u===void 0)throw new Error(`cron ${e.label} has an invalid range "${n}"`);if(l>u)throw new Error(`cron ${e.label} range "${n}" is descending`);s=l,a=u}else{let l=Ae(n,e);if(l===void 0)throw new Error(`cron ${e.label} value "${n}" is out of range ${e.min}-${e.max}`);s=l,a=o===1?l:e.max}}for(let d=s;d<=a;d+=o)t.add(d)}function Ae(r,e){let t;if(/^\d+$/.test(r))t=Number(r);else if(e.names){let n=e.names.indexOf(r.toUpperCase());if(n===-1)return;t=e.label==="month"?n+1:n}else return;if(!(t<e.min||t>e.max))return t}var Lr=5*366+32;function $e(r,e){let t=Br(r),n=new Date(e);t.hasSeconds?(n.setUTCMilliseconds(0),n.setUTCSeconds(n.getUTCSeconds()+1)):(n.setUTCSeconds(0,0),n.setUTCMinutes(n.getUTCMinutes()+1));for(let o=0;o<Lr;o++){if(!t.months.has(n.getUTCMonth()+1)){n.setUTCMonth(n.getUTCMonth()+1,1),n.setUTCHours(0,0,0,0);continue}if(!Kr(t,n)){n.setUTCDate(n.getUTCDate()+1),n.setUTCHours(0,0,0,0);continue}if(!t.hours.has(n.getUTCHours())){n.setUTCHours(n.getUTCHours()+1,0,0,0);continue}if(!t.minutes.has(n.getUTCMinutes())){n.setUTCMinutes(n.getUTCMinutes()+1,0,0);continue}if(t.hasSeconds&&!t.seconds.has(n.getUTCSeconds())){n.setUTCSeconds(n.getUTCSeconds()+1,0);continue}return n.getTime()}throw new Error(`cron "${r}" has no matching time within ~5 years of ${new Date(e).toISOString()}`)}function Kr(r,e){let t=r.doms.has(e.getUTCDate()),n=r.dows.has(e.getUTCDay());return r.domRestricted&&r.dowRestricted?t||n:r.domRestricted?t:r.dowRestricted?n:!0}var Jr={now:()=>Date.now(),setTimer:(r,e)=>setTimeout(r,e),clearTimer:r=>clearTimeout(r)},Ht=2e9,je=class{controller;clock;onError;onRunStarted;onRunCompleted;onRunFailed;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");if(this.controller=e.controller,this.clock=e.clock??Jr,this.onError=e.onError,this.onRunStarted=e.onRunStarted,this.onRunCompleted=e.onRunCompleted,this.onRunFailed=e.onRunFailed,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)this.registerTrigger(t.id,t.trigger??{type:"manual"})}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 n=this.matchingIds(o=>o.type==="webhook"&&o.path===e).filter(o=>this.passesRateLimit(o,"webhook"));return Promise.all(n.map(o=>this.runWithLifecycle(o,{type:"webhook",payload:t})))}async onImMessage(e,t,n){let o=this.matchingIds(s=>s.type==="im-message"&&s.channel===e&&Gr(s.match,t)).filter(s=>this.passesRateLimit(s,"im-message")),i={...n,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[n,o]of this.triggers)e(o)&&t.push(n);return t}registerTrigger(e,t){if(this.unregister(e),this.triggers.set(e,t),t.type==="schedule"){let n=$e(t.cron,this.clock.now());this.armCron(e,t.cron,n)}}armCron(e,t,n){let o=Math.max(0,n-this.clock.now()),i={cron:t,fireAt:n,handle:void 0};o>Ht?i.handle=this.clock.setTimer(()=>{this.cronArms.get(e)===i&&this.armCron(e,t,n)},Ht):i.handle=this.clock.setTimer(()=>this.fireCron(e,i),o),this.cronArms.set(e,i)}fireCron(e,t){if(this.cronArms.get(e)!==t)return;let n;try{n=$e(t.cron,t.fireAt)}catch(o){this.cronArms.delete(e),this.onError(o,e);return}this.armCron(e,t.cron,n),this.passesRateLimit(e,"schedule")&&this.runWithLifecycle(e,{type:"schedule"}).catch(o=>this.onError(o,e))}passesRateLimit(e,t){if(this.minTriggerIntervalMs<=0)return!0;let n=this.clock.now(),o=this.lastFireAt.get(e);return o!==void 0&&n-o<this.minTriggerIntervalMs?(this.onTriggerDropped?.(e,t,{sinceLastMs:n-o,minIntervalMs:this.minTriggerIntervalMs}),!1):(this.lastFireAt.set(e,n),!0)}async runWithLifecycle(e,t){let n;try{n=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?.(n,t.type)}catch(o){this.reportLifecycleCallbackError(e,"completion",o)}return n}reportLifecycleCallbackError(e,t,n){let o=n instanceof Error?n.message:String(n);try{this.onError(new Error(`Workflow ${e} ${t} notification failed: ${o}`),e)}catch{}}};function Gr(r,e){return r===void 0?!0:new RegExp(r).test(e)}import{join as _t}from"node:path";import{mkdir as Vr,rm as zr}from"node:fs/promises";function Yr(r,e,t){return _t(Z().getProjectAgentDir(r),"workflows",e,"runs",t)}var De=class{constructor(e,t,n){this.workflowId=t;this.runId=n;if(!e)throw new Error("FileRunCheckpoint requires a project cwd");if(!t)throw new Error("FileRunCheckpoint requires a workflowId");if(!n)throw new Error("FileRunCheckpoint requires a runId");this.dir=Yr(e,t,n),this.file=_t(this.dir,"cache.json")}workflowId;runId;dir;file;async load(){return j(this.file)}async persist(e){await Vr(this.dir,{recursive:!0});let t={workflowId:this.workflowId,runId:this.runId,entries:e,updatedAt:new Date().toISOString()};await D(this.file,t)}async clear(){await zr(this.dir,{recursive:!0,force:!0})}};import*as B from"node:fs";import*as de from"node:path";var Ce=class{file;constructor(e){this.file=de.join(e,"audit.jsonl")}append(e){try{B.mkdirSync(de.dirname(this.file),{recursive:!0}),B.appendFileSync(this.file,`${JSON.stringify(e)}
|
|
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(`
|
|
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}
|
|
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)}
|
|
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
|
-
`)}}list(e,t=100){let
|
|
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 Te=3,Qr=/token|secret|authorization|api[-_]?key|apikey|password|credential|cookie|passphrase|private[-_]?key/i,Xr=new Set(["tool","skill","mcp"]);function Y(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Zr(r){if(Xr.has(r.kind))throw new Error(`workflow bundle: node "${r.name??r.id}" uses legacy kind "${r.kind}"; use an Agent plugin or canonical Action node`)}function We(r,e,t){if(Array.isArray(r)){for(let n=0;n<r.length;n+=1)We(r[n],`${e}[${n}]`,t);return}if(Y(r))for(let[n,o]of Object.entries(r)){if(Qr.test(n)&&o!==void 0&&o!==null&&o!=="")throw new Error(`workflow bundle: node "${t.name??t.id}" contains embedded authentication or secret field "${e}.${n}"; configure it in the owning MCP or Provider module`);We(o,`${e}.${n}`,t)}}function Me(r){for(let e of r.nodes)Zr(e),e.params!==void 0&&We(e.params,"params",e)}function qt(r){Me(r);let e=new Map,t=(n,o)=>{let i=`${n.category}:${n.ref}`,s=e.get(i);s?s.nodeIds.includes(o)||s.nodeIds.push(o):e.set(i,{...n,nodeIds:[o]})};for(let n of r.nodes){let o=n.params??{};switch(n.kind){case"agent":{let i=J(o.agentId);if(t({category:"agent",kind:"agent",ref:i,label:`Agent: ${i}`},n.id),Array.isArray(o.mcpPlugins))for(let s of o.mcpPlugins)!Y(s)||typeof s.id!="string"||!s.id||t({category:"mcp",kind:"plugin",ref:s.id,label:`MCP plugin: ${s.id}`},n.id);break}case"action":{let i=typeof o.toolName=="string"?o.toolName:"";i&&t({category:"mcp",kind:"action",ref:i,label:`MCP action: ${i}`},n.id);break}case"channel":{let i=typeof o.channel=="string"?o.channel:"";i&&t({category:"channel",kind:"channel",ref:i,label:`Channel: ${i}`},n.id);break}case"memory":t({category:"memory",kind:"memory",ref:"memory",label:"Memory"},n.id);break;default:break}}return[...e.values()]}function eo(r){Me(r.def);let e=structuredClone(r.def);return{schemaVersion:Te,name:r.name,def:e,...r.trigger?{trigger:structuredClone(r.trigger)}:{},concurrency:r.concurrency,requires:qt(e),meta:{source:"native"}}}function to(r){let e=typeof r=="string"?JSON.parse(r):r;if(!Y(e))throw new Error("workflow bundle: payload must be an object");if(e.schemaVersion!==Te)throw new Error(`workflow bundle: unsupported schemaVersion ${String(e.schemaVersion)} (expected ${Te})`);if(typeof e.name!="string"||!e.name)throw new Error("workflow bundle: `name` is required");let t=e.def;if(!Y(t)||!Array.isArray(t.nodes)||!Array.isArray(t.edges))throw new Error("workflow bundle: `def.nodes` and `def.edges` are required arrays");let n=e.concurrency;if(n!==void 0&&n!=="queue"&&n!=="skip"&&n!=="parallel")throw new Error(`workflow bundle: invalid concurrency "${String(n)}"`);let o=t;return Me(o),{name:e.name,def:o,trigger:Y(e.trigger)?e.trigger:void 0,concurrency:n,requires:qt(o)}}export{De as FileRunCheckpoint,Vn as HOST_BACKED_KINDS,K as NodeRegistry,v as PatchError,Ce as WorkflowAuditStore,Ne as WorkflowController,Ie as WorkflowRunHistoryStore,V as WorkflowRuntime,je as WorkflowScheduler,he as WorkflowStore,Ee as applyPatch,_r as createQlaExecutorHost,Hr as defaultRuntimeFactory,to as fromWorkflowBundle,ie as hostExecutors,Re as renderWorkflow,eo as toWorkflowBundle,N 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 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};
|