@guuey/create-agentic-app 0.9.0 → 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
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# agentic-app-template
|
|
2
|
+
|
|
3
|
+
A guuey agentic app: a code-mode agent, a custom MCP server you can copy to
|
|
4
|
+
add your own tools, and a `ggui` config for generative UI — all runnable
|
|
5
|
+
locally with one command, and deployable to guuey with one more.
|
|
6
|
+
|
|
7
|
+
## What got scaffolded
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
.
|
|
11
|
+
├── guuey.json # the deploy contract: agent framework/model, system prompt,
|
|
12
|
+
│ # mcpServers (name → colocated source + devPort), ggui config
|
|
13
|
+
├── package.json # agent deps + the pnpm workspace root (workspaces: mcps/*, web)
|
|
14
|
+
├── src/worker.ts # your agent code (code-mode worker); build emits ./guuey.worker.js
|
|
15
|
+
├── prompts/system.md # system prompt, referenced from guuey.json#agent.systemPrompt.file
|
|
16
|
+
├── mcps/todo/ # the "copy-me" custom MCP server — @modelcontextprotocol/sdk,
|
|
17
|
+
│ # Streamable HTTP, in-memory todo list, port :6782
|
|
18
|
+
├── ggui/ # ggui.json + blueprints/ + themes/ — generative-UI config.
|
|
19
|
+
│ # `ggui serve` runs against this locally; it's pushed to your
|
|
20
|
+
│ # deployed app's guuey-managed ggui instance on `guuey deploy`.
|
|
21
|
+
├── web/ # the product frontend (Vite + React on @guuey/chat):
|
|
22
|
+
│ # landing (widget) · login (guest + BYO-OIDC seam) · home
|
|
23
|
+
│ # (status + distribution guide) · the chat surface
|
|
24
|
+
├── guuey.app.json # frontend/brand config — written by `pnpm bootstrap`
|
|
25
|
+
│ # (schema: guuey.app.schema.json; public-safe by design)
|
|
26
|
+
├── AGENTS.md # coding-agent steering; `pnpm bootstrap` maintains the
|
|
27
|
+
│ # managed block with this project's real facts
|
|
28
|
+
├── scripts/dev.mjs # `pnpm dev` orchestrator — boots the whole local stack
|
|
29
|
+
├── scripts/bootstrap.mjs # `pnpm bootstrap` — configure, then `-- --link` to bind
|
|
30
|
+
├── .env.example # ANTHROPIC_API_KEY / OPENAI_API_KEY for local dev
|
|
31
|
+
└── .mcp.json # Claude Code convenience wiring (mcp.ggui.ai/dev)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The project root **is** the agent package — `guuey deploy` packs this directory
|
|
35
|
+
directly as the deploy tarball, so `guuey.json` and `src/worker.ts` live at the top
|
|
36
|
+
level rather than nested under a `servers/` or `apps/` folder.
|
|
37
|
+
|
|
38
|
+
## Quick start
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pnpm install
|
|
42
|
+
pnpm bootstrap # brand, theme, copy → guuey.app.json + AGENTS.md (no account needed;
|
|
43
|
+
# every web page is gated on this, and production builds fail without it)
|
|
44
|
+
cp .env.example .env.local # done automatically on scaffold if .env.local is absent
|
|
45
|
+
# set ANTHROPIC_API_KEY (or OPENAI_API_KEY, for the openai-agents-sdk template) in .env.local
|
|
46
|
+
pnpm dev
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
When the agent is deployed (`guuey login && guuey deploy`), bind it into the
|
|
50
|
+
frontend: `pnpm bootstrap -- --link` — that records the app id, endpoint,
|
|
51
|
+
widget origin and portal link in `guuey.app.json` and pushes brand basics to
|
|
52
|
+
the platform. `pnpm status` shows the live app state; `pnpm bootstrap -- --check`
|
|
53
|
+
prints machine-readable configuration state.
|
|
54
|
+
|
|
55
|
+
`pnpm dev` (`scripts/dev.mjs`) boots four processes with prefixed, interleaved
|
|
56
|
+
logs. Ctrl-C tears all of them down together.
|
|
57
|
+
|
|
58
|
+
| process | port | what |
|
|
59
|
+
| ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
60
|
+
| `worker` | — | `tsup --watch` — rebuilds `guuey.worker.js` on every save |
|
|
61
|
+
| `guuey dev` | :6790 | local router: spawns your worker per turn, streams SSE; auto-spawns every `colocated` MCP entry — `mcps/todo` lands on its `devPort` :6782 |
|
|
62
|
+
| `ggui serve` | :6781 | local generative-UI server, over `ggui/` |
|
|
63
|
+
| `web` | :6890 | the product frontend (landing/login/home/chat on @guuey/chat) |
|
|
64
|
+
|
|
65
|
+
The todo MCP still answers on :6782 — it's just a supervised child of
|
|
66
|
+
`guuey dev` now (copy `mcps/todo/` to add your own server; new `colocated`
|
|
67
|
+
entries in `guuey.json` are auto-spawned the same way).
|
|
68
|
+
|
|
69
|
+
> **If a server's deps carry build scripts** (the classic: `tsx` → esbuild's
|
|
70
|
+
> platform-binary fetch), pnpm ≥11 refuses to run them on a fresh install —
|
|
71
|
+
> `ERR_PNPM_IGNORED_BUILDS` — and the server never boots. Approve the
|
|
72
|
+
> specific packages declaratively in the workspace-root `package.json` (or
|
|
73
|
+
> the server's own, for a standalone install):
|
|
74
|
+
> `"pnpm": { "onlyBuiltDependencies": ["esbuild"] }`. This scaffold ships
|
|
75
|
+
> the approval already; add to the list when a new dep needs its build step.
|
|
76
|
+
> Don't disable the gate wholesale — it's pnpm's supply-chain protection.
|
|
77
|
+
|
|
78
|
+
Open http://localhost:6890 to chat with your agent locally.
|
|
79
|
+
|
|
80
|
+
## Local dev vs. deployed — what's different
|
|
81
|
+
|
|
82
|
+
`guuey dev` is the open, local equivalent of the pod router that runs your
|
|
83
|
+
worker in production. It mirrors the real spawn/stream contract closely — the
|
|
84
|
+
same normalizer, the same SSE shape — but it deliberately cuts three corners:
|
|
85
|
+
two that only matter once real users and real money are involved, and one
|
|
86
|
+
you should read twice:
|
|
87
|
+
|
|
88
|
+
- **No sandboxing — read this one twice.** Locally your worker runs as a
|
|
89
|
+
plain child process: no `bwrap`/gVisor isolation on any platform, it
|
|
90
|
+
inherits your **full shell environment** (every variable, including
|
|
91
|
+
credentials unrelated to this agent), and when filesystem layers are
|
|
92
|
+
bound the host grants the agent shell and file tools **without
|
|
93
|
+
prompting** (the production jail those tools assume does not exist
|
|
94
|
+
locally). Net: `guuey dev` runs an LLM-driven agent with unprompted
|
|
95
|
+
shell access as you, with your env. That's a deliberate dev-trust
|
|
96
|
+
posture, not an accident — treat the agent like any script you'd run
|
|
97
|
+
from the internet: run `guuey dev` in a throwaway shell/container with
|
|
98
|
+
a minimal environment if your agent (or any MCP server it talks to)
|
|
99
|
+
handles untrusted input. In production every invocation runs inside a
|
|
100
|
+
gVisor-isolated pod with only its declared environment.
|
|
101
|
+
- **Permissive auth.** `ggui serve --dev-allow-all` accepts any bearer
|
|
102
|
+
locally. The deployed ggui instance enforces real auth.
|
|
103
|
+
- **No metering or history.** Local runs aren't billed and aren't persisted.
|
|
104
|
+
Deployed conversations are metered and their history is written to
|
|
105
|
+
DynamoDB so users can resume a thread.
|
|
106
|
+
|
|
107
|
+
None of this changes your code — `guuey.json` is the same file in both
|
|
108
|
+
worlds; only how it's resolved differs. Locally, `guuey dev` auto-spawns each
|
|
109
|
+
`colocated` entry on its `devPort` and points the agent at
|
|
110
|
+
`localhost:<devPort>`; deployed, the same server code runs as a supervised
|
|
111
|
+
child inside your agent's pod, reached over the pod's loopback with a
|
|
112
|
+
per-request federated identity. (`hosted` entries deploy to the platform's
|
|
113
|
+
federated URLs; locally they need a `devPort` pointing at a server you run
|
|
114
|
+
yourself, or they're skipped with a warning.)
|
|
115
|
+
|
|
116
|
+
## Deploying
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
guuey login # device-flow auth; stores a token in ~/.guuey/auth.json
|
|
120
|
+
guuey deploy # ships everything
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`guuey deploy` runs four legs, in order, so a hard failure aborts before
|
|
124
|
+
anything user-visible changes:
|
|
125
|
+
|
|
126
|
+
1. **MCP leg** — deploys each `hosted` entry under `guuey.json#agent.mcpServers`
|
|
127
|
+
as its own hosted MCP server (build → deploy → registry), then writes the
|
|
128
|
+
resulting server id back into `guuey.json`. This scaffold has none — the
|
|
129
|
+
todo MCP is `colocated`, so this leg is a no-op here.
|
|
130
|
+
2. **ggui asset leg** — pushes `ggui/` (ggui.json, blueprints, themes) to your
|
|
131
|
+
app's guuey-managed ggui instance.
|
|
132
|
+
3. **Agent leg** — builds `src/worker.ts` into `guuey.worker.js`, packs the
|
|
133
|
+
project root (including `mcps/`), and deploys it as a gVisor-isolated,
|
|
134
|
+
scale-to-zero pod. Each `colocated` entry (e.g. `mcps/todo`) is built into
|
|
135
|
+
the worker image and auto-spawned as a supervised, sandboxed child at pod
|
|
136
|
+
boot — no separate server, registry row, or write-back.
|
|
137
|
+
4. **Output** — prints your agent's endpoint URL and a Portal deep link.
|
|
138
|
+
|
|
139
|
+
Re-running `guuey deploy` converges: unchanged pieces are skipped or reused,
|
|
140
|
+
nothing is duplicated.
|
|
141
|
+
|
|
142
|
+
## Filesystem + memory
|
|
143
|
+
|
|
144
|
+
Every deployed invoke gets three bound directories — `$GUUEY_HOME_DIR`
|
|
145
|
+
(durable, per-user), `$GUUEY_APP_DIR` (read-only, shared), and cwd (session
|
|
146
|
+
scratch) — plain `node:fs`, no wrapper API required. Signed-in users get
|
|
147
|
+
durable cross-session memory for free (a platform-owned prompt tells the
|
|
148
|
+
model to read/write `$GUUEY_HOME_DIR/memories/MEMORY.md`); guests never get
|
|
149
|
+
durable storage, by design. **This recall is `claude-agent-sdk`-only today**
|
|
150
|
+
— openai-agents-sdk and google-adk agents get the three bound directories
|
|
151
|
+
but not the automatic memory-file recall; all-framework support arrives
|
|
152
|
+
with guuey's own memory MCP (a platform tool every framework can call over
|
|
153
|
+
its existing MCP channel). Framework-native memory backends (e.g. ADK's
|
|
154
|
+
Vertex MemoryBank) are unsupported on Guuey — they'd store user data
|
|
155
|
+
outside guuey's deletion boundary. Full contract, code examples, and
|
|
156
|
+
rollout status: the "Your agent's filesystem" section of the guuey
|
|
157
|
+
monorepo's `docs/quickstart.md`, or
|
|
158
|
+
[`@guuey/fs`](https://www.npmjs.com/package/@guuey/fs)'s own README — an
|
|
159
|
+
optional, three-helper sugar layer over the same paths.
|
|
160
|
+
|
|
161
|
+
## How people talk to your agent
|
|
162
|
+
|
|
163
|
+
- **guuey Portal** — a Telegram-like agent App Store and universal chat
|
|
164
|
+
client. Once deployed, your agent is reachable from Portal with **zero
|
|
165
|
+
frontend code** — most builders never need to touch `web/` at all.
|
|
166
|
+
- **`web/`** — ships anyway, because the local dev loop needs a chat surface,
|
|
167
|
+
and it's a worked example of the bring-your-own-frontend path if you want
|
|
168
|
+
to embed your agent somewhere Portal doesn't reach.
|
|
169
|
+
- **Future: guuey widgets** — an embeddable web-chat widget for dropping
|
|
170
|
+
your agent into an existing site is planned as a separate feature; `web/`
|
|
171
|
+
is designed to make that graduation straightforward when it lands.
|
|
File without changes
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1",
|
|
3
|
+
"protocol": "draft-2026-06-12",
|
|
4
|
+
"app": {
|
|
5
|
+
"slug": "agentic-app-template",
|
|
6
|
+
"name": "agentic-app-template"
|
|
7
|
+
},
|
|
8
|
+
"generation": {
|
|
9
|
+
"model": "anthropic:claude-haiku-4-5-20251001"
|
|
10
|
+
},
|
|
11
|
+
"theme": {
|
|
12
|
+
"preset": "indigo",
|
|
13
|
+
"mode": "dark"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./guuey.app.schema.json",
|
|
3
|
+
"schema": 1,
|
|
4
|
+
"bootstrapped": false,
|
|
5
|
+
"brand": {
|
|
6
|
+
"name": "agentic-app-template",
|
|
7
|
+
"tagline": "An agentic app built on guuey",
|
|
8
|
+
"logoText": "AA"
|
|
9
|
+
},
|
|
10
|
+
"theme": {
|
|
11
|
+
"accent": "#6c5ce7",
|
|
12
|
+
"mode": "light"
|
|
13
|
+
},
|
|
14
|
+
"copy": {
|
|
15
|
+
"landing": {
|
|
16
|
+
"headline": "Ask anything.",
|
|
17
|
+
"sub": "This site has an agent. Open the chat, or use the launcher in the corner."
|
|
18
|
+
},
|
|
19
|
+
"login": {
|
|
20
|
+
"guestHint": "One click, no account — this browser gets its own private thread the agent remembers."
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"auth": {
|
|
24
|
+
"oidc": null
|
|
25
|
+
},
|
|
26
|
+
"link": null,
|
|
27
|
+
"demoMode": false
|
|
28
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "guuey.app.json",
|
|
4
|
+
"description": "App-level configuration for this guuey agentic app. Written by `pnpm bootstrap`; safe to hand-edit. Public-safe by construction: nothing in this file is a secret (the appId ships in page HTML by design).",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schema", "bootstrapped", "brand", "theme", "copy", "auth", "link", "demoMode"],
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "type": "string" },
|
|
10
|
+
"schema": { "const": 1 },
|
|
11
|
+
"bootstrapped": {
|
|
12
|
+
"type": "boolean",
|
|
13
|
+
"description": "Flipped true by `pnpm bootstrap`. Dev renders a setup screen until then; production builds fail."
|
|
14
|
+
},
|
|
15
|
+
"brand": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"required": ["name", "tagline", "logoText"],
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"properties": {
|
|
20
|
+
"name": { "type": "string", "minLength": 1 },
|
|
21
|
+
"tagline": { "type": "string" },
|
|
22
|
+
"logoText": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"maxLength": 4,
|
|
25
|
+
"description": "1-4 characters shown in the square brand mark."
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"theme": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"required": ["accent", "mode"],
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"properties": {
|
|
34
|
+
"accent": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
|
|
35
|
+
"mode": { "enum": ["light", "dark"] }
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"copy": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"required": ["landing", "login"],
|
|
41
|
+
"additionalProperties": false,
|
|
42
|
+
"properties": {
|
|
43
|
+
"landing": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"required": ["headline", "sub"],
|
|
46
|
+
"additionalProperties": false,
|
|
47
|
+
"properties": {
|
|
48
|
+
"headline": { "type": "string" },
|
|
49
|
+
"sub": { "type": "string" }
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"login": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"required": ["guestHint"],
|
|
55
|
+
"additionalProperties": false,
|
|
56
|
+
"properties": {
|
|
57
|
+
"guestHint": { "type": "string" }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"auth": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"required": ["oidc"],
|
|
65
|
+
"additionalProperties": false,
|
|
66
|
+
"properties": {
|
|
67
|
+
"oidc": {
|
|
68
|
+
"description": "BYO-OIDC sign-in. null = guest-only. When set, the bound guuey app must be in BYO auth mode for the same issuer: `guuey apps update <appId> --auth-mode byo --issuer-url <issuer> --audience <clientId>`.",
|
|
69
|
+
"oneOf": [
|
|
70
|
+
{ "type": "null" },
|
|
71
|
+
{
|
|
72
|
+
"type": "object",
|
|
73
|
+
"required": ["issuer", "clientId"],
|
|
74
|
+
"additionalProperties": false,
|
|
75
|
+
"properties": {
|
|
76
|
+
"issuer": { "type": "string", "format": "uri" },
|
|
77
|
+
"clientId": { "type": "string", "minLength": 1 }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"link": {
|
|
85
|
+
"description": "The bound guuey app. null until `pnpm bootstrap -- --link`. Every value here is read back from the platform, never derived by hand.",
|
|
86
|
+
"oneOf": [
|
|
87
|
+
{ "type": "null" },
|
|
88
|
+
{
|
|
89
|
+
"type": "object",
|
|
90
|
+
"required": [
|
|
91
|
+
"appId",
|
|
92
|
+
"env",
|
|
93
|
+
"apiBaseUrl",
|
|
94
|
+
"endpointUrl",
|
|
95
|
+
"widgetOrigin",
|
|
96
|
+
"portalUrl",
|
|
97
|
+
"slug",
|
|
98
|
+
"pageUrl"
|
|
99
|
+
],
|
|
100
|
+
"additionalProperties": false,
|
|
101
|
+
"properties": {
|
|
102
|
+
"appId": { "type": "string", "minLength": 1 },
|
|
103
|
+
"env": { "enum": ["dev", "staging", "release"] },
|
|
104
|
+
"apiBaseUrl": { "type": "string", "format": "uri" },
|
|
105
|
+
"endpointUrl": { "type": "string", "format": "uri" },
|
|
106
|
+
"widgetOrigin": { "type": "string", "format": "uri" },
|
|
107
|
+
"portalUrl": { "type": "string", "format": "uri" },
|
|
108
|
+
"slug": { "oneOf": [{ "type": "string" }, { "type": "null" }] },
|
|
109
|
+
"pageUrl": { "oneOf": [{ "type": "string", "format": "uri" }, { "type": "null" }] }
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
"demoMode": {
|
|
115
|
+
"type": "boolean",
|
|
116
|
+
"description": "Renders the demo chrome (banner + fictional-product honesty strip). Off in every customer clone."
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "1",
|
|
3
|
+
"worker": "worker.js",
|
|
4
|
+
"agent": {
|
|
5
|
+
"mode": "code",
|
|
6
|
+
"framework": "openai-agents-sdk",
|
|
7
|
+
"model": "gpt-5.6-terra",
|
|
8
|
+
"systemPrompt": {
|
|
9
|
+
"file": "prompts/system.md"
|
|
10
|
+
},
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"todo": {
|
|
13
|
+
"kind": "colocated",
|
|
14
|
+
"source": "./mcps/todo",
|
|
15
|
+
"devPort": 6782
|
|
16
|
+
},
|
|
17
|
+
"ggui": {
|
|
18
|
+
"kind": "external",
|
|
19
|
+
"url": "https://mcp.ggui.ai",
|
|
20
|
+
"transport": "http"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"ggui": {
|
|
25
|
+
"configFile": "./ggui/ggui.json"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# todo-mcp — guuey hosted MCP server image.
|
|
2
|
+
#
|
|
3
|
+
# Self-sufficient multi-stage build: `guuey mcp deploy` packs this directory
|
|
4
|
+
# into a tarball and hands it straight to the builder with no external
|
|
5
|
+
# pre-build step and no build args — this Dockerfile installs its own deps
|
|
6
|
+
# and builds itself. (Different from guuey's own first-party MCP servers,
|
|
7
|
+
# which use a "copy-prebuilt" pattern that expects `dist/` + `node_modules/`
|
|
8
|
+
# to already exist before `docker build` runs — that pattern does not apply
|
|
9
|
+
# to a standalone project like this one.)
|
|
10
|
+
#
|
|
11
|
+
# Build + run locally:
|
|
12
|
+
#
|
|
13
|
+
# docker build -t todo-mcp .
|
|
14
|
+
# docker run -p 8080:8080 todo-mcp
|
|
15
|
+
# curl http://localhost:8080/health
|
|
16
|
+
#
|
|
17
|
+
# Deploy to guuey:
|
|
18
|
+
#
|
|
19
|
+
# cd mcps/todo && guuey mcp deploy
|
|
20
|
+
|
|
21
|
+
FROM node:22-slim AS build
|
|
22
|
+
WORKDIR /app
|
|
23
|
+
COPY package.json ./
|
|
24
|
+
RUN npm install
|
|
25
|
+
COPY tsconfig.json ./
|
|
26
|
+
COPY src ./src
|
|
27
|
+
RUN npm run build
|
|
28
|
+
|
|
29
|
+
FROM node:22-slim
|
|
30
|
+
WORKDIR /app
|
|
31
|
+
ENV NODE_ENV=production
|
|
32
|
+
# guuey's hosted-MCP runtime injects PORT=8080 and probes GET /health at that
|
|
33
|
+
# port — this default matches so `docker run` alone also works.
|
|
34
|
+
ENV PORT=8080
|
|
35
|
+
|
|
36
|
+
COPY package.json ./
|
|
37
|
+
RUN npm install --omit=dev
|
|
38
|
+
COPY --from=build /app/dist ./dist
|
|
39
|
+
|
|
40
|
+
USER node
|
|
41
|
+
EXPOSE 8080
|
|
42
|
+
|
|
43
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
44
|
+
CMD node -e "fetch('http://localhost:' + (process.env.PORT || 8080) + '/health').then(r => { if (!r.ok) throw 1 }).catch(() => process.exit(1))"
|
|
45
|
+
|
|
46
|
+
CMD ["node", "dist/server.js"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentic-app-template/todo-mcp",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "tsx src/server.ts",
|
|
8
|
+
"build": "tsup",
|
|
9
|
+
"start": "node dist/server.js",
|
|
10
|
+
"typecheck": "tsc --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
14
|
+
"zod": "^4.0.0"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@types/node": "^22.0.0",
|
|
18
|
+
"tsx": "^4.19.0",
|
|
19
|
+
"tsup": "^8.5.0",
|
|
20
|
+
"typescript": "^5.8.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* todo-mcp — the copy-me example MCP server for @agentic-app-template.
|
|
3
|
+
*
|
|
4
|
+
* A minimal, stateless Streamable HTTP MCP server: four tools over an
|
|
5
|
+
* in-memory todo list. Swap the `Map` for a real database when you outgrow
|
|
6
|
+
* a single replica; everything else (transport wiring, tool shape) stays
|
|
7
|
+
* the same.
|
|
8
|
+
*
|
|
9
|
+
* Transport pattern mirrors guuey's canonical hosted-MCP scaffold
|
|
10
|
+
* (`mcp-servers/_template` in the guuey monorepo): a fresh `McpServer` +
|
|
11
|
+
* `StreamableHTTPServerTransport` are created **per request** and torn down
|
|
12
|
+
* when the response closes. Stateless mode — the guuey proxy (and, locally,
|
|
13
|
+
* whatever MCP client you point at this server) handles sessions, so this
|
|
14
|
+
* server never keeps request state around between calls.
|
|
15
|
+
*
|
|
16
|
+
* Runtime contract when deployed via `guuey mcp deploy` (see mcps/todo's
|
|
17
|
+
* Dockerfile): the platform injects `PORT=8080` and probes `GET /health`
|
|
18
|
+
* for both liveness and readiness. Locally, `pnpm dev` runs this on
|
|
19
|
+
* `PORT=6782` (see ../../scripts/dev.mjs).
|
|
20
|
+
*/
|
|
21
|
+
import { createServer, type IncomingMessage, type ServerResponse } from "node:http";
|
|
22
|
+
import { randomUUID } from "node:crypto";
|
|
23
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
24
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
|
|
27
|
+
interface Todo {
|
|
28
|
+
id: string;
|
|
29
|
+
title: string;
|
|
30
|
+
done: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const todos = new Map<string, Todo>();
|
|
34
|
+
|
|
35
|
+
const todoShape = {
|
|
36
|
+
id: z.string(),
|
|
37
|
+
title: z.string(),
|
|
38
|
+
done: z.boolean(),
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/** Wrap a structured result as both `structuredContent` and a text block. */
|
|
42
|
+
function toolResult(data: Record<string, unknown>) {
|
|
43
|
+
return {
|
|
44
|
+
structuredContent: data,
|
|
45
|
+
content: [{ type: "text" as const, text: JSON.stringify(data) }],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function buildMcpServer(): McpServer {
|
|
50
|
+
const server = new McpServer({
|
|
51
|
+
name: "todo-mcp",
|
|
52
|
+
version: "0.0.0",
|
|
53
|
+
description: "Create, list, toggle, and delete todos.",
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
server.registerTool(
|
|
57
|
+
"todo_list",
|
|
58
|
+
{
|
|
59
|
+
title: "List todos",
|
|
60
|
+
description: "List every todo, in creation order.",
|
|
61
|
+
inputSchema: {},
|
|
62
|
+
outputSchema: { todos: z.array(z.object(todoShape)) },
|
|
63
|
+
},
|
|
64
|
+
async () => toolResult({ todos: [...todos.values()] }),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
server.registerTool(
|
|
68
|
+
"todo_create",
|
|
69
|
+
{
|
|
70
|
+
title: "Create todo",
|
|
71
|
+
description: "Create a new todo item.",
|
|
72
|
+
inputSchema: { title: z.string().min(1).describe("Todo title.") },
|
|
73
|
+
outputSchema: todoShape,
|
|
74
|
+
},
|
|
75
|
+
async ({ title }) => {
|
|
76
|
+
const todo: Todo = { id: randomUUID(), title, done: false };
|
|
77
|
+
todos.set(todo.id, todo);
|
|
78
|
+
// Spread into a fresh object literal — `toolResult` takes
|
|
79
|
+
// `Record<string, unknown>`, and a named interface like `Todo` isn't
|
|
80
|
+
// structurally assignable to that without an (unwanted) index
|
|
81
|
+
// signature of its own; a fresh literal is.
|
|
82
|
+
return toolResult({ ...todo });
|
|
83
|
+
},
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
server.registerTool(
|
|
87
|
+
"todo_toggle",
|
|
88
|
+
{
|
|
89
|
+
title: "Toggle todo",
|
|
90
|
+
description: "Flip a todo's done state.",
|
|
91
|
+
inputSchema: { id: z.string().describe("Todo id.") },
|
|
92
|
+
outputSchema: todoShape,
|
|
93
|
+
},
|
|
94
|
+
async ({ id }) => {
|
|
95
|
+
const todo = todos.get(id);
|
|
96
|
+
if (!todo) throw new Error(`todo not found: ${id}`);
|
|
97
|
+
todo.done = !todo.done;
|
|
98
|
+
return toolResult({ ...todo }); // fresh literal — see the create() comment above
|
|
99
|
+
},
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
server.registerTool(
|
|
103
|
+
"todo_delete",
|
|
104
|
+
{
|
|
105
|
+
title: "Delete todo",
|
|
106
|
+
description: "Delete a todo by id.",
|
|
107
|
+
inputSchema: { id: z.string().describe("Todo id.") },
|
|
108
|
+
outputSchema: { id: z.string(), deleted: z.boolean() },
|
|
109
|
+
},
|
|
110
|
+
async ({ id }) => {
|
|
111
|
+
const deleted = todos.delete(id);
|
|
112
|
+
return toolResult({ id, deleted });
|
|
113
|
+
},
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
return server;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const PORT = Number(process.env.PORT ?? 6782);
|
|
120
|
+
|
|
121
|
+
const httpServer = createServer(async (req: IncomingMessage, res: ServerResponse) => {
|
|
122
|
+
if (req.method === "GET" && req.url === "/health") {
|
|
123
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
124
|
+
res.end(JSON.stringify({ status: "ok", server: "todo-mcp", version: "0.0.0" }));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (req.url !== "/mcp") {
|
|
129
|
+
res.writeHead(404, { "content-type": "application/json" }).end(
|
|
130
|
+
JSON.stringify({ error: "not found" }),
|
|
131
|
+
);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Fresh server + transport per request (stateless mode) — see module doc.
|
|
136
|
+
const mcp = buildMcpServer();
|
|
137
|
+
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
138
|
+
|
|
139
|
+
res.on("close", () => {
|
|
140
|
+
transport.close().catch(() => undefined);
|
|
141
|
+
mcp.close().catch(() => undefined);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
await mcp.connect(transport);
|
|
146
|
+
await transport.handleRequest(req, res);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
console.error("mcp_handle_failed", err);
|
|
149
|
+
if (!res.headersSent) {
|
|
150
|
+
res.writeHead(500, { "content-type": "application/json" });
|
|
151
|
+
res.end(
|
|
152
|
+
JSON.stringify({
|
|
153
|
+
jsonrpc: "2.0",
|
|
154
|
+
error: { code: -32603, message: "Internal server error" },
|
|
155
|
+
id: null,
|
|
156
|
+
}),
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
httpServer.listen(PORT, () => {
|
|
163
|
+
console.log(`todo-mcp listening on :${PORT}`);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
function shutdown(signal: string): void {
|
|
167
|
+
console.log(`${signal} received — shutting down`);
|
|
168
|
+
httpServer.close(() => process.exit(0));
|
|
169
|
+
// Force-exit if connections don't drain in time.
|
|
170
|
+
setTimeout(() => process.exit(1), 10_000).unref();
|
|
171
|
+
}
|
|
172
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
173
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2023",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"outDir": "dist",
|
|
10
|
+
"rootDir": "src",
|
|
11
|
+
"resolveJsonModule": true
|
|
12
|
+
},
|
|
13
|
+
"include": ["src/**/*"],
|
|
14
|
+
"exclude": ["node_modules", "dist"]
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineConfig } from 'tsup';
|
|
2
|
+
|
|
3
|
+
// Self-contained ON PURPOSE — do not delete this file. Without a local
|
|
4
|
+
// config, tsup's upward config discovery finds the scaffold ROOT
|
|
5
|
+
// tsup.config.ts; its bundled form imports 'tsup' from the scaffold root,
|
|
6
|
+
// which the platform image build deliberately leaves un-installed when the
|
|
7
|
+
// bundled guuey.worker.js skips the root install — every colocated build
|
|
8
|
+
// then dies with ERR_MODULE_NOT_FOUND (guuey#19). A config here stops the
|
|
9
|
+
// walk; `defineConfig` resolves from this package's own devDependencies.
|
|
10
|
+
export default defineConfig({
|
|
11
|
+
entry: ['src/server.ts'],
|
|
12
|
+
format: 'esm',
|
|
13
|
+
outDir: 'dist',
|
|
14
|
+
});
|