@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.
Files changed (267) hide show
  1. package/AGENTS.md +54 -0
  2. package/dist/auth.d.ts +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +8 -5
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +190 -27
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cmd/build/entry-generator.d.ts +20 -0
  10. package/dist/cmd/build/entry-generator.d.ts.map +1 -0
  11. package/dist/cmd/build/entry-generator.js +366 -0
  12. package/dist/cmd/build/entry-generator.js.map +1 -0
  13. package/dist/cmd/build/index.d.ts.map +1 -1
  14. package/dist/cmd/build/index.js +5 -23
  15. package/dist/cmd/build/index.js.map +1 -1
  16. package/dist/cmd/build/vite/agent-discovery.d.ts +33 -0
  17. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -0
  18. package/dist/cmd/build/vite/agent-discovery.js +297 -0
  19. package/dist/cmd/build/vite/agent-discovery.js.map +1 -0
  20. package/dist/cmd/build/vite/browser-env-plugin.d.ts +9 -0
  21. package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +1 -0
  22. package/dist/cmd/build/vite/browser-env-plugin.js +28 -0
  23. package/dist/cmd/build/vite/browser-env-plugin.js.map +1 -0
  24. package/dist/cmd/build/vite/bun-dev-server.d.ts +29 -0
  25. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -0
  26. package/dist/cmd/build/vite/bun-dev-server.js +54 -0
  27. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -0
  28. package/dist/cmd/build/vite/config-loader.d.ts +23 -0
  29. package/dist/cmd/build/vite/config-loader.d.ts.map +1 -0
  30. package/dist/cmd/build/vite/config-loader.js +50 -0
  31. package/dist/cmd/build/vite/config-loader.js.map +1 -0
  32. package/dist/cmd/build/vite/index.d.ts +26 -0
  33. package/dist/cmd/build/vite/index.d.ts.map +1 -0
  34. package/dist/cmd/build/vite/index.js +127 -0
  35. package/dist/cmd/build/vite/index.js.map +1 -0
  36. package/dist/cmd/build/vite/lifecycle-generator.d.ts +11 -0
  37. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -0
  38. package/dist/cmd/build/vite/lifecycle-generator.js +35 -0
  39. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -0
  40. package/dist/cmd/build/vite/metadata-generator.d.ts +32 -0
  41. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -0
  42. package/dist/cmd/build/vite/metadata-generator.js +489 -0
  43. package/dist/cmd/build/vite/metadata-generator.js.map +1 -0
  44. package/dist/cmd/build/vite/patch-plugin.d.ts +21 -0
  45. package/dist/cmd/build/vite/patch-plugin.d.ts.map +1 -0
  46. package/dist/cmd/build/vite/patch-plugin.js +70 -0
  47. package/dist/cmd/build/vite/patch-plugin.js.map +1 -0
  48. package/dist/cmd/build/vite/registry-generator.d.ts +19 -0
  49. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -0
  50. package/dist/cmd/build/{route-registry.js → vite/registry-generator.js} +126 -48
  51. package/dist/cmd/build/vite/registry-generator.js.map +1 -0
  52. package/dist/cmd/build/vite/route-discovery.d.ts +58 -0
  53. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -0
  54. package/dist/cmd/build/vite/route-discovery.js +125 -0
  55. package/dist/cmd/build/vite/route-discovery.js.map +1 -0
  56. package/dist/cmd/build/vite/server-bundler.d.ts +16 -0
  57. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -0
  58. package/dist/cmd/build/vite/server-bundler.js +194 -0
  59. package/dist/cmd/build/vite/server-bundler.js.map +1 -0
  60. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +19 -0
  61. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -0
  62. package/dist/cmd/build/vite/vite-asset-server-config.js +105 -0
  63. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -0
  64. package/dist/cmd/build/vite/vite-asset-server.d.ts +23 -0
  65. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -0
  66. package/dist/cmd/build/vite/vite-asset-server.js +40 -0
  67. package/dist/cmd/build/vite/vite-asset-server.js.map +1 -0
  68. package/dist/cmd/build/vite/vite-builder.d.ts +44 -0
  69. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -0
  70. package/dist/cmd/build/vite/vite-builder.js +232 -0
  71. package/dist/cmd/build/vite/vite-builder.js.map +1 -0
  72. package/dist/cmd/build/vite/workbench-generator.d.ts +10 -0
  73. package/dist/cmd/build/vite/workbench-generator.d.ts.map +1 -0
  74. package/dist/cmd/build/vite/workbench-generator.js +135 -0
  75. package/dist/cmd/build/vite/workbench-generator.js.map +1 -0
  76. package/dist/cmd/build/vite-bundler.d.ts +23 -0
  77. package/dist/cmd/build/vite-bundler.d.ts.map +1 -0
  78. package/dist/cmd/build/vite-bundler.js +79 -0
  79. package/dist/cmd/build/vite-bundler.js.map +1 -0
  80. package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
  81. package/dist/cmd/cloud/agent/get.js +1 -0
  82. package/dist/cmd/cloud/agent/get.js.map +1 -1
  83. package/dist/cmd/cloud/agent/list.d.ts.map +1 -1
  84. package/dist/cmd/cloud/agent/list.js +1 -0
  85. package/dist/cmd/cloud/agent/list.js.map +1 -1
  86. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  87. package/dist/cmd/cloud/db/get.js +1 -0
  88. package/dist/cmd/cloud/db/get.js.map +1 -1
  89. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  90. package/dist/cmd/cloud/db/list.js +1 -0
  91. package/dist/cmd/cloud/db/list.js.map +1 -1
  92. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  93. package/dist/cmd/cloud/deploy.js +152 -128
  94. package/dist/cmd/cloud/deploy.js.map +1 -1
  95. package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
  96. package/dist/cmd/cloud/deployment/list.js +4 -0
  97. package/dist/cmd/cloud/deployment/list.js.map +1 -1
  98. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  99. package/dist/cmd/cloud/env/list.js +1 -0
  100. package/dist/cmd/cloud/env/list.js.map +1 -1
  101. package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
  102. package/dist/cmd/cloud/keyvalue/get.js +1 -0
  103. package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
  104. package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -1
  105. package/dist/cmd/cloud/keyvalue/keys.js +1 -0
  106. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -1
  107. package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -1
  108. package/dist/cmd/cloud/keyvalue/list-namespaces.js +1 -0
  109. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -1
  110. package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
  111. package/dist/cmd/cloud/keyvalue/stats.js +1 -0
  112. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
  113. package/dist/cmd/cloud/secret/list.d.ts.map +1 -1
  114. package/dist/cmd/cloud/secret/list.js +1 -0
  115. package/dist/cmd/cloud/secret/list.js.map +1 -1
  116. package/dist/cmd/cloud/session/list.d.ts.map +1 -1
  117. package/dist/cmd/cloud/session/list.js +4 -0
  118. package/dist/cmd/cloud/session/list.js.map +1 -1
  119. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  120. package/dist/cmd/cloud/storage/get.js +1 -0
  121. package/dist/cmd/cloud/storage/get.js.map +1 -1
  122. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  123. package/dist/cmd/cloud/storage/list.js +3 -0
  124. package/dist/cmd/cloud/storage/list.js.map +1 -1
  125. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  126. package/dist/cmd/cloud/stream/get.js +1 -0
  127. package/dist/cmd/cloud/stream/get.js.map +1 -1
  128. package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
  129. package/dist/cmd/cloud/stream/list.js +1 -0
  130. package/dist/cmd/cloud/stream/list.js.map +1 -1
  131. package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
  132. package/dist/cmd/cloud/vector/get.js +1 -0
  133. package/dist/cmd/cloud/vector/get.js.map +1 -1
  134. package/dist/cmd/cloud/vector/search.d.ts.map +1 -1
  135. package/dist/cmd/cloud/vector/search.js +1 -0
  136. package/dist/cmd/cloud/vector/search.js.map +1 -1
  137. package/dist/cmd/dev/index.d.ts.map +1 -1
  138. package/dist/cmd/dev/index.js +289 -758
  139. package/dist/cmd/dev/index.js.map +1 -1
  140. package/dist/cmd/dev/sync.d.ts +1 -1
  141. package/dist/cmd/dev/sync.d.ts.map +1 -1
  142. package/dist/cmd/dev/sync.js +3 -0
  143. package/dist/cmd/dev/sync.js.map +1 -1
  144. package/dist/cmd/profile/show.d.ts.map +1 -1
  145. package/dist/cmd/profile/show.js +3 -4
  146. package/dist/cmd/profile/show.js.map +1 -1
  147. package/dist/cmd/project/create.d.ts.map +1 -1
  148. package/dist/cmd/project/create.js +3 -4
  149. package/dist/cmd/project/create.js.map +1 -1
  150. package/dist/cmd/project/list.d.ts.map +1 -1
  151. package/dist/cmd/project/list.js +1 -0
  152. package/dist/cmd/project/list.js.map +1 -1
  153. package/dist/cmd/project/show.d.ts.map +1 -1
  154. package/dist/cmd/project/show.js +1 -0
  155. package/dist/cmd/project/show.js.map +1 -1
  156. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  157. package/dist/cmd/upgrade/index.js +5 -3
  158. package/dist/cmd/upgrade/index.js.map +1 -1
  159. package/dist/config.d.ts +1 -1
  160. package/dist/config.d.ts.map +1 -1
  161. package/dist/config.js +29 -11
  162. package/dist/config.js.map +1 -1
  163. package/dist/index.d.ts +1 -1
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js.map +1 -1
  166. package/dist/runtime-bootstrap.d.ts +3 -2
  167. package/dist/runtime-bootstrap.d.ts.map +1 -1
  168. package/dist/runtime-bootstrap.js +7 -2
  169. package/dist/runtime-bootstrap.js.map +1 -1
  170. package/dist/schemas/deploy.d.ts +1 -1
  171. package/dist/types.d.ts +40 -1
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/types.js.map +1 -1
  174. package/dist/utils/bun-version-checker.d.ts +11 -0
  175. package/dist/utils/bun-version-checker.d.ts.map +1 -0
  176. package/dist/utils/bun-version-checker.js +56 -0
  177. package/dist/utils/bun-version-checker.js.map +1 -0
  178. package/dist/version-check.d.ts.map +1 -1
  179. package/dist/version-check.js +5 -2
  180. package/dist/version-check.js.map +1 -1
  181. package/package.json +10 -3
  182. package/src/auth.ts +9 -5
  183. package/src/cli.ts +228 -29
  184. package/src/cmd/build/entry-generator.ts +404 -0
  185. package/src/cmd/build/index.ts +7 -28
  186. package/src/cmd/build/vite/agent-discovery.ts +467 -0
  187. package/src/cmd/build/vite/browser-env-plugin.ts +34 -0
  188. package/src/cmd/build/vite/bun-dev-server.ts +78 -0
  189. package/src/cmd/build/vite/config-loader.ts +70 -0
  190. package/src/cmd/build/vite/index.ts +166 -0
  191. package/src/cmd/build/vite/lifecycle-generator.ts +43 -0
  192. package/src/cmd/build/vite/metadata-generator.ts +602 -0
  193. package/src/cmd/build/vite/patch-plugin.ts +88 -0
  194. package/src/cmd/build/vite/registry-generator.ts +288 -0
  195. package/src/cmd/build/vite/route-discovery.ts +186 -0
  196. package/src/cmd/build/vite/server-bundler.ts +258 -0
  197. package/src/cmd/build/vite/vite-asset-server-config.ts +134 -0
  198. package/src/cmd/build/vite/vite-asset-server.ts +63 -0
  199. package/src/cmd/build/vite/vite-builder.ts +284 -0
  200. package/src/cmd/build/vite/workbench-generator.ts +152 -0
  201. package/src/cmd/build/vite-bundler.ts +110 -0
  202. package/src/cmd/cloud/agent/get.ts +2 -0
  203. package/src/cmd/cloud/agent/list.ts +1 -0
  204. package/src/cmd/cloud/db/get.ts +1 -0
  205. package/src/cmd/cloud/db/list.ts +1 -0
  206. package/src/cmd/cloud/deploy.ts +175 -144
  207. package/src/cmd/cloud/deployment/list.ts +4 -0
  208. package/src/cmd/cloud/env/list.ts +1 -0
  209. package/src/cmd/cloud/keyvalue/get.ts +1 -0
  210. package/src/cmd/cloud/keyvalue/keys.ts +1 -0
  211. package/src/cmd/cloud/keyvalue/list-namespaces.ts +1 -0
  212. package/src/cmd/cloud/keyvalue/stats.ts +2 -0
  213. package/src/cmd/cloud/secret/list.ts +1 -0
  214. package/src/cmd/cloud/session/list.ts +4 -0
  215. package/src/cmd/cloud/storage/get.ts +1 -0
  216. package/src/cmd/cloud/storage/list.ts +4 -0
  217. package/src/cmd/cloud/stream/get.ts +1 -0
  218. package/src/cmd/cloud/stream/list.ts +1 -0
  219. package/src/cmd/cloud/vector/get.ts +1 -0
  220. package/src/cmd/cloud/vector/search.ts +1 -0
  221. package/src/cmd/dev/index.ts +319 -921
  222. package/src/cmd/dev/sync.ts +5 -1
  223. package/src/cmd/profile/show.ts +3 -4
  224. package/src/cmd/project/create.ts +3 -4
  225. package/src/cmd/project/list.ts +1 -0
  226. package/src/cmd/project/show.ts +1 -0
  227. package/src/cmd/upgrade/index.ts +6 -3
  228. package/src/config.ts +31 -11
  229. package/src/index.ts +2 -0
  230. package/src/runtime-bootstrap.ts +8 -2
  231. package/src/types.ts +48 -1
  232. package/src/utils/bun-version-checker.ts +70 -0
  233. package/src/version-check.ts +6 -2
  234. package/dist/cmd/build/bundler.d.ts +0 -28
  235. package/dist/cmd/build/bundler.d.ts.map +0 -1
  236. package/dist/cmd/build/bundler.js +0 -800
  237. package/dist/cmd/build/bundler.js.map +0 -1
  238. package/dist/cmd/build/config-loader.d.ts +0 -16
  239. package/dist/cmd/build/config-loader.d.ts.map +0 -1
  240. package/dist/cmd/build/config-loader.js +0 -227
  241. package/dist/cmd/build/config-loader.js.map +0 -1
  242. package/dist/cmd/build/file.d.ts +0 -2
  243. package/dist/cmd/build/file.d.ts.map +0 -1
  244. package/dist/cmd/build/file.js +0 -10
  245. package/dist/cmd/build/file.js.map +0 -1
  246. package/dist/cmd/build/fix-duplicate-exports.d.ts +0 -2
  247. package/dist/cmd/build/fix-duplicate-exports.d.ts.map +0 -1
  248. package/dist/cmd/build/fix-duplicate-exports.js +0 -170
  249. package/dist/cmd/build/fix-duplicate-exports.js.map +0 -1
  250. package/dist/cmd/build/plugin.d.ts +0 -6
  251. package/dist/cmd/build/plugin.d.ts.map +0 -1
  252. package/dist/cmd/build/plugin.js +0 -645
  253. package/dist/cmd/build/plugin.js.map +0 -1
  254. package/dist/cmd/build/route-discovery.d.ts +0 -54
  255. package/dist/cmd/build/route-discovery.d.ts.map +0 -1
  256. package/dist/cmd/build/route-discovery.js +0 -148
  257. package/dist/cmd/build/route-discovery.js.map +0 -1
  258. package/dist/cmd/build/route-registry.d.ts +0 -38
  259. package/dist/cmd/build/route-registry.d.ts.map +0 -1
  260. package/dist/cmd/build/route-registry.js.map +0 -1
  261. package/src/cmd/build/bundler.ts +0 -965
  262. package/src/cmd/build/config-loader.ts +0 -268
  263. package/src/cmd/build/file.ts +0 -10
  264. package/src/cmd/build/fix-duplicate-exports.ts +0 -207
  265. package/src/cmd/build/plugin.ts +0 -782
  266. package/src/cmd/build/route-discovery.ts +0 -202
  267. package/src/cmd/build/route-registry.ts +0 -222
@@ -1,965 +0,0 @@
1
- import { $, semver } from 'bun';
2
- import { join, relative, resolve, dirname, basename } from 'node:path';
3
- import { cpSync, existsSync, mkdirSync, rmSync, readdirSync, readFileSync } from 'node:fs';
4
- import gitParseUrl from 'git-url-parse';
5
- import { StructuredError } from '@agentuity/core';
6
- import * as tui from '../../tui';
7
- import { pauseStepUI } from '../../steps';
8
- import AgentuityBundler, { getBuildMetadata } from './plugin';
9
- import { getFilesRecursively } from './file';
10
- import { getVersion } from '../../version';
11
- import type { Project } from '../../types';
12
- import { fixDuplicateExportsInDirectory } from './fix-duplicate-exports';
13
- import type { Logger, BuildContext } from '../../types';
14
- import { generateWorkbenchMainTsx, generateWorkbenchIndexHtml } from './workbench';
15
- import { analyzeWorkbench, type WorkbenchAnalysis } from './ast';
16
- import { type DeployOptions } from '../../schemas/deploy';
17
- import { checkAndUpgradeDependencies } from '../../utils/dependency-checker';
18
- import { loadBuildConfig, executeBuildConfig, mergeBuildConfig } from './config-loader';
19
-
20
- const minBunVersion = '>=1.3.3';
21
-
22
- /**
23
- * Get correct MIME type for a file based on its extension.
24
- * Fixes Bun.build bug where artifact.type returns incorrect MIME types.
25
- * See: https://github.com/oven-sh/bun/issues/20131
26
- */
27
- export function getCorrectMimeType(filename: string, bunType: string): string {
28
- const ext = filename.split('.').pop()?.toLowerCase();
29
-
30
- // Map common web asset extensions to correct MIME types
31
- const mimeMap: Record<string, string> = {
32
- 'css': 'text/css;charset=utf-8',
33
- 'js': 'text/javascript;charset=utf-8',
34
- 'mjs': 'text/javascript;charset=utf-8',
35
- 'json': 'application/json;charset=utf-8',
36
- 'svg': 'image/svg+xml',
37
- 'png': 'image/png',
38
- 'jpg': 'image/jpeg',
39
- 'jpeg': 'image/jpeg',
40
- 'gif': 'image/gif',
41
- 'webp': 'image/webp',
42
- 'woff': 'font/woff',
43
- 'woff2': 'font/woff2',
44
- 'ttf': 'font/ttf',
45
- 'otf': 'font/otf',
46
- 'map': 'application/json;charset=utf-8',
47
- };
48
-
49
- // Use extension-based mapping if available, otherwise fall back to Bun's type
50
- return ext && mimeMap[ext] ? mimeMap[ext] : bunType;
51
- }
52
-
53
- async function checkBunVersion(): Promise<string[]> {
54
- if (semver.satisfies(Bun.version, minBunVersion)) {
55
- return []; // Version is OK, no output needed
56
- }
57
-
58
- const message = `Bun is using version ${Bun.version}. This project requires Bun version ${minBunVersion} to build.`;
59
-
60
- if (process.stdin.isTTY && process.stdout.isTTY) {
61
- // Pause the step UI for interactive prompt
62
- const resume = pauseStepUI();
63
-
64
- tui.warning(message);
65
- const ok = await tui.confirm('Would you like to upgrade now?');
66
-
67
- // Small delay to ensure console.log('') in confirm completes
68
- await new Promise((resolve) => setTimeout(resolve, 10));
69
-
70
- resume(); // Resume step UI
71
-
72
- if (ok) {
73
- await $`bun upgrade`.quiet();
74
- const version = (await $`bun -v`.quiet().text()).trim();
75
- // Return success message to show in output box
76
- return [tui.colorSuccess(`Upgraded Bun to ${version}`)];
77
- }
78
- }
79
-
80
- // Failed to upgrade or user declined
81
- throw new InvalidBunVersion({
82
- current: Bun.version,
83
- required: minBunVersion,
84
- message,
85
- });
86
- }
87
-
88
- export interface BundleOptions extends DeployOptions {
89
- rootDir: string;
90
- dev?: boolean;
91
- env?: Map<string, string>;
92
- orgId?: string;
93
- projectId?: string;
94
- deploymentId?: string;
95
- project?: Project;
96
- port?: number;
97
- outDir?: string;
98
- region: string;
99
- logger: Logger;
100
- workbench?: WorkbenchAnalysis;
101
- }
102
-
103
- type BuildResult = Awaited<ReturnType<typeof Bun.build>>;
104
- type BuildLogs = BuildResult['logs'];
105
-
106
- const AppFileNotFoundError = StructuredError('AppFileNotFoundError');
107
- const AgentsDirNotFoundError = StructuredError('AgentsDirNotFoundError');
108
- const BuildFailedError = StructuredError('BuildFailedError')<{ logs?: BuildLogs }>();
109
- const InvalidBunVersion = StructuredError('InvalidBunVersion')<{
110
- current: string;
111
- required: string;
112
- }>();
113
-
114
- /**
115
- * Finds the workspace root by walking up the directory tree looking for a package.json with workspaces
116
- */
117
- function findWorkspaceRoot(startDir: string): string | null {
118
- let currentDir = startDir;
119
- while (true) {
120
- const pkgPath = join(currentDir, 'package.json');
121
- if (existsSync(pkgPath)) {
122
- try {
123
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
124
- if (pkg.workspaces) {
125
- return currentDir;
126
- }
127
- } catch {
128
- // Ignore parse errors, continue searching
129
- }
130
- }
131
- const parent = resolve(currentDir, '..');
132
- if (parent === currentDir) break; // reached filesystem root
133
- currentDir = parent;
134
- }
135
- return null;
136
- }
137
-
138
- /**
139
- * Finds a package by searching multiple locations:
140
- * 1. App-level node_modules
141
- * 2. Workspace root node_modules
142
- * 3. Workspace packages directory (for workspace packages)
143
- *
144
- * @param rootDir - Root directory of the project
145
- * @param packageName - Package name (e.g., '@agentuity/workbench')
146
- * @param logger - Optional logger for debug messages
147
- * @returns Path to the package directory, or null if not found
148
- */
149
- function findPackagePath(rootDir: string, packageName: string, logger?: Logger): string | null {
150
- const [scope, name] = packageName.startsWith('@')
151
- ? packageName.slice(1).split('/')
152
- : [null, packageName];
153
-
154
- // 1. Try app-level node_modules
155
- const appLevelPath = scope
156
- ? join(rootDir, 'node_modules', `@${scope}`, name)
157
- : join(rootDir, 'node_modules', name);
158
- if (existsSync(appLevelPath)) {
159
- logger?.debug(`Found ${packageName} at app level: ${appLevelPath}`);
160
- return appLevelPath;
161
- }
162
-
163
- // 2. Try workspace root node_modules
164
- const workspaceRoot = findWorkspaceRoot(rootDir);
165
- if (workspaceRoot) {
166
- const rootLevelPath = scope
167
- ? join(workspaceRoot, 'node_modules', `@${scope}`, name)
168
- : join(workspaceRoot, 'node_modules', name);
169
- if (existsSync(rootLevelPath)) {
170
- logger?.debug(`Found ${packageName} at workspace root: ${rootLevelPath}`);
171
- return rootLevelPath;
172
- }
173
-
174
- // 3. Try workspace packages directory
175
- const workspacePackagePath = join(workspaceRoot, 'packages', name);
176
- if (existsSync(workspacePackagePath)) {
177
- logger?.debug(`Found ${packageName} in workspace packages: ${workspacePackagePath}`);
178
- return workspacePackagePath;
179
- }
180
- }
181
-
182
- return null;
183
- }
184
-
185
- const handleBuildFailure = (buildResult: BuildResult) => {
186
- // Collect all build errors with full details
187
- const errorMessages = buildResult.logs
188
- .map((log) => {
189
- const parts = [log.message];
190
- if (log.position) {
191
- parts.push(` at ${log.position.file}:${log.position.line}:${log.position.column}`);
192
- }
193
- return parts.join('\n');
194
- })
195
- .join('\n');
196
- throw new BuildFailedError({
197
- message: errorMessages || 'Build failed with no error messages',
198
- logs: buildResult.logs,
199
- });
200
- };
201
-
202
- export async function bundle({
203
- orgId,
204
- projectId,
205
- deploymentId,
206
- dev = false,
207
- rootDir,
208
- project,
209
- outDir: customOutDir,
210
- tag,
211
- logsUrl,
212
- commitUrl,
213
- provider,
214
- trigger,
215
- event,
216
- pullRequestNumber,
217
- pullRequestCommentId,
218
- pullRequestURL,
219
- message,
220
- env,
221
- region,
222
- logger,
223
- workbench,
224
- }: BundleOptions): Promise<{ output: string[] }> {
225
- const output: string[] = [];
226
- const hasSdkKey = !!process.env.AGENTUITY_SDK_KEY;
227
-
228
- const appFile = join(rootDir, 'app.ts');
229
- if (!existsSync(appFile)) {
230
- throw new AppFileNotFoundError({
231
- message: `App file not found at expected location: ${appFile}`,
232
- });
233
- }
234
-
235
- const versionOutput = await checkBunVersion();
236
- output.push(...versionOutput);
237
-
238
- // Check and upgrade @agentuity/* dependencies if needed
239
- const upgradeResult = await checkAndUpgradeDependencies(rootDir, logger);
240
- if (upgradeResult.failed.length > 0 && process.stdin.isTTY) {
241
- throw new BuildFailedError({
242
- message: `Failed to upgrade dependencies: ${upgradeResult.failed.join(', ')}`,
243
- });
244
- }
245
-
246
- const outDir = customOutDir ?? join(rootDir, '.agentuity');
247
- const srcDir = join(rootDir, 'src');
248
-
249
- const appEntrypoints: string[] = [];
250
-
251
- for (const folder of ['web', 'agent']) {
252
- const dir = join(srcDir, folder);
253
- if (!existsSync(dir)) {
254
- if (folder === 'agent') {
255
- throw new AgentsDirNotFoundError({ message: `Expected directory not found: ${dir}` });
256
- }
257
- continue;
258
- }
259
- const files = await getFilesRecursively(dir);
260
- for (const filename of files) {
261
- if (
262
- /\.[jt]s?$/.test(filename) &&
263
- !filename.includes('.generated.') &&
264
- basename(filename) !== 'AGENTS.md'
265
- ) {
266
- appEntrypoints.push(filename);
267
- }
268
- }
269
- }
270
- appEntrypoints.push(appFile);
271
-
272
- if (existsSync(outDir)) {
273
- rmSync(outDir, { recursive: true, force: true });
274
- }
275
- // Ensure output directory and subdirectories exist before building
276
- mkdirSync(outDir, { recursive: true });
277
- mkdirSync(join(outDir, 'chunk'), { recursive: true });
278
- mkdirSync(join(outDir, 'asset'), { recursive: true });
279
-
280
- // Pre-create all nested source directories in output
281
- // This is needed because Bun.build with naming.entry preserves structure
282
- // but doesn't create nested directories automatically
283
- for (const entrypoint of appEntrypoints) {
284
- const relPath = relative(rootDir, dirname(entrypoint));
285
- const outputSubdir = join(outDir, relPath);
286
- mkdirSync(outputSubdir, { recursive: true });
287
- }
288
-
289
- const pkgFile = Bun.file(join(rootDir, 'package.json'));
290
- const pkgContents = JSON.parse(await pkgFile.text());
291
- const isProd = !dev;
292
-
293
- const define: Record<string, string> = {
294
- 'process.env.AGENTUITY_CLOUD_SDK_VERSION': JSON.stringify(getVersion() ?? '1.0.0'),
295
- 'process.env.NODE_ENV': JSON.stringify(isProd ? 'production' : 'development'),
296
- 'process.env.AGENTUITY_PUBLIC_HAS_SDK_KEY': JSON.stringify(hasSdkKey ? 'true' : 'false'),
297
- };
298
-
299
- if (orgId) {
300
- define['process.env.AGENTUITY_CLOUD_ORG_ID'] = JSON.stringify(orgId);
301
- }
302
- if (projectId) {
303
- define['process.env.AGENTUITY_CLOUD_PROJECT_ID'] = JSON.stringify(projectId);
304
- }
305
- if (deploymentId) {
306
- define['process.env.AGENTUITY_CLOUD_DEPLOYMENT_ID'] = JSON.stringify(deploymentId);
307
- }
308
-
309
- if (env) {
310
- for (const [key, value] of env) {
311
- define[`process.env.${key}`] = JSON.stringify(value);
312
- }
313
- }
314
-
315
- // Common externals for native modules (same as legacy CLI)
316
- const commonExternals = ['bun', 'fsevents', 'chromium-bidi', 'sharp'];
317
-
318
- // Allow projects to specify custom externals via package.json "externals" field
319
- const customExternals: string[] = [];
320
- if (pkgContents.externals && Array.isArray(pkgContents.externals)) {
321
- customExternals.push(...pkgContents.externals.filter((e: unknown) => typeof e === 'string'));
322
- }
323
-
324
- const externalPatterns = [...commonExternals, ...customExternals];
325
-
326
- // For production builds: install externals FIRST, then discover full dependency tree
327
- // This prevents bundling dependencies that will be in node_modules anyway
328
- let external = externalPatterns;
329
- if (!dev) {
330
- logger.debug('Installing externalized packages to discover full dependency tree...');
331
-
332
- // Step 1: Collect packages matching external patterns
333
- const externalInstalls: string[] = [];
334
- for (const pattern of externalPatterns) {
335
- if (pattern.endsWith('/*')) {
336
- const prefix = pattern.slice(0, -2);
337
- const nmDir = join(rootDir, 'node_modules', prefix);
338
- if (existsSync(nmDir)) {
339
- const entries = readdirSync(nmDir);
340
- for (const entry of entries) {
341
- const pkgName = `${prefix}/${entry}`;
342
- if (existsSync(join(rootDir, 'node_modules', pkgName))) {
343
- externalInstalls.push(pkgName);
344
- }
345
- }
346
- }
347
- } else {
348
- if (existsSync(join(rootDir, 'node_modules', pattern))) {
349
- externalInstalls.push(pattern);
350
- }
351
- }
352
- }
353
-
354
- // Step 2: Write minimal package.json and install externals
355
- if (externalInstalls.length > 0) {
356
- await Bun.write(
357
- `${outDir}/package.json`,
358
- JSON.stringify({ name: pkgContents.name, version: pkgContents.version }, null, 2)
359
- );
360
-
361
- logger.debug(
362
- 'Installing %d packages: %s',
363
- externalInstalls.length,
364
- externalInstalls.join(', ')
365
- );
366
- await $`bun install --no-save --ignore-scripts --target=bun-linux-x64 ${externalInstalls}`
367
- .cwd(outDir)
368
- .quiet();
369
-
370
- // Step 3: Scan what actually got installed (includes transitive dependencies)
371
- const installedNmDir = join(outDir, 'node_modules');
372
- if (existsSync(installedNmDir)) {
373
- const allInstalled: string[] = [];
374
-
375
- // Recursively find all installed packages
376
- const scanDir = (dir: string, prefix = '') => {
377
- const entries = readdirSync(dir, { withFileTypes: true });
378
- for (const entry of entries) {
379
- if (entry.isDirectory()) {
380
- const pkgName = prefix ? `${prefix}/${entry.name}` : entry.name;
381
-
382
- // Check if this is a package (has package.json)
383
- if (existsSync(join(dir, entry.name, 'package.json'))) {
384
- allInstalled.push(pkgName);
385
- }
386
-
387
- // Recurse into scoped packages (@org/package)
388
- if (entry.name.startsWith('@')) {
389
- scanDir(join(dir, entry.name), entry.name);
390
- }
391
- }
392
- }
393
- };
394
-
395
- scanDir(installedNmDir);
396
- logger.debug(
397
- 'Discovered %d total packages (including dependencies)',
398
- allInstalled.length
399
- );
400
-
401
- // Step 4: Use ALL installed packages as externals for bundling
402
- external = allInstalled;
403
- }
404
- }
405
- }
406
-
407
- const tsconfigPath = join(rootDir, 'tsconfig.json');
408
- const hasTsconfig = existsSync(tsconfigPath);
409
-
410
- // Load user build config (if it exists)
411
- const buildConfigFunction = await loadBuildConfig(rootDir);
412
-
413
- // Helper to create build context for config function
414
- const createBuildContext = (): BuildContext => ({
415
- rootDir,
416
- dev,
417
- outDir,
418
- srcDir,
419
- orgId,
420
- projectId,
421
- region,
422
- logger,
423
- });
424
-
425
- await (async () => {
426
- const baseConfig: Bun.BuildConfig = {
427
- entrypoints: appEntrypoints,
428
- root: rootDir,
429
- outdir: outDir,
430
- define,
431
- sourcemap: dev ? 'inline' : 'external',
432
- env: 'disable',
433
- plugins: [AgentuityBundler],
434
- target: 'bun',
435
- format: 'esm',
436
- banner: `// Generated file. DO NOT EDIT`,
437
- // Disable minify for server bundle (keep code readable for debugging)
438
- minify: !dev,
439
- drop: isProd ? ['debugger'] : undefined,
440
- // Disable splitting - causes module initialization issues with externalized packages
441
- // The chunk helper functions (__commonJS, __esm, etc.) don't properly handle
442
- // CommonJS packages in node_modules that require() other modules
443
- splitting: false,
444
- conditions: [isProd ? 'production' : 'development', 'bun'],
445
- external,
446
- naming: {
447
- entry: '[dir]/[name].[ext]',
448
- chunk: 'chunk/[name]-[hash].[ext]',
449
- asset: 'asset/[name]-[hash].[ext]',
450
- },
451
- tsconfig: hasTsconfig ? tsconfigPath : undefined,
452
- };
453
-
454
- // Apply user config for 'api' phase
455
- let finalConfig = baseConfig;
456
- if (buildConfigFunction) {
457
- const userConfig = await executeBuildConfig(
458
- buildConfigFunction,
459
- 'api',
460
- createBuildContext()
461
- );
462
- finalConfig = mergeBuildConfig(baseConfig, userConfig);
463
- }
464
-
465
- const buildResult = await Bun.build(finalConfig);
466
- if (!buildResult.success) {
467
- handleBuildFailure(buildResult);
468
- }
469
- })();
470
-
471
- const buildmetadata = getBuildMetadata();
472
- buildmetadata.assets = [];
473
- buildmetadata.project = {
474
- id: projectId ?? '',
475
- name: pkgContents.name,
476
- version: pkgContents.version,
477
- description: pkgContents.description,
478
- keywords: pkgContents.keywords,
479
- orgId: orgId ?? '',
480
- };
481
- buildmetadata.deployment = {
482
- ...(project?.deployment ?? {}),
483
- build: {
484
- bun: Bun.version,
485
- agentuity: '',
486
- arch: process.arch,
487
- platform: process.platform,
488
- },
489
- date: new Date().toUTCString(),
490
- id: deploymentId ?? '',
491
- };
492
- if (!dev) {
493
- // try local first
494
- const agNMPackage = join(rootDir, 'node_modules', '@agentuity', 'cli', 'package.json');
495
- if (existsSync(agNMPackage)) {
496
- try {
497
- const npmpkg = await Bun.file(agNMPackage).json();
498
- if (npmpkg.version) {
499
- buildmetadata.deployment.build.agentuity = npmpkg.version;
500
- }
501
- } catch {
502
- // Ignore malformed package.json
503
- }
504
- } else {
505
- try {
506
- // now try the global
507
- const r = $`bunx @agentuity/cli version`.quiet().nothrow();
508
- if (r) {
509
- const version = await r.text();
510
- if (version) {
511
- buildmetadata.deployment.build.agentuity = version.trim();
512
- }
513
- }
514
- } catch {
515
- // ignore error from bunx
516
- }
517
- }
518
- }
519
-
520
- // Set public environment variables for workbench (must be set before web build)
521
-
522
- // Analyze workbench config early to set environment variables for web build
523
- let workbenchPath = '';
524
- if (existsSync(appFile)) {
525
- if (!workbench) {
526
- const appContent = await Bun.file(appFile).text();
527
- workbench = analyzeWorkbench(appContent);
528
- }
529
-
530
- if (workbench.hasWorkbench) {
531
- // Create workbench config with proper defaults
532
- const defaultConfig = { route: '/workbench', headers: {} };
533
- const config = { ...defaultConfig, ...workbench.config };
534
- workbenchPath = config.route;
535
- }
536
- }
537
- // Always set this, even if empty (for template compatibility)
538
- define['process.env.AGENTUITY_PUBLIC_WORKBENCH_PATH'] = JSON.stringify(workbenchPath);
539
-
540
- // web folder is optional
541
- const webDir = join(srcDir, 'web');
542
- if (existsSync(webDir)) {
543
- await (async () => {
544
- // Find workspace root for monorepo support
545
- let workspaceRoot = rootDir;
546
- let currentDir = rootDir;
547
- while (true) {
548
- const pkgPath = join(currentDir, 'package.json');
549
- if (existsSync(pkgPath)) {
550
- const pkg = JSON.parse(await Bun.file(pkgPath).text());
551
- if (pkg.workspaces) {
552
- workspaceRoot = currentDir;
553
- break;
554
- }
555
- }
556
- const parent = resolve(currentDir, '..');
557
- if (parent === currentDir) break; // reached filesystem root
558
- currentDir = parent;
559
- }
560
-
561
- // Make webEntrypoints - just the HTML files themselves
562
- const webEntrypoints = [...new Bun.Glob('**.html').scanSync(webDir)].map((htmlFile) =>
563
- resolve(webDir, htmlFile)
564
- );
565
-
566
- if (webEntrypoints.length) {
567
- const webOutDir = join(outDir, 'web');
568
- mkdirSync(webOutDir, { recursive: true });
569
- mkdirSync(join(webOutDir, 'chunk'), { recursive: true });
570
- mkdirSync(join(webOutDir, 'asset'), { recursive: true });
571
- const isLocalRegion = region === 'local' || region === 'l';
572
-
573
- const baseConfig: Bun.BuildConfig = {
574
- entrypoints: webEntrypoints,
575
- root: webDir,
576
- outdir: webOutDir,
577
- define,
578
- sourcemap: dev ? 'inline' : 'linked',
579
- env: 'AGENTUITY_PUBLIC_*',
580
- plugins: [AgentuityBundler],
581
- target: 'browser',
582
- format: 'esm',
583
- banner: `// Generated file. DO NOT EDIT`,
584
- minify: true,
585
- drop: isProd ? ['debugger'] : undefined,
586
- splitting: true,
587
- packages: 'bundle',
588
- external: workspaceRoot !== rootDir ? [] : undefined,
589
- // Ensure React is resolved from the consuming app's node_modules
590
- conditions: ['browser', 'import', 'default'],
591
- publicPath:
592
- isProd && deploymentId && !isLocalRegion
593
- ? `https://static.agentuity.com/${deploymentId}/`
594
- : undefined,
595
- naming: {
596
- entry: '[dir]/[name].[ext]',
597
- chunk: 'web/chunk/[name]-[hash].[ext]',
598
- asset: 'web/asset/[name]-[hash].[ext]',
599
- },
600
- tsconfig: hasTsconfig ? tsconfigPath : undefined,
601
- };
602
-
603
- // Apply user config for 'web' phase
604
- let finalConfig = baseConfig;
605
- if (buildConfigFunction) {
606
- const userConfig = await executeBuildConfig(
607
- buildConfigFunction,
608
- 'web',
609
- createBuildContext()
610
- );
611
- finalConfig = mergeBuildConfig(baseConfig, userConfig);
612
- }
613
-
614
- const result = await Bun.build(finalConfig);
615
- if (result.success) {
616
- // Fix duplicate exports caused by Bun splitting bug
617
- // See: https://github.com/oven-sh/bun/issues/5344
618
- await fixDuplicateExportsInDirectory(join(outDir, 'web'), false);
619
-
620
- if (!dev && buildmetadata?.assets) {
621
- const assets = buildmetadata.assets;
622
- result.outputs
623
- // Filter for deployable assets: sourcemaps (hash '00000000') and content-addressed files
624
- .filter((x) => x.hash === '00000000' || (x.hash && x.path.includes(x.hash)))
625
- .forEach((artifact) => {
626
- const r = relative(join(outDir, 'web'), artifact.path);
627
- assets.push({
628
- filename: r,
629
- kind: artifact.kind,
630
- contentType: getCorrectMimeType(r, artifact.type),
631
- size: artifact.size,
632
- });
633
- });
634
- }
635
- } else {
636
- handleBuildFailure(result);
637
- }
638
- }
639
- })();
640
- }
641
-
642
- // Bundle workbench app if detected via setupWorkbench
643
- if (existsSync(appFile) && workbench && workbench.hasWorkbench) {
644
- // Create workbench config with proper defaults
645
- const defaultConfig = { route: '/workbench', headers: {} };
646
- const config = { ...defaultConfig, ...workbench.config, projectId: projectId };
647
- try {
648
- // Generate workbench files on the fly instead of using files from package
649
- const tempWorkbenchDir = join(outDir, 'temp-workbench');
650
- mkdirSync(tempWorkbenchDir, { recursive: true });
651
-
652
- // Generate files using templates
653
- await Bun.write(join(tempWorkbenchDir, 'main.tsx'), generateWorkbenchMainTsx(config));
654
-
655
- // Copy the pre-built standalone.css from workbench package instead of generating it
656
- // This ensures we use the built version with Tailwind already processed
657
- const workbenchPackagePath = findPackagePath(rootDir, '@agentuity/workbench', logger);
658
- const workbenchStylesOut = join(tempWorkbenchDir, 'styles.css');
659
-
660
- if (workbenchPackagePath) {
661
- const workbenchStylesPath = join(workbenchPackagePath, 'dist', 'standalone.css');
662
- const workbenchStylesSourcePath = join(workbenchPackagePath, 'src', 'standalone.css');
663
-
664
- if (existsSync(workbenchStylesPath)) {
665
- cpSync(workbenchStylesPath, workbenchStylesOut);
666
- logger.debug('Copied workbench dist/standalone.css to temp workbench dir');
667
- } else if (existsSync(workbenchStylesSourcePath)) {
668
- // Fallback: copy source CSS file (contains Tailwind directives that need processing)
669
- cpSync(workbenchStylesSourcePath, workbenchStylesOut);
670
- logger.warn(
671
- 'Workbench dist/standalone.css not found, using source CSS. Ensure @agentuity/workbench is built.'
672
- );
673
- } else {
674
- throw new BuildFailedError({
675
- message: `Workbench styles not found in ${workbenchPackagePath}. Expected either:
676
- - ${workbenchStylesPath}
677
- - ${workbenchStylesSourcePath}
678
-
679
- Make sure @agentuity/workbench is built.`,
680
- });
681
- }
682
- } else {
683
- throw new BuildFailedError({
684
- message: `Workbench package not found. Searched in:
685
- - App-level node_modules
686
- - Workspace root node_modules
687
- - Workspace packages directory
688
-
689
- Make sure @agentuity/workbench is installed or available in the workspace.`,
690
- });
691
- }
692
-
693
- const workbenchIndexFile = join(tempWorkbenchDir, 'index.html');
694
- await Bun.write(workbenchIndexFile, generateWorkbenchIndexHtml());
695
-
696
- // Bundle workbench using generated files
697
- // Disable splitting to avoid CommonJS/ESM module resolution conflicts
698
- const workbenchBaseConfig: Bun.BuildConfig = {
699
- entrypoints: [workbenchIndexFile],
700
- outdir: join(outDir, 'workbench'),
701
- sourcemap: dev ? 'inline' : 'linked',
702
- target: 'browser',
703
- format: 'esm',
704
- banner: `// Generated file. DO NOT EDIT`,
705
- define: {
706
- 'process.env.AGENTUITY_PUBLIC_HAS_SDK_KEY': JSON.stringify(
707
- process.env.AGENTUITY_SDK_KEY ? 'true' : 'false'
708
- ),
709
- },
710
- minify: !dev,
711
- drop: isProd ? ['debugger'] : undefined,
712
- splitting: false,
713
- packages: 'bundle',
714
- conditions: ['browser', 'import', 'default'],
715
- naming: {
716
- entry: '[dir]/[name].[ext]',
717
- chunk: 'workbench/chunk/[name]-[hash].[ext]',
718
- asset: 'workbench/asset/[name]-[hash].[ext]',
719
- },
720
- };
721
-
722
- // Apply user config for 'workbench' phase
723
- let finalWorkbenchConfig = workbenchBaseConfig;
724
- if (buildConfigFunction) {
725
- const userConfig = await executeBuildConfig(
726
- buildConfigFunction,
727
- 'workbench',
728
- createBuildContext()
729
- );
730
- finalWorkbenchConfig = mergeBuildConfig(workbenchBaseConfig, userConfig);
731
- }
732
-
733
- const workbenchResult = await Bun.build(finalWorkbenchConfig);
734
- if (workbenchResult.success) {
735
- logger.debug('Workbench bundled successfully');
736
- // Clean up temp directory
737
- rmSync(tempWorkbenchDir, { recursive: true, force: true });
738
- } else {
739
- logger.error('Workbench bundling failed. Logs:', workbenchResult.logs);
740
- if (workbenchResult.logs.length === 0) {
741
- logger.error('No build logs available. Checking generated files...');
742
- logger.error('Temp dir exists:', await Bun.file(tempWorkbenchDir).exists());
743
- logger.error('Index file exists:', await Bun.file(workbenchIndexFile).exists());
744
- logger.error(
745
- 'Main.tsx exists:',
746
- await Bun.file(join(tempWorkbenchDir, 'main.tsx')).exists()
747
- );
748
- }
749
- // Clean up temp directory even on failure
750
- rmSync(tempWorkbenchDir, { recursive: true, force: true });
751
- logger.fatal('Workbench bundling failed');
752
- }
753
- } catch (error) {
754
- logger.error('Failed to bundle workbench:', error);
755
- // Collect all error messages
756
- const errorMessages: string[] = [];
757
- if (error instanceof AggregateError && Array.isArray(error.errors)) {
758
- for (const err of error.errors) {
759
- // Extract useful info from Bun's ResolveMessage errors
760
- if (err && typeof err === 'object') {
761
- const errObj = err as Record<string, unknown>;
762
- if (typeof errObj.message === 'string') {
763
- errorMessages.push(` ${errObj.message}`);
764
- }
765
- const position = errObj.position as Record<string, unknown> | undefined;
766
- if (position?.file && position?.line && position?.column) {
767
- errorMessages.push(
768
- ` at ${position.file}:${position.line}:${position.column}`
769
- );
770
- }
771
- }
772
- }
773
- }
774
-
775
- // Show different tips based on whether we're in a monorepo or published package
776
- const isMonorepo = await Bun.file(join(rootDir, '../../packages')).exists();
777
- if (isMonorepo) {
778
- errorMessages.push(
779
- '\nTip: Make sure all @agentuity/* packages are built by',
780
- 'running "bun run build" from the monorepo root.'
781
- );
782
- } else {
783
- errorMessages.push(
784
- '\nTip: If you see module resolution errors, try running',
785
- '"bun install" to ensure all dependencies are installed.'
786
- );
787
- }
788
-
789
- // Don't continue if workbench bundling fails
790
- logger.fatal(errorMessages.join('\n'));
791
- }
792
- }
793
-
794
- if (!dev && buildmetadata) {
795
- const webPublicDir = join(webDir, 'public');
796
- if (existsSync(webPublicDir)) {
797
- const assets = buildmetadata.assets;
798
- const webOutPublicDir = join(outDir, 'web', 'public');
799
- cpSync(webPublicDir, webOutPublicDir, { recursive: true });
800
- [...new Bun.Glob('**.*').scanSync(webOutPublicDir)].forEach((f) => {
801
- const bf = Bun.file(join(webOutPublicDir, f));
802
- assets.push({
803
- filename: join('public', f),
804
- kind: 'static',
805
- contentType: bf.type,
806
- size: bf.size,
807
- });
808
- });
809
- }
810
- }
811
-
812
- if (!dev && Bun.which('git') && buildmetadata?.deployment) {
813
- buildmetadata.deployment.git = {
814
- commit: process.env.GIT_SHA || process.env.GITHUB_SHA,
815
- branch: process.env.GITHUB_REF ? process.env.GITHUB_REF.replace('refs/heads/', '') : '',
816
- repo: process.env.GITHUB_REPOSITORY
817
- ? gitParseUrl(process.env.GITHUB_REPOSITORY).toString('https')
818
- : '',
819
- provider: 'git',
820
- };
821
- if (process.env.GITHUB_REPOSITORY) {
822
- buildmetadata.deployment.git.provider = 'github';
823
- }
824
- if (process.env.CI && !trigger) {
825
- buildmetadata.deployment.git.trigger = 'ci';
826
- }
827
- // pull out the git information if we have it
828
- try {
829
- let gitDir = join(rootDir, '.git');
830
- let parentDir = dirname(dirname(gitDir));
831
- while (!existsSync(gitDir) && parentDir !== dirname(parentDir) && gitDir !== '/') {
832
- gitDir = join(parentDir, '.git');
833
- parentDir = dirname(parentDir);
834
- }
835
- if (existsSync(gitDir)) {
836
- const tag = $`git tag -l --points-at HEAD`.nothrow().quiet();
837
- if (tag) {
838
- const tags = await tag.text();
839
- buildmetadata.deployment.git.tags = tags
840
- .trim()
841
- .split(/\n/)
842
- .map((s) => s.trim())
843
- .filter(Boolean);
844
- }
845
- let branch = process.env.GITHUB_HEAD_REF;
846
- if (!branch) {
847
- const branchText = $`git branch --show-current`.nothrow().quiet();
848
- if (branchText) {
849
- branch = await branchText.text();
850
- }
851
- }
852
- if (branch) {
853
- buildmetadata.deployment.git.branch = branch.trim();
854
- }
855
- const commit = $`git rev-parse HEAD`.nothrow().quiet();
856
- if (commit) {
857
- const sha = await commit.text();
858
- if (sha) {
859
- buildmetadata.deployment.git.commit = sha.trim();
860
- const msg = $`git log --pretty=format:%s -n1 ${buildmetadata.deployment.git.commit}`;
861
- if (msg) {
862
- const _msg = await msg.text();
863
- if (_msg) {
864
- buildmetadata.deployment.git.message = _msg.trim();
865
- }
866
- }
867
- const origin = $`git config --get remote.origin.url`.nothrow().quiet();
868
- if (origin) {
869
- const _origin = await origin.text();
870
- if (_origin) {
871
- const _url = gitParseUrl(_origin.trim());
872
- buildmetadata.deployment.git.repo = _url.toString('https');
873
- }
874
- }
875
- }
876
- }
877
- }
878
- } catch {
879
- // ignore errors
880
- }
881
- }
882
-
883
- // if in gitlab CI, set defaults before user overrides
884
- if (process.env.GITLAB_CI && buildmetadata?.deployment) {
885
- buildmetadata.deployment.git ??= {};
886
- buildmetadata.deployment.git.provider ??= 'gitlab';
887
- buildmetadata.deployment.git.branch ??= process.env.CI_COMMIT_REF_NAME;
888
- buildmetadata.deployment.git.commit ??= process.env.CI_COMMIT_SHA;
889
- buildmetadata.deployment.git.buildUrl ??=
890
- process.env.CI_JOB_URL ?? process.env.CI_PIPELINE_URL;
891
- }
892
-
893
- // configure any overrides or any that aren't detected automatically
894
- if (buildmetadata?.deployment) {
895
- buildmetadata.deployment.git ??= {};
896
-
897
- // build tags: start with existing discovered tags, add defaults, then merge explicit tags
898
- const tags = new Set(buildmetadata.deployment.git.tags ?? []);
899
- tags.add('latest');
900
- if (buildmetadata.deployment.git.branch) {
901
- tags.add(buildmetadata.deployment.git.branch);
902
- }
903
- if (buildmetadata.deployment.git.commit) {
904
- tags.add(buildmetadata.deployment.git.commit.substring(0, 7));
905
- }
906
- if (tag?.length && !(tag.length === 1 && tag[0] === 'latest')) {
907
- for (const t of tag) {
908
- tags.add(t);
909
- }
910
- tags.delete('latest'); // if you specify explicit tags we remove latest
911
- }
912
- buildmetadata.deployment.git.tags = Array.from(tags);
913
-
914
- if (provider) {
915
- buildmetadata.deployment.git.provider = provider;
916
- }
917
- if (logsUrl) {
918
- buildmetadata.deployment.git.buildUrl = logsUrl;
919
- }
920
- if (commitUrl) {
921
- buildmetadata.deployment.git.url = commitUrl;
922
- }
923
- if (trigger) {
924
- buildmetadata.deployment.git.trigger = trigger;
925
- }
926
- if (event) {
927
- buildmetadata.deployment.git.event = event;
928
- }
929
- if (pullRequestNumber) {
930
- buildmetadata.deployment.git.pull_request = {
931
- number: pullRequestNumber,
932
- url: pullRequestURL,
933
- commentId: pullRequestCommentId,
934
- };
935
- }
936
- if (message) {
937
- buildmetadata.deployment.git.message = message;
938
- }
939
- }
940
-
941
- // Write minimal package.json for dev mode (production already wrote it above)
942
- if (dev) {
943
- await Bun.write(
944
- `${outDir}/package.json`,
945
- JSON.stringify({ name: pkgContents.name, version: pkgContents.version }, null, 2)
946
- );
947
- }
948
-
949
- await Bun.write(
950
- `${outDir}/agentuity.metadata.json`,
951
- dev ? JSON.stringify(buildmetadata, null, 2) : JSON.stringify(buildmetadata)
952
- );
953
-
954
- // Generate route mapping file for runtime route tracking
955
- const routeMapping: Record<string, string> = {};
956
- for (const route of buildmetadata.routes ?? []) {
957
- routeMapping[`${route.method} ${route.path}`] = route.id;
958
- }
959
- await Bun.write(
960
- `${outDir}/.routemapping.json`,
961
- dev ? JSON.stringify(routeMapping, null, 2) : JSON.stringify(routeMapping)
962
- );
963
-
964
- return { output };
965
- }