@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,467 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Discovery - READ-ONLY AST analysis
|
|
3
|
+
*
|
|
4
|
+
* Discovers agents by scanning src/agent/**\/*.ts files
|
|
5
|
+
* Extracts metadata WITHOUT mutating source files
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as acornLoose from 'acorn-loose';
|
|
9
|
+
import { generate } from 'astring';
|
|
10
|
+
import { dirname, join, relative } from 'node:path';
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import type { Logger } from '../../../types';
|
|
13
|
+
import { formatSchemaCode } from '../format-schema';
|
|
14
|
+
|
|
15
|
+
interface ASTNode {
|
|
16
|
+
type: string;
|
|
17
|
+
start?: number;
|
|
18
|
+
end?: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface ASTNodeIdentifier extends ASTNode {
|
|
22
|
+
name: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface ASTPropertyNode {
|
|
26
|
+
type: string;
|
|
27
|
+
kind: string;
|
|
28
|
+
key: ASTNodeIdentifier;
|
|
29
|
+
value: ASTNode;
|
|
30
|
+
shorthand?: boolean;
|
|
31
|
+
method?: boolean;
|
|
32
|
+
computed?: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface ASTObjectExpression extends ASTNode {
|
|
36
|
+
properties: ASTPropertyNode[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface ASTLiteral extends ASTNode {
|
|
40
|
+
value: string | number | boolean | null;
|
|
41
|
+
raw?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface ASTCallExpression extends ASTNode {
|
|
45
|
+
arguments: unknown[];
|
|
46
|
+
callee: ASTNode;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface ASTVariableDeclarator extends ASTNode {
|
|
50
|
+
id: ASTNode;
|
|
51
|
+
init?: ASTNode;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface AgentMetadata {
|
|
55
|
+
filename: string;
|
|
56
|
+
name: string;
|
|
57
|
+
id: string;
|
|
58
|
+
agentId: string;
|
|
59
|
+
version: string;
|
|
60
|
+
description?: string;
|
|
61
|
+
inputSchemaCode?: string;
|
|
62
|
+
outputSchemaCode?: string;
|
|
63
|
+
evals?: EvalMetadata[];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface EvalMetadata {
|
|
67
|
+
id: string;
|
|
68
|
+
evalId: string;
|
|
69
|
+
name: string;
|
|
70
|
+
filename: string;
|
|
71
|
+
version: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
agentIdentifier: string;
|
|
74
|
+
projectId: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Hash function for generating stable IDs
|
|
79
|
+
*/
|
|
80
|
+
function hash(...val: string[]): string {
|
|
81
|
+
const hasher = new Bun.CryptoHasher('sha256');
|
|
82
|
+
val.forEach((v) => hasher.update(v));
|
|
83
|
+
return hasher.digest().toHex();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function hashSHA1(...val: string[]): string {
|
|
87
|
+
const hasher = new Bun.CryptoHasher('sha1');
|
|
88
|
+
val.forEach((v) => hasher.update(v));
|
|
89
|
+
return hasher.digest().toHex();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function getAgentId(
|
|
93
|
+
projectId: string,
|
|
94
|
+
deploymentId: string,
|
|
95
|
+
filename: string,
|
|
96
|
+
version: string
|
|
97
|
+
): string {
|
|
98
|
+
return `agentid_${hashSHA1(projectId, deploymentId, filename, version)}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function generateStableAgentId(projectId: string, name: string): string {
|
|
102
|
+
return `agent_${hashSHA1(projectId, name)}`.substring(0, 64);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function getEvalId(
|
|
106
|
+
projectId: string,
|
|
107
|
+
deploymentId: string,
|
|
108
|
+
filename: string,
|
|
109
|
+
name: string,
|
|
110
|
+
version: string
|
|
111
|
+
): string {
|
|
112
|
+
return `evalid_${hashSHA1(projectId, deploymentId, filename, name, version)}`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function generateStableEvalId(projectId: string, agentId: string, name: string): string {
|
|
116
|
+
return `eval_${hashSHA1(projectId, agentId, name)}`.substring(0, 64);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Extract schema code from createAgent call arguments
|
|
121
|
+
*/
|
|
122
|
+
function extractSchemaCode(callargexp: ASTObjectExpression): {
|
|
123
|
+
inputSchemaCode?: string;
|
|
124
|
+
outputSchemaCode?: string;
|
|
125
|
+
} {
|
|
126
|
+
let schemaObj: ASTObjectExpression | undefined;
|
|
127
|
+
|
|
128
|
+
// Find the schema property
|
|
129
|
+
for (const prop of callargexp.properties) {
|
|
130
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'schema') {
|
|
131
|
+
if (prop.value.type === 'ObjectExpression') {
|
|
132
|
+
schemaObj = prop.value as ASTObjectExpression;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!schemaObj) {
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let inputSchemaCode: string | undefined;
|
|
143
|
+
let outputSchemaCode: string | undefined;
|
|
144
|
+
|
|
145
|
+
// Extract input and output schema code
|
|
146
|
+
for (const prop of schemaObj.properties) {
|
|
147
|
+
if (prop.key.type === 'Identifier') {
|
|
148
|
+
if (prop.key.name === 'input' && prop.value) {
|
|
149
|
+
inputSchemaCode = formatSchemaCode(generate(prop.value));
|
|
150
|
+
} else if (prop.key.name === 'output' && prop.value) {
|
|
151
|
+
outputSchemaCode = formatSchemaCode(generate(prop.value));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return { inputSchemaCode, outputSchemaCode };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Parse object expression to extract metadata
|
|
161
|
+
*/
|
|
162
|
+
function parseObjectExpressionToMap(expr: ASTObjectExpression): Map<string, string> {
|
|
163
|
+
const result = new Map<string, string>();
|
|
164
|
+
for (const prop of expr.properties) {
|
|
165
|
+
if (prop.value.type === 'Literal') {
|
|
166
|
+
const value = prop.value as ASTLiteral;
|
|
167
|
+
result.set(prop.key.name, String(value.value));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Extract metadata from createAgent call (READ-ONLY)
|
|
175
|
+
*/
|
|
176
|
+
function extractAgentMetadata(
|
|
177
|
+
code: string,
|
|
178
|
+
filename: string,
|
|
179
|
+
projectId: string,
|
|
180
|
+
deploymentId: string
|
|
181
|
+
): AgentMetadata | null {
|
|
182
|
+
const ast = acornLoose.parse(code, { ecmaVersion: 'latest', sourceType: 'module' });
|
|
183
|
+
|
|
184
|
+
// Calculate file version (hash of contents)
|
|
185
|
+
const version = hash(code);
|
|
186
|
+
|
|
187
|
+
// Find createAgent calls
|
|
188
|
+
for (const node of (ast as { body: ASTNode[] }).body) {
|
|
189
|
+
if (node.type === 'ExportDefaultDeclaration') {
|
|
190
|
+
const declaration = (node as unknown as { declaration: ASTNode }).declaration;
|
|
191
|
+
|
|
192
|
+
if (declaration.type === 'CallExpression') {
|
|
193
|
+
const callExpr = declaration as ASTCallExpression;
|
|
194
|
+
|
|
195
|
+
if (
|
|
196
|
+
callExpr.callee.type === 'Identifier' &&
|
|
197
|
+
(callExpr.callee as ASTNodeIdentifier).name === 'createAgent' &&
|
|
198
|
+
callExpr.arguments.length >= 2
|
|
199
|
+
) {
|
|
200
|
+
// First arg is agent name
|
|
201
|
+
const nameArg = callExpr.arguments[0] as ASTLiteral;
|
|
202
|
+
const name = String(nameArg.value);
|
|
203
|
+
|
|
204
|
+
// Second arg is config object
|
|
205
|
+
const callargexp = callExpr.arguments[1] as ASTObjectExpression;
|
|
206
|
+
|
|
207
|
+
// Extract schemas
|
|
208
|
+
const { inputSchemaCode, outputSchemaCode } = extractSchemaCode(callargexp);
|
|
209
|
+
|
|
210
|
+
// Extract description from either direct property or metadata object
|
|
211
|
+
let description: string | undefined;
|
|
212
|
+
for (const prop of callargexp.properties) {
|
|
213
|
+
// Check for direct description property
|
|
214
|
+
if (prop.key.name === 'description' && prop.value.type === 'Literal') {
|
|
215
|
+
description = String((prop.value as ASTLiteral).value);
|
|
216
|
+
break; // Direct description takes precedence
|
|
217
|
+
}
|
|
218
|
+
// Also check metadata.description for backwards compat
|
|
219
|
+
if (prop.key.name === 'metadata' && prop.value.type === 'ObjectExpression') {
|
|
220
|
+
const metadataMap = parseObjectExpressionToMap(
|
|
221
|
+
prop.value as ASTObjectExpression
|
|
222
|
+
);
|
|
223
|
+
if (!description) {
|
|
224
|
+
description = metadataMap.get('description');
|
|
225
|
+
}
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Generate IDs
|
|
231
|
+
const id = getAgentId(projectId, deploymentId, filename, version);
|
|
232
|
+
const agentId = generateStableAgentId(projectId, name);
|
|
233
|
+
|
|
234
|
+
return {
|
|
235
|
+
filename,
|
|
236
|
+
name,
|
|
237
|
+
id,
|
|
238
|
+
agentId,
|
|
239
|
+
version,
|
|
240
|
+
description,
|
|
241
|
+
inputSchemaCode,
|
|
242
|
+
outputSchemaCode,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Also check variable declarations (e.g., const agent = createAgent(...))
|
|
249
|
+
if (node.type === 'VariableDeclaration') {
|
|
250
|
+
const declarations = (node as unknown as { declarations: ASTVariableDeclarator[] })
|
|
251
|
+
.declarations;
|
|
252
|
+
for (const decl of declarations) {
|
|
253
|
+
if (decl.init && decl.init.type === 'CallExpression') {
|
|
254
|
+
const callExpr = decl.init as ASTCallExpression;
|
|
255
|
+
|
|
256
|
+
if (
|
|
257
|
+
callExpr.callee.type === 'Identifier' &&
|
|
258
|
+
(callExpr.callee as ASTNodeIdentifier).name === 'createAgent' &&
|
|
259
|
+
callExpr.arguments.length >= 2
|
|
260
|
+
) {
|
|
261
|
+
const nameArg = callExpr.arguments[0] as ASTLiteral;
|
|
262
|
+
const name = String(nameArg.value);
|
|
263
|
+
|
|
264
|
+
const callargexp = callExpr.arguments[1] as ASTObjectExpression;
|
|
265
|
+
const { inputSchemaCode, outputSchemaCode } = extractSchemaCode(callargexp);
|
|
266
|
+
|
|
267
|
+
let description: string | undefined;
|
|
268
|
+
for (const prop of callargexp.properties) {
|
|
269
|
+
// Check for direct description property
|
|
270
|
+
if (prop.key.name === 'description' && prop.value.type === 'Literal') {
|
|
271
|
+
description = String((prop.value as ASTLiteral).value);
|
|
272
|
+
break; // Direct description takes precedence
|
|
273
|
+
}
|
|
274
|
+
// Also check metadata.description for backwards compat
|
|
275
|
+
if (prop.key.name === 'metadata' && prop.value.type === 'ObjectExpression') {
|
|
276
|
+
const metadataMap = parseObjectExpressionToMap(
|
|
277
|
+
prop.value as ASTObjectExpression
|
|
278
|
+
);
|
|
279
|
+
if (!description) {
|
|
280
|
+
description = metadataMap.get('description');
|
|
281
|
+
}
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const id = getAgentId(projectId, deploymentId, filename, version);
|
|
287
|
+
const agentId = generateStableAgentId(projectId, name);
|
|
288
|
+
|
|
289
|
+
return {
|
|
290
|
+
filename,
|
|
291
|
+
name,
|
|
292
|
+
id,
|
|
293
|
+
agentId,
|
|
294
|
+
version,
|
|
295
|
+
description,
|
|
296
|
+
inputSchemaCode,
|
|
297
|
+
outputSchemaCode,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Extract evals from eval.ts file (READ-ONLY)
|
|
310
|
+
*/
|
|
311
|
+
async function extractEvalMetadata(
|
|
312
|
+
evalsPath: string,
|
|
313
|
+
agentId: string,
|
|
314
|
+
projectId: string,
|
|
315
|
+
deploymentId: string,
|
|
316
|
+
logger: Logger
|
|
317
|
+
): Promise<EvalMetadata[]> {
|
|
318
|
+
const evalsFile = Bun.file(evalsPath);
|
|
319
|
+
if (!(await evalsFile.exists())) {
|
|
320
|
+
return [];
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
try {
|
|
324
|
+
const evalsSource = await evalsFile.text();
|
|
325
|
+
const transpiler = new Bun.Transpiler({ loader: 'ts', target: 'bun' });
|
|
326
|
+
const evalsContents = transpiler.transformSync(evalsSource);
|
|
327
|
+
const version = hash(evalsContents);
|
|
328
|
+
|
|
329
|
+
const ast = acornLoose.parse(evalsContents, { ecmaVersion: 'latest', sourceType: 'module' });
|
|
330
|
+
const evals: EvalMetadata[] = [];
|
|
331
|
+
|
|
332
|
+
// Find createEval calls
|
|
333
|
+
for (const node of (ast as { body: ASTNode[] }).body) {
|
|
334
|
+
if (node.type === 'ExportNamedDeclaration') {
|
|
335
|
+
const declaration = (
|
|
336
|
+
node as unknown as { declaration: { declarations?: ASTVariableDeclarator[] } }
|
|
337
|
+
).declaration;
|
|
338
|
+
|
|
339
|
+
if (declaration?.declarations) {
|
|
340
|
+
for (const decl of declaration.declarations) {
|
|
341
|
+
if (decl.init && decl.init.type === 'CallExpression') {
|
|
342
|
+
const callExpr = decl.init as ASTCallExpression;
|
|
343
|
+
|
|
344
|
+
if (
|
|
345
|
+
callExpr.callee.type === 'Identifier' &&
|
|
346
|
+
(callExpr.callee as ASTNodeIdentifier).name === 'createEval' &&
|
|
347
|
+
callExpr.arguments.length >= 2
|
|
348
|
+
) {
|
|
349
|
+
const nameArg = callExpr.arguments[0] as ASTLiteral;
|
|
350
|
+
const evalName = String(nameArg.value);
|
|
351
|
+
|
|
352
|
+
const callargexp = callExpr.arguments[1] as ASTObjectExpression;
|
|
353
|
+
let description: string | undefined;
|
|
354
|
+
|
|
355
|
+
for (const prop of callargexp.properties) {
|
|
356
|
+
if (
|
|
357
|
+
prop.key.name === 'metadata' &&
|
|
358
|
+
prop.value.type === 'ObjectExpression'
|
|
359
|
+
) {
|
|
360
|
+
const metadataMap = parseObjectExpressionToMap(
|
|
361
|
+
prop.value as ASTObjectExpression
|
|
362
|
+
);
|
|
363
|
+
description = metadataMap.get('description');
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const id = getEvalId(projectId, deploymentId, evalsPath, evalName, version);
|
|
369
|
+
const evalId = generateStableEvalId(projectId, agentId, evalName);
|
|
370
|
+
|
|
371
|
+
evals.push({
|
|
372
|
+
id,
|
|
373
|
+
evalId,
|
|
374
|
+
name: evalName,
|
|
375
|
+
filename: evalsPath,
|
|
376
|
+
version,
|
|
377
|
+
description,
|
|
378
|
+
agentIdentifier: agentId,
|
|
379
|
+
projectId,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return evals;
|
|
389
|
+
} catch (error) {
|
|
390
|
+
logger.warn(`Failed to parse evals from ${evalsPath}: ${error}`);
|
|
391
|
+
return [];
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Discover all agents in src/agent directory (READ-ONLY)
|
|
397
|
+
*/
|
|
398
|
+
export async function discoverAgents(
|
|
399
|
+
srcDir: string,
|
|
400
|
+
projectId: string,
|
|
401
|
+
deploymentId: string,
|
|
402
|
+
logger: Logger
|
|
403
|
+
): Promise<AgentMetadata[]> {
|
|
404
|
+
const agentsDir = join(srcDir, 'agent');
|
|
405
|
+
const agents: AgentMetadata[] = [];
|
|
406
|
+
|
|
407
|
+
// Check if agent directory exists
|
|
408
|
+
if (!existsSync(agentsDir)) {
|
|
409
|
+
logger.trace('No agent directory found at %s', agentsDir);
|
|
410
|
+
return agents;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
const transpiler = new Bun.Transpiler({ loader: 'ts', target: 'bun' });
|
|
414
|
+
|
|
415
|
+
// Scan all .ts files in agent directory
|
|
416
|
+
const glob = new Bun.Glob('**/*.ts');
|
|
417
|
+
for await (const file of glob.scan(agentsDir)) {
|
|
418
|
+
const filePath = join(agentsDir, file);
|
|
419
|
+
|
|
420
|
+
// Skip eval.ts files (processed separately)
|
|
421
|
+
if (file.endsWith('/eval.ts') || file === 'eval.ts') {
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
try {
|
|
426
|
+
const source = await Bun.file(filePath).text();
|
|
427
|
+
const contents = transpiler.transformSync(source);
|
|
428
|
+
|
|
429
|
+
// Use 'src/' prefix for consistency with bun bundler and registry imports
|
|
430
|
+
const rootDir = join(srcDir, '..');
|
|
431
|
+
const relativeFilename = relative(rootDir, filePath);
|
|
432
|
+
const agentMetadata = extractAgentMetadata(
|
|
433
|
+
contents,
|
|
434
|
+
relativeFilename,
|
|
435
|
+
projectId,
|
|
436
|
+
deploymentId
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
if (agentMetadata) {
|
|
440
|
+
logger.trace('Discovered agent: %s at %s', agentMetadata.name, relativeFilename);
|
|
441
|
+
|
|
442
|
+
// Check for evals in same directory
|
|
443
|
+
const agentDir = dirname(filePath);
|
|
444
|
+
const evalsPath = join(agentDir, 'eval.ts');
|
|
445
|
+
const evals = await extractEvalMetadata(
|
|
446
|
+
evalsPath,
|
|
447
|
+
agentMetadata.agentId,
|
|
448
|
+
projectId,
|
|
449
|
+
deploymentId,
|
|
450
|
+
logger
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
if (evals.length > 0) {
|
|
454
|
+
agentMetadata.evals = evals;
|
|
455
|
+
logger.trace('Found %d eval(s) for agent %s', evals.length, agentMetadata.name);
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
agents.push(agentMetadata);
|
|
459
|
+
}
|
|
460
|
+
} catch (error) {
|
|
461
|
+
logger.warn(`Failed to parse agent file ${filePath}: ${error}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
logger.debug('Discovered %d agent(s)', agents.length);
|
|
466
|
+
return agents;
|
|
467
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bun Dev Server
|
|
3
|
+
*
|
|
4
|
+
* Runs Bun server that handles ALL app logic (HTTP + WebSocket) and proxies
|
|
5
|
+
* frontend asset requests to Vite asset server for HMR support.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Logger } from '../../../types';
|
|
9
|
+
import { startViteAssetServer } from './vite-asset-server';
|
|
10
|
+
|
|
11
|
+
export interface BunDevServerOptions {
|
|
12
|
+
rootDir: string;
|
|
13
|
+
port?: number;
|
|
14
|
+
projectId?: string;
|
|
15
|
+
orgId?: string;
|
|
16
|
+
deploymentId?: string;
|
|
17
|
+
logger: Logger;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface BunDevServerResult {
|
|
21
|
+
viteAssetServer: { server: { close: () => void | Promise<void> }; port: number };
|
|
22
|
+
bunServerPort: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Start Bun dev server with Vite asset server for HMR
|
|
27
|
+
*/
|
|
28
|
+
export async function startBunDevServer(options: BunDevServerOptions): Promise<BunDevServerResult> {
|
|
29
|
+
const { rootDir, port = 3500, projectId = '', deploymentId = '', logger } = options;
|
|
30
|
+
|
|
31
|
+
logger.debug('Starting Bun dev server with Vite asset server for HMR...');
|
|
32
|
+
|
|
33
|
+
// Generate workbench source files if enabled (dev mode)
|
|
34
|
+
const { loadAgentuityConfig, getWorkbenchConfig } = await import('./config-loader');
|
|
35
|
+
const config = await loadAgentuityConfig(rootDir, logger);
|
|
36
|
+
const workbenchConfig = getWorkbenchConfig(config, true); // dev mode
|
|
37
|
+
|
|
38
|
+
if (workbenchConfig.enabled) {
|
|
39
|
+
logger.debug('Workbench enabled (dev mode), generating source files...');
|
|
40
|
+
const { generateWorkbenchFiles } = await import('./workbench-generator');
|
|
41
|
+
await generateWorkbenchFiles(rootDir, projectId, workbenchConfig, logger);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Step 1: Start Vite asset server FIRST and get its dynamic port
|
|
45
|
+
logger.info('🎨 Starting Vite asset server for HMR...');
|
|
46
|
+
const viteAssetServer = await startViteAssetServer({
|
|
47
|
+
rootDir,
|
|
48
|
+
logger,
|
|
49
|
+
workbenchPath: workbenchConfig.enabled ? workbenchConfig.route : undefined,
|
|
50
|
+
});
|
|
51
|
+
const vitePort = viteAssetServer.port;
|
|
52
|
+
|
|
53
|
+
// Step 2: Generate entry file with Vite port for asset proxying
|
|
54
|
+
logger.info('📝 Generating entry file with asset proxy configuration...');
|
|
55
|
+
const { generateEntryFile } = await import('../entry-generator');
|
|
56
|
+
await generateEntryFile({
|
|
57
|
+
rootDir,
|
|
58
|
+
projectId: projectId || '',
|
|
59
|
+
deploymentId: deploymentId || '',
|
|
60
|
+
logger,
|
|
61
|
+
mode: 'dev',
|
|
62
|
+
workbench: workbenchConfig.enabled ? workbenchConfig : undefined,
|
|
63
|
+
vitePort, // Pass Vite port for proxy routes
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Step 3: Load the generated app - this will start Bun.serve() internally
|
|
67
|
+
logger.info('📦 Loading generated app (Bun server will start)...');
|
|
68
|
+
const appPath = `${rootDir}/.agentuity/app.generated.ts`;
|
|
69
|
+
await import(appPath);
|
|
70
|
+
|
|
71
|
+
logger.info(`✅ Bun dev server started on http://127.0.0.1:${port}`);
|
|
72
|
+
logger.debug(`Asset requests (/@vite/*, /src/web/*, etc.) proxied to Vite:${vitePort}`);
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
viteAssetServer,
|
|
76
|
+
bunServerPort: port,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config loader for agentuity.config.ts
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import type { Logger } from '../../../types';
|
|
7
|
+
import type { AgentuityConfig } from '../../../types';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load agentuity.config.ts from the project root
|
|
11
|
+
* Returns null if the file doesn't exist or fails to load
|
|
12
|
+
*/
|
|
13
|
+
export async function loadAgentuityConfig(
|
|
14
|
+
rootDir: string,
|
|
15
|
+
logger: Logger
|
|
16
|
+
): Promise<AgentuityConfig | null> {
|
|
17
|
+
const configPath = join(rootDir, 'agentuity.config.ts');
|
|
18
|
+
|
|
19
|
+
if (!(await Bun.file(configPath).exists())) {
|
|
20
|
+
logger.trace('No agentuity.config.ts found');
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const config = await import(configPath);
|
|
26
|
+
const userConfig = config.default as AgentuityConfig | undefined;
|
|
27
|
+
|
|
28
|
+
if (!userConfig) {
|
|
29
|
+
logger.warn('agentuity.config.ts does not export a default configuration');
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
logger.trace('Loaded agentuity.config.ts');
|
|
34
|
+
return userConfig;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
logger.warn('Failed to load agentuity.config.ts:', error);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get workbench configuration with defaults
|
|
43
|
+
* NOTE: Workbench is only available in dev mode
|
|
44
|
+
*
|
|
45
|
+
* Presence of workbench config implicitly enables it (no explicit 'enabled' flag needed)
|
|
46
|
+
* Missing workbench config implicitly disables it
|
|
47
|
+
*/
|
|
48
|
+
export function getWorkbenchConfig(
|
|
49
|
+
config: AgentuityConfig | null,
|
|
50
|
+
dev: boolean
|
|
51
|
+
): {
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
route: string;
|
|
54
|
+
headers: Record<string, string>;
|
|
55
|
+
} {
|
|
56
|
+
const hasWorkbenchConfig = config?.workbench !== undefined;
|
|
57
|
+
|
|
58
|
+
// Workbench is enabled if:
|
|
59
|
+
// 1. In dev mode (never in production)
|
|
60
|
+
// 2. Config has a workbench object (presence implies enablement)
|
|
61
|
+
const enabled = dev && hasWorkbenchConfig;
|
|
62
|
+
|
|
63
|
+
const workbench = config?.workbench || {};
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
enabled,
|
|
67
|
+
route: workbench.route ?? '/workbench',
|
|
68
|
+
headers: workbench.headers ?? {},
|
|
69
|
+
};
|
|
70
|
+
}
|