@guuey/create-agentic-app 0.8.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -2
- package/dist/{chunk-JD4RAKEG.js → chunk-5V2IFXD4.js} +96 -21
- package/dist/cli.cjs +145 -17
- package/dist/cli.js +60 -5
- package/dist/index.cjs +97 -21
- package/dist/index.d.cts +33 -2
- package/dist/index.d.ts +33 -2
- package/dist/index.js +3 -1
- package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/AGENTS.md +2 -2
- package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/README.md +17 -3
- package/dist/templates/agentic-app/claude-agent-sdk/gitignore +5 -0
- package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.json +28 -0
- package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/package.json +6 -3
- package/dist/templates/agentic-app/claude-agent-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/web/index.html +0 -1
- package/dist/templates/agentic-app/claude-agent-sdk/web/package.json +28 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AppShell.tsx +65 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/config.ts +148 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/main.tsx +52 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/AgentCanvas.tsx +14 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Dashboard.tsx +36 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Reports.tsx +9 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/TalkOnMobile.tsx +50 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/routes.ts +7 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles-app.css +132 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles.css +248 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/tsconfig.json +18 -0
- package/dist/templates/agentic-app/claude-agent-sdk/web/vite.config.ts +46 -0
- package/dist/templates/{google-adk → agentic-app/google-adk}/AGENTS.md +2 -2
- package/dist/templates/agentic-app/google-adk/gitignore +5 -0
- package/dist/templates/agentic-app/google-adk/guuey.app.json +28 -0
- package/dist/templates/agentic-app/google-adk/guuey.app.schema.json +119 -0
- package/dist/templates/{google-adk → agentic-app/google-adk}/package.json +6 -3
- package/dist/templates/agentic-app/google-adk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/{google-adk → agentic-app/google-adk}/web/index.html +0 -1
- package/dist/templates/agentic-app/google-adk/web/package.json +28 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/AppShell.tsx +65 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/agentic-app/google-adk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/agentic-app/google-adk/web/src/config.ts +148 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/identity.ts +67 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/status.ts +45 -0
- package/dist/templates/agentic-app/google-adk/web/src/lib/widget.ts +96 -0
- package/dist/templates/agentic-app/google-adk/web/src/main.tsx +52 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/AgentCanvas.tsx +14 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Dashboard.tsx +36 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/Reports.tsx +9 -0
- package/dist/templates/agentic-app/google-adk/web/src/pages/TalkOnMobile.tsx +50 -0
- package/dist/templates/agentic-app/google-adk/web/src/routes.ts +7 -0
- package/dist/templates/agentic-app/google-adk/web/src/styles-app.css +132 -0
- package/dist/templates/agentic-app/google-adk/web/src/styles.css +248 -0
- package/dist/templates/agentic-app/google-adk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/agentic-app/google-adk/web/tsconfig.json +18 -0
- package/dist/templates/agentic-app/google-adk/web/vite.config.ts +46 -0
- package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/AGENTS.md +2 -2
- package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/README.md +17 -3
- package/dist/templates/agentic-app/openai-agents-sdk/gitignore +5 -0
- package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.json +28 -0
- package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/package.json +6 -3
- package/dist/templates/agentic-app/openai-agents-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/web/index.html +0 -1
- package/dist/templates/agentic-app/openai-agents-sdk/web/package.json +28 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AppShell.tsx +65 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/config.ts +148 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/main.tsx +52 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/AgentCanvas.tsx +14 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Dashboard.tsx +36 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Reports.tsx +9 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/TalkOnMobile.tsx +50 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/routes.ts +7 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles-app.css +132 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles.css +248 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/tsconfig.json +18 -0
- package/dist/templates/agentic-app/openai-agents-sdk/web/vite.config.ts +46 -0
- package/dist/templates/base/claude-agent-sdk/.env.example +4 -0
- package/dist/templates/base/claude-agent-sdk/.mcp.json +1 -0
- package/dist/templates/base/claude-agent-sdk/AGENTS.md +135 -0
- package/dist/templates/base/claude-agent-sdk/README.md +171 -0
- package/dist/templates/base/claude-agent-sdk/ggui/blueprints/.gitkeep +0 -0
- package/dist/templates/base/claude-agent-sdk/ggui/ggui.json +15 -0
- package/dist/templates/base/claude-agent-sdk/ggui/themes/.gitkeep +0 -0
- package/dist/templates/base/claude-agent-sdk/gitignore +5 -0
- package/dist/templates/base/claude-agent-sdk/guuey.app.json +28 -0
- package/dist/templates/base/claude-agent-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/base/claude-agent-sdk/guuey.json +14 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/Dockerfile +46 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/package.json +22 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/src/server.ts +173 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/tsconfig.json +15 -0
- package/dist/templates/base/claude-agent-sdk/mcps/todo/tsup.config.ts +14 -0
- package/dist/templates/base/claude-agent-sdk/package.json +30 -0
- package/dist/templates/base/claude-agent-sdk/pnpm-workspace.yaml +24 -0
- package/dist/templates/base/claude-agent-sdk/prompts/system.md +4 -0
- package/dist/templates/base/claude-agent-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/base/claude-agent-sdk/scripts/dev.mjs +45 -0
- package/dist/templates/base/claude-agent-sdk/src/agent-config.ts +77 -0
- package/dist/templates/base/claude-agent-sdk/src/worker.ts +89 -0
- package/dist/templates/base/claude-agent-sdk/tsconfig.json +15 -0
- package/dist/templates/base/claude-agent-sdk/tsup.config.ts +9 -0
- package/dist/templates/base/claude-agent-sdk/web/index.html +12 -0
- package/dist/templates/{claude-agent-sdk → base/claude-agent-sdk}/web/package.json +9 -8
- package/dist/templates/base/claude-agent-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/base/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/base/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/base/claude-agent-sdk/web/src/config.ts +148 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/base/claude-agent-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/base/claude-agent-sdk/web/src/main.tsx +38 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Chat.tsx +15 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/base/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/base/claude-agent-sdk/web/src/routes.ts +7 -0
- package/dist/templates/base/claude-agent-sdk/web/src/styles.css +248 -0
- package/dist/templates/base/claude-agent-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/base/claude-agent-sdk/web/tsconfig.json +18 -0
- package/dist/templates/base/claude-agent-sdk/web/vite.config.ts +46 -0
- package/dist/templates/base/google-adk/.env.example +4 -0
- package/dist/templates/base/google-adk/.mcp.json +1 -0
- package/dist/templates/base/google-adk/AGENTS.md +135 -0
- package/dist/templates/base/google-adk/README.md +90 -0
- package/dist/templates/base/google-adk/ggui/blueprints/.gitkeep +0 -0
- package/dist/templates/base/google-adk/ggui/ggui.json +15 -0
- package/dist/templates/base/google-adk/ggui/themes/.gitkeep +0 -0
- package/dist/templates/base/google-adk/gitignore +5 -0
- package/dist/templates/base/google-adk/guuey.app.json +28 -0
- package/dist/templates/base/google-adk/guuey.app.schema.json +119 -0
- package/dist/templates/base/google-adk/guuey.json +15 -0
- package/dist/templates/base/google-adk/mcps/todo/Dockerfile +46 -0
- package/dist/templates/base/google-adk/mcps/todo/package.json +22 -0
- package/dist/templates/base/google-adk/mcps/todo/src/server.ts +173 -0
- package/dist/templates/base/google-adk/mcps/todo/tsconfig.json +15 -0
- package/dist/templates/base/google-adk/mcps/todo/tsup.config.ts +14 -0
- package/dist/templates/base/google-adk/package.json +30 -0
- package/dist/templates/base/google-adk/pnpm-workspace.yaml +34 -0
- package/dist/templates/base/google-adk/prompts/system.md +4 -0
- package/dist/templates/base/google-adk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/base/google-adk/scripts/dev.mjs +45 -0
- package/dist/templates/base/google-adk/src/agent.ts +43 -0
- package/dist/templates/base/google-adk/tsconfig.json +15 -0
- package/dist/templates/base/google-adk/tsup.config.ts +13 -0
- package/dist/templates/base/google-adk/web/index.html +12 -0
- package/dist/templates/{google-adk → base/google-adk}/web/package.json +9 -8
- package/dist/templates/base/google-adk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/base/google-adk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/base/google-adk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/base/google-adk/web/src/config.ts +148 -0
- package/dist/templates/base/google-adk/web/src/lib/identity.ts +67 -0
- package/dist/templates/base/google-adk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/base/google-adk/web/src/lib/status.ts +45 -0
- package/dist/templates/base/google-adk/web/src/lib/widget.ts +96 -0
- package/dist/templates/base/google-adk/web/src/main.tsx +38 -0
- package/dist/templates/base/google-adk/web/src/pages/Chat.tsx +15 -0
- package/dist/templates/base/google-adk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/base/google-adk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/base/google-adk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/base/google-adk/web/src/routes.ts +7 -0
- package/dist/templates/base/google-adk/web/src/styles.css +248 -0
- package/dist/templates/base/google-adk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/base/google-adk/web/tsconfig.json +18 -0
- package/dist/templates/base/google-adk/web/vite.config.ts +46 -0
- package/dist/templates/base/openai-agents-sdk/.env.example +4 -0
- package/dist/templates/base/openai-agents-sdk/.mcp.json +1 -0
- package/dist/templates/base/openai-agents-sdk/AGENTS.md +135 -0
- package/dist/templates/base/openai-agents-sdk/README.md +171 -0
- package/dist/templates/base/openai-agents-sdk/ggui/blueprints/.gitkeep +0 -0
- package/dist/templates/base/openai-agents-sdk/ggui/ggui.json +15 -0
- package/dist/templates/base/openai-agents-sdk/ggui/themes/.gitkeep +0 -0
- package/dist/templates/base/openai-agents-sdk/gitignore +5 -0
- package/dist/templates/base/openai-agents-sdk/guuey.app.json +28 -0
- package/dist/templates/base/openai-agents-sdk/guuey.app.schema.json +119 -0
- package/dist/templates/base/openai-agents-sdk/guuey.json +27 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/Dockerfile +46 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/package.json +22 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/src/server.ts +173 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/tsconfig.json +15 -0
- package/dist/templates/base/openai-agents-sdk/mcps/todo/tsup.config.ts +14 -0
- package/dist/templates/base/openai-agents-sdk/package.json +30 -0
- package/dist/templates/base/openai-agents-sdk/pnpm-workspace.yaml +24 -0
- package/dist/templates/base/openai-agents-sdk/prompts/system.md +4 -0
- package/dist/templates/base/openai-agents-sdk/scripts/bootstrap.mjs +376 -0
- package/dist/templates/base/openai-agents-sdk/scripts/dev.mjs +45 -0
- package/dist/templates/base/openai-agents-sdk/src/agent-config.ts +77 -0
- package/dist/templates/base/openai-agents-sdk/src/worker.ts +75 -0
- package/dist/templates/base/openai-agents-sdk/tsconfig.json +15 -0
- package/dist/templates/base/openai-agents-sdk/tsup.config.ts +16 -0
- package/dist/templates/base/openai-agents-sdk/web/index.html +12 -0
- package/dist/templates/{openai-agents-sdk → base/openai-agents-sdk}/web/package.json +9 -8
- package/dist/templates/base/openai-agents-sdk/web/src/components/AgentChat.tsx +53 -0
- package/dist/templates/base/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
- package/dist/templates/base/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
- package/dist/templates/base/openai-agents-sdk/web/src/config.ts +148 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/identity.ts +67 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/status.ts +45 -0
- package/dist/templates/base/openai-agents-sdk/web/src/lib/widget.ts +96 -0
- package/dist/templates/base/openai-agents-sdk/web/src/main.tsx +38 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Chat.tsx +15 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Landing.tsx +50 -0
- package/dist/templates/base/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
- package/dist/templates/base/openai-agents-sdk/web/src/routes.ts +7 -0
- package/dist/templates/base/openai-agents-sdk/web/src/styles.css +248 -0
- package/dist/templates/base/openai-agents-sdk/web/src/vite-env.d.ts +1 -0
- package/dist/templates/base/openai-agents-sdk/web/tsconfig.json +18 -0
- package/dist/templates/base/openai-agents-sdk/web/vite.config.ts +46 -0
- package/package.json +6 -3
- package/dist/templates/claude-agent-sdk/web/.env.example +0 -17
- package/dist/templates/claude-agent-sdk/web/sandbox-proxy.ts +0 -239
- package/dist/templates/claude-agent-sdk/web/src/App.tsx +0 -272
- package/dist/templates/claude-agent-sdk/web/src/main.tsx +0 -12
- package/dist/templates/claude-agent-sdk/web/src/useAgentChat.ts +0 -122
- package/dist/templates/claude-agent-sdk/web/src/vite-env.d.ts +0 -27
- package/dist/templates/claude-agent-sdk/web/tsconfig.json +0 -20
- package/dist/templates/claude-agent-sdk/web/vite.config.ts +0 -12
- package/dist/templates/google-adk/web/.env.example +0 -17
- package/dist/templates/google-adk/web/sandbox-proxy.ts +0 -239
- package/dist/templates/google-adk/web/src/App.tsx +0 -272
- package/dist/templates/google-adk/web/src/main.tsx +0 -12
- package/dist/templates/google-adk/web/src/useAgentChat.ts +0 -122
- package/dist/templates/google-adk/web/src/vite-env.d.ts +0 -27
- package/dist/templates/google-adk/web/tsconfig.json +0 -20
- package/dist/templates/google-adk/web/vite.config.ts +0 -12
- package/dist/templates/openai-agents-sdk/web/.env.example +0 -17
- package/dist/templates/openai-agents-sdk/web/sandbox-proxy.ts +0 -239
- package/dist/templates/openai-agents-sdk/web/src/App.tsx +0 -272
- package/dist/templates/openai-agents-sdk/web/src/main.tsx +0 -12
- package/dist/templates/openai-agents-sdk/web/src/useAgentChat.ts +0 -122
- package/dist/templates/openai-agents-sdk/web/src/vite-env.d.ts +0 -27
- package/dist/templates/openai-agents-sdk/web/tsconfig.json +0 -20
- package/dist/templates/openai-agents-sdk/web/vite.config.ts +0 -12
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.env.example +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.mcp.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/blueprints/.gitkeep +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/ggui.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/themes/.gitkeep +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/guuey.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/Dockerfile +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/package.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/src/server.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsconfig.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsup.config.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/pnpm-workspace.yaml +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/prompts/system.md +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/scripts/dev.mjs +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/agent-config.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/worker.ts +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsconfig.json +0 -0
- /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsup.config.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/.env.example +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/.mcp.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/README.md +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/blueprints/.gitkeep +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/ggui.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/themes/.gitkeep +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/guuey.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/Dockerfile +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/package.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/src/server.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsconfig.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsup.config.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/pnpm-workspace.yaml +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/prompts/system.md +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/scripts/dev.mjs +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/src/agent.ts +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/tsconfig.json +0 -0
- /package/dist/templates/{google-adk → agentic-app/google-adk}/tsup.config.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.env.example +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.mcp.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/blueprints/.gitkeep +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/ggui.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/themes/.gitkeep +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/guuey.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/Dockerfile +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/package.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/src/server.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsconfig.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsup.config.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/pnpm-workspace.yaml +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/prompts/system.md +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/scripts/dev.mjs +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/agent-config.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/worker.ts +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsconfig.json +0 -0
- /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsup.config.ts +0 -0
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The from-scratch AgJSON client for the local dev chat SPA. Talks directly
|
|
3
|
-
* to the agent's `POST /agent/invoke` endpoint (SSE response), parses each
|
|
4
|
-
* `event: session|message|done|error` / `data: <JSON>` frame off the wire,
|
|
5
|
-
* and folds `message` frames (AgJSON `AgEvent[]`) through `@silverprotocol/
|
|
6
|
-
* core`'s `Reducer` into the normative `{messages, turns, artifacts, memory}`
|
|
7
|
-
* snapshot `App.tsx` renders from.
|
|
8
|
-
*
|
|
9
|
-
* Real `@silverprotocol/core` API (verified against `core/README.md` +
|
|
10
|
-
* `core/src/reduce.ts:79`): `new Reducer()` + `reducer.push(event)` are
|
|
11
|
-
* correct, but the fold is read back via `reducer.result()` — there is no
|
|
12
|
-
* `reducer.state` accessor. `ingestAgEvents` is the library's own
|
|
13
|
-
* parse-known-else-skip validator; used here instead of an `as AgEvent[]`
|
|
14
|
-
* cast so a malformed/foreign wire object degrades to "silently skipped"
|
|
15
|
-
* rather than a runtime type lie.
|
|
16
|
-
*/
|
|
17
|
-
import { useCallback, useRef, useState } from "react";
|
|
18
|
-
import { Reducer, ingestAgEvents, type AgReduceResult, type JsonValue } from "@silverprotocol/core";
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Normalize a `VITE_*` env URL: an empty/whitespace declaration (e.g. a
|
|
22
|
-
* `VITE_X=` line copied from `.env.example`) loads as `""`, not `undefined`,
|
|
23
|
-
* which would defeat a `??` fallback — treat it as unset. Shared by this
|
|
24
|
-
* file's `AGENT_URL` and `App.tsx`'s `SANDBOX_URL` so both read sites agree.
|
|
25
|
-
*/
|
|
26
|
-
export function envUrl(value: string | undefined): string | undefined {
|
|
27
|
-
const trimmed = value?.trim();
|
|
28
|
-
return trimmed ? trimmed : undefined;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export const AGENT_URL =
|
|
32
|
-
envUrl(import.meta.env.VITE_AGENT_ENDPOINT_URL) ?? "http://localhost:6790";
|
|
33
|
-
|
|
34
|
-
/** Parse complete SSE frame blocks ("event: x\ndata: {...}") out of a growing buffer. */
|
|
35
|
-
function parseFrames(buffer: string): {
|
|
36
|
-
frames: Array<{ event: string; data: string }>;
|
|
37
|
-
rest: string;
|
|
38
|
-
} {
|
|
39
|
-
const parts = buffer.split("\n\n");
|
|
40
|
-
const rest = parts.pop() ?? "";
|
|
41
|
-
const frames = parts.map((block) => {
|
|
42
|
-
const event = /^event: (.*)$/m.exec(block)?.[1] ?? "message";
|
|
43
|
-
const data = /^data: (.*)$/m.exec(block)?.[1] ?? "";
|
|
44
|
-
return { event, data };
|
|
45
|
-
});
|
|
46
|
-
return { frames, rest };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface UseAgentChatResult {
|
|
50
|
-
/** The reducer's current folded state — fresh on every `message` frame. */
|
|
51
|
-
result: AgReduceResult;
|
|
52
|
-
/** True while a `send()` request is streaming. */
|
|
53
|
-
busy: boolean;
|
|
54
|
-
/** Last transport/agent error, or `null`. */
|
|
55
|
-
error: string | null;
|
|
56
|
-
/** True when the reducer detected a sequence gap and parked (needs a `messages.snapshot` to recover). */
|
|
57
|
-
needsResync: boolean;
|
|
58
|
-
send: (text: string) => Promise<void>;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function useAgentChat(): UseAgentChatResult {
|
|
62
|
-
const reducerRef = useRef(new Reducer());
|
|
63
|
-
// No payload — just a re-render trigger every time the mutable reducer
|
|
64
|
-
// advances, so `reducerRef.current.result()` below re-derives fresh state.
|
|
65
|
-
const [, bump] = useState(0);
|
|
66
|
-
const [busy, setBusy] = useState(false);
|
|
67
|
-
const [error, setError] = useState<string | null>(null);
|
|
68
|
-
|
|
69
|
-
const send = useCallback(async (text: string) => {
|
|
70
|
-
setBusy(true);
|
|
71
|
-
setError(null);
|
|
72
|
-
const res = await fetch(`${AGENT_URL}/agent/invoke`, {
|
|
73
|
-
method: "POST",
|
|
74
|
-
headers: { "Content-Type": "application/json" },
|
|
75
|
-
body: JSON.stringify({ input: text }),
|
|
76
|
-
});
|
|
77
|
-
if (!res.ok || !res.body) {
|
|
78
|
-
setError(`agent returned ${res.status}`);
|
|
79
|
-
setBusy(false);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
const decoder = new TextDecoder();
|
|
83
|
-
let buffer = "";
|
|
84
|
-
const reader = res.body.getReader();
|
|
85
|
-
for (;;) {
|
|
86
|
-
const { done, value } = await reader.read();
|
|
87
|
-
if (done) break;
|
|
88
|
-
buffer += decoder.decode(value, { stream: true });
|
|
89
|
-
const { frames, rest } = parseFrames(buffer);
|
|
90
|
-
buffer = rest;
|
|
91
|
-
for (const frame of frames) {
|
|
92
|
-
if (frame.event === "message") {
|
|
93
|
-
let raw: JsonValue;
|
|
94
|
-
try {
|
|
95
|
-
raw = JSON.parse(frame.data) as JsonValue;
|
|
96
|
-
} catch {
|
|
97
|
-
continue; // malformed frame — skip rather than crash the stream
|
|
98
|
-
}
|
|
99
|
-
const events = ingestAgEvents(Array.isArray(raw) ? raw : []);
|
|
100
|
-
for (const ev of events) reducerRef.current.push(ev);
|
|
101
|
-
bump((v) => v + 1);
|
|
102
|
-
} else if (frame.event === "error") {
|
|
103
|
-
try {
|
|
104
|
-
const payload = JSON.parse(frame.data) as { message?: string };
|
|
105
|
-
setError(payload.message ?? "agent error");
|
|
106
|
-
} catch {
|
|
107
|
-
setError("agent error");
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
setBusy(false);
|
|
113
|
-
}, []);
|
|
114
|
-
|
|
115
|
-
return {
|
|
116
|
-
result: reducerRef.current.result(),
|
|
117
|
-
busy,
|
|
118
|
-
error,
|
|
119
|
-
needsResync: reducerRef.current.needsResync,
|
|
120
|
-
send,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/// <reference types="vite/client" />
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Typed Vite env vars. `import.meta.env` is Vite's analog of Next.js's
|
|
5
|
-
* `process.env.NEXT_PUBLIC_*` — anything declared here is exposed to the
|
|
6
|
-
* browser bundle at build time.
|
|
7
|
-
*/
|
|
8
|
-
interface ImportMetaEnv {
|
|
9
|
-
/**
|
|
10
|
-
* The agent's base URL (e.g. `http://localhost:6790` in local dev, via
|
|
11
|
-
* `guuey dev`). Falls back to that same local-dev default when unset —
|
|
12
|
-
* see `useAgentChat.ts`.
|
|
13
|
-
*/
|
|
14
|
-
readonly VITE_AGENT_ENDPOINT_URL?: string;
|
|
15
|
-
/**
|
|
16
|
-
* Second-origin MCP-Apps sandbox page URL for `<AppRenderer>` (e.g.
|
|
17
|
-
* `https://sandbox.example.com/sandbox.html`). Optional in dev — the
|
|
18
|
-
* `sandboxProxyPlugin` in `vite.config.ts` serves one on :6891. REQUIRED
|
|
19
|
-
* for deployed builds that render UI resources: without it the app shows
|
|
20
|
-
* a plain-text notice instead (see `App.tsx` + `../sandbox-proxy.ts`).
|
|
21
|
-
*/
|
|
22
|
-
readonly VITE_SANDBOX_URL?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface ImportMeta {
|
|
26
|
-
readonly env: ImportMetaEnv;
|
|
27
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2023",
|
|
4
|
-
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
-
"useDefineForClassFields": true,
|
|
6
|
-
"allowJs": true,
|
|
7
|
-
"skipLibCheck": true,
|
|
8
|
-
"strict": true,
|
|
9
|
-
"noEmit": true,
|
|
10
|
-
"esModuleInterop": true,
|
|
11
|
-
"module": "esnext",
|
|
12
|
-
"moduleResolution": "bundler",
|
|
13
|
-
"resolveJsonModule": true,
|
|
14
|
-
"isolatedModules": true,
|
|
15
|
-
"jsx": "react-jsx",
|
|
16
|
-
"types": ["vite/client"]
|
|
17
|
-
},
|
|
18
|
-
"include": ["src", "vite.config.ts", "sandbox-proxy.ts"],
|
|
19
|
-
"exclude": ["node_modules", "dist"]
|
|
20
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from "vite";
|
|
2
|
-
import react from "@vitejs/plugin-react";
|
|
3
|
-
import { sandboxProxyPlugin } from "./sandbox-proxy";
|
|
4
|
-
|
|
5
|
-
// Port is passed via the `dev` script's `--port 6890` flag (see package.json)
|
|
6
|
-
// so it stays visible in one place; `scripts/dev.mjs` boots this on the same
|
|
7
|
-
// port. The sandbox proxy plugin serves the MCP-Apps sandbox page on :6891 —
|
|
8
|
-
// a SECOND origin, as the spec's double-iframe architecture requires (see
|
|
9
|
-
// ./sandbox-proxy.ts).
|
|
10
|
-
export default defineConfig({
|
|
11
|
-
plugins: [react(), sandboxProxyPlugin()],
|
|
12
|
-
});
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# Vite env for the web chat client. Copy to `web/.env.local` and UNCOMMENT
|
|
2
|
-
# the vars you want to override. (Vite reads env files from this directory —
|
|
3
|
-
# not the project root. Keep unused vars commented out: an empty
|
|
4
|
-
# `VITE_X=` declaration loads as "" — not undefined.)
|
|
5
|
-
|
|
6
|
-
# Agent base URL. Defaults to the local `guuey dev` router (:6790).
|
|
7
|
-
# VITE_AGENT_ENDPOINT_URL=http://localhost:6790
|
|
8
|
-
|
|
9
|
-
# Second-origin MCP-Apps sandbox page for @mcp-ui/client's <AppRenderer>.
|
|
10
|
-
# The MCP Apps spec requires UI resources to mount from a DIFFERENT origin
|
|
11
|
-
# than the app itself (double-iframe sandbox). In local dev this is served
|
|
12
|
-
# automatically on http://127.0.0.1:6891/sandbox.html by the
|
|
13
|
-
# sandboxProxyPlugin in vite.config.ts — leave unset. For a DEPLOYED build,
|
|
14
|
-
# host ../sandbox-proxy.ts's sandbox page on its own origin and point this
|
|
15
|
-
# at it; if unset in production, UI resources show a plain-text notice
|
|
16
|
-
# instead of rendering.
|
|
17
|
-
# VITE_SANDBOX_URL=https://sandbox.example.com/sandbox.html
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP-Apps sandbox proxy for local dev — a Vite plugin that serves the
|
|
3
|
-
* spec-canonical `sandbox.html` on a SECOND localhost port (:6891), i.e. a
|
|
4
|
-
* different origin from the SPA (:6890).
|
|
5
|
-
*
|
|
6
|
-
* # Why a second origin
|
|
7
|
-
*
|
|
8
|
-
* The MCP Apps spec's double-iframe sandbox architecture mandates that the
|
|
9
|
-
* host page and the sandbox iframe live on DIFFERENT origins: the host wraps
|
|
10
|
-
* the sandbox iframe, the sandbox iframe wraps the untrusted app HTML, and
|
|
11
|
-
* the origin split means a compromised app cannot reach the host's APIs via
|
|
12
|
-
* same-origin DOM access. `@mcp-ui/client`'s `<AppRenderer>` takes a
|
|
13
|
-
* `sandbox: { url }` prop pointing at this page. A different localhost PORT
|
|
14
|
-
* is a different origin, so one extra listener is all local dev needs.
|
|
15
|
-
*
|
|
16
|
-
* # Reference impl
|
|
17
|
-
*
|
|
18
|
-
* The HTML below is adapted from the spec's reference host
|
|
19
|
-
* (`github.com/modelcontextprotocol/ext-apps/examples/basic-host/` —
|
|
20
|
-
* sandbox.html + src/sandbox.ts + serve.ts), matching the pattern
|
|
21
|
-
* `@ggui-ai/agent-server`'s bundled sandbox proxy uses. CSP arrives as a
|
|
22
|
-
* `?csp=<urlencoded-json>` query param and is applied via HTTP HEADERS
|
|
23
|
-
* (tamper-proof — a `<meta>` CSP could be overridden by injected inline
|
|
24
|
-
* scripts), which is why this must be a real server, not a static file.
|
|
25
|
-
*
|
|
26
|
-
* # Deploying `web/`
|
|
27
|
-
*
|
|
28
|
-
* This plugin only runs under `vite` dev (`apply: "serve"`). A deployed
|
|
29
|
-
* build must point `VITE_SANDBOX_URL` at a hosted copy of this page on its
|
|
30
|
-
* own origin (see `.env.example`); without it the app falls back to a
|
|
31
|
-
* "UI resource received" notice instead of mounting UI same-origin.
|
|
32
|
-
*/
|
|
33
|
-
import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
|
|
34
|
-
import type { Plugin } from "vite";
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* The sandbox proxy's dev port. web/ runs on :6890; keep the `6891` literal
|
|
38
|
-
* in `src/App.tsx` (`DEV_SANDBOX_URL`) in sync — App.tsx cannot import this
|
|
39
|
-
* module (it would drag `node:http` into the browser bundle).
|
|
40
|
-
*/
|
|
41
|
-
export const SANDBOX_PROXY_PORT = 6891;
|
|
42
|
-
|
|
43
|
-
/** CSP shape `<AppRenderer>` forwards on the sandbox URL's `?csp=` param. */
|
|
44
|
-
interface McpUiResourceCsp {
|
|
45
|
-
readonly resourceDomains?: readonly string[];
|
|
46
|
-
readonly connectDomains?: readonly string[];
|
|
47
|
-
readonly frameDomains?: readonly string[];
|
|
48
|
-
readonly baseUriDomains?: readonly string[];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** Drop CSP entries carrying directive-injection characters (`;`, newlines, quotes, spaces). */
|
|
52
|
-
function sanitizeCspDomains(domains: readonly string[] | undefined): readonly string[] {
|
|
53
|
-
if (!domains) return [];
|
|
54
|
-
return domains.filter((d) => typeof d === "string" && !/[;\r\n'" ]/.test(d));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Build the CSP header value — mirrors the upstream basic-host `serve.ts`. */
|
|
58
|
-
function buildCspHeader(csp: McpUiResourceCsp | undefined): string {
|
|
59
|
-
const resourceDomains = sanitizeCspDomains(csp?.resourceDomains).join(" ");
|
|
60
|
-
const connectDomains = sanitizeCspDomains(csp?.connectDomains).join(" ");
|
|
61
|
-
const frameDomains = sanitizeCspDomains(csp?.frameDomains).join(" ");
|
|
62
|
-
const baseUriDomains = sanitizeCspDomains(csp?.baseUriDomains).join(" ");
|
|
63
|
-
return [
|
|
64
|
-
"default-src 'self' 'unsafe-inline'",
|
|
65
|
-
`script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: ${resourceDomains}`.trim(),
|
|
66
|
-
`style-src 'self' 'unsafe-inline' blob: data: ${resourceDomains}`.trim(),
|
|
67
|
-
`img-src 'self' data: blob: ${resourceDomains}`.trim(),
|
|
68
|
-
`font-src 'self' data: blob: ${resourceDomains}`.trim(),
|
|
69
|
-
`media-src 'self' data: blob: ${resourceDomains}`.trim(),
|
|
70
|
-
`connect-src 'self' ${connectDomains}`.trim(),
|
|
71
|
-
`worker-src 'self' blob: ${resourceDomains}`.trim(),
|
|
72
|
-
frameDomains.length > 0 ? `frame-src ${frameDomains}` : "frame-src 'none'",
|
|
73
|
-
"object-src 'none'",
|
|
74
|
-
baseUriDomains.length > 0 ? `base-uri ${baseUriDomains}` : "base-uri 'none'",
|
|
75
|
-
].join("; ");
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* The self-contained sandbox.html. The inlined script:
|
|
80
|
-
*
|
|
81
|
-
* 1. Asserts iframe isolation (throws if it can reach `window.top`).
|
|
82
|
-
* 2. Creates an inner iframe sandboxed with `allow-scripts
|
|
83
|
-
* allow-same-origin allow-forms`.
|
|
84
|
-
* 3. On `ui/notifications/sandbox-resource-ready` from the parent, writes
|
|
85
|
-
* the app HTML into the inner iframe.
|
|
86
|
-
* 4. Relays every other postMessage bidirectionally, origin-checked.
|
|
87
|
-
* 5. Posts `ui/notifications/sandbox-proxy-ready` once attached.
|
|
88
|
-
*/
|
|
89
|
-
const SANDBOX_HTML = `<!doctype html>
|
|
90
|
-
<html>
|
|
91
|
-
<head>
|
|
92
|
-
<meta charset="utf-8" />
|
|
93
|
-
<meta name="color-scheme" content="light dark">
|
|
94
|
-
<title>sandbox proxy</title>
|
|
95
|
-
<style>
|
|
96
|
-
html, body { margin: 0; height: 100vh; height: 100dvh; width: 100%; background-color: transparent; }
|
|
97
|
-
body { display: flex; flex-direction: column; }
|
|
98
|
-
* { box-sizing: border-box; }
|
|
99
|
-
iframe {
|
|
100
|
-
background-color: transparent;
|
|
101
|
-
border: 0px none transparent;
|
|
102
|
-
padding: 0px;
|
|
103
|
-
overflow: hidden;
|
|
104
|
-
flex-grow: 1;
|
|
105
|
-
color-scheme: inherit;
|
|
106
|
-
}
|
|
107
|
-
</style>
|
|
108
|
-
</head>
|
|
109
|
-
<body>
|
|
110
|
-
<script>
|
|
111
|
-
(function(){
|
|
112
|
-
'use strict';
|
|
113
|
-
if (window.self === window.top) {
|
|
114
|
-
throw new Error('This file is only to be used in an iframe sandbox.');
|
|
115
|
-
}
|
|
116
|
-
if (!document.referrer) {
|
|
117
|
-
throw new Error('No referrer, cannot validate embedding site.');
|
|
118
|
-
}
|
|
119
|
-
var EXPECTED_HOST_ORIGIN = new URL(document.referrer).origin;
|
|
120
|
-
var OWN_ORIGIN = new URL(window.location.href).origin;
|
|
121
|
-
// Security self-test: top access MUST throw (sandbox attribute strips same-origin).
|
|
122
|
-
try {
|
|
123
|
-
window.top.alert('If you see this, the sandbox is not setup securely.');
|
|
124
|
-
throw 'FAIL';
|
|
125
|
-
} catch (e) {
|
|
126
|
-
if (e === 'FAIL') {
|
|
127
|
-
throw new Error('The sandbox is not setup securely.');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
// Inner iframe — the untrusted app HTML lands here.
|
|
131
|
-
var inner = document.createElement('iframe');
|
|
132
|
-
inner.style = 'width:100%; height:100%; border:none;';
|
|
133
|
-
inner.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms');
|
|
134
|
-
document.body.appendChild(inner);
|
|
135
|
-
var RESOURCE_READY = 'ui/notifications/sandbox-resource-ready';
|
|
136
|
-
var PROXY_READY = 'ui/notifications/sandbox-proxy-ready';
|
|
137
|
-
window.addEventListener('message', function(event) {
|
|
138
|
-
if (event.source === window.parent) {
|
|
139
|
-
if (event.origin !== EXPECTED_HOST_ORIGIN) {
|
|
140
|
-
console.error('[Sandbox] Rejecting parent message from unexpected origin:', event.origin);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (event.data && event.data.method === RESOURCE_READY) {
|
|
144
|
-
var params = event.data.params || {};
|
|
145
|
-
var html = params.html;
|
|
146
|
-
var sandboxAttr = params.sandbox;
|
|
147
|
-
if (typeof sandboxAttr === 'string') {
|
|
148
|
-
inner.setAttribute('sandbox', sandboxAttr);
|
|
149
|
-
}
|
|
150
|
-
if (typeof html === 'string') {
|
|
151
|
-
var doc = inner.contentDocument || (inner.contentWindow && inner.contentWindow.document);
|
|
152
|
-
if (doc) {
|
|
153
|
-
doc.open();
|
|
154
|
-
doc.write(html);
|
|
155
|
-
doc.close();
|
|
156
|
-
} else {
|
|
157
|
-
inner.srcdoc = html;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
} else {
|
|
161
|
-
if (inner && inner.contentWindow) {
|
|
162
|
-
inner.contentWindow.postMessage(event.data, '*');
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
} else if (event.source === inner.contentWindow) {
|
|
166
|
-
if (event.origin !== OWN_ORIGIN) {
|
|
167
|
-
console.error('[Sandbox] Rejecting inner message from unexpected origin:', event.origin);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
window.parent.postMessage(event.data, EXPECTED_HOST_ORIGIN);
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
window.parent.postMessage({
|
|
174
|
-
jsonrpc: '2.0',
|
|
175
|
-
method: PROXY_READY,
|
|
176
|
-
params: {},
|
|
177
|
-
}, EXPECTED_HOST_ORIGIN);
|
|
178
|
-
})();
|
|
179
|
-
</script>
|
|
180
|
-
</body>
|
|
181
|
-
</html>`;
|
|
182
|
-
|
|
183
|
-
function handleRequest(req: IncomingMessage, res: ServerResponse): void {
|
|
184
|
-
const url = new URL(req.url ?? "/", "http://placeholder");
|
|
185
|
-
if (req.method === "GET" && (url.pathname === "/" || url.pathname === "/sandbox.html")) {
|
|
186
|
-
let csp: McpUiResourceCsp | undefined;
|
|
187
|
-
const cspParam = url.searchParams.get("csp");
|
|
188
|
-
if (cspParam !== null) {
|
|
189
|
-
try {
|
|
190
|
-
const parsed: unknown = JSON.parse(cspParam);
|
|
191
|
-
if (parsed !== null && typeof parsed === "object") {
|
|
192
|
-
csp = parsed as McpUiResourceCsp;
|
|
193
|
-
}
|
|
194
|
-
} catch {
|
|
195
|
-
// Malformed ?csp= — fall through to the default (self-only) header;
|
|
196
|
-
// an app loading external resources will surface a CSP violation in
|
|
197
|
-
// the console rather than silently widening the policy.
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
res.setHeader("Content-Security-Policy", buildCspHeader(csp));
|
|
201
|
-
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
|
202
|
-
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
203
|
-
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
204
|
-
res.statusCode = 200;
|
|
205
|
-
res.end(SANDBOX_HTML);
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
res.statusCode = 404;
|
|
209
|
-
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
210
|
-
res.end("sandbox proxy: only GET /sandbox.html is served here\n");
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Vite plugin: boot the sandbox proxy alongside `vite` dev, tear it down
|
|
215
|
-
* with it. Dev-only (`apply: "serve"`); deployed builds set
|
|
216
|
-
* `VITE_SANDBOX_URL` instead.
|
|
217
|
-
*/
|
|
218
|
-
export function sandboxProxyPlugin(): Plugin {
|
|
219
|
-
let server: Server | undefined;
|
|
220
|
-
return {
|
|
221
|
-
name: "agentic-app-template:mcp-apps-sandbox-proxy",
|
|
222
|
-
apply: "serve",
|
|
223
|
-
configureServer(vite) {
|
|
224
|
-
server = createServer(handleRequest);
|
|
225
|
-
server.on("error", (err) => {
|
|
226
|
-
vite.config.logger.error(`[sandbox-proxy] ${String(err)}`);
|
|
227
|
-
});
|
|
228
|
-
server.listen(SANDBOX_PROXY_PORT, "127.0.0.1", () => {
|
|
229
|
-
vite.config.logger.info(
|
|
230
|
-
` sandbox proxy: http://127.0.0.1:${SANDBOX_PROXY_PORT}/sandbox.html`
|
|
231
|
-
);
|
|
232
|
-
});
|
|
233
|
-
vite.httpServer?.on("close", () => {
|
|
234
|
-
server?.close();
|
|
235
|
-
server = undefined;
|
|
236
|
-
});
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
}
|