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