@agentuity/cli 2.0.11 → 3.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cmd/ai/prompt/index.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/index.js +2 -7
- package/dist/cmd/ai/prompt/index.js.map +1 -1
- package/dist/cmd/build/adapters/generic.d.ts +29 -0
- package/dist/cmd/build/adapters/generic.d.ts.map +1 -0
- package/dist/cmd/build/adapters/generic.js +190 -0
- package/dist/cmd/build/adapters/generic.js.map +1 -0
- package/dist/cmd/build/adapters/index.d.ts +15 -0
- package/dist/cmd/build/adapters/index.d.ts.map +1 -0
- package/dist/cmd/build/adapters/index.js +24 -0
- package/dist/cmd/build/adapters/index.js.map +1 -0
- package/dist/cmd/build/adapters/nextjs.d.ts +11 -0
- package/dist/cmd/build/adapters/nextjs.d.ts.map +1 -0
- package/dist/cmd/build/adapters/nextjs.js +118 -0
- package/dist/cmd/build/adapters/nextjs.js.map +1 -0
- package/dist/cmd/build/adapters/static-server.d.ts +23 -0
- package/dist/cmd/build/adapters/static-server.d.ts.map +1 -0
- package/dist/cmd/build/adapters/static-server.js +137 -0
- package/dist/cmd/build/adapters/static-server.js.map +1 -0
- package/dist/cmd/build/adapters/types.d.ts +71 -0
- package/dist/cmd/build/adapters/types.d.ts.map +1 -0
- package/dist/cmd/build/adapters/types.js +8 -0
- package/dist/cmd/build/adapters/types.js.map +1 -0
- package/dist/cmd/build/detect/engine.d.ts +24 -0
- package/dist/cmd/build/detect/engine.d.ts.map +1 -0
- package/dist/cmd/build/detect/engine.js +91 -0
- package/dist/cmd/build/detect/engine.js.map +1 -0
- package/dist/cmd/build/detect/frameworks.d.ts +66 -0
- package/dist/cmd/build/detect/frameworks.d.ts.map +1 -0
- package/dist/cmd/build/detect/frameworks.js +278 -0
- package/dist/cmd/build/detect/frameworks.js.map +1 -0
- package/dist/cmd/build/detect/generic.d.ts +13 -0
- package/dist/cmd/build/detect/generic.d.ts.map +1 -0
- package/dist/cmd/build/detect/generic.js +62 -0
- package/dist/cmd/build/detect/generic.js.map +1 -0
- package/dist/cmd/build/detect/index.d.ts +27 -0
- package/dist/cmd/build/detect/index.d.ts.map +1 -0
- package/dist/cmd/build/detect/index.js +76 -0
- package/dist/cmd/build/detect/index.js.map +1 -0
- package/dist/cmd/build/detect/types.d.ts +91 -0
- package/dist/cmd/build/detect/types.d.ts.map +1 -0
- package/dist/cmd/build/detect/types.js +9 -0
- package/dist/cmd/build/detect/types.js.map +1 -0
- package/dist/cmd/build/detect/util.d.ts +41 -0
- package/dist/cmd/build/detect/util.d.ts.map +1 -0
- package/dist/cmd/build/detect/util.js +101 -0
- package/dist/cmd/build/detect/util.js.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +49 -22
- package/dist/cmd/build/index.js.map +1 -1
- package/dist/cmd/build/package/index.d.ts +30 -0
- package/dist/cmd/build/package/index.d.ts.map +1 -0
- package/dist/cmd/build/package/index.js +39 -0
- package/dist/cmd/build/package/index.js.map +1 -0
- package/dist/cmd/build/package/launch.d.ts +56 -0
- package/dist/cmd/build/package/launch.d.ts.map +1 -0
- package/dist/cmd/build/package/launch.js +56 -0
- package/dist/cmd/build/package/launch.js.map +1 -0
- package/dist/cmd/build/typecheck.d.ts.map +1 -1
- package/dist/cmd/build/typecheck.js +8 -0
- package/dist/cmd/build/typecheck.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +63 -13
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/coder/create.js +7 -7
- package/dist/cmd/coder/create.js.map +1 -1
- package/dist/cmd/coder/update.js +8 -8
- package/dist/cmd/coder/update.js.map +1 -1
- package/dist/cmd/coder/workspace/create.js +9 -9
- package/dist/cmd/coder/workspace/create.js.map +1 -1
- package/dist/cmd/dev/index.d.ts +9 -0
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +127 -923
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/project/auth/shared.d.ts.map +1 -1
- package/dist/cmd/project/auth/shared.js +14 -38
- package/dist/cmd/project/auth/shared.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +12 -19
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/frameworks-ai-examples.d.ts +15 -0
- package/dist/cmd/project/frameworks-ai-examples.d.ts.map +1 -0
- package/dist/cmd/project/frameworks-ai-examples.js +160 -0
- package/dist/cmd/project/frameworks-ai-examples.js.map +1 -0
- package/dist/cmd/project/frameworks-landing-pages.d.ts +17 -0
- package/dist/cmd/project/frameworks-landing-pages.d.ts.map +1 -0
- package/dist/cmd/project/frameworks-landing-pages.js +242 -0
- package/dist/cmd/project/frameworks-landing-pages.js.map +1 -0
- package/dist/cmd/project/frameworks.d.ts +58 -0
- package/dist/cmd/project/frameworks.d.ts.map +1 -0
- package/dist/cmd/project/frameworks.js +152 -0
- package/dist/cmd/project/frameworks.js.map +1 -0
- package/dist/cmd/project/reconcile.d.ts.map +1 -1
- package/dist/cmd/project/reconcile.js +10 -23
- package/dist/cmd/project/reconcile.js.map +1 -1
- package/dist/cmd/project/remote-import.js +1 -1
- package/dist/cmd/project/scaffold.d.ts +58 -0
- package/dist/cmd/project/scaffold.d.ts.map +1 -0
- package/dist/cmd/project/scaffold.js +223 -0
- package/dist/cmd/project/scaffold.js.map +1 -0
- package/dist/cmd/project/template-flow.d.ts +8 -4
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +93 -144
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/deploy-metadata.d.ts +49 -0
- package/dist/deploy-metadata.d.ts.map +1 -0
- package/dist/deploy-metadata.js +183 -0
- package/dist/deploy-metadata.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +24 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +13 -8
- package/src/cmd/ai/prompt/index.ts +2 -7
- package/src/cmd/build/adapters/generic.ts +239 -0
- package/src/cmd/build/adapters/index.ts +30 -0
- package/src/cmd/build/adapters/nextjs.ts +146 -0
- package/src/cmd/build/adapters/static-server.ts +143 -0
- package/src/cmd/build/adapters/types.ts +93 -0
- package/src/cmd/build/detect/engine.ts +111 -0
- package/src/cmd/build/detect/frameworks.ts +335 -0
- package/src/cmd/build/detect/generic.ts +71 -0
- package/src/cmd/build/detect/index.ts +122 -0
- package/src/cmd/build/detect/types.ts +109 -0
- package/src/cmd/build/detect/util.ts +104 -0
- package/src/cmd/build/index.ts +64 -24
- package/src/cmd/build/package/index.ts +66 -0
- package/src/cmd/build/package/launch.ts +104 -0
- package/src/cmd/build/typecheck.ts +9 -0
- package/src/cmd/cloud/deploy.ts +86 -13
- package/src/cmd/coder/create.ts +8 -8
- package/src/cmd/coder/update.ts +7 -7
- package/src/cmd/coder/workspace/create.ts +10 -10
- package/src/cmd/dev/index.ts +155 -1059
- package/src/cmd/project/auth/shared.ts +14 -39
- package/src/cmd/project/create.ts +14 -19
- package/src/cmd/project/frameworks-ai-examples.ts +166 -0
- package/src/cmd/project/frameworks-landing-pages.ts +267 -0
- package/src/cmd/project/frameworks.ts +223 -0
- package/src/cmd/project/reconcile.ts +10 -22
- package/src/cmd/project/remote-import.ts +1 -1
- package/src/cmd/project/scaffold.ts +300 -0
- package/src/cmd/project/template-flow.ts +102 -156
- package/src/deploy-metadata.ts +253 -0
- package/src/index.ts +0 -2
- package/src/types.ts +0 -31
- package/dist/agents-docs.d.ts +0 -23
- package/dist/agents-docs.d.ts.map +0 -1
- package/dist/agents-docs.js +0 -56
- package/dist/agents-docs.js.map +0 -1
- package/dist/cmd/ai/prompt/agent.d.ts +0 -10
- package/dist/cmd/ai/prompt/agent.d.ts.map +0 -1
- package/dist/cmd/ai/prompt/agent.js +0 -28
- package/dist/cmd/ai/prompt/agent.js.map +0 -1
- package/dist/cmd/build/app-router-detector.d.ts +0 -39
- package/dist/cmd/build/app-router-detector.d.ts.map +0 -1
- package/dist/cmd/build/app-router-detector.js +0 -229
- package/dist/cmd/build/app-router-detector.js.map +0 -1
- package/dist/cmd/build/format-schema.d.ts +0 -6
- package/dist/cmd/build/format-schema.d.ts.map +0 -1
- package/dist/cmd/build/format-schema.js +0 -60
- package/dist/cmd/build/format-schema.js.map +0 -1
- package/dist/cmd/build/vite/agent-discovery.d.ts +0 -37
- package/dist/cmd/build/vite/agent-discovery.d.ts.map +0 -1
- package/dist/cmd/build/vite/agent-discovery.js +0 -263
- package/dist/cmd/build/vite/agent-discovery.js.map +0 -1
- package/dist/cmd/build/vite/beacon-plugin.d.ts +0 -19
- package/dist/cmd/build/vite/beacon-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/beacon-plugin.js +0 -137
- package/dist/cmd/build/vite/beacon-plugin.js.map +0 -1
- package/dist/cmd/build/vite/browser-env-plugin.d.ts +0 -9
- package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/browser-env-plugin.js +0 -28
- package/dist/cmd/build/vite/browser-env-plugin.js.map +0 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +0 -67
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +0 -1
- package/dist/cmd/build/vite/bun-dev-server.js +0 -340
- package/dist/cmd/build/vite/bun-dev-server.js.map +0 -1
- package/dist/cmd/build/vite/bundle-files.d.ts +0 -12
- package/dist/cmd/build/vite/bundle-files.d.ts.map +0 -1
- package/dist/cmd/build/vite/bundle-files.js +0 -107
- package/dist/cmd/build/vite/bundle-files.js.map +0 -1
- package/dist/cmd/build/vite/config-loader.d.ts +0 -29
- package/dist/cmd/build/vite/config-loader.d.ts.map +0 -1
- package/dist/cmd/build/vite/config-loader.js +0 -57
- package/dist/cmd/build/vite/config-loader.js.map +0 -1
- package/dist/cmd/build/vite/db-rewrite.d.ts +0 -50
- package/dist/cmd/build/vite/db-rewrite.d.ts.map +0 -1
- package/dist/cmd/build/vite/db-rewrite.js +0 -169
- package/dist/cmd/build/vite/db-rewrite.js.map +0 -1
- package/dist/cmd/build/vite/docs-generator.d.ts +0 -13
- package/dist/cmd/build/vite/docs-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/docs-generator.js +0 -97
- package/dist/cmd/build/vite/docs-generator.js.map +0 -1
- package/dist/cmd/build/vite/env-types-generator.d.ts +0 -26
- package/dist/cmd/build/vite/env-types-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/env-types-generator.js +0 -110
- package/dist/cmd/build/vite/env-types-generator.js.map +0 -1
- package/dist/cmd/build/vite/index.d.ts +0 -3
- package/dist/cmd/build/vite/index.d.ts.map +0 -1
- package/dist/cmd/build/vite/index.js +0 -4
- package/dist/cmd/build/vite/index.js.map +0 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts +0 -19
- package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/lifecycle-generator.js +0 -328
- package/dist/cmd/build/vite/lifecycle-generator.js.map +0 -1
- package/dist/cmd/build/vite/metadata-generator.d.ts +0 -36
- package/dist/cmd/build/vite/metadata-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/metadata-generator.js +0 -575
- package/dist/cmd/build/vite/metadata-generator.js.map +0 -1
- package/dist/cmd/build/vite/prompt-generator.d.ts +0 -23
- package/dist/cmd/build/vite/prompt-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/prompt-generator.js +0 -123
- package/dist/cmd/build/vite/prompt-generator.js.map +0 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +0 -45
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.js +0 -166
- package/dist/cmd/build/vite/public-asset-path-plugin.js.map +0 -1
- package/dist/cmd/build/vite/route-discovery.d.ts +0 -64
- package/dist/cmd/build/vite/route-discovery.d.ts.map +0 -1
- package/dist/cmd/build/vite/route-discovery.js +0 -187
- package/dist/cmd/build/vite/route-discovery.js.map +0 -1
- package/dist/cmd/build/vite/server-bundler.d.ts +0 -20
- package/dist/cmd/build/vite/server-bundler.d.ts.map +0 -1
- package/dist/cmd/build/vite/server-bundler.js +0 -388
- package/dist/cmd/build/vite/server-bundler.js.map +0 -1
- package/dist/cmd/build/vite/static-renderer.d.ts +0 -26
- package/dist/cmd/build/vite/static-renderer.d.ts.map +0 -1
- package/dist/cmd/build/vite/static-renderer.js +0 -188
- package/dist/cmd/build/vite/static-renderer.js.map +0 -1
- package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +0 -15
- package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +0 -1
- package/dist/cmd/build/vite/tailwind-source-plugin.js +0 -61
- package/dist/cmd/build/vite/tailwind-source-plugin.js.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts +0 -24
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +0 -285
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server.d.ts +0 -30
- package/dist/cmd/build/vite/vite-asset-server.d.ts.map +0 -1
- package/dist/cmd/build/vite/vite-asset-server.js +0 -109
- package/dist/cmd/build/vite/vite-asset-server.js.map +0 -1
- package/dist/cmd/build/vite/vite-builder.d.ts +0 -59
- package/dist/cmd/build/vite/vite-builder.d.ts.map +0 -1
- package/dist/cmd/build/vite/vite-builder.js +0 -401
- package/dist/cmd/build/vite/vite-builder.js.map +0 -1
- package/dist/cmd/build/vite/workbench-generator.d.ts +0 -10
- package/dist/cmd/build/vite/workbench-generator.d.ts.map +0 -1
- package/dist/cmd/build/vite/workbench-generator.js +0 -135
- package/dist/cmd/build/vite/workbench-generator.js.map +0 -1
- package/dist/cmd/build/vite/ws-proxy.d.ts +0 -53
- package/dist/cmd/build/vite/ws-proxy.d.ts.map +0 -1
- package/dist/cmd/build/vite/ws-proxy.js +0 -95
- package/dist/cmd/build/vite/ws-proxy.js.map +0 -1
- package/dist/cmd/build/vite-bundler.d.ts +0 -29
- package/dist/cmd/build/vite-bundler.d.ts.map +0 -1
- package/dist/cmd/build/vite-bundler.js +0 -93
- package/dist/cmd/build/vite-bundler.js.map +0 -1
- package/dist/cmd/dev/agents.d.ts +0 -2
- package/dist/cmd/dev/agents.d.ts.map +0 -1
- package/dist/cmd/dev/agents.js +0 -123
- package/dist/cmd/dev/agents.js.map +0 -1
- package/dist/cmd/dev/api.d.ts +0 -20
- package/dist/cmd/dev/api.d.ts.map +0 -1
- package/dist/cmd/dev/api.js +0 -42
- package/dist/cmd/dev/api.js.map +0 -1
- package/dist/cmd/dev/dev-lock.d.ts +0 -62
- package/dist/cmd/dev/dev-lock.d.ts.map +0 -1
- package/dist/cmd/dev/dev-lock.js +0 -250
- package/dist/cmd/dev/dev-lock.js.map +0 -1
- package/dist/cmd/dev/download.d.ts +0 -11
- package/dist/cmd/dev/download.d.ts.map +0 -1
- package/dist/cmd/dev/download.js +0 -94
- package/dist/cmd/dev/download.js.map +0 -1
- package/dist/cmd/dev/file-watcher.d.ts +0 -24
- package/dist/cmd/dev/file-watcher.d.ts.map +0 -1
- package/dist/cmd/dev/file-watcher.js +0 -349
- package/dist/cmd/dev/file-watcher.js.map +0 -1
- package/dist/cmd/dev/process-manager.d.ts +0 -104
- package/dist/cmd/dev/process-manager.d.ts.map +0 -1
- package/dist/cmd/dev/process-manager.js +0 -204
- package/dist/cmd/dev/process-manager.js.map +0 -1
- package/dist/cmd/dev/sync.d.ts +0 -12
- package/dist/cmd/dev/sync.d.ts.map +0 -1
- package/dist/cmd/dev/sync.js +0 -227
- package/dist/cmd/dev/sync.js.map +0 -1
- package/dist/cmd/dev/templates.d.ts +0 -3
- package/dist/cmd/dev/templates.d.ts.map +0 -1
- package/dist/cmd/dev/templates.js +0 -58
- package/dist/cmd/dev/templates.js.map +0 -1
- package/dist/cmd/project/download.d.ts +0 -35
- package/dist/cmd/project/download.d.ts.map +0 -1
- package/dist/cmd/project/download.js +0 -403
- package/dist/cmd/project/download.js.map +0 -1
- package/dist/cmd/project/templates.d.ts +0 -9
- package/dist/cmd/project/templates.d.ts.map +0 -1
- package/dist/cmd/project/templates.js +0 -34
- package/dist/cmd/project/templates.js.map +0 -1
- package/src/agents-docs.ts +0 -86
- package/src/cmd/ai/prompt/agent.md +0 -305
- package/src/cmd/ai/prompt/agent.ts +0 -31
- package/src/cmd/build/app-router-detector.ts +0 -320
- package/src/cmd/build/format-schema.ts +0 -66
- package/src/cmd/build/vite/agent-discovery.ts +0 -380
- package/src/cmd/build/vite/beacon-plugin.ts +0 -164
- package/src/cmd/build/vite/browser-env-plugin.ts +0 -34
- package/src/cmd/build/vite/bun-dev-server.ts +0 -458
- package/src/cmd/build/vite/bundle-files.ts +0 -135
- package/src/cmd/build/vite/config-loader.ts +0 -76
- package/src/cmd/build/vite/db-rewrite.ts +0 -189
- package/src/cmd/build/vite/docs-generator.ts +0 -103
- package/src/cmd/build/vite/env-types-generator.ts +0 -145
- package/src/cmd/build/vite/index.ts +0 -3
- package/src/cmd/build/vite/lifecycle-generator.ts +0 -381
- package/src/cmd/build/vite/metadata-generator.ts +0 -713
- package/src/cmd/build/vite/prompt-generator.ts +0 -169
- package/src/cmd/build/vite/public-asset-path-plugin.ts +0 -209
- package/src/cmd/build/vite/route-discovery.ts +0 -271
- package/src/cmd/build/vite/server-bundler.ts +0 -481
- package/src/cmd/build/vite/static-renderer.ts +0 -239
- package/src/cmd/build/vite/tailwind-source-plugin.ts +0 -73
- package/src/cmd/build/vite/vite-asset-server-config.ts +0 -349
- package/src/cmd/build/vite/vite-asset-server.ts +0 -154
- package/src/cmd/build/vite/vite-builder.ts +0 -503
- package/src/cmd/build/vite/workbench-generator.ts +0 -152
- package/src/cmd/build/vite/ws-proxy.ts +0 -126
- package/src/cmd/build/vite-bundler.ts +0 -137
- package/src/cmd/dev/agents.ts +0 -140
- package/src/cmd/dev/api.ts +0 -65
- package/src/cmd/dev/dev-lock.ts +0 -332
- package/src/cmd/dev/download.ts +0 -117
- package/src/cmd/dev/file-watcher.ts +0 -423
- package/src/cmd/dev/process-manager.ts +0 -261
- package/src/cmd/dev/sync.ts +0 -411
- package/src/cmd/dev/templates.ts +0 -66
- package/src/cmd/project/download.ts +0 -505
- package/src/cmd/project/templates.ts +0 -56
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Static Renderer
|
|
3
|
-
*
|
|
4
|
-
* When `src/web/entry-server.tsx` exists, this module:
|
|
5
|
-
* 1. Runs a Vite SSR build (as a subprocess to avoid in-process Bun/Vite issues)
|
|
6
|
-
* 2. Imports the built entry-server.js
|
|
7
|
-
* 3. Discovers routes to pre-render:
|
|
8
|
-
* - If `routeTree` is exported: auto-discovers all non-parameterized routes
|
|
9
|
-
* - If `getStaticPaths()` is exported: merges those paths in (for parameterized routes)
|
|
10
|
-
* - If neither: throws an error
|
|
11
|
-
* 4. Calls render(url) for each route
|
|
12
|
-
* 5. Replaces <!--app-html--> in the client template with rendered HTML
|
|
13
|
-
* 6. Writes pre-rendered HTML files to .agentuity/client/
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
import { mkdirSync, writeFileSync, readFileSync, existsSync, rmSync } from 'node:fs';
|
|
18
|
-
import type { Logger } from '../../../types';
|
|
19
|
-
|
|
20
|
-
/** Minimal shape of a TanStack Router route tree node. */
|
|
21
|
-
interface RouteTreeNode {
|
|
22
|
-
path?: string;
|
|
23
|
-
options?: { path?: string };
|
|
24
|
-
children?: Record<string, RouteTreeNode>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Walks a TanStack Router route tree and extracts all non-parameterized paths.
|
|
29
|
-
* Skips layout routes (no path) and parameterized routes (containing $).
|
|
30
|
-
*
|
|
31
|
-
* Accumulates the full URL path through the parent chain, since child routes
|
|
32
|
-
* under layout routes have relative paths (e.g., '/key-value' under a
|
|
33
|
-
* '/reference/api' layout should resolve to '/reference/api/key-value').
|
|
34
|
-
*/
|
|
35
|
-
function extractRoutePaths(node: RouteTreeNode): string[] {
|
|
36
|
-
const paths = new Set<string>();
|
|
37
|
-
|
|
38
|
-
function walk(route: RouteTreeNode, parentPath: string) {
|
|
39
|
-
const segment: string | undefined = route.path ?? route.options?.path;
|
|
40
|
-
|
|
41
|
-
// Build the full path by accumulating segments from parent routes.
|
|
42
|
-
// - Layout routes have no path (undefined) and don't contribute to the URL.
|
|
43
|
-
// - Index routes have path '/' and resolve to the parent path itself.
|
|
44
|
-
// - Leaf/layout routes have paths like '/reference/api' or '/key-value'.
|
|
45
|
-
let currentPath = parentPath;
|
|
46
|
-
if (segment && segment !== '/') {
|
|
47
|
-
// Non-root segment: append to parent path.
|
|
48
|
-
// Segments always start with '/' (TanStack Router convention).
|
|
49
|
-
currentPath = parentPath === '/' ? segment : parentPath + segment;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Add non-parameterized, non-empty paths
|
|
53
|
-
if (currentPath && !currentPath.includes('$')) {
|
|
54
|
-
const normalized = currentPath === '/' ? '/' : currentPath.replace(/\/+$/, '');
|
|
55
|
-
if (normalized) {
|
|
56
|
-
paths.add(normalized);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Recurse into children, passing the accumulated path
|
|
61
|
-
const children = route.children;
|
|
62
|
-
if (children && typeof children === 'object') {
|
|
63
|
-
for (const child of Object.values(children)) {
|
|
64
|
-
if (child) walk(child, currentPath);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
walk(node, '');
|
|
70
|
-
return [...paths].sort();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export interface StaticRenderOptions {
|
|
74
|
-
rootDir: string;
|
|
75
|
-
logger: Logger;
|
|
76
|
-
dev?: boolean;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export interface StaticRenderResult {
|
|
80
|
-
routes: number;
|
|
81
|
-
duration: number;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export async function runStaticRender(options: StaticRenderOptions): Promise<StaticRenderResult> {
|
|
85
|
-
const { rootDir, logger, dev = false } = options;
|
|
86
|
-
const started = Date.now();
|
|
87
|
-
|
|
88
|
-
const clientDir = join(rootDir, '.agentuity/client');
|
|
89
|
-
const ssrOutDir = join(rootDir, '.agentuity/ssr');
|
|
90
|
-
const entryServerPath = join(rootDir, 'src/web/entry-server.tsx');
|
|
91
|
-
const templatePath = join(clientDir, 'index.html');
|
|
92
|
-
|
|
93
|
-
// Verify prerequisites
|
|
94
|
-
if (!existsSync(entryServerPath)) {
|
|
95
|
-
throw new Error(
|
|
96
|
-
'Static rendering requires src/web/entry-server.tsx. ' +
|
|
97
|
-
'This file must export a render(url: string) function and either ' +
|
|
98
|
-
'a routeTree for auto-discovery or getStaticPaths() for explicit paths.'
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (!existsSync(templatePath)) {
|
|
103
|
-
throw new Error(
|
|
104
|
-
'Client build must complete before static rendering. ' +
|
|
105
|
-
'No index.html found in .agentuity/client/'
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Step 1: Vite SSR build (subprocess)
|
|
110
|
-
// Run as a subprocess to avoid in-process Bun/Vite module resolution issues
|
|
111
|
-
// that cause @mdx-js/rollup and other plugins to fail during SSR builds.
|
|
112
|
-
// This matches the approach used for client builds in vite-builder.ts.
|
|
113
|
-
logger.debug('Running Vite SSR build for static rendering (subprocess)...');
|
|
114
|
-
|
|
115
|
-
const buildMode = dev ? 'development' : 'production';
|
|
116
|
-
|
|
117
|
-
const viteProcess = Bun.spawn(
|
|
118
|
-
[
|
|
119
|
-
'bun',
|
|
120
|
-
'x',
|
|
121
|
-
'vite',
|
|
122
|
-
'build',
|
|
123
|
-
'--ssr',
|
|
124
|
-
entryServerPath,
|
|
125
|
-
'--outDir',
|
|
126
|
-
ssrOutDir,
|
|
127
|
-
'--mode',
|
|
128
|
-
buildMode,
|
|
129
|
-
],
|
|
130
|
-
{
|
|
131
|
-
cwd: rootDir,
|
|
132
|
-
stdout: 'inherit',
|
|
133
|
-
stderr: 'inherit',
|
|
134
|
-
}
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
const exitCode = await viteProcess.exited;
|
|
138
|
-
|
|
139
|
-
if (exitCode !== 0) {
|
|
140
|
-
throw new Error(`Vite SSR build exited with code ${exitCode}`);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Steps 2–4: wrapped in try-finally so SSR artifacts are always cleaned up,
|
|
144
|
-
// even if an exception is thrown during module import, validation, or rendering.
|
|
145
|
-
let routeCount = 0;
|
|
146
|
-
try {
|
|
147
|
-
// Step 2: Import the built SSR entry
|
|
148
|
-
const ssrEntryPath = join(ssrOutDir, 'entry-server.js');
|
|
149
|
-
if (!existsSync(ssrEntryPath)) {
|
|
150
|
-
throw new Error(`SSR build did not produce entry-server.js at ${ssrEntryPath}`);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const ssrModule = await import(ssrEntryPath);
|
|
154
|
-
|
|
155
|
-
if (typeof ssrModule.render !== 'function') {
|
|
156
|
-
throw new Error(
|
|
157
|
-
'entry-server.tsx must export a render(url: string) function that returns HTML string'
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Step 3: Discover routes
|
|
162
|
-
// Priority: auto-discover from routeTree + merge getStaticPaths() if present
|
|
163
|
-
const discovered = new Set<string>();
|
|
164
|
-
|
|
165
|
-
// 3a. Auto-discover from exported routeTree (skips parameterized routes)
|
|
166
|
-
if (ssrModule.routeTree) {
|
|
167
|
-
const autoRoutes = extractRoutePaths(ssrModule.routeTree);
|
|
168
|
-
for (const r of autoRoutes) {
|
|
169
|
-
discovered.add(r);
|
|
170
|
-
}
|
|
171
|
-
logger.debug(`Auto-discovered ${autoRoutes.length} routes from route tree`);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// 3b. Merge paths from getStaticPaths() if exported (for parameterized routes, etc.)
|
|
175
|
-
if (typeof ssrModule.getStaticPaths === 'function') {
|
|
176
|
-
const extraRoutes = await ssrModule.getStaticPaths();
|
|
177
|
-
if (!Array.isArray(extraRoutes)) {
|
|
178
|
-
throw new Error(
|
|
179
|
-
'getStaticPaths() must return an array of URL paths (e.g., ["/", "/about"])'
|
|
180
|
-
);
|
|
181
|
-
}
|
|
182
|
-
for (const r of extraRoutes) {
|
|
183
|
-
discovered.add(r);
|
|
184
|
-
}
|
|
185
|
-
logger.debug(`getStaticPaths() added ${extraRoutes.length} paths`);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Must have at least one source of routes
|
|
189
|
-
if (discovered.size === 0) {
|
|
190
|
-
throw new Error(
|
|
191
|
-
'No routes to pre-render. Export routeTree from entry-server.tsx for auto-discovery, ' +
|
|
192
|
-
'or export getStaticPaths() returning an array of URL paths.'
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const routes: string[] = [...discovered].sort();
|
|
197
|
-
routeCount = routes.length;
|
|
198
|
-
logger.debug(`Total: ${routes.length} routes for pre-rendering`);
|
|
199
|
-
|
|
200
|
-
// Step 4: Read template and pre-render each route
|
|
201
|
-
const template = readFileSync(templatePath, 'utf-8');
|
|
202
|
-
if (!template.includes('<!--app-html-->')) {
|
|
203
|
-
logger.warn(
|
|
204
|
-
'index.html is missing the <!--app-html--> placeholder; ' +
|
|
205
|
-
'pre-rendered content will not be injected into the page.'
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
for (const route of routes) {
|
|
210
|
-
try {
|
|
211
|
-
const html = await ssrModule.render(route);
|
|
212
|
-
const page = template.replace('<!--app-html-->', html);
|
|
213
|
-
|
|
214
|
-
let outPath: string;
|
|
215
|
-
if (route === '/') {
|
|
216
|
-
outPath = join(clientDir, 'index.html');
|
|
217
|
-
} else {
|
|
218
|
-
const dir = join(clientDir, route.slice(1));
|
|
219
|
-
mkdirSync(dir, { recursive: true });
|
|
220
|
-
outPath = join(dir, 'index.html');
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
writeFileSync(outPath, page, 'utf-8');
|
|
224
|
-
} catch (err) {
|
|
225
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
226
|
-
logger.warn(`Failed to render route ${route}: ${message}`);
|
|
227
|
-
// Continue rendering other routes
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
} finally {
|
|
231
|
-
// Step 5: Clean up SSR build artifacts (always runs, even on error)
|
|
232
|
-
rmSync(ssrOutDir, { recursive: true, force: true });
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const duration = Date.now() - started;
|
|
236
|
-
logger.debug(`Static rendering complete: ${routeCount} routes in ${duration}ms`);
|
|
237
|
-
|
|
238
|
-
return { routes: routeCount, duration };
|
|
239
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vite plugin to fix Tailwind v4 oxide scanner hang in containers
|
|
3
|
-
*
|
|
4
|
-
* The Tailwind v4 oxide scanner (native Rust binary) can hang or fail when
|
|
5
|
-
* scanning the filesystem in containerized environments. Adding source(none)
|
|
6
|
-
* to @import "tailwindcss" disables the oxide filesystem scanner, and an
|
|
7
|
-
* explicit @source directive pointing at the project's src/ directory tells
|
|
8
|
-
* Tailwind exactly where to find utility classes.
|
|
9
|
-
*
|
|
10
|
-
* @see https://github.com/tailwindlabs/tailwindcss/discussions/19661
|
|
11
|
-
* @see https://tailwindcss.com/docs/detecting-classes-in-source-files
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { dirname, join, relative, sep } from 'node:path';
|
|
15
|
-
import type { Plugin } from 'vite';
|
|
16
|
-
|
|
17
|
-
export function tailwindSourcePlugin(): Plugin {
|
|
18
|
-
let root: string;
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
name: 'agentuity:tailwind-source',
|
|
22
|
-
enforce: 'pre',
|
|
23
|
-
|
|
24
|
-
configResolved(config) {
|
|
25
|
-
root = config.root;
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
transform(code, id) {
|
|
29
|
-
// Only transform CSS files
|
|
30
|
-
if (!id.endsWith('.css')) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Check if the file contains @import "tailwindcss" (with either quote type)
|
|
35
|
-
if (!/@import\s+["']tailwindcss["']/.test(code)) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Compute relative path from CSS file to project's src/ directory
|
|
40
|
-
const cssDir = dirname(id);
|
|
41
|
-
const srcDir = join(root, 'src');
|
|
42
|
-
let relPath = relative(cssDir, srcDir).split(sep).join('/');
|
|
43
|
-
if (relPath === '') {
|
|
44
|
-
relPath = '.';
|
|
45
|
-
} else if (!relPath.startsWith('.')) {
|
|
46
|
-
relPath = './' + relPath;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Transform @import "tailwindcss" → @import "tailwindcss" source(none)
|
|
50
|
-
// and add explicit @source so Tailwind knows where to scan for classes.
|
|
51
|
-
// Does NOT transform if source() is already specified.
|
|
52
|
-
const transformed = code.replace(
|
|
53
|
-
/@import\s+(["'])tailwindcss\1([^;]*);/g,
|
|
54
|
-
(match, quote, rest) => {
|
|
55
|
-
// If source() is already present, don't modify
|
|
56
|
-
if (/source\s*\(/.test(rest)) {
|
|
57
|
-
return match;
|
|
58
|
-
}
|
|
59
|
-
return `@import ${quote}tailwindcss${quote}${rest} source(none);\n@source "${relPath}";`;
|
|
60
|
-
}
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
if (transformed !== code) {
|
|
64
|
-
return {
|
|
65
|
-
code: transformed,
|
|
66
|
-
map: null,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return null;
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
}
|
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vite Dev Server Configuration
|
|
3
|
-
*
|
|
4
|
-
* Vite is the primary dev server — serves frontend assets natively and proxies
|
|
5
|
-
* API/WebSocket requests to the Bun backend server.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { join } from 'node:path';
|
|
9
|
-
import { existsSync } from 'node:fs';
|
|
10
|
-
import type { InlineConfig, Plugin } from 'vite';
|
|
11
|
-
import type { Logger } from '../../../types';
|
|
12
|
-
|
|
13
|
-
export interface GenerateAssetServerConfigOptions {
|
|
14
|
-
rootDir: string;
|
|
15
|
-
logger: Logger;
|
|
16
|
-
workbenchPath?: string;
|
|
17
|
-
port: number; // The port Vite will listen on (user-facing)
|
|
18
|
-
backendPort: number; // The port Bun backend is running on (internal)
|
|
19
|
-
/** User-defined route mount paths from createApp({ router }) (e.g., ['/api', '/v1']) */
|
|
20
|
-
routePaths?: string[];
|
|
21
|
-
/** Live tunnel hostname (e.g. "epXXX.agentuity-us.live.internal") to add to Vite's allowedHosts */
|
|
22
|
-
liveHostname?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Vite plugin that injects analytics scripts in dev mode.
|
|
27
|
-
*
|
|
28
|
-
* In production the beacon plugin handles this at build time. In dev mode
|
|
29
|
-
* the analytics config + session + beacon scripts are served by the Bun
|
|
30
|
-
* backend at /_agentuity/webanalytics/* routes, but we need to inject the
|
|
31
|
-
* `<script>` tags into the HTML so the browser loads them.
|
|
32
|
-
*/
|
|
33
|
-
function devAnalyticsPlugin(): Plugin {
|
|
34
|
-
return {
|
|
35
|
-
name: 'agentuity:dev-analytics',
|
|
36
|
-
transformIndexHtml: {
|
|
37
|
-
order: 'pre',
|
|
38
|
-
handler(html) {
|
|
39
|
-
// Default analytics config — matches resolveAnalyticsConfig(undefined) in runtime
|
|
40
|
-
const config = {
|
|
41
|
-
enabled: true,
|
|
42
|
-
trackClicks: true,
|
|
43
|
-
trackScroll: true,
|
|
44
|
-
trackOutboundLinks: true,
|
|
45
|
-
trackForms: false,
|
|
46
|
-
trackWebVitals: true,
|
|
47
|
-
trackErrors: true,
|
|
48
|
-
trackSPANavigation: true,
|
|
49
|
-
isDevmode: true,
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
const injection =
|
|
53
|
-
`<script>window.__AGENTUITY_ANALYTICS__=${JSON.stringify(config)};</script>` +
|
|
54
|
-
'<script src="/_agentuity/webanalytics/session.js" async></script>' +
|
|
55
|
-
'<script src="/_agentuity/webanalytics/analytics.js"></script>';
|
|
56
|
-
|
|
57
|
-
if (html.includes('</head>')) {
|
|
58
|
-
return html.replace('</head>', `${injection}</head>`);
|
|
59
|
-
}
|
|
60
|
-
return html;
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Vite plugin that serves src/web/index.html as the SPA fallback.
|
|
68
|
-
*
|
|
69
|
-
* Vite's built-in SPA fallback only serves index.html from the project root.
|
|
70
|
-
* Since Agentuity apps keep their HTML entry at src/web/index.html, we need
|
|
71
|
-
* this plugin to rewrite the URL so Vite's built-in transform pipeline
|
|
72
|
-
* (including React Fast Refresh injection) processes it correctly.
|
|
73
|
-
*/
|
|
74
|
-
function spaFallbackPlugin(rootDir: string, routePaths: string[], workbenchPath?: string): Plugin {
|
|
75
|
-
const htmlPath = join(rootDir, 'src', 'web', 'index.html');
|
|
76
|
-
const hasHtml = existsSync(htmlPath);
|
|
77
|
-
|
|
78
|
-
return {
|
|
79
|
-
name: 'agentuity:spa-fallback',
|
|
80
|
-
configureServer(server) {
|
|
81
|
-
if (!hasHtml) return;
|
|
82
|
-
|
|
83
|
-
server.middlewares.use(async (req, res, next) => {
|
|
84
|
-
// Only handle GET/HEAD navigation requests
|
|
85
|
-
if (req.method !== 'GET' && req.method !== 'HEAD') return next();
|
|
86
|
-
|
|
87
|
-
const url = req.url || '/';
|
|
88
|
-
const pathname = url.split('?')[0] || '/';
|
|
89
|
-
const accept = req.headers.accept || '';
|
|
90
|
-
const secFetchDest = req.headers['sec-fetch-dest'] || '';
|
|
91
|
-
|
|
92
|
-
// For robustness, treat unknown GET/HEAD routes as potential SPA navigations.
|
|
93
|
-
// We still avoid intercepting assets/backend paths via the filters below.
|
|
94
|
-
// (This also makes non-browser readiness probes like fetch('/streams') work.)
|
|
95
|
-
const isDocumentRequest = secFetchDest === 'document' || accept.includes('text/html');
|
|
96
|
-
|
|
97
|
-
// Skip file requests (have an extension)
|
|
98
|
-
if (pathname !== '/' && /\.[a-zA-Z0-9]+$/.test(pathname)) return next();
|
|
99
|
-
|
|
100
|
-
// For non-document requests, only allow root path fallback.
|
|
101
|
-
// (e.g. don't turn module/script fetches into HTML accidentally)
|
|
102
|
-
if (!isDocumentRequest && pathname === '/') {
|
|
103
|
-
// allow root fallback for simple probes
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Skip Vite/module/internal asset paths
|
|
107
|
-
if (
|
|
108
|
-
pathname.startsWith('/@vite') ||
|
|
109
|
-
pathname.startsWith('/@react-refresh') ||
|
|
110
|
-
pathname.startsWith('/@id/') ||
|
|
111
|
-
pathname.startsWith('/@fs/') ||
|
|
112
|
-
pathname.startsWith('/node_modules/') ||
|
|
113
|
-
pathname.startsWith('/src/') ||
|
|
114
|
-
(pathname.startsWith('/@') && !pathname.startsWith('/_agentuity'))
|
|
115
|
-
) {
|
|
116
|
-
return next();
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Skip paths that are proxied to the Bun backend
|
|
120
|
-
if (
|
|
121
|
-
pathname.startsWith('/_agentuity') ||
|
|
122
|
-
pathname.startsWith('/_health') ||
|
|
123
|
-
pathname.startsWith('/_idle')
|
|
124
|
-
) {
|
|
125
|
-
return next();
|
|
126
|
-
}
|
|
127
|
-
// Skip workbench path (served by Bun)
|
|
128
|
-
if (
|
|
129
|
-
workbenchPath &&
|
|
130
|
-
(pathname === workbenchPath || pathname.startsWith(workbenchPath + '/'))
|
|
131
|
-
) {
|
|
132
|
-
return next();
|
|
133
|
-
}
|
|
134
|
-
for (const rp of routePaths) {
|
|
135
|
-
if (pathname === rp || pathname.startsWith(rp + '/')) return next();
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// If this isn't clearly a document navigation, still allow SPA fallback
|
|
139
|
-
// for extensionless client-side routes like /streams, /rpc, /webrtc.
|
|
140
|
-
// We already excluded backend paths and asset/module paths above.
|
|
141
|
-
|
|
142
|
-
try {
|
|
143
|
-
let html = await Bun.file(htmlPath).text();
|
|
144
|
-
// Match old devHtmlHandler behavior from the generated Bun entry:
|
|
145
|
-
// rewrite relative paths so the app works from / and client-side routes.
|
|
146
|
-
html = html
|
|
147
|
-
.replace(/src="\.\//g, 'src="/src/web/')
|
|
148
|
-
.replace(/href="\.\//g, 'href="/src/web/');
|
|
149
|
-
|
|
150
|
-
// Let Vite inject HMR client, React refresh preamble, etc.
|
|
151
|
-
html = await server.transformIndexHtml(url, html, req.originalUrl);
|
|
152
|
-
|
|
153
|
-
res.statusCode = 200;
|
|
154
|
-
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
155
|
-
res.end(html);
|
|
156
|
-
} catch (error) {
|
|
157
|
-
next(error as Error);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
},
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Generate Vite config for asset-only server (HMR + React transformation)
|
|
166
|
-
*/
|
|
167
|
-
export async function generateAssetServerConfig(
|
|
168
|
-
options: GenerateAssetServerConfigOptions
|
|
169
|
-
): Promise<InlineConfig> {
|
|
170
|
-
const {
|
|
171
|
-
rootDir,
|
|
172
|
-
logger,
|
|
173
|
-
workbenchPath,
|
|
174
|
-
port,
|
|
175
|
-
backendPort,
|
|
176
|
-
routePaths = ['/api'],
|
|
177
|
-
liveHostname,
|
|
178
|
-
} = options;
|
|
179
|
-
|
|
180
|
-
// Load path aliases from tsconfig.json if available
|
|
181
|
-
const tsconfigPath = join(rootDir, 'tsconfig.json');
|
|
182
|
-
let alias = {};
|
|
183
|
-
|
|
184
|
-
try {
|
|
185
|
-
const tsconfig = JSON.parse(await Bun.file(tsconfigPath).text());
|
|
186
|
-
const paths = tsconfig?.compilerOptions?.paths || {};
|
|
187
|
-
alias = Object.fromEntries(
|
|
188
|
-
Object.entries(paths)
|
|
189
|
-
.filter(([, value]) => {
|
|
190
|
-
const pathArray = value as string[];
|
|
191
|
-
return pathArray.length > 0 && pathArray[0] !== undefined;
|
|
192
|
-
})
|
|
193
|
-
.map(([key, value]) => {
|
|
194
|
-
const pathArray = value as string[];
|
|
195
|
-
const firstPath = pathArray[0] ?? '';
|
|
196
|
-
return [key.replace('/*', ''), join(rootDir, firstPath.replace('/*', ''))];
|
|
197
|
-
})
|
|
198
|
-
);
|
|
199
|
-
} catch {
|
|
200
|
-
// No tsconfig or no paths - that's fine
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
return {
|
|
204
|
-
root: rootDir,
|
|
205
|
-
base: '/',
|
|
206
|
-
clearScreen: false,
|
|
207
|
-
// Serve public assets from src/web/public/ at root path (e.g., /favicon.png)
|
|
208
|
-
// The Bun server proxies /public/* requests to Vite, rewriting to root paths
|
|
209
|
-
publicDir: join(rootDir, 'src', 'web', 'public'),
|
|
210
|
-
|
|
211
|
-
resolve: {
|
|
212
|
-
alias,
|
|
213
|
-
// Deduplicate React to prevent multiple instances (if used)
|
|
214
|
-
dedupe: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'],
|
|
215
|
-
},
|
|
216
|
-
|
|
217
|
-
// Pre-bundle dependencies to avoid issues with pre-built packages
|
|
218
|
-
// Only include @agentuity/workbench if workbench is enabled
|
|
219
|
-
optimizeDeps: {
|
|
220
|
-
include: workbenchPath ? ['@agentuity/workbench', '@agentuity/core'] : ['@agentuity/core'],
|
|
221
|
-
},
|
|
222
|
-
|
|
223
|
-
// Only allow frontend env vars (server uses process.env)
|
|
224
|
-
envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
|
|
225
|
-
|
|
226
|
-
server: {
|
|
227
|
-
// Vite is the primary dev server — listens on the user-facing port
|
|
228
|
-
port,
|
|
229
|
-
strictPort: true, // Port is pre-verified as available by findAvailablePort()
|
|
230
|
-
host: '127.0.0.1',
|
|
231
|
-
|
|
232
|
-
// When accessed via an Agentuity live tunnel, the Host header is the
|
|
233
|
-
// tunnel hostname (e.g. "epXXX.agentuity-us.live.internal"). Without
|
|
234
|
-
// adding it here, Vite 6+ rejects the request with "host not allowed".
|
|
235
|
-
...(liveHostname ? { allowedHosts: [liveHostname] } : {}),
|
|
236
|
-
|
|
237
|
-
// Proxy backend routes to Bun server (HTTP only).
|
|
238
|
-
// WebSocket upgrades are handled by the front-door TCP proxy (ws-proxy.ts)
|
|
239
|
-
// which routes them directly to the Bun backend, bypassing Vite entirely.
|
|
240
|
-
// This avoids Bun's broken node:http upgrade socket implementation.
|
|
241
|
-
proxy: {
|
|
242
|
-
// User-defined route mounts (from createApp({ router }))
|
|
243
|
-
...Object.fromEntries(
|
|
244
|
-
routePaths.map((routePath) => [
|
|
245
|
-
routePath,
|
|
246
|
-
{
|
|
247
|
-
target: `http://127.0.0.1:${backendPort}`,
|
|
248
|
-
changeOrigin: true,
|
|
249
|
-
},
|
|
250
|
-
])
|
|
251
|
-
),
|
|
252
|
-
// Agentuity system routes (workbench API, health, analytics, etc.)
|
|
253
|
-
'/_agentuity': {
|
|
254
|
-
target: `http://127.0.0.1:${backendPort}`,
|
|
255
|
-
changeOrigin: true,
|
|
256
|
-
},
|
|
257
|
-
// Workbench UI route (served by Bun, references /@fs/* paths handled by Vite)
|
|
258
|
-
...(workbenchPath
|
|
259
|
-
? {
|
|
260
|
-
[workbenchPath]: {
|
|
261
|
-
target: `http://127.0.0.1:${backendPort}`,
|
|
262
|
-
changeOrigin: true,
|
|
263
|
-
},
|
|
264
|
-
}
|
|
265
|
-
: {}),
|
|
266
|
-
// Legacy health check routes
|
|
267
|
-
'/_health': {
|
|
268
|
-
target: `http://127.0.0.1:${backendPort}`,
|
|
269
|
-
changeOrigin: true,
|
|
270
|
-
},
|
|
271
|
-
'/_idle': {
|
|
272
|
-
target: `http://127.0.0.1:${backendPort}`,
|
|
273
|
-
changeOrigin: true,
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
|
|
277
|
-
// HMR works natively — Vite is the primary server, no proxy needed
|
|
278
|
-
// Auto-detect host/protocol from page origin for tunnel support
|
|
279
|
-
hmr: true,
|
|
280
|
-
|
|
281
|
-
// Don't open browser automatically
|
|
282
|
-
open: false,
|
|
283
|
-
},
|
|
284
|
-
|
|
285
|
-
// Define environment variables for browser
|
|
286
|
-
define: {
|
|
287
|
-
...(workbenchPath
|
|
288
|
-
? { 'import.meta.env.AGENTUITY_PUBLIC_WORKBENCH_PATH': JSON.stringify(workbenchPath) }
|
|
289
|
-
: {}),
|
|
290
|
-
'import.meta.env.AGENTUITY_PUBLIC_HAS_SDK_KEY': JSON.stringify(
|
|
291
|
-
process.env.AGENTUITY_SDK_KEY ? 'true' : 'false'
|
|
292
|
-
),
|
|
293
|
-
'process.env.NODE_ENV': JSON.stringify('development'),
|
|
294
|
-
},
|
|
295
|
-
|
|
296
|
-
// Agentuity-specific plugins (Vite loads user plugins from vite.config.ts automatically)
|
|
297
|
-
plugins: await (async () => {
|
|
298
|
-
const { browserEnvPlugin } = await import('./browser-env-plugin');
|
|
299
|
-
const { publicAssetPathPlugin } = await import('./public-asset-path-plugin');
|
|
300
|
-
|
|
301
|
-
return [
|
|
302
|
-
// Browser env plugin to map process.env to import.meta.env
|
|
303
|
-
browserEnvPlugin(),
|
|
304
|
-
// Warn about incorrect public asset paths in dev mode
|
|
305
|
-
publicAssetPathPlugin({ warnInDev: true }),
|
|
306
|
-
// Inject analytics scripts in dev HTML
|
|
307
|
-
devAnalyticsPlugin(),
|
|
308
|
-
// SPA fallback: serve src/web/index.html for navigation requests
|
|
309
|
-
spaFallbackPlugin(rootDir, routePaths, workbenchPath),
|
|
310
|
-
];
|
|
311
|
-
})(),
|
|
312
|
-
|
|
313
|
-
// Suppress build-related options (this is dev-only)
|
|
314
|
-
build: {
|
|
315
|
-
rollupOptions: {
|
|
316
|
-
external: ['vite', '@agentuity/cli'],
|
|
317
|
-
},
|
|
318
|
-
},
|
|
319
|
-
|
|
320
|
-
// Custom logger to integrate with our logger
|
|
321
|
-
customLogger: {
|
|
322
|
-
info(msg: string) {
|
|
323
|
-
// Show port-related messages at info level (important for debugging port conflicts)
|
|
324
|
-
// Keep other Vite info messages (like HMR updates) at debug to avoid noise
|
|
325
|
-
if (msg.includes('Port') || msg.includes('port')) {
|
|
326
|
-
logger.info(`[Vite Asset] ${msg}`);
|
|
327
|
-
} else {
|
|
328
|
-
logger.debug(`[Vite Asset] ${msg}`);
|
|
329
|
-
}
|
|
330
|
-
},
|
|
331
|
-
warn(msg: string) {
|
|
332
|
-
logger.warn(`[Vite Asset] ${msg}`);
|
|
333
|
-
},
|
|
334
|
-
warnOnce(msg: string) {
|
|
335
|
-
logger.warn(`[Vite Asset] ${msg}`);
|
|
336
|
-
},
|
|
337
|
-
error(msg: string) {
|
|
338
|
-
logger.error(`[Vite Asset] ${msg}`);
|
|
339
|
-
},
|
|
340
|
-
clearScreen() {
|
|
341
|
-
// No-op
|
|
342
|
-
},
|
|
343
|
-
hasErrorLogged: () => false,
|
|
344
|
-
hasWarned: false,
|
|
345
|
-
},
|
|
346
|
-
|
|
347
|
-
logLevel: 'info',
|
|
348
|
-
};
|
|
349
|
-
}
|