camox 0.0.0 → 0.1.2-alpha.2

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 (255) hide show
  1. package/LICENSE.md +110 -0
  2. package/dist/components/AuthGate.d.ts +7 -0
  3. package/dist/components/AuthGate.d.ts.map +1 -0
  4. package/dist/core/components/AddBlockControlBar.d.ts +9 -0
  5. package/dist/core/components/AddBlockControlBar.d.ts.map +1 -0
  6. package/dist/core/components/AddBlockControlBar.js +65 -0
  7. package/dist/core/components/lexical/InlineContentEditable.d.ts +7 -0
  8. package/dist/core/components/lexical/InlineContentEditable.d.ts.map +1 -0
  9. package/dist/core/components/lexical/InlineContentEditable.js +40 -0
  10. package/dist/core/components/lexical/InlineLexicalEditor.d.ts +12 -0
  11. package/dist/core/components/lexical/InlineLexicalEditor.d.ts.map +1 -0
  12. package/dist/core/components/lexical/InlineLexicalEditor.js +133 -0
  13. package/dist/core/components/lexical/InlineParagraphNode.d.ts +10 -0
  14. package/dist/core/components/lexical/InlineParagraphNode.d.ts.map +1 -0
  15. package/dist/core/components/lexical/InlineParagraphNode.js +34 -0
  16. package/dist/core/components/lexical/SelectionBroadcaster.d.ts +6 -0
  17. package/dist/core/components/lexical/SelectionBroadcaster.d.ts.map +1 -0
  18. package/dist/core/components/lexical/SelectionBroadcaster.js +62 -0
  19. package/dist/core/components/lexical/SidebarLexicalEditor.d.ts +9 -0
  20. package/dist/core/components/lexical/SidebarLexicalEditor.d.ts.map +1 -0
  21. package/dist/core/components/lexical/editorConfig.d.ts +4 -0
  22. package/dist/core/components/lexical/editorConfig.d.ts.map +1 -0
  23. package/dist/core/components/lexical/editorConfig.js +24 -0
  24. package/dist/core/createApp.d.ts +373 -0
  25. package/dist/core/createApp.d.ts.map +1 -0
  26. package/dist/core/createApp.js +40 -0
  27. package/dist/core/createBlock.d.ts +947 -0
  28. package/dist/core/createBlock.d.ts.map +1 -0
  29. package/dist/core/createBlock.js +873 -0
  30. package/dist/core/createLayout.d.ts +78 -0
  31. package/dist/core/createLayout.d.ts.map +1 -0
  32. package/dist/core/createLayout.js +73 -0
  33. package/dist/core/hooks/useFieldSelection.d.ts +11 -0
  34. package/dist/core/hooks/useFieldSelection.d.ts.map +1 -0
  35. package/dist/core/hooks/useFieldSelection.js +25 -0
  36. package/dist/core/hooks/useIsEditable.d.ts +2 -0
  37. package/dist/core/hooks/useIsEditable.d.ts.map +1 -0
  38. package/dist/core/hooks/useIsEditable.js +12 -0
  39. package/dist/core/hooks/useOverlayMessage.d.ts +10 -0
  40. package/dist/core/hooks/useOverlayMessage.d.ts.map +1 -0
  41. package/dist/core/hooks/useOverlayMessage.js +37 -0
  42. package/dist/core/lib/contentType.d.ts +165 -0
  43. package/dist/core/lib/contentType.d.ts.map +1 -0
  44. package/dist/core/lib/contentType.js +148 -0
  45. package/dist/core/lib/fieldTypes.d.ts +85 -0
  46. package/dist/core/lib/fieldTypes.d.ts.map +1 -0
  47. package/dist/core/lib/lexicalReact.d.ts +3 -0
  48. package/dist/core/lib/lexicalReact.d.ts.map +1 -0
  49. package/dist/core/lib/lexicalReact.js +24 -0
  50. package/dist/core/lib/lexicalState.d.ts +10 -0
  51. package/dist/core/lib/lexicalState.d.ts.map +1 -0
  52. package/dist/core/lib/lexicalState.js +38 -0
  53. package/dist/core/lib/modifierFormats.d.ts +9 -0
  54. package/dist/core/lib/modifierFormats.d.ts.map +1 -0
  55. package/dist/core/lib/modifierFormats.js +8 -0
  56. package/dist/core/lib/modifiers.d.ts +12 -0
  57. package/dist/core/lib/modifiers.d.ts.map +1 -0
  58. package/dist/core/lib/modifiers.js +27 -0
  59. package/dist/features/content/CamoxContent.d.ts +2 -0
  60. package/dist/features/content/CamoxContent.d.ts.map +1 -0
  61. package/dist/features/content/CamoxContent.js +100 -0
  62. package/dist/features/content/components/AssetCard.d.ts +10 -0
  63. package/dist/features/content/components/AssetCard.d.ts.map +1 -0
  64. package/dist/features/content/components/AssetCard.js +41 -0
  65. package/dist/features/content/components/AssetCardSkeleton.d.ts +2 -0
  66. package/dist/features/content/components/AssetCardSkeleton.d.ts.map +1 -0
  67. package/dist/features/content/components/AssetCardSkeleton.js +11 -0
  68. package/dist/features/content/components/ContentSidebar.d.ts +2 -0
  69. package/dist/features/content/components/ContentSidebar.d.ts.map +1 -0
  70. package/dist/features/content/components/ContentSidebar.js +15 -0
  71. package/dist/features/content/components/UploadDropZone.d.ts +9 -0
  72. package/dist/features/content/components/UploadDropZone.d.ts.map +1 -0
  73. package/dist/features/content/components/UploadDropZone.js +51 -0
  74. package/dist/features/content/components/UploadProgressDrawer.d.ts +11 -0
  75. package/dist/features/content/components/UploadProgressDrawer.d.ts.map +1 -0
  76. package/dist/features/content/components/UploadProgressDrawer.js +72 -0
  77. package/dist/features/preview/CamoxPreview.d.ts +124 -0
  78. package/dist/features/preview/CamoxPreview.d.ts.map +1 -0
  79. package/dist/features/preview/CamoxPreview.js +253 -0
  80. package/dist/features/preview/components/AddBlockSheet.d.ts +3 -0
  81. package/dist/features/preview/components/AddBlockSheet.d.ts.map +1 -0
  82. package/dist/features/preview/components/AddBlockSheet.js +121 -0
  83. package/dist/features/preview/components/AgentChatSheet.d.ts +3 -0
  84. package/dist/features/preview/components/AgentChatSheet.d.ts.map +1 -0
  85. package/dist/features/preview/components/AgentChatSheet.js +24 -0
  86. package/dist/features/preview/components/AssetFieldEditor.d.ts +18 -0
  87. package/dist/features/preview/components/AssetFieldEditor.d.ts.map +1 -0
  88. package/dist/features/preview/components/AssetFieldEditor.js +139 -0
  89. package/dist/features/preview/components/AssetLightbox.d.ts +9 -0
  90. package/dist/features/preview/components/AssetLightbox.d.ts.map +1 -0
  91. package/dist/features/preview/components/AssetLightbox.js +421 -0
  92. package/dist/features/preview/components/AssetPickerGrid.d.ts +11 -0
  93. package/dist/features/preview/components/AssetPickerGrid.d.ts.map +1 -0
  94. package/dist/features/preview/components/AssetPickerGrid.js +92 -0
  95. package/dist/features/preview/components/BlockActionsPopover.d.ts +15 -0
  96. package/dist/features/preview/components/BlockActionsPopover.d.ts.map +1 -0
  97. package/dist/features/preview/components/BlockActionsPopover.js +506 -0
  98. package/dist/features/preview/components/CreatePageSheet.d.ts +3 -0
  99. package/dist/features/preview/components/CreatePageSheet.d.ts.map +1 -0
  100. package/dist/features/preview/components/CreatePageSheet.js +159 -0
  101. package/dist/features/preview/components/DebouncedFieldEditor.d.ts +10 -0
  102. package/dist/features/preview/components/DebouncedFieldEditor.d.ts.map +1 -0
  103. package/dist/features/preview/components/DebouncedFieldEditor.js +51 -0
  104. package/dist/features/preview/components/EditPageSheet.d.ts +3 -0
  105. package/dist/features/preview/components/EditPageSheet.d.ts.map +1 -0
  106. package/dist/features/preview/components/EditPageSheet.js +352 -0
  107. package/dist/features/preview/components/ItemFieldsEditor.d.ts +29 -0
  108. package/dist/features/preview/components/ItemFieldsEditor.d.ts.map +1 -0
  109. package/dist/features/preview/components/ItemFieldsEditor.js +308 -0
  110. package/dist/features/preview/components/LinkFieldEditor.d.ts +8 -0
  111. package/dist/features/preview/components/LinkFieldEditor.d.ts.map +1 -0
  112. package/dist/features/preview/components/LinkFieldEditor.js +190 -0
  113. package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts +10 -0
  114. package/dist/features/preview/components/MultipleAssetFieldEditor.d.ts.map +1 -0
  115. package/dist/features/preview/components/MultipleAssetFieldEditor.js +232 -0
  116. package/dist/features/preview/components/OverlayTracker.d.ts +6 -0
  117. package/dist/features/preview/components/OverlayTracker.d.ts.map +1 -0
  118. package/dist/features/preview/components/OverlayTracker.js +41 -0
  119. package/dist/features/preview/components/Overlays.d.ts +6 -0
  120. package/dist/features/preview/components/Overlays.d.ts.map +1 -0
  121. package/dist/features/preview/components/Overlays.js +58 -0
  122. package/dist/features/preview/components/PageContentSheet.d.ts +3 -0
  123. package/dist/features/preview/components/PageContentSheet.d.ts.map +1 -0
  124. package/dist/features/preview/components/PageContentSheet.js +492 -0
  125. package/dist/features/preview/components/PageLocationFieldset.d.ts +14 -0
  126. package/dist/features/preview/components/PageLocationFieldset.d.ts.map +1 -0
  127. package/dist/features/preview/components/PageLocationFieldset.js +77 -0
  128. package/dist/features/preview/components/PagePicker.d.ts +3 -0
  129. package/dist/features/preview/components/PagePicker.d.ts.map +1 -0
  130. package/dist/features/preview/components/PagePicker.js +185 -0
  131. package/dist/features/preview/components/PageTree.d.ts +3 -0
  132. package/dist/features/preview/components/PageTree.d.ts.map +1 -0
  133. package/dist/features/preview/components/PageTree.js +410 -0
  134. package/dist/features/preview/components/PeekedBlock.d.ts +6 -0
  135. package/dist/features/preview/components/PeekedBlock.d.ts.map +1 -0
  136. package/dist/features/preview/components/PeekedBlock.js +95 -0
  137. package/dist/features/preview/components/PreviewPanel.d.ts +12 -0
  138. package/dist/features/preview/components/PreviewPanel.d.ts.map +1 -0
  139. package/dist/features/preview/components/PreviewPanel.js +192 -0
  140. package/dist/features/preview/components/PreviewSideSheet.d.ts +13 -0
  141. package/dist/features/preview/components/PreviewSideSheet.d.ts.map +1 -0
  142. package/dist/features/preview/components/PreviewSideSheet.js +28 -0
  143. package/dist/features/preview/components/PreviewToolbar.d.ts +2 -0
  144. package/dist/features/preview/components/PreviewToolbar.d.ts.map +1 -0
  145. package/dist/features/preview/components/PreviewToolbar.js +79 -0
  146. package/dist/features/preview/components/RepeatableItemsList.d.ts +14 -0
  147. package/dist/features/preview/components/RepeatableItemsList.d.ts.map +1 -0
  148. package/dist/features/preview/components/RepeatableItemsList.js +366 -0
  149. package/dist/features/preview/components/ShikiMarkdown.d.ts +4 -0
  150. package/dist/features/preview/components/ShikiMarkdown.d.ts.map +1 -0
  151. package/dist/features/preview/components/ShikiMarkdown.js +37 -0
  152. package/dist/features/preview/components/TextFormatToolbar.d.ts +2 -0
  153. package/dist/features/preview/components/TextFormatToolbar.d.ts.map +1 -0
  154. package/dist/features/preview/components/TextFormatToolbar.js +73 -0
  155. package/dist/features/preview/components/UnlinkAssetButton.d.ts +9 -0
  156. package/dist/features/preview/components/UnlinkAssetButton.d.ts.map +1 -0
  157. package/dist/features/preview/components/UnlinkAssetButton.js +55 -0
  158. package/dist/features/preview/overlayConstants.d.ts +19 -0
  159. package/dist/features/preview/overlayConstants.d.ts.map +1 -0
  160. package/dist/features/preview/overlayConstants.js +21 -0
  161. package/dist/features/preview/overlayMessages.d.ts +62 -0
  162. package/dist/features/preview/overlayMessages.d.ts.map +1 -0
  163. package/dist/features/preview/overlayMessages.js +9 -0
  164. package/dist/features/preview/previewConstants.d.ts +2 -0
  165. package/dist/features/preview/previewConstants.d.ts.map +1 -0
  166. package/dist/features/preview/previewStore.d.ts +116 -0
  167. package/dist/features/preview/previewStore.d.ts.map +1 -0
  168. package/dist/features/preview/previewStore.js +321 -0
  169. package/dist/features/provider/CamoxProvider.d.ts +11 -0
  170. package/dist/features/provider/CamoxProvider.d.ts.map +1 -0
  171. package/dist/features/provider/CamoxProvider.js +73 -0
  172. package/dist/features/provider/actionsStore.d.ts +39 -0
  173. package/dist/features/provider/actionsStore.d.ts.map +1 -0
  174. package/dist/features/provider/actionsStore.js +35 -0
  175. package/dist/features/provider/components/CamoxAppContext.d.ts +371 -0
  176. package/dist/features/provider/components/CamoxAppContext.d.ts.map +1 -0
  177. package/dist/features/provider/components/CamoxAppContext.js +17 -0
  178. package/dist/features/provider/components/CommandPalette.d.ts +3 -0
  179. package/dist/features/provider/components/CommandPalette.d.ts.map +1 -0
  180. package/dist/features/provider/components/CommandPalette.js +127 -0
  181. package/dist/features/provider/useAdminShortcuts.d.ts +5 -0
  182. package/dist/features/provider/useAdminShortcuts.d.ts.map +1 -0
  183. package/dist/features/provider/useAdminShortcuts.js +83 -0
  184. package/dist/features/routes/ogRoute.d.ts +7 -0
  185. package/dist/features/routes/ogRoute.d.ts.map +1 -0
  186. package/dist/features/routes/ogRoute.js +19 -0
  187. package/dist/features/routes/pageRoute.d.ts +135 -0
  188. package/dist/features/routes/pageRoute.d.ts.map +1 -0
  189. package/dist/features/routes/pageRoute.js +112 -0
  190. package/dist/features/studio/CamoxStudio.d.ts +7 -0
  191. package/dist/features/studio/CamoxStudio.d.ts.map +1 -0
  192. package/dist/features/studio/CamoxStudio.js +24 -0
  193. package/dist/features/studio/components/Navbar.d.ts +4 -0
  194. package/dist/features/studio/components/Navbar.d.ts.map +1 -0
  195. package/dist/features/studio/components/Navbar.js +95 -0
  196. package/dist/features/studio/components/ProjectMenu.d.ts +2 -0
  197. package/dist/features/studio/components/ProjectMenu.d.ts.map +1 -0
  198. package/dist/features/studio/components/ProjectMenu.js +132 -0
  199. package/dist/features/studio/components/UserButton.d.ts +2 -0
  200. package/dist/features/studio/components/UserButton.d.ts.map +1 -0
  201. package/dist/features/studio/components/UserButton.js +96 -0
  202. package/dist/features/studio/studioStore.d.ts +17 -0
  203. package/dist/features/studio/studioStore.d.ts.map +1 -0
  204. package/dist/features/studio/studioStore.js +44 -0
  205. package/dist/features/studio/useTheme.d.ts +9 -0
  206. package/dist/features/studio/useTheme.d.ts.map +1 -0
  207. package/dist/features/studio/useTheme.js +98 -0
  208. package/dist/features/vite/appGeneration.d.ts +4 -0
  209. package/dist/features/vite/appGeneration.d.ts.map +1 -0
  210. package/dist/features/vite/appGeneration.js +67 -0
  211. package/dist/features/vite/blockBoilerplate.d.ts +3 -0
  212. package/dist/features/vite/blockBoilerplate.d.ts.map +1 -0
  213. package/dist/features/vite/blockBoilerplate.js +59 -0
  214. package/dist/features/vite/convexSync.d.ts +6 -0
  215. package/dist/features/vite/convexSync.d.ts.map +1 -0
  216. package/dist/features/vite/convexSync.js +98 -0
  217. package/dist/features/vite/definitionsSync.d.ts +11 -0
  218. package/dist/features/vite/definitionsSync.d.ts.map +1 -0
  219. package/dist/features/vite/definitionsSync.js +157 -0
  220. package/dist/features/vite/routeGeneration.d.ts +4 -0
  221. package/dist/features/vite/routeGeneration.d.ts.map +1 -0
  222. package/dist/features/vite/routeGeneration.js +194 -0
  223. package/dist/features/vite/skillGeneration.d.ts +4 -0
  224. package/dist/features/vite/skillGeneration.d.ts.map +1 -0
  225. package/dist/features/vite/skillGeneration.js +69 -0
  226. package/dist/features/vite/utils.d.ts +2 -0
  227. package/dist/features/vite/utils.d.ts.map +1 -0
  228. package/dist/features/vite/utils.js +10 -0
  229. package/dist/features/vite/vite.d.ts +18 -0
  230. package/dist/features/vite/vite.d.ts.map +1 -0
  231. package/dist/features/vite/vite.js +77 -0
  232. package/dist/hooks/use-file-upload.d.ts +22 -0
  233. package/dist/hooks/use-file-upload.d.ts.map +1 -0
  234. package/dist/hooks/use-marquee-selection.d.ts +17 -0
  235. package/dist/hooks/use-marquee-selection.d.ts.map +1 -0
  236. package/dist/lib/analytics-client.d.ts +3 -0
  237. package/dist/lib/analytics-client.d.ts.map +1 -0
  238. package/dist/lib/analytics.d.ts +3 -0
  239. package/dist/lib/analytics.d.ts.map +1 -0
  240. package/dist/lib/analytics.js +24 -0
  241. package/dist/lib/auth.d.ts +3683 -0
  242. package/dist/lib/auth.d.ts.map +1 -0
  243. package/dist/lib/convex-site.d.ts +3 -0
  244. package/dist/lib/convex-site.d.ts.map +1 -0
  245. package/dist/lib/utils.d.ts +40 -0
  246. package/dist/lib/utils.d.ts.map +1 -0
  247. package/dist/studio.css +2 -0
  248. package/package.json +123 -10
  249. package/server/api.d.ts +1 -0
  250. package/server/api.js +1 -0
  251. package/server/dataModel.d.ts +1 -0
  252. package/server/dataModel.js +1 -0
  253. package/skills/camox-block/SKILL.md +357 -0
  254. package/skills/camox-layout/SKILL.md +181 -0
  255. package/index.js +0 -3
@@ -0,0 +1,194 @@
1
+ import { writeIfChanged } from "./utils.js";
2
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { relative, resolve } from "node:path";
4
+ //#region src/features/vite/routeGeneration.ts
5
+ var HEADER = `/* ============================================================================
6
+ * AUTO-GENERATED BY CAMOX — DO NOT EDIT
7
+ *
8
+ * This file is managed by the Camox Vite plugin and should stay gitignored.
9
+ * Any manual edits will be automatically reverted by the dev server.
10
+ * ============================================================================ */
11
+
12
+ `;
13
+ function generateCamoxLayout(convexUrl, managementUrl) {
14
+ return HEADER + `import { Outlet, createFileRoute } from "@tanstack/react-router";
15
+ import { CamoxProvider } from "camox/CamoxProvider";
16
+ import { camoxApp } from "@/camox/app";
17
+
18
+ export const Route = createFileRoute("/_camox")({
19
+ component: CamoxPathlessLayout,
20
+ });
21
+
22
+ function CamoxPathlessLayout() {
23
+ return (
24
+ <CamoxProvider camoxApp={camoxApp} convexUrl="${convexUrl}" managementUrl="${managementUrl}">
25
+ <Outlet />
26
+ </CamoxProvider>
27
+ );
28
+ }
29
+ `;
30
+ }
31
+ function generatePageRoute(convexUrl) {
32
+ return HEADER + `import { createFileRoute } from "@tanstack/react-router";
33
+ import {
34
+ createMarkdownMiddleware,
35
+ createPageLoader,
36
+ createPageHead,
37
+ PageRouteComponent,
38
+ } from "camox/_internal/pageRoute";
39
+ import { camoxApp } from "@/camox/app";
40
+
41
+ const markdownMiddleware = createMarkdownMiddleware("${convexUrl}");
42
+ const loader = createPageLoader("${convexUrl}");
43
+ const head = createPageHead(camoxApp);
44
+
45
+ export const Route = createFileRoute("/_camox/$")({
46
+ server: {
47
+ middleware: [markdownMiddleware],
48
+ },
49
+ component: App,
50
+ loader,
51
+ head,
52
+ });
53
+
54
+ function App() {
55
+ const { page } = Route.useLoaderData();
56
+ return <PageRouteComponent page={page} />;
57
+ }
58
+ `;
59
+ }
60
+ function generateOgRoute() {
61
+ return HEADER + `import { createFileRoute } from "@tanstack/react-router";
62
+ import { createOgHandler } from "camox/_internal/ogRoute";
63
+ import { camoxApp } from "@/camox/app";
64
+
65
+ export const Route = createFileRoute("/_camox/og")({
66
+ server: {
67
+ handlers: createOgHandler(camoxApp),
68
+ },
69
+ });
70
+ `;
71
+ }
72
+ function generateCmxRedirect() {
73
+ return HEADER + `import { createFileRoute, redirect } from "@tanstack/react-router";
74
+
75
+ export const Route = createFileRoute("/_camox/cmx")({
76
+ component: RouteComponent,
77
+ loader: () => {
78
+ throw redirect({ to: "/cmx-studio" });
79
+ },
80
+ });
81
+
82
+ function RouteComponent() {
83
+ return null;
84
+ }
85
+ `;
86
+ }
87
+ function generateCmxStudio() {
88
+ return HEADER + `import { Outlet, createFileRoute } from "@tanstack/react-router";
89
+ import { CamoxStudio } from "camox/CamoxStudio";
90
+
91
+ export const Route = createFileRoute("/_camox/cmx-studio")({
92
+ component: RouteComponent,
93
+ notFoundComponent: () => <div>Studio page not found</div>,
94
+ });
95
+
96
+ function RouteComponent() {
97
+ return (
98
+ <CamoxStudio>
99
+ <Outlet />
100
+ </CamoxStudio>
101
+ );
102
+ }
103
+ `;
104
+ }
105
+ function generateCmxStudioCatchAll() {
106
+ return HEADER + `import { Outlet, createFileRoute } from "@tanstack/react-router";
107
+ import { CamoxStudio } from "camox/CamoxStudio";
108
+
109
+ export const Route = createFileRoute("/_camox/cmx-studio/$")({
110
+ component: RouteComponent,
111
+ notFoundComponent: () => <div>Studio page not found</div>,
112
+ });
113
+
114
+ function RouteComponent() {
115
+ return (
116
+ <CamoxStudio>
117
+ <Outlet />
118
+ </CamoxStudio>
119
+ );
120
+ }
121
+ `;
122
+ }
123
+ function generateCmxStudioContent() {
124
+ return HEADER + `import { createFileRoute } from "@tanstack/react-router";
125
+ import { CamoxContent } from "camox/CamoxContent";
126
+
127
+ export const Route = createFileRoute("/_camox/cmx-studio/content")({
128
+ component: RouteComponent,
129
+ });
130
+
131
+ function RouteComponent() {
132
+ return <CamoxContent />;
133
+ }
134
+ `;
135
+ }
136
+ function getRouteFileEntries(routesDir, convexUrl, managementUrl) {
137
+ const camoxDir = resolve(routesDir, "_camox");
138
+ return [
139
+ {
140
+ path: resolve(routesDir, "_camox.tsx"),
141
+ content: generateCamoxLayout(convexUrl, managementUrl)
142
+ },
143
+ {
144
+ path: resolve(camoxDir, "$.tsx"),
145
+ content: generatePageRoute(convexUrl)
146
+ },
147
+ {
148
+ path: resolve(camoxDir, "og.tsx"),
149
+ content: generateOgRoute()
150
+ },
151
+ {
152
+ path: resolve(camoxDir, "cmx.tsx"),
153
+ content: generateCmxRedirect()
154
+ },
155
+ {
156
+ path: resolve(camoxDir, "cmx-studio.tsx"),
157
+ content: generateCmxStudio()
158
+ },
159
+ {
160
+ path: resolve(camoxDir, "cmx-studio.$.tsx"),
161
+ content: generateCmxStudioCatchAll()
162
+ },
163
+ {
164
+ path: resolve(camoxDir, "cmx-studio.content.tsx"),
165
+ content: generateCmxStudioContent()
166
+ }
167
+ ];
168
+ }
169
+ function generateRouteFiles(routesDir, convexUrl, managementUrl) {
170
+ mkdirSync(resolve(routesDir, "_camox"), { recursive: true });
171
+ for (const entry of getRouteFileEntries(routesDir, convexUrl, managementUrl)) writeIfChanged(entry.path, entry.content);
172
+ }
173
+ function watchRouteFiles(server, routesDir, convexUrl, managementUrl) {
174
+ const entries = getRouteFileEntries(routesDir, convexUrl, managementUrl);
175
+ const expectedByPath = new Map(entries.map((e) => [e.path, e.content]));
176
+ server.watcher.on("change", (changedPath) => {
177
+ const expected = expectedByPath.get(changedPath);
178
+ if (!expected) return;
179
+ if (readFileSync(changedPath, "utf-8") !== expected) {
180
+ const rel = relative(server.config.root, changedPath);
181
+ server.config.logger.warn(`Camox route file "${rel}" was modified — reverting to generated version.`, { timestamp: true });
182
+ writeFileSync(changedPath, expected, "utf-8");
183
+ }
184
+ });
185
+ server.watcher.on("unlink", (deletedPath) => {
186
+ const expected = expectedByPath.get(deletedPath);
187
+ if (!expected) return;
188
+ const rel = relative(server.config.root, deletedPath);
189
+ server.config.logger.warn(`Camox route file "${rel}" was deleted — recreating.`, { timestamp: true });
190
+ writeFileSync(deletedPath, expected, "utf-8");
191
+ });
192
+ }
193
+ //#endregion
194
+ export { generateRouteFiles, watchRouteFiles };
@@ -0,0 +1,4 @@
1
+ import { ViteDevServer } from 'vite';
2
+ export declare function generateSkillFiles(appRoot: string): void;
3
+ export declare function watchSkillFiles(server: ViteDevServer, appRoot: string): void;
4
+ //# sourceMappingURL=skillGeneration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillGeneration.d.ts","sourceRoot":"","sources":["../../../src/features/vite/skillGeneration.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AA8B1C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,QAUjD;AA6BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,QA6BrE"}
@@ -0,0 +1,69 @@
1
+ import { writeIfChanged } from "./utils.js";
2
+ import { lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, symlinkSync, writeFileSync } from "node:fs";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ //#region src/features/vite/skillGeneration.ts
6
+ var HEADER = `<!-- AUTO-GENERATED BY CAMOX — DO NOT EDIT
7
+ This file is managed by the Camox Vite plugin.
8
+ Any manual edits will be automatically reverted by the dev server. -->
9
+
10
+ `;
11
+ var sdkRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
12
+ function getSkillNames() {
13
+ const skillsDir = resolve(sdkRoot, "skills");
14
+ return readdirSync(skillsDir).filter((name) => lstatSync(resolve(skillsDir, name)).isDirectory());
15
+ }
16
+ function generateSkillContent(skillName) {
17
+ return HEADER + readFileSync(resolve(sdkRoot, `skills/${skillName}/SKILL.md`), "utf-8");
18
+ }
19
+ function getSkillFileEntries(appRoot) {
20
+ return getSkillNames().map((name) => ({
21
+ path: resolve(appRoot, `.agents/skills/${name}/SKILL.md`),
22
+ content: generateSkillContent(name)
23
+ }));
24
+ }
25
+ function generateSkillFiles(appRoot) {
26
+ for (const name of getSkillNames()) mkdirSync(resolve(appRoot, `.agents/skills/${name}`), { recursive: true });
27
+ for (const entry of getSkillFileEntries(appRoot)) writeIfChanged(entry.path, entry.content);
28
+ ensureClaudeSkillSymlinks(appRoot);
29
+ }
30
+ /**
31
+ * For each skill directory in `.agents/skills/`, ensure a corresponding
32
+ * symlink exists in `.claude/skills/` pointing to it via a relative path.
33
+ */
34
+ function ensureClaudeSkillSymlinks(appRoot) {
35
+ const agentsSkillsDir = resolve(appRoot, ".agents/skills");
36
+ const claudeSkillsDir = resolve(appRoot, ".claude/skills");
37
+ mkdirSync(claudeSkillsDir, { recursive: true });
38
+ for (const name of readdirSync(agentsSkillsDir)) {
39
+ if (!lstatSync(join(agentsSkillsDir, name)).isDirectory()) continue;
40
+ const symlinkPath = join(claudeSkillsDir, name);
41
+ const targetRelative = join("../../.agents/skills", name);
42
+ try {
43
+ if (readlinkSync(symlinkPath) === targetRelative) continue;
44
+ } catch {}
45
+ symlinkSync(targetRelative, symlinkPath);
46
+ }
47
+ }
48
+ function watchSkillFiles(server, appRoot) {
49
+ const entries = getSkillFileEntries(appRoot);
50
+ const expectedByPath = new Map(entries.map((e) => [e.path, e.content]));
51
+ server.watcher.on("change", (changedPath) => {
52
+ const expected = expectedByPath.get(changedPath);
53
+ if (!expected) return;
54
+ if (readFileSync(changedPath, "utf-8") !== expected) {
55
+ const rel = relative(server.config.root, changedPath);
56
+ server.config.logger.warn(`Camox skill file "${rel}" was modified — reverting to generated version.`, { timestamp: true });
57
+ writeFileSync(changedPath, expected, "utf-8");
58
+ }
59
+ });
60
+ server.watcher.on("unlink", (deletedPath) => {
61
+ const expected = expectedByPath.get(deletedPath);
62
+ if (!expected) return;
63
+ const rel = relative(server.config.root, deletedPath);
64
+ server.config.logger.warn(`Camox skill file "${rel}" was deleted — recreating.`, { timestamp: true });
65
+ writeFileSync(deletedPath, expected, "utf-8");
66
+ });
67
+ }
68
+ //#endregion
69
+ export { generateSkillFiles, watchSkillFiles };
@@ -0,0 +1,2 @@
1
+ export declare function writeIfChanged(filePath: string, content: string): void;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/features/vite/utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAM/D"}
@@ -0,0 +1,10 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ //#region src/features/vite/utils.ts
3
+ function writeIfChanged(filePath, content) {
4
+ if (existsSync(filePath)) {
5
+ if (readFileSync(filePath, "utf-8") === content) return;
6
+ }
7
+ writeFileSync(filePath, content, "utf-8");
8
+ }
9
+ //#endregion
10
+ export { writeIfChanged };
@@ -0,0 +1,18 @@
1
+ import { Plugin } from 'vite';
2
+ import { DefinitionsSyncOptions } from './definitionsSync';
3
+ export interface CamoxPluginOptions {
4
+ /** Stable, human-readable slug identifying this project (e.g. "prestigious-impala-84") */
5
+ projectSlug: string;
6
+ /** Disable the generation of boilerplate code when creating a blank file in the blocks directory (default: false) */
7
+ disableBlockBoilerplateGeneration?: boolean;
8
+ /** Disable automatic definitions sync on server start (default: false) */
9
+ disableDefinitionsSync?: boolean;
10
+ /** Options for definitions sync */
11
+ definitionsSync?: DefinitionsSyncOptions;
12
+ /** URL of the Camox management web app, used for authentication redirects */
13
+ managementUrl?: string;
14
+ /** Disable PostHog analytics collection (default: false) */
15
+ disableAnalytics?: boolean;
16
+ }
17
+ export declare function camox(options: CamoxPluginOptions): Plugin;
18
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../../../src/features/vite/vite.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAclD,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAOjF,MAAM,WAAW,kBAAkB;IACjC,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;IACpB,qHAAqH;IACrH,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAC5C,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mCAAmC;IACnC,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA8EzD"}
@@ -0,0 +1,77 @@
1
+ import { generateAppFile, watchAppFile } from "./appGeneration.js";
2
+ import { watchNewBlockFiles } from "./blockBoilerplate.js";
3
+ import { LOCAL_CONVEX_URL, startConvexDev, stopConvexDev } from "./convexSync.js";
4
+ import { syncDefinitions } from "./definitionsSync.js";
5
+ import { generateRouteFiles, watchRouteFiles } from "./routeGeneration.js";
6
+ import { generateSkillFiles, watchSkillFiles } from "./skillGeneration.js";
7
+ import { readFileSync } from "node:fs";
8
+ import { dirname, resolve } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ //#region src/features/vite/vite.ts
11
+ var sdkRoot = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
12
+ var VIRTUAL_STUDIO_CSS = "virtual:camox-studio-css";
13
+ var RESOLVED_VIRTUAL_STUDIO_CSS = "\0" + VIRTUAL_STUDIO_CSS;
14
+ /** Default management backend URL (production Camox web app) */
15
+ var DEFAULT_MANAGEMENT_URL = "https://camox.ai";
16
+ function camox(options) {
17
+ const convexUrl = LOCAL_CONVEX_URL;
18
+ const managementUrl = options.managementUrl ?? DEFAULT_MANAGEMENT_URL;
19
+ let isBuild = false;
20
+ return {
21
+ name: "camox",
22
+ resolveId(id) {
23
+ if (id === VIRTUAL_STUDIO_CSS) return RESOLVED_VIRTUAL_STUDIO_CSS;
24
+ },
25
+ load(id) {
26
+ if (id !== RESOLVED_VIRTUAL_STUDIO_CSS) return;
27
+ const cssPath = resolve(sdkRoot, "dist/studio.css");
28
+ if (isBuild) {
29
+ const css = readFileSync(cssPath, "utf-8");
30
+ return `export default import.meta.ROLLUP_FILE_URL_${this.emitFile({
31
+ type: "asset",
32
+ name: "studio.css",
33
+ source: css
34
+ })};`;
35
+ }
36
+ return `export default "/@fs/${cssPath}";`;
37
+ },
38
+ config(_config, env) {
39
+ isBuild = env.command === "build";
40
+ return { define: {
41
+ ...env.command === "serve" && {
42
+ "import.meta.env.VITE_CONVEX_URL": JSON.stringify(convexUrl),
43
+ "import.meta.env.VITE_CONVEX_SITE_URL": JSON.stringify("http://127.0.0.1:3211")
44
+ },
45
+ __CAMOX_ANALYTICS_DISABLED__: JSON.stringify(!!options.disableAnalytics)
46
+ } };
47
+ },
48
+ configResolved(config) {
49
+ const routesDir = resolve(config.root, "src/routes");
50
+ generateAppFile(config.root);
51
+ generateRouteFiles(routesDir, convexUrl, managementUrl);
52
+ generateSkillFiles(config.root);
53
+ const message = config.command === "serve" ? `Running Camox app (NODE_ENV: ${process.env.NODE_ENV})` : `Building Camox app (NODE_ENV: ${process.env.NODE_ENV})`;
54
+ config.logger.info(message, { timestamp: true });
55
+ },
56
+ configureServer(server) {
57
+ const routesDir = resolve(server.config.root, "src/routes");
58
+ watchAppFile(server, server.config.root);
59
+ watchRouteFiles(server, routesDir, convexUrl, managementUrl);
60
+ watchSkillFiles(server, server.config.root);
61
+ if (!options.disableBlockBoilerplateGeneration) watchNewBlockFiles(server);
62
+ server.httpServer?.once("listening", async () => {
63
+ await startConvexDev(server);
64
+ if (!options.disableDefinitionsSync) syncDefinitions(server, {
65
+ ...options.definitionsSync,
66
+ projectSlug: options.projectSlug,
67
+ convexUrl
68
+ });
69
+ });
70
+ },
71
+ buildEnd() {
72
+ stopConvexDev();
73
+ }
74
+ };
75
+ }
76
+ //#endregion
77
+ export { camox };
@@ -0,0 +1,22 @@
1
+ export interface UploadItem {
2
+ id: string;
3
+ filename: string;
4
+ progress: number;
5
+ status: "uploading" | "committing" | "complete" | "error";
6
+ error?: string;
7
+ }
8
+ interface UseFileUploadOptions {
9
+ onFileCommitted?: (result: {
10
+ fileId: string;
11
+ url: string;
12
+ filename: string;
13
+ mimeType: string;
14
+ }) => void;
15
+ }
16
+ export declare function useFileUpload(options?: UseFileUploadOptions): {
17
+ uploads: UploadItem[];
18
+ uploadFiles: (files: FileList) => void;
19
+ clearAll: () => void;
20
+ };
21
+ export {};
22
+ //# sourceMappingURL=use-file-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-file-upload.d.ts","sourceRoot":"","sources":["../../src/hooks/use-file-upload.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,oBAAoB;IAC5B,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,IAAI,CAAC;CACZ;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;;yBA+EhD,QAAQ;;EAgCnB"}
@@ -0,0 +1,17 @@
1
+ interface Rect {
2
+ left: number;
3
+ top: number;
4
+ width: number;
5
+ height: number;
6
+ }
7
+ export declare function useMarqueeSelection(containerRef: React.RefObject<HTMLElement | null>, onSelectionChange: (ids: Set<string>) => void): {
8
+ selectionRect: Rect | null;
9
+ didDragRef: import('react').RefObject<boolean>;
10
+ handlers: {
11
+ onPointerDown: (e: React.PointerEvent) => void;
12
+ onPointerMove: (e: React.PointerEvent) => void;
13
+ onPointerUp: (e: React.PointerEvent) => void;
14
+ };
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=use-marquee-selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-marquee-selection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-marquee-selection.ts"],"names":[],"mappings":"AAOA,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACjD,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;;;;2BA8DvC,KAAK,CAAC,YAAY;2BAiBlB,KAAK,CAAC,YAAY;yBAyBY,KAAK,CAAC,YAAY;;EAcvD"}
@@ -0,0 +1,3 @@
1
+ /** Client-side tracking for CMS actions. Events route through t.camox.ai reverse proxy. */
2
+ export declare function trackClientEvent(event: string, properties: Record<string, unknown>): void;
3
+ //# sourceMappingURL=analytics-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-client.d.ts","sourceRoot":"","sources":["../../src/lib/analytics-client.ts"],"names":[],"mappings":"AAiCA,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAGlF"}
@@ -0,0 +1,3 @@
1
+ /** Server-side tracking for page views (used in pageRoute.tsx) */
2
+ export declare function trackEvent(event: string, properties: Record<string, unknown>): Promise<void>;
3
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/lib/analytics.ts"],"names":[],"mappings":"AAmBA,kEAAkE;AAClE,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,iBAKlF"}
@@ -0,0 +1,24 @@
1
+ //#region src/lib/analytics.ts
2
+ var POSTHOG_API_KEY = "phc_DV6H1bUHFvtNFfhyiq9skEQMniuyxs3HLx06TajB6Fw";
3
+ var client = null;
4
+ async function getClient() {
5
+ if (__CAMOX_ANALYTICS_DISABLED__) return null;
6
+ if (!client) {
7
+ const { PostHog } = await import("posthog-node");
8
+ client = new PostHog(POSTHOG_API_KEY, { host: "https://us.i.posthog.com" });
9
+ }
10
+ return client;
11
+ }
12
+ /** Server-side tracking for page views (used in pageRoute.tsx) */
13
+ async function trackEvent(event, properties) {
14
+ const posthog = await getClient();
15
+ if (!posthog) return;
16
+ const distinctId = properties.projectId ?? "unknown";
17
+ posthog.capture({
18
+ distinctId,
19
+ event,
20
+ properties
21
+ });
22
+ }
23
+ //#endregion
24
+ export { trackEvent };