@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,45 @@
1
+ /**
2
+ * Live-ness probe for the Home page.
3
+ *
4
+ * Probes the agent's invoke route with a CORS preflight-shaped OPTIONS —
5
+ * the ONE route both servers answer cross-origin: the pod's CORS covers
6
+ * `/agent/invoke` for the app's allowed domains, and `guuey dev --serve`
7
+ * answers OPTIONS 204 on it too. (A bare `/healthz` GET carries no CORS
8
+ * headers on either server, so it is useless from a browser.) The
9
+ * platform's richer status API is credentialed and guuey-origin-CORS'd, so
10
+ * the CLI is the tool for detail: `pnpm status` runs `guuey apps get` +
11
+ * `guuey agent status`.
12
+ */
13
+ import { agentEndpointUrl, isLinked } from "../config";
14
+
15
+ export type AgentProbe =
16
+ | { state: "checking" }
17
+ | { state: "reachable" }
18
+ | {
19
+ /**
20
+ * Calm, honest failure: a fresh clone before `bootstrap --link` (or a
21
+ * dev session without `pnpm dev` running) is ALWAYS in this state —
22
+ * it is a setup stage, not an error.
23
+ */
24
+ state: "unreachable";
25
+ hint: string;
26
+ };
27
+
28
+ export async function probeAgent(): Promise<AgentProbe> {
29
+ const base = agentEndpointUrl().replace(/\/+$/, "");
30
+ try {
31
+ const res = await fetch(`${base}/agent/invoke`, {
32
+ method: "OPTIONS",
33
+ signal: AbortSignal.timeout(5000),
34
+ });
35
+ if (res.ok) return { state: "reachable" };
36
+ return { state: "unreachable", hint: `agent answered ${res.status}` };
37
+ } catch {
38
+ return {
39
+ state: "unreachable",
40
+ hint: isLinked
41
+ ? "agent unreachable from this origin — check the app's Allowed Domains include this site, and that a deployment is live (pnpm status)"
42
+ : "local dev router not running — start it with `pnpm dev` (or bind a deployed app with `pnpm bootstrap -- --link`)",
43
+ };
44
+ }
45
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Host-page loader for the guuey widget (distribution way #1).
3
+ *
4
+ * The queue shim + single-init + idempotent script tag pattern — safe under
5
+ * React strict-mode double effects and route remounts. The widget only
6
+ * works against a DEPLOYED app (it loads from the environment's widget
7
+ * origin and frames the app's hosted chat), so callers gate on
8
+ * `appConfig.link`.
9
+ */
10
+ import { appConfig } from "../config";
11
+
12
+ interface GuueyGlobal {
13
+ (...args: unknown[]): void;
14
+ q?: unknown[][];
15
+ loaded?: boolean;
16
+ }
17
+
18
+ declare global {
19
+ interface Window {
20
+ guuey?: GuueyGlobal;
21
+ }
22
+ }
23
+
24
+ const SCRIPT_ID = "guuey-widget-v1";
25
+ let initDispatched = false;
26
+
27
+ function ensureGlobal(): GuueyGlobal {
28
+ if (!window.guuey) {
29
+ const shim: GuueyGlobal = function (...args: unknown[]) {
30
+ (shim.q = shim.q ?? []).push(args);
31
+ };
32
+ window.guuey = shim;
33
+ }
34
+ return window.guuey;
35
+ }
36
+
37
+ export type WidgetOutcome = "live" | "offline";
38
+
39
+ /**
40
+ * Mount the widget launcher once: dispatches `guuey("init", …)` on first
41
+ * call and injects `<widget origin>/v1.js` if it is not already on the
42
+ * page. Subsequent calls are no-ops. Returns false when the app is not
43
+ * linked yet (nothing to embed).
44
+ */
45
+ export function mountWidget(onOutcome?: (o: WidgetOutcome) => void): boolean {
46
+ const link = appConfig.link;
47
+ if (!link) return false;
48
+
49
+ const guuey = ensureGlobal();
50
+ if (!initDispatched) {
51
+ initDispatched = true;
52
+ guuey("init", {
53
+ app: link.appId,
54
+ launcher: `Ask ${appConfig.brand.name}`,
55
+ color: appConfig.theme.accent,
56
+ theme: appConfig.theme.mode,
57
+ });
58
+ }
59
+
60
+ if (!document.getElementById(SCRIPT_ID)) {
61
+ const script = document.createElement("script");
62
+ script.id = SCRIPT_ID;
63
+ script.src = `${link.widgetOrigin}/v1.js`;
64
+ script.async = true;
65
+ script.addEventListener("load", () => onOutcome?.("live"));
66
+ script.addEventListener("error", () => onOutcome?.("offline"));
67
+ document.head.appendChild(script);
68
+ } else {
69
+ onOutcome?.("live");
70
+ }
71
+ return true;
72
+ }
73
+
74
+ /**
75
+ * A value embedded inside an inline <script> on the customer's page: JSON
76
+ * string escaping, plus a `<` rewrite so a pathological brand name cannot
77
+ * smuggle `</script>` and terminate the element (the same rule the widget's
78
+ * own snippet generator applies).
79
+ */
80
+ function jsString(value: string): string {
81
+ return JSON.stringify(value).replaceAll("<", "\\u003c");
82
+ }
83
+
84
+ /** The copy-paste embed snippet with this app's real values, for the Home guide. */
85
+ export function widgetSnippet(): string | null {
86
+ const link = appConfig.link;
87
+ if (!link) return null;
88
+ return [
89
+ "<!-- guuey widget. Add this site to the app's allowed domains or the embed is refused. -->",
90
+ "<script>",
91
+ " window.guuey = window.guuey || function(){(guuey.q=guuey.q||[]).push(arguments)};",
92
+ ` guuey("init", { app: ${jsString(link.appId)}, launcher: ${jsString(`Ask ${appConfig.brand.name}`)} });`,
93
+ "</script>",
94
+ `<script src="${link.widgetOrigin}/v1.js" async></script>`,
95
+ ].join("\n");
96
+ }
@@ -0,0 +1,52 @@
1
+ import { StrictMode } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import { createBrowserRouter, RouterProvider } from "react-router-dom";
4
+ import "@guuey/chat/styles.css";
5
+ import "./styles.css";
6
+ import { appConfig } from "./config";
7
+ import { BootstrapGate } from "./components/BootstrapGate";
8
+ import { Shell } from "./components/Shell";
9
+ import { Landing } from "./pages/Landing";
10
+ import { Login } from "./pages/Login";
11
+ import { Chat } from "./pages/Chat";
12
+ import { Home } from "./pages/Home";
13
+
14
+ // Site theme: one accent + light/dark, applied as CSS variables. The chat
15
+ // kit themes itself via its own tokens (see @guuey/chat theming docs).
16
+ document.documentElement.dataset.mode = appConfig.theme.mode;
17
+ document.documentElement.style.setProperty("--app-accent", appConfig.theme.accent);
18
+ document.title = appConfig.brand.name;
19
+
20
+ // Optional external script (the analytics-snippet pattern): a build-time
21
+ // env names a script URL and this app loads it — the demo tour rides this
22
+ // hook (its bundle lives OUTSIDE the template; guuey#303). The script can
23
+ // anchor on the `data-tour` attributes the pages carry and listen for the
24
+ // `demo:render-complete` CustomEvent the app shell dispatches when a
25
+ // generative view first lands on the canvas.
26
+ const tourSrc = import.meta.env.VITE_DEMO_TOUR_SRC;
27
+ if (tourSrc !== undefined && tourSrc !== "") {
28
+ const script = document.createElement("script");
29
+ script.src = tourSrc;
30
+ script.defer = true;
31
+ document.head.appendChild(script);
32
+ }
33
+
34
+ const router = createBrowserRouter([
35
+ {
36
+ element: <Shell />,
37
+ children: [
38
+ { path: "/", element: <Landing /> },
39
+ { path: "/login", element: <Login /> },
40
+ { path: "/chat", element: <Chat /> },
41
+ { path: "/home", element: <Home /> },
42
+ ],
43
+ },
44
+ ]);
45
+
46
+ createRoot(document.getElementById("root")!).render(
47
+ <StrictMode>
48
+ <BootstrapGate>
49
+ <RouterProvider router={router} />
50
+ </BootstrapGate>
51
+ </StrictMode>,
52
+ );
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The embedded chat page — distribution way #2 in the flesh. In local dev
3
+ * this talks to `guuey dev --serve` (pnpm dev boots it); once linked it
4
+ * talks to the deployed agent pod. Generative-UI cards render inline via
5
+ * the chat kit's sandboxed default mount — no extra setup.
6
+ */
7
+ import { AgentChat } from "../components/AgentChat";
8
+
9
+ export function Chat() {
10
+ return (
11
+ <main className="page chat-page">
12
+ <AgentChat className="chat-fill" />
13
+ </main>
14
+ );
15
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Home — the instructions page: live agent status + the three-ways
3
+ * distribution guide, every snippet carrying this app's REAL values (no
4
+ * "replace me" placeholders once linked).
5
+ */
6
+ import { useEffect, useState } from "react";
7
+ import { Link } from "react-router-dom";
8
+ import { agentEndpointUrl, appConfig } from "../config";
9
+ import { CHAT_PATH } from "../routes";
10
+ import { probeAgent, type AgentProbe } from "../lib/status";
11
+ import { widgetSnippet } from "../lib/widget";
12
+
13
+ function chatSnippet(): string {
14
+ const endpoint = appConfig.link?.endpointUrl ?? "http://localhost:6790";
15
+ const api = appConfig.link?.apiBaseUrl ?? "http://localhost:6790";
16
+ const appId = appConfig.link?.appId ?? "local";
17
+ return [
18
+ `import { GuueyChat } from "@guuey/chat/react";`,
19
+ `import "@guuey/chat/styles.css";`,
20
+ ``,
21
+ `<GuueyChat`,
22
+ ` endpointUrl="${endpoint}"`,
23
+ ` appId="${appId}"`,
24
+ ` apiBaseUrl="${api}"`,
25
+ ` getGuestSecret={() => myGuestSecret}`,
26
+ `/>`,
27
+ ].join("\n");
28
+ }
29
+
30
+ export function Home() {
31
+ const [probe, setProbe] = useState<AgentProbe>({ state: "checking" });
32
+
33
+ useEffect(() => {
34
+ let cancelled = false;
35
+ void probeAgent().then((result) => {
36
+ if (!cancelled) setProbe(result);
37
+ });
38
+ return () => {
39
+ cancelled = true;
40
+ };
41
+ }, []);
42
+
43
+ const link = appConfig.link;
44
+
45
+ return (
46
+ <main className="page home">
47
+ <section className="card">
48
+ <h2>Agent status</h2>
49
+ <dl className="facts">
50
+ <dt>Endpoint</dt>
51
+ <dd>
52
+ <code>{agentEndpointUrl()}</code>
53
+ </dd>
54
+ <dt>Reachability</dt>
55
+ <dd>
56
+ {probe.state === "checking" ? "checking…" : null}
57
+ {probe.state === "reachable" ? <span className="ok">reachable</span> : null}
58
+ {probe.state === "unreachable" ? <span className="calm">{probe.hint}</span> : null}
59
+ </dd>
60
+ {link ? (
61
+ <>
62
+ <dt>App</dt>
63
+ <dd>
64
+ <code>{link.appId}</code> ({link.env})
65
+ </dd>
66
+ {link.pageUrl ? (
67
+ <>
68
+ <dt>Agent's page</dt>
69
+ <dd>
70
+ <a href={link.pageUrl} target="_blank" rel="noreferrer">
71
+ {link.pageUrl}
72
+ </a>
73
+ </dd>
74
+ </>
75
+ ) : null}
76
+ </>
77
+ ) : (
78
+ <>
79
+ <dt>Deployment</dt>
80
+ <dd className="calm">
81
+ not linked yet — <code>pnpm bootstrap -- --link</code> binds a deployed guuey app
82
+ </dd>
83
+ </>
84
+ )}
85
+ </dl>
86
+ <p className="hint">
87
+ Full detail lives in the CLI: <code>pnpm status</code> (runs{" "}
88
+ <code>guuey apps get</code> + <code>guuey agent status</code>).
89
+ </p>
90
+ </section>
91
+
92
+ <section className="card">
93
+ <h2>Three ways your users reach this agent</h2>
94
+
95
+ <h3>1 · The widget, on any site</h3>
96
+ <p>One script tag gives any page the floating launcher.</p>
97
+ {link ? (
98
+ <pre>
99
+ <code>{widgetSnippet()}</code>
100
+ </pre>
101
+ ) : (
102
+ <p className="calm">Snippet appears with real values after linking.</p>
103
+ )}
104
+
105
+ <h3>2 · Embedded chat, inside your app</h3>
106
+ <p>
107
+ The <code>@guuey/chat</code> kit, running on the <Link to={CHAT_PATH}>Chat page</Link> of
108
+ this very app:
109
+ </p>
110
+ <pre>
111
+ <code>{chatSnippet()}</code>
112
+ </pre>
113
+
114
+ <h3>3 · The guuey portal</h3>
115
+ {link?.slug ? (
116
+ <p>
117
+ Users can find and chat with this agent in the portal:{" "}
118
+ <a href={`${link.portalUrl}/agent/${link.slug}`} target="_blank" rel="noreferrer">
119
+ {link.portalUrl}/agent/{link.slug}
120
+ </a>
121
+ </p>
122
+ ) : link ? (
123
+ <p className="calm">
124
+ Claim a public short name first — <code>guuey slug claim &lt;name&gt;</code> — then the
125
+ portal link (and the agent's own page) light up.
126
+ </p>
127
+ ) : (
128
+ <p className="calm">Available after linking a deployed app.</p>
129
+ )}
130
+ </section>
131
+ </main>
132
+ );
133
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Landing — the widget IS the hero (distribution way #1). On a linked app
3
+ * the real guuey widget launcher mounts in the corner; before linking, an
4
+ * honest placeholder explains what will appear here.
5
+ */
6
+ import { useEffect, useState } from "react";
7
+ import { Link } from "react-router-dom";
8
+ import { appConfig, isLinked } from "../config";
9
+ import { CHAT_PATH, HOME_PATH } from "../routes";
10
+ import { mountWidget, type WidgetOutcome } from "../lib/widget";
11
+ import { QrLink } from "../components/QrLink";
12
+
13
+ export function Landing() {
14
+ const [widget, setWidget] = useState<WidgetOutcome | "unlinked" | "loading">(
15
+ isLinked ? "loading" : "unlinked",
16
+ );
17
+
18
+ useEffect(() => {
19
+ if (!isLinked) return;
20
+ mountWidget((outcome) => setWidget(outcome));
21
+ }, []);
22
+
23
+ // The demo posture (spec §2.3): a REAL product site whose hero's one job
24
+ // is getting the visitor INTO the demo — big CTA to the console page +
25
+ // a QR to continue on mobile via the portal.
26
+ const portalTarget =
27
+ appConfig.link !== null
28
+ ? `${appConfig.link.portalUrl}/agent/${appConfig.link.slug ?? appConfig.link.appId}`
29
+ : null;
30
+
31
+ return (
32
+ <main className="page landing">
33
+ <section className="hero" data-tour="hero">
34
+ <h1>{appConfig.copy.landing.headline}</h1>
35
+ <p>{appConfig.copy.landing.sub}</p>
36
+ <div className="hero-actions">
37
+ <Link to={CHAT_PATH} className="btn btn-accent">
38
+ {appConfig.demoMode ? "Enter the demo" : "Open the chat"}
39
+ </Link>
40
+ <Link to={HOME_PATH} className="btn">
41
+ How this app is wired
42
+ </Link>
43
+ </div>
44
+ {appConfig.demoMode && portalTarget !== null ? (
45
+ <div className="hero-qr">
46
+ <p className="hint">Or continue on your phone:</p>
47
+ <QrLink url={portalTarget} size={140} />
48
+ </div>
49
+ ) : null}
50
+ {widget === "unlinked" ? (
51
+ <p className="hint">
52
+ The floating agent launcher appears here once the app is bound to a
53
+ deployed guuey agent — <code>pnpm bootstrap -- --link</code>.
54
+ </p>
55
+ ) : null}
56
+ {widget === "offline" ? (
57
+ <p className="hint">
58
+ Widget script failed to load from this environment — check the app's
59
+ Allowed Domains include this site.
60
+ </p>
61
+ ) : null}
62
+ </section>
63
+ </main>
64
+ );
65
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Login — two doors, one identity rule (never both at once):
3
+ *
4
+ * - "Continue as guest": one click, no account. A per-browser secret is
5
+ * minted locally; the agent remembers this browser across visits.
6
+ * - "Sign in": the BYO-OIDC seam. Active only when `auth.oidc` is
7
+ * configured in guuey.app.json (any spec-compliant IdP — this is where a
8
+ * "Sign in with Google" plugs in). The bound guuey app must be in BYO
9
+ * auth mode for the same issuer.
10
+ */
11
+ import { useEffect, useRef, useState } from "react";
12
+ import { useNavigate } from "react-router-dom";
13
+ import { appConfig } from "../config";
14
+ import { CHAT_PATH } from "../routes";
15
+ import { continueAsGuest, setIdentityMode } from "../lib/identity";
16
+ import { completeSignIn, isSigninCallback, oidcConfigured, signIn, signOutOidc } from "../lib/oidc";
17
+
18
+ export function Login() {
19
+ const navigate = useNavigate();
20
+ const [error, setError] = useState<string | null>(null);
21
+ const [completing, setCompleting] = useState(isSigninCallback());
22
+ // One-shot: StrictMode double-invokes effects in dev, and the OIDC
23
+ // authorization code is single-use — a second signinCallback() would
24
+ // double-spend it and flash a bogus failure.
25
+ const callbackStarted = useRef(false);
26
+
27
+ // Finish the redirect flow when the IdP sent us back here.
28
+ useEffect(() => {
29
+ if (!isSigninCallback() || callbackStarted.current) return;
30
+ callbackStarted.current = true;
31
+ completeSignIn()
32
+ .then(() => {
33
+ setIdentityMode("oidc");
34
+ navigate(CHAT_PATH, { replace: true });
35
+ })
36
+ .catch((err: unknown) => {
37
+ setCompleting(false);
38
+ setError(err instanceof Error ? err.message : String(err));
39
+ });
40
+ }, [navigate]);
41
+
42
+ function guest() {
43
+ // One identity mode per surface: an explicit guest choice also drops
44
+ // any cached OIDC session, so a stale bearer can never shadow it.
45
+ void signOutOidc();
46
+ continueAsGuest();
47
+ navigate(CHAT_PATH);
48
+ }
49
+
50
+ if (completing) {
51
+ return (
52
+ <main className="page login">
53
+ <div className="login-card">
54
+ <p>Completing sign-in…</p>
55
+ </div>
56
+ </main>
57
+ );
58
+ }
59
+
60
+ return (
61
+ <main className="page login">
62
+ <div className="login-card">
63
+ <h1>Welcome to {appConfig.brand.name}</h1>
64
+ {oidcConfigured() ? (
65
+ <button type="button" className="btn btn-accent btn-wide" onClick={() => void signIn()}>
66
+ Sign in
67
+ </button>
68
+ ) : (
69
+ <button type="button" className="btn btn-wide" disabled title="Configure auth.oidc in guuey.app.json (or via bootstrap) to enable sign-in">
70
+ Sign in — not configured yet
71
+ </button>
72
+ )}
73
+ <button type="button" className="btn btn-wide" onClick={guest}>
74
+ Continue as guest
75
+ </button>
76
+ <p className="hint">{appConfig.copy.login.guestHint}</p>
77
+ {error ? <p className="error">Sign-in failed: {error}</p> : null}
78
+ </div>
79
+ </main>
80
+ );
81
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Route constants shared by the chrome and pages. The agentic-app template
3
+ * overlays this file (its chat lives at /app/agent inside the app shell) —
4
+ * link via these constants, never hard-code the paths in components.
5
+ */
6
+ export const CHAT_PATH = "/chat";
7
+ export const HOME_PATH = "/home";