@guuey/create-agentic-app 0.9.0 → 0.11.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.
Files changed (319) hide show
  1. package/README.md +22 -2
  2. package/dist/{chunk-JD4RAKEG.js → chunk-5V2IFXD4.js} +96 -21
  3. package/dist/cli.cjs +145 -17
  4. package/dist/cli.js +60 -5
  5. package/dist/index.cjs +97 -21
  6. package/dist/index.d.cts +33 -2
  7. package/dist/index.d.ts +33 -2
  8. package/dist/index.js +3 -1
  9. package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/AGENTS.md +2 -2
  10. package/dist/templates/{openai-agents-sdk → agentic-app/claude-agent-sdk}/README.md +23 -7
  11. package/dist/templates/agentic-app/claude-agent-sdk/gitignore +5 -0
  12. package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.json +28 -0
  13. package/dist/templates/agentic-app/claude-agent-sdk/guuey.app.schema.json +119 -0
  14. package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/package.json +6 -3
  15. package/dist/templates/agentic-app/claude-agent-sdk/scripts/bootstrap.mjs +398 -0
  16. package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/web/index.html +0 -1
  17. package/dist/templates/agentic-app/claude-agent-sdk/web/package.json +29 -0
  18. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AgentChat.tsx +91 -0
  19. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/AppShell.tsx +139 -0
  20. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
  21. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/QrLink.tsx +25 -0
  22. package/dist/templates/agentic-app/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
  23. package/dist/templates/agentic-app/claude-agent-sdk/web/src/config.ts +148 -0
  24. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/identity.ts +67 -0
  25. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
  26. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/status.ts +45 -0
  27. package/dist/templates/agentic-app/claude-agent-sdk/web/src/lib/widget.ts +96 -0
  28. package/dist/templates/agentic-app/claude-agent-sdk/web/src/main.tsx +51 -0
  29. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Dashboard.tsx +33 -0
  30. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
  31. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Landing.tsx +65 -0
  32. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
  33. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/Reports.tsx +9 -0
  34. package/dist/templates/agentic-app/claude-agent-sdk/web/src/pages/TalkOnMobile.tsx +34 -0
  35. package/dist/templates/agentic-app/claude-agent-sdk/web/src/routes.ts +7 -0
  36. package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles-app.css +130 -0
  37. package/dist/templates/agentic-app/claude-agent-sdk/web/src/styles.css +248 -0
  38. package/dist/templates/agentic-app/claude-agent-sdk/web/src/vite-env.d.ts +14 -0
  39. package/dist/templates/agentic-app/claude-agent-sdk/web/tsconfig.json +18 -0
  40. package/dist/templates/agentic-app/claude-agent-sdk/web/vite.config.ts +46 -0
  41. package/dist/templates/{google-adk → agentic-app/google-adk}/AGENTS.md +2 -2
  42. package/dist/templates/agentic-app/google-adk/gitignore +5 -0
  43. package/dist/templates/agentic-app/google-adk/guuey.app.json +28 -0
  44. package/dist/templates/agentic-app/google-adk/guuey.app.schema.json +119 -0
  45. package/dist/templates/{google-adk → agentic-app/google-adk}/package.json +6 -3
  46. package/dist/templates/agentic-app/google-adk/scripts/bootstrap.mjs +398 -0
  47. package/dist/templates/{google-adk → agentic-app/google-adk}/web/index.html +0 -1
  48. package/dist/templates/agentic-app/google-adk/web/package.json +29 -0
  49. package/dist/templates/agentic-app/google-adk/web/src/components/AgentChat.tsx +91 -0
  50. package/dist/templates/agentic-app/google-adk/web/src/components/AppShell.tsx +139 -0
  51. package/dist/templates/agentic-app/google-adk/web/src/components/BootstrapGate.tsx +30 -0
  52. package/dist/templates/agentic-app/google-adk/web/src/components/QrLink.tsx +25 -0
  53. package/dist/templates/agentic-app/google-adk/web/src/components/Shell.tsx +50 -0
  54. package/dist/templates/agentic-app/google-adk/web/src/config.ts +148 -0
  55. package/dist/templates/agentic-app/google-adk/web/src/lib/identity.ts +67 -0
  56. package/dist/templates/agentic-app/google-adk/web/src/lib/oidc.ts +79 -0
  57. package/dist/templates/agentic-app/google-adk/web/src/lib/status.ts +45 -0
  58. package/dist/templates/agentic-app/google-adk/web/src/lib/widget.ts +96 -0
  59. package/dist/templates/agentic-app/google-adk/web/src/main.tsx +51 -0
  60. package/dist/templates/agentic-app/google-adk/web/src/pages/Dashboard.tsx +33 -0
  61. package/dist/templates/agentic-app/google-adk/web/src/pages/Home.tsx +133 -0
  62. package/dist/templates/agentic-app/google-adk/web/src/pages/Landing.tsx +65 -0
  63. package/dist/templates/agentic-app/google-adk/web/src/pages/Login.tsx +81 -0
  64. package/dist/templates/agentic-app/google-adk/web/src/pages/Reports.tsx +9 -0
  65. package/dist/templates/agentic-app/google-adk/web/src/pages/TalkOnMobile.tsx +34 -0
  66. package/dist/templates/agentic-app/google-adk/web/src/routes.ts +7 -0
  67. package/dist/templates/agentic-app/google-adk/web/src/styles-app.css +130 -0
  68. package/dist/templates/agentic-app/google-adk/web/src/styles.css +248 -0
  69. package/dist/templates/agentic-app/google-adk/web/src/vite-env.d.ts +14 -0
  70. package/dist/templates/agentic-app/google-adk/web/tsconfig.json +18 -0
  71. package/dist/templates/agentic-app/google-adk/web/vite.config.ts +46 -0
  72. package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/AGENTS.md +2 -2
  73. package/dist/templates/{claude-agent-sdk → agentic-app/openai-agents-sdk}/README.md +23 -7
  74. package/dist/templates/agentic-app/openai-agents-sdk/gitignore +5 -0
  75. package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.json +28 -0
  76. package/dist/templates/agentic-app/openai-agents-sdk/guuey.app.schema.json +119 -0
  77. package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/package.json +6 -3
  78. package/dist/templates/agentic-app/openai-agents-sdk/scripts/bootstrap.mjs +398 -0
  79. package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/web/index.html +0 -1
  80. package/dist/templates/agentic-app/openai-agents-sdk/web/package.json +29 -0
  81. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AgentChat.tsx +91 -0
  82. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/AppShell.tsx +139 -0
  83. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
  84. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/QrLink.tsx +25 -0
  85. package/dist/templates/agentic-app/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
  86. package/dist/templates/agentic-app/openai-agents-sdk/web/src/config.ts +148 -0
  87. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/identity.ts +67 -0
  88. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
  89. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/status.ts +45 -0
  90. package/dist/templates/agentic-app/openai-agents-sdk/web/src/lib/widget.ts +96 -0
  91. package/dist/templates/agentic-app/openai-agents-sdk/web/src/main.tsx +51 -0
  92. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Dashboard.tsx +33 -0
  93. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
  94. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Landing.tsx +65 -0
  95. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
  96. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/Reports.tsx +9 -0
  97. package/dist/templates/agentic-app/openai-agents-sdk/web/src/pages/TalkOnMobile.tsx +34 -0
  98. package/dist/templates/agentic-app/openai-agents-sdk/web/src/routes.ts +7 -0
  99. package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles-app.css +130 -0
  100. package/dist/templates/agentic-app/openai-agents-sdk/web/src/styles.css +248 -0
  101. package/dist/templates/agentic-app/openai-agents-sdk/web/src/vite-env.d.ts +14 -0
  102. package/dist/templates/agentic-app/openai-agents-sdk/web/tsconfig.json +18 -0
  103. package/dist/templates/agentic-app/openai-agents-sdk/web/vite.config.ts +46 -0
  104. package/dist/templates/base/claude-agent-sdk/.env.example +4 -0
  105. package/dist/templates/base/claude-agent-sdk/.mcp.json +1 -0
  106. package/dist/templates/base/claude-agent-sdk/AGENTS.md +135 -0
  107. package/dist/templates/base/claude-agent-sdk/README.md +173 -0
  108. package/dist/templates/base/claude-agent-sdk/ggui/blueprints/.gitkeep +0 -0
  109. package/dist/templates/base/claude-agent-sdk/ggui/ggui.json +15 -0
  110. package/dist/templates/base/claude-agent-sdk/ggui/themes/.gitkeep +0 -0
  111. package/dist/templates/base/claude-agent-sdk/gitignore +5 -0
  112. package/dist/templates/base/claude-agent-sdk/guuey.app.json +28 -0
  113. package/dist/templates/base/claude-agent-sdk/guuey.app.schema.json +119 -0
  114. package/dist/templates/base/claude-agent-sdk/guuey.json +14 -0
  115. package/dist/templates/base/claude-agent-sdk/mcps/todo/Dockerfile +46 -0
  116. package/dist/templates/base/claude-agent-sdk/mcps/todo/package.json +22 -0
  117. package/dist/templates/base/claude-agent-sdk/mcps/todo/src/server.ts +173 -0
  118. package/dist/templates/base/claude-agent-sdk/mcps/todo/tsconfig.json +15 -0
  119. package/dist/templates/base/claude-agent-sdk/mcps/todo/tsup.config.ts +14 -0
  120. package/dist/templates/base/claude-agent-sdk/package.json +30 -0
  121. package/dist/templates/base/claude-agent-sdk/pnpm-workspace.yaml +24 -0
  122. package/dist/templates/base/claude-agent-sdk/prompts/system.md +4 -0
  123. package/dist/templates/base/claude-agent-sdk/scripts/bootstrap.mjs +398 -0
  124. package/dist/templates/base/claude-agent-sdk/scripts/dev.mjs +45 -0
  125. package/dist/templates/base/claude-agent-sdk/src/agent-config.ts +77 -0
  126. package/dist/templates/base/claude-agent-sdk/src/worker.ts +89 -0
  127. package/dist/templates/base/claude-agent-sdk/tsconfig.json +15 -0
  128. package/dist/templates/base/claude-agent-sdk/tsup.config.ts +9 -0
  129. package/dist/templates/base/claude-agent-sdk/web/index.html +12 -0
  130. package/dist/templates/{claude-agent-sdk → base/claude-agent-sdk}/web/package.json +11 -8
  131. package/dist/templates/base/claude-agent-sdk/web/src/components/AgentChat.tsx +91 -0
  132. package/dist/templates/base/claude-agent-sdk/web/src/components/BootstrapGate.tsx +30 -0
  133. package/dist/templates/base/claude-agent-sdk/web/src/components/QrLink.tsx +25 -0
  134. package/dist/templates/base/claude-agent-sdk/web/src/components/Shell.tsx +50 -0
  135. package/dist/templates/base/claude-agent-sdk/web/src/config.ts +148 -0
  136. package/dist/templates/base/claude-agent-sdk/web/src/lib/identity.ts +67 -0
  137. package/dist/templates/base/claude-agent-sdk/web/src/lib/oidc.ts +79 -0
  138. package/dist/templates/base/claude-agent-sdk/web/src/lib/status.ts +45 -0
  139. package/dist/templates/base/claude-agent-sdk/web/src/lib/widget.ts +96 -0
  140. package/dist/templates/base/claude-agent-sdk/web/src/main.tsx +52 -0
  141. package/dist/templates/base/claude-agent-sdk/web/src/pages/Chat.tsx +15 -0
  142. package/dist/templates/base/claude-agent-sdk/web/src/pages/Home.tsx +133 -0
  143. package/dist/templates/base/claude-agent-sdk/web/src/pages/Landing.tsx +65 -0
  144. package/dist/templates/base/claude-agent-sdk/web/src/pages/Login.tsx +81 -0
  145. package/dist/templates/base/claude-agent-sdk/web/src/routes.ts +7 -0
  146. package/dist/templates/base/claude-agent-sdk/web/src/styles.css +248 -0
  147. package/dist/templates/base/claude-agent-sdk/web/src/vite-env.d.ts +14 -0
  148. package/dist/templates/base/claude-agent-sdk/web/tsconfig.json +18 -0
  149. package/dist/templates/base/claude-agent-sdk/web/vite.config.ts +46 -0
  150. package/dist/templates/base/google-adk/.env.example +4 -0
  151. package/dist/templates/base/google-adk/.mcp.json +1 -0
  152. package/dist/templates/base/google-adk/AGENTS.md +135 -0
  153. package/dist/templates/base/google-adk/README.md +90 -0
  154. package/dist/templates/base/google-adk/ggui/blueprints/.gitkeep +0 -0
  155. package/dist/templates/base/google-adk/ggui/ggui.json +15 -0
  156. package/dist/templates/base/google-adk/ggui/themes/.gitkeep +0 -0
  157. package/dist/templates/base/google-adk/gitignore +5 -0
  158. package/dist/templates/base/google-adk/guuey.app.json +28 -0
  159. package/dist/templates/base/google-adk/guuey.app.schema.json +119 -0
  160. package/dist/templates/base/google-adk/guuey.json +15 -0
  161. package/dist/templates/base/google-adk/mcps/todo/Dockerfile +46 -0
  162. package/dist/templates/base/google-adk/mcps/todo/package.json +22 -0
  163. package/dist/templates/base/google-adk/mcps/todo/src/server.ts +173 -0
  164. package/dist/templates/base/google-adk/mcps/todo/tsconfig.json +15 -0
  165. package/dist/templates/base/google-adk/mcps/todo/tsup.config.ts +14 -0
  166. package/dist/templates/base/google-adk/package.json +30 -0
  167. package/dist/templates/base/google-adk/pnpm-workspace.yaml +34 -0
  168. package/dist/templates/base/google-adk/prompts/system.md +4 -0
  169. package/dist/templates/base/google-adk/scripts/bootstrap.mjs +398 -0
  170. package/dist/templates/base/google-adk/scripts/dev.mjs +45 -0
  171. package/dist/templates/base/google-adk/src/agent.ts +43 -0
  172. package/dist/templates/base/google-adk/tsconfig.json +15 -0
  173. package/dist/templates/base/google-adk/tsup.config.ts +13 -0
  174. package/dist/templates/base/google-adk/web/index.html +12 -0
  175. package/dist/templates/{google-adk → base/google-adk}/web/package.json +11 -8
  176. package/dist/templates/base/google-adk/web/src/components/AgentChat.tsx +91 -0
  177. package/dist/templates/base/google-adk/web/src/components/BootstrapGate.tsx +30 -0
  178. package/dist/templates/base/google-adk/web/src/components/QrLink.tsx +25 -0
  179. package/dist/templates/base/google-adk/web/src/components/Shell.tsx +50 -0
  180. package/dist/templates/base/google-adk/web/src/config.ts +148 -0
  181. package/dist/templates/base/google-adk/web/src/lib/identity.ts +67 -0
  182. package/dist/templates/base/google-adk/web/src/lib/oidc.ts +79 -0
  183. package/dist/templates/base/google-adk/web/src/lib/status.ts +45 -0
  184. package/dist/templates/base/google-adk/web/src/lib/widget.ts +96 -0
  185. package/dist/templates/base/google-adk/web/src/main.tsx +52 -0
  186. package/dist/templates/base/google-adk/web/src/pages/Chat.tsx +15 -0
  187. package/dist/templates/base/google-adk/web/src/pages/Home.tsx +133 -0
  188. package/dist/templates/base/google-adk/web/src/pages/Landing.tsx +65 -0
  189. package/dist/templates/base/google-adk/web/src/pages/Login.tsx +81 -0
  190. package/dist/templates/base/google-adk/web/src/routes.ts +7 -0
  191. package/dist/templates/base/google-adk/web/src/styles.css +248 -0
  192. package/dist/templates/base/google-adk/web/src/vite-env.d.ts +14 -0
  193. package/dist/templates/base/google-adk/web/tsconfig.json +18 -0
  194. package/dist/templates/base/google-adk/web/vite.config.ts +46 -0
  195. package/dist/templates/base/openai-agents-sdk/.env.example +4 -0
  196. package/dist/templates/base/openai-agents-sdk/.mcp.json +1 -0
  197. package/dist/templates/base/openai-agents-sdk/AGENTS.md +135 -0
  198. package/dist/templates/base/openai-agents-sdk/README.md +173 -0
  199. package/dist/templates/base/openai-agents-sdk/ggui/blueprints/.gitkeep +0 -0
  200. package/dist/templates/base/openai-agents-sdk/ggui/ggui.json +15 -0
  201. package/dist/templates/base/openai-agents-sdk/ggui/themes/.gitkeep +0 -0
  202. package/dist/templates/base/openai-agents-sdk/gitignore +5 -0
  203. package/dist/templates/base/openai-agents-sdk/guuey.app.json +28 -0
  204. package/dist/templates/base/openai-agents-sdk/guuey.app.schema.json +119 -0
  205. package/dist/templates/base/openai-agents-sdk/guuey.json +27 -0
  206. package/dist/templates/base/openai-agents-sdk/mcps/todo/Dockerfile +46 -0
  207. package/dist/templates/base/openai-agents-sdk/mcps/todo/package.json +22 -0
  208. package/dist/templates/base/openai-agents-sdk/mcps/todo/src/server.ts +173 -0
  209. package/dist/templates/base/openai-agents-sdk/mcps/todo/tsconfig.json +15 -0
  210. package/dist/templates/base/openai-agents-sdk/mcps/todo/tsup.config.ts +14 -0
  211. package/dist/templates/base/openai-agents-sdk/package.json +30 -0
  212. package/dist/templates/base/openai-agents-sdk/pnpm-workspace.yaml +24 -0
  213. package/dist/templates/base/openai-agents-sdk/prompts/system.md +4 -0
  214. package/dist/templates/base/openai-agents-sdk/scripts/bootstrap.mjs +398 -0
  215. package/dist/templates/base/openai-agents-sdk/scripts/dev.mjs +45 -0
  216. package/dist/templates/base/openai-agents-sdk/src/agent-config.ts +77 -0
  217. package/dist/templates/base/openai-agents-sdk/src/worker.ts +75 -0
  218. package/dist/templates/base/openai-agents-sdk/tsconfig.json +15 -0
  219. package/dist/templates/base/openai-agents-sdk/tsup.config.ts +16 -0
  220. package/dist/templates/base/openai-agents-sdk/web/index.html +12 -0
  221. package/dist/templates/{openai-agents-sdk → base/openai-agents-sdk}/web/package.json +11 -8
  222. package/dist/templates/base/openai-agents-sdk/web/src/components/AgentChat.tsx +91 -0
  223. package/dist/templates/base/openai-agents-sdk/web/src/components/BootstrapGate.tsx +30 -0
  224. package/dist/templates/base/openai-agents-sdk/web/src/components/QrLink.tsx +25 -0
  225. package/dist/templates/base/openai-agents-sdk/web/src/components/Shell.tsx +50 -0
  226. package/dist/templates/base/openai-agents-sdk/web/src/config.ts +148 -0
  227. package/dist/templates/base/openai-agents-sdk/web/src/lib/identity.ts +67 -0
  228. package/dist/templates/base/openai-agents-sdk/web/src/lib/oidc.ts +79 -0
  229. package/dist/templates/base/openai-agents-sdk/web/src/lib/status.ts +45 -0
  230. package/dist/templates/base/openai-agents-sdk/web/src/lib/widget.ts +96 -0
  231. package/dist/templates/base/openai-agents-sdk/web/src/main.tsx +52 -0
  232. package/dist/templates/base/openai-agents-sdk/web/src/pages/Chat.tsx +15 -0
  233. package/dist/templates/base/openai-agents-sdk/web/src/pages/Home.tsx +133 -0
  234. package/dist/templates/base/openai-agents-sdk/web/src/pages/Landing.tsx +65 -0
  235. package/dist/templates/base/openai-agents-sdk/web/src/pages/Login.tsx +81 -0
  236. package/dist/templates/base/openai-agents-sdk/web/src/routes.ts +7 -0
  237. package/dist/templates/base/openai-agents-sdk/web/src/styles.css +248 -0
  238. package/dist/templates/base/openai-agents-sdk/web/src/vite-env.d.ts +14 -0
  239. package/dist/templates/base/openai-agents-sdk/web/tsconfig.json +18 -0
  240. package/dist/templates/base/openai-agents-sdk/web/vite.config.ts +46 -0
  241. package/package.json +6 -3
  242. package/dist/templates/claude-agent-sdk/web/.env.example +0 -17
  243. package/dist/templates/claude-agent-sdk/web/sandbox-proxy.ts +0 -239
  244. package/dist/templates/claude-agent-sdk/web/src/App.tsx +0 -272
  245. package/dist/templates/claude-agent-sdk/web/src/main.tsx +0 -12
  246. package/dist/templates/claude-agent-sdk/web/src/useAgentChat.ts +0 -122
  247. package/dist/templates/claude-agent-sdk/web/src/vite-env.d.ts +0 -27
  248. package/dist/templates/claude-agent-sdk/web/tsconfig.json +0 -20
  249. package/dist/templates/claude-agent-sdk/web/vite.config.ts +0 -12
  250. package/dist/templates/google-adk/web/.env.example +0 -17
  251. package/dist/templates/google-adk/web/sandbox-proxy.ts +0 -239
  252. package/dist/templates/google-adk/web/src/App.tsx +0 -272
  253. package/dist/templates/google-adk/web/src/main.tsx +0 -12
  254. package/dist/templates/google-adk/web/src/useAgentChat.ts +0 -122
  255. package/dist/templates/google-adk/web/src/vite-env.d.ts +0 -27
  256. package/dist/templates/google-adk/web/tsconfig.json +0 -20
  257. package/dist/templates/google-adk/web/vite.config.ts +0 -12
  258. package/dist/templates/openai-agents-sdk/web/.env.example +0 -17
  259. package/dist/templates/openai-agents-sdk/web/sandbox-proxy.ts +0 -239
  260. package/dist/templates/openai-agents-sdk/web/src/App.tsx +0 -272
  261. package/dist/templates/openai-agents-sdk/web/src/main.tsx +0 -12
  262. package/dist/templates/openai-agents-sdk/web/src/useAgentChat.ts +0 -122
  263. package/dist/templates/openai-agents-sdk/web/src/vite-env.d.ts +0 -27
  264. package/dist/templates/openai-agents-sdk/web/tsconfig.json +0 -20
  265. package/dist/templates/openai-agents-sdk/web/vite.config.ts +0 -12
  266. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.env.example +0 -0
  267. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/.mcp.json +0 -0
  268. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/blueprints/.gitkeep +0 -0
  269. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/ggui.json +0 -0
  270. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/ggui/themes/.gitkeep +0 -0
  271. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/guuey.json +0 -0
  272. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/Dockerfile +0 -0
  273. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/package.json +0 -0
  274. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/src/server.ts +0 -0
  275. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsconfig.json +0 -0
  276. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/mcps/todo/tsup.config.ts +0 -0
  277. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/pnpm-workspace.yaml +0 -0
  278. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/prompts/system.md +0 -0
  279. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/scripts/dev.mjs +0 -0
  280. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/agent-config.ts +0 -0
  281. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/src/worker.ts +0 -0
  282. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsconfig.json +0 -0
  283. /package/dist/templates/{claude-agent-sdk → agentic-app/claude-agent-sdk}/tsup.config.ts +0 -0
  284. /package/dist/templates/{google-adk → agentic-app/google-adk}/.env.example +0 -0
  285. /package/dist/templates/{google-adk → agentic-app/google-adk}/.mcp.json +0 -0
  286. /package/dist/templates/{google-adk → agentic-app/google-adk}/README.md +0 -0
  287. /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/blueprints/.gitkeep +0 -0
  288. /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/ggui.json +0 -0
  289. /package/dist/templates/{google-adk → agentic-app/google-adk}/ggui/themes/.gitkeep +0 -0
  290. /package/dist/templates/{google-adk → agentic-app/google-adk}/guuey.json +0 -0
  291. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/Dockerfile +0 -0
  292. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/package.json +0 -0
  293. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/src/server.ts +0 -0
  294. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsconfig.json +0 -0
  295. /package/dist/templates/{google-adk → agentic-app/google-adk}/mcps/todo/tsup.config.ts +0 -0
  296. /package/dist/templates/{google-adk → agentic-app/google-adk}/pnpm-workspace.yaml +0 -0
  297. /package/dist/templates/{google-adk → agentic-app/google-adk}/prompts/system.md +0 -0
  298. /package/dist/templates/{google-adk → agentic-app/google-adk}/scripts/dev.mjs +0 -0
  299. /package/dist/templates/{google-adk → agentic-app/google-adk}/src/agent.ts +0 -0
  300. /package/dist/templates/{google-adk → agentic-app/google-adk}/tsconfig.json +0 -0
  301. /package/dist/templates/{google-adk → agentic-app/google-adk}/tsup.config.ts +0 -0
  302. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.env.example +0 -0
  303. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/.mcp.json +0 -0
  304. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/blueprints/.gitkeep +0 -0
  305. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/ggui.json +0 -0
  306. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/ggui/themes/.gitkeep +0 -0
  307. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/guuey.json +0 -0
  308. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/Dockerfile +0 -0
  309. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/package.json +0 -0
  310. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/src/server.ts +0 -0
  311. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsconfig.json +0 -0
  312. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/mcps/todo/tsup.config.ts +0 -0
  313. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/pnpm-workspace.yaml +0 -0
  314. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/prompts/system.md +0 -0
  315. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/scripts/dev.mjs +0 -0
  316. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/agent-config.ts +0 -0
  317. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/src/worker.ts +0 -0
  318. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsconfig.json +0 -0
  319. /package/dist/templates/{openai-agents-sdk → agentic-app/openai-agents-sdk}/tsup.config.ts +0 -0
@@ -0,0 +1,248 @@
1
+ /* agentic-app-template site styles — one accent, light/dark, no framework. */
2
+
3
+ :root {
4
+ --app-accent: #6c5ce7;
5
+ --bg: #ffffff;
6
+ --bg-soft: #f6f7f9;
7
+ --fg: #16181d;
8
+ --fg-soft: #5b6270;
9
+ --line: #e4e7ec;
10
+ --ok: #1a7f37;
11
+ }
12
+
13
+ :root[data-mode="dark"] {
14
+ --bg: #101216;
15
+ --bg-soft: #181b21;
16
+ --fg: #e8eaee;
17
+ --fg-soft: #9aa2b1;
18
+ --line: #262a33;
19
+ --ok: #3fb950;
20
+ }
21
+
22
+ * {
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ body {
27
+ margin: 0;
28
+ font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
29
+ background: var(--bg);
30
+ color: var(--fg);
31
+ }
32
+
33
+ code,
34
+ pre {
35
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
36
+ font-size: 0.9em;
37
+ }
38
+
39
+ pre {
40
+ background: var(--bg-soft);
41
+ border: 1px solid var(--line);
42
+ border-radius: 8px;
43
+ padding: 12px 14px;
44
+ overflow-x: auto;
45
+ }
46
+
47
+ a {
48
+ color: var(--app-accent);
49
+ }
50
+
51
+ .shell {
52
+ min-height: 100vh;
53
+ display: flex;
54
+ flex-direction: column;
55
+ }
56
+
57
+ .topbar {
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: space-between;
61
+ padding: 12px 24px;
62
+ border-bottom: 1px solid var(--line);
63
+ }
64
+
65
+ .brand {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: 10px;
69
+ font-weight: 700;
70
+ color: var(--fg);
71
+ text-decoration: none;
72
+ }
73
+
74
+ .brand-mark {
75
+ display: inline-flex;
76
+ align-items: center;
77
+ justify-content: center;
78
+ width: 30px;
79
+ height: 30px;
80
+ border-radius: 8px;
81
+ background: var(--app-accent);
82
+ color: #fff;
83
+ font-size: 13px;
84
+ }
85
+
86
+ .topbar nav {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 16px;
90
+ }
91
+
92
+ .topbar nav a {
93
+ color: var(--fg-soft);
94
+ text-decoration: none;
95
+ }
96
+
97
+ .topbar nav a.active {
98
+ color: var(--fg);
99
+ font-weight: 600;
100
+ }
101
+
102
+ .btn {
103
+ display: inline-flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ padding: 8px 16px;
107
+ border-radius: 8px;
108
+ border: 1px solid var(--line);
109
+ background: var(--bg);
110
+ color: var(--fg);
111
+ font-size: 14px;
112
+ cursor: pointer;
113
+ text-decoration: none;
114
+ }
115
+
116
+ .btn:disabled {
117
+ opacity: 0.5;
118
+ cursor: not-allowed;
119
+ }
120
+
121
+ .btn-accent {
122
+ background: var(--app-accent);
123
+ border-color: var(--app-accent);
124
+ color: #fff;
125
+ }
126
+
127
+ .btn-wide {
128
+ width: 100%;
129
+ }
130
+
131
+ .page {
132
+ flex: 1;
133
+ width: 100%;
134
+ max-width: 880px;
135
+ margin: 0 auto;
136
+ padding: 32px 24px;
137
+ }
138
+
139
+ .hero {
140
+ text-align: center;
141
+ padding: 64px 0;
142
+ }
143
+
144
+ .hero h1 {
145
+ font-size: 44px;
146
+ margin: 0 0 12px;
147
+ }
148
+
149
+ .hero p {
150
+ color: var(--fg-soft);
151
+ font-size: 18px;
152
+ margin: 0 0 28px;
153
+ }
154
+
155
+ .hero-actions {
156
+ display: flex;
157
+ gap: 12px;
158
+ justify-content: center;
159
+ }
160
+
161
+ .login {
162
+ display: flex;
163
+ justify-content: center;
164
+ }
165
+
166
+ .login-card,
167
+ .gate-card {
168
+ width: 100%;
169
+ max-width: 380px;
170
+ margin-top: 48px;
171
+ padding: 28px;
172
+ border: 1px solid var(--line);
173
+ border-radius: 12px;
174
+ background: var(--bg-soft);
175
+ display: flex;
176
+ flex-direction: column;
177
+ gap: 12px;
178
+ }
179
+
180
+ .gate {
181
+ min-height: 100vh;
182
+ display: flex;
183
+ justify-content: center;
184
+ background: var(--bg);
185
+ color: var(--fg);
186
+ }
187
+
188
+ .gate-card {
189
+ max-width: 520px;
190
+ }
191
+
192
+ .chat-page {
193
+ display: flex;
194
+ max-width: 880px;
195
+ height: calc(100vh - 61px);
196
+ padding: 16px 24px 24px;
197
+ }
198
+
199
+ .chat-fill {
200
+ flex: 1;
201
+ min-height: 0;
202
+ border: 1px solid var(--line);
203
+ border-radius: 12px;
204
+ overflow: hidden;
205
+ }
206
+
207
+ .card {
208
+ border: 1px solid var(--line);
209
+ border-radius: 12px;
210
+ padding: 20px 24px;
211
+ margin-bottom: 24px;
212
+ background: var(--bg);
213
+ }
214
+
215
+ .facts {
216
+ display: grid;
217
+ grid-template-columns: 140px 1fr;
218
+ gap: 8px 16px;
219
+ margin: 0;
220
+ }
221
+
222
+ .facts dt {
223
+ color: var(--fg-soft);
224
+ }
225
+
226
+ .facts dd {
227
+ margin: 0;
228
+ overflow-wrap: anywhere;
229
+ }
230
+
231
+ .ok {
232
+ color: var(--ok);
233
+ font-weight: 600;
234
+ }
235
+
236
+ .calm {
237
+ color: var(--fg-soft);
238
+ }
239
+
240
+ .hint {
241
+ color: var(--fg-soft);
242
+ font-size: 14px;
243
+ }
244
+
245
+ .error {
246
+ color: #c0392b;
247
+ font-size: 14px;
248
+ }
@@ -0,0 +1,14 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ interface ImportMetaEnv {
4
+ /**
5
+ * Optional external-script hook (guuey#303): a URL loaded at boot — the
6
+ * demo tour's bundle rides this in the demo apps; unset in customer
7
+ * builds.
8
+ */
9
+ readonly VITE_DEMO_TOUR_SRC?: string;
10
+ }
11
+
12
+ interface ImportMeta {
13
+ readonly env: ImportMetaEnv;
14
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "resolveJsonModule": true,
8
+ "esModuleInterop": true,
9
+ "jsx": "react-jsx",
10
+ "strict": true,
11
+ "noUncheckedIndexedAccess": true,
12
+ "noEmit": true,
13
+ "skipLibCheck": true,
14
+ "isolatedModules": true,
15
+ "types": ["vite/client", "node"]
16
+ },
17
+ "include": ["src", "vite.config.ts", "../guuey.app.json"]
18
+ }
@@ -0,0 +1,46 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { defineConfig, type Plugin } from "vite";
5
+ import react from "@vitejs/plugin-react";
6
+
7
+ const projectRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
8
+
9
+ /**
10
+ * Fail-loud production gate (never a half-styled deploy): `pnpm bootstrap`
11
+ * not run yet → the BUILD fails with the exact command. An UNLINKED build
12
+ * is allowed — the pages state the missing binding honestly — but gets a
13
+ * loud warning, since a deployed frontend without a bound guuey app has no
14
+ * live agent to talk to.
15
+ *
16
+ * Dev is NOT gated here — `src/components/BootstrapGate.tsx` renders the
17
+ * "run bootstrap first" screen instead, so `pnpm dev` always starts.
18
+ */
19
+ function bootstrapGatePlugin(): Plugin {
20
+ return {
21
+ name: "guuey-bootstrap-gate",
22
+ apply: "build",
23
+ buildStart() {
24
+ const raw = readFileSync(join(projectRoot, "guuey.app.json"), "utf8");
25
+ const app = JSON.parse(raw) as { bootstrapped?: boolean; link?: object | null };
26
+ if (app.bootstrapped !== true) {
27
+ throw new Error(
28
+ "guuey.app.json is not bootstrapped — run `pnpm bootstrap` at the project root first.",
29
+ );
30
+ }
31
+ if (!app.link) {
32
+ console.warn(
33
+ "[guuey-bootstrap-gate] building WITHOUT a bound guuey app — the deployed site will have " +
34
+ "no live agent until you run `pnpm bootstrap -- --link --app-id <appId>` and rebuild.",
35
+ );
36
+ }
37
+ },
38
+ };
39
+ }
40
+
41
+ // Port is passed via the `dev` script's `--port 6890` flag (see package.json)
42
+ // so it stays visible in one place; `scripts/dev.mjs` boots this on the same
43
+ // port.
44
+ export default defineConfig({
45
+ plugins: [react(), bootstrapGatePlugin()],
46
+ });
@@ -0,0 +1,4 @@
1
+ # LLM key for local dev — the deployed agent uses guuey's managed broker instead.
2
+ ANTHROPIC_API_KEY=
3
+ # Only needed for the openai-agents-sdk template:
4
+ OPENAI_API_KEY=
@@ -0,0 +1 @@
1
+ { "mcpServers": { "ggui-dev": { "type": "http", "url": "https://mcp.ggui.ai/dev" } } }
@@ -0,0 +1,135 @@
1
+ # AGENTS.md — steering for the coding agent working in this repo
2
+
3
+ You (the coding agent) are extending a guuey agentic app. Before you reach
4
+ for a database or a cache, read this file. The single most common mistake
5
+ here is standing up local Redis/SQLite/file-based state "just to get
6
+ something working" — **don't.** Every pod this project deploys to
7
+ (the agent entry's pod — `src/worker.ts`, or `src/agent.ts` in a google-adk scaffold — including every `kind: colocated` `mcps/*`
8
+ server auto-spawned inside it, like this scaffold's `mcps/todo` — and every
9
+ `mcps/*` server deployed with `kind: hosted`) is **ephemeral and horizontally
10
+ replaced**: gVisor-isolated,
11
+ scale-to-zero, ordinary process death on every deploy or idle timeout. A
12
+ local file or an in-process `Map` used as a database is not a shortcut —
13
+ it is silent data loss the first time the pod recycles.
14
+
15
+ Use this table to route persistence decisions. Pick a row, don't invent one.
16
+
17
+ | Need | Use | Why |
18
+ | ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
19
+ | Small per-user state on an MCP server (idempotency keys, rate-limit counters, OAuth nonces, prefs, a few KB) | [`@guuey/state`](https://www.npmjs.com/package/@guuey/state) — `withGuueyContext(scopeFromAuthorization(...), fn)` | Zero auth code — guuey owns the identity rails. Durable, per-`(user, mcp)`, survives pod restarts. |
20
+ | Large or relational data (rows, queries, joins, anything you'd reach for Postgres/Redis for) | An external managed serverless DB — Neon, Upstash, Supabase, or Turso — wired in via `guuey mcp secrets set DATABASE_URL=... --server <id>` (hosted MCP) or `guuey env set DATABASE_URL=...` (the agent worker and its colocated MCP children — the pod's declared env/secrets are handed to every colocated child), consumed through the provider's serverless driver | Guuey **integrates, never operates** databases — that's the platform's hosting policy, not a v1 gap. Pick the provider's **`us-east-1`** region: a guuey-hosted MCP → provider hop is then same-region AWS backbone, single-digit-ms — comparable to a cross-AZ hop, and agent turns are already dominated by seconds of LLM inference. |
21
+ | Local Redis, SQLite, or any file written as a database | **Never.** Not for v1, not "temporarily." | Pods are ephemeral and horizontally replaced — a local store vanishes on the next deploy, restart, or scale event, with no warning to you or the user. |
22
+ | Per-user files/blobs from **inside the agent pod** (the agent entry) | [`@guuey/fs`](https://www.npmjs.com/package/@guuey/fs)'s `homeDir()`/`appDir()`/`sessionDir()`, or the raw `$GUUEY_HOME_DIR`/`$GUUEY_APP_DIR` env vars + `node:fs` | Every invoke already gets these three bound directories — `$GUUEY_HOME_DIR` is durable per-user, `$GUUEY_APP_DIR` is read-only shared, cwd is session scratch. No wrapper API required, but the helpers save you the env-var lookups. |
23
+ | Per-user files/blobs from **inside an MCP server** (`mcps/*`) | Not yet available — `@guuey/files` is planned but not shipped. Fall back to the managed-DB row above (e.g. store blobs in the provider's object storage) until it lands. | Don't build against an API that doesn't exist yet. |
24
+ | Conversation / chat history | **Do not re-implement.** The platform already persists it. | Guuey writes thread history to DynamoDB and streams it back over AppSync; agents that keep their own transcript store are duplicating (and diverging from) data the platform already owns. |
25
+
26
+ ## `@guuey/state`: the one-line pattern
27
+
28
+ `@guuey/state` only works inside an MCP server whose `guuey.json` entry is
29
+ **federated** — that's the opt-in. A `kind: colocated` entry (like
30
+ `mcps/todo` in this scaffold) or a `kind: hosted` entry is federated
31
+ automatically. If you add a `kind: external` entry (a server you host
32
+ yourself, reached by URL), you must set `federate: true` on it:
33
+
34
+ ```json
35
+ {
36
+ "kind": "external",
37
+ "url": "https://your-server.example.com",
38
+ "federate": true
39
+ }
40
+ ```
41
+
42
+ Without `federate: true` (or `kind: colocated`/`kind: hosted`/a `ggui`
43
+ URL), guuey has no
44
+ identity to hand your server — a plain external entry with static
45
+ `headers` gets **no token and no state.** The token guuey sends on every
46
+ request to a federated server IS the credential; there is no separate
47
+ API key to provision.
48
+
49
+ Inside a federated MCP server, wrap each request in
50
+ `withGuueyContext(scopeFromAuthorization(header), fn)` and use the
51
+ barrel-exported `kv` inside `fn` — that's the whole integration. One
52
+ complete, runnable example — an idempotency-key check on a tool call,
53
+ using the raw Node `http` transport this scaffold's `mcps/todo/src/server.ts`
54
+ already uses:
55
+
56
+ ```ts
57
+ import { createHash } from "node:crypto";
58
+ import type { IncomingMessage, ServerResponse } from "node:http";
59
+ import { withGuueyContext, scopeFromAuthorization, kv, QuotaExceededError } from "@guuey/state";
60
+
61
+ // Inside the per-request handler (see mcps/todo/src/server.ts for the
62
+ // full StreamableHTTPServerTransport wiring this drops into):
63
+ async function handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {
64
+ const authHeader = req.headers.authorization;
65
+ if (typeof authHeader !== "string") {
66
+ res.writeHead(401).end();
67
+ return;
68
+ }
69
+
70
+ await withGuueyContext(scopeFromAuthorization(authHeader), async () => {
71
+ // ... hand off to your MCP transport/tool dispatch here; the
72
+ // AsyncLocalStorage context set above is visible to every `kv.*`
73
+ // call for the lifetime of this request, however deep the call
74
+ // stack goes (tool handlers, helper functions, etc.).
75
+ await handleCreateOrder({ orderPayload: "..." });
76
+ });
77
+ }
78
+
79
+ async function handleCreateOrder(input: { orderPayload: string }): Promise<{ duplicate: boolean }> {
80
+ const idempotencyKey = `order:${createHash("sha256").update(input.orderPayload).digest("hex")}`;
81
+
82
+ if (await kv.has(idempotencyKey)) {
83
+ return { duplicate: true };
84
+ }
85
+
86
+ try {
87
+ // TTL is required on every `set` — no permanent keys. Pick a window
88
+ // that covers realistic retry storms; 1 hour is a reasonable default
89
+ // for an idempotency key.
90
+ await kv.set(idempotencyKey, true, { ttl: 60 * 60 });
91
+ } catch (err) {
92
+ if (err instanceof QuotaExceededError) {
93
+ // The (user, mcp) scope hit its 1 MiB cap. Surface this to the
94
+ // caller instead of silently dropping the idempotency guard.
95
+ throw new Error("state quota exceeded — cannot verify idempotency");
96
+ }
97
+ throw err;
98
+ }
99
+
100
+ // ... actually create the order here.
101
+ return { duplicate: false };
102
+ }
103
+ ```
104
+
105
+ `scopeFromAuthorization` derives `{ userId, mcpId }` from the inbound
106
+ `Authorization: Bearer <jwt>` header guuey sends on every federated call —
107
+ `userId` from the JWT's `sub`, `mcpId` deterministically from its `aud`
108
+ (your server's federated resource URL). You never assert either id
109
+ yourself; a mismatched or missing token is rejected server-side.
110
+
111
+ ## The hard caps (design your data model around these, don't work around them)
112
+
113
+ `@guuey/state` is a KV, not a database — enforced, not a suggestion:
114
+
115
+ | Cap | Value |
116
+ | ------------------ | --------------------------------------------- |
117
+ | Scope size | 1 MiB (per `(user, mcp)`, key bytes included) |
118
+ | Single value | 64 KiB |
119
+ | TTL | required, ≤ 90 days — no permanent keys |
120
+ | `keys()` page size | ≤ 1000 |
121
+ | `mget()` batch | ≤ 100 keys |
122
+ | Counters | safe integers only (`increment`/`decrement`) |
123
+
124
+ If your data model needs more than this — queries, joins, cross-user
125
+ data, anything past a long tail of small per-user facts — that's the
126
+ signal to use the managed-DB row above, not to fight the cap.
127
+
128
+ ## Chat history: really, don't
129
+
130
+ If you find yourself writing message transcripts to `@guuey/state`,
131
+ `$GUUEY_HOME_DIR`, or an external DB keyed by conversation, stop — that's
132
+ the platform's job. Guuey persists every thread to DynamoDB and streams
133
+ history back over AppSync subscriptions; the client and Portal already
134
+ read it from there. A parallel, agent-owned history store will drift from
135
+ the platform's copy and confuse users about which one is authoritative.
@@ -0,0 +1,173 @@
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/ — generative-UI config.
19
+ │ # `ggui serve` runs against this locally; `guuey deploy` pushes
20
+ │ # generation config + blueprints (the deployed RENDER THEME is
21
+ │ # platform data, not this dir — ggui.json#theme is local-preview
22
+ │ # only, kept in step with guuey.app.json by `pnpm bootstrap`).
23
+ ├── web/ # the product frontend (Vite + React on @guuey/chat):
24
+ │ # landing (widget) · login (guest + BYO-OIDC seam) · home
25
+ │ # (status + distribution guide) · the chat surface
26
+ ├── guuey.app.json # frontend/brand config — written by `pnpm bootstrap`
27
+ │ # (schema: guuey.app.schema.json; public-safe by design)
28
+ ├── AGENTS.md # coding-agent steering; `pnpm bootstrap` maintains the
29
+ │ # managed block with this project's real facts
30
+ ├── scripts/dev.mjs # `pnpm dev` orchestrator — boots the whole local stack
31
+ ├── scripts/bootstrap.mjs # `pnpm bootstrap` — configure, then `-- --link` to bind
32
+ ├── .env.example # ANTHROPIC_API_KEY / OPENAI_API_KEY for local dev
33
+ └── .mcp.json # Claude Code convenience wiring (mcp.ggui.ai/dev)
34
+ ```
35
+
36
+ The project root **is** the agent package — `guuey deploy` packs this directory
37
+ directly as the deploy tarball, so `guuey.json` and `src/worker.ts` live at the top
38
+ level rather than nested under a `servers/` or `apps/` folder.
39
+
40
+ ## Quick start
41
+
42
+ ```bash
43
+ pnpm install
44
+ pnpm bootstrap # brand, theme, copy → guuey.app.json + AGENTS.md (no account needed;
45
+ # every web page is gated on this, and production builds fail without it)
46
+ cp .env.example .env.local # done automatically on scaffold if .env.local is absent
47
+ # set ANTHROPIC_API_KEY (or OPENAI_API_KEY, for the openai-agents-sdk template) in .env.local
48
+ pnpm dev
49
+ ```
50
+
51
+ When the agent is deployed (`guuey login && guuey deploy`), bind it into the
52
+ frontend: `pnpm bootstrap -- --link` — that records the app id, endpoint,
53
+ widget origin and portal link in `guuey.app.json` and pushes brand basics to
54
+ the platform. `pnpm status` shows the live app state; `pnpm bootstrap -- --check`
55
+ prints machine-readable configuration state.
56
+
57
+ `pnpm dev` (`scripts/dev.mjs`) boots four processes with prefixed, interleaved
58
+ logs. Ctrl-C tears all of them down together.
59
+
60
+ | process | port | what |
61
+ | ------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------ |
62
+ | `worker` | — | `tsup --watch` — rebuilds `guuey.worker.js` on every save |
63
+ | `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 |
64
+ | `ggui serve` | :6781 | local generative-UI server, over `ggui/` |
65
+ | `web` | :6890 | the product frontend (landing/login/home/chat on @guuey/chat) |
66
+
67
+ The todo MCP still answers on :6782 — it's just a supervised child of
68
+ `guuey dev` now (copy `mcps/todo/` to add your own server; new `colocated`
69
+ entries in `guuey.json` are auto-spawned the same way).
70
+
71
+ > **If a server's deps carry build scripts** (the classic: `tsx` → esbuild's
72
+ > platform-binary fetch), pnpm ≥11 refuses to run them on a fresh install —
73
+ > `ERR_PNPM_IGNORED_BUILDS` — and the server never boots. Approve the
74
+ > specific packages declaratively in the workspace-root `package.json` (or
75
+ > the server's own, for a standalone install):
76
+ > `"pnpm": { "onlyBuiltDependencies": ["esbuild"] }`. This scaffold ships
77
+ > the approval already; add to the list when a new dep needs its build step.
78
+ > Don't disable the gate wholesale — it's pnpm's supply-chain protection.
79
+
80
+ Open http://localhost:6890 to chat with your agent locally.
81
+
82
+ ## Local dev vs. deployed — what's different
83
+
84
+ `guuey dev` is the open, local equivalent of the pod router that runs your
85
+ worker in production. It mirrors the real spawn/stream contract closely — the
86
+ same normalizer, the same SSE shape — but it deliberately cuts three corners:
87
+ two that only matter once real users and real money are involved, and one
88
+ you should read twice:
89
+
90
+ - **No sandboxing — read this one twice.** Locally your worker runs as a
91
+ plain child process: no `bwrap`/gVisor isolation on any platform, it
92
+ inherits your **full shell environment** (every variable, including
93
+ credentials unrelated to this agent), and when filesystem layers are
94
+ bound the host grants the agent shell and file tools **without
95
+ prompting** (the production jail those tools assume does not exist
96
+ locally). Net: `guuey dev` runs an LLM-driven agent with unprompted
97
+ shell access as you, with your env. That's a deliberate dev-trust
98
+ posture, not an accident — treat the agent like any script you'd run
99
+ from the internet: run `guuey dev` in a throwaway shell/container with
100
+ a minimal environment if your agent (or any MCP server it talks to)
101
+ handles untrusted input. In production every invocation runs inside a
102
+ gVisor-isolated pod with only its declared environment.
103
+ - **Permissive auth.** `ggui serve --dev-allow-all` accepts any bearer
104
+ locally. The deployed ggui instance enforces real auth.
105
+ - **No metering or history.** Local runs aren't billed and aren't persisted.
106
+ Deployed conversations are metered and their history is written to
107
+ DynamoDB so users can resume a thread.
108
+
109
+ None of this changes your code — `guuey.json` is the same file in both
110
+ worlds; only how it's resolved differs. Locally, `guuey dev` auto-spawns each
111
+ `colocated` entry on its `devPort` and points the agent at
112
+ `localhost:<devPort>`; deployed, the same server code runs as a supervised
113
+ child inside your agent's pod, reached over the pod's loopback with a
114
+ per-request federated identity. (`hosted` entries deploy to the platform's
115
+ federated URLs; locally they need a `devPort` pointing at a server you run
116
+ yourself, or they're skipped with a warning.)
117
+
118
+ ## Deploying
119
+
120
+ ```bash
121
+ guuey login # device-flow auth; stores a token in ~/.guuey/auth.json
122
+ guuey deploy # ships everything
123
+ ```
124
+
125
+ `guuey deploy` runs four legs, in order, so a hard failure aborts before
126
+ anything user-visible changes:
127
+
128
+ 1. **MCP leg** — deploys each `hosted` entry under `guuey.json#agent.mcpServers`
129
+ as its own hosted MCP server (build → deploy → registry), then writes the
130
+ resulting server id back into `guuey.json`. This scaffold has none — the
131
+ todo MCP is `colocated`, so this leg is a no-op here.
132
+ 2. **ggui asset leg** — pushes `ggui/` (generation config, blueprints) to your
133
+ app's guuey-managed ggui instance.
134
+ 3. **Agent leg** — builds `src/worker.ts` into `guuey.worker.js`, packs the
135
+ project root (including `mcps/`), and deploys it as a gVisor-isolated,
136
+ scale-to-zero pod. Each `colocated` entry (e.g. `mcps/todo`) is built into
137
+ the worker image and auto-spawned as a supervised, sandboxed child at pod
138
+ boot — no separate server, registry row, or write-back.
139
+ 4. **Output** — prints your agent's endpoint URL and a Portal deep link.
140
+
141
+ Re-running `guuey deploy` converges: unchanged pieces are skipped or reused,
142
+ nothing is duplicated.
143
+
144
+ ## Filesystem + memory
145
+
146
+ Every deployed invoke gets three bound directories — `$GUUEY_HOME_DIR`
147
+ (durable, per-user), `$GUUEY_APP_DIR` (read-only, shared), and cwd (session
148
+ scratch) — plain `node:fs`, no wrapper API required. Signed-in users get
149
+ durable cross-session memory for free (a platform-owned prompt tells the
150
+ model to read/write `$GUUEY_HOME_DIR/memories/MEMORY.md`); guests never get
151
+ durable storage, by design. **This recall is `claude-agent-sdk`-only today**
152
+ — openai-agents-sdk and google-adk agents get the three bound directories
153
+ but not the automatic memory-file recall; all-framework support arrives
154
+ with guuey's own memory MCP (a platform tool every framework can call over
155
+ its existing MCP channel). Framework-native memory backends (e.g. ADK's
156
+ Vertex MemoryBank) are unsupported on Guuey — they'd store user data
157
+ outside guuey's deletion boundary. Full contract, code examples, and
158
+ rollout status: the "Your agent's filesystem" section of the guuey
159
+ monorepo's `docs/quickstart.md`, or
160
+ [`@guuey/fs`](https://www.npmjs.com/package/@guuey/fs)'s own README — an
161
+ optional, three-helper sugar layer over the same paths.
162
+
163
+ ## How people talk to your agent
164
+
165
+ - **guuey Portal** — a Telegram-like agent App Store and universal chat
166
+ client. Once deployed, your agent is reachable from Portal with **zero
167
+ frontend code** — most builders never need to touch `web/` at all.
168
+ - **`web/`** — ships anyway, because the local dev loop needs a chat surface,
169
+ and it's a worked example of the bring-your-own-frontend path if you want
170
+ to embed your agent somewhere Portal doesn't reach.
171
+ - **Future: guuey widgets** — an embeddable web-chat widget for dropping
172
+ your agent into an existing site is planned as a separate feature; `web/`
173
+ is designed to make that graduation straightforward when it lands.
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ dist/
3
+ .env.local
4
+ guuey.worker.js
5
+ .guuey-dev/