@agentuity/cli 0.0.95 → 0.0.97

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