@agentuity/cli 2.0.10 → 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.d.ts.map +1 -1
- package/dist/cmd/coder/create.js +18 -0
- package/dist/cmd/coder/create.js.map +1 -1
- package/dist/cmd/coder/index.d.ts.map +1 -1
- package/dist/cmd/coder/index.js +4 -0
- package/dist/cmd/coder/index.js.map +1 -1
- package/dist/cmd/coder/start.d.ts.map +1 -1
- package/dist/cmd/coder/start.js +49 -1
- package/dist/cmd/coder/start.js.map +1 -1
- package/dist/cmd/coder/update.d.ts.map +1 -1
- package/dist/cmd/coder/update.js +21 -1
- package/dist/cmd/coder/update.js.map +1 -1
- package/dist/cmd/coder/workspace/create.d.ts.map +1 -1
- package/dist/cmd/coder/workspace/create.js +17 -1
- package/dist/cmd/coder/workspace/create.js.map +1 -1
- package/dist/cmd/coder/workspace/list.js +2 -2
- package/dist/cmd/coder/workspace/list.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 +25 -31
- 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 +24 -1
- package/src/cmd/coder/index.ts +4 -0
- package/src/cmd/coder/start.ts +60 -1
- package/src/cmd/coder/update.ts +18 -1
- package/src/cmd/coder/workspace/create.ts +20 -2
- package/src/cmd/coder/workspace/list.ts +2 -2
- 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,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple formatter for schema code strings.
|
|
3
|
-
* Adds basic indentation and line breaks for readability.
|
|
4
|
-
*/
|
|
5
|
-
export function formatSchemaCode(code: string): string {
|
|
6
|
-
if (!code) return code;
|
|
7
|
-
|
|
8
|
-
let indentLevel = 0;
|
|
9
|
-
const indentSize = 2;
|
|
10
|
-
const lines: string[] = [];
|
|
11
|
-
let currentLine = '';
|
|
12
|
-
|
|
13
|
-
for (let i = 0; i < code.length; i++) {
|
|
14
|
-
const char = code[i];
|
|
15
|
-
const nextChar = code[i + 1];
|
|
16
|
-
const prevChar = i > 0 ? code[i - 1] : '';
|
|
17
|
-
|
|
18
|
-
// Skip existing whitespace/newlines
|
|
19
|
-
if (char === '\n' || char === '\r' || (char === ' ' && prevChar === ' ')) {
|
|
20
|
-
continue;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Handle opening braces
|
|
24
|
-
if (char === '{') {
|
|
25
|
-
currentLine += char;
|
|
26
|
-
lines.push(' '.repeat(indentLevel * indentSize) + currentLine.trim());
|
|
27
|
-
indentLevel++;
|
|
28
|
-
currentLine = '';
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Handle closing braces
|
|
33
|
-
if (char === '}') {
|
|
34
|
-
if (currentLine.trim()) {
|
|
35
|
-
lines.push(' '.repeat(indentLevel * indentSize) + currentLine.trim());
|
|
36
|
-
currentLine = '';
|
|
37
|
-
}
|
|
38
|
-
indentLevel--;
|
|
39
|
-
// Check if next char is closing paren - if so, put on same line
|
|
40
|
-
if (nextChar === ')') {
|
|
41
|
-
currentLine = '}';
|
|
42
|
-
} else {
|
|
43
|
-
lines.push(' '.repeat(indentLevel * indentSize) + char);
|
|
44
|
-
}
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Handle commas - add line break after
|
|
49
|
-
if (char === ',') {
|
|
50
|
-
currentLine += char;
|
|
51
|
-
lines.push(' '.repeat(indentLevel * indentSize) + currentLine.trim());
|
|
52
|
-
currentLine = '';
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Accumulate characters
|
|
57
|
-
currentLine += char;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Add any remaining content
|
|
61
|
-
if (currentLine.trim()) {
|
|
62
|
-
lines.push(' '.repeat(indentLevel * indentSize) + currentLine.trim());
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return lines.join('\n');
|
|
66
|
-
}
|
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Discovery — import-based
|
|
3
|
-
*
|
|
4
|
-
* Discovers agents by scanning src/agent/**\/*.ts files and importing them
|
|
5
|
-
* at build time. The agent instance already knows its own metadata, schemas,
|
|
6
|
-
* and evals — no AST parsing needed.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { dirname, join, relative } from 'node:path';
|
|
10
|
-
import type { Logger } from '../../../types';
|
|
11
|
-
import { StructuredError } from '@agentuity/core';
|
|
12
|
-
import { toForwardSlash } from '../../../utils/normalize-path';
|
|
13
|
-
|
|
14
|
-
const DuplicateEvalNameError = StructuredError('DuplicateEvalNameError')<{
|
|
15
|
-
agent: string;
|
|
16
|
-
filename: string;
|
|
17
|
-
}>();
|
|
18
|
-
|
|
19
|
-
export interface AgentMetadata {
|
|
20
|
-
filename: string;
|
|
21
|
-
name: string;
|
|
22
|
-
id: string;
|
|
23
|
-
agentId: string;
|
|
24
|
-
version: string;
|
|
25
|
-
description?: string;
|
|
26
|
-
inputSchemaCode?: string;
|
|
27
|
-
outputSchemaCode?: string;
|
|
28
|
-
evals?: EvalMetadata[];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface EvalMetadata {
|
|
32
|
-
id: string;
|
|
33
|
-
identifier: string;
|
|
34
|
-
name: string;
|
|
35
|
-
filename: string;
|
|
36
|
-
version: string;
|
|
37
|
-
description?: string;
|
|
38
|
-
agentIdentifier: string;
|
|
39
|
-
projectId: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Hash function for generating stable IDs
|
|
44
|
-
*/
|
|
45
|
-
function hash(...val: string[]): string {
|
|
46
|
-
const hasher = new Bun.CryptoHasher('sha256');
|
|
47
|
-
for (const v of val) hasher.update(v);
|
|
48
|
-
return hasher.digest().toHex();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function hashSHA1(...val: string[]): string {
|
|
52
|
-
const hasher = new Bun.CryptoHasher('sha1');
|
|
53
|
-
for (const v of val) hasher.update(v);
|
|
54
|
-
return hasher.digest().toHex();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function getAgentId(
|
|
58
|
-
projectId: string,
|
|
59
|
-
deploymentId: string,
|
|
60
|
-
filename: string,
|
|
61
|
-
version: string
|
|
62
|
-
): string {
|
|
63
|
-
return `agentid_${hashSHA1(projectId, deploymentId, filename, version)}`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function generateStableAgentId(projectId: string, name: string): string {
|
|
67
|
-
return `agent_${hashSHA1(projectId, name)}`.substring(0, 64);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function getEvalId(
|
|
71
|
-
projectId: string,
|
|
72
|
-
deploymentId: string,
|
|
73
|
-
filename: string,
|
|
74
|
-
name: string,
|
|
75
|
-
version: string
|
|
76
|
-
): string {
|
|
77
|
-
return `evalid_${hashSHA1(projectId, deploymentId, filename, name, version)}`;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function generateStableEvalId(projectId: string, agentId: string, name: string): string {
|
|
81
|
-
return `eval_${hashSHA1(projectId, agentId, name)}`.substring(0, 64);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Convert a StandardSchemaV1-compatible schema to a JSON Schema string.
|
|
86
|
-
* Dynamically imports toJSONSchema from @agentuity/schema (available in user's project).
|
|
87
|
-
*/
|
|
88
|
-
async function schemaToJsonString(
|
|
89
|
-
schema: unknown,
|
|
90
|
-
rootDir: string,
|
|
91
|
-
logger: Logger
|
|
92
|
-
): Promise<string | undefined> {
|
|
93
|
-
if (!schema) return undefined;
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
// Resolve @agentuity/schema from the user's project and import its public entry point.
|
|
97
|
-
// The CLI doesn't declare @agentuity/schema as its own dependency — it lives in the
|
|
98
|
-
// user's node_modules, so we resolve the path dynamically.
|
|
99
|
-
const schemaPackageDir = join(rootDir, 'node_modules', '@agentuity', 'schema');
|
|
100
|
-
if (!(await Bun.file(join(schemaPackageDir, 'package.json')).exists())) {
|
|
101
|
-
logger.debug('[agent-discovery] @agentuity/schema not found in user project');
|
|
102
|
-
return undefined;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const { toJSONSchema } = await import(schemaPackageDir);
|
|
106
|
-
const jsonSchema = toJSONSchema(schema);
|
|
107
|
-
return JSON.stringify(jsonSchema);
|
|
108
|
-
} catch (error) {
|
|
109
|
-
logger.debug(
|
|
110
|
-
'[agent-discovery] Failed to convert schema to JSON Schema: %s',
|
|
111
|
-
error instanceof Error ? error.message : String(error)
|
|
112
|
-
);
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Import an agent file and extract metadata from the agent instance.
|
|
119
|
-
*/
|
|
120
|
-
async function importAgentMetadata(
|
|
121
|
-
filePath: string,
|
|
122
|
-
relativeFilename: string,
|
|
123
|
-
rootDir: string,
|
|
124
|
-
projectId: string,
|
|
125
|
-
deploymentId: string,
|
|
126
|
-
logger: Logger
|
|
127
|
-
): Promise<AgentMetadata | null> {
|
|
128
|
-
try {
|
|
129
|
-
const source = await Bun.file(filePath).text();
|
|
130
|
-
const version = hash(source);
|
|
131
|
-
|
|
132
|
-
// Import the agent file — Bun handles TS natively
|
|
133
|
-
// No source-level gate: files may re-export agents created elsewhere
|
|
134
|
-
const mod = await import(filePath);
|
|
135
|
-
const agent = mod.default;
|
|
136
|
-
|
|
137
|
-
if (!agent?.metadata?.name) {
|
|
138
|
-
logger.debug('[agent-discovery] No valid agent found in %s', relativeFilename);
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const name = agent.metadata.name;
|
|
143
|
-
const description = agent.metadata.description;
|
|
144
|
-
const id = getAgentId(projectId, deploymentId, relativeFilename, version);
|
|
145
|
-
const agentId = generateStableAgentId(projectId, name);
|
|
146
|
-
|
|
147
|
-
// Extract schemas as JSON Schema strings
|
|
148
|
-
const inputSchemaCode = await schemaToJsonString(agent.inputSchema, rootDir, logger);
|
|
149
|
-
const outputSchemaCode = await schemaToJsonString(agent.outputSchema, rootDir, logger);
|
|
150
|
-
|
|
151
|
-
// Extract evals from agent.evals array (self-registered by createEval())
|
|
152
|
-
const evals: EvalMetadata[] = [];
|
|
153
|
-
if (agent.evals && Array.isArray(agent.evals) && agent.evals.length > 0) {
|
|
154
|
-
for (const evalItem of agent.evals) {
|
|
155
|
-
const evalName = evalItem.metadata?.name ?? evalItem.name;
|
|
156
|
-
if (!evalName) continue;
|
|
157
|
-
|
|
158
|
-
const evalDescription = evalItem.metadata?.description ?? evalItem.description;
|
|
159
|
-
const evalVersion = version; // same file version
|
|
160
|
-
const evalId = getEvalId(
|
|
161
|
-
projectId,
|
|
162
|
-
deploymentId,
|
|
163
|
-
relativeFilename,
|
|
164
|
-
evalName,
|
|
165
|
-
evalVersion
|
|
166
|
-
);
|
|
167
|
-
const evalIdentifier = generateStableEvalId(projectId, agentId, evalName);
|
|
168
|
-
|
|
169
|
-
logger.trace(
|
|
170
|
-
'Found eval "%s" in %s (identifier: %s)',
|
|
171
|
-
evalName,
|
|
172
|
-
relativeFilename,
|
|
173
|
-
evalIdentifier
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
evals.push({
|
|
177
|
-
id: evalId,
|
|
178
|
-
identifier: evalIdentifier,
|
|
179
|
-
name: evalName,
|
|
180
|
-
filename: relativeFilename,
|
|
181
|
-
version: evalVersion,
|
|
182
|
-
description: evalDescription,
|
|
183
|
-
agentIdentifier: agentId,
|
|
184
|
-
projectId,
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Also check for evals in separate eval.ts file in same directory
|
|
190
|
-
const agentDir = dirname(filePath);
|
|
191
|
-
const evalsPath = join(agentDir, 'eval.ts');
|
|
192
|
-
if (await Bun.file(evalsPath).exists()) {
|
|
193
|
-
const evalsSource = await Bun.file(evalsPath).text();
|
|
194
|
-
if (evalsSource.includes('createEval')) {
|
|
195
|
-
try {
|
|
196
|
-
await import(evalsPath);
|
|
197
|
-
// After importing, the evals self-register on the agent via agent.createEval()
|
|
198
|
-
// Re-check agent.evals for any newly registered evals
|
|
199
|
-
if (agent.evals && Array.isArray(agent.evals)) {
|
|
200
|
-
const relativeEvalsPath = toForwardSlash(relative(join(rootDir), evalsPath));
|
|
201
|
-
const evalVersion = hash(evalsSource);
|
|
202
|
-
|
|
203
|
-
for (const evalItem of agent.evals) {
|
|
204
|
-
const evalName = evalItem.metadata?.name ?? evalItem.name;
|
|
205
|
-
if (!evalName) continue;
|
|
206
|
-
|
|
207
|
-
// Skip if already collected from agent file
|
|
208
|
-
if (evals.some((e) => e.name === evalName)) continue;
|
|
209
|
-
|
|
210
|
-
const evalDescription = evalItem.metadata?.description ?? evalItem.description;
|
|
211
|
-
const evalId = getEvalId(
|
|
212
|
-
projectId,
|
|
213
|
-
deploymentId,
|
|
214
|
-
relativeEvalsPath,
|
|
215
|
-
evalName,
|
|
216
|
-
evalVersion
|
|
217
|
-
);
|
|
218
|
-
const evalIdentifier = generateStableEvalId(projectId, agentId, evalName);
|
|
219
|
-
|
|
220
|
-
logger.trace(
|
|
221
|
-
'Found eval "%s" in eval.ts for agent %s (identifier: %s)',
|
|
222
|
-
evalName,
|
|
223
|
-
name,
|
|
224
|
-
evalIdentifier
|
|
225
|
-
);
|
|
226
|
-
|
|
227
|
-
evals.push({
|
|
228
|
-
id: evalId,
|
|
229
|
-
identifier: evalIdentifier,
|
|
230
|
-
name: evalName,
|
|
231
|
-
filename: relativeEvalsPath,
|
|
232
|
-
version: evalVersion,
|
|
233
|
-
description: evalDescription,
|
|
234
|
-
agentIdentifier: agentId,
|
|
235
|
-
projectId,
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
} catch (error) {
|
|
240
|
-
logger.warn(
|
|
241
|
-
'[agent-discovery] Failed to import evals from %s: %s',
|
|
242
|
-
evalsPath,
|
|
243
|
-
error instanceof Error ? error.message : String(error)
|
|
244
|
-
);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Check for duplicate eval names across sources (agent file + eval.ts).
|
|
250
|
-
// Same name + same agent = same stable identifier → duplicate key error
|
|
251
|
-
// on the backend database.
|
|
252
|
-
if (evals.length > 1) {
|
|
253
|
-
const seen = new Map<string, string>();
|
|
254
|
-
for (const evalItem of evals) {
|
|
255
|
-
const prev = seen.get(evalItem.name);
|
|
256
|
-
if (prev && prev !== evalItem.filename) {
|
|
257
|
-
throw new DuplicateEvalNameError({
|
|
258
|
-
message:
|
|
259
|
-
`Duplicate eval name '${evalItem.name}' for agent '${name}': ` +
|
|
260
|
-
`defined in both '${prev}' and '${evalItem.filename}'. ` +
|
|
261
|
-
'Eval names must be unique per agent.',
|
|
262
|
-
agent: name,
|
|
263
|
-
filename: evalItem.filename,
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
seen.set(evalItem.name, evalItem.filename);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
return {
|
|
271
|
-
filename: relativeFilename,
|
|
272
|
-
name,
|
|
273
|
-
id,
|
|
274
|
-
agentId,
|
|
275
|
-
version,
|
|
276
|
-
description,
|
|
277
|
-
inputSchemaCode,
|
|
278
|
-
outputSchemaCode,
|
|
279
|
-
evals: evals.length > 0 ? evals : undefined,
|
|
280
|
-
};
|
|
281
|
-
} catch (error) {
|
|
282
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
283
|
-
throw new Error(
|
|
284
|
-
`Failed to import agent at ${relativeFilename}:\n` +
|
|
285
|
-
` ${errorMsg}\n\n` +
|
|
286
|
-
`Agent files are imported at build time to extract metadata. Code that ` +
|
|
287
|
-
`runs at module scope (outside of setup() or handler()) will execute ` +
|
|
288
|
-
`during the build — including SDK client constructors that require API ` +
|
|
289
|
-
`keys or environment variables.\n\n` +
|
|
290
|
-
`To fix this, move initialization code into setup() or handler():\n\n` +
|
|
291
|
-
` // ❌ Don't do this — runs at import time:\n` +
|
|
292
|
-
` const client = new OpenAI();\n` +
|
|
293
|
-
` export default createAgent('my-agent', { handler: async (ctx) => { ... } });\n\n` +
|
|
294
|
-
` // ✅ Do this instead — runs at request time:\n` +
|
|
295
|
-
` export default createAgent('my-agent', {\n` +
|
|
296
|
-
` setup: (ctx) => ({ client: new OpenAI() }),\n` +
|
|
297
|
-
` handler: async (ctx) => { const { client } = ctx.setup; ... },\n` +
|
|
298
|
-
` });\n\n` +
|
|
299
|
-
`See https://agentuity.dev/docs/agents#setup for more information.`
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Discover all agents in src/agent directory.
|
|
306
|
-
*
|
|
307
|
-
* Imports each agent file at build time — the agent instance already knows
|
|
308
|
-
* its own metadata, schemas, and evals. No AST parsing needed.
|
|
309
|
-
*/
|
|
310
|
-
export async function discoverAgents(
|
|
311
|
-
srcDir: string,
|
|
312
|
-
projectId: string,
|
|
313
|
-
deploymentId: string,
|
|
314
|
-
logger: Logger
|
|
315
|
-
): Promise<AgentMetadata[]> {
|
|
316
|
-
const agentsDir = join(srcDir, 'agent');
|
|
317
|
-
const agents: AgentMetadata[] = [];
|
|
318
|
-
const rootDir = join(srcDir, '..');
|
|
319
|
-
|
|
320
|
-
// Scan all .ts files in agent directory
|
|
321
|
-
const glob = new Bun.Glob('**/*.ts');
|
|
322
|
-
let files: string[];
|
|
323
|
-
try {
|
|
324
|
-
files = await Array.fromAsync(glob.scan(agentsDir));
|
|
325
|
-
} catch {
|
|
326
|
-
logger.trace('No agent directory found at %s', agentsDir);
|
|
327
|
-
return agents;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// Track seen agent names to deduplicate — e.g., index.ts re-exporting agent.ts
|
|
331
|
-
const seenAgentNames = new Set<string>();
|
|
332
|
-
|
|
333
|
-
for (const file of files) {
|
|
334
|
-
const filePath = join(agentsDir, file);
|
|
335
|
-
|
|
336
|
-
// Skip eval.ts files (processed as part of agent discovery)
|
|
337
|
-
if (file.endsWith('/eval.ts') || file === 'eval.ts') {
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// Skip test files (*.test.ts, *.spec.ts) and test directories
|
|
342
|
-
if (
|
|
343
|
-
file.startsWith('test/') ||
|
|
344
|
-
file.includes('/test/') ||
|
|
345
|
-
file.startsWith('__tests__/') ||
|
|
346
|
-
file.includes('/__tests__/') ||
|
|
347
|
-
file.endsWith('.test.ts') ||
|
|
348
|
-
file.endsWith('.spec.ts')
|
|
349
|
-
) {
|
|
350
|
-
continue;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
const relativeFilename = toForwardSlash(relative(rootDir, filePath));
|
|
354
|
-
const agentMetadata = await importAgentMetadata(
|
|
355
|
-
filePath,
|
|
356
|
-
relativeFilename,
|
|
357
|
-
rootDir,
|
|
358
|
-
projectId,
|
|
359
|
-
deploymentId,
|
|
360
|
-
logger
|
|
361
|
-
);
|
|
362
|
-
|
|
363
|
-
if (agentMetadata) {
|
|
364
|
-
if (seenAgentNames.has(agentMetadata.name)) {
|
|
365
|
-
logger.trace(
|
|
366
|
-
'Skipping duplicate agent %s from %s (already discovered)',
|
|
367
|
-
agentMetadata.name,
|
|
368
|
-
relativeFilename
|
|
369
|
-
);
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
seenAgentNames.add(agentMetadata.name);
|
|
373
|
-
logger.trace('Discovered agent: %s at %s', agentMetadata.name, relativeFilename);
|
|
374
|
-
agents.push(agentMetadata);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
logger.debug('Discovered %d agent(s)', agents.length);
|
|
379
|
-
return agents;
|
|
380
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vite plugin to emit the analytics beacon as a hashed CDN asset
|
|
3
|
-
*
|
|
4
|
-
* This plugin:
|
|
5
|
-
* 1. Reads the pre-built beacon from @agentuity/frontend
|
|
6
|
-
* 2. Emits it as a Rollup asset with content-based hashing
|
|
7
|
-
* 3. Injects a <script data-agentuity-beacon> tag into the HTML
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { Plugin, ResolvedConfig } from 'vite';
|
|
11
|
-
import { join } from 'node:path';
|
|
12
|
-
import { createRequire } from 'node:module';
|
|
13
|
-
|
|
14
|
-
export interface BeaconPluginOptions {
|
|
15
|
-
/** Whether analytics is enabled */
|
|
16
|
-
enabled: boolean;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Read the pre-built beacon script from @agentuity/frontend package
|
|
21
|
-
* @param projectRoot - The root directory of the project (for resolving node_modules)
|
|
22
|
-
*/
|
|
23
|
-
async function readBeaconScript(projectRoot: string): Promise<string> {
|
|
24
|
-
let frontendPath: string | null = null;
|
|
25
|
-
|
|
26
|
-
// Strategy 1: Use Bun.resolve (works with workspaces and symlinks)
|
|
27
|
-
try {
|
|
28
|
-
frontendPath = await Bun.resolve('@agentuity/frontend', projectRoot);
|
|
29
|
-
} catch {
|
|
30
|
-
// Not found from project root
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Strategy 2: Try from this file's directory (for installed CLI case)
|
|
34
|
-
if (!frontendPath) {
|
|
35
|
-
try {
|
|
36
|
-
const thisDir = new URL('.', import.meta.url).pathname;
|
|
37
|
-
frontendPath = await Bun.resolve('@agentuity/frontend', thisDir);
|
|
38
|
-
} catch {
|
|
39
|
-
// Not found from CLI directory
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Strategy 3: Fallback to createRequire for Node.js compatibility
|
|
44
|
-
if (!frontendPath) {
|
|
45
|
-
try {
|
|
46
|
-
const projectRequire = createRequire(join(projectRoot, 'package.json'));
|
|
47
|
-
frontendPath = projectRequire.resolve('@agentuity/frontend');
|
|
48
|
-
} catch {
|
|
49
|
-
// Not found via createRequire
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (!frontendPath) {
|
|
54
|
-
throw new Error(
|
|
55
|
-
'Could not resolve @agentuity/frontend. Ensure the package is installed and built.'
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// The beacon.js file is in the dist folder of @agentuity/frontend
|
|
60
|
-
// frontendPath points to dist/index.js, so we go up one level
|
|
61
|
-
const packageDir = join(frontendPath, '..');
|
|
62
|
-
const beaconPath = join(packageDir, 'beacon.js');
|
|
63
|
-
|
|
64
|
-
const beaconFile = Bun.file(beaconPath);
|
|
65
|
-
if (!(await beaconFile.exists())) {
|
|
66
|
-
throw new Error(
|
|
67
|
-
`Beacon script not found at ${beaconPath}. Run "bun run build" in @agentuity/frontend first.`
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return beaconFile.text();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Vite plugin that emits the analytics beacon as a hashed asset
|
|
76
|
-
* and injects a script tag into the HTML
|
|
77
|
-
*/
|
|
78
|
-
export function beaconPlugin(options: BeaconPluginOptions): Plugin {
|
|
79
|
-
const { enabled } = options;
|
|
80
|
-
|
|
81
|
-
let resolvedConfig: ResolvedConfig | null = null;
|
|
82
|
-
let beaconReferenceId: string | null = null;
|
|
83
|
-
|
|
84
|
-
return {
|
|
85
|
-
name: 'agentuity:beacon',
|
|
86
|
-
apply: 'build',
|
|
87
|
-
|
|
88
|
-
configResolved(config) {
|
|
89
|
-
resolvedConfig = config;
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
async buildStart() {
|
|
93
|
-
if (!enabled) return;
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
// Get project root from Vite config
|
|
97
|
-
const projectRoot = resolvedConfig?.root || process.cwd();
|
|
98
|
-
const beaconCode = await readBeaconScript(projectRoot);
|
|
99
|
-
|
|
100
|
-
// Emit the beacon as an asset - Rollup will hash it
|
|
101
|
-
beaconReferenceId = this.emitFile({
|
|
102
|
-
type: 'asset',
|
|
103
|
-
name: 'agentuity-beacon.js',
|
|
104
|
-
source: beaconCode,
|
|
105
|
-
});
|
|
106
|
-
} catch (error) {
|
|
107
|
-
this.error(
|
|
108
|
-
`Failed to read beacon script: ${error instanceof Error ? error.message : String(error)}`
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
},
|
|
112
|
-
|
|
113
|
-
// Use transformIndexHtml hook to modify the HTML
|
|
114
|
-
// This is called during the HTML transformation phase and works with Vite's HTML pipeline
|
|
115
|
-
transformIndexHtml: {
|
|
116
|
-
order: 'post',
|
|
117
|
-
handler(html, ctx) {
|
|
118
|
-
if (!enabled || !beaconReferenceId) return html;
|
|
119
|
-
|
|
120
|
-
// Get the final hashed filename using the bundle from the context
|
|
121
|
-
// We need to use ctx.bundle to access the emitted file
|
|
122
|
-
const bundle = ctx.bundle;
|
|
123
|
-
if (!bundle) return html;
|
|
124
|
-
|
|
125
|
-
// Find our beacon asset in the bundle
|
|
126
|
-
let beaconFileName: string | null = null;
|
|
127
|
-
for (const fileName of Object.keys(bundle)) {
|
|
128
|
-
if (fileName.includes('agentuity-beacon') && fileName.endsWith('.js')) {
|
|
129
|
-
beaconFileName = fileName;
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (!beaconFileName) return html;
|
|
135
|
-
|
|
136
|
-
// Build the beacon URL using Vite's configured base (respects CDN URL)
|
|
137
|
-
// resolvedConfig.base is e.g., "https://cdn.agentuity.com/{deploymentId}/client/" or "/"
|
|
138
|
-
const base = resolvedConfig?.base || '/';
|
|
139
|
-
// Normalize: ensure base ends with / and beaconFileName doesn't start with /
|
|
140
|
-
const normalizedBase = base.endsWith('/') ? base : `${base}/`;
|
|
141
|
-
const normalizedFileName = beaconFileName.startsWith('/')
|
|
142
|
-
? beaconFileName.slice(1)
|
|
143
|
-
: beaconFileName;
|
|
144
|
-
const beaconUrl = `${normalizedBase}${normalizedFileName}`;
|
|
145
|
-
|
|
146
|
-
// Inject a marker script tag
|
|
147
|
-
// The script must be sync (no async/defer) to patch history API before router loads
|
|
148
|
-
// Use data-agentuity-beacon attribute as a marker for config/session injection
|
|
149
|
-
const beaconScript = `<script data-agentuity-beacon src="${beaconUrl}"></script>`;
|
|
150
|
-
|
|
151
|
-
// Inject before </head>
|
|
152
|
-
if (html.includes('</head>')) {
|
|
153
|
-
return html.replace('</head>', `${beaconScript}</head>`);
|
|
154
|
-
}
|
|
155
|
-
// Fallback: inject at start of body
|
|
156
|
-
if (html.includes('<body')) {
|
|
157
|
-
return html.replace(/<body([^>]*)>/, `<body$1>${beaconScript}`);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return beaconScript + html;
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Vite plugin to shim process.env for browser code only
|
|
3
|
-
*
|
|
4
|
-
* Replaces process.env with import.meta.env ONLY in files under src/web
|
|
5
|
-
* to avoid breaking server-side code that needs real process.env
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { Plugin } from 'vite';
|
|
9
|
-
|
|
10
|
-
export function browserEnvPlugin(): Plugin {
|
|
11
|
-
return {
|
|
12
|
-
name: 'agentuity:browser-env',
|
|
13
|
-
enforce: 'pre',
|
|
14
|
-
|
|
15
|
-
transform(code, id) {
|
|
16
|
-
// Only transform files in src/web (browser code)
|
|
17
|
-
if (!id.includes('/src/web/') && !id.includes('\\src\\web\\')) {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Replace process.env with import.meta.env for browser compatibility
|
|
22
|
-
const transformed = code.replace(/process\.env/g, 'import.meta.env');
|
|
23
|
-
|
|
24
|
-
if (transformed !== code) {
|
|
25
|
-
return {
|
|
26
|
-
code: transformed,
|
|
27
|
-
map: null,
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return null;
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
}
|