flujo-ai 3.45.1 → 3.45.2
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-path-routes-manifest.json +37 -37
- package/.next/build-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +2 -2
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/telemetry/daily-active/route.js +1 -1
- package/.next/server/app/automation/triggers.html +1 -1
- package/.next/server/app/automation/triggers.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/_full.segment.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/_head.segment.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/_index.segment.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/automation/triggers/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/automation/triggers.segment.rsc +1 -1
- package/.next/server/app/automation/triggers.segments/automation.segment.rsc +1 -1
- package/.next/server/app/automation/waves.html +1 -1
- package/.next/server/app/automation/waves.rsc +1 -1
- package/.next/server/app/automation/waves.segments/_full.segment.rsc +1 -1
- package/.next/server/app/automation/waves.segments/_head.segment.rsc +1 -1
- package/.next/server/app/automation/waves.segments/_index.segment.rsc +1 -1
- package/.next/server/app/automation/waves.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/automation/waves.segments/automation/waves/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/automation/waves.segments/automation/waves.segment.rsc +1 -1
- package/.next/server/app/automation/waves.segments/automation.segment.rsc +1 -1
- package/.next/server/app/chain-chat.html +1 -1
- package/.next/server/app/chain-chat.rsc +1 -1
- package/.next/server/app/chain-chat.segments/_full.segment.rsc +1 -1
- package/.next/server/app/chain-chat.segments/_head.segment.rsc +1 -1
- package/.next/server/app/chain-chat.segments/_index.segment.rsc +1 -1
- package/.next/server/app/chain-chat.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/chain-chat.segments/chain-chat/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/chain-chat.segments/chain-chat.segment.rsc +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/chat.segments/_full.segment.rsc +2 -2
- package/.next/server/app/chat.segments/_head.segment.rsc +1 -1
- package/.next/server/app/chat.segments/_index.segment.rsc +1 -1
- package/.next/server/app/chat.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat.segment.rsc +1 -1
- package/.next/server/app/docs.html +1 -1
- package/.next/server/app/docs.rsc +1 -1
- package/.next/server/app/docs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/docs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/docs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/docs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/docs.segments/docs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/docs.segments/docs.segment.rsc +1 -1
- package/.next/server/app/executions.html +1 -1
- package/.next/server/app/executions.rsc +1 -1
- package/.next/server/app/executions.segments/_full.segment.rsc +1 -1
- package/.next/server/app/executions.segments/_head.segment.rsc +1 -1
- package/.next/server/app/executions.segments/_index.segment.rsc +1 -1
- package/.next/server/app/executions.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/executions.segments/executions/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/executions.segments/executions.segment.rsc +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/flows.segments/_full.segment.rsc +2 -2
- package/.next/server/app/flows.segments/_head.segment.rsc +1 -1
- package/.next/server/app/flows.segments/_index.segment.rsc +1 -1
- package/.next/server/app/flows.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/flows.segments/flows/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/flows.segments/flows.segment.rsc +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +1 -1
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.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-proxy/[server]/route.js +1 -1
- package/.next/server/app/mcp.html +1 -1
- package/.next/server/app/mcp.rsc +2 -2
- package/.next/server/app/mcp.segments/_full.segment.rsc +2 -2
- package/.next/server/app/mcp.segments/_head.segment.rsc +1 -1
- package/.next/server/app/mcp.segments/_index.segment.rsc +1 -1
- package/.next/server/app/mcp.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/mcp.segments/mcp/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/mcp.segments/mcp.segment.rsc +1 -1
- package/.next/server/app/meetings.html +1 -1
- package/.next/server/app/meetings.rsc +1 -1
- package/.next/server/app/meetings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/meetings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/meetings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/meetings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/meetings.segments/meetings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/meetings.segments/meetings.segment.rsc +1 -1
- package/.next/server/app/packages.html +1 -1
- package/.next/server/app/packages.rsc +1 -1
- package/.next/server/app/packages.segments/_full.segment.rsc +1 -1
- package/.next/server/app/packages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/packages.segments/_index.segment.rsc +1 -1
- package/.next/server/app/packages.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/packages.segments/packages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/packages.segments/packages.segment.rsc +1 -1
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +1 -1
- package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
- package/.next/server/app/roles/new.html +1 -1
- package/.next/server/app/roles/new.rsc +1 -1
- package/.next/server/app/roles/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/roles/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/roles/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/roles/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/roles/new.segments/roles/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/roles/new.segments/roles/new.segment.rsc +1 -1
- package/.next/server/app/roles/new.segments/roles.segment.rsc +1 -1
- package/.next/server/app/roles.html +1 -1
- package/.next/server/app/roles.rsc +1 -1
- package/.next/server/app/roles.segments/_full.segment.rsc +1 -1
- package/.next/server/app/roles.segments/_head.segment.rsc +1 -1
- package/.next/server/app/roles.segments/_index.segment.rsc +1 -1
- package/.next/server/app/roles.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/roles.segments/roles/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/roles.segments/roles.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/statistics.html +1 -1
- package/.next/server/app/statistics.rsc +1 -1
- package/.next/server/app/statistics.segments/_full.segment.rsc +1 -1
- package/.next/server/app/statistics.segments/_head.segment.rsc +1 -1
- package/.next/server/app/statistics.segments/_index.segment.rsc +1 -1
- package/.next/server/app/statistics.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/statistics.segments/statistics/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/statistics.segments/statistics.segment.rsc +1 -1
- package/.next/server/app/waves.html +1 -1
- package/.next/server/app/waves.rsc +1 -1
- package/.next/server/app/waves.segments/_full.segment.rsc +1 -1
- package/.next/server/app/waves.segments/_head.segment.rsc +1 -1
- package/.next/server/app/waves.segments/_index.segment.rsc +1 -1
- package/.next/server/app/waves.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/waves.segments/waves/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/waves.segments/waves.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +37 -37
- package/.next/server/chunks/1475.js +1 -1
- package/.next/server/chunks/1914.js +1 -1
- package/.next/server/chunks/2887.js +1 -1
- package/.next/server/chunks/3686.js +1 -1
- package/.next/server/chunks/5189.js +1 -1
- package/.next/server/chunks/5399.js +1 -1
- package/.next/server/chunks/5560.js +2 -2
- package/.next/server/chunks/7570.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/{7208-5af7190dbc0e142b.js → 7208-714230aba8f0df89.js} +1 -1
- package/.next/static/chunks/webpack-f1c3062d7039f0c7.js +1 -0
- package/.next/trace +118 -118
- package/.next/trace-build +1 -1
- package/README.md +1 -1
- package/mcp-servers/bash/package.json +1 -1
- package/mcp-servers/browser/package.json +1 -1
- package/mcp-servers/filesystem/package.json +1 -1
- package/mcp-servers/flujo/package.json +1 -1
- package/package.json +5 -5
- package/.next/static/chunks/webpack-489c70bebf5a4745.js +0 -1
- /package/.next/static/{PEARC3s6DHN81nwlN8qpZ → 21CjEbc0FIa9X6No7R5M-}/_buildManifest.js +0 -0
- /package/.next/static/{PEARC3s6DHN81nwlN8qpZ → 21CjEbc0FIa9X6No7R5M-}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" class="modern-theme" data-visual-style="modern" style="color-scheme:light"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/3039119d0dca0162.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/14e89bc0b3933096.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-489c70bebf5a4745.js"/><script src="/_next/static/chunks/4bd1b696-df4c0fb946159b6a.js" async=""></script><script src="/_next/static/chunks/3794-3dbd06ff79d82322.js" async=""></script><script src="/_next/static/chunks/main-app-e679bf23846f942b.js" async=""></script><script src="/_next/static/chunks/1418-f51929a8b8570ebc.js" async=""></script><script src="/_next/static/chunks/9086-532cfae1b7518d44.js" async=""></script><script src="/_next/static/chunks/5212-a971d359522614b8.js" async=""></script><script src="/_next/static/chunks/967-073b8b5446008812.js" async=""></script><script src="/_next/static/chunks/7442-7b498ca5b12935cb.js" async=""></script><script src="/_next/static/chunks/app/layout-5f80d974c7dd4f44.js" async=""></script><script src="/_next/static/chunks/1a258343-4d331e3ae7a6d7bb.js" async=""></script><script src="/_next/static/chunks/2457-6aee43c03314b6e6.js" async=""></script><script src="/_next/static/chunks/7629-65fd18a22039b979.js" async=""></script><script src="/_next/static/chunks/9852-d412d73372303a74.js" async=""></script><script src="/_next/static/chunks/8111-55ff10e1dbdcc048.js" async=""></script><script src="/_next/static/chunks/8554-7021169fd000047d.js" async=""></script><script src="/_next/static/chunks/2636-c979d3932b1ee7aa.js" async=""></script><script src="/_next/static/chunks/6939-f6f9b85d84f32f6e.js" async=""></script><script src="/_next/static/chunks/1216-bb175dec003d036e.js" async=""></script><script src="/_next/static/chunks/1212-0832c0676fb97f2a.js" async=""></script><script src="/_next/static/chunks/108-e663525e5af880e0.js" async=""></script><script src="/_next/static/chunks/323-b53a75672a87d62d.js" async=""></script><script src="/_next/static/chunks/7570-844d411076417b01.js" async=""></script><script src="/_next/static/chunks/2261-682f7c7f70aeae66.js" async=""></script><script src="/_next/static/chunks/191-900defa9aee481f6.js" async=""></script><script src="/_next/static/chunks/357-7381c9d4ce5c1079.js" async=""></script><script src="/_next/static/chunks/2901-00a7163a7918701f.js" async=""></script><script src="/_next/static/chunks/9894-9f569503f52595dd.js" async=""></script><script src="/_next/static/chunks/4866-7530ebaf8b2da504.js" async=""></script><script src="/_next/static/chunks/1878-8a568213456bfd9f.js" async=""></script><script src="/_next/static/chunks/app/waves/page-472bc05d93ade3c0.js" async=""></script><meta name="theme-color" content="#F5F7FF" media="(prefers-color-scheme: light)"/><meta name="theme-color" content="#070912" media="(prefers-color-scheme: dark)"/><title>FLUJO — Local AI Operations</title><meta name="description" content="Design, connect, and run private AI systems from one local operations studio."/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_246ccd __variable_c29908 antialiased"><div hidden=""><!--$--><!--/$--></div><!--$--><div class="app-loading" role="status" aria-live="polite"><div class="app-loading__content"><div class="app-loading__mark" aria-hidden="true"><span>F</span></div><span>Opening your workspace</span></div></div><!--/$--><script src="/_next/static/chunks/webpack-489c70bebf5a4745.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[30343,[\"1418\",\"static/chunks/1418-f51929a8b8570ebc.js\",\"9086\",\"static/chunks/9086-532cfae1b7518d44.js\",\"5212\",\"static/chunks/5212-a971d359522614b8.js\",\"967\",\"static/chunks/967-073b8b5446008812.js\",\"7442\",\"static/chunks/7442-7b498ca5b12935cb.js\",\"7177\",\"static/chunks/app/layout-5f80d974c7dd4f44.js\"],\"default\"]\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[61304,[],\"ClientPageRoot\"]\n6:I[75166,[\"3862\",\"static/chunks/1a258343-4d331e3ae7a6d7bb.js\",\"2457\",\"static/chunks/2457-6aee43c03314b6e6.js\",\"7629\",\"static/chunks/7629-65fd18a22039b979.js\",\"9852\",\"static/chunks/9852-d412d73372303a74.js\",\"8111\",\"static/chunks/8111-55ff10e1dbdcc048.js\",\"8554\",\"static/chunks/8554-7021169fd000047d.js\",\"2636\",\"static/chunks/2636-c979d3932b1ee7aa.js\",\"6939\",\"static/chunks/6939-f6f9b85d84f32f6e.js\",\"1216\",\"static/chunks/1216-bb175dec003d036e.js\",\"1418\",\"static/chunks/1418-f51929a8b8570ebc.js\",\"1212\",\"static/chunks/1212-0832c0676fb97f2a.js\",\"108\",\"static/chunks/108-e663525e5af880e0.js\",\"323\",\"static/chunks/323-b53a75672a87d62d.js\",\"7570\",\"static/chunks/7570-844d411076417b01.js\",\"2261\",\"static/chunks/2261-682f7c7f70aeae66.js\",\"191\",\"static/chunks/191-900defa9aee481f6.js\",\"357\",\"static/chunks/357-7381c9d4ce5c1079.js\",\"2901\",\"static/chunks/2901-00a7163a7918701f.js\",\"5212\",\"static/chunks/5212-a971d359522614b8.js\",\"9894\",\"static/chunks/9894-9f569503f52595dd.js\",\"4866\",\"static/chunks/4866-7530ebaf8b2da504.js\",\"1878\",\"static/chunks/1878-8a568213456bfd9f.js\",\"603\",\"static/chunks/app/waves/page-472bc05d93ade3c0.js\"],\"default\"]\n9:I[90484,[],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[90484,[],\"ViewportBoundary\"]\nf:I[90484,[],\"MetadataBoundary\"]\n11:I[27123,[],\"default\",1]\n:HL[\"/_next/static/css/3039119d0dca0162.css\",\"style\"]\n:HL[\"/_next/static/css/14e89bc0b3933096.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"waves\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"waves\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3039119d0dca0162.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/14e89bc0b3933096.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"modern-theme\",\"data-visual-style\":\"modern\",\"style\":{\"colorScheme\":\"light\"},\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_246ccd __variable_c29908 antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{\"Component\":\"$6\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}}],null,[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"PEARC3s6DHN81nwlN8qpZ\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n7:{}\n8:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#F5F7FF\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"content\":\"#070912\",\"media\":\"(prefers-color-scheme: dark)\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\n10:[[\"$\",\"title\",\"0\",{\"children\":\"FLUJO — Local AI Operations\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Design, connect, and run private AI systems from one local operations studio.\"}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><html lang="en" class="modern-theme" data-visual-style="modern" style="color-scheme:light"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/3039119d0dca0162.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/14e89bc0b3933096.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-f1c3062d7039f0c7.js"/><script src="/_next/static/chunks/4bd1b696-df4c0fb946159b6a.js" async=""></script><script src="/_next/static/chunks/3794-3dbd06ff79d82322.js" async=""></script><script src="/_next/static/chunks/main-app-e679bf23846f942b.js" async=""></script><script src="/_next/static/chunks/1418-f51929a8b8570ebc.js" async=""></script><script src="/_next/static/chunks/9086-532cfae1b7518d44.js" async=""></script><script src="/_next/static/chunks/5212-a971d359522614b8.js" async=""></script><script src="/_next/static/chunks/967-073b8b5446008812.js" async=""></script><script src="/_next/static/chunks/7442-7b498ca5b12935cb.js" async=""></script><script src="/_next/static/chunks/app/layout-5f80d974c7dd4f44.js" async=""></script><script src="/_next/static/chunks/1a258343-4d331e3ae7a6d7bb.js" async=""></script><script src="/_next/static/chunks/2457-6aee43c03314b6e6.js" async=""></script><script src="/_next/static/chunks/7629-65fd18a22039b979.js" async=""></script><script src="/_next/static/chunks/9852-d412d73372303a74.js" async=""></script><script src="/_next/static/chunks/8111-55ff10e1dbdcc048.js" async=""></script><script src="/_next/static/chunks/8554-7021169fd000047d.js" async=""></script><script src="/_next/static/chunks/2636-c979d3932b1ee7aa.js" async=""></script><script src="/_next/static/chunks/6939-f6f9b85d84f32f6e.js" async=""></script><script src="/_next/static/chunks/1216-bb175dec003d036e.js" async=""></script><script src="/_next/static/chunks/1212-0832c0676fb97f2a.js" async=""></script><script src="/_next/static/chunks/108-e663525e5af880e0.js" async=""></script><script src="/_next/static/chunks/323-b53a75672a87d62d.js" async=""></script><script src="/_next/static/chunks/7570-844d411076417b01.js" async=""></script><script src="/_next/static/chunks/2261-682f7c7f70aeae66.js" async=""></script><script src="/_next/static/chunks/191-900defa9aee481f6.js" async=""></script><script src="/_next/static/chunks/357-7381c9d4ce5c1079.js" async=""></script><script src="/_next/static/chunks/2901-00a7163a7918701f.js" async=""></script><script src="/_next/static/chunks/9894-9f569503f52595dd.js" async=""></script><script src="/_next/static/chunks/4866-7530ebaf8b2da504.js" async=""></script><script src="/_next/static/chunks/1878-8a568213456bfd9f.js" async=""></script><script src="/_next/static/chunks/app/waves/page-472bc05d93ade3c0.js" async=""></script><meta name="theme-color" content="#F5F7FF" media="(prefers-color-scheme: light)"/><meta name="theme-color" content="#070912" media="(prefers-color-scheme: dark)"/><title>FLUJO — Local AI Operations</title><meta name="description" content="Design, connect, and run private AI systems from one local operations studio."/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_246ccd __variable_c29908 antialiased"><div hidden=""><!--$--><!--/$--></div><!--$--><div class="app-loading" role="status" aria-live="polite"><div class="app-loading__content"><div class="app-loading__mark" aria-hidden="true"><span>F</span></div><span>Opening your workspace</span></div></div><!--/$--><script src="/_next/static/chunks/webpack-f1c3062d7039f0c7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[30343,[\"1418\",\"static/chunks/1418-f51929a8b8570ebc.js\",\"9086\",\"static/chunks/9086-532cfae1b7518d44.js\",\"5212\",\"static/chunks/5212-a971d359522614b8.js\",\"967\",\"static/chunks/967-073b8b5446008812.js\",\"7442\",\"static/chunks/7442-7b498ca5b12935cb.js\",\"7177\",\"static/chunks/app/layout-5f80d974c7dd4f44.js\"],\"default\"]\n3:I[57121,[],\"\"]\n4:I[74581,[],\"\"]\n5:I[61304,[],\"ClientPageRoot\"]\n6:I[75166,[\"3862\",\"static/chunks/1a258343-4d331e3ae7a6d7bb.js\",\"2457\",\"static/chunks/2457-6aee43c03314b6e6.js\",\"7629\",\"static/chunks/7629-65fd18a22039b979.js\",\"9852\",\"static/chunks/9852-d412d73372303a74.js\",\"8111\",\"static/chunks/8111-55ff10e1dbdcc048.js\",\"8554\",\"static/chunks/8554-7021169fd000047d.js\",\"2636\",\"static/chunks/2636-c979d3932b1ee7aa.js\",\"6939\",\"static/chunks/6939-f6f9b85d84f32f6e.js\",\"1216\",\"static/chunks/1216-bb175dec003d036e.js\",\"1418\",\"static/chunks/1418-f51929a8b8570ebc.js\",\"1212\",\"static/chunks/1212-0832c0676fb97f2a.js\",\"108\",\"static/chunks/108-e663525e5af880e0.js\",\"323\",\"static/chunks/323-b53a75672a87d62d.js\",\"7570\",\"static/chunks/7570-844d411076417b01.js\",\"2261\",\"static/chunks/2261-682f7c7f70aeae66.js\",\"191\",\"static/chunks/191-900defa9aee481f6.js\",\"357\",\"static/chunks/357-7381c9d4ce5c1079.js\",\"2901\",\"static/chunks/2901-00a7163a7918701f.js\",\"5212\",\"static/chunks/5212-a971d359522614b8.js\",\"9894\",\"static/chunks/9894-9f569503f52595dd.js\",\"4866\",\"static/chunks/4866-7530ebaf8b2da504.js\",\"1878\",\"static/chunks/1878-8a568213456bfd9f.js\",\"603\",\"static/chunks/app/waves/page-472bc05d93ade3c0.js\"],\"default\"]\n9:I[90484,[],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nd:I[90484,[],\"ViewportBoundary\"]\nf:I[90484,[],\"MetadataBoundary\"]\n11:I[27123,[],\"default\",1]\n:HL[\"/_next/static/css/3039119d0dca0162.css\",\"style\"]\n:HL[\"/_next/static/css/14e89bc0b3933096.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"waves\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"waves\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3039119d0dca0162.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/14e89bc0b3933096.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"modern-theme\",\"data-visual-style\":\"modern\",\"style\":{\"colorScheme\":\"light\"},\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__variable_246ccd __variable_c29908 antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L5\",null,{\"Component\":\"$6\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@7\",\"$@8\"]}}],null,[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,null]},null,false,\"$@c\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"children\":\"$Le\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lf\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L10\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$11\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"21CjEbc0FIa9X6No7R5M-\"}\n"])</script><script>self.__next_f.push([1,"12:[]\nc:\"$W12\"\n7:{}\n8:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script><script>self.__next_f.push([1,"e:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#F5F7FF\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"content\":\"#070912\",\"media\":\"(prefers-color-scheme: dark)\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\n10:[[\"$\",\"title\",\"0\",{\"children\":\"FLUJO — Local AI Operations\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Design, connect, and run private AI systems from one local operations studio.\"}]]\n"])</script></body></html>
|
|
@@ -11,7 +11,7 @@ f:I[90484,[],"MetadataBoundary"]
|
|
|
11
11
|
11:I[27123,[],"default",1]
|
|
12
12
|
:HL["/_next/static/css/3039119d0dca0162.css","style"]
|
|
13
13
|
:HL["/_next/static/css/14e89bc0b3933096.css","style"]
|
|
14
|
-
0:{"P":null,"c":["","waves"],"q":"","i":false,"f":[[["",{"children":["waves",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3039119d0dca0162.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/14e89bc0b3933096.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"modern-theme","data-visual-style":"modern","style":{"colorScheme":"light"},"suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_246ccd __variable_c29908 antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"
|
|
14
|
+
0:{"P":null,"c":["","waves"],"q":"","i":false,"f":[[["",{"children":["waves",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3039119d0dca0162.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/14e89bc0b3933096.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"modern-theme","data-visual-style":"modern","style":{"colorScheme":"light"},"suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_246ccd __variable_c29908 antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"21CjEbc0FIa9X6No7R5M-"}
|
|
15
15
|
12:[]
|
|
16
16
|
c:"$W12"
|
|
17
17
|
7:{}
|
|
@@ -11,7 +11,7 @@ f:I[90484,[],"MetadataBoundary"]
|
|
|
11
11
|
11:I[27123,[],"default",1]
|
|
12
12
|
:HL["/_next/static/css/3039119d0dca0162.css","style"]
|
|
13
13
|
:HL["/_next/static/css/14e89bc0b3933096.css","style"]
|
|
14
|
-
0:{"P":null,"c":["","waves"],"q":"","i":false,"f":[[["",{"children":["waves",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3039119d0dca0162.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/14e89bc0b3933096.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"modern-theme","data-visual-style":"modern","style":{"colorScheme":"light"},"suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_246ccd __variable_c29908 antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"
|
|
14
|
+
0:{"P":null,"c":["","waves"],"q":"","i":false,"f":[[["",{"children":["waves",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3039119d0dca0162.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/14e89bc0b3933096.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","className":"modern-theme","data-visual-style":"modern","style":{"colorScheme":"light"},"suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_246ccd __variable_c29908 antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L3",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L5",null,{"Component":"$6","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@7","$@8"]}}],null,["$","$L9",null,{"children":["$","$a",null,{"name":"Next.MetadataOutlet","children":"$@b"}]}]]}],{},null,false,null]},null,false,"$@c"]},null,false,null],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$a",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"21CjEbc0FIa9X6No7R5M-"}
|
|
15
15
|
12:[]
|
|
16
16
|
c:"$W12"
|
|
17
17
|
7:{}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
2:I[90484,[],"ViewportBoundary"]
|
|
3
3
|
3:I[90484,[],"MetadataBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
|
-
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","2",{"name":"theme-color","content":"#F5F7FF","media":"(prefers-color-scheme: light)"}],["$","meta","3",{"name":"theme-color","content":"#070912","media":"(prefers-color-scheme: dark)"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"FLUJO — Local AI Operations"}],["$","meta","1",{"name":"description","content":"Design, connect, and run private AI systems from one local operations studio."}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
5
|
+
0:{"rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","2",{"name":"theme-color","content":"#F5F7FF","media":"(prefers-color-scheme: light)"}],["$","meta","3",{"name":"theme-color","content":"#070912","media":"(prefers-color-scheme: dark)"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"FLUJO — Local AI Operations"}],["$","meta","1",{"name":"description","content":"Design, connect, and run private AI systems from one local operations studio."}]]}]}]}],null]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"21CjEbc0FIa9X6No7R5M-"}
|
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
4:I[74581,[],""]
|
|
5
5
|
:HL["/_next/static/css/3039119d0dca0162.css","style"]
|
|
6
6
|
:HL["/_next/static/css/14e89bc0b3933096.css","style"]
|
|
7
|
-
0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3039119d0dca0162.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/14e89bc0b3933096.css","precedence":"next"}]],["$","html",null,{"lang":"en","className":"modern-theme","data-visual-style":"modern","style":{"colorScheme":"light"},"suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_246ccd __variable_c29908 antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
7
|
+
0:{"rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/3039119d0dca0162.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/14e89bc0b3933096.css","precedence":"next"}]],["$","html",null,{"lang":"en","className":"modern-theme","data-visual-style":"modern","style":{"colorScheme":"light"},"suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_246ccd __variable_c29908 antialiased","children":["$","$L2",null,{"children":["$","$L3",null,{"parallelRouterKey":"children","template":["$","$L4",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"21CjEbc0FIa9X6No7R5M-"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
:HL["/_next/static/css/3039119d0dca0162.css","style"]
|
|
2
2
|
:HL["/_next/static/css/14e89bc0b3933096.css","style"]
|
|
3
|
-
0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"waves","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"
|
|
3
|
+
0:{"tree":{"name":"","param":null,"prefetchHints":16,"slots":{"children":{"name":"waves","param":null,"prefetchHints":0,"slots":{"children":{"name":"__PAGE__","param":null,"prefetchHints":0,"slots":null}}}}},"staleTime":300,"buildId":"21CjEbc0FIa9X6No7R5M-"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
3:I[75166,["3862","static/chunks/1a258343-4d331e3ae7a6d7bb.js","2457","static/chunks/2457-6aee43c03314b6e6.js","7629","static/chunks/7629-65fd18a22039b979.js","9852","static/chunks/9852-d412d73372303a74.js","8111","static/chunks/8111-55ff10e1dbdcc048.js","8554","static/chunks/8554-7021169fd000047d.js","2636","static/chunks/2636-c979d3932b1ee7aa.js","6939","static/chunks/6939-f6f9b85d84f32f6e.js","1216","static/chunks/1216-bb175dec003d036e.js","1418","static/chunks/1418-f51929a8b8570ebc.js","1212","static/chunks/1212-0832c0676fb97f2a.js","108","static/chunks/108-e663525e5af880e0.js","323","static/chunks/323-b53a75672a87d62d.js","7570","static/chunks/7570-844d411076417b01.js","2261","static/chunks/2261-682f7c7f70aeae66.js","191","static/chunks/191-900defa9aee481f6.js","357","static/chunks/357-7381c9d4ce5c1079.js","2901","static/chunks/2901-00a7163a7918701f.js","5212","static/chunks/5212-a971d359522614b8.js","9894","static/chunks/9894-9f569503f52595dd.js","4866","static/chunks/4866-7530ebaf8b2da504.js","1878","static/chunks/1878-8a568213456bfd9f.js","603","static/chunks/app/waves/page-472bc05d93ade3c0.js"],"default"]
|
|
4
4
|
6:I[90484,[],"OutletBoundary"]
|
|
5
5
|
7:"$Sreact.suspense"
|
|
6
|
-
0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],null,["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"
|
|
6
|
+
0:{"rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],null,["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"isPartial":false,"staleTime":300,"varyParams":null,"buildId":"21CjEbc0FIa9X6No7R5M-"}
|
|
7
7
|
4:{}
|
|
8
8
|
5:"$0:rsc:props:children:0:props:serverProvidedParams:params"
|
|
9
9
|
8:null
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
2:I[57121,[],""]
|
|
3
3
|
3:I[74581,[],""]
|
|
4
4
|
4:[]
|
|
5
|
-
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"
|
|
5
|
+
0:{"rsc":["$","$1","c",{"children":[null,["$","$L2",null,{"parallelRouterKey":"children","template":["$","$L3",null,{}]}]]}],"isPartial":false,"staleTime":300,"varyParams":"$W4","buildId":"21CjEbc0FIa9X6No7R5M-"}
|
|
@@ -12,50 +12,50 @@
|
|
|
12
12
|
"/api/worker/status/route": "app/api/worker/status/route.js",
|
|
13
13
|
"/api/workspaces/route": "app/api/workspaces/route.js",
|
|
14
14
|
"/v1/models/route": "app/v1/models/route.js",
|
|
15
|
+
"/api/browse/route": "app/api/browse/route.js",
|
|
16
|
+
"/api/backup/route": "app/api/backup/route.js",
|
|
17
|
+
"/api/bugs/enhance/route": "app/api/bugs/enhance/route.js",
|
|
15
18
|
"/api/approvals/[id]/route": "app/api/approvals/[id]/route.js",
|
|
16
19
|
"/api/cloud/instance/route": "app/api/cloud/instance/route.js",
|
|
17
20
|
"/api/cwd/route": "app/api/cwd/route.js",
|
|
18
|
-
"/api/encryption/secure/route": "app/api/encryption/secure/route.js",
|
|
19
|
-
"/api/env/route": "app/api/env/route.js",
|
|
20
21
|
"/api/flow/[id]/convert-process-to-subflow/route": "app/api/flow/[id]/convert-process-to-subflow/route.js",
|
|
21
|
-
"/api/flow/[id]/route": "app/api/flow/[id]/route.js",
|
|
22
22
|
"/api/flow/[id]/versions/[versionId]/route": "app/api/flow/[id]/versions/[versionId]/route.js",
|
|
23
23
|
"/api/flow/[id]/versions/route": "app/api/flow/[id]/versions/route.js",
|
|
24
|
-
"/api/flow/
|
|
24
|
+
"/api/flow/[id]/route": "app/api/flow/[id]/route.js",
|
|
25
|
+
"/api/encryption/secure/route": "app/api/encryption/secure/route.js",
|
|
25
26
|
"/api/flow/compile/route": "app/api/flow/compile/route.js",
|
|
26
|
-
"/api/flow/generate/route": "app/api/flow/generate/route.js",
|
|
27
27
|
"/api/flow/generate/visual/route": "app/api/flow/generate/visual/route.js",
|
|
28
|
+
"/api/flow/generate/route": "app/api/flow/generate/route.js",
|
|
28
29
|
"/api/flow/generator/route": "app/api/flow/generator/route.js",
|
|
30
|
+
"/api/flow/assist/route": "app/api/flow/assist/route.js",
|
|
31
|
+
"/api/env/route": "app/api/env/route.js",
|
|
29
32
|
"/api/flow/improve/route": "app/api/flow/improve/route.js",
|
|
30
|
-
"/api/flow/model-agent/route": "app/api/flow/model-agent/route.js",
|
|
31
33
|
"/api/flow/prompt-renderer/route": "app/api/flow/prompt-renderer/route.js",
|
|
32
34
|
"/api/flow/quick-chat/route": "app/api/flow/quick-chat/route.js",
|
|
33
35
|
"/api/flow/repair/route": "app/api/flow/repair/route.js",
|
|
36
|
+
"/api/flow/model-agent/route": "app/api/flow/model-agent/route.js",
|
|
34
37
|
"/api/flow/route": "app/api/flow/route.js",
|
|
35
|
-
"/api/browse/route": "app/api/browse/route.js",
|
|
36
38
|
"/api/init/route": "app/api/init/route.js",
|
|
37
39
|
"/api/local-models/capability/route": "app/api/local-models/capability/route.js",
|
|
38
40
|
"/api/local-models/pull/route": "app/api/local-models/pull/route.js",
|
|
39
41
|
"/api/local-models/suggest/route": "app/api/local-models/suggest/route.js",
|
|
40
42
|
"/api/mcp-registry/route": "app/api/mcp-registry/route.js",
|
|
41
43
|
"/api/mcp/app-consent/route": "app/api/mcp/app-consent/route.js",
|
|
42
|
-
"/api/mcp/app-sandbox/route": "app/api/mcp/app-sandbox/route.js",
|
|
43
|
-
"/api/mcp/assistant/route": "app/api/mcp/assistant/route.js",
|
|
44
44
|
"/api/mcp/cancel/route": "app/api/mcp/cancel/route.js",
|
|
45
|
+
"/api/mcp/assistant/route": "app/api/mcp/assistant/route.js",
|
|
45
46
|
"/api/mcp/flujo/authoring/route": "app/api/mcp/flujo/authoring/route.js",
|
|
46
47
|
"/api/mcp/flujo/automation/route": "app/api/mcp/flujo/automation/route.js",
|
|
47
48
|
"/api/mcp/flujo/flows/route": "app/api/mcp/flujo/flows/route.js",
|
|
48
|
-
"/api/mcp/
|
|
49
|
-
"/api/mcp/flujo/resources/route": "app/api/mcp/flujo/resources/route.js",
|
|
49
|
+
"/api/mcp/app-sandbox/route": "app/api/mcp/app-sandbox/route.js",
|
|
50
50
|
"/api/mcp/flujo/servers/route": "app/api/mcp/flujo/servers/route.js",
|
|
51
|
-
"/api/
|
|
51
|
+
"/api/mcp/flujo/resources/route": "app/api/mcp/flujo/resources/route.js",
|
|
52
52
|
"/api/mcp/flujo/state/route": "app/api/mcp/flujo/state/route.js",
|
|
53
|
+
"/api/mcp/flujo/resources/read/route": "app/api/mcp/flujo/resources/read/route.js",
|
|
53
54
|
"/api/mcp/oauth-capability/route": "app/api/mcp/oauth-capability/route.js",
|
|
54
55
|
"/api/mcp/servers/[name]/prompts/get/route": "app/api/mcp/servers/[name]/prompts/get/route.js",
|
|
55
56
|
"/api/mcp/servers/[name]/prompts/route": "app/api/mcp/servers/[name]/prompts/route.js",
|
|
56
57
|
"/api/mcp/servers/[name]/resources/read/route": "app/api/mcp/servers/[name]/resources/read/route.js",
|
|
57
58
|
"/api/mcp/servers/[name]/resources/route": "app/api/mcp/servers/[name]/resources/route.js",
|
|
58
|
-
"/api/mcp/flujo/skills/route": "app/api/mcp/flujo/skills/route.js",
|
|
59
59
|
"/api/mcp/servers/[name]/route": "app/api/mcp/servers/[name]/route.js",
|
|
60
60
|
"/api/mcp/servers/[name]/skills/approve/route": "app/api/mcp/servers/[name]/skills/approve/route.js",
|
|
61
61
|
"/api/mcp/servers/[name]/skills/get/route": "app/api/mcp/servers/[name]/skills/get/route.js",
|
|
@@ -63,72 +63,72 @@
|
|
|
63
63
|
"/api/mcp/servers/[name]/skills/route": "app/api/mcp/servers/[name]/skills/route.js",
|
|
64
64
|
"/api/mcp/servers/[name]/status/route": "app/api/mcp/servers/[name]/status/route.js",
|
|
65
65
|
"/api/mcp/servers/[name]/stdio-oauth/confirm/route": "app/api/mcp/servers/[name]/stdio-oauth/confirm/route.js",
|
|
66
|
-
"/api/mcp/
|
|
67
|
-
"/api/mcp/servers/[name]/tools/[toolName]/route": "app/api/mcp/servers/[name]/tools/[toolName]/route.js",
|
|
66
|
+
"/api/mcp/flujo/skills/route": "app/api/mcp/flujo/skills/route.js",
|
|
68
67
|
"/api/mcp/servers/[name]/tools/route": "app/api/mcp/servers/[name]/tools/route.js",
|
|
68
|
+
"/api/mcp/servers/[name]/tools/[toolName]/route": "app/api/mcp/servers/[name]/tools/[toolName]/route.js",
|
|
69
|
+
"/api/mcp/servers/[name]/stdio-oauth/start/route": "app/api/mcp/servers/[name]/stdio-oauth/start/route.js",
|
|
69
70
|
"/api/mcp/test-connection/route": "app/api/mcp/test-connection/route.js",
|
|
70
|
-
"/api/mcp/servers/route": "app/api/mcp/servers/route.js",
|
|
71
71
|
"/api/mcp/test-connection/stream/route": "app/api/mcp/test-connection/stream/route.js",
|
|
72
|
+
"/api/mcp/servers/route": "app/api/mcp/servers/route.js",
|
|
72
73
|
"/api/model/provider/route": "app/api/model/provider/route.js",
|
|
73
|
-
"/api/backup/route": "app/api/backup/route.js",
|
|
74
74
|
"/api/model/test/route": "app/api/model/test/route.js",
|
|
75
|
+
"/api/model/route": "app/api/model/route.js",
|
|
75
76
|
"/api/oauth/callback/route": "app/api/oauth/callback/route.js",
|
|
77
|
+
"/api/model/[id]/route": "app/api/model/[id]/route.js",
|
|
76
78
|
"/api/oauth/initiate/route": "app/api/oauth/initiate/route.js",
|
|
77
|
-
"/api/oauth/reset/route": "app/api/oauth/reset/route.js",
|
|
78
79
|
"/api/packages/derive-secrets/route": "app/api/packages/derive-secrets/route.js",
|
|
79
|
-
"/api/
|
|
80
|
-
"/api/packages/install/status/route": "app/api/packages/install/status/route.js",
|
|
80
|
+
"/api/oauth/reset/route": "app/api/oauth/reset/route.js",
|
|
81
81
|
"/api/packages/installed/route": "app/api/packages/installed/route.js",
|
|
82
|
+
"/api/packages/install/status/route": "app/api/packages/install/status/route.js",
|
|
82
83
|
"/api/packages/resolve/route": "app/api/packages/resolve/route.js",
|
|
83
84
|
"/api/packages/scan-targets/route": "app/api/packages/scan-targets/route.js",
|
|
84
85
|
"/api/packages/search/route": "app/api/packages/search/route.js",
|
|
85
86
|
"/api/packages/uninstall/route": "app/api/packages/uninstall/route.js",
|
|
86
|
-
"/api/
|
|
87
|
+
"/api/packages/install/route": "app/api/packages/install/route.js",
|
|
87
88
|
"/api/planned-executions/[id]/run/route": "app/api/planned-executions/[id]/run/route.js",
|
|
89
|
+
"/api/git/route": "app/api/git/route.js",
|
|
88
90
|
"/api/planned-executions/[id]/runs/route": "app/api/planned-executions/[id]/runs/route.js",
|
|
91
|
+
"/api/planned-executions/[id]/route": "app/api/planned-executions/[id]/route.js",
|
|
89
92
|
"/api/planned-executions/preview-schedule/route": "app/api/planned-executions/preview-schedule/route.js",
|
|
90
|
-
"/api/planned-executions/route": "app/api/planned-executions/route.js",
|
|
91
|
-
"/api/reference-search/files/route": "app/api/reference-search/files/route.js",
|
|
92
93
|
"/api/registry/auth/resend/route": "app/api/registry/auth/resend/route.js",
|
|
93
94
|
"/api/registry/auth/reset/route": "app/api/registry/auth/reset/route.js",
|
|
94
|
-
"/api/
|
|
95
|
+
"/api/planned-executions/route": "app/api/planned-executions/route.js",
|
|
96
|
+
"/api/reference-search/files/route": "app/api/reference-search/files/route.js",
|
|
95
97
|
"/api/registry/feedback/route": "app/api/registry/feedback/route.js",
|
|
98
|
+
"/api/registry/auth/route": "app/api/registry/auth/route.js",
|
|
96
99
|
"/api/registry/oauth/callback/route": "app/api/registry/oauth/callback/route.js",
|
|
97
100
|
"/api/registry/oauth/initiate/route": "app/api/registry/oauth/initiate/route.js",
|
|
98
|
-
"/api/registry/packages/route": "app/api/registry/packages/route.js",
|
|
99
101
|
"/api/registry/publish/route": "app/api/registry/publish/route.js",
|
|
102
|
+
"/api/registry/packages/route": "app/api/registry/packages/route.js",
|
|
100
103
|
"/api/registry/settings/route": "app/api/registry/settings/route.js",
|
|
101
|
-
"/api/bugs/enhance/route": "app/api/bugs/enhance/route.js",
|
|
102
|
-
"/api/restore/route": "app/api/restore/route.js",
|
|
103
|
-
"/api/runtime-environment/route": "app/api/runtime-environment/route.js",
|
|
104
|
-
"/api/setup/ai-cli/route": "app/api/setup/ai-cli/route.js",
|
|
105
104
|
"/api/snapshot/abort/route": "app/api/snapshot/abort/route.js",
|
|
105
|
+
"/api/runtime-environment/route": "app/api/runtime-environment/route.js",
|
|
106
106
|
"/api/snapshot/begin/route": "app/api/snapshot/begin/route.js",
|
|
107
|
+
"/api/setup/ai-cli/route": "app/api/setup/ai-cli/route.js",
|
|
108
|
+
"/api/restore/route": "app/api/restore/route.js",
|
|
107
109
|
"/api/snapshot/download/route": "app/api/snapshot/download/route.js",
|
|
108
110
|
"/api/snapshot/finalize/route": "app/api/snapshot/finalize/route.js",
|
|
109
111
|
"/api/snapshot/info/route": "app/api/snapshot/info/route.js",
|
|
110
112
|
"/api/snapshot/status/route": "app/api/snapshot/status/route.js",
|
|
111
|
-
"/api/snapshots/open-folder/route": "app/api/snapshots/open-folder/route.js",
|
|
112
113
|
"/api/snapshots/cleanup/route": "app/api/snapshots/cleanup/route.js",
|
|
113
|
-
"/api/
|
|
114
|
+
"/api/snapshots/open-folder/route": "app/api/snapshots/open-folder/route.js",
|
|
114
115
|
"/api/snapshots/route": "app/api/snapshots/route.js",
|
|
116
|
+
"/api/statistics/route": "app/api/statistics/route.js",
|
|
117
|
+
"/api/storage/route": "app/api/storage/route.js",
|
|
115
118
|
"/api/telemetry/daily-active/route": "app/api/telemetry/daily-active/route.js",
|
|
116
119
|
"/api/tickets/[id]/route": "app/api/tickets/[id]/route.js",
|
|
117
|
-
"/api/storage/route": "app/api/storage/route.js",
|
|
118
120
|
"/api/tickets/route": "app/api/tickets/route.js",
|
|
119
121
|
"/api/update/route": "app/api/update/route.js",
|
|
120
122
|
"/api/webhooks/[id]/route": "app/api/webhooks/[id]/route.js",
|
|
121
|
-
"/mcp-proxy/[server]/route": "app/mcp-proxy/[server]/route.js",
|
|
122
123
|
"/mcp-flows/route": "app/mcp-flows/route.js",
|
|
124
|
+
"/mcp-proxy/[server]/route": "app/mcp-proxy/[server]/route.js",
|
|
123
125
|
"/v1/chat/completions/route": "app/v1/chat/completions/route.js",
|
|
124
|
-
"/v1/chat/conversation-chains/route": "app/v1/chat/conversation-chains/route.js",
|
|
125
126
|
"/v1/chat/conversations/[conversationId]/breakpoints/route": "app/v1/chat/conversations/[conversationId]/breakpoints/route.js",
|
|
127
|
+
"/v1/chat/conversation-chains/route": "app/v1/chat/conversation-chains/route.js",
|
|
126
128
|
"/v1/chat/conversations/[conversationId]/cancel/route": "app/v1/chat/conversations/[conversationId]/cancel/route.js",
|
|
127
129
|
"/v1/chat/conversations/[conversationId]/debug/attach/route": "app/v1/chat/conversations/[conversationId]/debug/attach/route.js",
|
|
128
130
|
"/v1/chat/conversations/[conversationId]/debug/continue/route": "app/v1/chat/conversations/[conversationId]/debug/continue/route.js",
|
|
129
131
|
"/v1/chat/conversations/[conversationId]/debug/state/route": "app/v1/chat/conversations/[conversationId]/debug/state/route.js",
|
|
130
|
-
"/api/model/route": "app/api/model/route.js",
|
|
131
|
-
"/api/model/[id]/route": "app/api/model/[id]/route.js",
|
|
132
132
|
"/v1/chat/conversations/[conversationId]/debug/step/route": "app/v1/chat/conversations/[conversationId]/debug/step/route.js",
|
|
133
133
|
"/v1/chat/conversations/[conversationId]/edit-state/route": "app/v1/chat/conversations/[conversationId]/edit-state/route.js",
|
|
134
134
|
"/v1/chat/conversations/[conversationId]/events/route": "app/v1/chat/conversations/[conversationId]/events/route.js",
|
|
@@ -141,8 +141,8 @@
|
|
|
141
141
|
"/v1/chat/conversations/[conversationId]/resources/route": "app/v1/chat/conversations/[conversationId]/resources/route.js",
|
|
142
142
|
"/v1/chat/conversations/[conversationId]/respond/route": "app/v1/chat/conversations/[conversationId]/respond/route.js",
|
|
143
143
|
"/v1/chat/conversations/[conversationId]/revert/route": "app/v1/chat/conversations/[conversationId]/revert/route.js",
|
|
144
|
-
"/v1/chat/conversations/[conversationId]/wire-preview/route": "app/v1/chat/conversations/[conversationId]/wire-preview/route.js",
|
|
145
144
|
"/v1/chat/conversations/[conversationId]/route": "app/v1/chat/conversations/[conversationId]/route.js",
|
|
145
|
+
"/v1/chat/conversations/[conversationId]/wire-preview/route": "app/v1/chat/conversations/[conversationId]/wire-preview/route.js",
|
|
146
146
|
"/v1/chat/events/route": "app/v1/chat/events/route.js",
|
|
147
147
|
"/v1/flows/[flowRef]/readiness/route": "app/v1/flows/[flowRef]/readiness/route.js",
|
|
148
148
|
"/v1/meetings/[meetingId]/cancel/route": "app/v1/meetings/[meetingId]/cancel/route.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=1475,exports.ids=[1475],exports.modules={21475:(a,b,c)=>{c.r(b),c.d(b,{restoreConfiguredWorkerSnapshot:()=>G,unlockWorkerSnapshot:()=>E,verifyWorkerCodexAuth:()=>C});var d=c(73024),e=c(77598),f=c(76760),g=c.n(f),h=c(76364),i=c.n(h),j=c(39006),k=c(34887),l=c(58601),m=c(7986),n=c(19031),o=c(72178),p=c(20775),q=c(83843),r=c(80940);let s="snapshot-manifest.json",t=".flujo-worker-snapshot.json",u=/^[a-f0-9]{64}$/;function v(a,b){let c=Number(process.env[a]);return Number.isSafeInteger(c)&&c>0?c:b}function w(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function x(a,b){try{return JSON.parse(a)}catch{throw Error(b)}}function y(a,b=!1){let c=b?a.replace(/\/$/,""):a,d=c.split("/");if(!c||c.includes("\\")||c.includes("\0")||d.some(a=>!a||"."===a||".."===a||a.includes(":")||/[. ]$/.test(a)||/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(a)))throw Error("Snapshot contains an unsafe archive path.");if(c!==s&&".workspace.json"!==c&&!m.WORKSPACE_SUBTREES.includes(d[0]))throw Error("Snapshot contains a file outside the supported workspace roots.");if(b&&(c===s||".workspace.json"===c))throw Error("Snapshot metadata must be a file.");if(!b&&m.WORKSPACE_SUBTREES.includes(c))throw Error("Snapshot workspace roots must be directories.");return c}async function z(a,b=!1){b&&await d.promises.mkdir(a,{recursive:!0,mode:448});let c=await d.promises.lstat(a);if(!c.isDirectory()||c.isSymbolicLink())throw Error("Worker restore destination must be a plain directory.")}async function A(a){try{return await d.promises.lstat(a)}catch(a){if("ENOENT"===a.code)return null;throw a}}async function B(a){await z(a);let b=await d.promises.readdir(a,{withFileTypes:!0});for(let c of b)if(!m.WORKSPACE_SUBTREES.includes(c.name)||!c.isDirectory()||c.isSymbolicLink()||0!==(await d.promises.readdir(g().join(a,c.name))).length)throw Error("Worker snapshot restore refuses to overwrite an existing workspace.");for(let c of b)await d.promises.rmdir(g().join(a,c.name));await d.promises.rmdir(a)}async function C(a,b=(0,m.getWorkspaceDir)(a.workspace)){if("chatgpt"!==a.codexAuth)return;let c=g().join(b,"db","codex-runtime");for(let a of["auth.json","flujo-auth-source.json"]){let b=await d.promises.lstat(g().join(c,a));if(!b.isFile()||b.isSymbolicLink()||b.nlink>1||b.size>1048576)throw Error("Worker Codex authentication is not a valid workspace credential file.")}let e=await d.promises.readFile(g().join(c,"auth.json")),f=x(await d.promises.readFile(g().join(c,"flujo-auth-source.json"),"utf8"),"Worker Codex authentication marker is invalid.");if(!(0,n.eK)(e)||!w(f)||1!==f.version||"workspace"!==f.source)throw Error("Worker Codex ChatGPT authentication is missing or invalid.")}async function D(a,b=(0,m.getWorkspaceDir)(a.workspace)){if("user"!==a.encryption)return null;let c=g().join(b,"db","worker-bootstrap-secrets.json"),e=await d.promises.lstat(c);if(!e.isFile()||e.isSymbolicLink()||e.nlink>1||e.size>4096)throw Error("Worker workspace encryption requires valid bootstrap credentials.");if("win32"!==process.platform&&(63&e.mode)!=0)throw Error("Worker workspace encryption credentials must be owner-only.");let f=x(await d.promises.readFile(c,"utf8"),"Worker workspace encryption bootstrap credentials are invalid.");if(!w(f)||1!==f.version||"string"!=typeof f.workspaceDek||!/^[a-f0-9]{16}$/.test(f.workspaceDek))throw Error("Worker workspace encryption bootstrap credentials are invalid.");return f.workspaceDek}async function E(a){if((0,m.getCurrentWorkspace)()!==a.workspace)throw Error("Worker encryption unlock workspace mismatch.");let b=await D(a);b&&(0,l.YM)(b)}async function F(a,b){let c;(0,r.Vv)({state:"restoring",archiveSha256:b,error:void 0});let f=v("FLUJO_SNAPSHOT_MAX_FILE_BYTES",0x10000000),h=v("FLUJO_SNAPSHOT_MAX_BYTES",0x40000000),l=!!process.env.FLUJO_WORKER_SNAPSHOT_KEY,n=h+8388608,E=l?Math.ceil(4*n/3)+4096:n,F=await d.promises.lstat(a);if(!F.isFile()||F.isSymbolicLink()||F.size>E)throw Error("Worker snapshot must be an ordinary ZIP file within the size limit.");let G=await d.promises.open(a,d.constants.O_RDONLY|(d.constants.O_NOFOLLOW||0));try{let a=await G.stat();if(!a.isFile()||a.dev!==F.dev||a.ino!==F.ino||a.size!==F.size)throw Error("Worker snapshot changed while it was opened.");c=await G.readFile()}finally{await G.close()}if(c.length>E)throw Error("Worker snapshot exceeds the size limit.");if(l&&(c=function(a,b){try{let c=JSON.parse(a.toString("utf8"));if(!w(c)||"flujo-workspace-encrypted"!==c.format||1!==c.version)throw Error();let d=a=>{if("string"!=typeof a||!/^[A-Za-z0-9+/]*={0,2}$/.test(a))throw Error();let b=Buffer.from(a,"base64");if(b.toString("base64")!==a)throw Error();return b},f=d(process.env.FLUJO_WORKER_SNAPSHOT_KEY),g=d(c.iv),h=d(c.tag),i=d(c.data);if(32!==f.length||12!==g.length||16!==h.length||i.length>b)throw Error();let j=(0,e.createDecipheriv)("aes-256-gcm",f,g);return j.setAuthTag(h),Buffer.concat([j.update(i),j.final()])}catch{throw Error("Worker snapshot decryption failed. Check the encrypted archive and its key.")}}(c,n)),(0,e.createHash)("sha256").update(c).digest("hex")!==b)throw Error("Worker snapshot SHA-256 mismatch.");let H=function(a,b,c){let d=-1;for(let b=a.length-22;b>=Math.max(0,a.length-65557);b--)if(0x6054b50===a.readUInt32LE(b)&&b+22+a.readUInt16LE(b+20)===a.length){d=b;break}if(d<0)throw Error("Invalid snapshot ZIP directory.");let e=a.readUInt16LE(d+10),f=a.readUInt32LE(d+12),g=a.readUInt32LE(d+16);if(0!==a.readUInt16LE(d+4)||0!==a.readUInt16LE(d+6)||a.readUInt16LE(d+8)!==e||65535===e||e>1e5||g+f!==d)throw Error("Unsupported snapshot ZIP structure.");let h=new Map,i=[],j=0;for(let f=0;f<e;f++){if(g+46>d||0x2014b50!==a.readUInt32LE(g))throw Error("Invalid snapshot ZIP member.");let e=a.readUInt16LE(g+8),f=a.readUInt16LE(g+10),k=a.readUInt32LE(g+24),l=a.readUInt16LE(g+28),m=a.readUInt16LE(g+30),n=a.readUInt16LE(g+32),o=g+46+l+m+n;if((1&e)!=0||![0,8].includes(f)||o>d||0xffffffff===a.readUInt32LE(g+20)||0xffffffff===k)throw Error("Unsupported snapshot ZIP member encoding.");let p=new TextDecoder("utf-8",{fatal:!0}).decode(a.subarray(g+46,g+46+l)),q=p.endsWith("/"),r=y(p,q).normalize("NFC").toLowerCase();if(h.has(r))throw Error("Snapshot contains duplicate or case-aliased archive paths.");h.set(r,q);let t=a.readUInt32LE(g+38)>>>16,u=61440&t;if(0!==u&&u!==(q?16384:32768))throw Error("Snapshot links and special files are unsupported.");if(k>(p===s?8388608:b)||q&&0!==k)throw Error("Snapshot file exceeds the restore size limit.");if((j+=k)>c+8388608)throw Error("Snapshot exceeds the restore size limit.");i.push({name:p,directory:q,size:k,mode:t}),g=o}if(g!==d)throw Error("Invalid snapshot ZIP directory length.");for(let{name:a,directory:b}of i){let c=y(a,b).split("/");for(let a=1;a<c.length;a++)if(!1===h.get(c.slice(0,a).join("/").normalize("NFC").toLowerCase()))throw Error("Snapshot contains a file/directory path conflict.")}return i}(c,f,h),I=await i().loadAsync(c),J=I.file(s);if(!J)throw Error("Worker snapshot manifest is missing.");let K=function(a){if(!w(a)||a.formatVersion!==q.nt||a.layoutVersion!==p.q||!1!==a.externalRootsIncluded||!w(a.source)||a.source.version!==j.rE||"string"!=typeof a.source.platform||!w(a.runtime)||!w(a.runtime.mcpTransfer)||1!==a.runtime.mcpTransfer.formatVersion||"string"!=typeof a.runtime.mcpTransfer.sourceWorkspaceRoot||!Array.isArray(a.runtime.mcpTransfer.servers)||!["chatgpt","none"].includes(a.runtime.codexAuth)||!["default","user"].includes(a.runtime.encryption)||!Array.isArray(a.files)||!Array.isArray(a.subtrees)||a.subtrees.length!==m.WORKSPACE_SUBTREES.length||m.WORKSPACE_SUBTREES.some(b=>!a.subtrees.includes(b)))throw Error("Snapshot format, FLUJO version, layout, or portable runtime metadata is incompatible.");return(0,m.assertValidWorkspaceName)(a.workspace),a}(x(await J.async("string"),"Worker snapshot manifest is invalid JSON.")),L={workspace:K.workspace,archiveSha256:b,mcpTransfer:K.runtime.mcpTransfer,codexAuth:K.runtime.codexAuth,encryption:K.runtime.encryption};(0,r.Vv)({workspace:L.workspace});let M=new Map,N=0;for(let a of K.files){if(!w(a)||"string"!=typeof a.path||a.path===s||!Number.isSafeInteger(a.size)||a.size<0||a.size>f||"string"!=typeof a.sha256||!u.test(a.sha256))throw Error("Invalid snapshot manifest member.");if(y(a.path),M.has(a.path))throw Error("Snapshot manifest has duplicate members.");if((N+=a.size)>h)throw Error("Snapshot manifest exceeds the restore size limit.");M.set(a.path,a)}let O=[];for(let a of H){if(a.directory||a.name===s)continue;let b=M.get(a.name);if(!b||b.size!==a.size)throw Error("Snapshot archive does not match its manifest.");let c=await I.file(a.name).async("nodebuffer");if(c.length!==b.size||(0,e.createHash)("sha256").update(c).digest("hex")!==b.sha256)throw Error("Snapshot member integrity check failed.");M.delete(a.name),O.push({name:a.name,content:c,mode:73&a.mode?448:384})}if(M.size)throw Error("Snapshot archive is missing a manifest member.");await z((0,k.ok)(),!0),await z((0,m.getWorkspacesDir)(),!0);let P=(0,m.getWorkspaceDir)(L.workspace);if((await d.promises.readdir((0,m.getWorkspacesDir)())).filter(a=>a.toLowerCase()===L.workspace.toLowerCase()).some(a=>a!==L.workspace))throw Error("Worker workspace has a case-alias conflict.");let Q=await A(P);if(Q){await z(P);let a=g().join(P,t);if(await A(a)){let c=await d.promises.lstat(a);if(!c.isFile()||c.isSymbolicLink()||c.nlink>1||c.size>4096)throw Error("Invalid worker restore marker.");let e=x(await d.promises.readFile(a,"utf8"),"Worker restore marker is invalid.");if(!w(e)||1!==e.formatVersion||e.archiveSha256!==b||e.workspace!==L.workspace)throw Error("Worker snapshot does not match the existing workspace.");return await C(L),await D(L),L}}let R=await d.promises.mkdtemp(g().join((0,m.getWorkspacesDir)(),".worker-restore-")),S=!1;try{for(let a of(await d.promises.chmod(R,448),m.WORKSPACE_SUBTREES))await d.promises.mkdir(g().join(R,a),{mode:448});for(let a of H.filter(a=>a.directory))await d.promises.mkdir(g().join(R,...y(a.name,!0).split("/")),{recursive:!0,mode:448});for(let a of O){let b=".workspace.json"===a.name?Buffer.from('{"roots":[]}\n'):a.content;await (0,o.sA)(R,g().join(R,...a.name.split("/")),b,{mode:a.mode})}if(await C(L,R),await D(L,R),await (0,o.sA)(R,g().join(R,t),Buffer.from(JSON.stringify({formatVersion:1,workspace:L.workspace,archiveSha256:b}))),Q)await B(P);else if(await A(P))throw Error("Worker restore destination was created concurrently.");return await d.promises.rename(R,P),S=!0,await C(L),L}finally{S||await d.promises.rm(R,{recursive:!0,force:!0})}}function G(){if(!(0,r.ye)())return Promise.resolve(null);let a=process.env.FLUJO_WORKER_SNAPSHOT?.trim(),b=process.env.FLUJO_WORKER_SNAPSHOT_SHA256?.trim().toLowerCase();if(!a||!b||!u.test(b)||!g().isAbsolute(a)){let a="Worker mode requires an absolute FLUJO_WORKER_SNAPSHOT path and FLUJO_WORKER_SNAPSHOT_SHA256.";return(0,r.Vv)({state:"error",error:a}),Promise.reject(Error(a))}let c=(0,e.createHash)("sha256").update(process.env.FLUJO_WORKER_SNAPSHOT_KEY??"").digest("hex"),d=`${(0,m.getWorkspacesDir)()}\0${a}\0${b}\0${c}`;if(global.__flujo_worker_snapshot_restore?.key===d)return global.__flujo_worker_snapshot_restore.promise;let f=F(a,b).catch(a=>{throw(0,r.Vv)({state:"error",error:a instanceof Error?a.message:"Worker restore failed."}),global.__flujo_worker_snapshot_restore?.promise===f&&(global.__flujo_worker_snapshot_restore=void 0),a});return global.__flujo_worker_snapshot_restore={key:d,promise:f},f}},39006:a=>{a.exports={rE:"3.45.1"}},72178:(a,b,c)=>{c.d(b,{N:()=>p,lA:()=>r,sA:()=>q});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598);let h=new Set(["node_modules",".git"]);function i(a,b,c=!1){let d=f().relative(f().resolve(a),f().resolve(b));return""===d?c:!d.startsWith("..")&&!f().isAbsolute(d)}async function j(a){try{return await d.promises.lstat(a)}catch(a){if("ENOENT"===a.code)return null;throw a}}function k(a,b){if(!a||a.isSymbolicLink()||!a.isDirectory())throw Error(`${b} must be a real directory, not a symbolic link or junction.`)}function l(a,b){return a.dev===b.dev&&a.ino===b.ino&&a.size===b.size&&a.mtimeMs===b.mtimeMs}async function m(a,b,c){c?.throwIfAborted();let d=Buffer.alloc(b),e=0;for(;e<b;){c?.throwIfAborted();let{bytesRead:f}=await a.read(d,e,Math.min(b-e,1048576),e);if(0===f)break;e+=f}return e===b?d:d.subarray(0,e)}function n(a,b){let c=function(a){if(!a||a.includes("\\")||a.includes("\0")||f().posix.isAbsolute(a)||f().win32.isAbsolute(a)||/^[A-Za-z]:/.test(a))return null;let b=a.split("/");return b.some(a=>!a||"."===a||".."===a||a.includes(":"))?null:b}(b);if(!c)return null;let d=f().resolve(a,...c);return i(a,d)?d:null}async function o(a,b,c){let e=f().resolve(a),g=f().resolve(b);if(k(await j(e),"Workspace restore boundary"),!i(e,g,!0))throw Error(`Restore directory escapes workspace boundary: ${g}`);let h=f().relative(e,g),l=e;for(let a of h?h.split(f().sep):[]){l=f().join(l,a);let b=await j(l);if(!b&&c){try{await d.promises.mkdir(l)}catch(a){if("EEXIST"!==a.code)throw a}b=await j(l)}k(b,`Restore path component ${l}`)}if(!i(await d.promises.realpath(e),await d.promises.realpath(g),!0))throw Error(`Restore directory resolves outside workspace boundary: ${g}`)}async function p(a,b,c,e,g=()=>void 0,n={}){let o=n.maxFileBytes??0xa00000,q=n.skippedDirectories??h,r=f().resolve(e),s=f().resolve(b);if(k(await j(r),"Workspace backup boundary"),k(await j(s),"MCP backup root"),!i(r,s))throw Error("MCP backup root escapes its workspace.");let t=await d.promises.realpath(r),u=await d.promises.realpath(s);if(!i(t,u))throw Error("MCP backup root resolves outside its workspace.");let v=async(b,c)=>{n.signal?.throwIfAborted();let e=await j(b);if(!e||e.isSymbolicLink()||!e.isDirectory())return void g(c,"directory is a symbolic link, junction, or no longer exists");if(!i(u,await d.promises.realpath(b),!0))return void g(c,"directory resolves outside MCP backup root");for(let e of(await d.promises.readdir(b,{withFileTypes:!0}))){let h;n.signal?.throwIfAborted();let k=f().join(b,e.name),p=f().posix.join(c,e.name);if(n.skipPath?.(p))continue;try{h=await j(k)}catch(a){g(p,`lstat failed: ${a instanceof Error?a.message:String(a)}`);continue}if(!h||h.isSymbolicLink()){g(p,"symbolic links and junctions are not backed up");continue}if(h.isDirectory()){let b;if(q.has(e.name))continue;try{b=await d.promises.realpath(k)}catch{g(p,"directory disappeared while being inspected");continue}if(!i(u,b)){g(p,"directory resolves outside MCP backup root");continue}a.folder(p),await v(k,p);continue}if(!h.isFile()){g(p,"non-regular filesystem entry");continue}if(h.nlink>1&&!n.allowHardLinks){g(p,"hard-linked files are not backed up");continue}if(h.size>o){g(p,"file exceeds backup size limit");continue}let r=null;try{let b="number"==typeof d.constants.O_NOFOLLOW?d.constants.O_NOFOLLOW:0;r=await d.promises.open(k,d.constants.O_RDONLY|b);let c=await r.stat(),e=await d.promises.realpath(k);if(!c.isFile()||c.nlink>1&&!n.allowHardLinks||c.size>o||!l(h,c)||!i(u,e)){g(p,"file changed or escaped while being opened");continue}let f=await m(r,c.size,n.signal),j=await r.stat();if(f.byteLength!==c.size||!l(c,j)){g(p,"file changed while being read");continue}n.signal?.throwIfAborted(),n.onFile?.(p,f,j),a.file(p,f,n.preserveMode?{unixPermissions:33279&j.mode}:void 0)}catch(a){n.signal?.throwIfAborted(),g(p,`file could not be read safely: ${a instanceof Error?a.message:String(a)}`)}finally{await r?.close().catch(()=>void 0)}}};await v(s,c)}async function q(a,b,c,e={}){let h=f().dirname(b);await o(a,h,!0);let i=await j(b);if(i?.isSymbolicLink())throw Error(`Refusing to replace symbolic link or junction: ${b}`);if(i&&!i.isFile())throw Error(`Refusing to replace non-file restore target: ${b}`);let k=f().join(h,`.flujo-restore-${(0,g.randomUUID)()}.tmp`),l=!1;try{let f=384|(e.mode??0)&64,g=await d.promises.open(k,d.constants.O_WRONLY|d.constants.O_CREAT|d.constants.O_EXCL,f);l=!0;try{await g.writeFile(c),await g.sync()}finally{await g.close()}await o(a,h,!1);let i=await j(b);if(i?.isSymbolicLink()||i&&!i.isFile())throw Error(`Restore target became unsafe: ${b}`);await d.promises.rename(k,b),l=!1}finally{l&&await d.promises.unlink(k).catch(()=>void 0)}}async function r(a,b,c,d,e=()=>void 0,g={}){let h=f().resolve(c);await o(d,h,!0);let i=`${b}/`,j=Object.keys(a.files).filter(a=>a.startsWith(i)&&a!==i).map(b=>{let c=a.files[b],d=b.slice(i.length);return{entry:c,entryPath:b,relativePath:c.dir?d.replace(/\/+$/,""):d}});for(let a of j.filter(a=>a.entry.dir)){let b=n(h,a.relativePath);if(!b){e(a.entryPath,"unsafe archive directory path");continue}try{await o(d,b,!0)}catch(b){e(a.entryPath,b instanceof Error?b.message:String(b))}}for(let a of j.filter(a=>!a.entry.dir)){let b=n(h,a.relativePath);if(!b){e(a.entryPath,"unsafe archive file path");continue}try{let c=await a.entry.async("nodebuffer");if(c.length>(g.maxFileBytes??0xa00000)){e(a.entryPath,"file exceeds restore size limit");continue}await q(d,b,c,{mode:g.preserveMode?Number(a.entry.unixPermissions):void 0})}catch(b){e(a.entryPath,b instanceof Error?b.message:String(b))}}}},83843:(a,b,c)=>{c.d(b,{d1:()=>g,nt:()=>f});var d=c(39006),e=c(20775);let f=2;function g(){let a=process.env.FLUJO_BUILD_REVISION;return{applicationVersion:d.rE,snapshotFormatVersion:f,layoutVersion:e.q,workerProtocolVersion:1,.../^[a-f0-9]{40}$/.test(a??"")?{revision:a}:{}}}}};
|
|
1
|
+
"use strict";exports.id=1475,exports.ids=[1475],exports.modules={21475:(a,b,c)=>{c.r(b),c.d(b,{restoreConfiguredWorkerSnapshot:()=>G,unlockWorkerSnapshot:()=>E,verifyWorkerCodexAuth:()=>C});var d=c(73024),e=c(77598),f=c(76760),g=c.n(f),h=c(76364),i=c.n(h),j=c(39006),k=c(34887),l=c(58601),m=c(7986),n=c(19031),o=c(72178),p=c(20775),q=c(83843),r=c(80940);let s="snapshot-manifest.json",t=".flujo-worker-snapshot.json",u=/^[a-f0-9]{64}$/;function v(a,b){let c=Number(process.env[a]);return Number.isSafeInteger(c)&&c>0?c:b}function w(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function x(a,b){try{return JSON.parse(a)}catch{throw Error(b)}}function y(a,b=!1){let c=b?a.replace(/\/$/,""):a,d=c.split("/");if(!c||c.includes("\\")||c.includes("\0")||d.some(a=>!a||"."===a||".."===a||a.includes(":")||/[. ]$/.test(a)||/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(a)))throw Error("Snapshot contains an unsafe archive path.");if(c!==s&&".workspace.json"!==c&&!m.WORKSPACE_SUBTREES.includes(d[0]))throw Error("Snapshot contains a file outside the supported workspace roots.");if(b&&(c===s||".workspace.json"===c))throw Error("Snapshot metadata must be a file.");if(!b&&m.WORKSPACE_SUBTREES.includes(c))throw Error("Snapshot workspace roots must be directories.");return c}async function z(a,b=!1){b&&await d.promises.mkdir(a,{recursive:!0,mode:448});let c=await d.promises.lstat(a);if(!c.isDirectory()||c.isSymbolicLink())throw Error("Worker restore destination must be a plain directory.")}async function A(a){try{return await d.promises.lstat(a)}catch(a){if("ENOENT"===a.code)return null;throw a}}async function B(a){await z(a);let b=await d.promises.readdir(a,{withFileTypes:!0});for(let c of b)if(!m.WORKSPACE_SUBTREES.includes(c.name)||!c.isDirectory()||c.isSymbolicLink()||0!==(await d.promises.readdir(g().join(a,c.name))).length)throw Error("Worker snapshot restore refuses to overwrite an existing workspace.");for(let c of b)await d.promises.rmdir(g().join(a,c.name));await d.promises.rmdir(a)}async function C(a,b=(0,m.getWorkspaceDir)(a.workspace)){if("chatgpt"!==a.codexAuth)return;let c=g().join(b,"db","codex-runtime");for(let a of["auth.json","flujo-auth-source.json"]){let b=await d.promises.lstat(g().join(c,a));if(!b.isFile()||b.isSymbolicLink()||b.nlink>1||b.size>1048576)throw Error("Worker Codex authentication is not a valid workspace credential file.")}let e=await d.promises.readFile(g().join(c,"auth.json")),f=x(await d.promises.readFile(g().join(c,"flujo-auth-source.json"),"utf8"),"Worker Codex authentication marker is invalid.");if(!(0,n.eK)(e)||!w(f)||1!==f.version||"workspace"!==f.source)throw Error("Worker Codex ChatGPT authentication is missing or invalid.")}async function D(a,b=(0,m.getWorkspaceDir)(a.workspace)){if("user"!==a.encryption)return null;let c=g().join(b,"db","worker-bootstrap-secrets.json"),e=await d.promises.lstat(c);if(!e.isFile()||e.isSymbolicLink()||e.nlink>1||e.size>4096)throw Error("Worker workspace encryption requires valid bootstrap credentials.");if("win32"!==process.platform&&(63&e.mode)!=0)throw Error("Worker workspace encryption credentials must be owner-only.");let f=x(await d.promises.readFile(c,"utf8"),"Worker workspace encryption bootstrap credentials are invalid.");if(!w(f)||1!==f.version||"string"!=typeof f.workspaceDek||!/^[a-f0-9]{16}$/.test(f.workspaceDek))throw Error("Worker workspace encryption bootstrap credentials are invalid.");return f.workspaceDek}async function E(a){if((0,m.getCurrentWorkspace)()!==a.workspace)throw Error("Worker encryption unlock workspace mismatch.");let b=await D(a);b&&(0,l.YM)(b)}async function F(a,b){let c;(0,r.Vv)({state:"restoring",archiveSha256:b,error:void 0});let f=v("FLUJO_SNAPSHOT_MAX_FILE_BYTES",0x10000000),h=v("FLUJO_SNAPSHOT_MAX_BYTES",0x40000000),l=!!process.env.FLUJO_WORKER_SNAPSHOT_KEY,n=h+8388608,E=l?Math.ceil(4*n/3)+4096:n,F=await d.promises.lstat(a);if(!F.isFile()||F.isSymbolicLink()||F.size>E)throw Error("Worker snapshot must be an ordinary ZIP file within the size limit.");let G=await d.promises.open(a,d.constants.O_RDONLY|(d.constants.O_NOFOLLOW||0));try{let a=await G.stat();if(!a.isFile()||a.dev!==F.dev||a.ino!==F.ino||a.size!==F.size)throw Error("Worker snapshot changed while it was opened.");c=await G.readFile()}finally{await G.close()}if(c.length>E)throw Error("Worker snapshot exceeds the size limit.");if(l&&(c=function(a,b){try{let c=JSON.parse(a.toString("utf8"));if(!w(c)||"flujo-workspace-encrypted"!==c.format||1!==c.version)throw Error();let d=a=>{if("string"!=typeof a||!/^[A-Za-z0-9+/]*={0,2}$/.test(a))throw Error();let b=Buffer.from(a,"base64");if(b.toString("base64")!==a)throw Error();return b},f=d(process.env.FLUJO_WORKER_SNAPSHOT_KEY),g=d(c.iv),h=d(c.tag),i=d(c.data);if(32!==f.length||12!==g.length||16!==h.length||i.length>b)throw Error();let j=(0,e.createDecipheriv)("aes-256-gcm",f,g);return j.setAuthTag(h),Buffer.concat([j.update(i),j.final()])}catch{throw Error("Worker snapshot decryption failed. Check the encrypted archive and its key.")}}(c,n)),(0,e.createHash)("sha256").update(c).digest("hex")!==b)throw Error("Worker snapshot SHA-256 mismatch.");let H=function(a,b,c){let d=-1;for(let b=a.length-22;b>=Math.max(0,a.length-65557);b--)if(0x6054b50===a.readUInt32LE(b)&&b+22+a.readUInt16LE(b+20)===a.length){d=b;break}if(d<0)throw Error("Invalid snapshot ZIP directory.");let e=a.readUInt16LE(d+10),f=a.readUInt32LE(d+12),g=a.readUInt32LE(d+16);if(0!==a.readUInt16LE(d+4)||0!==a.readUInt16LE(d+6)||a.readUInt16LE(d+8)!==e||65535===e||e>1e5||g+f!==d)throw Error("Unsupported snapshot ZIP structure.");let h=new Map,i=[],j=0;for(let f=0;f<e;f++){if(g+46>d||0x2014b50!==a.readUInt32LE(g))throw Error("Invalid snapshot ZIP member.");let e=a.readUInt16LE(g+8),f=a.readUInt16LE(g+10),k=a.readUInt32LE(g+24),l=a.readUInt16LE(g+28),m=a.readUInt16LE(g+30),n=a.readUInt16LE(g+32),o=g+46+l+m+n;if((1&e)!=0||![0,8].includes(f)||o>d||0xffffffff===a.readUInt32LE(g+20)||0xffffffff===k)throw Error("Unsupported snapshot ZIP member encoding.");let p=new TextDecoder("utf-8",{fatal:!0}).decode(a.subarray(g+46,g+46+l)),q=p.endsWith("/"),r=y(p,q).normalize("NFC").toLowerCase();if(h.has(r))throw Error("Snapshot contains duplicate or case-aliased archive paths.");h.set(r,q);let t=a.readUInt32LE(g+38)>>>16,u=61440&t;if(0!==u&&u!==(q?16384:32768))throw Error("Snapshot links and special files are unsupported.");if(k>(p===s?8388608:b)||q&&0!==k)throw Error("Snapshot file exceeds the restore size limit.");if((j+=k)>c+8388608)throw Error("Snapshot exceeds the restore size limit.");i.push({name:p,directory:q,size:k,mode:t}),g=o}if(g!==d)throw Error("Invalid snapshot ZIP directory length.");for(let{name:a,directory:b}of i){let c=y(a,b).split("/");for(let a=1;a<c.length;a++)if(!1===h.get(c.slice(0,a).join("/").normalize("NFC").toLowerCase()))throw Error("Snapshot contains a file/directory path conflict.")}return i}(c,f,h),I=await i().loadAsync(c),J=I.file(s);if(!J)throw Error("Worker snapshot manifest is missing.");let K=function(a){if(!w(a)||a.formatVersion!==q.nt||a.layoutVersion!==p.q||!1!==a.externalRootsIncluded||!w(a.source)||a.source.version!==j.rE||"string"!=typeof a.source.platform||!w(a.runtime)||!w(a.runtime.mcpTransfer)||1!==a.runtime.mcpTransfer.formatVersion||"string"!=typeof a.runtime.mcpTransfer.sourceWorkspaceRoot||!Array.isArray(a.runtime.mcpTransfer.servers)||!["chatgpt","none"].includes(a.runtime.codexAuth)||!["default","user"].includes(a.runtime.encryption)||!Array.isArray(a.files)||!Array.isArray(a.subtrees)||a.subtrees.length!==m.WORKSPACE_SUBTREES.length||m.WORKSPACE_SUBTREES.some(b=>!a.subtrees.includes(b)))throw Error("Snapshot format, FLUJO version, layout, or portable runtime metadata is incompatible.");return(0,m.assertValidWorkspaceName)(a.workspace),a}(x(await J.async("string"),"Worker snapshot manifest is invalid JSON.")),L={workspace:K.workspace,archiveSha256:b,mcpTransfer:K.runtime.mcpTransfer,codexAuth:K.runtime.codexAuth,encryption:K.runtime.encryption};(0,r.Vv)({workspace:L.workspace});let M=new Map,N=0;for(let a of K.files){if(!w(a)||"string"!=typeof a.path||a.path===s||!Number.isSafeInteger(a.size)||a.size<0||a.size>f||"string"!=typeof a.sha256||!u.test(a.sha256))throw Error("Invalid snapshot manifest member.");if(y(a.path),M.has(a.path))throw Error("Snapshot manifest has duplicate members.");if((N+=a.size)>h)throw Error("Snapshot manifest exceeds the restore size limit.");M.set(a.path,a)}let O=[];for(let a of H){if(a.directory||a.name===s)continue;let b=M.get(a.name);if(!b||b.size!==a.size)throw Error("Snapshot archive does not match its manifest.");let c=await I.file(a.name).async("nodebuffer");if(c.length!==b.size||(0,e.createHash)("sha256").update(c).digest("hex")!==b.sha256)throw Error("Snapshot member integrity check failed.");M.delete(a.name),O.push({name:a.name,content:c,mode:73&a.mode?448:384})}if(M.size)throw Error("Snapshot archive is missing a manifest member.");await z((0,k.ok)(),!0),await z((0,m.getWorkspacesDir)(),!0);let P=(0,m.getWorkspaceDir)(L.workspace);if((await d.promises.readdir((0,m.getWorkspacesDir)())).filter(a=>a.toLowerCase()===L.workspace.toLowerCase()).some(a=>a!==L.workspace))throw Error("Worker workspace has a case-alias conflict.");let Q=await A(P);if(Q){await z(P);let a=g().join(P,t);if(await A(a)){let c=await d.promises.lstat(a);if(!c.isFile()||c.isSymbolicLink()||c.nlink>1||c.size>4096)throw Error("Invalid worker restore marker.");let e=x(await d.promises.readFile(a,"utf8"),"Worker restore marker is invalid.");if(!w(e)||1!==e.formatVersion||e.archiveSha256!==b||e.workspace!==L.workspace)throw Error("Worker snapshot does not match the existing workspace.");return await C(L),await D(L),L}}let R=await d.promises.mkdtemp(g().join((0,m.getWorkspacesDir)(),".worker-restore-")),S=!1;try{for(let a of(await d.promises.chmod(R,448),m.WORKSPACE_SUBTREES))await d.promises.mkdir(g().join(R,a),{mode:448});for(let a of H.filter(a=>a.directory))await d.promises.mkdir(g().join(R,...y(a.name,!0).split("/")),{recursive:!0,mode:448});for(let a of O){let b=".workspace.json"===a.name?Buffer.from('{"roots":[]}\n'):a.content;await (0,o.sA)(R,g().join(R,...a.name.split("/")),b,{mode:a.mode})}if(await C(L,R),await D(L,R),await (0,o.sA)(R,g().join(R,t),Buffer.from(JSON.stringify({formatVersion:1,workspace:L.workspace,archiveSha256:b}))),Q)await B(P);else if(await A(P))throw Error("Worker restore destination was created concurrently.");return await d.promises.rename(R,P),S=!0,await C(L),L}finally{S||await d.promises.rm(R,{recursive:!0,force:!0})}}function G(){if(!(0,r.ye)())return Promise.resolve(null);let a=process.env.FLUJO_WORKER_SNAPSHOT?.trim(),b=process.env.FLUJO_WORKER_SNAPSHOT_SHA256?.trim().toLowerCase();if(!a||!b||!u.test(b)||!g().isAbsolute(a)){let a="Worker mode requires an absolute FLUJO_WORKER_SNAPSHOT path and FLUJO_WORKER_SNAPSHOT_SHA256.";return(0,r.Vv)({state:"error",error:a}),Promise.reject(Error(a))}let c=(0,e.createHash)("sha256").update(process.env.FLUJO_WORKER_SNAPSHOT_KEY??"").digest("hex"),d=`${(0,m.getWorkspacesDir)()}\0${a}\0${b}\0${c}`;if(global.__flujo_worker_snapshot_restore?.key===d)return global.__flujo_worker_snapshot_restore.promise;let f=F(a,b).catch(a=>{throw(0,r.Vv)({state:"error",error:a instanceof Error?a.message:"Worker restore failed."}),global.__flujo_worker_snapshot_restore?.promise===f&&(global.__flujo_worker_snapshot_restore=void 0),a});return global.__flujo_worker_snapshot_restore={key:d,promise:f},f}},39006:a=>{a.exports={rE:"3.45.2"}},72178:(a,b,c)=>{c.d(b,{N:()=>p,lA:()=>r,sA:()=>q});var d=c(73024),e=c(76760),f=c.n(e),g=c(77598);let h=new Set(["node_modules",".git"]);function i(a,b,c=!1){let d=f().relative(f().resolve(a),f().resolve(b));return""===d?c:!d.startsWith("..")&&!f().isAbsolute(d)}async function j(a){try{return await d.promises.lstat(a)}catch(a){if("ENOENT"===a.code)return null;throw a}}function k(a,b){if(!a||a.isSymbolicLink()||!a.isDirectory())throw Error(`${b} must be a real directory, not a symbolic link or junction.`)}function l(a,b){return a.dev===b.dev&&a.ino===b.ino&&a.size===b.size&&a.mtimeMs===b.mtimeMs}async function m(a,b,c){c?.throwIfAborted();let d=Buffer.alloc(b),e=0;for(;e<b;){c?.throwIfAborted();let{bytesRead:f}=await a.read(d,e,Math.min(b-e,1048576),e);if(0===f)break;e+=f}return e===b?d:d.subarray(0,e)}function n(a,b){let c=function(a){if(!a||a.includes("\\")||a.includes("\0")||f().posix.isAbsolute(a)||f().win32.isAbsolute(a)||/^[A-Za-z]:/.test(a))return null;let b=a.split("/");return b.some(a=>!a||"."===a||".."===a||a.includes(":"))?null:b}(b);if(!c)return null;let d=f().resolve(a,...c);return i(a,d)?d:null}async function o(a,b,c){let e=f().resolve(a),g=f().resolve(b);if(k(await j(e),"Workspace restore boundary"),!i(e,g,!0))throw Error(`Restore directory escapes workspace boundary: ${g}`);let h=f().relative(e,g),l=e;for(let a of h?h.split(f().sep):[]){l=f().join(l,a);let b=await j(l);if(!b&&c){try{await d.promises.mkdir(l)}catch(a){if("EEXIST"!==a.code)throw a}b=await j(l)}k(b,`Restore path component ${l}`)}if(!i(await d.promises.realpath(e),await d.promises.realpath(g),!0))throw Error(`Restore directory resolves outside workspace boundary: ${g}`)}async function p(a,b,c,e,g=()=>void 0,n={}){let o=n.maxFileBytes??0xa00000,q=n.skippedDirectories??h,r=f().resolve(e),s=f().resolve(b);if(k(await j(r),"Workspace backup boundary"),k(await j(s),"MCP backup root"),!i(r,s))throw Error("MCP backup root escapes its workspace.");let t=await d.promises.realpath(r),u=await d.promises.realpath(s);if(!i(t,u))throw Error("MCP backup root resolves outside its workspace.");let v=async(b,c)=>{n.signal?.throwIfAborted();let e=await j(b);if(!e||e.isSymbolicLink()||!e.isDirectory())return void g(c,"directory is a symbolic link, junction, or no longer exists");if(!i(u,await d.promises.realpath(b),!0))return void g(c,"directory resolves outside MCP backup root");for(let e of(await d.promises.readdir(b,{withFileTypes:!0}))){let h;n.signal?.throwIfAborted();let k=f().join(b,e.name),p=f().posix.join(c,e.name);if(n.skipPath?.(p))continue;try{h=await j(k)}catch(a){g(p,`lstat failed: ${a instanceof Error?a.message:String(a)}`);continue}if(!h||h.isSymbolicLink()){g(p,"symbolic links and junctions are not backed up");continue}if(h.isDirectory()){let b;if(q.has(e.name))continue;try{b=await d.promises.realpath(k)}catch{g(p,"directory disappeared while being inspected");continue}if(!i(u,b)){g(p,"directory resolves outside MCP backup root");continue}a.folder(p),await v(k,p);continue}if(!h.isFile()){g(p,"non-regular filesystem entry");continue}if(h.nlink>1&&!n.allowHardLinks){g(p,"hard-linked files are not backed up");continue}if(h.size>o){g(p,"file exceeds backup size limit");continue}let r=null;try{let b="number"==typeof d.constants.O_NOFOLLOW?d.constants.O_NOFOLLOW:0;r=await d.promises.open(k,d.constants.O_RDONLY|b);let c=await r.stat(),e=await d.promises.realpath(k);if(!c.isFile()||c.nlink>1&&!n.allowHardLinks||c.size>o||!l(h,c)||!i(u,e)){g(p,"file changed or escaped while being opened");continue}let f=await m(r,c.size,n.signal),j=await r.stat();if(f.byteLength!==c.size||!l(c,j)){g(p,"file changed while being read");continue}n.signal?.throwIfAborted(),n.onFile?.(p,f,j),a.file(p,f,n.preserveMode?{unixPermissions:33279&j.mode}:void 0)}catch(a){n.signal?.throwIfAborted(),g(p,`file could not be read safely: ${a instanceof Error?a.message:String(a)}`)}finally{await r?.close().catch(()=>void 0)}}};await v(s,c)}async function q(a,b,c,e={}){let h=f().dirname(b);await o(a,h,!0);let i=await j(b);if(i?.isSymbolicLink())throw Error(`Refusing to replace symbolic link or junction: ${b}`);if(i&&!i.isFile())throw Error(`Refusing to replace non-file restore target: ${b}`);let k=f().join(h,`.flujo-restore-${(0,g.randomUUID)()}.tmp`),l=!1;try{let f=384|(e.mode??0)&64,g=await d.promises.open(k,d.constants.O_WRONLY|d.constants.O_CREAT|d.constants.O_EXCL,f);l=!0;try{await g.writeFile(c),await g.sync()}finally{await g.close()}await o(a,h,!1);let i=await j(b);if(i?.isSymbolicLink()||i&&!i.isFile())throw Error(`Restore target became unsafe: ${b}`);await d.promises.rename(k,b),l=!1}finally{l&&await d.promises.unlink(k).catch(()=>void 0)}}async function r(a,b,c,d,e=()=>void 0,g={}){let h=f().resolve(c);await o(d,h,!0);let i=`${b}/`,j=Object.keys(a.files).filter(a=>a.startsWith(i)&&a!==i).map(b=>{let c=a.files[b],d=b.slice(i.length);return{entry:c,entryPath:b,relativePath:c.dir?d.replace(/\/+$/,""):d}});for(let a of j.filter(a=>a.entry.dir)){let b=n(h,a.relativePath);if(!b){e(a.entryPath,"unsafe archive directory path");continue}try{await o(d,b,!0)}catch(b){e(a.entryPath,b instanceof Error?b.message:String(b))}}for(let a of j.filter(a=>!a.entry.dir)){let b=n(h,a.relativePath);if(!b){e(a.entryPath,"unsafe archive file path");continue}try{let c=await a.entry.async("nodebuffer");if(c.length>(g.maxFileBytes??0xa00000)){e(a.entryPath,"file exceeds restore size limit");continue}await q(d,b,c,{mode:g.preserveMode?Number(a.entry.unixPermissions):void 0})}catch(b){e(a.entryPath,b instanceof Error?b.message:String(b))}}}},83843:(a,b,c)=>{c.d(b,{d1:()=>g,nt:()=>f});var d=c(39006),e=c(20775);let f=2;function g(){let a=process.env.FLUJO_BUILD_REVISION;return{applicationVersion:d.rE,snapshotFormatVersion:f,layoutVersion:e.q,workerProtocolVersion:1,.../^[a-f0-9]{40}$/.test(a??"")?{revision:a}:{}}}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=1914,exports.ids=[1914,5111,7492],exports.modules={5738:(a,b,c)=>{c.d(b,{$:()=>n,v5:()=>m});var d=c(23211),e=c(73560);let f=new Set(["localhost","127.0.0.1","::1"]);function g(a){return a.toLowerCase().replace(/^\[|\]$/g,"")}function h(){let a=process.env.FLUJO_EXTRA_LOCAL_HOSTS;return a?a.split(",").map(a=>a.trim().toLowerCase()).filter(a=>a.length>0&&"."!==a):[]}function i(a){return h().some(b=>b.startsWith(".")?a.endsWith(b):a===b)}function j(){return"legacy"===process.env.FLUJO_EXPOSURE_MODE_SOURCE||!process.env.FLUJO_EXPOSURE_MODE&&h().length>0}function k(a,b){var c;let d,e,h=g(a);return!!f.has(h)||("public"===b?/^[a-z0-9._-]+$/i.test(h)||h.includes(":"):"network"===b?j()?i(h):function(a){let b=a.split(".");if(4!==b.length||b.some(a=>!/^\d{1,3}$/.test(a)))return!1;let c=b.map(Number);if(c.some(a=>a<0||a>255))return!1;let[d,e]=c;return 10===d||172===d&&e>=16&&e<=31||192===d&&168===e||169===d&&254===e}(c=h)||(d=c.toLowerCase()).startsWith("fc")||d.startsWith("fd")||/^fe[89ab]/.test(d)||(!(e=process.env.FLUJO_RUNTIME_LOCAL_HOSTS)?[]:e.split(",").map(a=>a.trim().toLowerCase()).filter(Boolean)).includes(c)||[".local",".lan",".home",".internal",".localdomain"].some(a=>c.endsWith(a)):j()&&i(h))}function l(a){if(!a)return null;let b=a.trim();if("::1"===b)return b;if(b.startsWith("[")){let a=/^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(b);return!a||a[2]&&Number(a[2])>65535?null:a[1]}let c=/^([^:@\s]+)(?::(\d{1,5}))?$/.exec(b);return!c||c[2]&&Number(c[2])>65535?null:c[1]||null}function m(a,b){let c=(0,e.Th)(),d=l(a);if(!d||!k(d,c))return!1;if(b)try{let a=g(new URL(b).hostname);if(!k(a,c)||("public"===c||"network"===c&&!j())&&a!==g(d)&&!(f.has(a)&&f.has(g(d))))return!1}catch{return!1}return!0}function n(a,b={}){let c=function(a){if(null!==a.headers.get("forwarded")||null!==a.headers.get("x-real-ip"))return!0;let b=a.headers.get("host"),c=a.headers.get("x-forwarded-host");if(null!==c&&(!b||c.trim().toLowerCase()!==b.trim().toLowerCase()))return!0;let d=a.headers.get("x-forwarded-for");if(null!==d){let a=d.split(",").map(a=>a.trim()).filter(Boolean);if(a.length>1||a.some(a=>{let b;return!((b=a.trim().toLowerCase().replace(/^\[|\]$/g,"").split("%")[0])&&("::1"===b||"::ffff:127.0.0.1"===b||"localhost"===b||b.startsWith("127.")))}))return!0}let e=a.headers.get("x-forwarded-proto");return null!==e&&"http"!==e.trim().toLowerCase()}(a);return(b.strictLoopback?!c&&"localhost"===(0,e.Th)()&&function(a,b){let c=l(a);if(!c||!f.has(g(c)))return!1;if(!b)return!0;try{return f.has(g(new URL(b).hostname))}catch{return!1}}(a.headers.get("host"),a.headers.get("origin")):m(a.headers.get("host"),a.headers.get("origin")))?null:d.NextResponse.json({error:"Forbidden: this endpoint only accepts local requests."},{status:403})}},17492:(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()},39006:a=>{a.exports={rE:"3.45.1"}},52294:(a,b,c)=>{c.d(b,{i:()=>e});var d=c(77598);function e(a){let b,c=process.env.FLUJO_SNAPSHOT_CONTROL_TOKEN?.trim();if(!c)return Response.json({error:"Snapshot control plane is not configured."},{status:503});let e=a.headers.get("authorization")??"",f=/^Bearer[ \t]+([^\s]+)[ \t]*$/i.exec(e),g=f?.[1]??"";return g&&(b=a=>(0,d.createHash)("sha256").update(a,"utf8").digest(),(0,d.timingSafeEqual)(b(g),b(c)))?null:Response.json({error:"Unauthorized"},{status:401,headers:{"WWW-Authenticate":"Bearer"}})}},64896:(a,b,c)=>{function d(a){let b=a.startRestriction,c="unrestricted"===b||"singleton"===b||"exclusive"===b,d=!c&&!0===a.exclusive;return{startRestriction:c?b:d?"exclusive":"unrestricted",superExclusive:!!d||!0===a.superExclusive,emergency:!0===a.emergency}}function e(a){return!(!a||"object"!=typeof a||Array.isArray(a))&&["personaId","behaviorSlotKey","personaRetired","personaArchived"].some(b=>Object.prototype.hasOwnProperty.call(a,b))}c.d(b,{V:()=>e,v:()=>d})},73560:(a,b,c)=>{c.d(b,{Th:()=>e});let d=["localhost","network","public"];function e(a=process.env){let b=a.FLUJO_EXPOSURE_MODE?.trim().toLowerCase();return"string"==typeof b&&d.includes(b)?b:function(a=process.env){return a.FLUJO_MCP_APP_SANDBOX_PUBLIC_URL?.trim()||a.FLUJO_MCP_APP_HOST_ORIGINS?.trim()?"public":a.FLUJO_EXTRA_LOCAL_HOSTS?.split(",").some(a=>a.trim().length>0&&"."!==a.trim())?"network":void 0}(a)??"localhost"}},83843:(a,b,c)=>{c.d(b,{d1:()=>g,nt:()=>f});var d=c(39006),e=c(20775);let f=2;function g(){let a=process.env.FLUJO_BUILD_REVISION;return{applicationVersion:d.rE,snapshotFormatVersion:f,layoutVersion:e.q,workerProtocolVersion:1,.../^[a-f0-9]{40}$/.test(a??"")?{revision:a}:{}}}},94856:(a,b,c)=>{c.d(b,{$J:()=>g,Mh:()=>j,Ng:()=>i,k6:()=>h});var d=c(99680),e=c(52294),f=c(5738);function g(a){let b=(0,f.$)(a,{strictLoopback:!0});return b||(0,e.i)(a)}function h(a){try{return new URL(a.url).searchParams.get("sessionId")}catch{return null}}function i(a,b=200){return Response.json(a,{status:b,headers:{"Cache-Control":"no-store"}})}function j(a){return a instanceof d.b?i({error:a.message,code:a.code},a.status):i({error:"Snapshot operation failed.",code:"SNAPSHOT_FAILED"},500)}},99680:(a,b,c)=>{c.d(b,{b:()=>B,f:()=>M});var d=c(73024),e=c(77598),f=c(7986),g=c(48161),h=c(76760),i=c.n(h),j=c(76364),k=c.n(j),l=c(20775),m=c(83843),n=c(72178),o=c(87766),p=c(19031),q=c(58601),r=c(39006);let s=".workspace.json";class t extends Error{constructor(a,b){super(b),this.code=a,this.name="SnapshotArchiveError"}}function u(a,b){let c=Number.parseInt(process.env[a]??"",10);return Number.isSafeInteger(c)&&c>0?c:b}function v(a,b){return a.dev===b.dev&&a.ino===b.ino&&a.size===b.size&&a.mtimeMs===b.mtimeMs}async function w(a,b,c,e,f){let g,h;f?.throwIfAborted();let j=i().join(b,s);try{g=await d.promises.lstat(j)}catch(a){if("ENOENT"===a.code)return;throw a}if(!g.isFile()||g.isSymbolicLink()||g.nlink>1)throw new t("UNSAFE_ENTRY","Workspace metadata is not a plain, singly-linked file.");if(g.size>e)throw new t("SIZE_LIMIT","Workspace metadata exceeds the configured file limit.");if(!function(a,b,c=!1){let d=i().relative(i().resolve(a),i().resolve(b));return""===d?c:!d.startsWith("..")&&!i().isAbsolute(d)}(await d.promises.realpath(b),await d.promises.realpath(j)))throw new t("UNSAFE_ENTRY","Workspace metadata resolves outside the workspace.");try{let b="number"==typeof d.constants.O_NOFOLLOW?d.constants.O_NOFOLLOW:0;h=await d.promises.open(j,d.constants.O_RDONLY|b);let e=await h.stat();if(!e.isFile()||e.nlink>1||!v(g,e))throw new t("UNSAFE_ENTRY","Workspace metadata changed while it was opened.");let i=await h.readFile({signal:f}),k=await h.stat();if(!v(e,k)||i.byteLength!==e.size)throw new t("UNSAFE_ENTRY","Workspace metadata changed while it was read.");c(s,i),a.file(s,i)}finally{await h?.close().catch(()=>void 0)}}async function x(a,b,c={}){let g,h,j,s,{signal:v}=c;v?.throwIfAborted();let y=(0,f.getWorkspaceDataDir)(a);try{g=await d.promises.lstat(y)}catch{throw new t("WORKSPACE_UNAVAILABLE","Workspace directory is unavailable.")}if(!g.isDirectory()||g.isSymbolicLink())throw new t("WORKSPACE_UNAVAILABLE","Workspace directory is not a real directory.");let z=u("FLUJO_SNAPSHOT_MAX_FILE_BYTES",0x10000000),A=u("FLUJO_SNAPSHOT_MAX_BYTES",0x40000000),B=[],C=0,D=new(k()),E=(a,b,c)=>{if(v?.throwIfAborted(),b.byteLength>z)throw new t("SIZE_LIMIT","Snapshot member exceeds the configured file limit.");if(b.subarray(0,16).equals(Buffer.from("SQLite format 3\0")))throw new t("UNSAFE_ENTRY",`Live SQLite state is not portable: ${a}. Export it with its owning tool first.`);if((C+=b.byteLength)>A)throw new t("SIZE_LIMIT","Workspace snapshot exceeds the configured total size limit.");B.push({path:a,size:b.byteLength,sha256:(0,e.createHash)("sha256").update(b).digest("hex"),mode:c?384|64&c.mode:384})};await w(D,y,E,z,v);let F=["mcp-servers","db/codex-runtime","userdata/mcp-runtime","browser-profile","bash-utils","db/worker-bootstrap-secrets.json"],G=a=>F.some(b=>a===b||a.startsWith(`${b}/`));for(let a of f.WORKSPACE_SUBTREES){let b;if(v?.throwIfAborted(),G(a)){D.folder(a);continue}let c=i().join(y,a);try{b=await d.promises.lstat(c)}catch(b){if("ENOENT"===b.code){D.folder(a);continue}throw b}if(!b.isDirectory()||b.isSymbolicLink())throw new t("UNSAFE_ENTRY",`Workspace subtree ${a} is not a real directory.`);D.folder(a),await (0,n.N)(D,c,a,y,(a,b)=>{throw new t(b.includes("size limit")?"SIZE_LIMIT":"UNSAFE_ENTRY",`Cannot safely snapshot ${a}: ${b}`)},{maxFileBytes:z,skippedDirectories:new Set(["node_modules",".venv","__pycache__"]),skipPath:G,signal:v,preserveMode:!0,allowHardLinks:!0,onFile:E})}let H=async(a,b)=>{let c=D.file(a);if(!c)return b;try{return JSON.parse(await c.async("string"))}catch{throw new t("UNSAFE_ENTRY",`Invalid workspace configuration: ${a}`)}},I=await H("db/mcp_servers.json",{});if(!I||"object"!=typeof I||Array.isArray(I)||Object.values(I).some(a=>!a||"object"!=typeof a))throw new t("UNSAFE_ENTRY","Invalid workspace configuration: db/mcp_servers.json");let J=await H("db/models.json",[]);if(!Array.isArray(J)||J.some(a=>!a||"object"!=typeof a))throw new t("UNSAFE_ENTRY","Invalid workspace configuration: db/models.json");let K=(a,b)=>{let c=B.findIndex(b=>b.path===a);-1!==c&&(C-=B.splice(c,1)[0].size),E(a,b),D.file(a,b,{unixPermissions:33152})},L=new Map;if(c.flowIds){let a=await H("db/flows.json",[]);if(!Array.isArray(a))throw new t("UNSAFE_ENTRY","Invalid workspace configuration: db/flows.json");for(let b of a)L.set(b.id,b);for(let a of Object.keys(D.files).filter(a=>/^db\/flows\/[^/]+\.json$/.test(a))){let b=await H(a,null);if(!b||"string"!=typeof b.id||!Array.isArray(b.nodes)||!Array.isArray(b.edges))throw new t("UNSAFE_ENTRY",`Invalid workspace flow: ${a}`);L.set(b.id,b)}}try{let a=(0,o.xL)(c.flowIds,{flows:[...L.values()],models:J,mcpServers:Object.entries(I).map(([a,b])=>({...b,name:a,transport:b.transport||"stdio"}))});j=a.requiresCodexAuth,(s=c.flowIds?a.flowIds:void 0)&&K("db/mcp_servers.json",Buffer.from(JSON.stringify(Object.fromEntries(a.configs.map(a=>[a.name,a]))))),h=await (0,o.zk)((0,o.am)(a.configs,y,{requiredServerNames:s?a.mcpServerNames:void 0}),{signal:v})}catch(a){throw v?.throwIfAborted(),new t("MCP_UNSUPPORTED",a instanceof Error?a.message:"MCP runtime cannot be reconstructed.")}let M="none";if(j)try{let b=await (0,p.E0)(a);v?.throwIfAborted(),K("db/codex-runtime/auth.json",b),K(`db/codex-runtime/${p.Sy}`,Buffer.from(JSON.stringify(p.J1))),M="chatgpt"}catch(a){throw v?.throwIfAborted(),new t("CREDENTIALS_UNAVAILABLE",a instanceof Error?a.message:"Codex login is unavailable.")}let N="user"===(await H("db/encryption_key.json",{})).encryption_type?"user":"default";if("user"===N){let a=(0,q.eu)();if(!a)throw new t("CREDENTIALS_UNAVAILABLE","Unlock this workspace before creating a worker snapshot.");K("db/worker-bootstrap-secrets.json",Buffer.from(JSON.stringify({version:1,workspaceDek:a})))}B.sort((a,b)=>a.path.localeCompare(b.path));let O={formatVersion:m.nt,layoutVersion:l.q,workspace:a,generation:b,createdAt:new Date().toISOString(),coherence:"registered-flujo-writers",externalRootsIncluded:!1,subtrees:f.WORKSPACE_SUBTREES,files:B,source:{version:r.rE,platform:process.platform},runtime:{mcpTransfer:h,codexAuth:M,encryption:N,...s?{selectedFlowIds:s}:{}},excludedRuntimePaths:F};return D.file("snapshot-manifest.json",JSON.stringify(O,null,2)),{zip:D,manifest:O,files:B.length,bytes:C}}async function y(a,b={}){let{signal:c}=b;c?.throwIfAborted();let f=await d.promises.mkdtemp(i().join((0,g.tmpdir)(),"flujo-hot-clone-"));await d.promises.chmod(f,448).catch(()=>void 0);let h=i().join(f,"workspace.snapshot.zip");try{let b=await a.zip.generateAsync({type:"nodebuffer",compression:"DEFLATE",compressionOptions:{level:6},platform:"UNIX"},()=>c?.throwIfAborted());return c?.throwIfAborted(),await d.promises.writeFile(h,b,{mode:384}),await d.promises.chmod(h,384).catch(()=>void 0),c?.throwIfAborted(),{archivePath:h,stagingDir:f,sha256:(0,e.createHash)("sha256").update(b).digest("hex"),size:b.byteLength,files:a.files,bytes:a.bytes}}catch(a){throw await d.promises.rm(f,{recursive:!0,force:!0}).catch(()=>void 0),a}}var z=c(79628);let A=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;class B extends Error{constructor(a,b,c){super(c),this.code=a,this.status=b,this.name="SnapshotCoordinatorError"}}let C=globalThis.__flujoWorkspaceSnapshotSessions??(globalThis.__flujoWorkspaceSnapshotSessions=new Map);function D(a){return{sessionId:a.sessionId,workspace:a.workspace,generation:a.generation,state:a.state,createdAt:new Date(a.createdAtMs).toISOString(),expiresAt:new Date(a.expiresAtMs).toISOString(),bytesStaged:a.bytesStaged,filesStaged:a.filesStaged,archiveBytes:a.archiveBytes,sha256:a.sha256,errorCode:a.errorCode,error:a.error}}function E(a){return"finalized"===a||"aborted"===a||"failed"===a}async function F(a){let b=a.stagingDir;a.archivePath=void 0,a.stagingDir=void 0,b&&await d.promises.rm(b,{recursive:!0,force:!0}).catch(()=>void 0)}function G(a){a.expiryTimer&&(clearTimeout(a.expiryTimer),a.expiryTimer=void 0)}async function H(a){E(a.state)||(G(a),a.abortRequested=!0,a.state="aborted",a.errorCode="SNAPSHOT_EXPIRED",a.controller.abort(Error("Snapshot session expired.")),await F(a))}async function I(a){Date.now()<=a.expiresAtMs||E(a.state)||await H(a)}async function J(a){let b=C.get(a);return b&&await I(b),b}function K(a,b){if(!A.test(b))throw new B("SNAPSHOT_NOT_FOUND",404,"Snapshot session was not found.");let c=C.get(a);if(!c||c.sessionId!==b)throw new B("SNAPSHOT_NOT_FOUND",404,"Snapshot session was not found.");return c}async function L(a){let b,c,{signal:d}=a.controller,e=!Number.isSafeInteger(c=Number.parseInt(process.env.FLUJO_SNAPSHOT_CAPTURE_TIMEOUT_MS??"",10))||c<=0?3e4:Math.min(c,6e4),f=setTimeout(()=>{d.aborted||(a.abortRequested=!0,a.state="failed",a.errorCode="SNAPSHOT_TIMEOUT",G(a),a.controller.abort(Error("Workspace snapshot exceeded its capture time limit.")))},e);f.unref?.();try{b=await (0,z.Fk)(a.workspace,e,d),a.generation=b.generation,d.throwIfAborted(),a.state="staging";let c=await x(a.workspace,a.generation,{signal:d,flowIds:a.flowIds});d.throwIfAborted(),a.bytesStaged=c.bytes,a.filesStaged=c.files,b.release(),b=void 0,clearTimeout(f);let g=await y(c,{signal:d});if(a.archivePath=g.archivePath,a.stagingDir=g.stagingDir,a.archiveBytes=g.size,a.sha256=g.sha256,a.abortRequested){"SNAPSHOT_TIMEOUT"!==a.errorCode&&(a.state="aborted"),await F(a);return}a.state="ready"}catch(b){a.abortRequested?"SNAPSHOT_TIMEOUT"!==a.errorCode&&(a.state="aborted"):(a.state="failed",G(a),a.errorCode=b instanceof t?b.code:b instanceof Error&&"WorkspaceSnapshotBusyError"===b.name?"SNAPSHOT_BUSY":b instanceof Error&&"WorkspaceSnapshotTimeoutError"===b.name?"SNAPSHOT_TIMEOUT":"SNAPSHOT_FAILED",a.error=b instanceof t?b.message:void 0),await F(a)}finally{clearTimeout(f),b?.release()}}let M={async info(a=(0,f.getCurrentWorkspace)()){let b=(0,f.normalizeWorkspaceName)(a),c=await J(b),d=(0,z.B7)(b),e=c&&!E(c.state)?D(c):null;return{workspace:b,layoutVersion:l.q,workerCompatibility:(0,m.d1)(),capability:e||d.blocked?"busy":"available",coherence:"registered-flujo-writers",externalRootsIncluded:!1,activeOperation:e}},async begin(a=(0,f.getCurrentWorkspace)(),b={}){let c,d=(0,f.normalizeWorkspaceName)(a),g=C.get(d);if(g&&!E(g.state)&&Date.now()<=g.expiresAtMs)throw new B("SNAPSHOT_BUSY",409,"A snapshot is already active for this workspace.");g&&(E(g.state)?(G(g),F(g)):H(g));let h=Date.now(),i=!Number.isSafeInteger(c=Number.parseInt(process.env.FLUJO_SNAPSHOT_SESSION_TTL_MS??"",10))||c<=0?9e5:Math.min(c,36e5),j={sessionId:(0,e.randomUUID)(),workspace:d,generation:(0,z.B7)(d).generation,state:"beginning",createdAtMs:h,expiresAtMs:h+i,bytesStaged:0,filesStaged:0,abortRequested:!1,controller:new AbortController,flowIds:b.flowIds?[...b.flowIds]:void 0};C.set(d,j);let k=setTimeout(()=>{(0,f.runWithWorkspace)(d,async()=>{await H(j)})},i);return k.unref?.(),j.expiryTimer=k,(0,f.runWithWorkspace)(d,()=>L(j)),D(j)},async status(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);return await I(c),D(c)},async readDownload(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);if(await I(c),"SNAPSHOT_EXPIRED"===c.errorCode)throw new B("SNAPSHOT_EXPIRED",410,"Snapshot session has expired.");if("ready"!==c.state||!c.archivePath||!c.sha256||void 0===c.archiveBytes)throw new B("SNAPSHOT_NOT_READY",409,"Snapshot archive is not ready.");let g=await d.promises.readFile(c.archivePath),h=(0,e.createHash)("sha256").update(g).digest("hex");if(g.byteLength!==c.archiveBytes||h!==c.sha256)throw c.state="failed",c.errorCode="SNAPSHOT_INTEGRITY",await F(c),new B("SNAPSHOT_INTEGRITY",500,"Snapshot archive failed its integrity check.");return{content:g,sha256:h,size:g.byteLength}},async finalize(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);if(await I(c),"finalized"===c.state)return D(c);if("ready"!==c.state)throw new B("SNAPSHOT_NOT_READY",409,"Only a ready snapshot can be finalized.");return G(c),await F(c),c.state="finalized",D(c)},async abort(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);if("aborted"===c.state)return D(c);if("finalized"===c.state)throw new B("SNAPSHOT_NOT_READY",409,"A finalized snapshot cannot be aborted.");return G(c),c.abortRequested=!0,c.state="aborted",c.controller.abort(Error("Snapshot session was aborted.")),await F(c),D(c)}}}};
|
|
1
|
+
"use strict";exports.id=1914,exports.ids=[1914,5111,7492],exports.modules={5738:(a,b,c)=>{c.d(b,{$:()=>n,v5:()=>m});var d=c(23211),e=c(73560);let f=new Set(["localhost","127.0.0.1","::1"]);function g(a){return a.toLowerCase().replace(/^\[|\]$/g,"")}function h(){let a=process.env.FLUJO_EXTRA_LOCAL_HOSTS;return a?a.split(",").map(a=>a.trim().toLowerCase()).filter(a=>a.length>0&&"."!==a):[]}function i(a){return h().some(b=>b.startsWith(".")?a.endsWith(b):a===b)}function j(){return"legacy"===process.env.FLUJO_EXPOSURE_MODE_SOURCE||!process.env.FLUJO_EXPOSURE_MODE&&h().length>0}function k(a,b){var c;let d,e,h=g(a);return!!f.has(h)||("public"===b?/^[a-z0-9._-]+$/i.test(h)||h.includes(":"):"network"===b?j()?i(h):function(a){let b=a.split(".");if(4!==b.length||b.some(a=>!/^\d{1,3}$/.test(a)))return!1;let c=b.map(Number);if(c.some(a=>a<0||a>255))return!1;let[d,e]=c;return 10===d||172===d&&e>=16&&e<=31||192===d&&168===e||169===d&&254===e}(c=h)||(d=c.toLowerCase()).startsWith("fc")||d.startsWith("fd")||/^fe[89ab]/.test(d)||(!(e=process.env.FLUJO_RUNTIME_LOCAL_HOSTS)?[]:e.split(",").map(a=>a.trim().toLowerCase()).filter(Boolean)).includes(c)||[".local",".lan",".home",".internal",".localdomain"].some(a=>c.endsWith(a)):j()&&i(h))}function l(a){if(!a)return null;let b=a.trim();if("::1"===b)return b;if(b.startsWith("[")){let a=/^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(b);return!a||a[2]&&Number(a[2])>65535?null:a[1]}let c=/^([^:@\s]+)(?::(\d{1,5}))?$/.exec(b);return!c||c[2]&&Number(c[2])>65535?null:c[1]||null}function m(a,b){let c=(0,e.Th)(),d=l(a);if(!d||!k(d,c))return!1;if(b)try{let a=g(new URL(b).hostname);if(!k(a,c)||("public"===c||"network"===c&&!j())&&a!==g(d)&&!(f.has(a)&&f.has(g(d))))return!1}catch{return!1}return!0}function n(a,b={}){let c=function(a){if(null!==a.headers.get("forwarded")||null!==a.headers.get("x-real-ip"))return!0;let b=a.headers.get("host"),c=a.headers.get("x-forwarded-host");if(null!==c&&(!b||c.trim().toLowerCase()!==b.trim().toLowerCase()))return!0;let d=a.headers.get("x-forwarded-for");if(null!==d){let a=d.split(",").map(a=>a.trim()).filter(Boolean);if(a.length>1||a.some(a=>{let b;return!((b=a.trim().toLowerCase().replace(/^\[|\]$/g,"").split("%")[0])&&("::1"===b||"::ffff:127.0.0.1"===b||"localhost"===b||b.startsWith("127.")))}))return!0}let e=a.headers.get("x-forwarded-proto");return null!==e&&"http"!==e.trim().toLowerCase()}(a);return(b.strictLoopback?!c&&"localhost"===(0,e.Th)()&&function(a,b){let c=l(a);if(!c||!f.has(g(c)))return!1;if(!b)return!0;try{return f.has(g(new URL(b).hostname))}catch{return!1}}(a.headers.get("host"),a.headers.get("origin")):m(a.headers.get("host"),a.headers.get("origin")))?null:d.NextResponse.json({error:"Forbidden: this endpoint only accepts local requests."},{status:403})}},17492:(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()},39006:a=>{a.exports={rE:"3.45.2"}},52294:(a,b,c)=>{c.d(b,{i:()=>e});var d=c(77598);function e(a){let b,c=process.env.FLUJO_SNAPSHOT_CONTROL_TOKEN?.trim();if(!c)return Response.json({error:"Snapshot control plane is not configured."},{status:503});let e=a.headers.get("authorization")??"",f=/^Bearer[ \t]+([^\s]+)[ \t]*$/i.exec(e),g=f?.[1]??"";return g&&(b=a=>(0,d.createHash)("sha256").update(a,"utf8").digest(),(0,d.timingSafeEqual)(b(g),b(c)))?null:Response.json({error:"Unauthorized"},{status:401,headers:{"WWW-Authenticate":"Bearer"}})}},64896:(a,b,c)=>{function d(a){let b=a.startRestriction,c="unrestricted"===b||"singleton"===b||"exclusive"===b,d=!c&&!0===a.exclusive;return{startRestriction:c?b:d?"exclusive":"unrestricted",superExclusive:!!d||!0===a.superExclusive,emergency:!0===a.emergency}}function e(a){return!(!a||"object"!=typeof a||Array.isArray(a))&&["personaId","behaviorSlotKey","personaRetired","personaArchived"].some(b=>Object.prototype.hasOwnProperty.call(a,b))}c.d(b,{V:()=>e,v:()=>d})},73560:(a,b,c)=>{c.d(b,{Th:()=>e});let d=["localhost","network","public"];function e(a=process.env){let b=a.FLUJO_EXPOSURE_MODE?.trim().toLowerCase();return"string"==typeof b&&d.includes(b)?b:function(a=process.env){return a.FLUJO_MCP_APP_SANDBOX_PUBLIC_URL?.trim()||a.FLUJO_MCP_APP_HOST_ORIGINS?.trim()?"public":a.FLUJO_EXTRA_LOCAL_HOSTS?.split(",").some(a=>a.trim().length>0&&"."!==a.trim())?"network":void 0}(a)??"localhost"}},83843:(a,b,c)=>{c.d(b,{d1:()=>g,nt:()=>f});var d=c(39006),e=c(20775);let f=2;function g(){let a=process.env.FLUJO_BUILD_REVISION;return{applicationVersion:d.rE,snapshotFormatVersion:f,layoutVersion:e.q,workerProtocolVersion:1,.../^[a-f0-9]{40}$/.test(a??"")?{revision:a}:{}}}},94856:(a,b,c)=>{c.d(b,{$J:()=>g,Mh:()=>j,Ng:()=>i,k6:()=>h});var d=c(99680),e=c(52294),f=c(5738);function g(a){let b=(0,f.$)(a,{strictLoopback:!0});return b||(0,e.i)(a)}function h(a){try{return new URL(a.url).searchParams.get("sessionId")}catch{return null}}function i(a,b=200){return Response.json(a,{status:b,headers:{"Cache-Control":"no-store"}})}function j(a){return a instanceof d.b?i({error:a.message,code:a.code},a.status):i({error:"Snapshot operation failed.",code:"SNAPSHOT_FAILED"},500)}},99680:(a,b,c)=>{c.d(b,{b:()=>B,f:()=>M});var d=c(73024),e=c(77598),f=c(7986),g=c(48161),h=c(76760),i=c.n(h),j=c(76364),k=c.n(j),l=c(20775),m=c(83843),n=c(72178),o=c(87766),p=c(19031),q=c(58601),r=c(39006);let s=".workspace.json";class t extends Error{constructor(a,b){super(b),this.code=a,this.name="SnapshotArchiveError"}}function u(a,b){let c=Number.parseInt(process.env[a]??"",10);return Number.isSafeInteger(c)&&c>0?c:b}function v(a,b){return a.dev===b.dev&&a.ino===b.ino&&a.size===b.size&&a.mtimeMs===b.mtimeMs}async function w(a,b,c,e,f){let g,h;f?.throwIfAborted();let j=i().join(b,s);try{g=await d.promises.lstat(j)}catch(a){if("ENOENT"===a.code)return;throw a}if(!g.isFile()||g.isSymbolicLink()||g.nlink>1)throw new t("UNSAFE_ENTRY","Workspace metadata is not a plain, singly-linked file.");if(g.size>e)throw new t("SIZE_LIMIT","Workspace metadata exceeds the configured file limit.");if(!function(a,b,c=!1){let d=i().relative(i().resolve(a),i().resolve(b));return""===d?c:!d.startsWith("..")&&!i().isAbsolute(d)}(await d.promises.realpath(b),await d.promises.realpath(j)))throw new t("UNSAFE_ENTRY","Workspace metadata resolves outside the workspace.");try{let b="number"==typeof d.constants.O_NOFOLLOW?d.constants.O_NOFOLLOW:0;h=await d.promises.open(j,d.constants.O_RDONLY|b);let e=await h.stat();if(!e.isFile()||e.nlink>1||!v(g,e))throw new t("UNSAFE_ENTRY","Workspace metadata changed while it was opened.");let i=await h.readFile({signal:f}),k=await h.stat();if(!v(e,k)||i.byteLength!==e.size)throw new t("UNSAFE_ENTRY","Workspace metadata changed while it was read.");c(s,i),a.file(s,i)}finally{await h?.close().catch(()=>void 0)}}async function x(a,b,c={}){let g,h,j,s,{signal:v}=c;v?.throwIfAborted();let y=(0,f.getWorkspaceDataDir)(a);try{g=await d.promises.lstat(y)}catch{throw new t("WORKSPACE_UNAVAILABLE","Workspace directory is unavailable.")}if(!g.isDirectory()||g.isSymbolicLink())throw new t("WORKSPACE_UNAVAILABLE","Workspace directory is not a real directory.");let z=u("FLUJO_SNAPSHOT_MAX_FILE_BYTES",0x10000000),A=u("FLUJO_SNAPSHOT_MAX_BYTES",0x40000000),B=[],C=0,D=new(k()),E=(a,b,c)=>{if(v?.throwIfAborted(),b.byteLength>z)throw new t("SIZE_LIMIT","Snapshot member exceeds the configured file limit.");if(b.subarray(0,16).equals(Buffer.from("SQLite format 3\0")))throw new t("UNSAFE_ENTRY",`Live SQLite state is not portable: ${a}. Export it with its owning tool first.`);if((C+=b.byteLength)>A)throw new t("SIZE_LIMIT","Workspace snapshot exceeds the configured total size limit.");B.push({path:a,size:b.byteLength,sha256:(0,e.createHash)("sha256").update(b).digest("hex"),mode:c?384|64&c.mode:384})};await w(D,y,E,z,v);let F=["mcp-servers","db/codex-runtime","userdata/mcp-runtime","browser-profile","bash-utils","db/worker-bootstrap-secrets.json"],G=a=>F.some(b=>a===b||a.startsWith(`${b}/`));for(let a of f.WORKSPACE_SUBTREES){let b;if(v?.throwIfAborted(),G(a)){D.folder(a);continue}let c=i().join(y,a);try{b=await d.promises.lstat(c)}catch(b){if("ENOENT"===b.code){D.folder(a);continue}throw b}if(!b.isDirectory()||b.isSymbolicLink())throw new t("UNSAFE_ENTRY",`Workspace subtree ${a} is not a real directory.`);D.folder(a),await (0,n.N)(D,c,a,y,(a,b)=>{throw new t(b.includes("size limit")?"SIZE_LIMIT":"UNSAFE_ENTRY",`Cannot safely snapshot ${a}: ${b}`)},{maxFileBytes:z,skippedDirectories:new Set(["node_modules",".venv","__pycache__"]),skipPath:G,signal:v,preserveMode:!0,allowHardLinks:!0,onFile:E})}let H=async(a,b)=>{let c=D.file(a);if(!c)return b;try{return JSON.parse(await c.async("string"))}catch{throw new t("UNSAFE_ENTRY",`Invalid workspace configuration: ${a}`)}},I=await H("db/mcp_servers.json",{});if(!I||"object"!=typeof I||Array.isArray(I)||Object.values(I).some(a=>!a||"object"!=typeof a))throw new t("UNSAFE_ENTRY","Invalid workspace configuration: db/mcp_servers.json");let J=await H("db/models.json",[]);if(!Array.isArray(J)||J.some(a=>!a||"object"!=typeof a))throw new t("UNSAFE_ENTRY","Invalid workspace configuration: db/models.json");let K=(a,b)=>{let c=B.findIndex(b=>b.path===a);-1!==c&&(C-=B.splice(c,1)[0].size),E(a,b),D.file(a,b,{unixPermissions:33152})},L=new Map;if(c.flowIds){let a=await H("db/flows.json",[]);if(!Array.isArray(a))throw new t("UNSAFE_ENTRY","Invalid workspace configuration: db/flows.json");for(let b of a)L.set(b.id,b);for(let a of Object.keys(D.files).filter(a=>/^db\/flows\/[^/]+\.json$/.test(a))){let b=await H(a,null);if(!b||"string"!=typeof b.id||!Array.isArray(b.nodes)||!Array.isArray(b.edges))throw new t("UNSAFE_ENTRY",`Invalid workspace flow: ${a}`);L.set(b.id,b)}}try{let a=(0,o.xL)(c.flowIds,{flows:[...L.values()],models:J,mcpServers:Object.entries(I).map(([a,b])=>({...b,name:a,transport:b.transport||"stdio"}))});j=a.requiresCodexAuth,(s=c.flowIds?a.flowIds:void 0)&&K("db/mcp_servers.json",Buffer.from(JSON.stringify(Object.fromEntries(a.configs.map(a=>[a.name,a]))))),h=await (0,o.zk)((0,o.am)(a.configs,y,{requiredServerNames:s?a.mcpServerNames:void 0}),{signal:v})}catch(a){throw v?.throwIfAborted(),new t("MCP_UNSUPPORTED",a instanceof Error?a.message:"MCP runtime cannot be reconstructed.")}let M="none";if(j)try{let b=await (0,p.E0)(a);v?.throwIfAborted(),K("db/codex-runtime/auth.json",b),K(`db/codex-runtime/${p.Sy}`,Buffer.from(JSON.stringify(p.J1))),M="chatgpt"}catch(a){throw v?.throwIfAborted(),new t("CREDENTIALS_UNAVAILABLE",a instanceof Error?a.message:"Codex login is unavailable.")}let N="user"===(await H("db/encryption_key.json",{})).encryption_type?"user":"default";if("user"===N){let a=(0,q.eu)();if(!a)throw new t("CREDENTIALS_UNAVAILABLE","Unlock this workspace before creating a worker snapshot.");K("db/worker-bootstrap-secrets.json",Buffer.from(JSON.stringify({version:1,workspaceDek:a})))}B.sort((a,b)=>a.path.localeCompare(b.path));let O={formatVersion:m.nt,layoutVersion:l.q,workspace:a,generation:b,createdAt:new Date().toISOString(),coherence:"registered-flujo-writers",externalRootsIncluded:!1,subtrees:f.WORKSPACE_SUBTREES,files:B,source:{version:r.rE,platform:process.platform},runtime:{mcpTransfer:h,codexAuth:M,encryption:N,...s?{selectedFlowIds:s}:{}},excludedRuntimePaths:F};return D.file("snapshot-manifest.json",JSON.stringify(O,null,2)),{zip:D,manifest:O,files:B.length,bytes:C}}async function y(a,b={}){let{signal:c}=b;c?.throwIfAborted();let f=await d.promises.mkdtemp(i().join((0,g.tmpdir)(),"flujo-hot-clone-"));await d.promises.chmod(f,448).catch(()=>void 0);let h=i().join(f,"workspace.snapshot.zip");try{let b=await a.zip.generateAsync({type:"nodebuffer",compression:"DEFLATE",compressionOptions:{level:6},platform:"UNIX"},()=>c?.throwIfAborted());return c?.throwIfAborted(),await d.promises.writeFile(h,b,{mode:384}),await d.promises.chmod(h,384).catch(()=>void 0),c?.throwIfAborted(),{archivePath:h,stagingDir:f,sha256:(0,e.createHash)("sha256").update(b).digest("hex"),size:b.byteLength,files:a.files,bytes:a.bytes}}catch(a){throw await d.promises.rm(f,{recursive:!0,force:!0}).catch(()=>void 0),a}}var z=c(79628);let A=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;class B extends Error{constructor(a,b,c){super(c),this.code=a,this.status=b,this.name="SnapshotCoordinatorError"}}let C=globalThis.__flujoWorkspaceSnapshotSessions??(globalThis.__flujoWorkspaceSnapshotSessions=new Map);function D(a){return{sessionId:a.sessionId,workspace:a.workspace,generation:a.generation,state:a.state,createdAt:new Date(a.createdAtMs).toISOString(),expiresAt:new Date(a.expiresAtMs).toISOString(),bytesStaged:a.bytesStaged,filesStaged:a.filesStaged,archiveBytes:a.archiveBytes,sha256:a.sha256,errorCode:a.errorCode,error:a.error}}function E(a){return"finalized"===a||"aborted"===a||"failed"===a}async function F(a){let b=a.stagingDir;a.archivePath=void 0,a.stagingDir=void 0,b&&await d.promises.rm(b,{recursive:!0,force:!0}).catch(()=>void 0)}function G(a){a.expiryTimer&&(clearTimeout(a.expiryTimer),a.expiryTimer=void 0)}async function H(a){E(a.state)||(G(a),a.abortRequested=!0,a.state="aborted",a.errorCode="SNAPSHOT_EXPIRED",a.controller.abort(Error("Snapshot session expired.")),await F(a))}async function I(a){Date.now()<=a.expiresAtMs||E(a.state)||await H(a)}async function J(a){let b=C.get(a);return b&&await I(b),b}function K(a,b){if(!A.test(b))throw new B("SNAPSHOT_NOT_FOUND",404,"Snapshot session was not found.");let c=C.get(a);if(!c||c.sessionId!==b)throw new B("SNAPSHOT_NOT_FOUND",404,"Snapshot session was not found.");return c}async function L(a){let b,c,{signal:d}=a.controller,e=!Number.isSafeInteger(c=Number.parseInt(process.env.FLUJO_SNAPSHOT_CAPTURE_TIMEOUT_MS??"",10))||c<=0?3e4:Math.min(c,6e4),f=setTimeout(()=>{d.aborted||(a.abortRequested=!0,a.state="failed",a.errorCode="SNAPSHOT_TIMEOUT",G(a),a.controller.abort(Error("Workspace snapshot exceeded its capture time limit.")))},e);f.unref?.();try{b=await (0,z.Fk)(a.workspace,e,d),a.generation=b.generation,d.throwIfAborted(),a.state="staging";let c=await x(a.workspace,a.generation,{signal:d,flowIds:a.flowIds});d.throwIfAborted(),a.bytesStaged=c.bytes,a.filesStaged=c.files,b.release(),b=void 0,clearTimeout(f);let g=await y(c,{signal:d});if(a.archivePath=g.archivePath,a.stagingDir=g.stagingDir,a.archiveBytes=g.size,a.sha256=g.sha256,a.abortRequested){"SNAPSHOT_TIMEOUT"!==a.errorCode&&(a.state="aborted"),await F(a);return}a.state="ready"}catch(b){a.abortRequested?"SNAPSHOT_TIMEOUT"!==a.errorCode&&(a.state="aborted"):(a.state="failed",G(a),a.errorCode=b instanceof t?b.code:b instanceof Error&&"WorkspaceSnapshotBusyError"===b.name?"SNAPSHOT_BUSY":b instanceof Error&&"WorkspaceSnapshotTimeoutError"===b.name?"SNAPSHOT_TIMEOUT":"SNAPSHOT_FAILED",a.error=b instanceof t?b.message:void 0),await F(a)}finally{clearTimeout(f),b?.release()}}let M={async info(a=(0,f.getCurrentWorkspace)()){let b=(0,f.normalizeWorkspaceName)(a),c=await J(b),d=(0,z.B7)(b),e=c&&!E(c.state)?D(c):null;return{workspace:b,layoutVersion:l.q,workerCompatibility:(0,m.d1)(),capability:e||d.blocked?"busy":"available",coherence:"registered-flujo-writers",externalRootsIncluded:!1,activeOperation:e}},async begin(a=(0,f.getCurrentWorkspace)(),b={}){let c,d=(0,f.normalizeWorkspaceName)(a),g=C.get(d);if(g&&!E(g.state)&&Date.now()<=g.expiresAtMs)throw new B("SNAPSHOT_BUSY",409,"A snapshot is already active for this workspace.");g&&(E(g.state)?(G(g),F(g)):H(g));let h=Date.now(),i=!Number.isSafeInteger(c=Number.parseInt(process.env.FLUJO_SNAPSHOT_SESSION_TTL_MS??"",10))||c<=0?9e5:Math.min(c,36e5),j={sessionId:(0,e.randomUUID)(),workspace:d,generation:(0,z.B7)(d).generation,state:"beginning",createdAtMs:h,expiresAtMs:h+i,bytesStaged:0,filesStaged:0,abortRequested:!1,controller:new AbortController,flowIds:b.flowIds?[...b.flowIds]:void 0};C.set(d,j);let k=setTimeout(()=>{(0,f.runWithWorkspace)(d,async()=>{await H(j)})},i);return k.unref?.(),j.expiryTimer=k,(0,f.runWithWorkspace)(d,()=>L(j)),D(j)},async status(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);return await I(c),D(c)},async readDownload(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);if(await I(c),"SNAPSHOT_EXPIRED"===c.errorCode)throw new B("SNAPSHOT_EXPIRED",410,"Snapshot session has expired.");if("ready"!==c.state||!c.archivePath||!c.sha256||void 0===c.archiveBytes)throw new B("SNAPSHOT_NOT_READY",409,"Snapshot archive is not ready.");let g=await d.promises.readFile(c.archivePath),h=(0,e.createHash)("sha256").update(g).digest("hex");if(g.byteLength!==c.archiveBytes||h!==c.sha256)throw c.state="failed",c.errorCode="SNAPSHOT_INTEGRITY",await F(c),new B("SNAPSHOT_INTEGRITY",500,"Snapshot archive failed its integrity check.");return{content:g,sha256:h,size:g.byteLength}},async finalize(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);if(await I(c),"finalized"===c.state)return D(c);if("ready"!==c.state)throw new B("SNAPSHOT_NOT_READY",409,"Only a ready snapshot can be finalized.");return G(c),await F(c),c.state="finalized",D(c)},async abort(a,b=(0,f.getCurrentWorkspace)()){let c=K((0,f.normalizeWorkspaceName)(b),a);if("aborted"===c.state)return D(c);if("finalized"===c.state)throw new B("SNAPSHOT_NOT_READY",409,"A finalized snapshot cannot be aborted.");return G(c),c.abortRequested=!0,c.state="aborted",c.controller.abort(Error("Snapshot session was aborted.")),await F(c),D(c)}}}};
|