flujo-ai 3.33.0 → 3.35.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 +292 -285
- package/.next/app-path-routes-manifest.json +20 -19
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +21 -21
- package/.next/react-loadable-manifest.json +3 -3
- package/.next/routes-manifest.json +9 -0
- 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 +2 -2
- 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 +2 -2
- 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 +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 +2 -2
- 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/[id]/versions/[versionId]/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/[versionId]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/[id]/versions/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/[id]/versions/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/generator/route.js +25 -4
- package/.next/server/app/api/flow/generator/route.js.nft.json +1 -1
- package/.next/server/app/api/flow/generator/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.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/app-sandbox/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/oauth-capability/route.js.nft.json +1 -1
- package/.next/server/app/api/mcp/oauth-capability/route_client-reference-manifest.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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/packages/build/route.js +1 -1
- package/.next/server/app/api/packages/build/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/build/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/derive-secrets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/derive-secrets/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/install/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/install/status/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/install/status/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/installed/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/resolve/route.js +1 -1
- package/.next/server/app/api/packages/resolve/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/resolve/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/scan-targets/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/scan-targets/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/search/route.js +1 -1
- package/.next/server/app/api/packages/search/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/uninstall/route.js.nft.json +1 -1
- package/.next/server/app/api/packages/uninstall/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/planned-executions/[id]/route.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 +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 +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/registry/auth/resend/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/auth/reset/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/auth/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/feedback/route.js +1 -1
- package/.next/server/app/api/registry/feedback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/oauth/callback/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/oauth/initiate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/packages/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/publish/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/registry/settings/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/restore/route.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.js +1 -1
- package/.next/server/app/api/storage/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
- package/.next/server/app/api/telemetry/daily-active/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/update/route.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 +2 -2
- 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 +3 -3
- 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 +2 -2
- package/.next/server/app/executions/page.js +2 -2
- package/.next/server/app/executions/page.js.nft.json +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 +3 -3
- package/.next/server/app/flows/page.js +3 -3
- 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 +3 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/mcp/page.js +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 +3 -3
- 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/packages/page.js +1 -1
- package/.next/server/app/packages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/packages.html +1 -1
- package/.next/server/app/packages.rsc +3 -3
- package/.next/server/app/page.js +4 -2
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.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 +3 -3
- 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]/inject/route.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/inject/route_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js.nft.json +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route_client-reference-manifest.js +1 -0
- package/.next/server/app/v1/chat/conversations/[conversationId]/resources/route.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 +1 -1
- 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 +1 -1
- 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/chat/events/route.js +1 -1
- package/.next/server/app/v1/chat/events/route.js.nft.json +1 -1
- package/.next/server/app/v1/chat/events/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 +2 -2
- package/.next/server/app-paths-manifest.json +20 -19
- package/.next/server/chunks/1114.js +1 -1
- package/.next/server/chunks/1226.js +1 -1
- package/.next/server/chunks/1227.js +1 -1
- package/.next/server/chunks/166.js +5 -5
- package/.next/server/chunks/1664.js +1 -1
- package/.next/server/chunks/1805.js +1 -1
- package/.next/server/chunks/227.js +1 -1
- package/.next/server/chunks/2273.js +2 -2
- package/.next/server/chunks/2372.js +1 -1
- package/.next/server/chunks/2859.js +1 -1
- package/.next/server/chunks/3717.js +1 -0
- package/.next/server/chunks/3935.js +4 -0
- package/.next/server/chunks/4265.js +1 -1
- package/.next/server/chunks/4466.js +1 -1
- package/.next/server/chunks/4551.js +1 -1
- package/.next/server/chunks/4771.js +2 -2
- package/.next/server/chunks/4822.js +1 -1
- package/.next/server/chunks/5096.js +1 -1
- package/.next/server/chunks/519.js +2 -0
- package/.next/server/chunks/5285.js +1 -0
- package/.next/server/chunks/5309.js +78 -0
- package/.next/server/chunks/544.js +16 -16
- package/.next/server/chunks/5463.js +1 -1
- package/.next/server/chunks/5544.js +4 -4
- package/.next/server/chunks/5703.js +2 -2
- package/.next/server/chunks/{5708.js → 6041.js} +1 -1
- package/.next/server/chunks/6226.js +1 -1
- package/.next/server/chunks/6747.js +72 -43
- package/.next/server/chunks/701.js +1 -1
- package/.next/server/chunks/7069.js +4 -4
- package/.next/server/chunks/7506.js +1 -1
- package/.next/server/chunks/7628.js +1 -1
- package/.next/server/chunks/7630.js +11 -0
- package/.next/server/chunks/7891.js +1 -1
- package/.next/server/chunks/7993.js +1 -1
- package/.next/server/chunks/8284.js +42 -0
- package/.next/server/chunks/8387.js +1 -1
- package/.next/server/chunks/8645.js +1 -1
- package/.next/server/chunks/8739.js +1 -1
- package/.next/server/chunks/9085.js +1 -1
- package/.next/server/chunks/9235.js +26 -5
- package/.next/server/chunks/9285.js +1 -1
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/instrumentation.js.nft.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- 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/static/chunks/2005.4eea65c00d9a29cd.js +1 -0
- package/.next/static/chunks/3429-34fb1a84aed96703.js +1 -0
- package/.next/static/chunks/{2005-f9d38c39f10c321f.js → 4386-e9621d3c94969a68.js} +1 -1
- package/.next/static/chunks/4919-6c8a48e3cc642349.js +1 -0
- package/.next/static/chunks/7561-2b366ddcbc3cc0ec.js +1 -0
- package/.next/static/chunks/8404-5aa8ea49197b98b8.js +1 -0
- package/.next/static/chunks/{8650-41c2afc0eba37fb8.js → 8650-aa22dbf7b37348f0.js} +1 -1
- package/.next/static/chunks/9611-9867e6e8e65172ec.js +1 -0
- package/.next/static/chunks/app/api/approvals/[id]/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
- package/.next/static/chunks/app/api/approvals/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
- package/.next/static/chunks/app/api/backup/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
- package/.next/static/chunks/app/api/browse/{route-9ea2990be4b67136.js → route-b9c783850b4c2acf.js} +1 -1
- package/.next/static/chunks/app/api/bugs/enhance/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/cwd/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/encryption/secure/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/env/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/[id]/versions/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/compile/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/generate/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/generator/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/improve/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/quick-chat/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/repair/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/flow/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/git/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/init/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/local-models/capability/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/local-models/pull/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/local-models/suggest/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/app-sandbox/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/cancel/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/oauth-capability/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/servers/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/model/[id]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/model/provider/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/model/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/model/test/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/oauth/callback/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/oauth/initiate/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/oauth/reset/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/build/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/derive-secrets/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/install/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/install/status/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/installed/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/resolve/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/scan-targets/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/search/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/packages/uninstall/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/reconcile/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/planned-executions/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/resend/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/reset/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/auth/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/feedback/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/oauth/callback/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/oauth/initiate/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/packages/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/publish/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/registry/settings/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/restore/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/runs/active/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/storage/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/telemetry/daily-active/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/update/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/waves/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[id]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/chat/{page-1d100e5d974c919e.js → page-e37bbc561f40ce60.js} +1 -1
- package/.next/static/chunks/app/executions/page-8296fd69c439ccee.js +1 -0
- package/.next/static/chunks/app/flows/page-e52c8943555e38dd.js +1 -0
- package/.next/static/chunks/app/{layout-38b88f3b057f4852.js → layout-abed1f211e03152f.js} +1 -1
- package/.next/static/chunks/app/mcp/page-1648e6fde0c41461.js +1 -0
- package/.next/static/chunks/app/mcp-flows/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/mcp-proxy/[server]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/models/page-595597042e227970.js +1 -0
- package/.next/static/chunks/app/packages/page-f1a22789a6c0e0b6.js +1 -0
- package/.next/static/chunks/app/page-2f9da78a4891731a.js +1 -0
- package/.next/static/chunks/app/settings/page-f35e939032b0277d.js +1 -0
- package/.next/static/chunks/app/v1/chat/completions/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/conversations/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/chat/events/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/app/v1/models/route-b9c783850b4c2acf.js +1 -0
- package/.next/static/chunks/{webpack-dccb4f149ebdedcc.js → webpack-9d09d53b271f49e2.js} +1 -1
- package/.next/trace +10 -10
- package/.next/types/app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.ts +347 -0
- package/.next/types/routes.d.ts +2 -1
- package/.next/types/validator.ts +9 -0
- package/README.md +47 -47
- package/package.json +5 -5
- package/.next/server/chunks/2985.js +0 -1
- package/.next/server/chunks/4308.js +0 -4
- package/.next/server/chunks/4366.js +0 -2
- package/.next/server/chunks/5040.js +0 -48
- package/.next/server/chunks/8187.js +0 -78
- package/.next/server/chunks/8851.js +0 -1
- package/.next/static/chunks/289-98f50bfcf833d661.js +0 -1
- package/.next/static/chunks/3089.df88f3b16898aad7.js +0 -1
- package/.next/static/chunks/6733-c9029143901e62e9.js +0 -1
- package/.next/static/chunks/8041-05830e887c133085.js +0 -1
- package/.next/static/chunks/8404-bfa9203e4296f3fb.js +0 -1
- package/.next/static/chunks/95-b9691d3cb15556dc.js +0 -1
- package/.next/static/chunks/app/api/bugs/enhance/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/cwd/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/encryption/secure/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/env/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/versions/[versionId]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/[id]/versions/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/compile/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/generate/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/generator/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/improve/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/prompt-renderer/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/quick-chat/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/repair/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/flow/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/git/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/init/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/local-models/capability/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/local-models/pull/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/local-models/suggest/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/app-sandbox/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/cancel/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/oauth-capability/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/get/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/prompts/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/read/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/resources/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/status/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/[toolName]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/[name]/tools/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/servers/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp/test-connection/stream/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/mcp-registry/spotlight/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/model/[id]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/model/provider/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/model/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/model/test/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/oauth/callback/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/oauth/initiate/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/oauth/reset/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/build/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/derive-secrets/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/install/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/install/status/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/installed/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/resolve/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/scan-targets/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/search/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/packages/uninstall/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/run/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/[id]/runs/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/preview-schedule/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/reconcile/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/planned-executions/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/auth/resend/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/auth/reset/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/auth/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/feedback/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/oauth/callback/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/oauth/initiate/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/packages/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/publish/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/registry/settings/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/restore/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/runs/active/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/storage/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/telemetry/daily-active/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/update/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/waves/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[id]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/executions/page-10ec7d58c7fbdd6f.js +0 -1
- package/.next/static/chunks/app/flows/page-9a78a2915268b2f8.js +0 -1
- package/.next/static/chunks/app/mcp/page-56b43b2f8752e9a5.js +0 -1
- package/.next/static/chunks/app/mcp-flows/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/mcp-proxy/[server]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/models/page-808c0568ebc5e2c7.js +0 -1
- package/.next/static/chunks/app/packages/page-af6ec89522915206.js +0 -1
- package/.next/static/chunks/app/page-30bf4293efa47a47.js +0 -1
- package/.next/static/chunks/app/settings/page-59ae1b658838f0bc.js +0 -1
- package/.next/static/chunks/app/v1/chat/completions/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/breakpoints/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/cancel/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/continue/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/debug/step/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/edit-state/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/events/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/inject/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/resources/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/respond/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/[conversationId]/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/conversations/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/chat/events/route-9ea2990be4b67136.js +0 -1
- package/.next/static/chunks/app/v1/models/route-9ea2990be4b67136.js +0 -1
- /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → hbjnLG9RCje2AApS9TzP8}/_buildManifest.js +0 -0
- /package/.next/static/{jfb1GsjSGMjBmwfa3kM26 → hbjnLG9RCje2AApS9TzP8}/_ssgManifest.js +0 -0
|
@@ -5,6 +5,6 @@ ${b.condition}
|
|
|
5
5
|
Tool result (untrusted data):
|
|
6
6
|
\`\`\`json
|
|
7
7
|
${m}
|
|
8
|
-
\`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.resolve().then(c.bind(c,12763)),{getCompletionAdapter:e}=await Promise.resolve().then(c.bind(c,
|
|
8
|
+
\`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.resolve().then(c.bind(c,12763)),{getCompletionAdapter:e}=await Promise.resolve().then(c.bind(c,39848)),{normalizeMaxTokens:f}=await Promise.resolve().then(c.bind(c,5091)),g=await d.getModel(a);if(!g)throw Error(`config: The AI-check model no longer exists (${a})`);let i=await d.resolveAndDecryptApiKey(g.ApiKey);if(!i)throw Error("config: Could not resolve the AI-check model API key");let j=e(g),{completion:k}=await j.createCompletion({model:g,apiKey:i,temperature:0,maxTokens:f(g.maxTokens),messages:[{role:"system",content:h},{role:"user",content:b}]}),l=k.choices?.[0]?.message?.content;return"string"==typeof l?l:""}async function k(a,b){let{runFlow:d}=await c.e(4551).then(c.bind(c,64551)),e=await d({flowId:a,prompt:`${b}
|
|
9
9
|
|
|
10
10
|
${g}`,mode:"ephemeral",requireApproval:!1,debug:!1,userTurn:!0});if("completed"!==e.status)throw Error(e.error?.message??`The checker flow ended with status "${e.status}"`);return e.outputText??""}}};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
exports.id=7069,exports.ids=[1925,3629,4306,6793,7069,9174],exports.modules={1925:(a,b,c)=>{"use strict";c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},48312:(a,b,c)=>{"use strict";c.d(b,{cA:()=>p});var d=c(10641),e=c(50846),f=c(95708),g=c(38291),h=c(99978),i=c(16226),j=c(14214),k=c(20433);let l=(0,e.h)("app/v1/chat/completions/chatCompletionService");function m(a){return Math.ceil((a||"").length/4)}let n=g.persistConversationState;async function o(a,b,c,e,f,g=!1,j=!1){let k=Date.now();l.info("Processing chat completion request",{model:a.model,messageCount:a.messages?.length||0,stream:a.stream,flujo:b,requireApproval:c,flujodebug:e,conversationId:f});let n=await (0,i.runFlow)({modelName:a.model,messages:a.messages,mcpAppContexts:a.mcpAppContexts,processNodeId:a.processNodeId,mode:"conversation",conversationId:f,flujo:b,requireApproval:c,debug:e,continueDebug:g,userTurn:j,source:"api"});if(n.flowNotFound)return d.NextResponse.json({error:{message:`Flow not found: ${n.flowNotFound.name}`,type:"invalid_request_error",code:"flow_not_found"}},{status:400});if("paused_debug"===n.status)return l.info(`Returning paused debug state for conv ${n.conversationId}`),d.NextResponse.json({status:"paused_debug",conversation_id:n.conversationId,debugState:n.sharedState});if("error"===n.status){let a=n.error?.message??"Unknown error during execution",b=n.error?.details??{message:a},c=n.error?.statusCode??500;return l.error(`Returning error response for conv ${n.conversationId}`,{errorMessage:a,errorDetails:b,statusCode:c}),d.NextResponse.json({error:{message:a,type:b.type||"api_error",code:b.code||"internal_error",param:b.param,details:b}},{status:c})}let p={role:"assistant",content:n.outputText,tool_calls:n.toolCalls},q="stop";"awaiting_tool_approval"===n.sharedState.status?
|
|
1
|
+
exports.id=7069,exports.ids=[1925,3629,4306,6793,7069,9174],exports.modules={1925:(a,b,c)=>{"use strict";c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},48312:(a,b,c)=>{"use strict";c.d(b,{cA:()=>p});var d=c(10641),e=c(50846),f=c(95708),g=c(38291),h=c(99978),i=c(16226),j=c(14214),k=c(20433);let l=(0,e.h)("app/v1/chat/completions/chatCompletionService");function m(a){return Math.ceil((a||"").length/4)}let n=g.persistConversationState;async function o(a,b,c,e,f,g=!1,j=!1){let k=Date.now();l.info("Processing chat completion request",{model:a.model,messageCount:a.messages?.length||0,stream:a.stream,flujo:b,requireApproval:c,flujodebug:e,conversationId:f});let n=await (0,i.runFlow)({modelName:a.model,messages:a.messages,mcpAppContexts:a.mcpAppContexts,processNodeId:a.processNodeId,mode:"conversation",conversationId:f,flujo:b,requireApproval:c,debug:e,continueDebug:g,userTurn:j,source:"api"});if(n.flowNotFound)return d.NextResponse.json({error:{message:`Flow not found: ${n.flowNotFound.name}`,type:"invalid_request_error",code:"flow_not_found"}},{status:400});if("paused_debug"===n.status)return l.info(`Returning paused debug state for conv ${n.conversationId}`),d.NextResponse.json({status:"paused_debug",conversation_id:n.conversationId,debugState:n.sharedState});if("error"===n.status){let a=n.error?.message??"Unknown error during execution",b=n.error?.details??{message:a},c=n.error?.statusCode??500;return l.error(`Returning error response for conv ${n.conversationId}`,{errorMessage:a,errorDetails:b,statusCode:c}),d.NextResponse.json({error:{message:a,type:b.type||"api_error",code:b.code||"internal_error",param:b.param,details:b}},{status:c})}let p={role:"assistant",content:n.outputText,tool_calls:n.toolCalls},q=[...n.messages].reverse().find(a=>"assistant"===a.role&&a.media?.length)?.media;q?.length&&(p.media=q);let r="stop";"awaiting_tool_approval"===n.sharedState.status?r="stop":n.finalAction===h.Jp&&p.tool_calls&&p.tool_calls.length>0?r="tool_calls":n.finalAction===h.E5&&(r="length");let s=m(n.messages.map(a=>a.content||"").join("\n")),t=m(n.outputText),u={id:`chatcmpl-${Date.now()}`,object:"chat.completion",created:Math.floor(k/1e3),model:a.model,choices:[{index:0,message:p,finish_reason:r}],usage:{prompt_tokens:s,completion_tokens:t,total_tokens:s+t},messages:n.messages,conversation_id:n.conversationId,status:n.sharedState.status||(n.finalAction===h.g4?"completed":"running"),pendingToolCalls:n.sharedState.pendingToolCalls};return l.info(`Returning success response for conv ${n.conversationId}`,{action:n.finalAction,status:u.status,flujo:b,requireApproval:c,flujodebug:e,finish_reason:r}),l.verbose(`Final response data for conv ${n.conversationId}`,u),d.NextResponse.json(u)}async function p(a,b,c,d,e,g=!1,h=!1){if("string"==typeof a.model&&a.model.startsWith("model-"))return(b||c||d||e)&&l.debug("Ignoring flow-only flags on a direct model completion",{flujo:b,requireApproval:c,flujodebug:d,conversationId:e}),q(a);if(!0!==a.stream)return o(a,b,c,d,e,g,h);{let i=e||crypto.randomUUID();return l.info(`Streaming requested for conversation ${i}. Starting async processing.`),o(a,b,c,d,i,g,h).catch(a=>{l.error(`Error in background processing for conversation ${i}:`,a);let b=f.FlowExecutor.conversationStates.get(i);b&&(b.status="error",b.lastResponse={success:!1,error:a instanceof Error?a.message:String(a)},f.FlowExecutor.conversationStates.set(i,b),n(`conversations/${i}`,b).catch(a=>{l.error(`Failed to save error state for conversation ${i}:`,a)})),j.$.emitterFor(i)({type:"run:done",status:"error"})}),function(a,b){let c=new TextEncoder,d=`chatcmpl-${Date.now()}`,e=Math.floor(Date.now()/1e3);return l.debug("create streaming response (event-bus driven)",{conversationId:b}),new Response(new ReadableStream({start(g){let h=!1,i=null,k=-1,l=new Set,m=new Map,n=a=>{g.enqueue(c.encode(`data: ${JSON.stringify(a)}
|
|
2
2
|
|
|
3
|
-
`))},o=(b,c)=>({id:d,object:"chat.completion.chunk",created:e,model:a,choices:[{index:0,delta:b,finish_reason:c}]}),p=a=>{if(h)return;h=!0;let d="error"===a?"error":"stop";n(o({content:"",conversation:f.FlowExecutor.conversationStates.get(b)},d)),n(o({},d)),g.enqueue(c.encode("data: [DONE]\n\n")),i&&i();try{g.close()}catch{}},q=a=>{if(!h&&!(a.seq<=k))if(k=a.seq,"model:delta"===a.type){let b={};if(a.delta&&(l.add(a.messageId),b.content=a.delta),a.toolCallDelta){let c=a.toolCallDelta,d=m.get(a.messageId)??new Map,e=d.get(c.index)??{id:!1,name:!1,arguments:!1};e.id||=!!c.id,e.name||=!!c.nameDelta,e.arguments||=!!c.argumentsDelta,d.set(c.index,e),m.set(a.messageId,d),b.tool_calls=[{index:c.index,...c.id?{id:c.id,type:"function"}:{},function:{...c.nameDelta?{name:c.nameDelta}:{},...c.argumentsDelta?{arguments:c.argumentsDelta}:{}}}]}Object.keys(b).length>0&&n(o(b,null))}else if("message"===a.type){let b=a.message;if(b&&"assistant"===b.role){!l.has(b.id)&&"string"==typeof b.content&&b.content.length>0&&n(o({content:b.content},null));let a=m.get(b.id),c=(b.tool_calls??[]).flatMap((b,c)=>{let d=a?.get(c),e={...!d?.name?{name:b.function.name}:{},...!d?.arguments?{arguments:b.function.arguments}:{}};return d?.id&&d.name&&d.arguments?[]:[{index:c,...!d?.id?{id:b.id,type:"function"}:{},function:e}]});c.length>0&&n(o({tool_calls:c},null))}}else"run:done"===a.type?p("error"===a.status?"error":"completed"):("run:awaiting_approval"===a.type||"run:paused"===a.type)&&p("stop")};for(let a of(n(o({role:"assistant",content:""},null)),i=j.$.subscribe(b,q),j.$.getBufferedSince(b,0)))q(a);if(!h){let a=f.FlowExecutor.conversationStates.get(b);a&&("completed"===a.status||"error"===a.status)&&p("error"===a.status?"error":"completed")}}}),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}(a.model,i)}}async function q(a){let b=a.model.slice(6);l.info("Processing direct model completion",{model:a.model,messageCount:a.messages?.length||0,stream:a.stream,hasTools:!!(a.tools&&a.tools.length>0)});let c=await k.modelService.generateChatCompletion({modelIdentifier:b,messages:a.messages,temperature:a.temperature,maxTokens:a.max_tokens,tools:a.tools});return c.success?!0===a.stream?function(a,b){let
|
|
3
|
+
`))},o=(b,c)=>({id:d,object:"chat.completion.chunk",created:e,model:a,choices:[{index:0,delta:b,finish_reason:c}]}),p=a=>{if(h)return;h=!0;let d="error"===a?"error":"stop";n(o({content:"",conversation:f.FlowExecutor.conversationStates.get(b)},d)),n(o({},d)),g.enqueue(c.encode("data: [DONE]\n\n")),i&&i();try{g.close()}catch{}},q=a=>{if(!h&&!(a.seq<=k))if(k=a.seq,"model:delta"===a.type){let b={};if(a.delta&&(l.add(a.messageId),b.content=a.delta),a.mediaPart&&(b.media=[a.mediaPart]),a.toolCallDelta){let c=a.toolCallDelta,d=m.get(a.messageId)??new Map,e=d.get(c.index)??{id:!1,name:!1,arguments:!1};e.id||=!!c.id,e.name||=!!c.nameDelta,e.arguments||=!!c.argumentsDelta,d.set(c.index,e),m.set(a.messageId,d),b.tool_calls=[{index:c.index,...c.id?{id:c.id,type:"function"}:{},function:{...c.nameDelta?{name:c.nameDelta}:{},...c.argumentsDelta?{arguments:c.argumentsDelta}:{}}}]}Object.keys(b).length>0&&n(o(b,null))}else if("message"===a.type){let b=a.message;if(b&&"assistant"===b.role){!l.has(b.id)&&"string"==typeof b.content&&b.content.length>0&&n(o({content:b.content},null)),b.media&&b.media.length>0&&n(o({media:b.media},null));let a=m.get(b.id),c=(b.tool_calls??[]).flatMap((b,c)=>{let d=a?.get(c),e={...!d?.name?{name:b.function.name}:{},...!d?.arguments?{arguments:b.function.arguments}:{}};return d?.id&&d.name&&d.arguments?[]:[{index:c,...!d?.id?{id:b.id,type:"function"}:{},function:e}]});c.length>0&&n(o({tool_calls:c},null))}}else"run:done"===a.type?p("error"===a.status?"error":"completed"):("run:awaiting_approval"===a.type||"run:paused"===a.type)&&p("stop")};for(let a of(n(o({role:"assistant",content:""},null)),i=j.$.subscribe(b,q),j.$.getBufferedSince(b,0)))q(a);if(!h){let a=f.FlowExecutor.conversationStates.get(b);a&&("completed"===a.status||"error"===a.status)&&p("error"===a.status?"error":"completed")}}}),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}(a.model,i)}}async function q(a){let b=a.model.slice(6);l.info("Processing direct model completion",{model:a.model,messageCount:a.messages?.length||0,stream:a.stream,hasTools:!!(a.tools&&a.tools.length>0)});let c=await k.modelService.generateChatCompletion({modelIdentifier:b,messages:a.messages,temperature:a.temperature,maxTokens:a.max_tokens,tools:a.tools});return c.success?!0===a.stream?function(a,b,c){let d=new TextEncoder,e=b.id||`chatcmpl-${Date.now()}`,f=b.created||Math.floor(Date.now()/1e3),g=b.choices?.[0],h=g?.finish_reason??"stop";return new Response(new ReadableStream({start(b){let i=a=>{b.enqueue(d.encode(`data: ${JSON.stringify(a)}
|
|
4
4
|
|
|
5
|
-
`))},
|
|
6
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},56793:(a,b,c)=>{"use strict";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}},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.
|
|
5
|
+
`))},j=(b,c)=>({id:e,object:"chat.completion.chunk",created:f,model:a,choices:[{index:0,delta:b,finish_reason:c}]});i(j({role:"assistant",content:""},null));let k="string"==typeof g?.message?.content?g.message.content:"";k.length>0&&i(j({content:k},null)),c&&c.length>0&&i(j({media:c},null));let l=g?.message?.tool_calls;l&&l.length>0&&i(j({tool_calls:l.map((a,b)=>({index:b,...a}))},null)),i(j({},h)),b.enqueue(d.encode("data: [DONE]\n\n")),b.close()}}),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}(a.model,c.completion,c.media):d.NextResponse.json({...c.completion,...c.media?.length?{media:c.media}:{}}):(l.warn("Direct model completion failed",{model:a.model,code:c.error.code,statusCode:c.statusCode}),d.NextResponse.json({error:{message:c.error.message,type:c.error.type,code:c.error.code,param:c.error.param??null}},{status:c.statusCode}))}},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
6
|
+
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},56793:(a,b,c)=>{"use strict";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}},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.loadItem)(g.Z.GLOBAL_ENV_VARS,{}),e=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(d);j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i={},l=new Set;if(e)for(let[a,b]of Object.entries(d))i[a]=b.value,b.metadata.isSecret&&l.add(a);else i={...d};let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==i[b]){let e=i[b];if(!c&&(l.has(b)||e.startsWith("encrypted:")||e.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await n(d);return b}return a},o=await n(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(o,null,2)),j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"605caa1e030009a4bc7e820854ff481d3e0295325d",null),(0,d.A)(l,"4003ce37366709f5add0c98a6e32e47a1006fd7c7d",null),(0,d.A)(m,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},91959:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>d.V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>d.resolveGlobalVars,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>d.G});var d=c(73456)},96487:()=>{}};
|
|
@@ -5,6 +5,6 @@ ${b.condition}
|
|
|
5
5
|
Tool result (untrusted data):
|
|
6
6
|
\`\`\`json
|
|
7
7
|
${m}
|
|
8
|
-
\`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(1925)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(1925)]).then(c.bind(c,
|
|
8
|
+
\`\`\``;try{let c="llm-gate"===b.mode?await j(b.modelId,n):await k(b.flowId,n),g=function(a){let b=a.match(/\{[\s\S]*\}/);if(!b)return null;try{let a=JSON.parse(b[0]);if("boolean"!=typeof a?.fire)return null;return{fire:a.fire,reason:"string"==typeof a.reason?a.reason:""}}catch{return null}}(c);if(!g)return f.warn(`Gate returned unparseable output: ${c.slice(0,200)}`),{fire:!1,newState:{lastHash:d,...l},error:"The AI check returned an unreadable answer — did not run the flow"};if(!g.fire)return{fire:!1,newState:{lastHash:d,...l}};return{fire:!0,summary:"flow-gate"===b.mode?"Flow condition met":"AI condition met",context:{result:(0,e.Je)(a),aiReason:g.reason},newState:{lastHash:d,...l}}}catch(b){let a=b instanceof Error?b.message:String(b);return f.warn(`Gate check failed: ${a}`),{fire:!1,newState:a.startsWith("config:")?{lastHash:d}:l,error:a.replace(/^config:\s*/,"")}}}async function j(a,b){let{modelService:d}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(1925)]).then(c.bind(c,20433)),{getCompletionAdapter:e}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(1925)]).then(c.bind(c,53271)),{normalizeMaxTokens:f}=await c.e(6496).then(c.bind(c,46496)),g=await d.getModel(a);if(!g)throw Error(`config: The AI-check model no longer exists (${a})`);let i=await d.resolveAndDecryptApiKey(g.ApiKey);if(!i)throw Error("config: Could not resolve the AI-check model API key");let j=e(g),{completion:k}=await j.createCompletion({model:g,apiKey:i,temperature:0,maxTokens:f(g.maxTokens),messages:[{role:"system",content:h},{role:"user",content:b}]}),l=k.choices?.[0]?.message?.content;return"string"==typeof l?l:""}async function k(a,b){let{runFlow:d}=await Promise.all([c.e(3128),c.e(4322),c.e(5067),c.e(6034),c.e(7821),c.e(5096),c.e(544),c.e(4671),c.e(6226),c.e(4306)]).then(c.bind(c,16226)),e=await d({flowId:a,prompt:`${b}
|
|
9
9
|
|
|
10
10
|
${g}`,mode:"ephemeral",requireApproval:!1,debug:!1,userTurn:!0});if("completed"!==e.status)throw Error(e.error?.message??`The checker flow ended with status "${e.status}"`);return e.outputText??""}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
exports.id=7628,exports.ids=[7628],exports.modules={3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},22084:(a,b,c)=>{"use strict";c.d(b,{D:()=>e});var d=c(93868);function e(a){let b=new Set,c=a=>{if("string"==typeof a){for(let c of function(a){let b;if("string"!=typeof a)return[];let c=[],e=RegExp(d.HQ.source,"g");for(;null!==(b=e.exec(a));)c.includes(b[1])||c.push(b[1]);return c}(a))b.add(c);return}if(Array.isArray(a)){for(let b of a)c(b);return}if(a&&"object"==typeof a)for(let b of Object.values(a))c(b)};return c(a),Array.from(b)}},25113:(a,b,c)=>{"use strict";c.d(b,{$j:()=>k,Xw:()=>g,Zp:()=>j});var d=c(93868),e=c(22084),f=c(63564);function g(a){let b=new Set,c=new Set,d=new Set;for(let e of a.nodes??[]){let a=e.data?.properties??{},f=e.data?.type??e.type,g=a.flowId??a.subflowId??a.subFlowId;"subflow"===f&&"string"==typeof g&&g&&b.add(g);let h=a.boundModel??a.modelId??a.model;if("string"==typeof h&&h&&c.add(h),"mcp"===f){let b=a.mcpServer??a.serverName??a.server;"string"==typeof b&&b&&d.add(b)}}let e={};return b.size&&(e.flowIds=Array.from(b)),c.size&&(e.modelIds=Array.from(c)),d.size&&(e.mcpServerNames=Array.from(d)),e}function h({model:a,apiKeyRef:b}){let{ApiKey:c,...d}=a;return{...d,apiKeyRef:b??{kind:"none"}}}function i(a){let b=JSON.parse(JSON.stringify(a));return b.trigger&&"webhook"===b.trigger.type&&delete b.trigger.token,b}function j(a){let b={schemaVersion:1,id:a.id,name:a.name,description:a.description,version:a.version,author:a.author,publisher:a.publisher,tags:a.tags,requiredGlobals:a.requiredGlobals,secrets:a.secrets??[],models:(a.models??[]).map(h),mcpServers:a.mcpServers??[],flows:(a.flows??[]).map(a=>{let b=g(a);return Object.keys(b).length?{flow:a,references:b}:{flow:a}}),plannedExecutions:(a.plannedExecutions??[]).map(i)};if((0,f.AG)(b))throw Error("Refusing to serialize package: an 'encrypted:' value was found (secret material must never be packaged).");let c=f._M.parse(b),e=JSON.stringify(c),j=new TextEncoder().encode(e).length;if(j>d.j6)throw Error(`Package exceeds size cap: ${j} bytes > ${d.j6} bytes.`);return{json:e,package:c}}function k(a){let b=f._M.safeParse(a);if(!b.success)return{success:!1,errors:b.error.issues.map(a=>{let b=a.path.join(".");return b?`${b}: ${a.message}`:a.message})};let c=b.data;return{success:!0,data:c,warnings:function(a){let b=new Set((0,e.D)(a));for(let c of a.models)"secret"===c.apiKeyRef.kind&&b.add(c.apiKeyRef.secret);for(let c of a.mcpServers)for(let a of[...c.envDeclarations,...c.headerDeclarations??[]])a.secretRef&&b.add(a.secretRef);return a.secrets.filter(a=>!b.has(a.name)).map(a=>`secret "${a.name}" is declared but never referenced`)}(c)}}},41115:(a,b,c)=>{"use strict";c.d(b,{$:()=>h,v5:()=>g});var d=c(10641);let e=new Set(["localhost","127.0.0.1","::1"]);function f(a){let b=a.toLowerCase();return!!e.has(b)||(function(){let a=process.env.FLUJO_EXTRA_LOCAL_HOSTS;return a?a.split(",").map(a=>a.trim().toLowerCase()).filter(a=>a.length>0&&"."!==a):[]})().some(a=>a.startsWith(".")?b.endsWith(a):b===a)}function g(a,b){let c=function(a){if(!a)return null;let b=a.trim();if(b.startsWith("[")){let a=b.indexOf("]");return a>0?b.slice(1,a):null}return b.split(":")[0]||null}(a);if(!c||!f(c))return!1;if(b)try{if(!f(new URL(b).hostname))return!1}catch{return!1}return!0}function h(a){return g(a.headers.get("host"),a.headers.get("origin"))?null:d.NextResponse.json({error:"Forbidden: this endpoint only accepts local requests."},{status:403})}},63564:(a,b,c)=>{"use strict";c.d(b,{AG:()=>g,_M:()=>p});var d=c(10522),e=c(93868),f=c(22084);function g(a){return"string"==typeof a?a.startsWith(e.Mp):Array.isArray(a)?a.some(g):!!a&&"object"==typeof a&&Object.values(a).some(g)}let h=d.Ik({name:d.Yj().min(1).regex(e.IE,"invalid secret name"),description:d.Yj().optional(),required:d.zM(),default:d.Yj().optional()}).strict(),i=d.gM("kind",[d.Ik({kind:d.eu("secret"),secret:d.Yj().min(1)}).strict(),d.Ik({kind:d.eu("global"),var:d.Yj().min(1)}).strict(),d.Ik({kind:d.eu("none")}).strict()]),j=d.Ik({id:d.Yj().min(1),name:d.Yj().min(1),displayName:d.Yj().optional(),description:d.Yj().optional(),baseUrl:d.Yj().optional(),provider:d.Yj().optional(),adapter:d.Yj().optional(),promptTemplate:d.Yj().optional(),reasoningSchema:d.Yj().optional(),temperature:d.Yj().optional(),reasoningEffort:d.k5(["minimal","low","medium","high","xhigh","max","ultra"]).optional(),thinkingLevel:d.k5(["minimal","low","medium","high"]).optional(),thinkingBudget:d.ai().int().min(-1).optional(),serviceTier:d.k5(["default","priority"]).optional(),functionCallingSchema:d.Yj().optional(),contextWindow:d.ai().optional(),maxTurns:d.ai().optional(),maxTokens:d.ai().optional(),folder:d.Yj().optional(),favorite:d.zM().optional(),apiKeyRef:i}).strict(),k=d.Ik({sourceType:d.k5(["github","registry","marketplace","remote"]),ref:d.Yj().optional(),url:d.Yj().optional(),name:d.Yj().optional()}).strict().superRefine((a,b)=>{"remote"!==a.sourceType||a.url||b.addIssue({code:"custom",message:"installOrigin 'remote' requires a url"}),"github"!==a.sourceType&&"registry"!==a.sourceType||a.ref||b.addIssue({code:"custom",message:`installOrigin '${a.sourceType}' requires a ref`})}),l=d.Ik({name:d.Yj().min(1),isSecret:d.zM(),secretRef:d.Yj().optional(),globalVar:d.Yj().optional()}).strict(),m=d.Ik({name:d.Yj().min(1),transport:d.k5(["stdio","sse","streamable","websocket"]),disabled:d.zM().optional(),autoApprove:d.YO(d.Yj()).optional(),folder:d.Yj().optional(),installOrigin:k,envDeclarations:d.YO(l),headerDeclarations:d.YO(l).optional()}).strict(),n=d.Ik({flow:d.Ik({id:d.Yj().min(1),name:d.Yj().min(1),nodes:d.YO(d.bz()),edges:d.YO(d.bz())}).catchall(d.L5()),references:d.Ik({flowIds:d.YO(d.Yj()).optional(),modelIds:d.YO(d.Yj()).optional(),mcpServerNames:d.YO(d.Yj()).optional()}).optional()}),o=d.Ik({id:d.Yj().min(1),name:d.Yj().min(1),enabled:d.zM(),flowId:d.Yj().min(1),prompt:d.Yj(),trigger:d.bz()}).catchall(d.L5()),p=d.Ik({schemaVersion:d.eu(e.EL),id:d.Yj().min(1),name:d.Yj().min(1),description:d.Yj().optional(),version:d.Yj().regex(e.po,"version must be valid semver"),author:d.Yj().optional(),publisher:d.Yj().optional(),tags:d.YO(d.Yj()).optional(),requiredGlobals:d.YO(d.Yj()).optional(),secrets:d.YO(h),models:d.YO(j),mcpServers:d.YO(m),flows:d.YO(n),plannedExecutions:d.YO(o)}).superRefine((a,b)=>{g(a)&&b.addIssue({code:"custom",message:`package contains an '${e.Mp}' value; secret material must never be serialized`});let c=new Set(a.secrets.map(a=>a.name)),d=new Set((0,f.D)(a));for(let b of a.models)"secret"===b.apiKeyRef.kind&&d.add(b.apiKeyRef.secret);for(let b of a.mcpServers)for(let a of[...b.envDeclarations,...b.headerDeclarations??[]])a.secretRef&&d.add(a.secretRef);for(let a of d)c.has(a)||b.addIssue({code:"custom",message:`secret "${a}" is referenced but not declared in secrets[]`});let h=new Set(a.flows.map(a=>a.flow.id));a.plannedExecutions.forEach((a,c)=>{h.has(a.flowId)||b.addIssue({code:"custom",path:["plannedExecutions",c,"flowId"],message:`plannedExecution "${a.name}" references unknown flow id "${a.flowId}"`})}),a.flows.forEach((a,c)=>{for(let d of a.references?.flowIds??[])h.has(d)||b.addIssue({code:"custom",path:["flows",c,"references","flowIds"],message:`flow "${a.flow.name}" references unknown subflow id "${d}"`})})})},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.YM)(g.Z.GLOBAL_ENV_VARS,{}),e=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(d);j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i={},l=new Set;if(e)for(let[a,b]of Object.entries(d))i[a]=b.value,b.metadata.isSecret&&l.add(a);else i={...d};let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==i[b]){let e=i[b];if(!c&&(l.has(b)||e.startsWith("encrypted:")||e.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await n(d);return b}return a},o=await n(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(o,null,2)),j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"605caa1e030009a4bc7e820854ff481d3e0295325d",null),(0,d.A)(l,"4003ce37366709f5add0c98a6e32e47a1006fd7c7d",null),(0,d.A)(m,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987",null)},78335:()=>{},91959:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>d.V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>d.resolveGlobalVars,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>d.G});var d=c(73456)},93868:(a,b,c)=>{"use strict";c.d(b,{EL:()=>d,HQ:()=>f,IE:()=>i,Mp:()=>g,j6:()=>e,mQ:()=>h,po:()=>j});let d=1,e=2097152,f=/\{\{secret\.([A-Za-z0-9_.-]+)\}\}/g,g="encrypted:",h=/^\$\{global:([A-Za-z0-9_.-]+)\}$/,i=/^[A-Za-z0-9_.-]+$/,j=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-.]+)?(?:\+[0-9A-Za-z-.]+)?$/},96487:()=>{}};
|
|
1
|
+
exports.id=7628,exports.ids=[7628],exports.modules={3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},22084:(a,b,c)=>{"use strict";c.d(b,{D:()=>e});var d=c(93868);function e(a){let b=new Set,c=a=>{if("string"==typeof a){for(let c of function(a){let b;if("string"!=typeof a)return[];let c=[],e=RegExp(d.HQ.source,"g");for(;null!==(b=e.exec(a));)c.includes(b[1])||c.push(b[1]);return c}(a))b.add(c);return}if(Array.isArray(a)){for(let b of a)c(b);return}if(a&&"object"==typeof a)for(let b of Object.values(a))c(b)};return c(a),Array.from(b)}},25113:(a,b,c)=>{"use strict";c.d(b,{$j:()=>k,Xw:()=>g,Zp:()=>j});var d=c(93868),e=c(22084),f=c(63564);function g(a){let b=new Set,c=new Set,d=new Set;for(let e of a.nodes??[]){let a=e.data?.properties??{},f=e.data?.type??e.type,g=a.flowId??a.subflowId??a.subFlowId;"subflow"===f&&"string"==typeof g&&g&&b.add(g);let h=a.boundModel??a.modelId??a.model;if("string"==typeof h&&h&&c.add(h),"mcp"===f){let b=a.boundServer??a.mcpServer??a.serverName??a.server;"string"==typeof b&&b&&d.add(b)}}let e={};return b.size&&(e.flowIds=Array.from(b)),c.size&&(e.modelIds=Array.from(c)),d.size&&(e.mcpServerNames=Array.from(d)),e}function h({model:a,apiKeyRef:b}){let{ApiKey:c,...d}=a;return{...d,apiKeyRef:b??{kind:"none"}}}function i(a){let b=JSON.parse(JSON.stringify(a));return b.trigger&&"webhook"===b.trigger.type&&delete b.trigger.token,b}function j(a){let b={schemaVersion:1,id:a.id,name:a.name,description:a.description,version:a.version,author:a.author,publisher:a.publisher,tags:a.tags,requiredGlobals:a.requiredGlobals,globals:a.globals,secrets:a.secrets??[],models:(a.models??[]).map(h),mcpServers:a.mcpServers??[],flows:(a.flows??[]).map(a=>{let b=g(a);return Object.keys(b).length?{flow:a,references:b}:{flow:a}}),plannedExecutions:(a.plannedExecutions??[]).map(i)};if((0,f.AG)(b))throw Error("Refusing to serialize package: an 'encrypted:' value was found (secret material must never be packaged).");let c=f._M.parse(b),e=JSON.stringify(c),j=new TextEncoder().encode(e).length;if(j>d.j6)throw Error(`Package exceeds size cap: ${j} bytes > ${d.j6} bytes.`);return{json:e,package:c}}function k(a){let b=f._M.safeParse(a);if(!b.success)return{success:!1,errors:b.error.issues.map(a=>{let b=a.path.join(".");return b?`${b}: ${a.message}`:a.message})};let c=b.data;return{success:!0,data:c,warnings:function(a){let b=new Set((0,e.D)(a));for(let c of a.models)"secret"===c.apiKeyRef.kind&&b.add(c.apiKeyRef.secret);for(let c of a.mcpServers)for(let a of[...c.envDeclarations,...c.headerDeclarations??[]])a.secretRef&&b.add(a.secretRef);return a.secrets.filter(a=>!b.has(a.name)).map(a=>`secret "${a.name}" is declared but never referenced`)}(c)}}},41115:(a,b,c)=>{"use strict";c.d(b,{$:()=>h,v5:()=>g});var d=c(10641);let e=new Set(["localhost","127.0.0.1","::1"]);function f(a){let b=a.toLowerCase();return!!e.has(b)||(function(){let a=process.env.FLUJO_EXTRA_LOCAL_HOSTS;return a?a.split(",").map(a=>a.trim().toLowerCase()).filter(a=>a.length>0&&"."!==a):[]})().some(a=>a.startsWith(".")?b.endsWith(a):b===a)}function g(a,b){let c=function(a){if(!a)return null;let b=a.trim();if(b.startsWith("[")){let a=b.indexOf("]");return a>0?b.slice(1,a):null}return b.split(":")[0]||null}(a);if(!c||!f(c))return!1;if(b)try{if(!f(new URL(b).hostname))return!1}catch{return!1}return!0}function h(a){return g(a.headers.get("host"),a.headers.get("origin"))?null:d.NextResponse.json({error:"Forbidden: this endpoint only accepts local requests."},{status:403})}},63564:(a,b,c)=>{"use strict";c.d(b,{AG:()=>g,_M:()=>r});var d=c(10522),e=c(93868),f=c(22084);function g(a){return"string"==typeof a?a.startsWith(e.Mp):Array.isArray(a)?a.some(g):!!a&&"object"==typeof a&&Object.values(a).some(g)}let h=d.Ik({name:d.Yj().min(1).regex(e.IE,"invalid secret name"),description:d.Yj().optional(),required:d.zM(),default:d.Yj().optional()}).strict(),i=d.Ik({name:d.Yj().min(1).regex(e.IE,"invalid global variable name"),description:d.Yj().optional(),required:d.zM(),isSecret:d.zM().optional()}).strict(),j=d.gM("kind",[d.Ik({kind:d.eu("secret"),secret:d.Yj().min(1)}).strict(),d.Ik({kind:d.eu("global"),var:d.Yj().min(1)}).strict(),d.Ik({kind:d.eu("none")}).strict()]),k=d.Ik({id:d.Yj().min(1),name:d.Yj().min(1),displayName:d.Yj().optional(),description:d.Yj().optional(),baseUrl:d.Yj().optional(),provider:d.Yj().optional(),adapter:d.Yj().optional(),promptTemplate:d.Yj().optional(),reasoningSchema:d.Yj().optional(),temperature:d.Yj().optional(),reasoningEffort:d.k5(["minimal","low","medium","high","xhigh","max","ultra"]).optional(),thinkingLevel:d.k5(["minimal","low","medium","high"]).optional(),thinkingBudget:d.ai().int().min(-1).optional(),serviceTier:d.k5(["default","priority"]).optional(),functionCallingSchema:d.Yj().optional(),contextWindow:d.ai().optional(),maxTurns:d.ai().optional(),maxTokens:d.ai().optional(),folder:d.Yj().optional(),favorite:d.zM().optional(),apiKeyRef:j}).strict(),l=d.Ik({sourceType:d.k5(["github","registry","marketplace","remote"]),ref:d.Yj().optional(),url:d.Yj().optional(),name:d.Yj().optional()}).strict().superRefine((a,b)=>{"remote"!==a.sourceType||a.url||b.addIssue({code:"custom",message:"installOrigin 'remote' requires a url"}),"github"!==a.sourceType&&"registry"!==a.sourceType||a.ref||b.addIssue({code:"custom",message:`installOrigin '${a.sourceType}' requires a ref`})}),m=d.Ik({name:d.Yj().min(1),isSecret:d.zM(),secretRef:d.Yj().optional(),globalVar:d.Yj().optional(),globalTemplate:d.Yj().optional()}).strict().superRefine((a,b)=>{void 0===a.globalTemplate||/\$\{global:[A-Za-z0-9_.-]+\}/.test(a.globalTemplate)||b.addIssue({code:"custom",path:["globalTemplate"],message:"globalTemplate must contain at least one ${global:NAME} reference"})}),n=d.Ik({index:d.ai().int().nonnegative(),value:d.Yj().min(1)}).strict().superRefine((a,b)=>{/\$\{global:[A-Za-z0-9_.-]+\}/.test(a.value)||b.addIssue({code:"custom",path:["value"],message:"argument template must contain at least one ${global:NAME} reference"})}),o=d.Ik({name:d.Yj().min(1),transport:d.k5(["stdio","sse","streamable","websocket"]),disabled:d.zM().optional(),autoApprove:d.YO(d.Yj()).optional(),folder:d.Yj().optional(),installOrigin:l,envDeclarations:d.YO(m),headerDeclarations:d.YO(m).optional(),argTemplates:d.YO(n).optional()}).strict(),p=d.Ik({flow:d.Ik({id:d.Yj().min(1),name:d.Yj().min(1),nodes:d.YO(d.bz()),edges:d.YO(d.bz())}).catchall(d.L5()),references:d.Ik({flowIds:d.YO(d.Yj()).optional(),modelIds:d.YO(d.Yj()).optional(),mcpServerNames:d.YO(d.Yj()).optional()}).optional()}),q=d.Ik({id:d.Yj().min(1),name:d.Yj().min(1),enabled:d.zM(),flowId:d.Yj().min(1),prompt:d.Yj(),trigger:d.bz()}).catchall(d.L5()),r=d.Ik({schemaVersion:d.eu(e.EL),id:d.Yj().min(1),name:d.Yj().min(1),description:d.Yj().optional(),version:d.Yj().regex(e.po,"version must be valid semver"),author:d.Yj().optional(),publisher:d.Yj().optional(),tags:d.YO(d.Yj()).optional(),requiredGlobals:d.YO(d.Yj()).optional(),globals:d.YO(i).optional(),secrets:d.YO(h),models:d.YO(k),mcpServers:d.YO(o),flows:d.YO(p),plannedExecutions:d.YO(q)}).superRefine((a,b)=>{g(a)&&b.addIssue({code:"custom",message:`package contains an '${e.Mp}' value; secret material must never be serialized`});let c=new Set(a.secrets.map(a=>a.name)),d=new Set((0,f.D)(a));for(let b of a.models)"secret"===b.apiKeyRef.kind&&d.add(b.apiKeyRef.secret);for(let b of a.mcpServers)for(let a of[...b.envDeclarations,...b.headerDeclarations??[]])a.secretRef&&d.add(a.secretRef);for(let a of d)c.has(a)||b.addIssue({code:"custom",message:`secret "${a}" is referenced but not declared in secrets[]`});let h=new Set(a.flows.map(a=>a.flow.id));a.plannedExecutions.forEach((a,c)=>{h.has(a.flowId)||b.addIssue({code:"custom",path:["plannedExecutions",c,"flowId"],message:`plannedExecution "${a.name}" references unknown flow id "${a.flowId}"`})}),a.flows.forEach((a,c)=>{for(let d of a.references?.flowIds??[])h.has(d)||b.addIssue({code:"custom",path:["flows",c,"references","flowIds"],message:`flow "${a.flow.name}" references unknown subflow id "${d}"`})})})},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.loadItem)(g.Z.GLOBAL_ENV_VARS,{}),e=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(d);j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i={},l=new Set;if(e)for(let[a,b]of Object.entries(d))i[a]=b.value,b.metadata.isSecret&&l.add(a);else i={...d};let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==i[b]){let e=i[b];if(!c&&(l.has(b)||e.startsWith("encrypted:")||e.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await n(d);return b}return a},o=await n(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(o,null,2)),j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"605caa1e030009a4bc7e820854ff481d3e0295325d",null),(0,d.A)(l,"4003ce37366709f5add0c98a6e32e47a1006fd7c7d",null),(0,d.A)(m,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987",null)},78335:()=>{},91959:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>d.V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>d.resolveGlobalVars,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>d.G});var d=c(73456)},93868:(a,b,c)=>{"use strict";c.d(b,{EL:()=>d,HQ:()=>f,IE:()=>i,Mp:()=>g,j6:()=>e,mQ:()=>h,po:()=>j});let d=1,e=2097152,f=/\{\{secret\.([A-Za-z0-9_.-]+)\}\}/g,g="encrypted:",h=/^\$\{global:([A-Za-z0-9_.-]+)\}$/,i=/^[A-Za-z0-9_.-]+$/,j=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z-.]+)?(?:\+[0-9A-Za-z-.]+)?$/},96487:()=>{}};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";exports.id=7630,exports.ids=[7630],exports.modules={5248:(a,b,c)=>{c.d(b,{P:()=>m,p:()=>k});var d=c(32524),e=c(81226);function f(a){return!!a&&a.includes("mcp")}function g(a){return!!a&&a.includes("resource")}let h=a=>({source:`${a}-bottom`,target:`${a}-top`});function i(a,b){let c=a.filter(a=>"mcp"!==a.type&&"resource"!==a.type&&"string"==typeof a.id),d=new Map(c.map(a=>[a.id,a])),e=new Map,i=new Map,j=new Set;for(let a of c)e.set(a.id,0),i.set(a.id,0);let k=(a,b)=>{j.add(`${a}->${b}`),i.set(a,(i.get(a)??0)+1),e.set(b,(e.get(b)??0)+1)};for(let a of b)d.has(a.from)&&d.has(a.to)&&a.from!==a.to&&(k(a.from,a.to),a.bidirectional&&k(a.to,a.from));let l=[];for(let a of[...c].sort((a,b)=>a.y-b.y||a.x-b.x)){let b=l[l.length-1];b&&70>=Math.abs(a.y-b[0].y)?b.push(a):l.push([a])}let m=new Map;l.forEach((a,b)=>a.forEach(a=>m.set(a.id,b)));let n=new Map;for(let a=1;a<l.length;a++){let b=l[a],c=b.filter(a=>"subflow"===a.type);if(c.length>=2&&c.length===b.length){let b=l[a-1];if(1===b.length&&"process"===b[0].type)for(let a of c)n.set(a.id,b[0].id)}}let o=[],p=(a,b)=>{if(a===b||j.has(`${a}->${b}`))return!1;let c=d.get(a),e=d.get(b);return!(!c||!e||null!==function(a,b,c,d){if("trigger"===a&&"start"===c)return b&&"trigger-bottom"!==b?"Trigger nodes must connect via their bottom handle":d&&"start-top"!==d?"Trigger nodes must connect to the top handle of the Start node":null;if("trigger"===c)return"Trigger nodes cannot have incoming connections";if("trigger"===a&&"start"!==c)return"Trigger nodes can only connect to the Start node";if("start"===c)return"Start nodes cannot have incoming connections";if("finish"===a)return"Finish nodes cannot have outgoing connections";if("mcp"===a||"mcp"===c||f(b)||f(d))return("mcp"!==a||"process"!==c)&&("process"!==a||"mcp"!==c)?"MCP connections must link an MCP node to a Process node via MCP handles":"process"!==a||f(b)?null:"Connect MCP nodes from the Process node's left/right MCP handles";if("resource"===a||"resource"===c||g(b)||g(d)){if(("resource"!==a||"process"!==c)&&("process"!==a||"resource"!==c))return"Resource connections must link a Resource node to a Process node via resource handles";if("process"===a&&!g(b))return"Connect Resource nodes from the Process node's left/right resource handles"}return null}(c.type,h(c.type).source,e.type,h(e.type).target)||"subflow"===c.type&&(i.get(a)??0)>=1)},q=(a,b,c,d)=>{o.push({from:a,to:b,bidirectional:c,reason:d}),k(a,b),c&&k(b,a)},r=a=>{let b=m.get(a.id)??0;for(let c=b-1;c>=0;c--){let b=l[c].filter(b=>b.id!==a.id&&"finish"!==b.type&&!n.has(b.id));if(0!==b.length){if(1===b.length)return b[0];return b.reduce((b,c)=>Math.abs(c.x-a.x)<Math.abs(b.x-a.x)?c:b)}}return null};for(let a of l)for(let b of a){if("start"===b.type||(e.get(b.id)??0)>0)continue;let a=n.get(b.id);if(a){p(a,b.id)&&q(a,b.id,!0,"auto-bidirectional-subflow");continue}let c=r(b);c&&p(c.id,b.id)&&q(c.id,b.id,!1,"auto-connected")}let s=c.filter(a=>"start"===a.type),t=()=>c.filter(a=>"start"!==a.type&&"finish"!==a.type&&!n.has(a.id)&&(e.get(a.id)??0)===0),u=null;if(0===s.length){let a=t();if(a.length>0)u={targets:a.map(a=>a.id)};else{let a=c.filter(a=>"finish"!==a.type).sort((a,b)=>a.y-b.y)[0];a&&(u={targets:[a.id]})}}else{let a=s[0];for(let b of t())p(a.id,b.id)&&q(a.id,b.id,!1,"auto-connected")}let v=c.filter(a=>"finish"===a.type),w=()=>c.filter(a=>"start"!==a.type&&"finish"!==a.type&&!n.has(a.id)&&(i.get(a.id)??0)===0),x=null;if(0===v.length){let a=w();a.length>0&&(x={sources:a.map(a=>a.id)})}else{let a=v[0];for(let b of w())p(b.id,a.id)&&q(b.id,a.id,!1,"auto-connected")}return{addEdges:o,addStart:u,addFinish:x}}function j(a,b){if(!b.has(a))return a;for(let c=2;;c++){let d=`${a}_${c}`;if(!b.has(d))return d}}function k(a){let b=[];return{spec:function a(b,c){let d=Array.isArray(b?.nodes)?b.nodes.map(a=>({...a})):[],e=Array.isArray(b?.edges)?b.edges.map(a=>({...a})):[];for(let b of d)b?.type==="subflow"&&b.subflowSpec&&(b.subflowSpec=a(b.subflowSpec,c));let f=d.filter(a=>a&&"string"==typeof a.key&&!!a.key&&"mcp"!==a.type);if(0===f.length)return{...b,nodes:d,edges:e};let g=i(f.map((a,b)=>({id:a.key,type:a.type,x:0,y:1e3*b})),e.filter(a=>a&&"string"==typeof a.from&&"string"==typeof a.to).map(a=>({from:a.from,to:a.to,bidirectional:!0===a.bidirectional})));for(let a of g.addEdges)e.push({from:a.from,to:a.to,...a.bidirectional?{bidirectional:!0}:{}}),c.push({code:a.reason,message:n(a.reason),nodeId:a.to});let h=new Set(d.map(a=>a.key).filter(Boolean));if(g.addStart){let a=j("start",h);for(let b of(h.add(a),d.unshift({key:a,type:"start"}),g.addStart.targets))e.push({from:a,to:b});c.push({code:"auto-added-start",message:`Added a Start node connected to ${g.addStart.targets.length} entry step(s).`})}if(g.addFinish){let a=j("finish",h);for(let b of(h.add(a),d.push({key:a,type:"finish"}),g.addFinish.sources))e.push({from:b,to:a});c.push({code:"auto-added-finish",message:`Added a Finish node connected from ${g.addFinish.sources.length} final step(s).`})}return{...b,nodes:d,edges:e}}(a,b),changes:b}}function l(a){return a.data?.type??a.type??"unknown"}function m(a){var b,c;let f=(a?.nodes??[]).map(a=>({...a,position:{...a.position??{x:0,y:0}},data:{...a.data}})),g=[...a?.edges??[]],h={...a,nodes:f,edges:g},j=[],k=i(f.filter(a=>"mcp"!==l(a)&&"resource"!==l(a)).map(a=>({id:a.id,type:l(a),x:a.position?.x??0,y:a.position?.y??0})),g.filter(a=>!function(a){let b=a.data?.edgeType;return"mcp"===b||"resource"===b}(a)).map(a=>({from:a.source,to:a.target,bidirectional:a.data?.bidirectional===!0}))),m=new Map(f.map(a=>[a.id,a])),o=(a,b,c)=>{let d=m.get(a),f=m.get(b);d&&f&&g.push((0,e.pX)(d,f,c))};for(let a of k.addEdges)o(a.from,a.to,a.bidirectional),j.push({code:a.reason,message:n(a.reason),nodeId:a.to});if(k.addStart){let a=k.addStart.targets.map(a=>m.get(a)).filter(Boolean).reduce((a,b)=>!a||b.position.y<a.position.y?b:a,null),c=(b={x:a?.position.x??250,y:(a?.position.y??150)-150},{id:(0,d.A)(),type:"start",position:b,data:{label:"Start Node",type:"start",properties:{promptTemplate:""}}});for(let a of(f.unshift(c),m.set(c.id,c),k.addStart.targets))o(c.id,a,!1);j.push({code:"auto-added-start",message:`Added a Start node connected to ${k.addStart.targets.length} entry step(s).`,nodeId:c.id})}if(k.addFinish){let a=k.addFinish.sources.map(a=>m.get(a)).filter(Boolean).reduce((a,b)=>!a||b.position.y>a.position.y?b:a,null),b=(c={x:a?.position.x??250,y:(a?.position.y??0)+150},{id:(0,d.A)(),type:"finish",position:c,data:{label:"Finish Node",type:"finish",properties:{}}});for(let a of(f.push(b),m.set(b.id,b),k.addFinish.sources))o(a,b.id,!1);j.push({code:"auto-added-finish",message:`Added a Finish node connected from ${k.addFinish.sources.length} final step(s).`,nodeId:b.id})}return{flow:h,changes:j}}function n(a){switch(a){case"auto-connected":return"Connected a disconnected step into the flow.";case"auto-bidirectional-subflow":return"Wired a parallel subflow with a two-way handoff to its orchestrator.";case"auto-added-start":return"Added a Start node.";case"auto-added-finish":return"Added a Finish node."}}},9312:(a,b,c)=>{c.d(b,{RB:()=>l,bD:()=>i,jY:()=>k,xv:()=>j});var d=c(50846),e=c(20433),f=c(60453),g=c(87821);let h=(0,d.h)("backend/services/flow/generationContext"),i=300;function j(a,b){let c=String(a).replace(/\s+/g," ").trim();return c.length<=b?c:`${c.slice(0,b).trimEnd()}…`}async function k(){let a=await e.modelService.loadModels(),b=a.map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:j(a.description,100)}:{}})),c=[],d={};try{let a=await f.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a){if(b.disabled)continue;let a=!1;try{let c=await f.mcpService.getServerStatus(b.name);a=c?.status==="connected"}catch(a){h.debug(`getServerStatus failed for ${b.name}; listing name only`,a)}if(!a){c.push({name:b.name,connected:!1});continue}let{tools:e}=await f.mcpService.listServerTools(b.name),g=(e??[]).filter(a=>a.name).map(a=>({name:a.name,...a.description?{description:j(a.description,100)}:{}}));d[b.name]=g.map(a=>a.name),c.push({name:b.name,connected:!0,tools:g})}}catch(a){h.warn("Could not load MCP servers for the authoring context",a)}let k=[];try{k=await g.flowService.loadFlows()}catch(a){h.warn("Could not load flows for the authoring context",a)}let l={models:b,servers:c,flows:k.map(a=>({id:a.id,name:a.name,...a.description?{description:j(a.description,i)}:{},nodeCount:a.nodes?.length??0}))};return{blocks:l,compile:{models:a.map(a=>({id:a.id,name:a.name,displayName:a.displayName})),servers:c.map(a=>({name:a.name})),serverTools:d,flows:k.map(a=>({id:a.id,name:a.name}))},catalog:function(a){let b=[];for(let c of(b.push("AVAILABLE MODELS (reference by id or name):"),0===a.models.length&&b.push(" (none configured)"),a.models)){let a=c.displayName&&c.displayName!==c.name?`"${c.displayName}" (${c.name})`:c.name,d=c.description?` — ${c.description}`:"";b.push(` - id: ${c.id} — ${a}${d}`)}for(let c of(b.push("",'AVAILABLE MCP SERVERS (attach to process nodes via "servers"):'),0===a.servers.length&&b.push(" (none configured)"),a.servers)){if(!c.connected){b.push(` - ${c.name} (offline — tools unknown; may still be used)`);continue}b.push(` - ${c.name}:`);let a=(c.tools??[]).slice(0,20);for(let c of a){let a=c.description?` — ${c.description}`:"";b.push(` - ${c.name}${a}`)}let d=(c.tools?.length??0)-a.length;d>0&&b.push(` - …and ${d} more`)}for(let c of(b.push("",'EXISTING FLOWS (usable as subflow targets via "flow"):'),0===a.flows.length&&b.push(" (none)"),a.flows.slice(0,15))){let a=c.description?` — ${c.description}`:` — ${c.nodeCount} nodes`;b.push(` - "${c.name}"${a}`)}return a.flows.length>15&&b.push(` - …and ${a.flows.length-15} more`),b.join("\n")}(l),validatorServers:c.map(a=>({name:a.name,status:a.connected?"connected":"disconnected"}))}}function l(a,b){let c=[...a.map(a=>({severity:a.severity,code:a.code,message:a.message})),...b.issues],d=c.filter(a=>"error"===a.severity).length;return{issues:c,errorCount:d,warningCount:c.length-d,isRunnable:0===d}}},97630:(a,b,c)=>{c.d(b,{Jt:()=>m,Mr:()=>n,oW:()=>o});var d=c(81226),e=c(5248),f=c(84671),g=c(41527);let h=["prompt","isolatedPrompt","payloadTemplate"];function i(a){return RegExp("\\$\\{var:\\s*"+a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"\\s*\\}","g")}function j(a,b){for(let c of h){let d=a[c];"string"==typeof d&&(a[c]=b(d))}Array.isArray(a.spawnBriefs)&&(a.spawnBriefs=a.spawnBriefs.map(a=>"string"==typeof a?b(a):a))}function k(a){return a.replace(/[ \t]{2,}/g," ").replace(/[ \t]+([.,;:!?])/g,"$1").replace(/[ \t]+\n/g,"\n")}var l=c(9312);let m=2,n=`GENERATED-FLOW PROCESS INPUT POLICY: every process node receives the full conversation. Use inputMode "full-history" or leave inputMode unset; NEVER emit inputMode "latest-message" on a process node. Generated process nodes that omit inputMode, or incorrectly request "latest-message", are deterministically compiled as "full-history". The advanced "isolated" mode remains available only when the task genuinely requires ignoring conversation history.
|
|
2
|
+
|
|
3
|
+
GENERATED-FLOW OUTPUT DEFAULT (context saving): process nodes you leave without an explicit outputMode are compiled with outputMode "latest-message", so later steps see the node's final response but not its tool calls/results. When later steps need that intermediate work, set outputMode "full-conversation" explicitly.
|
|
4
|
+
|
|
5
|
+
GENERATED-FLOW DATA-FLOW POLICY (IMPORTANT — carry data through the conversation, NOT scratchpad variables):
|
|
6
|
+
1. PREFER CONVERSATION HISTORY. Every process step receives full history. For a later step to use an earlier step's tool exchange, keep that exchange in the thread by giving the earlier (producer) step outputMode "full-conversation" (or leave "latest-message" when only its final text matters).
|
|
7
|
+
2. DO NOT emit \${var:NAME} in generated prompts. The scratchpad variable feature is valid for hand authoring, but unsafe for ordinary auto-generated handoff. Use history instead.
|
|
8
|
+
3. DO NOT emit passive "captureResource" on a process node. Process artifacts require an explicit Resource node and write_resource. Ordinary generated flows should use history.
|
|
9
|
+
4. Any unsafe \${var:NAME} reference is deterministically rewritten to history or removed before compilation.
|
|
10
|
+
|
|
11
|
+
FORGIVING GENERATION: missing Start/Finish nodes and obvious disconnected linear steps are repaired deterministically in author order before compilation. The complete bundle is compiled with generated-flow defaults and validated, including every inline nested flow.`;function o(a,b,c){let n=function(a){let b=[];try{!function a(b,c){if(b&&Array.isArray(b.nodes)){for(let d of(!function(a,b){let c=Array.isArray(a?.nodes)?a.nodes.filter(a=>a&&"string"==typeof a.key):[];if(0===c.length)return;let d=Array.isArray(a?.edges)?a.edges:[],e=new Map;for(let a of c)e.set(a.key,new Set);for(let a of d)a&&"string"==typeof a.from&&"string"==typeof a.to&&(e.has(a.to)&&e.get(a.to).add(a.from),a.bidirectional&&e.has(a.from)&&e.get(a.from).add(a.to));let f=a=>{let b=new Set,c=[...e.get(a)??[]];for(;c.length;){let d=c.pop();if(!b.has(d)&&d!==a)for(let a of(b.add(d),e.get(d)??[]))c.push(a)}return b},l=new Set;for(let a of c)"string"==typeof a.parallelFlowsVariable&&a.parallelFlowsVariable.trim()&&l.add(a.parallelFlowsVariable.trim());let m=new Map;for(let a of c){let b="string"==typeof a.captureVariable?a.captureVariable.trim():"";b&&(m.has(b)||m.set(b,[]),m.get(b).push(a))}let n=new Map;for(let a of c)for(let b of function(a){let b=new Set;for(let c of h){let d=a[c];if("string"==typeof d)for(let a of(0,g.T9)(d))b.add(a)}if(Array.isArray(a.spawnBriefs)){for(let c of a.spawnBriefs)if("string"==typeof c)for(let a of(0,g.T9)(c))b.add(a)}return[...b]}(a))n.has(b)||n.set(b,[]),n.get(b).push(a);for(let[a,d]of n){if(l.has(a))continue;let e=m.get(a)??[],g=d.filter(a=>{let b=f(a.key);return e.some(c=>c.key!==a.key&&b.has(c.key))});if(0===g.length){let d=i(a);for(let a of c)j(a,a=>k(a.replace(d,"")));b.push({code:"var-dangling",message:`Removed \${var:${a}} — no earlier step captures it (it would resolve to an empty string at run time).`});continue}let h=i(a);for(let a of c)j(a,a=>k(a.replace(h,"")));for(let a of g)a.inputMode="full-history";for(let b of e)b.captureVariable===a&&delete b.captureVariable;b.push({code:"var-history",message:`Removed scratchpad \${var:${a}} and set the reading step(s) to full-history so the value flows through the conversation instead.`})}}(b,c),b.nodes))if(d&&(d.subflowSpec&&a(d.subflowSpec,c),Array.isArray(d.parallelSubflowSpecs)))for(let b of d.parallelSubflowSpecs)a(b,c)}}(a,b)}catch{}return{spec:a,changes:b}}(JSON.parse(JSON.stringify(a))),o=(0,e.p)(n.spec),p=c?.maxDepth??m,q=c?.maxFlows??d.lk,r=(0,d.dM)(o.spec,b.compile,{maxDepth:p,maxFlows:q});if(!r.flow)return{success:!1,spec:o.spec,issues:r.issues,guardChanges:n.changes,repairChanges:o.changes};for(let a of r.flows)(0,d.Zn)(a);let s=r.flows.map(a=>({flow:a,validation:(0,f.nC)(a,{models:b.compile.models,servers:b.validatorServers,serverTools:b.compile.serverTools})})),t=[...n.changes.map(a=>({severity:"warning",code:a.code,message:a.message})),...o.changes.map(a=>({severity:"warning",code:a.code,message:a.message})),...r.issues],u=(0,l.RB)(t,{issues:s.flatMap(a=>a.validation.issues),errorCount:0,warningCount:0,isRunnable:!0});return{success:!0,spec:o.spec,flow:r.flow,flows:s,validation:u,guardChanges:n.changes,repairChanges:o.changes}}}};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
exports.id=7891,exports.ids=[7891],exports.modules={3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.
|
|
2
|
+
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.loadItem)(g.Z.GLOBAL_ENV_VARS,{}),e=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(d);j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i={},l=new Set;if(e)for(let[a,b]of Object.entries(d))i[a]=b.value,b.metadata.isSecret&&l.add(a);else i={...d};let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==i[b]){let e=i[b];if(!c&&(l.has(b)||e.startsWith("encrypted:")||e.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await n(d);return b}return a},o=await n(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(o,null,2)),j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"605caa1e030009a4bc7e820854ff481d3e0295325d",null),(0,d.A)(l,"4003ce37366709f5add0c98a6e32e47a1006fd7c7d",null),(0,d.A)(m,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},83868:(a,b,c)=>{"use strict";function d(a,b=200){return new Response(JSON.stringify(a),{status:b,headers:{"Content-Type":"application/json"}})}c.d(b,{P:()=>d})},91959:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>d.V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>d.resolveGlobalVars,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>d.G});var d=c(73456)},96487:()=>{}};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
exports.id=7993,exports.ids=[1925,3629,4306,6793,7993,9174],exports.modules={1925:(a,b,c)=>{"use strict";c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},3676:(a,b,c)=>{"use strict";c.d(b,{Wj:()=>h,ln:()=>g});var d=c(10641),e=c(58739);let f="encryption_locked";async function g(){return(0,e.isEncryptionLocked)()}async function h(a){return await g()?a?.openai?d.NextResponse.json({error:{message:"Encryption is locked. Unlock FLUJO to continue.",type:f,code:f,param:null}},{status:423}):d.NextResponse.json({error:f},{status:423}):null}},51669:(a,b)=>{"use strict";function c(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},56793:(a,b,c)=>{"use strict";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}},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.
|
|
2
|
+
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(b,"D",{enumerable:!0,get:function(){return c}})},56793:(a,b,c)=>{"use strict";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}},68633:(a,b,c)=>{"use strict";Object.defineProperty(b,"__esModule",{value:!0}),!function(a,b){for(var c in b)Object.defineProperty(a,c,{enumerable:!0,get:b[c]})}(b,{decryptActionBoundArgs:function(){return s},encryptActionBoundArgs:function(){return r}}),c(77925);let d=c(97954),e=c(27825),f=c(47686),g=c(77533),h=c(63033),i=c(26906),j=function(a){return a&&a.__esModule?a:{default:a}}(c(74515)),k=new TextEncoder,l=new TextDecoder,m=void 0,n=void 0;async function o(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=atob(b),e=d.slice(0,16),f=d.slice(16),h=l.decode(await (0,g.decrypt)(c,(0,g.stringToUint8Array)(e),(0,g.stringToUint8Array)(f)));if(!h.startsWith(a))throw Object.defineProperty(Error("Invalid Server Action payload: failed to decrypt."),"__NEXT_ERROR_CODE",{value:"E191",enumerable:!1,configurable:!0});return h.slice(a.length)}async function p(a,b){let c=await (0,g.getActionEncryptionKey)();if(void 0===c)throw Object.defineProperty(Error("Missing encryption key for Server Action. This is a bug in Next.js"),"__NEXT_ERROR_CODE",{value:"E65",enumerable:!1,configurable:!0});let d=new Uint8Array(16);h.workUnitAsyncStorage.exit(()=>crypto.getRandomValues(d));let e=(0,g.arrayBufferToString)(d.buffer),f=await (0,g.encrypt)(c,d,k.encode(a+b));return btoa(e+(0,g.arrayBufferToString)(f))}var q=function(a){return a[a.Ready=0]="Ready",a[a.Pending=1]="Pending",a[a.Complete=2]="Complete",a}(q||{});let r=j.default.cache(async function a(b,...c){let e=h.workUnitAsyncStorage.getStore(),j=e?(0,h.getCacheSignal)(e):void 0,{clientModules:k}=(0,g.getClientReferenceManifestForRsc)(),l=Error();Error.captureStackTrace(l,a);let n=!1,o=e?(0,i.createHangingInputAbortSignal)(e):void 0,q=0;function r(){0===q&&(q=1,null==j||j.beginRead())}function s(){1===q&&(null==j||j.endRead()),q=2}o&&j&&o.addEventListener("abort",r,{once:!0});let t=await (0,f.streamToString)((0,d.renderToReadableStream)(c,k,{filterStackFrame:m,signal:o,onError(a){(null==o||!o.aborted)&&(n||(n=!0,l.message=a instanceof Error?a.message:String(a)))}}),o);if(n)throw s(),l;if(!e)return p(b,t);r();let u=(0,h.getPrerenderResumeDataCache)(e),v=(0,h.getRenderResumeDataCache)(e),w=b+t,x=(null==u?void 0:u.encryptedBoundArgs.get(w))??(null==v?void 0:v.encryptedBoundArgs.get(w));if(x)return x;let y=await p(b,t);return s(),null==u||u.encryptedBoundArgs.set(w,y),y});async function s(a,b){let c,d=await b,f=h.workUnitAsyncStorage.getStore();if(f){let b=(0,h.getCacheSignal)(f),e=(0,h.getPrerenderResumeDataCache)(f),g=(0,h.getRenderResumeDataCache)(f);(c=(null==e?void 0:e.decryptedBoundArgs.get(d))??(null==g?void 0:g.decryptedBoundArgs.get(d)))||(null==b||b.beginRead(),c=await o(a,d),null==b||b.endRead(),null==e||e.decryptedBoundArgs.set(d,c))}else c=await o(a,d);let{edgeRscModuleMapping:i,rscModuleMapping:j}=(0,g.getClientReferenceManifestForRsc)();return await (0,e.createFromReadableStream)(new ReadableStream({start(a){switch(a.enqueue(k.encode(c)),null==f?void 0:f.type){case"prerender":case"prerender-runtime":f.renderSignal.aborted?a.close():f.renderSignal.addEventListener("abort",()=>a.close(),{once:!0});break;case"prerender-client":case"prerender-ppr":case"prerender-legacy":case"request":case"cache":case"private-cache":case"unstable-cache":case void 0:return a.close()}}}),{findSourceMapURL:n,serverConsumerManifest:{moduleLoading:null,moduleMap:j,serverModuleMap:(0,g.getServerModuleMap)()}})}},73456:(a,b,c)=>{"use strict";c.d(b,{G:()=>m,V:()=>l,resolveGlobalVars:()=>k});var d=c(75879);c(68633);var e=c(50846),f=c(92372),g=c(38844),h=c(58739),i=c(51669);let j=(0,e.h)("backend/utils/resolveGlobalVars");async function k(a,b={}){j.debug("Entering resolveGlobalVars method");let c=!1!==b.resolveSecrets,d=await (0,f.loadItem)(g.Z.GLOBAL_ENV_VARS,{}),e=function(a){if(!a||"object"!=typeof a)return!1;let b=Object.keys(a);if(0===b.length)return!0;let c=a[b[0]];return c&&"object"==typeof c&&"value"in c&&"metadata"in c&&"object"==typeof c.metadata&&"isSecret"in c.metadata}(d);j.debug(`Loaded ${Object.keys(d).length} global environment variables (${e?"new":"old"} format)`);let i={},l=new Set;if(e)for(let[a,b]of Object.entries(d))i[a]=b.value,b.metadata.isSecret&&l.add(a);else i={...d};let m=async a=>{let b=a.match(/\$\{global:([^}]+)\}/g);if(!b)return a;let d=a;for(let a of b){let b=a.substring(9,a.length-1);if(void 0!==i[b]){let e=i[b];if(!c&&(l.has(b)||e.startsWith("encrypted:")||e.startsWith("encrypted_failed:"))){j.debug(`Keeping secret global variable unresolved: ${b}`);continue}if(e.startsWith("encrypted:")){j.debug(`Decrypting encrypted global variable: ${b}`);try{let a=e.substring(10),c=await (0,h.decryptWithPassword)(a);if(c)e=c,j.debug(`Successfully decrypted global variable: ${b}`);else{j.warn(`Failed to decrypt global variable: ${b}`);continue}}catch(a){j.error(`Error decrypting global variable: ${b}`,a);continue}}else if(e.startsWith("encrypted_failed:")){j.warn(`Skipping failed encrypted global variable: ${b}`);continue}j.debug(`Resolved global variable: ${b}`),d=d.replace(a,e)}else j.warn(`Global variable not found: ${b}`)}return d},n=async a=>{if("string"==typeof a)return await m(a);if(Array.isArray(a))return await Promise.all(a.map(a=>n(a)));if(null!==a&&"object"==typeof a){let b={};for(let[c,d]of Object.entries(a))b[c]=await n(d);return b}return a},o=await n(a);return"object"==typeof a&&null!==a&&j.debug("Resolved global variables result:",JSON.stringify(o,null,2)),j.debug("Completed global variable resolution"),o}async function l(a){return k(a,{resolveSecrets:!1})}async function m(a,b=0){if(j.debug(`Entering resolveAndDecryptApiKey method (depth: ${b})`),!a)return j.warn("Empty value provided"),null;if(b>=10)return j.warn(`Maximum resolution depth reached (10) for value: ${a}`),a;let c=a;if(c.startsWith("encrypted:")){j.debug(`Decrypting encrypted value at depth ${b}`);try{let a=c.substring(10),d=await (0,h.decryptWithPassword)(a);if(!d)return j.warn(`Failed to decrypt value at depth ${b}`),null;j.debug(`Successfully decrypted value at depth ${b}`),j.verbose(d),c=d}catch(a){return j.error(`Error decrypting value at depth ${b}:`,a),null}}else c.startsWith("encrypted_failed:")&&(j.warn(`Skipping failed encrypted value at depth ${b}`),c=c.substring(17));if(c.includes("${global:")){j.debug(`Resolving global variables at depth ${b}`);try{let a=await k(c);if(j.verbose(a),a!==c)return j.debug(`Value changed after resolving globals at depth ${b}, processing recursively`),m(a,b+1);c=a}catch(a){return j.error(`Error resolving global variables at depth ${b}:`,a),null}}return j.debug(`Completed resolveAndDecryptApiKey at depth ${b}`),c}(0,i.D)([k,l,m]),(0,d.A)(k,"605caa1e030009a4bc7e820854ff481d3e0295325d",null),(0,d.A)(l,"4003ce37366709f5add0c98a6e32e47a1006fd7c7d",null),(0,d.A)(m,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987",null)},75879:(a,b,c)=>{"use strict";Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},78335:()=>{},91959:(a,b,c)=>{"use strict";c.r(b),c.d(b,{"4003ce37366709f5add0c98a6e32e47a1006fd7c7d":()=>d.V,"605caa1e030009a4bc7e820854ff481d3e0295325d":()=>d.resolveGlobalVars,"6061ed6d99a98b5d9f5d2d15065caab0a27d6a8987":()=>d.G});var d=c(73456)},96487:()=>{},97020:(a,b,c)=>{"use strict";c.d(b,{Af:()=>g,PK:()=>f,Pq:()=>e});var d=c(60453);function e(a,b=200){return new Response(JSON.stringify(a),{status:b,headers:{"Content-Type":"application/json"}})}function f(a){return"string"!=typeof a||0===a.length?"A non-empty server name is required":a.length>200?"Server name must be 200 characters or fewer":"."===a||".."===a?'Server name cannot be "." or ".."':/[/\\\x00-\x1f]/.test(a)?'Server name cannot contain "/", "\\", or control characters':null}async function g(a){let b=await d.mcpService.loadServerConfigs();return Array.isArray(b)?{config:b.find(b=>b.name===a)}:{error:b.error||"Failed to load server configs"}}}};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";exports.id=8284,exports.ids=[1925,3629,4306,6793,8284,9174],exports.modules={1925:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase()},23310:(a,b,c)=>{c.d(b,{GN:()=>x,UC:()=>z,Xg:()=>y});var d=c(50846),e=c(20433),f=c(53271),g=c(46496),h=c(81226),i=c(84671),j=c(88185),k=c(14265),l=c(1905),m=c(33233),n=c(9312),o=c(97630);let p=(0,d.h)("backend/services/flow/generateFlow"),q=o.Jt;function r(a,b,c,d){let e=c?`MULTI-LEVEL FLOWS — you MAY design subflows that are themselves brand-new flows:
|
|
2
|
+
- A subflow node normally references an EXISTING flow via "flow". To instead create a NEW child flow, use ONE of these on the subflow node (not "flow"):
|
|
3
|
+
- "subflowSpec": an inline nested FlowSpec (you author the whole child now), or
|
|
4
|
+
- "generateSubflow": a short natural-language description of the child — FLUJO will generate that child flow for you.
|
|
5
|
+
- Nest only when a self-contained sub-task genuinely deserves its own flow. Nesting is bounded: at most ${d} level(s) deep and ${h.lk} flows total. Keep it minimal.`:`SUBFLOWS: a subflow node's "flow" must reference an EXISTING flow (by name or id). Do NOT use "subflowSpec" or "generateSubflow" — multi-level generation is off for this run.`,f=b?`CAPABILITY ACQUISITION — you are allowed to EXPAND this FLUJO instance:
|
|
6
|
+
- If the task needs a capability none of the configured servers provides (voice, vision, browsing, email, code execution, …), use search_mcp_marketplace to find a server for it, then install_mcp_server to install the best match. Prefer servers that need no API keys (empty requiredEnv); if the best option needs keys, install a keyless alternative or note the requirement in the flow description.
|
|
7
|
+
- After a successful install, reference the returned server name in a process node's "servers" list and enable the tools it reported.
|
|
8
|
+
- Be ambitious: an actual capability (real audio, real browsing, real files) beats a text approximation. Search with several short terms ("voice", "tts", "speech") — the registry matches server NAMES only.`:`CAPABILITY DISCOVERY — you may search but NOT install:
|
|
9
|
+
- If the task needs a capability none of the configured servers provides, you may use search_mcp_marketplace to see what exists. Do NOT reference unconfigured servers in the spec; instead mention the recommended server (its registry name) in the flow "description" so the user can install it.`;return`You design workflows for FLUJO, an MCP-first workflow builder. The user describes what they want; you emit a flow specification as JSON.
|
|
10
|
+
|
|
11
|
+
OUTPUT FORMAT — when you are done (after any tool use), respond with ONLY one JSON object, no prose, no code fences.
|
|
12
|
+
|
|
13
|
+
${j.R}
|
|
14
|
+
|
|
15
|
+
${o.Mr}
|
|
16
|
+
|
|
17
|
+
${f}
|
|
18
|
+
|
|
19
|
+
${e}
|
|
20
|
+
|
|
21
|
+
${a}`}function s(a){return a.map(a=>`- [${a.severity}] ${a.message}`).join("\n")}function t(a){let b=[{type:"function",function:{name:"search_mcp_marketplace",description:'Search the public MCP server registry. The registry matches the query against server NAMES only (substring), so use short single terms ("voice", "tts", "browser") and try several. Returns name, description, whether FLUJO can install it, and which env vars/keys it requires.',parameters:{type:"object",properties:{query:{type:"string",description:"Short search term matched against server names."}},required:["query"]}}}];return a&&b.push({type:"function",function:{name:"install_mcp_server",description:"Install an MCP server from the registry (by the exact name returned by search) and connect it. Returns the server name to reference in the spec and the tools it provides — or needsEnv when required keys are missing (then pick an alternative or note it for the user). Installing can take a while (package download).",parameters:{type:"object",properties:{name:{type:"string",description:'Exact registry name from search results, e.g. "ai.keenable/web-search".'}},required:["name"]}}}),b}async function u(a,b,c,d){if("search_mcp_marketplace"===a){let a="string"==typeof b.query?b.query:"";try{return await (0,k.e3)(a)}catch(a){return{error:`Registry search failed: ${a instanceof Error?a.message:String(a)}`}}}if("install_mcp_server"===a){if(!c)return{error:"Installing is not allowed in this generation (allowInstall is off)."};let a="string"==typeof b.name?b.name:"",e=await (0,k.aM)(a,void 0,{resolveOnly:!0}),f=await (0,l.Ej)(),g=(0,m.e5)({caller:"generator",settings:f,registryName:a,allowInstall:c});e.plan&&await (0,l.NB)((0,m.UM)(e.plan,"generator",g,!1));let h=await (0,k.aM)(a);return h.plan&&await (0,l.NB)((0,m.UM)(h.plan,"generator",g,h.installed,h.error)),h.installed&&h.serverName&&(d.contextDirty=!0,d.installedServers.push({name:h.serverName,tools:(h.tools??[]).map(a=>a.name),...h.alreadyExisted?{alreadyExisted:!0}:{},...h.plan?.command?{command:h.plan.command}:{},...h.plan?.args?{args:h.plan.args}:{},...h.plan?.verificationStatus?{verificationStatus:h.plan.verificationStatus}:{}})),h}return{error:`Unknown tool: ${a}`}}async function v(a,b,c,d,e,f,h){let i={};for(let a of e){if("function"!==a.type)continue;let b=a.function.name;i[b]=a=>u(b,a,f,h)}for(let j=0;j<=8;j++){let k=e.length>0&&j<8,{completion:l}=await a.createCompletion({model:b,apiKey:c,messages:d,temperature:0,maxTokens:(0,g.normalizeMaxTokens)(b.maxTokens),...k?{tools:e,localToolExecutors:i}:{}}),m=l.choices?.[0]?.message,n=m?.tool_calls??[];if(0===n.length)return"string"==typeof m?.content?m.content:"";for(let a of(d.push({role:"assistant",content:m?.content??null,tool_calls:n}),n)){if("function"!==a.type)continue;let b={};try{b=JSON.parse(a.function.arguments||"{}")}catch{}p.info(`Generator tool call: ${a.function.name}(${a.function.arguments})`);let c=await u(a.function.name,b,f,h);d.push({role:"tool",tool_call_id:a.id,content:JSON.stringify(c)})}7===j&&d.push({role:"user",content:"Tool budget exhausted. Emit the COMPLETE flow specification now as a single JSON object using what you have."})}return""}function w(a){let b=a.indexOf("{");if(-1===b)return null;let c=0,d=!1,e=!1;for(let f=b;f<a.length;f++){let g=a[f];if(d){e?e=!1:"\\"===g?e=!0:'"'===g&&(d=!1);continue}if('"'===g)d=!0;else if("{"===g)c++;else if("}"===g&&0==--c)try{return JSON.parse(a.slice(b,f+1))}catch{break}}return null}async function x(a){var b;let c="string"==typeof a?.description?a.description.trim():"";if(!c)return{success:!1,error:"A flow description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let d=!0===a.allowInstall,g=!1!==a.allowSubflows,i=g?"number"!=typeof(b=a.maxDepth)||Number.isNaN(b)?q:Math.max(0,Math.min(h.A_,Math.floor(b))):0,j=await e.modelService.getModel(a.modelId);if(!j)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let k=await e.modelService.resolveAndDecryptApiKey(j.ApiKey)||("codex-cli"!==j.adapter||j.ApiKey?.trim()?null:"");if(null===k)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let l=await (0,n.jY)(),m=(0,f.getCompletionAdapter)(j),u=t(d),x={installedServers:[],contextDirty:!1},y=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),z=1;async function A(a,b){let c,e=[{role:"system",content:r(l.catalog,d,g&&b<i,i)},{role:"user",content:a}];try{c=await v(m,j,k,e,u,d,x)}catch(a){return p.warn("A child subflow generation call failed; leaving the subflow unresolved",a),null}let f=w(c);return f&&"object"==typeof f?f:null}async function B(a,b){if(a&&Array.isArray(a.nodes))for(let c of a.nodes){if(c?.type!=="subflow"||c.flow)continue;if(c.subflowSpec){await B(c.subflowSpec,b+1);continue}let a="string"==typeof c.generateSubflow?c.generateSubflow.trim():"";if(!a)continue;if(b+1>i||z>=h.lk){p.info(`Not expanding generateSubflow (depth ${b+1}, ${z} flows so far): budget/depth reached`);continue}let d=await A(a,b+1);d?(z++,c.subflowSpec=d,delete c.generateSubflow,await B(d,b+1)):delete c.generateSubflow}}let C=[{role:"system",content:r(l.catalog,d,g,i)},{role:"user",content:c}],D=null,E=0;for(let a=0;a<=y;a++){let b;E++,z=1;try{b=await v(m,j,k,C,u,d,x)}catch(a){if(p.error("Generator model call failed",a),D)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}let c=w(b);if(!c){if(p.warn(`Attempt ${E}: model output contained no parseable JSON object`),x.contextDirty){try{l=await (0,n.jY)()}catch(a){p.warn("Re-gathering context after install failed; keeping the stale catalog",a)}x.contextDirty=!1}C.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}if(g)try{await B(c,0)}catch(a){p.warn("Subflow expansion failed; compiling the root spec as-is",a)}if(x.contextDirty){try{l=await (0,n.jY)()}catch(a){p.warn("Re-gathering context after install failed; validating with the stale catalog",a)}x.contextDirty=!1}let e=(0,o.oW)(c,l,{maxDepth:i,maxFlows:h.lk});if(!e.success){C.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
|
|
22
|
+
${s(e.issues)}
|
|
23
|
+
Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}e.guardChanges.length>0&&p.info(`Attempt ${E}: scratchpad-var guard rewrote ${e.guardChanges.length} reference(s)`),e.repairChanges.length>0&&p.info(`Attempt ${E}: auto-repair adjusted the spec (${e.repairChanges.length} change(s))`);let f=e.validation;if(D={flows:e.flows,rootFlow:e.flow,validation:f},0===f.errorCount)break;p.info(`Attempt ${E}: bundle has ${f.errorCount} error(s)`+(a<y?"; asking the model to repair":"; repair budget exhausted")),a<y&&C.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
|
|
24
|
+
${s(f.issues)}
|
|
25
|
+
Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return D?(p.info(`Generated draft bundle rooted at "${D.rootFlow.name}" (${D.flows.length} flow(s)) in ${E} attempt(s): ${D.validation.errorCount} error(s), ${D.validation.warningCount} warning(s), ${x.installedServers.length} server(s) installed`),{success:!0,flow:D.rootFlow,validation:D.validation,flows:D.flows,rootFlowId:D.rootFlow.id,attempts:E,installedServers:x.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the description or a different generator model.",statusCode:422}}async function y(a){let b="string"==typeof a?.description?a.description.trim():"";if(!b)return{success:!1,error:"A change description is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A generator model id is required",statusCode:400};let c=a?.flow;if(!c||"object"!=typeof c||!Array.isArray(c.nodes)||!Array.isArray(c.edges))return{success:!1,error:"A valid flow to improve is required",statusCode:400};let d=(Array.isArray(a.relatedFlows)?a.relatedFlows:[]).filter(a=>!!a&&"object"==typeof a&&"string"==typeof a.id&&a.id!==c.id&&Array.isArray(a.nodes)&&Array.isArray(a.edges)).filter((a,b,c)=>c.findIndex(b=>b.id===a.id)===b),g=await e.modelService.getModel(a.modelId);if(!g)return{success:!1,error:`Generator model not found: ${a.modelId}`,statusCode:404};let j=await e.modelService.resolveAndDecryptApiKey(g.ApiKey)||("codex-cli"!==g.adapter||g.ApiKey?.trim()?null:"");if(null===j)return{success:!1,error:"Could not resolve the generator model API key",statusCode:500};let k=!0===a.allowInstall,l=await (0,n.jY)(),m=(0,f.getCompletionAdapter)(g),o=t(k),q={installedServers:[],contextDirty:!1},u=Math.min("number"==typeof a.maxRepairs&&a.maxRepairs>=0?a.maxRepairs:1,2),x=(0,h.FH)(c),y={};for(let a of c.nodes)a?.id&&a.position&&"number"==typeof a.position.x&&"number"==typeof a.position.y&&(y[a.id]={x:a.position.x,y:a.position.y});let z=a=>{let b=new Map((a.compile.flows??[]).filter(a=>a.id!==c.id).map(a=>[a.id,a]));for(let a of d)b.set(a.id,{id:a.id,name:a.name});return{models:a.compile.models,servers:a.compile.servers,serverTools:a.compile.serverTools,flows:[...b.values()]}},A=`EXISTING FLOW (modify this — keep unchanged parts intact, and KEEP each node's "key" for any node you do NOT restructure so its canvas position is preserved):
|
|
26
|
+
${JSON.stringify(x)}
|
|
27
|
+
|
|
28
|
+
CHANGE REQUEST:
|
|
29
|
+
${b}
|
|
30
|
+
|
|
31
|
+
Re-emit the COMPLETE flow specification as a single JSON object (only the JSON), including the nodes you did not change.`,B=[{role:"system",content:r(l.catalog,k,!1,0)},{role:"user",content:A}],C=null,D=0;for(let a=0;a<=u;a++){let b;D++;try{b=await v(m,g,j,B,o,k,q)}catch(a){if(p.error("Improver model call failed",a),C)break;return{success:!1,error:`The generator model call failed: ${a instanceof Error?a.message:String(a)}`,statusCode:502}}if(q.contextDirty){try{l=await (0,n.jY)()}catch(a){p.warn("Re-gathering context after install failed; using the stale catalog",a)}q.contextDirty=!1}let e=w(b);if(!e){p.warn(`Improve attempt ${D}: model output contained no parseable JSON object`),B.push({role:"assistant",content:b},{role:"user",content:"Your reply contained no parseable JSON object. Re-emit the COMPLETE flow specification as a single JSON object and nothing else."});continue}let f=(0,h.dM)(e,z(l),{maxDepth:0,maxFlows:1,positions:y});if(!f.flow){B.push({role:"assistant",content:b},{role:"user",content:`The specification could not be compiled:
|
|
32
|
+
${s(f.issues)}
|
|
33
|
+
Fix these problems and re-emit the COMPLETE corrected JSON (only the JSON).`});continue}f.flow.id=c.id,"string"==typeof e.name&&e.name.trim()||(f.flow.name=c.name),(0,h.Zn)(f.flow);let r=(0,i.nC)(f.flow,{models:l.compile.models,servers:l.validatorServers,serverTools:l.compile.serverTools}),t=(0,n.RB)(f.issues,r);if(C={flows:[...d.map(a=>({flow:a,validation:(0,i.nC)(a,{models:l.compile.models,servers:l.validatorServers,serverTools:l.compile.serverTools})})),{flow:f.flow,validation:r}],rootFlow:f.flow,validation:t},0===t.errorCount)break;p.info(`Improve attempt ${D}: flow has ${t.errorCount} error(s)`+(a<u?"; asking the model to repair":"; repair budget exhausted")),a<u&&B.push({role:"assistant",content:b},{role:"user",content:`The flow you specified has these problems:
|
|
34
|
+
${s(t.issues)}
|
|
35
|
+
Fix the errors (warnings are advisory) and re-emit the COMPLETE corrected JSON (only the JSON).`})}return C?(p.info(`Improved draft "${C.rootFlow.name}" in ${D} attempt(s): ${C.validation.errorCount} error(s), ${C.validation.warningCount} warning(s), ${q.installedServers.length} server(s) installed`),{success:!0,flow:C.rootFlow,validation:C.validation,flows:C.flows,rootFlowId:C.rootFlow.id,attempts:D,installedServers:q.installedServers}):{success:!1,error:"The model did not produce a usable flow specification. Try rephrasing the change request or a different generator model.",statusCode:422}}async function z(a){let b=a?.flow;if(!b||"object"!=typeof b||!Array.isArray(b.nodes)||!Array.isArray(b.edges))return{success:!1,error:"A valid flow to repair is required",statusCode:400};if(!a?.modelId||"string"!=typeof a.modelId)return{success:!1,error:"A repair model id is required",statusCode:400};let c=(0,i.nC)(b),d=c.issues.length>0?`
|
|
36
|
+
|
|
37
|
+
Known problems to fix:
|
|
38
|
+
${s(c.issues)}`:"";return y({flow:b,description:`Repair this flow's wiring so it is runnable, WITHOUT changing any node's prompt, model, or servers:
|
|
39
|
+
- add a Start node if one is missing, connected to the first step;
|
|
40
|
+
- add a Finish node if one is missing, connected from the last step;
|
|
41
|
+
- connect any disconnected process/subflow nodes.
|
|
42
|
+
Read node placement as intent: nodes stacked top-to-bottom are sequential steps, and nodes on the same horizontal line are parallel branches under a shared parent above them.${d}`,modelId:a.modelId,...void 0!==a.allowInstall?{allowInstall:a.allowInstall}:{},...void 0!==a.maxRepairs?{maxRepairs:a.maxRepairs}:{}})}},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}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=8387,exports.ids=[8387],exports.modules={5591:(a,b,c)=>{c.d(b,{bz:()=>q,cd:()=>n,wp:()=>m});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f),h=c(43326),i=c(92372),j=c(84653),k=c(7969);function l(a){return"string"==typeof a&&/^(1|true|yes|on)$/i.test(a.trim())}let m="FLUJO_ALLOW_PROTECTED_PATHS";async function n(){if(l(process.env[m]))return!1;try{let a=await (0,i.YM)(j.Z.SPEECH_SETTINGS,void 0);return a?.experimental?.protectedPathsEnabled===!0}catch{return!1}}let o=null;function p(a,...b){return e().resolve(a,...b)}function q(a){let b=e().resolve(a);if((function(){let a=[];try{a.push(e().resolve((0,h.getDataDir)()))}catch{}try{a.push(e().resolve(g().tmpdir()))}catch{}return a})().some(a=>(0,k.F)(a,b)))return{denied:!1};for(let a of function(){let a=l(process.env[m]),b=(0,h.getHomeDir)(),c=`${a?"off":"on"}::${b}`;if(o&&o.key===c)return o.paths;let d=a?[]:function(a){let b=[];if("win32"===process.platform)for(let c of["AppData","Downloads","Desktop","Documents","Pictures","Music","Videos","OneDrive"])b.push(p(a,c));else if("darwin"===process.platform){for(let c of["Downloads","Desktop","Documents","Pictures","Music","Movies"])b.push(p(a,c));for(let c of["Library/Mail","Library/Messages","Library/Safari","Library/Cookies","Library/Calendars","Library/Application Support/AddressBook","Library/Application Support/com.apple.TCC","Library/PersonalizationPortrait","Library/Metadata/CoreSpotlight","Library/Suggestions"])b.push(p(a,c));for(let a of["/.Spotlight-V100","/.fseventsd","/.DocumentRevisions-V100"])b.push(e().resolve(a))}else for(let c of["Documents","Downloads","Desktop",".ssh",".gnupg",".aws",".config"])b.push(p(a,c));return Array.from(new Set(b))}(b);return o={key:c,paths:d},d}())if((0,k.F)(a,b))return{denied:!0,matchedRoot:a};return{denied:!1}}},18387:(a,b,c)=>{c.d(b,{filesystemCallTool:()=>R,filesystemToolDefinitions:()=>w});var d=c(33873),e=c.n(d),f=c(29021),g=c(55511),h=c(4984),i=c.n(h),j=c(50846),k=c(43326),l=c(7658),m=c(7969),n=c(5591),o=c(10793);let p=(0,j.h)("backend/services/mcp/internal/filesystemTools"),q={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},r={readOnlyHint:!1,destructiveHint:!1,openWorldHint:!1},s={readOnlyHint:!1,destructiveHint:!0,openWorldHint:!1};function t(a){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],structuredContent:a}}function u(a){return{content:[{type:"text",text:JSON.stringify({error:a},null,2)}],isError:!0}}async function v(a,b){let c="string"==typeof a?a.trim():"";if(!c)throw Error('Provide "path".');let d=(0,k.getDataDir)(),f=e().isAbsolute(c)?e().resolve(c):e().resolve(d,c);if(await (0,n.cd)()){let a=(0,n.bz)(f);if(a.denied)throw Error(`Path "${f}" is within a protected location (${a.matchedRoot}) and is blocked by the FLUJO built-in server protected-path policy. Disable "Protect sensitive home-directory paths" in Experimental Features or set ${n.wp}=1 to override.`)}if(0===b.length||!b.some(a=>(0,m.F)(a,f)))throw Error(`Path "${f}" is outside the configured filesystem roots.`);return f}function w(){let a={type:"string",description:"File or directory path. Relative paths resolve against the FLUJO data directory; absolute paths are used as-is."};return[{name:"read_file",annotations:q,description:'Read a text file and return its content. Optionally read only a line range with "from"/"to" (1-based, inclusive). For large files (> 100 KB) read WHOLE (no "from"/"to"), a "pattern" is REQUIRED: the server greps the file and returns only matching lines (with a little surrounding context) so you can follow up with targeted "from"/"to" reads. Pass pattern "*" to force-read the entire large file anyway. Returns { path, from, to, totalLines, content, truncated, contentHash, matches? }. Pass the returned contentHash back as "expectedHash" on a follow-up edit_file/write_file to guard against the file changing in between (TOCTOU).',inputSchema:{type:"object",properties:{path:a,from:{type:"number",description:"Optional 1-based first line to return (inclusive)."},to:{type:"number",description:"Optional 1-based last line to return (inclusive)."},pattern:{type:"string",description:'Case-insensitive substring to grep for. Required to read a large file whole without a "from"/"to" range; matching lines (plus context) are returned instead of the full body. Use "*" to read the whole large file anyway.'}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},from:{type:"number"},to:{type:"number"},totalLines:{type:"number"},truncated:{type:"boolean"},content:{type:"string"},contentHash:{type:"string",description:'SHA-256 (hex) of the raw file content. Pass this back as "expectedHash" to edit_file/write_file to guard against the file changing between read and write (TOCTOU).'},matches:{type:"array",items:{type:"object",properties:{line:{type:"number"},text:{type:"string"}},required:["line","text"]}}},required:["path","from","to","totalLines","truncated","content"]}},{name:"write_file",annotations:s,description:'Create or write a text file (parent directories are created). "mode": "overwrite" (default) replaces the whole file, or a line range when "startLine"/"endLine" (1-based inclusive) are given; "append" adds content at the end; "insert" inserts content before "startLine". Optionally pass "expectedHash" (the contentHash from a prior read_file) to reject the write if the file changed on disk since it was read (TOCTOU guard); ignored for a whole-file overwrite. Returns { path, bytesWritten, mode, ... }.',_meta:{ui:{resourceUri:"ui://devcanvas/diff"}},inputSchema:{type:"object",properties:{path:a,content:{type:"string",description:"The content to write/insert/append."},mode:{type:"string",enum:["overwrite","append","insert"],description:'Write mode (default "overwrite").'},startLine:{type:"number",description:'For "insert": line to insert before. For "overwrite": first line of the range to replace (1-based).'},endLine:{type:"number",description:'For "overwrite": last line (inclusive, 1-based) of the range to replace.'},expectedHash:{type:"string",description:"Optional SHA-256 (contentHash from read_file). For append/insert/range-overwrite modes, the write is rejected if the file no longer hashes to this value (TOCTOU guard)."}},required:["path","content"]},outputSchema:{type:"object",properties:{path:{type:"string"},bytesWritten:{type:"number"},mode:{type:"string"},startLine:{type:"number"},endLine:{type:"number"},linesReplaced:{type:"number"},linesInserted:{type:"number"}},required:["path","bytesWritten","mode"]}},{name:"edit_file",annotations:s,description:'Edit a text file two ways (mutually exclusive): (1) "edits": [{ oldText, newText, startLine?, endLine? }] literal find/replace — each replaces the unique occurrence of oldText. startLine/endLine are an optional disambiguation HINT (if exactly one match starts in that range it wins); a wrong/missing range still works as long as oldText is unique in the file. Include enough surrounding context to make oldText unique. Or (2) "diff": a unified diff string ("@@ -a,b +c,d @@" hunks) applied atomically — hunks are relocated to where their context actually matches, so slightly-off @@ line numbers still apply, and CRLF files are handled. Fails with no partial write only when text is missing/ambiguous or a hunk context is not found. Optionally pass "expectedHash" (the contentHash from a prior read_file) to reject the edit if the file changed on disk since it was read (TOCTOU guard). Returns { path, editsApplied|applied, diff:{added,removed} }.',_meta:{ui:{resourceUri:"ui://devcanvas/diff"}},inputSchema:{type:"object",properties:{path:a,edits:{type:"array",description:"List of literal { oldText, newText } edits applied in order (optionally scoped with startLine/endLine).",items:{type:"object",properties:{oldText:{type:"string",description:"Exact text to find."},newText:{type:"string",description:"Replacement text."},startLine:{type:"number",description:"Optional 1-based first line to scope this edit to."},endLine:{type:"number",description:"Optional 1-based last line (inclusive) to scope this edit to."}},required:["oldText","newText"]}},diff:{type:"string",description:'A unified diff to apply atomically. Mutually exclusive with "edits".'},startLine:{type:"number",description:"Optional default 1-based first line to scope all literal edits to."},endLine:{type:"number",description:"Optional default 1-based last line (inclusive) to scope all literal edits to."},expectedHash:{type:"string",description:"Optional SHA-256 (contentHash from read_file). If provided and the freshly-read file no longer hashes to it, the edit is rejected with no changes written (TOCTOU guard)."}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},mode:{type:"string"},editsApplied:{type:"number"},applied:{type:"boolean"},diff:{type:"object",properties:{added:{type:"number"},removed:{type:"number"}},required:["added","removed"]}},required:["path","diff"]}},{name:"list_dir",annotations:q,description:'List the entries of a directory. Returns { path, entries: [{ name, type, size }] } where type is "file" | "directory" | "other".',inputSchema:{type:"object",properties:{path:a},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},entries:{type:"array",items:{type:"object",properties:{name:{type:"string"},type:{type:"string"},size:{type:"number"}},required:["name","type","size"]}}},required:["path","entries"]}},{name:"file_browser_ui",annotations:q,description:'Open an interactive file browser in the chat so the USER can pick a file. This returns IMMEDIATELY without a selection — the browser is shown to the user and the file they choose arrives afterwards as a follow-up user message (e.g. "Selected file: <path>"). After calling this tool you MUST stop and wait for that message; do not guess a path or continue until the user has selected.',_meta:{ui:{resourceUri:"ui://filesystem/browser"}},inputSchema:{type:"object",properties:{path:{...a,description:"Optional starting directory for the browser (defaults to the FLUJO data directory)."}},required:[]}},{name:"dir_tree",annotations:q,description:"Return a recursive, depth-limited directory tree as nested JSON. Returns { path, depth, tree }.",inputSchema:{type:"object",properties:{path:a,depth:{type:"number",description:"Maximum recursion depth (default 3, max 10)."}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},depth:{type:"number"},truncated:{type:"boolean"},tree:{type:"array"}},required:["path","depth","tree"]}},{name:"search",annotations:q,description:'Search a directory tree. Match file/dir NAMES against "namePattern" (substring, case-insensitive) and/or file CONTENT against "content" (substring, case-insensitive). Content search DOES look inside every text file, returning each matching line with its 1-based line number; likely-binary and very large files are skipped for speed. Returns { matches: [{ path, line?, text? }], truncated }.',inputSchema:{type:"object",properties:{path:a,namePattern:{type:"string",description:"Optional case-insensitive substring to match against entry names."},content:{type:"string",description:"Optional case-insensitive substring to match inside text files."}},required:["path"]},outputSchema:{type:"object",properties:{matches:{type:"array",items:{type:"object",properties:{path:{type:"string"},line:{type:"number"},text:{type:"string"}},required:["path"]}},truncated:{type:"boolean"}},required:["matches","truncated"]}},{name:"get_file_info",annotations:q,description:"Stat a path. Returns { path, type, size, isFile, isDirectory, createdAt, modifiedAt }.",inputSchema:{type:"object",properties:{path:a},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},type:{type:"string"},size:{type:"number"},isFile:{type:"boolean"},isDirectory:{type:"boolean"},createdAt:{type:"string"},modifiedAt:{type:"string"}},required:["path","type","size","isFile","isDirectory","createdAt","modifiedAt"]}},{name:"create_directory",annotations:r,description:"Create a directory (recursively). Succeeds if it already exists. Returns { path, created }.",inputSchema:{type:"object",properties:{path:a},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},created:{type:"boolean"}},required:["path","created"]}},{name:"move",annotations:s,description:'Move or rename a file/directory from "source" to "destination". Returns { source, destination }.',inputSchema:{type:"object",properties:{source:{type:"string",description:"Existing path to move."},destination:{type:"string",description:"Target path."}},required:["source","destination"]},outputSchema:{type:"object",properties:{source:{type:"string"},destination:{type:"string"}},required:["source","destination"]}},{name:"delete",annotations:s,description:'Delete a file or directory. Pass "recursive": true to remove a non-empty directory. Returns { path, deleted }.',inputSchema:{type:"object",properties:{path:a,recursive:{type:"boolean",description:"Remove directories and their contents recursively."}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},deleted:{type:"boolean"}},required:["path","deleted"]}},{name:"get_allowed_directories",annotations:q,description:"Returns the list of directories that this filesystem MCP server is currently allowed to access. The list is the merged result of server-level roots (configured via FLUJO MCP settings), MCP-node-level roots (set in the FlowBuilder), and the FLUJO_FS_ROOTS environment variable ceiling. When no roots are configured at all, returns the FLUJO data directory as the default (so the file browser is usable out of the box).",inputSchema:{type:"object",properties:{},required:[]},outputSchema:{type:"object",properties:{directories:{type:"array",items:{type:"string"},description:"Absolute paths of all allowed directories."}},required:["directories"]}}]}function x(a){return a.replace(/\r\n?/g,"\n").split("\n")}function y(a){return a.includes("\r\n")?"\r\n":"\n"}function z(a){return(0,g.createHash)("sha256").update(a,"utf8").digest("hex")}function A(a){return a.startsWith("\uFEFF")?{bom:"\uFEFF",body:a.slice(1)}:{bom:"",body:a}}let B="File changed after permission approval. Read it again before editing. No changes written.";function C(a){let b=Math.min(a.length,8e3);for(let c=0;c<b;c++)if(0===a[c])return!0;return!1}async function D(a,b,c){let d=b.toLowerCase(),e=[],g=!1,h=(0,f.createReadStream)(a,{encoding:"utf8"}),j=i().createInterface({input:h,crlfDelay:1/0}),k=0;try{for await(let a of j)if(k++,a.toLowerCase().includes(d)&&(e.push({line:k,text:a.slice(0,400)}),e.length>=c)){g=!0;break}}finally{j.close(),h.destroy()}return{matches:e,truncated:g}}async function E(a,b){let c=await v(a.path,b),d="number"==typeof a.from||"number"==typeof a.to,e="string"==typeof a.pattern?a.pattern.trim():"",g=0;try{g=(await f.promises.stat(c)).size}catch{}if(g>1e5&&!d&&!e)return u(`File is large (${g} bytes > 100000 threshold). Reading it whole would flood the context. Provide a "pattern" to grep for (matching lines + context are returned, then read targeted ranges with "from"/"to"), or pass pattern "*" to read the whole file anyway.`);if(e&&"*"!==e&&!d){let a=await f.promises.readFile(c);if(C(a))return u(`File appears to be binary; cannot grep for a pattern: ${c}`);let b=a.toString("utf8"),d=x(b),h=d.length,i=e.toLowerCase(),j=[];for(let a=0;a<d.length&&(!d[a].toLowerCase().includes(i)||(j.push({line:a+1,text:d[a].slice(0,400)}),!(j.length>=200)));a++);let k=j.length>=200,l=new Set;for(let a of j)for(let b=a.line-2;b<=a.line+2;b++)b>=1&&b<=h&&l.add(b);let m=[...l].sort((a,b)=>a-b),n=[],p=0;for(let a of m)p&&a>p+1&&n.push("…"),n.push(`${a}: ${d[a-1]}`),p=a;let q=n.join("\n");return q.length>2e5&&(q=q.slice(0,2e5)+"\n…[truncated]"),(0,o.Wk)(c,"read",g),t({path:c,from:1,to:h,totalLines:h,truncated:k,content:j.length?q:`(no lines matched pattern ${JSON.stringify(e)})`,matches:j,contentHash:z(b)})}let h=await f.promises.readFile(c,"utf8"),i=x(h),j=i.length,k="number"==typeof a.from?Math.max(1,Math.floor(a.from)):1,l="number"==typeof a.to?Math.floor(a.to):j;l<k&&([k,l]=[l,k]),l=Math.min(l,j);let m=d?i.slice(k-1,l).join("\n"):h,n=!1;return m.length>2e5&&(m=m.slice(0,2e5)+"\n…[truncated]",n=!0),(0,o.Wk)(c,"read",g),t({path:c,from:d?k:1,to:d?l:j,totalLines:j,truncated:n,content:m,contentHash:z(h)})}async function F(a,b){let c=await v(a.path,b),d="string"==typeof a.content?a.content:"",g="append"===a.mode||"insert"===a.mode?a.mode:"overwrite",h="number"==typeof a.startLine||"number"==typeof a.endLine;if(await f.promises.mkdir(e().dirname(c),{recursive:!0}),(0,o.Wk)(c,"write"),"overwrite"===g&&!h)return await f.promises.writeFile(c,d,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(d,"utf8"),mode:"overwrite"});let i="";try{i=await f.promises.readFile(c,"utf8")}catch{i=""}let j="string"==typeof a.expectedHash?a.expectedHash:void 0;if(j&&z(i)!==j)return u(B);let{bom:k,body:l}=A(i);if("append"===g){let a=!l.length||l.endsWith("\n")||l.endsWith("\r\n")?"":y(l),b=k+l+a+d;return await f.promises.writeFile(c,b,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(b,"utf8"),mode:"append"})}let m=y(l),n=l.length?l.split(/\r?\n/):[],p=d.split(/\r?\n/),q=n.length;if("insert"===g){let b="number"==typeof a.startLine?Math.max(1,Math.floor(a.startLine)):q+1,d=Math.min(b-1,q);n.splice(d,0,...p);let e=k+n.join(m);return await f.promises.writeFile(c,e,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(e,"utf8"),mode:"insert",startLine:b,linesInserted:p.length})}let r="number"==typeof a.startLine?Math.max(1,Math.floor(a.startLine)):1,s="number"==typeof a.endLine?Math.floor(a.endLine):r;s<r&&([r,s]=[s,r]);let w=Math.max(0,(s=Math.min(s,q))-r+1);n.splice(r-1,w,...p);let x=k+n.join(m);return await f.promises.writeFile(c,x,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(x,"utf8"),mode:"overwrite",startLine:r,endLine:s,linesReplaced:w})}async function G(a,b){let c=await v(a.path,b),d="string"==typeof a.diff&&a.diff.trim().length>0,e=Array.isArray(a.edits)&&a.edits.length>0;if(d&&e)return u('Provide either "diff" or "edits", not both.');let g=await f.promises.readFile(c,"utf8"),h="string"==typeof a.expectedHash?a.expectedHash:void 0;if(h&&z(g)!==h)return u(B);let{bom:i,body:j}=A(g);if(d){let b,d=y(j),e=j.replace(/\r\n?/g,"\n");try{b=function(a,b){let c=a.split("\n"),d=b.split(/\r?\n/),e=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/,f=[],g=null;for(let a=0;a<d.length;a++){let b=d[a];if(void 0===b)break;let c=e.exec(b);if(c){g={oldStart:parseInt(c[1],10),ops:[]},f.push(g);continue}if(b.startsWith("--- ")||b.startsWith("+++ ")){g=null;continue}if(!g)continue;let h=b.length?b[0]:" ",i=b.length?b.slice(1):"";if(" "===h||"-"===h||"+"===h)g.ops.push({tag:h,body:i});else if("\\"===h);else throw Error(`unexpected diff line: ${JSON.stringify(b)}`)}if(0===f.length)throw Error("no unified-diff hunks (@@ ... @@) found");let h=[],i=0,j=0,k=0;for(let a of f){let b=function(a,b,c,d){if(0===b.length)return Math.min(Math.max(c,d),a.length);let e=a.length-b.length,f=c=>{if(c<d||c>e)return!1;for(let d=0;d<b.length;d++)if(a[c+d]!==b[d])return!1;return!0},g=Math.max(d,c);if(f(g))return g;let h=Math.max(g-d,e-g);for(let a=1;a<=h;a++){if(f(g-a))return g-a;if(f(g+a))return g+a}throw Error(`could not locate hunk near line ${c+1}; its context/removed lines do not match the file. First expected line: ${JSON.stringify(b[0])}`)}(c,a.ops.filter(a=>" "===a.tag||"-"===a.tag).map(a=>a.body),Math.max(0,a.oldStart-1),i);if(b<i)throw Error("overlapping or out-of-order hunks");for(;i<b;)h.push(c[i]),i++;for(let b of a.ops)" "===b.tag?(h.push(c[i]),i++):"-"===b.tag?(i++,k++):(h.push(b.body),j++)}for(;i<c.length;)h.push(c[i]),i++;return{result:h.join("\n"),added:j,removed:k}}(e,a.diff)}catch(a){return u(`Diff apply failed: ${a instanceof Error?a.message:String(a)}. No changes written.`)}let g=i+("\r\n"===d?b.result.replace(/\n/g,"\r\n"):b.result);return await f.promises.writeFile(c,g,"utf8"),(0,o.Wk)(c,"write"),t({path:c,applied:!0,mode:"diff",diff:{added:b.added,removed:b.removed}})}let k=Array.isArray(a.edits)?a.edits:[];if(0===k.length)return u('Provide a non-empty "edits" array of { oldText, newText } or a "diff" string.');let l="number"==typeof a.startLine?a.startLine:void 0,m="number"==typeof a.endLine?a.endLine:void 0,n=y(j),p=j.replace(/\r\n?/g,"\n"),q=0;for(let a of k){let b="string"==typeof a.oldText?a.oldText.replace(/\r\n?/g,"\n"):"",d="string"==typeof a.newText?a.newText.replace(/\r\n?/g,"\n"):"";if(!b)return u(`Edit #${q+1} has an empty "oldText".`);let e="number"==typeof a.startLine?a.startLine:l,f="number"==typeof a.endLine?a.endLine:m,g=void 0!==e||void 0!==f,h=[];for(let a=p.indexOf(b);-1!==a;a=p.indexOf(b,a+1))h.push(a);if(0===h.length)return u(`Edit #${q+1}: "oldText" not found in ${c}. No changes written.`);let i=-1;if(g){let{lo:a,hi:b}=function(a,b,c){if(void 0===b&&void 0===c)return{lo:0,hi:a.length};let d=a.split("\n"),e=Math.max(1,Math.floor(b??1)),f=Math.min(d.length,Math.floor(c??d.length)),g=0;for(let a=0;a<e-1&&a<d.length;a++)g+=d[a].length+1;let h=g;for(let a=e-1;a<f&&a<d.length;a++)h+=d[a].length+ +(a<d.length-1);return{lo:g,hi:Math.max(g,h)}}(p,e,f),c=h.filter(c=>c>=a&&c<b);1===c.length&&(i=c[0])}if(-1===i)if(1!==h.length)return u(`Edit #${q+1}: "oldText" is ambiguous (appears ${h.length} times); add more surrounding context or a tighter startLine/endLine so exactly one occurrence is in range. No changes written.`);else i=h[0];p=p.slice(0,i)+d+p.slice(i+b.length),q+=1}let r=function(a,b){let c=x(a),d=x(b),e=new Map;for(let a of d)e.set(a,(e.get(a)??0)+1);let f=new Map;for(let a of c)f.set(a,(f.get(a)??0)+1);let g=0;for(let[a,b]of f)g+=Math.max(0,b-(e.get(a)??0));let h=0;for(let[a,b]of e)h+=Math.max(0,b-(f.get(a)??0));return{added:h,removed:g}}(j,p),s=i+("\r\n"===n?p.replace(/\n/g,"\r\n"):p);return await f.promises.writeFile(c,s,"utf8"),(0,o.Wk)(c,"write"),t({path:c,mode:"edits",editsApplied:q,diff:r})}async function H(a){try{let b=await f.promises.lstat(a);if(b.isFile())return"file";if(b.isDirectory())return"directory";return"other"}catch{return"other"}}async function I(a,b){let c=await v(a.path,b),d=await f.promises.readdir(c),g=await Promise.all(d.map(async a=>{let b=e().join(c,a),d=await H(b),g=0;try{g=(await f.promises.stat(b)).size}catch{}return{name:a,type:d,size:g}}));return g.sort((a,b)=>a.type===b.type?a.name.localeCompare(b.name):"directory"===a.type?-1:1),t({path:c,entries:g})}async function J(a,b){let c=await v(a.path,b),d=Math.min("number"==typeof a.depth?Math.max(1,Math.floor(a.depth)):3,10),g=0,h=!1;async function i(a,b){let c;if(b>d||h)return[];try{c=await f.promises.readdir(a)}catch{return[]}c.sort((a,b)=>a.localeCompare(b));let j=[];for(let f of c){if(++g>5e3){h=!0;break}let c=e().join(a,f),k=await H(c),l={name:f,type:k};"directory"===k&&b<d&&(l.children=await i(c,b+1)),j.push(l)}return j}let j=await i(c,1);return t({path:c,depth:d,truncated:h,tree:j})}async function K(a,b,c){let d;try{d=await f.promises.stat(a)}catch{return[]}if(!d.isFile()||d.size>5e6)return[];try{let b=await f.promises.open(a,"r");try{let a=Buffer.alloc(Math.min(8e3,d.size));if(a.length&&await b.read(a,0,a.length,0),C(a))return[]}finally{await b.close()}}catch{return[]}let{matches:e}=await D(a,b,Math.max(1,c));return e.map(b=>({path:a,line:b.line,text:b.text}))}async function L(a,b){let c=await v(a.path,b),d="string"==typeof a.namePattern?a.namePattern.toLowerCase():"",g="string"==typeof a.content?a.content:"";if(!d&&!g)return u('Provide "namePattern" and/or "content" to search for.');let h=[],i=!1,j=[];async function k(a){let b;if(!i){try{b=await f.promises.readdir(a)}catch{return}for(let c of b){if(i)return;let b=e().join(a,c),f=await H(b);if(d&&c.toLowerCase().includes(d)&&(h.push({path:b}),h.length>=1e3)){i=!0;return}"directory"===f?await k(b):"file"===f&&g&&j.push(b)}}}if(await k(c),g&&!i)for(let a=0;a<j.length&&!i;a+=16){let b=j.slice(a,a+16);for(let a of(await Promise.all(b.map(a=>K(a,g,1e3))))){for(let b of a)if(h.push(b),h.length>=1e3){i=!0;break}if(i)break}}return t({matches:h,truncated:i})}async function M(a,b){let c=await v(a.path,b),d=await f.promises.stat(c);return t({path:c,type:d.isFile()?"file":d.isDirectory()?"directory":"other",size:d.size,isFile:d.isFile(),isDirectory:d.isDirectory(),createdAt:d.birthtime.toISOString(),modifiedAt:d.mtime.toISOString()})}async function N(a,b){let c=await v(a.path,b);return await f.promises.mkdir(c,{recursive:!0}),t({path:c,created:!0})}async function O(a,b){let c=await v(a.source,b),d=await v(a.destination,b);return await f.promises.mkdir(e().dirname(d),{recursive:!0}),await f.promises.rename(c,d),t({source:c,destination:d})}async function P(a,b){let c=await v(a.path,b),d=!0===a.recursive;return await f.promises.rm(c,{recursive:d,force:!1}),t({path:c,deleted:!0})}async function Q(a){return t({directories:a})}async function R(a,b,c){try{if("file_browser_ui"===a)return function(a,b=!1){return{content:[{type:"text",text:a}],...b?{isError:!0}:{}}}("File browser shown to the user. Waiting for them to select a file — their choice will arrive as a follow-up message. Do not proceed until then.");let d=await (0,m.loadEffectiveRoots)(l.K3,"FLUJO_FS_ROOTS",c);switch(a){case"read_file":return await E(b,d);case"write_file":return await F(b,d);case"edit_file":return await G(b,d);case"list_dir":return await I(b,d);case"dir_tree":return await J(b,d);case"search":return await L(b,d);case"get_file_info":return await M(b,d);case"create_directory":return await N(b,d);case"move":return await O(b,d);case"delete":return await P(b,d);case"get_allowed_directories":return await Q(d);default:return u(`Unknown tool on the built-in filesystem server: ${a}`)}}catch(c){let b=c instanceof Error?c.message:String(c);return p.warn("filesystemCallTool failed",{toolName:a,err:c}),{isError:!0,content:[{type:"text",text:JSON.stringify({error:b})}],structuredContent:{error:b}}}}}};
|
|
1
|
+
"use strict";exports.id=8387,exports.ids=[8387],exports.modules={5591:(a,b,c)=>{c.d(b,{bz:()=>q,cd:()=>n,wp:()=>m});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f),h=c(43326),i=c(92372),j=c(84653),k=c(7969);function l(a){return"string"==typeof a&&/^(1|true|yes|on)$/i.test(a.trim())}let m="FLUJO_ALLOW_PROTECTED_PATHS";async function n(){if(l(process.env[m]))return!1;try{let a=await (0,i.loadItem)(j.Z.SPEECH_SETTINGS,void 0);return a?.experimental?.protectedPathsEnabled===!0}catch{return!1}}let o=null;function p(a,...b){return e().resolve(a,...b)}function q(a){let b=e().resolve(a);if((function(){let a=[];try{a.push(e().resolve((0,h.getDataDir)()))}catch{}try{a.push(e().resolve(g().tmpdir()))}catch{}return a})().some(a=>(0,k.F)(a,b)))return{denied:!1};for(let a of function(){let a=l(process.env[m]),b=(0,h.getHomeDir)(),c=`${a?"off":"on"}::${b}`;if(o&&o.key===c)return o.paths;let d=a?[]:function(a){let b=[];if("win32"===process.platform)for(let c of["AppData","Downloads","Desktop","Documents","Pictures","Music","Videos","OneDrive"])b.push(p(a,c));else if("darwin"===process.platform){for(let c of["Downloads","Desktop","Documents","Pictures","Music","Movies"])b.push(p(a,c));for(let c of["Library/Mail","Library/Messages","Library/Safari","Library/Cookies","Library/Calendars","Library/Application Support/AddressBook","Library/Application Support/com.apple.TCC","Library/PersonalizationPortrait","Library/Metadata/CoreSpotlight","Library/Suggestions"])b.push(p(a,c));for(let a of["/.Spotlight-V100","/.fseventsd","/.DocumentRevisions-V100"])b.push(e().resolve(a))}else for(let c of["Documents","Downloads","Desktop",".ssh",".gnupg",".aws",".config"])b.push(p(a,c));return Array.from(new Set(b))}(b);return o={key:c,paths:d},d}())if((0,k.F)(a,b))return{denied:!0,matchedRoot:a};return{denied:!1}}},18387:(a,b,c)=>{c.d(b,{filesystemCallTool:()=>R,filesystemToolDefinitions:()=>w});var d=c(33873),e=c.n(d),f=c(29021),g=c(55511),h=c(4984),i=c.n(h),j=c(50846),k=c(43326),l=c(7658),m=c(7969),n=c(5591),o=c(10793);let p=(0,j.h)("backend/services/mcp/internal/filesystemTools"),q={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},r={readOnlyHint:!1,destructiveHint:!1,openWorldHint:!1},s={readOnlyHint:!1,destructiveHint:!0,openWorldHint:!1};function t(a){return{content:[{type:"text",text:JSON.stringify(a,null,2)}],structuredContent:a}}function u(a){return{content:[{type:"text",text:JSON.stringify({error:a},null,2)}],isError:!0}}async function v(a,b){let c="string"==typeof a?a.trim():"";if(!c)throw Error('Provide "path".');let d=(0,k.getDataDir)(),f=e().isAbsolute(c)?e().resolve(c):e().resolve(d,c);if(await (0,n.cd)()){let a=(0,n.bz)(f);if(a.denied)throw Error(`Path "${f}" is within a protected location (${a.matchedRoot}) and is blocked by the FLUJO built-in server protected-path policy. Disable "Protect sensitive home-directory paths" in Experimental Features or set ${n.wp}=1 to override.`)}if(0===b.length||!b.some(a=>(0,m.F)(a,f)))throw Error(`Path "${f}" is outside the configured filesystem roots.`);return f}function w(){let a={type:"string",description:"File or directory path. Relative paths resolve against the FLUJO data directory; absolute paths are used as-is."};return[{name:"read_file",annotations:q,description:'Read a text file and return its content. Optionally read only a line range with "from"/"to" (1-based, inclusive). For large files (> 100 KB) read WHOLE (no "from"/"to"), a "pattern" is REQUIRED: the server greps the file and returns only matching lines (with a little surrounding context) so you can follow up with targeted "from"/"to" reads. Pass pattern "*" to force-read the entire large file anyway. Returns { path, from, to, totalLines, content, truncated, contentHash, matches? }. Pass the returned contentHash back as "expectedHash" on a follow-up edit_file/write_file to guard against the file changing in between (TOCTOU).',inputSchema:{type:"object",properties:{path:a,from:{type:"number",description:"Optional 1-based first line to return (inclusive)."},to:{type:"number",description:"Optional 1-based last line to return (inclusive)."},pattern:{type:"string",description:'Case-insensitive substring to grep for. Required to read a large file whole without a "from"/"to" range; matching lines (plus context) are returned instead of the full body. Use "*" to read the whole large file anyway.'}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},from:{type:"number"},to:{type:"number"},totalLines:{type:"number"},truncated:{type:"boolean"},content:{type:"string"},contentHash:{type:"string",description:'SHA-256 (hex) of the raw file content. Pass this back as "expectedHash" to edit_file/write_file to guard against the file changing between read and write (TOCTOU).'},matches:{type:"array",items:{type:"object",properties:{line:{type:"number"},text:{type:"string"}},required:["line","text"]}}},required:["path","from","to","totalLines","truncated","content"]}},{name:"write_file",annotations:s,description:'Create or write a text file (parent directories are created). "mode": "overwrite" (default) replaces the whole file, or a line range when "startLine"/"endLine" (1-based inclusive) are given; "append" adds content at the end; "insert" inserts content before "startLine". Optionally pass "expectedHash" (the contentHash from a prior read_file) to reject the write if the file changed on disk since it was read (TOCTOU guard); ignored for a whole-file overwrite. Returns { path, bytesWritten, mode, ... }.',_meta:{ui:{resourceUri:"ui://devcanvas/diff"}},inputSchema:{type:"object",properties:{path:a,content:{type:"string",description:"The content to write/insert/append."},mode:{type:"string",enum:["overwrite","append","insert"],description:'Write mode (default "overwrite").'},startLine:{type:"number",description:'For "insert": line to insert before. For "overwrite": first line of the range to replace (1-based).'},endLine:{type:"number",description:'For "overwrite": last line (inclusive, 1-based) of the range to replace.'},expectedHash:{type:"string",description:"Optional SHA-256 (contentHash from read_file). For append/insert/range-overwrite modes, the write is rejected if the file no longer hashes to this value (TOCTOU guard)."}},required:["path","content"]},outputSchema:{type:"object",properties:{path:{type:"string"},bytesWritten:{type:"number"},mode:{type:"string"},startLine:{type:"number"},endLine:{type:"number"},linesReplaced:{type:"number"},linesInserted:{type:"number"}},required:["path","bytesWritten","mode"]}},{name:"edit_file",annotations:s,description:'Edit a text file two ways (mutually exclusive): (1) "edits": [{ oldText, newText, startLine?, endLine? }] literal find/replace — each replaces the unique occurrence of oldText. startLine/endLine are an optional disambiguation HINT (if exactly one match starts in that range it wins); a wrong/missing range still works as long as oldText is unique in the file. Include enough surrounding context to make oldText unique. Or (2) "diff": a unified diff string ("@@ -a,b +c,d @@" hunks) applied atomically — hunks are relocated to where their context actually matches, so slightly-off @@ line numbers still apply, and CRLF files are handled. Fails with no partial write only when text is missing/ambiguous or a hunk context is not found. Optionally pass "expectedHash" (the contentHash from a prior read_file) to reject the edit if the file changed on disk since it was read (TOCTOU guard). Returns { path, editsApplied|applied, diff:{added,removed} }.',_meta:{ui:{resourceUri:"ui://devcanvas/diff"}},inputSchema:{type:"object",properties:{path:a,edits:{type:"array",description:"List of literal { oldText, newText } edits applied in order (optionally scoped with startLine/endLine).",items:{type:"object",properties:{oldText:{type:"string",description:"Exact text to find."},newText:{type:"string",description:"Replacement text."},startLine:{type:"number",description:"Optional 1-based first line to scope this edit to."},endLine:{type:"number",description:"Optional 1-based last line (inclusive) to scope this edit to."}},required:["oldText","newText"]}},diff:{type:"string",description:'A unified diff to apply atomically. Mutually exclusive with "edits".'},startLine:{type:"number",description:"Optional default 1-based first line to scope all literal edits to."},endLine:{type:"number",description:"Optional default 1-based last line (inclusive) to scope all literal edits to."},expectedHash:{type:"string",description:"Optional SHA-256 (contentHash from read_file). If provided and the freshly-read file no longer hashes to it, the edit is rejected with no changes written (TOCTOU guard)."}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},mode:{type:"string"},editsApplied:{type:"number"},applied:{type:"boolean"},diff:{type:"object",properties:{added:{type:"number"},removed:{type:"number"}},required:["added","removed"]}},required:["path","diff"]}},{name:"list_dir",annotations:q,description:'List the entries of a directory. Returns { path, entries: [{ name, type, size }] } where type is "file" | "directory" | "other".',inputSchema:{type:"object",properties:{path:a},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},entries:{type:"array",items:{type:"object",properties:{name:{type:"string"},type:{type:"string"},size:{type:"number"}},required:["name","type","size"]}}},required:["path","entries"]}},{name:"file_browser_ui",annotations:q,description:'Open an interactive file browser in the chat so the USER can pick a file. This returns IMMEDIATELY without a selection — the browser is shown to the user and the file they choose arrives afterwards as a follow-up user message (e.g. "Selected file: <path>"). After calling this tool you MUST stop and wait for that message; do not guess a path or continue until the user has selected.',_meta:{ui:{resourceUri:"ui://filesystem/browser"}},inputSchema:{type:"object",properties:{path:{...a,description:"Optional starting directory for the browser (defaults to the FLUJO data directory)."}},required:[]}},{name:"dir_tree",annotations:q,description:"Return a recursive, depth-limited directory tree as nested JSON. Returns { path, depth, tree }.",inputSchema:{type:"object",properties:{path:a,depth:{type:"number",description:"Maximum recursion depth (default 3, max 10)."}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},depth:{type:"number"},truncated:{type:"boolean"},tree:{type:"array"}},required:["path","depth","tree"]}},{name:"search",annotations:q,description:'Search a directory tree. Match file/dir NAMES against "namePattern" (substring, case-insensitive) and/or file CONTENT against "content" (substring, case-insensitive). Content search DOES look inside every text file, returning each matching line with its 1-based line number; likely-binary and very large files are skipped for speed. Returns { matches: [{ path, line?, text? }], truncated }.',inputSchema:{type:"object",properties:{path:a,namePattern:{type:"string",description:"Optional case-insensitive substring to match against entry names."},content:{type:"string",description:"Optional case-insensitive substring to match inside text files."}},required:["path"]},outputSchema:{type:"object",properties:{matches:{type:"array",items:{type:"object",properties:{path:{type:"string"},line:{type:"number"},text:{type:"string"}},required:["path"]}},truncated:{type:"boolean"}},required:["matches","truncated"]}},{name:"get_file_info",annotations:q,description:"Stat a path. Returns { path, type, size, isFile, isDirectory, createdAt, modifiedAt }.",inputSchema:{type:"object",properties:{path:a},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},type:{type:"string"},size:{type:"number"},isFile:{type:"boolean"},isDirectory:{type:"boolean"},createdAt:{type:"string"},modifiedAt:{type:"string"}},required:["path","type","size","isFile","isDirectory","createdAt","modifiedAt"]}},{name:"create_directory",annotations:r,description:"Create a directory (recursively). Succeeds if it already exists. Returns { path, created }.",inputSchema:{type:"object",properties:{path:a},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},created:{type:"boolean"}},required:["path","created"]}},{name:"move",annotations:s,description:'Move or rename a file/directory from "source" to "destination". Returns { source, destination }.',inputSchema:{type:"object",properties:{source:{type:"string",description:"Existing path to move."},destination:{type:"string",description:"Target path."}},required:["source","destination"]},outputSchema:{type:"object",properties:{source:{type:"string"},destination:{type:"string"}},required:["source","destination"]}},{name:"delete",annotations:s,description:'Delete a file or directory. Pass "recursive": true to remove a non-empty directory. Returns { path, deleted }.',inputSchema:{type:"object",properties:{path:a,recursive:{type:"boolean",description:"Remove directories and their contents recursively."}},required:["path"]},outputSchema:{type:"object",properties:{path:{type:"string"},deleted:{type:"boolean"}},required:["path","deleted"]}},{name:"get_allowed_directories",annotations:q,description:"Returns the list of directories that this filesystem MCP server is currently allowed to access. The list is the merged result of server-level roots (configured via FLUJO MCP settings), MCP-node-level roots (set in the FlowBuilder), and the FLUJO_FS_ROOTS environment variable ceiling. When no roots are configured at all, returns the FLUJO data directory as the default (so the file browser is usable out of the box).",inputSchema:{type:"object",properties:{},required:[]},outputSchema:{type:"object",properties:{directories:{type:"array",items:{type:"string"},description:"Absolute paths of all allowed directories."}},required:["directories"]}}]}function x(a){return a.replace(/\r\n?/g,"\n").split("\n")}function y(a){return a.includes("\r\n")?"\r\n":"\n"}function z(a){return(0,g.createHash)("sha256").update(a,"utf8").digest("hex")}function A(a){return a.startsWith("\uFEFF")?{bom:"\uFEFF",body:a.slice(1)}:{bom:"",body:a}}let B="File changed after permission approval. Read it again before editing. No changes written.";function C(a){let b=Math.min(a.length,8e3);for(let c=0;c<b;c++)if(0===a[c])return!0;return!1}async function D(a,b,c){let d=b.toLowerCase(),e=[],g=!1,h=(0,f.createReadStream)(a,{encoding:"utf8"}),j=i().createInterface({input:h,crlfDelay:1/0}),k=0;try{for await(let a of j)if(k++,a.toLowerCase().includes(d)&&(e.push({line:k,text:a.slice(0,400)}),e.length>=c)){g=!0;break}}finally{j.close(),h.destroy()}return{matches:e,truncated:g}}async function E(a,b){let c=await v(a.path,b),d="number"==typeof a.from||"number"==typeof a.to,e="string"==typeof a.pattern?a.pattern.trim():"",g=0;try{g=(await f.promises.stat(c)).size}catch{}if(g>1e5&&!d&&!e)return u(`File is large (${g} bytes > 100000 threshold). Reading it whole would flood the context. Provide a "pattern" to grep for (matching lines + context are returned, then read targeted ranges with "from"/"to"), or pass pattern "*" to read the whole file anyway.`);if(e&&"*"!==e&&!d){let a=await f.promises.readFile(c);if(C(a))return u(`File appears to be binary; cannot grep for a pattern: ${c}`);let b=a.toString("utf8"),d=x(b),h=d.length,i=e.toLowerCase(),j=[];for(let a=0;a<d.length&&(!d[a].toLowerCase().includes(i)||(j.push({line:a+1,text:d[a].slice(0,400)}),!(j.length>=200)));a++);let k=j.length>=200,l=new Set;for(let a of j)for(let b=a.line-2;b<=a.line+2;b++)b>=1&&b<=h&&l.add(b);let m=[...l].sort((a,b)=>a-b),n=[],p=0;for(let a of m)p&&a>p+1&&n.push("…"),n.push(`${a}: ${d[a-1]}`),p=a;let q=n.join("\n");return q.length>2e5&&(q=q.slice(0,2e5)+"\n…[truncated]"),(0,o.Wk)(c,"read",g),t({path:c,from:1,to:h,totalLines:h,truncated:k,content:j.length?q:`(no lines matched pattern ${JSON.stringify(e)})`,matches:j,contentHash:z(b)})}let h=await f.promises.readFile(c,"utf8"),i=x(h),j=i.length,k="number"==typeof a.from?Math.max(1,Math.floor(a.from)):1,l="number"==typeof a.to?Math.floor(a.to):j;l<k&&([k,l]=[l,k]),l=Math.min(l,j);let m=d?i.slice(k-1,l).join("\n"):h,n=!1;return m.length>2e5&&(m=m.slice(0,2e5)+"\n…[truncated]",n=!0),(0,o.Wk)(c,"read",g),t({path:c,from:d?k:1,to:d?l:j,totalLines:j,truncated:n,content:m,contentHash:z(h)})}async function F(a,b){let c=await v(a.path,b),d="string"==typeof a.content?a.content:"",g="append"===a.mode||"insert"===a.mode?a.mode:"overwrite",h="number"==typeof a.startLine||"number"==typeof a.endLine;if(await f.promises.mkdir(e().dirname(c),{recursive:!0}),(0,o.Wk)(c,"write"),"overwrite"===g&&!h)return await f.promises.writeFile(c,d,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(d,"utf8"),mode:"overwrite"});let i="";try{i=await f.promises.readFile(c,"utf8")}catch{i=""}let j="string"==typeof a.expectedHash?a.expectedHash:void 0;if(j&&z(i)!==j)return u(B);let{bom:k,body:l}=A(i);if("append"===g){let a=!l.length||l.endsWith("\n")||l.endsWith("\r\n")?"":y(l),b=k+l+a+d;return await f.promises.writeFile(c,b,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(b,"utf8"),mode:"append"})}let m=y(l),n=l.length?l.split(/\r?\n/):[],p=d.split(/\r?\n/),q=n.length;if("insert"===g){let b="number"==typeof a.startLine?Math.max(1,Math.floor(a.startLine)):q+1,d=Math.min(b-1,q);n.splice(d,0,...p);let e=k+n.join(m);return await f.promises.writeFile(c,e,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(e,"utf8"),mode:"insert",startLine:b,linesInserted:p.length})}let r="number"==typeof a.startLine?Math.max(1,Math.floor(a.startLine)):1,s="number"==typeof a.endLine?Math.floor(a.endLine):r;s<r&&([r,s]=[s,r]);let w=Math.max(0,(s=Math.min(s,q))-r+1);n.splice(r-1,w,...p);let x=k+n.join(m);return await f.promises.writeFile(c,x,"utf8"),t({path:c,bytesWritten:Buffer.byteLength(x,"utf8"),mode:"overwrite",startLine:r,endLine:s,linesReplaced:w})}async function G(a,b){let c=await v(a.path,b),d="string"==typeof a.diff&&a.diff.trim().length>0,e=Array.isArray(a.edits)&&a.edits.length>0;if(d&&e)return u('Provide either "diff" or "edits", not both.');let g=await f.promises.readFile(c,"utf8"),h="string"==typeof a.expectedHash?a.expectedHash:void 0;if(h&&z(g)!==h)return u(B);let{bom:i,body:j}=A(g);if(d){let b,d=y(j),e=j.replace(/\r\n?/g,"\n");try{b=function(a,b){let c=a.split("\n"),d=b.split(/\r?\n/),e=/^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/,f=[],g=null;for(let a=0;a<d.length;a++){let b=d[a];if(void 0===b)break;let c=e.exec(b);if(c){g={oldStart:parseInt(c[1],10),ops:[]},f.push(g);continue}if(b.startsWith("--- ")||b.startsWith("+++ ")){g=null;continue}if(!g)continue;let h=b.length?b[0]:" ",i=b.length?b.slice(1):"";if(" "===h||"-"===h||"+"===h)g.ops.push({tag:h,body:i});else if("\\"===h);else throw Error(`unexpected diff line: ${JSON.stringify(b)}`)}if(0===f.length)throw Error("no unified-diff hunks (@@ ... @@) found");let h=[],i=0,j=0,k=0;for(let a of f){let b=function(a,b,c,d){if(0===b.length)return Math.min(Math.max(c,d),a.length);let e=a.length-b.length,f=c=>{if(c<d||c>e)return!1;for(let d=0;d<b.length;d++)if(a[c+d]!==b[d])return!1;return!0},g=Math.max(d,c);if(f(g))return g;let h=Math.max(g-d,e-g);for(let a=1;a<=h;a++){if(f(g-a))return g-a;if(f(g+a))return g+a}throw Error(`could not locate hunk near line ${c+1}; its context/removed lines do not match the file. First expected line: ${JSON.stringify(b[0])}`)}(c,a.ops.filter(a=>" "===a.tag||"-"===a.tag).map(a=>a.body),Math.max(0,a.oldStart-1),i);if(b<i)throw Error("overlapping or out-of-order hunks");for(;i<b;)h.push(c[i]),i++;for(let b of a.ops)" "===b.tag?(h.push(c[i]),i++):"-"===b.tag?(i++,k++):(h.push(b.body),j++)}for(;i<c.length;)h.push(c[i]),i++;return{result:h.join("\n"),added:j,removed:k}}(e,a.diff)}catch(a){return u(`Diff apply failed: ${a instanceof Error?a.message:String(a)}. No changes written.`)}let g=i+("\r\n"===d?b.result.replace(/\n/g,"\r\n"):b.result);return await f.promises.writeFile(c,g,"utf8"),(0,o.Wk)(c,"write"),t({path:c,applied:!0,mode:"diff",diff:{added:b.added,removed:b.removed}})}let k=Array.isArray(a.edits)?a.edits:[];if(0===k.length)return u('Provide a non-empty "edits" array of { oldText, newText } or a "diff" string.');let l="number"==typeof a.startLine?a.startLine:void 0,m="number"==typeof a.endLine?a.endLine:void 0,n=y(j),p=j.replace(/\r\n?/g,"\n"),q=0;for(let a of k){let b="string"==typeof a.oldText?a.oldText.replace(/\r\n?/g,"\n"):"",d="string"==typeof a.newText?a.newText.replace(/\r\n?/g,"\n"):"";if(!b)return u(`Edit #${q+1} has an empty "oldText".`);let e="number"==typeof a.startLine?a.startLine:l,f="number"==typeof a.endLine?a.endLine:m,g=void 0!==e||void 0!==f,h=[];for(let a=p.indexOf(b);-1!==a;a=p.indexOf(b,a+1))h.push(a);if(0===h.length)return u(`Edit #${q+1}: "oldText" not found in ${c}. No changes written.`);let i=-1;if(g){let{lo:a,hi:b}=function(a,b,c){if(void 0===b&&void 0===c)return{lo:0,hi:a.length};let d=a.split("\n"),e=Math.max(1,Math.floor(b??1)),f=Math.min(d.length,Math.floor(c??d.length)),g=0;for(let a=0;a<e-1&&a<d.length;a++)g+=d[a].length+1;let h=g;for(let a=e-1;a<f&&a<d.length;a++)h+=d[a].length+ +(a<d.length-1);return{lo:g,hi:Math.max(g,h)}}(p,e,f),c=h.filter(c=>c>=a&&c<b);1===c.length&&(i=c[0])}if(-1===i)if(1!==h.length)return u(`Edit #${q+1}: "oldText" is ambiguous (appears ${h.length} times); add more surrounding context or a tighter startLine/endLine so exactly one occurrence is in range. No changes written.`);else i=h[0];p=p.slice(0,i)+d+p.slice(i+b.length),q+=1}let r=function(a,b){let c=x(a),d=x(b),e=new Map;for(let a of d)e.set(a,(e.get(a)??0)+1);let f=new Map;for(let a of c)f.set(a,(f.get(a)??0)+1);let g=0;for(let[a,b]of f)g+=Math.max(0,b-(e.get(a)??0));let h=0;for(let[a,b]of e)h+=Math.max(0,b-(f.get(a)??0));return{added:h,removed:g}}(j,p),s=i+("\r\n"===n?p.replace(/\n/g,"\r\n"):p);return await f.promises.writeFile(c,s,"utf8"),(0,o.Wk)(c,"write"),t({path:c,mode:"edits",editsApplied:q,diff:r})}async function H(a){try{let b=await f.promises.lstat(a);if(b.isFile())return"file";if(b.isDirectory())return"directory";return"other"}catch{return"other"}}async function I(a,b){let c=await v(a.path,b),d=await f.promises.readdir(c),g=await Promise.all(d.map(async a=>{let b=e().join(c,a),d=await H(b),g=0;try{g=(await f.promises.stat(b)).size}catch{}return{name:a,type:d,size:g}}));return g.sort((a,b)=>a.type===b.type?a.name.localeCompare(b.name):"directory"===a.type?-1:1),t({path:c,entries:g})}async function J(a,b){let c=await v(a.path,b),d=Math.min("number"==typeof a.depth?Math.max(1,Math.floor(a.depth)):3,10),g=0,h=!1;async function i(a,b){let c;if(b>d||h)return[];try{c=await f.promises.readdir(a)}catch{return[]}c.sort((a,b)=>a.localeCompare(b));let j=[];for(let f of c){if(++g>5e3){h=!0;break}let c=e().join(a,f),k=await H(c),l={name:f,type:k};"directory"===k&&b<d&&(l.children=await i(c,b+1)),j.push(l)}return j}let j=await i(c,1);return t({path:c,depth:d,truncated:h,tree:j})}async function K(a,b,c){let d;try{d=await f.promises.stat(a)}catch{return[]}if(!d.isFile()||d.size>5e6)return[];try{let b=await f.promises.open(a,"r");try{let a=Buffer.alloc(Math.min(8e3,d.size));if(a.length&&await b.read(a,0,a.length,0),C(a))return[]}finally{await b.close()}}catch{return[]}let{matches:e}=await D(a,b,Math.max(1,c));return e.map(b=>({path:a,line:b.line,text:b.text}))}async function L(a,b){let c=await v(a.path,b),d="string"==typeof a.namePattern?a.namePattern.toLowerCase():"",g="string"==typeof a.content?a.content:"";if(!d&&!g)return u('Provide "namePattern" and/or "content" to search for.');let h=[],i=!1,j=[];async function k(a){let b;if(!i){try{b=await f.promises.readdir(a)}catch{return}for(let c of b){if(i)return;let b=e().join(a,c),f=await H(b);if(d&&c.toLowerCase().includes(d)&&(h.push({path:b}),h.length>=1e3)){i=!0;return}"directory"===f?await k(b):"file"===f&&g&&j.push(b)}}}if(await k(c),g&&!i)for(let a=0;a<j.length&&!i;a+=16){let b=j.slice(a,a+16);for(let a of(await Promise.all(b.map(a=>K(a,g,1e3))))){for(let b of a)if(h.push(b),h.length>=1e3){i=!0;break}if(i)break}}return t({matches:h,truncated:i})}async function M(a,b){let c=await v(a.path,b),d=await f.promises.stat(c);return t({path:c,type:d.isFile()?"file":d.isDirectory()?"directory":"other",size:d.size,isFile:d.isFile(),isDirectory:d.isDirectory(),createdAt:d.birthtime.toISOString(),modifiedAt:d.mtime.toISOString()})}async function N(a,b){let c=await v(a.path,b);return await f.promises.mkdir(c,{recursive:!0}),t({path:c,created:!0})}async function O(a,b){let c=await v(a.source,b),d=await v(a.destination,b);return await f.promises.mkdir(e().dirname(d),{recursive:!0}),await f.promises.rename(c,d),t({source:c,destination:d})}async function P(a,b){let c=await v(a.path,b),d=!0===a.recursive;return await f.promises.rm(c,{recursive:d,force:!1}),t({path:c,deleted:!0})}async function Q(a){return t({directories:a})}async function R(a,b,c){try{if("file_browser_ui"===a)return function(a,b=!1){return{content:[{type:"text",text:a}],...b?{isError:!0}:{}}}("File browser shown to the user. Waiting for them to select a file — their choice will arrive as a follow-up message. Do not proceed until then.");let d=await (0,m.loadEffectiveRoots)(l.K3,"FLUJO_FS_ROOTS",c);switch(a){case"read_file":return await E(b,d);case"write_file":return await F(b,d);case"edit_file":return await G(b,d);case"list_dir":return await I(b,d);case"dir_tree":return await J(b,d);case"search":return await L(b,d);case"get_file_info":return await M(b,d);case"create_directory":return await N(b,d);case"move":return await O(b,d);case"delete":return await P(b,d);case"get_allowed_directories":return await Q(d);default:return u(`Unknown tool on the built-in filesystem server: ${a}`)}}catch(c){let b=c instanceof Error?c.message:String(c);return p.warn("filesystemCallTool failed",{toolName:a,err:c}),{isError:!0,content:[{type:"text",text:JSON.stringify({error:b})}],structuredContent:{error:b}}}}}};
|