flujo-ai 3.23.0 → 3.24.0
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/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +47 -44
- package/.next/app-path-routes-manifest.json +7 -7
- package/.next/build-manifest.json +4 -4
- package/.next/routes-manifest.json +19 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/api/approvals/[id]/route.js +1 -1
- package/.next/server/app/api/approvals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/approvals/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/approvals/route.js +1 -1
- package/.next/server/app/api/approvals/route.js.nft.json +1 -1
- package/.next/server/app/api/approvals/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/backup/route.js.nft.json +1 -1
- package/.next/server/app/api/backup/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/browse/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/bugs/enhance/route.js +1 -1
- package/.next/server/app/api/bugs/enhance/route.js.nft.json +1 -1
- package/.next/server/app/api/bugs/enhance/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/cwd/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js +1 -1
- package/.next/server/app/api/encryption/secure/route.js.nft.json +1 -1
- package/.next/server/app/api/encryption/secure/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/env/route.js +1 -1
- package/.next/server/app/api/env/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/compile/route.js +1 -1
- package/.next/server/app/api/flow/compile/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generate/route.js +1 -1
- package/.next/server/app/api/flow/generate/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/improve/route.js +1 -1
- package/.next/server/app/api/flow/improve/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/improve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route.js +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/prompt-renderer/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/quick-chat/route.js +1 -1
- package/.next/server/app/api/flow/quick-chat/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/quick-chat/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/repair/route.js +1 -1
- package/.next/server/app/api/flow/repair/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/repair/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/init/route.js +1 -1
- package/.next/server/app/api/init/route.js.nft.json +1 -1
- package/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/capability/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/pull/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/local-models/suggest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/cancel/route.js +1 -1
- package/.next/server/app/api/mcp/cancel/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/get/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/prompts/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/read/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/resources/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/[toolName]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route.js +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/[name]/tools/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js +1 -1
- package/.next/server/app/api/mcp/servers/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/servers/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/test-connection/route.js +1 -1
- package/.next/server/app/api/mcp/test-connection/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test-connection/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route.js +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/test-connection/stream/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp-registry/route.js +1 -1
- package/.next/server/app/api/mcp-registry/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp-registry/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/mcp-registry/spotlight/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/[id]/route.js +1 -1
- package/.next/server/app/api/model/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/model/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/provider/route.js +1 -1
- package/.next/server/app/api/model/provider/route.js.nft.json +1 -1
- package/.next/server/app/api/model/provider/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/route.js +1 -1
- package/.next/server/app/api/model/route.js.nft.json +1 -1
- package/.next/server/app/api/model/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/model/test/route.js +1 -1
- package/.next/server/app/api/model/test/route.js.nft.json +1 -1
- package/.next/server/app/api/model/test/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js +1 -1
- package/.next/server/app/api/oauth/reset/route.js.nft.json +1 -1
- package/.next/server/app/api/oauth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/run/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/[id]/runs/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/preview-schedule/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/reconcile/route.js +1 -1
- package/.next/server/app/api/planned-executions/reconcile/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/reconcile/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/route.js +1 -1
- package/.next/server/app/api/planned-executions/route.js.nft.json +1 -1
- package/.next/server/app/api/planned-executions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runs/active/route.js +1 -1
- package/.next/server/app/api/runs/active/route.js.nft.json +1 -1
- package/.next/server/app/api/runs/active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/waves/route.js +1 -1
- package/.next/server/app/api/waves/route.js.nft.json +1 -1
- package/.next/server/app/api/waves/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/webhooks/[id]/route.js +1 -1
- package/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/webhooks/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/chat/page.js +8 -8
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +2 -2
- package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +1 -1
- package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/executions.html +1 -1
- package/.next/server/app/executions.rsc +1 -1
- package/.next/server/app/flows/page.js +1 -1
- package/.next/server/app/flows/page.js.nft.json +1 -1
- package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/flows.html +1 -1
- package/.next/server/app/flows.rsc +2 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +1 -1
- package/.next/server/app/mcp/page.js +2 -2
- package/.next/server/app/mcp/page.js.nft.json +1 -1
- package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-flows/route.js +1 -1
- package/.next/server/app/mcp-flows/route.js.nft.json +1 -1
- package/.next/server/app/mcp-flows/route_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js +1 -1
- package/.next/server/app/mcp-proxy/[server]/route.js.nft.json +1 -1
- package/.next/server/app/mcp-proxy/[server]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp.html +1 -1
- package/.next/server/app/mcp.rsc +2 -2
- package/.next/server/app/models/page.js +1 -1
- package/.next/server/app/models/page.js.nft.json +1 -1
- package/.next/server/app/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/v1/chat/completions/route.js +1 -1
- package/.next/server/app/v1/chat/completions/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/completions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/breakpoints/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/cancel/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/continue/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/debug/step/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/edit-state/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/respond/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/[conversationId]/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/route.js +2 -2
- package/.next/server/app/v1/chat/conversations/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/models/route.js +1 -1
- package/.next/server/app/v1/models/route.js.nft.json +1 -1
- package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
- package/.next/server/app/waves.html +1 -1
- package/.next/server/app/waves.rsc +1 -1
- package/.next/server/app-paths-manifest.json +7 -7
- package/.next/server/chunks/{1556.js → 2998.js} +1 -1
- package/.next/server/chunks/3291.js +1 -0
- package/.next/server/chunks/3823.js +5 -4
- package/.next/server/chunks/4545.js +17 -0
- package/.next/server/chunks/4561.js +5 -4
- package/.next/server/chunks/4771.js +2 -2
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7362.js +4 -4
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7723.js +1 -0
- package/.next/server/chunks/7821.js +1 -1
- package/.next/server/chunks/8652.js +1 -1
- package/.next/server/edge-instrumentation.js +2 -0
- package/.next/server/edge-instrumentation.js.map +1 -0
- package/.next/server/edge-runtime-webpack.js +2 -0
- package/.next/server/edge-runtime-webpack.js.map +1 -0
- package/.next/server/functions-config-manifest.json +2 -2
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +33 -2
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/src/middleware.js +14 -0
- package/.next/server/src/middleware.js.map +1 -0
- package/.next/static/chunks/3454-a8db9caba457e5fa.js +1 -0
- package/.next/static/chunks/3730-149f2f058529f75f.js +1 -0
- package/.next/static/chunks/4749-f8796d16ff604d54.js +1 -0
- package/.next/static/chunks/{6730-c330b55cd0fe4f47.js → 6257-ee5d8d88050d7705.js} +1 -1
- package/.next/static/chunks/{9181-8d8ecd3f641b7209.js → 8611-f6d51119761d52ff.js} +3 -3
- package/.next/static/chunks/app/chat/page-6a5b5f9ea2542fb3.js +1 -0
- package/.next/static/chunks/app/flows/{page-1844e86dd43fa285.js → page-fbce5abe34500f28.js} +1 -1
- package/.next/static/chunks/app/mcp/{page-b6866f49f76a6801.js → page-8666173926cabf31.js} +1 -1
- package/.next/static/chunks/app/models/{page-5a13ea6ff5ac1b9c.js → page-18dbd8e01cf87e98.js} +1 -1
- package/.next/static/chunks/{main-be8e823624954fab.js → main-9bda5041078d2b6a.js} +1 -1
- package/.next/trace +8 -8
- package/README.md +1 -1
- package/next.config.mjs +139 -119
- package/package.json +1 -1
- package/.next/server/chunks/264.js +0 -17
- package/.next/server/chunks/8357.js +0 -1
- package/.next/static/chunks/5545-2ab6e5d749e103cd.js +0 -1
- package/.next/static/chunks/6920-a83ad5c0d5a54cf3.js +0 -1
- package/.next/static/chunks/app/chat/page-ea6752144d35c892.js +0 -1
- /package/.next/static/{WRUzIBdypUJvv0xAct8qc → eUM7C1boixGI469h5wtIk}/_buildManifest.js +0 -0
- /package/.next/static/{WRUzIBdypUJvv0xAct8qc → eUM7C1boixGI469h5wtIk}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
"use strict";exports.id=4561,exports.ids=[4561],exports.modules={8336:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},8918:(a,b,c)=>{c.d(b,{Fp:()=>f,M5:()=>d,Po:()=>e});let d=(a,b,c,d,e)=>({type:"model",code:a,message:b,modelId:c,requestId:d,details:e}),e=(a,b,c,d,e)=>({type:"tool",code:a,message:b,toolName:c,toolArgs:d,details:e}),f=(a,b,c,d,e)=>({type:"mcp",code:a,message:b,serverName:c,operation:d,details:e})},18975:(a,b,c)=>{function d(a){return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0}function e(a){let b=a.length-1;for(;b>=0;b--){let c=a[b];if(!("tool"===c.role||d(c)))break}let c=a.slice(b+1);return c.some(d)?c:[]}function f(a,b,c){if(!b||"full-history"===b)return a;let d=a.filter(a=>"system"===a.role);if("isolated"===b)return[...d,{role:"user",content:c??"",id:"isolated-input",timestamp:0},...e(a)];let f=-1;for(let b=a.length-1;b>=0;b--)if("user"===a[b].role){f=b;break}return -1===f?a:[...d,...a.slice(f)]}function g(a){return a.tool_calls.some(a=>"function"===a.type&&i(a.function.name))}function h(a,b){if(0===b.size)return a;let c=a.length-e(a).length,f=Array(c).fill(!1);for(let b=0;b<c;){let e=a[b].processNodeId,h=b;for(;h<c&&a[h].processNodeId===e;)h++;let i=!1;if(e)for(let c=b;c<h;c++){let b=a[c];if("assistant"===b.role&&k(b)&&(!d(b)||g(b))){i=!0;break}}for(let a=b;a<h;a++)f[a]=i;b=h}let h=new Set,i=[],j=!1;for(let e=0;e<a.length;e++){let l=a[e];if(e<c){if(d(l)&&l.processNodeId&&b.has(l.processNodeId)&&f[e]){for(let a of l.tool_calls)h.add(a.id);if(j=!0,g(l)&&k(l)){let{tool_calls:a,...b}=l;i.push(b)}continue}if("tool"===l.role&&l.tool_call_id&&h.has(l.tool_call_id)){j=!0;continue}}i.push(l)}return j?i:a}function i(a){return"handoff"===a||a.startsWith("handoff_to_")}function j(a,b){return[b,...a.filter(a=>"system"!==a.role)]}function k(a){return"string"==typeof a.content?a.content.trim().length>0:!!Array.isArray(a.content)&&a.content.length>0}function l(a){
|
|
1
|
+
"use strict";exports.id=4561,exports.ids=[4561],exports.modules={8336:(a,b,c)=>{c.d(b,{A$:()=>g});let d="_-_-_",e=/^(tool|resource):(.+)$/,f=/\$\{((?:tool|resource):[^}]+|_-_-_[^}]+)\}/g;function g(a){let b,c=[];for(f.lastIndex=0;null!==(b=f.exec(a));){let a=function(a){let b=e.exec(a);if(b){let a=b[1],c=function(a){let b=a.indexOf("__");if(b<=0)return null;let c=a.slice(b+2);return c?{server:a.slice(0,b),name:c}:null}(b[2]);return c?{kind:a,server:c.server,name:c.name}:null}if(a.startsWith(d)){let b=a.split(d);if(3===b.length&&b[1]&&b[2])return{kind:"tool",server:b[1],name:b[2]}}return null}(b[1]);a&&c.push({...a,fullMatch:b[0],index:b.index})}return c}},8918:(a,b,c)=>{c.d(b,{Fp:()=>f,M5:()=>d,Po:()=>e});let d=(a,b,c,d,e)=>({type:"model",code:a,message:b,modelId:c,requestId:d,details:e}),e=(a,b,c,d,e)=>({type:"tool",code:a,message:b,toolName:c,toolArgs:d,details:e}),f=(a,b,c,d,e)=>({type:"mcp",code:a,message:b,serverName:c,operation:d,details:e})},18975:(a,b,c)=>{function d(a){return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0}function e(a){let b=a.length-1;for(;b>=0;b--){let c=a[b];if(!("tool"===c.role||d(c)))break}let c=a.slice(b+1);return c.some(d)?c:[]}function f(a,b,c){if(!b||"full-history"===b)return a;let d=a.filter(a=>"system"===a.role);if("isolated"===b)return[...d,{role:"user",content:c??"",id:"isolated-input",timestamp:0},...e(a)];let f=-1;for(let b=a.length-1;b>=0;b--)if("user"===a[b].role){f=b;break}return -1===f?a:[...d,...a.slice(f)]}function g(a){return a.tool_calls.some(a=>"function"===a.type&&i(a.function.name))}function h(a,b){if(0===b.size)return a;let c=a.length-e(a).length,f=Array(c).fill(!1);for(let b=0;b<c;){let e=a[b].processNodeId,h=b;for(;h<c&&a[h].processNodeId===e;)h++;let i=!1;if(e)for(let c=b;c<h;c++){let b=a[c];if("assistant"===b.role&&k(b)&&(!d(b)||g(b))){i=!0;break}}for(let a=b;a<h;a++)f[a]=i;b=h}let h=new Set,i=[],j=!1;for(let e=0;e<a.length;e++){let l=a[e];if(e<c){if(d(l)&&l.processNodeId&&b.has(l.processNodeId)&&f[e]){for(let a of l.tool_calls)h.add(a.id);if(j=!0,g(l)&&k(l)){let{tool_calls:a,...b}=l;i.push(b)}continue}if("tool"===l.role&&l.tool_call_id&&h.has(l.tool_call_id)){j=!0;continue}}i.push(l)}return j?i:a}function i(a){return"handoff"===a||a.startsWith("handoff_to_")}function j(a,b){return[b,...a.filter(a=>"system"!==a.role)]}function k(a){return"string"==typeof a.content?a.content.trim().length>0:!!Array.isArray(a.content)&&a.content.length>0}function l(a){let b=new Set;for(let c of a)if("assistant"===c.role&&Array.isArray(c.tool_calls))for(let a of c.tool_calls)"function"===a.type&&i(a.function.name)&&b.add(a.id);let c=[];for(let d of a)if(("user"!==d.role||"string"!=typeof d.content||"The handoff was successful. Continue"!==d.content.trim())&&!("tool"===d.role&&d.tool_call_id&&b.has(d.tool_call_id))){if("assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.some(a=>"function"===a.type&&i(a.function.name))){let a=d.tool_calls.filter(a=>!("function"===a.type&&i(a.function.name)));if(a.length>0)c.push({...d,tool_calls:a});else if(k(d)){let{tool_calls:a,...b}=d;c.push(b)}continue}c.push(d)}return c}function m(a){return l(a).map(({id:a,timestamp:b,disabled:c,processNodeId:d,depth:e,usage:f,...g})=>g)}function n(a){return"string"==typeof a.content&&a.content.length>4e3?{...a,content:`${a.content.slice(0,4e3)}
|
|
2
|
+
…[truncated ${a.content.length-4e3} chars]`}:a}function o(a){let b=new Set;for(let c of a)c.id&&b.add(c.id);return b}function p(a){let{threaded:b,foldedView:c,scopedView:d,systemContent:e,inputMode:f}=a,g=l(d),h=o(c),i=o(d),j=o(g),k=[],m=0,p=0,q=0,r=0;for(let a of b){let b={id:a.id,role:a.role,status:"sent",preview:function(a,b){if("string"==typeof a.content)return a.content.slice(0,300);if(Array.isArray(a.content))try{return JSON.stringify(a.content).slice(0,300)}catch{}return""}(a,300),toolCallNames:function(a){if("assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let b=a.tool_calls.map(a=>"function"===a.type?a.function.name:void 0).filter(a=>!!a);return b.length>0?b:void 0}}(a)};"system"===a.role?b.status="system":a.id&&j.has(a.id)?(b.status="sent",m++):a.id&&i.has(a.id)?(b.status="handoff-stripped",b.reason='Removed as FLUJO handoff plumbing (handoff tool-call / result, or synthetic "Continue").',r++):a.id&&h.has(a.id)?(b.status="scoped-out",b.reason=`Outside this node's input scope (inputMode: ${f??"full-history"}).`,q++):(b.status="folded",b.reason="Settled tool exchange folded away (a node with outputMode: latest-message).",p++),k.push(b)}return{systemMessage:null!=e?{content:e}:null,wireMessages:g.map(n),provenance:k,counts:{threaded:b.length,sent:m,folded:p,scopedOut:q,handoffStripped:r},inputMode:f}}c.d(b,{Qv:()=>h,Ui:()=>j,ae:()=>m,ij:()=>f,oH:()=>p})},22861:(a,b,c)=>{c.d(b,{R:()=>e,j:()=>d});let d="flujo://run/",e={autoCaptureEnabled:!0,textThresholdChars:8192,maxResourceBytes:0x3200000,maxConversationBytes:0x10000000,replaceLargeTextWithStub:!1}},26485:(a,b,c)=>{c.d(b,{E5:()=>g,Jp:()=>d,O:()=>f,g4:()=>e});let d="TOOL_CALL",e="FINAL_RESPONSE",f="ERROR",g="STAY_ON_NODE"},27386:(a,b,c)=>{c.d(b,{S$:()=>e,T9:()=>f,qW:()=>h});let d=/\$\{var:([^}]+)\}/g;function e(a,b){if("string"!=typeof a||0===a.length||!d.test(a))return a;let c=b??{};return a.replace(d,(a,b)=>{let d=b.trim(),e=c[d];return"string"==typeof e?e:(console.warn(`[resolveRunVars] unknown variable "${d}"; substituting empty string`),"")})}function f(a){let b;if("string"!=typeof a||0===a.length)return[];let c=new Set;for(d.lastIndex=0;null!==(b=d.exec(a));){let a=b[1].trim();a&&c.add(a)}return[...c]}let g=/^[A-Za-z_][\w-]*$/;function h(a){return"string"==typeof a&&g.test(a)}},33132:(a,b,c)=>{c.d(b,{Ul:()=>g,g2:()=>f,ng:()=>j,pf:()=>h});let d=/\$\{kv:([^}]+)\}/g,e=["global","flow","folder"];function f(a){let b=(a??"").trim(),c=b.indexOf("/");if(c>0){let a=b.slice(0,c);if(e.includes(a))return{scope:a,key:b.slice(c+1).trim()}}return{scope:"folder",key:b}}function g(a,b){if("string"!=typeof a||0===a.length||!d.test(a))return a;let c=b??{};return a.replace(d,(a,b)=>{let d=b.trim(),e=c[d];return"string"==typeof e?e:(console.warn(`[resolveKvRefs] unknown kv reference "${d}"; substituting empty string`),"")})}function h(a){let b;if("string"!=typeof a||0===a.length)return[];let c=new Set;for(d.lastIndex=0;null!==(b=d.exec(a));){let a=b[1].trim();a&&c.add(a)}return[...c]}let i=/^[A-Za-z_][\w-]*$/;function j(a){return"string"==typeof a&&i.test(a)}},34115:(a,b,c)=>{c.d(b,{LB:()=>r,Os:()=>u,UG:()=>x,cc:()=>v,jM:()=>y,u8:()=>t});var d=c(29021),e=c(33873),f=c.n(e),g=c(44479),h=c(18230),i=c(63129);let j=(0,h.h)("backend/execution/flow/conversationLog"),k=new Set(["run:start","run:done","node:enter","node:exit","handoff","message","message:removed","tool:call","tool:result","usage","subflow:start","subflow:done","resource:read","resource:write","error"]),l=/^[A-Za-z0-9_-]+$/,m=f().join((0,i.ok)(),"db","conversation-logs");function n(a){return f().join(m,`${a}.jsonl`)}let o=new Map;function p(a,b){let c=(o.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{await d.promises.mkdir(m,{recursive:!0}),await d.promises.appendFile(n(a),b)});return o.set(a,c),c.finally(()=>{o.get(a)===c&&o.delete(a)})}function q(a){return`${JSON.stringify(a)}
|
|
2
3
|
`}function r(a){if(k.has(a.type)){if(!l.test(a.conversationId))return void j.warn("Refusing to log event for unsafe conversation id",{conversationId:a.conversationId});(function(a){try{if((0,g.isConversationDeleted)(a))return!1;let{FlowExecutor:b}=c(44561),d=b.conversationStates.get(a);if(!d)return!1;return!d.ephemeral}catch(b){return j.warn(`Could not resolve persistence policy for ${a}; not persisting.`,{err:b}),!1}})(a.conversationId)&&p(a.conversationId,q(a)).catch(b=>j.warn(`Failed to append event to conversation log ${a.conversationId}`,{err:b}))}}async function s(a,b){if(0===b.length||a.ephemeral)return;let c=a.conversationId;if(!c||!l.test(c)||(0,g.isConversationDeleted)(c))return;let d=b.map(a=>q({...a,conversationId:c,seq:-1,timestamp:Date.now()})).join("");try{await p(c,d)}catch(a){j.warn(`Failed to append ${b.length} event(s) to conversation log ${c}`,{err:a})}}function t(a){let b=o.get(a);return b?b.then(()=>void 0,()=>void 0):Promise.resolve()}async function u(a){let b;if(!l.test(a))return;try{b=await d.promises.readFile(n(a),"utf-8")}catch(b){if("ENOENT"===b.code)return;j.error(`Error reading conversation log ${a}:`,b);return}let c=[],e=0;for(let a of b.split("\n"))if(0!==a.trim().length)try{c.push(JSON.parse(a))}catch{e++}return e>0&&j.warn(`Skipped ${e} unparseable line(s) in conversation log ${a} (truncated append?)`),c}function v(a){let b=[],c=new Map;for(let d of a)if("message"===d.type){let a=d.message;if(!a||!a.id||"system"===a.role)continue;let e=d.depth??0,f=e>0?{...a,depth:e}:{...a},g=c.get(a.id);void 0!==g?b[g]=f:(c.set(a.id,b.length),b.push(f))}else if("message:removed"===d.type){let a=c.get(d.messageId);if(void 0===a)continue;for(let[e,f]of(b.splice(a,1),c.delete(d.messageId),c))f>a&&c.set(e,f-1)}return b}function w(a){return JSON.stringify([a.role,a.content,a.tool_calls??null,a.disabled??!1,a.processNodeId??null])}async function x(a,b){if(a.ephemeral)return;let c=a.conversationId;if(!c||!l.test(c))return;let d=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id),e=await z(c)?b.filter(a=>"system"!==a.role&&!!a.id):[],f=new Map(e.map(a=>[a.id,a])),g=new Set(d.map(a=>a.id)),h=[];for(let a of d){let b=f.get(a.id);b&&w(b)===w(a)||h.push({type:"message",message:a})}for(let a of e)g.has(a.id)||h.push({type:"message:removed",messageId:a.id});await s(a,h)}async function y(a){if(a.ephemeral)return!1;let b=a.conversationId;if(!b||!l.test(b))return!1;let c=await u(b);if(!c)return!1;let d=v(c).filter(a=>!((a.depth??0)>0)),e=(a.messages??[]).filter(a=>"system"!==a.role&&!!a.id).map(a=>a.id);if(d.length<=e.length)return!1;let f=new Set(d.map(a=>a.id));return!!e.every(a=>f.has(a))&&(j.info(`Recovered ${d.length-e.length} message(s) from the conversation log for ${b} (snapshot was behind).`),a.messages=d,!0)}async function z(a){if(!l.test(a))return!1;try{return await d.promises.access(n(a)),!0}catch{return!1}}},44479:(a,b,c)=>{c.r(b),c.d(b,{isCancelledByAncestry:()=>e,isConversationDeleted:()=>i,markConversationDeleted:()=>g,unmarkConversationDeleted:()=>h});var d=c(85701);function e(a,b){let c=a,e=new Set;for(let a=0;a<=d.A+1&&!(!c||e.has(c));a++){e.add(c);let a=b.get(c);if(!a)break;if(a.isCancelled)return!0;c=a.parentRunId}return!1}let f=new Set;function g(a){f.add(a)}function h(a){f.delete(a)}function i(a){return!!a&&f.has(a)}},44561:(a,b,c)=>{c.r(b),c.d(b,{FlowExecutor:()=>aC});var d=c(18230),e=c(26485),f=c(43304),g=c.n(f),h=c(86028),i=c(11659);let j=(0,d.h)("backend/execution/flow/pocketflow"),k="default";class l{constructor(){j.debug("BaseNode constructor called"),this.flow_params={},this.node_params={},this.successors=new Map}setParams(a,b){j.debug("setParams called with params",{params:a}),j.verbose("setParams input",{params:a,node_params:b}),this.flow_params=a,b&&(this.node_params=b),j.debug("setParams finished. flow_params count",{flow_params:this.flow_params?.length,node_params:this.node_params?.length}),j.verbose("setParams result",{flow_params:this.flow_params,node_params:this.node_params})}clone(){j.debug("clone called");let a=this._clone();return j.verbose("_clone result",{newNode:a}),a.flow_params=g()(this.flow_params),j.verbose("Cloned flow_params",{flow_params:a.flow_params}),a.node_params=g()(this.node_params),j.verbose("Cloned node_params",{node_params:a.node_params}),a.successors=new Map(this.successors),j.verbose("Cloned successors",{successors:a.successors}),j.verbose("clone finished"),a}addSuccessor(a,b=k){if(j.verbose(`addSuccessor called with action: ${b}`),this.successors.has(b))throw j.error(`Action ${b} already exists`),Error(`Action ${b} already exists`);this.successors.set(b,a),j.debug("addSuccessor finished. Successors",{successors:this.successors})}getSuccessor(a){if(j.debug(`getSuccessor called with name: ${a}`),!this.successors.has(a))return void j.error(`Successor ${a} not found`);let b=this.successors.get(a).clone();return j.debug("getSuccessor finished. Returning successor",{successor:b}),b}async execWrapper(a,b){j.debug("execWrapper called with prepResult",{prepResult:a}),j.verbose("execWrapper input",{prepResult:a,node_params:b});let c=await this.execCore(a,b);return j.debug("execWrapper finished. Result",{result:c}),j.verbose("execWrapper result",c),c}async run(a){j.debug("run called with sharedState",{sharedState:a}),j.debug("Current flow_params at start of run",{flow_params:this.flow_params}),j.verbose("run input",{sharedState:a,flow_params:this.flow_params,node_params:this.node_params});let b=await this.prep(a,this.node_params);j.verbose("run prepResult",b);let c=await this.execWrapper(b,this.node_params);j.verbose("run execResult",c);let d=await this.post(b,c,a,this.node_params);return j.debug("action",{action:d}),j.debug(`run finished. Returning action: ${d}`),j.verbose("run action result",{action:d,prepResult:b,execResult:c}),{action:d,prepResult:b,execResult:c}}}class m extends l{constructor(a){j.debug("Flow constructor called with start",{start:a}),super(),this.start=a}_clone(){j.debug("Flow _clone called");let a=new m(this.start);return j.debug("Flow _clone finished. Returning",{newFlow:a}),a}async getStartNode(){j.debug("getStartNode called");let a=this.start.clone();return j.debug("getStartNode finished. Returning",{clonedStart:a}),a}async execCore(a){throw j.error("Flow node does not support direct execution"),j.verbose("Flow execCore error",{error:"Flow node does not support direct execution"}),Error("Flow node does not support direct execution")}async prep(a,b){return j.debug("Flow prep called with sharedState",{sharedState:a}),j.verbose("Flow prep input",{sharedState:a,node_params:b}),j.debug("Flow prep finished. Returning empty object"),j.verbose("Flow prep result",{}),{}}async post(a,b,c,d){return j.debug("Flow post called with prepResult, execResult, and sharedState",{prepResult:a,execResult:b,sharedState:c}),j.verbose("Flow post input",{prepResult:a,execResult:b,node_params:d}),j.debug("Flow post finished. Returning DEFAULT_ACTION"),j.verbose("Flow post result",{action:k}),k}}let n=(0,d.h)("execution/nodes/StartNode.ts");class o extends l{async prep(a,b){n.info("prep() started");let c=b?.properties?.promptTemplate||"";n.info("Extracted promptTemplate",{promptTemplateLength:c.length,promptTemplatePreview:c.length>100?c.substring(0,100)+"...":c});let d={nodeId:b?.id||"",nodeType:"start",systemPrompt:c};return n.info("prep() completed"),d}async execCore(a,b){n.info("execCore() started"),n.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return n.verbose("execCore() execResult",JSON.stringify(c)),n.info("execCore() completed"),c}async post(a,b,c,d){if(n.info("post() started"),n.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"StartNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Start Node",timestamp:new Date().toISOString()}),n.info("Added StartNode tracking information")),a.systemPrompt){let b={role:"system",content:a.systemPrompt,id:crypto.randomUUID(),timestamp:Date.now()};c.messages.some(a=>"system"===a.role)||(c.messages.push(b),n.debug("Added system message",{contentLength:"string"==typeof b.content?b.content.length:"non-string content",contentPreview:"string"==typeof b.content&&b.content.length>50?b.content.substring(0,50)+"...":b.content}))}n.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(n.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return n.info(`post() completed, returning action: ${a}`),a}return n.info("post() completed, returning default action"),"default"}_clone(){return new o}}var p=c(12763),q=c(82464),r=c(8336);c(87507);let s=(0,d.h)("backend/utils/PromptRenderer");class t{async renderPrompt(a,b,c){let d=c?.renderMode||"rendered",e=c?.includeConversationHistory||!1;s.info(`Rendering prompt for node ${b} in flow ${a}`,{renderMode:d,includeConversationHistory:e});let{prompt:f,excludeModelPrompt:g,excludeStartNodePrompt:h,excludeSystemPrompt:i}=await this.findNodePrompt(b,a),j=c?.excludeModelPrompt!==void 0?c?.excludeModelPrompt:g,k=c?.excludeStartNodePrompt!==void 0?c?.excludeStartNodePrompt:h,l=c?.excludeSystemPrompt!==void 0?c?.excludeSystemPrompt:i;s.debug("Exclusion settings",{excludeModelPrompt:j,excludeStartNodePrompt:k,excludeSystemPrompt:l,fromOptions:{excludeModelPrompt:c?.excludeModelPrompt!==void 0,excludeStartNodePrompt:c?.excludeStartNodePrompt!==void 0,excludeSystemPrompt:c?.excludeSystemPrompt!==void 0}});let m="",n=null;if(!k){let b=await this.findStartNodePrompt(a);b&&(s.debug("Adding start node prompt",{length:b.length}),m+=b+"\n\n")}if(!j){let c=await this.findModelPrompt(b,a);c.prompt&&(s.debug("Adding model prompt",{modelId:c.modelId,length:c.prompt.length}),m+=c.prompt+"\n\n"),n=c.functionCallingSchema,c.reasoningSchema&&(m+=`Please use the following pattern to mark your reasoning: ${c.reasoningSchema}
|
|
3
4
|
|
|
4
5
|
`),n&&(m+=`Please use the following pattern to use a tool: ${n}
|
|
@@ -56,9 +57,9 @@ ${h.text}
|
|
|
56
57
|
--- end resource ${a} ---
|
|
57
58
|
`;else{var g;e=`[run resource "${a}": ${f.mimeType??f.kind} (${(g=f.size)<1024?`${g} B`:g<1048576?`${Math.round(g/1024)} KB`:`${(g/1048576).toFixed(1)} MB`}) at ${f.uri} — readable via the 'flujo' MCP server]`}c?.({type:"resource:read",node:d,server:"flujo",uri:f.uri,name:a,mimeType:f.mimeType,size:f.size,source:"res-ref"})}else O.warn(`\${res:${a}} entry exists but payload read failed; resolving to ''`,{uri:f.uri})}else O.warn(`\${res:${a}} has no matching run resource; resolving to ''`,{conversationId:b})}catch(b){O.error(`Failed to resolve \${res:${a}}; resolving to ''`,b)}f.set(a,e)}return a.replace(P,(a,b)=>f.get(b)??"")}var R=c(55511),S=c(33132),T=c(51172);let U=(0,d.h)("backend/flow/execution/resolveKvNodeRefs"),V=/^[A-Za-z0-9_-]{1,64}$/;function W(a,b){if("global"===a)return"global";let c=()=>{let a=b.flowId;return a&&V.test(a)?`flow-${a}`:"global"};if("flow"===a)return c();let d=b.folder?.trim();if(d){let a=(0,R.createHash)("sha256").update(d).digest("hex").slice(0,32);return`folder-${a}`}return c()}async function X(a,b){if("string"!=typeof a||!a.includes("${kv:"))return a;let c=(0,S.pf)(a),d={};for(let a of c){let{scope:c,key:e}=(0,S.g2)(a);if(!(0,S.ng)(e)){U.warn(`\${kv:${a}} has an invalid key; resolving to ''`),d[a]="";continue}try{let f=await (0,T.M3)(W(c,b),e);d[a]=f??""}catch(b){U.error(`Failed to resolve \${kv:${a}}; resolving to ''`,b),d[a]=""}}return(0,S.Ul)(a,d)}async function Y(a,b,c){let{scope:d,key:e}=(0,S.g2)(a);return(0,S.ng)(e)?(0,T.or)(W(d,c),e,b??""):{skipped:"invalid-name"}}var Z=c(89850);let $=(0,d.h)("backend/flow/execution/nodes/ProcessNode");class _ extends l{async generateHandoffTools(a){$.info("Generating handoff tools");let b=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));$.debug("Found standard actions for handoff tools",{actionsCount:b.length,actions:b});let c=[],d=new Set;for(let a of b){let b=this.successors instanceof Map?this.successors.get(a):this.successors[a];if(!b){$.warn(`Target node not found for edge ${a}`);continue}let e=b.node_params?.id||"unknown";d.has(e)||(d.add(e),c.push({id:e,label:b.node_params?.label||"Unknown Node",type:b.node_params?.type||"unknown"}))}let e=function(a){let b=new Set,c=new Map;for(let d of a){if(c.has(d.id))continue;let a=function(a,b){let c=(a&&a.trim()||b&&b.trim()||"node").toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return c.length>48&&(c=c.slice(0,48).replace(/_+$/g,"")),c||(c=b&&b.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_")||"node"),c||"node"}(d.label,d.type),e=`${L}${a}`;if(b.has(e)){let c=2;for(;b.has(`${L}${a}_${c}`);)c++;e=`${L}${a}_${c}`}b.add(e),c.set(d.id,e)}return c}(c);a.handoffNameMap=a.handoffNameMap||{};let f=null;try{let b=await i.flowService.getFlow(a.flowId);b&&(f=new Map(b.nodes.map(a=>[a.id,a])))}catch(a){$.warn("Could not load flow for handoff descriptions; using basic descriptions",{err:a})}let g=[];for(let b of c){let c=e.get(b.id)||`handoff_to_${b.id}`;a.handoffNameMap[c]=b.id;let d=f?.get(b.id),h=d?await K(d):`Hand off execution to ${b.label} (${b.type})`,i=d?.data?.properties,j="subflow"===b.type&&i?.inputMode==="isolated"&&i?.allowCallerPrompt===!0,k="subflow"===b.type&&i?.allowCallerFanout===!0,l={},m=[];j&&(l.prompt={type:"string",description:"Instruction/prompt to run the target subflow with (isolated mode). Optional; omitted falls back to the subflow's default prompt."},m.push('Optionally pass a "prompt" argument to instruct the target subflow; omit it to use its default prompt.')),k&&(l.parallelFlows={type:"array",items:{type:"string"},description:"Flow ids (or names) to run CONCURRENTLY as parallel subflow lanes — the agentic fan-out set. Choose which flows to run in parallel; each must be an existing flow (unknown ids are dropped, the count is capped). Omit to use the node's configured targets."},l.concurrencyLimit={type:"number",description:"Optional: max lanes to run at once (bounded worker pool). Omit for the node default."},m.push('Optionally pass "parallelFlows" (an array of flow ids) to fan out several flows in parallel, with an optional "concurrencyLimit"; omit to use the node\'s configured targets.'));let n=Object.keys(l).length>0;g.push({name:c,description:m.length>0?`${h}
|
|
58
59
|
|
|
59
|
-
${m.join("\n\n")}`:h,inputSchema:{type:"object",properties:n?l:{},required:[]}}),$.debug("Created handoff tool",{toolName:c,targetNodeId:b.id,targetNodeLabel:b.label})}return $.info("Generated handoff tools",{toolsCount:g.length}),g}async prep(a,b){$.info("prep() started");let c=b?.id,d=a.flowId,e=b?.properties?.boundModel,f=b?.properties?.excludeModelPrompt||!1,g=b?.properties?.excludeStartNodePrompt||!1,h=b?.properties?.excludeSystemPrompt||!1;if($.debug("Extracted properties",{nodeId:c,flowId:d,boundModel:e,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:h}),!c||!d)throw $.error("Missing required node or flow ID",{nodeId:c,flowId:d}),Error("Process node requires node ID and flow ID");if(!e)throw $.error("Missing bound model"),Error("Process node requires a bound model");$.info("Using promptRenderer to build the complete prompt");let j=await u.renderPrompt(d,c,{renderMode:"rendered",includeConversationHistory:!1,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:h,onResourceRead:b=>a.emit?.({type:"resource:read",node:{nodeId:c},source:"pill",...b})}),k=await Q((0,N.S$)(j,a.variables),a.ephemeral?void 0:a.conversationId,a.emit,{nodeId:c}),l=null,m=async()=>{let a;if(l)return l;try{a=(await i.flowService.getFlow(d))?.folder}catch{}return l={flowId:d,folder:a}};k.includes("${kv:")&&(k=await X(k,await m()));let n=b?.properties?.resourceNodes||[];n.length>0&&(k+=await A.processResourceNodes({resourceNodes:n,conversationId:a.ephemeral?void 0:a.conversationId,emit:a.emit})),$.debug("Prompt rendered successfully",{completePromptLength:k.length,completePromptPreview:k.length>100?k.substring(0,100)+"...":k}),a.currentNodeId=c;let o=[];if(a.mcpContext&&a.mcpContext.availableTools&&a.mcpContext.availableTools.length>0)$.info("Using MCP tools from shared state",{toolsCount:a.mcpContext.availableTools.length}),o=a.mcpContext.availableTools;else{let a=b?.properties?.mcpNodes||[];if(a.length>0){$.info("No MCP tools found in shared state, processing MCP nodes",{mcpNodesCount:a.length});let b=await v.ToolHandler.processMCPNodes({mcpNodes:a});if(!b.success)throw $.error("Failed to process MCP nodes",{error:b.error}),Error(`Failed to process MCP nodes: ${b.error.message}`);o=b.value.availableTools}}for(let b of(o=[...o,...await this.generateHandoffTools(a)],a.toolNameMap=a.toolNameMap||{},o))b.server&&b.originalName&&(a.toolNameMap[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let p={nodeId:c,nodeType:"process",currentPrompt:k,boundModel:e,availableTools:o,messages:[],conversationId:a.conversationId,requireToolApproval:a.requireApproval??!1},q={id:(0,Z.A)(),role:"system",content:k,timestamp:Date.now()};$.info("Added system message from prompt template",{contentLength:k.length,contentPreview:k.length>100?k.substring(0,100)+"...":k}),p.messages=(0,B.Ui)(a.messages,q);let r=b?.properties?.inputMode??"full-history",s=p.messages;try{let a=await i.flowService.getFlow(d),b=new Set((a?.nodes??[]).filter(a=>"process"===a.type&&a.data?.properties?.outputMode==="latest-message").map(a=>a.id));s=(0,B.Qv)(p.messages,b)}catch(a){$.warn("Could not resolve outputMode collapse set; sending the full wire view",{err:a})}if("full-history"!==r||s!==p.messages){let d=b?.properties?.isolatedPrompt,e=void 0!==d?await Q((0,N.S$)(d,a.variables),a.ephemeral?void 0:a.conversationId,a.emit,{nodeId:c}):d;"string"==typeof e&&e.includes("${kv:")&&(e=await X(e,await m())),p.wireMessages=(0,B.ij)(s,r,e)}return $.info("Assembled node context",{systemMessageCount:1,totalMessageCount:p.messages.length,inputMode:r,wireMessageCount:p.wireMessages?.length}),$.info("prep() completed",{completePromptLength:k.length,boundModel:e,hasTools:!!p.availableTools?.length,toolsCount:p.availableTools?.length||0,messagesCount:p.messages.length}),p}async execCore(a,b){$.info("execCore() started",{boundModel:a.boundModel,promptLength:a.currentPrompt?.length,messagesCount:a.messages?.length||0}),$.debug("execCore() prepResult",a);try{let c,d;if(a.availableTools&&a.availableTools.length>0){let b=v.ToolHandler.prepareTools({availableTools:a.availableTools});if(!b.success)throw $.error("Failed to prepare tools",{error:b.error}),Error(`Failed to prepare tools: ${b.error.message}`);d=b.value.tools}let e={};for(let b of a.availableTools??[])b.server&&b.originalName&&(e[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let f=b?.label||b?.properties?.name||"Process Node",g=a.messages&&a.messages.length>0?a.messages[a.messages.length-1]:null;$.debug(`[ProcessNode ${a.nodeId}] Calling ModelHandler.callModel`,{modelId:a.boundModel,messageCount:a.messages?.length||0,toolCount:d?.length||0,lastMessageType:g?.role,lastMessageToolCallId:g?.role==="tool"?g.tool_call_id:void 0,lastMessageContentPreview:"string"==typeof g?.content?g.content.substring(0,100)+"...":"(non-string content)"});try{(c=await w.s.callModel({modelId:a.boundModel,prompt:a.currentPrompt,messages:a.messages,wireMessages:a.wireMessages,tools:d,iteration:1,maxIterations:1,maxTurns:b?.properties?.maxTurns,nodeName:f,nodeId:a.nodeId,toolNameMap:e,conversationId:a.conversationId,requireToolApproval:a.requireToolApproval})).success?$.debug(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned successfully`,{success:!0,hasContent:!!c.value?.content,contentLength:c.value?.content?.length||0,toolCallsCount:c.value?.toolCalls?.length||0}):$.warn(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned failure state unexpectedly here`,{success:!1,error:c.error})}catch(b){throw $.error(`[ProcessNode ${a.nodeId}] Error calling ModelHandler.callModel`,{error:b}),b}finally{$.debug(`[ProcessNode ${a.nodeId}] Finished attempt to call ModelHandler.callModel`)}if(!c||!c.success){let a=c?.error||{message:"Unknown model execution error after call attempt."};$.error("Model execution error after call attempt",{error:a});let b=Error(`Model execution failed: ${c.error.message}`);throw b.isModelError=!0,b.details={message:c.error.message,type:c.error.type,code:c.error.code,..."model"===c.error.type?{modelId:c.error.modelId}:{},param:"string"==typeof c.error.details?.param?c.error.details.param:void 0,status:"number"==typeof c.error.details?.status?c.error.details.status:void 0,...c.error.details},$.error("Throwing critical model error to abort flow execution",{error:c.error.message,type:c.error.type,code:c.error.code}),b}let h=c.value,i={success:!0,content:h.content||"",messages:h.messages,fullResponse:h.fullResponse,toolCalls:h.toolCalls};return h.toolCalls&&h.toolCalls.length>0&&$.info("Tool calls found in model response",{toolCallsCount:h.toolCalls.length,toolNames:h.toolCalls.map(a=>a.name).join(", ")}),$.info("execCore() completed",{responseLength:i.content?.length||0,messagesCount:i.messages?.length||0,hasToolCalls:!!i.toolCalls?.length}),$.verbose("execCore() execResult",i),i}catch(b){if(b&&"object"==typeof b&&("isCriticalToolError"in b||"isModelError"in b)){let a=b instanceof Error?b.message:String(b);throw $.error("Critical error detected - propagating to abort flow:",{error:a,isModelError:"isModelError"in b,isCriticalToolError:"isCriticalToolError"in b}),b}let a={success:!1,error:b instanceof Error?b.message:String(b),errorDetails:b instanceof Error?{message:b.message,name:b.name,stack:b.stack}:{message:String(b)}};return $.error("execCore() failed",{error:a.error,errorDetails:a.errorDetails}),$.verbose("execCore() errorResult",a),a}}processHandoffToolCalls(a,b){if(!a||0===a.length)return!1;$.info("Processing tool calls for handoff requests",{toolCallsCount:a.length});let c=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));for(let d of a){let{name:a}=d;if(a.startsWith("handoff_to_")){let d=b.handoffNameMap?.[a]||a.replace("handoff_to_","");for(let e of c){let c=this.successors instanceof Map?this.successors.get(e):this.successors[e];if(c&&c.node_params?.id===d)return b.handoffRequested={edgeId:e,targetNodeId:d},$.info(`Handoff requested to node ${d}`,{edgeId:e,toolName:a}),!0}}}return!1}orderedControlEdges(a){let b=a?.orderedOutgoingEdges;return Array.isArray(b)&&b.length>0?b:(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"))}async post(a,b,c,d){if($.debug(`[ProcessNode ${d?.id}] post() method started.`),$.info("post() started",{execResultSuccess:b.success,execResultContentLength:b.content?.length||0,messagesCount:b.messages?.length||0,toolCallsCount:b.toolCalls?.length||0}),!b.success)return c.lastResponse={success:!1,error:b.error,errorDetails:b.errorDetails},Array.isArray(c.trackingInfo.nodeExecutionTracker),$.warn(`Execution failed for node ${d?.id}. Returning ERROR_ACTION.`),e.O;c.lastResponse=b.content||"";let f=d?.properties?.captureVariable?.trim();b.success&&f&&(c.variables=c.variables??{},c.variables[f]=b.content??"",$.info("Captured node output into run variable",{captureVariable:f,nodeId:d?.id}));let g=d?.properties?.captureResource?.trim();if(b.success&&g&&c.conversationId&&!c.ephemeral)try{let a=await (0,x.tm)({conversationId:c.conversationId,name:g,mimeType:"text/markdown",kind:"text",data:{text:b.content??""},producedBy:{source:"capture",nodeId:d?.id,nodeName:d?.properties?.name}});"skipped"in a?$.warn("captureResource skipped by store cap",{captureResource:g,reason:a.skipped}):(c.emit?.({type:"resource:write",node:{nodeId:d?.id??"unknown",nodeName:d?.properties?.name,nodeType:"process"},server:"flujo",uri:a.uri,name:g,mimeType:a.mimeType,size:a.size,source:"capture"}),$.info("Captured node output into run resource",{captureResource:g,uri:a.uri,nodeId:d?.id}))}catch(a){$.error("captureResource failed; continuing run",a)}let j=d?.properties?.captureKv?.trim();if(b.success&&j)try{let a;try{a=(await i.flowService.getFlow(c.flowId))?.folder}catch{}let e=await Y(j,b.content??"",{flowId:c.flowId,folder:a});"skipped"in e?$.warn("captureKv skipped",{captureKv:j,reason:e.skipped}):$.info("Captured node output into persistent kv",{captureKv:j,nodeId:d?.id})}catch(a){$.error("captureKv failed; continuing run",a)}if(b.messages&&b.messages.length>0&&(c.messages=b.messages.filter(a=>"system"!==a.role),$.info("Updated messages in sharedState (system prompt excluded)",{messagesCount:c.messages.length})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"ProcessNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Process Node",modelDisplayName:a.modelDisplayName||"Unknown Model",modelTechnicalName:a.boundModel||"unknown",allowedTools:d?.properties?.allowedTools?.join(", "),timestamp:new Date().toISOString()}),$.info("Added ProcessNode tracking information",{modelDisplayName:a.modelDisplayName,modelTechnicalName:a.boundModel})),this.processHandoffToolCalls(b.toolCalls,c)&&c.handoffRequested){let a=c.handoffRequested.edgeId;return $.info(`Handoff requested via tool call, returning edge ID: ${a}`),a}let k=b.toolCalls?.filter(a=>!a.name.startsWith("handoff_to_"));if(k&&k.length>0)return $.info("Non-handoff tool calls detected, returning TOOL_CALL_ACTION"),e.Jp;let l=d?.edgeConditions;if(l&&Object.keys(l).length>0){let a=this.orderedControlEdges(d);for(let b of a){let a=l[b];if(!a)continue;let d=(0,M.PP)(c.messages,a.target);if((0,M.F9)(a,d))return $.info("Deterministic edge condition matched; routing",{edgeId:b,kind:a.kind}),b}let b=a.find(a=>!l[a]);if(b)return $.info("No edge condition matched; routing to bare fallback edge",{edgeId:b}),b;$.info("Conditioned node: no predicate matched and no bare fallback; terminating")}return $.info("No tool calls or handoff requested, returning FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new _}}var aa=c(8918);let ab=(0,d.h)("backend/flow/execution/handlers/MCPHandler");class ac{static async executeMCP(a){let{mcpServer:b,enabledTools:c,nodeId:d,nodeRoots:e}=a;ab.verbose("executeMCP input",JSON.stringify(a));try{d&&q.mcpService.setNodeRoots(b,d,e);let a=await q.mcpService.getServerStatus(b);if("connected"!==a.status){let a=await q.mcpService.connectServer(b);if(!a.success){let c={success:!1,error:(0,aa.Fp)("server_connection_failed",`Failed to connect to MCP server: ${a.error}`,b,"connect")};return ab.verbose("executeMCP connection error",JSON.stringify(c)),c}}let f=await q.mcpService.listServerTools(b);if(f.error){let a={success:!1,error:(0,aa.Fp)("list_tools_failed",`Failed to list tools for server: ${f.error}`,b,"listTools")};return ab.verbose("executeMCP list tools error",JSON.stringify(a)),a}let g={success:!0,value:{server:b,tools:f.tools||[],enabledTools:c}};return ab.verbose("executeMCP success result",JSON.stringify(g)),g}catch(c){let a={success:!1,error:(0,aa.Fp)("mcp_execution_failed",c instanceof Error?c.message:String(c),b,"executeMCP")};return ab.verbose("executeMCP execution error",JSON.stringify(a)),a}}}var ad=c(59448);let ae=(0,d.h)("backend/flow/execution/nodes/MCPNode");class af extends l{async prep(a,b){ae.info("prep() started");let c=b?.id||"",d=b?.properties?.boundServer,e=b?.properties?.enabledTools||[],f=b?.properties?.roots||[];if(!d)throw ae.error("Missing bound server"),Error("MCP node requires a bound server");return ae.info("prep() completed",{mcpServer:d,enabledToolsCount:e.length,nodeRootsCount:f.length}),{nodeId:c,nodeType:"mcp",mcpServer:d,enabledTools:e,nodeRoots:f}}async execCore(a,b){ae.info("execCore() started",{mcpServer:a.mcpServer}),ae.verbose("execCore() prepResult",JSON.stringify(a));try{let b=await ac.executeMCP({mcpServer:a.mcpServer,enabledTools:a.enabledTools,nodeId:a.nodeId,nodeRoots:a.nodeRoots});if(!b.success)throw ae.error("MCP execution failed",{error:b.error}),Error(`MCP execution failed: ${b.error.message}`);let c={success:!0,server:b.value.server,tools:b.value.tools,enabledTools:b.value.enabledTools};return ae.info("execCore() completed",{server:c.server,toolsCount:c.tools?.length||0,enabledToolsCount:c.enabledTools?.length||0}),ae.verbose("execCore() execResult",JSON.stringify(c)),c}catch(b){let a={success:!1,error:b instanceof Error?b.message:String(b)};return ae.error("execCore() failed",{error:a.error}),ae.verbose("execCore() errorResult",JSON.stringify(a)),a}}async post(a,b,c,d){if(ae.info("post() started",{server:b.server,toolsCount:b.tools?.length||0,enabledToolsCount:b.enabledTools?.length||0}),ae.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"MCPNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"MCP Node",timestamp:new Date().toISOString()}),ae.info("Added MCPNode tracking information")),b.success&&b.server&&b.tools){let a=d?.properties?.toolTimeout,e=b.tools.filter(a=>b.enabledTools?.includes(a.name)).map(c=>({...c,originalName:c.name,server:b.server,name:(0,ad.Y6)(b.server,c.name),timeout:a}));if(c.mcpContext){let a=[...c.mcpContext.availableTools||[]];for(let b of e)a.some(a=>a.name===b.name)||a.push(b);c.mcpContext.availableTools=a}else c.mcpContext={server:b.server,availableTools:e};for(let a of(c.toolNameMap=c.toolNameMap||{},e))c.toolNameMap[a.name]={server:b.server,tool:a.originalName,timeout:a.timeout};let f=e.map(a=>a.name);ae.info("Stored MCP context in shared state",{server:b.server,availableToolsCount:e.length,availableToolNames:f.length>10?f.slice(0,10).join(", ")+"...":f.join(", "),totalToolsCount:c.mcpContext.availableTools.length})}ae.info("post() completed"),ae.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(ae.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return ae.info(`Returning action: ${a}`),a}return"default"}_clone(){return new af}}let ag=(0,d.h)("backend/flow/execution/nodes/FinishNode");class ah extends l{async prep(a,b){ag.debug("prep() started");let c={nodeId:b?.id||"",nodeType:"finish",messages:a.messages};return ag.debug("prep() completed",{messagesCount:c.messages.length,hasSystemPrompt:c.messages.some(a=>"system"===a.role)}),c}async execCore(a,b){ag.debug("execCore() started",{messagesCount:a.messages.length}),ag.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return ag.verbose("execCore() execResult",JSON.stringify(c)),ag.info("execCore() completed"),c}async post(a,b,c,d){ag.info("post() started",{messagesCount:a.messages.length}),ag.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"FinishNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Finish Node",timestamp:new Date().toISOString()}),ag.info("Added FinishNode tracking information"));let f=a.messages[a.messages.length-1];f&&"assistant"===f.role&&f.content&&("string"==typeof f.content?c.lastResponse=f.content:c.lastResponse={content:f.content,role:f.role}),ag.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let g=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(ag.info("Actions:",{actionsCount:g.length,actions:g}),g.length>0){let a=g[0];return ag.info(`post() completed, returning action: ${a}`),a}return ag.info("post() completed, returning FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new ah}}var ai=c(44479);let aj=(0,d.h)("backend/execution/flow/nodes/SubflowNode");function ak(a){for(let b=a.length-1;b>=0;b--)if("user"===a[b].role)return a.slice(b);return a}function al(a,b){let c;if("lines"===b)return a.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0);try{c=JSON.parse(a)}catch{return[]}return Array.isArray(c)?c.map(a=>"string"==typeof a?a:JSON.stringify(a)):[]}function am(a,b,c){if("string"!=typeof a||""===a.trim())return[];let d=new Set,e=[];for(let f of al(a,b)){let a=f.trim();if(!(!a||d.has(a))){if(d.add(a),c&&a===c){aj.warn("Dynamic fan-out target refers to the running flow itself; skipping (recursion guard)",{id:a});continue}if(e.push(a),e.length>=32)break}}return e}function an(a,b,c,d,e,f){if(!a||!b)return;let g=f?{laneIndex:f.index,laneCount:f.count}:{};return b=>{let f=(b.depth??0)+1;return"run:start"===b.type?void a({type:"subflow:start",node:c,subflowId:d,subflowName:e,depth:f,...g}):"run:done"===b.type?void a({type:"subflow:done",node:c,subflowId:d,status:b.status,depth:f,...g}):"message"===b.type?void a({...b,depth:f,message:{...b.message,depth:f},...g}):void a({...b,depth:f,...g})}}class ao extends l{async prep(a,b){let d,e=b?.properties?.subflowId,f=a.handoffInput&&a.handoffInput.targetNodeId===b?.id?a.handoffInput:void 0;f&&(a.handoffInput=void 0);let g=(b?.properties?.parallelSubflowIds??[]).filter(a=>"string"==typeof a&&""!==a.trim()),h=b?.properties?.mapOverList===!0,i=b?.properties?.itemSplit==="lines"?"lines":"json-array",j=b?.properties?.sequential===!0,k=b?.properties?.parallelSubflowIdsVar?.trim(),l=!1;if(k){let b=am(a.variables?.[k],i,a.flowId);b.length>0?(g=b,l=!0,aj.info("Dynamic fan-out targets resolved from run variable",{variable:k,count:b.length})):aj.info("Dynamic fan-out variable resolved to no targets; using static parallelSubflowIds",{variable:k,staticCount:g.length})}if(b?.properties?.allowCallerFanout===!0&&f?.parallelFlows&&f.parallelFlows.length>0){let c=am(JSON.stringify(f.parallelFlows),"json-array",a.flowId);c.length>0&&(g=c,l=!0,"number"==typeof f.concurrencyLimit&&f.concurrencyLimit>=1&&(d=Math.floor(f.concurrencyLimit)),aj.info("Caller-chosen fan-out targets resolved from handoff tool",{count:c.length,nodeId:b?.id}))}let m=b?.properties?.promptTemplate?.trim(),n=b?.properties?.inputMode??(m?"isolated":"full-history"),o=b?.properties?.outputMode!=="final-only",p=b?.properties?.saveConversation!==!1,q={nodeId:b?.id||"",nodeType:"subflow",subflowId:e,depth:(a.runDepth??0)+1,chainDepth:a.chainDepth??0,parentRunId:a.conversationId,showSteps:o,persistConversation:p,emit:a.emit,nodeName:b?.properties?.name};if("isolated"===n)b?.properties?.allowCallerPrompt!==!1&&f?.prompt.trim()?(q.inputText=f.prompt,aj.info("Using caller-supplied prompt for isolated subflow",{nodeId:b?.id})):q.inputText=m??"";else{let b=function(a){let b=[];for(let d of a){var c;if("system"===d.role||"tool"===d.role||"assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.length>0||!("string"==typeof(c=d.content)?c.trim().length>0:!!Array.isArray(c)&&c.length>0))continue;let{processNodeId:a,...e}=d;b.push({...e})}return b}(a.messages);q.messages="latest-message"===n?ak(b):b}if(void 0!==q.inputText&&(q.inputText=await Q((0,N.S$)(q.inputText,a.variables),a.ephemeral?void 0:a.conversationId,a.emit,b?.id?{nodeId:b.id,nodeType:"subflow"}:void 0),q.inputText.includes("${kv:"))){let b;try{let{flowService:d}=await Promise.resolve().then(c.bind(c,11659));b=(await d.getFlow(a.flowId))?.folder}catch{}q.inputText=await X(q.inputText,{flowId:a.flowId,folder:b})}if(h&&g.length>0&&aj.warn("SubflowNode sets both mapOverList and parallelSubflowIds; ignoring mapOverList (fan-out precedence)",{nodeId:b?.id}),g.length>0){let a=g.map(a=>({subflowId:a}));try{let{flowService:b}=await Promise.resolve().then(c.bind(c,11659)),d=new Set;await Promise.all(a.map(async a=>{try{let c=await b.getFlow(a.subflowId);c?.name?a.subflowName=c.name:l&&!c&&d.add(a.subflowId)}catch{l&&d.add(a.subflowId)}})),l&&d.size>0&&(aj.warn("Dropping unknown dynamic fan-out target id(s)",{dropped:[...d]}),a=a.filter(a=>!d.has(a.subflowId)))}catch{}l&&0===a.length&&(q.fanOutResolvedEmpty=!0),q.lanes=a,q.concurrencyLimit=Math.max(1,d??b?.properties?.concurrencyLimit??4),q.joinSeparator=b?.properties?.joinSeparator??"\n\n",q.errorStrategy=b?.properties?.errorStrategy??"collect-all"}else if(h&&e){var r;let a,d=al((void 0!==q.inputText?q.inputText:"string"==typeof(r=ak(q.messages??[])[0]?.content)?r:Array.isArray(r)?r.map(a=>"string"==typeof a?a:"string"==typeof a?.text?a.text:"").join(""):"")??"",i);try{let{flowService:b}=await Promise.resolve().then(c.bind(c,11659)),d=await b.getFlow(e);d?.name&&(a=d.name)}catch{}q.lanes=d.map((b,c)=>({subflowId:e,subflowName:a,input:{prompt:b},itemIndex:c,itemCount:d.length})),q.mapOverList=!0,q.concurrencyLimit=j?1:Math.max(1,b?.properties?.concurrencyLimit??4),q.joinSeparator=b?.properties?.joinSeparator??"\n\n",q.errorStrategy=b?.properties?.errorStrategy??"collect-all"}else if(e)try{let{flowService:a}=await Promise.resolve().then(c.bind(c,11659)),b=await a.getFlow(e);b?.name&&(q.subflowName=b.name)}catch{}return aj.info("prep() completed",{subflowId:e,depth:q.depth,mode:n,historyCount:q.messages?.length,laneCount:q.lanes?.length,showSteps:o}),q}async execCore(a,b){let{runFlow:d}=await c.e(2823).then(c.bind(c,52823)),e={nodeId:a.nodeId,nodeName:a.nodeName,nodeType:"subflow"},f=a.messages?{messages:a.messages}:{prompt:a.inputText??""};if(a.lanes&&a.lanes.length>0)return this.execParallel(a,d,e,f);if(a.mapOverList||a.fanOutResolvedEmpty)return aj.info("execCore() resolved no lanes → nothing to run",{subflowId:a.subflowId,reason:a.fanOutResolvedEmpty?"dynamic-fanout-empty":"map-over-list-empty"}),{success:!0,outputText:"",subStatus:"completed",lanes:[]};if(!a.subflowId)return{success:!1,error:"Subflow node has no flow selected (subflowId is empty)."};let g=an(a.emit,a.showSteps,e,a.subflowId,a.subflowName);aj.info("execCore() running subflow",{subflowId:a.subflowId,depth:a.depth,showSteps:a.showSteps,foldingEvents:!!g});let h=await d({flowId:a.subflowId,...f,mode:a.persistConversation?"conversation":"ephemeral",flujo:!0,requireApproval:!1,debug:!1,depth:a.depth,chainDepth:a.chainDepth,parentRunId:a.parentRunId,...g?{emit:g}:{}});return"error"===h.status?{success:!1,error:h.error?.message||"Subflow execution failed",errorDetails:h.error?.details,subStatus:h.status}:{success:!0,outputText:h.outputText,subStatus:h.status}}async execParallel(a,b,d,e){let f=a.lanes??[],g=f.length,h=Math.max(1,a.concurrencyLimit??4),i=a.joinSeparator??"\n\n",j=a.errorStrategy??"collect-all";aj.info("execCore() running parallel subflows",{laneCount:g,concurrencyLimit:h,errorStrategy:j,depth:a.depth});let k=Array(g),l=0,m=!1,n=async c=>{let h=f[c],i=an(a.emit,a.showSteps,d,h.subflowId,h.subflowName,{index:h.itemIndex??c,count:h.itemCount??g});try{let d=await b({flowId:h.subflowId,...h.input??e,mode:"ephemeral",flujo:!0,requireApproval:!1,debug:!1,depth:a.depth,chainDepth:a.chainDepth,parentRunId:a.parentRunId,...i?{emit:i}:{}});k[c]="error"===d.status?{subflowId:h.subflowId,success:!1,error:d.error?.message||"Subflow execution failed"}:{subflowId:h.subflowId,success:!0,outputText:d.outputText}}catch(a){k[c]={subflowId:h.subflowId,success:!1,error:a instanceof Error?a.message:String(a)}}k[c].success||"fail-fast"!==j||(m=!0)},{FlowExecutor:o}=await Promise.resolve().then(c.bind(c,44561)),p=()=>(0,ai.isCancelledByAncestry)(a.parentRunId,o.conversationStates),q=async()=>{for(;;){if(m)return;if(p()){m=!0;return}let a=l++;if(a>=g)return;await n(a)}},r=Math.min(h,g);await Promise.all(Array.from({length:r},()=>q()));let s=k.filter(a=>void 0!==a),t=s.filter(a=>a.success),u=s.filter(a=>!a.success),v=u.length>0;if("fail-fast"===j&&v){let a=s.find(a=>!a.success);return{success:!1,error:a?.error||"A parallel subflow lane failed",subStatus:"error",lanes:s}}if(0===t.length)return{success:!1,error:"All parallel subflows failed",subStatus:"error",lanes:s};let w=t.map(a=>a.outputText??"").join(i);if(v){let a=u.map(a=>`- ${a.subflowId}: ${a.error??"unknown error"}`).join("\n");w+=`${i}[${u.length} parallel subflow(s) failed:
|
|
60
|
-
${a}]`}return{success:!0,outputText:w,subStatus:"completed",lanes:s,partial:v}}async post(a,b,d,f){if(h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(d.trackingInfo.nodeExecutionTracker)&&d.trackingInfo.nodeExecutionTracker.push({nodeType:"SubflowNode",nodeId:f?.id||"unknown",nodeName:f?.properties?.name||"Subflow Node",timestamp:new Date().toISOString()}),!b.success)return aj.error("Subflow failed",{subflowId:a.subflowId,error:b.error}),d.lastResponse={success:!1,error:b.error||"Subflow execution failed",errorDetails:b.errorDetails},e.O;let g=b.outputText??"",i={role:"assistant",content:g,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:f?.id};d.messages.push(i),d.lastResponse=g;let j=f?.properties?.captureVariable?.trim();j&&(d.variables=d.variables??{},d.variables[j]=g,aj.info("Captured subflow output into run variable",{captureVariable:j,nodeId:f?.id}));let k=f?.properties?.captureResource?.trim();if(k&&d.conversationId&&!d.ephemeral)try{let a=await (0,x.tm)({conversationId:d.conversationId,name:k,mimeType:"text/markdown",kind:"text",data:{text:g},producedBy:{source:"capture",nodeId:f?.id,nodeName:f?.properties?.name}});"skipped"in a?aj.warn("captureResource skipped by store cap",{captureResource:k,reason:a.skipped}):(d.emit?.({type:"resource:write",node:{nodeId:f?.id??"unknown",nodeName:f?.properties?.name,nodeType:"subflow"},server:"flujo",uri:a.uri,name:k,mimeType:a.mimeType,size:a.size,source:"capture"}),aj.info("Captured subflow output into run resource",{captureResource:k,uri:a.uri,nodeId:f?.id}))}catch(a){aj.error("captureResource failed; continuing run",a)}let l=f?.properties?.captureKv?.trim();if(l)try{let a;try{let{flowService:b}=await Promise.resolve().then(c.bind(c,11659));a=(await b.getFlow(d.flowId))?.folder}catch{}let b=await Y(l,g,{flowId:d.flowId,folder:a});"skipped"in b?aj.warn("captureKv skipped",{captureKv:l,reason:b.skipped}):aj.info("Captured subflow output into persistent kv",{captureKv:l,nodeId:f?.id})}catch(a){aj.error("captureKv failed; continuing run",a)}let m=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(m.length>0){let a=m[0];return aj.info(`post() completed, handing off via action: ${a}`),a}return aj.info("post() completed, no successor → FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new ao}}let ap=(0,d.h)("backend/flow/execution/nodes/ResourceNode");class aq extends l{async prep(a,b){return ap.warn("ResourceNode.prep() reached — resource nodes are config holders and should never execute",{nodeId:b?.id}),{}}async execCore(){return{}}async post(a,b,c,d){let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});return e.length>0?e[0]:"default"}_clone(){return new aq}}var ar=c(37860);let as=(0,d.h)("backend/flow/execution/nodes/SignalNode");class at extends l{async prep(a,b){let c=(b?.properties?.topic??"").trim(),d=b?.properties?.payloadTemplate??"";return as.info("prep() started",{nodeId:b?.id,topic:c,payloadTemplateLength:d.length}),{topic:c,payloadTemplate:d}}async execCore(){return{}}async post(a,b,c,d){as.info("post() started",{nodeId:d?.id,topic:a.topic}),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo?.nodeExecutionTracker)&&c.trackingInfo.nodeExecutionTracker.push({nodeType:"SignalNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Signal Node",timestamp:new Date().toISOString()});let e=a.topic;if(e)try{let b=(0,N.S$)(a.payloadTemplate??"",c.variables),d="schedule"===c.source?"schedule":"api"===c.source?"api":"chat";(0,ar.eh)().publish({kind:"signal",topic:e,payload:b,emitterFlowId:c.flowId,runId:c.conversationId||"",conversationId:c.conversationId||"",firedBy:d,chainDepth:c.chainDepth??0,timestamp:new Date().toISOString()}),as.info("Emitted signal",{topic:e,payloadLength:b.length,chainDepth:c.chainDepth??0})}catch(a){as.warn("Signal emit failed (ignored so the run continues):",a)}else as.warn("Signal node has no topic; nothing emitted",{nodeId:d?.id});let f=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});return f.length>0?f[0]:"default"}_clone(){return new at}}let au=(0,d.h)("backend/flow/execution/FlowConverter");class av{static convert(a){au.info("Converting React Flow to Pocket Flow",{flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}),au.verbose("convert input",JSON.stringify({flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}));let b=new Map;for(let c of a.nodes){au.debug(`Creating node: ${c.id} (${c.type})`);let a=this.createNode(c);b.set(c.id,a)}for(let c of a.edges){au.debug(`Connecting edge: ${c.id} (${c.source} -> ${c.target})`);let a=b.get(c.source),d=b.get(c.target);if(a&&d)if(c.data?.edgeType==="mcp"){let b,e;au.info(`Handling MCP connection: ${c.id} (${c.source} -> ${c.target})`),a instanceof _?(b=a,e=d):d instanceof _&&(b=d,e=a),b&&e?(b.node_params.properties||(b.node_params.properties={}),b.node_params.properties.mcpNodes||(b.node_params.properties.mcpNodes=[]),b.node_params.properties.mcpNodes.push({id:e.node_params.id,properties:e.node_params.properties}),au.info("Stored MCP node in Process node properties",{processNodeId:b.node_params.id,mcpNodeId:e.node_params.id})):au.warn(`Invalid MCP connection: ${c.id}. Could not find Process and MCP nodes.`,{sourceNodeType:a.constructor.name,targetNodeType:d.constructor.name})}else if(c.data?.edgeType==="resource"){let b,e,f;if(au.info(`Handling resource connection: ${c.id} (${c.source} -> ${c.target})`),a instanceof aq&&d instanceof _?(e=a,b=d,f="consume"):a instanceof _&&d instanceof aq&&(b=a,e=d,f="produce"),b&&e&&f){b.node_params.properties||(b.node_params.properties={}),b.node_params.properties.resourceNodes||(b.node_params.properties.resourceNodes=[]);let a=e.node_params.properties??{};b.node_params.properties.resourceNodes.push({id:e.node_params.id,role:f,properties:a}),"produce"===f&&"run"===a.scope&&a.runName&&!b.node_params.properties.captureResource&&(b.node_params.properties.captureResource=a.runName,au.info("Derived captureResource from produce edge",{processNodeId:b.node_params.id,runName:a.runName})),au.info("Stored resource node in Process node properties",{processNodeId:b.node_params.id,resourceNodeId:e.node_params.id,role:f})}else au.warn(`Invalid resource connection: ${c.id}. Could not find Process and Resource nodes.`,{sourceNodeType:a.constructor.name,targetNodeType:d.constructor.name})}else{let b=c.id||"default";a.addSuccessor(d,b),a.node_params.orderedOutgoingEdges=a.node_params.orderedOutgoingEdges||[],a.node_params.orderedOutgoingEdges.push(b);let e=c.data?.condition;if(e&&"object"==typeof e&&(a.node_params.edgeConditions=a.node_params.edgeConditions||{},a.node_params.edgeConditions[b]=e,au.info("Retained edge condition for routing",{edgeId:b,source:c.source})),c.data?.bidirectional){let e=`${b}__reverse`;d.addSuccessor(a,e),d.node_params.orderedOutgoingEdges=d.node_params.orderedOutgoingEdges||[],d.node_params.orderedOutgoingEdges.push(e),au.info(`Connected nodes (bidirectional): ${c.target} -> ${c.source} with action: ${e}`)}au.info(`Connected nodes: ${c.source} -> ${c.target} with action: ${b}`),a.successors instanceof Map?au.debug("Source node successors after connection:",{sourceNodeId:c.source,successorsCount:a.successors.size,successorsKeys:Array.from(a.successors.keys()),hasTargetNode:a.successors.has(b)}):au.warn("Source node successors is not a Map:",{sourceNodeId:c.source,successorsType:typeof a.successors})}else au.warn(`Failed to connect edge: ${c.id}`,{sourceExists:!!a,targetExists:!!d})}let c=a.nodes.find(a=>"start"===a.type);if(!c)throw au.error("No start node found in flow"),Error("Flow must have a start node");au.debug(`Found start node: ${c.id}`);let d=b.get(c.id);if(!d)throw au.error(`Failed to retrieve start node from map: ${c.id}`),Error("Failed to create start node");let e=new m(d);return au.debug("Created Pocket Flow with start node"),au.info("Flow conversion completed successfully",{nodeCount:b.size}),au.verbose("convert result",JSON.stringify({flowStartNodeId:e.node_params?.id||"unknown",nodesCount:b.size})),e}static createNode(a){let b,c;switch(au.debug(`Creating node of type: ${a.type}`,{nodeId:a.id,label:a.data.label}),au.verbose("createNode input",JSON.stringify({nodeId:a.id,nodeType:a.type,label:a.data.label,properties:a.data.properties})),a.type){case"start":b=new o,c={id:a.id,label:a.data.label,type:"start",properties:a.data.properties||{name:a.data.label}};break;case"process":b=new _,c={id:a.id,label:a.data.label,type:"process",properties:a.data.properties||{name:a.data.label}};break;case"mcp":b=new af,c={id:a.id,label:a.data.label,type:"mcp",properties:a.data.properties||{name:a.data.label}};break;case"finish":b=new ah,c={id:a.id,label:a.data.label,type:"finish",properties:a.data.properties||{name:a.data.label}};break;case"subflow":b=new ao,c={id:a.id,label:a.data.label,type:"subflow",properties:a.data.properties||{name:a.data.label}};break;case"resource":b=new aq,c={id:a.id,label:a.data.label,type:"resource",properties:a.data.properties||{name:a.data.label}};break;case"signal":b=new at,c={id:a.id,label:a.data.label,type:"signal",properties:a.data.properties||{name:a.data.label}};break;default:throw au.error(`Unknown node type: ${a.type}`,{nodeId:a.id}),Error(`Unknown node type: ${a.type}`)}return b.setParams({},c),au.debug("Node created and parameters set",{nodeId:a.id,type:a.type,propertiesKeys:Object.keys(c.properties||{})}),au.verbose("createNode result",JSON.stringify({nodeId:a.id,nodeType:a.type,nodeParams:c})),b}}let aw=(0,d.h)("backend/execution/flow/engine/PocketflowEngine");class ax{clearCache(a){a?this.pocketFlowCache.delete(a):this.pocketFlowCache.clear()}async resolveFlowDefinition(a){let b=a.flowId;if(this.pocketFlowCache.has(b))return aw.debug(`Using cached Pocket Flow for flowId: ${b}`),this.pocketFlowCache.get(b).clone();let c=a.flowSnapshot;if(c)aw.verbose(`Resolving flow ${b} from an in-memory quick-chat snapshot.`);else if(aw.verbose(`Loading and converting flow for flowId: ${b}`),!(c=await i.flowService.getFlow(b)??void 0))throw aw.error(`Flow not found for flowId: ${b}`),Error(`Flow not found: ${b}`);aw.info(`Found flow: ${c.name}`,{flowId:c.id,nodeCount:c.nodes.length,edgeCount:c.edges.length});let d=av.convert(c);return this.pocketFlowCache.set(b,d),aw.verbose(`Flow ${b} converted and cached.`),d.clone()}async findNodeById(a,b){aw.verbose(`Searching for node ${b} in flow ${a.node_params?.id}`);let c=await a.getStartNode(),d=[c],e=new Set,f=c.node_params?.id;for(f?e.add(f):aw.warn("Start node is missing an ID in its parameters.");d.length>0;){let a=d.shift();if(a.node_params?.id===b)return aw.verbose(`Found node ${b}`),a;if(a.successors instanceof Map)for(let b of a.successors.values()){let a=b.node_params?.id;"string"==typeof a&&a.length>0&&!e.has(a)&&(e.add(a),d.push(b.clone()))}}aw.warn(`Node ${b} not found in flow.`)}async resolveNode(a){let b,{conversationId:c,currentNodeId:d}=a,e=await this.resolveFlowDefinition(a);if(d)(b=await this.findNodeById(e,d))?aw.info(`Resuming conversation ${c} at node ${d}`):(aw.warn(`Resuming conversation ${c}, but node ${d} not found. Starting from beginning.`),b=await e.getStartNode());else{let d=a.messages.length>0?a.messages[a.messages.length-1]:null;d?.processNodeId?(aw.info(`Found processNodeId ${d.processNodeId} in last message. Attempting to resume from this node.`),(b=await this.findNodeById(e,d.processNodeId))?aw.info(`Resuming conversation ${c} from node ${d.processNodeId} based on last message.`):(aw.warn(`Could not find node ${d.processNodeId} from last message. Starting from beginning.`),b=await e.getStartNode())):(b=await e.getStartNode(),aw.info(`Starting conversation ${c} from the beginning.`))}if(!b)throw Error("Execution error: Cannot find starting node.");let f=b.node_params?.id;if("string"!=typeof f||0===f.length)throw Error(`Execution error: Node ${b.constructor.name} is missing an ID.`);return{handle:b,id:f,type:b.node_params?.type||"unknown",name:b.node_params?.label||"Unknown Node"}}async resolveHandoff(a,b){let{currentNodeId:c}=a;if(!c||!b)return{isSuccessorEdge:!1,targetNodeId:null};let d=await this.resolveFlowDefinition(a),e=await this.findNodeById(d,c);if(!e||!e.successors.has(b))return{isSuccessorEdge:!1,targetNodeId:null};let f=e.getSuccessor(b),g=f?.node_params?.id,h=f?.node_params?.type;return{isSuccessorEdge:!0,targetNodeId:"string"==typeof g&&g.length>0?g:null,targetNodeType:"string"==typeof h?h:null}}async runNode(a,b,c){let d=a.handle;c&&(b.emit=c);try{aw.debug(`[PocketflowEngine] Calling run() on node ${a.id} (${a.type})`);let c=await d.run(b);return aw.debug(`[PocketflowEngine] Node ${a.id} returned action: "${c.action}"`),{action:c.action,prepResult:c.prepResult,execResult:c.execResult}}finally{delete b.emit}}constructor(){this.pocketFlowCache=new Map}}let ay=(0,d.h)("backend/execution/flow/FlowExecutor"),az=["messages","availableTools","fullResponse","emit"];function aA(a){let{messages:b,executionTrace:c,emit:d,mcpContext:e,...f}=a,h=g()(f);return h.messageCount=b?.length??0,e&&(h.mcpContext={server:e.server,availableTools:[]}),h}function aB(a){if(!a||"object"!=typeof a)return a;let b=g()(a);for(let a of az)a in b&&delete b[a];return b}class aC{static get conversationStates(){return global.__flujo_conversation_states||(global.__flujo_conversation_states=new Map),global.__flujo_conversation_states}static get engine(){return global.__flujo_flow_engine||(global.__flujo_flow_engine=new ax),global.__flujo_flow_engine}static set engine(a){global.__flujo_flow_engine=a}static clearFlowCache(a){this.engine.clearCache(a)}static resolveHandoff(a,b){return this.engine.resolveHandoff(a,b)}static async peekNextNodeId(a){try{return(await this.engine.resolveNode(a)).id}catch{return null}}static async executeStep(a,b){let c,d,f,{conversationId:g,flowId:i,currentNodeId:j}=a;if("string"!=typeof g||0===g.length)return ay.error("executeStep called without a valid conversationId in sharedState."),a.lastResponse={success:!1,error:"Internal error: Missing conversationId."},{sharedState:a,action:e.O};ay.debug(`executeStep called for conversation ${g}`,{flowId:i,currentNodeId:j});let k=h.G.ENABLE_EXECUTION_TRACKER||!!a.debugMode,l=j;try{let e=await this.engine.resolveNode(a);l=e.id,a.currentNodeId=e.id,ay.info(`Executing step for node ${e.id} (${e.type}) in conversation ${g}`),k&&!a.executionTrace&&(a.executionTrace=[]),c=aA(a),b?.({type:"node:enter",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type}});let h=await this.engine.runNode(e,a,b),i=h.action;d=h.prepResult,f=h.execResult,b?.({type:"node:exit",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type},action:i}),ay.debug(`Node ${e.id} finished with action: ${i} for conversation ${g}`);let j=aA(a);if(k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:e.id,nodeType:e.type,nodeName:e.name,timestamp:new Date().toISOString(),actionTaken:i,stateBefore:c,stateAfter:j,prepResultSnapshot:aB(d),execResultSnapshot:aB(f)};a.executionTrace.push(h),ay.verbose(`Appended step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),ay.debug(`[FlowExecutor] Returning from executeStep for node ${e.id} with action: "${i}"`),{sharedState:a,action:i}}catch(i){let f=l||"unknown node";ay.error(`Error during node execution step for ${f} in conversation ${g}`,{error:i});let h=i?.details;if(a.lastResponse={success:!1,error:i instanceof Error?i.message:String(i),errorDetails:i instanceof Error?{name:i.name,message:i.message,stack:i.stack,...h&&"object"==typeof h?h:{}}:{message:String(i)}},a.currentNodeId=l,b?.({type:"error",node:l?{nodeId:l}:void 0,message:i instanceof Error?i.message:String(i)}),k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:f,nodeType:"unknown",nodeName:"Unknown Node",timestamp:new Date().toISOString(),actionTaken:e.O,stateBefore:c??aA(a),stateAfter:aA(a),prepResultSnapshot:d?aB(d):null,execResultSnapshot:{success:!1,error:a.lastResponse}};a.executionTrace.push(h),ay.verbose(`Appended ERROR step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),{sharedState:a,action:e.O}}}}},51172:(a,b,c)=>{c.d(b,{M3:()=>y,or:()=>x});var d=c(29021),e=c(33873),f=c.n(e),g=c(18230),h=c(63129),i=c(79111),j=c(89392);let k={enabled:!0,maxValueBytes:65536,maxKeysPerScope:512,maxScopeBytes:8388608},l=(0,g.h)("backend/services/kvStore"),m=f().join((0,h.ok)(),"db","kv-store"),n=/^[A-Za-z0-9_-]{1,64}$/;function o(a){if("string"!=typeof a||!n.test(a))throw Error(`Unsafe kv scope id: ${JSON.stringify(a)}`)}function p(a){if("string"!=typeof a||!n.test(a))throw Error(`Unsafe kv key name: ${JSON.stringify(a)}`)}let q=a=>f().join(m,a),r=a=>f().join(q(a),"index.json"),s=null;async function t(){let a;if(s&&Date.now()-s.at<3e4)return s.value;try{let b=await (0,i.YM)(j.Z.KV_STORE_SETTINGS,k);a={...k,...b}}catch(b){l.warn("Failed to load kv-store settings; using defaults",b),a=k}return s={value:a,at:Date.now()},a}let u=global.__flujo_kv_store??(global.__flujo_kv_store=new Map);async function v(a){let b=u.get(a);if(b)return b;let c=[];try{let b=await d.promises.readFile(r(a),"utf-8");if(b.trim().length>0){let a=JSON.parse(b);Array.isArray(a)&&(c=a)}}catch(b){"ENOENT"!==b.code&&l.error(`Failed to read kv index for scope ${a}; treating as empty`,b)}return u.set(a,c),c}async function w(a,b){return(0,i.l_)(`kv-store/${a}`,async()=>{let c=await v(a),{next:e,result:f}=b(c);return e!==c&&(u.set(a,e),await d.promises.mkdir(q(a),{recursive:!0}),await (0,i.Zf)(r(a),JSON.stringify(e,null,2))),f})}async function x(a,b,c,d){o(a),p(b);let e=await t();if(!e.enabled)return{skipped:"disabled"};let f="string"==typeof c?c:String(c??""),g=Buffer.byteLength(f,"utf8");return g>e.maxValueBytes?(l.warn(`kv write skipped (size ${g} > cap ${e.maxValueBytes})`,{scope:a,name:b}),{skipped:"size-cap"}):w(a,c=>{let h=c.find(a=>a.name===b);if(!h&&c.length>=e.maxKeysPerScope)return l.warn(`kv write skipped (keys ${c.length} >= cap ${e.maxKeysPerScope})`,{scope:a,name:b}),{next:c,result:{skipped:"keys-cap"}};let i=c.reduce((a,b)=>a+(b===h?0:b.size),0);if(i+g>e.maxScopeBytes)return l.warn(`kv write skipped (scope budget ${i}+${g} > ${e.maxScopeBytes})`,{scope:a,name:b}),{next:c,result:{skipped:"scope-cap"}};let j=Date.now(),k={scope:a,name:b,value:f,size:g,createdAt:h?.createdAt??j,updatedAt:j,expiresAt:d?.expiresAt},m=h?c.map(a=>a===h?k:a):[...c,k];return l.debug(`Set kv ${a}/${b}`,{size:g}),{next:m,result:k}})}async function y(a,b){var c;o(a),p(b);let d=(await v(a)).find(a=>a.name===b);if(d&&(c=Date.now(),"number"!=typeof d.expiresAt||d.expiresAt>c))return d.value}},59448:(a,b,c)=>{c.d(b,{$9:()=>g,Y6:()=>e,ud:()=>f});let d="_-_-_";function e(a,b){let c=function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(36)}(`${a}\0${b}`),d=64-(5+c.length),e=b.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,Math.max(0,d));return`mcp_${e}_${c}`}function f(a,b){if(b&&b[a])return b[a];if(a.includes(d)){let b=a.split(d);if(3===b.length)return{server:b[1],tool:b[2]}}return null}function g(a,b){return!!b&&!!b[a]||a.includes(d)}},70834:(a,b,c)=>{c.r(b),c.d(b,{ToolHandler:()=>i});var d=c(18230),e=c(8918),f=c(82464),g=c(59448);let h=(0,d.h)("backend/flow/execution/handlers/ToolHandler");class i{static sanitizeSchema(a){if(!a||"object"!=typeof a)return a;let b=JSON.parse(JSON.stringify(a));return"string"===b.type&&b.format&&"enum"!==b.format&&"date-time"!==b.format&&(b.description||(b.description=""),b.description+=` (format: ${b.format})`,delete b.format),b.properties&&Object.keys(b.properties).forEach(a=>{b.properties[a]=i.sanitizeSchema(b.properties[a])}),b.items&&(b.items=i.sanitizeSchema(b.items)),["oneOf","anyOf","allOf"].forEach(a=>{Array.isArray(b[a])&&(b[a]=b[a].map(a=>i.sanitizeSchema(a)))}),b}static prepareTools(a){let{availableTools:b}=a;if(h.verbose("prepareTools input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{tools:[]}};return h.verbose("prepareTools empty result",JSON.stringify(a)),a}try{for(let a of b){if(!a.name)return{success:!1,error:(0,e.Po)("invalid_tool","Tool missing required 'name' property","unknown")};if(!a.inputSchema)return{success:!1,error:(0,e.Po)("invalid_tool",`Tool '${a.name}' missing required 'inputSchema' property`,a.name)}}let a=[...b].sort((a,b)=>a.name<b.name?-1:+(a.name>b.name)).map(a=>({type:"function",function:{name:a.name,description:a.description||`Tool: ${a.name}`,parameters:i.sanitizeSchema(a.inputSchema)}})),c={success:!0,value:{tools:a}};return h.verbose("prepareTools success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Po)("tool_preparation_failed",b instanceof Error?b.message:String(b),"unknown")};return h.verbose("prepareTools error result",JSON.stringify(a)),a}}static async processMCPNodes(a){let{mcpNodes:b}=a;if(h.verbose("processMCPNodes input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{availableTools:[]}};return h.verbose("processMCPNodes empty result",JSON.stringify(a)),a}try{let a=[];for(let c of b){let b=c.properties;if(b&&b.boundServer){let d=b.boundServer,h=b.enabledTools||[],i=b.toolTimeout;f.mcpService.setNodeRoots(d,c.id,b.roots);let j=await f.mcpService.connectServer(d);if(!j.success)return{success:!1,error:(0,e.Fp)("server_connection_failed",`Failed to connect to MCP server '${d}': ${j.error}`,d,"connect")};let k=await f.mcpService.listServerTools(d);if(k.error)return{success:!1,error:(0,e.Fp)("list_tools_failed",`Failed to list tools for MCP server '${d}': ${k.error}`,d,"listTools")};for(let b of(k.tools||[]).filter(a=>h.includes(a.name)).map(a=>({originalName:a.name,server:d,name:(0,g.Y6)(d,a.name),timeout:i,description:a.description,inputSchema:a.inputSchema})))a.some(a=>a.name===b.name)||a.push(b)}}let c={success:!0,value:{availableTools:a}};return h.verbose("processMCPNodes success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Fp)("mcp_processing_failed",b instanceof Error?b.message:String(b),"unknown","processMCPNodes")};return h.verbose("processMCPNodes error result",JSON.stringify(a)),a}}}},71966:(a,b,c)=>{c.d(b,{FA:()=>B,Ns:()=>t,gy:()=>C,jR:()=>v,tm:()=>z,yP:()=>A});var d=c(29021),e=c(33873),f=c.n(e),g=c(55511),h=c(18230),i=c(63129),j=c(79111),k=c(89392),l=c(22861);let m=(0,h.h)("backend/services/runResources"),n=f().join((0,i.ok)(),"db","run-resources"),o=/^[A-Za-z0-9_-]{1,64}$/;function p(a,b){if("string"!=typeof a||!o.test(a))throw Error(`Unsafe run-resource ${b}: ${JSON.stringify(a)}`)}let q=a=>f().join(n,a),r=a=>f().join(q(a),"index.json"),s=(a,b)=>f().join(q(a),`${b}.dat`);function t(a){if("string"!=typeof a||!a.startsWith(l.j))return null;let b=a.slice(l.j.length).split("/");if(2!==b.length)return null;let[c,d]=b;return o.test(c)&&o.test(d)?{conversationId:c,id:d}:null}let u=null;async function v(){let a;if(u&&Date.now()-u.at<3e4)return u.value;try{let b=await (0,j.YM)(k.Z.RUN_RESOURCE_SETTINGS,l.R);a={...l.R,...b}}catch(b){m.warn("Failed to load run-resource settings; using defaults",b),a=l.R}return u={value:a,at:Date.now()},a}let w=global.__flujo_run_resources??(global.__flujo_run_resources=new Map);async function x(a){let b=w.get(a);if(b)return b;let c=[];try{let b=await d.promises.readFile(r(a),"utf-8");if(b.trim().length>0){let a=JSON.parse(b);Array.isArray(a)&&(c=a)}}catch(b){"ENOENT"!==b.code&&m.error(`Failed to read run-resource index for ${a}; treating as empty`,b)}return w.set(a,c),c}async function y(a,b){return(0,j.l_)(`run-resources/${a}`,async()=>{let c=await x(a),{next:d,result:e}=await b(c);return d!==c&&(w.set(a,d),await (0,j.Zf)(r(a),JSON.stringify(d,null,2))),e})}async function z(a){let b;p(a.conversationId,"conversationId");let c=await v(),e=null,f="utf8";a.data&&("text"in a.data?(e=Buffer.from(a.data.text,"utf8"),f="utf8"):(e=Buffer.from(a.data.base64,"base64"),f="base64"));let h=e?.byteLength??0;if(h>c.maxResourceBytes)return m.warn(`Run-resource write skipped (size ${h} > cap ${c.maxResourceBytes})`,{conversationId:a.conversationId,name:a.name,kind:a.kind}),{skipped:"size-cap"};let i=(0,g.randomUUID)(),j=await y(a.conversationId,async g=>{var j;let k=a.name?g.find(b=>b.name===a.name):void 0,n=g.reduce((a,b)=>a+(b===k?0:b.size),0);if(n+h>c.maxConversationBytes)return m.warn(`Run-resource write skipped (conversation budget ${n}+${h} > ${c.maxConversationBytes})`,{conversationId:a.conversationId,name:a.name,kind:a.kind}),{next:g,result:{skipped:"conversation-cap"}};let o={id:i,uri:(j=a.conversationId,`${l.j}${j}/${i}`),conversationId:a.conversationId,name:a.name,mimeType:a.mimeType,size:h,kind:a.kind,encoding:f,createdAt:Date.now(),producedBy:a.producedBy,origin:a.origin,readBy:[]};e&&(await d.promises.mkdir(q(a.conversationId),{recursive:!0}),await d.promises.writeFile(s(a.conversationId,i),e));let p=k?g.filter(a=>a!==k):g.slice();return p.push(o),b=k&&k.size>0?k:void 0,m.debug(`Stored run resource ${o.uri}`,{kind:o.kind,size:h,name:o.name}),{next:p,result:o}});return b&&d.promises.unlink(s(a.conversationId,b.id)).catch(()=>{}),j}async function A(a=200){let b=[];try{b=(await d.promises.readdir(n,{withFileTypes:!0})).filter(a=>a.isDirectory()&&o.test(a.name)).map(a=>a.name)}catch(a){if("ENOENT"===a.code)return[];throw a}let c=[];for(let a of b)c.push(...await x(a));return c.sort((a,b)=>b.createdAt-a.createdAt),c.slice(0,a)}async function B(a,b){return p(a,"conversationId"),(await x(a)).find(a=>a.name===b)??null}async function C(a,b){let c,e=t(a);if(!e)return null;let f=(await x(e.conversationId)).find(a=>a.id===e.id);if(!f)return null;if("link"===f.kind)c={contents:[{uri:f.uri,mimeType:f.mimeType??"text/plain",text:`Run resource link → ${f.origin?`${f.origin.server}: ${f.origin.uri}`:"unknown origin"}`}]};else{let b;try{b=await d.promises.readFile(s(e.conversationId,e.id))}catch(b){return m.error(`Run-resource payload missing for ${a}`,b),null}c="utf8"===f.encoding?{contents:[{uri:f.uri,mimeType:f.mimeType??"text/plain",text:b.toString("utf8")}]}:{contents:[{uri:f.uri,mimeType:f.mimeType??"application/octet-stream",blob:b.toString("base64")}]}}if(b)try{await y(e.conversationId,async a=>{let c=a.find(a=>a.id===e.id);if(!c)return{next:a,result:void 0};let d={...c,readBy:[...c.readBy,b]};return{next:a.map(a=>a===c?d:a),result:void 0}}),f.readBy.push(b)}catch(b){m.warn(`Failed to persist readBy for ${a}`,b)}return{entry:f,contents:c}}},78606:(a,b,c)=>{c.d(b,{C:()=>e,F9:()=>i,PP:()=>h,wM:()=>f});let d=["contains","regex","equals","always"];function e(a){return"string"==typeof a&&d.includes(a)}function f(a){try{return new RegExp(a),!0}catch{return!1}}function g(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>"string"==typeof a?a:a&&"object"==typeof a&&"text"in a&&"string"==typeof a.text?a.text:"").join(""):""}function h(a,b="last-assistant"){if(!Array.isArray(a)||0===a.length)return null;if("last-message"===b)return g(a[a.length-1]?.content);for(let b=a.length-1;b>=0;b--)if(a[b]?.role==="assistant")return g(a[b]?.content);return null}function i(a,b){let c;if(!a)return!1;let d="string"==typeof b?b:"",e="string"==typeof a.value?a.value:String(a.value??"");switch(a.kind){case"contains":c=a.ignoreCase?d.toLowerCase().includes(e.toLowerCase()):d.includes(e);break;case"equals":c=a.ignoreCase?d.toLowerCase()===e.toLowerCase():d===e;break;case"regex":{let b;try{b=new RegExp(e,a.ignoreCase?"i":void 0)}catch(a){return console.warn("[edgeConditions] invalid regex predicate; treating as no-match",e,a),!1}c=b.test(d);break}case"always":c=!0;break;default:return console.warn("[edgeConditions] unknown condition kind; treating as no-match",a.kind),!1}return a.negate?!c:c}},80808:(a,b,c)=>{c.d(b,{s:()=>w});var d=c(18230),e=c(8918),f=c(59448),g=c(18975),h=c(1191),i=c(12763),j=c(22124),k=c(25713),l=c(82464),m=c(69088),n=c(71966);let o=(0,d.h)("backend/services/runResources/capture");function p(a){var b;return`[FLUJO stored this ${a.mimeType??a.kind} (${(b=a.size)<1024?`${b} B`:b<1048576?`${Math.round(b/1024)} KB`:`${(b/1048576).toFixed(1)} MB`}) as run resource ${a.uri}. Read it back via the 'flujo' MCP server (resources/read) if needed.]`}async function q(a){let{conversationId:b,server:c,toolName:d,toolCallId:e,nodeId:f,result:g,settings:h}=a,i=[];if(g.isError||!Array.isArray(g.content))return{result:g,captured:i};let j={source:"tool-result",nodeId:f,server:c,toolName:d,toolCallId:e},k=async(a,e,f,g)=>{try{let h=await (0,n.tm)({conversationId:b,mimeType:f,kind:a,data:e,producedBy:g?{...j,source:"mcp-link"}:j,origin:g});if("skipped"in h)return o.warn(`Auto-capture skipped (${h.skipped}) for ${c}/${d}`),null;return i.push(h),h}catch(a){return o.error(`Auto-capture failed for ${c}/${d}; keeping inline content`,a),null}},l=[];for(let a of g.content)switch(a.type){case"image":case"audio":{let b=await k(a.type,{base64:a.data},a.mimeType);l.push(b?{type:"text",text:p(b)}:a);break}case"resource_link":await k("link",void 0,a.mimeType,{server:c,uri:a.uri}),l.push(a);break;case"resource":{let b=a.resource;if("string"==typeof b.blob){let d=b.blob,e=await k("blob",{base64:d},b.mimeType,{server:c,uri:b.uri});l.push(e?{type:"text",text:p(e)}:a)}else if("string"==typeof b.text){let d=b.text;if(d.length>=h.textThresholdChars){let e=await k("text",{text:d},b.mimeType??"text/plain",{server:c,uri:b.uri});e&&h.replaceLargeTextWithStub?l.push({type:"text",text:`${d.slice(0,1024)}
|
|
60
|
+
${m.join("\n\n")}`:h,inputSchema:{type:"object",properties:n?l:{},required:[]}}),$.debug("Created handoff tool",{toolName:c,targetNodeId:b.id,targetNodeLabel:b.label})}return $.info("Generated handoff tools",{toolsCount:g.length}),g}async prep(a,b){$.info("prep() started");let c=b?.id,d=a.flowId,e=b?.properties?.boundModel,f=b?.properties?.excludeModelPrompt||!1,g=b?.properties?.excludeStartNodePrompt||!1,j=b?.properties?.excludeSystemPrompt||!1;if($.debug("Extracted properties",{nodeId:c,flowId:d,boundModel:e,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:j}),!c||!d)throw $.error("Missing required node or flow ID",{nodeId:c,flowId:d}),Error("Process node requires node ID and flow ID");if(!e)throw $.error("Missing bound model"),Error("Process node requires a bound model");$.info("Using promptRenderer to build the complete prompt");let k=await u.renderPrompt(d,c,{renderMode:"rendered",includeConversationHistory:!1,excludeModelPrompt:f,excludeStartNodePrompt:g,excludeSystemPrompt:j,onResourceRead:b=>a.emit?.({type:"resource:read",node:{nodeId:c},source:"pill",...b})}),l=await Q((0,N.S$)(k,a.variables),a.ephemeral?void 0:a.conversationId,a.emit,{nodeId:c}),m=null,n=async()=>{let a;if(m)return m;try{a=(await i.flowService.getFlow(d))?.folder}catch{}return m={flowId:d,folder:a}};l.includes("${kv:")&&(l=await X(l,await n()));let o=b?.properties?.resourceNodes||[];o.length>0&&(l+=await A.processResourceNodes({resourceNodes:o,conversationId:a.ephemeral?void 0:a.conversationId,emit:a.emit})),$.debug("Prompt rendered successfully",{completePromptLength:l.length,completePromptPreview:l.length>100?l.substring(0,100)+"...":l}),a.currentNodeId=c;let p=[];if(a.mcpContext&&a.mcpContext.availableTools&&a.mcpContext.availableTools.length>0)$.info("Using MCP tools from shared state",{toolsCount:a.mcpContext.availableTools.length}),p=a.mcpContext.availableTools;else{let a=b?.properties?.mcpNodes||[];if(a.length>0){$.info("No MCP tools found in shared state, processing MCP nodes",{mcpNodesCount:a.length});let b=await v.ToolHandler.processMCPNodes({mcpNodes:a});if(!b.success)throw $.error("Failed to process MCP nodes",{error:b.error}),Error(`Failed to process MCP nodes: ${b.error.message}`);p=b.value.availableTools}}for(let b of(p=[...p,...await this.generateHandoffTools(a)],a.toolNameMap=a.toolNameMap||{},p))b.server&&b.originalName&&(a.toolNameMap[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let q={nodeId:c,nodeType:"process",currentPrompt:l,boundModel:e,availableTools:p,messages:[],conversationId:a.conversationId,requireToolApproval:a.requireApproval??!1},r={id:(0,Z.A)(),role:"system",content:l,timestamp:Date.now()};$.info("Added system message from prompt template",{contentLength:l.length,contentPreview:l.length>100?l.substring(0,100)+"...":l}),q.messages=(0,B.Ui)(a.messages,r);let s=b?.properties?.inputMode??"full-history",t=q.messages;try{let a=await i.flowService.getFlow(d),b=new Set((a?.nodes??[]).filter(a=>"process"===a.type&&a.data?.properties?.outputMode==="latest-message").map(a=>a.id));t=(0,B.Qv)(q.messages,b)}catch(a){$.warn("Could not resolve outputMode collapse set; sending the full wire view",{err:a})}if("full-history"!==s||t!==q.messages){let d=b?.properties?.isolatedPrompt,e=void 0!==d?await Q((0,N.S$)(d,a.variables),a.ephemeral?void 0:a.conversationId,a.emit,{nodeId:c}):d;"string"==typeof e&&e.includes("${kv:")&&(e=await X(e,await n())),q.wireMessages=(0,B.ij)(t,s,e)}if($.info("Assembled node context",{systemMessageCount:1,totalMessageCount:q.messages.length,inputMode:s,wireMessageCount:q.wireMessages?.length}),a.debugMode||h.G.ENABLE_EXECUTION_TRACKER)try{q.modelInput=(0,B.oH)({threaded:q.messages,foldedView:t,scopedView:q.wireMessages??t,systemContent:l,inputMode:s})}catch(a){$.warn("Could not derive model-input debug view",{err:a})}return $.info("prep() completed",{completePromptLength:l.length,boundModel:e,hasTools:!!q.availableTools?.length,toolsCount:q.availableTools?.length||0,messagesCount:q.messages.length}),q}async execCore(a,b){$.info("execCore() started",{boundModel:a.boundModel,promptLength:a.currentPrompt?.length,messagesCount:a.messages?.length||0}),$.debug("execCore() prepResult",a);try{let c,d;if(a.availableTools&&a.availableTools.length>0){let b=v.ToolHandler.prepareTools({availableTools:a.availableTools});if(!b.success)throw $.error("Failed to prepare tools",{error:b.error}),Error(`Failed to prepare tools: ${b.error.message}`);d=b.value.tools}let e={};for(let b of a.availableTools??[])b.server&&b.originalName&&(e[b.name]={server:b.server,tool:b.originalName,timeout:b.timeout});let f=b?.label||b?.properties?.name||"Process Node",g=a.messages&&a.messages.length>0?a.messages[a.messages.length-1]:null;$.debug(`[ProcessNode ${a.nodeId}] Calling ModelHandler.callModel`,{modelId:a.boundModel,messageCount:a.messages?.length||0,toolCount:d?.length||0,lastMessageType:g?.role,lastMessageToolCallId:g?.role==="tool"?g.tool_call_id:void 0,lastMessageContentPreview:"string"==typeof g?.content?g.content.substring(0,100)+"...":"(non-string content)"});try{(c=await w.s.callModel({modelId:a.boundModel,prompt:a.currentPrompt,messages:a.messages,wireMessages:a.wireMessages,tools:d,iteration:1,maxIterations:1,maxTurns:b?.properties?.maxTurns,nodeName:f,nodeId:a.nodeId,toolNameMap:e,conversationId:a.conversationId,requireToolApproval:a.requireToolApproval})).success?$.debug(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned successfully`,{success:!0,hasContent:!!c.value?.content,contentLength:c.value?.content?.length||0,toolCallsCount:c.value?.toolCalls?.length||0}):$.warn(`[ProcessNode ${a.nodeId}] ModelHandler.callModel returned failure state unexpectedly here`,{success:!1,error:c.error})}catch(b){throw $.error(`[ProcessNode ${a.nodeId}] Error calling ModelHandler.callModel`,{error:b}),b}finally{$.debug(`[ProcessNode ${a.nodeId}] Finished attempt to call ModelHandler.callModel`)}if(!c||!c.success){let a=c?.error||{message:"Unknown model execution error after call attempt."};$.error("Model execution error after call attempt",{error:a});let b=Error(`Model execution failed: ${c.error.message}`);throw b.isModelError=!0,b.details={message:c.error.message,type:c.error.type,code:c.error.code,..."model"===c.error.type?{modelId:c.error.modelId}:{},param:"string"==typeof c.error.details?.param?c.error.details.param:void 0,status:"number"==typeof c.error.details?.status?c.error.details.status:void 0,...c.error.details},$.error("Throwing critical model error to abort flow execution",{error:c.error.message,type:c.error.type,code:c.error.code}),b}let h=c.value,i={success:!0,content:h.content||"",messages:h.messages,fullResponse:h.fullResponse,toolCalls:h.toolCalls};return h.toolCalls&&h.toolCalls.length>0&&$.info("Tool calls found in model response",{toolCallsCount:h.toolCalls.length,toolNames:h.toolCalls.map(a=>a.name).join(", ")}),$.info("execCore() completed",{responseLength:i.content?.length||0,messagesCount:i.messages?.length||0,hasToolCalls:!!i.toolCalls?.length}),$.verbose("execCore() execResult",i),i}catch(b){if(b&&"object"==typeof b&&("isCriticalToolError"in b||"isModelError"in b)){let a=b instanceof Error?b.message:String(b);throw $.error("Critical error detected - propagating to abort flow:",{error:a,isModelError:"isModelError"in b,isCriticalToolError:"isCriticalToolError"in b}),b}let a={success:!1,error:b instanceof Error?b.message:String(b),errorDetails:b instanceof Error?{message:b.message,name:b.name,stack:b.stack}:{message:String(b)}};return $.error("execCore() failed",{error:a.error,errorDetails:a.errorDetails}),$.verbose("execCore() errorResult",a),a}}processHandoffToolCalls(a,b){if(!a||0===a.length)return!1;$.info("Processing tool calls for handoff requests",{toolCallsCount:a.length});let c=(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"));for(let d of a){let{name:a}=d;if(a.startsWith("handoff_to_")){let d=b.handoffNameMap?.[a]||a.replace("handoff_to_","");for(let e of c){let c=this.successors instanceof Map?this.successors.get(e):this.successors[e];if(c&&c.node_params?.id===d)return b.handoffRequested={edgeId:e,targetNodeId:d},$.info(`Handoff requested to node ${d}`,{edgeId:e,toolName:a}),!0}}}return!1}orderedControlEdges(a){let b=a?.orderedOutgoingEdges;return Array.isArray(b)&&b.length>0?b:(this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{})).filter(a=>!a.includes("-mcpEdge")&&!a.endsWith("mcpEdge")&&!a.includes("-mcp"))}async post(a,b,c,d){if($.debug(`[ProcessNode ${d?.id}] post() method started.`),$.info("post() started",{execResultSuccess:b.success,execResultContentLength:b.content?.length||0,messagesCount:b.messages?.length||0,toolCallsCount:b.toolCalls?.length||0}),!b.success)return c.lastResponse={success:!1,error:b.error,errorDetails:b.errorDetails},Array.isArray(c.trackingInfo.nodeExecutionTracker),$.warn(`Execution failed for node ${d?.id}. Returning ERROR_ACTION.`),e.O;c.lastResponse=b.content||"";let f=d?.properties?.captureVariable?.trim();b.success&&f&&(c.variables=c.variables??{},c.variables[f]=b.content??"",$.info("Captured node output into run variable",{captureVariable:f,nodeId:d?.id}));let g=d?.properties?.captureResource?.trim();if(b.success&&g&&c.conversationId&&!c.ephemeral)try{let a=await (0,x.tm)({conversationId:c.conversationId,name:g,mimeType:"text/markdown",kind:"text",data:{text:b.content??""},producedBy:{source:"capture",nodeId:d?.id,nodeName:d?.properties?.name}});"skipped"in a?$.warn("captureResource skipped by store cap",{captureResource:g,reason:a.skipped}):(c.emit?.({type:"resource:write",node:{nodeId:d?.id??"unknown",nodeName:d?.properties?.name,nodeType:"process"},server:"flujo",uri:a.uri,name:g,mimeType:a.mimeType,size:a.size,source:"capture"}),$.info("Captured node output into run resource",{captureResource:g,uri:a.uri,nodeId:d?.id}))}catch(a){$.error("captureResource failed; continuing run",a)}let j=d?.properties?.captureKv?.trim();if(b.success&&j)try{let a;try{a=(await i.flowService.getFlow(c.flowId))?.folder}catch{}let e=await Y(j,b.content??"",{flowId:c.flowId,folder:a});"skipped"in e?$.warn("captureKv skipped",{captureKv:j,reason:e.skipped}):$.info("Captured node output into persistent kv",{captureKv:j,nodeId:d?.id})}catch(a){$.error("captureKv failed; continuing run",a)}if(b.messages&&b.messages.length>0&&(c.messages=b.messages.filter(a=>"system"!==a.role),$.info("Updated messages in sharedState (system prompt excluded)",{messagesCount:c.messages.length})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"ProcessNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Process Node",modelDisplayName:a.modelDisplayName||"Unknown Model",modelTechnicalName:a.boundModel||"unknown",allowedTools:d?.properties?.allowedTools?.join(", "),timestamp:new Date().toISOString()}),$.info("Added ProcessNode tracking information",{modelDisplayName:a.modelDisplayName,modelTechnicalName:a.boundModel})),this.processHandoffToolCalls(b.toolCalls,c)&&c.handoffRequested){let a=c.handoffRequested.edgeId;return $.info(`Handoff requested via tool call, returning edge ID: ${a}`),a}let k=b.toolCalls?.filter(a=>!a.name.startsWith("handoff_to_"));if(k&&k.length>0)return $.info("Non-handoff tool calls detected, returning TOOL_CALL_ACTION"),e.Jp;let l=d?.edgeConditions;if(l&&Object.keys(l).length>0){let a=this.orderedControlEdges(d);for(let b of a){let a=l[b];if(!a)continue;let d=(0,M.PP)(c.messages,a.target);if((0,M.F9)(a,d))return $.info("Deterministic edge condition matched; routing",{edgeId:b,kind:a.kind}),b}let b=a.find(a=>!l[a]);if(b)return $.info("No edge condition matched; routing to bare fallback edge",{edgeId:b}),b;$.info("Conditioned node: no predicate matched and no bare fallback; terminating")}return $.info("No tool calls or handoff requested, returning FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new _}}var aa=c(8918);let ab=(0,d.h)("backend/flow/execution/handlers/MCPHandler");class ac{static async executeMCP(a){let{mcpServer:b,enabledTools:c,nodeId:d,nodeRoots:e}=a;ab.verbose("executeMCP input",JSON.stringify(a));try{d&&q.mcpService.setNodeRoots(b,d,e);let a=await q.mcpService.getServerStatus(b);if("connected"!==a.status){let a=await q.mcpService.connectServer(b);if(!a.success){let c={success:!1,error:(0,aa.Fp)("server_connection_failed",`Failed to connect to MCP server: ${a.error}`,b,"connect")};return ab.verbose("executeMCP connection error",JSON.stringify(c)),c}}let f=await q.mcpService.listServerTools(b);if(f.error){let a={success:!1,error:(0,aa.Fp)("list_tools_failed",`Failed to list tools for server: ${f.error}`,b,"listTools")};return ab.verbose("executeMCP list tools error",JSON.stringify(a)),a}let g={success:!0,value:{server:b,tools:f.tools||[],enabledTools:c}};return ab.verbose("executeMCP success result",JSON.stringify(g)),g}catch(c){let a={success:!1,error:(0,aa.Fp)("mcp_execution_failed",c instanceof Error?c.message:String(c),b,"executeMCP")};return ab.verbose("executeMCP execution error",JSON.stringify(a)),a}}}var ad=c(59448);let ae=(0,d.h)("backend/flow/execution/nodes/MCPNode");class af extends l{async prep(a,b){ae.info("prep() started");let c=b?.id||"",d=b?.properties?.boundServer,e=b?.properties?.enabledTools||[],f=b?.properties?.roots||[];if(!d)throw ae.error("Missing bound server"),Error("MCP node requires a bound server");return ae.info("prep() completed",{mcpServer:d,enabledToolsCount:e.length,nodeRootsCount:f.length}),{nodeId:c,nodeType:"mcp",mcpServer:d,enabledTools:e,nodeRoots:f}}async execCore(a,b){ae.info("execCore() started",{mcpServer:a.mcpServer}),ae.verbose("execCore() prepResult",JSON.stringify(a));try{let b=await ac.executeMCP({mcpServer:a.mcpServer,enabledTools:a.enabledTools,nodeId:a.nodeId,nodeRoots:a.nodeRoots});if(!b.success)throw ae.error("MCP execution failed",{error:b.error}),Error(`MCP execution failed: ${b.error.message}`);let c={success:!0,server:b.value.server,tools:b.value.tools,enabledTools:b.value.enabledTools};return ae.info("execCore() completed",{server:c.server,toolsCount:c.tools?.length||0,enabledToolsCount:c.enabledTools?.length||0}),ae.verbose("execCore() execResult",JSON.stringify(c)),c}catch(b){let a={success:!1,error:b instanceof Error?b.message:String(b)};return ae.error("execCore() failed",{error:a.error}),ae.verbose("execCore() errorResult",JSON.stringify(a)),a}}async post(a,b,c,d){if(ae.info("post() started",{server:b.server,toolsCount:b.tools?.length||0,enabledToolsCount:b.enabledTools?.length||0}),ae.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"MCPNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"MCP Node",timestamp:new Date().toISOString()}),ae.info("Added MCPNode tracking information")),b.success&&b.server&&b.tools){let a=d?.properties?.toolTimeout,e=b.tools.filter(a=>b.enabledTools?.includes(a.name)).map(c=>({...c,originalName:c.name,server:b.server,name:(0,ad.Y6)(b.server,c.name),timeout:a}));if(c.mcpContext){let a=[...c.mcpContext.availableTools||[]];for(let b of e)a.some(a=>a.name===b.name)||a.push(b);c.mcpContext.availableTools=a}else c.mcpContext={server:b.server,availableTools:e};for(let a of(c.toolNameMap=c.toolNameMap||{},e))c.toolNameMap[a.name]={server:b.server,tool:a.originalName,timeout:a.timeout};let f=e.map(a=>a.name);ae.info("Stored MCP context in shared state",{server:b.server,availableToolsCount:e.length,availableToolNames:f.length>10?f.slice(0,10).join(", ")+"...":f.join(", "),totalToolsCount:c.mcpContext.availableTools.length})}ae.info("post() completed"),ae.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(ae.info("Actions:",{actionsCount:e.length,actions:e}),e.length>0){let a=e[0];return ae.info(`Returning action: ${a}`),a}return"default"}_clone(){return new af}}let ag=(0,d.h)("backend/flow/execution/nodes/FinishNode");class ah extends l{async prep(a,b){ag.debug("prep() started");let c={nodeId:b?.id||"",nodeType:"finish",messages:a.messages};return ag.debug("prep() completed",{messagesCount:c.messages.length,hasSystemPrompt:c.messages.some(a=>"system"===a.role)}),c}async execCore(a,b){ag.debug("execCore() started",{messagesCount:a.messages.length}),ag.verbose("execCore() prepResult",JSON.stringify(a));let c={success:!0};return ag.verbose("execCore() execResult",JSON.stringify(c)),ag.info("execCore() completed"),c}async post(a,b,c,d){ag.info("post() started",{messagesCount:a.messages.length}),ag.verbose("post() inputs",JSON.stringify({prepResult:a,execResult:b,nodeParams:d})),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo.nodeExecutionTracker)&&(c.trackingInfo.nodeExecutionTracker.push({nodeType:"FinishNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Finish Node",timestamp:new Date().toISOString()}),ag.info("Added FinishNode tracking information"));let f=a.messages[a.messages.length-1];f&&"assistant"===f.role&&f.content&&("string"==typeof f.content?c.lastResponse=f.content:c.lastResponse={content:f.content,role:f.role}),ag.info("Successors object:",{hasSuccessors:!!this.successors,isMap:this.successors instanceof Map,type:typeof this.successors});let g=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(ag.info("Actions:",{actionsCount:g.length,actions:g}),g.length>0){let a=g[0];return ag.info(`post() completed, returning action: ${a}`),a}return ag.info("post() completed, returning FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new ah}}var ai=c(44479);let aj=(0,d.h)("backend/execution/flow/nodes/SubflowNode");function ak(a){for(let b=a.length-1;b>=0;b--)if("user"===a[b].role)return a.slice(b);return a}function al(a,b){let c;if("lines"===b)return a.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0);try{c=JSON.parse(a)}catch{return[]}return Array.isArray(c)?c.map(a=>"string"==typeof a?a:JSON.stringify(a)):[]}function am(a,b,c){if("string"!=typeof a||""===a.trim())return[];let d=new Set,e=[];for(let f of al(a,b)){let a=f.trim();if(!(!a||d.has(a))){if(d.add(a),c&&a===c){aj.warn("Dynamic fan-out target refers to the running flow itself; skipping (recursion guard)",{id:a});continue}if(e.push(a),e.length>=32)break}}return e}function an(a,b,c,d,e,f){if(!a||!b)return;let g=f?{laneIndex:f.index,laneCount:f.count}:{};return b=>{let f=(b.depth??0)+1;return"run:start"===b.type?void a({type:"subflow:start",node:c,subflowId:d,subflowName:e,depth:f,...g}):"run:done"===b.type?void a({type:"subflow:done",node:c,subflowId:d,status:b.status,depth:f,...g}):"message"===b.type?void a({...b,depth:f,message:{...b.message,depth:f},...g}):void a({...b,depth:f,...g})}}class ao extends l{async prep(a,b){let d,e=b?.properties?.subflowId,f=a.handoffInput&&a.handoffInput.targetNodeId===b?.id?a.handoffInput:void 0;f&&(a.handoffInput=void 0);let g=(b?.properties?.parallelSubflowIds??[]).filter(a=>"string"==typeof a&&""!==a.trim()),h=b?.properties?.mapOverList===!0,i=b?.properties?.itemSplit==="lines"?"lines":"json-array",j=b?.properties?.sequential===!0,k=b?.properties?.parallelSubflowIdsVar?.trim(),l=!1;if(k){let b=am(a.variables?.[k],i,a.flowId);b.length>0?(g=b,l=!0,aj.info("Dynamic fan-out targets resolved from run variable",{variable:k,count:b.length})):aj.info("Dynamic fan-out variable resolved to no targets; using static parallelSubflowIds",{variable:k,staticCount:g.length})}if(b?.properties?.allowCallerFanout===!0&&f?.parallelFlows&&f.parallelFlows.length>0){let c=am(JSON.stringify(f.parallelFlows),"json-array",a.flowId);c.length>0&&(g=c,l=!0,"number"==typeof f.concurrencyLimit&&f.concurrencyLimit>=1&&(d=Math.floor(f.concurrencyLimit)),aj.info("Caller-chosen fan-out targets resolved from handoff tool",{count:c.length,nodeId:b?.id}))}let m=b?.properties?.promptTemplate?.trim(),n=b?.properties?.inputMode??(m?"isolated":"full-history"),o=b?.properties?.outputMode!=="final-only",p=b?.properties?.saveConversation!==!1,q={nodeId:b?.id||"",nodeType:"subflow",subflowId:e,depth:(a.runDepth??0)+1,chainDepth:a.chainDepth??0,parentRunId:a.conversationId,showSteps:o,persistConversation:p,emit:a.emit,nodeName:b?.properties?.name};if("isolated"===n)b?.properties?.allowCallerPrompt!==!1&&f?.prompt.trim()?(q.inputText=f.prompt,aj.info("Using caller-supplied prompt for isolated subflow",{nodeId:b?.id})):q.inputText=m??"";else{let b=function(a){let b=[];for(let d of a){var c;if("system"===d.role||"tool"===d.role||"assistant"===d.role&&Array.isArray(d.tool_calls)&&d.tool_calls.length>0||!("string"==typeof(c=d.content)?c.trim().length>0:!!Array.isArray(c)&&c.length>0))continue;let{processNodeId:a,...e}=d;b.push({...e})}return b}(a.messages);q.messages="latest-message"===n?ak(b):b}if(void 0!==q.inputText&&(q.inputText=await Q((0,N.S$)(q.inputText,a.variables),a.ephemeral?void 0:a.conversationId,a.emit,b?.id?{nodeId:b.id,nodeType:"subflow"}:void 0),q.inputText.includes("${kv:"))){let b;try{let{flowService:d}=await Promise.resolve().then(c.bind(c,11659));b=(await d.getFlow(a.flowId))?.folder}catch{}q.inputText=await X(q.inputText,{flowId:a.flowId,folder:b})}if(h&&g.length>0&&aj.warn("SubflowNode sets both mapOverList and parallelSubflowIds; ignoring mapOverList (fan-out precedence)",{nodeId:b?.id}),g.length>0){let a=g.map(a=>({subflowId:a}));try{let{flowService:b}=await Promise.resolve().then(c.bind(c,11659)),d=new Set;await Promise.all(a.map(async a=>{try{let c=await b.getFlow(a.subflowId);c?.name?a.subflowName=c.name:l&&!c&&d.add(a.subflowId)}catch{l&&d.add(a.subflowId)}})),l&&d.size>0&&(aj.warn("Dropping unknown dynamic fan-out target id(s)",{dropped:[...d]}),a=a.filter(a=>!d.has(a.subflowId)))}catch{}l&&0===a.length&&(q.fanOutResolvedEmpty=!0),q.lanes=a,q.concurrencyLimit=Math.max(1,d??b?.properties?.concurrencyLimit??4),q.joinSeparator=b?.properties?.joinSeparator??"\n\n",q.errorStrategy=b?.properties?.errorStrategy??"collect-all"}else if(h&&e){var r;let a,d=al((void 0!==q.inputText?q.inputText:"string"==typeof(r=ak(q.messages??[])[0]?.content)?r:Array.isArray(r)?r.map(a=>"string"==typeof a?a:"string"==typeof a?.text?a.text:"").join(""):"")??"",i);try{let{flowService:b}=await Promise.resolve().then(c.bind(c,11659)),d=await b.getFlow(e);d?.name&&(a=d.name)}catch{}q.lanes=d.map((b,c)=>({subflowId:e,subflowName:a,input:{prompt:b},itemIndex:c,itemCount:d.length})),q.mapOverList=!0,q.concurrencyLimit=j?1:Math.max(1,b?.properties?.concurrencyLimit??4),q.joinSeparator=b?.properties?.joinSeparator??"\n\n",q.errorStrategy=b?.properties?.errorStrategy??"collect-all"}else if(e)try{let{flowService:a}=await Promise.resolve().then(c.bind(c,11659)),b=await a.getFlow(e);b?.name&&(q.subflowName=b.name)}catch{}return aj.info("prep() completed",{subflowId:e,depth:q.depth,mode:n,historyCount:q.messages?.length,laneCount:q.lanes?.length,showSteps:o}),q}async execCore(a,b){let{runFlow:d}=await c.e(2823).then(c.bind(c,52823)),e={nodeId:a.nodeId,nodeName:a.nodeName,nodeType:"subflow"},f=a.messages?{messages:a.messages}:{prompt:a.inputText??""};if(a.lanes&&a.lanes.length>0)return this.execParallel(a,d,e,f);if(a.mapOverList||a.fanOutResolvedEmpty)return aj.info("execCore() resolved no lanes → nothing to run",{subflowId:a.subflowId,reason:a.fanOutResolvedEmpty?"dynamic-fanout-empty":"map-over-list-empty"}),{success:!0,outputText:"",subStatus:"completed",lanes:[]};if(!a.subflowId)return{success:!1,error:"Subflow node has no flow selected (subflowId is empty)."};let g=an(a.emit,a.showSteps,e,a.subflowId,a.subflowName);aj.info("execCore() running subflow",{subflowId:a.subflowId,depth:a.depth,showSteps:a.showSteps,foldingEvents:!!g});let h=await d({flowId:a.subflowId,...f,mode:a.persistConversation?"conversation":"ephemeral",flujo:!0,requireApproval:!1,debug:!1,depth:a.depth,chainDepth:a.chainDepth,parentRunId:a.parentRunId,...g?{emit:g}:{}});return"error"===h.status?{success:!1,error:h.error?.message||"Subflow execution failed",errorDetails:h.error?.details,subStatus:h.status}:{success:!0,outputText:h.outputText,subStatus:h.status}}async execParallel(a,b,d,e){let f=a.lanes??[],g=f.length,h=Math.max(1,a.concurrencyLimit??4),i=a.joinSeparator??"\n\n",j=a.errorStrategy??"collect-all";aj.info("execCore() running parallel subflows",{laneCount:g,concurrencyLimit:h,errorStrategy:j,depth:a.depth});let k=Array(g),l=0,m=!1,n=async c=>{let h=f[c],i=an(a.emit,a.showSteps,d,h.subflowId,h.subflowName,{index:h.itemIndex??c,count:h.itemCount??g});try{let d=await b({flowId:h.subflowId,...h.input??e,mode:"ephemeral",flujo:!0,requireApproval:!1,debug:!1,depth:a.depth,chainDepth:a.chainDepth,parentRunId:a.parentRunId,...i?{emit:i}:{}});k[c]="error"===d.status?{subflowId:h.subflowId,success:!1,error:d.error?.message||"Subflow execution failed"}:{subflowId:h.subflowId,success:!0,outputText:d.outputText}}catch(a){k[c]={subflowId:h.subflowId,success:!1,error:a instanceof Error?a.message:String(a)}}k[c].success||"fail-fast"!==j||(m=!0)},{FlowExecutor:o}=await Promise.resolve().then(c.bind(c,44561)),p=()=>(0,ai.isCancelledByAncestry)(a.parentRunId,o.conversationStates),q=async()=>{for(;;){if(m)return;if(p()){m=!0;return}let a=l++;if(a>=g)return;await n(a)}},r=Math.min(h,g);await Promise.all(Array.from({length:r},()=>q()));let s=k.filter(a=>void 0!==a),t=s.filter(a=>a.success),u=s.filter(a=>!a.success),v=u.length>0;if("fail-fast"===j&&v){let a=s.find(a=>!a.success);return{success:!1,error:a?.error||"A parallel subflow lane failed",subStatus:"error",lanes:s}}if(0===t.length)return{success:!1,error:"All parallel subflows failed",subStatus:"error",lanes:s};let w=t.map(a=>a.outputText??"").join(i);if(v){let a=u.map(a=>`- ${a.subflowId}: ${a.error??"unknown error"}`).join("\n");w+=`${i}[${u.length} parallel subflow(s) failed:
|
|
61
|
+
${a}]`}return{success:!0,outputText:w,subStatus:"completed",lanes:s,partial:v}}async post(a,b,d,f){if(h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(d.trackingInfo.nodeExecutionTracker)&&d.trackingInfo.nodeExecutionTracker.push({nodeType:"SubflowNode",nodeId:f?.id||"unknown",nodeName:f?.properties?.name||"Subflow Node",timestamp:new Date().toISOString()}),!b.success)return aj.error("Subflow failed",{subflowId:a.subflowId,error:b.error}),d.lastResponse={success:!1,error:b.error||"Subflow execution failed",errorDetails:b.errorDetails},e.O;let g=b.outputText??"",i={role:"assistant",content:g,id:crypto.randomUUID(),timestamp:Date.now(),processNodeId:f?.id};d.messages.push(i),d.lastResponse=g;let j=f?.properties?.captureVariable?.trim();j&&(d.variables=d.variables??{},d.variables[j]=g,aj.info("Captured subflow output into run variable",{captureVariable:j,nodeId:f?.id}));let k=f?.properties?.captureResource?.trim();if(k&&d.conversationId&&!d.ephemeral)try{let a=await (0,x.tm)({conversationId:d.conversationId,name:k,mimeType:"text/markdown",kind:"text",data:{text:g},producedBy:{source:"capture",nodeId:f?.id,nodeName:f?.properties?.name}});"skipped"in a?aj.warn("captureResource skipped by store cap",{captureResource:k,reason:a.skipped}):(d.emit?.({type:"resource:write",node:{nodeId:f?.id??"unknown",nodeName:f?.properties?.name,nodeType:"subflow"},server:"flujo",uri:a.uri,name:k,mimeType:a.mimeType,size:a.size,source:"capture"}),aj.info("Captured subflow output into run resource",{captureResource:k,uri:a.uri,nodeId:f?.id}))}catch(a){aj.error("captureResource failed; continuing run",a)}let l=f?.properties?.captureKv?.trim();if(l)try{let a;try{let{flowService:b}=await Promise.resolve().then(c.bind(c,11659));a=(await b.getFlow(d.flowId))?.folder}catch{}let b=await Y(l,g,{flowId:d.flowId,folder:a});"skipped"in b?aj.warn("captureKv skipped",{captureKv:l,reason:b.skipped}):aj.info("Captured subflow output into persistent kv",{captureKv:l,nodeId:f?.id})}catch(a){aj.error("captureKv failed; continuing run",a)}let m=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});if(m.length>0){let a=m[0];return aj.info(`post() completed, handing off via action: ${a}`),a}return aj.info("post() completed, no successor → FINAL_RESPONSE_ACTION"),e.g4}_clone(){return new ao}}let ap=(0,d.h)("backend/flow/execution/nodes/ResourceNode");class aq extends l{async prep(a,b){return ap.warn("ResourceNode.prep() reached — resource nodes are config holders and should never execute",{nodeId:b?.id}),{}}async execCore(){return{}}async post(a,b,c,d){let e=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});return e.length>0?e[0]:"default"}_clone(){return new aq}}var ar=c(37860);let as=(0,d.h)("backend/flow/execution/nodes/SignalNode");class at extends l{async prep(a,b){let c=(b?.properties?.topic??"").trim(),d=b?.properties?.payloadTemplate??"";return as.info("prep() started",{nodeId:b?.id,topic:c,payloadTemplateLength:d.length}),{topic:c,payloadTemplate:d}}async execCore(){return{}}async post(a,b,c,d){as.info("post() started",{nodeId:d?.id,topic:a.topic}),h.G.ENABLE_EXECUTION_TRACKER&&Array.isArray(c.trackingInfo?.nodeExecutionTracker)&&c.trackingInfo.nodeExecutionTracker.push({nodeType:"SignalNode",nodeId:d?.id||"unknown",nodeName:d?.properties?.name||"Signal Node",timestamp:new Date().toISOString()});let e=a.topic;if(e)try{let b=(0,N.S$)(a.payloadTemplate??"",c.variables),d="schedule"===c.source?"schedule":"api"===c.source?"api":"chat";(0,ar.eh)().publish({kind:"signal",topic:e,payload:b,emitterFlowId:c.flowId,runId:c.conversationId||"",conversationId:c.conversationId||"",firedBy:d,chainDepth:c.chainDepth??0,timestamp:new Date().toISOString()}),as.info("Emitted signal",{topic:e,payloadLength:b.length,chainDepth:c.chainDepth??0})}catch(a){as.warn("Signal emit failed (ignored so the run continues):",a)}else as.warn("Signal node has no topic; nothing emitted",{nodeId:d?.id});let f=this.successors instanceof Map?Array.from(this.successors.keys()):Object.keys(this.successors||{});return f.length>0?f[0]:"default"}_clone(){return new at}}let au=(0,d.h)("backend/flow/execution/FlowConverter");class av{static convert(a){au.info("Converting React Flow to Pocket Flow",{flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}),au.verbose("convert input",JSON.stringify({flowName:a.name,nodeCount:a.nodes.length,edgeCount:a.edges.length}));let b=new Map;for(let c of a.nodes){au.debug(`Creating node: ${c.id} (${c.type})`);let a=this.createNode(c);b.set(c.id,a)}for(let c of a.edges){au.debug(`Connecting edge: ${c.id} (${c.source} -> ${c.target})`);let a=b.get(c.source),d=b.get(c.target);if(a&&d)if(c.data?.edgeType==="mcp"){let b,e;au.info(`Handling MCP connection: ${c.id} (${c.source} -> ${c.target})`),a instanceof _?(b=a,e=d):d instanceof _&&(b=d,e=a),b&&e?(b.node_params.properties||(b.node_params.properties={}),b.node_params.properties.mcpNodes||(b.node_params.properties.mcpNodes=[]),b.node_params.properties.mcpNodes.push({id:e.node_params.id,properties:e.node_params.properties}),au.info("Stored MCP node in Process node properties",{processNodeId:b.node_params.id,mcpNodeId:e.node_params.id})):au.warn(`Invalid MCP connection: ${c.id}. Could not find Process and MCP nodes.`,{sourceNodeType:a.constructor.name,targetNodeType:d.constructor.name})}else if(c.data?.edgeType==="resource"){let b,e,f;if(au.info(`Handling resource connection: ${c.id} (${c.source} -> ${c.target})`),a instanceof aq&&d instanceof _?(e=a,b=d,f="consume"):a instanceof _&&d instanceof aq&&(b=a,e=d,f="produce"),b&&e&&f){b.node_params.properties||(b.node_params.properties={}),b.node_params.properties.resourceNodes||(b.node_params.properties.resourceNodes=[]);let a=e.node_params.properties??{};b.node_params.properties.resourceNodes.push({id:e.node_params.id,role:f,properties:a}),"produce"===f&&"run"===a.scope&&a.runName&&!b.node_params.properties.captureResource&&(b.node_params.properties.captureResource=a.runName,au.info("Derived captureResource from produce edge",{processNodeId:b.node_params.id,runName:a.runName})),au.info("Stored resource node in Process node properties",{processNodeId:b.node_params.id,resourceNodeId:e.node_params.id,role:f})}else au.warn(`Invalid resource connection: ${c.id}. Could not find Process and Resource nodes.`,{sourceNodeType:a.constructor.name,targetNodeType:d.constructor.name})}else{let b=c.id||"default";a.addSuccessor(d,b),a.node_params.orderedOutgoingEdges=a.node_params.orderedOutgoingEdges||[],a.node_params.orderedOutgoingEdges.push(b);let e=c.data?.condition;if(e&&"object"==typeof e&&(a.node_params.edgeConditions=a.node_params.edgeConditions||{},a.node_params.edgeConditions[b]=e,au.info("Retained edge condition for routing",{edgeId:b,source:c.source})),c.data?.bidirectional){let e=`${b}__reverse`;d.addSuccessor(a,e),d.node_params.orderedOutgoingEdges=d.node_params.orderedOutgoingEdges||[],d.node_params.orderedOutgoingEdges.push(e),au.info(`Connected nodes (bidirectional): ${c.target} -> ${c.source} with action: ${e}`)}au.info(`Connected nodes: ${c.source} -> ${c.target} with action: ${b}`),a.successors instanceof Map?au.debug("Source node successors after connection:",{sourceNodeId:c.source,successorsCount:a.successors.size,successorsKeys:Array.from(a.successors.keys()),hasTargetNode:a.successors.has(b)}):au.warn("Source node successors is not a Map:",{sourceNodeId:c.source,successorsType:typeof a.successors})}else au.warn(`Failed to connect edge: ${c.id}`,{sourceExists:!!a,targetExists:!!d})}let c=a.nodes.find(a=>"start"===a.type);if(!c)throw au.error("No start node found in flow"),Error("Flow must have a start node");au.debug(`Found start node: ${c.id}`);let d=b.get(c.id);if(!d)throw au.error(`Failed to retrieve start node from map: ${c.id}`),Error("Failed to create start node");let e=new m(d);return au.debug("Created Pocket Flow with start node"),au.info("Flow conversion completed successfully",{nodeCount:b.size}),au.verbose("convert result",JSON.stringify({flowStartNodeId:e.node_params?.id||"unknown",nodesCount:b.size})),e}static createNode(a){let b,c;switch(au.debug(`Creating node of type: ${a.type}`,{nodeId:a.id,label:a.data.label}),au.verbose("createNode input",JSON.stringify({nodeId:a.id,nodeType:a.type,label:a.data.label,properties:a.data.properties})),a.type){case"start":b=new o,c={id:a.id,label:a.data.label,type:"start",properties:a.data.properties||{name:a.data.label}};break;case"process":b=new _,c={id:a.id,label:a.data.label,type:"process",properties:a.data.properties||{name:a.data.label}};break;case"mcp":b=new af,c={id:a.id,label:a.data.label,type:"mcp",properties:a.data.properties||{name:a.data.label}};break;case"finish":b=new ah,c={id:a.id,label:a.data.label,type:"finish",properties:a.data.properties||{name:a.data.label}};break;case"subflow":b=new ao,c={id:a.id,label:a.data.label,type:"subflow",properties:a.data.properties||{name:a.data.label}};break;case"resource":b=new aq,c={id:a.id,label:a.data.label,type:"resource",properties:a.data.properties||{name:a.data.label}};break;case"signal":b=new at,c={id:a.id,label:a.data.label,type:"signal",properties:a.data.properties||{name:a.data.label}};break;default:throw au.error(`Unknown node type: ${a.type}`,{nodeId:a.id}),Error(`Unknown node type: ${a.type}`)}return b.setParams({},c),au.debug("Node created and parameters set",{nodeId:a.id,type:a.type,propertiesKeys:Object.keys(c.properties||{})}),au.verbose("createNode result",JSON.stringify({nodeId:a.id,nodeType:a.type,nodeParams:c})),b}}let aw=(0,d.h)("backend/execution/flow/engine/PocketflowEngine");class ax{clearCache(a){a?this.pocketFlowCache.delete(a):this.pocketFlowCache.clear()}async resolveFlowDefinition(a){let b=a.flowId;if(this.pocketFlowCache.has(b))return aw.debug(`Using cached Pocket Flow for flowId: ${b}`),this.pocketFlowCache.get(b).clone();let c=a.flowSnapshot;if(c)aw.verbose(`Resolving flow ${b} from an in-memory quick-chat snapshot.`);else if(aw.verbose(`Loading and converting flow for flowId: ${b}`),!(c=await i.flowService.getFlow(b)??void 0))throw aw.error(`Flow not found for flowId: ${b}`),Error(`Flow not found: ${b}`);aw.info(`Found flow: ${c.name}`,{flowId:c.id,nodeCount:c.nodes.length,edgeCount:c.edges.length});let d=av.convert(c);return this.pocketFlowCache.set(b,d),aw.verbose(`Flow ${b} converted and cached.`),d.clone()}async findNodeById(a,b){aw.verbose(`Searching for node ${b} in flow ${a.node_params?.id}`);let c=await a.getStartNode(),d=[c],e=new Set,f=c.node_params?.id;for(f?e.add(f):aw.warn("Start node is missing an ID in its parameters.");d.length>0;){let a=d.shift();if(a.node_params?.id===b)return aw.verbose(`Found node ${b}`),a;if(a.successors instanceof Map)for(let b of a.successors.values()){let a=b.node_params?.id;"string"==typeof a&&a.length>0&&!e.has(a)&&(e.add(a),d.push(b.clone()))}}aw.warn(`Node ${b} not found in flow.`)}async resolveNode(a){let b,{conversationId:c,currentNodeId:d}=a,e=await this.resolveFlowDefinition(a);if(d)(b=await this.findNodeById(e,d))?aw.info(`Resuming conversation ${c} at node ${d}`):(aw.warn(`Resuming conversation ${c}, but node ${d} not found. Starting from beginning.`),b=await e.getStartNode());else{let d=a.messages.length>0?a.messages[a.messages.length-1]:null;d?.processNodeId?(aw.info(`Found processNodeId ${d.processNodeId} in last message. Attempting to resume from this node.`),(b=await this.findNodeById(e,d.processNodeId))?aw.info(`Resuming conversation ${c} from node ${d.processNodeId} based on last message.`):(aw.warn(`Could not find node ${d.processNodeId} from last message. Starting from beginning.`),b=await e.getStartNode())):(b=await e.getStartNode(),aw.info(`Starting conversation ${c} from the beginning.`))}if(!b)throw Error("Execution error: Cannot find starting node.");let f=b.node_params?.id;if("string"!=typeof f||0===f.length)throw Error(`Execution error: Node ${b.constructor.name} is missing an ID.`);return{handle:b,id:f,type:b.node_params?.type||"unknown",name:b.node_params?.label||"Unknown Node"}}async resolveHandoff(a,b){let{currentNodeId:c}=a;if(!c||!b)return{isSuccessorEdge:!1,targetNodeId:null};let d=await this.resolveFlowDefinition(a),e=await this.findNodeById(d,c);if(!e||!e.successors.has(b))return{isSuccessorEdge:!1,targetNodeId:null};let f=e.getSuccessor(b),g=f?.node_params?.id,h=f?.node_params?.type;return{isSuccessorEdge:!0,targetNodeId:"string"==typeof g&&g.length>0?g:null,targetNodeType:"string"==typeof h?h:null}}async runNode(a,b,c){let d=a.handle;c&&(b.emit=c);try{aw.debug(`[PocketflowEngine] Calling run() on node ${a.id} (${a.type})`);let c=await d.run(b);return aw.debug(`[PocketflowEngine] Node ${a.id} returned action: "${c.action}"`),{action:c.action,prepResult:c.prepResult,execResult:c.execResult}}finally{delete b.emit}}constructor(){this.pocketFlowCache=new Map}}let ay=(0,d.h)("backend/execution/flow/FlowExecutor"),az=["messages","availableTools","fullResponse","emit","modelInput"];function aA(a){let{messages:b,executionTrace:c,emit:d,mcpContext:e,...f}=a,h=g()(f);return h.messageCount=b?.length??0,e&&(h.mcpContext={server:e.server,availableTools:[]}),h}function aB(a){if(!a||"object"!=typeof a)return a;let b=g()(a);for(let a of az)a in b&&delete b[a];return b}class aC{static get conversationStates(){return global.__flujo_conversation_states||(global.__flujo_conversation_states=new Map),global.__flujo_conversation_states}static get engine(){return global.__flujo_flow_engine||(global.__flujo_flow_engine=new ax),global.__flujo_flow_engine}static set engine(a){global.__flujo_flow_engine=a}static clearFlowCache(a){this.engine.clearCache(a)}static resolveHandoff(a,b){return this.engine.resolveHandoff(a,b)}static async peekNextNodeId(a){try{return(await this.engine.resolveNode(a)).id}catch{return null}}static async executeStep(a,b){let c,d,f,{conversationId:g,flowId:i,currentNodeId:j}=a;if("string"!=typeof g||0===g.length)return ay.error("executeStep called without a valid conversationId in sharedState."),a.lastResponse={success:!1,error:"Internal error: Missing conversationId."},{sharedState:a,action:e.O};ay.debug(`executeStep called for conversation ${g}`,{flowId:i,currentNodeId:j});let k=h.G.ENABLE_EXECUTION_TRACKER||!!a.debugMode,l=j;try{let e=await this.engine.resolveNode(a);l=e.id,a.currentNodeId=e.id,ay.info(`Executing step for node ${e.id} (${e.type}) in conversation ${g}`),k&&!a.executionTrace&&(a.executionTrace=[]),c=aA(a),b?.({type:"node:enter",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type}});let h=await this.engine.runNode(e,a,b),i=h.action;d=h.prepResult,f=h.execResult,b?.({type:"node:exit",node:{nodeId:e.id,nodeName:e.name,nodeType:e.type},action:i}),ay.debug(`Node ${e.id} finished with action: ${i} for conversation ${g}`);let j=aA(a);if(k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:e.id,nodeType:e.type,nodeName:e.name,timestamp:new Date().toISOString(),actionTaken:i,stateBefore:c,stateAfter:j,prepResultSnapshot:aB(d),execResultSnapshot:aB(f),modelInput:d?.modelInput};a.executionTrace.push(h),ay.verbose(`Appended step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),ay.debug(`[FlowExecutor] Returning from executeStep for node ${e.id} with action: "${i}"`),{sharedState:a,action:i}}catch(i){let f=l||"unknown node";ay.error(`Error during node execution step for ${f} in conversation ${g}`,{error:i});let h=i?.details;if(a.lastResponse={success:!1,error:i instanceof Error?i.message:String(i),errorDetails:i instanceof Error?{name:i.name,message:i.message,stack:i.stack,...h&&"object"==typeof h?h:{}}:{message:String(i)}},a.currentNodeId=l,b?.({type:"error",node:l?{nodeId:l}:void 0,message:i instanceof Error?i.message:String(i)}),k&&a.executionTrace){let b=a.executionTrace.length,h={stepIndex:b,nodeId:f,nodeType:"unknown",nodeName:"Unknown Node",timestamp:new Date().toISOString(),actionTaken:e.O,stateBefore:c??aA(a),stateAfter:aA(a),prepResultSnapshot:d?aB(d):null,execResultSnapshot:{success:!1,error:a.lastResponse},modelInput:d?.modelInput};a.executionTrace.push(h),ay.verbose(`Appended ERROR step ${b} to execution trace for conversation ${g}`)}return this.conversationStates.set(g,a),{sharedState:a,action:e.O}}}}},51172:(a,b,c)=>{c.d(b,{M3:()=>y,or:()=>x});var d=c(29021),e=c(33873),f=c.n(e),g=c(18230),h=c(63129),i=c(79111),j=c(89392);let k={enabled:!0,maxValueBytes:65536,maxKeysPerScope:512,maxScopeBytes:8388608},l=(0,g.h)("backend/services/kvStore"),m=f().join((0,h.ok)(),"db","kv-store"),n=/^[A-Za-z0-9_-]{1,64}$/;function o(a){if("string"!=typeof a||!n.test(a))throw Error(`Unsafe kv scope id: ${JSON.stringify(a)}`)}function p(a){if("string"!=typeof a||!n.test(a))throw Error(`Unsafe kv key name: ${JSON.stringify(a)}`)}let q=a=>f().join(m,a),r=a=>f().join(q(a),"index.json"),s=null;async function t(){let a;if(s&&Date.now()-s.at<3e4)return s.value;try{let b=await (0,i.YM)(j.Z.KV_STORE_SETTINGS,k);a={...k,...b}}catch(b){l.warn("Failed to load kv-store settings; using defaults",b),a=k}return s={value:a,at:Date.now()},a}let u=global.__flujo_kv_store??(global.__flujo_kv_store=new Map);async function v(a){let b=u.get(a);if(b)return b;let c=[];try{let b=await d.promises.readFile(r(a),"utf-8");if(b.trim().length>0){let a=JSON.parse(b);Array.isArray(a)&&(c=a)}}catch(b){"ENOENT"!==b.code&&l.error(`Failed to read kv index for scope ${a}; treating as empty`,b)}return u.set(a,c),c}async function w(a,b){return(0,i.l_)(`kv-store/${a}`,async()=>{let c=await v(a),{next:e,result:f}=b(c);return e!==c&&(u.set(a,e),await d.promises.mkdir(q(a),{recursive:!0}),await (0,i.Zf)(r(a),JSON.stringify(e,null,2))),f})}async function x(a,b,c,d){o(a),p(b);let e=await t();if(!e.enabled)return{skipped:"disabled"};let f="string"==typeof c?c:String(c??""),g=Buffer.byteLength(f,"utf8");return g>e.maxValueBytes?(l.warn(`kv write skipped (size ${g} > cap ${e.maxValueBytes})`,{scope:a,name:b}),{skipped:"size-cap"}):w(a,c=>{let h=c.find(a=>a.name===b);if(!h&&c.length>=e.maxKeysPerScope)return l.warn(`kv write skipped (keys ${c.length} >= cap ${e.maxKeysPerScope})`,{scope:a,name:b}),{next:c,result:{skipped:"keys-cap"}};let i=c.reduce((a,b)=>a+(b===h?0:b.size),0);if(i+g>e.maxScopeBytes)return l.warn(`kv write skipped (scope budget ${i}+${g} > ${e.maxScopeBytes})`,{scope:a,name:b}),{next:c,result:{skipped:"scope-cap"}};let j=Date.now(),k={scope:a,name:b,value:f,size:g,createdAt:h?.createdAt??j,updatedAt:j,expiresAt:d?.expiresAt},m=h?c.map(a=>a===h?k:a):[...c,k];return l.debug(`Set kv ${a}/${b}`,{size:g}),{next:m,result:k}})}async function y(a,b){var c;o(a),p(b);let d=(await v(a)).find(a=>a.name===b);if(d&&(c=Date.now(),"number"!=typeof d.expiresAt||d.expiresAt>c))return d.value}},59448:(a,b,c)=>{c.d(b,{$9:()=>g,Y6:()=>e,ud:()=>f});let d="_-_-_";function e(a,b){let c=function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(36)}(`${a}\0${b}`),d=64-(5+c.length),e=b.replace(/[^a-zA-Z0-9_-]/g,"_").slice(0,Math.max(0,d));return`mcp_${e}_${c}`}function f(a,b){if(b&&b[a])return b[a];if(a.includes(d)){let b=a.split(d);if(3===b.length)return{server:b[1],tool:b[2]}}return null}function g(a,b){return!!b&&!!b[a]||a.includes(d)}},70834:(a,b,c)=>{c.r(b),c.d(b,{ToolHandler:()=>i});var d=c(18230),e=c(8918),f=c(82464),g=c(59448);let h=(0,d.h)("backend/flow/execution/handlers/ToolHandler");class i{static sanitizeSchema(a){if(!a||"object"!=typeof a)return a;let b=JSON.parse(JSON.stringify(a));return"string"===b.type&&b.format&&"enum"!==b.format&&"date-time"!==b.format&&(b.description||(b.description=""),b.description+=` (format: ${b.format})`,delete b.format),b.properties&&Object.keys(b.properties).forEach(a=>{b.properties[a]=i.sanitizeSchema(b.properties[a])}),b.items&&(b.items=i.sanitizeSchema(b.items)),["oneOf","anyOf","allOf"].forEach(a=>{Array.isArray(b[a])&&(b[a]=b[a].map(a=>i.sanitizeSchema(a)))}),b}static prepareTools(a){let{availableTools:b}=a;if(h.verbose("prepareTools input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{tools:[]}};return h.verbose("prepareTools empty result",JSON.stringify(a)),a}try{for(let a of b){if(!a.name)return{success:!1,error:(0,e.Po)("invalid_tool","Tool missing required 'name' property","unknown")};if(!a.inputSchema)return{success:!1,error:(0,e.Po)("invalid_tool",`Tool '${a.name}' missing required 'inputSchema' property`,a.name)}}let a=[...b].sort((a,b)=>a.name<b.name?-1:+(a.name>b.name)).map(a=>({type:"function",function:{name:a.name,description:a.description||`Tool: ${a.name}`,parameters:i.sanitizeSchema(a.inputSchema)}})),c={success:!0,value:{tools:a}};return h.verbose("prepareTools success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Po)("tool_preparation_failed",b instanceof Error?b.message:String(b),"unknown")};return h.verbose("prepareTools error result",JSON.stringify(a)),a}}static async processMCPNodes(a){let{mcpNodes:b}=a;if(h.verbose("processMCPNodes input",JSON.stringify(a)),!b||0===b.length){let a={success:!0,value:{availableTools:[]}};return h.verbose("processMCPNodes empty result",JSON.stringify(a)),a}try{let a=[];for(let c of b){let b=c.properties;if(b&&b.boundServer){let d=b.boundServer,h=b.enabledTools||[],i=b.toolTimeout;f.mcpService.setNodeRoots(d,c.id,b.roots);let j=await f.mcpService.connectServer(d);if(!j.success)return{success:!1,error:(0,e.Fp)("server_connection_failed",`Failed to connect to MCP server '${d}': ${j.error}`,d,"connect")};let k=await f.mcpService.listServerTools(d);if(k.error)return{success:!1,error:(0,e.Fp)("list_tools_failed",`Failed to list tools for MCP server '${d}': ${k.error}`,d,"listTools")};for(let b of(k.tools||[]).filter(a=>h.includes(a.name)).map(a=>({originalName:a.name,server:d,name:(0,g.Y6)(d,a.name),timeout:i,description:a.description,inputSchema:a.inputSchema})))a.some(a=>a.name===b.name)||a.push(b)}}let c={success:!0,value:{availableTools:a}};return h.verbose("processMCPNodes success result",JSON.stringify(c)),c}catch(b){let a={success:!1,error:(0,e.Fp)("mcp_processing_failed",b instanceof Error?b.message:String(b),"unknown","processMCPNodes")};return h.verbose("processMCPNodes error result",JSON.stringify(a)),a}}}},71966:(a,b,c)=>{c.d(b,{FA:()=>B,Ns:()=>t,gy:()=>C,jR:()=>v,tm:()=>z,yP:()=>A});var d=c(29021),e=c(33873),f=c.n(e),g=c(55511),h=c(18230),i=c(63129),j=c(79111),k=c(89392),l=c(22861);let m=(0,h.h)("backend/services/runResources"),n=f().join((0,i.ok)(),"db","run-resources"),o=/^[A-Za-z0-9_-]{1,64}$/;function p(a,b){if("string"!=typeof a||!o.test(a))throw Error(`Unsafe run-resource ${b}: ${JSON.stringify(a)}`)}let q=a=>f().join(n,a),r=a=>f().join(q(a),"index.json"),s=(a,b)=>f().join(q(a),`${b}.dat`);function t(a){if("string"!=typeof a||!a.startsWith(l.j))return null;let b=a.slice(l.j.length).split("/");if(2!==b.length)return null;let[c,d]=b;return o.test(c)&&o.test(d)?{conversationId:c,id:d}:null}let u=null;async function v(){let a;if(u&&Date.now()-u.at<3e4)return u.value;try{let b=await (0,j.YM)(k.Z.RUN_RESOURCE_SETTINGS,l.R);a={...l.R,...b}}catch(b){m.warn("Failed to load run-resource settings; using defaults",b),a=l.R}return u={value:a,at:Date.now()},a}let w=global.__flujo_run_resources??(global.__flujo_run_resources=new Map);async function x(a){let b=w.get(a);if(b)return b;let c=[];try{let b=await d.promises.readFile(r(a),"utf-8");if(b.trim().length>0){let a=JSON.parse(b);Array.isArray(a)&&(c=a)}}catch(b){"ENOENT"!==b.code&&m.error(`Failed to read run-resource index for ${a}; treating as empty`,b)}return w.set(a,c),c}async function y(a,b){return(0,j.l_)(`run-resources/${a}`,async()=>{let c=await x(a),{next:d,result:e}=await b(c);return d!==c&&(w.set(a,d),await (0,j.Zf)(r(a),JSON.stringify(d,null,2))),e})}async function z(a){let b;p(a.conversationId,"conversationId");let c=await v(),e=null,f="utf8";a.data&&("text"in a.data?(e=Buffer.from(a.data.text,"utf8"),f="utf8"):(e=Buffer.from(a.data.base64,"base64"),f="base64"));let h=e?.byteLength??0;if(h>c.maxResourceBytes)return m.warn(`Run-resource write skipped (size ${h} > cap ${c.maxResourceBytes})`,{conversationId:a.conversationId,name:a.name,kind:a.kind}),{skipped:"size-cap"};let i=(0,g.randomUUID)(),j=await y(a.conversationId,async g=>{var j;let k=a.name?g.find(b=>b.name===a.name):void 0,n=g.reduce((a,b)=>a+(b===k?0:b.size),0);if(n+h>c.maxConversationBytes)return m.warn(`Run-resource write skipped (conversation budget ${n}+${h} > ${c.maxConversationBytes})`,{conversationId:a.conversationId,name:a.name,kind:a.kind}),{next:g,result:{skipped:"conversation-cap"}};let o={id:i,uri:(j=a.conversationId,`${l.j}${j}/${i}`),conversationId:a.conversationId,name:a.name,mimeType:a.mimeType,size:h,kind:a.kind,encoding:f,createdAt:Date.now(),producedBy:a.producedBy,origin:a.origin,readBy:[]};e&&(await d.promises.mkdir(q(a.conversationId),{recursive:!0}),await d.promises.writeFile(s(a.conversationId,i),e));let p=k?g.filter(a=>a!==k):g.slice();return p.push(o),b=k&&k.size>0?k:void 0,m.debug(`Stored run resource ${o.uri}`,{kind:o.kind,size:h,name:o.name}),{next:p,result:o}});return b&&d.promises.unlink(s(a.conversationId,b.id)).catch(()=>{}),j}async function A(a=200){let b=[];try{b=(await d.promises.readdir(n,{withFileTypes:!0})).filter(a=>a.isDirectory()&&o.test(a.name)).map(a=>a.name)}catch(a){if("ENOENT"===a.code)return[];throw a}let c=[];for(let a of b)c.push(...await x(a));return c.sort((a,b)=>b.createdAt-a.createdAt),c.slice(0,a)}async function B(a,b){return p(a,"conversationId"),(await x(a)).find(a=>a.name===b)??null}async function C(a,b){let c,e=t(a);if(!e)return null;let f=(await x(e.conversationId)).find(a=>a.id===e.id);if(!f)return null;if("link"===f.kind)c={contents:[{uri:f.uri,mimeType:f.mimeType??"text/plain",text:`Run resource link → ${f.origin?`${f.origin.server}: ${f.origin.uri}`:"unknown origin"}`}]};else{let b;try{b=await d.promises.readFile(s(e.conversationId,e.id))}catch(b){return m.error(`Run-resource payload missing for ${a}`,b),null}c="utf8"===f.encoding?{contents:[{uri:f.uri,mimeType:f.mimeType??"text/plain",text:b.toString("utf8")}]}:{contents:[{uri:f.uri,mimeType:f.mimeType??"application/octet-stream",blob:b.toString("base64")}]}}if(b)try{await y(e.conversationId,async a=>{let c=a.find(a=>a.id===e.id);if(!c)return{next:a,result:void 0};let d={...c,readBy:[...c.readBy,b]};return{next:a.map(a=>a===c?d:a),result:void 0}}),f.readBy.push(b)}catch(b){m.warn(`Failed to persist readBy for ${a}`,b)}return{entry:f,contents:c}}},78606:(a,b,c)=>{c.d(b,{C:()=>e,F9:()=>i,PP:()=>h,wM:()=>f});let d=["contains","regex","equals","always"];function e(a){return"string"==typeof a&&d.includes(a)}function f(a){try{return new RegExp(a),!0}catch{return!1}}function g(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>"string"==typeof a?a:a&&"object"==typeof a&&"text"in a&&"string"==typeof a.text?a.text:"").join(""):""}function h(a,b="last-assistant"){if(!Array.isArray(a)||0===a.length)return null;if("last-message"===b)return g(a[a.length-1]?.content);for(let b=a.length-1;b>=0;b--)if(a[b]?.role==="assistant")return g(a[b]?.content);return null}function i(a,b){let c;if(!a)return!1;let d="string"==typeof b?b:"",e="string"==typeof a.value?a.value:String(a.value??"");switch(a.kind){case"contains":c=a.ignoreCase?d.toLowerCase().includes(e.toLowerCase()):d.includes(e);break;case"equals":c=a.ignoreCase?d.toLowerCase()===e.toLowerCase():d===e;break;case"regex":{let b;try{b=new RegExp(e,a.ignoreCase?"i":void 0)}catch(a){return console.warn("[edgeConditions] invalid regex predicate; treating as no-match",e,a),!1}c=b.test(d);break}case"always":c=!0;break;default:return console.warn("[edgeConditions] unknown condition kind; treating as no-match",a.kind),!1}return a.negate?!c:c}},80808:(a,b,c)=>{c.d(b,{s:()=>w});var d=c(18230),e=c(8918),f=c(59448),g=c(18975),h=c(1191),i=c(12763),j=c(22124),k=c(36303),l=c(82464),m=c(69088),n=c(71966);let o=(0,d.h)("backend/services/runResources/capture");function p(a){var b;return`[FLUJO stored this ${a.mimeType??a.kind} (${(b=a.size)<1024?`${b} B`:b<1048576?`${Math.round(b/1024)} KB`:`${(b/1048576).toFixed(1)} MB`}) as run resource ${a.uri}. Read it back via the 'flujo' MCP server (resources/read) if needed.]`}async function q(a){let{conversationId:b,server:c,toolName:d,toolCallId:e,nodeId:f,result:g,settings:h}=a,i=[];if(g.isError||!Array.isArray(g.content))return{result:g,captured:i};let j={source:"tool-result",nodeId:f,server:c,toolName:d,toolCallId:e},k=async(a,e,f,g)=>{try{let h=await (0,n.tm)({conversationId:b,mimeType:f,kind:a,data:e,producedBy:g?{...j,source:"mcp-link"}:j,origin:g});if("skipped"in h)return o.warn(`Auto-capture skipped (${h.skipped}) for ${c}/${d}`),null;return i.push(h),h}catch(a){return o.error(`Auto-capture failed for ${c}/${d}; keeping inline content`,a),null}},l=[];for(let a of g.content)switch(a.type){case"image":case"audio":{let b=await k(a.type,{base64:a.data},a.mimeType);l.push(b?{type:"text",text:p(b)}:a);break}case"resource_link":await k("link",void 0,a.mimeType,{server:c,uri:a.uri}),l.push(a);break;case"resource":{let b=a.resource;if("string"==typeof b.blob){let d=b.blob,e=await k("blob",{base64:d},b.mimeType,{server:c,uri:b.uri});l.push(e?{type:"text",text:p(e)}:a)}else if("string"==typeof b.text){let d=b.text;if(d.length>=h.textThresholdChars){let e=await k("text",{text:d},b.mimeType??"text/plain",{server:c,uri:b.uri});e&&h.replaceLargeTextWithStub?l.push({type:"text",text:`${d.slice(0,1024)}
|
|
61
62
|
…
|
|
62
63
|
${p(e)}`}):l.push(a)}else l.push(a)}else l.push(a);break}case"text":if("string"==typeof a.text&&a.text.length>=h.textThresholdChars){let b=await k("text",{text:a.text},"text/plain");b&&h.replaceLargeTextWithStub?l.push({type:"text",text:`${a.text.slice(0,1024)}
|
|
63
64
|
…
|
|
64
|
-
${p(b)}`}):l.push(a)}else l.push(a);break;default:l.push(a)}return 0===i.length?{result:g,captured:i}:{result:{...g,content:l},captured:i}}var r=c(96249);let s=globalThis,t=s.__flujoToolApprovals??(s.__flujoToolApprovals=new Map);var u=c(89850);let v=(0,d.h)("backend/flow/execution/handlers/ModelHandler");class w{static async resolveToolUiLink(a,b){let c=function(a){if(a&&"object"==typeof a){for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if("string"==typeof a&&a.trim().toLowerCase().startsWith("ui://"))return a}}}(b?._meta);if(c)try{let b=await l.mcpService.loadServerConfigs();if(!Array.isArray(b))return;let d=b.find(b=>b.name===a);if(!d?.enableMcpApps)return;return{uri:c,serverName:a}}catch(b){v.warn(`resolveToolUiLink: failed to check MCP Apps opt-in for ${a}`,b);return}}static extractProviderErrorDetails(a,b){let c=b||a?.message||"Provider returned an unspecified error in the response body.";b&&"string"==typeof a?.message&&a.message&&a.message!==b&&(c=`${b} - ${a.message}`);let d=a?.metadata;if(d){let a;if("string"==typeof d.raw)try{let b=JSON.parse(d.raw);a=b?.error?.message||b?.message||d.raw}catch{a=d.raw}else d.raw&&"object"==typeof d.raw&&(a=d.raw.error?.message||d.raw.message);let b=[];d.provider_name&&b.push(String(d.provider_name)),a&&b.push(a),b.length>0&&(c=`${c} (upstream: ${b.join(": ")})`)}return"string"==typeof a?.origin&&a.origin&&(c=`${c} (origin: ${a.origin})`),{message:c,code:a?.code,type:a?.type,param:a?.param,retryAfter:d?.retry_after_seconds!=null?String(d.retry_after_seconds):void 0,providerError:a}}static isConversationCancelled(a){try{let{FlowExecutor:b}=c(44561),{isCancelledByAncestry:d}=c(44479);return d(a,b.conversationStates)}catch(b){return v.warn(`Cancellation check failed for conversation ${a}`,{err:b}),!1}}static persistStreamedMessage(a,b){try{let{FlowExecutor:d}=c(44561),e=d.conversationStates.get(a);if(!e||!Array.isArray(e.messages))return;!function(a,b){let c=a.findIndex(a=>a.id===b.id);c>=0?a[c]=b:a.push(b)}(e.messages,b),e.updatedAt=Date.now()}catch(b){v.warn(`Failed to fold streamed message into conversation ${a}`,{err:b})}}static async callModel(a){let b,{modelId:c,prompt:d,messages:e,wireMessages:f,tools:g,nodeName:h,nodeId:k,toolNameMap:l,maxTurns:m,conversationId:n,requireToolApproval:o}=a;try{let a=await i.modelService.getModel(c);a&&(a.displayName||a.name,a.name,b=a.maxTurns)}catch(a){v.warn(`Failed to fetch model information for prefix: ${a instanceof Error?a.message:String(a)}`)}let p=function(a,b,c=j.m){return"number"==typeof a&&Number.isFinite(a)&&a>0?a:"number"==typeof b&&Number.isFinite(b)&&b>0?b:c}(m,b);v.info("callModel - Single execution",{modelId:c,messagesCount:e.length,toolsCount:g?.length||0,nodeName:h,nodeId:k}),v.verbose("callModel input",a);let q=n?r.$.emitterFor(n):void 0,s=o&&q&&n?async a=>{let b={id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args??{})}};return new Promise(a=>{let c;(c=t.get(n))||(c=new Map,t.set(n,c)),c.set(b.id,{toolCall:b,resolve:a}),q({type:"run:awaiting_approval",pendingToolCalls:function(a){let b=t.get(a);return b?Array.from(b.values(),a=>a.toolCall):[]}(n)})})}:void 0,x=q?a=>{let b=k?{...a,processNodeId:k}:a;q({type:"message",message:b,node:k?{nodeId:k}:void 0}),n&&w.persistStreamedMessage(n,b)}:void 0,y=n?()=>w.isConversationCancelled(n):void 0,z=await this.generateCompletion(c,d,f??e,g,{toolNameMap:l,maxTurns:p,requestToolApproval:s,onTranscriptMessage:x,shouldAbort:y});if(!z.success)return v.verbose("callModel error response",z),{success:!1,error:z.error};let A=z.value,B=A.content||"",C=[...e],D=function(a){if(!a)return;let b=a.prompt_tokens_details?.cached_tokens;return{promptTokens:a.prompt_tokens??0,completionTokens:a.completion_tokens??0,totalTokens:a.total_tokens??0,...null!=b?{cacheReadTokens:b}:{}}}(A.fullResponse?.usage);if(A.transcript&&A.transcript.length>0){let a=Date.now(),b=A.transcript;b.forEach((c,d)=>{let e=d===b.length-1;C.push({...c,id:c.id??(0,u.A)(),timestamp:c.timestamp??a+d,processNodeId:k,...e&&D?{usage:D}:{}})})}else{let a={id:(0,u.A)(),role:"assistant",content:B,tool_calls:A.fullResponse?.choices?.[0]?.message?.tool_calls,timestamp:Date.now(),processNodeId:k,...D?{usage:D}:{}};C.push(a)}let E=A.fullResponse?.choices?.[0]?.message?.tool_calls?.map(a=>{try{return{name:a.function.name,args:JSON.parse(a.function.arguments),id:a.id,result:""}}catch(b){return v.warn(`Failed to parse tool arguments for call ${a.id}`,{args:a.function.arguments,error:b}),{name:a.function.name,args:{},id:a.id,result:""}}}).filter(Boolean),F={success:!0,value:{content:B,messages:C,fullResponse:A.fullResponse,toolCalls:E}};return v.verbose("callModel single step result",F),F}static async generateCompletion(a,b,d,f,j){let l;v.verbose("generateCompletion input",{modelId:a,prompt:b,messages:d,tools:f});let m=new AbortController,n=()=>{l&&(clearInterval(l),l=void 0)};try{let b,h,o,p=await i.modelService.getModel(a);if(!p)return{success:!1,error:(0,e.M5)("model_not_found",`Model not found: ${a}`,a)};let q=p.temperature?parseFloat(p.temperature):0,r=await i.modelService.resolveAndDecryptApiKey(p.ApiKey);if(!r)return{success:!1,error:(0,e.M5)("api_key_error","Failed to resolve or decrypt API key",a)};v.verbose(`decrypted api key ${r}`),v.verbose(` baseurl ${p.baseUrl}`);let s=(0,g.ae)(d);if(f&&f.length>0){let{ToolHandler:a}=c(70834);b=f.map(b=>"function"===b.type&&b.function.parameters?{...b,function:{...b.function,parameters:a.sanitizeSchema(b.function.parameters)}}:b)}let t=(0,k.getCompletionAdapter)(p);if(v.debug("calling chatcompletion"),v.verbose("calling chatcompletion now with ADAPTER",p.adapter||"openai"),v.verbose("calling chatcompletion now with MODEL",p.name),v.verbose("calling chatcompletion now with TEMP",q),v.verbose("calling chatcompletion now with MESSAGES",s),v.verbose("calling chatcompletion now with TOOLS",b),v.debug("[ModelHandler.generateCompletion] Sending request via adapter",{adapter:p.adapter||"openai",model:p.name}),j?.shouldAbort&&(j.shouldAbort()?m.abort():(l=setInterval(()=>{j.shouldAbort()&&(v.info("Cancellation detected mid-completion; aborting the provider call.",{modelId:a}),m.abort(),n())},250),l.unref?.())),m.signal.aborted)return{success:!1,error:(0,e.M5)("cancelled","Execution cancelled by user.",a)};try{({completion:h,transcript:o}=await t.createCompletion({model:p,apiKey:r,messages:s,tools:b,temperature:q,toolNameMap:j?.toolNameMap,maxTurns:j?.maxTurns,requestToolApproval:j?.requestToolApproval,onTranscriptMessage:j?.onTranscriptMessage,signal:m.signal}))}finally{n()}if(v.debug("[ModelHandler.generateCompletion] Received raw response from OpenAI API",{response:h}),v.verbose("chatcompletion returned"),v.verbose("chatcompletion returned",h),h&&"object"==typeof h&&"error"in h&&h.error){v.warn("API call returned successfully but contained an error object:",JSON.stringify(h.error));let b=h.error,c=w.extractProviderErrorDetails(b),d={success:!1,error:(0,e.M5)("api_error",c.message,a,void 0,{code:c.code,type:c.type,param:c.param,retryAfter:c.retryAfter,providerError:c.providerError})};return v.verbose("generateCompletion returning error from response body",d),d}let u=h?.choices?.[0];if(!u)return v.error("API response missing choices array or first choice.",{response:h}),{success:!1,error:(0,e.M5)("api_error","Invalid response structure from API: Missing choices.",a,void 0,{rawResponse:h})};let x={success:!0,value:{content:u.message?.content||"",messages:[...d],fullResponse:h,transcript:o}};return v.verbose("generateCompletion success result",x),x}catch(c){if(n(),m.signal.aborted)return v.info("Provider call aborted by user cancellation.",{modelId:a}),{success:!1,error:(0,e.M5)("cancelled","Execution cancelled by user.",a)};if(v.error("[ModelHandler.generateCompletion] Caught error during OpenAI API call",{rawError:c}),v.error("--- Error during openai.chat.completions.create ---"),c instanceof Error?(v.error(`Error Name: ${c.name}`),v.error(`Error Message: ${c.message}`),v.error(`Error Stack: ${c.stack}`)):v.error("Caught non-Error object:",c),c instanceof h.Ay.APIError&&(v.error(`API Error Status: ${c.status}`),v.error(`API Error Type: ${c.type}`),v.error(`API Error Code: ${c.code}`),v.error(`API Error Param: ${c.param}`),v.error(`API Error Headers: ${JSON.stringify(c.headers)}`)),v.error("--- End Error Details ---"),c instanceof h.Ay.APIError){let b=c.error,d=w.extractProviderErrorDetails(b,c.message),f=c.headers||{},g=f["retry-after"]??f["Retry-After"],h=void 0!==g?String(g):d.retryAfter,i=f["x-ratelimit-reset"]??f["x-ratelimit-reset-requests"],j={success:!1,error:(0,e.M5)("api_error",d.message,a,void 0,{status:c.status,type:d.type??c.type,code:d.code??c.code,param:d.param??c.param,retryAfter:h,rateLimitReset:void 0!==i?String(i):void 0,providerError:d.providerError,stack:c.stack})};return v.verbose("generateCompletion API error",j),j}let b={success:!1,error:(0,e.M5)("unknown_error",c instanceof Error?c.message:String(c),a,void 0,{stack:c instanceof Error?c.stack:void 0})};return v.verbose("generateCompletion unknown error",b),b}}static async processToolCalls(a){let{toolCalls:b,toolNameMap:c,emit:d,conversationId:g,node:h}=a;if(v.verbose("processToolCalls input",a),!b||0===b.length){let a={success:!0,value:{toolCallMessages:[],processedToolCalls:[]}};return v.verbose("processToolCalls empty result",a),a}try{let e=[],i=[];for(let j=0;j<b.length;j++){let{id:k,function:{name:o,arguments:p}}=b[j];if(a.shouldAbort?.()){for(let a of(v.info(`Cancellation detected before tool call ${o}; skipping the remaining ${b.length-j} call(s).`),b.slice(j)))e.push({id:(0,u.A)(),role:"tool",tool_call_id:a.id,content:"Execution cancelled by user before this tool call ran.",timestamp:Date.now()});break}try{let a=JSON.parse(p);if(v.info("trying to call tool",o),o.startsWith("handoff_to_")||"handoff"===o){v.info(`Processing handoff tool: ${o}`);let b={handoff:!0,args:a},c=JSON.stringify(b);e.push({id:(0,u.A)(),role:"tool",tool_call_id:k,content:c,timestamp:Date.now()}),i.push({name:o,args:a,id:k,result:c});continue}let b=(0,f.ud)(o,c);if(!b)throw v.error("invalid tool format",o),Error(`Invalid tool name format: ${o}`);let j=b.server,r=b.tool;d?.({type:"tool:call",toolCallId:k,name:o,args:p});let s=b.timeout??m.aI,t=await l.mcpService.callTool(j,r,a,s,a=>d?.({type:"tool:progress",toolCallId:k,name:o,progress:a.progress,total:a.total,message:a.message})),x=t.data;if(t.success&&g)try{let a=await (0,n.jR)();if(a.autoCaptureEnabled){let b=await q({conversationId:g,server:j,toolName:r,toolCallId:k,nodeId:h?.nodeId,result:t.data,settings:a});for(let a of(x=b.result,b.captured))d?.({type:"resource:write",node:h,server:"flujo",uri:a.uri,name:a.name,mimeType:a.mimeType,size:a.size,source:"tool-result",toolCallId:k})}}catch(a){v.error("Run-resource auto-capture failed; keeping original tool result",a),x=t.data}let y=t.success?JSON.stringify(x):`Error: ${t.error}`;d?.({type:"tool:result",toolCallId:k,name:o,result:y.length>500?`${y.slice(0,500)}…`:y,isError:!t.success});let z=t.success?await w.resolveToolUiLink(j,t.data):void 0;e.push({id:(0,u.A)(),role:"tool",tool_call_id:k,content:y,timestamp:Date.now(),...z?{ui:z}:{}}),i.push({name:o,args:a,id:k,result:y})}catch(b){let a=`Error: ${b instanceof Error?b.message:"Unknown error"}`;d?.({type:"tool:result",toolCallId:k,name:o,result:a,isError:!0}),e.push({id:(0,u.A)(),role:"tool",tool_call_id:k,content:a,timestamp:Date.now()}),i.push({name:o,args:{},id:k,result:a})}}let j={success:!0,value:{toolCallMessages:e,processedToolCalls:i}};return v.verbose("processToolCalls success result",j),j}catch(b){let a={success:!1,error:(0,e.Po)("tool_processing_failed",b instanceof Error?b.message:String(b),"unknown")};return v.verbose("processToolCalls error result",a),a}}static hasToolCalls(a){return!!(a.fullResponse?.choices?.[0]?.message?.tool_calls&&a.fullResponse.choices[0].message.tool_calls.length>0)}}},85701:(a,b,c)=>{c.d(b,{A:()=>d});let d=8},96249:(a,b,c)=>{c.d(b,{$:()=>i});var d=c(94735),e=c(34115);let f=(0,c(18230).h)("backend/execution/flow/engine/ExecutionEventBus");class g{getChannel(a){let b=this.channels.get(a);if(!b){let c=new d.EventEmitter;c.setMaxListeners(0),b={emitter:c,seq:0,buffer:[]},this.channels.set(a,b)}return b}cancelCleanup(a){let b=this.cleanupTimers.get(a);b&&(clearTimeout(b),this.cleanupTimers.delete(a))}scheduleCleanup(a,b){this.cancelCleanup(a);let c=setTimeout(()=>{this.cleanupTimers.delete(a);let c=this.channels.get(a);c&&c.seq===b&&(c.emitter.listenerCount("event")>0||this.channels.delete(a))},3e5);"function"==typeof c.unref&&c.unref(),this.cleanupTimers.set(a,c)}emit(a,b){let c=this.getChannel(a),d={...b,conversationId:a,seq:c.seq++,timestamp:Date.now()};return c.buffer.push(d),c.buffer.length>1e3&&c.buffer.shift(),c.emitter.emit("event",d),(0,e.LB)(d),"run:done"===d.type?this.scheduleCleanup(a,c.seq):this.cancelCleanup(a),d}emitterFor(a){return b=>{try{this.emit(a,b)}catch(b){f.warn(`Failed to emit execution event for ${a}`,{err:b})}}}getBufferedSince(a,b){let c=this.channels.get(a);return c?c.buffer.filter(a=>a.seq>=b):[]}currentSeq(a){return this.channels.get(a)?.seq??0}subscribe(a,b){let c=this.getChannel(a);return c.emitter.on("event",b),()=>{c.emitter.off("event",b)}}constructor(){this.channels=new Map,this.cleanupTimers=new Map}}let h=globalThis,i=h.__flujoExecutionEventBus??(h.__flujoExecutionEventBus=new g)}};
|
|
65
|
+
${p(b)}`}):l.push(a)}else l.push(a);break;default:l.push(a)}return 0===i.length?{result:g,captured:i}:{result:{...g,content:l},captured:i}}var r=c(96249);let s=globalThis,t=s.__flujoToolApprovals??(s.__flujoToolApprovals=new Map);var u=c(89850);let v=(0,d.h)("backend/flow/execution/handlers/ModelHandler");class w{static async resolveToolUiLink(a,b){let c=function(a){if(a&&"object"==typeof a){for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if("string"==typeof a&&a.trim().toLowerCase().startsWith("ui://"))return a}}}(b?._meta);if(c)try{let b=await l.mcpService.loadServerConfigs();if(!Array.isArray(b))return;let d=b.find(b=>b.name===a);if(!d?.enableMcpApps)return;return{uri:c,serverName:a}}catch(b){v.warn(`resolveToolUiLink: failed to check MCP Apps opt-in for ${a}`,b);return}}static extractProviderErrorDetails(a,b){let c=b||a?.message||"Provider returned an unspecified error in the response body.";b&&"string"==typeof a?.message&&a.message&&a.message!==b&&(c=`${b} - ${a.message}`);let d=a?.metadata;if(d){let a;if("string"==typeof d.raw)try{let b=JSON.parse(d.raw);a=b?.error?.message||b?.message||d.raw}catch{a=d.raw}else d.raw&&"object"==typeof d.raw&&(a=d.raw.error?.message||d.raw.message);let b=[];d.provider_name&&b.push(String(d.provider_name)),a&&b.push(a),b.length>0&&(c=`${c} (upstream: ${b.join(": ")})`)}return"string"==typeof a?.origin&&a.origin&&(c=`${c} (origin: ${a.origin})`),{message:c,code:a?.code,type:a?.type,param:a?.param,retryAfter:d?.retry_after_seconds!=null?String(d.retry_after_seconds):void 0,providerError:a}}static isConversationCancelled(a){try{let{FlowExecutor:b}=c(44561),{isCancelledByAncestry:d}=c(44479);return d(a,b.conversationStates)}catch(b){return v.warn(`Cancellation check failed for conversation ${a}`,{err:b}),!1}}static persistStreamedMessage(a,b){try{let{FlowExecutor:d}=c(44561),e=d.conversationStates.get(a);if(!e||!Array.isArray(e.messages))return;!function(a,b){let c=a.findIndex(a=>a.id===b.id);c>=0?a[c]=b:a.push(b)}(e.messages,b),e.updatedAt=Date.now()}catch(b){v.warn(`Failed to fold streamed message into conversation ${a}`,{err:b})}}static async callModel(a){let b,{modelId:c,prompt:d,messages:e,wireMessages:f,tools:g,nodeName:h,nodeId:k,toolNameMap:l,maxTurns:m,conversationId:n,requireToolApproval:o}=a;try{let a=await i.modelService.getModel(c);a&&(a.displayName||a.name,a.name,b=a.maxTurns)}catch(a){v.warn(`Failed to fetch model information for prefix: ${a instanceof Error?a.message:String(a)}`)}let p=function(a,b,c=j.m){return"number"==typeof a&&Number.isFinite(a)&&a>0?a:"number"==typeof b&&Number.isFinite(b)&&b>0?b:c}(m,b);v.info("callModel - Single execution",{modelId:c,messagesCount:e.length,toolsCount:g?.length||0,nodeName:h,nodeId:k}),v.verbose("callModel input",a);let q=n?r.$.emitterFor(n):void 0,s=o&&q&&n?async a=>{let b={id:a.id,type:"function",function:{name:a.name,arguments:JSON.stringify(a.args??{})}};return new Promise(a=>{let c;(c=t.get(n))||(c=new Map,t.set(n,c)),c.set(b.id,{toolCall:b,resolve:a}),q({type:"run:awaiting_approval",pendingToolCalls:function(a){let b=t.get(a);return b?Array.from(b.values(),a=>a.toolCall):[]}(n)})})}:void 0,x=q?a=>{let b=k?{...a,processNodeId:k}:a;q({type:"message",message:b,node:k?{nodeId:k}:void 0}),n&&w.persistStreamedMessage(n,b)}:void 0,y=n?()=>w.isConversationCancelled(n):void 0,z=await this.generateCompletion(c,d,f??e,g,{toolNameMap:l,maxTurns:p,requestToolApproval:s,onTranscriptMessage:x,shouldAbort:y,conversationId:n,nodeId:k});if(!z.success)return v.verbose("callModel error response",z),{success:!1,error:z.error};let A=z.value,B=A.content||"",C=[...e],D=function(a){if(!a)return;let b=a.prompt_tokens_details?.cached_tokens;return{promptTokens:a.prompt_tokens??0,completionTokens:a.completion_tokens??0,totalTokens:a.total_tokens??0,...null!=b?{cacheReadTokens:b}:{}}}(A.fullResponse?.usage);if(A.transcript&&A.transcript.length>0){let a=Date.now(),b=A.transcript;b.forEach((c,d)=>{let e=d===b.length-1;C.push({...c,id:c.id??(0,u.A)(),timestamp:c.timestamp??a+d,processNodeId:k,...e&&D?{usage:D}:{}})})}else{let a={id:(0,u.A)(),role:"assistant",content:B,tool_calls:A.fullResponse?.choices?.[0]?.message?.tool_calls,timestamp:Date.now(),processNodeId:k,...D?{usage:D}:{}};C.push(a)}let E=A.fullResponse?.choices?.[0]?.message?.tool_calls?.map(a=>{try{return{name:a.function.name,args:JSON.parse(a.function.arguments),id:a.id,result:""}}catch(b){return v.warn(`Failed to parse tool arguments for call ${a.id}`,{args:a.function.arguments,error:b}),{name:a.function.name,args:{},id:a.id,result:""}}}).filter(Boolean),F={success:!0,value:{content:B,messages:C,fullResponse:A.fullResponse,toolCalls:E}};return v.verbose("callModel single step result",F),F}static async generateCompletion(a,b,d,f,j){let l;v.verbose("generateCompletion input",{modelId:a,prompt:b,messages:d,tools:f});let m=new AbortController,n=()=>{l&&(clearInterval(l),l=void 0)};try{let b,h,o,p=await i.modelService.getModel(a);if(!p)return{success:!1,error:(0,e.M5)("model_not_found",`Model not found: ${a}`,a)};let q=p.temperature?parseFloat(p.temperature):0,r=await i.modelService.resolveAndDecryptApiKey(p.ApiKey);if(!r)return{success:!1,error:(0,e.M5)("api_key_error","Failed to resolve or decrypt API key",a)};v.verbose(`decrypted api key ${r}`),v.verbose(` baseurl ${p.baseUrl}`);let s=(0,g.ae)(d);if(f&&f.length>0){let{ToolHandler:a}=c(70834);b=f.map(b=>"function"===b.type&&b.function.parameters?{...b,function:{...b.function,parameters:a.sanitizeSchema(b.function.parameters)}}:b)}let t=(0,k.getCompletionAdapter)(p);if(v.debug("calling chatcompletion"),v.verbose("calling chatcompletion now with ADAPTER",p.adapter||"openai"),v.verbose("calling chatcompletion now with MODEL",p.name),v.verbose("calling chatcompletion now with TEMP",q),v.verbose("calling chatcompletion now with MESSAGES",s),v.verbose("calling chatcompletion now with TOOLS",b),v.debug("[ModelHandler.generateCompletion] Sending request via adapter",{adapter:p.adapter||"openai",model:p.name}),j?.shouldAbort&&(j.shouldAbort()?m.abort():(l=setInterval(()=>{j.shouldAbort()&&(v.info("Cancellation detected mid-completion; aborting the provider call.",{modelId:a}),m.abort(),n())},250),l.unref?.())),m.signal.aborted)return{success:!1,error:(0,e.M5)("cancelled","Execution cancelled by user.",a)};try{({completion:h,transcript:o}=await t.createCompletion({model:p,apiKey:r,messages:s,tools:b,temperature:q,toolNameMap:j?.toolNameMap,maxTurns:j?.maxTurns,requestToolApproval:j?.requestToolApproval,onTranscriptMessage:j?.onTranscriptMessage,signal:m.signal,conversationId:j?.conversationId,nodeId:j?.nodeId}))}finally{n()}if(v.debug("[ModelHandler.generateCompletion] Received raw response from OpenAI API",{response:h}),v.verbose("chatcompletion returned"),v.verbose("chatcompletion returned",h),h&&"object"==typeof h&&"error"in h&&h.error){v.warn("API call returned successfully but contained an error object:",JSON.stringify(h.error));let b=h.error,c=w.extractProviderErrorDetails(b),d={success:!1,error:(0,e.M5)("api_error",c.message,a,void 0,{code:c.code,type:c.type,param:c.param,retryAfter:c.retryAfter,providerError:c.providerError})};return v.verbose("generateCompletion returning error from response body",d),d}let u=h?.choices?.[0];if(!u)return v.error("API response missing choices array or first choice.",{response:h}),{success:!1,error:(0,e.M5)("api_error","Invalid response structure from API: Missing choices.",a,void 0,{rawResponse:h})};let x={success:!0,value:{content:u.message?.content||"",messages:[...d],fullResponse:h,transcript:o}};return v.verbose("generateCompletion success result",x),x}catch(c){if(n(),m.signal.aborted)return v.info("Provider call aborted by user cancellation.",{modelId:a}),{success:!1,error:(0,e.M5)("cancelled","Execution cancelled by user.",a)};if(v.error("[ModelHandler.generateCompletion] Caught error during OpenAI API call",{rawError:c}),v.error("--- Error during openai.chat.completions.create ---"),c instanceof Error?(v.error(`Error Name: ${c.name}`),v.error(`Error Message: ${c.message}`),v.error(`Error Stack: ${c.stack}`)):v.error("Caught non-Error object:",c),c instanceof h.Ay.APIError&&(v.error(`API Error Status: ${c.status}`),v.error(`API Error Type: ${c.type}`),v.error(`API Error Code: ${c.code}`),v.error(`API Error Param: ${c.param}`),v.error(`API Error Headers: ${JSON.stringify(c.headers)}`)),v.error("--- End Error Details ---"),c instanceof h.Ay.APIError){let b=c.error,d=w.extractProviderErrorDetails(b,c.message),f=c.headers||{},g=f["retry-after"]??f["Retry-After"],h=void 0!==g?String(g):d.retryAfter,i=f["x-ratelimit-reset"]??f["x-ratelimit-reset-requests"],j={success:!1,error:(0,e.M5)("api_error",d.message,a,void 0,{status:c.status,type:d.type??c.type,code:d.code??c.code,param:d.param??c.param,retryAfter:h,rateLimitReset:void 0!==i?String(i):void 0,providerError:d.providerError,stack:c.stack})};return v.verbose("generateCompletion API error",j),j}let b={success:!1,error:(0,e.M5)("unknown_error",c instanceof Error?c.message:String(c),a,void 0,{stack:c instanceof Error?c.stack:void 0})};return v.verbose("generateCompletion unknown error",b),b}}static async processToolCalls(a){let{toolCalls:b,toolNameMap:c,emit:d,conversationId:g,node:h}=a;if(v.verbose("processToolCalls input",a),!b||0===b.length){let a={success:!0,value:{toolCallMessages:[],processedToolCalls:[]}};return v.verbose("processToolCalls empty result",a),a}try{let e=[],i=[];for(let j=0;j<b.length;j++){let{id:k,function:{name:o,arguments:p}}=b[j];if(a.shouldAbort?.()){for(let a of(v.info(`Cancellation detected before tool call ${o}; skipping the remaining ${b.length-j} call(s).`),b.slice(j)))e.push({id:(0,u.A)(),role:"tool",tool_call_id:a.id,content:"Execution cancelled by user before this tool call ran.",timestamp:Date.now()});break}try{let a=JSON.parse(p);if(v.info("trying to call tool",o),o.startsWith("handoff_to_")||"handoff"===o){v.info(`Processing handoff tool: ${o}`);let b={handoff:!0,args:a},c=JSON.stringify(b);e.push({id:(0,u.A)(),role:"tool",tool_call_id:k,content:c,timestamp:Date.now()}),i.push({name:o,args:a,id:k,result:c});continue}let b=(0,f.ud)(o,c);if(!b)throw v.error("invalid tool format",o),Error(`Invalid tool name format: ${o}`);let j=b.server,r=b.tool;d?.({type:"tool:call",toolCallId:k,name:o,args:p});let s=b.timeout??m.aI,t=await l.mcpService.callTool(j,r,a,s,a=>d?.({type:"tool:progress",toolCallId:k,name:o,progress:a.progress,total:a.total,message:a.message})),x=t.data;if(t.success&&g)try{let a=await (0,n.jR)();if(a.autoCaptureEnabled){let b=await q({conversationId:g,server:j,toolName:r,toolCallId:k,nodeId:h?.nodeId,result:t.data,settings:a});for(let a of(x=b.result,b.captured))d?.({type:"resource:write",node:h,server:"flujo",uri:a.uri,name:a.name,mimeType:a.mimeType,size:a.size,source:"tool-result",toolCallId:k})}}catch(a){v.error("Run-resource auto-capture failed; keeping original tool result",a),x=t.data}let y=t.success?JSON.stringify(x):`Error: ${t.error}`;d?.({type:"tool:result",toolCallId:k,name:o,result:y.length>500?`${y.slice(0,500)}…`:y,isError:!t.success});let z=t.success?await w.resolveToolUiLink(j,t.data):void 0;e.push({id:(0,u.A)(),role:"tool",tool_call_id:k,content:y,timestamp:Date.now(),...z?{ui:z}:{}}),i.push({name:o,args:a,id:k,result:y})}catch(b){let a=`Error: ${b instanceof Error?b.message:"Unknown error"}`;d?.({type:"tool:result",toolCallId:k,name:o,result:a,isError:!0}),e.push({id:(0,u.A)(),role:"tool",tool_call_id:k,content:a,timestamp:Date.now()}),i.push({name:o,args:{},id:k,result:a})}}let j={success:!0,value:{toolCallMessages:e,processedToolCalls:i}};return v.verbose("processToolCalls success result",j),j}catch(b){let a={success:!1,error:(0,e.Po)("tool_processing_failed",b instanceof Error?b.message:String(b),"unknown")};return v.verbose("processToolCalls error result",a),a}}static hasToolCalls(a){return!!(a.fullResponse?.choices?.[0]?.message?.tool_calls&&a.fullResponse.choices[0].message.tool_calls.length>0)}}},85701:(a,b,c)=>{c.d(b,{A:()=>d});let d=8},96249:(a,b,c)=>{c.d(b,{$:()=>i});var d=c(94735),e=c(34115);let f=(0,c(18230).h)("backend/execution/flow/engine/ExecutionEventBus");class g{getChannel(a){let b=this.channels.get(a);if(!b){let c=new d.EventEmitter;c.setMaxListeners(0),b={emitter:c,seq:0,buffer:[]},this.channels.set(a,b)}return b}cancelCleanup(a){let b=this.cleanupTimers.get(a);b&&(clearTimeout(b),this.cleanupTimers.delete(a))}scheduleCleanup(a,b){this.cancelCleanup(a);let c=setTimeout(()=>{this.cleanupTimers.delete(a);let c=this.channels.get(a);c&&c.seq===b&&(c.emitter.listenerCount("event")>0||this.channels.delete(a))},3e5);"function"==typeof c.unref&&c.unref(),this.cleanupTimers.set(a,c)}emit(a,b){let c=this.getChannel(a),d={...b,conversationId:a,seq:c.seq++,timestamp:Date.now()};return c.buffer.push(d),c.buffer.length>1e3&&c.buffer.shift(),c.emitter.emit("event",d),(0,e.LB)(d),"run:done"===d.type?this.scheduleCleanup(a,c.seq):this.cancelCleanup(a),d}emitterFor(a){return b=>{try{this.emit(a,b)}catch(b){f.warn(`Failed to emit execution event for ${a}`,{err:b})}}}getBufferedSince(a,b){let c=this.channels.get(a);return c?c.buffer.filter(a=>a.seq>=b):[]}currentSeq(a){return this.channels.get(a)?.seq??0}subscribe(a,b){let c=this.getChannel(a);return c.emitter.on("event",b),()=>{c.emitter.off("event",b)}}constructor(){this.channels=new Map,this.cleanupTimers=new Map}}let h=globalThis,i=h.__flujoExecutionEventBus??(h.__flujoExecutionEventBus=new g)}};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";exports.id=4771,exports.ids=[4771,6793],exports.modules={4771:(a,b,c)=>{c.d(b,{z:()=>F});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(58739),i=c(52189),j=c(33873),k=c.n(j),l=c(29021),m=c(9794);let n=(0,g.h)("backend/services/scheduler/triggers/fileWatch");var o=c(73736),p=c(10960),q=c(51875);let r=(0,g.h)("backend/services/scheduler/triggers/mcpPoll"),s=(0,g.h)("backend/services/scheduler/triggers/urlWatch");var t=c(56793);let u=(0,g.h)("backend/services/scheduler/triggers/flowEvent");function v(a){return a&&a.length>8192?`${a.slice(0,8192)}… (truncated)`:a}var w=c(59911);let x=(0,g.h)("backend/services/scheduler/state"),y=a=>`planned-execution-state/${a}`;async function z(a){try{return await (0,e.YM)(y(a),{})}catch(b){return x.error(`Failed to load trigger state for ${a}:`,b),{}}}async function A(a,b){await (0,e.VH)(y(a),b)}async function B(a){await (0,e.N2)(y(a))}let C=(0,g.h)("backend/services/scheduler/index"),D={version:1,paused:!1,executions:[]};class E{static{this.MAX_QUEUE_DEPTH=50}async start(){this.started||(this.started=!0,C.info("Starting scheduler"),await this.reconcile())}reconcile(){let a=this.reconcileChain.catch(()=>{}).then(()=>this.doReconcile());return this.reconcileChain=a,a}async doReconcile(){for(let[a,b]of this.armed)try{b.dispose()}catch(b){C.warn(`Failed to dispose trigger for ${a}:`,b)}this.armed.clear();let a=await this.loadFile();if(this.pausedCache=a.paused,a.paused)return void C.info("Scheduler is paused — nothing armed");for(let b of a.executions)if(b.enabled)try{await this.armExecution(b)}catch(c){let a=c instanceof Error?c.message:String(c);this.lastTriggerErrors.set(b.id,a),C.error(`Failed to arm "${b.name}" (${b.id}):`,c)}C.info(`Scheduler armed ${this.armed.size} execution(s)`)}async armExecution(a){let b=a.trigger;switch(b.type){case"schedule":{let c=await z(a.id);c.lastScheduledFireAt?b.catchUp&&(0,i.hk)(b,c.lastScheduledFireAt)&&(await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),C.info(`Catch-up run for "${a.name}" (missed while closed)`),this.fire(a,{kind:"schedule-catchup",summary:"Schedule (missed while FLUJO was closed — ran once at startup)"})):await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),this.armed.set(a.id,(0,i.wv)(b,()=>{(async()=>{let b=await z(a.id);await A(a.id,{...b,lastScheduledFireAt:new Date().toISOString()}),await this.fire(a,{kind:"schedule",summary:"Schedule"})})().catch(b=>C.error(`Scheduled fire failed for ${a.id}:`,b))}));break}case"webhook":break;case"file-watch":this.armed.set(a.id,function(a,b,c){let d,e=a.debounceMs??2e3,f=new Set(a.events),g=a.glob?.trim()?function(a){let b=a.replace(/\\/g,"/"),c="";for(let a=0;a<b.length;a++){let d=b[a];"*"===d?"*"===b[a+1]?"/"===b[++a+1]?(a++,c+="(?:.*/)?"):c+=".*":c+="[^/]*":"?"===d?c+="[^/]":c+=d.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return RegExp(`^${c}$`)}(a.glob.trim()):null;try{d=l.realpathSync.native(a.path)}catch(d){let b=d instanceof Error?d.message:String(d);return n.warn(`Cannot watch "${a.path}": ${b}`),c(`Cannot watch "${a.path}": ${b}`),{dispose:()=>void 0}}let h=[],i=!1,j=null,o=!1,p=()=>{if(j=null,o||0===h.length)return;let a=h;i&&n.info("File-watch batch overflowed; reporting first 50 events"),h=[],i=!1,b({events:a})},q=(0,m.wB)(d,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}});return q.on("all",(a,b)=>{if(!o&&("add"===a||"change"===a||"unlink"===a)&&f.has(a)){if(g){let a=k().relative(d,b).replace(/\\/g,"/")||k().basename(b);if(!g.test(a))return}h.length>=50?i=!0:h.push({event:a,path:b}),j&&clearTimeout(j),j=setTimeout(p,e),j.unref?.()}}),q.on("error",a=>{let b=a instanceof Error?a.message:String(a);n.warn(`Watcher error for ${d}: ${b}`),c(b)}),{dispose:()=>{o=!0,j&&(clearTimeout(j),j=null),h=[],q.close().catch(a=>n.warn(`Failed to close watcher for ${d}:`,a))}}}(b,({events:c})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"file",summary:1===c.length?`File ${"unlink"===c[0].event?"deleted":"add"===c[0].event?"added":"changed"}`:`${c.length} file changes`,context:{watchedPath:b.path,events:c}})},b=>this.lastTriggerErrors.set(a.id,b)));break;case"mcp-poll":Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(264)]).then(c.bind(c,61397)).then(async({mcpService:c})=>{await c.isServerDisabled(b.serverName)&&this.lastTriggerErrors.set(a.id,`MCP server '${b.serverName}' is disabled — enable it on the MCP page or change the trigger`)}).catch(b=>C.warn(`Arm-time disabled-server check failed for ${a.id}:`,b)),this.armed.set(a.id,function(a,b){let c=a.cron||(0,p.X)(a.intervalMs),d=!1,e=!1,f=0,g=0,h=async()=>{if(!e&&!d){if(g>0)return void g--;d=!0;try{let c,d=await b.callTool(a.serverName,a.toolName,a.args);if(!d.success)throw Error(d.error||"Tool call failed");f=0;let g=await b.loadState(),h=a.evaluate;if(c="on-change"===h.mode?(0,q.Jl)(d.data,g):"new-items"===h.mode?(0,q.A1)(d.data,h.itemsPath,h.idField,g):b.evaluateAiGate?await b.evaluateAiGate(d.data,h,g):{fire:!1,newState:{},error:'The "AI decides" condition is not available yet'},e)return;if(Object.keys(c.newState).length>0&&await b.saveState(c.newState),c.error)b.onError(c.error);else if(c.fire){let{status:d}=await b.onFire({summary:`Watched tool: ${c.summary??"condition met"}`,context:{server:a.serverName,tool:a.toolName,..."object"==typeof c.context&&null!==c.context?c.context:{result:c.context}}});if(e)return;if(c.pendingState){let{giveUpError:a}=await (0,q.vV)({status:d,pendingState:c.pendingState,priorFailures:g.pendingFailures??0,saveState:b.saveState});a&&b.onError(a)}}else b.onSuccess?.()}catch(d){f++,g=Math.min(2**(f-1),8);let c=d instanceof Error?d.message:String(d);r.warn(`Poll failed for ${a.serverName}/${a.toolName} (backing off ${g} check(s)): ${c}`),b.onError(c)}finally{d=!1}}},i=new o.l4(c,{timezone:a.timezone,unref:!0},()=>void h());return h(),{dispose:()=>{e=!0,i.stop()},nextRun:()=>i.nextRun()?.toISOString()??null}}(b,{callTool:async(a,b,d)=>{let{mcpService:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(264)]).then(c.bind(c,61397)),f=await e.callTool(a,b,d);return{success:!0===f.success,data:f.data,error:"string"==typeof f.error?f.error:void 0}},loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"mcp-poll",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id),evaluateAiGate:async(a,b,d)=>{let{evaluateAiGate:e}=await c.e(7506).then(c.bind(c,47506));return e(a,b,d)}}));break;case"url-watch":this.armed.set(a.id,function(a,b){let c=b.fetchImpl??fetch,d=!1,e=!1,f=async()=>{if(!e&&!d){d=!0;try{let d=await c(a.url,{redirect:"follow",headers:{"User-Agent":"FLUJO-url-watch"},signal:AbortSignal.timeout(3e4)});if(!d.ok)return void b.onError(`The URL answered with HTTP ${d.status}`);let f=await d.text(),g=(0,q.qq)(f),h=await b.loadState();if(e)return;if(!h.lastHash){await b.saveState({lastHash:g}),b.onSuccess?.();return}if(h.lastHash===g)return void b.onSuccess?.();let{status:i}=await b.onFire({summary:"Online content changed",context:{url:a.url,status:d.status,contentType:d.headers.get("content-type")??void 0,content:f.length>8192?`${f.slice(0,8192)}… (truncated, ${f.length} chars total)`:f}});if(e)return;let{giveUpError:j}=await (0,q.vV)({status:i,pendingState:{lastHash:g},priorFailures:h.pendingFailures??0,saveState:b.saveState});j&&b.onError(j)}catch(d){let c=d instanceof Error&&"TimeoutError"===d.name?"The URL did not answer within 30s":d instanceof Error?d.message:String(d);s.warn(`URL check failed for ${a.url}: ${c}`),b.onError(c)}finally{d=!1}}},g=new o.l4(a.cron,{timezone:a.timezone,unref:!0},()=>void f());return f(),{dispose:()=>{e=!0,g.stop()},nextRun:()=>g.nextRun()?.toISOString()??null}}(b,{loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"url-watch",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id)}));break;case"flow-event":this.armed.set(a.id,function(a,b){let c=a.maxChainDepth??5,d="string"==typeof a.source.topic?a.source.topic.trim():"",e=d.length>0,f=0,g=null,h=!1;if(a.outputMatch?.regex)try{g=new RegExp(a.outputMatch.regex)}catch(c){h=!0;let a=`Invalid output-match regex: ${c instanceof Error?c.message:String(c)}`;u.warn(a),b.onError(a)}let i=b=>{if(!a.outputMatch)return!0;if(h)return!1;let c=(b??"").slice(0,16384);return(!a.outputMatch.contains||!!c.includes(a.outputMatch.contains))&&(!g||!!g.test(c))},j=(d,e,g)=>{if(d>=c){let a=`Flow-event chain reached the depth limit (${c}); not firing again`;u.info(a),b.onSkip(a);return}let h=Date.now();if(a.minIntervalMs&&h-f<a.minIntervalMs)return void u.debug(`Flow-event cooldown active (${a.minIntervalMs}ms); ignoring event`);f=h,b.onFire({summary:e,context:g,chainDepth:d+1})},k=(0,t.eh)().subscribe(c=>{try{if(e){if(!(0,t.ru)(c)||c.topic!==d||!i(c.payload))return;j(c.chainDepth,`Signal "${c.topic}"`,{topic:c.topic,payload:v(c.payload),emitterFlowId:c.emitterFlowId,flowName:c.flowName,runId:c.runId,conversationId:c.conversationId,firedBy:c.firedBy});return}if((0,t.ru)(c)||!(b=>{let c=a.source;return c.executionId?b.executionId===c.executionId:c.flowId?b.flowId===c.flowId:!!c.flowName&&b.flowName===c.flowName})(c)||!c.status||!(a.on??[]).includes(c.status)||!i(c.outputText))return;let b=c.flowName??c.flowId;j(c.chainDepth,`Flow "${b}" ${c.status}`,{flowId:c.flowId,flowName:c.flowName,executionId:c.executionId,runId:c.runId,conversationId:c.conversationId,status:c.status,firedBy:c.firedBy,outputText:v(c.outputText),error:c.error})}catch(c){let a=c instanceof Error?c.message:String(c);u.warn(`Flow-event handling failed: ${a}`),b.onError(a)}});return{dispose:()=>k(),nextRun:()=>null}}(b,{onFire:({summary:b,context:c,chainDepth:d})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"flow-event",summary:b,context:c,chainDepth:d}).catch(b=>C.error(`Flow-event fire failed for ${a.id}:`,b))},onSkip:b=>{let c=new Date().toISOString();(0,w.Hy)(a.id,{runId:(0,d.A)(),conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:"Flow event",error:b}).catch(b=>C.warn(`Failed to record flow-event skip for ${a.id}:`,b))},onError:b=>this.lastTriggerErrors.set(a.id,b)}));break;default:C.warn(`Trigger type "${b.type}" is not implemented — "${a.name}" not armed`)}}async loadFile(){let a=await (0,e.YM)(f.Z.PLANNED_EXECUTIONS,D);return{version:1,paused:!0===a.paused,executions:Array.isArray(a.executions)?a.executions:[]}}async saveFile(a){await (0,e.VH)(f.Z.PLANNED_EXECUTIONS,a)}async isPaused(){return(await this.loadFile()).paused}async setPaused(a){let b=await this.loadFile();if(await this.saveFile({...b,paused:a}),await this.reconcile(),a)for(let a of[...this.queued.keys()])await this.cancelQueued(a,"scheduler paused",!0)}async list(){return Promise.all((await this.loadFile()).executions.map(async a=>({execution:a,status:this.getStatus(a),lastRun:await (0,w.tl)(a.id)})))}async get(a){return(await this.loadFile()).executions.find(b=>b.id===a)??null}async create(a){let b=this.validateInput(a);if(b)return{error:b};if(void 0!==a.id&&!/^[A-Za-z0-9._:-]{1,128}$/.test(a.id))return{error:"The id must be 1-128 characters of letters, digits, dot, underscore, colon or hyphen"};if("."===a.id||".."===a.id)return{error:'The id must be a safe identifier, not "." or ".."'};let c=new Date().toISOString(),e={...a,trigger:this.normalizeTrigger(a.trigger),id:a.id??(0,d.A)(),createdAt:c,updatedAt:c},f=await this.loadFile();return f.executions.some(a=>a.id===e.id)?{error:`A planned execution with id "${e.id}" already exists`,conflict:!0}:(await this.saveFile({...f,executions:[...f.executions,e]}),await this.reconcile(),{execution:e})}async update(a,b){let c=await this.loadFile(),d=c.executions.findIndex(b=>b.id===a);if(d<0)return{error:`No planned execution with id "${a}"`};let e={...c.executions[d],...b,...b.trigger?{trigger:this.normalizeTrigger(b.trigger)}:{},id:a,createdAt:c.executions[d].createdAt,updatedAt:new Date().toISOString()},f=this.validateInput(e);if(f)return{error:f};let g=[...c.executions];return g[d]=e,await this.saveFile({...c,executions:g}),await this.reconcile(),await this.cancelQueued(a,"execution updated",!0),{execution:e}}async delete(a){let b=await this.loadFile();return b.executions.some(b=>b.id===a)?(await this.saveFile({...b,executions:b.executions.filter(b=>b.id!==a)}),await this.reconcile(),this.lastTriggerErrors.delete(a),await this.cancelQueued(a,"execution deleted",!1),await (0,w.xC)(a),await B(a),{success:!0}):{success:!1,error:`No planned execution with id "${a}"`}}normalizeTrigger(a){return a?.type!=="webhook"||a.token?a?.type!=="mcp-poll"||a.cron?a:{...a,cron:(0,p.X)(a.intervalMs)}:{...a,token:(0,d.A)()}}validateInput(a){if(!a.name?.trim())return"A name is required";if(!a.flowId)return"A flow is required";if("string"!=typeof a.prompt)return"A prompt is required (may be empty)";if(void 0!==a.overlapStrategy&&!["skip","queue","parallel","error"].includes(a.overlapStrategy))return"Overlap strategy must be one of: skip, queue, parallel, error";let b=a.trigger;if(!b||"object"!=typeof b)return"A trigger is required";switch(b.type){case"schedule":{let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"webhook":return null;case"file-watch":if(!b.path?.trim())return"A folder or file path to watch is required";if(!Array.isArray(b.events)||0===b.events.length)return"At least one file event is required";return null;case"mcp-poll":if(!b.serverName||!b.toolName)return"A server and tool are required";if(b.cron){let a=(0,i.O9)(b.cron,b.timezone);if(!a.valid)return`Invalid schedule: ${a.error}`}if(b.evaluate?.mode==="new-items"&&!b.evaluate.idField?.trim())return"An id field is required to detect new items";if((b.evaluate?.mode==="llm-gate"||b.evaluate?.mode==="flow-gate")&&!b.evaluate.condition?.trim())return"A condition is required for the AI to check";if(b.evaluate?.mode==="llm-gate"&&!b.evaluate.modelId)return"A model is required to check the condition";if(b.evaluate?.mode==="flow-gate"&&!b.evaluate.flowId)return"A flow is required to check the condition";return null;case"url-watch":{try{let a=new URL(b.url??"");if("http:"!==a.protocol&&"https:"!==a.protocol)return"The URL must start with http:// or https://"}catch{return"A valid URL is required"}let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"flow-event":{let a=b.source;if(1!==[a?.executionId,a?.flowId,a?.flowName,a?.topic].filter(a=>"string"==typeof a&&a.trim().length>0).length)return"Choose exactly one source: a flow, a planned execution, or a signal topic";if(!("string"==typeof a?.topic&&a.topic.trim().length>0)){if(!Array.isArray(b.on)||0===b.on.length)return"Select at least one outcome to react to (completed or error)";if(b.on.some(a=>"completed"!==a&&"error"!==a))return'Outcomes must be "completed" or "error"'}if(b.outputMatch?.regex)try{new RegExp(b.outputMatch.regex)}catch(a){return`Invalid output-match regex: ${a instanceof Error?a.message:String(a)}`}if(void 0!==b.maxChainDepth&&(!Number.isInteger(b.maxChainDepth)||b.maxChainDepth<1))return"Max chain depth must be a positive whole number";if(void 0!==b.minIntervalMs&&(!Number.isFinite(b.minIntervalMs)||b.minIntervalMs<0))return"Minimum interval must be zero or more milliseconds";return null}default:return"Unknown trigger type"}}isRunning(a){let b=this.running.get(a);return void 0!==b&&b.size>0}addRunning(a,b,c){let d=this.running.get(a);d||(d=new Map,this.running.set(a,d)),d.set(b,c)}removeRunning(a,b){let c=this.running.get(a);c&&(c.delete(b),0===c.size&&this.running.delete(a))}earliestRunningSince(a){let b,c=this.running.get(a);if(c&&0!==c.size){for(let a of c.values())(void 0===b||a<b)&&(b=a);return b}}skippedRecord(a,b){let c=new Date().toISOString();return{runId:a.runId,conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:a.payload.summary,error:b}}async cancelQueued(a,b,c){let d=this.queued.get(a);if(d&&0!==d.length){for(let e of(this.queued.delete(a),d)){let d=this.skippedRecord(e,b);if(c)try{await (0,w.Hy)(a,d)}catch(b){C.warn(`Failed to record cancelled queued fire for ${a}:`,b)}e.resolve(d)}C.info(`Cancelled ${d.length} queued fire(s) for ${a}: ${b}`)}}drainQueue(a){let b=this.queued.get(a);if(!b||0===b.length||this.isRunning(a))return;let c=b.shift();0===b.length&&this.queued.delete(a),c&&(async()=>{let b=await this.get(a);if(!b||!b.enabled||this.pausedCache){let a=b?b.enabled?"scheduler paused":"execution disabled":"execution deleted";c.resolve(this.skippedRecord(c,a));return}let d=await this.fire(b,c.payload,c.runId);c.resolve(d)})().catch(b=>C.error(`Queued fire failed for ${a}:`,b))}getStatus(a){let b=this.armed.get(a.id),c=void 0!==b||a.enabled&&"webhook"===a.trigger.type&&this.started&&!this.pausedCache,d=this.earliestRunningSince(a.id),e=c?void 0:a.enabled?this.pausedCache?"paused":void 0:"disabled";return{armed:c,notArmedReason:e,nextRun:b?.nextRun?b.nextRun():void 0,lastTriggerError:this.lastTriggerErrors.get(a.id),running:void 0!==d,runningSince:d}}async runNow(a){let b=await this.get(a);return b?{record:await this.fire(b,{kind:"manual",summary:"Manual run"},(0,d.A)(),!0)}:{error:`No planned execution with id "${a}"`}}async fire(a,b,e=(0,d.A)(),f=!1){let g,i=new Date().toISOString();if(await (0,h.isEncryptionLocked)()){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"encryption locked"};return await (0,w.Hy)(a.id,c),C.info(`Skipped fire for "${a.name}" — encryption locked`),c}let j=a.overlapStrategy??"skip";if(!f&&this.isRunning(a.id)){if("skip"===j){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"Previous run still in progress"};return await (0,w.Hy)(a.id,c),C.info(`Skipped overlapping fire for "${a.name}"`),c}if("error"===j){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"error",triggerSummary:b.summary,error:"Overlapping run rejected (overlapStrategy=error)"};return await (0,w.Hy)(a.id,c),C.info(`Rejected overlapping fire for "${a.name}" (overlapStrategy=error)`),c}if("queue"===j){let c=this.queued.get(a.id)?.length??0;if(c>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Overlap queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Overlap queue full for "${a.name}" — dropped fire`),c}return C.info(`Queued overlapping fire for "${a.name}" (depth ${c+1})`),new Promise(c=>{let d=this.queued.get(a.id)??[];d.push({execution:a,payload:b,runId:e,resolve:c}),this.queued.set(a.id,d)})}}this.addRunning(a.id,e,i);let k=(0,d.A)();try{C.info(`Firing "${a.name}" (${b.kind})`);let d=await (0,w.Sw)(a.id),f=d.length>0?d[d.length-1]:null,h={executionName:a.name,trigger:b.kind,now:i,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,lastRun:f?{at:f.firedAt,status:f.status}:null,nextPlannedRun:this.getStatus(a).nextRun??null},j=a.approvalPolicy??"auto",l=a.saveConversations||"pause"===j?"conversation":"ephemeral",{runFlow:m}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(264),c.e(7821),c.e(724),c.e(3823),c.e(4671),c.e(7769)]).then(c.bind(c,47769)),n=await m({flowId:a.flowId,prompt:this.composePrompt(a.prompt,b,h),mode:l,conversationId:k,source:"schedule",plannedExecutionId:a.id,chainDepth:b.chainDepth??0,requireApproval:"auto"!==j,onApprovalRequired:j,debug:!1,userTurn:!0});g=await this.recordFromResult(a,n,{runId:e,conversationId:k,firedAt:i,payload:b})}catch(c){g={runId:e,conversationId:k,firedAt:i,finishedAt:new Date().toISOString(),status:"error",triggerSummary:b.summary,error:c instanceof Error?c.message:String(c)},C.error(`Run crashed for "${a.name}":`,c)}finally{this.removeRunning(a.id,e),this.drainQueue(a.id)}return await this.get(a.id)===null?C.info(`Dropping run record for deleted execution ${a.id}`):(await (0,w.Hy)(a.id,g),("completed"===g.status||"error"===g.status)&&await this.publishFlowRunEvent(a,g,b)),g}async recordFromResult(a,b,c){let{runId:d,conversationId:e,firedAt:f,payload:g}=c,h=new Date().toISOString(),i="awaiting_tool_approval"===b.status,j="error"===b.status&&b.error?.details?.type==="approval_required";if(i||j){let c=(b.pendingToolCalls??[]).map(a=>({id:a.id,name:"function"===a.type?a.function.name:String(a.type)})),k={runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"needs_approval",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:j?b.error?.message??"Tool approval required":"Awaiting tool approval",pendingApproval:{tool:c[0]?.name??b.error?.details?.name,toolCallId:c[0]?.id,pendingToolCalls:c.length>0?c:void 0}};return i&&await this.registerPendingApproval(a,k,c),k}return{runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"completed"===b.status?"completed":"error",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:"completed"===b.status?void 0:b.error?.message??`Run ended with status "${b.status}"`}}async registerPendingApproval(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for pending approval (${a.flowId}):`,b)}let{putPendingApproval:f}=await c.e(9285).then(c.bind(c,39285));await f({approvalId:b.conversationId,conversationId:b.conversationId,plannedExecutionId:a.id,flowId:a.flowId,flowName:e,runId:b.runId,triggerSummary:b.triggerSummary,pendingToolCalls:d,createdAt:b.firedAt})}catch(b){C.warn(`Failed to register pending approval for "${a.name}":`,b)}}async publishFlowRunEvent(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for run event (${a.flowId}):`,b)}let f="schedule-catchup"===d.kind?"schedule":d.kind;(0,t.eh)().publish({flowId:a.flowId,flowName:e,executionId:a.id,runId:b.runId,conversationId:b.conversationId,status:"completed"===b.status?"completed":"error",outputText:b.outputText,error:b.error,firedBy:f,chainDepth:d.chainDepth??0,timestamp:b.finishedAt??new Date().toISOString()})}catch(b){C.warn(`Failed to publish flow-run event for "${a.name}":`,b)}}composePrompt(a,b,c){let d=JSON.stringify(void 0===b.context?c:{...c,data:b.context},null,2);return`${a}
|
|
1
|
+
"use strict";exports.id=4771,exports.ids=[4771,6793],exports.modules={4771:(a,b,c)=>{c.d(b,{z:()=>F});var d=c(32524),e=c(92372),f=c(46480),g=c(50846),h=c(58739),i=c(52189),j=c(33873),k=c.n(j),l=c(29021),m=c(9794);let n=(0,g.h)("backend/services/scheduler/triggers/fileWatch");var o=c(73736),p=c(10960),q=c(51875);let r=(0,g.h)("backend/services/scheduler/triggers/mcpPoll"),s=(0,g.h)("backend/services/scheduler/triggers/urlWatch");var t=c(56793);let u=(0,g.h)("backend/services/scheduler/triggers/flowEvent");function v(a){return a&&a.length>8192?`${a.slice(0,8192)}… (truncated)`:a}var w=c(59911);let x=(0,g.h)("backend/services/scheduler/state"),y=a=>`planned-execution-state/${a}`;async function z(a){try{return await (0,e.YM)(y(a),{})}catch(b){return x.error(`Failed to load trigger state for ${a}:`,b),{}}}async function A(a,b){await (0,e.VH)(y(a),b)}async function B(a){await (0,e.N2)(y(a))}let C=(0,g.h)("backend/services/scheduler/index"),D={version:1,paused:!1,executions:[]};class E{static{this.MAX_QUEUE_DEPTH=50}async start(){this.started||(this.started=!0,C.info("Starting scheduler"),await this.reconcile())}reconcile(){let a=this.reconcileChain.catch(()=>{}).then(()=>this.doReconcile());return this.reconcileChain=a,a}async doReconcile(){for(let[a,b]of this.armed)try{b.dispose()}catch(b){C.warn(`Failed to dispose trigger for ${a}:`,b)}this.armed.clear();let a=await this.loadFile();if(this.pausedCache=a.paused,a.paused)return void C.info("Scheduler is paused — nothing armed");for(let b of a.executions)if(b.enabled)try{await this.armExecution(b)}catch(c){let a=c instanceof Error?c.message:String(c);this.lastTriggerErrors.set(b.id,a),C.error(`Failed to arm "${b.name}" (${b.id}):`,c)}C.info(`Scheduler armed ${this.armed.size} execution(s)`)}async armExecution(a){let b=a.trigger;switch(b.type){case"schedule":{let c=await z(a.id);c.lastScheduledFireAt?b.catchUp&&(0,i.hk)(b,c.lastScheduledFireAt)&&(await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),C.info(`Catch-up run for "${a.name}" (missed while closed)`),this.fire(a,{kind:"schedule-catchup",summary:"Schedule (missed while FLUJO was closed — ran once at startup)"})):await A(a.id,{...c,lastScheduledFireAt:new Date().toISOString()}),this.armed.set(a.id,(0,i.wv)(b,()=>{(async()=>{let b=await z(a.id);await A(a.id,{...b,lastScheduledFireAt:new Date().toISOString()}),await this.fire(a,{kind:"schedule",summary:"Schedule"})})().catch(b=>C.error(`Scheduled fire failed for ${a.id}:`,b))}));break}case"webhook":break;case"file-watch":this.armed.set(a.id,function(a,b,c){let d,e=a.debounceMs??2e3,f=new Set(a.events),g=a.glob?.trim()?function(a){let b=a.replace(/\\/g,"/"),c="";for(let a=0;a<b.length;a++){let d=b[a];"*"===d?"*"===b[a+1]?"/"===b[++a+1]?(a++,c+="(?:.*/)?"):c+=".*":c+="[^/]*":"?"===d?c+="[^/]":c+=d.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return RegExp(`^${c}$`)}(a.glob.trim()):null;try{d=l.realpathSync.native(a.path)}catch(d){let b=d instanceof Error?d.message:String(d);return n.warn(`Cannot watch "${a.path}": ${b}`),c(`Cannot watch "${a.path}": ${b}`),{dispose:()=>void 0}}let h=[],i=!1,j=null,o=!1,p=()=>{if(j=null,o||0===h.length)return;let a=h;i&&n.info("File-watch batch overflowed; reporting first 50 events"),h=[],i=!1,b({events:a})},q=(0,m.wB)(d,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}});return q.on("all",(a,b)=>{if(!o&&("add"===a||"change"===a||"unlink"===a)&&f.has(a)){if(g){let a=k().relative(d,b).replace(/\\/g,"/")||k().basename(b);if(!g.test(a))return}h.length>=50?i=!0:h.push({event:a,path:b}),j&&clearTimeout(j),j=setTimeout(p,e),j.unref?.()}}),q.on("error",a=>{let b=a instanceof Error?a.message:String(a);n.warn(`Watcher error for ${d}: ${b}`),c(b)}),{dispose:()=>{o=!0,j&&(clearTimeout(j),j=null),h=[],q.close().catch(a=>n.warn(`Failed to close watcher for ${d}:`,a))}}}(b,({events:c})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"file",summary:1===c.length?`File ${"unlink"===c[0].event?"deleted":"add"===c[0].event?"added":"changed"}`:`${c.length} file changes`,context:{watchedPath:b.path,events:c}})},b=>this.lastTriggerErrors.set(a.id,b)));break;case"mcp-poll":Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(4545)]).then(c.bind(c,61397)).then(async({mcpService:c})=>{await c.isServerDisabled(b.serverName)&&this.lastTriggerErrors.set(a.id,`MCP server '${b.serverName}' is disabled — enable it on the MCP page or change the trigger`)}).catch(b=>C.warn(`Arm-time disabled-server check failed for ${a.id}:`,b)),this.armed.set(a.id,function(a,b){let c=a.cron||(0,p.X)(a.intervalMs),d=!1,e=!1,f=0,g=0,h=async()=>{if(!e&&!d){if(g>0)return void g--;d=!0;try{let c,d=await b.callTool(a.serverName,a.toolName,a.args);if(!d.success)throw Error(d.error||"Tool call failed");f=0;let g=await b.loadState(),h=a.evaluate;if(c="on-change"===h.mode?(0,q.Jl)(d.data,g):"new-items"===h.mode?(0,q.A1)(d.data,h.itemsPath,h.idField,g):b.evaluateAiGate?await b.evaluateAiGate(d.data,h,g):{fire:!1,newState:{},error:'The "AI decides" condition is not available yet'},e)return;if(Object.keys(c.newState).length>0&&await b.saveState(c.newState),c.error)b.onError(c.error);else if(c.fire){let{status:d}=await b.onFire({summary:`Watched tool: ${c.summary??"condition met"}`,context:{server:a.serverName,tool:a.toolName,..."object"==typeof c.context&&null!==c.context?c.context:{result:c.context}}});if(e)return;if(c.pendingState){let{giveUpError:a}=await (0,q.vV)({status:d,pendingState:c.pendingState,priorFailures:g.pendingFailures??0,saveState:b.saveState});a&&b.onError(a)}}else b.onSuccess?.()}catch(d){f++,g=Math.min(2**(f-1),8);let c=d instanceof Error?d.message:String(d);r.warn(`Poll failed for ${a.serverName}/${a.toolName} (backing off ${g} check(s)): ${c}`),b.onError(c)}finally{d=!1}}},i=new o.l4(c,{timezone:a.timezone,unref:!0},()=>void h());return h(),{dispose:()=>{e=!0,i.stop()},nextRun:()=>i.nextRun()?.toISOString()??null}}(b,{callTool:async(a,b,d)=>{let{mcpService:e}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(4545)]).then(c.bind(c,61397)),f=await e.callTool(a,b,d);return{success:!0===f.success,data:f.data,error:"string"==typeof f.error?f.error:void 0}},loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"mcp-poll",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id),evaluateAiGate:async(a,b,d)=>{let{evaluateAiGate:e}=await c.e(7506).then(c.bind(c,47506));return e(a,b,d)}}));break;case"url-watch":this.armed.set(a.id,function(a,b){let c=b.fetchImpl??fetch,d=!1,e=!1,f=async()=>{if(!e&&!d){d=!0;try{let d=await c(a.url,{redirect:"follow",headers:{"User-Agent":"FLUJO-url-watch"},signal:AbortSignal.timeout(3e4)});if(!d.ok)return void b.onError(`The URL answered with HTTP ${d.status}`);let f=await d.text(),g=(0,q.qq)(f),h=await b.loadState();if(e)return;if(!h.lastHash){await b.saveState({lastHash:g}),b.onSuccess?.();return}if(h.lastHash===g)return void b.onSuccess?.();let{status:i}=await b.onFire({summary:"Online content changed",context:{url:a.url,status:d.status,contentType:d.headers.get("content-type")??void 0,content:f.length>8192?`${f.slice(0,8192)}… (truncated, ${f.length} chars total)`:f}});if(e)return;let{giveUpError:j}=await (0,q.vV)({status:i,pendingState:{lastHash:g},priorFailures:h.pendingFailures??0,saveState:b.saveState});j&&b.onError(j)}catch(d){let c=d instanceof Error&&"TimeoutError"===d.name?"The URL did not answer within 30s":d instanceof Error?d.message:String(d);s.warn(`URL check failed for ${a.url}: ${c}`),b.onError(c)}finally{d=!1}}},g=new o.l4(a.cron,{timezone:a.timezone,unref:!0},()=>void f());return f(),{dispose:()=>{e=!0,g.stop()},nextRun:()=>g.nextRun()?.toISOString()??null}}(b,{loadState:()=>z(a.id),saveState:async b=>{let c=await z(a.id);await A(a.id,{...c,...b})},onFire:async({summary:b,context:c})=>(this.lastTriggerErrors.delete(a.id),{status:(await this.fire(a,{kind:"url-watch",summary:b,context:c})).status}),onError:b=>this.lastTriggerErrors.set(a.id,b),onSuccess:()=>this.lastTriggerErrors.delete(a.id)}));break;case"flow-event":this.armed.set(a.id,function(a,b){let c=a.maxChainDepth??5,d="string"==typeof a.source.topic?a.source.topic.trim():"",e=d.length>0,f=0,g=null,h=!1;if(a.outputMatch?.regex)try{g=new RegExp(a.outputMatch.regex)}catch(c){h=!0;let a=`Invalid output-match regex: ${c instanceof Error?c.message:String(c)}`;u.warn(a),b.onError(a)}let i=b=>{if(!a.outputMatch)return!0;if(h)return!1;let c=(b??"").slice(0,16384);return(!a.outputMatch.contains||!!c.includes(a.outputMatch.contains))&&(!g||!!g.test(c))},j=(d,e,g)=>{if(d>=c){let a=`Flow-event chain reached the depth limit (${c}); not firing again`;u.info(a),b.onSkip(a);return}let h=Date.now();if(a.minIntervalMs&&h-f<a.minIntervalMs)return void u.debug(`Flow-event cooldown active (${a.minIntervalMs}ms); ignoring event`);f=h,b.onFire({summary:e,context:g,chainDepth:d+1})},k=(0,t.eh)().subscribe(c=>{try{if(e){if(!(0,t.ru)(c)||c.topic!==d||!i(c.payload))return;j(c.chainDepth,`Signal "${c.topic}"`,{topic:c.topic,payload:v(c.payload),emitterFlowId:c.emitterFlowId,flowName:c.flowName,runId:c.runId,conversationId:c.conversationId,firedBy:c.firedBy});return}if((0,t.ru)(c)||!(b=>{let c=a.source;return c.executionId?b.executionId===c.executionId:c.flowId?b.flowId===c.flowId:!!c.flowName&&b.flowName===c.flowName})(c)||!c.status||!(a.on??[]).includes(c.status)||!i(c.outputText))return;let b=c.flowName??c.flowId;j(c.chainDepth,`Flow "${b}" ${c.status}`,{flowId:c.flowId,flowName:c.flowName,executionId:c.executionId,runId:c.runId,conversationId:c.conversationId,status:c.status,firedBy:c.firedBy,outputText:v(c.outputText),error:c.error})}catch(c){let a=c instanceof Error?c.message:String(c);u.warn(`Flow-event handling failed: ${a}`),b.onError(a)}});return{dispose:()=>k(),nextRun:()=>null}}(b,{onFire:({summary:b,context:c,chainDepth:d})=>{this.lastTriggerErrors.delete(a.id),this.fire(a,{kind:"flow-event",summary:b,context:c,chainDepth:d}).catch(b=>C.error(`Flow-event fire failed for ${a.id}:`,b))},onSkip:b=>{let c=new Date().toISOString();(0,w.Hy)(a.id,{runId:(0,d.A)(),conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:"Flow event",error:b}).catch(b=>C.warn(`Failed to record flow-event skip for ${a.id}:`,b))},onError:b=>this.lastTriggerErrors.set(a.id,b)}));break;default:C.warn(`Trigger type "${b.type}" is not implemented — "${a.name}" not armed`)}}async loadFile(){let a=await (0,e.YM)(f.Z.PLANNED_EXECUTIONS,D);return{version:1,paused:!0===a.paused,executions:Array.isArray(a.executions)?a.executions:[]}}async saveFile(a){await (0,e.VH)(f.Z.PLANNED_EXECUTIONS,a)}async isPaused(){return(await this.loadFile()).paused}async setPaused(a){let b=await this.loadFile();if(await this.saveFile({...b,paused:a}),await this.reconcile(),a)for(let a of[...this.queued.keys()])await this.cancelQueued(a,"scheduler paused",!0)}async list(){return Promise.all((await this.loadFile()).executions.map(async a=>({execution:a,status:this.getStatus(a),lastRun:await (0,w.tl)(a.id)})))}async get(a){return(await this.loadFile()).executions.find(b=>b.id===a)??null}async create(a){let b=this.validateInput(a);if(b)return{error:b};if(void 0!==a.id&&!/^[A-Za-z0-9._:-]{1,128}$/.test(a.id))return{error:"The id must be 1-128 characters of letters, digits, dot, underscore, colon or hyphen"};if("."===a.id||".."===a.id)return{error:'The id must be a safe identifier, not "." or ".."'};let c=new Date().toISOString(),e={...a,trigger:this.normalizeTrigger(a.trigger),id:a.id??(0,d.A)(),createdAt:c,updatedAt:c},f=await this.loadFile();return f.executions.some(a=>a.id===e.id)?{error:`A planned execution with id "${e.id}" already exists`,conflict:!0}:(await this.saveFile({...f,executions:[...f.executions,e]}),await this.reconcile(),{execution:e})}async update(a,b){let c=await this.loadFile(),d=c.executions.findIndex(b=>b.id===a);if(d<0)return{error:`No planned execution with id "${a}"`};let e={...c.executions[d],...b,...b.trigger?{trigger:this.normalizeTrigger(b.trigger)}:{},id:a,createdAt:c.executions[d].createdAt,updatedAt:new Date().toISOString()},f=this.validateInput(e);if(f)return{error:f};let g=[...c.executions];return g[d]=e,await this.saveFile({...c,executions:g}),await this.reconcile(),await this.cancelQueued(a,"execution updated",!0),{execution:e}}async delete(a){let b=await this.loadFile();return b.executions.some(b=>b.id===a)?(await this.saveFile({...b,executions:b.executions.filter(b=>b.id!==a)}),await this.reconcile(),this.lastTriggerErrors.delete(a),await this.cancelQueued(a,"execution deleted",!1),await (0,w.xC)(a),await B(a),{success:!0}):{success:!1,error:`No planned execution with id "${a}"`}}normalizeTrigger(a){return a?.type!=="webhook"||a.token?a?.type!=="mcp-poll"||a.cron?a:{...a,cron:(0,p.X)(a.intervalMs)}:{...a,token:(0,d.A)()}}validateInput(a){if(!a.name?.trim())return"A name is required";if(!a.flowId)return"A flow is required";if("string"!=typeof a.prompt)return"A prompt is required (may be empty)";if(void 0!==a.overlapStrategy&&!["skip","queue","parallel","error"].includes(a.overlapStrategy))return"Overlap strategy must be one of: skip, queue, parallel, error";let b=a.trigger;if(!b||"object"!=typeof b)return"A trigger is required";switch(b.type){case"schedule":{let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"webhook":return null;case"file-watch":if(!b.path?.trim())return"A folder or file path to watch is required";if(!Array.isArray(b.events)||0===b.events.length)return"At least one file event is required";return null;case"mcp-poll":if(!b.serverName||!b.toolName)return"A server and tool are required";if(b.cron){let a=(0,i.O9)(b.cron,b.timezone);if(!a.valid)return`Invalid schedule: ${a.error}`}if(b.evaluate?.mode==="new-items"&&!b.evaluate.idField?.trim())return"An id field is required to detect new items";if((b.evaluate?.mode==="llm-gate"||b.evaluate?.mode==="flow-gate")&&!b.evaluate.condition?.trim())return"A condition is required for the AI to check";if(b.evaluate?.mode==="llm-gate"&&!b.evaluate.modelId)return"A model is required to check the condition";if(b.evaluate?.mode==="flow-gate"&&!b.evaluate.flowId)return"A flow is required to check the condition";return null;case"url-watch":{try{let a=new URL(b.url??"");if("http:"!==a.protocol&&"https:"!==a.protocol)return"The URL must start with http:// or https://"}catch{return"A valid URL is required"}let a=(0,i.O9)(b.cron,b.timezone);return a.valid?null:`Invalid schedule: ${a.error}`}case"flow-event":{let a=b.source;if(1!==[a?.executionId,a?.flowId,a?.flowName,a?.topic].filter(a=>"string"==typeof a&&a.trim().length>0).length)return"Choose exactly one source: a flow, a planned execution, or a signal topic";if(!("string"==typeof a?.topic&&a.topic.trim().length>0)){if(!Array.isArray(b.on)||0===b.on.length)return"Select at least one outcome to react to (completed or error)";if(b.on.some(a=>"completed"!==a&&"error"!==a))return'Outcomes must be "completed" or "error"'}if(b.outputMatch?.regex)try{new RegExp(b.outputMatch.regex)}catch(a){return`Invalid output-match regex: ${a instanceof Error?a.message:String(a)}`}if(void 0!==b.maxChainDepth&&(!Number.isInteger(b.maxChainDepth)||b.maxChainDepth<1))return"Max chain depth must be a positive whole number";if(void 0!==b.minIntervalMs&&(!Number.isFinite(b.minIntervalMs)||b.minIntervalMs<0))return"Minimum interval must be zero or more milliseconds";return null}default:return"Unknown trigger type"}}isRunning(a){let b=this.running.get(a);return void 0!==b&&b.size>0}addRunning(a,b,c){let d=this.running.get(a);d||(d=new Map,this.running.set(a,d)),d.set(b,c)}removeRunning(a,b){let c=this.running.get(a);c&&(c.delete(b),0===c.size&&this.running.delete(a))}earliestRunningSince(a){let b,c=this.running.get(a);if(c&&0!==c.size){for(let a of c.values())(void 0===b||a<b)&&(b=a);return b}}skippedRecord(a,b){let c=new Date().toISOString();return{runId:a.runId,conversationId:"",firedAt:c,finishedAt:c,status:"skipped",triggerSummary:a.payload.summary,error:b}}async cancelQueued(a,b,c){let d=this.queued.get(a);if(d&&0!==d.length){for(let e of(this.queued.delete(a),d)){let d=this.skippedRecord(e,b);if(c)try{await (0,w.Hy)(a,d)}catch(b){C.warn(`Failed to record cancelled queued fire for ${a}:`,b)}e.resolve(d)}C.info(`Cancelled ${d.length} queued fire(s) for ${a}: ${b}`)}}drainQueue(a){let b=this.queued.get(a);if(!b||0===b.length||this.isRunning(a))return;let c=b.shift();0===b.length&&this.queued.delete(a),c&&(async()=>{let b=await this.get(a);if(!b||!b.enabled||this.pausedCache){let a=b?b.enabled?"scheduler paused":"execution disabled":"execution deleted";c.resolve(this.skippedRecord(c,a));return}let d=await this.fire(b,c.payload,c.runId);c.resolve(d)})().catch(b=>C.error(`Queued fire failed for ${a}:`,b))}getStatus(a){let b=this.armed.get(a.id),c=void 0!==b||a.enabled&&"webhook"===a.trigger.type&&this.started&&!this.pausedCache,d=this.earliestRunningSince(a.id),e=c?void 0:a.enabled?this.pausedCache?"paused":void 0:"disabled";return{armed:c,notArmedReason:e,nextRun:b?.nextRun?b.nextRun():void 0,lastTriggerError:this.lastTriggerErrors.get(a.id),running:void 0!==d,runningSince:d}}async runNow(a){let b=await this.get(a);return b?{record:await this.fire(b,{kind:"manual",summary:"Manual run"},(0,d.A)(),!0)}:{error:`No planned execution with id "${a}"`}}async fire(a,b,e=(0,d.A)(),f=!1){let g,i=new Date().toISOString();if(await (0,h.isEncryptionLocked)()){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"encryption locked"};return await (0,w.Hy)(a.id,c),C.info(`Skipped fire for "${a.name}" — encryption locked`),c}let j=a.overlapStrategy??"skip";if(!f&&this.isRunning(a.id)){if("skip"===j){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:"Previous run still in progress"};return await (0,w.Hy)(a.id,c),C.info(`Skipped overlapping fire for "${a.name}"`),c}if("error"===j){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"error",triggerSummary:b.summary,error:"Overlapping run rejected (overlapStrategy=error)"};return await (0,w.Hy)(a.id,c),C.info(`Rejected overlapping fire for "${a.name}" (overlapStrategy=error)`),c}if("queue"===j){let c=this.queued.get(a.id)?.length??0;if(c>=E.MAX_QUEUE_DEPTH){let c={runId:e,conversationId:"",firedAt:i,finishedAt:i,status:"skipped",triggerSummary:b.summary,error:`Overlap queue full (cap ${E.MAX_QUEUE_DEPTH}) — fire dropped`};return await (0,w.Hy)(a.id,c),C.warn(`Overlap queue full for "${a.name}" — dropped fire`),c}return C.info(`Queued overlapping fire for "${a.name}" (depth ${c+1})`),new Promise(c=>{let d=this.queued.get(a.id)??[];d.push({execution:a,payload:b,runId:e,resolve:c}),this.queued.set(a.id,d)})}}this.addRunning(a.id,e,i);let k=(0,d.A)();try{C.info(`Firing "${a.name}" (${b.kind})`);let d=await (0,w.Sw)(a.id),f=d.length>0?d[d.length-1]:null,h={executionName:a.name,trigger:b.kind,now:i,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,lastRun:f?{at:f.firedAt,status:f.status}:null,nextPlannedRun:this.getStatus(a).nextRun??null},j=a.approvalPolicy??"auto",l=a.saveConversations||"pause"===j?"conversation":"ephemeral",{runFlow:m}=await Promise.all([c.e(6996),c.e(1223),c.e(5734),c.e(1373),c.e(4545),c.e(7821),c.e(724),c.e(3823),c.e(4671),c.e(7769)]).then(c.bind(c,47769)),n=await m({flowId:a.flowId,prompt:this.composePrompt(a.prompt,b,h),mode:l,conversationId:k,source:"schedule",plannedExecutionId:a.id,chainDepth:b.chainDepth??0,requireApproval:"auto"!==j,onApprovalRequired:j,debug:!1,userTurn:!0});g=await this.recordFromResult(a,n,{runId:e,conversationId:k,firedAt:i,payload:b})}catch(c){g={runId:e,conversationId:k,firedAt:i,finishedAt:new Date().toISOString(),status:"error",triggerSummary:b.summary,error:c instanceof Error?c.message:String(c)},C.error(`Run crashed for "${a.name}":`,c)}finally{this.removeRunning(a.id,e),this.drainQueue(a.id)}return await this.get(a.id)===null?C.info(`Dropping run record for deleted execution ${a.id}`):(await (0,w.Hy)(a.id,g),("completed"===g.status||"error"===g.status)&&await this.publishFlowRunEvent(a,g,b)),g}async recordFromResult(a,b,c){let{runId:d,conversationId:e,firedAt:f,payload:g}=c,h=new Date().toISOString(),i="awaiting_tool_approval"===b.status,j="error"===b.status&&b.error?.details?.type==="approval_required";if(i||j){let c=(b.pendingToolCalls??[]).map(a=>({id:a.id,name:"function"===a.type?a.function.name:String(a.type)})),k={runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"needs_approval",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:j?b.error?.message??"Tool approval required":"Awaiting tool approval",pendingApproval:{tool:c[0]?.name??b.error?.details?.name,toolCallId:c[0]?.id,pendingToolCalls:c.length>0?c:void 0}};return i&&await this.registerPendingApproval(a,k,c),k}return{runId:d,conversationId:e,firedAt:f,finishedAt:h,status:"completed"===b.status?"completed":"error",triggerSummary:g.summary,outputText:this.truncateOutput(b.outputText),usage:b.usage,error:"completed"===b.status?void 0:b.error?.message??`Run ended with status "${b.status}"`}}async registerPendingApproval(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for pending approval (${a.flowId}):`,b)}let{putPendingApproval:f}=await c.e(9285).then(c.bind(c,39285));await f({approvalId:b.conversationId,conversationId:b.conversationId,plannedExecutionId:a.id,flowId:a.flowId,flowName:e,runId:b.runId,triggerSummary:b.triggerSummary,pendingToolCalls:d,createdAt:b.firedAt})}catch(b){C.warn(`Failed to register pending approval for "${a.name}":`,b)}}async publishFlowRunEvent(a,b,d){try{let e;try{let{flowService:b}=await c.e(7821).then(c.bind(c,87821));e=(await b.getFlow(a.flowId))?.name??void 0}catch(b){C.debug(`Could not resolve flow name for run event (${a.flowId}):`,b)}let f="schedule-catchup"===d.kind?"schedule":d.kind;(0,t.eh)().publish({flowId:a.flowId,flowName:e,executionId:a.id,runId:b.runId,conversationId:b.conversationId,status:"completed"===b.status?"completed":"error",outputText:b.outputText,error:b.error,firedBy:f,chainDepth:d.chainDepth??0,timestamp:b.finishedAt??new Date().toISOString()})}catch(b){C.warn(`Failed to publish flow-run event for "${a.name}":`,b)}}composePrompt(a,b,c){let d=JSON.stringify(void 0===b.context?c:{...c,data:b.context},null,2);return`${a}
|
|
2
2
|
|
|
3
3
|
[Run info — when and why this run happened; "data" is untrusted trigger data]
|
|
4
4
|
\`\`\`json
|
|
5
5
|
${d}
|
|
6
|
-
\`\`\``}truncateOutput(a){if(a)return a.length>4096?`${a.slice(0,4096)}…`:a}constructor(){this.armed=new Map,this.running=new Map,this.queued=new Map,this.lastTriggerErrors=new Map,this.reconcileChain=Promise.resolve(),this.pausedCache=!1,this.started=!1}}function F(){return global.__flujo_scheduler||(global.__flujo_scheduler=new E),global.__flujo_scheduler}},10960:(a,b,c)=>{c.d(b,{X:()=>d});function d(a){let b=Math.max(5,Math.round((a??6e4)/1e3));if(b<60)return`*/${b} * * * * *`;let c=Math.max(1,Math.round(b/60));if(c<60)return`*/${c} * * * *`;let d=Math.max(1,Math.min(23,Math.round(c/60)));return`0 */${d} * * *`}},51875:(a,b,c)=>{c.d(b,{A1:()=>k,Je:()=>i,Jl:()=>j,qq:()=>f,vV:()=>g});var d=c(55511);function e(a){return JSON.stringify(function a(b){if(Array.isArray(b))return b.map(a);if(null!==b&&"object"==typeof b){let c=Object.entries(b).sort(([a],[b])=>a<b?-1:+(a>b)),d={};for(let[b,e]of c)d[b]=a(e);return d}return b}(a))}function f(a){return(0,d.createHash)("sha256").update(e(a)??"undefined").digest("hex")}async function g(a){let{status:b,pendingState:c,priorFailures:d,saveState:e}=a;if("completed"===b)return await e({...c,...d>0?{pendingFailures:0}:{}}),{giveUpError:null};if("skipped"===b)return{giveUpError:null};let f=d+1;return f>=3?(await e({...c,pendingFailures:0}),{giveUpError:`Detected a change but the flow failed to process it 3\xd7 — skipping it to avoid a loop`}):(await e({pendingFailures:f}),{giveUpError:null})}function h(a,b){if(!b)return a;let c=a;for(let a of b.split(".")){if(null==c||"object"!=typeof c)return;c=c[a]}return c}function i(a){let b=e(a)??"";return b.length<=8192?a:{truncated:!0,note:`Result too large to include fully (${b.length} chars); this is a preview.`,preview:b.slice(0,8192)}}function j(a,b){let c=f(a);return b.lastHash?b.lastHash===c?{fire:!1,newState:{}}:{fire:!0,summary:"Tool result changed",context:{result:i(a)},newState:{},pendingState:{lastHash:c}}:{fire:!1,newState:{lastHash:c}}}function k(a,b,c,d){let e=h(a,b);if(!Array.isArray(e))return{fire:!1,newState:{},error:`"${b||"(root)"}" did not resolve to a list in the tool result`};let g=e.map(a=>{let b=h(a,c);return{id:null==b||"object"==typeof b?`hash:${f(a)}`:String(b),item:a}}),j=d.seenIds,k=a=>{let
|
|
6
|
+
\`\`\``}truncateOutput(a){if(a)return a.length>4096?`${a.slice(0,4096)}…`:a}constructor(){this.armed=new Map,this.running=new Map,this.queued=new Map,this.lastTriggerErrors=new Map,this.reconcileChain=Promise.resolve(),this.pausedCache=!1,this.started=!1}}function F(){return global.__flujo_scheduler||(global.__flujo_scheduler=new E),global.__flujo_scheduler}},10960:(a,b,c)=>{c.d(b,{X:()=>d});function d(a){let b=Math.max(5,Math.round((a??6e4)/1e3));if(b<60)return`*/${b} * * * * *`;let c=Math.max(1,Math.round(b/60));if(c<60)return`*/${c} * * * *`;let d=Math.max(1,Math.min(23,Math.round(c/60)));return`0 */${d} * * *`}},51875:(a,b,c)=>{c.d(b,{A1:()=>k,Je:()=>i,Jl:()=>j,qq:()=>f,vV:()=>g});var d=c(55511);function e(a){return JSON.stringify(function a(b){if(Array.isArray(b))return b.map(a);if(null!==b&&"object"==typeof b){let c=Object.entries(b).sort(([a],[b])=>a<b?-1:+(a>b)),d={};for(let[b,e]of c)d[b]=a(e);return d}return b}(a))}function f(a){return(0,d.createHash)("sha256").update(e(a)??"undefined").digest("hex")}async function g(a){let{status:b,pendingState:c,priorFailures:d,saveState:e}=a;if("completed"===b)return await e({...c,...d>0?{pendingFailures:0}:{}}),{giveUpError:null};if("skipped"===b)return{giveUpError:null};let f=d+1;return f>=3?(await e({...c,pendingFailures:0}),{giveUpError:`Detected a change but the flow failed to process it 3\xd7 — skipping it to avoid a loop`}):(await e({pendingFailures:f}),{giveUpError:null})}function h(a,b){if(!b)return a;let c=a;for(let a of b.split(".")){if(null==c||"object"!=typeof c)return;c=c[a]}return c}function i(a){let b=e(a)??"";return b.length<=8192?a:{truncated:!0,note:`Result too large to include fully (${b.length} chars); this is a preview.`,preview:b.slice(0,8192)}}function j(a,b){let c=f(a);return b.lastHash?b.lastHash===c?{fire:!1,newState:{}}:{fire:!0,summary:"Tool result changed",context:{result:i(a)},newState:{},pendingState:{lastHash:c}}:{fire:!1,newState:{lastHash:c}}}function k(a,b,c,d){let e=h(a,b);if(!Array.isArray(e))return{fire:!1,newState:{},error:`"${b||"(root)"}" did not resolve to a list in the tool result`};let g=e.map(a=>{let b=h(a,c);return{id:null==b||"object"==typeof b?`hash:${f(a)}`:String(b),item:a}}),j=d.seenIds,k=g.map(({id:a})=>a),l=(a,b)=>{let c=[...a??[]],d=new Set(c);for(let a of b)d.has(a)||(d.add(a),c.push(a));return c.slice(-1e3)};if(!j)return{fire:!1,newState:{seenIds:l(void 0,k)}};let m=new Set(j),n=g.filter(({id:a})=>!m.has(a));if(0===n.length)return{fire:!1,newState:{}};let o=n.slice(0,50);return{fire:!0,summary:1===n.length?"1 new item":`${n.length} new items`,context:{newItems:i(o.map(({item:a})=>a)),...n.length>50?{omitted:n.length-50}:{}},newState:{},pendingState:{seenIds:l(j,o.map(({id:a})=>a))}}}},52189:(a,b,c)=>{c.d(b,{O9:()=>e,Z9:()=>f,hk:()=>g,wv:()=>h});var d=c(73736);function e(a,b){try{let c=new d.l4(a,{timezone:b,paused:!0});return c.nextRun(),c.stop(),{valid:!0}}catch(a){return{valid:!1,error:a instanceof Error?a.message:"Invalid cron pattern"}}}function f(a,b,c){let e=new d.l4(a,{timezone:b,paused:!0});try{return e.nextRuns(c).map(a=>a.toISOString())}finally{e.stop()}}function g(a,b){let c=new d.l4(a.cron,{timezone:a.timezone,paused:!0});try{let a=c.nextRun(new Date(b));return null!==a&&a.getTime()<=Date.now()}finally{c.stop()}}function h(a,b){let c=new d.l4(a.cron,{timezone:a.timezone,unref:!0},b);return{dispose:()=>c.stop(),nextRun:()=>c.nextRun()?.toISOString()??null}}},56793:(a,b,c)=>{c.d(b,{eh:()=>g,ru:()=>e});let d=(0,c(50846).h)("backend/services/scheduler/flowRunEventBus");function e(a){return"signal"===a.kind}class f{publish(a){if(0===this.listeners.size)return;let b=e(a)?`signal topic=${a.topic} emitter=${a.emitterFlowId}`:`flow=${a.flowId} status=${a.status}`;for(let c of(d.debug(`Publishing flow event: ${b} firedBy=${a.firedBy} depth=${a.chainDepth} listeners=${this.listeners.size}`),[...this.listeners]))try{c(a)}catch(a){d.warn("A flow-run event listener threw:",a)}}subscribe(a){return this.listeners.add(a),()=>{this.listeners.delete(a)}}get listenerCount(){return this.listeners.size}constructor(){this.listeners=new Set}}function g(){return global.__flujo_flow_run_event_bus||(global.__flujo_flow_run_event_bus=new f),global.__flujo_flow_run_event_bus}},59911:(a,b,c)=>{c.d(b,{Hy:()=>i,Sw:()=>h,s1:()=>j,tl:()=>k,xC:()=>l});var d=c(92372);let e=(0,c(50846).h)("backend/services/scheduler/runHistory"),f=a=>`planned-execution-runs/${a}`,g=new Map;async function h(a){try{return await (0,d.YM)(f(a),[])}catch(b){return e.error(`Failed to load run history for ${a}:`,b),[]}}async function i(a,b){let c=(g.get(a)??Promise.resolve()).catch(()=>{}).then(async()=>{let c=await h(a);c.push(b);let e=c.slice(-100);await (0,d.VH)(f(a),e)});g.set(a,c);try{await c}finally{g.get(a)===c&&g.delete(a)}}async function j(a,b,c){let e=g.get(a)??Promise.resolve(),i=null,j=e.catch(()=>{}).then(async()=>{let e=await h(a),g=e.findIndex(a=>a.runId===b);if(g<0){i=null;return}e[g]={...e[g],...c,runId:b},i=e[g],await (0,d.VH)(f(a),e)});g.set(a,j);try{await j}finally{g.get(a)===j&&g.delete(a)}return i}async function k(a){let b=await h(a);return b.length>0?b[b.length-1]:null}async function l(a){await (0,d.N2)(f(a))}}};
|