@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guuey/create-agentic-app",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Scaffold a guuey agentic app: code-mode agent + custom MCP + ggui + web, local pnpm dev, one-command guuey deploy.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,13 +17,16 @@
17
17
  "engines": {
18
18
  "node": ">=20"
19
19
  },
20
+ "dependencies": {
21
+ "tar": "^7.5.22"
22
+ },
20
23
  "devDependencies": {
21
24
  "@types/node": "^24.0.0",
22
25
  "tsup": "^8.5.0",
23
26
  "typescript": "^5.8.0",
24
27
  "vitest": "^3.2.4",
25
- "@guuey/config": "0.9.0",
26
- "@guuey/worker": "0.9.0"
28
+ "@guuey/config": "0.11.0",
29
+ "@guuey/worker": "0.11.0"
27
30
  },
28
31
  "publishConfig": {
29
32
  "access": "public"
@@ -1,17 +0,0 @@
1
- # Vite env for the web chat client. Copy to `web/.env.local` and UNCOMMENT
2
- # the vars you want to override. (Vite reads env files from this directory —
3
- # not the project root. Keep unused vars commented out: an empty
4
- # `VITE_X=` declaration loads as "" — not undefined.)
5
-
6
- # Agent base URL. Defaults to the local `guuey dev` router (:6790).
7
- # VITE_AGENT_ENDPOINT_URL=http://localhost:6790
8
-
9
- # Second-origin MCP-Apps sandbox page for @mcp-ui/client's <AppRenderer>.
10
- # The MCP Apps spec requires UI resources to mount from a DIFFERENT origin
11
- # than the app itself (double-iframe sandbox). In local dev this is served
12
- # automatically on http://127.0.0.1:6891/sandbox.html by the
13
- # sandboxProxyPlugin in vite.config.ts — leave unset. For a DEPLOYED build,
14
- # host ../sandbox-proxy.ts's sandbox page on its own origin and point this
15
- # at it; if unset in production, UI resources show a plain-text notice
16
- # instead of rendering.
17
- # VITE_SANDBOX_URL=https://sandbox.example.com/sandbox.html
@@ -1,239 +0,0 @@
1
- /**
2
- * MCP-Apps sandbox proxy for local dev — a Vite plugin that serves the
3
- * spec-canonical `sandbox.html` on a SECOND localhost port (:6891), i.e. a
4
- * different origin from the SPA (:6890).
5
- *
6
- * # Why a second origin
7
- *
8
- * The MCP Apps spec's double-iframe sandbox architecture mandates that the
9
- * host page and the sandbox iframe live on DIFFERENT origins: the host wraps
10
- * the sandbox iframe, the sandbox iframe wraps the untrusted app HTML, and
11
- * the origin split means a compromised app cannot reach the host's APIs via
12
- * same-origin DOM access. `@mcp-ui/client`'s `<AppRenderer>` takes a
13
- * `sandbox: { url }` prop pointing at this page. A different localhost PORT
14
- * is a different origin, so one extra listener is all local dev needs.
15
- *
16
- * # Reference impl
17
- *
18
- * The HTML below is adapted from the spec's reference host
19
- * (`github.com/modelcontextprotocol/ext-apps/examples/basic-host/` —
20
- * sandbox.html + src/sandbox.ts + serve.ts), matching the pattern
21
- * `@ggui-ai/agent-server`'s bundled sandbox proxy uses. CSP arrives as a
22
- * `?csp=<urlencoded-json>` query param and is applied via HTTP HEADERS
23
- * (tamper-proof — a `<meta>` CSP could be overridden by injected inline
24
- * scripts), which is why this must be a real server, not a static file.
25
- *
26
- * # Deploying `web/`
27
- *
28
- * This plugin only runs under `vite` dev (`apply: "serve"`). A deployed
29
- * build must point `VITE_SANDBOX_URL` at a hosted copy of this page on its
30
- * own origin (see `.env.example`); without it the app falls back to a
31
- * "UI resource received" notice instead of mounting UI same-origin.
32
- */
33
- import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
34
- import type { Plugin } from "vite";
35
-
36
- /**
37
- * The sandbox proxy's dev port. web/ runs on :6890; keep the `6891` literal
38
- * in `src/App.tsx` (`DEV_SANDBOX_URL`) in sync — App.tsx cannot import this
39
- * module (it would drag `node:http` into the browser bundle).
40
- */
41
- export const SANDBOX_PROXY_PORT = 6891;
42
-
43
- /** CSP shape `<AppRenderer>` forwards on the sandbox URL's `?csp=` param. */
44
- interface McpUiResourceCsp {
45
- readonly resourceDomains?: readonly string[];
46
- readonly connectDomains?: readonly string[];
47
- readonly frameDomains?: readonly string[];
48
- readonly baseUriDomains?: readonly string[];
49
- }
50
-
51
- /** Drop CSP entries carrying directive-injection characters (`;`, newlines, quotes, spaces). */
52
- function sanitizeCspDomains(domains: readonly string[] | undefined): readonly string[] {
53
- if (!domains) return [];
54
- return domains.filter((d) => typeof d === "string" && !/[;\r\n'" ]/.test(d));
55
- }
56
-
57
- /** Build the CSP header value — mirrors the upstream basic-host `serve.ts`. */
58
- function buildCspHeader(csp: McpUiResourceCsp | undefined): string {
59
- const resourceDomains = sanitizeCspDomains(csp?.resourceDomains).join(" ");
60
- const connectDomains = sanitizeCspDomains(csp?.connectDomains).join(" ");
61
- const frameDomains = sanitizeCspDomains(csp?.frameDomains).join(" ");
62
- const baseUriDomains = sanitizeCspDomains(csp?.baseUriDomains).join(" ");
63
- return [
64
- "default-src 'self' 'unsafe-inline'",
65
- `script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: ${resourceDomains}`.trim(),
66
- `style-src 'self' 'unsafe-inline' blob: data: ${resourceDomains}`.trim(),
67
- `img-src 'self' data: blob: ${resourceDomains}`.trim(),
68
- `font-src 'self' data: blob: ${resourceDomains}`.trim(),
69
- `media-src 'self' data: blob: ${resourceDomains}`.trim(),
70
- `connect-src 'self' ${connectDomains}`.trim(),
71
- `worker-src 'self' blob: ${resourceDomains}`.trim(),
72
- frameDomains.length > 0 ? `frame-src ${frameDomains}` : "frame-src 'none'",
73
- "object-src 'none'",
74
- baseUriDomains.length > 0 ? `base-uri ${baseUriDomains}` : "base-uri 'none'",
75
- ].join("; ");
76
- }
77
-
78
- /**
79
- * The self-contained sandbox.html. The inlined script:
80
- *
81
- * 1. Asserts iframe isolation (throws if it can reach `window.top`).
82
- * 2. Creates an inner iframe sandboxed with `allow-scripts
83
- * allow-same-origin allow-forms`.
84
- * 3. On `ui/notifications/sandbox-resource-ready` from the parent, writes
85
- * the app HTML into the inner iframe.
86
- * 4. Relays every other postMessage bidirectionally, origin-checked.
87
- * 5. Posts `ui/notifications/sandbox-proxy-ready` once attached.
88
- */
89
- const SANDBOX_HTML = `<!doctype html>
90
- <html>
91
- <head>
92
- <meta charset="utf-8" />
93
- <meta name="color-scheme" content="light dark">
94
- <title>sandbox proxy</title>
95
- <style>
96
- html, body { margin: 0; height: 100vh; height: 100dvh; width: 100%; background-color: transparent; }
97
- body { display: flex; flex-direction: column; }
98
- * { box-sizing: border-box; }
99
- iframe {
100
- background-color: transparent;
101
- border: 0px none transparent;
102
- padding: 0px;
103
- overflow: hidden;
104
- flex-grow: 1;
105
- color-scheme: inherit;
106
- }
107
- </style>
108
- </head>
109
- <body>
110
- <script>
111
- (function(){
112
- 'use strict';
113
- if (window.self === window.top) {
114
- throw new Error('This file is only to be used in an iframe sandbox.');
115
- }
116
- if (!document.referrer) {
117
- throw new Error('No referrer, cannot validate embedding site.');
118
- }
119
- var EXPECTED_HOST_ORIGIN = new URL(document.referrer).origin;
120
- var OWN_ORIGIN = new URL(window.location.href).origin;
121
- // Security self-test: top access MUST throw (sandbox attribute strips same-origin).
122
- try {
123
- window.top.alert('If you see this, the sandbox is not setup securely.');
124
- throw 'FAIL';
125
- } catch (e) {
126
- if (e === 'FAIL') {
127
- throw new Error('The sandbox is not setup securely.');
128
- }
129
- }
130
- // Inner iframe — the untrusted app HTML lands here.
131
- var inner = document.createElement('iframe');
132
- inner.style = 'width:100%; height:100%; border:none;';
133
- inner.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-forms');
134
- document.body.appendChild(inner);
135
- var RESOURCE_READY = 'ui/notifications/sandbox-resource-ready';
136
- var PROXY_READY = 'ui/notifications/sandbox-proxy-ready';
137
- window.addEventListener('message', function(event) {
138
- if (event.source === window.parent) {
139
- if (event.origin !== EXPECTED_HOST_ORIGIN) {
140
- console.error('[Sandbox] Rejecting parent message from unexpected origin:', event.origin);
141
- return;
142
- }
143
- if (event.data && event.data.method === RESOURCE_READY) {
144
- var params = event.data.params || {};
145
- var html = params.html;
146
- var sandboxAttr = params.sandbox;
147
- if (typeof sandboxAttr === 'string') {
148
- inner.setAttribute('sandbox', sandboxAttr);
149
- }
150
- if (typeof html === 'string') {
151
- var doc = inner.contentDocument || (inner.contentWindow && inner.contentWindow.document);
152
- if (doc) {
153
- doc.open();
154
- doc.write(html);
155
- doc.close();
156
- } else {
157
- inner.srcdoc = html;
158
- }
159
- }
160
- } else {
161
- if (inner && inner.contentWindow) {
162
- inner.contentWindow.postMessage(event.data, '*');
163
- }
164
- }
165
- } else if (event.source === inner.contentWindow) {
166
- if (event.origin !== OWN_ORIGIN) {
167
- console.error('[Sandbox] Rejecting inner message from unexpected origin:', event.origin);
168
- return;
169
- }
170
- window.parent.postMessage(event.data, EXPECTED_HOST_ORIGIN);
171
- }
172
- });
173
- window.parent.postMessage({
174
- jsonrpc: '2.0',
175
- method: PROXY_READY,
176
- params: {},
177
- }, EXPECTED_HOST_ORIGIN);
178
- })();
179
- </script>
180
- </body>
181
- </html>`;
182
-
183
- function handleRequest(req: IncomingMessage, res: ServerResponse): void {
184
- const url = new URL(req.url ?? "/", "http://placeholder");
185
- if (req.method === "GET" && (url.pathname === "/" || url.pathname === "/sandbox.html")) {
186
- let csp: McpUiResourceCsp | undefined;
187
- const cspParam = url.searchParams.get("csp");
188
- if (cspParam !== null) {
189
- try {
190
- const parsed: unknown = JSON.parse(cspParam);
191
- if (parsed !== null && typeof parsed === "object") {
192
- csp = parsed as McpUiResourceCsp;
193
- }
194
- } catch {
195
- // Malformed ?csp= — fall through to the default (self-only) header;
196
- // an app loading external resources will surface a CSP violation in
197
- // the console rather than silently widening the policy.
198
- }
199
- }
200
- res.setHeader("Content-Security-Policy", buildCspHeader(csp));
201
- res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
202
- res.setHeader("Content-Type", "text/html; charset=utf-8");
203
- res.setHeader("Access-Control-Allow-Origin", "*");
204
- res.statusCode = 200;
205
- res.end(SANDBOX_HTML);
206
- return;
207
- }
208
- res.statusCode = 404;
209
- res.setHeader("Content-Type", "text/plain; charset=utf-8");
210
- res.end("sandbox proxy: only GET /sandbox.html is served here\n");
211
- }
212
-
213
- /**
214
- * Vite plugin: boot the sandbox proxy alongside `vite` dev, tear it down
215
- * with it. Dev-only (`apply: "serve"`); deployed builds set
216
- * `VITE_SANDBOX_URL` instead.
217
- */
218
- export function sandboxProxyPlugin(): Plugin {
219
- let server: Server | undefined;
220
- return {
221
- name: "agentic-app-template:mcp-apps-sandbox-proxy",
222
- apply: "serve",
223
- configureServer(vite) {
224
- server = createServer(handleRequest);
225
- server.on("error", (err) => {
226
- vite.config.logger.error(`[sandbox-proxy] ${String(err)}`);
227
- });
228
- server.listen(SANDBOX_PROXY_PORT, "127.0.0.1", () => {
229
- vite.config.logger.info(
230
- ` sandbox proxy: http://127.0.0.1:${SANDBOX_PROXY_PORT}/sandbox.html`
231
- );
232
- });
233
- vite.httpServer?.on("close", () => {
234
- server?.close();
235
- server = undefined;
236
- });
237
- },
238
- };
239
- }
@@ -1,272 +0,0 @@
1
- /**
2
- * Minimal-but-real local dev chat client: message list folded from the
3
- * reducer's `AgReduceResult.messages` (via `useAgentChat`) + an input box.
4
- * Tool-result blocks that carry an inlined MCP-Apps UI resource (the
5
- * `_meta.ui.resource` convention landing on `AgBlock.tool-result.uiData` —
6
- * opaque JSON on the wire, so it's structurally validated below rather than
7
- * cast) render through `@mcp-ui/client`'s `AppRenderer`, the spec-canonical
8
- * MCP Apps host.
9
- *
10
- * `onCallTool`/`onReadResource` are typed via `ComponentProps<typeof
11
- * AppRenderer>` instead of importing `@modelcontextprotocol/sdk`'s request
12
- * types directly — that keeps this file honest against whatever the
13
- * installed `@mcp-ui/client` version actually expects, with zero guessing.
14
- *
15
- * Sandbox origin (MCP Apps spec, double-iframe architecture): the untrusted
16
- * app HTML must be mounted from a DIFFERENT origin than this page. In dev,
17
- * `vite.config.ts`'s `sandboxProxyPlugin` serves the spec-canonical
18
- * `sandbox.html` on :6891 (a different localhost port = a different origin);
19
- * deployed builds must set `VITE_SANDBOX_URL` to a hosted copy (see
20
- * `../sandbox-proxy.ts` + `.env.example`). Without a resolvable sandbox URL,
21
- * UI resources fall back to a visible notice — NEVER a same-origin mount.
22
- */
23
- import {
24
- Fragment,
25
- useCallback,
26
- useState,
27
- type ComponentProps,
28
- type FormEvent,
29
- type ReactNode,
30
- } from "react";
31
- import { AppRenderer } from "@mcp-ui/client";
32
- import type { AgBlock, AgMessage, JsonValue } from "@silverprotocol/core";
33
- import { AGENT_URL, envUrl, useAgentChat } from "./useAgentChat";
34
-
35
- type AppRendererProps = ComponentProps<typeof AppRenderer>;
36
- type CallToolHandler = NonNullable<AppRendererProps["onCallTool"]>;
37
- type ReadResourceHandler = NonNullable<AppRendererProps["onReadResource"]>;
38
-
39
- /**
40
- * The dev sandbox proxy served by `vite.config.ts`'s `sandboxProxyPlugin`.
41
- * The `6891` literal mirrors `SANDBOX_PROXY_PORT` in `../sandbox-proxy.ts`
42
- * (not imported — that module pulls in `node:http`, which must never enter
43
- * the browser bundle). Keep the two in sync.
44
- */
45
- const DEV_SANDBOX_URL = "http://127.0.0.1:6891/sandbox.html";
46
-
47
- /**
48
- * The sandbox origin UI resources mount from. `VITE_SANDBOX_URL` (a deployed
49
- * copy of the sandbox page on its own origin) wins; in dev the local proxy
50
- * is the fallback. `undefined` (a production build without the env) shows
51
- * the plain-text fallback below instead — the untrusted HTML is never
52
- * mounted same-origin. `envUrl` treats an empty `VITE_SANDBOX_URL=`
53
- * declaration as unset (it loads as `""`, which would defeat `??` and make
54
- * `new URL("")` throw mid-render).
55
- */
56
- const SANDBOX_URL: string | undefined =
57
- envUrl(import.meta.env.VITE_SANDBOX_URL) ?? (import.meta.env.DEV ? DEV_SANDBOX_URL : undefined);
58
-
59
- // ── MCP-embedded-resource narrowing (opaque JsonValue → typed payload) ──────
60
-
61
- interface McpUiResourcePayload {
62
- uri: string;
63
- mimeType?: string;
64
- text?: string;
65
- blob?: string;
66
- }
67
-
68
- function isJsonObject(v: JsonValue): v is { [key: string]: JsonValue } {
69
- return typeof v === "object" && v !== null && !Array.isArray(v);
70
- }
71
-
72
- function asResourcePayload(v: JsonValue): McpUiResourcePayload | undefined {
73
- if (!isJsonObject(v)) return undefined;
74
- if (typeof v.uri !== "string") return undefined;
75
- if (typeof v.text !== "string" && typeof v.blob !== "string") return undefined;
76
- return {
77
- uri: v.uri,
78
- ...(typeof v.mimeType === "string" ? { mimeType: v.mimeType } : {}),
79
- ...(typeof v.text === "string" ? { text: v.text } : {}),
80
- ...(typeof v.blob === "string" ? { blob: v.blob } : {}),
81
- };
82
- }
83
-
84
- /**
85
- * Does a tool-result's `uiData` carry an MCP embedded UI resource? Accepts
86
- * either the resource inlined directly, or wrapped as `{ resource: {...} }`
87
- * (the shape an MCP `resource` content block carries).
88
- */
89
- function asUiResource(uiData: JsonValue | undefined): McpUiResourcePayload | undefined {
90
- if (uiData === undefined || !isJsonObject(uiData)) return undefined;
91
- const direct = asResourcePayload(uiData);
92
- if (direct) return direct;
93
- const nested = uiData.resource;
94
- return nested !== undefined ? asResourcePayload(nested) : undefined;
95
- }
96
-
97
- /**
98
- * The resource's HTML: inline `text` wins; else base64-decode `blob`.
99
- * `atob` alone yields a Latin-1 string (mojibake on multibyte UTF-8), so
100
- * decode via bytes + `TextDecoder`.
101
- */
102
- function resourceHtml(resource: McpUiResourcePayload): string | undefined {
103
- if (resource.text !== undefined) return resource.text;
104
- if (resource.blob !== undefined) {
105
- try {
106
- return new TextDecoder().decode(Uint8Array.from(atob(resource.blob), (c) => c.charCodeAt(0)));
107
- } catch {
108
- return undefined; // not valid base64 — treat as no renderable payload
109
- }
110
- }
111
- return undefined;
112
- }
113
-
114
- /** The tool name for a tool-result block, read off its paired tool-call block in the same message. */
115
- function toolNameFor(message: AgMessage, toolCallId: string): string {
116
- const call = message.content.find(
117
- (b): b is Extract<AgBlock, { type: "tool-call" }> =>
118
- b.type === "tool-call" && b.toolCallId === toolCallId
119
- );
120
- return call?.name ?? "tool";
121
- }
122
-
123
- function renderBlock(
124
- message: AgMessage,
125
- block: AgBlock,
126
- handlers: { onCallTool: CallToolHandler; onReadResource: ReadResourceHandler }
127
- ): ReactNode {
128
- switch (block.type) {
129
- case "text":
130
- return block.text ? <p className="block block-text">{block.text}</p> : null;
131
- case "reasoning":
132
- return block.text ? <p className="block block-reasoning">{block.text}</p> : null;
133
- case "tool-call":
134
- return (
135
- <p className="block block-tool-call">
136
- → calling <code>{block.name}</code>…
137
- </p>
138
- );
139
- case "tool-result": {
140
- const resource = asUiResource(block.uiData);
141
- const html = resource !== undefined ? resourceHtml(resource) : undefined;
142
- if (html !== undefined) {
143
- if (SANDBOX_URL === undefined) {
144
- // No second-origin sandbox available (production build without
145
- // VITE_SANDBOX_URL). Never mount the untrusted HTML same-origin —
146
- // degrade to a visible notice instead.
147
- return (
148
- <p className="block block-tool-result">
149
- ← UI resource received — set <code>VITE_SANDBOX_URL</code> to render it (see{" "}
150
- <code>.env.example</code>).
151
- </p>
152
- );
153
- }
154
- return (
155
- <div className="block block-ui-resource">
156
- <AppRenderer
157
- key={block.toolCallId}
158
- toolName={toolNameFor(message, block.toolCallId)}
159
- sandbox={{ url: new URL(SANDBOX_URL) }}
160
- html={html}
161
- onCallTool={handlers.onCallTool}
162
- onReadResource={handlers.onReadResource}
163
- onError={(err: unknown) => console.warn("[AppRenderer]", err)}
164
- />
165
- </div>
166
- );
167
- }
168
- return (
169
- <p className={`block block-tool-result${block.isError ? " is-error" : ""}`}>
170
- ← {block.isError ? "tool error" : "tool result"}
171
- </p>
172
- );
173
- }
174
- default:
175
- return null;
176
- }
177
- }
178
-
179
- export function App() {
180
- const { result, busy, error, needsResync, send } = useAgentChat();
181
- const [draft, setDraft] = useState("");
182
-
183
- // Neither relay exists in this minimal template — this worker only exposes
184
- // `POST /agent/invoke` (see useAgentChat.ts), not a general tool-call/
185
- // resource-read relay. Rendered UI resources that DON'T round-trip through
186
- // the model (most simple cards/forms) still work; ones that do get a clear
187
- // error here instead of a silent hang.
188
- const onCallTool = useCallback<CallToolHandler>(async (params) => {
189
- throw new Error(
190
- `tool-call relay is not wired in this template (requested "${params.name}") — ` +
191
- `add a relay endpoint on your worker for full MCP Apps interactivity.`
192
- );
193
- }, []);
194
- const onReadResource = useCallback<ReadResourceHandler>(async (params) => {
195
- throw new Error(`resource-read relay is not wired in this template (requested "${params.uri}")`);
196
- }, []);
197
-
198
- const onSubmit = (e: FormEvent<HTMLFormElement>) => {
199
- e.preventDefault();
200
- const text = draft.trim();
201
- if (!text || busy) return;
202
- setDraft("");
203
- void send(text);
204
- };
205
-
206
- return (
207
- <div className="app">
208
- <style>{`
209
- :root { color-scheme: light dark; }
210
- body { margin: 0; font-family: system-ui, sans-serif; }
211
- .app { display: flex; flex-direction: column; height: 100vh; max-width: 720px; margin: 0 auto; }
212
- header { padding: 12px 16px; border-bottom: 1px solid #8884; }
213
- header h1 { font-size: 15px; margin: 0; }
214
- header p { font-size: 12px; opacity: 0.6; margin: 2px 0 0; }
215
- .history { flex: 1; overflow-y: auto; padding: 12px 16px; display: flex; flex-direction: column; gap: 10px; }
216
- .empty { opacity: 0.5; font-size: 13px; }
217
- .message { max-width: 85%; }
218
- .message-user { align-self: flex-end; text-align: right; }
219
- .message-assistant, .message-tool { align-self: flex-start; }
220
- .block { margin: 0; padding: 6px 10px; border-radius: 8px; background: #8882; white-space: pre-wrap; }
221
- .message-user .block-text { background: #4c8bf522; }
222
- .block-tool-call, .block-tool-result { font-size: 12px; opacity: 0.7; background: none; padding: 0; }
223
- .block-tool-result.is-error { color: #d33; }
224
- .block-ui-resource { padding: 0; background: none; }
225
- .block-ui-resource iframe { width: 100%; min-height: 240px; border: 1px solid #8884; border-radius: 8px; }
226
- .banner { margin: 0 16px 8px; padding: 6px 10px; border-radius: 6px; font-size: 12px; }
227
- .banner-error { background: #d3333322; color: #d33; }
228
- .banner-warn { background: #d3901922; color: #b8720f; }
229
- .composer { display: flex; gap: 8px; padding: 12px 16px; border-top: 1px solid #8884; }
230
- .composer input { flex: 1; padding: 8px 10px; border-radius: 6px; border: 1px solid #8886; }
231
- .composer button { padding: 8px 14px; border-radius: 6px; border: none; background: #4c8bf5; color: white; }
232
- .composer button:disabled { opacity: 0.5; }
233
- `}</style>
234
- <header>
235
- <h1>agentic-app-template</h1>
236
- <p>{AGENT_URL}</p>
237
- </header>
238
-
239
- <main className="history" role="log" aria-live="polite">
240
- {result.messages.length === 0 ? (
241
- <p className="empty">Say something to your agent.</p>
242
- ) : (
243
- result.messages.map((message) => (
244
- <div key={message.id} className={`message message-${message.role}`}>
245
- {message.content.map((block, i) => (
246
- <Fragment key={i}>{renderBlock(message, block, { onCallTool, onReadResource })}</Fragment>
247
- ))}
248
- </div>
249
- ))
250
- )}
251
- </main>
252
-
253
- {needsResync ? (
254
- <p className="banner banner-warn">Stream fell out of sync — reload to resync.</p>
255
- ) : null}
256
- {error ? <p className="banner banner-error">{error}</p> : null}
257
-
258
- <form className="composer" onSubmit={onSubmit}>
259
- <input
260
- value={draft}
261
- onChange={(e) => setDraft(e.target.value)}
262
- placeholder="Message your agent…"
263
- disabled={busy}
264
- autoFocus
265
- />
266
- <button type="submit" disabled={busy || !draft.trim()}>
267
- {busy ? "Sending…" : "Send"}
268
- </button>
269
- </form>
270
- </div>
271
- );
272
- }
@@ -1,12 +0,0 @@
1
- import { StrictMode } from "react";
2
- import { createRoot } from "react-dom/client";
3
- import { App } from "./App";
4
-
5
- const root = document.getElementById("root");
6
- if (!root) throw new Error("#root element missing from index.html");
7
-
8
- createRoot(root).render(
9
- <StrictMode>
10
- <App />
11
- </StrictMode>
12
- );