@agent-native/core 0.4.1 → 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.
- package/README.md +31 -0
- package/dist/adapters/convex/adapter.d.ts +24 -0
- package/dist/adapters/convex/adapter.d.ts.map +1 -0
- package/dist/adapters/convex/adapter.js +125 -0
- package/dist/adapters/convex/adapter.js.map +1 -0
- package/dist/adapters/convex/index.d.ts +4 -0
- package/dist/adapters/convex/index.d.ts.map +1 -0
- package/dist/adapters/convex/index.js +3 -0
- package/dist/adapters/convex/index.js.map +1 -0
- package/dist/adapters/drizzle/adapter.d.ts +36 -0
- package/dist/adapters/drizzle/adapter.d.ts.map +1 -0
- package/dist/adapters/drizzle/adapter.js +210 -0
- package/dist/adapters/drizzle/adapter.js.map +1 -0
- package/dist/adapters/drizzle/index.d.ts +3 -0
- package/dist/adapters/drizzle/index.d.ts.map +1 -0
- package/dist/adapters/drizzle/index.js +3 -0
- package/dist/adapters/drizzle/index.js.map +1 -0
- package/dist/adapters/drizzle/schema.d.ts +146 -0
- package/dist/adapters/drizzle/schema.d.ts.map +1 -0
- package/dist/adapters/drizzle/schema.js +20 -0
- package/dist/adapters/drizzle/schema.js.map +1 -0
- package/dist/adapters/firestore/adapter.d.ts +3 -2
- package/dist/adapters/firestore/adapter.d.ts.map +1 -1
- package/dist/adapters/firestore/adapter.js +23 -6
- package/dist/adapters/firestore/adapter.js.map +1 -1
- package/dist/adapters/supabase/adapter.d.ts +2 -1
- package/dist/adapters/supabase/adapter.d.ts.map +1 -1
- package/dist/adapters/supabase/adapter.js +4 -1
- package/dist/adapters/supabase/adapter.js.map +1 -1
- package/dist/adapters/sync/config.d.ts +22 -2
- package/dist/adapters/sync/config.d.ts.map +1 -1
- package/dist/adapters/sync/config.js +175 -16
- package/dist/adapters/sync/config.js.map +1 -1
- package/dist/adapters/sync/create-file-sync.d.ts +32 -0
- package/dist/adapters/sync/create-file-sync.d.ts.map +1 -0
- package/dist/adapters/sync/create-file-sync.js +218 -0
- package/dist/adapters/sync/create-file-sync.js.map +1 -0
- package/dist/adapters/sync/file-sync.d.ts +40 -6
- package/dist/adapters/sync/file-sync.d.ts.map +1 -1
- package/dist/adapters/sync/file-sync.js +442 -97
- package/dist/adapters/sync/file-sync.js.map +1 -1
- package/dist/adapters/sync/index.d.ts +3 -2
- package/dist/adapters/sync/index.d.ts.map +1 -1
- package/dist/adapters/sync/index.js +3 -1
- package/dist/adapters/sync/index.js.map +1 -1
- package/dist/adapters/sync/merge.js +3 -2
- package/dist/adapters/sync/merge.js.map +1 -1
- package/dist/adapters/sync/types.d.ts +36 -2
- package/dist/adapters/sync/types.d.ts.map +1 -1
- package/dist/adapters/sync/types.js +22 -1
- package/dist/adapters/sync/types.js.map +1 -1
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/production-agent.d.ts +16 -0
- package/dist/agent/production-agent.d.ts.map +1 -0
- package/dist/agent/production-agent.js +152 -0
- package/dist/agent/production-agent.js.map +1 -0
- package/dist/agent/types.d.ts +38 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +2 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +37 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/client/PoweredByBadge.d.ts +14 -0
- package/dist/client/PoweredByBadge.d.ts.map +1 -0
- package/dist/client/PoweredByBadge.js +60 -0
- package/dist/client/PoweredByBadge.js.map +1 -0
- package/dist/client/ProductionAgentPanel.d.ts +10 -0
- package/dist/client/ProductionAgentPanel.d.ts.map +1 -0
- package/dist/client/ProductionAgentPanel.js +121 -0
- package/dist/client/ProductionAgentPanel.js.map +1 -0
- package/dist/client/Turnstile.d.ts +35 -0
- package/dist/client/Turnstile.d.ts.map +1 -0
- package/dist/client/Turnstile.js +77 -0
- package/dist/client/Turnstile.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/use-file-sync-status.d.ts +21 -0
- package/dist/client/use-file-sync-status.d.ts.map +1 -0
- package/dist/client/use-file-sync-status.js +65 -0
- package/dist/client/use-file-sync-status.js.map +1 -0
- package/dist/client/use-session.d.ts +16 -0
- package/dist/client/use-session.d.ts.map +1 -0
- package/dist/client/use-session.js +49 -0
- package/dist/client/use-session.js.map +1 -0
- package/dist/client/useProductionAgent.d.ts +18 -0
- package/dist/client/useProductionAgent.d.ts.map +1 -0
- package/dist/client/useProductionAgent.js +135 -0
- package/dist/client/useProductionAgent.js.map +1 -0
- package/dist/db/index.d.ts +21 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +17 -0
- package/dist/db/index.js.map +1 -0
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +5 -0
- package/dist/router/index.js.map +1 -0
- package/dist/scripts/core-scripts.d.ts +10 -0
- package/dist/scripts/core-scripts.d.ts.map +1 -0
- package/dist/scripts/core-scripts.js +15 -0
- package/dist/scripts/core-scripts.js.map +1 -0
- package/dist/scripts/db/exec.d.ts +11 -0
- package/dist/scripts/db/exec.d.ts.map +1 -0
- package/dist/scripts/db/exec.js +86 -0
- package/dist/scripts/db/exec.js.map +1 -0
- package/dist/scripts/db/index.d.ts +2 -0
- package/dist/scripts/db/index.d.ts.map +1 -0
- package/dist/scripts/db/index.js +6 -0
- package/dist/scripts/db/index.js.map +1 -0
- package/dist/scripts/db/query.d.ts +10 -0
- package/dist/scripts/db/query.d.ts.map +1 -0
- package/dist/scripts/db/query.js +96 -0
- package/dist/scripts/db/query.js.map +1 -0
- package/dist/scripts/db/schema.d.ts +12 -0
- package/dist/scripts/db/schema.d.ts.map +1 -0
- package/dist/scripts/db/schema.js +112 -0
- package/dist/scripts/db/schema.js.map +1 -0
- package/dist/scripts/index.d.ts +4 -0
- package/dist/scripts/index.d.ts.map +1 -1
- package/dist/scripts/index.js +4 -0
- package/dist/scripts/index.js.map +1 -1
- package/dist/scripts/runner.d.ts +3 -0
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +53 -14
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/auth.d.ts +59 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +442 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/captcha.d.ts +12 -0
- package/dist/server/captcha.d.ts.map +1 -0
- package/dist/server/captcha.js +43 -0
- package/dist/server/captcha.js.map +1 -0
- package/dist/server/create-server.d.ts +13 -10
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +41 -27
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/index.d.ts +5 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +6 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/missing-key.d.ts +9 -5
- package/dist/server/missing-key.d.ts.map +1 -1
- package/dist/server/missing-key.js +12 -7
- package/dist/server/missing-key.js.map +1 -1
- package/dist/server/sse.d.ts +12 -7
- package/dist/server/sse.d.ts.map +1 -1
- package/dist/server/sse.js +79 -15
- package/dist/server/sse.js.map +1 -1
- package/dist/vite/client.d.ts +28 -5
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +36 -15
- package/dist/vite/client.js.map +1 -1
- package/dist/vite/dev-api-server.d.ts +10 -0
- package/dist/vite/dev-api-server.d.ts.map +1 -0
- package/dist/vite/dev-api-server.js +148 -0
- package/dist/vite/dev-api-server.js.map +1 -0
- package/dist/vite/index.d.ts +2 -3
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +2 -3
- package/dist/vite/index.js.map +1 -1
- package/package.json +26 -17
- package/src/templates/default/AGENTS.md +148 -22
- package/src/templates/default/_gitignore +9 -5
- package/src/templates/default/client/entry.client.tsx +4 -0
- package/src/templates/default/client/entry.server.tsx +55 -0
- package/src/templates/default/client/root.tsx +82 -0
- package/src/templates/default/client/routes/_index.tsx +19 -0
- package/src/templates/default/client/routes.ts +4 -0
- package/src/templates/default/client/vite-env.d.ts +5 -0
- package/src/templates/default/package.json +5 -7
- package/src/templates/default/react-router.config.ts +6 -0
- package/src/templates/default/server/lib/watcher.ts +21 -0
- package/src/templates/default/server/plugins/auth.ts +5 -0
- package/src/templates/default/server/plugins/file-sync.ts +39 -0
- package/src/templates/default/server/routes/[...page].get.ts +12 -0
- package/src/templates/default/server/routes/api/events.get.ts +7 -0
- package/src/templates/default/server/routes/api/file-sync/status.get.ts +13 -0
- package/src/templates/default/server/routes/api/hello.get.ts +5 -0
- package/src/templates/default/tsconfig.json +9 -1
- package/src/templates/default/vite.config.ts +4 -1
- package/tsconfig.base.json +3 -1
- package/dist/adapters/neon/adapter.d.ts +0 -28
- package/dist/adapters/neon/adapter.d.ts.map +0 -1
- package/dist/adapters/neon/adapter.js +0 -135
- package/dist/adapters/neon/adapter.js.map +0 -1
- package/dist/adapters/neon/index.d.ts +0 -3
- package/dist/adapters/neon/index.d.ts.map +0 -1
- package/dist/adapters/neon/index.js +0 -3
- package/dist/adapters/neon/index.js.map +0 -1
- package/dist/server/production.d.ts +0 -18
- package/dist/server/production.d.ts.map +0 -1
- package/dist/server/production.js +0 -37
- package/dist/server/production.js.map +0 -1
- package/dist/vite/express-plugin.d.ts +0 -14
- package/dist/vite/express-plugin.d.ts.map +0 -1
- package/dist/vite/express-plugin.js +0 -53
- package/dist/vite/express-plugin.js.map +0 -1
- package/dist/vite/server.d.ts +0 -21
- package/dist/vite/server.d.ts.map +0 -1
- package/dist/vite/server.js +0 -68
- package/dist/vite/server.js.map +0 -1
- package/src/templates/default/index.html +0 -14
- package/src/templates/default/server/index.ts +0 -22
- package/src/templates/default/server/node-build.ts +0 -4
- 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
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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("
|
|
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]);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,2EAA2E;AAC3E,IAAI,QAAQ,GAAG,SAAS,CAAC;AACzB,IAAI,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,yCAAyC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACxE,CAAC;IACF,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC;AACzB,CAAC;AAAC,MAAM,CAAC,CAAA,CAAC;AAEV,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,qFAAqF;AACrF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAE7D,SAAS,WAAW;IAClB,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,MAAM,CAAC,CAAC,mBAAmB;AACpC,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,GAAG,CACV,GAAW,EACX,OAAiB,EACjB,IAAqC;IAErC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE;QAChC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,SAAS;QAC/B,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,2EAA2E;AAC3E,IAAI,QAAQ,GAAG,SAAS,CAAC;AACzB,IAAI,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,yCAAyC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CACxE,CAAC;IACF,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC;AACzB,CAAC;AAAC,MAAM,CAAC,CAAA,CAAC;AAEV,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,qFAAqF;AACrF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAE7D,SAAS,WAAW;IAClB,qCAAqC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,MAAM,CAAC,CAAC,mBAAmB;AACpC,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,yFAAyF;AACzF,SAAS,sBAAsB;IAC7B,OAAO,CACL,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACrD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CACtD,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CACV,GAAW,EACX,OAAiB,EACjB,IAAqC;IAErC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE;QAChC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,SAAS;QAC/B,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,2EAA2E;QAC3E,0FAA0F;QAC1F,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChB,MAAM;IACR,CAAC;IAED,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,6CAA6C;QAC7C,wDAAwD;QACxD,oCAAoC;QACpC,IAAI,sBAAsB,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACzD,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC3B,QAAQ,CAAC,GAAG,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM;IACR,CAAC;IAED,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,mDAAmD;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CACX,4DAA4D,CAC7D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,qFAAqF;QACrF,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACtC,MAAM;IACR,CAAC;IAED,KAAK,WAAW,CAAC,CAAC,CAAC;QACjB,+BAA+B;QAC/B,0DAA0D;QAC1D,IAAI,sBAAsB,EAAE,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;YACnE,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAChD,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACnC,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM;IACR,CAAC;IAED,KAAK,WAAW,CAAC;IACjB,KAAK,IAAI,CAAC,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC;IACd,KAAK,IAAI,CAAC;IACV,KAAK,SAAS;QACZ,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ;;;;;;;;;;;;oDAYW,CAAC,CAAC;QAClD,MAAM;IAER;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -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":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/client/index.js
CHANGED
|
@@ -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
|
package/dist/client/index.js.map
CHANGED
|
@@ -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"}
|