flujo-ai 3.34.0 → 3.37.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 +316 -309
- package/.next/app-path-routes-manifest.json +17 -16
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +24 -24
- 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 +1 -1
- package/.next/server/app/api/approvals/[id]/route.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/backup/route.js +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_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_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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/compile/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generate/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/flow/generator/route_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +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_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_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_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_client-reference-manifest.js +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_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_client-reference-manifest.js +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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/api/packages/installed/route_client-reference-manifest.js +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_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_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_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_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_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_client-reference-manifest.js +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_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_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_client-reference-manifest.js +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 +2 -2
- package/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +1 -1
- package/.next/server/app/executions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/executions.html +1 -1
- package/.next/server/app/executions.rsc +1 -1
- package/.next/server/app/flows/page.js +2 -2
- package/.next/server/app/flows/page.js.nft.json +1 -1
- package/.next/server/app/flows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/flows.html +1 -1
- package/.next/server/app/flows.rsc +2 -2
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +1 -1
- package/.next/server/app/mcp/page_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp-flows/route.js +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_client-reference-manifest.js +1 -1
- package/.next/server/app/mcp.html +1 -1
- package/.next/server/app/mcp.rsc +2 -2
- package/.next/server/app/models/page.js +1 -1
- package/.next/server/app/models/page_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 +2 -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 +2 -2
- 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_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_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_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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/server/app/v1/models/route.js +1 -1
- package/.next/server/app/v1/models/route_client-reference-manifest.js +1 -1
- package/.next/server/app/waves/page_client-reference-manifest.js +1 -1
- package/.next/server/app/waves.html +1 -1
- package/.next/server/app/waves.rsc +1 -1
- package/.next/server/app-paths-manifest.json +17 -16
- package/.next/server/chunks/1227.js +1 -1
- package/.next/server/chunks/1805.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/3935.js +4 -0
- package/.next/server/chunks/4265.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/5309.js +1 -1
- package/.next/server/chunks/544.js +16 -16
- package/.next/server/chunks/5544.js +1 -1
- package/.next/server/chunks/5703.js +2 -2
- package/.next/server/chunks/6041.js +1 -1
- package/.next/server/chunks/6226.js +1 -1
- package/.next/server/chunks/6747.js +42 -42
- 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/7891.js +1 -1
- package/.next/server/chunks/7993.js +1 -1
- package/.next/server/chunks/8284.js +1 -1
- 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 +1 -1
- package/.next/server/chunks/9285.js +1 -1
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-manifest.json +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/{8650-5294c6ed1173b014.js → 8650-27bd62ba2381da1d.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-bc7807593b8b7394.js → page-e37bbc561f40ce60.js} +1 -1
- package/.next/static/chunks/app/flows/{page-87fb466e491fc068.js → page-e52c8943555e38dd.js} +1 -1
- 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-2f2d29c17841b3cf.js +1 -0
- package/.next/static/chunks/app/settings/{page-2fc3a70bfd25c48b.js → page-f35e939032b0277d.js} +1 -1
- 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-d5d737ff6a86674f.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 +60 -61
- package/package.json +1 -1
- package/.next/server/chunks/4308.js +0 -4
- package/.next/static/chunks/6733-c9029143901e62e9.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/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-a5e2437356b06db8.js +0 -1
- package/.next/static/chunks/app/packages/page-fba5696f33d9cdfb.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/{Zz_Vh59XdtLIPcf-PxCpo → -8j0oqKN3S4zlsA4kJRYr}/_buildManifest.js +0 -0
- /package/.next/static/{Zz_Vh59XdtLIPcf-PxCpo → -8j0oqKN3S4zlsA4kJRYr}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
"/api/backup/route": "app/api/backup/route.js",
|
|
5
5
|
"/api/browse/route": "app/api/browse/route.js",
|
|
6
6
|
"/api/bugs/enhance/route": "app/api/bugs/enhance/route.js",
|
|
7
|
-
"/_not-found/page": "app/_not-found/page.js",
|
|
8
7
|
"/api/cwd/route": "app/api/cwd/route.js",
|
|
9
8
|
"/api/encryption/secure/route": "app/api/encryption/secure/route.js",
|
|
10
9
|
"/api/env/route": "app/api/env/route.js",
|
|
@@ -17,13 +16,14 @@
|
|
|
17
16
|
"/api/flow/improve/route": "app/api/flow/improve/route.js",
|
|
18
17
|
"/api/flow/prompt-renderer/route": "app/api/flow/prompt-renderer/route.js",
|
|
19
18
|
"/api/flow/quick-chat/route": "app/api/flow/quick-chat/route.js",
|
|
20
|
-
"/api/flow/route": "app/api/flow/route.js",
|
|
21
19
|
"/api/flow/repair/route": "app/api/flow/repair/route.js",
|
|
20
|
+
"/api/flow/route": "app/api/flow/route.js",
|
|
22
21
|
"/api/init/route": "app/api/init/route.js",
|
|
23
22
|
"/api/git/route": "app/api/git/route.js",
|
|
23
|
+
"/_not-found/page": "app/_not-found/page.js",
|
|
24
24
|
"/api/mcp-registry/route": "app/api/mcp-registry/route.js",
|
|
25
|
-
"/api/mcp-registry/spotlight/route": "app/api/mcp-registry/spotlight/route.js",
|
|
26
25
|
"/api/mcp/app-sandbox/route": "app/api/mcp/app-sandbox/route.js",
|
|
26
|
+
"/api/mcp-registry/spotlight/route": "app/api/mcp-registry/spotlight/route.js",
|
|
27
27
|
"/api/mcp/cancel/route": "app/api/mcp/cancel/route.js",
|
|
28
28
|
"/api/mcp/servers/[name]/prompts/get/route": "app/api/mcp/servers/[name]/prompts/get/route.js",
|
|
29
29
|
"/api/mcp/servers/[name]/prompts/route": "app/api/mcp/servers/[name]/prompts/route.js",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"/api/model/route": "app/api/model/route.js",
|
|
41
41
|
"/api/model/test/route": "app/api/model/test/route.js",
|
|
42
42
|
"/api/oauth/callback/route": "app/api/oauth/callback/route.js",
|
|
43
|
-
"/api/oauth/reset/route": "app/api/oauth/reset/route.js",
|
|
44
43
|
"/api/oauth/initiate/route": "app/api/oauth/initiate/route.js",
|
|
44
|
+
"/api/oauth/reset/route": "app/api/oauth/reset/route.js",
|
|
45
45
|
"/api/packages/build/route": "app/api/packages/build/route.js",
|
|
46
46
|
"/api/packages/derive-secrets/route": "app/api/packages/derive-secrets/route.js",
|
|
47
47
|
"/api/packages/install/route": "app/api/packages/install/route.js",
|
|
@@ -57,51 +57,52 @@
|
|
|
57
57
|
"/api/planned-executions/preview-schedule/route": "app/api/planned-executions/preview-schedule/route.js",
|
|
58
58
|
"/api/planned-executions/reconcile/route": "app/api/planned-executions/reconcile/route.js",
|
|
59
59
|
"/api/planned-executions/route": "app/api/planned-executions/route.js",
|
|
60
|
-
"/api/registry/auth/reset/route": "app/api/registry/auth/reset/route.js",
|
|
61
60
|
"/api/registry/auth/resend/route": "app/api/registry/auth/resend/route.js",
|
|
61
|
+
"/api/registry/auth/reset/route": "app/api/registry/auth/reset/route.js",
|
|
62
62
|
"/api/registry/auth/route": "app/api/registry/auth/route.js",
|
|
63
63
|
"/api/registry/feedback/route": "app/api/registry/feedback/route.js",
|
|
64
|
-
"/api/registry/oauth/callback/route": "app/api/registry/oauth/callback/route.js",
|
|
65
64
|
"/api/registry/oauth/initiate/route": "app/api/registry/oauth/initiate/route.js",
|
|
65
|
+
"/api/registry/oauth/callback/route": "app/api/registry/oauth/callback/route.js",
|
|
66
66
|
"/api/registry/packages/route": "app/api/registry/packages/route.js",
|
|
67
67
|
"/api/registry/publish/route": "app/api/registry/publish/route.js",
|
|
68
68
|
"/api/registry/settings/route": "app/api/registry/settings/route.js",
|
|
69
69
|
"/api/restore/route": "app/api/restore/route.js",
|
|
70
|
-
"/api/storage/route": "app/api/storage/route.js",
|
|
71
70
|
"/api/runs/active/route": "app/api/runs/active/route.js",
|
|
71
|
+
"/api/storage/route": "app/api/storage/route.js",
|
|
72
72
|
"/api/waves/route": "app/api/waves/route.js",
|
|
73
73
|
"/api/webhooks/[id]/route": "app/api/webhooks/[id]/route.js",
|
|
74
74
|
"/v1/chat/completions/route": "app/v1/chat/completions/route.js",
|
|
75
|
-
"/v1/chat/conversations/[conversationId]/breakpoints/route": "app/v1/chat/conversations/[conversationId]/breakpoints/route.js",
|
|
76
75
|
"/v1/chat/conversations/[conversationId]/cancel/route": "app/v1/chat/conversations/[conversationId]/cancel/route.js",
|
|
76
|
+
"/v1/chat/conversations/[conversationId]/breakpoints/route": "app/v1/chat/conversations/[conversationId]/breakpoints/route.js",
|
|
77
77
|
"/v1/chat/conversations/[conversationId]/debug/step/route": "app/v1/chat/conversations/[conversationId]/debug/step/route.js",
|
|
78
78
|
"/v1/chat/conversations/[conversationId]/debug/continue/route": "app/v1/chat/conversations/[conversationId]/debug/continue/route.js",
|
|
79
79
|
"/v1/chat/conversations/[conversationId]/edit-state/route": "app/v1/chat/conversations/[conversationId]/edit-state/route.js",
|
|
80
80
|
"/v1/chat/conversations/[conversationId]/inject/route": "app/v1/chat/conversations/[conversationId]/inject/route.js",
|
|
81
|
+
"/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route": "app/v1/chat/conversations/[conversationId]/resources/[resourceId]/content/route.js",
|
|
81
82
|
"/v1/chat/conversations/[conversationId]/resources/route": "app/v1/chat/conversations/[conversationId]/resources/route.js",
|
|
82
83
|
"/v1/chat/conversations/[conversationId]/respond/route": "app/v1/chat/conversations/[conversationId]/respond/route.js",
|
|
83
84
|
"/v1/chat/conversations/[conversationId]/route": "app/v1/chat/conversations/[conversationId]/route.js",
|
|
84
85
|
"/v1/chat/conversations/route": "app/v1/chat/conversations/route.js",
|
|
85
86
|
"/v1/models/route": "app/v1/models/route.js",
|
|
86
|
-
"/api/local-models/capability/route": "app/api/local-models/capability/route.js",
|
|
87
87
|
"/api/local-models/pull/route": "app/api/local-models/pull/route.js",
|
|
88
|
-
"/api/mcp/oauth-capability/route": "app/api/mcp/oauth-capability/route.js",
|
|
89
88
|
"/api/local-models/suggest/route": "app/api/local-models/suggest/route.js",
|
|
89
|
+
"/api/local-models/capability/route": "app/api/local-models/capability/route.js",
|
|
90
|
+
"/api/mcp/oauth-capability/route": "app/api/mcp/oauth-capability/route.js",
|
|
90
91
|
"/api/mcp/test-connection/stream/route": "app/api/mcp/test-connection/stream/route.js",
|
|
91
92
|
"/api/telemetry/daily-active/route": "app/api/telemetry/daily-active/route.js",
|
|
92
93
|
"/api/update/route": "app/api/update/route.js",
|
|
93
|
-
"/mcp-flows/route": "app/mcp-flows/route.js",
|
|
94
94
|
"/mcp-proxy/[server]/route": "app/mcp-proxy/[server]/route.js",
|
|
95
|
+
"/mcp-flows/route": "app/mcp-flows/route.js",
|
|
95
96
|
"/v1/chat/conversations/[conversationId]/events/route": "app/v1/chat/conversations/[conversationId]/events/route.js",
|
|
96
97
|
"/v1/chat/events/route": "app/v1/chat/events/route.js",
|
|
97
|
-
"/docs/page": "app/docs/page.js",
|
|
98
|
-
"/executions/page": "app/executions/page.js",
|
|
99
98
|
"/chat/page": "app/chat/page.js",
|
|
99
|
+
"/executions/page": "app/executions/page.js",
|
|
100
100
|
"/flows/page": "app/flows/page.js",
|
|
101
|
-
"/page": "app/page.js",
|
|
102
|
-
"/settings/page": "app/settings/page.js",
|
|
101
|
+
"/docs/page": "app/docs/page.js",
|
|
103
102
|
"/mcp/page": "app/mcp/page.js",
|
|
104
|
-
"/waves/page": "app/waves/page.js",
|
|
105
103
|
"/packages/page": "app/packages/page.js",
|
|
104
|
+
"/settings/page": "app/settings/page.js",
|
|
105
|
+
"/page": "app/page.js",
|
|
106
|
+
"/waves/page": "app/waves/page.js",
|
|
106
107
|
"/models/page": "app/models/page.js"
|
|
107
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=1227,exports.ids=[1227],exports.modules={34641:(a,b,c)=>{c.d(b,{uJ:()=>B,Ay:()=>L,Yw:()=>C});var d=c(21124),e=c(38301),f=c(60839),g=c(81637),h=c(8521),i=c(79515),j=c(88745),k=c(43312),l=c(68730),m=c(99561),n=c(5748),o=c(1994),p=c(17332),q=c(63908),r=c(36636),s=c(93516),t=c(92543),u=c(28055),v=c(59060);let w=(0,c(19815).h)("frontend/components/Chat/McpAppFrame"),x={name:"FLUJO",version:"3.34.0"},y=new Set(["https:","http:"]),z=["inline","fullscreen","pip"],A=new Set(["text"]),B=262144;function C(a){try{return new TextEncoder().encode(JSON.stringify(a)).length}catch{return 1/0}}let D=null;async function E(){return D||(D=fetch("/api/mcp/app-sandbox").then(async a=>{if(!a.ok)throw Error(`Sandbox endpoint discovery failed (${a.status})`);return await a.json()}).catch(a=>{throw D=null,a})),function(a,b){let c;if("string"!=typeof a.token||0===a.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if(void 0!==a.url){if("string"!=typeof a.url)throw Error("Sandbox endpoint discovery returned an invalid public URL");try{c=new URL(a.url)}catch{throw Error("Sandbox endpoint discovery returned an invalid public URL")}if("http:"!==c.protocol&&"https:"!==c.protocol||c.username||c.password)throw Error("Sandbox public URL must be an absolute HTTP(S) URL without credentials");if("https:"===b.protocol&&"https:"!==c.protocol)throw Error("HTTPS FLUJO deployments require an HTTPS MCP Apps sandbox URL")}else{if("http:"!==b.protocol)throw Error("MCP Apps on HTTPS require FLUJO_MCP_APP_SANDBOX_PUBLIC_URL to be configured");if(!Number.isInteger(a.port)||a.port<1||a.port>65535)throw Error("Sandbox endpoint discovery returned an invalid port");(c=new URL("/sandbox.html",b.origin)).port=String(a.port)}if(c.origin===b.origin)throw Error("MCP Apps sandbox must use a distinct origin from FLUJO");return c.searchParams.set("token",a.token),c.href}(await D,window.location)}function F(a,b){let c=[],d=new Set;for(let e of a??[]){if(0===e.length||e.length>2048||/[^\x21-\x7e]/.test(e))continue;let a=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(e);if(!a||!b.includes(a[1].toLowerCase()))continue;let f=a[3].split(".");if(a[3].length>253||f.some(a=>0===a.length||a.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(a)))continue;let g=a[4]?Number(a[4]):void 0;if(void 0!==g&&(!Number.isInteger(g)||g<1||g>65535))continue;let h=e.toLowerCase();if(!d.has(h)&&(d.add(h),c.push(e),c.length>=64))break}return c}function G(a){if(a)try{return JSON.parse(a)}catch{return}}async function H(a,b,c,d,e){if(await a.sendToolInput({arguments:function(a){let b=G(a);return b&&"object"==typeof b&&!Array.isArray(b)?b:{}}(b)}),void 0!==d)return void await a.sendToolCancelled({reason:d});let f=function(a,b){if(void 0===a)return!0===b?{content:[],isError:!0}:null;let c=G(a);return c&&"object"==typeof c&&Array.isArray(c.content)?{...c,...!0===b?{isError:!0}:{}}:{content:[{type:"text",text:a}],...!0===b?{isError:!0}:{}}}(c,e);f&&await a.sendToolResult(f)}function I(a,b,c){return b.includes(a)&&c.includes(a)}function J(a,b){let c=a.getBoundingClientRect(),d=Math.max(1,Math.round(c.width||a.clientWidth||1));return b?{width:d,height:Math.max(1,Math.round(c.height||a.clientHeight||1))}:{width:d,maxHeight:6e3}}async function K(a,b,c){try{let d=await u.S.listServerTools(a),e=Array.isArray(d.tools)?d.tools:[],f=c?e.find(a=>a?.name===c):e.find(a=>(0,v.Gt)(a?._meta)===b);if(f?.name&&f?.inputSchema&&(0,v.Gt)(f._meta)===b)return{tool:f}}catch(a){w.debug("Could not resolve the full MCP App tool definition",a)}}let L=({serverName:a,uri:b,toolName:c,toolArgs:D,toolResultContent:G,toolUpdateId:L,toolCancelledReason:M,toolIsError:N,onAppMessage:O,onUpdateModelContext:P,onRequestDock:Q,onDockable:R,onAvailableDisplayModes:S,hostDisplayMode:T,onRequestDisplayMode:U,onRequestClose:V,onRegisterTeardown:W,teardownRegistrationKey:X,docked:Y=!1,visible:Z=!0})=>{let $=(0,f.A)(),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(!1),[ad,ae]=(0,e.useState)(null),[af,ag]=(0,e.useState)(Y?"pip":"inline"),[ah,ai]=(0,e.useState)([]),aj=T??af,ak=(0,e.useMemo)(()=>Y?["pip","fullscreen"]:["inline","fullscreen",...Q?["pip"]:[]],[Y,Q]),al=(0,e.useRef)(null),am=(0,e.useRef)(null),an=(0,e.useRef)(null),ao=(0,e.useRef)(!1),ap=(0,e.useRef)(0),aq=(0,e.useRef)(!1),ar=(0,e.useRef)(null),as=(0,e.useRef)(null),at=(0,e.useRef)(!1),au=(0,e.useRef)(!0),av=(0,e.useRef)([]),aw=(0,e.useRef)(aj),ax=(0,e.useRef)(ak),ay=(0,e.useRef)(Promise.resolve()),az=(0,e.useRef)(void 0),aA=(0,e.useRef)({args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L});aA.current={args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L};let aB=(0,e.useRef)(O);(0,e.useEffect)(()=>{aB.current=O},[O]);let aC=(0,e.useRef)(P);(0,e.useEffect)(()=>{aC.current=P},[P]);let aD=(0,e.useRef)(Q);(0,e.useEffect)(()=>{aD.current=Q},[Q]);let aE=(0,e.useRef)(R);(0,e.useEffect)(()=>{aE.current=R},[R]);let aF=(0,e.useRef)(S);(0,e.useEffect)(()=>{aF.current=S},[S]);let aG=(0,e.useRef)(U);(0,e.useEffect)(()=>{aG.current=U},[U]);let aH=(0,e.useRef)(V);(0,e.useEffect)(()=>{aH.current=V},[V]);let aI=(0,e.useRef)(Y);(0,e.useEffect)(()=>{aI.current=Y},[Y]),(0,e.useEffect)(()=>{aw.current=aj},[aj]),(0,e.useEffect)(()=>{ax.current=ak},[ak]);let aJ=(0,e.useCallback)(()=>{if(as.current)return as.current;ap.current+=1;let a=an.current,b=am.current,c=aq.current;an.current=null,am.current=null,aq.current=!1,ao.current=!1,av.current=[],ar.current?.disconnect(),ar.current=null;let d=(async()=>{if(a&&c){let b;try{await Promise.race([a.teardownResource({},{timeout:1e3}),new Promise(a=>{b=setTimeout(a,1e3)})])}catch(a){w.debug("MCP App did not acknowledge resource teardown",a)}finally{b&&clearTimeout(b)}}try{await a?.close()}catch{}b?.remove()})();return as.current=d,d.finally(()=>{as.current===d&&(as.current=null)}),d},[]),aK=(0,e.useCallback)(()=>{!at.current&&aD.current&&(at.current=!0,aJ().then(()=>{au.current&&(aD.current?.(),aa(!1))}).finally(()=>{at.current=!1}))},[aJ]),aL=(0,e.useCallback)((a,b,c,d,e)=>{ay.current=ay.current.catch(()=>void 0).then(async()=>{an.current===a&&aq.current&&await H(a,b,c,d,e)}).catch(a=>{w.warn("MCP App tool delivery failed",a)})},[]),aM=(0,e.useCallback)(async()=>{if(as.current&&await as.current,ao.current||!al.current)return;let d=ap.current+1;ap.current=d;let e=()=>ap.current===d&&ao.current;ao.current=!0,ai([]),ac(!0),ae(null);try{let f,[g,h]=await Promise.all([u.S.readResourceFromApp(a,b),K(a,b,c)]);if(!e())return;if(g?.httpStatus===403)throw Error(g?.error||"MCP Apps access was disabled for this server");if(!g||!1===g.success)throw Error(g?.error||"Failed to read the UI resource.");let i=function(a,b){var c;let d,e=a?.contents;if(!Array.isArray(e)||0===e.length)throw Error("Resource has no contents");let f=e.find(a=>a.uri===b&&"string"==typeof a.mimeType&&(0,v.q$)(a.mimeType)&&("string"==typeof a.text||"string"==typeof a.blob));if(!f)throw Error(`Resource ${b} did not return MCP App HTML`);try{d="string"==typeof f.text?f.text:function(a){let b=Uint8Array.from(atob(a),a=>a.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(b)}(f.blob)}catch{throw Error(`Resource ${b} contains invalid base64 UTF-8 HTML`)}if(new TextEncoder().encode(d).length>v.Pt)throw Error(`Resource exceeds the ${Math.round(v.Pt/1024)} KiB size cap`);let g=(f._meta??f.meta)?.ui,h=t.c0.safeParse(g?.csp);if(g?.csp!==void 0&&!h.success)throw Error(`Resource ${b} declares an invalid CSP policy`);let i=t.Ml.safeParse(g?.permissions);if(g?.permissions!==void 0&&!i.success)throw Error(`Resource ${b} declares invalid sandbox permissions`);return{html:d,csp:h.success?{connectDomains:F((c=h.data).connectDomains,["https","wss"]),resourceDomains:F(c.resourceDomains,["https"]),frameDomains:F(c.frameDomains,["https"]),baseUriDomains:F(c.baseUriDomains,["https"])}:void 0,permissions:i.success&&i.data.clipboardWrite?{clipboardWrite:{}}:void 0}}(g.data,b),j=await E();if(!e()||!al.current)return;let k=document.createElement("iframe");k.title=`MCP App: ${b}`,k.setAttribute("sandbox","allow-scripts allow-same-origin"),k.referrerPolicy="origin";let l=(0,t.Sy)(i.permissions);l&&k.setAttribute("allow",l),k.style.cssText=aI.current?"width:100%;height:100%;border:none;background:#fff;":"width:100%;min-height:120px;height:200px;border:none;border-radius:4px;background:#fff;",al.current.appendChild(k),am.current=k;let m=new URL(j);i.csp&&m.searchParams.set("csp",JSON.stringify(i.csp));let n=m.origin,o=new Promise((a,b)=>{let c=setTimeout(()=>{window.removeEventListener("message",d),b(Error("Timed out waiting for the sandbox proxy."))},1e4),d=b=>{b.source===k.contentWindow&&b.origin===n&&b.data?.jsonrpc==="2.0"&&b.data?.method==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(c),window.removeEventListener("message",d),a())};window.addEventListener("message",d)});if(k.src=m.href,await o,!e()||am.current!==k)return;let p=aw.current,q="inline";aw.current=q,f=new t.T1(function(a,b){return{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(c,d,e)=>{let{method:f,params:g}=c;if("tools/call"===f){w.info(`MCP App tools/call: ${a}/${g?.name}`);let c=await u.S.callToolFromApp(a,g.name,g.arguments??{},void 0,e?.signal);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Tool call failed: ${g?.name}`);return c.data}if("resources/read"===f){let c=await u.S.readResourceFromApp(a,g.uri);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Resource read failed: ${g?.uri}`);return c.data}if("resources/list"===f)return{resources:[]};if("resources/templates/list"===f)return{resourceTemplates:[]};throw Error(`MCP App requested unsupported method: ${f}`)}}}(a,a=>{ap.current===d&&an.current===f&&(ae(a),ac(!1),aJ())}),x,{openLinks:{},serverTools:{},serverResources:{},logging:{},...aB.current?{message:{text:{}}}:{},...aC.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:i.csp,permissions:i.permissions}},{hostContext:{...h?{toolInfo:h}:{},theme:"dark"===$.palette.mode?"dark":"light",platform:"web",displayMode:q,availableDisplayModes:ax.current,containerDimensions:J(al.current,aI.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:window.matchMedia?.("(hover: hover)").matches??!1}}}),an.current=f;let r=()=>e()&&an.current===f;if(f.onopenlink=async({url:c})=>{if(!r())return{isError:!0};let d=function(a){try{let b=new URL(a);if(!y.has(b.protocol)||b.username||b.password)return null;return b.href}catch{return null}}(c);if(!d)return w.warn("MCP App open-link rejected by URL policy",{serverName:a,uri:b}),{isError:!0};let e=window.open(d,"_blank","noopener,noreferrer");return e?(e.opener=null,{}):{isError:!0}},f.ondownloadfile=async({contents:a})=>{if(!r())return{isError:!0};try{for(let b of a??[]){let a,c=b?.resource;if(!c)continue;let d=("string"==typeof c.uri?c.uri.split("/").pop():"")||"download",e="string"==typeof c.mimeType?c.mimeType:"application/octet-stream";if("string"==typeof c.blob){let b=Uint8Array.from(atob(c.blob),a=>a.charCodeAt(0));a=new Blob([b],{type:e})}else a=new Blob([String(c.text??"")],{type:e});let f=URL.createObjectURL(a),g=document.createElement("a");g.href=f,g.download=d,document.body.appendChild(g),g.click(),g.remove(),setTimeout(()=>URL.revokeObjectURL(f),4e3)}return{}}catch(a){return w.warn("MCP App download failed",a),{isError:!0}}},f.onloggingmessage=a=>{r()&&w.debug("MCP App log",a?.data)},f.onmessage=async a=>{if(!r())return{};if(!aB.current)throw Error("This host cannot deliver ui/message in this surface");let b=function(a){if(a?.role!=="user")throw Error('This host accepts ui/message only with role "user"');let b=a?.content,c=Array.isArray(b)?b:b&&"object"==typeof b?[b]:[];if(0===c.length||c.some(a=>a?.type!=="text"||"string"!=typeof a.text))throw Error("This host accepts text-only ui/message content");let d=c.map(a=>a.text).join("\n").trim();if(!d)throw Error("ui/message text must not be empty");return d}(a);if(!await aB.current(b))throw Error("ui/message was not delivered");return{}},f.onupdatemodelcontext=async c=>{if(!r())return{};let d=function(a){if(!a||"object"!=typeof a||Array.isArray(a))return"ui/update-model-context params must be an object";if(void 0!==a.content){if(!Array.isArray(a.content))return"Model context content must be an array";for(let b of a.content)if(!b||"object"!=typeof b||Array.isArray(b)||!A.has(b.type))return"Model context contains a modality this host did not advertise"}return void 0!==a.structuredContent&&(!a.structuredContent||"object"!=typeof a.structuredContent||Array.isArray(a.structuredContent))?"Model structuredContent must be an object":C(a)>B?`Model context exceeds ${B} bytes`:null}(c);if(d)throw Error(d);let e=`${a}::${b}`;if(!aC.current)throw Error("This host cannot preserve model context in this surface");if(!await aC.current(e,c))throw Error("MCP App model context was not stored");return{}},f.onsizechange=async({width:a,height:b})=>{if(!r()||aI.current)return;let c=al.current?.getBoundingClientRect().width||al.current?.clientWidth||0,d=function(a,b){let c={};if(Number.isFinite(a.width)&&a.width>0){let d=Number.isFinite(b)&&b>0?b:6e3;c.width=Math.min(a.width,d,6e3)}return Number.isFinite(a.height)&&a.height>0&&(c.height=Math.min(a.height,6e3)),c}({width:a,height:b},c);void 0!==d.height&&(k.style.height=`${d.height}px`),void 0!==d.width&&(k.style.width=`${d.width}px`,k.style.maxWidth="100%")},f.onrequestdisplaymode=async({mode:a})=>{if(!r())return{mode:aw.current};let b=aw.current,c=av.current;if(!I(a,ax.current,c))return{mode:b};if("pip"===a&&!aI.current&&aD.current)return setTimeout(aK,0),{mode:b};let d=b;return(d=aG.current?await aG.current(a,[...c]):a)===b||I(d,ax.current,c)||(d=b),d!==b&&(aw.current=d,ag(d),await f.sendHostContextChange({displayMode:d})),{mode:d}},f.onrequestteardown=()=>{r()&&aJ().finally(()=>{aH.current?aH.current():(aw.current="inline",ag("inline"),aa(!1))})},f.oninitialized=()=>{if(!r())return;let a=f.getAppCapabilities()?.availableDisplayModes,b=Array.isArray(a)?[...new Set(a.filter(a=>z.includes(a)))]:[];av.current=b,ai(b),aE.current?.(b.includes("pip")),aF.current?.([...b]),aq.current=!0;let c=function(a,b,c,d){return b?I("pip",c,d)?"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"pip":null:"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"inline"}(p,aI.current,ax.current,b);if(null===c){ae("This app does not declare support for the canvas (pip) display mode."),ac(!1),aJ();return}aw.current=c,ag(c),c!==q&&f.sendHostContextChange({displayMode:c});let d=al.current;if(d&&"undefined"!=typeof ResizeObserver){let a=()=>{if(!r()||!aq.current)return;let a=d.getBoundingClientRect();a.width<=0||aI.current&&a.height<=0||f.sendHostContextChange({containerDimensions:J(d,aI.current)})};ar.current?.disconnect(),ar.current=new ResizeObserver(a),ar.current.observe(d),a()}let e=aA.current;az.current=e.updateId??`${e.args??""}\u0000${e.resultContent??""}\u0000${e.cancelledReason??""}\u0000${e.isError??""}`,(void 0!==e.args||void 0!==e.resultContent||void 0!==e.cancelledReason||!0===e.isError)&&aL(f,e.args,e.resultContent,e.cancelledReason,e.isError),ac(!1)},await f.connect(function(a,b){let c=new t.hJ(a,b),d={start:async()=>{c.onmessage=(a,b)=>{d.onmessage?.("ui/message"!==a.method||!a.params||Array.isArray(a.params.content)||!a.params.content||"object"!=typeof a.params.content?a:{...a,params:{...a.params,content:[a.params.content]}},b)},c.onerror=a=>d.onerror?.(a),c.onclose=()=>d.onclose?.(),await c.start()},send:(a,b)=>c.send(a,b),close:()=>c.close(),setProtocolVersion:a=>c.setProtocolVersion?.(a)};return d}(k.contentWindow,k.contentWindow)),!r())return;await f.sendSandboxResourceReady({html:i.html,csp:i.csp,permissions:i.permissions})}catch(c){if(!e())return;w.warn(`Failed to mount MCP App ${b} from ${a}`,c),ae(c instanceof Error?c.message:"Failed to load the app."),ac(!1),aJ()}},[aK,aL,a,aJ,$.palette.mode,c,b]),aN=(0,e.useCallback)(()=>{let a=!_;a||"fullscreen"!==aw.current||(aw.current="inline",ag("inline"),an.current?.sendHostContextChange({displayMode:"inline"})),aa(a),a&&setTimeout(()=>{aM()},0)},[_,aM]);if((0,e.useEffect)(()=>{Y&&!ao.current&&aM()},[Y,aM]),(0,e.useEffect)(()=>{let a=L??`${D??""}\u0000${G??""}\u0000${M??""}\u0000${N??""}`;aq.current&&an.current&&a!==az.current&&(az.current=a,aJ().then(()=>{au.current&&(aI.current||_)&&aM()}))},[_,aM,aJ,D,M,N,G,L]),(0,e.useEffect)(()=>{T&&aq.current&&an.current&&aw.current!==T&&I(T,ax.current,av.current)&&(aw.current=T,ag(T),an.current.sendHostContextChange({displayMode:T}))},[T]),(0,e.useEffect)(()=>{aq.current&&an.current&&an.current?.sendHostContextChange({theme:"dark"===$.palette.mode?"dark":"light"})},[$.palette.mode]),(0,e.useEffect)(()=>{let c=X??`${a}::${b}`;return W?.(c,aJ),()=>W?.(c,null)},[W,a,aJ,X,b]),(0,e.useEffect)(()=>{let b=b=>{let c=b.detail;c?.serverName===a&&(c.config?.enableMcpApps===!1||c.config?.disabled===!0)&&(ae("MCP Apps access was disabled for this server."),ac(!1),aJ().finally(()=>{aI.current&&aH.current?.()}))};return window.addEventListener("flujo:mcp-server-config-changed",b),()=>{window.removeEventListener("flujo:mcp-server-config-changed",b)}},[a,aJ]),(0,e.useEffect)(()=>(au.current=!0,()=>{au.current=!1,aJ()}),[aJ]),Y)return(0,d.jsxs)(g.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:Z?"visible":"hidden",pointerEvents:Z?"auto":"none",flexDirection:"column"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{m:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{flex:1,minHeight:0,width:"100%",display:ad?"none":"block"}})]});let aO=ah.includes("inline")&&ah.includes("fullscreen")&&ak.includes("fullscreen"),aP=ah.includes("inline")&&ah.includes("pip")&&ak.includes("pip")&&!!Q;return(0,d.jsxs)(g.default,{sx:{mt:1,border:"1px solid",borderColor:"divider",borderRadius:1,overflow:"hidden",..."fullscreen"===af?{position:"fixed",inset:16,zIndex:1300,bgcolor:"background.paper",boxShadow:6}:{}},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover"},children:[(0,d.jsx)(n.A,{fontSize:"small",color:"primary"}),(0,d.jsxs)(i.default,{variant:"body2",sx:{fontWeight:500},children:["Interactive app from ",a]}),(0,d.jsx)(k.A,{title:"Runs in a separate-origin sandbox (no access to FLUJO's origin, cookies, storage, or DOM). Its tool calls are brokered through this server only.",children:(0,d.jsx)(o.A,{fontSize:"small",color:"action"})}),(0,d.jsx)(g.default,{sx:{flex:1}}),_&&aP&&(0,d.jsx)(l.A,{size:"small",onClick:aK,children:"Canvas"}),_&&(0,d.jsx)(k.A,{title:aO?"fullscreen"===af?"Exit fullscreen":"Fullscreen":"This app did not declare inline and fullscreen support",children:(0,d.jsx)("span",{children:(0,d.jsx)(l.A,{size:"small",disabled:!aO,onClick:()=>{let a="fullscreen"===af?"inline":"fullscreen";I(a,ak,ah)&&(aw.current=a,ag(a),an.current?.sendHostContextChange({displayMode:a}))},sx:{minWidth:0},children:"fullscreen"===af?(0,d.jsx)(s.A,{fontSize:"small"}):(0,d.jsx)(r.A,{fontSize:"small"})})})}),(0,d.jsx)(l.A,{size:"small",onClick:aN,startIcon:_?(0,d.jsx)(q.A,{}):(0,d.jsx)(p.A,{}),children:_?"Hide":"Open app"})]}),(0,d.jsx)(m.A,{in:_,onExited:()=>{aJ()},children:(0,d.jsxs)(g.default,{sx:{p:1,height:"fullscreen"===af?"calc(100vh - 100px)":"auto"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{my:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{width:"100%",height:"fullscreen"===af?"100%":"auto",display:ad?"none":"block"}})]})})]})}},59060:(a,b,c)=>{c.d(b,{Gt:()=>h,Pt:()=>e,q$:()=>g});let d="ui://",e=2097152;function f(a){return"string"==typeof a&&a.length>d.length&&a.slice(0,d.length).toLowerCase()===d&&!/\s/.test(a)}function g(a){if("string"!=typeof a)return!1;let[b,...c]=a.toLowerCase().split(";");if("text/html"!==b.trim())return!1;let d=!1;for(let a of c){let b=a.indexOf("=");if(b<=0)return!1;let c=a.slice(0,b).trim(),e=a.slice(b+1).trim();if(!c||!e)return!1;if("profile"===c){if(d||"mcp-app"!==e)return!1;d=!0}}return d}function h(a){if(!a||"object"!=typeof a)return;let b=a["ui/resourceUri"];if(f(b))return b;for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if(f(a))return a}}},82571:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e,yo:()=>g});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase(),g=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}}};
|
|
1
|
+
"use strict";exports.id=1227,exports.ids=[1227],exports.modules={34641:(a,b,c)=>{c.d(b,{uJ:()=>B,Ay:()=>L,Yw:()=>C});var d=c(21124),e=c(38301),f=c(60839),g=c(81637),h=c(8521),i=c(79515),j=c(88745),k=c(43312),l=c(68730),m=c(99561),n=c(5748),o=c(1994),p=c(17332),q=c(63908),r=c(36636),s=c(93516),t=c(92543),u=c(28055),v=c(59060);let w=(0,c(19815).h)("frontend/components/Chat/McpAppFrame"),x={name:"FLUJO",version:"3.37.0"},y=new Set(["https:","http:"]),z=["inline","fullscreen","pip"],A=new Set(["text"]),B=262144;function C(a){try{return new TextEncoder().encode(JSON.stringify(a)).length}catch{return 1/0}}let D=null;async function E(){return D||(D=fetch("/api/mcp/app-sandbox").then(async a=>{if(!a.ok)throw Error(`Sandbox endpoint discovery failed (${a.status})`);return await a.json()}).catch(a=>{throw D=null,a})),function(a,b){let c;if("string"!=typeof a.token||0===a.token.length)throw Error("Sandbox endpoint discovery returned invalid credentials");if(void 0!==a.url){if("string"!=typeof a.url)throw Error("Sandbox endpoint discovery returned an invalid public URL");try{c=new URL(a.url)}catch{throw Error("Sandbox endpoint discovery returned an invalid public URL")}if("http:"!==c.protocol&&"https:"!==c.protocol||c.username||c.password)throw Error("Sandbox public URL must be an absolute HTTP(S) URL without credentials");if("https:"===b.protocol&&"https:"!==c.protocol)throw Error("HTTPS FLUJO deployments require an HTTPS MCP Apps sandbox URL")}else{if("http:"!==b.protocol)throw Error("MCP Apps on HTTPS require FLUJO_MCP_APP_SANDBOX_PUBLIC_URL to be configured");if(!Number.isInteger(a.port)||a.port<1||a.port>65535)throw Error("Sandbox endpoint discovery returned an invalid port");(c=new URL("/sandbox.html",b.origin)).port=String(a.port)}if(c.origin===b.origin)throw Error("MCP Apps sandbox must use a distinct origin from FLUJO");return c.searchParams.set("token",a.token),c.href}(await D,window.location)}function F(a,b){let c=[],d=new Set;for(let e of a??[]){if(0===e.length||e.length>2048||/[^\x21-\x7e]/.test(e))continue;let a=/^(https|wss):\/\/(\*\.)?([^/:?#]+)(?::(\d{1,5}))?$/i.exec(e);if(!a||!b.includes(a[1].toLowerCase()))continue;let f=a[3].split(".");if(a[3].length>253||f.some(a=>0===a.length||a.length>63||!/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i.test(a)))continue;let g=a[4]?Number(a[4]):void 0;if(void 0!==g&&(!Number.isInteger(g)||g<1||g>65535))continue;let h=e.toLowerCase();if(!d.has(h)&&(d.add(h),c.push(e),c.length>=64))break}return c}function G(a){if(a)try{return JSON.parse(a)}catch{return}}async function H(a,b,c,d,e){if(await a.sendToolInput({arguments:function(a){let b=G(a);return b&&"object"==typeof b&&!Array.isArray(b)?b:{}}(b)}),void 0!==d)return void await a.sendToolCancelled({reason:d});let f=function(a,b){if(void 0===a)return!0===b?{content:[],isError:!0}:null;let c=G(a);return c&&"object"==typeof c&&Array.isArray(c.content)?{...c,...!0===b?{isError:!0}:{}}:{content:[{type:"text",text:a}],...!0===b?{isError:!0}:{}}}(c,e);f&&await a.sendToolResult(f)}function I(a,b,c){return b.includes(a)&&c.includes(a)}function J(a,b){let c=a.getBoundingClientRect(),d=Math.max(1,Math.round(c.width||a.clientWidth||1));return b?{width:d,height:Math.max(1,Math.round(c.height||a.clientHeight||1))}:{width:d,maxHeight:6e3}}async function K(a,b,c){try{let d=await u.S.listServerTools(a),e=Array.isArray(d.tools)?d.tools:[],f=c?e.find(a=>a?.name===c):e.find(a=>(0,v.Gt)(a?._meta)===b);if(f?.name&&f?.inputSchema&&(0,v.Gt)(f._meta)===b)return{tool:f}}catch(a){w.debug("Could not resolve the full MCP App tool definition",a)}}let L=({serverName:a,uri:b,toolName:c,toolArgs:D,toolResultContent:G,toolUpdateId:L,toolCancelledReason:M,toolIsError:N,onAppMessage:O,onUpdateModelContext:P,onRequestDock:Q,onDockable:R,onAvailableDisplayModes:S,hostDisplayMode:T,onRequestDisplayMode:U,onRequestClose:V,onRegisterTeardown:W,teardownRegistrationKey:X,docked:Y=!1,visible:Z=!0})=>{let $=(0,f.A)(),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(!1),[ad,ae]=(0,e.useState)(null),[af,ag]=(0,e.useState)(Y?"pip":"inline"),[ah,ai]=(0,e.useState)([]),aj=T??af,ak=(0,e.useMemo)(()=>Y?["pip","fullscreen"]:["inline","fullscreen",...Q?["pip"]:[]],[Y,Q]),al=(0,e.useRef)(null),am=(0,e.useRef)(null),an=(0,e.useRef)(null),ao=(0,e.useRef)(!1),ap=(0,e.useRef)(0),aq=(0,e.useRef)(!1),ar=(0,e.useRef)(null),as=(0,e.useRef)(null),at=(0,e.useRef)(!1),au=(0,e.useRef)(!0),av=(0,e.useRef)([]),aw=(0,e.useRef)(aj),ax=(0,e.useRef)(ak),ay=(0,e.useRef)(Promise.resolve()),az=(0,e.useRef)(void 0),aA=(0,e.useRef)({args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L});aA.current={args:D,resultContent:G,cancelledReason:M,isError:N,updateId:L};let aB=(0,e.useRef)(O);(0,e.useEffect)(()=>{aB.current=O},[O]);let aC=(0,e.useRef)(P);(0,e.useEffect)(()=>{aC.current=P},[P]);let aD=(0,e.useRef)(Q);(0,e.useEffect)(()=>{aD.current=Q},[Q]);let aE=(0,e.useRef)(R);(0,e.useEffect)(()=>{aE.current=R},[R]);let aF=(0,e.useRef)(S);(0,e.useEffect)(()=>{aF.current=S},[S]);let aG=(0,e.useRef)(U);(0,e.useEffect)(()=>{aG.current=U},[U]);let aH=(0,e.useRef)(V);(0,e.useEffect)(()=>{aH.current=V},[V]);let aI=(0,e.useRef)(Y);(0,e.useEffect)(()=>{aI.current=Y},[Y]),(0,e.useEffect)(()=>{aw.current=aj},[aj]),(0,e.useEffect)(()=>{ax.current=ak},[ak]);let aJ=(0,e.useCallback)(()=>{if(as.current)return as.current;ap.current+=1;let a=an.current,b=am.current,c=aq.current;an.current=null,am.current=null,aq.current=!1,ao.current=!1,av.current=[],ar.current?.disconnect(),ar.current=null;let d=(async()=>{if(a&&c){let b;try{await Promise.race([a.teardownResource({},{timeout:1e3}),new Promise(a=>{b=setTimeout(a,1e3)})])}catch(a){w.debug("MCP App did not acknowledge resource teardown",a)}finally{b&&clearTimeout(b)}}try{await a?.close()}catch{}b?.remove()})();return as.current=d,d.finally(()=>{as.current===d&&(as.current=null)}),d},[]),aK=(0,e.useCallback)(()=>{!at.current&&aD.current&&(at.current=!0,aJ().then(()=>{au.current&&(aD.current?.(),aa(!1))}).finally(()=>{at.current=!1}))},[aJ]),aL=(0,e.useCallback)((a,b,c,d,e)=>{ay.current=ay.current.catch(()=>void 0).then(async()=>{an.current===a&&aq.current&&await H(a,b,c,d,e)}).catch(a=>{w.warn("MCP App tool delivery failed",a)})},[]),aM=(0,e.useCallback)(async()=>{if(as.current&&await as.current,ao.current||!al.current)return;let d=ap.current+1;ap.current=d;let e=()=>ap.current===d&&ao.current;ao.current=!0,ai([]),ac(!0),ae(null);try{let f,[g,h]=await Promise.all([u.S.readResourceFromApp(a,b),K(a,b,c)]);if(!e())return;if(g?.httpStatus===403)throw Error(g?.error||"MCP Apps access was disabled for this server");if(!g||!1===g.success)throw Error(g?.error||"Failed to read the UI resource.");let i=function(a,b){var c;let d,e=a?.contents;if(!Array.isArray(e)||0===e.length)throw Error("Resource has no contents");let f=e.find(a=>a.uri===b&&"string"==typeof a.mimeType&&(0,v.q$)(a.mimeType)&&("string"==typeof a.text||"string"==typeof a.blob));if(!f)throw Error(`Resource ${b} did not return MCP App HTML`);try{d="string"==typeof f.text?f.text:function(a){let b=Uint8Array.from(atob(a),a=>a.charCodeAt(0));return new TextDecoder("utf-8",{fatal:!0}).decode(b)}(f.blob)}catch{throw Error(`Resource ${b} contains invalid base64 UTF-8 HTML`)}if(new TextEncoder().encode(d).length>v.Pt)throw Error(`Resource exceeds the ${Math.round(v.Pt/1024)} KiB size cap`);let g=(f._meta??f.meta)?.ui,h=t.c0.safeParse(g?.csp);if(g?.csp!==void 0&&!h.success)throw Error(`Resource ${b} declares an invalid CSP policy`);let i=t.Ml.safeParse(g?.permissions);if(g?.permissions!==void 0&&!i.success)throw Error(`Resource ${b} declares invalid sandbox permissions`);return{html:d,csp:h.success?{connectDomains:F((c=h.data).connectDomains,["https","wss"]),resourceDomains:F(c.resourceDomains,["https"]),frameDomains:F(c.frameDomains,["https"]),baseUriDomains:F(c.baseUriDomains,["https"])}:void 0,permissions:i.success&&i.data.clipboardWrite?{clipboardWrite:{}}:void 0}}(g.data,b),j=await E();if(!e()||!al.current)return;let k=document.createElement("iframe");k.title=`MCP App: ${b}`,k.setAttribute("sandbox","allow-scripts allow-same-origin"),k.referrerPolicy="origin";let l=(0,t.Sy)(i.permissions);l&&k.setAttribute("allow",l),k.style.cssText=aI.current?"width:100%;height:100%;border:none;background:#fff;":"width:100%;min-height:120px;height:200px;border:none;border-radius:4px;background:#fff;",al.current.appendChild(k),am.current=k;let m=new URL(j);i.csp&&m.searchParams.set("csp",JSON.stringify(i.csp));let n=m.origin,o=new Promise((a,b)=>{let c=setTimeout(()=>{window.removeEventListener("message",d),b(Error("Timed out waiting for the sandbox proxy."))},1e4),d=b=>{b.source===k.contentWindow&&b.origin===n&&b.data?.jsonrpc==="2.0"&&b.data?.method==="ui/notifications/sandbox-proxy-ready"&&(clearTimeout(c),window.removeEventListener("message",d),a())};window.addEventListener("message",d)});if(k.src=m.href,await o,!e()||am.current!==k)return;let p=aw.current,q="inline";aw.current=q,f=new t.T1(function(a,b){return{getServerCapabilities:()=>({tools:{},resources:{}}),setNotificationHandler:()=>{},request:async(c,d,e)=>{let{method:f,params:g}=c;if("tools/call"===f){w.info(`MCP App tools/call: ${a}/${g?.name}`);let c=await u.S.callToolFromApp(a,g.name,g.arguments??{},void 0,e?.signal);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Tool call failed: ${g?.name}`);return c.data}if("resources/read"===f){let c=await u.S.readResourceFromApp(a,g.uri);if(c?.httpStatus===403){let a=c?.error||"MCP Apps access was disabled for this server";throw b(a),Error(a)}if(!c||!1===c.success)throw Error(c?.error||`Resource read failed: ${g?.uri}`);return c.data}if("resources/list"===f)return{resources:[]};if("resources/templates/list"===f)return{resourceTemplates:[]};throw Error(`MCP App requested unsupported method: ${f}`)}}}(a,a=>{ap.current===d&&an.current===f&&(ae(a),ac(!1),aJ())}),x,{openLinks:{},serverTools:{},serverResources:{},logging:{},...aB.current?{message:{text:{}}}:{},...aC.current?{updateModelContext:{text:{},structuredContent:{}}}:{},sandbox:{csp:i.csp,permissions:i.permissions}},{hostContext:{...h?{toolInfo:h}:{},theme:"dark"===$.palette.mode?"dark":"light",platform:"web",displayMode:q,availableDisplayModes:ax.current,containerDimensions:J(al.current,aI.current),locale:navigator.language,timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,userAgent:navigator.userAgent,deviceCapabilities:{touch:navigator.maxTouchPoints>0,hover:window.matchMedia?.("(hover: hover)").matches??!1}}}),an.current=f;let r=()=>e()&&an.current===f;if(f.onopenlink=async({url:c})=>{if(!r())return{isError:!0};let d=function(a){try{let b=new URL(a);if(!y.has(b.protocol)||b.username||b.password)return null;return b.href}catch{return null}}(c);if(!d)return w.warn("MCP App open-link rejected by URL policy",{serverName:a,uri:b}),{isError:!0};let e=window.open(d,"_blank","noopener,noreferrer");return e?(e.opener=null,{}):{isError:!0}},f.ondownloadfile=async({contents:a})=>{if(!r())return{isError:!0};try{for(let b of a??[]){let a,c=b?.resource;if(!c)continue;let d=("string"==typeof c.uri?c.uri.split("/").pop():"")||"download",e="string"==typeof c.mimeType?c.mimeType:"application/octet-stream";if("string"==typeof c.blob){let b=Uint8Array.from(atob(c.blob),a=>a.charCodeAt(0));a=new Blob([b],{type:e})}else a=new Blob([String(c.text??"")],{type:e});let f=URL.createObjectURL(a),g=document.createElement("a");g.href=f,g.download=d,document.body.appendChild(g),g.click(),g.remove(),setTimeout(()=>URL.revokeObjectURL(f),4e3)}return{}}catch(a){return w.warn("MCP App download failed",a),{isError:!0}}},f.onloggingmessage=a=>{r()&&w.debug("MCP App log",a?.data)},f.onmessage=async a=>{if(!r())return{};if(!aB.current)throw Error("This host cannot deliver ui/message in this surface");let b=function(a){if(a?.role!=="user")throw Error('This host accepts ui/message only with role "user"');let b=a?.content,c=Array.isArray(b)?b:b&&"object"==typeof b?[b]:[];if(0===c.length||c.some(a=>a?.type!=="text"||"string"!=typeof a.text))throw Error("This host accepts text-only ui/message content");let d=c.map(a=>a.text).join("\n").trim();if(!d)throw Error("ui/message text must not be empty");return d}(a);if(!await aB.current(b))throw Error("ui/message was not delivered");return{}},f.onupdatemodelcontext=async c=>{if(!r())return{};let d=function(a){if(!a||"object"!=typeof a||Array.isArray(a))return"ui/update-model-context params must be an object";if(void 0!==a.content){if(!Array.isArray(a.content))return"Model context content must be an array";for(let b of a.content)if(!b||"object"!=typeof b||Array.isArray(b)||!A.has(b.type))return"Model context contains a modality this host did not advertise"}return void 0!==a.structuredContent&&(!a.structuredContent||"object"!=typeof a.structuredContent||Array.isArray(a.structuredContent))?"Model structuredContent must be an object":C(a)>B?`Model context exceeds ${B} bytes`:null}(c);if(d)throw Error(d);let e=`${a}::${b}`;if(!aC.current)throw Error("This host cannot preserve model context in this surface");if(!await aC.current(e,c))throw Error("MCP App model context was not stored");return{}},f.onsizechange=async({width:a,height:b})=>{if(!r()||aI.current)return;let c=al.current?.getBoundingClientRect().width||al.current?.clientWidth||0,d=function(a,b){let c={};if(Number.isFinite(a.width)&&a.width>0){let d=Number.isFinite(b)&&b>0?b:6e3;c.width=Math.min(a.width,d,6e3)}return Number.isFinite(a.height)&&a.height>0&&(c.height=Math.min(a.height,6e3)),c}({width:a,height:b},c);void 0!==d.height&&(k.style.height=`${d.height}px`),void 0!==d.width&&(k.style.width=`${d.width}px`,k.style.maxWidth="100%")},f.onrequestdisplaymode=async({mode:a})=>{if(!r())return{mode:aw.current};let b=aw.current,c=av.current;if(!I(a,ax.current,c))return{mode:b};if("pip"===a&&!aI.current&&aD.current)return setTimeout(aK,0),{mode:b};let d=b;return(d=aG.current?await aG.current(a,[...c]):a)===b||I(d,ax.current,c)||(d=b),d!==b&&(aw.current=d,ag(d),await f.sendHostContextChange({displayMode:d})),{mode:d}},f.onrequestteardown=()=>{r()&&aJ().finally(()=>{aH.current?aH.current():(aw.current="inline",ag("inline"),aa(!1))})},f.oninitialized=()=>{if(!r())return;let a=f.getAppCapabilities()?.availableDisplayModes,b=Array.isArray(a)?[...new Set(a.filter(a=>z.includes(a)))]:[];av.current=b,ai(b),aE.current?.(b.includes("pip")),aF.current?.([...b]),aq.current=!0;let c=function(a,b,c,d){return b?I("pip",c,d)?"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"pip":null:"fullscreen"===a&&I("fullscreen",c,d)?"fullscreen":"inline"}(p,aI.current,ax.current,b);if(null===c){ae("This app does not declare support for the canvas (pip) display mode."),ac(!1),aJ();return}aw.current=c,ag(c),c!==q&&f.sendHostContextChange({displayMode:c});let d=al.current;if(d&&"undefined"!=typeof ResizeObserver){let a=()=>{if(!r()||!aq.current)return;let a=d.getBoundingClientRect();a.width<=0||aI.current&&a.height<=0||f.sendHostContextChange({containerDimensions:J(d,aI.current)})};ar.current?.disconnect(),ar.current=new ResizeObserver(a),ar.current.observe(d),a()}let e=aA.current;az.current=e.updateId??`${e.args??""}\u0000${e.resultContent??""}\u0000${e.cancelledReason??""}\u0000${e.isError??""}`,(void 0!==e.args||void 0!==e.resultContent||void 0!==e.cancelledReason||!0===e.isError)&&aL(f,e.args,e.resultContent,e.cancelledReason,e.isError),ac(!1)},await f.connect(function(a,b){let c=new t.hJ(a,b),d={start:async()=>{c.onmessage=(a,b)=>{d.onmessage?.("ui/message"!==a.method||!a.params||Array.isArray(a.params.content)||!a.params.content||"object"!=typeof a.params.content?a:{...a,params:{...a.params,content:[a.params.content]}},b)},c.onerror=a=>d.onerror?.(a),c.onclose=()=>d.onclose?.(),await c.start()},send:(a,b)=>c.send(a,b),close:()=>c.close(),setProtocolVersion:a=>c.setProtocolVersion?.(a)};return d}(k.contentWindow,k.contentWindow)),!r())return;await f.sendSandboxResourceReady({html:i.html,csp:i.csp,permissions:i.permissions})}catch(c){if(!e())return;w.warn(`Failed to mount MCP App ${b} from ${a}`,c),ae(c instanceof Error?c.message:"Failed to load the app."),ac(!1),aJ()}},[aK,aL,a,aJ,$.palette.mode,c,b]),aN=(0,e.useCallback)(()=>{let a=!_;a||"fullscreen"!==aw.current||(aw.current="inline",ag("inline"),an.current?.sendHostContextChange({displayMode:"inline"})),aa(a),a&&setTimeout(()=>{aM()},0)},[_,aM]);if((0,e.useEffect)(()=>{Y&&!ao.current&&aM()},[Y,aM]),(0,e.useEffect)(()=>{let a=L??`${D??""}\u0000${G??""}\u0000${M??""}\u0000${N??""}`;aq.current&&an.current&&a!==az.current&&(az.current=a,aJ().then(()=>{au.current&&(aI.current||_)&&aM()}))},[_,aM,aJ,D,M,N,G,L]),(0,e.useEffect)(()=>{T&&aq.current&&an.current&&aw.current!==T&&I(T,ax.current,av.current)&&(aw.current=T,ag(T),an.current.sendHostContextChange({displayMode:T}))},[T]),(0,e.useEffect)(()=>{aq.current&&an.current&&an.current?.sendHostContextChange({theme:"dark"===$.palette.mode?"dark":"light"})},[$.palette.mode]),(0,e.useEffect)(()=>{let c=X??`${a}::${b}`;return W?.(c,aJ),()=>W?.(c,null)},[W,a,aJ,X,b]),(0,e.useEffect)(()=>{let b=b=>{let c=b.detail;c?.serverName===a&&(c.config?.enableMcpApps===!1||c.config?.disabled===!0)&&(ae("MCP Apps access was disabled for this server."),ac(!1),aJ().finally(()=>{aI.current&&aH.current?.()}))};return window.addEventListener("flujo:mcp-server-config-changed",b),()=>{window.removeEventListener("flujo:mcp-server-config-changed",b)}},[a,aJ]),(0,e.useEffect)(()=>(au.current=!0,()=>{au.current=!1,aJ()}),[aJ]),Y)return(0,d.jsxs)(g.default,{sx:{height:"100%",width:"100%",minHeight:0,display:"flex",visibility:Z?"visible":"hidden",pointerEvents:Z?"auto":"none",flexDirection:"column"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{m:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{flex:1,minHeight:0,width:"100%",display:ad?"none":"block"}})]});let aO=ah.includes("inline")&&ah.includes("fullscreen")&&ak.includes("fullscreen"),aP=ah.includes("inline")&&ah.includes("pip")&&ak.includes("pip")&&!!Q;return(0,d.jsxs)(g.default,{sx:{mt:1,border:"1px solid",borderColor:"divider",borderRadius:1,overflow:"hidden",..."fullscreen"===af?{position:"fixed",inset:16,zIndex:1300,bgcolor:"background.paper",boxShadow:6}:{}},children:[(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,px:1,py:.5,bgcolor:"action.hover"},children:[(0,d.jsx)(n.A,{fontSize:"small",color:"primary"}),(0,d.jsxs)(i.default,{variant:"body2",sx:{fontWeight:500},children:["Interactive app from ",a]}),(0,d.jsx)(k.A,{title:"Runs in a separate-origin sandbox (no access to FLUJO's origin, cookies, storage, or DOM). Its tool calls are brokered through this server only.",children:(0,d.jsx)(o.A,{fontSize:"small",color:"action"})}),(0,d.jsx)(g.default,{sx:{flex:1}}),_&&aP&&(0,d.jsx)(l.A,{size:"small",onClick:aK,children:"Canvas"}),_&&(0,d.jsx)(k.A,{title:aO?"fullscreen"===af?"Exit fullscreen":"Fullscreen":"This app did not declare inline and fullscreen support",children:(0,d.jsx)("span",{children:(0,d.jsx)(l.A,{size:"small",disabled:!aO,onClick:()=>{let a="fullscreen"===af?"inline":"fullscreen";I(a,ak,ah)&&(aw.current=a,ag(a),an.current?.sendHostContextChange({displayMode:a}))},sx:{minWidth:0},children:"fullscreen"===af?(0,d.jsx)(s.A,{fontSize:"small"}):(0,d.jsx)(r.A,{fontSize:"small"})})})}),(0,d.jsx)(l.A,{size:"small",onClick:aN,startIcon:_?(0,d.jsx)(q.A,{}):(0,d.jsx)(p.A,{}),children:_?"Hide":"Open app"})]}),(0,d.jsx)(m.A,{in:_,onExited:()=>{aJ()},children:(0,d.jsxs)(g.default,{sx:{p:1,height:"fullscreen"===af?"calc(100vh - 100px)":"auto"},children:[ab&&(0,d.jsxs)(g.default,{sx:{display:"flex",alignItems:"center",gap:1,py:2,justifyContent:"center"},children:[(0,d.jsx)(h.default,{size:16,thickness:6}),(0,d.jsx)(i.default,{variant:"body2",color:"text.secondary",children:"Loading the app…"})]}),ad&&(0,d.jsx)(j.A,{severity:"error",sx:{my:1},children:ad}),(0,d.jsx)(g.default,{ref:al,sx:{width:"100%",height:"fullscreen"===af?"100%":"auto",display:ad?"none":"block"}})]})})]})}},59060:(a,b,c)=>{c.d(b,{Gt:()=>h,Pt:()=>e,q$:()=>g});let d="ui://",e=2097152;function f(a){return"string"==typeof a&&a.length>d.length&&a.slice(0,d.length).toLowerCase()===d&&!/\s/.test(a)}function g(a){if("string"!=typeof a)return!1;let[b,...c]=a.toLowerCase().split(";");if("text/html"!==b.trim())return!1;let d=!1;for(let a of c){let b=a.indexOf("=");if(b<=0)return!1;let c=a.slice(0,b).trim(),e=a.slice(b+1).trim();if(!c||!e)return!1;if("profile"===c){if(d||"mcp-app"!==e)return!1;d=!0}}return d}function h(a){if(!a||"object"!=typeof a)return;let b=a["ui/resourceUri"];if(f(b))return b;for(let b of[a.ui,a["io.modelcontextprotocol/ui"]])if(b&&"object"==typeof b){let a=b.resourceUri;if(f(a))return a}}},82571:(a,b,c)=>{c.d(b,{Hm:()=>f,xc:()=>e,yo:()=>g});let d=["key","secret","token","password"],e=a=>d.some(b=>a.toLowerCase().includes(b)),f=a=>e(a)||"authorization"===a.trim().toLowerCase(),g=a=>{if(!a)return a;if(a.includes("_-_-_")){let b=a.split("_-_-_");return 3===b.length?b[2]:a}let b=/^mcp_(.+)_[0-9a-z]+$/.exec(a);if(b&&b[1])return b[1];let c=a.indexOf("__");return c>0&&c+2<a.length?a.slice(c+2):a}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=1805,exports.ids=[1805],exports.modules={74186:(a,b,c)=>{c.d(b,{loadServerConfigs:()=>q,q:()=>r});var d=c(33873),e=c.n(d),f=c(34322),g=c(92372),h=c(38844),i=c(50846),j=c(43326);let k=(0,i.h)("backend/services/mcp/config"),l=new Set(["streamable","sse","websocket"]),m=e().join((0,j.getDataDir)(),"mcp-servers"),n=new Map;async function o(a){if(n.has(a))return n.get(a);let b=null;try{let c=(0,f.Ay)({baseDir:a,timeout:{block:5e3}});b=(await c.remote(["get-url","origin"])||"").trim()||null}catch{b=null}return n.set(a,b),b}async function p(a){var b;if(l.has(a.transport))return{type:"remote"};let c="string"!=typeof(b=a.rootPath)||""===b.trim()?null:e().isAbsolute(b)?b:e().resolve((0,j.getDataDir)(),b);if(c&&function(a){let b=e().relative(m,a);return""!==b&&!b.startsWith("..")&&!e().isAbsolute(b)}(c)){let a=await o(c);if(a)return{type:"github",repositoryUrl:a}}return{type:"local"}}async function q(){k.debug("Entering loadServerConfigs method");try{let a=await (0,g.
|
|
1
|
+
"use strict";exports.id=1805,exports.ids=[1805],exports.modules={74186:(a,b,c)=>{c.d(b,{loadServerConfigs:()=>q,q:()=>r});var d=c(33873),e=c.n(d),f=c(34322),g=c(92372),h=c(38844),i=c(50846),j=c(43326);let k=(0,i.h)("backend/services/mcp/config"),l=new Set(["streamable","sse","websocket"]),m=e().join((0,j.getDataDir)(),"mcp-servers"),n=new Map;async function o(a){if(n.has(a))return n.get(a);let b=null;try{let c=(0,f.Ay)({baseDir:a,timeout:{block:5e3}});b=(await c.remote(["get-url","origin"])||"").trim()||null}catch{b=null}return n.set(a,b),b}async function p(a){var b;if(l.has(a.transport))return{type:"remote"};let c="string"!=typeof(b=a.rootPath)||""===b.trim()?null:e().isAbsolute(b)?b:e().resolve((0,j.getDataDir)(),b);if(c&&function(a){let b=e().relative(m,a);return""!==b&&!b.startsWith("..")&&!e().isAbsolute(b)}(c)){let a=await o(c);if(a)return{type:"github",repositoryUrl:a}}return{type:"local"}}async function q(){k.debug("Entering loadServerConfigs method");try{let a=await (0,g.loadItem)(h.Z.MCP_SERVERS,{}),b=Object.entries(a).map(([a,b])=>{let c=b.transport||"stdio";l.has(c)&&function(a){if("string"!=typeof a)return!1;let b=a.trim();return"/"===b||"\\"===b||/^[A-Za-z]:[\\/]?$/.test(b)}(b.rootPath)&&(k.info(`Normalizing filesystem-root rootPath "${b.rootPath}" of remote server ${a} to mcp-servers/${a}`),b={...b,rootPath:`mcp-servers/${a}`});let d={name:a,disabled:!1,autoApprove:[],rootPath:"",env:{},_buildCommand:"",_installCommand:""};return"streamable"===c?{...d,...b,name:a,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0,reconnectionOptions:b.reconnectionOptions&&"object"==typeof b.reconnectionOptions?b.reconnectionOptions:void 0,sessionId:b.sessionId||void 0,oauthClientId:b.oauthClientId||"",oauthClientSecret:b.oauthClientSecret||"",oauthScopes:b.oauthScopes||(b.oauthClientId||b.oauthClientInformation?["read"]:void 0),oauthClientMetadata:b.oauthClientMetadata,oauthClientInformation:b.oauthClientInformation,oauthTokens:b.oauthTokens,oauthCodeVerifier:b.oauthCodeVerifier}:"sse"===c?{...d,...b,name:a,eventSourceInit:b.eventSourceInit&&"object"==typeof b.eventSourceInit?b.eventSourceInit:void 0,requestInit:b.requestInit&&"object"==typeof b.requestInit?b.requestInit:void 0}:"websocket"===c?{...d,...b,name:a,websocketUrl:b.websocketUrl||""}:{...d,...b,name:a,command:b.command||"",args:b.args||[],stderr:b.stderr||"pipe"}});return await Promise.all(b.map(async a=>{a.source||(a.source=await p(a))})),b}catch(a){return k.warn("Failed to load server configs",a),{success:!1,error:`Failed to load server configs: ${a instanceof Error?a.message:"Unknown error"}`}}}async function r(a){k.debug("Entering saveConfig method");try{let b=Object.fromEntries(Array.from(a.entries()).filter(([,a])=>!0!==a.builtIn).map(([a,b])=>{let{name:c,...d}=b;return[a,d]}));return await (0,g.VH)(h.Z.MCP_SERVERS,b),{success:!0}}catch(a){return k.warn("Failed to save config",a),{success:!1,error:`Failed to save config: ${a instanceof Error?a.message:"Unknown error"}`}}}}};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";exports.id=2273,exports.ids=[1925,2273,3629,4306,6793,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()},21508:(a,b,c)=>{c.d(b,{Qs:()=>d,oT:()=>f});let d="https://registry.flujo.com.co",e=["github","google"];function f(a){return"string"==typeof a&&e.includes(a)}},28511:(a,b,c)=>{c.d(b,{Ed:()=>u,ae:()=>w,jA:()=>x,qf:()=>v});var d=c(55511),e=c(32524),f=c(50846),g=c(92372),h=c(38844),i=c(25113),j=c(93868),k=c(75943),l=c(14265),m=c(20433),n=c(87821),o=c(60453),p=c(4771);let q=(0,f.h)("backend/services/packages/installPackage");function r(a){return a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function s(a,b){if("string"==typeof a){if(!a.includes("{{secret."))return a;let c=RegExp(j.HQ.source,"g");return a.replace(c,(a,c)=>Object.prototype.hasOwnProperty.call(b,c)?b[c]:a)}if(Array.isArray(a))return a.map(a=>s(a,b));if(a&&"object"==typeof a){let c={};for(let[d,e]of Object.entries(a))c[d]=s(e,b);return c}return a}async function t(a){if(!a||0===a.length)return[];let b=await (0,g.YM)(h.Z.GLOBAL_ENV_VARS,{});return a.filter(a=>!Object.prototype.hasOwnProperty.call(b,a))}async function u(a){let b,c=()=>({ok:!1,dryRun:!0!==a.consentGranted,created:[],updated:[],skipped:[],disabled:[],servers:[],errors:[],missingGlobals:[]});if("registry"!==a.source){let b=c();return b.errors.push(`Unsupported package source: ${String(a.source)}`),b}try{b=await (0,k.g)(a.packageId,a.version)}catch(d){let b=c();return b.errors.push(`Failed to fetch package "${a.packageId}": ${d instanceof Error?d.message:String(d)}`),b}let d=(0,i.$j)(b);if(!d.success||!d.data){let a=c();return a.errors.push("Invalid package manifest.",...d.errors??[]),a}let e=d.data,f=a.secrets??{},j=a=>Object.prototype.hasOwnProperty.call(f,a)&&`${f[a]??""}`.length>0,l=a=>(e.secrets??[]).some(b=>b.name===a&&!0===b.required);if(!0!==a.consentGranted)return{ok:!0,dryRun:!0,package:{name:e.name,version:e.version,...e.publisher?{publisher:e.publisher}:{}},preview:{...await z(e,j),missingGlobals:await t(e.requiredGlobals)},created:[],updated:[],skipped:[],disabled:[],servers:[],errors:[],missingGlobals:[]};let n=await m.modelService.loadModels(),p=new Set((e.models??[]).map(a=>a.id)),r=new Map(n.map(a=>[a.id,a]));for(let[b,d]of Object.entries(a.modelMappings??{}))if(!p.has(b)||!r.has(d)){let a=c();return a.errors.push(`Invalid model mapping: "${b}" -> "${d}"`),a}let u={ok:!0,dryRun:!1,package:{name:e.name,version:e.version,...e.publisher?{publisher:e.publisher}:{}},created:[],updated:[],skipped:[],disabled:[],servers:[],errors:[],missingGlobals:await t(e.requiredGlobals)},v=(e.models??[]).map(a=>s(a,f)),w=(e.flows??[]).map(a=>s(a,f)),x=(e.plannedExecutions??[]).map(a=>s(a,f)),y={flows:{},models:{},servers:[],plannedExecutions:[]},A={flows:[],models:[],servers:[],plannedExecutions:[]},B=new Set,D=new Map;try{let a=await o.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a)B.add(b.name),D.set(b.name,b)}catch(a){q.warn("installPackage: failed to snapshot existing server names",a)}for(let a of e.mcpServers??[])await C(a,{packageFolder:e.name,secrets:f,secretProvided:j,secretRequired:l,summary:u,ledgerEntities:y,ledgerCreated:A,existingServerNames:B,existingServerConfigs:D});let E={};for(let b of v){let c=a.modelMappings?.[b.id];if(c){let a=r.get(c);E[b.id]={id:a.id,name:a.name},u.skipped.push({type:"model",name:b.displayName||b.name,id:a.id,note:`substituted with installed model "${a.displayName||a.name}"`});continue}let d=await F(b,{packageFolder:e.name,secrets:f,secretProvided:j,secretRequired:l,summary:u,ledgerEntities:y,ledgerCreated:A,existingServerNames:B,existingServerConfigs:D});d&&(E[b.id]=d)}let I=await G(e.name,w,E,u,y,A);for(let a of x)await H(a,e.name,I,u,y,A);try{let a=await (0,g.YM)(h.Z.PACKAGE_INSTALLS,{});a[e.name]={packageName:e.name,version:e.version,installedAt:new Date().toISOString(),summary:u,entities:y,created:A},await (0,g.VH)(h.Z.PACKAGE_INSTALLS,a)}catch(a){q.warn("installPackage: failed to persist install ledger",a)}return u}async function v(a){let b=await (0,g.YM)(h.Z.PACKAGE_INSTALLS,{});return b[a]?.summary??null}async function w(){return Object.values(await (0,g.YM)(h.Z.PACKAGE_INSTALLS,{})).map(a=>({packageName:a.packageName,version:a.version,installedAt:a.installedAt,entityCounts:{flows:Object.keys(a.entities?.flows??{}).length,models:Object.keys(a.entities?.models??{}).length,servers:(a.entities?.servers??[]).length,plannedExecutions:(a.entities?.plannedExecutions??[]).length}}))}async function x(a){let b={packageName:a,ok:!0,hasErrors:!1,removed:[],skipped:[],errors:[]},c=(await (0,g.YM)(h.Z.PACKAGE_INSTALLS,{}))[a];if(!c)return b;let d=c.created,e=void 0!==d,f=async(a,c)=>{try{var d,e=await c();e.success?b.removed.push(a):(d=e.error)&&/not found|no planned execution with id|does not exist/i.test(d)?b.skipped.push({...a,reason:"not found"}):b.errors.push({...a,reason:e.error??"delete failed"})}catch(c){b.errors.push({...a,reason:c instanceof Error?c.message:String(c)})}},i=(0,p.getSchedulerService)();for(let a of c.entities?.plannedExecutions??[]){let c={kind:"plannedExecution",id:a};if(e&&!d.plannedExecutions.includes(a)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>i.delete(a))}for(let[a,g]of Object.entries(c.entities?.flows??{})){let c={kind:"flow",id:g,label:a};if(e&&!d.flows.includes(g)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>n.flowService.deleteFlow(g))}for(let a of c.entities?.servers??[]){let c={kind:"server",id:a};if(e&&!d.servers.includes(a)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>o.mcpService.deleteServerConfig(a))}for(let[a,g]of Object.entries(c.entities?.models??{})){let c={kind:"model",id:g,label:a};if(!e){b.skipped.push({...c,reason:"legacy-ledger-no-provenance"});continue}if(!d.models.includes(g)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>m.modelService.deleteModel(g))}if(b.hasErrors=b.errors.length>0,b.ok=!b.hasErrors,!b.hasErrors)try{let b=await (0,g.YM)(h.Z.PACKAGE_INSTALLS,{});delete b[a],await (0,g.VH)(h.Z.PACKAGE_INSTALLS,b)}catch(a){q.warn("uninstallPackage: failed to delete ledger entry",a)}return b}function y(a){let b=a.installOrigin;return"remote"===b.sourceType?`remote:${b.url}`:`${b.sourceType}:${b.ref??b.name??a.name}`}async function z(a,b){let c=await m.modelService.loadModels();return{servers:(a.mcpServers??[]).map(c=>({localName:c.name,source:y(c),requiredEnvMissing:[...c.envDeclarations,...c.headerDeclarations??[]].map(a=>a.secretRef).filter(a=>"string"==typeof a&&a.length>0).filter(c=>(a.secrets??[]).some(a=>a.name===c&&a.required)&&!b(c))})),models:(a.models??[]).map(c=>({id:c.id,displayName:c.displayName||c.name,..."global"===c.apiKeyRef.kind?{apiKeyFrom:`\${global:${c.apiKeyRef.var}}`}:"secret"===c.apiKeyRef.kind?{apiKeyFrom:`secret:${c.apiKeyRef.secret}`}:{},..."secret"===c.apiKeyRef.kind&&(a.secrets??[]).some(a=>a.name===c.apiKeyRef.secret&&a.required)&&!b(c.apiKeyRef.secret)?{missingRequiredSecret:!0}:{}})),installedModels:c.map(a=>({id:a.id,displayName:a.displayName||a.name,name:a.name})),flows:(a.flows??[]).map(a=>({name:a.flow.name})),plannedExecutions:(a.plannedExecutions??[]).map(a=>({name:a.name})),secrets:(a.secrets??[]).map(a=>({key:a.name,...a.description?{label:a.description}:{},required:!0===a.required,provided:b(a.name)}))}}function A(a,b){let{secrets:c,secretProvided:d,secretRequired:e}=b,f={},g=new Set,h=[];for(let b of a)b.secretRef?d(b.secretRef)?(f[b.name]=c[b.secretRef],b.isSecret&&g.add(b.name)):e(b.secretRef)&&h.push(b.name):b.globalVar&&(f[b.name]=`\${global:${b.globalVar}}`,b.isSecret&&g.add(b.name));return{values:f,secretNames:g,missingRequired:h}}async function B(a,b,c,d,e){let{packageFolder:f,summary:g,ledgerEntities:h,existingServerConfigs:i}=b,j=y(a),k=i.get(a.name);if(!k){g.servers.push({localName:a.name,source:j,installed:!1,error:"server vanished between snapshot and install"}),g.skipped.push({type:"server",name:a.name,note:"server not found in configs (stale snapshot)"});return}let l={...k.env??{}};for(let[a,b]of Object.entries(d))l[a]=e.has(a)?{value:b,metadata:{isSecret:!0}}:b;let m=await o.mcpService.updateServerConfig(a.name,{env:l,folder:f});if(!Array.isArray(m)&&m&&"success"in m&&!1===m.success){let b=m.error??"unknown error";g.servers.push({localName:a.name,source:j,installed:!1,error:b}),g.skipped.push({type:"server",name:a.name,note:b});return}h.servers.push(a.name),g.servers.push({localName:a.name,source:j,installed:!0,serverName:a.name,alreadyExisted:!0});let n=c.length>0?`env partially merged — missing required secret(s) for: ${c.join(", ")}`:void 0;g.updated.push({type:"server",name:a.name,id:a.name,...n?{note:n}:{}})}async function C(a,b){let{secrets:c,summary:d,ledgerEntities:e,ledgerCreated:f,existingServerNames:g}=b,h=y(a),i=a.installOrigin,j=A(a.envDeclarations,b),k=A(a.headerDeclarations??[],b),m=[...j.missingRequired,...k.missingRequired],n={};for(let[a,b]of Object.entries(k.values))n[a]=k.secretNames.has(a)?{value:b,metadata:{isSecret:!0}}:b;if("github"===i.sourceType){d.servers.push({localName:a.name,source:h,installed:!1,error:"GitHub-sourced servers are not auto-installable yet — install manually from the MCP page"}),d.skipped.push({type:"server",name:a.name,note:"GitHub-sourced servers require manual install"});return}if("registry"===i.sourceType||"marketplace"===i.sourceType){let c=i.ref??i.name;if(!c){d.servers.push({localName:a.name,source:h,installed:!1,error:"missing registry ref"}),d.skipped.push({type:"server",name:a.name,note:"installOrigin has no ref/name"});return}if(g.has(a.name))return void await B(a,b,m,j.values,j.secretNames);if(m.length>0){d.disabled.push({type:"server",name:a.name,note:`missing required secret(s) for: ${m.join(", ")}`}),d.servers.push({localName:a.name,source:h,installed:!1,needsEnv:m});return}let k=await (0,l.aM)(c,j.values),n={localName:a.name,source:h,installed:k.installed,...k.serverName?{serverName:k.serverName}:{},...k.alreadyExisted?{alreadyExisted:!0}:{},...k.needsEnv?{needsEnv:k.needsEnv}:{},...k.error?{error:k.error}:{}};if(d.servers.push(n),k.installed){k.serverName&&await D(k.serverName,b.packageFolder),k.serverName&&e.servers.push(k.serverName);let c={type:"server",name:a.name,...k.serverName?{id:k.serverName}:{}};k.alreadyExisted?d.updated.push(c):(k.serverName&&f.servers.push(k.serverName),d.created.push(c),k.serverName&&j.secretNames.size>0&&await E(k.serverName,j.values,j.secretNames))}else d.skipped.push({type:"server",name:a.name,note:k.error??(k.needsEnv?`needs env: ${k.needsEnv.join(", ")}`:"not installed")});return}let p=m.length>0;try{let c=function(a,b,c,d,e,f){let g=a.installOrigin;if("remote"!==g.sourceType||!g.url)throw Error("buildRemoteServerConfig called for a non-remote (or url-less) server");let h="websocket"===a.transport||"sse"===a.transport||"streamable"===a.transport?a.transport:"streamable",i={name:a.name,folder:b,disabled:d,autoApprove:a.autoApprove??[],rootPath:"",env:Object.fromEntries(Object.entries(c).map(([a,b])=>[a,f.has(a)?{value:b,metadata:{isSecret:!0}}:b])),_buildCommand:"",_installCommand:""};if("websocket"===h)return{...i,transport:"websocket",websocketUrl:g.url};let j=Object.keys(e).length>0;return{...i,transport:h,serverUrl:g.url,...j?{headers:e}:{}}}(a,b.packageFolder,j.values,p,n,j.secretNames),i=await o.mcpService.updateServerConfig(a.name,c);if(!Array.isArray(i)&&i&&"success"in i&&!1===i.success){let b=i.error??"unknown error";d.servers.push({localName:a.name,source:h,installed:!1,error:b}),d.skipped.push({type:"server",name:a.name,note:b});return}e.servers.push(a.name),g.has(a.name)||f.servers.push(a.name),d.servers.push({localName:a.name,source:h,installed:!0,serverName:a.name,...p?{disabled:!0,needsEnv:m}:{}});let k={type:"server",name:a.name,id:a.name};p?d.disabled.push({...k,note:`installed disabled — missing required secret(s) for: ${m.join(", ")}`}):d.created.push(k)}catch(c){let b=c instanceof Error?c.message:String(c);d.servers.push({localName:a.name,source:h,installed:!1,error:b}),d.skipped.push({type:"server",name:a.name,note:b})}}async function D(a,b){try{let c=await o.mcpService.updateServerConfig(a,{folder:b});!Array.isArray(c)&&c&&"success"in c&&!1===c.success&&q.warn(`assignServerPackageFolder: failed to assign "${a}" to "${b}": ${c.error??"unknown error"}`)}catch(c){q.warn(`assignServerPackageFolder: failed to assign "${a}" to "${b}"`,c)}}async function E(a,b,c){if(0===c.size)return;let d=await o.mcpService.loadServerConfigs().catch(()=>null);if(!Array.isArray(d))return;let e=d.find(b=>b.name===a);if(!e)return;let f={...e.env??{}},g=!1;for(let a of c)void 0!==b[a]&&(f[a]={value:b[a],metadata:{isSecret:!0}},g=!0);if(g)try{await o.mcpService.updateServerConfig(a,{env:f})}catch(b){q.warn(`tagSecretEnvKeys: failed to re-tag secret env for "${a}"`,b)}}async function F(a,b){let c,{packageFolder:d,secrets:f,secretProvided:g,secretRequired:h,summary:i,ledgerEntities:j,ledgerCreated:k}=b,l="";if("global"===a.apiKeyRef.kind)l=`\${global:${a.apiKeyRef.var}}`;else if("secret"===a.apiKeyRef.kind){let b=a.apiKeyRef.secret;g(b)?l=f[b]:h(b)&&(c=`installed without an API key — missing required secret "${b}"`)}let n=a.displayName||a.name,o={name:a.name,displayName:n,...a.provider?{provider:a.provider}:{},...a.adapter?{adapter:a.adapter}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.description?{description:a.description}:{},...a.promptTemplate?{promptTemplate:a.promptTemplate}:{},...a.temperature?{temperature:a.temperature}:{},...a.reasoningEffort?{reasoningEffort:a.reasoningEffort}:{},...a.thinkingLevel?{thinkingLevel:a.thinkingLevel}:{},...void 0!==a.thinkingBudget?{thinkingBudget:a.thinkingBudget}:{},...a.serviceTier?{serviceTier:a.serviceTier}:{},...a.reasoningSchema?{reasoningSchema:a.reasoningSchema}:{},...a.functionCallingSchema?{functionCallingSchema:a.functionCallingSchema}:{},...void 0!==a.contextWindow?{contextWindow:a.contextWindow}:{},...void 0!==a.maxTurns?{maxTurns:a.maxTurns}:{},...void 0!==a.maxTokens?{maxTokens:a.maxTokens}:{},folder:d,ApiKey:l},p=(await m.modelService.loadModels()).find(a=>(a.displayName??"").toLowerCase()===n.toLowerCase());if(p){let b=await m.modelService.updateModel({...p,...o,id:p.id});if(b.success){j.models[n]=p.id;let b={type:"model",name:n,id:p.id};return c?i.disabled.push({...b,note:c}):i.updated.push(b),{id:p.id,name:a.name}}return void i.skipped.push({type:"model",name:n,note:b.error})}let q=(0,e.A)(),r=await m.modelService.addModel({id:q,...o});if(r.success){j.models[n]=q,k.models.push(q);let b={type:"model",name:n,id:q};return c?i.disabled.push({...b,note:c}):i.created.push(b),{id:q,name:a.name}}i.skipped.push({type:"model",name:n,note:r.error})}async function G(a,b,c,e,f,g){let h={};for(let c of b)h[c.flow.id]=function(a,b){var c;let e=`pkg-${r(a)}-${r(b)}`.replace(/[^A-Za-z0-9_-]/g,"-");return e.length<=64?e:`${e.slice(0,55)}-${c=`${a}::${b}`,(0,d.createHash)("sha1").update(c).digest("hex").slice(0,8)}`}(a,c.flow.id);let i=new Set((await n.flowService.loadFlows()).map(a=>a.id));for(let d of b){let b=d.flow.id,j=h[b],k=function(a,b,c,d){let e=JSON.parse(JSON.stringify(a.flow));for(let a of(e.id=b,delete e.createdAt,delete e.updatedAt,e.nodes??[])){let b=a?.data?.properties;if(b&&("string"==typeof b.subflowId&&c[b.subflowId]&&(b.subflowId=c[b.subflowId]),Array.isArray(b.parallelSubflowIds)&&(b.parallelSubflowIds=b.parallelSubflowIds.map(a=>"string"==typeof a&&c[a]?c[a]:a)),"string"==typeof b.boundModel&&d[b.boundModel])){let a=d[b.boundModel];b.boundModel=a.id,b.modelName=a.name}}return e}(d,j,h,c);k.folder=a;let l=i.has(j),m=await n.flowService.saveFlow(k);if(m.success){f.flows[b]=j;let a={type:"flow",name:d.flow.name,id:j};l?e.updated.push(a):(g.flows.push(j),e.created.push(a))}else e.skipped.push({type:"flow",name:d.flow.name,note:m.error})}return h}async function H(a,b,c,d,e,f){var g;let h=(0,p.getSchedulerService)(),i=(g=a.name,`pkg-${r(b)}-${r(g)}`.replace(/[^A-Za-z0-9._:-]/g,"-").slice(0,128)),j=c[a.flowId]??a.flowId,{id:k,flowId:l,createdAt:m,updatedAt:n,...o}=a,q={...o,id:i,flowId:j,folder:b,enabled:!1},s=await h.create(q);if(s.execution){e.plannedExecutions.push(i),f.plannedExecutions.push(i),d.created.push({type:"plannedExecution",name:a.name,id:i}),d.disabled.push({type:"plannedExecution",name:a.name,id:i,note:"created disabled — enable it after review"});return}if(s.conflict){let{id:b,...c}=q,f=await h.update(i,c);f.execution?(e.plannedExecutions.push(i),d.updated.push({type:"plannedExecution",name:a.name,id:i}),d.disabled.push({type:"plannedExecution",name:a.name,id:i,note:"updated (disabled) — enable it after review"})):d.skipped.push({type:"plannedExecution",name:a.name,note:f.error});return}d.skipped.push({type:"plannedExecution",name:a.name,note:s.error})}},51669:(a,b)=>{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)=>{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)=>{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)()}})}},75879:(a,b,c)=>{Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},75943:(a,b,c)=>{c.d(b,{g:()=>h,i:()=>g});var d=c(50846),e=c(80233);let f=(0,d.h)("backend/services/packages/packageRegistry");async function g(a){let{status:b,body:c}=await (0,e.sB)(a);return b<200||b>=300?(f.warn(`searchPackageRegistry: registry responded with status ${b}`),{items:[],page:a.page??1,pageSize:a.pageSize??20,total:0,error:c?.error??`Registry responded with status ${b}`}):c}async function h(a,b){if(!a||"string"!=typeof a)throw Error("A package id is required");let{status:c,body:d}=await (0,e.wf)(a,b&&b.trim()?b.trim():"latest");if(c<200||c>=300)throw Error(d?.error??d?.message??`Registry responded with status ${c}`);return d}},80233:(a,b,c)=>{c.d(b,{$5:()=>p,Nb:()=>s,Ow:()=>r,Tr:()=>x,Wz:()=>w,eo:()=>u,iD:()=>q,s2:()=>v,sB:()=>n,uJ:()=>j,w2:()=>t,wf:()=>o});var d=c(50846),e=c(92372),f=c(38844),g=c(21508);let h=(0,d.h)("backend/utils/packageRegistryClient");function i(a){return a.trim().replace(/\/+$/,"")}async function j(){let a=process.env.FLUJO_REGISTRY_BASE_URL?.trim();if(a)return i(a);let b=await (0,e.
|
|
1
|
+
"use strict";exports.id=2273,exports.ids=[1925,2273,3629,4306,6793,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()},21508:(a,b,c)=>{c.d(b,{Qs:()=>d,oT:()=>f});let d="https://registry.flujo.com.co",e=["github","google"];function f(a){return"string"==typeof a&&e.includes(a)}},28511:(a,b,c)=>{c.d(b,{Ed:()=>u,ae:()=>w,jA:()=>x,qf:()=>v});var d=c(55511),e=c(32524),f=c(50846),g=c(92372),h=c(38844),i=c(25113),j=c(93868),k=c(75943),l=c(14265),m=c(20433),n=c(87821),o=c(60453),p=c(4771);let q=(0,f.h)("backend/services/packages/installPackage");function r(a){return a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function s(a,b){if("string"==typeof a){if(!a.includes("{{secret."))return a;let c=RegExp(j.HQ.source,"g");return a.replace(c,(a,c)=>Object.prototype.hasOwnProperty.call(b,c)?b[c]:a)}if(Array.isArray(a))return a.map(a=>s(a,b));if(a&&"object"==typeof a){let c={};for(let[d,e]of Object.entries(a))c[d]=s(e,b);return c}return a}async function t(a){let b=new Set(a.requiredGlobals??[]);for(let c of a.globals??[])c.required&&b.add(c.name);if(0===b.size)return[];let c=await (0,g.loadItem)(h.Z.GLOBAL_ENV_VARS,{});return[...b].filter(a=>!Object.prototype.hasOwnProperty.call(c,a))}async function u(a){let b,c=()=>({ok:!1,dryRun:!0!==a.consentGranted,created:[],updated:[],skipped:[],disabled:[],servers:[],errors:[],missingGlobals:[]});if("registry"!==a.source){let b=c();return b.errors.push(`Unsupported package source: ${String(a.source)}`),b}try{b=await (0,k.g)(a.packageId,a.version)}catch(d){let b=c();return b.errors.push(`Failed to fetch package "${a.packageId}": ${d instanceof Error?d.message:String(d)}`),b}let d=(0,i.$j)(b);if(!d.success||!d.data){let a=c();return a.errors.push("Invalid package manifest.",...d.errors??[]),a}let e=d.data,f=a.secrets??{},j=a=>Object.prototype.hasOwnProperty.call(f,a)&&`${f[a]??""}`.length>0,l=a=>(e.secrets??[]).some(b=>b.name===a&&!0===b.required);if(!0!==a.consentGranted)return{ok:!0,dryRun:!0,package:{name:e.name,version:e.version,...e.publisher?{publisher:e.publisher}:{}},preview:{...await z(e,j),missingGlobals:await t(e)},created:[],updated:[],skipped:[],disabled:[],servers:[],errors:[],missingGlobals:[]};let n=await m.modelService.loadModels(),p=new Set((e.models??[]).map(a=>a.id)),r=new Map(n.map(a=>[a.id,a]));for(let[b,d]of Object.entries(a.modelMappings??{}))if(!p.has(b)||!r.has(d)){let a=c();return a.errors.push(`Invalid model mapping: "${b}" -> "${d}"`),a}let u={ok:!0,dryRun:!1,package:{name:e.name,version:e.version,...e.publisher?{publisher:e.publisher}:{}},created:[],updated:[],skipped:[],disabled:[],servers:[],errors:[],missingGlobals:await t(e)},v=(e.models??[]).map(a=>s(a,f)),w=(e.flows??[]).map(a=>s(a,f)),x=(e.plannedExecutions??[]).map(a=>s(a,f)),y={flows:{},models:{},servers:[],plannedExecutions:[]},A={flows:[],models:[],servers:[],plannedExecutions:[]},B=new Set,D=new Map;try{let a=await o.mcpService.loadServerConfigs();if(Array.isArray(a))for(let b of a)B.add(b.name),D.set(b.name,b)}catch(a){q.warn("installPackage: failed to snapshot existing server names",a)}for(let a of e.mcpServers??[])await C(a,{packageFolder:e.name,secrets:f,secretProvided:j,secretRequired:l,summary:u,ledgerEntities:y,ledgerCreated:A,existingServerNames:B,existingServerConfigs:D});let E={};for(let b of v){let c=a.modelMappings?.[b.id];if(c){let a=r.get(c);E[b.id]={id:a.id,name:a.name},u.skipped.push({type:"model",name:b.displayName||b.name,id:a.id,note:`substituted with installed model "${a.displayName||a.name}"`});continue}let d=await F(b,{packageFolder:e.name,secrets:f,secretProvided:j,secretRequired:l,summary:u,ledgerEntities:y,ledgerCreated:A,existingServerNames:B,existingServerConfigs:D});d&&(E[b.id]=d)}let I=await G(e.name,w,E,u,y,A);for(let a of x)await H(a,e.name,I,u,y,A);try{let a=await (0,g.loadItem)(h.Z.PACKAGE_INSTALLS,{});a[e.name]={packageName:e.name,version:e.version,installedAt:new Date().toISOString(),summary:u,entities:y,created:A},await (0,g.VH)(h.Z.PACKAGE_INSTALLS,a)}catch(a){q.warn("installPackage: failed to persist install ledger",a)}return u}async function v(a){let b=await (0,g.loadItem)(h.Z.PACKAGE_INSTALLS,{});return b[a]?.summary??null}async function w(){return Object.values(await (0,g.loadItem)(h.Z.PACKAGE_INSTALLS,{})).map(a=>({packageName:a.packageName,version:a.version,installedAt:a.installedAt,entityCounts:{flows:Object.keys(a.entities?.flows??{}).length,models:Object.keys(a.entities?.models??{}).length,servers:(a.entities?.servers??[]).length,plannedExecutions:(a.entities?.plannedExecutions??[]).length}}))}async function x(a){let b={packageName:a,ok:!0,hasErrors:!1,removed:[],skipped:[],errors:[]},c=(await (0,g.loadItem)(h.Z.PACKAGE_INSTALLS,{}))[a];if(!c)return b;let d=c.created,e=void 0!==d,f=async(a,c)=>{try{var d,e=await c();e.success?b.removed.push(a):(d=e.error)&&/not found|no planned execution with id|does not exist/i.test(d)?b.skipped.push({...a,reason:"not found"}):b.errors.push({...a,reason:e.error??"delete failed"})}catch(c){b.errors.push({...a,reason:c instanceof Error?c.message:String(c)})}},i=(0,p.getSchedulerService)();for(let a of c.entities?.plannedExecutions??[]){let c={kind:"plannedExecution",id:a};if(e&&!d.plannedExecutions.includes(a)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>i.delete(a))}for(let[a,g]of Object.entries(c.entities?.flows??{})){let c={kind:"flow",id:g,label:a};if(e&&!d.flows.includes(g)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>n.flowService.deleteFlow(g))}for(let a of c.entities?.servers??[]){let c={kind:"server",id:a};if(e&&!d.servers.includes(a)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>o.mcpService.deleteServerConfig(a))}for(let[a,g]of Object.entries(c.entities?.models??{})){let c={kind:"model",id:g,label:a};if(!e){b.skipped.push({...c,reason:"legacy-ledger-no-provenance"});continue}if(!d.models.includes(g)){b.skipped.push({...c,reason:"adopted-not-created"});continue}await f(c,()=>m.modelService.deleteModel(g))}if(b.hasErrors=b.errors.length>0,b.ok=!b.hasErrors,!b.hasErrors)try{let b=await (0,g.loadItem)(h.Z.PACKAGE_INSTALLS,{});delete b[a],await (0,g.VH)(h.Z.PACKAGE_INSTALLS,b)}catch(a){q.warn("uninstallPackage: failed to delete ledger entry",a)}return b}function y(a){let b=a.installOrigin;return"remote"===b.sourceType?`remote:${b.url}`:`${b.sourceType}:${b.ref??b.name??a.name}`}async function z(a,b){let c=await m.modelService.loadModels();return{servers:(a.mcpServers??[]).map(c=>({localName:c.name,source:y(c),requiredEnvMissing:[...c.envDeclarations,...c.headerDeclarations??[]].map(a=>a.secretRef).filter(a=>"string"==typeof a&&a.length>0).filter(c=>(a.secrets??[]).some(a=>a.name===c&&a.required)&&!b(c))})),models:(a.models??[]).map(c=>({id:c.id,displayName:c.displayName||c.name,..."global"===c.apiKeyRef.kind?{apiKeyFrom:`\${global:${c.apiKeyRef.var}}`}:"secret"===c.apiKeyRef.kind?{apiKeyFrom:`secret:${c.apiKeyRef.secret}`}:{},..."secret"===c.apiKeyRef.kind&&(a.secrets??[]).some(a=>a.name===c.apiKeyRef.secret&&a.required)&&!b(c.apiKeyRef.secret)?{missingRequiredSecret:!0}:{}})),installedModels:c.map(a=>({id:a.id,displayName:a.displayName||a.name,name:a.name})),flows:(a.flows??[]).map(a=>({name:a.flow.name})),plannedExecutions:(a.plannedExecutions??[]).map(a=>({name:a.name})),secrets:(a.secrets??[]).map(a=>({key:a.name,...a.description?{label:a.description}:{},required:!0===a.required,provided:b(a.name)})),globals:a.globals??[]}}function A(a,b){let{secrets:c,secretProvided:d,secretRequired:e}=b,f={},g=new Set,h=[];for(let b of a)b.secretRef?d(b.secretRef)?(f[b.name]=c[b.secretRef],b.isSecret&&g.add(b.name)):e(b.secretRef)&&h.push(b.name):b.globalVar?(f[b.name]=`\${global:${b.globalVar}}`,b.isSecret&&g.add(b.name)):b.globalTemplate&&(f[b.name]=b.globalTemplate,b.isSecret&&g.add(b.name));return{values:f,secretNames:g,missingRequired:h}}async function B(a,b,c,d,e){let{packageFolder:f,summary:g,ledgerEntities:h,existingServerConfigs:i}=b,j=y(a),k=i.get(a.name);if(!k){g.servers.push({localName:a.name,source:j,installed:!1,error:"server vanished between snapshot and install"}),g.skipped.push({type:"server",name:a.name,note:"server not found in configs (stale snapshot)"});return}let l={...k.env??{}};for(let[a,b]of Object.entries(d))l[a]=e.has(a)?{value:b,metadata:{isSecret:!0}}:b;let m=k.args,n=Array.isArray(m)?[...m]:[];for(let b of a.argTemplates??[]){if(b.index>n.length||b.index<n.length&&!/\$\{global:[A-Za-z0-9_.-]+\}/.test(n[b.index])){let c=`argument template index ${b.index} cannot replace a static existing argument`;g.servers.push({localName:a.name,source:j,installed:!1,error:c}),g.skipped.push({type:"server",name:a.name,note:c});return}n[b.index]=b.value}let p=await o.mcpService.updateServerConfig(a.name,{env:l,folder:f,...a.argTemplates?.length?{args:n}:{}});if(!Array.isArray(p)&&p&&"success"in p&&!1===p.success){let b=p.error??"unknown error";g.servers.push({localName:a.name,source:j,installed:!1,error:b}),g.skipped.push({type:"server",name:a.name,note:b});return}h.servers.push(a.name),g.servers.push({localName:a.name,source:j,installed:!0,serverName:a.name,alreadyExisted:!0});let q=c.length>0?`env partially merged — missing required secret(s) for: ${c.join(", ")}`:void 0;g.updated.push({type:"server",name:a.name,id:a.name,...q?{note:q}:{}})}async function C(a,b){let{secrets:c,summary:d,ledgerEntities:e,ledgerCreated:f,existingServerNames:g}=b,h=y(a),i=a.installOrigin,j=A(a.envDeclarations,b),k=A(a.headerDeclarations??[],b),m=[...j.missingRequired,...k.missingRequired],n={};for(let[a,b]of Object.entries(k.values))n[a]=k.secretNames.has(a)?{value:b,metadata:{isSecret:!0}}:b;if("github"===i.sourceType){d.servers.push({localName:a.name,source:h,installed:!1,error:"GitHub-sourced servers are not auto-installable yet — install manually from the MCP page"}),d.skipped.push({type:"server",name:a.name,note:"GitHub-sourced servers require manual install"});return}if("registry"===i.sourceType||"marketplace"===i.sourceType){let c=i.ref??i.name;if(!c){d.servers.push({localName:a.name,source:h,installed:!1,error:"missing registry ref"}),d.skipped.push({type:"server",name:a.name,note:"installOrigin has no ref/name"});return}if(g.has(a.name))return void await B(a,b,m,j.values,j.secretNames);if(m.length>0){d.disabled.push({type:"server",name:a.name,note:`missing required secret(s) for: ${m.join(", ")}`}),d.servers.push({localName:a.name,source:h,installed:!1,needsEnv:m});return}let k=a.argTemplates?.length?await (0,l.aM)(c,j.values,{argTemplates:a.argTemplates}):await (0,l.aM)(c,j.values),n={localName:a.name,source:h,installed:k.installed,...k.serverName?{serverName:k.serverName}:{},...k.alreadyExisted?{alreadyExisted:!0}:{},...k.needsEnv?{needsEnv:k.needsEnv}:{},...k.error?{error:k.error}:{}};if(d.servers.push(n),k.installed){k.serverName&&await D(k.serverName,b.packageFolder),k.serverName&&e.servers.push(k.serverName);let c={type:"server",name:a.name,...k.serverName?{id:k.serverName}:{}};k.alreadyExisted?d.updated.push(c):(k.serverName&&f.servers.push(k.serverName),d.created.push(c),k.serverName&&j.secretNames.size>0&&await E(k.serverName,j.values,j.secretNames))}else d.skipped.push({type:"server",name:a.name,note:k.error??(k.needsEnv?`needs env: ${k.needsEnv.join(", ")}`:"not installed")});return}let p=m.length>0;try{let c=function(a,b,c,d,e,f){let g=a.installOrigin;if("remote"!==g.sourceType||!g.url)throw Error("buildRemoteServerConfig called for a non-remote (or url-less) server");let h="websocket"===a.transport||"sse"===a.transport||"streamable"===a.transport?a.transport:"streamable",i={name:a.name,folder:b,disabled:d,autoApprove:a.autoApprove??[],rootPath:"",env:Object.fromEntries(Object.entries(c).map(([a,b])=>[a,f.has(a)?{value:b,metadata:{isSecret:!0}}:b])),_buildCommand:"",_installCommand:""};if("websocket"===h)return{...i,transport:"websocket",websocketUrl:g.url};let j=Object.keys(e).length>0;return{...i,transport:h,serverUrl:g.url,...j?{headers:e}:{}}}(a,b.packageFolder,j.values,p,n,j.secretNames),i=await o.mcpService.updateServerConfig(a.name,c);if(!Array.isArray(i)&&i&&"success"in i&&!1===i.success){let b=i.error??"unknown error";d.servers.push({localName:a.name,source:h,installed:!1,error:b}),d.skipped.push({type:"server",name:a.name,note:b});return}e.servers.push(a.name),g.has(a.name)||f.servers.push(a.name),d.servers.push({localName:a.name,source:h,installed:!0,serverName:a.name,...p?{disabled:!0,needsEnv:m}:{}});let k={type:"server",name:a.name,id:a.name};p?d.disabled.push({...k,note:`installed disabled — missing required secret(s) for: ${m.join(", ")}`}):d.created.push(k)}catch(c){let b=c instanceof Error?c.message:String(c);d.servers.push({localName:a.name,source:h,installed:!1,error:b}),d.skipped.push({type:"server",name:a.name,note:b})}}async function D(a,b){try{let c=await o.mcpService.updateServerConfig(a,{folder:b});!Array.isArray(c)&&c&&"success"in c&&!1===c.success&&q.warn(`assignServerPackageFolder: failed to assign "${a}" to "${b}": ${c.error??"unknown error"}`)}catch(c){q.warn(`assignServerPackageFolder: failed to assign "${a}" to "${b}"`,c)}}async function E(a,b,c){if(0===c.size)return;let d=await o.mcpService.loadServerConfigs().catch(()=>null);if(!Array.isArray(d))return;let e=d.find(b=>b.name===a);if(!e)return;let f={...e.env??{}},g=!1;for(let a of c)void 0!==b[a]&&(f[a]={value:b[a],metadata:{isSecret:!0}},g=!0);if(g)try{await o.mcpService.updateServerConfig(a,{env:f})}catch(b){q.warn(`tagSecretEnvKeys: failed to re-tag secret env for "${a}"`,b)}}async function F(a,b){let c,{packageFolder:d,secrets:f,secretProvided:g,secretRequired:h,summary:i,ledgerEntities:j,ledgerCreated:k}=b,l="";if("global"===a.apiKeyRef.kind)l=`\${global:${a.apiKeyRef.var}}`;else if("secret"===a.apiKeyRef.kind){let b=a.apiKeyRef.secret;g(b)?l=f[b]:h(b)&&(c=`installed without an API key — missing required secret "${b}"`)}let n=a.displayName||a.name,o={name:a.name,displayName:n,...a.provider?{provider:a.provider}:{},...a.adapter?{adapter:a.adapter}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.description?{description:a.description}:{},...a.promptTemplate?{promptTemplate:a.promptTemplate}:{},...a.temperature?{temperature:a.temperature}:{},...a.reasoningEffort?{reasoningEffort:a.reasoningEffort}:{},...a.thinkingLevel?{thinkingLevel:a.thinkingLevel}:{},...void 0!==a.thinkingBudget?{thinkingBudget:a.thinkingBudget}:{},...a.serviceTier?{serviceTier:a.serviceTier}:{},...a.reasoningSchema?{reasoningSchema:a.reasoningSchema}:{},...a.functionCallingSchema?{functionCallingSchema:a.functionCallingSchema}:{},...void 0!==a.contextWindow?{contextWindow:a.contextWindow}:{},...void 0!==a.maxTurns?{maxTurns:a.maxTurns}:{},...void 0!==a.maxTokens?{maxTokens:a.maxTokens}:{},folder:d,ApiKey:l},p=(await m.modelService.loadModels()).find(a=>(a.displayName??"").toLowerCase()===n.toLowerCase());if(p){let b=await m.modelService.updateModel({...p,...o,id:p.id});if(b.success){j.models[n]=p.id;let b={type:"model",name:n,id:p.id};return c?i.disabled.push({...b,note:c}):i.updated.push(b),{id:p.id,name:a.name}}return void i.skipped.push({type:"model",name:n,note:b.error})}let q=(0,e.A)(),r=await m.modelService.addModel({id:q,...o});if(r.success){j.models[n]=q,k.models.push(q);let b={type:"model",name:n,id:q};return c?i.disabled.push({...b,note:c}):i.created.push(b),{id:q,name:a.name}}i.skipped.push({type:"model",name:n,note:r.error})}async function G(a,b,c,e,f,g){let h={};for(let c of b)h[c.flow.id]=function(a,b){var c;let e=`pkg-${r(a)}-${r(b)}`.replace(/[^A-Za-z0-9_-]/g,"-");return e.length<=64?e:`${e.slice(0,55)}-${c=`${a}::${b}`,(0,d.createHash)("sha1").update(c).digest("hex").slice(0,8)}`}(a,c.flow.id);let i=new Set((await n.flowService.loadFlows()).map(a=>a.id));for(let d of b){let b=d.flow.id,j=h[b],k=function(a,b,c,d){let e=JSON.parse(JSON.stringify(a.flow));for(let a of(e.id=b,delete e.createdAt,delete e.updatedAt,e.nodes??[])){let b=a?.data?.properties;if(b&&("string"==typeof b.subflowId&&c[b.subflowId]&&(b.subflowId=c[b.subflowId]),Array.isArray(b.parallelSubflowIds)&&(b.parallelSubflowIds=b.parallelSubflowIds.map(a=>"string"==typeof a&&c[a]?c[a]:a)),"string"==typeof b.boundModel&&d[b.boundModel])){let a=d[b.boundModel];b.boundModel=a.id,b.modelName=a.name}}return e}(d,j,h,c);k.folder=a;let l=i.has(j),m=await n.flowService.saveFlow(k);if(m.success){f.flows[b]=j;let a={type:"flow",name:d.flow.name,id:j};l?e.updated.push(a):(g.flows.push(j),e.created.push(a))}else e.skipped.push({type:"flow",name:d.flow.name,note:m.error})}return h}async function H(a,b,c,d,e,f){var g;let h=(0,p.getSchedulerService)(),i=(g=a.name,`pkg-${r(b)}-${r(g)}`.replace(/[^A-Za-z0-9._:-]/g,"-").slice(0,128)),j=c[a.flowId]??a.flowId,{id:k,flowId:l,createdAt:m,updatedAt:n,...o}=a,q={...o,id:i,flowId:j,folder:b,enabled:!1},s=await h.create(q);if(s.execution){e.plannedExecutions.push(i),f.plannedExecutions.push(i),d.created.push({type:"plannedExecution",name:a.name,id:i}),d.disabled.push({type:"plannedExecution",name:a.name,id:i,note:"created disabled — enable it after review"});return}if(s.conflict){let{id:b,...c}=q,f=await h.update(i,c);f.execution?(e.plannedExecutions.push(i),d.updated.push({type:"plannedExecution",name:a.name,id:i}),d.disabled.push({type:"plannedExecution",name:a.name,id:i,note:"updated (disabled) — enable it after review"})):d.skipped.push({type:"plannedExecution",name:a.name,note:f.error});return}d.skipped.push({type:"plannedExecution",name:a.name,note:s.error})}},51669:(a,b)=>{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)=>{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)=>{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)()}})}},75879:(a,b,c)=>{Object.defineProperty(b,"A",{enumerable:!0,get:function(){return d.registerServerReference}});let d=c(97954)},75943:(a,b,c)=>{c.d(b,{g:()=>h,i:()=>g});var d=c(50846),e=c(80233);let f=(0,d.h)("backend/services/packages/packageRegistry");async function g(a){let{status:b,body:c}=await (0,e.sB)(a);return b<200||b>=300?(f.warn(`searchPackageRegistry: registry responded with status ${b}`),{items:[],page:a.page??1,pageSize:a.pageSize??20,total:0,error:c?.error??`Registry responded with status ${b}`}):c}async function h(a,b){if(!a||"string"!=typeof a)throw Error("A package id is required");let{status:c,body:d}=await (0,e.wf)(a,b&&b.trim()?b.trim():"latest");if(c<200||c>=300)throw Error(d?.error??d?.message??`Registry responded with status ${c}`);return d}},80233:(a,b,c)=>{c.d(b,{$5:()=>p,Nb:()=>s,Ow:()=>r,Tr:()=>x,Wz:()=>w,eo:()=>u,iD:()=>q,s2:()=>v,sB:()=>n,uJ:()=>j,w2:()=>t,wf:()=>o});var d=c(50846),e=c(92372),f=c(38844),g=c(21508);let h=(0,d.h)("backend/utils/packageRegistryClient");function i(a){return a.trim().replace(/\/+$/,"")}async function j(){let a=process.env.FLUJO_REGISTRY_BASE_URL?.trim();if(a)return i(a);let b=await (0,e.loadItem)(f.Z.REGISTRY_SETTINGS,{});return b?.baseUrl&&b.baseUrl.trim()?i(b.baseUrl):i(g.Qs)}async function k(a,b,c){let d=await j(),e=`${d}${a}`,f=new AbortController,g=setTimeout(()=>f.abort(),2e4);try{let d={"Content-Type":"application/json",Accept:"application/json"};c&&(d.Authorization=`Bearer ${c}`),h.info(`POST ${a}`);let g=await fetch(e,{method:"POST",headers:d,body:JSON.stringify(b??{}),signal:f.signal,cache:"no-store"}),i=await g.text(),j=null;if(i)try{j=JSON.parse(i)}catch{j={message:i}}return{status:g.status,body:j}}catch(b){return h.warn(`POST ${a} failed at transport level`,b instanceof Error?b.message:b),{status:0,body:{message:"Could not reach the package registry."}}}finally{clearTimeout(g)}}async function l(a){let b=await j(),c=`${b}${a}`,d=new AbortController,e=setTimeout(()=>d.abort(),2e4);try{h.info(`GET ${a}`);let b=await fetch(c,{headers:{Accept:"application/json"},signal:d.signal,cache:"no-store"}),e=await b.text(),f=null;if(e)try{f=JSON.parse(e)}catch{f={message:e}}return{status:b.status,body:f}}catch(b){return h.warn(`GET ${a} failed at transport level`,b instanceof Error?b.message:b),{status:0,body:{message:"Could not reach the package registry."}}}finally{clearTimeout(e)}}async function m(a,b){let c=await j(),d=`${c}${a}`,e=new AbortController,f=setTimeout(()=>e.abort(),2e4);try{h.info(`DELETE ${a}`);let c=await fetch(d,{method:"DELETE",headers:{Accept:"application/json",Authorization:`Bearer ${b}`},signal:e.signal,cache:"no-store"}),f=await c.text(),g=null;if(f)try{g=JSON.parse(f)}catch{g={message:f}}return{status:c.status,body:g}}catch(b){return h.warn(`DELETE ${a} failed at transport level`,b instanceof Error?b.message:b),{status:0,body:{message:"Could not reach the package registry."}}}finally{clearTimeout(f)}}function n(a){let b=new URLSearchParams;a.q&&b.set("q",a.q),a.tag&&b.set("tag",a.tag),a.page&&b.set("page",String(a.page)),a.pageSize&&b.set("pageSize",String(a.pageSize));let c=b.toString()?`?${b.toString()}`:"";return l(`/v1/packages${c}`)}function o(a,b="latest"){return l(`/v1/packages/${encodeURIComponent(a)}/versions/${encodeURIComponent(b)}/manifest`)}function p(a,b,c){return k("/v1/auth/signup",{email:a,password:b,handle:c})}function q(a,b){return k("/v1/auth/login",{email:a,password:b})}function r(a){return k("/v1/auth/refresh",{refresh_token:a})}function s(a){return k("/v1/auth/resend-confirmation",{email:a})}function t(a){return k("/v1/auth/forgot-password",{email:a})}function u(a,b){return k("/v1/packages",a,b)}function v(a,b){return m(`/v1/packages/${encodeURIComponent(a)}`,b)}function w(a,b){return k("/v1/feedback",{notice:a,rating:b})}function x(a){return k("/v1/auth/oauth/token",{code:a.code,code_verifier:a.codeVerifier,redirect_uri:a.redirectUri,provider:a.provider})}}};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";exports.id=2372,exports.ids=[2372],exports.modules={13516:(a,b,c)=>{c.d(b,{G:()=>d});let d={LOG_LEVEL:3,INCLUDE_TOOL_CALLS_IN_RESPONSE:!0,ENABLE_EXECUTION_TRACKER:!1}},38844:(a,b,c)=>{c.d(b,{Z:()=>d.Z});var d=c(84653)},43326:(a,b,c)=>{c.r(b),c.d(b,{getAppDir:()=>h,getDataDir:()=>j,getHomeDir:()=>i,getInstallMode:()=>m,getOllamaUrl:()=>k,isLocalModelsEnabled:()=>l});var d=c(33873),e=c.n(d),f=c(21820),g=c.n(f);function h(){return process.cwd()}function i(){return g().homedir()}function j(){let a=process.env.FLUJO_DATA_DIR;return a&&a.trim().length>0?e().resolve(a):h()}function k(){let a=process.env.FLUJO_OLLAMA_URL;return(a&&a.trim().length>0?a.trim():"http://localhost:11434").replace(/\/+$/,"")}function l(){let a=process.env.FLUJO_OLLAMA;return"1"===a||"true"===a||"yes"===a}function m(){return process.env.FLUJO_CONTAINER?"container":process.env.FLUJO_NPM?"npm":"git"}},50846:(a,b,c)=>{c.d(b,{h:()=>i});var d=c(13516);let e={VERBOSE:-1,DEBUG:0,INFO:1,WARN:2,ERROR:3},f="number"==typeof d.G.LOG_LEVEL?d.G.LOG_LEVEL:e.ERROR;function g(a,b=0){if(b>6)return String(a);if(!(a instanceof Error))return a;let c={name:a.name,message:a.message};for(let d of Object.getOwnPropertyNames(a)){if("name"===d||"message"===d)continue;let e=a[d];"function"!=typeof e&&("stack"===d?c.stack=e:"cause"===d?c.cause=g(e,b+1):"errors"===d&&Array.isArray(e)?c.errors=e.map(a=>g(a,b+1)):c[d]=e)}return c}function h(a,b,c,d,h){if(a>=("number"==typeof h?h:f)){if("function"==typeof d)try{d=d()}catch{d="[lazy log data threw]"}let f=new Date().toISOString(),h=`[${f}] [${b}]`,i=`${h} ${c}`;if(void 0!==d)if(d instanceof Error||"object"==typeof d)try{let a=d instanceof Error?g(d):d,b=JSON.stringify(a,(a,b)=>b instanceof Error?g(b):b,2);i+=`:
|
|
2
|
-
${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},84653:(a,b,c)=>{c.d(b,{Z:()=>d});var d=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.LAST_PICKED_FLOW_ID="last_picked_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a.MCP_AUTO_INSTALL_SETTINGS="mcp_auto_install_settings",a.MCP_QUALITY_SETTINGS="mcp_quality_settings",a.RUN_RESOURCE_SETTINGS="run_resource_settings",a.KV_STORE_SETTINGS="kv_store_settings",a.PENDING_APPROVALS="pending_approvals",a.MCP_INTERNAL_OVERRIDES="mcp_internal_overrides",a.PACKAGE_INSTALLS="package_installs",a.EXPERIMENTAL_SETTINGS="experimental_settings",a.REGISTRY_ACCOUNT="registry_account",a.REGISTRY_SETTINGS="registry_settings",a.TELEMETRY_STATE="telemetry_state",a}({})},92372:(a,b,c)=>{c.d(b,{EI:()=>B,N2:()=>u,Pv:()=>o,VH:()=>s,Vt:()=>A,
|
|
2
|
+
${b}`}catch(a){i+=": [Object cannot be stringified]"}else i+=`: ${d}`;switch(a){case e.VERBOSE:console.debug(`[VERBOSE] ${i}`);break;case e.DEBUG:console.debug(i);break;case e.INFO:console.info(i);break;case e.WARN:console.warn(i);break;case e.ERROR:console.error(i);break;default:console.log(i)}}}function i(a,b){let c,d=((c=a.replace(/^src\//,"")).startsWith("/")&&(c=c.substring(1)),c);return{verbose:(a,c)=>{h(e.VERBOSE,d,a,c,b)},debug:(a,c)=>{h(e.DEBUG,d,a,c,b)},info:(a,c)=>{h(e.INFO,d,a,c,b)},warn:(a,c)=>{h(e.WARN,d,a,c,b)},error:(a,c)=>{h(e.ERROR,d,a,c,b)}}}},84653:(a,b,c)=>{c.d(b,{Z:()=>d});var d=function(a){return a.MODELS="models",a.FLOWS="flows",a.CHAT_HISTORY="history",a.THEME="theme",a.ENCRYPTION_KEY="encryption_key",a.MCP_SERVERS="mcp_servers",a.GLOBAL_ENV_VARS="global_env_vars",a.CURRENT_CONVERSATION_ID="current_conversation_id",a.SELECTED_FLOW_ID="selected_flow_id",a.LAST_PICKED_FLOW_ID="last_picked_flow_id",a.SPEECH_SETTINGS="speech_settings",a.SPOTLIGHT_SERVERS="spotlight_servers",a.PLANNED_EXECUTIONS="planned_executions",a.MCP_AUTO_INSTALL_SETTINGS="mcp_auto_install_settings",a.MCP_QUALITY_SETTINGS="mcp_quality_settings",a.RUN_RESOURCE_SETTINGS="run_resource_settings",a.KV_STORE_SETTINGS="kv_store_settings",a.PENDING_APPROVALS="pending_approvals",a.MCP_INTERNAL_OVERRIDES="mcp_internal_overrides",a.PACKAGE_INSTALLS="package_installs",a.EXPERIMENTAL_SETTINGS="experimental_settings",a.REGISTRY_ACCOUNT="registry_account",a.REGISTRY_SETTINGS="registry_settings",a.TELEMETRY_STATE="telemetry_state",a}({})},92372:(a,b,c)=>{c.d(b,{EI:()=>B,N2:()=>u,Pv:()=>o,VH:()=>s,Vt:()=>A,Zf:()=>r,av:()=>E,bB:()=>C,l_:()=>z,ln:()=>w,loadItem:()=>t,pL:()=>D,w5:()=>F});var d=c(29021),e=c(33873),f=c.n(e),g=c(38844),h=c(50846),i=c(43326);let j=(0,h.h)("utils/storage/backend"),k=f().join((0,i.getDataDir)(),"db"),l=f().join((0,i.getDataDir)(),".next","storage"),m=a=>f().join(k,`${a}.json`);async function n(){try{await d.promises.access(k),j.verbose(`Storage directory exists: ${k}`)}catch{j.debug(`Creating storage directory: ${k}`),await d.promises.mkdir(k,{recursive:!0})}try{await d.promises.access(l),j.warn(`Old storage directory found: ${l}. This may cause data inconsistency issues.`)}catch{}}async function o(){for(let a of(j.debug("Verifying storage system initialization"),await n(),Object.values(g.Z)))try{let b=m(a),c=!1;try{await d.promises.access(b),c=!0}catch{}j.debug(`Storage check: ${a} - ${c?"File exists":"File does not exist yet"}`);let e=f().join(l,`${a}.json`);try{await d.promises.access(e),c?j.warn(`Found ${a} in both old and new storage locations. This may cause data inconsistency.`):j.warn(`Found ${a} in old storage location but not in new location. This may cause data loss.`)}catch{}}catch(b){j.error(`Storage verification failed for ${a}:`,b)}j.debug("Storage verification completed")}let p=new Map,q=0;async function r(a,b){let c=f().dirname(a);await d.promises.mkdir(c,{recursive:!0});let e=`${a}.tmp.${process.pid}.${++q}`;try{await d.promises.writeFile(e,b),await d.promises.rename(e,a)}catch(a){try{await d.promises.unlink(e)}catch{}throw a}}async function s(a,b){let c=m(a),d=(p.get(a)??Promise.resolve()).catch(()=>{}).then(()=>r(c,JSON.stringify(b,null,2)));p.set(a,d);try{await d,j.verbose(`Successfully saved item to: ${c}`)}catch(b){throw j.error(`Error saving item with key "${a}" to ${c}:`,b),b}finally{p.get(a)===d&&p.delete(a)}}async function t(a,b){try{await n();let c=m(a),e=await d.promises.readFile(c,"utf-8");if(0===e.trim().length)return j.warn(`Item with key "${a}" at ${c} is empty; treating as missing and returning default.`),b;try{let a=JSON.parse(e);return j.verbose(`Successfully loaded item from: ${c}`),a}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${c}:`,b);let a=`${c}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,e),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${c}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(c){if("ENOENT"===c.code)return j.verbose(`Item with key "${a}" not found at ${m(a)}, returning default.`),b;throw j.error(`CRITICAL: Error loading item with key "${a}" from ${m(a)}:`,c),c}}async function u(a){let b=m(a);try{await d.promises.unlink(b),j.verbose(`Successfully cleared item: ${b}`)}catch(c){"ENOENT"!==c.code?j.warn(`Error clearing item with key "${a}" at ${b}:`,c):j.verbose(`Item with key "${a}" not found at ${b}, nothing to clear.`)}}let v=/^[A-Za-z0-9_-]{1,64}$/;function w(a){if("string"!=typeof a||!v.test(a))throw Error(`Unsafe collection item id: ${JSON.stringify(a)}`)}let x=a=>f().join(k,a),y=(a,b)=>f().join(x(a),`${b}.json`);function z(a,b){let c=(p.get(a)??Promise.resolve()).catch(()=>{}).then(b);return p.set(a,c),c.catch(()=>{}).finally(()=>{p.get(a)===c&&p.delete(a)}),c}async function A(a,b,c){w(b);let d=y(a,b);try{await z(`${a}/${b}`,()=>r(d,JSON.stringify(c,null,2))),j.verbose(`Successfully saved collection item: ${d}`)}catch(c){throw j.error(`Error saving collection item "${a}/${b}" to ${d}:`,c),c}}async function B(a,b,c){w(b);let e=y(a,b);try{let f=await d.promises.readFile(e,"utf-8");if(0===f.trim().length)return j.warn(`Collection item "${a}/${b}" at ${e} is empty; treating as missing.`),c;try{return JSON.parse(f)}catch(b){j.error(`CRITICAL: Failed to parse JSON from ${e}:`,b);let a=`${e}.corrupted.${Date.now()}.bak`;try{await d.promises.writeFile(a,f),j.info(`Created backup of corrupted file at: ${a}`)}catch(a){j.error("Failed to create backup of corrupted file:",a)}throw Error(`Failed to parse JSON from ${e}. A backup has been created at ${a}. Original error: ${b.message}`)}}catch(d){if("ENOENT"===d.code)return j.verbose(`Collection item "${a}/${b}" not found at ${e}, returning default.`),c;throw j.error(`CRITICAL: Error loading collection item "${a}/${b}" from ${e}:`,d),d}}async function C(a,b){w(b);let c=y(a,b);await z(`${a}/${b}`,async()=>{try{await d.promises.unlink(c),j.verbose(`Successfully deleted collection item: ${c}`)}catch(d){if("ENOENT"!==d.code)throw d;j.verbose(`Collection item "${a}/${b}" not found at ${c}, nothing to delete.`)}})}async function D(a){let b,c=x(a);try{b=await d.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return[];throw a}let e=[];for(let a of b){if(!a.endsWith(".json")||a.includes(".tmp.")||a.includes(".corrupted.")||a.endsWith(".bak"))continue;let b=f().join(c,a);try{let a=await d.promises.readFile(b,"utf-8");if(0===a.trim().length){j.warn(`Collection item file ${b} is empty; skipping.`);continue}e.push(JSON.parse(a))}catch(a){j.error(`Failed to read collection item ${b}; skipping.`,a)}}return e}async function E(a){let b,c=x(a);try{b=await d.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return[];throw a}let e=[];for(let a of b){if(!a.endsWith(".json")||a.includes(".tmp.")||a.includes(".corrupted.")||a.endsWith(".bak"))continue;let b=f().join(c,a);try{let[a,c]=await Promise.all([d.promises.readFile(b,"utf-8"),d.promises.stat(b)]);if(0===a.trim().length){j.warn(`Collection item file ${b} is empty; skipping.`);continue}e.push({item:JSON.parse(a),mtimeMs:c.mtimeMs})}catch(a){j.error(`Failed to read collection item ${b}; skipping.`,a)}}return e}async function F(a,b,c){let e,f,g=m(a);try{e=await d.promises.readFile(g,"utf-8")}catch(a){if("ENOENT"===a.code)return 0;throw a}if(0===e.trim().length)return await d.promises.rename(g,`${g}.migrated-${Date.now()}.bak`),0;try{f=JSON.parse(e)}catch(b){return j.error(`Migration: legacy ${a}.json is not valid JSON; leaving it in place.`,b),0}if(!Array.isArray(f))return j.error(`Migration: legacy ${a}.json is not an array; leaving it in place.`),0;for(let a of(await d.promises.mkdir(x(b),{recursive:!0}),f)){let e;try{e=c(a),w(e)}catch(a){j.error(`Migration: skipping ${b} item with invalid/unsafe id`,a);continue}let f=y(b,e);try{await d.promises.access(f),j.debug(`Migration: ${b}/${e} already exists; keeping the existing file.`);continue}catch{}await r(f,JSON.stringify(a,null,2))}return await d.promises.rename(g,`${g}.migrated-${Date.now()}.bak`),j.info(`Migration: moved ${f.length} ${b} item(s) from ${a}.json to per-item storage.`),f.length}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=2859,exports.ids=[2859],exports.modules={29715:(a,b,c)=>{c.d(b,{N:()=>i});var d=c(95708),e=c(92372),f=c(60184),g=c(38291);let h=(0,c(50846).h)("backend/execution/flow/loadConversationState");async function i(a){try{(0,e.ln)(a)}catch{h.warn("Rejected unsafe conversationId on load",{conversationId:a});return}if(d.FlowExecutor.conversationStates.has(a))return h.debug("Loaded state from memory",{conversationId:a}),d.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,e.YM)(b,void 0);if(c){h.debug("Loaded state from storage",{conversationId:a}),await (0,f.recoverMessagesFromLog)(c);try{let d=(0,f.repairDanglingToolCalls)(c);d.length&&(h.info("Repaired dangling tool call(s) on load",{conversationId:a,count:d.length}),await (0,f.appendRawForState)(c,d.map(a=>({type:"message",message:a}))),await (0,g.persistConversationState)(b,c))}catch(b){h.warn("Failed to repair dangling tool calls on load; continuing",{conversationId:a,repairError:b})}return d.FlowExecutor.conversationStates.set(a,c),c}}catch(b){h.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>ab,internalToolDefinitions:()=>x});var d=c(33873),e=c.n(d),f=c(29021),g=c(50846),h=c(87821),i=c(20433),j=c(4771),k=c(52189),l=c(16226),m=c(38204),n=c(9312),o=c(29715),p=c(60184),q=c(14214),r=c(43326),s=c(78325),t=c(30227),u=c(81495);let v=(0,g.h)("backend/services/mcp/internalTools");function w(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function x(){return[...(0,t.cI)(),{name:"list_flows",description:"List all flows in this FLUJO instance with lightweight metadata only (id, name, description, node count) and no flow content. Use this to enumerate flows cheaply. Use list_flow_building_blocks only when you need the full authoring catalog (models + servers + flows).",inputSchema:{type:"object",properties:{}}},{name:"execute_flow",description:"Run another FLUJO flow (by name or id) with the given input and return its final output. The run is ephemeral (no chat conversation is created). Use list_flow_building_blocks to see the available flows. Nested runs are limited in depth — a flow cannot recurse through itself indefinitely.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},input:{type:"string",description:"The message to send to the flow as the user turn."}},required:["flow","input"]}},{name:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. Verify the target with list_flow_building_blocks first.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"list_mcp_servers",description:"List the MCP servers configured in this FLUJO instance with their transport, enabled/disabled state and live connection status. Config details (env vars, headers, credentials) are never included.",inputSchema:{type:"object",properties:{}}},{name:"list_mcp_server_tools",description:"List the tools of one configured MCP server (name, description, input schema). Use together with call_mcp_tool for servers that are not bound to this flow.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name (see list_mcp_servers)."}},required:["server"]}},{name:"call_mcp_tool",description:"Call a tool on any configured MCP server by server name + tool name. This lets you use servers that are not bound to the current flow. Check the tool's input schema with list_mcp_server_tools first.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},tool:{type:"string",description:"The tool name on that server."},args:{type:"object",description:"Arguments for the tool (per its input schema)."},timeout:{type:"number",description:"Optional timeout in seconds."}},required:["server","tool"]}},{name:"restart_mcp_server",description:"Force-reconnect a configured MCP server (tears the connection down and rebuilds it). Useful when a server is in an error state after a config or environment change.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."}},required:["server"]}},{name:"set_mcp_server_enabled",description:"Enable or disable a configured MCP server. Disabling disconnects it and prevents any further use; enabling connects it.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},enabled:{type:"boolean",description:"true to enable + connect, false to disable + disconnect."}},required:["server","enabled"]}},{name:"list_models",description:"List the models configured in this FLUJO instance (id, name, display name, description, provider, base URL, context window). API keys are never included. Reference models by id or name in FlowSpecs.",inputSchema:{type:"object",properties:{}}},{name:"list_planned_executions",description:"List the planned (scheduled/triggered) executions in this FLUJO instance with their trigger type, enabled state, armed status and last run outcome.",inputSchema:{type:"object",properties:{}}},{name:"run_planned_execution",description:"Fire a planned execution immediately (by id, see list_planned_executions) and return the run record with its output.",inputSchema:{type:"object",properties:{id:{type:"string",description:"The planned execution id."}},required:["id"]}},{name:"update_planned_execution",description:'Modify an existing planned execution (by id or name, see list_planned_executions). Patch any of: "enabled" (turn the schedule on/off), "prompt" (the run prompt), "flowId" (the flow to run — accepts a flow name or id), "cron" (a convenience for the trigger\'s cron pattern — works for schedule / mcp-poll / url-watch triggers) or a full "trigger" object for complete control. Flow-driven cadence changes are clamped to a minimum interval (a runaway every-second schedule is rejected). The webhook secret token is never returned.',inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."},enabled:{type:"boolean",description:"Enable or disable the execution."},prompt:{type:"string",description:"The run prompt."},flowId:{type:"string",description:"The flow to run — a flow name or id (resolved to the flow id)."},cron:{type:"string",description:"Cron pattern (croner syntax; 6-field form for seconds) for the trigger's schedule. Applies to schedule / mcp-poll / url-watch triggers."},trigger:{type:"object",description:"Full trigger config object (escape hatch for complete control). Prefer the named fields above."}},required:["execution"]}},{name:"create_planned_execution",description:'Create a new planned execution: bind a flow to a trigger so it runs headlessly. Provide "name", "flow" (a flow name or id), an optional "prompt", optional "enabled" (default true), and EITHER a full "trigger" object OR a convenience "cron" (which creates a schedule trigger). Flow-driven cadence is clamped to a minimum interval. A webhook trigger\'s secret token is minted server-side and never returned.',inputSchema:{type:"object",properties:{name:{type:"string",description:"A name for the planned execution."},flow:{type:"string",description:"The flow to run — a flow name or id."},prompt:{type:"string",description:"The run prompt (may be empty)."},enabled:{type:"boolean",description:"Whether to arm the trigger immediately (default true)."},cron:{type:"string",description:'Cron pattern for a schedule trigger (convenience — use "trigger" for other trigger types).'},trigger:{type:"object",description:"Full trigger config object (schedule / webhook / file-watch / mcp-poll / url-watch)."}},required:["name","flow"]}},{name:"delete_planned_execution",description:"Permanently delete a planned execution (by id or name, see list_planned_executions), along with its run history. This cannot be undone.",inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."}},required:["execution"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"kv_get",description:'Read a value from FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs (loop counters, cursors, flags). Returns { found, value }. Defaults to the instance-global board; pass "scope" to target another board (e.g. a flow-folder board id). Values are plain strings, never secrets.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to read (an identifier: letters, digits, _ and -, not starting with a digit)."},scope:{type:"string",description:'Optional board id to read from. Defaults to "global".'}},required:["name"]}},{name:"kv_set",description:'Write a value to FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs. Last-write-wins. Defaults to the instance-global board; pass "scope" to target another board. Values are plain strings (never secrets — use ${global:} for those) and are size-capped; an oversized write is refused with { saved:false, skipped }.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to write (an identifier: letters, digits, _ and -, not starting with a digit)."},value:{type:"string",description:"The string value to store."},scope:{type:"string",description:'Optional board id to write to. Defaults to "global".'}},required:["name","value"]}}]}async function y(a){let b=await h.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function z(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let d=global.__flujo_internal_flow_depth??0;if(d>=4)return w({error:`execute_flow nesting limit (4) reached — refusing to start "${c.name}" to prevent runaway recursion.`},!0);global.__flujo_internal_flow_depth=d+1;try{let b=await (0,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return w({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return w({error:b.error?.message??"Unknown error during flow execution."},!0);return w(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function A(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.deleteFlow(c.id);return d.success?w({deleted:!0,flowId:c.id,flowName:c.name}):w({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function B(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":b?.edgeType==="resource"?"resource":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function C(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);return c?w({...B(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function D(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.listFlowVersions(c.id);return w({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function E(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.getFlowVersion(d.id,c);return e?w({versionId:e.versionId,savedAt:e.savedAt,...B(e.flow)}):w({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function F(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.revertFlow(d.id,c);return e.success?w({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):w({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function G(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return w({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await (0,m.V)(c,{save:!0,updateFlowId:d.id});return e.success?w({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):w({error:e.error,issues:e.issues??[]},!0)}async function H(a){let b=await a.loadServerConfigs();return Array.isArray(b)?w(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){v.debug(`list_mcp_servers: getServerStatus failed for ${b.name}`,a)}return{name:b.name,transport:b.transport,enabled:!b.disabled,status:c,...b.builtIn?{builtIn:!0}:{}}}))):w({error:b.error??"Failed to load server configs."},!0)}async function I(a,b,c){let d=String(b?.server??"").trim();if(!d)return w({error:'Provide "server": a FLUJO server name.'},!0);if(d===u._)return w(x().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:e,error:f}=await a.listServerTools(d,"host"===c?"all":c);return f?w({error:f},!0):w(e.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function J(a,b,c){let d=String(b?.server??"").trim(),e=String(b?.tool??"").trim();if(!d||!e)return w({error:'Provide "server" and "tool".'},!0);if(d===u._)return w({error:`"${u._}" is this server — call its tools directly instead of through call_mcp_tool.`},!0);let f=b?.args&&"object"==typeof b.args&&!Array.isArray(b.args)?b.args:{},g="number"==typeof b?.timeout?b.timeout:void 0,h=await a.callTool(d,e,f,g,void 0,void 0,void 0,c);if(!h.success)return w({error:h.error??`Tool call failed on ${d}.`},!0);let i=h.data;return i&&Array.isArray(i.content)?i:w(i??{ok:!0})}async function K(a,b){let c=String(b?.server??"").trim();if(!c)return w({error:'Provide "server": a FLUJO server name.'},!0);if(c===u._)return w({ok:!0,note:`"${u._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return w({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return w({restarted:!0,server:c,status:e.status})}async function L(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return w({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===u._)return w({error:`The built-in "${u._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?w({error:e.error},!0):w({server:c,enabled:d})}async function M(){try{let a=(await h.flowService.loadFlows()).map(a=>({id:a.id,name:a.name,...a.description?{description:(0,n.xv)(a.description,n.bD)}:{},nodeCount:a.nodes?.length??0}));return w(a)}catch(a){return v.error("list_flows failed",a),w({error:"Failed to load flows."},!0)}}async function N(){return w((await i.modelService.loadModels()).map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...a.provider?{provider:a.provider}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.contextWindow?{contextWindow:a.contextWindow}:{}})))}async function O(){return w((await (0,j.getSchedulerService)().list()).map(({execution:a,status:b,lastRun:c})=>({id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type,armed:b?.armed??!1,...c?{lastRun:{status:c.status,firedAt:c.firedAt,...c.error?{error:c.error}:{}}}:{}})))}async function P(a){let b=String(a?.id??"").trim();if(!b)return w({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,j.getSchedulerService)().runNow(b);return d||!c?w({error:d??"Run failed."},!0):w({runId:c.runId,status:c.status,firedAt:c.firedAt,...c.finishedAt?{finishedAt:c.finishedAt}:{},...c.outputText?{outputText:c.outputText}:{},...c.error?{error:c.error}:{}})}async function Q(a){let b=await (0,j.getSchedulerService)().list(),c=b.find(b=>b.execution.id===a),d=b.find(b=>b.execution.name===a);return(c??d)?.execution??null}function R(a){return{id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type}}function S(a,b){try{let c=(0,k.Z9)(a,b,5).map(a=>new Date(a).getTime()),d=1/0;for(let a=1;a<c.length;a++){let b=c[a]-c[a-1];b>0&&b<d&&(d=b)}return Number.isFinite(d)?d:null}catch{return null}}function T(a){let b=null;return("schedule"===a.type||"url-watch"===a.type?a.cron&&(b=S(a.cron,a.timezone)):"mcp-poll"===a.type&&(a.cron?b=S(a.cron,a.timezone):"number"==typeof a.intervalMs&&(b=a.intervalMs)),null!==b&&b<6e4)?`Cadence too fast: the trigger would fire about every ${Math.round(b/1e3)}s, but flow-driven schedule changes are clamped to a minimum interval of 60s. Choose a slower cadence (change it from the Planned Executions page for a faster one).`:null}async function U(a){let b,c=String(a?.execution??"").trim();if(!c)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let d=await Q(c);if(!d)return w({error:`No planned execution with id or name "${c}". Use list_planned_executions to see them.`},!0);let e={};"boolean"==typeof a?.enabled&&(e.enabled=a.enabled),"string"==typeof a?.prompt&&(e.prompt=a.prompt);let f=String(a?.flowId??a?.flow??"").trim();if(f){let a=await y(f);if(!a)return w({error:`No flow named or with id "${f}". Use list_flow_building_blocks to see the flows.`},!0);e.flowId=a.id}a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger)&&(b=a.trigger);let g="string"==typeof a?.cron?a.cron.trim():"";if(g){let a=b??d.trigger;if("schedule"!==a.type&&"mcp-poll"!==a.type&&"url-watch"!==a.type)return w({error:`The "${a.type}" trigger has no schedule to change with "cron". Pass a full "trigger" object instead.`},!0);b={...a,cron:g}}if(b){let a=T(b);if(a)return w({error:a},!0);e.trigger=b}if(0===Object.keys(e).length)return w({error:"Nothing to update. Provide at least one of: enabled, prompt, flowId, cron, trigger."},!0);let h=await (0,j.getSchedulerService)().update(d.id,e);return h.error||!h.execution?w({error:h.error??"Update failed."},!0):w({updated:!0,...R(h.execution)})}async function V(a){let b,c=String(a?.name??"").trim();if(!c)return w({error:'Provide "name": a name for the planned execution.'},!0);let d=String(a?.flow??a?.flowId??"").trim();if(!d)return w({error:'Provide "flow": a flow name or id to run.'},!0);let e=await y(d);if(!e)return w({error:`No flow named or with id "${d}". Use list_flow_building_blocks to see the flows.`},!0);if(a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger))b=a.trigger;else{let c="string"==typeof a?.cron?a.cron.trim():"";if(!c)return w({error:'Provide a "trigger" object or a "cron" pattern (which creates a schedule trigger).'},!0);b={type:"schedule",cron:c}}let f=T(b);if(f)return w({error:f},!0);let g={name:c,enabled:"boolean"!=typeof a?.enabled||a.enabled,flowId:e.id,prompt:"string"==typeof a?.prompt?a.prompt:"",trigger:b},h=await (0,j.getSchedulerService)().create(g);return h.error||!h.execution?w({error:h.error??"Create failed."},!0):w({created:!0,...R(h.execution)})}async function W(a){let b=String(a?.execution??"").trim();if(!b)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let c=await Q(b);if(!c)return w({error:`No planned execution with id or name "${b}". Use list_planned_executions to see them.`},!0);let d=await (0,j.getSchedulerService)().delete(c.id);return d.success?w({deleted:!0,id:c.id,name:c.name}):w({error:d.error??`Failed to delete "${c.name}".`},!0)}async function X(a){let b,c=e().join((0,r.getDataDir)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return w([]);return w({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===q.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return v.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return w(g?d.slice(0,g):d)}async function Y(a){let b=String(a?.conversation??"").trim();if(!b)return w({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,p.flushConversationLog)(b);let c=await (0,o.N)(b);if(!c)return w({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,p.readConversationLog)(b),e=d?(0,p.projectMessages)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),w({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}let Z=/^[A-Za-z0-9_-]{1,64}$/,$=/^[A-Za-z_][\w-]*$/;async function _(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global";if(!$.test(b))return w({error:'kv_get requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let d=await (0,s.M3)(c,b);return w({scope:c,name:b,found:void 0!==d,value:d??null})}async function aa(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global",d="string"==typeof a.value?a.value:null==a.value?"":String(a.value);if(!$.test(b))return w({error:'kv_set requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let e=await (0,s.or)(c,b,d);return"skipped"in e?w({scope:c,name:b,saved:!1,skipped:e.skipped},!0):w({scope:c,name:b,saved:!0,size:e.size})}async function ab(a,b,c,d="host"){try{if((0,t.yM)(b))return await (0,t.oV)(b,c);switch(b){case"list_flows":return await M();case"execute_flow":return await z(c);case"read_flow":return await C(c);case"update_flow":return await G(c);case"list_flow_versions":return await D(c);case"read_flow_version":return await E(c);case"revert_flow":return await F(c);case"delete_flow":return await A(c);case"list_mcp_servers":return await H(a);case"list_mcp_server_tools":return await I(a,c,d);case"call_mcp_tool":return await J(a,c,d);case"restart_mcp_server":return await K(a,c);case"set_mcp_server_enabled":return await L(a,c);case"list_models":return await N();case"list_planned_executions":return await O();case"run_planned_execution":return await P(c);case"update_planned_execution":return await U(c);case"create_planned_execution":return await V(c);case"delete_planned_execution":return await W(c);case"list_conversations":return await X(c);case"read_conversation":return await Y(c);case"kv_get":return await _(c);case"kv_set":return await aa(c);default:return w({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return v.error("internalCallTool failed",{toolName:b,err:a}),w({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
|
|
1
|
+
"use strict";exports.id=2859,exports.ids=[2859],exports.modules={29715:(a,b,c)=>{c.d(b,{N:()=>i});var d=c(95708),e=c(92372),f=c(60184),g=c(38291);let h=(0,c(50846).h)("backend/execution/flow/loadConversationState");async function i(a){try{(0,e.ln)(a)}catch{h.warn("Rejected unsafe conversationId on load",{conversationId:a});return}if(d.FlowExecutor.conversationStates.has(a))return h.debug("Loaded state from memory",{conversationId:a}),d.FlowExecutor.conversationStates.get(a);let b=`conversations/${a}`;try{let c=await (0,e.loadItem)(b,void 0);if(c){h.debug("Loaded state from storage",{conversationId:a}),await (0,f.recoverMessagesFromLog)(c);try{let d=(0,f.repairDanglingToolCalls)(c);d.length&&(h.info("Repaired dangling tool call(s) on load",{conversationId:a,count:d.length}),await (0,f.appendRawForState)(c,d.map(a=>({type:"message",message:a}))),await (0,g.persistConversationState)(b,c))}catch(b){h.warn("Failed to repair dangling tool calls on load; continuing",{conversationId:a,repairError:b})}return d.FlowExecutor.conversationStates.set(a,c),c}}catch(b){h.warn("Error loading conversation state from storage",{conversationId:a,error:b})}}},42859:(a,b,c)=>{c.d(b,{internalCallTool:()=>ab,internalToolDefinitions:()=>x});var d=c(33873),e=c.n(d),f=c(29021),g=c(50846),h=c(87821),i=c(20433),j=c(4771),k=c(52189),l=c(16226),m=c(38204),n=c(9312),o=c(29715),p=c(60184),q=c(14214),r=c(43326),s=c(78325),t=c(30227),u=c(81495);let v=(0,g.h)("backend/services/mcp/internalTools");function w(a,b=!1){return{content:[{type:"text",text:"string"==typeof a?a:JSON.stringify(a,null,2)}],...b?{isError:!0}:{}}}function x(){return[...(0,t.cI)(),{name:"list_flows",description:"List all flows in this FLUJO instance with lightweight metadata only (id, name, description, node count) and no flow content. Use this to enumerate flows cheaply. Use list_flow_building_blocks only when you need the full authoring catalog (models + servers + flows).",inputSchema:{type:"object",properties:{}}},{name:"execute_flow",description:"Run another FLUJO flow (by name or id) with the given input and return its final output. The run is ephemeral (no chat conversation is created). Use list_flow_building_blocks to see the available flows. Nested runs are limited in depth — a flow cannot recurse through itself indefinitely.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},input:{type:"string",description:"The message to send to the flow as the user turn."}},required:["flow","input"]}},{name:"read_flow",description:"Read a FLUJO flow's full definition (by name or id): its nodes with their prompts, bound models, attached MCP servers/tools and input/output modes, plus the control and MCP edges. Note this is the COMPILED flow (node ids, not FlowSpec keys) — to change it, author a fresh FlowSpec and call update_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"update_flow",description:"REPLACE an existing FLUJO flow's definition (by name or id) with a newly compiled FlowSpec, keeping the flow's id — so planned executions, subflow nodes and conversations that reference it keep working. The spec format is the same as create_flow/validate_flow_spec (see those tool descriptions); saving is gated on zero validation errors. The replaced definition is archived automatically — list_flow_versions / revert_flow can restore it. Note that manual canvas edits made in the builder are part of what gets replaced. Use read_flow first to see what you are replacing.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id of the flow to replace."},spec:{type:"object",description:"The FlowSpec object (see the create_flow tool description for the format)."}},required:["flow","spec"]}},{name:"list_flow_versions",description:"List a flow's archived versions (by name or id), newest first. A version is created automatically whenever the flow's definition is overwritten (builder save, update_flow, revert_flow) and holds the definition that was replaced. Use read_flow_version to inspect one and revert_flow to restore one.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"read_flow_version",description:"Read one archived version of a flow (see list_flow_versions): the full definition it held before it was replaced, in the same format as read_flow.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id (see list_flow_versions)."}},required:["flow","version"]}},{name:"revert_flow",description:"Restore an archived version (see list_flow_versions) as the flow's CURRENT definition. The definition being reverted away from is archived first, so a revert can itself be undone. References by flow id keep working.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."},version:{type:"string",description:"The version id to restore (see list_flow_versions)."}},required:["flow","version"]}},{name:"delete_flow",description:"PERMANENTLY delete a FLUJO flow (by name or id). This cannot be undone — the flow's version history is deleted with it. Verify the target with list_flow_building_blocks first.",inputSchema:{type:"object",properties:{flow:{type:"string",description:"Flow name or flow id."}},required:["flow"]}},{name:"list_mcp_servers",description:"List the MCP servers configured in this FLUJO instance with their transport, enabled/disabled state and live connection status. Config details (env vars, headers, credentials) are never included.",inputSchema:{type:"object",properties:{}}},{name:"list_mcp_server_tools",description:"List the tools of one configured MCP server (name, description, input schema). Use together with call_mcp_tool for servers that are not bound to this flow.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name (see list_mcp_servers)."}},required:["server"]}},{name:"call_mcp_tool",description:"Call a tool on any configured MCP server by server name + tool name. This lets you use servers that are not bound to the current flow. Check the tool's input schema with list_mcp_server_tools first.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},tool:{type:"string",description:"The tool name on that server."},args:{type:"object",description:"Arguments for the tool (per its input schema)."},timeout:{type:"number",description:"Optional timeout in seconds."}},required:["server","tool"]}},{name:"restart_mcp_server",description:"Force-reconnect a configured MCP server (tears the connection down and rebuilds it). Useful when a server is in an error state after a config or environment change.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."}},required:["server"]}},{name:"set_mcp_server_enabled",description:"Enable or disable a configured MCP server. Disabling disconnects it and prevents any further use; enabling connects it.",inputSchema:{type:"object",properties:{server:{type:"string",description:"The FLUJO server name."},enabled:{type:"boolean",description:"true to enable + connect, false to disable + disconnect."}},required:["server","enabled"]}},{name:"list_models",description:"List the models configured in this FLUJO instance (id, name, display name, description, provider, base URL, context window). API keys are never included. Reference models by id or name in FlowSpecs.",inputSchema:{type:"object",properties:{}}},{name:"list_planned_executions",description:"List the planned (scheduled/triggered) executions in this FLUJO instance with their trigger type, enabled state, armed status and last run outcome.",inputSchema:{type:"object",properties:{}}},{name:"run_planned_execution",description:"Fire a planned execution immediately (by id, see list_planned_executions) and return the run record with its output.",inputSchema:{type:"object",properties:{id:{type:"string",description:"The planned execution id."}},required:["id"]}},{name:"update_planned_execution",description:'Modify an existing planned execution (by id or name, see list_planned_executions). Patch any of: "enabled" (turn the schedule on/off), "prompt" (the run prompt), "flowId" (the flow to run — accepts a flow name or id), "cron" (a convenience for the trigger\'s cron pattern — works for schedule / mcp-poll / url-watch triggers) or a full "trigger" object for complete control. Flow-driven cadence changes are clamped to a minimum interval (a runaway every-second schedule is rejected). The webhook secret token is never returned.',inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."},enabled:{type:"boolean",description:"Enable or disable the execution."},prompt:{type:"string",description:"The run prompt."},flowId:{type:"string",description:"The flow to run — a flow name or id (resolved to the flow id)."},cron:{type:"string",description:"Cron pattern (croner syntax; 6-field form for seconds) for the trigger's schedule. Applies to schedule / mcp-poll / url-watch triggers."},trigger:{type:"object",description:"Full trigger config object (escape hatch for complete control). Prefer the named fields above."}},required:["execution"]}},{name:"create_planned_execution",description:'Create a new planned execution: bind a flow to a trigger so it runs headlessly. Provide "name", "flow" (a flow name or id), an optional "prompt", optional "enabled" (default true), and EITHER a full "trigger" object OR a convenience "cron" (which creates a schedule trigger). Flow-driven cadence is clamped to a minimum interval. A webhook trigger\'s secret token is minted server-side and never returned.',inputSchema:{type:"object",properties:{name:{type:"string",description:"A name for the planned execution."},flow:{type:"string",description:"The flow to run — a flow name or id."},prompt:{type:"string",description:"The run prompt (may be empty)."},enabled:{type:"boolean",description:"Whether to arm the trigger immediately (default true)."},cron:{type:"string",description:'Cron pattern for a schedule trigger (convenience — use "trigger" for other trigger types).'},trigger:{type:"object",description:"Full trigger config object (schedule / webhook / file-watch / mcp-poll / url-watch)."}},required:["name","flow"]}},{name:"delete_planned_execution",description:"Permanently delete a planned execution (by id or name, see list_planned_executions), along with its run history. This cannot be undone.",inputSchema:{type:"object",properties:{execution:{type:"string",description:"The planned execution id or name."}},required:["execution"]}},{name:"list_conversations",description:"List the chat conversations stored in this FLUJO instance (id, title, bound flow, status, created/updated timestamps), newest first. Use read_conversation to get a transcript.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Optional maximum number of conversations to return (newest first). Default: all."}}}},{name:"read_conversation",description:'Read one chat conversation\'s transcript by conversation id (see list_conversations). Returns the displayed messages: system prompts are excluded, nested subflow steps carry a "depth" marker, assistant tool calls are summarized. Long conversations return only the most recent messages — raise "limit" to get more.',inputSchema:{type:"object",properties:{conversation:{type:"string",description:"The conversation id."},limit:{type:"number",description:"Maximum number of most-recent messages to return (default 50). The total transcript size is capped regardless."}},required:["conversation"]}},{name:"kv_get",description:'Read a value from FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs (loop counters, cursors, flags). Returns { found, value }. Defaults to the instance-global board; pass "scope" to target another board (e.g. a flow-folder board id). Values are plain strings, never secrets.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to read (an identifier: letters, digits, _ and -, not starting with a digit)."},scope:{type:"string",description:'Optional board id to read from. Defaults to "global".'}},required:["name"]}},{name:"kv_set",description:'Write a value to FLUJO\'s PERSISTENT key-value store (the ${kv:NAME} store) — state that survives ACROSS flow runs. Last-write-wins. Defaults to the instance-global board; pass "scope" to target another board. Values are plain strings (never secrets — use ${global:} for those) and are size-capped; an oversized write is refused with { saved:false, skipped }.',inputSchema:{type:"object",properties:{name:{type:"string",description:"The key to write (an identifier: letters, digits, _ and -, not starting with a digit)."},value:{type:"string",description:"The string value to store."},scope:{type:"string",description:'Optional board id to write to. Defaults to "global".'}},required:["name","value"]}}]}async function y(a){let b=await h.flowService.loadFlows();return b.find(b=>b.id===a)??b.find(b=>b.name===a)}async function z(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let d=global.__flujo_internal_flow_depth??0;if(d>=4)return w({error:`execute_flow nesting limit (4) reached — refusing to start "${c.name}" to prevent runaway recursion.`},!0);global.__flujo_internal_flow_depth=d+1;try{let b=await (0,l.runFlow)({flowId:c.id,prompt:String(a?.input??""),mode:"ephemeral",flujo:!0,requireApproval:!1});if(b.flowNotFound)return w({error:`Flow not found: ${b.flowNotFound.name}`},!0);if("error"===b.status)return w({error:b.error?.message??"Unknown error during flow execution."},!0);return w(b.outputText??"")}finally{global.__flujo_internal_flow_depth=d}}async function A(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.deleteFlow(c.id);return d.success?w({deleted:!0,flowId:c.id,flowName:c.name}):w({error:d.error??`Failed to delete flow "${c.name}".`},!0)}function B(a){let b=a.nodes.map(a=>{let{mcpNodes:b,...c}=a.data?.properties??{};return{id:a.id,type:a.type,label:a.data?.label,...a.data?.description?{description:a.data.description}:{},properties:c}}),c=a.edges.map(a=>{let b=a.data;return{from:a.source,to:a.target,type:b?.edgeType==="mcp"?"mcp":b?.edgeType==="resource"?"resource":"control",...b?.bidirectional?{bidirectional:!0}:{}}});return{id:a.id,name:a.name,...a.description?{description:a.description}:{},nodes:b,edges:c}}async function C(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);return c?w({...B(c),note:"This is the compiled flow (node ids, not FlowSpec keys). To change it, author a fresh FlowSpec and call update_flow — it replaces the whole definition while keeping this flow id."}):w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0)}async function D(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": a flow name or id.'},!0);let c=await y(b);if(!c)return w({error:`No flow named or with id "${b}".`},!0);let d=await h.flowService.listFlowVersions(c.id);return w({flowId:c.id,flowName:c.name,versions:d,...0===d.length?{note:"No archived versions yet — versions appear once the flow's definition is overwritten for the first time."}:{}})}async function E(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.getFlowVersion(d.id,c);return e?w({versionId:e.versionId,savedAt:e.savedAt,...B(e.flow)}):w({error:`No version "${c}" of flow "${d.name}". Use list_flow_versions to see the archived versions.`},!0)}async function F(a){let b=String(a?.flow??"").trim(),c=String(a?.version??"").trim();if(!b||!c)return w({error:'Provide "flow" (name or id) and "version" (see list_flow_versions).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}".`},!0);let e=await h.flowService.revertFlow(d.id,c);return e.success?w({reverted:!0,flowId:d.id,versionId:c,note:"The definition that was just replaced has been archived too, so this revert can itself be undone via list_flow_versions / revert_flow."}):w({error:e.error??`Failed to revert flow "${d.name}".`},!0)}async function G(a){let b=String(a?.flow??"").trim();if(!b)return w({error:'Provide "flow": the name or id of the flow to replace.'},!0);let c=function(a){let b=a?.spec;if("string"==typeof b)try{return JSON.parse(b)}catch{return null}return b??null}(a);if(!c)return w({error:'Provide a "spec" argument: a FlowSpec object (or a JSON string of one).'},!0);let d=await y(b);if(!d)return w({error:`No flow named or with id "${b}". Use list_flow_building_blocks to see the available flows.`},!0);let e=await (0,m.V)(c,{save:!0,updateFlowId:d.id});return e.success?w({flowId:e.flow.id,flowName:e.flow.name,nodeCount:e.flow.nodes.length,edgeCount:e.flow.edges.length,validation:e.validation,saved:e.saved,...e.saved?{note:`Flow "${e.flow.name}" was replaced (id ${e.flow.id} kept — existing references keep working).`}:{note:"NOT saved: validation found errors. The existing flow is unchanged. Fix the issues and call update_flow again."}},!e.saved):w({error:e.error,issues:e.issues??[]},!0)}async function H(a){let b=await a.loadServerConfigs();return Array.isArray(b)?w(await Promise.all(b.map(async b=>{let c="unknown";try{c=(await a.getServerStatus(b.name)).status}catch(a){v.debug(`list_mcp_servers: getServerStatus failed for ${b.name}`,a)}return{name:b.name,transport:b.transport,enabled:!b.disabled,status:c,...b.builtIn?{builtIn:!0}:{}}}))):w({error:b.error??"Failed to load server configs."},!0)}async function I(a,b,c){let d=String(b?.server??"").trim();if(!d)return w({error:'Provide "server": a FLUJO server name.'},!0);if(d===u._)return w(x().map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})));let{tools:e,error:f}=await a.listServerTools(d,"host"===c?"all":c);return f?w({error:f},!0):w(e.map(a=>({name:a.name,description:a.description,inputSchema:a.inputSchema})))}async function J(a,b,c){let d=String(b?.server??"").trim(),e=String(b?.tool??"").trim();if(!d||!e)return w({error:'Provide "server" and "tool".'},!0);if(d===u._)return w({error:`"${u._}" is this server — call its tools directly instead of through call_mcp_tool.`},!0);let f=b?.args&&"object"==typeof b.args&&!Array.isArray(b.args)?b.args:{},g="number"==typeof b?.timeout?b.timeout:void 0,h=await a.callTool(d,e,f,g,void 0,void 0,void 0,c);if(!h.success)return w({error:h.error??`Tool call failed on ${d}.`},!0);let i=h.data;return i&&Array.isArray(i.content)?i:w(i??{ok:!0})}async function K(a,b){let c=String(b?.server??"").trim();if(!c)return w({error:'Provide "server": a FLUJO server name.'},!0);if(c===u._)return w({ok:!0,note:`"${u._}" is the built-in server — it is always running.`});let d=await a.forceReconnect(c);if(!d.success)return w({error:d.error??`Failed to restart ${c}.`},!0);let e=await a.getServerStatus(c);return w({restarted:!0,server:c,status:e.status})}async function L(a,b){let c=String(b?.server??"").trim(),d=b?.enabled;if(!c||"boolean"!=typeof d)return w({error:'Provide "server" (string) and "enabled" (boolean).'},!0);if(c===u._)return w({error:`The built-in "${u._}" server cannot be disabled.`},!0);let e=await a.updateServerConfig(c,{disabled:!d});return"error"in e?w({error:e.error},!0):w({server:c,enabled:d})}async function M(){try{let a=(await h.flowService.loadFlows()).map(a=>({id:a.id,name:a.name,...a.description?{description:(0,n.xv)(a.description,n.bD)}:{},nodeCount:a.nodes?.length??0}));return w(a)}catch(a){return v.error("list_flows failed",a),w({error:"Failed to load flows."},!0)}}async function N(){return w((await i.modelService.loadModels()).map(a=>({id:a.id,name:a.name,...a.displayName?{displayName:a.displayName}:{},...a.description?{description:a.description}:{},...a.provider?{provider:a.provider}:{},...a.baseUrl?{baseUrl:a.baseUrl}:{},...a.contextWindow?{contextWindow:a.contextWindow}:{}})))}async function O(){return w((await (0,j.getSchedulerService)().list()).map(({execution:a,status:b,lastRun:c})=>({id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type,armed:b?.armed??!1,...c?{lastRun:{status:c.status,firedAt:c.firedAt,...c.error?{error:c.error}:{}}}:{}})))}async function P(a){let b=String(a?.id??"").trim();if(!b)return w({error:'Provide "id": a planned execution id (see list_planned_executions).'},!0);let{record:c,error:d}=await (0,j.getSchedulerService)().runNow(b);return d||!c?w({error:d??"Run failed."},!0):w({runId:c.runId,status:c.status,firedAt:c.firedAt,...c.finishedAt?{finishedAt:c.finishedAt}:{},...c.outputText?{outputText:c.outputText}:{},...c.error?{error:c.error}:{}})}async function Q(a){let b=await (0,j.getSchedulerService)().list(),c=b.find(b=>b.execution.id===a),d=b.find(b=>b.execution.name===a);return(c??d)?.execution??null}function R(a){return{id:a.id,name:a.name,enabled:a.enabled,flowId:a.flowId,triggerType:a.trigger?.type}}function S(a,b){try{let c=(0,k.Z9)(a,b,5).map(a=>new Date(a).getTime()),d=1/0;for(let a=1;a<c.length;a++){let b=c[a]-c[a-1];b>0&&b<d&&(d=b)}return Number.isFinite(d)?d:null}catch{return null}}function T(a){let b=null;return("schedule"===a.type||"url-watch"===a.type?a.cron&&(b=S(a.cron,a.timezone)):"mcp-poll"===a.type&&(a.cron?b=S(a.cron,a.timezone):"number"==typeof a.intervalMs&&(b=a.intervalMs)),null!==b&&b<6e4)?`Cadence too fast: the trigger would fire about every ${Math.round(b/1e3)}s, but flow-driven schedule changes are clamped to a minimum interval of 60s. Choose a slower cadence (change it from the Planned Executions page for a faster one).`:null}async function U(a){let b,c=String(a?.execution??"").trim();if(!c)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let d=await Q(c);if(!d)return w({error:`No planned execution with id or name "${c}". Use list_planned_executions to see them.`},!0);let e={};"boolean"==typeof a?.enabled&&(e.enabled=a.enabled),"string"==typeof a?.prompt&&(e.prompt=a.prompt);let f=String(a?.flowId??a?.flow??"").trim();if(f){let a=await y(f);if(!a)return w({error:`No flow named or with id "${f}". Use list_flow_building_blocks to see the flows.`},!0);e.flowId=a.id}a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger)&&(b=a.trigger);let g="string"==typeof a?.cron?a.cron.trim():"";if(g){let a=b??d.trigger;if("schedule"!==a.type&&"mcp-poll"!==a.type&&"url-watch"!==a.type)return w({error:`The "${a.type}" trigger has no schedule to change with "cron". Pass a full "trigger" object instead.`},!0);b={...a,cron:g}}if(b){let a=T(b);if(a)return w({error:a},!0);e.trigger=b}if(0===Object.keys(e).length)return w({error:"Nothing to update. Provide at least one of: enabled, prompt, flowId, cron, trigger."},!0);let h=await (0,j.getSchedulerService)().update(d.id,e);return h.error||!h.execution?w({error:h.error??"Update failed."},!0):w({updated:!0,...R(h.execution)})}async function V(a){let b,c=String(a?.name??"").trim();if(!c)return w({error:'Provide "name": a name for the planned execution.'},!0);let d=String(a?.flow??a?.flowId??"").trim();if(!d)return w({error:'Provide "flow": a flow name or id to run.'},!0);let e=await y(d);if(!e)return w({error:`No flow named or with id "${d}". Use list_flow_building_blocks to see the flows.`},!0);if(a?.trigger&&"object"==typeof a.trigger&&!Array.isArray(a.trigger))b=a.trigger;else{let c="string"==typeof a?.cron?a.cron.trim():"";if(!c)return w({error:'Provide a "trigger" object or a "cron" pattern (which creates a schedule trigger).'},!0);b={type:"schedule",cron:c}}let f=T(b);if(f)return w({error:f},!0);let g={name:c,enabled:"boolean"!=typeof a?.enabled||a.enabled,flowId:e.id,prompt:"string"==typeof a?.prompt?a.prompt:"",trigger:b},h=await (0,j.getSchedulerService)().create(g);return h.error||!h.execution?w({error:h.error??"Create failed."},!0):w({created:!0,...R(h.execution)})}async function W(a){let b=String(a?.execution??"").trim();if(!b)return w({error:'Provide "execution": a planned execution id or name (see list_planned_executions).'},!0);let c=await Q(b);if(!c)return w({error:`No planned execution with id or name "${b}". Use list_planned_executions to see them.`},!0);let d=await (0,j.getSchedulerService)().delete(c.id);return d.success?w({deleted:!0,id:c.id,name:c.name}):w({error:d.error??`Failed to delete "${c.name}".`},!0)}async function X(a){let b,c=e().join((0,r.getDataDir)(),"db","conversations");try{b=await f.promises.readdir(c)}catch(a){if("ENOENT"===a.code)return w([]);return w({error:`Failed to list conversations: ${a instanceof Error?a.message:String(a)}`},!0)}let d=(await Promise.all(b.filter(a=>a.endsWith(".json")).map(async a=>{try{let b=await f.promises.readFile(e().join(c,a),"utf-8"),d=JSON.parse(b),g=d.conversationId||a.replace(/\.json$/,""),h=d.status;return"running"===h&&0===q.$.currentSeq(g)&&(h="error"),{id:g,title:d.title||"Untitled Conversation",flowId:d.flowId||null,...h?{status:h}:{},createdAt:d.createdAt||0,updatedAt:d.updatedAt||0}}catch(b){return v.warn(`list_conversations: skipping unreadable conversation file ${a}`,b),null}}))).filter(a=>null!==a).sort((a,b)=>b.updatedAt-a.updatedAt),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):void 0;return w(g?d.slice(0,g):d)}async function Y(a){let b=String(a?.conversation??"").trim();if(!b)return w({error:'Provide "conversation": a conversation id (see list_conversations).'},!0);await (0,p.flushConversationLog)(b);let c=await (0,o.N)(b);if(!c)return w({error:`No conversation with id "${b}". Use list_conversations to see the stored conversations.`},!0);let d=await (0,p.readConversationLog)(b),e=d?(0,p.projectMessages)(d):[],f=e.length>0?e:(c.messages||[]).filter(a=>"system"!==a.role),g="number"==typeof a?.limit&&a.limit>0?Math.floor(a.limit):50,h=[],i=0;for(let a=f.length-1;a>=0&&h.length<g;a--){let b=function(a){let b="";"string"==typeof a.content?b=a.content:Array.isArray(a.content)&&(b=a.content.map(a=>"text"in a&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"));let c={role:a.role,...b?{content:b}:{},...a.timestamp?{timestamp:a.timestamp}:{},...a.depth?{depth:a.depth}:{}};return"assistant"===a.role&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0&&(c.toolCalls=a.tool_calls.map(a=>{let b="function"in a?a.function:void 0,c=b&&"string"==typeof b.arguments?b.arguments:void 0;return{id:a.id,...b?.name?{name:b.name}:{},...void 0!==c?{arguments:c.length>2e3?c.slice(0,2e3)+"…[truncated]":c}:{}}})),"tool"===a.role&&a.tool_call_id&&(c.toolCallId=a.tool_call_id),c}(f[a]),c=JSON.stringify(b).length;if(h.length>0&&i+c>1e5)break;h.push(b),i+=c}return h.reverse(),w({id:c.conversationId||b,title:c.title||"Untitled Conversation",flowId:c.flowId||null,...c.status?{status:c.status}:{},createdAt:c.createdAt||0,updatedAt:c.updatedAt||0,totalMessages:f.length,...h.length<f.length?{note:`Returning the ${h.length} most recent of ${f.length} messages — raise "limit" to get more.`}:{},messages:h})}let Z=/^[A-Za-z0-9_-]{1,64}$/,$=/^[A-Za-z_][\w-]*$/;async function _(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global";if(!$.test(b))return w({error:'kv_get requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let d=await (0,s.M3)(c,b);return w({scope:c,name:b,found:void 0!==d,value:d??null})}async function aa(a){let b="string"==typeof a.name?a.name.trim():"",c="string"==typeof a.scope&&a.scope.trim()?a.scope.trim():"global",d="string"==typeof a.value?a.value:null==a.value?"":String(a.value);if(!$.test(b))return w({error:'kv_set requires a valid "name" (letters, digits, _ and -, not starting with a digit).'},!0);if(!Z.test(c))return w({error:`Invalid kv scope id: ${c}`},!0);let e=await (0,s.or)(c,b,d);return"skipped"in e?w({scope:c,name:b,saved:!1,skipped:e.skipped},!0):w({scope:c,name:b,saved:!0,size:e.size})}async function ab(a,b,c,d="host"){try{if((0,t.yM)(b))return await (0,t.oV)(b,c);switch(b){case"list_flows":return await M();case"execute_flow":return await z(c);case"read_flow":return await C(c);case"update_flow":return await G(c);case"list_flow_versions":return await D(c);case"read_flow_version":return await E(c);case"revert_flow":return await F(c);case"delete_flow":return await A(c);case"list_mcp_servers":return await H(a);case"list_mcp_server_tools":return await I(a,c,d);case"call_mcp_tool":return await J(a,c,d);case"restart_mcp_server":return await K(a,c);case"set_mcp_server_enabled":return await L(a,c);case"list_models":return await N();case"list_planned_executions":return await O();case"run_planned_execution":return await P(c);case"update_planned_execution":return await U(c);case"create_planned_execution":return await V(c);case"delete_planned_execution":return await W(c);case"list_conversations":return await X(c);case"read_conversation":return await Y(c);case"kv_get":return await _(c);case"kv_set":return await aa(c);default:return w({error:`Unknown tool on the built-in FLUJO server: ${b}`},!0)}}catch(a){return v.error("internalCallTool failed",{toolName:b,err:a}),w({error:`Tool failed: ${a instanceof Error?a.message:String(a)}`},!0)}}}};
|