@agentuity/cli 0.0.95 → 0.0.96
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/AGENTS.md +54 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +8 -5
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +190 -27
- package/dist/cli.js.map +1 -1
- package/dist/cmd/build/entry-generator.d.ts +20 -0
- package/dist/cmd/build/entry-generator.d.ts.map +1 -0
- package/dist/cmd/build/entry-generator.js +366 -0
- package/dist/cmd/build/entry-generator.js.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +5 -23
- package/dist/cmd/build/index.js.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.d.ts +33 -0
- package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -0
- package/dist/cmd/build/vite/agent-discovery.js +297 -0
- package/dist/cmd/build/vite/agent-discovery.js.map +1 -0
- package/dist/cmd/build/vite/browser-env-plugin.d.ts +9 -0
- package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +1 -0
- package/dist/cmd/build/vite/browser-env-plugin.js +28 -0
- package/dist/cmd/build/vite/browser-env-plugin.js.map +1 -0
- package/dist/cmd/build/vite/bun-dev-server.d.ts +29 -0
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -0
- package/dist/cmd/build/vite/bun-dev-server.js +54 -0
- package/dist/cmd/build/vite/bun-dev-server.js.map +1 -0
- package/dist/cmd/build/vite/config-loader.d.ts +23 -0
- package/dist/cmd/build/vite/config-loader.d.ts.map +1 -0
- package/dist/cmd/build/vite/config-loader.js +50 -0
- package/dist/cmd/build/vite/config-loader.js.map +1 -0
- package/dist/cmd/build/vite/index.d.ts +26 -0
- package/dist/cmd/build/vite/index.d.ts.map +1 -0
- package/dist/cmd/build/vite/index.js +127 -0
- package/dist/cmd/build/vite/index.js.map +1 -0
- package/dist/cmd/build/vite/lifecycle-generator.d.ts +11 -0
- package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/lifecycle-generator.js +35 -0
- package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -0
- package/dist/cmd/build/vite/metadata-generator.d.ts +32 -0
- package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/metadata-generator.js +489 -0
- package/dist/cmd/build/vite/metadata-generator.js.map +1 -0
- package/dist/cmd/build/vite/patch-plugin.d.ts +21 -0
- package/dist/cmd/build/vite/patch-plugin.d.ts.map +1 -0
- package/dist/cmd/build/vite/patch-plugin.js +70 -0
- package/dist/cmd/build/vite/patch-plugin.js.map +1 -0
- package/dist/cmd/build/vite/registry-generator.d.ts +19 -0
- package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -0
- package/dist/cmd/build/{route-registry.js → vite/registry-generator.js} +126 -48
- package/dist/cmd/build/vite/registry-generator.js.map +1 -0
- package/dist/cmd/build/vite/route-discovery.d.ts +58 -0
- package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -0
- package/dist/cmd/build/vite/route-discovery.js +125 -0
- package/dist/cmd/build/vite/route-discovery.js.map +1 -0
- package/dist/cmd/build/vite/server-bundler.d.ts +16 -0
- package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -0
- package/dist/cmd/build/vite/server-bundler.js +194 -0
- package/dist/cmd/build/vite/server-bundler.js.map +1 -0
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts +19 -0
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -0
- package/dist/cmd/build/vite/vite-asset-server-config.js +105 -0
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -0
- package/dist/cmd/build/vite/vite-asset-server.d.ts +23 -0
- package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -0
- package/dist/cmd/build/vite/vite-asset-server.js +40 -0
- package/dist/cmd/build/vite/vite-asset-server.js.map +1 -0
- package/dist/cmd/build/vite/vite-builder.d.ts +44 -0
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -0
- package/dist/cmd/build/vite/vite-builder.js +232 -0
- package/dist/cmd/build/vite/vite-builder.js.map +1 -0
- package/dist/cmd/build/vite/workbench-generator.d.ts +10 -0
- package/dist/cmd/build/vite/workbench-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/workbench-generator.js +135 -0
- package/dist/cmd/build/vite/workbench-generator.js.map +1 -0
- package/dist/cmd/build/vite-bundler.d.ts +23 -0
- package/dist/cmd/build/vite-bundler.d.ts.map +1 -0
- package/dist/cmd/build/vite-bundler.js +79 -0
- package/dist/cmd/build/vite-bundler.js.map +1 -0
- package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
- package/dist/cmd/cloud/agent/get.js +1 -0
- package/dist/cmd/cloud/agent/get.js.map +1 -1
- package/dist/cmd/cloud/agent/list.d.ts.map +1 -1
- package/dist/cmd/cloud/agent/list.js +1 -0
- package/dist/cmd/cloud/agent/list.js.map +1 -1
- package/dist/cmd/cloud/db/get.d.ts.map +1 -1
- package/dist/cmd/cloud/db/get.js +1 -0
- package/dist/cmd/cloud/db/get.js.map +1 -1
- package/dist/cmd/cloud/db/list.d.ts.map +1 -1
- package/dist/cmd/cloud/db/list.js +1 -0
- package/dist/cmd/cloud/db/list.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +152 -128
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
- package/dist/cmd/cloud/deployment/list.js +4 -0
- package/dist/cmd/cloud/deployment/list.js.map +1 -1
- package/dist/cmd/cloud/env/list.d.ts.map +1 -1
- package/dist/cmd/cloud/env/list.js +1 -0
- package/dist/cmd/cloud/env/list.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/get.js +1 -0
- package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/keys.js +1 -0
- package/dist/cmd/cloud/keyvalue/keys.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/list-namespaces.js +1 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/stats.js +1 -0
- package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
- package/dist/cmd/cloud/secret/list.d.ts.map +1 -1
- package/dist/cmd/cloud/secret/list.js +1 -0
- package/dist/cmd/cloud/secret/list.js.map +1 -1
- package/dist/cmd/cloud/session/list.d.ts.map +1 -1
- package/dist/cmd/cloud/session/list.js +4 -0
- package/dist/cmd/cloud/session/list.js.map +1 -1
- package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/get.js +1 -0
- package/dist/cmd/cloud/storage/get.js.map +1 -1
- package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
- package/dist/cmd/cloud/storage/list.js +3 -0
- package/dist/cmd/cloud/storage/list.js.map +1 -1
- package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
- package/dist/cmd/cloud/stream/get.js +1 -0
- package/dist/cmd/cloud/stream/get.js.map +1 -1
- package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
- package/dist/cmd/cloud/stream/list.js +1 -0
- package/dist/cmd/cloud/stream/list.js.map +1 -1
- package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/get.js +1 -0
- package/dist/cmd/cloud/vector/get.js.map +1 -1
- package/dist/cmd/cloud/vector/search.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/search.js +1 -0
- package/dist/cmd/cloud/vector/search.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +289 -758
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/dev/sync.d.ts +1 -1
- package/dist/cmd/dev/sync.d.ts.map +1 -1
- package/dist/cmd/dev/sync.js +3 -0
- package/dist/cmd/dev/sync.js.map +1 -1
- package/dist/cmd/profile/show.d.ts.map +1 -1
- package/dist/cmd/profile/show.js +3 -4
- package/dist/cmd/profile/show.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +3 -4
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/list.d.ts.map +1 -1
- package/dist/cmd/project/list.js +1 -0
- package/dist/cmd/project/list.js.map +1 -1
- package/dist/cmd/project/show.d.ts.map +1 -1
- package/dist/cmd/project/show.js +1 -0
- package/dist/cmd/project/show.js.map +1 -1
- package/dist/cmd/upgrade/index.d.ts.map +1 -1
- package/dist/cmd/upgrade/index.js +5 -3
- package/dist/cmd/upgrade/index.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -11
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime-bootstrap.d.ts +3 -2
- package/dist/runtime-bootstrap.d.ts.map +1 -1
- package/dist/runtime-bootstrap.js +7 -2
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/schemas/deploy.d.ts +1 -1
- package/dist/types.d.ts +40 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/bun-version-checker.d.ts +11 -0
- package/dist/utils/bun-version-checker.d.ts.map +1 -0
- package/dist/utils/bun-version-checker.js +56 -0
- package/dist/utils/bun-version-checker.js.map +1 -0
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +5 -2
- package/dist/version-check.js.map +1 -1
- package/package.json +10 -3
- package/src/auth.ts +9 -5
- package/src/cli.ts +228 -29
- package/src/cmd/build/entry-generator.ts +404 -0
- package/src/cmd/build/index.ts +7 -28
- package/src/cmd/build/vite/agent-discovery.ts +467 -0
- package/src/cmd/build/vite/browser-env-plugin.ts +34 -0
- package/src/cmd/build/vite/bun-dev-server.ts +78 -0
- package/src/cmd/build/vite/config-loader.ts +70 -0
- package/src/cmd/build/vite/index.ts +166 -0
- package/src/cmd/build/vite/lifecycle-generator.ts +43 -0
- package/src/cmd/build/vite/metadata-generator.ts +602 -0
- package/src/cmd/build/vite/patch-plugin.ts +88 -0
- package/src/cmd/build/vite/registry-generator.ts +288 -0
- package/src/cmd/build/vite/route-discovery.ts +186 -0
- package/src/cmd/build/vite/server-bundler.ts +258 -0
- package/src/cmd/build/vite/vite-asset-server-config.ts +134 -0
- package/src/cmd/build/vite/vite-asset-server.ts +63 -0
- package/src/cmd/build/vite/vite-builder.ts +284 -0
- package/src/cmd/build/vite/workbench-generator.ts +152 -0
- package/src/cmd/build/vite-bundler.ts +110 -0
- package/src/cmd/cloud/agent/get.ts +2 -0
- package/src/cmd/cloud/agent/list.ts +1 -0
- package/src/cmd/cloud/db/get.ts +1 -0
- package/src/cmd/cloud/db/list.ts +1 -0
- package/src/cmd/cloud/deploy.ts +175 -144
- package/src/cmd/cloud/deployment/list.ts +4 -0
- package/src/cmd/cloud/env/list.ts +1 -0
- package/src/cmd/cloud/keyvalue/get.ts +1 -0
- package/src/cmd/cloud/keyvalue/keys.ts +1 -0
- package/src/cmd/cloud/keyvalue/list-namespaces.ts +1 -0
- package/src/cmd/cloud/keyvalue/stats.ts +2 -0
- package/src/cmd/cloud/secret/list.ts +1 -0
- package/src/cmd/cloud/session/list.ts +4 -0
- package/src/cmd/cloud/storage/get.ts +1 -0
- package/src/cmd/cloud/storage/list.ts +4 -0
- package/src/cmd/cloud/stream/get.ts +1 -0
- package/src/cmd/cloud/stream/list.ts +1 -0
- package/src/cmd/cloud/vector/get.ts +1 -0
- package/src/cmd/cloud/vector/search.ts +1 -0
- package/src/cmd/dev/index.ts +319 -921
- package/src/cmd/dev/sync.ts +5 -1
- package/src/cmd/profile/show.ts +3 -4
- package/src/cmd/project/create.ts +3 -4
- package/src/cmd/project/list.ts +1 -0
- package/src/cmd/project/show.ts +1 -0
- package/src/cmd/upgrade/index.ts +6 -3
- package/src/config.ts +31 -11
- package/src/index.ts +2 -0
- package/src/runtime-bootstrap.ts +8 -2
- package/src/types.ts +48 -1
- package/src/utils/bun-version-checker.ts +70 -0
- package/src/version-check.ts +6 -2
- package/dist/cmd/build/bundler.d.ts +0 -28
- package/dist/cmd/build/bundler.d.ts.map +0 -1
- package/dist/cmd/build/bundler.js +0 -800
- package/dist/cmd/build/bundler.js.map +0 -1
- package/dist/cmd/build/config-loader.d.ts +0 -16
- package/dist/cmd/build/config-loader.d.ts.map +0 -1
- package/dist/cmd/build/config-loader.js +0 -227
- package/dist/cmd/build/config-loader.js.map +0 -1
- package/dist/cmd/build/file.d.ts +0 -2
- package/dist/cmd/build/file.d.ts.map +0 -1
- package/dist/cmd/build/file.js +0 -10
- package/dist/cmd/build/file.js.map +0 -1
- package/dist/cmd/build/fix-duplicate-exports.d.ts +0 -2
- package/dist/cmd/build/fix-duplicate-exports.d.ts.map +0 -1
- package/dist/cmd/build/fix-duplicate-exports.js +0 -170
- package/dist/cmd/build/fix-duplicate-exports.js.map +0 -1
- package/dist/cmd/build/plugin.d.ts +0 -6
- package/dist/cmd/build/plugin.d.ts.map +0 -1
- package/dist/cmd/build/plugin.js +0 -645
- package/dist/cmd/build/plugin.js.map +0 -1
- package/dist/cmd/build/route-discovery.d.ts +0 -54
- package/dist/cmd/build/route-discovery.d.ts.map +0 -1
- package/dist/cmd/build/route-discovery.js +0 -148
- package/dist/cmd/build/route-discovery.js.map +0 -1
- package/dist/cmd/build/route-registry.d.ts +0 -38
- package/dist/cmd/build/route-registry.d.ts.map +0 -1
- package/dist/cmd/build/route-registry.js.map +0 -1
- package/src/cmd/build/bundler.ts +0 -965
- package/src/cmd/build/config-loader.ts +0 -268
- package/src/cmd/build/file.ts +0 -10
- package/src/cmd/build/fix-duplicate-exports.ts +0 -207
- package/src/cmd/build/plugin.ts +0 -782
- package/src/cmd/build/route-discovery.ts +0 -202
- package/src/cmd/build/route-registry.ts +0 -222
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server bundler using Bun.build with external dependency management
|
|
3
|
+
* Handles installing externals into .agentuity/node_modules for production
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
8
|
+
import type { Logger } from '../../../types';
|
|
9
|
+
|
|
10
|
+
export interface ServerBundleOptions {
|
|
11
|
+
rootDir: string;
|
|
12
|
+
dev: boolean;
|
|
13
|
+
logger: Logger;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Install external dependencies and build server bundle
|
|
18
|
+
* For production: installs externals into .agentuity/node_modules BEFORE bundling
|
|
19
|
+
*/
|
|
20
|
+
export async function installExternalsAndBuild(options: ServerBundleOptions): Promise<void> {
|
|
21
|
+
const { rootDir, dev, logger } = options;
|
|
22
|
+
|
|
23
|
+
logger.debug('[server-bundler] Starting server bundle process');
|
|
24
|
+
|
|
25
|
+
const entryPath = join(rootDir, '.agentuity/app.generated.ts');
|
|
26
|
+
const outDir = join(rootDir, '.agentuity');
|
|
27
|
+
|
|
28
|
+
logger.debug(`[server-bundler] Entry: ${entryPath}, OutDir: ${outDir}`);
|
|
29
|
+
|
|
30
|
+
// Runtime externals: native modules and packages that need to be external
|
|
31
|
+
// These WILL be installed into .agentuity/node_modules for production
|
|
32
|
+
const runtimeExternals = ['bun', 'fsevents', 'chromium-bidi', 'sharp', 'ws'];
|
|
33
|
+
|
|
34
|
+
// Build tool externals: packages that should be external but NOT installed
|
|
35
|
+
// These are devDependencies that may exist in node_modules but aren't needed at runtime
|
|
36
|
+
const buildToolExternals = ['@babel/*', 'lightningcss', '@vitejs/*', 'vite', 'esbuild'];
|
|
37
|
+
|
|
38
|
+
// Load custom externals from agentuity.config.ts if it exists
|
|
39
|
+
const customExternals: string[] = [];
|
|
40
|
+
const configPath = join(rootDir, 'agentuity.config.ts');
|
|
41
|
+
if (await Bun.file(configPath).exists()) {
|
|
42
|
+
try {
|
|
43
|
+
const config = await import(configPath);
|
|
44
|
+
const userConfig = config.default;
|
|
45
|
+
if (userConfig?.build?.external && Array.isArray(userConfig.build.external)) {
|
|
46
|
+
customExternals.push(
|
|
47
|
+
...userConfig.build.external.filter((e: unknown) => typeof e === 'string')
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
} catch (error) {
|
|
51
|
+
logger.info('Failed to load agentuity.config.ts for externals:', error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Combine runtime externals with custom externals for installation
|
|
56
|
+
const installPatterns = [...runtimeExternals, ...customExternals];
|
|
57
|
+
|
|
58
|
+
// All external patterns (runtime + build tools + custom) for Bun.build
|
|
59
|
+
const allExternalPatterns = [...runtimeExternals, ...buildToolExternals, ...customExternals];
|
|
60
|
+
let external = allExternalPatterns;
|
|
61
|
+
|
|
62
|
+
// For production builds: install ONLY runtime externals, then discover full dependency tree
|
|
63
|
+
if (!dev) {
|
|
64
|
+
logger.debug('Installing externalized packages to discover full dependency tree...');
|
|
65
|
+
|
|
66
|
+
// Step 1: Collect packages matching RUNTIME external patterns (skip build tools)
|
|
67
|
+
const externalInstalls: string[] = [];
|
|
68
|
+
for (const pattern of installPatterns) {
|
|
69
|
+
if (pattern.endsWith('/*')) {
|
|
70
|
+
// Pattern like @org/* - install all packages under that scope
|
|
71
|
+
const prefix = pattern.slice(0, -2);
|
|
72
|
+
const nmDir = join(rootDir, 'node_modules', prefix);
|
|
73
|
+
const nmDirExists = await stat(nmDir)
|
|
74
|
+
.then((s) => s.isDirectory())
|
|
75
|
+
.catch(() => false);
|
|
76
|
+
if (nmDirExists) {
|
|
77
|
+
const entries = await readdir(nmDir);
|
|
78
|
+
for (const entry of entries) {
|
|
79
|
+
const pkgName = `${prefix}/${entry}`;
|
|
80
|
+
const pkgJsonExists = await Bun.file(
|
|
81
|
+
join(rootDir, 'node_modules', pkgName, 'package.json')
|
|
82
|
+
).exists();
|
|
83
|
+
if (pkgJsonExists) {
|
|
84
|
+
externalInstalls.push(pkgName);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
// Exact package name
|
|
90
|
+
const pkgJsonExists = await Bun.file(
|
|
91
|
+
join(rootDir, 'node_modules', pattern, 'package.json')
|
|
92
|
+
).exists();
|
|
93
|
+
if (pkgJsonExists) {
|
|
94
|
+
externalInstalls.push(pattern);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Step 2: Write minimal package.json and install externals
|
|
100
|
+
if (externalInstalls.length > 0) {
|
|
101
|
+
const pkgPath = join(rootDir, 'package.json');
|
|
102
|
+
const pkgContents = await Bun.file(pkgPath).json();
|
|
103
|
+
|
|
104
|
+
await Bun.write(
|
|
105
|
+
join(outDir, 'package.json'),
|
|
106
|
+
JSON.stringify({ name: pkgContents.name, version: pkgContents.version }, null, 2)
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
logger.debug(
|
|
110
|
+
'Installing %d packages: %s',
|
|
111
|
+
externalInstalls.length,
|
|
112
|
+
externalInstalls.join(', ')
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
// Install with Bun (production mode, no scripts, linux target for deployment)
|
|
116
|
+
const proc = Bun.spawn(
|
|
117
|
+
[
|
|
118
|
+
'bun',
|
|
119
|
+
'install',
|
|
120
|
+
'--no-save',
|
|
121
|
+
'--ignore-scripts',
|
|
122
|
+
'--target=bun-linux-x64',
|
|
123
|
+
...externalInstalls,
|
|
124
|
+
],
|
|
125
|
+
{
|
|
126
|
+
cwd: outDir,
|
|
127
|
+
stdout: 'pipe',
|
|
128
|
+
stderr: 'pipe',
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const exitCode = await proc.exited;
|
|
133
|
+
|
|
134
|
+
if (exitCode !== 0) {
|
|
135
|
+
const stderr = await new Response(proc.stderr).text();
|
|
136
|
+
throw new Error(
|
|
137
|
+
`Failed to install external dependencies (exit code ${exitCode}):\n${stderr}`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Step 3: Scan what actually got installed (includes transitive dependencies)
|
|
142
|
+
const installedNmDir = join(outDir, 'node_modules');
|
|
143
|
+
const installedNmDirExists = await stat(installedNmDir)
|
|
144
|
+
.then((s) => s.isDirectory())
|
|
145
|
+
.catch(() => false);
|
|
146
|
+
if (installedNmDirExists) {
|
|
147
|
+
const allInstalled: string[] = [];
|
|
148
|
+
|
|
149
|
+
// Recursively find all installed packages
|
|
150
|
+
const scanDir = async (dir: string, prefix = '') => {
|
|
151
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
if (entry.isDirectory()) {
|
|
154
|
+
const pkgName = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
155
|
+
|
|
156
|
+
// Check if this is a package (has package.json)
|
|
157
|
+
const pkgJsonExists = await Bun.file(
|
|
158
|
+
join(dir, entry.name, 'package.json')
|
|
159
|
+
).exists();
|
|
160
|
+
if (pkgJsonExists) {
|
|
161
|
+
allInstalled.push(pkgName);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Recurse into scoped packages (@org/package)
|
|
165
|
+
if (entry.name.startsWith('@')) {
|
|
166
|
+
await scanDir(join(dir, entry.name), entry.name);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
await scanDir(installedNmDir);
|
|
173
|
+
logger.debug(
|
|
174
|
+
'Discovered %d total packages (including transitive deps)',
|
|
175
|
+
allInstalled.length
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
// Step 4: Use ALL installed packages + build tool externals for bundling
|
|
179
|
+
external = [...allInstalled, ...buildToolExternals];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
// Dev mode: just use all external patterns as-is
|
|
184
|
+
external = allExternalPatterns;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Build server bundle
|
|
188
|
+
logger.debug('Building server with Bun.build...');
|
|
189
|
+
logger.debug(`External packages (${external.length}): ${external.join(', ')}`);
|
|
190
|
+
|
|
191
|
+
const buildConfig = {
|
|
192
|
+
entrypoints: [entryPath],
|
|
193
|
+
outdir: outDir, // Output to .agentuity/ directly (not .agentuity/server/)
|
|
194
|
+
target: 'bun' as const,
|
|
195
|
+
format: 'esm' as const,
|
|
196
|
+
splitting: false, // Disable splitting - causes issues with externalized CommonJS packages
|
|
197
|
+
minify: !dev,
|
|
198
|
+
sourcemap: (dev ? 'inline' : 'external') as 'inline' | 'external',
|
|
199
|
+
external,
|
|
200
|
+
naming: {
|
|
201
|
+
entry: 'app.js', // Output as app.js (not app.generated.js)
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
logger.debug(
|
|
206
|
+
`Bun.build config: ${JSON.stringify({ ...buildConfig, external: `[${external.length} packages]` }, null, 2)}`
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
// Verify entry point exists before building
|
|
210
|
+
if (!(await Bun.file(entryPath).exists())) {
|
|
211
|
+
throw new Error(`Entry point not found: ${entryPath}`);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
logger.debug(`Entry point verified: ${entryPath}`);
|
|
215
|
+
|
|
216
|
+
let result;
|
|
217
|
+
try {
|
|
218
|
+
result = await Bun.build(buildConfig);
|
|
219
|
+
} catch (error: unknown) {
|
|
220
|
+
logger.error('Bun.build threw an exception');
|
|
221
|
+
|
|
222
|
+
// Handle AggregateError with build/resolve messages
|
|
223
|
+
if (error instanceof AggregateError && error.errors) {
|
|
224
|
+
for (const err of error.errors) {
|
|
225
|
+
const parts = [err.message || err.text || 'Unknown error'];
|
|
226
|
+
if (err.position) {
|
|
227
|
+
parts.push(` at ${err.position.file}:${err.position.line}:${err.position.column}`);
|
|
228
|
+
}
|
|
229
|
+
logger.error(parts.join('\n'));
|
|
230
|
+
}
|
|
231
|
+
} else {
|
|
232
|
+
logger.error(` ${error instanceof Error ? error.message : String(error)}`);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (!result.success) {
|
|
239
|
+
logger.error('Bun.build failed for server');
|
|
240
|
+
logger.error(
|
|
241
|
+
`Build result: success=${result.success}, outputs=${result.outputs.length}, logs=${result.logs.length}`
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
const errorMessages = result.logs
|
|
245
|
+
.map((log) => {
|
|
246
|
+
const parts = [log.message];
|
|
247
|
+
if (log.position) {
|
|
248
|
+
parts.push(` at ${log.position.file}:${log.position.line}:${log.position.column}`);
|
|
249
|
+
}
|
|
250
|
+
return parts.join('\n');
|
|
251
|
+
})
|
|
252
|
+
.join('\n');
|
|
253
|
+
|
|
254
|
+
throw new Error(errorMessages || 'Build failed with no error messages');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
logger.debug(`Server build complete: ${result.outputs.length} files`);
|
|
258
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite Asset Server Configuration
|
|
3
|
+
*
|
|
4
|
+
* Minimal Vite config for serving frontend assets with HMR only.
|
|
5
|
+
* Does NOT handle API routes, workbench, or WebSocket - that's the Bun server's job.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import type { Logger } from '../../../types';
|
|
10
|
+
import type { InlineConfig } from 'vite';
|
|
11
|
+
|
|
12
|
+
export interface GenerateAssetServerConfigOptions {
|
|
13
|
+
rootDir: string;
|
|
14
|
+
logger: Logger;
|
|
15
|
+
workbenchPath?: string;
|
|
16
|
+
port: number; // The port Vite will run on (for HMR client configuration)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Generate Vite config for asset-only server (HMR + React transformation)
|
|
21
|
+
*/
|
|
22
|
+
export async function generateAssetServerConfig(
|
|
23
|
+
options: GenerateAssetServerConfigOptions
|
|
24
|
+
): Promise<InlineConfig> {
|
|
25
|
+
const { rootDir, logger, workbenchPath, port } = options;
|
|
26
|
+
|
|
27
|
+
// Load path aliases from tsconfig.json if available
|
|
28
|
+
const tsconfigPath = join(rootDir, 'tsconfig.json');
|
|
29
|
+
let alias = {};
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const tsconfig = JSON.parse(await Bun.file(tsconfigPath).text());
|
|
33
|
+
const paths = tsconfig?.compilerOptions?.paths || {};
|
|
34
|
+
alias = Object.fromEntries(
|
|
35
|
+
Object.entries(paths).map(([key, value]) => {
|
|
36
|
+
const pathArray = value as string[];
|
|
37
|
+
return [key.replace('/*', ''), join(rootDir, pathArray[0].replace('/*', ''))];
|
|
38
|
+
})
|
|
39
|
+
);
|
|
40
|
+
} catch {
|
|
41
|
+
// No tsconfig or no paths - that's fine
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
root: rootDir,
|
|
46
|
+
base: '/',
|
|
47
|
+
clearScreen: false,
|
|
48
|
+
publicDir: false, // Don't serve public dir - Bun server handles that
|
|
49
|
+
|
|
50
|
+
resolve: {
|
|
51
|
+
alias,
|
|
52
|
+
// Deduplicate React to prevent multiple instances
|
|
53
|
+
dedupe: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'],
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
// Only allow frontend env vars (server uses process.env)
|
|
57
|
+
envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
|
|
58
|
+
|
|
59
|
+
server: {
|
|
60
|
+
// Use the port we selected
|
|
61
|
+
port,
|
|
62
|
+
strictPort: false, // Allow fallback if port is taken
|
|
63
|
+
host: '127.0.0.1',
|
|
64
|
+
|
|
65
|
+
// CORS headers to allow Bun server on port 3500 to proxy requests
|
|
66
|
+
cors: {
|
|
67
|
+
origin: 'http://127.0.0.1:3500',
|
|
68
|
+
credentials: true,
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
// HMR configuration - client must connect to Vite asset server directly
|
|
72
|
+
hmr: {
|
|
73
|
+
protocol: 'ws',
|
|
74
|
+
host: '127.0.0.1',
|
|
75
|
+
port, // HMR WebSocket on same port as HTTP
|
|
76
|
+
clientPort: port, // Tell client to connect to this port (not origin 3500)
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// Don't open browser - Bun server will be the entry point
|
|
80
|
+
open: false,
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
// Define environment variables for browser
|
|
84
|
+
define: {
|
|
85
|
+
...(workbenchPath
|
|
86
|
+
? { 'import.meta.env.AGENTUITY_PUBLIC_WORKBENCH_PATH': JSON.stringify(workbenchPath) }
|
|
87
|
+
: {}),
|
|
88
|
+
'import.meta.env.AGENTUITY_PUBLIC_HAS_SDK_KEY': JSON.stringify(
|
|
89
|
+
process.env.AGENTUITY_SDK_KEY ? 'true' : 'false'
|
|
90
|
+
),
|
|
91
|
+
'process.env.NODE_ENV': JSON.stringify('development'),
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
// Minimal plugins - just React and HMR
|
|
95
|
+
plugins: [
|
|
96
|
+
// React plugin for JSX/TSX transformation and Fast Refresh
|
|
97
|
+
(await import('@vitejs/plugin-react')).default(),
|
|
98
|
+
// Browser env plugin to map process.env to import.meta.env
|
|
99
|
+
(await import('./browser-env-plugin')).browserEnvPlugin(),
|
|
100
|
+
],
|
|
101
|
+
|
|
102
|
+
// Suppress build-related options (this is dev-only)
|
|
103
|
+
build: {
|
|
104
|
+
rollupOptions: {
|
|
105
|
+
external: ['vite', '@agentuity/cli'],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
// Custom logger to integrate with our logger
|
|
110
|
+
customLogger: {
|
|
111
|
+
info(msg: string) {
|
|
112
|
+
if (!msg.includes('[vite]')) {
|
|
113
|
+
logger.debug(`[Vite Asset] ${msg}`);
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
warn(msg: string) {
|
|
117
|
+
logger.warn(`[Vite Asset] ${msg}`);
|
|
118
|
+
},
|
|
119
|
+
warnOnce(msg: string) {
|
|
120
|
+
logger.warn(`[Vite Asset] ${msg}`);
|
|
121
|
+
},
|
|
122
|
+
error(msg: string) {
|
|
123
|
+
logger.error(`[Vite Asset] ${msg}`);
|
|
124
|
+
},
|
|
125
|
+
clearScreen() {
|
|
126
|
+
// No-op
|
|
127
|
+
},
|
|
128
|
+
hasErrorLogged: () => false,
|
|
129
|
+
hasWarned: false,
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
logLevel: 'info',
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite Asset Server
|
|
3
|
+
*
|
|
4
|
+
* Starts a minimal Vite dev server for frontend asset transformation and HMR only.
|
|
5
|
+
* Does NOT handle API routes or WebSocket - the Bun server proxies to this.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { createServer, type ViteDevServer } from 'vite';
|
|
9
|
+
import type { Logger } from '../../../types';
|
|
10
|
+
import { generateAssetServerConfig } from './vite-asset-server-config';
|
|
11
|
+
|
|
12
|
+
export interface ViteAssetServerResult {
|
|
13
|
+
server: ViteDevServer;
|
|
14
|
+
port: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface StartViteAssetServerOptions {
|
|
18
|
+
rootDir: string;
|
|
19
|
+
logger: Logger;
|
|
20
|
+
workbenchPath?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Start Vite asset server on a dynamically-chosen port
|
|
25
|
+
* Returns the server instance and the actual port number
|
|
26
|
+
*/
|
|
27
|
+
export async function startViteAssetServer(
|
|
28
|
+
options: StartViteAssetServerOptions
|
|
29
|
+
): Promise<ViteAssetServerResult> {
|
|
30
|
+
const { rootDir, logger, workbenchPath } = options;
|
|
31
|
+
|
|
32
|
+
logger.debug('Starting Vite asset server (HMR only)...');
|
|
33
|
+
|
|
34
|
+
// Pick a port for Vite asset server (try 5173 first, Vite default)
|
|
35
|
+
// strictPort: false allows Vite to choose alternate if 5173 is taken
|
|
36
|
+
const preferredPort = 5173;
|
|
37
|
+
|
|
38
|
+
// Generate minimal config with preferred port
|
|
39
|
+
const config = await generateAssetServerConfig({
|
|
40
|
+
rootDir,
|
|
41
|
+
logger,
|
|
42
|
+
workbenchPath,
|
|
43
|
+
port: preferredPort,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Create Vite server with config
|
|
47
|
+
const server = await createServer(config);
|
|
48
|
+
|
|
49
|
+
// Start listening - Vite will choose alternate port if preferred is taken
|
|
50
|
+
await server.listen();
|
|
51
|
+
|
|
52
|
+
// Get the actual port Vite is using (may differ from preferred if port was taken)
|
|
53
|
+
const actualPort = server.config.server.port || preferredPort;
|
|
54
|
+
|
|
55
|
+
logger.info(`✅ Vite asset server started on port ${actualPort}`);
|
|
56
|
+
if (actualPort !== preferredPort) {
|
|
57
|
+
logger.debug(`Port ${preferredPort} was taken, using ${actualPort} instead`);
|
|
58
|
+
}
|
|
59
|
+
logger.debug(`Asset server will handle: HMR, React transformation, source maps`);
|
|
60
|
+
logger.debug(`HMR WebSocket configured to connect to ws://127.0.0.1:${actualPort}`);
|
|
61
|
+
|
|
62
|
+
return { server, port: actualPort };
|
|
63
|
+
}
|