@agentuity/cli 0.0.95 → 0.0.97
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 +84 -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 +41 -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 +234 -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 +43 -7
- 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 +11 -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 +66 -0
- package/src/cmd/build/vite/vite-builder.ts +288 -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 +52 -8
- 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,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite-native entry file generator (v2 - clean architecture)
|
|
3
|
+
* Single source for both dev and prod with minimal differences
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import type { Logger, WorkbenchConfig } from '../../types';
|
|
8
|
+
import { discoverRoutes } from './vite/route-discovery';
|
|
9
|
+
|
|
10
|
+
interface GenerateEntryOptions {
|
|
11
|
+
rootDir: string;
|
|
12
|
+
projectId: string;
|
|
13
|
+
deploymentId: string;
|
|
14
|
+
logger: Logger;
|
|
15
|
+
mode: 'dev' | 'prod';
|
|
16
|
+
workbench?: WorkbenchConfig;
|
|
17
|
+
vitePort?: number; // Port of Vite asset server (dev mode only)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Generate entry file with clean Vite-native architecture
|
|
22
|
+
*/
|
|
23
|
+
export async function generateEntryFile(options: GenerateEntryOptions): Promise<void> {
|
|
24
|
+
const { rootDir, projectId, deploymentId, logger, mode, workbench, vitePort } = options;
|
|
25
|
+
const isDev = mode === 'dev';
|
|
26
|
+
|
|
27
|
+
const srcDir = join(rootDir, 'src');
|
|
28
|
+
const agentuityDir = join(rootDir, '.agentuity');
|
|
29
|
+
const entryPath = join(agentuityDir, 'app.generated.ts');
|
|
30
|
+
|
|
31
|
+
logger.trace(`Generating ${mode} mode entry file...`);
|
|
32
|
+
|
|
33
|
+
// Discover routes to determine which files need to be imported
|
|
34
|
+
const { routeInfoList } = await discoverRoutes(srcDir, projectId, deploymentId, logger);
|
|
35
|
+
|
|
36
|
+
// Check for web and workbench
|
|
37
|
+
const hasWebFrontend =
|
|
38
|
+
(await Bun.file(join(srcDir, 'web', 'index.html')).exists()) ||
|
|
39
|
+
(await Bun.file(join(srcDir, 'web', 'frontend.tsx')).exists());
|
|
40
|
+
const hasWorkbench = !!workbench;
|
|
41
|
+
|
|
42
|
+
// Get unique route files that need to be imported (relative to src/)
|
|
43
|
+
const routeFiles = new Set<string>();
|
|
44
|
+
for (const route of routeInfoList) {
|
|
45
|
+
if (route.filename) {
|
|
46
|
+
routeFiles.add(route.filename);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Generate imports
|
|
51
|
+
const runtimeImports = [
|
|
52
|
+
` createRouter,`,
|
|
53
|
+
` createBaseMiddleware,`,
|
|
54
|
+
` createCorsMiddleware,`,
|
|
55
|
+
` createOtelMiddleware,`,
|
|
56
|
+
` createAgentMiddleware,`,
|
|
57
|
+
` getAppState,`,
|
|
58
|
+
` getAppConfig,`,
|
|
59
|
+
` register,`,
|
|
60
|
+
` createServices,`,
|
|
61
|
+
` runAgentSetups,`,
|
|
62
|
+
` getThreadProvider,`,
|
|
63
|
+
` getSessionProvider,`,
|
|
64
|
+
` setGlobalLogger,`,
|
|
65
|
+
` setGlobalTracer,`,
|
|
66
|
+
` setGlobalRouter,`,
|
|
67
|
+
` enableProcessExitProtection,`,
|
|
68
|
+
` hasWaitUntilPending,`,
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
if (hasWorkbench) {
|
|
72
|
+
runtimeImports.push(` createWorkbenchRouter,`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const imports = [
|
|
76
|
+
`import { `,
|
|
77
|
+
...runtimeImports,
|
|
78
|
+
`} from '@agentuity/runtime';`,
|
|
79
|
+
`import { websocket } from 'hono/bun';`, // Always use Bun WebSocket (dev and prod)
|
|
80
|
+
!isDev && hasWebFrontend ? `import { serveStatic } from 'hono/bun';` : '',
|
|
81
|
+
].filter(Boolean);
|
|
82
|
+
|
|
83
|
+
imports.push(`import { type LogLevel } from '@agentuity/core';`);
|
|
84
|
+
|
|
85
|
+
// HMR setup (dev only)
|
|
86
|
+
const hmrSetup = isDev
|
|
87
|
+
? `
|
|
88
|
+
// HMR restart handler
|
|
89
|
+
if (typeof (globalThis as any).__AGENTUITY_RESTART__ === 'undefined') {
|
|
90
|
+
(globalThis as any).__AGENTUITY_RESTART__ = () => {
|
|
91
|
+
console.log('[HMR] Restart triggered but handler not ready yet');
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
`
|
|
95
|
+
: '';
|
|
96
|
+
|
|
97
|
+
// Generate route mounting code for all discovered routes
|
|
98
|
+
const routeImportsAndMounts: string[] = [];
|
|
99
|
+
let routeIndex = 0;
|
|
100
|
+
|
|
101
|
+
for (const routeFile of routeFiles) {
|
|
102
|
+
// Convert src/api/auth/route.ts -> auth/route
|
|
103
|
+
const relativePath = routeFile.replace(/^src\/api\//, '').replace(/\.tsx?$/, '');
|
|
104
|
+
|
|
105
|
+
// Determine the mount path
|
|
106
|
+
// src/api/index.ts -> /api
|
|
107
|
+
// src/api/auth/route.ts -> /api/auth
|
|
108
|
+
// src/api/users/profile/route.ts -> /api/users/profile
|
|
109
|
+
let mountPath = '/api';
|
|
110
|
+
if (relativePath !== 'index') {
|
|
111
|
+
// Remove 'route' or 'index' from the end
|
|
112
|
+
const cleanPath = relativePath.replace(/\/(route|index)$/, '');
|
|
113
|
+
if (cleanPath) {
|
|
114
|
+
mountPath = `/api/${cleanPath}`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const importName = `router_${routeIndex++}`;
|
|
119
|
+
routeImportsAndMounts.push(
|
|
120
|
+
`const { default: ${importName} } = await import('../src/api/${relativePath}.js');`
|
|
121
|
+
);
|
|
122
|
+
routeImportsAndMounts.push(`app.route('${mountPath}', ${importName});`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const apiMount =
|
|
126
|
+
routeImportsAndMounts.length > 0
|
|
127
|
+
? `
|
|
128
|
+
// Mount API routes
|
|
129
|
+
${routeImportsAndMounts.join('\n')}
|
|
130
|
+
`
|
|
131
|
+
: '';
|
|
132
|
+
|
|
133
|
+
// Workbench API routes mounting (if enabled)
|
|
134
|
+
const workbenchApiMount = hasWorkbench
|
|
135
|
+
? `
|
|
136
|
+
// Mount workbench API routes (/_agentuity/workbench/*)
|
|
137
|
+
const workbenchRouter = createWorkbenchRouter();
|
|
138
|
+
app.route('/', workbenchRouter);
|
|
139
|
+
`
|
|
140
|
+
: '';
|
|
141
|
+
|
|
142
|
+
// Asset proxy routes (dev mode only - proxy to Vite asset server)
|
|
143
|
+
const assetProxyRoutes =
|
|
144
|
+
isDev && vitePort
|
|
145
|
+
? `
|
|
146
|
+
// Asset proxy routes - Forward Vite-specific requests to asset server
|
|
147
|
+
const VITE_ASSET_PORT = ${vitePort};
|
|
148
|
+
|
|
149
|
+
const proxyToVite = async (c) => {
|
|
150
|
+
const viteUrl = \`http://127.0.0.1:\${VITE_ASSET_PORT}\${c.req.path}\`;
|
|
151
|
+
const controller = new AbortController();
|
|
152
|
+
const timeout = setTimeout(() => controller.abort(), 10000); // 10s timeout
|
|
153
|
+
try {
|
|
154
|
+
otel.logger.debug(\`[Proxy] \${c.req.method} \${c.req.path} -> Vite:\${VITE_ASSET_PORT}\`);
|
|
155
|
+
const res = await fetch(viteUrl, { signal: controller.signal });
|
|
156
|
+
clearTimeout(timeout);
|
|
157
|
+
otel.logger.debug(\`[Proxy] \${c.req.path} -> \${res.status} (\${res.headers.get('content-type')})\`);
|
|
158
|
+
return new Response(res.body, {
|
|
159
|
+
status: res.status,
|
|
160
|
+
headers: res.headers,
|
|
161
|
+
});
|
|
162
|
+
} catch (err) {
|
|
163
|
+
clearTimeout(timeout);
|
|
164
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
165
|
+
otel.logger.error(\`Vite proxy timeout: \${c.req.path}\`);
|
|
166
|
+
return c.text('Vite asset server timeout', 504);
|
|
167
|
+
}
|
|
168
|
+
otel.logger.error(\`Failed to proxy to Vite: \${c.req.path} - \${err instanceof Error ? err.message : String(err)}\`);
|
|
169
|
+
return c.text('Vite asset server error', 500);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Vite client scripts and HMR
|
|
174
|
+
app.get('/@vite/*', proxyToVite);
|
|
175
|
+
app.get('/@react-refresh', proxyToVite);
|
|
176
|
+
|
|
177
|
+
// Source files for HMR
|
|
178
|
+
app.get('/src/web/*', proxyToVite);
|
|
179
|
+
app.get('/src/*', proxyToVite); // Catch-all for other source files
|
|
180
|
+
|
|
181
|
+
// Workbench source files (in .agentuity/workbench-src/)
|
|
182
|
+
app.get('/.agentuity/workbench-src/*', proxyToVite);
|
|
183
|
+
|
|
184
|
+
// Node modules (Vite transforms these)
|
|
185
|
+
app.get('/node_modules/*', proxyToVite);
|
|
186
|
+
|
|
187
|
+
// Scoped packages (e.g., @agentuity/*, @types/*)
|
|
188
|
+
app.get('/@*', proxyToVite);
|
|
189
|
+
|
|
190
|
+
// File system access (for Vite's @fs protocol)
|
|
191
|
+
app.get('/@fs/*', proxyToVite);
|
|
192
|
+
|
|
193
|
+
// Module resolution (for Vite's @id protocol)
|
|
194
|
+
app.get('/@id/*', proxyToVite);
|
|
195
|
+
|
|
196
|
+
// Any .js, .jsx, .ts, .tsx files (catch remaining modules)
|
|
197
|
+
app.get('/*.js', proxyToVite);
|
|
198
|
+
app.get('/*.jsx', proxyToVite);
|
|
199
|
+
app.get('/*.ts', proxyToVite);
|
|
200
|
+
app.get('/*.tsx', proxyToVite);
|
|
201
|
+
app.get('/*.css', proxyToVite);
|
|
202
|
+
`
|
|
203
|
+
: '';
|
|
204
|
+
|
|
205
|
+
// Web routes (different for dev/prod)
|
|
206
|
+
let webRoutes = '';
|
|
207
|
+
if (hasWebFrontend) {
|
|
208
|
+
if (isDev) {
|
|
209
|
+
const htmlPath = join(srcDir, 'web', 'index.html');
|
|
210
|
+
webRoutes = `
|
|
211
|
+
// Web routes (dev mode with Vite HMR via proxy)
|
|
212
|
+
const devHtmlHandler = async (c) => {
|
|
213
|
+
const html = await Bun.file('${htmlPath}').text();
|
|
214
|
+
const withHmr = html
|
|
215
|
+
// Fix relative paths to use proxy routes (with or without ./)
|
|
216
|
+
.replace(/src=["'](?:\\.\\/)?([^"'\\/]+\\.tsx?)["']/g, 'src="/src/web/$1"')
|
|
217
|
+
// Inject Vite HMR scripts - point directly to Vite asset server for WebSocket
|
|
218
|
+
.replace(
|
|
219
|
+
'</head>',
|
|
220
|
+
\`<script type="module">
|
|
221
|
+
import RefreshRuntime from '/@react-refresh'
|
|
222
|
+
RefreshRuntime.injectIntoGlobalHook(window)
|
|
223
|
+
window.$RefreshReg$ = () => {}
|
|
224
|
+
window.$RefreshSig$ = () => (type) => type
|
|
225
|
+
</script>
|
|
226
|
+
<script type="module">
|
|
227
|
+
// Configure Vite client to connect to asset server for HMR WebSocket
|
|
228
|
+
window.__VITE_HMR_BASE_URL__ = 'http://127.0.0.1:${vitePort}';
|
|
229
|
+
</script>
|
|
230
|
+
<script type="module" src="http://127.0.0.1:${vitePort}/@vite/client"></script>
|
|
231
|
+
</head>\`
|
|
232
|
+
);
|
|
233
|
+
return c.html(withHmr);
|
|
234
|
+
};
|
|
235
|
+
app.get('/', devHtmlHandler);
|
|
236
|
+
// 404 for unmatched API/system routes
|
|
237
|
+
app.all('/_agentuity/*', (c) => c.notFound());
|
|
238
|
+
app.all('/api/*', (c) => c.notFound());
|
|
239
|
+
${hasWorkbench ? '' : `app.all('/workbench/*', (c) => c.notFound());`}
|
|
240
|
+
// SPA fallback - serve index.html for all other GET requests
|
|
241
|
+
// This is last so user routes, API routes, and workbench routes match first
|
|
242
|
+
app.get('*', devHtmlHandler);
|
|
243
|
+
`;
|
|
244
|
+
} else {
|
|
245
|
+
webRoutes = `
|
|
246
|
+
// Web routes (production - static files)
|
|
247
|
+
import { readFileSync } from 'node:fs';
|
|
248
|
+
const indexHtml = readFileSync(import.meta.dir + '/client/index.html', 'utf-8');
|
|
249
|
+
app.use('/assets/*', serveStatic({ root: import.meta.dir + '/client' }));
|
|
250
|
+
app.get('/', (c) => c.html(indexHtml));
|
|
251
|
+
// 404 for unmatched API/system routes
|
|
252
|
+
app.all('/_agentuity/*', (c) => c.notFound());
|
|
253
|
+
app.all('/api/*', (c) => c.notFound());
|
|
254
|
+
${hasWorkbench ? '' : `app.all('/workbench/*', (c) => c.notFound());`}
|
|
255
|
+
// SPA fallback - serve index.html for all other GET requests
|
|
256
|
+
app.get('*', (c) => c.html(indexHtml));
|
|
257
|
+
`;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Workbench routes (if enabled)
|
|
262
|
+
const workbenchRoute = workbench?.route ?? '/workbench';
|
|
263
|
+
const workbenchSrcDir = join(agentuityDir, 'workbench-src');
|
|
264
|
+
const workbenchRoutes = hasWorkbench
|
|
265
|
+
? isDev
|
|
266
|
+
? `
|
|
267
|
+
// Workbench route (dev mode - let Vite serve source files with HMR)
|
|
268
|
+
app.get('${workbenchRoute}', async (c) => {
|
|
269
|
+
const html = await Bun.file('${workbenchSrcDir}/index.html').text();
|
|
270
|
+
// Rewrite script/css paths to use Vite's @fs protocol
|
|
271
|
+
const withVite = html
|
|
272
|
+
.replace('src="./main.tsx"', 'src="/@fs${workbenchSrcDir}/main.tsx"')
|
|
273
|
+
.replace('href="./styles.css"', 'href="/@fs${workbenchSrcDir}/styles.css"');
|
|
274
|
+
return c.html(withVite);
|
|
275
|
+
});
|
|
276
|
+
`
|
|
277
|
+
: `
|
|
278
|
+
// Workbench routes (production - serve pre-built assets)
|
|
279
|
+
// Use import.meta.dir for absolute paths (app.js runs from .agentuity/)
|
|
280
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
281
|
+
const workbenchIndexPath = import.meta.dir + '/workbench/index.html';
|
|
282
|
+
if (existsSync(workbenchIndexPath)) {
|
|
283
|
+
const workbenchIndex = readFileSync(workbenchIndexPath, 'utf-8');
|
|
284
|
+
app.get('${workbenchRoute}', (c) => c.html(workbenchIndex));
|
|
285
|
+
app.get('${workbenchRoute}/*', serveStatic({ root: import.meta.dir + '/workbench' }));
|
|
286
|
+
}
|
|
287
|
+
`
|
|
288
|
+
: '';
|
|
289
|
+
|
|
290
|
+
// Server startup (same for dev and prod - Bun.serve with native WebSocket)
|
|
291
|
+
const serverStartup = `
|
|
292
|
+
// Start Bun server${isDev ? ' (dev mode with Vite asset proxy)' : ''}
|
|
293
|
+
if (typeof Bun !== 'undefined' && !import.meta.main) {
|
|
294
|
+
// Not the main module, skip server startup (this is being imported/analyzed)
|
|
295
|
+
} else if (typeof Bun !== 'undefined') {
|
|
296
|
+
// Enable process exit protection now that we're starting the server
|
|
297
|
+
enableProcessExitProtection();
|
|
298
|
+
|
|
299
|
+
const port = parseInt(process.env.PORT || '3500', 10);
|
|
300
|
+
const server = Bun.serve({
|
|
301
|
+
fetch: app.fetch,
|
|
302
|
+
websocket,
|
|
303
|
+
port,
|
|
304
|
+
hostname: '127.0.0.1',
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// Make server available globally for health checks
|
|
308
|
+
(globalThis as any).__AGENTUITY_SERVER__ = server;
|
|
309
|
+
|
|
310
|
+
otel.logger.info(\`Server listening on http://127.0.0.1:\${port}\`);${isDev && vitePort ? `\n\totel.logger.debug(\`Proxying Vite assets from port ${vitePort}\`);` : ''}
|
|
311
|
+
}
|
|
312
|
+
`;
|
|
313
|
+
|
|
314
|
+
const code = `// Auto-generated by Agentuity for ${mode} mode
|
|
315
|
+
// DO NOT EDIT - This file is regenerated on every build
|
|
316
|
+
// NOTE: Bun auto-loads .env files from CWD before executing JavaScript
|
|
317
|
+
|
|
318
|
+
${imports.join('\n')}
|
|
319
|
+
|
|
320
|
+
${hmrSetup}
|
|
321
|
+
|
|
322
|
+
// Step 1: Initialize telemetry and services
|
|
323
|
+
const serverUrl = \`http://127.0.0.1:\${process.env.PORT || '3500'}\`;
|
|
324
|
+
const otel = register({ processors: [], logLevel: (process.env.AGENTUITY_LOG_LEVEL || 'info') as LogLevel });
|
|
325
|
+
const servicesResult = createServices(otel.logger, undefined, serverUrl);
|
|
326
|
+
|
|
327
|
+
// Make logger and tracer globally available for user's app.ts
|
|
328
|
+
setGlobalLogger(otel.logger);
|
|
329
|
+
setGlobalTracer(otel.tracer);
|
|
330
|
+
|
|
331
|
+
// Step 2: Create router and set as global
|
|
332
|
+
const app = createRouter();
|
|
333
|
+
setGlobalRouter(app);
|
|
334
|
+
|
|
335
|
+
// Step 3: Apply middleware in correct order (BEFORE mounting routes)
|
|
336
|
+
app.use('*', createBaseMiddleware({
|
|
337
|
+
logger: otel.logger,
|
|
338
|
+
tracer: otel.tracer,
|
|
339
|
+
meter: otel.meter,
|
|
340
|
+
}));
|
|
341
|
+
|
|
342
|
+
app.use('/_agentuity/*', createCorsMiddleware());
|
|
343
|
+
app.use('/api/*', createCorsMiddleware());
|
|
344
|
+
|
|
345
|
+
// Critical: otelMiddleware creates session/thread/waitUntilHandler
|
|
346
|
+
app.use('/_agentuity/*', createOtelMiddleware());
|
|
347
|
+
app.use('/api/*', createOtelMiddleware());
|
|
348
|
+
|
|
349
|
+
// Critical: agentMiddleware sets up agent context
|
|
350
|
+
app.use('/api/*', createAgentMiddleware(''));
|
|
351
|
+
|
|
352
|
+
// Step 4: Import user's app.ts (runs createApp, gets state/config)
|
|
353
|
+
await import('../app.ts');
|
|
354
|
+
|
|
355
|
+
// Get app state and config for use below
|
|
356
|
+
const appState = getAppState();
|
|
357
|
+
const appConfig = getAppConfig();
|
|
358
|
+
|
|
359
|
+
// Step 5: Initialize providers
|
|
360
|
+
const threadProvider = getThreadProvider();
|
|
361
|
+
const sessionProvider = getSessionProvider();
|
|
362
|
+
|
|
363
|
+
await threadProvider.initialize(appState);
|
|
364
|
+
await sessionProvider.initialize(appState);
|
|
365
|
+
|
|
366
|
+
// Step 6: Mount routes (AFTER middleware is applied)
|
|
367
|
+
|
|
368
|
+
// System health/idle endpoints
|
|
369
|
+
const healthHandler = (c: any) => c.text('OK');
|
|
370
|
+
const idleHandler = (c: any) => {
|
|
371
|
+
// Check if server is idle (no pending requests/connections)
|
|
372
|
+
const server = (globalThis as any).__AGENTUITY_SERVER__;
|
|
373
|
+
if (!server) return c.text('NO', { status: 200 });
|
|
374
|
+
|
|
375
|
+
// Check for pending background tasks
|
|
376
|
+
if (hasWaitUntilPending()) return c.text('NO', { status: 200 });
|
|
377
|
+
|
|
378
|
+
if (server.pendingRequests > 1) return c.text('NO', { status: 200 });
|
|
379
|
+
if (server.pendingWebSockets > 0) return c.text('NO', { status: 200 });
|
|
380
|
+
|
|
381
|
+
return c.text('OK', { status: 200 });
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
// Mount on both /_agentuity/* and /* for backwards compatibility
|
|
385
|
+
app.get('/_agentuity/health', healthHandler);
|
|
386
|
+
app.get('/_health', healthHandler);
|
|
387
|
+
app.get('/_agentuity/idle', idleHandler);
|
|
388
|
+
app.get('/_idle', idleHandler);
|
|
389
|
+
|
|
390
|
+
${assetProxyRoutes}
|
|
391
|
+
${apiMount}
|
|
392
|
+
${workbenchApiMount}
|
|
393
|
+
${workbenchRoutes}
|
|
394
|
+
${webRoutes}
|
|
395
|
+
|
|
396
|
+
// Step 7: Run agent setup to signal completion
|
|
397
|
+
await runAgentSetups(appState);
|
|
398
|
+
|
|
399
|
+
${serverStartup}
|
|
400
|
+
`;
|
|
401
|
+
|
|
402
|
+
await Bun.write(entryPath, code);
|
|
403
|
+
logger.trace(`Generated ${mode} mode entry file at %s`, entryPath);
|
|
404
|
+
}
|
package/src/cmd/build/index.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { resolve, join, relative } from 'node:path';
|
|
3
|
-
import { getServiceUrls } from '@agentuity/server';
|
|
4
3
|
import { createCommand } from '../../types';
|
|
5
|
-
import {
|
|
4
|
+
import { viteBundle } from './vite-bundler';
|
|
6
5
|
import * as tui from '../../tui';
|
|
7
6
|
import { getCommand } from '../../command-prefix';
|
|
8
7
|
import { ErrorCode } from '../../errors';
|
|
@@ -50,32 +49,13 @@ export const command = createCommand({
|
|
|
50
49
|
const rel = outDir.startsWith(absoluteProjectDir)
|
|
51
50
|
? relative(absoluteProjectDir, outDir)
|
|
52
51
|
: outDir;
|
|
53
|
-
tui.info(`
|
|
52
|
+
tui.info(`Building project with Vite at ${absoluteProjectDir} to ${rel}`);
|
|
54
53
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (project) {
|
|
58
|
-
const serviceUrls = getServiceUrls(project.region);
|
|
59
|
-
env.set('AGENTUITY_TRANSPORT_URL', serviceUrls.catalyst);
|
|
60
|
-
env.set('AGENTUITY_CATALYST_URL', serviceUrls.catalyst);
|
|
61
|
-
env.set('AGENTUITY_VECTOR_URL', serviceUrls.vector);
|
|
62
|
-
env.set('AGENTUITY_KEYVALUE_URL', serviceUrls.keyvalue);
|
|
63
|
-
env.set('AGENTUITY_STREAM_URL', serviceUrls.stream);
|
|
64
|
-
env.set('AGENTUITY_CLOUD_ORG_ID', project.orgId);
|
|
65
|
-
env.set('AGENTUITY_CLOUD_PROJECT_ID', project.projectId);
|
|
66
|
-
env.set('AGENTUITY_REGION', project.region);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
ctx.logger.trace('setting env to %s', env);
|
|
70
|
-
|
|
71
|
-
await bundle({
|
|
54
|
+
await viteBundle({
|
|
72
55
|
rootDir: absoluteProjectDir,
|
|
73
56
|
dev: opts.dev || false,
|
|
74
|
-
outDir,
|
|
75
|
-
project,
|
|
76
|
-
orgId: project?.orgId,
|
|
77
57
|
projectId: project?.projectId,
|
|
78
|
-
|
|
58
|
+
orgId: project?.orgId,
|
|
79
59
|
region: project?.region ?? 'local',
|
|
80
60
|
logger: ctx.logger,
|
|
81
61
|
});
|
|
@@ -98,7 +78,6 @@ export const command = createCommand({
|
|
|
98
78
|
if (!opts.dev && !opts.skipTypeCheck) {
|
|
99
79
|
try {
|
|
100
80
|
tui.info('Running type check...');
|
|
101
|
-
const absoluteProjectDir = resolve(projectDir);
|
|
102
81
|
const result = await Bun.$`bunx tsc --noEmit --skipLibCheck`
|
|
103
82
|
.cwd(absoluteProjectDir)
|
|
104
83
|
.nothrow();
|
|
@@ -110,7 +89,7 @@ export const command = createCommand({
|
|
|
110
89
|
console.error(result.stderr.toString());
|
|
111
90
|
tui.fatal('Fix type errors before building');
|
|
112
91
|
}
|
|
113
|
-
} catch (error) {
|
|
92
|
+
} catch (error: unknown) {
|
|
114
93
|
// If tsc fails to run, show error and fail
|
|
115
94
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
116
95
|
tui.error(`Type check failed to run: ${errorMsg}`);
|
|
@@ -118,7 +97,7 @@ export const command = createCommand({
|
|
|
118
97
|
}
|
|
119
98
|
}
|
|
120
99
|
|
|
121
|
-
tui.success('
|
|
100
|
+
tui.success('Build complete');
|
|
122
101
|
|
|
123
102
|
return {
|
|
124
103
|
success: true,
|
|
@@ -126,7 +105,7 @@ export const command = createCommand({
|
|
|
126
105
|
projectName: project?.projectId || 'unknown',
|
|
127
106
|
dev: opts.dev || false,
|
|
128
107
|
};
|
|
129
|
-
} catch (error) {
|
|
108
|
+
} catch (error: unknown) {
|
|
130
109
|
if (error instanceof AggregateError) {
|
|
131
110
|
const ae = error as AggregateError;
|
|
132
111
|
for (const e of ae.errors) {
|