kaddidlehopper 0.5.0 → 0.6.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 (296) hide show
  1. package/dist/cli.js +104 -208
  2. package/dist/index.js +1 -31
  3. package/dist/types/cli.d.ts +1 -8
  4. package/dist/types/types.d.ts +7 -12
  5. package/package.json +1 -2
  6. package/src/cli.ts +129 -271
  7. package/src/index.ts +1 -47
  8. package/src/types.ts +7 -13
  9. package/CONTEXT.md +0 -139
  10. package/add-ons/ai/README.md +0 -34
  11. package/add-ons/ai/assets/AGENTS.md.append +0 -24
  12. package/add-ons/ai/assets/_dot_env.local.append +0 -13
  13. package/add-ons/ai/assets/src/components/AIAssistant.tsx +0 -149
  14. package/add-ons/ai/assets/src/lib/ai-hook.ts +0 -21
  15. package/add-ons/ai/assets/src/lib/weather-tools.ts +0 -30
  16. package/add-ons/ai/assets/src/routes/api.chat.ts +0 -94
  17. package/add-ons/ai/assets/src/routes/chat.css +0 -175
  18. package/add-ons/ai/assets/src/routes/chat.tsx +0 -141
  19. package/add-ons/ai/info.json +0 -22
  20. package/add-ons/ai/package.json +0 -17
  21. package/add-ons/ai/small-logo.svg +0 -8
  22. package/add-ons/db/assets/AGENTS.md.append +0 -22
  23. package/add-ons/db/assets/DB-SETUP.md +0 -65
  24. package/add-ons/db/assets/_dot_env.local.append +0 -2
  25. package/add-ons/db/assets/drizzle.config.ts +0 -10
  26. package/add-ons/db/assets/src/db/index.ts +0 -8
  27. package/add-ons/db/assets/src/db/schema.ts +0 -8
  28. package/add-ons/db/assets/src/routes/db-example.tsx +0 -118
  29. package/add-ons/db/assets/src/server/guestbook.functions.ts +0 -23
  30. package/add-ons/db/info.json +0 -22
  31. package/add-ons/db/package.json +0 -10
  32. package/add-ons/forms/assets/AGENTS.md.append +0 -13
  33. package/add-ons/forms/assets/public/form-example.html +0 -14
  34. package/add-ons/forms/assets/src/routes/form-example.tsx +0 -76
  35. package/add-ons/forms/info.json +0 -18
  36. package/add-ons/forms/package.json +0 -3
  37. package/examples/ai-chat/README.md +0 -36
  38. package/examples/ai-chat/assets/AGENTS.md.append +0 -24
  39. package/examples/ai-chat/assets/src/lib/ai-hook.ts +0 -21
  40. package/examples/ai-chat/assets/src/lib/weather-tools.ts +0 -30
  41. package/examples/ai-chat/assets/src/routes/__root.tsx +0 -57
  42. package/examples/ai-chat/assets/src/routes/api.chat.ts +0 -94
  43. package/examples/ai-chat/assets/src/routes/index.tsx +0 -141
  44. package/examples/ai-chat/assets/src/styles.css +0 -165
  45. package/examples/ai-chat/info.json +0 -25
  46. package/examples/ai-chat/package.json +0 -14
  47. package/examples/blog/README.md +0 -60
  48. package/examples/blog/assets/AGENTS.md.append +0 -18
  49. package/examples/blog/assets/content/posts/beach.md +0 -12
  50. package/examples/blog/assets/content/posts/jungle.md.ejs +0 -12
  51. package/examples/blog/assets/content/posts/mountains.md.ejs +0 -12
  52. package/examples/blog/assets/content/posts/snorkeling.md.ejs +0 -12
  53. package/examples/blog/assets/content/posts/waterfall.md.ejs +0 -12
  54. package/examples/blog/assets/content-collections.ts +0 -30
  55. package/examples/blog/assets/public/beach.jpg +0 -0
  56. package/examples/blog/assets/public/jungle.jpg +0 -0
  57. package/examples/blog/assets/public/mountains.jpg +0 -0
  58. package/examples/blog/assets/public/snorkeling.jpg +0 -0
  59. package/examples/blog/assets/public/waterfall.jpg +0 -0
  60. package/examples/blog/assets/src/components/Header.tsx +0 -52
  61. package/examples/blog/assets/src/components/VacayAssistant.tsx +0 -205
  62. package/examples/blog/assets/src/components/blog-posts.tsx +0 -78
  63. package/examples/blog/assets/src/components/ui/card.tsx +0 -92
  64. package/examples/blog/assets/src/lib/blog-ai-hook.ts +0 -25
  65. package/examples/blog/assets/src/lib/blog-tools.ts +0 -111
  66. package/examples/blog/assets/src/lib/utils.ts +0 -6
  67. package/examples/blog/assets/src/routes/__root.tsx +0 -57
  68. package/examples/blog/assets/src/routes/api.blog-chat.ts +0 -117
  69. package/examples/blog/assets/src/routes/category.$category.tsx +0 -19
  70. package/examples/blog/assets/src/routes/index.tsx +0 -19
  71. package/examples/blog/assets/src/routes/posts.$slug.tsx +0 -63
  72. package/examples/blog/assets/src/styles.css +0 -138
  73. package/examples/blog/info.json +0 -40
  74. package/examples/blog/package.json +0 -23
  75. package/examples/calculator/README.md +0 -16
  76. package/examples/calculator/assets/AGENTS.md.append +0 -9
  77. package/examples/calculator/assets/src/components/Calculator.tsx +0 -238
  78. package/examples/calculator/assets/src/components/Header.tsx +0 -17
  79. package/examples/calculator/assets/src/routes/__root.tsx +0 -57
  80. package/examples/calculator/assets/src/routes/index.tsx +0 -14
  81. package/examples/calculator/info.json +0 -20
  82. package/examples/calculator/package.json +0 -1
  83. package/examples/dashboard/README.md +0 -17
  84. package/examples/dashboard/assets/AGENTS.md.append +0 -12
  85. package/examples/dashboard/assets/src/components/Header.tsx +0 -17
  86. package/examples/dashboard/assets/src/routes/__root.tsx +0 -57
  87. package/examples/dashboard/assets/src/routes/index.tsx +0 -158
  88. package/examples/dashboard/info.json +0 -19
  89. package/examples/dashboard/package.json +0 -6
  90. package/examples/ecommerce/README.md +0 -48
  91. package/examples/ecommerce/assets/AGENTS.md.append +0 -22
  92. package/examples/ecommerce/assets/public/logo.png +0 -0
  93. package/examples/ecommerce/assets/public/motorcycle-scooter.jpg +0 -0
  94. package/examples/ecommerce/assets/src/components/BuyButton.tsx +0 -35
  95. package/examples/ecommerce/assets/src/components/Header.tsx +0 -36
  96. package/examples/ecommerce/assets/src/components/MotorcycleAIAssistant.tsx +0 -162
  97. package/examples/ecommerce/assets/src/components/MotorcycleRecommendation.tsx +0 -53
  98. package/examples/ecommerce/assets/src/data/motorcycles.ts +0 -27
  99. package/examples/ecommerce/assets/src/lib/motorcycle-ai-hook.ts +0 -24
  100. package/examples/ecommerce/assets/src/lib/motorcycle-tools.ts +0 -42
  101. package/examples/ecommerce/assets/src/lib/stripe.server.ts +0 -39
  102. package/examples/ecommerce/assets/src/routes/__root.tsx +0 -57
  103. package/examples/ecommerce/assets/src/routes/api.motorcycle-chat.ts +0 -78
  104. package/examples/ecommerce/assets/src/routes/checkout/cancel.tsx +0 -25
  105. package/examples/ecommerce/assets/src/routes/checkout/success.tsx +0 -25
  106. package/examples/ecommerce/assets/src/routes/index.tsx +0 -76
  107. package/examples/ecommerce/assets/src/routes/motorcycles/$motorcycleId.tsx +0 -55
  108. package/examples/ecommerce/assets/src/store/motorcycle-assistant.ts +0 -3
  109. package/examples/ecommerce/assets/src/styles.css +0 -212
  110. package/examples/ecommerce/info.json +0 -38
  111. package/examples/ecommerce/package.json +0 -13
  112. package/examples/events/README.md +0 -110
  113. package/examples/events/assets/AGENTS.md.append +0 -21
  114. package/examples/events/assets/content/speakers/andre-costa.md +0 -22
  115. package/examples/events/assets/content/speakers/hans-mueller.md.ejs +0 -22
  116. package/examples/events/assets/content/speakers/isabella-martinez.md.ejs +0 -22
  117. package/examples/events/assets/content/speakers/kenji-nakamura.md.ejs +0 -22
  118. package/examples/events/assets/content/speakers/marie-dubois.md.ejs +0 -20
  119. package/examples/events/assets/content/speakers/priya-sharma.md.ejs +0 -22
  120. package/examples/events/assets/content/talks/croissant-lamination-secrets.md +0 -39
  121. package/examples/events/assets/content/talks/french-macaron-mastery.md.ejs +0 -39
  122. package/examples/events/assets/content/talks/neapolitan-pizza-tradition-meets-innovation.md.ejs +0 -39
  123. package/examples/events/assets/content/talks/savory-breads-of-the-mediterranean.md.ejs +0 -39
  124. package/examples/events/assets/content/talks/sourdough-from-starter-to-masterpiece.md.ejs +0 -36
  125. package/examples/events/assets/content/talks/the-art-of-the-perfect-tart.md.ejs +0 -32
  126. package/examples/events/assets/content/talks/the-science-of-sugar.md.ejs +0 -39
  127. package/examples/events/assets/content/talks/umami-in-pastry-east-meets-west.md.ejs +0 -39
  128. package/examples/events/assets/content-collections.ts +0 -56
  129. package/examples/events/assets/public/background-1.jpg +0 -0
  130. package/examples/events/assets/public/background-2.jpg +0 -0
  131. package/examples/events/assets/public/background-3.jpg +0 -0
  132. package/examples/events/assets/public/background-4.jpg +0 -0
  133. package/examples/events/assets/public/conference-logo.png +0 -0
  134. package/examples/events/assets/public/favicon.ico +0 -0
  135. package/examples/events/assets/public/speakers/andre-costa.jpg +0 -0
  136. package/examples/events/assets/public/speakers/hans-mueller.jpg +0 -0
  137. package/examples/events/assets/public/speakers/isabella-martinez.jpg +0 -0
  138. package/examples/events/assets/public/speakers/kenji-nakamura.jpg +0 -0
  139. package/examples/events/assets/public/speakers/marie-dubois.jpg +0 -0
  140. package/examples/events/assets/public/speakers/priya-sharma.jpg +0 -0
  141. package/examples/events/assets/public/talks/croissant-lamination-secrets.jpg +0 -0
  142. package/examples/events/assets/public/talks/french-macaron-mastery.jpg +0 -0
  143. package/examples/events/assets/public/talks/neapolitan-pizza-tradition-meets-innovation.jpg +0 -0
  144. package/examples/events/assets/public/talks/savory-breads-of-the-mediterranean.jpg +0 -0
  145. package/examples/events/assets/public/talks/sourdough-from-starter-to-masterpiece.jpg +0 -0
  146. package/examples/events/assets/public/talks/the-art-of-the-perfect-tart.jpg +0 -0
  147. package/examples/events/assets/public/talks/the-science-of-sugar.jpg +0 -0
  148. package/examples/events/assets/public/talks/umami-in-pastry-east-meets-west.jpg +0 -0
  149. package/examples/events/assets/public/tanstack-circle-logo.png +0 -0
  150. package/examples/events/assets/public/tanstack-word-logo-white.svg +0 -1
  151. package/examples/events/assets/src/components/Header.tsx +0 -59
  152. package/examples/events/assets/src/components/HeaderNav.tsx +0 -67
  153. package/examples/events/assets/src/components/HeroCarousel.tsx +0 -61
  154. package/examples/events/assets/src/components/RemyAssistant.tsx +0 -207
  155. package/examples/events/assets/src/components/SpeakerCard.tsx +0 -67
  156. package/examples/events/assets/src/components/TalkCard.tsx +0 -77
  157. package/examples/events/assets/src/components/ui/card.tsx +0 -92
  158. package/examples/events/assets/src/lib/conference-ai-hook.ts +0 -26
  159. package/examples/events/assets/src/lib/conference-tools.ts +0 -210
  160. package/examples/events/assets/src/lib/model-selection.ts +0 -1
  161. package/examples/events/assets/src/lib/utils.ts +0 -6
  162. package/examples/events/assets/src/routes/__root.tsx +0 -70
  163. package/examples/events/assets/src/routes/api.remy-chat.ts +0 -119
  164. package/examples/events/assets/src/routes/index.tsx +0 -192
  165. package/examples/events/assets/src/routes/schedule.index.tsx +0 -274
  166. package/examples/events/assets/src/routes/speakers.$slug.tsx +0 -122
  167. package/examples/events/assets/src/routes/speakers.index.tsx +0 -40
  168. package/examples/events/assets/src/routes/talks.$slug.tsx +0 -116
  169. package/examples/events/assets/src/routes/talks.index.tsx +0 -40
  170. package/examples/events/assets/src/styles.css +0 -182
  171. package/examples/events/info.json +0 -61
  172. package/examples/events/package.json +0 -23
  173. package/examples/marketing/README.md +0 -60
  174. package/examples/marketing/assets/AGENTS.md.append +0 -15
  175. package/examples/marketing/assets/public/logo.png +0 -0
  176. package/examples/marketing/assets/public/motorcycle-adventure.jpg +0 -0
  177. package/examples/marketing/assets/public/motorcycle-cruiser.jpg +0 -0
  178. package/examples/marketing/assets/public/motorcycle-scooter.jpg +0 -0
  179. package/examples/marketing/assets/public/motorcycle-sport.jpg +0 -0
  180. package/examples/marketing/assets/public/motorcycle-supersport.jpg +0 -0
  181. package/examples/marketing/assets/src/components/Header.tsx +0 -36
  182. package/examples/marketing/assets/src/components/MotorcycleAIAssistant.tsx +0 -162
  183. package/examples/marketing/assets/src/components/MotorcycleRecommendation.tsx +0 -53
  184. package/examples/marketing/assets/src/data/motorcycles.ts.ejs +0 -77
  185. package/examples/marketing/assets/src/lib/motorcycle-ai-hook.ts +0 -24
  186. package/examples/marketing/assets/src/lib/motorcycle-tools.ts +0 -42
  187. package/examples/marketing/assets/src/routes/__root.tsx +0 -57
  188. package/examples/marketing/assets/src/routes/api.motorcycle-chat.ts +0 -78
  189. package/examples/marketing/assets/src/routes/index.tsx +0 -72
  190. package/examples/marketing/assets/src/routes/motorcycles/$motorcycleId.tsx +0 -56
  191. package/examples/marketing/assets/src/store/motorcycle-assistant.ts +0 -3
  192. package/examples/marketing/assets/src/styles.css +0 -212
  193. package/examples/marketing/info.json +0 -33
  194. package/examples/marketing/package.json +0 -14
  195. package/examples/portfolio/README.md +0 -49
  196. package/examples/portfolio/assets/AGENTS.md.append +0 -21
  197. package/examples/portfolio/assets/content/blog/getting-started-with-tanstack.md +0 -53
  198. package/examples/portfolio/assets/content/blog/react-19-features.md +0 -78
  199. package/examples/portfolio/assets/content/blog/tailwind-css-v4-guide.md +0 -60
  200. package/examples/portfolio/assets/content/education/code-school.md +0 -17
  201. package/examples/portfolio/assets/content/jobs/initech-junior.md +0 -20
  202. package/examples/portfolio/assets/content/projects/portfolio-site.md +0 -15
  203. package/examples/portfolio/assets/content/projects/task-manager.md +0 -15
  204. package/examples/portfolio/assets/content-collections.ts +0 -65
  205. package/examples/portfolio/assets/public/contact.html +0 -6
  206. package/examples/portfolio/assets/public/headshot-on-white.jpg +0 -0
  207. package/examples/portfolio/assets/src/components/Header.tsx +0 -33
  208. package/examples/portfolio/assets/src/components/ResumeAssistant.tsx +0 -193
  209. package/examples/portfolio/assets/src/components/ui/badge.tsx +0 -46
  210. package/examples/portfolio/assets/src/components/ui/card.tsx +0 -92
  211. package/examples/portfolio/assets/src/components/ui/checkbox.tsx +0 -30
  212. package/examples/portfolio/assets/src/components/ui/hover-card.tsx +0 -44
  213. package/examples/portfolio/assets/src/components/ui/separator.tsx +0 -26
  214. package/examples/portfolio/assets/src/lib/resume-ai-hook.ts +0 -21
  215. package/examples/portfolio/assets/src/lib/resume-tools.ts +0 -165
  216. package/examples/portfolio/assets/src/lib/utils.ts +0 -6
  217. package/examples/portfolio/assets/src/routes/__root.tsx +0 -57
  218. package/examples/portfolio/assets/src/routes/api.resume-chat.ts +0 -116
  219. package/examples/portfolio/assets/src/routes/blog/$slug.tsx +0 -73
  220. package/examples/portfolio/assets/src/routes/contact.tsx +0 -121
  221. package/examples/portfolio/assets/src/routes/index.tsx +0 -55
  222. package/examples/portfolio/assets/src/routes/projects.tsx +0 -62
  223. package/examples/portfolio/assets/src/routes/resume.tsx +0 -220
  224. package/examples/portfolio/assets/src/styles.css +0 -138
  225. package/examples/portfolio/info.json +0 -50
  226. package/examples/portfolio/package.json +0 -26
  227. package/examples/resume/README.md +0 -82
  228. package/examples/resume/assets/AGENTS.md.append +0 -19
  229. package/examples/resume/assets/content/education/code-school.md +0 -17
  230. package/examples/resume/assets/content/jobs/freelance.md.ejs +0 -13
  231. package/examples/resume/assets/content/jobs/initech-junior.md +0 -20
  232. package/examples/resume/assets/content/jobs/initech-lead.md.ejs +0 -29
  233. package/examples/resume/assets/content/jobs/initrode-senior.md.ejs +0 -28
  234. package/examples/resume/assets/content-collections.ts +0 -36
  235. package/examples/resume/assets/public/headshot-on-white.jpg +0 -0
  236. package/examples/resume/assets/src/components/Header.tsx +0 -33
  237. package/examples/resume/assets/src/components/ResumeAssistant.tsx +0 -193
  238. package/examples/resume/assets/src/components/ui/badge.tsx +0 -46
  239. package/examples/resume/assets/src/components/ui/card.tsx +0 -92
  240. package/examples/resume/assets/src/components/ui/checkbox.tsx +0 -30
  241. package/examples/resume/assets/src/components/ui/hover-card.tsx +0 -44
  242. package/examples/resume/assets/src/components/ui/separator.tsx +0 -26
  243. package/examples/resume/assets/src/lib/resume-ai-hook.ts +0 -21
  244. package/examples/resume/assets/src/lib/resume-tools.ts +0 -165
  245. package/examples/resume/assets/src/lib/utils.ts +0 -6
  246. package/examples/resume/assets/src/routes/api.resume-chat.ts +0 -110
  247. package/examples/resume/assets/src/routes/index.tsx +0 -220
  248. package/examples/resume/assets/src/styles.css +0 -138
  249. package/examples/resume/info.json +0 -35
  250. package/examples/resume/package.json +0 -26
  251. package/examples/saas/README.md +0 -16
  252. package/examples/saas/assets/AGENTS.md.append +0 -9
  253. package/examples/saas/assets/src/components/Header.tsx +0 -17
  254. package/examples/saas/assets/src/routes/__root.tsx +0 -57
  255. package/examples/saas/assets/src/routes/faq.tsx +0 -94
  256. package/examples/saas/assets/src/routes/index.tsx +0 -197
  257. package/examples/saas/info.json +0 -23
  258. package/examples/saas/package.json +0 -1
  259. package/examples/survey/README.md +0 -20
  260. package/examples/survey/assets/AGENTS.md.append +0 -9
  261. package/examples/survey/assets/public/form-survey.html +0 -15
  262. package/examples/survey/assets/src/components/SurveyForm.tsx +0 -128
  263. package/examples/survey/assets/src/routes/index.tsx +0 -14
  264. package/examples/survey/info.json +0 -19
  265. package/examples/survey/package.json +0 -1
  266. package/project/base/AGENTS.md +0 -86
  267. package/project/base/_dot_claude/skills/content-collections/SKILL.md +0 -505
  268. package/project/base/_dot_claude/skills/netlify-blobs/SKILL.md +0 -410
  269. package/project/base/_dot_claude/skills/netlify-db/SKILL.md +0 -424
  270. package/project/base/_dot_claude/skills/netlify-debugging/SKILL.md +0 -419
  271. package/project/base/_dot_claude/skills/netlify-forms/SKILL.md +0 -243
  272. package/project/base/_dot_claude/skills/netlify-functions/SKILL.md +0 -372
  273. package/project/base/_dot_claude/skills/tanstack-start-api-routes/SKILL.md +0 -421
  274. package/project/base/_dot_claude/skills/tanstack-start-loaders/SKILL.md +0 -426
  275. package/project/base/_dot_claude/skills/tanstack-start-project-setup/SKILL.md +0 -493
  276. package/project/base/_dot_claude/skills/tanstack-start-routes/SKILL.md +0 -430
  277. package/project/base/_dot_claude/skills/tanstack-start-server-functions/SKILL.md +0 -445
  278. package/project/base/_dot_claude/skills/tanstack-start-typesafe-routing/SKILL.md +0 -494
  279. package/project/base/_dot_gitignore +0 -8
  280. package/project/base/netlify.toml +0 -7
  281. package/project/base/package.json +0 -33
  282. package/project/base/public/favicon.ico +0 -0
  283. package/project/base/public/tanstack-circle-logo.png +0 -0
  284. package/project/base/public/tanstack-word-logo-white.svg +0 -1
  285. package/project/base/src/components/Header.tsx +0 -17
  286. package/project/base/src/components/HeaderNav.tsx.ejs +0 -179
  287. package/project/base/src/router.tsx +0 -15
  288. package/project/base/src/routes/__root.tsx +0 -57
  289. package/project/base/src/routes/index.tsx +0 -48
  290. package/project/base/src/styles.css +0 -15
  291. package/project/base/tsconfig.json +0 -28
  292. package/project/base/vite.config.ts.ejs +0 -25
  293. package/project/info.json +0 -17
  294. package/project/packages.json +0 -22
  295. package/scripts/check-outdated-packages.js +0 -421
  296. package/src/agents-md.ts +0 -139
@@ -1,210 +0,0 @@
1
- import { toolDefinition } from '@tanstack/ai'
2
- import { z } from 'zod'
3
-
4
- import { allSpeakers, allTalks } from 'content-collections'
5
-
6
- // Tool definition for getting a speaker by slug
7
- export const getSpeakerBySlugToolDef = toolDefinition({
8
- name: 'getSpeakerBySlug',
9
- description:
10
- 'Get the full profile and bio of a specific speaker. Use this when asked about a particular speaker.',
11
- inputSchema: z.object({
12
- slug: z.string().describe('The slug of the speaker'),
13
- }),
14
- outputSchema: z.object({
15
- name: z.string(),
16
- title: z.string(),
17
- specialty: z.string(),
18
- restaurant: z.string(),
19
- location: z.string(),
20
- bio: z.string(),
21
- awards: z.array(z.string()),
22
- }),
23
- })
24
-
25
- // Server implementation
26
- export const getSpeakerBySlug = getSpeakerBySlugToolDef.server(({ slug }) => {
27
- const speaker = allSpeakers.find((s) => s.slug === slug)
28
- if (!speaker) {
29
- return {
30
- name: 'Speaker not found',
31
- title: '',
32
- specialty: '',
33
- restaurant: '',
34
- location: '',
35
- bio: 'The requested speaker was not found.',
36
- awards: [],
37
- }
38
- }
39
- return {
40
- name: speaker.name,
41
- title: speaker.title,
42
- specialty: speaker.specialty,
43
- restaurant: speaker.restaurant,
44
- location: speaker.location,
45
- bio: speaker.content,
46
- awards: speaker.awards || [],
47
- }
48
- })
49
-
50
- // Tool definition for getting a talk by slug
51
- export const getTalkBySlugToolDef = toolDefinition({
52
- name: 'getTalkBySlug',
53
- description:
54
- 'Get the full details of a specific session/talk. Use this when asked about a particular session.',
55
- inputSchema: z.object({
56
- slug: z.string().describe('The slug of the talk'),
57
- }),
58
- outputSchema: z.object({
59
- title: z.string(),
60
- speaker: z.string(),
61
- duration: z.string(),
62
- topics: z.array(z.string()),
63
- description: z.string(),
64
- }),
65
- })
66
-
67
- // Server implementation
68
- export const getTalkBySlug = getTalkBySlugToolDef.server(({ slug }) => {
69
- const talk = allTalks.find((t) => t.slug === slug)
70
- if (!talk) {
71
- return {
72
- title: 'Session not found',
73
- speaker: '',
74
- duration: '',
75
- topics: [],
76
- description: 'The requested session was not found.',
77
- }
78
- }
79
- return {
80
- title: talk.title,
81
- speaker: talk.speaker,
82
- duration: talk.duration,
83
- topics: talk.topics,
84
- description: talk.content,
85
- }
86
- })
87
-
88
- // Tool definition for listing all speakers
89
- export const getAllSpeakersToolDef = toolDefinition({
90
- name: 'getAllSpeakers',
91
- description:
92
- 'Get a list of all speakers at the conference with their names, specialties, and restaurants.',
93
- inputSchema: z.object({}),
94
- outputSchema: z.array(
95
- z.object({
96
- slug: z.string(),
97
- name: z.string(),
98
- specialty: z.string(),
99
- restaurant: z.string(),
100
- location: z.string(),
101
- }),
102
- ),
103
- })
104
-
105
- // Server implementation
106
- export const getAllSpeakers = getAllSpeakersToolDef.server(() => {
107
- return allSpeakers.map((speaker) => ({
108
- slug: speaker.slug,
109
- name: speaker.name,
110
- specialty: speaker.specialty,
111
- restaurant: speaker.restaurant,
112
- location: speaker.location,
113
- }))
114
- })
115
-
116
- // Tool definition for listing all talks
117
- export const getAllTalksToolDef = toolDefinition({
118
- name: 'getAllTalks',
119
- description:
120
- 'Get a list of all sessions/talks at the conference with their titles, speakers, and topics.',
121
- inputSchema: z.object({}),
122
- outputSchema: z.array(
123
- z.object({
124
- slug: z.string(),
125
- title: z.string(),
126
- speaker: z.string(),
127
- duration: z.string(),
128
- topics: z.array(z.string()),
129
- }),
130
- ),
131
- })
132
-
133
- // Server implementation
134
- export const getAllTalks = getAllTalksToolDef.server(() => {
135
- return allTalks.map((talk) => ({
136
- slug: talk.slug,
137
- title: talk.title,
138
- speaker: talk.speaker,
139
- duration: talk.duration,
140
- topics: talk.topics,
141
- }))
142
- })
143
-
144
- // Tool definition for searching conference content
145
- export const searchConferenceToolDef = toolDefinition({
146
- name: 'searchConference',
147
- description:
148
- 'Search for speakers or sessions by keyword. Use this to find content matching user queries about topics, techniques, or names.',
149
- inputSchema: z.object({
150
- query: z.string().describe('The search query'),
151
- }),
152
- outputSchema: z.object({
153
- speakers: z.array(
154
- z.object({
155
- slug: z.string(),
156
- name: z.string(),
157
- specialty: z.string(),
158
- restaurant: z.string(),
159
- }),
160
- ),
161
- talks: z.array(
162
- z.object({
163
- slug: z.string(),
164
- title: z.string(),
165
- speaker: z.string(),
166
- topics: z.array(z.string()),
167
- }),
168
- ),
169
- }),
170
- })
171
-
172
- // Server implementation
173
- export const searchConference = searchConferenceToolDef.server(({ query }) => {
174
- const queryLower = query.toLowerCase()
175
-
176
- const matchingSpeakers = allSpeakers
177
- .filter(
178
- (speaker) =>
179
- speaker.name.toLowerCase().includes(queryLower) ||
180
- speaker.specialty.toLowerCase().includes(queryLower) ||
181
- speaker.restaurant.toLowerCase().includes(queryLower) ||
182
- speaker.content.toLowerCase().includes(queryLower),
183
- )
184
- .map((speaker) => ({
185
- slug: speaker.slug,
186
- name: speaker.name,
187
- specialty: speaker.specialty,
188
- restaurant: speaker.restaurant,
189
- }))
190
-
191
- const matchingTalks = allTalks
192
- .filter(
193
- (talk) =>
194
- talk.title.toLowerCase().includes(queryLower) ||
195
- talk.speaker.toLowerCase().includes(queryLower) ||
196
- talk.topics.some((topic) => topic.toLowerCase().includes(queryLower)) ||
197
- talk.content.toLowerCase().includes(queryLower),
198
- )
199
- .map((talk) => ({
200
- slug: talk.slug,
201
- title: talk.title,
202
- speaker: talk.speaker,
203
- topics: talk.topics,
204
- }))
205
-
206
- return {
207
- speakers: matchingSpeakers,
208
- talks: matchingTalks,
209
- }
210
- })
@@ -1 +0,0 @@
1
- export type Provider = 'anthropic' | 'openai' | 'gemini' | 'ollama'
@@ -1,6 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx'
2
- import { twMerge } from 'tailwind-merge'
3
-
4
- export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs))
6
- }
@@ -1,70 +0,0 @@
1
- import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router'
2
- import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
3
- import { TanStackDevtools } from '@tanstack/react-devtools'
4
-
5
- import Header from '../components/Header'
6
-
7
- import appCss from '../styles.css?url'
8
-
9
- export const Route = createRootRoute({
10
- head: () => ({
11
- meta: [
12
- {
13
- charSet: 'utf-8',
14
- },
15
- {
16
- name: 'viewport',
17
- content: 'width=device-width, initial-scale=1',
18
- },
19
- {
20
- title: 'Haute Pâtisserie 2026 | Elite Baking Conference',
21
- },
22
- {
23
- name: 'description',
24
- content: 'Join the world\'s most celebrated pastry chefs for three days of masterclasses, demonstrations, and culinary inspiration.',
25
- },
26
- ],
27
- links: [
28
- {
29
- rel: 'stylesheet',
30
- href: appCss,
31
- },
32
- {
33
- rel: 'preconnect',
34
- href: 'https://fonts.googleapis.com',
35
- },
36
- {
37
- rel: 'preconnect',
38
- href: 'https://fonts.gstatic.com',
39
- crossOrigin: 'anonymous',
40
- },
41
- ],
42
- }),
43
- shellComponent: RootDocument,
44
- })
45
-
46
- function RootDocument({ children }: { children: React.ReactNode }) {
47
- return (
48
- <html lang="en" className="dark">
49
- <head>
50
- <HeadContent />
51
- </head>
52
- <body className="bg-background min-h-screen text-foreground">
53
- <Header />
54
- <main className="mt-32">{children}</main>
55
- <TanStackDevtools
56
- config={{
57
- position: 'bottom-right',
58
- }}
59
- plugins={[
60
- {
61
- name: 'Tanstack Router',
62
- render: <TanStackRouterDevtoolsPanel />,
63
- },
64
- ]}
65
- />
66
- <Scripts />
67
- </body>
68
- </html>
69
- )
70
- }
@@ -1,119 +0,0 @@
1
- import { createFileRoute } from '@tanstack/react-router'
2
- import { chat, maxIterations, toServerSentEventsResponse } from '@tanstack/ai'
3
- import { anthropicText } from '@tanstack/ai-anthropic'
4
- import { openaiText } from '@tanstack/ai-openai'
5
- import { geminiText } from '@tanstack/ai-gemini'
6
- import { ollamaText } from '@tanstack/ai-ollama'
7
-
8
- import {
9
- getSpeakerBySlug,
10
- getTalkBySlug,
11
- getAllSpeakers,
12
- getAllTalks,
13
- searchConference,
14
- } from '@/lib/conference-tools'
15
- import type { Provider } from '@/lib/model-selection'
16
-
17
- export const Route = createFileRoute('/api/remy-chat')({
18
- server: {
19
- handlers: {
20
- POST: async ({ request }) => {
21
- const requestSignal = request.signal
22
-
23
- if (requestSignal.aborted) {
24
- return new Response(null, { status: 499 })
25
- }
26
-
27
- const abortController = new AbortController()
28
-
29
- try {
30
- const body = await request.json()
31
- const { messages, speakerSlug, talkSlug } = body
32
- const data = body.data || {}
33
-
34
- const SYSTEM_PROMPT = `You are Remy, a charming and knowledgeable culinary assistant for the Haute Pâtisserie 2026 conference in Paris. You have a warm, enthusiastic personality and deep appreciation for the art of pastry and baking.
35
-
36
- PERSONALITY:
37
- - Speak with warmth and a touch of French flair (occasional "magnifique!", "c'est parfait!", etc.)
38
- - Be genuinely passionate about pastry, bread, and culinary arts
39
- - Knowledgeable about techniques, ingredients, and the history of baking
40
- - Helpful and encouraging to both novices and professionals
41
-
42
- CAPABILITIES:
43
- 1. Use getSpeakerBySlug to get detailed information about a specific speaker
44
- 2. Use getTalkBySlug to get detailed information about a specific session
45
- 3. Use getAllSpeakers to see the complete speaker lineup
46
- 4. Use getAllTalks to see all available sessions
47
- 5. Use searchConference to find speakers or sessions matching a topic or keyword
48
-
49
- INSTRUCTIONS:
50
- - When asked about the conference, speakers, or sessions, use your tools to provide accurate information
51
- - Help attendees find sessions that match their interests
52
- - Share enthusiasm about the speakers and their expertise
53
- - If asked about pastry techniques, you can provide general knowledge while recommending relevant sessions
54
- - Keep responses conversational but informative
55
- - When recommending sessions, explain why they might be interesting based on the user's query
56
-
57
- ${speakerSlug ? `CONTEXT: The user is viewing the profile of the speaker with slug "${speakerSlug}".` : ''}
58
- ${talkSlug ? `CONTEXT: The user is viewing the session with slug "${talkSlug}".` : ''}
59
-
60
- Remember: You are the friendly face of Haute Pâtisserie 2026. Make every attendee feel welcome and excited about the culinary journey ahead!`
61
-
62
- // Determine the best available provider
63
- let provider: Provider = data.provider || 'ollama'
64
- let model: string = data.model || 'mistral:7b'
65
-
66
- // Use the first available provider with an API key, fallback to ollama
67
- if (process.env.ANTHROPIC_API_KEY) {
68
- provider = 'anthropic'
69
- model = 'claude-haiku-4-5'
70
- } else if (process.env.OPENAI_API_KEY) {
71
- provider = 'openai'
72
- model = 'gpt-4o'
73
- } else if (process.env.GEMINI_API_KEY) {
74
- provider = 'gemini'
75
- model = 'gemini-2.0-flash-exp'
76
- }
77
- // else keep ollama as default
78
-
79
- // Adapter factory pattern for multi-vendor support
80
- const adapterConfig = {
81
- anthropic: () =>
82
- anthropicText((model || 'claude-haiku-4-5') as any),
83
- openai: () => openaiText((model || 'gpt-4o') as any),
84
- gemini: () => geminiText((model || 'gemini-2.0-flash-exp') as any),
85
- ollama: () => ollamaText((model || 'mistral:7b') as any),
86
- }
87
-
88
- const adapter = adapterConfig[provider]()
89
-
90
- const stream = chat({
91
- adapter,
92
- tools: [getSpeakerBySlug, getTalkBySlug, getAllSpeakers, getAllTalks, searchConference],
93
- systemPrompts: [SYSTEM_PROMPT],
94
- agentLoopStrategy: maxIterations(5),
95
- messages,
96
- abortController,
97
- })
98
-
99
- return toServerSentEventsResponse(stream, { abortController })
100
- } catch (error: any) {
101
- console.error('Remy chat error:', error)
102
- if (error.name === 'AbortError' || abortController.signal.aborted) {
103
- return new Response(null, { status: 499 })
104
- }
105
- return new Response(
106
- JSON.stringify({
107
- error: 'Failed to process chat request',
108
- message: error.message,
109
- }),
110
- {
111
- status: 500,
112
- headers: { 'Content-Type': 'application/json' },
113
- },
114
- )
115
- }
116
- },
117
- },
118
- },
119
- })
@@ -1,192 +0,0 @@
1
- import { createFileRoute, Link } from '@tanstack/react-router'
2
- import { ArrowRight, Calendar, MapPin, Users } from 'lucide-react'
3
-
4
- import { allSpeakers, allTalks } from 'content-collections'
5
-
6
- import SpeakerCard from '@/components/SpeakerCard'
7
- import TalkCard from '@/components/TalkCard'
8
- import RemyAssistant from '@/components/RemyAssistant'
9
- import HeroCarousel from '@/components/HeroCarousel'
10
-
11
- export const Route = createFileRoute('/')({
12
- component: HomePage,
13
- })
14
-
15
- function HomePage() {
16
- const featuredSpeakers = allSpeakers.slice(0, 3)
17
- const featuredTalks = allTalks.slice(0, 4)
18
-
19
- return (
20
- <>
21
- <RemyAssistant />
22
-
23
- {/* Hero Section */}
24
- <section className="relative min-h-[90vh] flex items-center justify-center px-6 overflow-hidden">
25
- {/* Background carousel */}
26
- <HeroCarousel />
27
-
28
- <div className="relative max-w-5xl mx-auto text-center z-10">
29
- {/* Event date badge */}
30
- <div className="inline-flex items-center gap-2 px-4 py-2 mb-8 rounded-full bg-copper/10 border border-copper/30 text-copper-light text-sm font-medium">
31
- <Calendar className="w-4 h-4" />
32
- <span>March 15-17, 2026</span>
33
- <span className="mx-2 text-copper/40">•</span>
34
- <MapPin className="w-4 h-4" />
35
- <span>Paris, France</span>
36
- </div>
37
-
38
- {/* Main title */}
39
- <h1 className="font-display text-6xl md:text-8xl font-bold text-cream mb-6 leading-tight">
40
- Haute
41
- <span className="block text-gold italic">Pâtisserie</span>
42
- </h1>
43
-
44
- <p className="text-xl md:text-2xl text-cream/70 font-body max-w-3xl mx-auto mb-10 leading-relaxed">
45
- Join the world's most celebrated pastry chefs and master bakers for three extraordinary days of masterclasses, demonstrations, and culinary inspiration.
46
- </p>
47
-
48
- {/* Stats */}
49
- <div className="flex flex-wrap justify-center gap-8 mb-12">
50
- <div className="text-center">
51
- <div className="text-4xl font-display font-bold text-gold">{allSpeakers.length}</div>
52
- <div className="text-cream/50 text-sm uppercase tracking-wider">Master Chefs</div>
53
- </div>
54
- <div className="text-center">
55
- <div className="text-4xl font-display font-bold text-gold">{allTalks.length}</div>
56
- <div className="text-cream/50 text-sm uppercase tracking-wider">Sessions</div>
57
- </div>
58
- <div className="text-center">
59
- <div className="text-4xl font-display font-bold text-gold">3</div>
60
- <div className="text-cream/50 text-sm uppercase tracking-wider">Days</div>
61
- </div>
62
- </div>
63
-
64
- {/* CTA buttons */}
65
- <div className="flex flex-wrap justify-center gap-4">
66
- <Link
67
- to="/speakers"
68
- className="inline-flex items-center gap-2 px-8 py-4 rounded-full bg-gradient-to-r from-copper to-copper-dark text-charcoal font-semibold text-lg transition-all hover:shadow-lg hover:shadow-copper/30 hover:scale-[1.02]"
69
- >
70
- <Users className="w-5 h-5" />
71
- Meet Our Speakers
72
- </Link>
73
- <Link
74
- to="/talks"
75
- className="inline-flex items-center gap-2 px-8 py-4 rounded-full border-2 border-gold/50 text-gold font-semibold text-lg transition-all hover:bg-gold/10 hover:border-gold"
76
- >
77
- View Sessions
78
- <ArrowRight className="w-5 h-5" />
79
- </Link>
80
- </div>
81
- </div>
82
- </section>
83
-
84
- {/* Featured Speakers Section */}
85
- <section className="py-20 px-6">
86
- <div className="max-w-7xl mx-auto">
87
- <div className="flex items-end justify-between mb-12">
88
- <div>
89
- <h2 className="font-display text-4xl md:text-5xl font-bold text-cream mb-3">
90
- Featured <span className="text-gold italic">Speakers</span>
91
- </h2>
92
- <p className="text-cream/60 text-lg font-body">
93
- Learn from award-winning pastry chefs and master bakers
94
- </p>
95
- </div>
96
- <Link
97
- to="/speakers"
98
- className="hidden md:inline-flex items-center gap-2 text-gold hover:text-gold/80 transition-colors font-medium"
99
- >
100
- View all speakers
101
- <ArrowRight className="w-4 h-4" />
102
- </Link>
103
- </div>
104
-
105
- <div className="grid grid-cols-1 md:grid-cols-3 gap-8">
106
- {featuredSpeakers.map((speaker) => (
107
- <SpeakerCard key={speaker.slug} speaker={speaker} featured />
108
- ))}
109
- </div>
110
-
111
- <div className="md:hidden mt-8 text-center">
112
- <Link
113
- to="/speakers"
114
- className="inline-flex items-center gap-2 text-gold hover:text-gold/80 transition-colors font-medium"
115
- >
116
- View all speakers
117
- <ArrowRight className="w-4 h-4" />
118
- </Link>
119
- </div>
120
- </div>
121
- </section>
122
-
123
- {/* Divider */}
124
- <div className="max-w-7xl mx-auto px-6">
125
- <div className="h-px bg-gradient-to-r from-transparent via-border to-transparent" />
126
- </div>
127
-
128
- {/* Featured Sessions Section */}
129
- <section className="py-20 px-6">
130
- <div className="max-w-7xl mx-auto">
131
- <div className="flex items-end justify-between mb-12">
132
- <div>
133
- <h2 className="font-display text-4xl md:text-5xl font-bold text-cream mb-3">
134
- Featured <span className="text-gold italic">Sessions</span>
135
- </h2>
136
- <p className="text-cream/60 text-lg font-body">
137
- Masterclasses and demonstrations to elevate your craft
138
- </p>
139
- </div>
140
- <Link
141
- to="/talks"
142
- className="hidden md:inline-flex items-center gap-2 text-gold hover:text-gold/80 transition-colors font-medium"
143
- >
144
- View all sessions
145
- <ArrowRight className="w-4 h-4" />
146
- </Link>
147
- </div>
148
-
149
- <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
150
- {featuredTalks.map((talk) => (
151
- <TalkCard key={talk.slug} talk={talk} featured />
152
- ))}
153
- </div>
154
-
155
- <div className="md:hidden mt-8 text-center">
156
- <Link
157
- to="/talks"
158
- className="inline-flex items-center gap-2 text-gold hover:text-gold/80 transition-colors font-medium"
159
- >
160
- View all sessions
161
- <ArrowRight className="w-4 h-4" />
162
- </Link>
163
- </div>
164
- </div>
165
- </section>
166
-
167
- {/* CTA Section */}
168
- <section className="py-20 px-6">
169
- <div className="max-w-4xl mx-auto text-center">
170
- <div className="relative p-12 rounded-3xl bg-gradient-to-br from-card to-charcoal border border-border/50 overflow-hidden">
171
- {/* Decorative elements */}
172
- <div className="absolute top-0 right-0 w-64 h-64 bg-copper/5 rounded-full blur-3xl" />
173
- <div className="absolute bottom-0 left-0 w-48 h-48 bg-gold/5 rounded-full blur-3xl" />
174
-
175
- <div className="relative">
176
- <h2 className="font-display text-3xl md:text-4xl font-bold text-cream mb-4">
177
- Ready to Elevate Your Craft?
178
- </h2>
179
- <p className="text-cream/60 text-lg font-body mb-8 max-w-2xl mx-auto">
180
- Join us in Paris for an unforgettable experience with the world's finest pastry artisans.
181
- </p>
182
- <div className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-gold/10 border border-gold/30 text-gold text-sm font-medium">
183
- <span>🥐</span>
184
- <span>Registration opens January 2026</span>
185
- </div>
186
- </div>
187
- </div>
188
- </div>
189
- </section>
190
- </>
191
- )
192
- }