@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,398 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * pnpm bootstrap — configure this app. Two phases, deliberately split:
4
+ *
5
+ * pnpm bootstrap local only, no account: brand, theme,
6
+ * copy → guuey.app.json + AGENTS.md
7
+ * pnpm bootstrap -- --link bind an EXISTING guuey app (creation
8
+ * stays `guuey apps create` — the moment
9
+ * billing/trial starts remains explicit)
10
+ *
11
+ * Contract: converging + idempotent (re-run any time), `--check` prints
12
+ * machine-readable JSON of what's configured and what's missing, `--yes`
13
+ * is fully non-interactive, secrets are NEVER printed (paths only), and
14
+ * every platform mutation goes through a `guuey` CLI primitive — this
15
+ * script is a thin orchestrator, not a second platform client.
16
+ *
17
+ * Flags:
18
+ * --yes accept defaults for every prompt
19
+ * --check report state as JSON and exit (0 = every required
20
+ * step done, 3 = a required step missing; optional
21
+ * steps are listed but never fail; never mutates)
22
+ * --link run the bind phase (implies the local phase ran)
23
+ * --app-id <id> the app to bind (default: guuey.json's appId,
24
+ * else prompted)
25
+ * --env <e> dev|staging|release when it cannot be derived
26
+ * --domains <d1,d2> allowed origins to push on --link (prompted when
27
+ * interactive; skipped under --yes without the flag)
28
+ * --name/--tagline/--accent/--mode/--headline local-phase overrides
29
+ */
30
+ import { execFile } from "node:child_process";
31
+ import { promisify } from "node:util";
32
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
33
+ import { createInterface } from "node:readline/promises";
34
+ import { stdin, stdout } from "node:process";
35
+ import { join, dirname } from "node:path";
36
+ import { fileURLToPath } from "node:url";
37
+
38
+ const execFileAsync = promisify(execFile);
39
+ const projectRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
40
+ const CONFIG_PATH = join(projectRoot, "guuey.app.json");
41
+ const AGENTS_PATH = join(projectRoot, "AGENTS.md");
42
+ const CLAUDE_PATH = join(projectRoot, "CLAUDE.md");
43
+ const GUUEY_JSON_PATH = join(projectRoot, "guuey.json");
44
+
45
+ const START_MARK = "<!-- guuey:bootstrap:start -->";
46
+ const END_MARK = "<!-- guuey:bootstrap:end -->";
47
+
48
+ // Per-env public hosts. Two distinct "agents" domain families exist and must
49
+ // not be confused: SLUG pages live at <slug>.agents.guuey.com (prod) /
50
+ // <slug>.agents.<env>.sandbox.guuey.com — always read back from the platform
51
+ // as pageUrl, never derived here — while canonical appId ENDPOINTS live at
52
+ // <appId>.agents.us-east-1.guuey.com (prod) / <appId>.agents.<env>.sandbox
53
+ // .guuey.com. `endpointDomain` below is the ENDPOINT family, used only as
54
+ // the fallback when the app has no live deployment to read the URL from.
55
+ const ENV_HOSTS = {
56
+ release: {
57
+ apiBaseUrl: "https://api.us-east-1.guuey.com/v1",
58
+ widgetOrigin: "https://widget.guuey.com",
59
+ portalUrl: "https://app.guuey.com",
60
+ endpointDomain: "agents.us-east-1.guuey.com",
61
+ },
62
+ staging: {
63
+ apiBaseUrl: "https://api.staging.sandbox.guuey.com/v1",
64
+ widgetOrigin: "https://staging.widget.sandbox.guuey.com",
65
+ portalUrl: "https://staging.app.sandbox.guuey.com",
66
+ endpointDomain: "agents.staging.sandbox.guuey.com",
67
+ },
68
+ dev: {
69
+ apiBaseUrl: "https://api.dev.sandbox.guuey.com/v1",
70
+ widgetOrigin: "https://dev.widget.sandbox.guuey.com",
71
+ portalUrl: "https://dev.app.sandbox.guuey.com",
72
+ endpointDomain: "agents.dev.sandbox.guuey.com",
73
+ },
74
+ };
75
+
76
+ // ── plumbing ────────────────────────────────────────────────────────────────
77
+
78
+ function parseArgs(argv) {
79
+ const flags = {};
80
+ for (let i = 0; i < argv.length; i++) {
81
+ const arg = argv[i];
82
+ if (!arg.startsWith("--")) continue;
83
+ const key = arg.slice(2);
84
+ const next = argv[i + 1];
85
+ if (next !== undefined && !next.startsWith("--")) {
86
+ flags[key] = next;
87
+ i++;
88
+ } else {
89
+ flags[key] = true;
90
+ }
91
+ }
92
+ return flags;
93
+ }
94
+
95
+ function readConfig() {
96
+ return JSON.parse(readFileSync(CONFIG_PATH, "utf8"));
97
+ }
98
+
99
+ function writeConfig(config) {
100
+ writeFileSync(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, "utf8");
101
+ }
102
+
103
+ async function ask(rl, question, fallback, yes) {
104
+ if (yes) return fallback;
105
+ const answer = (await rl.question(`${question} [${fallback}]: `)).trim();
106
+ return answer || fallback;
107
+ }
108
+
109
+ /** Run a `guuey` CLI command; the CLI's own stderr passes through on failure. */
110
+ async function guuey(args) {
111
+ try {
112
+ const { stdout: out } = await execFileAsync("pnpm", ["exec", "guuey", ...args], {
113
+ cwd: projectRoot,
114
+ maxBuffer: 4 * 1024 * 1024,
115
+ });
116
+ return { ok: true, stdout: out };
117
+ } catch (err) {
118
+ const stderr = typeof err?.stderr === "string" ? err.stderr.trim() : "";
119
+ const out = typeof err?.stdout === "string" ? err.stdout.trim() : "";
120
+ return { ok: false, stdout: out, error: stderr || out || String(err) };
121
+ }
122
+ }
123
+
124
+ // ── ggui.json theme sync (guuey#302 scaffold hygiene) ───────────────────────
125
+
126
+ /**
127
+ * Keep `ggui/ggui.json`'s theme MODE in step with guuey.app.json so the
128
+ * local `ggui serve` preview matches the site (the scaffold used to ship
129
+ * the two contradicting each other: light site, dark ggui preview). Only
130
+ * `mode` syncs — `preset` is ggui-side vocabulary and stays the author's
131
+ * choice. NOTE: the deployed render's theme is platform data (`guuey
132
+ * deploy` deliberately ignores this block; guuey#304 owns the production
133
+ * side) — this sync is about local-preview honesty.
134
+ */
135
+ function syncGguiTheme(config) {
136
+ const gguiJsonPath = join(projectRoot, "ggui", "ggui.json");
137
+ if (!existsSync(gguiJsonPath)) return;
138
+ const ggui = JSON.parse(readFileSync(gguiJsonPath, "utf8"));
139
+ if (ggui.theme?.mode === config.theme.mode) return;
140
+ ggui.theme = { ...(ggui.theme ?? {}), mode: config.theme.mode };
141
+ writeFileSync(gguiJsonPath, `${JSON.stringify(ggui, null, 2)}\n`, "utf8");
142
+ console.log(`ggui/ggui.json theme mode → ${config.theme.mode} (local preview matches the site).`);
143
+ }
144
+
145
+ // ── AGENTS.md managed block ─────────────────────────────────────────────────
146
+
147
+ function managedBlock(config) {
148
+ const link = config.link;
149
+ // The agent's shape steers the guidance: a declarative agent (an
150
+ // `--example` extraction, or a Studio pull) has NO worker build — its
151
+ // whole definition is guuey.json + the system prompt.
152
+ const guueyJson = existsSync(GUUEY_JSON_PATH)
153
+ ? JSON.parse(readFileSync(GUUEY_JSON_PATH, "utf8"))
154
+ : {};
155
+ const declarative = guueyJson?.agent?.mode === "declarative";
156
+ const lines = [
157
+ START_MARK,
158
+ "## This project (generated by `pnpm bootstrap` — edit outside the markers)",
159
+ "",
160
+ `- **App**: ${config.brand.name} — ${config.brand.tagline}`,
161
+ declarative
162
+ ? "- **Agent shape**: DECLARATIVE — the agent is entirely `guuey.json` + `prompts/`; there is no worker build and no `src/` agent code. Change behavior by editing the system prompt / mcpServers, then `guuey deploy`."
163
+ : "- **Agent shape**: code-mode — the agent entry under `src/` builds to the deployable worker (`pnpm build`).",
164
+ link
165
+ ? `- **Bound guuey app**: \`${link.appId}\` (${link.env}). NEVER hand-edit this id — re-run \`pnpm bootstrap -- --link\` to rebind.`
166
+ : "- **Bound guuey app**: none yet — `pnpm bootstrap -- --link` binds one (create first with `guuey apps create --name ...`).",
167
+ link ? `- **Agent endpoint**: ${link.endpointUrl}` : "- **Agent endpoint (local dev)**: http://localhost:6790 via `pnpm dev`",
168
+ link && link.pageUrl ? `- **Agent's own page**: ${link.pageUrl}` : null,
169
+ "- **Commands**: `pnpm dev` (local stack) · `pnpm bootstrap` (reconfigure) · `pnpm status` (live app state) · `guuey deploy` (ship the agent)",
170
+ "- **Config**: `guuey.app.json` (frontend/brand — schema in `guuey.app.schema.json`) and `guuey.json` (the agent definition). Secrets live in `.env.local`, never in either file.",
171
+ "- **Frontend**: `web/` — Vite + React on `@guuey/chat`; identity is guest-secret or BYO-OIDC, never both on one surface.",
172
+ END_MARK,
173
+ ].filter((line) => line !== null);
174
+ return lines.join("\n");
175
+ }
176
+
177
+ function regenerateAgentsMd(config) {
178
+ const block = managedBlock(config);
179
+ let content = existsSync(AGENTS_PATH) ? readFileSync(AGENTS_PATH, "utf8") : "# AGENTS.md\n";
180
+ const start = content.indexOf(START_MARK);
181
+ const end = content.indexOf(END_MARK);
182
+ if (start !== -1 && end !== -1 && end > start) {
183
+ content = content.slice(0, start) + block + content.slice(end + END_MARK.length);
184
+ } else {
185
+ // Insert after the H1 (first line), before everything else.
186
+ const nl = content.indexOf("\n");
187
+ const head = nl === -1 ? content : content.slice(0, nl + 1);
188
+ const rest = nl === -1 ? "" : content.slice(nl + 1);
189
+ content = `${head}\n${block}\n${rest}`;
190
+ }
191
+ writeFileSync(AGENTS_PATH, content, "utf8");
192
+
193
+ if (!existsSync(CLAUDE_PATH)) {
194
+ writeFileSync(
195
+ CLAUDE_PATH,
196
+ "# CLAUDE.md\n\nSee [AGENTS.md](./AGENTS.md) — the single source of agent guidance for this repo.\n",
197
+ "utf8",
198
+ );
199
+ }
200
+ }
201
+
202
+ // ── link-phase helpers ──────────────────────────────────────────────────────
203
+
204
+ function deriveEnv(app) {
205
+ const hosts = [app.pageUrl, app.endpointUrl].filter(Boolean).join(" ");
206
+ if (/\.agents\.guuey\.com|agents\.us-east-1\.guuey\.com/.test(hosts)) return "release";
207
+ const m = /\.agents\.(dev|staging)\.sandbox\.guuey\.com/.exec(hosts);
208
+ return m ? m[1] : null;
209
+ }
210
+
211
+ async function linkPhase(config, flags, yes) {
212
+ const guueyJson = existsSync(GUUEY_JSON_PATH) ? JSON.parse(readFileSync(GUUEY_JSON_PATH, "utf8")) : {};
213
+ let appId = typeof flags["app-id"] === "string" ? flags["app-id"] : guueyJson.appId;
214
+ if (!appId && !yes) {
215
+ const rl = createInterface({ input: stdin, output: stdout });
216
+ appId = (await rl.question("App id to bind (guuey apps list): ")).trim();
217
+ rl.close();
218
+ }
219
+ if (!appId) {
220
+ console.error("--link needs an app id: pass --app-id <id> (create one with `guuey apps create --name ...`).");
221
+ process.exit(1);
222
+ }
223
+
224
+ const res = await guuey(["apps", "get", appId, "--json"]);
225
+ if (!res.ok) {
226
+ console.error(`Could not read app ${appId} via the guuey CLI:\n${res.error}`);
227
+ console.error("Log in first (`guuey login`) and check the id (`guuey apps list`).");
228
+ process.exit(1);
229
+ }
230
+ let app;
231
+ try {
232
+ app = JSON.parse(res.stdout);
233
+ } catch {
234
+ console.error(
235
+ "`guuey apps get --json` did not return parseable JSON. Raw output follows — " +
236
+ "if extra lines surround the JSON, that is a guuey CLI bug worth reporting:\n" +
237
+ res.stdout,
238
+ );
239
+ process.exit(1);
240
+ }
241
+
242
+ const env = typeof flags.env === "string" ? flags.env : deriveEnv(app);
243
+ if (!env || !ENV_HOSTS[env]) {
244
+ console.error(
245
+ "Could not derive the environment from the app record (no page/endpoint yet). Pass --env dev|staging|release.",
246
+ );
247
+ process.exit(1);
248
+ }
249
+ const hosts = ENV_HOSTS[env];
250
+
251
+ // The platform's deployment records carry the full `…/agent/invoke` URL;
252
+ // the config contract stores the ORIGIN (the web app appends paths).
253
+ const endpointOrigin = (app.endpointUrl || `https://${appId}.${hosts.endpointDomain}`).replace(
254
+ /\/agent\/invoke\/?$/,
255
+ "",
256
+ );
257
+
258
+ config.link = {
259
+ appId,
260
+ env,
261
+ apiBaseUrl: hosts.apiBaseUrl,
262
+ endpointUrl: endpointOrigin,
263
+ widgetOrigin: hosts.widgetOrigin,
264
+ portalUrl: hosts.portalUrl,
265
+ slug: app.urlSlug ?? null,
266
+ pageUrl: app.pageUrl ?? null,
267
+ };
268
+ writeConfig(config);
269
+ console.log(`Linked ${config.brand.name} → ${appId} (${env}).`);
270
+
271
+ // Allowed domains: the origins this frontend will serve from (needed for
272
+ // the widget's frame-ancestors AND the pod's CORS). Flag wins; prompted
273
+ // when interactive; skipped (with the hint below) under --yes.
274
+ let domains = typeof flags.domains === "string" ? flags.domains : null;
275
+ if (domains === null && !yes) {
276
+ const rl = createInterface({ input: stdin, output: stdout });
277
+ domains = (
278
+ await rl.question("Allowed origins for this frontend (comma-separated, empty to skip): ")
279
+ ).trim();
280
+ rl.close();
281
+ }
282
+
283
+ // Platform pushes — each one a CLI primitive; failures are reported, not
284
+ // hidden, and the run keeps converging on the rest.
285
+ const pushes = [];
286
+ if (domains) {
287
+ pushes.push({
288
+ step: "allowed-domains",
289
+ result: await guuey(["apps", "update", appId, "--domains", domains]),
290
+ });
291
+ }
292
+ pushes.push({
293
+ step: "brand-accent",
294
+ result: await guuey(["apps", "update", appId, "--brand-accent", config.theme.accent]),
295
+ });
296
+ // Theme-as-platform-data push rides `guuey apps update --chat-theme-file`
297
+ // (filed as a platform CLI ask). Until that flag exists this step is
298
+ // reported as skipped — never silently omitted, never worked around here.
299
+ pushes.push({ step: "chat-theme", result: { ok: false, error: "skipped: needs `guuey apps update --chat-theme-file` (guuey#283)" } });
300
+
301
+ for (const { step, result } of pushes) {
302
+ if (result.ok) console.log(` ✓ ${step}`);
303
+ else console.log(` – ${step}: ${result.error}`);
304
+ }
305
+
306
+ console.log("\nNext steps (each is one command — run when ready):");
307
+ if (!domains) {
308
+ console.log(` guuey apps update ${appId} --domains <https://your-site.example> # allow this frontend's origin`);
309
+ }
310
+ if (!config.link.slug) console.log(" guuey slug claim <name> # public short name → portal link + hosted page");
311
+ console.log(" guuey deploy # ship the agent definition in guuey.json");
312
+ if (config.auth.oidc) {
313
+ console.log(` guuey apps update ${appId} --auth-mode byo --issuer-url ${config.auth.oidc.issuer} --audience ${config.auth.oidc.clientId}`);
314
+ }
315
+ }
316
+
317
+ // ── check ───────────────────────────────────────────────────────────────────
318
+
319
+ function check(config) {
320
+ // Required steps gate the exit code; optional ones are informational.
321
+ const missing = [];
322
+ const optional = [];
323
+ if (!config.bootstrapped) missing.push({ step: "bootstrap", fix: "pnpm bootstrap" });
324
+ if (!config.link) missing.push({ step: "link", fix: "pnpm bootstrap -- --link --app-id <id>" });
325
+ if (config.link && !config.link.slug)
326
+ optional.push({ step: "slug", fix: "guuey slug claim <name> (portal link + hosted page)" });
327
+ if (!config.auth.oidc)
328
+ optional.push({ step: "oidc", fix: "set auth.oidc {issuer, clientId} for sign-in (guest works without it)" });
329
+ const report = {
330
+ bootstrapped: config.bootstrapped,
331
+ linked: config.link !== null,
332
+ appId: config.link?.appId ?? null,
333
+ env: config.link?.env ?? null,
334
+ oidcConfigured: config.auth.oidc !== null,
335
+ demoMode: config.demoMode,
336
+ missing,
337
+ optional,
338
+ };
339
+ console.log(JSON.stringify(report, null, 2));
340
+ process.exit(missing.length > 0 ? 3 : 0);
341
+ }
342
+
343
+ // ── main ────────────────────────────────────────────────────────────────────
344
+
345
+ async function main() {
346
+ const flags = parseArgs(process.argv.slice(2));
347
+ const yes = flags.yes === true;
348
+ const config = readConfig();
349
+
350
+ if (flags.check === true) return check(config);
351
+
352
+ if (flags.link === true) {
353
+ if (!config.bootstrapped) {
354
+ console.error("Run the local phase first: pnpm bootstrap");
355
+ process.exit(1);
356
+ }
357
+ await linkPhase(config, flags, yes);
358
+ regenerateAgentsMd(config);
359
+ return;
360
+ }
361
+
362
+ // Local phase — no account, no network.
363
+ const rl = yes ? null : createInterface({ input: stdin, output: stdout });
364
+ const name = typeof flags.name === "string" ? flags.name : await ask(rl, "App name", config.brand.name, yes);
365
+ const tagline = typeof flags.tagline === "string" ? flags.tagline : await ask(rl, "Tagline", config.brand.tagline, yes);
366
+ const accent = typeof flags.accent === "string" ? flags.accent : await ask(rl, "Accent color (#rrggbb)", config.theme.accent, yes);
367
+ const mode = typeof flags.mode === "string" ? flags.mode : await ask(rl, "Theme mode (light|dark)", config.theme.mode, yes);
368
+ const headline = typeof flags.headline === "string" ? flags.headline : await ask(rl, "Landing headline", config.copy.landing.headline, yes);
369
+ rl?.close();
370
+
371
+ if (!/^#[0-9a-fA-F]{6}$/.test(accent)) {
372
+ console.error(`Accent must be #rrggbb (got "${accent}").`);
373
+ process.exit(1);
374
+ }
375
+ if (mode !== "light" && mode !== "dark") {
376
+ console.error(`Theme mode must be light or dark (got "${mode}").`);
377
+ process.exit(1);
378
+ }
379
+
380
+ config.brand.name = name;
381
+ config.brand.tagline = tagline;
382
+ config.brand.logoText = name.replace(/[^A-Za-z0-9]/g, "").slice(0, 2).toUpperCase() || "AA";
383
+ config.theme.accent = accent;
384
+ config.theme.mode = mode;
385
+ config.copy.landing.headline = headline;
386
+ config.bootstrapped = true;
387
+ // A bootstrap makes the app YOURS — if this started life as a demo
388
+ // extraction (`--example`), the demo chrome turns off here.
389
+ config.demoMode = false;
390
+ writeConfig(config);
391
+ syncGguiTheme(config);
392
+ regenerateAgentsMd(config);
393
+
394
+ console.log(`\nConfigured "${name}" — guuey.app.json written, AGENTS.md updated.`);
395
+ console.log("Next: pnpm dev (local stack) · pnpm bootstrap -- --link (bind a deployed app)");
396
+ }
397
+
398
+ await main();
@@ -4,7 +4,6 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>agentic-app-template</title>
7
- <meta name="description" content="Local dev chat client for your guuey agent." />
8
7
  </head>
9
8
  <body>
10
9
  <div id="root"></div>
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@agentic-app-template/web",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite --port 6890",
8
+ "build": "tsc && vite build",
9
+ "typecheck": "tsc --noEmit"
10
+ },
11
+ "dependencies": {
12
+ "@guuey/chat": "0.11.0",
13
+ "@guuey/mcp-apps-host": "0.11.0",
14
+ "oidc-client-ts": "^3.1.0",
15
+ "qrcode": "^1.5.4",
16
+ "react": "^19.0.0",
17
+ "react-dom": "^19.0.0",
18
+ "react-router-dom": "^7.1.0"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^24.0.0",
22
+ "@types/qrcode": "^1.5.5",
23
+ "@types/react": "^19.0.0",
24
+ "@types/react-dom": "^19.0.0",
25
+ "@vitejs/plugin-react": "^4.3.4",
26
+ "typescript": "^5.7.2",
27
+ "vite": "^7.0.0"
28
+ }
29
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * The configured `<GuueyChat>` for this app — distribution way #2, the
3
+ * embedded chat SDK. One place wires endpoint, history, identity and theme;
4
+ * every chat surface (the /chat page here, the fullscreen agent canvas in
5
+ * the agentic-app template) renders this.
6
+ *
7
+ * Identity rule: ONE mode per surface. When OIDC is configured AND a
8
+ * session exists, the bearer wins; otherwise the client-minted guest
9
+ * secret. Never both.
10
+ */
11
+ import { useEffect, useState, type CSSProperties } from "react";
12
+ import { GuueyChat } from "@guuey/chat/react";
13
+ import type { PlanViewSummary, ViewRefItem } from "@guuey/chat";
14
+ import { agentEndpointUrl, appConfig, historyBaseUrl } from "../config";
15
+ import { currentIdentityMode, ensureGuestSecret } from "../lib/identity";
16
+ import { getBearerToken, currentUser, oidcConfigured } from "../lib/oidc";
17
+
18
+ /**
19
+ * The chat-rail bridge (agentic-app shell): with `viewsBridge` set, the
20
+ * chat runs the kit's CHIPS presentation — generative views collapse to
21
+ * compact chips in the rail, the full renders belong to the host's main
22
+ * canvas (fed by `onViewsChange`), and chip clicks re-select
23
+ * (`onViewRef` → `promotedViewKey`, the browser-history mechanic).
24
+ */
25
+ export interface ViewsBridge {
26
+ promotedViewKey?: string | undefined;
27
+ onViewRef: (item: ViewRefItem) => void;
28
+ onViewsChange: (views: PlanViewSummary[]) => void;
29
+ }
30
+
31
+ // Module scope on purpose: props want STABLE identities. An inline
32
+ // `policy={{ … }}` literal (or per-render arrow getters) re-mints every
33
+ // render; the kit stabilizes structurally since 0.11.0, but the template
34
+ // models the correct shape — one identity for the app's whole life.
35
+ const RAIL_POLICY = { view: { timeoutMs: 8000, presentation: "chips" as const } };
36
+
37
+ export function AgentChat({
38
+ className,
39
+ style,
40
+ viewsBridge,
41
+ }: {
42
+ className?: string;
43
+ style?: CSSProperties;
44
+ viewsBridge?: ViewsBridge;
45
+ }) {
46
+ // The user's CHOSEN mode wins: an explicit "Continue as guest" must never
47
+ // be shadowed by a cached OIDC session. Only when no choice is recorded
48
+ // does a live session imply oidc.
49
+ const chosen = currentIdentityMode();
50
+ const [identity, setIdentity] = useState<"resolving" | "guest" | "oidc">(
51
+ chosen === "guest" || !oidcConfigured() ? "guest" : chosen === "oidc" ? "oidc" : "resolving",
52
+ );
53
+
54
+ useEffect(() => {
55
+ if (identity !== "resolving") return;
56
+ let cancelled = false;
57
+ void currentUser().then((user) => {
58
+ if (!cancelled) setIdentity(user ? "oidc" : "guest");
59
+ });
60
+ return () => {
61
+ cancelled = true;
62
+ };
63
+ }, [identity]);
64
+
65
+ if (identity === "resolving") return null;
66
+
67
+ const shared = {
68
+ endpointUrl: agentEndpointUrl(),
69
+ appId: appConfig.link?.appId ?? "local",
70
+ apiBaseUrl: historyBaseUrl(),
71
+ mode: appConfig.theme.mode,
72
+ className,
73
+ style,
74
+ ...(viewsBridge !== undefined
75
+ ? {
76
+ policy: RAIL_POLICY,
77
+ promotedViewKey: viewsBridge.promotedViewKey,
78
+ onViewRef: viewsBridge.onViewRef,
79
+ onViewsChange: viewsBridge.onViewsChange,
80
+ }
81
+ : {}),
82
+ };
83
+
84
+ // The lib functions ARE the stable getters — no wrapping arrows (a fresh
85
+ // closure per render is the identity churn RAIL_POLICY exists to avoid).
86
+ return identity === "oidc" ? (
87
+ <GuueyChat {...shared} getAccessToken={getBearerToken} />
88
+ ) : (
89
+ <GuueyChat {...shared} getGuestSecret={ensureGuestSecret} />
90
+ );
91
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * The CHAT-RAIL shell (guuey#303, founder-confirmed):
3
+ *
4
+ * ┌──────────┬────────────────────────┐
5
+ * │ ☰ Menu 1 │ │
6
+ * │ ☰ Menu 2 │ MAIN CANVAS │
7
+ * │ ☰ Menu 3 │ your pages — or the │
8
+ * ├──────────┤ full generated UI │
9
+ * │ AGENT │ when the agent draws │
10
+ * │ RAIL │ one │
11
+ * │ (chat) │ │
12
+ * └──────────┴────────────────────────┘
13
+ *
14
+ * Upper sidebar = your product's menus. LOWER sidebar = the embed-SDK
15
+ * agent rail — the visitor TYPES THERE; generative views collapse to
16
+ * compact CHIPS in the rail (the kit's chips presentation) and the full
17
+ * render takes the MAIN canvas. Chips are the history: clicking one
18
+ * re-selects its render onto the canvas ("just like a web browser's
19
+ * history"); a new render navigates forward automatically; picking a
20
+ * menu swaps the canvas back to your pages.
21
+ */
22
+ import { useCallback, useRef, useState } from "react";
23
+ import { NavLink, Outlet, useNavigate } from "react-router-dom";
24
+ import type { PlanViewSummary, ViewRefItem } from "@guuey/chat";
25
+ import { GuueyView } from "@guuey/mcp-apps-host/react";
26
+ import { appConfig } from "../config";
27
+ import { AgentChat } from "../components/AgentChat";
28
+ import { currentIdentityMode, logOut } from "../lib/identity";
29
+ import { oidcConfigured, signOutOidc } from "../lib/oidc";
30
+
31
+ export function AppShell() {
32
+ const navigate = useNavigate();
33
+ const mode = currentIdentityMode();
34
+
35
+ // The rail↔canvas bridge: the kit's view roster (mount material lives
36
+ // here, the rail shows only chips), the selected key, and whether the
37
+ // canvas currently shows a view or the routed pages.
38
+ const [views, setViews] = useState<PlanViewSummary[]>([]);
39
+ const [selectedKey, setSelectedKey] = useState<string | undefined>(undefined);
40
+ const [canvasShowsView, setCanvasShowsView] = useState(false);
41
+ const newestKeyRef = useRef<string | undefined>(undefined);
42
+
43
+ const onViewsChange = useCallback((next: PlanViewSummary[]) => {
44
+ setViews(next);
45
+ // Browser-history forward-navigation: a NEW live render takes the
46
+ // canvas. (Reversed find = newest mountable; live entries sit after
47
+ // history in the roster's transcript order.)
48
+ const newest = [...next].reverse().find((v) => v.mount !== null && v.phase !== "expired");
49
+ if (newest !== undefined && newest.key !== newestKeyRef.current) {
50
+ newestKeyRef.current = newest.key;
51
+ setSelectedKey(newest.key);
52
+ setCanvasShowsView(true);
53
+ // The demo-tour hook (guuey#303): step machines outside the app can
54
+ // key on "the agent just drew UI".
55
+ window.dispatchEvent(
56
+ new CustomEvent("demo:render-complete", {
57
+ detail: { key: newest.key, title: newest.title },
58
+ }),
59
+ );
60
+ }
61
+ }, []);
62
+
63
+ const onViewRef = useCallback((item: ViewRefItem) => {
64
+ setSelectedKey(item.key);
65
+ setCanvasShowsView(true);
66
+ }, []);
67
+
68
+ const selected = views.find((v) => v.key === selectedKey && v.mount !== null);
69
+
70
+ async function handleLogOut() {
71
+ if (mode === "oidc" && oidcConfigured()) await signOutOidc();
72
+ logOut();
73
+ navigate("/");
74
+ }
75
+
76
+ return (
77
+ <div className="app-shell">
78
+ <div className="app-body">
79
+ <aside className="sidebar">
80
+ <div className="sidebar-brand">
81
+ <span className="brand-mark">{appConfig.brand.logoText}</span>
82
+ <span>{appConfig.brand.name}</span>
83
+ </div>
84
+ <nav className="sidebar-menus">
85
+ {/* Picking a menu swaps the canvas back to your pages. */}
86
+ <NavLink to="/app" end onClick={() => setCanvasShowsView(false)}>
87
+ Dashboard
88
+ </NavLink>
89
+ <NavLink to="/app/reports" onClick={() => setCanvasShowsView(false)}>
90
+ Reports
91
+ </NavLink>
92
+ <NavLink to="/app/setup" onClick={() => setCanvasShowsView(false)}>
93
+ Setup
94
+ </NavLink>
95
+ <NavLink to="/app/mobile" onClick={() => setCanvasShowsView(false)}>
96
+ 📱 Talk on mobile
97
+ </NavLink>
98
+ <button type="button" className="dock-logout" onClick={() => void handleLogOut()}>
99
+ Log out{mode === "guest" ? " (guest)" : ""}
100
+ </button>
101
+ </nav>
102
+ <div className="agent-rail" data-tour="agent-rail">
103
+ <AgentChat
104
+ className="rail-chat"
105
+ viewsBridge={{ promotedViewKey: selectedKey, onViewRef, onViewsChange }}
106
+ />
107
+ </div>
108
+ </aside>
109
+ <main className="canvas" data-tour="canvas">
110
+ {canvasShowsView && selected !== undefined && selected.mount !== null ? (
111
+ <div className="canvas-view">
112
+ <header className="canvas-view-bar">
113
+ <span>{selected.title}</span>
114
+ <button type="button" className="btn" onClick={() => setCanvasShowsView(false)}>
115
+ Back to {appConfig.brand.name}
116
+ </button>
117
+ </header>
118
+ {selected.mount.channel !== "locator" ? (
119
+ <GuueyView
120
+ key={selected.key}
121
+ mount={selected.mount}
122
+ title={selected.title}
123
+ className="canvas-view-mount"
124
+ />
125
+ ) : (
126
+ // A locator still resolving — the kit reads it and the next
127
+ // roster emission carries the material (a FAILED read
128
+ // surfaces as the chip's expired state instead).
129
+ <p className="calm canvas-view-loading">Loading card…</p>
130
+ )}
131
+ </div>
132
+ ) : (
133
+ <Outlet />
134
+ )}
135
+ </main>
136
+ </div>
137
+ </div>
138
+ );
139
+ }