@agent-native/core 0.4.0 → 0.4.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 (221) hide show
  1. package/README.md +31 -0
  2. package/dist/adapters/convex/adapter.d.ts +24 -0
  3. package/dist/adapters/convex/adapter.d.ts.map +1 -0
  4. package/dist/adapters/convex/adapter.js +125 -0
  5. package/dist/adapters/convex/adapter.js.map +1 -0
  6. package/dist/adapters/convex/index.d.ts +4 -0
  7. package/dist/adapters/convex/index.d.ts.map +1 -0
  8. package/dist/adapters/convex/index.js +3 -0
  9. package/dist/adapters/convex/index.js.map +1 -0
  10. package/dist/adapters/drizzle/adapter.d.ts +36 -0
  11. package/dist/adapters/drizzle/adapter.d.ts.map +1 -0
  12. package/dist/adapters/drizzle/adapter.js +210 -0
  13. package/dist/adapters/drizzle/adapter.js.map +1 -0
  14. package/dist/adapters/drizzle/index.d.ts +3 -0
  15. package/dist/adapters/drizzle/index.d.ts.map +1 -0
  16. package/dist/adapters/drizzle/index.js +3 -0
  17. package/dist/adapters/drizzle/index.js.map +1 -0
  18. package/dist/adapters/drizzle/schema.d.ts +146 -0
  19. package/dist/adapters/drizzle/schema.d.ts.map +1 -0
  20. package/dist/adapters/drizzle/schema.js +20 -0
  21. package/dist/adapters/drizzle/schema.js.map +1 -0
  22. package/dist/adapters/firestore/adapter.d.ts +3 -2
  23. package/dist/adapters/firestore/adapter.d.ts.map +1 -1
  24. package/dist/adapters/firestore/adapter.js +23 -6
  25. package/dist/adapters/firestore/adapter.js.map +1 -1
  26. package/dist/adapters/supabase/adapter.d.ts +2 -1
  27. package/dist/adapters/supabase/adapter.d.ts.map +1 -1
  28. package/dist/adapters/supabase/adapter.js +4 -1
  29. package/dist/adapters/supabase/adapter.js.map +1 -1
  30. package/dist/adapters/sync/config.d.ts +22 -2
  31. package/dist/adapters/sync/config.d.ts.map +1 -1
  32. package/dist/adapters/sync/config.js +175 -16
  33. package/dist/adapters/sync/config.js.map +1 -1
  34. package/dist/adapters/sync/create-file-sync.d.ts +32 -0
  35. package/dist/adapters/sync/create-file-sync.d.ts.map +1 -0
  36. package/dist/adapters/sync/create-file-sync.js +218 -0
  37. package/dist/adapters/sync/create-file-sync.js.map +1 -0
  38. package/dist/adapters/sync/file-sync.d.ts +40 -6
  39. package/dist/adapters/sync/file-sync.d.ts.map +1 -1
  40. package/dist/adapters/sync/file-sync.js +442 -97
  41. package/dist/adapters/sync/file-sync.js.map +1 -1
  42. package/dist/adapters/sync/index.d.ts +3 -2
  43. package/dist/adapters/sync/index.d.ts.map +1 -1
  44. package/dist/adapters/sync/index.js +3 -1
  45. package/dist/adapters/sync/index.js.map +1 -1
  46. package/dist/adapters/sync/merge.js +3 -2
  47. package/dist/adapters/sync/merge.js.map +1 -1
  48. package/dist/adapters/sync/types.d.ts +36 -2
  49. package/dist/adapters/sync/types.d.ts.map +1 -1
  50. package/dist/adapters/sync/types.js +22 -1
  51. package/dist/adapters/sync/types.js.map +1 -1
  52. package/dist/agent/index.d.ts +3 -0
  53. package/dist/agent/index.d.ts.map +1 -0
  54. package/dist/agent/index.js +2 -0
  55. package/dist/agent/index.js.map +1 -0
  56. package/dist/agent/production-agent.d.ts +16 -0
  57. package/dist/agent/production-agent.d.ts.map +1 -0
  58. package/dist/agent/production-agent.js +152 -0
  59. package/dist/agent/production-agent.js.map +1 -0
  60. package/dist/agent/types.d.ts +38 -0
  61. package/dist/agent/types.d.ts.map +1 -0
  62. package/dist/agent/types.js +2 -0
  63. package/dist/agent/types.js.map +1 -0
  64. package/dist/cli/create.d.ts.map +1 -1
  65. package/dist/cli/create.js +2 -0
  66. package/dist/cli/create.js.map +1 -1
  67. package/dist/cli/index.js +37 -11
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/client/PoweredByBadge.d.ts +14 -0
  70. package/dist/client/PoweredByBadge.d.ts.map +1 -0
  71. package/dist/client/PoweredByBadge.js +60 -0
  72. package/dist/client/PoweredByBadge.js.map +1 -0
  73. package/dist/client/ProductionAgentPanel.d.ts +10 -0
  74. package/dist/client/ProductionAgentPanel.d.ts.map +1 -0
  75. package/dist/client/ProductionAgentPanel.js +121 -0
  76. package/dist/client/ProductionAgentPanel.js.map +1 -0
  77. package/dist/client/Turnstile.d.ts +35 -0
  78. package/dist/client/Turnstile.d.ts.map +1 -0
  79. package/dist/client/Turnstile.js +77 -0
  80. package/dist/client/Turnstile.js.map +1 -0
  81. package/dist/client/index.d.ts +6 -0
  82. package/dist/client/index.d.ts.map +1 -1
  83. package/dist/client/index.js +6 -0
  84. package/dist/client/index.js.map +1 -1
  85. package/dist/client/use-file-sync-status.d.ts +21 -0
  86. package/dist/client/use-file-sync-status.d.ts.map +1 -0
  87. package/dist/client/use-file-sync-status.js +65 -0
  88. package/dist/client/use-file-sync-status.js.map +1 -0
  89. package/dist/client/use-session.d.ts +16 -0
  90. package/dist/client/use-session.d.ts.map +1 -0
  91. package/dist/client/use-session.js +49 -0
  92. package/dist/client/use-session.js.map +1 -0
  93. package/dist/client/useProductionAgent.d.ts +18 -0
  94. package/dist/client/useProductionAgent.d.ts.map +1 -0
  95. package/dist/client/useProductionAgent.js +135 -0
  96. package/dist/client/useProductionAgent.js.map +1 -0
  97. package/dist/db/index.d.ts +21 -0
  98. package/dist/db/index.d.ts.map +1 -0
  99. package/dist/db/index.js +17 -0
  100. package/dist/db/index.js.map +1 -0
  101. package/dist/index.browser.d.ts +1 -1
  102. package/dist/index.browser.d.ts.map +1 -1
  103. package/dist/index.browser.js +1 -1
  104. package/dist/index.browser.js.map +1 -1
  105. package/dist/index.d.ts +3 -2
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +4 -2
  108. package/dist/index.js.map +1 -1
  109. package/dist/router/index.d.ts +3 -0
  110. package/dist/router/index.d.ts.map +1 -0
  111. package/dist/router/index.js +5 -0
  112. package/dist/router/index.js.map +1 -0
  113. package/dist/scripts/core-scripts.d.ts +10 -0
  114. package/dist/scripts/core-scripts.d.ts.map +1 -0
  115. package/dist/scripts/core-scripts.js +15 -0
  116. package/dist/scripts/core-scripts.js.map +1 -0
  117. package/dist/scripts/db/exec.d.ts +11 -0
  118. package/dist/scripts/db/exec.d.ts.map +1 -0
  119. package/dist/scripts/db/exec.js +86 -0
  120. package/dist/scripts/db/exec.js.map +1 -0
  121. package/dist/scripts/db/index.d.ts +2 -0
  122. package/dist/scripts/db/index.d.ts.map +1 -0
  123. package/dist/scripts/db/index.js +6 -0
  124. package/dist/scripts/db/index.js.map +1 -0
  125. package/dist/scripts/db/query.d.ts +10 -0
  126. package/dist/scripts/db/query.d.ts.map +1 -0
  127. package/dist/scripts/db/query.js +96 -0
  128. package/dist/scripts/db/query.js.map +1 -0
  129. package/dist/scripts/db/schema.d.ts +12 -0
  130. package/dist/scripts/db/schema.d.ts.map +1 -0
  131. package/dist/scripts/db/schema.js +112 -0
  132. package/dist/scripts/db/schema.js.map +1 -0
  133. package/dist/scripts/index.d.ts +4 -0
  134. package/dist/scripts/index.d.ts.map +1 -1
  135. package/dist/scripts/index.js +4 -0
  136. package/dist/scripts/index.js.map +1 -1
  137. package/dist/scripts/runner.d.ts +3 -0
  138. package/dist/scripts/runner.d.ts.map +1 -1
  139. package/dist/scripts/runner.js +53 -14
  140. package/dist/scripts/runner.js.map +1 -1
  141. package/dist/server/auth.d.ts +59 -0
  142. package/dist/server/auth.d.ts.map +1 -0
  143. package/dist/server/auth.js +442 -0
  144. package/dist/server/auth.js.map +1 -0
  145. package/dist/server/captcha.d.ts +12 -0
  146. package/dist/server/captcha.d.ts.map +1 -0
  147. package/dist/server/captcha.js +43 -0
  148. package/dist/server/captcha.js.map +1 -0
  149. package/dist/server/create-server.d.ts +13 -10
  150. package/dist/server/create-server.d.ts.map +1 -1
  151. package/dist/server/create-server.js +41 -27
  152. package/dist/server/create-server.js.map +1 -1
  153. package/dist/server/index.d.ts +5 -1
  154. package/dist/server/index.d.ts.map +1 -1
  155. package/dist/server/index.js +6 -1
  156. package/dist/server/index.js.map +1 -1
  157. package/dist/server/missing-key.d.ts +9 -5
  158. package/dist/server/missing-key.d.ts.map +1 -1
  159. package/dist/server/missing-key.js +12 -7
  160. package/dist/server/missing-key.js.map +1 -1
  161. package/dist/server/sse.d.ts +12 -7
  162. package/dist/server/sse.d.ts.map +1 -1
  163. package/dist/server/sse.js +79 -15
  164. package/dist/server/sse.js.map +1 -1
  165. package/dist/vite/client.d.ts +28 -5
  166. package/dist/vite/client.d.ts.map +1 -1
  167. package/dist/vite/client.js +36 -15
  168. package/dist/vite/client.js.map +1 -1
  169. package/dist/vite/dev-api-server.d.ts +10 -0
  170. package/dist/vite/dev-api-server.d.ts.map +1 -0
  171. package/dist/vite/dev-api-server.js +148 -0
  172. package/dist/vite/dev-api-server.js.map +1 -0
  173. package/dist/vite/index.d.ts +2 -3
  174. package/dist/vite/index.d.ts.map +1 -1
  175. package/dist/vite/index.js +2 -3
  176. package/dist/vite/index.js.map +1 -1
  177. package/package.json +26 -17
  178. package/src/templates/default/AGENTS.md +148 -22
  179. package/src/templates/default/_gitignore +9 -5
  180. package/src/templates/default/client/entry.client.tsx +4 -0
  181. package/src/templates/default/client/entry.server.tsx +55 -0
  182. package/src/templates/default/client/root.tsx +82 -0
  183. package/src/templates/default/client/routes/_index.tsx +19 -0
  184. package/src/templates/default/client/routes.ts +4 -0
  185. package/src/templates/default/client/vite-env.d.ts +5 -0
  186. package/src/templates/default/package.json +5 -7
  187. package/src/templates/default/react-router.config.ts +6 -0
  188. package/src/templates/default/server/lib/watcher.ts +21 -0
  189. package/src/templates/default/server/plugins/auth.ts +5 -0
  190. package/src/templates/default/server/plugins/file-sync.ts +39 -0
  191. package/src/templates/default/server/routes/[...page].get.ts +12 -0
  192. package/src/templates/default/server/routes/api/events.get.ts +7 -0
  193. package/src/templates/default/server/routes/api/file-sync/status.get.ts +13 -0
  194. package/src/templates/default/server/routes/api/hello.get.ts +5 -0
  195. package/src/templates/default/tsconfig.json +9 -1
  196. package/src/templates/default/vite.config.ts +4 -1
  197. package/tsconfig.base.json +3 -1
  198. package/dist/adapters/neon/adapter.d.ts +0 -28
  199. package/dist/adapters/neon/adapter.d.ts.map +0 -1
  200. package/dist/adapters/neon/adapter.js +0 -135
  201. package/dist/adapters/neon/adapter.js.map +0 -1
  202. package/dist/adapters/neon/index.d.ts +0 -3
  203. package/dist/adapters/neon/index.d.ts.map +0 -1
  204. package/dist/adapters/neon/index.js +0 -3
  205. package/dist/adapters/neon/index.js.map +0 -1
  206. package/dist/server/production.d.ts +0 -18
  207. package/dist/server/production.d.ts.map +0 -1
  208. package/dist/server/production.js +0 -37
  209. package/dist/server/production.js.map +0 -1
  210. package/dist/vite/express-plugin.d.ts +0 -14
  211. package/dist/vite/express-plugin.d.ts.map +0 -1
  212. package/dist/vite/express-plugin.js +0 -53
  213. package/dist/vite/express-plugin.js.map +0 -1
  214. package/dist/vite/server.d.ts +0 -21
  215. package/dist/vite/server.d.ts.map +0 -1
  216. package/dist/vite/server.js +0 -68
  217. package/dist/vite/server.js.map +0 -1
  218. package/src/templates/default/index.html +0 -14
  219. package/src/templates/default/server/index.ts +0 -22
  220. package/src/templates/default/server/node-build.ts +0 -4
  221. package/src/templates/default/vite.config.server.ts +0 -3
package/dist/cli/index.js CHANGED
@@ -28,6 +28,17 @@ function findTsxBin() {
28
28
  return localTsx;
29
29
  return "tsx";
30
30
  }
31
+ function findReactRouterBin() {
32
+ const localBin = path.resolve("node_modules/.bin/react-router");
33
+ if (fs.existsSync(localBin))
34
+ return localBin;
35
+ return "react-router";
36
+ }
37
+ /** Check if the project uses React Router framework mode (has react-router.config.ts) */
38
+ function isReactRouterFramework() {
39
+ return (fs.existsSync(path.resolve("react-router.config.ts")) ||
40
+ fs.existsSync(path.resolve("react-router.config.js")));
41
+ }
31
42
  function run(cmd, cmdArgs, opts) {
32
43
  const child = spawn(cmd, cmdArgs, {
33
44
  stdio: opts?.stdio ?? "inherit",
@@ -39,27 +50,32 @@ function run(cmd, cmdArgs, opts) {
39
50
  }
40
51
  switch (command) {
41
52
  case "dev": {
42
- // Like `next dev` — runs Vite dev server with express plugin
53
+ // Like `next dev` — runs Vite dev server (Nitro plugin handles API routes)
43
54
  // Supports --base <path> for mounting under a prefix (e.g. agent-native dev --base /app/)
44
55
  const vite = findViteBin();
45
56
  run(vite, args);
46
57
  break;
47
58
  }
48
59
  case "build": {
49
- // Like `next build` — builds client SPA + server bundle
50
- const vite = findViteBin();
51
- console.log("Building client...");
52
- execSync(`${vite} build`, { stdio: "inherit" });
53
- console.log("\nBuilding server...");
54
- execSync(`${vite} build --config vite.config.server.ts`, {
55
- stdio: "inherit",
56
- });
60
+ // Like `next build` — builds client + server
61
+ // React Router framework mode uses `react-router build`
62
+ // Legacy SPA mode uses `vite build`
63
+ if (isReactRouterFramework()) {
64
+ const rr = findReactRouterBin();
65
+ console.log("Building (React Router framework mode)...");
66
+ execSync(`${rr} build`, { stdio: "inherit" });
67
+ }
68
+ else {
69
+ const vite = findViteBin();
70
+ console.log("Building...");
71
+ execSync(`${vite} build`, { stdio: "inherit" });
72
+ }
57
73
  console.log("\nBuild complete.");
58
74
  break;
59
75
  }
60
76
  case "start": {
61
- // Like `next start` — runs production server
62
- const serverEntry = path.resolve("dist/server/production.mjs");
77
+ // Like `next start` — runs Nitro production server
78
+ const serverEntry = path.resolve(".output/server/index.mjs");
63
79
  if (!fs.existsSync(serverEntry)) {
64
80
  console.error('No production build found. Run "agent-native build" first.');
65
81
  process.exit(1);
@@ -80,6 +96,16 @@ switch (command) {
80
96
  }
81
97
  case "typecheck": {
82
98
  // Run TypeScript type checking
99
+ // React Router framework mode generates route types first
100
+ if (isReactRouterFramework()) {
101
+ const rr = findReactRouterBin();
102
+ try {
103
+ execSync(`${rr} typegen`, { stdio: "inherit" });
104
+ }
105
+ catch {
106
+ // typegen may fail if routes aren't set up yet — continue to tsc
107
+ }
108
+ }
83
109
  const tsc = path.resolve("node_modules/.bin/tsc");
84
110
  const tscBin = fs.existsSync(tsc) ? tsc : "tsc";
85
111
  run(tscBin, ["--noEmit", ...args]);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface PoweredByBadgeProps {
2
+ position?: "bottom-right" | "bottom-left";
3
+ }
4
+ /**
5
+ * Small branding badge: "Built with Agent Native"
6
+ *
7
+ * - Fixed position in the corner
8
+ * - Subtle, semi-transparent
9
+ * - Links to https://agent-native.com
10
+ * - Respects prefers-color-scheme
11
+ * - Can be hidden via HIDE_BRANDING=true env var (for white-label)
12
+ */
13
+ export declare function PoweredByBadge({ position, }: PoweredByBadgeProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=PoweredByBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoweredByBadge.d.ts","sourceRoot":"","sources":["../../src/client/PoweredByBadge.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;CAC3C;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAyB,GAC1B,EAAE,mBAAmB,2CAqDrB"}
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ const containerStyle = (position) => ({
3
+ position: "fixed",
4
+ bottom: 16,
5
+ ...(position === "bottom-right" ? { right: 16 } : { left: 16 }),
6
+ zIndex: 50,
7
+ display: "flex",
8
+ alignItems: "center",
9
+ gap: 6,
10
+ padding: "6px 12px",
11
+ borderRadius: 8,
12
+ fontSize: 12,
13
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
14
+ fontWeight: 500,
15
+ lineHeight: 1,
16
+ color: "rgba(150, 150, 150, 0.9)",
17
+ background: "rgba(0, 0, 0, 0.05)",
18
+ backdropFilter: "blur(8px)",
19
+ WebkitBackdropFilter: "blur(8px)",
20
+ border: "1px solid rgba(0, 0, 0, 0.06)",
21
+ textDecoration: "none",
22
+ transition: "opacity 0.2s, color 0.2s",
23
+ opacity: 0.7,
24
+ });
25
+ const darkQuery = "(prefers-color-scheme: dark)";
26
+ /**
27
+ * Small branding badge: "Built with Agent Native"
28
+ *
29
+ * - Fixed position in the corner
30
+ * - Subtle, semi-transparent
31
+ * - Links to https://agent-native.com
32
+ * - Respects prefers-color-scheme
33
+ * - Can be hidden via HIDE_BRANDING=true env var (for white-label)
34
+ */
35
+ export function PoweredByBadge({ position = "bottom-right", }) {
36
+ // Allow hiding via env var
37
+ const hidden = typeof import.meta !== "undefined" &&
38
+ import.meta.env?.VITE_HIDE_BRANDING === "true";
39
+ if (hidden)
40
+ return null;
41
+ return (_jsxs(_Fragment, { children: [_jsx("style", { children: `
42
+ @media ${darkQuery} {
43
+ .an-powered-badge {
44
+ background: rgba(255, 255, 255, 0.06) !important;
45
+ border-color: rgba(255, 255, 255, 0.08) !important;
46
+ color: rgba(180, 180, 180, 0.9) !important;
47
+ }
48
+ }
49
+ .an-powered-badge:hover {
50
+ opacity: 1 !important;
51
+ color: rgba(100, 100, 100, 1) !important;
52
+ }
53
+ @media ${darkQuery} {
54
+ .an-powered-badge:hover {
55
+ color: rgba(220, 220, 220, 1) !important;
56
+ }
57
+ }
58
+ ` }), _jsxs("a", { href: "https://agent-native.com", target: "_blank", rel: "noopener noreferrer", className: "an-powered-badge", style: containerStyle(position), children: [_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M12 2L2 7l10 5 10-5-10-5z" }), _jsx("path", { d: "M2 17l10 5 10-5" }), _jsx("path", { d: "M2 12l10 5 10-5" })] }), "Built with Agent Native"] })] }));
59
+ }
60
+ //# sourceMappingURL=PoweredByBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PoweredByBadge.js","sourceRoot":"","sources":["../../src/client/PoweredByBadge.tsx"],"names":[],"mappings":";AAMA,MAAM,cAAc,GAAG,CACrB,QAAwC,EACzB,EAAE,CAAC,CAAC;IACnB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,EAAE;IACV,GAAG,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC/D,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,UAAU;IACnB,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,EAAE;IACZ,UAAU,EACR,mEAAmE;IACrE,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,0BAA0B;IACjC,UAAU,EAAE,qBAAqB;IACjC,cAAc,EAAE,WAAW;IAC3B,oBAAoB,EAAE,WAAW;IACjC,MAAM,EAAE,+BAA+B;IACvC,cAAc,EAAE,MAAM;IACtB,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,GAAG;CACb,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,8BAA8B,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,GAAG,cAAc,GACL;IACpB,2BAA2B;IAC3B,MAAM,MAAM,GACV,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW;QACjC,MAAM,CAAC,IAAY,CAAC,GAAG,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAE1D,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO,CACL,8BACE,0BAAQ;iBACG,SAAS;;;;;;;;;;;iBAWT,SAAS;;;;;OAKnB,GAAS,EACV,aACE,IAAI,EAAC,0BAA0B,EAC/B,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,aAE/B,eACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,aAEtB,eAAM,CAAC,EAAC,2BAA2B,GAAG,EACtC,eAAM,CAAC,EAAC,iBAAiB,GAAG,EAC5B,eAAM,CAAC,EAAC,iBAAiB,GAAG,IACxB,+BAEJ,IACH,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ export interface ProductionAgentPanelProps {
3
+ children: React.ReactNode;
4
+ }
5
+ /**
6
+ * Wraps app content with a mobile-style bottom tab bar (Mail / Agent).
7
+ * In development (`!import.meta.env.PROD`), renders children unchanged.
8
+ */
9
+ export declare function ProductionAgentPanel({ children }: ProductionAgentPanelProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=ProductionAgentPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductionAgentPanel.d.ts","sourceRoot":"","sources":["../../src/client/ProductionAgentPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAkYxE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE,yBAAyB,2CAqD3E"}
@@ -0,0 +1,121 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useCallback } from "react";
3
+ import { useProductionAgent } from "./useProductionAgent.js";
4
+ import { cn } from "./utils.js";
5
+ // Only show the agent panel in production builds
6
+ // Vite replaces import.meta.env.PROD at build time; in SSR/Node contexts it defaults to false
7
+ const IS_PROD = typeof import.meta !== "undefined" &&
8
+ typeof import.meta.env !== "undefined" &&
9
+ import.meta.env.PROD === true;
10
+ // ─── Icons ─────────────────────────────────────────────────────────────────
11
+ function MailIcon({ className }) {
12
+ return (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("rect", { x: "2", y: "4", width: "20", height: "16", rx: "2" }), _jsx("path", { d: "m2 7 10 7 10-7" })] }));
13
+ }
14
+ function AgentIcon({ className }) {
15
+ return (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("path", { d: "M12 2a6 6 0 0 1 6 6v2a6 6 0 0 1-12 0V8a6 6 0 0 1 6-6z" }), _jsx("path", { d: "M9 22v-2a3 3 0 0 1 6 0v2" }), _jsx("path", { d: "M2 18a10 10 0 0 1 20 0" })] }));
16
+ }
17
+ function SendIcon({ className }) {
18
+ return (_jsxs("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: [_jsx("path", { d: "m22 2-7 20-4-9-9-4 20-7z" }), _jsx("path", { d: "M22 2 11 13" })] }));
19
+ }
20
+ function TrashIcon({ className }) {
21
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", className: className, children: _jsx("path", { d: "M3 6h18M8 6V4h8v2M19 6l-1 14H6L5 6" }) }));
22
+ }
23
+ // ─── Tool call display ──────────────────────────────────────────────────────
24
+ function ToolCallBubble({ tool, input, result, }) {
25
+ const args = Object.entries(input)
26
+ .map(([k, v]) => `${k}=${v}`)
27
+ .join(", ");
28
+ const pending = result === undefined;
29
+ return (_jsxs("div", { className: cn("flex items-start gap-2 rounded-lg px-3 py-2 text-[12px] font-mono", pending
30
+ ? "bg-amber-500/10 text-amber-400/80"
31
+ : "bg-white/5 text-white/40"), children: [_jsx("span", { className: "shrink-0 mt-0.5", children: pending ? (_jsx("svg", { className: "h-3 w-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: _jsx("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "3", strokeDasharray: "31 62" }) })) : (_jsx("svg", { className: "h-3 w-3", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { d: "M20 7 9 18l-5-5", strokeLinecap: "round", strokeLinejoin: "round" }) })) }), _jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "text-white/60", children: tool }), args && _jsxs("span", { className: "text-white/30 ml-1", children: ["(", args, ")"] })] })] }));
32
+ }
33
+ // ─── Message bubble ─────────────────────────────────────────────────────────
34
+ function MessageBubble({ msg }) {
35
+ const isUser = msg.role === "user";
36
+ return (_jsxs("div", { className: cn("flex flex-col gap-1", isUser ? "items-end" : "items-start"), children: [!isUser && msg.toolCalls && msg.toolCalls.length > 0 && (_jsx("div", { className: "flex flex-col gap-1 w-full max-w-[85%]", children: msg.toolCalls.map((tc, i) => (_jsx(ToolCallBubble, { tool: tc.tool, input: tc.input, result: tc.result }, i))) })), msg.content && (_jsx("div", { className: cn("max-w-[85%] rounded-2xl px-3.5 py-2.5 text-[14px] leading-relaxed whitespace-pre-wrap break-words", isUser
37
+ ? "bg-white text-black rounded-br-sm"
38
+ : "bg-white/10 text-white/90 rounded-bl-sm"), children: msg.content }))] }));
39
+ }
40
+ // ─── Thinking indicator ─────────────────────────────────────────────────────
41
+ function ThinkingIndicator() {
42
+ return (_jsx("div", { className: "flex items-start", children: _jsx("div", { className: "rounded-2xl rounded-bl-sm bg-white/10 px-4 py-3", children: _jsx("div", { className: "flex gap-1", children: [0, 1, 2].map((i) => (_jsx("span", { className: "h-1.5 w-1.5 rounded-full bg-white/40 animate-bounce", style: { animationDelay: `${i * 0.15}s` } }, i))) }) }) }));
43
+ }
44
+ function AgentChatView({ messages, isGenerating, sendMessage, clearHistory, }) {
45
+ const [input, setInput] = useState("");
46
+ const scrollRef = useRef(null);
47
+ const inputRef = useRef(null);
48
+ // Auto-scroll on new messages
49
+ useEffect(() => {
50
+ const el = scrollRef.current;
51
+ if (el)
52
+ el.scrollTop = el.scrollHeight;
53
+ }, [messages, isGenerating]);
54
+ const handleSend = useCallback(() => {
55
+ const text = input.trim();
56
+ if (!text || isGenerating)
57
+ return;
58
+ setInput("");
59
+ sendMessage(text);
60
+ }, [input, isGenerating, sendMessage]);
61
+ const handleKeyDown = useCallback((e) => {
62
+ if (e.key === "Enter" && !e.shiftKey) {
63
+ e.preventDefault();
64
+ handleSend();
65
+ }
66
+ }, [handleSend]);
67
+ // Auto-resize textarea
68
+ useEffect(() => {
69
+ const el = inputRef.current;
70
+ if (!el)
71
+ return;
72
+ el.style.height = "auto";
73
+ el.style.height = `${Math.min(el.scrollHeight, 120)}px`;
74
+ }, [input]);
75
+ return (_jsxs("div", { className: "flex flex-1 flex-col overflow-hidden bg-black", children: [_jsxs("div", { className: "flex h-11 shrink-0 items-center justify-between border-b border-white/8 px-4", children: [_jsx("span", { className: "text-[13px] font-medium text-white/60", children: "Agent" }), messages.length > 0 && (_jsxs("button", { onClick: clearHistory, className: "flex items-center gap-1.5 rounded-md px-2 py-1 text-[12px] text-white/30 hover:text-white/60 hover:bg-white/5 transition-colors", title: "Clear conversation", children: [_jsx(TrashIcon, { className: "h-3.5 w-3.5" }), "Clear"] }))] }), _jsxs("div", { ref: scrollRef, className: "flex flex-1 flex-col gap-3 overflow-y-auto px-4 py-4", children: [messages.length === 0 && (_jsxs("div", { className: "flex flex-1 flex-col items-center justify-center gap-3 py-12", children: [_jsx("div", { className: "h-10 w-10 rounded-full bg-white/5 flex items-center justify-center", children: _jsx(AgentIcon, { className: "h-5 w-5 text-white/30" }) }), _jsx("p", { className: "text-[13px] text-white/30 text-center max-w-[200px]", children: "Ask me anything about your emails" }), _jsx("div", { className: "flex flex-col gap-1.5 w-full max-w-[260px]", children: [
76
+ "What's in my inbox?",
77
+ "Summarize my unread emails",
78
+ "Archive emails from last week",
79
+ ].map((suggestion) => (_jsx("button", { onClick: () => sendMessage(suggestion), className: "w-full rounded-xl border border-white/8 px-3 py-2 text-left text-[12.5px] text-white/40 hover:bg-white/5 hover:text-white/60 transition-colors", children: suggestion }, suggestion))) })] })), messages.map((msg) => (_jsx(MessageBubble, { msg: msg }, msg.id))), isGenerating &&
80
+ messages[messages.length - 1]?.role !== "assistant" && (_jsx(ThinkingIndicator, {}))] }), _jsx("div", { className: "shrink-0 border-t border-white/8 px-3 py-3", children: _jsxs("div", { className: "flex items-end gap-2 rounded-2xl border border-white/10 bg-white/5 px-3 py-2", children: [_jsx("textarea", { ref: inputRef, value: input, onChange: (e) => setInput(e.target.value), onKeyDown: handleKeyDown, placeholder: "Message agent...", rows: 1, className: "flex-1 resize-none bg-transparent text-[14px] text-white placeholder:text-white/25 outline-none leading-relaxed min-h-[24px]", style: { maxHeight: 120 } }), _jsx("button", { onClick: handleSend, disabled: !input.trim() || isGenerating, className: cn("shrink-0 flex h-7 w-7 items-center justify-center rounded-full transition-all", input.trim() && !isGenerating
81
+ ? "bg-white text-black"
82
+ : "bg-white/10 text-white/20"), children: _jsx(SendIcon, { className: "h-3.5 w-3.5" }) })] }) })] }));
83
+ }
84
+ // ─── Bottom tab bar ─────────────────────────────────────────────────────────
85
+ function BottomTabBar({ activeTab, onChange, hasUnread, }) {
86
+ return (_jsxs("div", { className: "flex h-14 shrink-0 items-stretch border-t border-border/50 bg-card", children: [_jsxs("button", { onClick: () => onChange("mail"), className: cn("flex flex-1 flex-col items-center justify-center gap-0.5 transition-colors", activeTab === "mail"
87
+ ? "text-foreground"
88
+ : "text-muted-foreground/50 hover:text-muted-foreground"), children: [_jsx(MailIcon, { className: "h-5 w-5" }), _jsx("span", { className: "text-[10px] font-medium tracking-wide", children: "Mail" })] }), _jsxs("button", { onClick: () => onChange("agent"), className: cn("relative flex flex-1 flex-col items-center justify-center gap-0.5 transition-colors", activeTab === "agent"
89
+ ? "text-foreground"
90
+ : "text-muted-foreground/50 hover:text-muted-foreground"), children: [_jsx(AgentIcon, { className: "h-5 w-5" }), _jsx("span", { className: "text-[10px] font-medium tracking-wide", children: "Agent" }), hasUnread && activeTab !== "agent" && (_jsx("span", { className: "absolute top-2 right-[calc(50%-10px)] h-1.5 w-1.5 rounded-full bg-blue-400" }))] })] }));
91
+ }
92
+ /**
93
+ * Wraps app content with a mobile-style bottom tab bar (Mail / Agent).
94
+ * In development (`!import.meta.env.PROD`), renders children unchanged.
95
+ */
96
+ export function ProductionAgentPanel({ children }) {
97
+ const [activeTab, setActiveTab] = useState("mail");
98
+ const [hasAgentActivity, setHasAgentActivity] = useState(false);
99
+ // Hoist agent state here so it survives tab switches
100
+ const agent = useProductionAgent();
101
+ useEffect(() => {
102
+ if (!IS_PROD)
103
+ return;
104
+ const handler = (e) => {
105
+ const detail = e.detail;
106
+ if (detail?.running)
107
+ setHasAgentActivity(true);
108
+ };
109
+ window.addEventListener("builder.fusion.chatRunning", handler);
110
+ return () => window.removeEventListener("builder.fusion.chatRunning", handler);
111
+ }, []);
112
+ if (!IS_PROD) {
113
+ return _jsx(_Fragment, { children: children });
114
+ }
115
+ return (_jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsx("div", { className: cn("flex flex-1 overflow-hidden", activeTab !== "mail" && "hidden"), children: children }), _jsx("div", { className: cn("flex flex-1 overflow-hidden flex-col", activeTab !== "agent" && "hidden"), children: _jsx(AgentChatView, { ...agent }) }), _jsx(BottomTabBar, { activeTab: activeTab, onChange: (tab) => {
116
+ setActiveTab(tab);
117
+ if (tab === "agent")
118
+ setHasAgentActivity(false);
119
+ }, hasUnread: hasAgentActivity })] }));
120
+ }
121
+ //# sourceMappingURL=ProductionAgentPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductionAgentPanel.js","sourceRoot":"","sources":["../../src/client/ProductionAgentPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface TurnstileProps {
2
+ /** Turnstile site key. Falls back to VITE_TURNSTILE_SITE_KEY env var. */
3
+ siteKey?: string;
4
+ /** Called with the verification token when Turnstile completes. */
5
+ onVerify: (token: string) => void;
6
+ /** Called when the token expires. */
7
+ onExpire?: () => void;
8
+ /**
9
+ * Turnstile appearance mode:
10
+ * - "managed" (default): invisible unless a challenge is needed
11
+ * - "invisible": fully invisible, never shows UI
12
+ */
13
+ mode?: "managed" | "invisible";
14
+ /** Additional className for the container div. */
15
+ className?: string;
16
+ }
17
+ declare global {
18
+ interface Window {
19
+ turnstile?: {
20
+ render: (container: HTMLElement, options: Record<string, unknown>) => string;
21
+ reset: (widgetId: string) => void;
22
+ remove: (widgetId: string) => void;
23
+ };
24
+ __turnstileOnLoad?: () => void;
25
+ }
26
+ }
27
+ /**
28
+ * Cloudflare Turnstile captcha widget.
29
+ *
30
+ * Renders nothing if no site key is available (graceful opt-in).
31
+ * In "managed" mode (default), the widget is invisible unless
32
+ * Turnstile determines a challenge is needed.
33
+ */
34
+ export declare function Turnstile({ siteKey, onVerify, onExpire, mode, className, }: TurnstileProps): import("react/jsx-runtime").JSX.Element;
35
+ //# sourceMappingURL=Turnstile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Turnstile.d.ts","sourceRoot":"","sources":["../../src/client/Turnstile.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,SAAS,CAAC,EAAE;YACV,MAAM,EAAE,CACN,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,MAAM,CAAC;YACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;YAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;SACpC,CAAC;QACF,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;KAChC;CACF;AA4BD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,IAAgB,EAChB,SAAS,GACV,EAAE,cAAc,2CAqDhB"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useCallback, useState } from "react";
3
+ const SCRIPT_ID = "cf-turnstile-script";
4
+ const SCRIPT_SRC = "https://challenges.cloudflare.com/turnstile/v0/api.js?onload=__turnstileOnLoad";
5
+ let scriptLoadPromise = null;
6
+ function loadTurnstileScript() {
7
+ if (scriptLoadPromise)
8
+ return scriptLoadPromise;
9
+ if (window.turnstile)
10
+ return Promise.resolve();
11
+ scriptLoadPromise = new Promise((resolve) => {
12
+ window.__turnstileOnLoad = () => {
13
+ resolve();
14
+ delete window.__turnstileOnLoad;
15
+ };
16
+ const script = document.createElement("script");
17
+ script.id = SCRIPT_ID;
18
+ script.src = SCRIPT_SRC;
19
+ script.async = true;
20
+ script.defer = true;
21
+ document.head.appendChild(script);
22
+ });
23
+ return scriptLoadPromise;
24
+ }
25
+ /**
26
+ * Cloudflare Turnstile captcha widget.
27
+ *
28
+ * Renders nothing if no site key is available (graceful opt-in).
29
+ * In "managed" mode (default), the widget is invisible unless
30
+ * Turnstile determines a challenge is needed.
31
+ */
32
+ export function Turnstile({ siteKey, onVerify, onExpire, mode = "managed", className, }) {
33
+ const resolvedKey = siteKey ||
34
+ (typeof import.meta !== "undefined"
35
+ ? import.meta.env?.VITE_TURNSTILE_SITE_KEY
36
+ : undefined);
37
+ const containerRef = useRef(null);
38
+ const widgetIdRef = useRef(null);
39
+ const [ready, setReady] = useState(false);
40
+ const onVerifyRef = useRef(onVerify);
41
+ onVerifyRef.current = onVerify;
42
+ const onExpireRef = useRef(onExpire);
43
+ onExpireRef.current = onExpire;
44
+ useEffect(() => {
45
+ if (!resolvedKey)
46
+ return;
47
+ loadTurnstileScript().then(() => setReady(true));
48
+ }, [resolvedKey]);
49
+ const renderWidget = useCallback(() => {
50
+ if (!ready ||
51
+ !resolvedKey ||
52
+ !containerRef.current ||
53
+ !window.turnstile ||
54
+ widgetIdRef.current)
55
+ return;
56
+ widgetIdRef.current = window.turnstile.render(containerRef.current, {
57
+ sitekey: resolvedKey,
58
+ appearance: mode === "invisible" ? "interaction-only" : "managed",
59
+ callback: (token) => onVerifyRef.current(token),
60
+ "expired-callback": () => onExpireRef.current?.(),
61
+ });
62
+ }, [ready, resolvedKey, mode]);
63
+ useEffect(() => {
64
+ renderWidget();
65
+ return () => {
66
+ if (widgetIdRef.current && window.turnstile) {
67
+ window.turnstile.remove(widgetIdRef.current);
68
+ widgetIdRef.current = null;
69
+ }
70
+ };
71
+ }, [renderWidget]);
72
+ // Render nothing if no site key — captcha is opt-in
73
+ if (!resolvedKey)
74
+ return null;
75
+ return _jsx("div", { ref: containerRef, className: className });
76
+ }
77
+ //# sourceMappingURL=Turnstile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Turnstile.js","sourceRoot":"","sources":["../../src/client/Turnstile.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAiCjE,MAAM,SAAS,GAAG,qBAAqB,CAAC;AACxC,MAAM,UAAU,GACd,gFAAgF,CAAC;AAEnF,IAAI,iBAAiB,GAAyB,IAAI,CAAC;AAEnD,SAAS,mBAAmB;IAC1B,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAChD,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAE/C,iBAAiB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChD,MAAM,CAAC,iBAAiB,GAAG,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,iBAAiB,CAAC;QAClC,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,UAAU,CAAC;QACxB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,EACxB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,IAAI,GAAG,SAAS,EAChB,SAAS,GACM;IACf,MAAM,WAAW,GACf,OAAO;QACP,CAAC,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW;YACjC,CAAC,CAAE,MAAM,CAAC,IAAY,CAAC,GAAG,EAAE,uBAAuB;YACnD,CAAC,CAAC,SAAS,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,WAAW;YAAE,OAAO;QACzB,mBAAmB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IACE,CAAC,KAAK;YACN,CAAC,WAAW;YACZ,CAAC,YAAY,CAAC,OAAO;YACrB,CAAC,MAAM,CAAC,SAAS;YACjB,WAAW,CAAC,OAAO;YAEnB,OAAO;QAET,WAAW,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;YAClE,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;YACjE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;YACvD,kBAAkB,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE;SAClD,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,EAAE,CAAC;QACf,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC5C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC7C,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,oDAAoD;IACpD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,OAAO,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,GAAI,CAAC;AAC1D,CAAC"}
@@ -1,7 +1,13 @@
1
1
  export { sendToAgentChat, type AgentChatMessage } from "./agent-chat.js";
2
2
  export { useAgentChatGenerating } from "./use-agent-chat.js";
3
3
  export { useFileWatcher } from "./use-file-watcher.js";
4
+ export { useFileSyncStatus } from "./use-file-sync-status.js";
4
5
  export { cn } from "./utils.js";
5
6
  export { ApiKeySettings } from "./components/ApiKeySettings.js";
7
+ export { useSession, type AuthSession } from "./use-session.js";
6
8
  export { sendToHarness, onHarnessMessage, requestUserInfo, getHarnessOrigin, getCallbackOrigin, enterStyleEditing, enterTextEditing, exitSelectionMode, type UserInfo, } from "./harness.js";
9
+ export { useProductionAgent, type ProductionAgentMessage, type UseProductionAgentResult, } from "./useProductionAgent.js";
10
+ export { ProductionAgentPanel, type ProductionAgentPanelProps, } from "./ProductionAgentPanel.js";
11
+ export { Turnstile, type TurnstileProps } from "./Turnstile.js";
12
+ export { PoweredByBadge, type PoweredByBadgeProps } from "./PoweredByBadge.js";
7
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,QAAQ,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,GAC/B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,7 +1,13 @@
1
1
  export { sendToAgentChat } from "./agent-chat.js";
2
2
  export { useAgentChatGenerating } from "./use-agent-chat.js";
3
3
  export { useFileWatcher } from "./use-file-watcher.js";
4
+ export { useFileSyncStatus } from "./use-file-sync-status.js";
4
5
  export { cn } from "./utils.js";
5
6
  export { ApiKeySettings } from "./components/ApiKeySettings.js";
7
+ export { useSession } from "./use-session.js";
6
8
  export { sendToHarness, onHarnessMessage, requestUserInfo, getHarnessOrigin, getCallbackOrigin, enterStyleEditing, enterTextEditing, exitSelectionMode, } from "./harness.js";
9
+ export { useProductionAgent, } from "./useProductionAgent.js";
10
+ export { ProductionAgentPanel, } from "./ProductionAgentPanel.js";
11
+ export { Turnstile } from "./Turnstile.js";
12
+ export { PoweredByBadge } from "./PoweredByBadge.js";
7
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,kBAAkB,GAGnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,cAAc,EAA4B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,21 @@
1
+ interface FileSyncStatus {
2
+ enabled: boolean;
3
+ connected: boolean;
4
+ conflicts: string[];
5
+ lastSyncedAt: number | null;
6
+ }
7
+ interface FileSyncEvent {
8
+ source: "sync";
9
+ type: string;
10
+ path: string;
11
+ }
12
+ /**
13
+ * React hook for tracking file sync status via SSE events.
14
+ * Fetches initial state from GET /api/file-sync/status on mount,
15
+ * then accumulates updates from SSE sync events.
16
+ */
17
+ export declare function useFileSyncStatus(options?: {
18
+ onEvent?: (event: FileSyncEvent) => void;
19
+ }): FileSyncStatus;
20
+ export {};
21
+ //# sourceMappingURL=use-file-sync-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-file-sync-status.d.ts","sourceRoot":"","sources":["../../src/client/use-file-sync-status.ts"],"names":[],"mappings":"AAEA,UAAU,cAAc;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C,GAAG,cAAc,CA4DjB"}
@@ -0,0 +1,65 @@
1
+ import { useState, useEffect, useRef } from "react";
2
+ /**
3
+ * React hook for tracking file sync status via SSE events.
4
+ * Fetches initial state from GET /api/file-sync/status on mount,
5
+ * then accumulates updates from SSE sync events.
6
+ */
7
+ export function useFileSyncStatus(options) {
8
+ const [status, setStatus] = useState({
9
+ enabled: false,
10
+ connected: false,
11
+ conflicts: [],
12
+ lastSyncedAt: null,
13
+ });
14
+ const onEventRef = useRef(options?.onEvent);
15
+ onEventRef.current = options?.onEvent;
16
+ // Fetch initial state on mount
17
+ useEffect(() => {
18
+ let cancelled = false;
19
+ fetch("/api/file-sync/status")
20
+ .then((r) => r.json())
21
+ .then((data) => {
22
+ if (!cancelled) {
23
+ setStatus((prev) => ({
24
+ ...prev,
25
+ enabled: data.enabled,
26
+ connected: data.connected ?? data.enabled,
27
+ }));
28
+ }
29
+ })
30
+ .catch(() => { });
31
+ return () => {
32
+ cancelled = true;
33
+ };
34
+ }, []);
35
+ // Subscribe to SSE sync events
36
+ useEffect(() => {
37
+ const es = new EventSource("/api/events");
38
+ const handler = (event) => {
39
+ try {
40
+ const data = JSON.parse(event.data);
41
+ if (data.source === "sync") {
42
+ setStatus((prev) => ({
43
+ ...prev,
44
+ lastSyncedAt: Date.now(),
45
+ conflicts: data.type === "conflict" || data.type === "conflict-saved"
46
+ ? [...new Set([...prev.conflicts, data.path])]
47
+ : data.type === "conflict-resolved"
48
+ ? prev.conflicts.filter((p) => p !== data.path)
49
+ : prev.conflicts,
50
+ }));
51
+ onEventRef.current?.(data);
52
+ }
53
+ }
54
+ catch {
55
+ /* malformed SSE data */
56
+ }
57
+ };
58
+ es.addEventListener("message", handler);
59
+ return () => {
60
+ es.close();
61
+ };
62
+ }, []);
63
+ return status;
64
+ }
65
+ //# sourceMappingURL=use-file-sync-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-file-sync-status.js","sourceRoot":"","sources":["../../src/client/use-file-sync-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAepD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAEjC;IACC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiB;QACnD,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;IAEtC,+BAA+B;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,uBAAuB,CAAC;aAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACrB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnB,GAAG,IAAI;oBACP,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO;iBAC1C,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,+BAA+B;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC3B,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBACnB,GAAG,IAAI;wBACP,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;wBACxB,SAAS,EACP,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;4BACxD,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;4BAC9C,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,mBAAmB;gCACjC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC;gCACvD,CAAC,CAAC,IAAI,CAAC,SAAS;qBACvB,CAAC,CAAC,CAAC;oBACJ,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACV,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC"}