@zmeel/server 0.3.1

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 (772) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/codex-models.d.ts +4 -0
  3. package/dist/adapters/codex-models.d.ts.map +1 -0
  4. package/dist/adapters/codex-models.js +98 -0
  5. package/dist/adapters/codex-models.js.map +1 -0
  6. package/dist/adapters/cursor-models.d.ts +13 -0
  7. package/dist/adapters/cursor-models.d.ts.map +1 -0
  8. package/dist/adapters/cursor-models.js +148 -0
  9. package/dist/adapters/cursor-models.js.map +1 -0
  10. package/dist/adapters/http/execute.d.ts +3 -0
  11. package/dist/adapters/http/execute.d.ts.map +1 -0
  12. package/dist/adapters/http/execute.js +39 -0
  13. package/dist/adapters/http/execute.js.map +1 -0
  14. package/dist/adapters/http/index.d.ts +3 -0
  15. package/dist/adapters/http/index.d.ts.map +1 -0
  16. package/dist/adapters/http/index.js +20 -0
  17. package/dist/adapters/http/index.js.map +1 -0
  18. package/dist/adapters/http/test.d.ts +3 -0
  19. package/dist/adapters/http/test.d.ts.map +1 -0
  20. package/dist/adapters/http/test.js +106 -0
  21. package/dist/adapters/http/test.js.map +1 -0
  22. package/dist/adapters/index.d.ts +4 -0
  23. package/dist/adapters/index.d.ts.map +1 -0
  24. package/dist/adapters/index.js +3 -0
  25. package/dist/adapters/index.js.map +1 -0
  26. package/dist/adapters/process/execute.d.ts +3 -0
  27. package/dist/adapters/process/execute.d.ts.map +1 -0
  28. package/dist/adapters/process/execute.js +70 -0
  29. package/dist/adapters/process/execute.js.map +1 -0
  30. package/dist/adapters/process/index.d.ts +3 -0
  31. package/dist/adapters/process/index.d.ts.map +1 -0
  32. package/dist/adapters/process/index.js +23 -0
  33. package/dist/adapters/process/index.js.map +1 -0
  34. package/dist/adapters/process/test.d.ts +3 -0
  35. package/dist/adapters/process/test.d.ts.map +1 -0
  36. package/dist/adapters/process/test.js +77 -0
  37. package/dist/adapters/process/test.js.map +1 -0
  38. package/dist/adapters/registry.d.ts +14 -0
  39. package/dist/adapters/registry.d.ts.map +1 -0
  40. package/dist/adapters/registry.js +164 -0
  41. package/dist/adapters/registry.js.map +1 -0
  42. package/dist/adapters/types.d.ts +2 -0
  43. package/dist/adapters/types.d.ts.map +1 -0
  44. package/dist/adapters/types.js +2 -0
  45. package/dist/adapters/types.js.map +1 -0
  46. package/dist/adapters/utils.d.ts +41 -0
  47. package/dist/adapters/utils.d.ts.map +1 -0
  48. package/dist/adapters/utils.js +51 -0
  49. package/dist/adapters/utils.js.map +1 -0
  50. package/dist/agent-auth-jwt.d.ts +14 -0
  51. package/dist/agent-auth-jwt.d.ts.map +1 -0
  52. package/dist/agent-auth-jwt.js +117 -0
  53. package/dist/agent-auth-jwt.js.map +1 -0
  54. package/dist/app.d.ts +32 -0
  55. package/dist/app.d.ts.map +1 -0
  56. package/dist/app.js +281 -0
  57. package/dist/app.js.map +1 -0
  58. package/dist/attachment-types.d.ts +33 -0
  59. package/dist/attachment-types.d.ts.map +1 -0
  60. package/dist/attachment-types.js +67 -0
  61. package/dist/attachment-types.js.map +1 -0
  62. package/dist/auth/better-auth.d.ts +24 -0
  63. package/dist/auth/better-auth.d.ts.map +1 -0
  64. package/dist/auth/better-auth.js +108 -0
  65. package/dist/auth/better-auth.js.map +1 -0
  66. package/dist/board-claim.d.ts +23 -0
  67. package/dist/board-claim.d.ts.map +1 -0
  68. package/dist/board-claim.js +115 -0
  69. package/dist/board-claim.js.map +1 -0
  70. package/dist/config-file.d.ts +3 -0
  71. package/dist/config-file.d.ts.map +1 -0
  72. package/dist/config-file.js +16 -0
  73. package/dist/config-file.js.map +1 -0
  74. package/dist/config.d.ts +41 -0
  75. package/dist/config.d.ts.map +1 -0
  76. package/dist/config.js +173 -0
  77. package/dist/config.js.map +1 -0
  78. package/dist/dev-server-status.d.ts +27 -0
  79. package/dist/dev-server-status.d.ts.map +1 -0
  80. package/dist/dev-server-status.js +70 -0
  81. package/dist/dev-server-status.js.map +1 -0
  82. package/dist/dev-watch-ignore.d.ts +2 -0
  83. package/dist/dev-watch-ignore.d.ts.map +1 -0
  84. package/dist/dev-watch-ignore.js +33 -0
  85. package/dist/dev-watch-ignore.js.map +1 -0
  86. package/dist/errors.d.ts +12 -0
  87. package/dist/errors.d.ts.map +1 -0
  88. package/dist/errors.js +28 -0
  89. package/dist/errors.js.map +1 -0
  90. package/dist/home-paths.d.ts +17 -0
  91. package/dist/home-paths.d.ts.map +1 -0
  92. package/dist/home-paths.js +75 -0
  93. package/dist/home-paths.js.map +1 -0
  94. package/dist/index.d.ts +10 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +627 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/log-redaction.d.ts +11 -0
  99. package/dist/log-redaction.d.ts.map +1 -0
  100. package/dist/log-redaction.js +118 -0
  101. package/dist/log-redaction.js.map +1 -0
  102. package/dist/middleware/auth.d.ts +12 -0
  103. package/dist/middleware/auth.d.ts.map +1 -0
  104. package/dist/middleware/auth.js +144 -0
  105. package/dist/middleware/auth.js.map +1 -0
  106. package/dist/middleware/board-mutation-guard.d.ts +3 -0
  107. package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
  108. package/dist/middleware/board-mutation-guard.js +60 -0
  109. package/dist/middleware/board-mutation-guard.js.map +1 -0
  110. package/dist/middleware/error-handler.d.ts +17 -0
  111. package/dist/middleware/error-handler.d.ts.map +1 -0
  112. package/dist/middleware/error-handler.js +45 -0
  113. package/dist/middleware/error-handler.js.map +1 -0
  114. package/dist/middleware/index.d.ts +4 -0
  115. package/dist/middleware/index.d.ts.map +1 -0
  116. package/dist/middleware/index.js +4 -0
  117. package/dist/middleware/index.js.map +1 -0
  118. package/dist/middleware/logger.d.ts +4 -0
  119. package/dist/middleware/logger.d.ts.map +1 -0
  120. package/dist/middleware/logger.js +87 -0
  121. package/dist/middleware/logger.js.map +1 -0
  122. package/dist/middleware/private-hostname-guard.d.ts +11 -0
  123. package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
  124. package/dist/middleware/private-hostname-guard.js +78 -0
  125. package/dist/middleware/private-hostname-guard.js.map +1 -0
  126. package/dist/middleware/validate.d.ts +4 -0
  127. package/dist/middleware/validate.d.ts.map +1 -0
  128. package/dist/middleware/validate.js +7 -0
  129. package/dist/middleware/validate.js.map +1 -0
  130. package/dist/onboarding-assets/ceo/AGENTS.md +54 -0
  131. package/dist/onboarding-assets/ceo/HEARTBEAT.md +72 -0
  132. package/dist/onboarding-assets/ceo/SOUL.md +33 -0
  133. package/dist/onboarding-assets/ceo/TOOLS.md +3 -0
  134. package/dist/onboarding-assets/default/AGENTS.md +3 -0
  135. package/dist/paths.d.ts +3 -0
  136. package/dist/paths.d.ts.map +1 -0
  137. package/dist/paths.js +31 -0
  138. package/dist/paths.js.map +1 -0
  139. package/dist/realtime/live-events-ws.d.ts +28 -0
  140. package/dist/realtime/live-events-ws.d.ts.map +1 -0
  141. package/dist/realtime/live-events-ws.js +187 -0
  142. package/dist/realtime/live-events-ws.js.map +1 -0
  143. package/dist/redaction.d.ts +4 -0
  144. package/dist/redaction.d.ts.map +1 -0
  145. package/dist/redaction.js +63 -0
  146. package/dist/redaction.js.map +1 -0
  147. package/dist/routes/access.d.ts +62 -0
  148. package/dist/routes/access.d.ts.map +1 -0
  149. package/dist/routes/access.js +2296 -0
  150. package/dist/routes/access.js.map +1 -0
  151. package/dist/routes/activity.d.ts +3 -0
  152. package/dist/routes/activity.d.ts.map +1 -0
  153. package/dist/routes/activity.js +78 -0
  154. package/dist/routes/activity.js.map +1 -0
  155. package/dist/routes/agents.d.ts +3 -0
  156. package/dist/routes/agents.d.ts.map +1 -0
  157. package/dist/routes/agents.js +1918 -0
  158. package/dist/routes/agents.js.map +1 -0
  159. package/dist/routes/approvals.d.ts +3 -0
  160. package/dist/routes/approvals.d.ts.map +1 -0
  161. package/dist/routes/approvals.js +275 -0
  162. package/dist/routes/approvals.js.map +1 -0
  163. package/dist/routes/assets.d.ts +4 -0
  164. package/dist/routes/assets.d.ts.map +1 -0
  165. package/dist/routes/assets.js +309 -0
  166. package/dist/routes/assets.js.map +1 -0
  167. package/dist/routes/authz.d.ts +16 -0
  168. package/dist/routes/authz.d.ts.map +1 -0
  169. package/dist/routes/authz.js +47 -0
  170. package/dist/routes/authz.js.map +1 -0
  171. package/dist/routes/companies.d.ts +4 -0
  172. package/dist/routes/companies.d.ts.map +1 -0
  173. package/dist/routes/companies.js +356 -0
  174. package/dist/routes/companies.js.map +1 -0
  175. package/dist/routes/company-skills.d.ts +3 -0
  176. package/dist/routes/company-skills.d.ts.map +1 -0
  177. package/dist/routes/company-skills.js +228 -0
  178. package/dist/routes/company-skills.js.map +1 -0
  179. package/dist/routes/costs.d.ts +3 -0
  180. package/dist/routes/costs.d.ts.map +1 -0
  181. package/dist/routes/costs.js +268 -0
  182. package/dist/routes/costs.js.map +1 -0
  183. package/dist/routes/dashboard.d.ts +3 -0
  184. package/dist/routes/dashboard.d.ts.map +1 -0
  185. package/dist/routes/dashboard.js +15 -0
  186. package/dist/routes/dashboard.js.map +1 -0
  187. package/dist/routes/execution-workspaces.d.ts +3 -0
  188. package/dist/routes/execution-workspaces.d.ts.map +1 -0
  189. package/dist/routes/execution-workspaces.js +367 -0
  190. package/dist/routes/execution-workspaces.js.map +1 -0
  191. package/dist/routes/goals.d.ts +3 -0
  192. package/dist/routes/goals.d.ts.map +1 -0
  193. package/dist/routes/goals.js +95 -0
  194. package/dist/routes/goals.js.map +1 -0
  195. package/dist/routes/health.d.ts +9 -0
  196. package/dist/routes/health.d.ts.map +1 -0
  197. package/dist/routes/health.js +80 -0
  198. package/dist/routes/health.js.map +1 -0
  199. package/dist/routes/index.d.ts +18 -0
  200. package/dist/routes/index.d.ts.map +1 -0
  201. package/dist/routes/index.js +18 -0
  202. package/dist/routes/index.js.map +1 -0
  203. package/dist/routes/instance-settings.d.ts +3 -0
  204. package/dist/routes/instance-settings.d.ts.map +1 -0
  205. package/dist/routes/instance-settings.js +79 -0
  206. package/dist/routes/instance-settings.js.map +1 -0
  207. package/dist/routes/issues-checkout-wakeup.d.ts +9 -0
  208. package/dist/routes/issues-checkout-wakeup.d.ts.map +1 -0
  209. package/dist/routes/issues-checkout-wakeup.js +12 -0
  210. package/dist/routes/issues-checkout-wakeup.js.map +1 -0
  211. package/dist/routes/issues.d.ts +4 -0
  212. package/dist/routes/issues.d.ts.map +1 -0
  213. package/dist/routes/issues.js +1834 -0
  214. package/dist/routes/issues.js.map +1 -0
  215. package/dist/routes/llms.d.ts +3 -0
  216. package/dist/routes/llms.d.ts.map +1 -0
  217. package/dist/routes/llms.js +78 -0
  218. package/dist/routes/llms.js.map +1 -0
  219. package/dist/routes/org-chart-svg.d.ts +25 -0
  220. package/dist/routes/org-chart-svg.d.ts.map +1 -0
  221. package/dist/routes/org-chart-svg.js +656 -0
  222. package/dist/routes/org-chart-svg.js.map +1 -0
  223. package/dist/routes/plugin-ui-static.d.ts +69 -0
  224. package/dist/routes/plugin-ui-static.d.ts.map +1 -0
  225. package/dist/routes/plugin-ui-static.js +411 -0
  226. package/dist/routes/plugin-ui-static.js.map +1 -0
  227. package/dist/routes/plugins.d.ts +120 -0
  228. package/dist/routes/plugins.d.ts.map +1 -0
  229. package/dist/routes/plugins.js +1784 -0
  230. package/dist/routes/plugins.js.map +1 -0
  231. package/dist/routes/projects.d.ts +3 -0
  232. package/dist/routes/projects.d.ts.map +1 -0
  233. package/dist/routes/projects.js +386 -0
  234. package/dist/routes/projects.js.map +1 -0
  235. package/dist/routes/routines.d.ts +3 -0
  236. package/dist/routes/routines.d.ts.map +1 -0
  237. package/dist/routes/routines.js +277 -0
  238. package/dist/routes/routines.js.map +1 -0
  239. package/dist/routes/secrets.d.ts +3 -0
  240. package/dist/routes/secrets.d.ts.map +1 -0
  241. package/dist/routes/secrets.js +128 -0
  242. package/dist/routes/secrets.js.map +1 -0
  243. package/dist/routes/sidebar-badges.d.ts +3 -0
  244. package/dist/routes/sidebar-badges.d.ts.map +1 -0
  245. package/dist/routes/sidebar-badges.js +45 -0
  246. package/dist/routes/sidebar-badges.js.map +1 -0
  247. package/dist/secrets/external-stub-providers.d.ts +5 -0
  248. package/dist/secrets/external-stub-providers.d.ts.map +1 -0
  249. package/dist/secrets/external-stub-providers.js +21 -0
  250. package/dist/secrets/external-stub-providers.js.map +1 -0
  251. package/dist/secrets/local-encrypted-provider.d.ts +3 -0
  252. package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
  253. package/dist/secrets/local-encrypted-provider.js +116 -0
  254. package/dist/secrets/local-encrypted-provider.js.map +1 -0
  255. package/dist/secrets/provider-registry.d.ts +5 -0
  256. package/dist/secrets/provider-registry.d.ts.map +1 -0
  257. package/dist/secrets/provider-registry.js +20 -0
  258. package/dist/secrets/provider-registry.js.map +1 -0
  259. package/dist/secrets/types.d.ts +21 -0
  260. package/dist/secrets/types.d.ts.map +1 -0
  261. package/dist/secrets/types.js +2 -0
  262. package/dist/secrets/types.js.map +1 -0
  263. package/dist/services/access.d.ts +113 -0
  264. package/dist/services/access.d.ts.map +1 -0
  265. package/dist/services/access.js +247 -0
  266. package/dist/services/access.js.map +1 -0
  267. package/dist/services/activity-log.d.ts +17 -0
  268. package/dist/services/activity-log.d.ts.map +1 -0
  269. package/dist/services/activity-log.js +74 -0
  270. package/dist/services/activity-log.js.map +1 -0
  271. package/dist/services/activity.d.ts +764 -0
  272. package/dist/services/activity.d.ts.map +1 -0
  273. package/dist/services/activity.js +105 -0
  274. package/dist/services/activity.js.map +1 -0
  275. package/dist/services/agent-instructions.d.ts +91 -0
  276. package/dist/services/agent-instructions.d.ts.map +1 -0
  277. package/dist/services/agent-instructions.js +580 -0
  278. package/dist/services/agent-instructions.js.map +1 -0
  279. package/dist/services/agent-permissions.d.ts +6 -0
  280. package/dist/services/agent-permissions.d.ts.map +1 -0
  281. package/dist/services/agent-permissions.js +18 -0
  282. package/dist/services/agent-permissions.js.map +1 -0
  283. package/dist/services/agents.d.ts +1670 -0
  284. package/dist/services/agents.d.ts.map +1 -0
  285. package/dist/services/agents.js +566 -0
  286. package/dist/services/agents.js.map +1 -0
  287. package/dist/services/approvals.d.ts +546 -0
  288. package/dist/services/approvals.d.ts.map +1 -0
  289. package/dist/services/approvals.js +212 -0
  290. package/dist/services/approvals.js.map +1 -0
  291. package/dist/services/assets.d.ts +33 -0
  292. package/dist/services/assets.d.ts.map +1 -0
  293. package/dist/services/assets.js +17 -0
  294. package/dist/services/assets.js.map +1 -0
  295. package/dist/services/board-auth.d.ts +234 -0
  296. package/dist/services/board-auth.d.ts.map +1 -0
  297. package/dist/services/board-auth.js +295 -0
  298. package/dist/services/board-auth.js.map +1 -0
  299. package/dist/services/budgets.d.ts +38 -0
  300. package/dist/services/budgets.d.ts.map +1 -0
  301. package/dist/services/budgets.js +784 -0
  302. package/dist/services/budgets.js.map +1 -0
  303. package/dist/services/companies.d.ts +148 -0
  304. package/dist/services/companies.d.ts.map +1 -0
  305. package/dist/services/companies.js +260 -0
  306. package/dist/services/companies.js.map +1 -0
  307. package/dist/services/company-export-readme.d.ts +17 -0
  308. package/dist/services/company-export-readme.d.ts.map +1 -0
  309. package/dist/services/company-export-readme.js +148 -0
  310. package/dist/services/company-export-readme.js.map +1 -0
  311. package/dist/services/company-portability.d.ts +24 -0
  312. package/dist/services/company-portability.d.ts.map +1 -0
  313. package/dist/services/company-portability.js +3807 -0
  314. package/dist/services/company-portability.js.map +1 -0
  315. package/dist/services/company-skills.d.ts +77 -0
  316. package/dist/services/company-skills.d.ts.map +1 -0
  317. package/dist/services/company-skills.js +2063 -0
  318. package/dist/services/company-skills.js.map +1 -0
  319. package/dist/services/costs.d.ts +114 -0
  320. package/dist/services/costs.d.ts.map +1 -0
  321. package/dist/services/costs.js +294 -0
  322. package/dist/services/costs.js.map +1 -0
  323. package/dist/services/cron.d.ts +80 -0
  324. package/dist/services/cron.d.ts.map +1 -0
  325. package/dist/services/cron.js +300 -0
  326. package/dist/services/cron.js.map +1 -0
  327. package/dist/services/dashboard.d.ts +26 -0
  328. package/dist/services/dashboard.d.ts.map +1 -0
  329. package/dist/services/dashboard.js +98 -0
  330. package/dist/services/dashboard.js.map +1 -0
  331. package/dist/services/default-agent-instructions.d.ts +9 -0
  332. package/dist/services/default-agent-instructions.d.ts.map +1 -0
  333. package/dist/services/default-agent-instructions.js +20 -0
  334. package/dist/services/default-agent-instructions.js.map +1 -0
  335. package/dist/services/documents.d.ts +195 -0
  336. package/dist/services/documents.d.ts.map +1 -0
  337. package/dist/services/documents.js +409 -0
  338. package/dist/services/documents.js.map +1 -0
  339. package/dist/services/execution-workspace-policy.d.ts +21 -0
  340. package/dist/services/execution-workspace-policy.d.ts.map +1 -0
  341. package/dist/services/execution-workspace-policy.js +177 -0
  342. package/dist/services/execution-workspace-policy.js.map +1 -0
  343. package/dist/services/execution-workspaces.d.ts +22 -0
  344. package/dist/services/execution-workspaces.d.ts.map +1 -0
  345. package/dist/services/execution-workspaces.js +551 -0
  346. package/dist/services/execution-workspaces.js.map +1 -0
  347. package/dist/services/feedback-redaction.d.ts +23 -0
  348. package/dist/services/feedback-redaction.d.ts.map +1 -0
  349. package/dist/services/feedback-redaction.js +150 -0
  350. package/dist/services/feedback-redaction.js.map +1 -0
  351. package/dist/services/feedback-share-client.d.ts +9 -0
  352. package/dist/services/feedback-share-client.d.ts.map +1 -0
  353. package/dist/services/feedback-share-client.js +42 -0
  354. package/dist/services/feedback-share-client.js.map +1 -0
  355. package/dist/services/feedback.d.ts +91 -0
  356. package/dist/services/feedback.d.ts.map +1 -0
  357. package/dist/services/feedback.js +1662 -0
  358. package/dist/services/feedback.js.map +1 -0
  359. package/dist/services/finance.d.ts +93 -0
  360. package/dist/services/finance.d.ts.map +1 -0
  361. package/dist/services/finance.js +120 -0
  362. package/dist/services/finance.js.map +1 -0
  363. package/dist/services/github-fetch.d.ts +4 -0
  364. package/dist/services/github-fetch.d.ts.map +1 -0
  365. package/dist/services/github-fetch.js +23 -0
  366. package/dist/services/github-fetch.js.map +1 -0
  367. package/dist/services/goals.d.ts +433 -0
  368. package/dist/services/goals.d.ts.map +1 -0
  369. package/dist/services/goals.js +54 -0
  370. package/dist/services/goals.js.map +1 -0
  371. package/dist/services/heartbeat-run-summary.d.ts +2 -0
  372. package/dist/services/heartbeat-run-summary.d.ts.map +1 -0
  373. package/dist/services/heartbeat-run-summary.js +30 -0
  374. package/dist/services/heartbeat-run-summary.js.map +1 -0
  375. package/dist/services/heartbeat.d.ts +839 -0
  376. package/dist/services/heartbeat.d.ts.map +1 -0
  377. package/dist/services/heartbeat.js +3287 -0
  378. package/dist/services/heartbeat.js.map +1 -0
  379. package/dist/services/hire-hook.d.ts +14 -0
  380. package/dist/services/hire-hook.d.ts.map +1 -0
  381. package/dist/services/hire-hook.js +85 -0
  382. package/dist/services/hire-hook.js.map +1 -0
  383. package/dist/services/index.d.ts +34 -0
  384. package/dist/services/index.d.ts.map +1 -0
  385. package/dist/services/index.js +34 -0
  386. package/dist/services/index.js.map +1 -0
  387. package/dist/services/instance-settings.d.ts +11 -0
  388. package/dist/services/instance-settings.d.ts.map +1 -0
  389. package/dist/services/instance-settings.js +120 -0
  390. package/dist/services/instance-settings.js.map +1 -0
  391. package/dist/services/issue-approvals.d.ts +56 -0
  392. package/dist/services/issue-approvals.d.ts.map +1 -0
  393. package/dist/services/issue-approvals.js +153 -0
  394. package/dist/services/issue-approvals.js.map +1 -0
  395. package/dist/services/issue-assignment-wakeup.d.ts +29 -0
  396. package/dist/services/issue-assignment-wakeup.d.ts.map +1 -0
  397. package/dist/services/issue-assignment-wakeup.js +22 -0
  398. package/dist/services/issue-assignment-wakeup.js.map +1 -0
  399. package/dist/services/issue-goal-fallback.d.ts +18 -0
  400. package/dist/services/issue-goal-fallback.d.ts.map +1 -0
  401. package/dist/services/issue-goal-fallback.js +33 -0
  402. package/dist/services/issue-goal-fallback.js.map +1 -0
  403. package/dist/services/issues.d.ts +568 -0
  404. package/dist/services/issues.d.ts.map +1 -0
  405. package/dist/services/issues.js +1671 -0
  406. package/dist/services/issues.js.map +1 -0
  407. package/dist/services/live-events.d.ts +17 -0
  408. package/dist/services/live-events.d.ts.map +1 -0
  409. package/dist/services/live-events.js +33 -0
  410. package/dist/services/live-events.js.map +1 -0
  411. package/dist/services/local-service-supervisor.d.ts +55 -0
  412. package/dist/services/local-service-supervisor.d.ts.map +1 -0
  413. package/dist/services/local-service-supervisor.js +240 -0
  414. package/dist/services/local-service-supervisor.js.map +1 -0
  415. package/dist/services/plugin-capability-validator.d.ts +108 -0
  416. package/dist/services/plugin-capability-validator.d.ts.map +1 -0
  417. package/dist/services/plugin-capability-validator.js +269 -0
  418. package/dist/services/plugin-capability-validator.js.map +1 -0
  419. package/dist/services/plugin-config-validator.d.ts +26 -0
  420. package/dist/services/plugin-config-validator.d.ts.map +1 -0
  421. package/dist/services/plugin-config-validator.js +41 -0
  422. package/dist/services/plugin-config-validator.js.map +1 -0
  423. package/dist/services/plugin-dev-watcher.d.ts +30 -0
  424. package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
  425. package/dist/services/plugin-dev-watcher.js +241 -0
  426. package/dist/services/plugin-dev-watcher.js.map +1 -0
  427. package/dist/services/plugin-event-bus.d.ts +149 -0
  428. package/dist/services/plugin-event-bus.d.ts.map +1 -0
  429. package/dist/services/plugin-event-bus.js +258 -0
  430. package/dist/services/plugin-event-bus.js.map +1 -0
  431. package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
  432. package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
  433. package/dist/services/plugin-host-service-cleanup.js +37 -0
  434. package/dist/services/plugin-host-service-cleanup.js.map +1 -0
  435. package/dist/services/plugin-host-services.d.ts +13 -0
  436. package/dist/services/plugin-host-services.d.ts.map +1 -0
  437. package/dist/services/plugin-host-services.js +983 -0
  438. package/dist/services/plugin-host-services.js.map +1 -0
  439. package/dist/services/plugin-job-coordinator.d.ts +81 -0
  440. package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
  441. package/dist/services/plugin-job-coordinator.js +172 -0
  442. package/dist/services/plugin-job-coordinator.js.map +1 -0
  443. package/dist/services/plugin-job-scheduler.d.ts +163 -0
  444. package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
  445. package/dist/services/plugin-job-scheduler.js +454 -0
  446. package/dist/services/plugin-job-scheduler.js.map +1 -0
  447. package/dist/services/plugin-job-store.d.ts +208 -0
  448. package/dist/services/plugin-job-store.d.ts.map +1 -0
  449. package/dist/services/plugin-job-store.js +350 -0
  450. package/dist/services/plugin-job-store.js.map +1 -0
  451. package/dist/services/plugin-lifecycle.d.ts +203 -0
  452. package/dist/services/plugin-lifecycle.d.ts.map +1 -0
  453. package/dist/services/plugin-lifecycle.js +476 -0
  454. package/dist/services/plugin-lifecycle.js.map +1 -0
  455. package/dist/services/plugin-loader.d.ts +441 -0
  456. package/dist/services/plugin-loader.d.ts.map +1 -0
  457. package/dist/services/plugin-loader.js +1192 -0
  458. package/dist/services/plugin-loader.js.map +1 -0
  459. package/dist/services/plugin-log-retention.d.ts +20 -0
  460. package/dist/services/plugin-log-retention.d.ts.map +1 -0
  461. package/dist/services/plugin-log-retention.js +63 -0
  462. package/dist/services/plugin-log-retention.js.map +1 -0
  463. package/dist/services/plugin-manifest-validator.d.ts +79 -0
  464. package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
  465. package/dist/services/plugin-manifest-validator.js +84 -0
  466. package/dist/services/plugin-manifest-validator.js.map +1 -0
  467. package/dist/services/plugin-registry.d.ts +2542 -0
  468. package/dist/services/plugin-registry.d.ts.map +1 -0
  469. package/dist/services/plugin-registry.js +539 -0
  470. package/dist/services/plugin-registry.js.map +1 -0
  471. package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
  472. package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
  473. package/dist/services/plugin-runtime-sandbox.js +154 -0
  474. package/dist/services/plugin-runtime-sandbox.js.map +1 -0
  475. package/dist/services/plugin-secrets-handler.d.ts +81 -0
  476. package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
  477. package/dist/services/plugin-secrets-handler.js +275 -0
  478. package/dist/services/plugin-secrets-handler.js.map +1 -0
  479. package/dist/services/plugin-state-store.d.ts +92 -0
  480. package/dist/services/plugin-state-store.d.ts.map +1 -0
  481. package/dist/services/plugin-state-store.js +190 -0
  482. package/dist/services/plugin-state-store.js.map +1 -0
  483. package/dist/services/plugin-stream-bus.d.ts +29 -0
  484. package/dist/services/plugin-stream-bus.d.ts.map +1 -0
  485. package/dist/services/plugin-stream-bus.js +48 -0
  486. package/dist/services/plugin-stream-bus.js.map +1 -0
  487. package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
  488. package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
  489. package/dist/services/plugin-tool-dispatcher.js +224 -0
  490. package/dist/services/plugin-tool-dispatcher.js.map +1 -0
  491. package/dist/services/plugin-tool-registry.d.ts +192 -0
  492. package/dist/services/plugin-tool-registry.d.ts.map +1 -0
  493. package/dist/services/plugin-tool-registry.js +224 -0
  494. package/dist/services/plugin-tool-registry.js.map +1 -0
  495. package/dist/services/plugin-worker-manager.d.ts +260 -0
  496. package/dist/services/plugin-worker-manager.d.ts.map +1 -0
  497. package/dist/services/plugin-worker-manager.js +835 -0
  498. package/dist/services/plugin-worker-manager.js.map +1 -0
  499. package/dist/services/project-workspace-runtime-config.d.ts +4 -0
  500. package/dist/services/project-workspace-runtime-config.d.ts.map +1 -0
  501. package/dist/services/project-workspace-runtime-config.js +43 -0
  502. package/dist/services/project-workspace-runtime-config.js.map +1 -0
  503. package/dist/services/projects.d.ts +88 -0
  504. package/dist/services/projects.d.ts.map +1 -0
  505. package/dist/services/projects.js +669 -0
  506. package/dist/services/projects.js.map +1 -0
  507. package/dist/services/quota-windows.d.ts +9 -0
  508. package/dist/services/quota-windows.d.ts.map +1 -0
  509. package/dist/services/quota-windows.js +56 -0
  510. package/dist/services/quota-windows.js.map +1 -0
  511. package/dist/services/routines.d.ts +136 -0
  512. package/dist/services/routines.d.ts.map +1 -0
  513. package/dist/services/routines.js +1268 -0
  514. package/dist/services/routines.js.map +1 -0
  515. package/dist/services/run-log-store.d.ts +34 -0
  516. package/dist/services/run-log-store.d.ts.map +1 -0
  517. package/dist/services/run-log-store.js +109 -0
  518. package/dist/services/run-log-store.js.map +1 -0
  519. package/dist/services/secrets.d.ts +511 -0
  520. package/dist/services/secrets.d.ts.map +1 -0
  521. package/dist/services/secrets.js +289 -0
  522. package/dist/services/secrets.js.map +1 -0
  523. package/dist/services/sidebar-badges.d.ts +9 -0
  524. package/dist/services/sidebar-badges.d.ts.map +1 -0
  525. package/dist/services/sidebar-badges.js +33 -0
  526. package/dist/services/sidebar-badges.js.map +1 -0
  527. package/dist/services/work-products.d.ts +14 -0
  528. package/dist/services/work-products.d.ts.map +1 -0
  529. package/dist/services/work-products.js +100 -0
  530. package/dist/services/work-products.js.map +1 -0
  531. package/dist/services/workspace-operation-log-store.d.ts +33 -0
  532. package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
  533. package/dist/services/workspace-operation-log-store.js +110 -0
  534. package/dist/services/workspace-operation-log-store.js.map +1 -0
  535. package/dist/services/workspace-operations.d.ts +44 -0
  536. package/dist/services/workspace-operations.d.ts.map +1 -0
  537. package/dist/services/workspace-operations.js +211 -0
  538. package/dist/services/workspace-operations.js.map +1 -0
  539. package/dist/services/workspace-runtime.d.ts +188 -0
  540. package/dist/services/workspace-runtime.d.ts.map +1 -0
  541. package/dist/services/workspace-runtime.js +1705 -0
  542. package/dist/services/workspace-runtime.js.map +1 -0
  543. package/dist/startup-banner.d.ts +31 -0
  544. package/dist/startup-banner.d.ts.map +1 -0
  545. package/dist/startup-banner.js +117 -0
  546. package/dist/startup-banner.js.map +1 -0
  547. package/dist/storage/index.d.ts +6 -0
  548. package/dist/storage/index.d.ts.map +1 -0
  549. package/dist/storage/index.js +29 -0
  550. package/dist/storage/index.js.map +1 -0
  551. package/dist/storage/local-disk-provider.d.ts +3 -0
  552. package/dist/storage/local-disk-provider.d.ts.map +1 -0
  553. package/dist/storage/local-disk-provider.js +79 -0
  554. package/dist/storage/local-disk-provider.js.map +1 -0
  555. package/dist/storage/provider-registry.d.ts +4 -0
  556. package/dist/storage/provider-registry.d.ts.map +1 -0
  557. package/dist/storage/provider-registry.js +15 -0
  558. package/dist/storage/provider-registry.js.map +1 -0
  559. package/dist/storage/s3-provider.d.ts +11 -0
  560. package/dist/storage/s3-provider.d.ts.map +1 -0
  561. package/dist/storage/s3-provider.js +123 -0
  562. package/dist/storage/s3-provider.js.map +1 -0
  563. package/dist/storage/service.d.ts +3 -0
  564. package/dist/storage/service.d.ts.map +1 -0
  565. package/dist/storage/service.js +120 -0
  566. package/dist/storage/service.js.map +1 -0
  567. package/dist/storage/types.d.ts +55 -0
  568. package/dist/storage/types.d.ts.map +1 -0
  569. package/dist/storage/types.js +2 -0
  570. package/dist/storage/types.js.map +1 -0
  571. package/dist/telemetry.d.ts +6 -0
  572. package/dist/telemetry.d.ts.map +1 -0
  573. package/dist/telemetry.js +20 -0
  574. package/dist/telemetry.js.map +1 -0
  575. package/dist/ui-branding.d.ts +13 -0
  576. package/dist/ui-branding.d.ts.map +1 -0
  577. package/dist/ui-branding.js +187 -0
  578. package/dist/ui-branding.js.map +1 -0
  579. package/dist/version.d.ts +2 -0
  580. package/dist/version.d.ts.map +1 -0
  581. package/dist/version.js +5 -0
  582. package/dist/version.js.map +1 -0
  583. package/dist/worktree-config.d.ts +19 -0
  584. package/dist/worktree-config.d.ts.map +1 -0
  585. package/dist/worktree-config.js +365 -0
  586. package/dist/worktree-config.js.map +1 -0
  587. package/package.json +90 -0
  588. package/ui-dist/android-chrome-192x192.png +0 -0
  589. package/ui-dist/android-chrome-512x512.png +0 -0
  590. package/ui-dist/apple-touch-icon.png +0 -0
  591. package/ui-dist/assets/_basePickBy-D2fZf0o0.js +1 -0
  592. package/ui-dist/assets/_baseUniq-CWLG_Xqf.js +1 -0
  593. package/ui-dist/assets/apl-B4CMkyY2.js +1 -0
  594. package/ui-dist/assets/arc-DeECLtLk.js +1 -0
  595. package/ui-dist/assets/architectureDiagram-VXUJARFQ-a4Gzo-8u.js +36 -0
  596. package/ui-dist/assets/asciiarmor-Df11BRmG.js +1 -0
  597. package/ui-dist/assets/asn1-EdZsLKOL.js +1 -0
  598. package/ui-dist/assets/asterisk-B-8jnY81.js +1 -0
  599. package/ui-dist/assets/blockDiagram-VD42YOAC-tsACr-ke.js +122 -0
  600. package/ui-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  601. package/ui-dist/assets/c4Diagram-YG6GDRKO-CxIEiGp0.js +10 -0
  602. package/ui-dist/assets/channel-B8aOlvkH.js +1 -0
  603. package/ui-dist/assets/chunk-4BX2VUAB-DXyq1OVE.js +1 -0
  604. package/ui-dist/assets/chunk-55IACEB6-DE0IJwCp.js +1 -0
  605. package/ui-dist/assets/chunk-B4BG7PRW-C4VgkuRm.js +165 -0
  606. package/ui-dist/assets/chunk-DI55MBZ5-DUnVODLP.js +220 -0
  607. package/ui-dist/assets/chunk-FMBD7UC4-D14U1wU8.js +15 -0
  608. package/ui-dist/assets/chunk-QN33PNHL--9Fa_-d7.js +1 -0
  609. package/ui-dist/assets/chunk-QZHKN3VN-6vF9hrbB.js +1 -0
  610. package/ui-dist/assets/chunk-TZMSLE5B-BOKdVMfQ.js +1 -0
  611. package/ui-dist/assets/classDiagram-2ON5EDUG-CNtVQyHf.js +1 -0
  612. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-CNtVQyHf.js +1 -0
  613. package/ui-dist/assets/clike-B9uivgTg.js +1 -0
  614. package/ui-dist/assets/clojure-BMjYHr_A.js +1 -0
  615. package/ui-dist/assets/clone-DbnZAhBs.js +1 -0
  616. package/ui-dist/assets/cmake-BQqOBYOt.js +1 -0
  617. package/ui-dist/assets/cobol-CWcv1MsR.js +1 -0
  618. package/ui-dist/assets/coffeescript-S37ZYGWr.js +1 -0
  619. package/ui-dist/assets/commonlisp-DBKNyK5s.js +1 -0
  620. package/ui-dist/assets/cose-bilkent-S5V4N54A-BSFYrItZ.js +1 -0
  621. package/ui-dist/assets/crystal-SjHAIU92.js +1 -0
  622. package/ui-dist/assets/css-BnMrqG3P.js +1 -0
  623. package/ui-dist/assets/cypher-C_CwsFkJ.js +1 -0
  624. package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  625. package/ui-dist/assets/d-pRatUO7H.js +1 -0
  626. package/ui-dist/assets/dagre-6UL2VRFP-D8xEb_jz.js +4 -0
  627. package/ui-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  628. package/ui-dist/assets/diagram-PSM6KHXK-kkdfif_P.js +24 -0
  629. package/ui-dist/assets/diagram-QEK2KX5R-BOA1wTkn.js +43 -0
  630. package/ui-dist/assets/diagram-S2PKOQOG-BMxIrdD_.js +24 -0
  631. package/ui-dist/assets/diff-DbItnlRl.js +1 -0
  632. package/ui-dist/assets/dockerfile-BKs6k2Af.js +1 -0
  633. package/ui-dist/assets/dtd-DF_7sFjM.js +1 -0
  634. package/ui-dist/assets/dylan-DwRh75JA.js +1 -0
  635. package/ui-dist/assets/ebnf-CDyGwa7X.js +1 -0
  636. package/ui-dist/assets/ecl-Cabwm37j.js +1 -0
  637. package/ui-dist/assets/eiffel-CnydiIhH.js +1 -0
  638. package/ui-dist/assets/elm-vLlmbW-K.js +1 -0
  639. package/ui-dist/assets/erDiagram-Q2GNP2WA-O1OwJuJt.js +60 -0
  640. package/ui-dist/assets/erlang-BNw1qcRV.js +1 -0
  641. package/ui-dist/assets/factor-kuTfRLto.js +1 -0
  642. package/ui-dist/assets/fcl-Kvtd6kyn.js +1 -0
  643. package/ui-dist/assets/flowDiagram-NV44I4VS-Ca9TsVEe.js +162 -0
  644. package/ui-dist/assets/forth-Ffai-XNe.js +1 -0
  645. package/ui-dist/assets/fortran-DYz_wnZ1.js +1 -0
  646. package/ui-dist/assets/ganttDiagram-JELNMOA3-CZ3k4lR4.js +267 -0
  647. package/ui-dist/assets/gas-Bneqetm1.js +1 -0
  648. package/ui-dist/assets/gherkin-heZmZLOM.js +1 -0
  649. package/ui-dist/assets/gitGraphDiagram-V2S2FVAM-CYXpu5VF.js +65 -0
  650. package/ui-dist/assets/graph-Ct1Mwc2w.js +1 -0
  651. package/ui-dist/assets/groovy-D9Dt4D0W.js +1 -0
  652. package/ui-dist/assets/haskell-Cw1EW3IL.js +1 -0
  653. package/ui-dist/assets/haxe-H-WmDvRZ.js +1 -0
  654. package/ui-dist/assets/http-DBlCnlav.js +1 -0
  655. package/ui-dist/assets/idl-BEugSyMb.js +1 -0
  656. package/ui-dist/assets/index-1-xGTyG8.js +1 -0
  657. package/ui-dist/assets/index-2BV3lexL.js +1 -0
  658. package/ui-dist/assets/index-7nZVjhgZ.js +1227 -0
  659. package/ui-dist/assets/index-B3cKIXfV.js +1 -0
  660. package/ui-dist/assets/index-BKVrlVnm.js +1 -0
  661. package/ui-dist/assets/index-BoQp7qpa.js +6 -0
  662. package/ui-dist/assets/index-Bso7Ph2z.js +1 -0
  663. package/ui-dist/assets/index-C016T1QA.js +1 -0
  664. package/ui-dist/assets/index-CKShy7qg.js +1 -0
  665. package/ui-dist/assets/index-CTeTAOP4.js +2 -0
  666. package/ui-dist/assets/index-CU0xjnJx.js +1 -0
  667. package/ui-dist/assets/index-CX3xG_nU.js +1 -0
  668. package/ui-dist/assets/index-ChGANpP5.js +1 -0
  669. package/ui-dist/assets/index-Cyi4EPvJ.js +13 -0
  670. package/ui-dist/assets/index-D4ERoZ49.js +1 -0
  671. package/ui-dist/assets/index-DAhE9Tae.js +1 -0
  672. package/ui-dist/assets/index-DYf-Vmt-.js +1 -0
  673. package/ui-dist/assets/index-DZ5z-1W5.js +1 -0
  674. package/ui-dist/assets/index-Dbx0Jq5s.js +1 -0
  675. package/ui-dist/assets/index-DcJU9_Xw.js +3 -0
  676. package/ui-dist/assets/index-DzvAUKSy.js +1 -0
  677. package/ui-dist/assets/index-Ip5TfL79.css +1 -0
  678. package/ui-dist/assets/index-b-wjeoWr.js +7 -0
  679. package/ui-dist/assets/index-zAFj8SiW.js +1 -0
  680. package/ui-dist/assets/infoDiagram-HS3SLOUP-BBoge3td.js +2 -0
  681. package/ui-dist/assets/init-Gi6I4Gst.js +1 -0
  682. package/ui-dist/assets/javascript-iXu5QeM3.js +1 -0
  683. package/ui-dist/assets/journeyDiagram-XKPGCS4Q-D6qBxJvS.js +139 -0
  684. package/ui-dist/assets/julia-DuME0IfC.js +1 -0
  685. package/ui-dist/assets/kanban-definition-3W4ZIXB7-BKw70hff.js +89 -0
  686. package/ui-dist/assets/katex-O9d3_IXG.js +261 -0
  687. package/ui-dist/assets/layout-C-MelZ5a.js +1 -0
  688. package/ui-dist/assets/linear-BDJBF_lN.js +1 -0
  689. package/ui-dist/assets/livescript-BwQOo05w.js +1 -0
  690. package/ui-dist/assets/lua-BgMRiT3U.js +1 -0
  691. package/ui-dist/assets/mathematica-DTrFuWx2.js +1 -0
  692. package/ui-dist/assets/mbox-CNhZ1qSd.js +1 -0
  693. package/ui-dist/assets/mermaid.core-C_LSSro9.js +256 -0
  694. package/ui-dist/assets/mindmap-definition-VGOIOE7T-DKTz8YjL.js +68 -0
  695. package/ui-dist/assets/mirc-CjQqDB4T.js +1 -0
  696. package/ui-dist/assets/mllike-CXdrOF99.js +1 -0
  697. package/ui-dist/assets/modelica-Dc1JOy9r.js +1 -0
  698. package/ui-dist/assets/mscgen-BA5vi2Kp.js +1 -0
  699. package/ui-dist/assets/mumps-BT43cFF4.js +1 -0
  700. package/ui-dist/assets/nginx-DdIZxoE0.js +1 -0
  701. package/ui-dist/assets/nsis-LdVXkNf5.js +1 -0
  702. package/ui-dist/assets/ntriples-BfvgReVJ.js +1 -0
  703. package/ui-dist/assets/octave-Ck1zUtKM.js +1 -0
  704. package/ui-dist/assets/ordinal-Cboi1Yqb.js +1 -0
  705. package/ui-dist/assets/oz-BzwKVEFT.js +1 -0
  706. package/ui-dist/assets/pascal--L3eBynH.js +1 -0
  707. package/ui-dist/assets/perl-CdXCOZ3F.js +1 -0
  708. package/ui-dist/assets/pieDiagram-ADFJNKIX-COzMH2F2.js +30 -0
  709. package/ui-dist/assets/pig-CevX1Tat.js +1 -0
  710. package/ui-dist/assets/powershell-CFHJl5sT.js +1 -0
  711. package/ui-dist/assets/properties-C78fOPTZ.js +1 -0
  712. package/ui-dist/assets/protobuf-ChK-085T.js +1 -0
  713. package/ui-dist/assets/pug-DeIclll2.js +1 -0
  714. package/ui-dist/assets/puppet-DMA9R1ak.js +1 -0
  715. package/ui-dist/assets/python-BuPzkPfP.js +1 -0
  716. package/ui-dist/assets/q-pXgVlZs6.js +1 -0
  717. package/ui-dist/assets/quadrantDiagram-AYHSOK5B-I8FRTFaI.js +7 -0
  718. package/ui-dist/assets/r-B6wPVr8A.js +1 -0
  719. package/ui-dist/assets/requirementDiagram-UZGBJVZJ-DI3nQy2l.js +64 -0
  720. package/ui-dist/assets/rpm-CTu-6PCP.js +1 -0
  721. package/ui-dist/assets/ruby-B2Rjki9n.js +1 -0
  722. package/ui-dist/assets/sankeyDiagram-TZEHDZUN-Pf_PmYIt.js +10 -0
  723. package/ui-dist/assets/sas-B4kiWyti.js +1 -0
  724. package/ui-dist/assets/scheme-C41bIUwD.js +1 -0
  725. package/ui-dist/assets/sequenceDiagram-WL72ISMW-DLgaS7kB.js +145 -0
  726. package/ui-dist/assets/shell-CjFT_Tl9.js +1 -0
  727. package/ui-dist/assets/sieve-C3Gn_uJK.js +1 -0
  728. package/ui-dist/assets/simple-mode-GW_nhZxv.js +1 -0
  729. package/ui-dist/assets/smalltalk-CnHTOXQT.js +1 -0
  730. package/ui-dist/assets/solr-DehyRSwq.js +1 -0
  731. package/ui-dist/assets/sparql-DkYu6x3z.js +1 -0
  732. package/ui-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  733. package/ui-dist/assets/sql-D0XecflT.js +1 -0
  734. package/ui-dist/assets/stateDiagram-FKZM4ZOC-BvMa1uU-.js +1 -0
  735. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-BKAZNp5l.js +1 -0
  736. package/ui-dist/assets/stex-C3f8Ysf7.js +1 -0
  737. package/ui-dist/assets/stylus-B533Al4x.js +1 -0
  738. package/ui-dist/assets/swift-BzpIVaGY.js +1 -0
  739. package/ui-dist/assets/tcl-DVfN8rqt.js +1 -0
  740. package/ui-dist/assets/textile-CnDTJFAw.js +1 -0
  741. package/ui-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  742. package/ui-dist/assets/tiki-DGYXhP31.js +1 -0
  743. package/ui-dist/assets/timeline-definition-IT6M3QCI-JQUCAkOQ.js +61 -0
  744. package/ui-dist/assets/toml-Bm5Em-hy.js +1 -0
  745. package/ui-dist/assets/treemap-GDKQZRPO-BK87qA0V.js +162 -0
  746. package/ui-dist/assets/troff-wAsdV37c.js +1 -0
  747. package/ui-dist/assets/ttcn-CfJYG6tj.js +1 -0
  748. package/ui-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  749. package/ui-dist/assets/turtle-B1tBg_DP.js +1 -0
  750. package/ui-dist/assets/vb-CmGdzxic.js +1 -0
  751. package/ui-dist/assets/vbscript-BuJXcnF6.js +1 -0
  752. package/ui-dist/assets/velocity-D8B20fx6.js +1 -0
  753. package/ui-dist/assets/verilog-C6RDOZhf.js +1 -0
  754. package/ui-dist/assets/vhdl-lSbBsy5d.js +1 -0
  755. package/ui-dist/assets/webidl-ZXfAyPTL.js +1 -0
  756. package/ui-dist/assets/xquery-DzFWVndE.js +1 -0
  757. package/ui-dist/assets/xychartDiagram-PRI3JC2R-UI3XP-6x.js +7 -0
  758. package/ui-dist/assets/yacas-BJ4BC0dw.js +1 -0
  759. package/ui-dist/assets/z80-Hz9HOZM7.js +1 -0
  760. package/ui-dist/brands/opencode-logo-dark-square.svg +18 -0
  761. package/ui-dist/brands/opencode-logo-light-square.svg +18 -0
  762. package/ui-dist/favicon-16x16.png +0 -0
  763. package/ui-dist/favicon-32x32.png +0 -0
  764. package/ui-dist/favicon.ico +0 -0
  765. package/ui-dist/favicon.svg +9 -0
  766. package/ui-dist/index.html +49 -0
  767. package/ui-dist/site.webmanifest +30 -0
  768. package/ui-dist/sw.js +42 -0
  769. package/ui-dist/worktree-favicon-16x16.png +0 -0
  770. package/ui-dist/worktree-favicon-32x32.png +0 -0
  771. package/ui-dist/worktree-favicon.ico +0 -0
  772. package/ui-dist/worktree-favicon.svg +9 -0
@@ -0,0 +1,1705 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import net from "node:net";
4
+ import { createHash, randomUUID } from "node:crypto";
5
+ import path from "node:path";
6
+ import { setTimeout as delay } from "node:timers/promises";
7
+ import { executionWorkspaces, projectWorkspaces, workspaceRuntimeServices } from "@zmeel/db";
8
+ import { and, desc, eq, inArray } from "drizzle-orm";
9
+ import { asNumber, asString, parseObject, renderTemplate } from "../adapters/utils.js";
10
+ import { resolveHomeAwarePath } from "../home-paths.js";
11
+ import { createLocalServiceKey, findLocalServiceRegistryRecordByRuntimeServiceId, findAdoptableLocalService, readLocalServicePortOwner, removeLocalServiceRegistryRecord, terminateLocalService, touchLocalServiceRegistryRecord, writeLocalServiceRegistryRecord, } from "./local-service-supervisor.js";
12
+ import { readExecutionWorkspaceConfig } from "./execution-workspaces.js";
13
+ import { readProjectWorkspaceRuntimeConfig } from "./project-workspace-runtime-config.js";
14
+ export function resolveShell() {
15
+ return process.env.SHELL?.trim() || (process.platform === "win32" ? "sh" : "/bin/sh");
16
+ }
17
+ const runtimeServicesById = new Map();
18
+ const runtimeServicesByReuseKey = new Map();
19
+ const runtimeServiceLeasesByRun = new Map();
20
+ export async function resetRuntimeServicesForTests() {
21
+ for (const record of runtimeServicesById.values()) {
22
+ clearIdleTimer(record);
23
+ }
24
+ runtimeServicesById.clear();
25
+ runtimeServicesByReuseKey.clear();
26
+ runtimeServiceLeasesByRun.clear();
27
+ }
28
+ function stableStringify(value) {
29
+ if (Array.isArray(value)) {
30
+ return `[${value.map((entry) => stableStringify(entry)).join(",")}]`;
31
+ }
32
+ if (value && typeof value === "object") {
33
+ const rec = value;
34
+ return `{${Object.keys(rec).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(rec[key])}`).join(",")}}`;
35
+ }
36
+ return JSON.stringify(value);
37
+ }
38
+ export function sanitizeRuntimeServiceBaseEnv(baseEnv) {
39
+ const env = { ...baseEnv };
40
+ for (const key of Object.keys(env)) {
41
+ if (key.startsWith("ZMEEL_")) {
42
+ delete env[key];
43
+ }
44
+ }
45
+ delete env.DATABASE_URL;
46
+ delete env.npm_config_tailscale_auth;
47
+ delete env.npm_config_authenticated_private;
48
+ return env;
49
+ }
50
+ function stableRuntimeServiceId(input) {
51
+ if (input.reportId)
52
+ return input.reportId;
53
+ const digest = createHash("sha256")
54
+ .update(stableStringify({
55
+ adapterType: input.adapterType,
56
+ runId: input.runId,
57
+ scopeType: input.scopeType,
58
+ scopeId: input.scopeId,
59
+ serviceName: input.serviceName,
60
+ providerRef: input.providerRef,
61
+ reuseKey: input.reuseKey,
62
+ }))
63
+ .digest("hex")
64
+ .slice(0, 32);
65
+ return `${input.adapterType}-${digest}`;
66
+ }
67
+ function toRuntimeServiceRef(record, overrides) {
68
+ return {
69
+ id: record.id,
70
+ companyId: record.companyId,
71
+ projectId: record.projectId,
72
+ projectWorkspaceId: record.projectWorkspaceId,
73
+ executionWorkspaceId: record.executionWorkspaceId,
74
+ issueId: record.issueId,
75
+ serviceName: record.serviceName,
76
+ status: record.status,
77
+ lifecycle: record.lifecycle,
78
+ scopeType: record.scopeType,
79
+ scopeId: record.scopeId,
80
+ reuseKey: record.reuseKey,
81
+ command: record.command,
82
+ cwd: record.cwd,
83
+ port: record.port,
84
+ url: record.url,
85
+ provider: record.provider,
86
+ providerRef: record.providerRef,
87
+ ownerAgentId: record.ownerAgentId,
88
+ startedByRunId: record.startedByRunId,
89
+ lastUsedAt: record.lastUsedAt,
90
+ startedAt: record.startedAt,
91
+ stoppedAt: record.stoppedAt,
92
+ stopPolicy: record.stopPolicy,
93
+ healthStatus: record.healthStatus,
94
+ reused: record.reused,
95
+ ...overrides,
96
+ };
97
+ }
98
+ function sanitizeSlugPart(value, fallback) {
99
+ const raw = (value ?? "").trim().toLowerCase();
100
+ const normalized = raw
101
+ .replace(/[^a-z0-9_-]+/g, "-")
102
+ .replace(/-+/g, "-")
103
+ .replace(/^[-_]+|[-_]+$/g, "");
104
+ return normalized.length > 0 ? normalized : fallback;
105
+ }
106
+ function renderWorkspaceTemplate(template, input) {
107
+ const issueIdentifier = input.issue?.identifier ?? input.issue?.id ?? "issue";
108
+ const slug = sanitizeSlugPart(input.issue?.title, sanitizeSlugPart(issueIdentifier, "issue"));
109
+ return renderTemplate(template, {
110
+ issue: {
111
+ id: input.issue?.id ?? "",
112
+ identifier: input.issue?.identifier ?? "",
113
+ title: input.issue?.title ?? "",
114
+ },
115
+ agent: {
116
+ id: input.agent.id ?? "",
117
+ name: input.agent.name,
118
+ },
119
+ project: {
120
+ id: input.projectId ?? "",
121
+ },
122
+ workspace: {
123
+ repoRef: input.repoRef ?? "",
124
+ },
125
+ slug,
126
+ });
127
+ }
128
+ function sanitizeBranchName(value) {
129
+ return value
130
+ .trim()
131
+ .replace(/[^A-Za-z0-9._/-]+/g, "-")
132
+ .replace(/-+/g, "-")
133
+ .replace(/^[-/.]+|[-/.]+$/g, "")
134
+ .slice(0, 120) || "zmeel-work";
135
+ }
136
+ function isAbsolutePath(value) {
137
+ return path.isAbsolute(value) || value.startsWith("~");
138
+ }
139
+ function resolveConfiguredPath(value, baseDir) {
140
+ if (isAbsolutePath(value)) {
141
+ return resolveHomeAwarePath(value);
142
+ }
143
+ return path.resolve(baseDir, value);
144
+ }
145
+ function formatCommandForDisplay(command, args) {
146
+ return [command, ...args]
147
+ .map((part) => (/^[A-Za-z0-9_./:-]+$/.test(part) ? part : JSON.stringify(part)))
148
+ .join(" ");
149
+ }
150
+ async function executeProcess(input) {
151
+ const proc = await new Promise((resolve, reject) => {
152
+ const child = spawn(input.command, input.args, {
153
+ cwd: input.cwd,
154
+ stdio: ["ignore", "pipe", "pipe"],
155
+ env: input.env ?? process.env,
156
+ });
157
+ let stdout = "";
158
+ let stderr = "";
159
+ child.stdout?.on("data", (chunk) => {
160
+ stdout += String(chunk);
161
+ });
162
+ child.stderr?.on("data", (chunk) => {
163
+ stderr += String(chunk);
164
+ });
165
+ child.on("error", reject);
166
+ child.on("close", (code) => resolve({ stdout, stderr, code }));
167
+ });
168
+ return proc;
169
+ }
170
+ async function runGit(args, cwd) {
171
+ const proc = await executeProcess({
172
+ command: "git",
173
+ args,
174
+ cwd,
175
+ });
176
+ if (proc.code !== 0) {
177
+ throw new Error(proc.stderr.trim() || proc.stdout.trim() || `git ${args.join(" ")} failed`);
178
+ }
179
+ return proc.stdout.trim();
180
+ }
181
+ function gitErrorIncludes(error, needle) {
182
+ const message = error instanceof Error ? error.message : String(error);
183
+ return message.toLowerCase().includes(needle.toLowerCase());
184
+ }
185
+ async function detectDefaultBranch(repoRoot) {
186
+ // Try the explicit remote HEAD first (set by git clone or git remote set-head)
187
+ try {
188
+ const remoteHead = await runGit(["symbolic-ref", "--quiet", "--short", "refs/remotes/origin/HEAD"], repoRoot);
189
+ const branch = remoteHead?.startsWith("origin/") ? remoteHead.slice("origin/".length) : remoteHead;
190
+ if (branch)
191
+ return branch;
192
+ }
193
+ catch {
194
+ // Not set — fall through to heuristic
195
+ }
196
+ // Fallback: check for common default branch names on the remote
197
+ for (const candidate of ["main", "master"]) {
198
+ try {
199
+ await runGit(["rev-parse", "--verify", `refs/remotes/origin/${candidate}`], repoRoot);
200
+ return candidate;
201
+ }
202
+ catch {
203
+ // Not found — try next
204
+ }
205
+ }
206
+ return null;
207
+ }
208
+ async function directoryExists(value) {
209
+ return fs.stat(value).then((stats) => stats.isDirectory()).catch(() => false);
210
+ }
211
+ function terminateChildProcess(child) {
212
+ if (!child.pid)
213
+ return;
214
+ if (process.platform !== "win32") {
215
+ try {
216
+ process.kill(-child.pid, "SIGTERM");
217
+ return;
218
+ }
219
+ catch {
220
+ // Fall through to the direct child kill.
221
+ }
222
+ }
223
+ if (!child.killed) {
224
+ child.kill("SIGTERM");
225
+ }
226
+ }
227
+ function buildWorkspaceCommandEnv(input) {
228
+ const env = { ...process.env };
229
+ env.ZMEEL_WORKSPACE_CWD = input.worktreePath;
230
+ env.ZMEEL_WORKSPACE_PATH = input.worktreePath;
231
+ env.ZMEEL_WORKSPACE_WORKTREE_PATH = input.worktreePath;
232
+ env.ZMEEL_WORKSPACE_BRANCH = input.branchName;
233
+ env.ZMEEL_WORKSPACE_BASE_CWD = input.base.baseCwd;
234
+ env.ZMEEL_WORKSPACE_REPO_ROOT = input.repoRoot;
235
+ env.ZMEEL_WORKSPACE_SOURCE = input.base.source;
236
+ env.ZMEEL_WORKSPACE_REPO_REF = input.base.repoRef ?? "";
237
+ env.ZMEEL_WORKSPACE_REPO_URL = input.base.repoUrl ?? "";
238
+ env.ZMEEL_WORKSPACE_CREATED = input.created ? "true" : "false";
239
+ env.ZMEEL_PROJECT_ID = input.base.projectId ?? "";
240
+ env.ZMEEL_PROJECT_WORKSPACE_ID = input.base.workspaceId ?? "";
241
+ env.ZMEEL_AGENT_ID = input.agent.id ?? "";
242
+ env.ZMEEL_AGENT_NAME = input.agent.name;
243
+ env.ZMEEL_COMPANY_ID = input.agent.companyId;
244
+ env.ZMEEL_ISSUE_ID = input.issue?.id ?? "";
245
+ env.ZMEEL_ISSUE_IDENTIFIER = input.issue?.identifier ?? "";
246
+ env.ZMEEL_ISSUE_TITLE = input.issue?.title ?? "";
247
+ return env;
248
+ }
249
+ async function runWorkspaceCommand(input) {
250
+ const shell = resolveShell();
251
+ const proc = await executeProcess({
252
+ command: shell,
253
+ args: ["-c", input.command],
254
+ cwd: input.cwd,
255
+ env: input.env,
256
+ });
257
+ if (proc.code === 0)
258
+ return;
259
+ const details = [proc.stderr.trim(), proc.stdout.trim()].filter(Boolean).join("\n");
260
+ throw new Error(details.length > 0
261
+ ? `${input.label} failed: ${details}`
262
+ : `${input.label} failed with exit code ${proc.code ?? -1}`);
263
+ }
264
+ async function recordGitOperation(recorder, input) {
265
+ if (!recorder) {
266
+ return runGit(input.args, input.cwd);
267
+ }
268
+ let stdout = "";
269
+ let stderr = "";
270
+ let code = null;
271
+ await recorder.recordOperation({
272
+ phase: input.phase,
273
+ command: formatCommandForDisplay("git", input.args),
274
+ cwd: input.cwd,
275
+ metadata: input.metadata ?? null,
276
+ run: async () => {
277
+ const result = await executeProcess({
278
+ command: "git",
279
+ args: input.args,
280
+ cwd: input.cwd,
281
+ });
282
+ stdout = result.stdout;
283
+ stderr = result.stderr;
284
+ code = result.code;
285
+ return {
286
+ status: result.code === 0 ? "succeeded" : "failed",
287
+ exitCode: result.code,
288
+ stdout: result.stdout,
289
+ stderr: result.stderr,
290
+ system: result.code === 0 ? input.successMessage ?? null : null,
291
+ };
292
+ },
293
+ });
294
+ if (code !== 0) {
295
+ const details = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
296
+ throw new Error(details.length > 0
297
+ ? `${input.failureLabel ?? `git ${input.args.join(" ")}`} failed: ${details}`
298
+ : `${input.failureLabel ?? `git ${input.args.join(" ")}`} failed with exit code ${code ?? -1}`);
299
+ }
300
+ return stdout.trim();
301
+ }
302
+ async function recordWorkspaceCommandOperation(recorder, input) {
303
+ if (!recorder) {
304
+ await runWorkspaceCommand(input);
305
+ return;
306
+ }
307
+ let stdout = "";
308
+ let stderr = "";
309
+ let code = null;
310
+ await recorder.recordOperation({
311
+ phase: input.phase,
312
+ command: input.command,
313
+ cwd: input.cwd,
314
+ metadata: input.metadata ?? null,
315
+ run: async () => {
316
+ const shell = resolveShell();
317
+ const result = await executeProcess({
318
+ command: shell,
319
+ args: ["-c", input.command],
320
+ cwd: input.cwd,
321
+ env: input.env,
322
+ });
323
+ stdout = result.stdout;
324
+ stderr = result.stderr;
325
+ code = result.code;
326
+ return {
327
+ status: result.code === 0 ? "succeeded" : "failed",
328
+ exitCode: result.code,
329
+ stdout: result.stdout,
330
+ stderr: result.stderr,
331
+ system: result.code === 0 ? input.successMessage ?? null : null,
332
+ };
333
+ },
334
+ });
335
+ if (code === 0)
336
+ return;
337
+ const details = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
338
+ throw new Error(details.length > 0
339
+ ? `${input.label} failed: ${details}`
340
+ : `${input.label} failed with exit code ${code ?? -1}`);
341
+ }
342
+ async function provisionExecutionWorktree(input) {
343
+ const provisionCommand = asString(input.strategy.provisionCommand, "").trim();
344
+ if (!provisionCommand)
345
+ return;
346
+ await recordWorkspaceCommandOperation(input.recorder, {
347
+ phase: "workspace_provision",
348
+ command: provisionCommand,
349
+ cwd: input.worktreePath,
350
+ env: buildWorkspaceCommandEnv({
351
+ base: input.base,
352
+ repoRoot: input.repoRoot,
353
+ worktreePath: input.worktreePath,
354
+ branchName: input.branchName,
355
+ issue: input.issue,
356
+ agent: input.agent,
357
+ created: input.created,
358
+ }),
359
+ label: `Execution workspace provision command "${provisionCommand}"`,
360
+ metadata: {
361
+ repoRoot: input.repoRoot,
362
+ worktreePath: input.worktreePath,
363
+ branchName: input.branchName,
364
+ created: input.created,
365
+ },
366
+ successMessage: `Provisioned workspace at ${input.worktreePath}\n`,
367
+ });
368
+ }
369
+ function buildExecutionWorkspaceCleanupEnv(input) {
370
+ const env = sanitizeRuntimeServiceBaseEnv(process.env);
371
+ env.ZMEEL_WORKSPACE_CWD = input.workspace.cwd ?? "";
372
+ env.ZMEEL_WORKSPACE_PATH = input.workspace.cwd ?? "";
373
+ env.ZMEEL_WORKSPACE_WORKTREE_PATH =
374
+ input.workspace.providerRef ?? input.workspace.cwd ?? "";
375
+ env.ZMEEL_WORKSPACE_BRANCH = input.workspace.branchName ?? "";
376
+ env.ZMEEL_WORKSPACE_BASE_CWD = input.projectWorkspaceCwd ?? "";
377
+ env.ZMEEL_WORKSPACE_REPO_ROOT = input.projectWorkspaceCwd ?? "";
378
+ env.ZMEEL_WORKSPACE_REPO_URL = input.workspace.repoUrl ?? "";
379
+ env.ZMEEL_WORKSPACE_REPO_REF = input.workspace.baseRef ?? "";
380
+ env.ZMEEL_PROJECT_ID = input.workspace.projectId ?? "";
381
+ env.ZMEEL_PROJECT_WORKSPACE_ID = input.workspace.projectWorkspaceId ?? "";
382
+ env.ZMEEL_ISSUE_ID = input.workspace.sourceIssueId ?? "";
383
+ return env;
384
+ }
385
+ async function resolveGitRepoRootForWorkspaceCleanup(worktreePath, projectWorkspaceCwd) {
386
+ if (projectWorkspaceCwd) {
387
+ const resolvedProjectWorkspaceCwd = path.resolve(projectWorkspaceCwd);
388
+ const gitDir = await runGit(["rev-parse", "--git-common-dir"], resolvedProjectWorkspaceCwd)
389
+ .catch(() => null);
390
+ if (gitDir) {
391
+ const resolvedGitDir = path.resolve(resolvedProjectWorkspaceCwd, gitDir);
392
+ return path.dirname(resolvedGitDir);
393
+ }
394
+ }
395
+ const gitDir = await runGit(["rev-parse", "--git-common-dir"], worktreePath).catch(() => null);
396
+ if (!gitDir)
397
+ return null;
398
+ const resolvedGitDir = path.resolve(worktreePath, gitDir);
399
+ return path.dirname(resolvedGitDir);
400
+ }
401
+ export async function realizeExecutionWorkspace(input) {
402
+ const rawStrategy = parseObject(input.config.workspaceStrategy);
403
+ const strategyType = asString(rawStrategy.type, "project_primary");
404
+ if (strategyType !== "git_worktree") {
405
+ return {
406
+ ...input.base,
407
+ strategy: "project_primary",
408
+ cwd: input.base.baseCwd,
409
+ branchName: null,
410
+ worktreePath: null,
411
+ warnings: [],
412
+ created: false,
413
+ };
414
+ }
415
+ const repoRoot = await runGit(["rev-parse", "--show-toplevel"], input.base.baseCwd);
416
+ const branchTemplate = asString(rawStrategy.branchTemplate, "{{issue.identifier}}-{{slug}}");
417
+ const renderedBranch = renderWorkspaceTemplate(branchTemplate, {
418
+ issue: input.issue,
419
+ agent: input.agent,
420
+ projectId: input.base.projectId,
421
+ repoRef: input.base.repoRef,
422
+ });
423
+ const branchName = sanitizeBranchName(renderedBranch);
424
+ const configuredParentDir = asString(rawStrategy.worktreeParentDir, "");
425
+ const worktreeParentDir = configuredParentDir
426
+ ? resolveConfiguredPath(configuredParentDir, repoRoot)
427
+ : path.join(repoRoot, ".zmeel", "worktrees");
428
+ const worktreePath = path.join(worktreeParentDir, branchName);
429
+ const configuredBaseRef = typeof rawStrategy.baseRef === "string" && rawStrategy.baseRef.length > 0
430
+ ? rawStrategy.baseRef
431
+ : input.base.repoRef ?? null;
432
+ const baseRef = configuredBaseRef
433
+ ?? await detectDefaultBranch(repoRoot)
434
+ ?? "HEAD";
435
+ await fs.mkdir(worktreeParentDir, { recursive: true });
436
+ const existingWorktree = await directoryExists(worktreePath);
437
+ if (existingWorktree) {
438
+ const existingGitDir = await runGit(["rev-parse", "--git-dir"], worktreePath).catch(() => null);
439
+ if (existingGitDir) {
440
+ if (input.recorder) {
441
+ await input.recorder.recordOperation({
442
+ phase: "worktree_prepare",
443
+ cwd: repoRoot,
444
+ metadata: {
445
+ repoRoot,
446
+ worktreePath,
447
+ branchName,
448
+ baseRef,
449
+ created: false,
450
+ reused: true,
451
+ },
452
+ run: async () => ({
453
+ status: "succeeded",
454
+ exitCode: 0,
455
+ system: `Reused existing git worktree at ${worktreePath}\n`,
456
+ }),
457
+ });
458
+ }
459
+ await provisionExecutionWorktree({
460
+ strategy: rawStrategy,
461
+ base: input.base,
462
+ repoRoot,
463
+ worktreePath,
464
+ branchName,
465
+ issue: input.issue,
466
+ agent: input.agent,
467
+ created: false,
468
+ recorder: input.recorder ?? null,
469
+ });
470
+ return {
471
+ ...input.base,
472
+ strategy: "git_worktree",
473
+ cwd: worktreePath,
474
+ branchName,
475
+ worktreePath,
476
+ warnings: [],
477
+ created: false,
478
+ };
479
+ }
480
+ throw new Error(`Configured worktree path "${worktreePath}" already exists and is not a git worktree.`);
481
+ }
482
+ try {
483
+ await recordGitOperation(input.recorder, {
484
+ phase: "worktree_prepare",
485
+ args: ["worktree", "add", "-b", branchName, worktreePath, baseRef],
486
+ cwd: repoRoot,
487
+ metadata: {
488
+ repoRoot,
489
+ worktreePath,
490
+ branchName,
491
+ baseRef,
492
+ created: true,
493
+ },
494
+ successMessage: `Created git worktree at ${worktreePath}\n`,
495
+ failureLabel: `git worktree add ${worktreePath}`,
496
+ });
497
+ }
498
+ catch (error) {
499
+ if (!gitErrorIncludes(error, "already exists")) {
500
+ throw error;
501
+ }
502
+ await recordGitOperation(input.recorder, {
503
+ phase: "worktree_prepare",
504
+ args: ["worktree", "add", worktreePath, branchName],
505
+ cwd: repoRoot,
506
+ metadata: {
507
+ repoRoot,
508
+ worktreePath,
509
+ branchName,
510
+ baseRef,
511
+ created: false,
512
+ reusedExistingBranch: true,
513
+ },
514
+ successMessage: `Attached existing branch ${branchName} at ${worktreePath}\n`,
515
+ failureLabel: `git worktree add ${worktreePath}`,
516
+ });
517
+ }
518
+ await provisionExecutionWorktree({
519
+ strategy: rawStrategy,
520
+ base: input.base,
521
+ repoRoot,
522
+ worktreePath,
523
+ branchName,
524
+ issue: input.issue,
525
+ agent: input.agent,
526
+ created: true,
527
+ recorder: input.recorder ?? null,
528
+ });
529
+ return {
530
+ ...input.base,
531
+ strategy: "git_worktree",
532
+ cwd: worktreePath,
533
+ branchName,
534
+ worktreePath,
535
+ warnings: [],
536
+ created: true,
537
+ };
538
+ }
539
+ export async function cleanupExecutionWorkspaceArtifacts(input) {
540
+ const warnings = [];
541
+ const workspacePath = input.workspace.providerRef ?? input.workspace.cwd;
542
+ const cleanupEnv = buildExecutionWorkspaceCleanupEnv({
543
+ workspace: input.workspace,
544
+ projectWorkspaceCwd: input.projectWorkspace?.cwd ?? null,
545
+ });
546
+ const createdByRuntime = input.workspace.metadata?.createdByRuntime === true;
547
+ const cleanupCommands = [
548
+ input.cleanupCommand ?? null,
549
+ input.projectWorkspace?.cleanupCommand ?? null,
550
+ input.teardownCommand ?? null,
551
+ ]
552
+ .map((value) => asString(value, "").trim())
553
+ .filter(Boolean);
554
+ for (const command of cleanupCommands) {
555
+ try {
556
+ await recordWorkspaceCommandOperation(input.recorder, {
557
+ phase: "workspace_teardown",
558
+ command,
559
+ cwd: workspacePath ?? input.projectWorkspace?.cwd ?? process.cwd(),
560
+ env: cleanupEnv,
561
+ label: `Execution workspace cleanup command "${command}"`,
562
+ metadata: {
563
+ workspaceId: input.workspace.id,
564
+ workspacePath,
565
+ branchName: input.workspace.branchName,
566
+ providerType: input.workspace.providerType,
567
+ },
568
+ successMessage: `Completed cleanup command "${command}"\n`,
569
+ });
570
+ }
571
+ catch (err) {
572
+ warnings.push(err instanceof Error ? err.message : String(err));
573
+ }
574
+ }
575
+ if (input.workspace.providerType === "git_worktree" && workspacePath) {
576
+ const repoRoot = await resolveGitRepoRootForWorkspaceCleanup(workspacePath, input.projectWorkspace?.cwd ?? null);
577
+ const worktreeExists = await directoryExists(workspacePath);
578
+ if (worktreeExists) {
579
+ if (!repoRoot) {
580
+ warnings.push(`Could not resolve git repo root for "${workspacePath}".`);
581
+ }
582
+ else {
583
+ try {
584
+ await recordGitOperation(input.recorder, {
585
+ phase: "worktree_cleanup",
586
+ args: ["worktree", "remove", "--force", workspacePath],
587
+ cwd: repoRoot,
588
+ metadata: {
589
+ workspaceId: input.workspace.id,
590
+ workspacePath,
591
+ branchName: input.workspace.branchName,
592
+ cleanupAction: "worktree_remove",
593
+ },
594
+ successMessage: `Removed git worktree ${workspacePath}\n`,
595
+ failureLabel: `git worktree remove ${workspacePath}`,
596
+ });
597
+ }
598
+ catch (err) {
599
+ warnings.push(err instanceof Error ? err.message : String(err));
600
+ }
601
+ }
602
+ }
603
+ if (createdByRuntime && input.workspace.branchName) {
604
+ if (!repoRoot) {
605
+ warnings.push(`Could not resolve git repo root to delete branch "${input.workspace.branchName}".`);
606
+ }
607
+ else {
608
+ try {
609
+ await recordGitOperation(input.recorder, {
610
+ phase: "worktree_cleanup",
611
+ args: ["branch", "-d", input.workspace.branchName],
612
+ cwd: repoRoot,
613
+ metadata: {
614
+ workspaceId: input.workspace.id,
615
+ workspacePath,
616
+ branchName: input.workspace.branchName,
617
+ cleanupAction: "branch_delete",
618
+ },
619
+ successMessage: `Deleted branch ${input.workspace.branchName}\n`,
620
+ failureLabel: `git branch -d ${input.workspace.branchName}`,
621
+ });
622
+ }
623
+ catch (err) {
624
+ const message = err instanceof Error ? err.message : String(err);
625
+ warnings.push(`Skipped deleting branch "${input.workspace.branchName}": ${message}`);
626
+ }
627
+ }
628
+ }
629
+ }
630
+ else if (input.workspace.providerType === "local_fs" && createdByRuntime && workspacePath) {
631
+ const projectWorkspaceCwd = input.projectWorkspace?.cwd ? path.resolve(input.projectWorkspace.cwd) : null;
632
+ const resolvedWorkspacePath = path.resolve(workspacePath);
633
+ const containsProjectWorkspace = projectWorkspaceCwd
634
+ ? (resolvedWorkspacePath === projectWorkspaceCwd ||
635
+ projectWorkspaceCwd.startsWith(`${resolvedWorkspacePath}${path.sep}`))
636
+ : false;
637
+ if (containsProjectWorkspace) {
638
+ warnings.push(`Refusing to remove path "${workspacePath}" because it contains the project workspace.`);
639
+ }
640
+ else {
641
+ await fs.rm(resolvedWorkspacePath, { recursive: true, force: true });
642
+ if (input.recorder) {
643
+ await input.recorder.recordOperation({
644
+ phase: "workspace_teardown",
645
+ cwd: projectWorkspaceCwd ?? process.cwd(),
646
+ metadata: {
647
+ workspaceId: input.workspace.id,
648
+ workspacePath: resolvedWorkspacePath,
649
+ cleanupAction: "remove_local_fs",
650
+ },
651
+ run: async () => ({
652
+ status: "succeeded",
653
+ exitCode: 0,
654
+ system: `Removed local workspace directory ${resolvedWorkspacePath}\n`,
655
+ }),
656
+ });
657
+ }
658
+ }
659
+ }
660
+ const cleaned = !workspacePath ||
661
+ !(await directoryExists(workspacePath));
662
+ return {
663
+ cleanedPath: workspacePath,
664
+ cleaned,
665
+ warnings,
666
+ };
667
+ }
668
+ async function allocatePort() {
669
+ return await new Promise((resolve, reject) => {
670
+ const server = net.createServer();
671
+ server.listen(0, "127.0.0.1", () => {
672
+ const address = server.address();
673
+ server.close((err) => {
674
+ if (err) {
675
+ reject(err);
676
+ return;
677
+ }
678
+ if (!address || typeof address === "string") {
679
+ reject(new Error("Failed to allocate port"));
680
+ return;
681
+ }
682
+ resolve(address.port);
683
+ });
684
+ });
685
+ server.on("error", reject);
686
+ });
687
+ }
688
+ function buildTemplateData(input) {
689
+ return {
690
+ workspace: {
691
+ cwd: input.workspace.cwd,
692
+ branchName: input.workspace.branchName ?? "",
693
+ worktreePath: input.workspace.worktreePath ?? "",
694
+ repoUrl: input.workspace.repoUrl ?? "",
695
+ repoRef: input.workspace.repoRef ?? "",
696
+ env: input.adapterEnv,
697
+ },
698
+ issue: {
699
+ id: input.issue?.id ?? "",
700
+ identifier: input.issue?.identifier ?? "",
701
+ title: input.issue?.title ?? "",
702
+ },
703
+ agent: {
704
+ id: input.agent.id ?? "",
705
+ name: input.agent.name,
706
+ },
707
+ port: input.port ?? "",
708
+ };
709
+ }
710
+ function renderRuntimeServiceEnv(input) {
711
+ const rendered = {};
712
+ for (const [key, value] of Object.entries(input.envConfig)) {
713
+ if (typeof value !== "string")
714
+ continue;
715
+ rendered[key] = renderTemplate(value, input.templateData);
716
+ }
717
+ return rendered;
718
+ }
719
+ function resolveRuntimeServiceReuseIdentity(input) {
720
+ const serviceName = asString(input.service.name, "service");
721
+ const lifecycle = asString(input.service.lifecycle, "shared") === "ephemeral" ? "ephemeral" : "shared";
722
+ const command = asString(input.service.command, "");
723
+ const serviceCwdTemplate = asString(input.service.cwd, ".");
724
+ const portConfig = parseObject(input.service.port);
725
+ const envConfig = parseObject(input.service.env);
726
+ const explicitPort = asNumber(portConfig.value, asNumber(input.service.port, 0));
727
+ const identityPort = explicitPort > 0 ? explicitPort : null;
728
+ const templateData = buildTemplateData({
729
+ workspace: input.workspace,
730
+ agent: input.agent,
731
+ issue: input.issue,
732
+ adapterEnv: input.adapterEnv,
733
+ port: identityPort,
734
+ });
735
+ const serviceCwd = resolveConfiguredPath(renderTemplate(serviceCwdTemplate, templateData), input.workspace.cwd);
736
+ const renderedEnv = renderRuntimeServiceEnv({
737
+ envConfig,
738
+ templateData,
739
+ });
740
+ const envFingerprint = createHash("sha256").update(stableStringify(renderedEnv)).digest("hex");
741
+ const reuseKey = lifecycle === "shared"
742
+ ? createHash("sha256")
743
+ .update(stableStringify({
744
+ scopeType: input.scopeType,
745
+ scopeId: input.scopeId,
746
+ serviceName,
747
+ command,
748
+ cwd: serviceCwd,
749
+ port: identityPort,
750
+ env: renderedEnv,
751
+ }))
752
+ .digest("hex")
753
+ : null;
754
+ return {
755
+ serviceName,
756
+ lifecycle,
757
+ command,
758
+ serviceCwd,
759
+ envConfig,
760
+ envFingerprint,
761
+ explicitPort,
762
+ identityPort,
763
+ reuseKey,
764
+ };
765
+ }
766
+ function resolveServiceScopeId(input) {
767
+ const scopeTypeRaw = asString(input.service.reuseScope, input.service.lifecycle === "shared" ? "project_workspace" : "run");
768
+ const scopeType = scopeTypeRaw === "project_workspace" ||
769
+ scopeTypeRaw === "execution_workspace" ||
770
+ scopeTypeRaw === "agent"
771
+ ? scopeTypeRaw
772
+ : "run";
773
+ if (scopeType === "project_workspace")
774
+ return { scopeType, scopeId: input.workspace.workspaceId ?? input.workspace.projectId };
775
+ if (scopeType === "execution_workspace") {
776
+ return { scopeType, scopeId: input.executionWorkspaceId ?? input.workspace.cwd };
777
+ }
778
+ if (scopeType === "agent")
779
+ return { scopeType, scopeId: input.agent.id };
780
+ return { scopeType: "run", scopeId: input.runId };
781
+ }
782
+ async function waitForReadiness(input) {
783
+ const readiness = parseObject(input.service.readiness);
784
+ const readinessType = asString(readiness.type, "");
785
+ if (readinessType !== "http" || !input.url)
786
+ return;
787
+ const timeoutSec = Math.max(1, asNumber(readiness.timeoutSec, 30));
788
+ const intervalMs = Math.max(100, asNumber(readiness.intervalMs, 500));
789
+ const deadline = Date.now() + timeoutSec * 1000;
790
+ let lastError = "service did not become ready";
791
+ while (Date.now() < deadline) {
792
+ try {
793
+ const response = await fetch(input.url);
794
+ if (response.ok)
795
+ return;
796
+ lastError = `received HTTP ${response.status}`;
797
+ }
798
+ catch (err) {
799
+ lastError = err instanceof Error ? err.message : String(err);
800
+ }
801
+ await delay(intervalMs);
802
+ }
803
+ throw new Error(`Readiness check failed for ${input.url}: ${lastError}`);
804
+ }
805
+ function toPersistedWorkspaceRuntimeService(record) {
806
+ return {
807
+ id: record.id,
808
+ companyId: record.companyId,
809
+ projectId: record.projectId,
810
+ projectWorkspaceId: record.projectWorkspaceId,
811
+ executionWorkspaceId: record.executionWorkspaceId,
812
+ issueId: record.issueId,
813
+ scopeType: record.scopeType,
814
+ scopeId: record.scopeId,
815
+ serviceName: record.serviceName,
816
+ status: record.status,
817
+ lifecycle: record.lifecycle,
818
+ reuseKey: record.reuseKey,
819
+ command: record.command,
820
+ cwd: record.cwd,
821
+ port: record.port,
822
+ url: record.url,
823
+ provider: record.provider,
824
+ providerRef: record.providerRef,
825
+ ownerAgentId: record.ownerAgentId,
826
+ startedByRunId: record.startedByRunId,
827
+ lastUsedAt: new Date(record.lastUsedAt),
828
+ startedAt: new Date(record.startedAt),
829
+ stoppedAt: record.stoppedAt ? new Date(record.stoppedAt) : null,
830
+ stopPolicy: record.stopPolicy,
831
+ healthStatus: record.healthStatus,
832
+ updatedAt: new Date(),
833
+ };
834
+ }
835
+ async function persistRuntimeServiceRecord(db, record) {
836
+ if (!db)
837
+ return;
838
+ const values = toPersistedWorkspaceRuntimeService(record);
839
+ await db
840
+ .insert(workspaceRuntimeServices)
841
+ .values(values)
842
+ .onConflictDoUpdate({
843
+ target: workspaceRuntimeServices.id,
844
+ set: {
845
+ projectId: values.projectId,
846
+ projectWorkspaceId: values.projectWorkspaceId,
847
+ executionWorkspaceId: values.executionWorkspaceId,
848
+ issueId: values.issueId,
849
+ scopeType: values.scopeType,
850
+ scopeId: values.scopeId,
851
+ serviceName: values.serviceName,
852
+ status: values.status,
853
+ lifecycle: values.lifecycle,
854
+ reuseKey: values.reuseKey,
855
+ command: values.command,
856
+ cwd: values.cwd,
857
+ port: values.port,
858
+ url: values.url,
859
+ provider: values.provider,
860
+ providerRef: values.providerRef,
861
+ ownerAgentId: values.ownerAgentId,
862
+ startedByRunId: values.startedByRunId,
863
+ lastUsedAt: values.lastUsedAt,
864
+ startedAt: values.startedAt,
865
+ stoppedAt: values.stoppedAt,
866
+ stopPolicy: values.stopPolicy,
867
+ healthStatus: values.healthStatus,
868
+ updatedAt: values.updatedAt,
869
+ },
870
+ });
871
+ }
872
+ function clearIdleTimer(record) {
873
+ if (!record.idleTimer)
874
+ return;
875
+ clearTimeout(record.idleTimer);
876
+ record.idleTimer = null;
877
+ }
878
+ export function normalizeAdapterManagedRuntimeServices(input) {
879
+ const nowIso = (input.now ?? new Date()).toISOString();
880
+ return input.reports.map((report) => {
881
+ const scopeType = report.scopeType ?? "run";
882
+ const scopeId = report.scopeId ??
883
+ (scopeType === "project_workspace"
884
+ ? input.workspace.workspaceId
885
+ : scopeType === "execution_workspace"
886
+ ? input.executionWorkspaceId ?? input.workspace.cwd
887
+ : scopeType === "agent"
888
+ ? input.agent.id
889
+ : input.runId) ??
890
+ null;
891
+ const serviceName = asString(report.serviceName, "").trim() || "service";
892
+ const status = report.status ?? "running";
893
+ const lifecycle = report.lifecycle ?? "ephemeral";
894
+ const healthStatus = report.healthStatus ??
895
+ (status === "running" ? "healthy" : status === "failed" ? "unhealthy" : "unknown");
896
+ return {
897
+ id: stableRuntimeServiceId({
898
+ adapterType: input.adapterType,
899
+ runId: input.runId,
900
+ scopeType,
901
+ scopeId,
902
+ serviceName,
903
+ reportId: report.id ?? null,
904
+ providerRef: report.providerRef ?? null,
905
+ reuseKey: report.reuseKey ?? null,
906
+ }),
907
+ companyId: input.agent.companyId,
908
+ projectId: report.projectId ?? input.workspace.projectId,
909
+ projectWorkspaceId: report.projectWorkspaceId ?? input.workspace.workspaceId,
910
+ executionWorkspaceId: input.executionWorkspaceId ?? null,
911
+ issueId: report.issueId ?? input.issue?.id ?? null,
912
+ serviceName,
913
+ status,
914
+ lifecycle,
915
+ scopeType,
916
+ scopeId,
917
+ reuseKey: report.reuseKey ?? null,
918
+ command: report.command ?? null,
919
+ cwd: report.cwd ?? null,
920
+ port: report.port ?? null,
921
+ url: report.url ?? null,
922
+ provider: "adapter_managed",
923
+ providerRef: report.providerRef ?? null,
924
+ ownerAgentId: report.ownerAgentId ?? input.agent.id ?? null,
925
+ startedByRunId: input.runId,
926
+ lastUsedAt: nowIso,
927
+ startedAt: nowIso,
928
+ stoppedAt: status === "running" || status === "starting" ? null : nowIso,
929
+ stopPolicy: report.stopPolicy ?? null,
930
+ healthStatus,
931
+ reused: false,
932
+ };
933
+ });
934
+ }
935
+ async function startLocalRuntimeService(input) {
936
+ const leaseRunId = input.leaseRunId === undefined ? input.runId : input.leaseRunId;
937
+ const startedByRunId = input.startedByRunId === undefined ? input.runId : input.startedByRunId;
938
+ const identity = resolveRuntimeServiceReuseIdentity({
939
+ service: input.service,
940
+ workspace: input.workspace,
941
+ agent: input.agent,
942
+ issue: input.issue,
943
+ adapterEnv: input.adapterEnv,
944
+ scopeType: input.scopeType,
945
+ scopeId: input.scopeId,
946
+ });
947
+ const serviceName = identity.serviceName;
948
+ const lifecycle = identity.lifecycle;
949
+ const command = identity.command;
950
+ if (!command)
951
+ throw new Error(`Runtime service "${serviceName}" is missing command`);
952
+ const portConfig = parseObject(input.service.port);
953
+ const envConfig = identity.envConfig;
954
+ const envFingerprint = identity.envFingerprint;
955
+ const serviceIdentityFingerprint = input.reuseKey ?? envFingerprint;
956
+ const explicitPort = identity.explicitPort;
957
+ const identityPort = identity.identityPort;
958
+ const port = asString(portConfig.type, "") === "auto"
959
+ ? await allocatePort()
960
+ : explicitPort > 0
961
+ ? explicitPort
962
+ : null;
963
+ const templateData = buildTemplateData({
964
+ workspace: input.workspace,
965
+ agent: input.agent,
966
+ issue: input.issue,
967
+ adapterEnv: input.adapterEnv,
968
+ port,
969
+ });
970
+ const serviceCwd = port === identityPort
971
+ ? identity.serviceCwd
972
+ : resolveConfiguredPath(renderTemplate(asString(input.service.cwd, "."), templateData), input.workspace.cwd);
973
+ const env = {
974
+ ...sanitizeRuntimeServiceBaseEnv(process.env),
975
+ ...input.adapterEnv,
976
+ };
977
+ for (const [key, value] of Object.entries(renderRuntimeServiceEnv({ envConfig, templateData }))) {
978
+ env[key] = value;
979
+ }
980
+ if (port) {
981
+ const portEnvKey = asString(portConfig.envKey, "PORT");
982
+ env[portEnvKey] = String(port);
983
+ }
984
+ const expose = parseObject(input.service.expose);
985
+ const readiness = parseObject(input.service.readiness);
986
+ const urlTemplate = asString(expose.urlTemplate, "") ||
987
+ asString(readiness.urlTemplate, "");
988
+ const url = urlTemplate ? renderTemplate(urlTemplate, templateData) : null;
989
+ const stopPolicy = parseObject(input.service.stopPolicy);
990
+ const serviceKey = createLocalServiceKey({
991
+ profileKind: "workspace-runtime",
992
+ serviceName,
993
+ cwd: serviceCwd,
994
+ command,
995
+ envFingerprint: serviceIdentityFingerprint,
996
+ port: identityPort,
997
+ scope: {
998
+ scopeType: input.scopeType,
999
+ scopeId: input.scopeId,
1000
+ executionWorkspaceId: input.executionWorkspaceId ?? null,
1001
+ reuseKey: input.reuseKey,
1002
+ },
1003
+ });
1004
+ const adoptedRecord = await findAdoptableLocalService({
1005
+ serviceKey,
1006
+ command,
1007
+ cwd: serviceCwd,
1008
+ envFingerprint: serviceIdentityFingerprint,
1009
+ port: identityPort,
1010
+ });
1011
+ if (adoptedRecord) {
1012
+ return {
1013
+ id: adoptedRecord.runtimeServiceId ?? randomUUID(),
1014
+ companyId: input.agent.companyId,
1015
+ projectId: input.workspace.projectId,
1016
+ projectWorkspaceId: input.workspace.workspaceId,
1017
+ executionWorkspaceId: input.executionWorkspaceId ?? null,
1018
+ issueId: input.issue?.id ?? null,
1019
+ serviceName,
1020
+ status: "running",
1021
+ lifecycle,
1022
+ scopeType: input.scopeType,
1023
+ scopeId: input.scopeId,
1024
+ reuseKey: input.reuseKey,
1025
+ command,
1026
+ cwd: serviceCwd,
1027
+ port: adoptedRecord.port ?? port,
1028
+ url: adoptedRecord.url ?? url,
1029
+ provider: "local_process",
1030
+ providerRef: String(adoptedRecord.pid),
1031
+ ownerAgentId: input.agent.id ?? null,
1032
+ startedByRunId,
1033
+ lastUsedAt: new Date().toISOString(),
1034
+ startedAt: adoptedRecord.startedAt,
1035
+ stoppedAt: null,
1036
+ stopPolicy,
1037
+ healthStatus: "healthy",
1038
+ reused: true,
1039
+ db: input.db,
1040
+ child: null,
1041
+ leaseRunIds: leaseRunId ? new Set([leaseRunId]) : new Set(),
1042
+ idleTimer: null,
1043
+ envFingerprint,
1044
+ serviceKey,
1045
+ profileKind: "workspace-runtime",
1046
+ processGroupId: adoptedRecord.processGroupId ?? null,
1047
+ };
1048
+ }
1049
+ if (identityPort) {
1050
+ const ownerPid = await readLocalServicePortOwner(identityPort);
1051
+ if (ownerPid) {
1052
+ throw new Error(`Runtime service "${serviceName}" could not start because port ${identityPort} is already in use by pid ${ownerPid}`);
1053
+ }
1054
+ }
1055
+ const shell = resolveShell();
1056
+ const child = spawn(shell, ["-lc", command], {
1057
+ cwd: serviceCwd,
1058
+ env,
1059
+ detached: process.platform !== "win32",
1060
+ stdio: ["ignore", "pipe", "pipe"],
1061
+ });
1062
+ let stderrExcerpt = "";
1063
+ let stdoutExcerpt = "";
1064
+ child.stdout?.on("data", async (chunk) => {
1065
+ const text = String(chunk);
1066
+ stdoutExcerpt = (stdoutExcerpt + text).slice(-4096);
1067
+ if (input.onLog)
1068
+ await input.onLog("stdout", `[service:${serviceName}] ${text}`);
1069
+ });
1070
+ child.stderr?.on("data", async (chunk) => {
1071
+ const text = String(chunk);
1072
+ stderrExcerpt = (stderrExcerpt + text).slice(-4096);
1073
+ if (input.onLog)
1074
+ await input.onLog("stderr", `[service:${serviceName}] ${text}`);
1075
+ });
1076
+ try {
1077
+ await waitForReadiness({ service: input.service, url });
1078
+ }
1079
+ catch (err) {
1080
+ terminateChildProcess(child);
1081
+ throw new Error(`Failed to start runtime service "${serviceName}": ${err instanceof Error ? err.message : String(err)}${stderrExcerpt ? ` | stderr: ${stderrExcerpt.trim()}` : ""}`);
1082
+ }
1083
+ const record = {
1084
+ id: randomUUID(),
1085
+ companyId: input.agent.companyId,
1086
+ projectId: input.workspace.projectId,
1087
+ projectWorkspaceId: input.workspace.workspaceId,
1088
+ executionWorkspaceId: input.executionWorkspaceId ?? null,
1089
+ issueId: input.issue?.id ?? null,
1090
+ serviceName,
1091
+ status: "running",
1092
+ lifecycle,
1093
+ scopeType: input.scopeType,
1094
+ scopeId: input.scopeId,
1095
+ reuseKey: input.reuseKey,
1096
+ command,
1097
+ cwd: serviceCwd,
1098
+ port,
1099
+ url,
1100
+ provider: "local_process",
1101
+ providerRef: child.pid ? String(child.pid) : null,
1102
+ ownerAgentId: input.agent.id ?? null,
1103
+ startedByRunId,
1104
+ lastUsedAt: new Date().toISOString(),
1105
+ startedAt: new Date().toISOString(),
1106
+ stoppedAt: null,
1107
+ stopPolicy,
1108
+ healthStatus: "healthy",
1109
+ reused: false,
1110
+ db: input.db,
1111
+ child,
1112
+ leaseRunIds: leaseRunId ? new Set([leaseRunId]) : new Set(),
1113
+ idleTimer: null,
1114
+ envFingerprint,
1115
+ serviceKey,
1116
+ profileKind: "workspace-runtime",
1117
+ processGroupId: child.pid ?? null,
1118
+ };
1119
+ if (child.pid) {
1120
+ await writeLocalServiceRegistryRecord({
1121
+ version: 1,
1122
+ serviceKey,
1123
+ profileKind: "workspace-runtime",
1124
+ serviceName,
1125
+ command,
1126
+ cwd: serviceCwd,
1127
+ envFingerprint: serviceIdentityFingerprint,
1128
+ port,
1129
+ url,
1130
+ pid: child.pid,
1131
+ processGroupId: child.pid,
1132
+ provider: "local_process",
1133
+ runtimeServiceId: record.id,
1134
+ reuseKey: input.reuseKey,
1135
+ startedAt: record.startedAt,
1136
+ lastSeenAt: record.lastUsedAt,
1137
+ metadata: {
1138
+ projectId: record.projectId,
1139
+ projectWorkspaceId: record.projectWorkspaceId,
1140
+ executionWorkspaceId: record.executionWorkspaceId,
1141
+ issueId: record.issueId,
1142
+ scopeType: record.scopeType,
1143
+ scopeId: record.scopeId,
1144
+ },
1145
+ });
1146
+ }
1147
+ return record;
1148
+ }
1149
+ function scheduleIdleStop(record) {
1150
+ clearIdleTimer(record);
1151
+ const stopType = asString(record.stopPolicy?.type, "manual");
1152
+ if (stopType !== "idle_timeout")
1153
+ return;
1154
+ const idleSeconds = Math.max(1, asNumber(record.stopPolicy?.idleSeconds, 1800));
1155
+ record.idleTimer = setTimeout(() => {
1156
+ stopRuntimeService(record.id).catch(() => undefined);
1157
+ }, idleSeconds * 1000);
1158
+ }
1159
+ async function stopRuntimeService(serviceId) {
1160
+ const record = runtimeServicesById.get(serviceId);
1161
+ if (!record)
1162
+ return;
1163
+ clearIdleTimer(record);
1164
+ record.status = "stopped";
1165
+ record.healthStatus = "unknown";
1166
+ record.lastUsedAt = new Date().toISOString();
1167
+ record.stoppedAt = new Date().toISOString();
1168
+ runtimeServicesById.delete(serviceId);
1169
+ if (record.reuseKey && runtimeServicesByReuseKey.get(record.reuseKey) === record.id) {
1170
+ runtimeServicesByReuseKey.delete(record.reuseKey);
1171
+ }
1172
+ if (record.child && record.child.pid) {
1173
+ await terminateLocalService({
1174
+ pid: record.child.pid,
1175
+ processGroupId: record.processGroupId ?? record.child.pid,
1176
+ });
1177
+ }
1178
+ else if (record.providerRef) {
1179
+ const pid = Number.parseInt(record.providerRef, 10);
1180
+ if (Number.isInteger(pid) && pid > 0) {
1181
+ await terminateLocalService({
1182
+ pid,
1183
+ processGroupId: record.processGroupId,
1184
+ });
1185
+ }
1186
+ }
1187
+ await removeLocalServiceRegistryRecord(record.serviceKey);
1188
+ await persistRuntimeServiceRecord(record.db, record);
1189
+ }
1190
+ async function markPersistedRuntimeServicesStoppedForExecutionWorkspace(input) {
1191
+ const now = new Date();
1192
+ await input.db
1193
+ .update(workspaceRuntimeServices)
1194
+ .set({
1195
+ status: "stopped",
1196
+ healthStatus: "unknown",
1197
+ stoppedAt: now,
1198
+ lastUsedAt: now,
1199
+ updatedAt: now,
1200
+ })
1201
+ .where(and(eq(workspaceRuntimeServices.executionWorkspaceId, input.executionWorkspaceId), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
1202
+ }
1203
+ function registerRuntimeService(db, record) {
1204
+ record.db = db;
1205
+ runtimeServicesById.set(record.id, record);
1206
+ if (record.reuseKey) {
1207
+ runtimeServicesByReuseKey.set(record.reuseKey, record.id);
1208
+ }
1209
+ record.child?.on("exit", (code, signal) => {
1210
+ const current = runtimeServicesById.get(record.id);
1211
+ if (!current)
1212
+ return;
1213
+ clearIdleTimer(current);
1214
+ current.status = code === 0 || signal === "SIGTERM" ? "stopped" : "failed";
1215
+ current.healthStatus = current.status === "failed" ? "unhealthy" : "unknown";
1216
+ current.lastUsedAt = new Date().toISOString();
1217
+ current.stoppedAt = new Date().toISOString();
1218
+ runtimeServicesById.delete(current.id);
1219
+ if (current.reuseKey && runtimeServicesByReuseKey.get(current.reuseKey) === current.id) {
1220
+ runtimeServicesByReuseKey.delete(current.reuseKey);
1221
+ }
1222
+ void removeLocalServiceRegistryRecord(current.serviceKey);
1223
+ void persistRuntimeServiceRecord(db, current);
1224
+ });
1225
+ }
1226
+ function readRuntimeServiceEntries(config) {
1227
+ const runtime = parseObject(config.workspaceRuntime);
1228
+ return Array.isArray(runtime.services)
1229
+ ? runtime.services.filter((entry) => typeof entry === "object" && entry !== null)
1230
+ : [];
1231
+ }
1232
+ export async function ensureRuntimeServicesForRun(input) {
1233
+ const rawServices = readRuntimeServiceEntries(input.config);
1234
+ const acquiredServiceIds = [];
1235
+ const refs = [];
1236
+ runtimeServiceLeasesByRun.set(input.runId, acquiredServiceIds);
1237
+ try {
1238
+ for (const service of rawServices) {
1239
+ const { scopeType, scopeId } = resolveServiceScopeId({
1240
+ service,
1241
+ workspace: input.workspace,
1242
+ executionWorkspaceId: input.executionWorkspaceId,
1243
+ issue: input.issue,
1244
+ runId: input.runId,
1245
+ agent: input.agent,
1246
+ });
1247
+ const reuseKey = resolveRuntimeServiceReuseIdentity({
1248
+ service,
1249
+ workspace: input.workspace,
1250
+ agent: input.agent,
1251
+ issue: input.issue,
1252
+ adapterEnv: input.adapterEnv,
1253
+ scopeType,
1254
+ scopeId,
1255
+ }).reuseKey;
1256
+ if (reuseKey) {
1257
+ const existingId = runtimeServicesByReuseKey.get(reuseKey);
1258
+ const existing = existingId ? runtimeServicesById.get(existingId) : null;
1259
+ if (existing && existing.status === "running") {
1260
+ existing.leaseRunIds.add(input.runId);
1261
+ existing.lastUsedAt = new Date().toISOString();
1262
+ existing.stoppedAt = null;
1263
+ clearIdleTimer(existing);
1264
+ void touchLocalServiceRegistryRecord(existing.serviceKey, {
1265
+ runtimeServiceId: existing.id,
1266
+ lastSeenAt: existing.lastUsedAt,
1267
+ });
1268
+ await persistRuntimeServiceRecord(input.db, existing);
1269
+ acquiredServiceIds.push(existing.id);
1270
+ refs.push(toRuntimeServiceRef(existing, { reused: true }));
1271
+ continue;
1272
+ }
1273
+ }
1274
+ const record = await startLocalRuntimeService({
1275
+ db: input.db,
1276
+ runId: input.runId,
1277
+ agent: input.agent,
1278
+ issue: input.issue,
1279
+ workspace: input.workspace,
1280
+ executionWorkspaceId: input.executionWorkspaceId,
1281
+ adapterEnv: input.adapterEnv,
1282
+ service,
1283
+ onLog: input.onLog,
1284
+ reuseKey,
1285
+ scopeType,
1286
+ scopeId,
1287
+ });
1288
+ registerRuntimeService(input.db, record);
1289
+ await persistRuntimeServiceRecord(input.db, record);
1290
+ acquiredServiceIds.push(record.id);
1291
+ refs.push(toRuntimeServiceRef(record));
1292
+ }
1293
+ }
1294
+ catch (err) {
1295
+ await releaseRuntimeServicesForRun(input.runId);
1296
+ throw err;
1297
+ }
1298
+ return refs;
1299
+ }
1300
+ export async function startRuntimeServicesForWorkspaceControl(input) {
1301
+ const rawServices = readRuntimeServiceEntries(input.config);
1302
+ const refs = [];
1303
+ const invocationId = input.invocationId ?? randomUUID();
1304
+ for (const service of rawServices) {
1305
+ const { scopeType, scopeId } = resolveServiceScopeId({
1306
+ service,
1307
+ workspace: input.workspace,
1308
+ executionWorkspaceId: input.executionWorkspaceId,
1309
+ issue: input.issue,
1310
+ runId: invocationId,
1311
+ agent: input.actor,
1312
+ });
1313
+ const reuseKey = resolveRuntimeServiceReuseIdentity({
1314
+ service,
1315
+ workspace: input.workspace,
1316
+ agent: input.actor,
1317
+ issue: input.issue,
1318
+ adapterEnv: input.adapterEnv,
1319
+ scopeType,
1320
+ scopeId,
1321
+ }).reuseKey;
1322
+ if (reuseKey) {
1323
+ const existingId = runtimeServicesByReuseKey.get(reuseKey);
1324
+ const existing = existingId ? runtimeServicesById.get(existingId) : null;
1325
+ if (existing && existing.status === "running") {
1326
+ existing.lastUsedAt = new Date().toISOString();
1327
+ existing.stoppedAt = null;
1328
+ clearIdleTimer(existing);
1329
+ void touchLocalServiceRegistryRecord(existing.serviceKey, {
1330
+ runtimeServiceId: existing.id,
1331
+ lastSeenAt: existing.lastUsedAt,
1332
+ });
1333
+ await persistRuntimeServiceRecord(input.db, existing);
1334
+ refs.push(toRuntimeServiceRef(existing, { reused: true }));
1335
+ continue;
1336
+ }
1337
+ }
1338
+ // Manually controlled services are not tied to a heartbeat run lifecycle, so they do not
1339
+ // retain a run lease and never persist a startedByRunId foreign key.
1340
+ const record = await startLocalRuntimeService({
1341
+ db: input.db,
1342
+ runId: invocationId,
1343
+ leaseRunId: null,
1344
+ startedByRunId: null,
1345
+ agent: input.actor,
1346
+ issue: input.issue,
1347
+ workspace: input.workspace,
1348
+ executionWorkspaceId: input.executionWorkspaceId,
1349
+ adapterEnv: input.adapterEnv,
1350
+ service,
1351
+ onLog: input.onLog,
1352
+ reuseKey,
1353
+ scopeType,
1354
+ scopeId,
1355
+ });
1356
+ registerRuntimeService(input.db, record);
1357
+ await persistRuntimeServiceRecord(input.db, record);
1358
+ refs.push(toRuntimeServiceRef(record));
1359
+ }
1360
+ return refs;
1361
+ }
1362
+ export async function releaseRuntimeServicesForRun(runId) {
1363
+ const acquired = runtimeServiceLeasesByRun.get(runId) ?? [];
1364
+ runtimeServiceLeasesByRun.delete(runId);
1365
+ for (const serviceId of acquired) {
1366
+ const record = runtimeServicesById.get(serviceId);
1367
+ if (!record)
1368
+ continue;
1369
+ record.leaseRunIds.delete(runId);
1370
+ record.lastUsedAt = new Date().toISOString();
1371
+ const stopType = asString(record.stopPolicy?.type, record.lifecycle === "ephemeral" ? "on_run_finish" : "manual");
1372
+ await persistRuntimeServiceRecord(record.db, record);
1373
+ if (record.leaseRunIds.size === 0) {
1374
+ if (record.lifecycle === "ephemeral" || stopType === "on_run_finish") {
1375
+ await stopRuntimeService(serviceId);
1376
+ continue;
1377
+ }
1378
+ scheduleIdleStop(record);
1379
+ }
1380
+ }
1381
+ }
1382
+ export async function stopRuntimeServicesForExecutionWorkspace(input) {
1383
+ const normalizedWorkspaceCwd = input.workspaceCwd ? path.resolve(input.workspaceCwd) : null;
1384
+ const matchingServiceIds = Array.from(runtimeServicesById.values())
1385
+ .filter((record) => {
1386
+ if (record.executionWorkspaceId === input.executionWorkspaceId)
1387
+ return true;
1388
+ if (!normalizedWorkspaceCwd || !record.cwd)
1389
+ return false;
1390
+ const resolvedCwd = path.resolve(record.cwd);
1391
+ return (resolvedCwd === normalizedWorkspaceCwd ||
1392
+ resolvedCwd.startsWith(`${normalizedWorkspaceCwd}${path.sep}`));
1393
+ })
1394
+ .map((record) => record.id);
1395
+ for (const serviceId of matchingServiceIds) {
1396
+ await stopRuntimeService(serviceId);
1397
+ }
1398
+ if (input.db) {
1399
+ await markPersistedRuntimeServicesStoppedForExecutionWorkspace({
1400
+ db: input.db,
1401
+ executionWorkspaceId: input.executionWorkspaceId,
1402
+ });
1403
+ }
1404
+ }
1405
+ export async function stopRuntimeServicesForProjectWorkspace(input) {
1406
+ const matchingServiceIds = Array.from(runtimeServicesById.values())
1407
+ .filter((record) => record.projectWorkspaceId === input.projectWorkspaceId && record.scopeType === "project_workspace")
1408
+ .map((record) => record.id);
1409
+ for (const serviceId of matchingServiceIds) {
1410
+ await stopRuntimeService(serviceId);
1411
+ }
1412
+ if (input.db) {
1413
+ const now = new Date();
1414
+ await input.db
1415
+ .update(workspaceRuntimeServices)
1416
+ .set({
1417
+ status: "stopped",
1418
+ healthStatus: "unknown",
1419
+ stoppedAt: now,
1420
+ lastUsedAt: now,
1421
+ updatedAt: now,
1422
+ })
1423
+ .where(and(eq(workspaceRuntimeServices.projectWorkspaceId, input.projectWorkspaceId), eq(workspaceRuntimeServices.scopeType, "project_workspace"), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
1424
+ }
1425
+ }
1426
+ export async function listWorkspaceRuntimeServicesForProjectWorkspaces(db, companyId, projectWorkspaceIds) {
1427
+ if (projectWorkspaceIds.length === 0)
1428
+ return new Map();
1429
+ const rows = await db
1430
+ .select()
1431
+ .from(workspaceRuntimeServices)
1432
+ .where(and(eq(workspaceRuntimeServices.companyId, companyId), inArray(workspaceRuntimeServices.projectWorkspaceId, projectWorkspaceIds), eq(workspaceRuntimeServices.scopeType, "project_workspace")))
1433
+ .orderBy(desc(workspaceRuntimeServices.updatedAt), desc(workspaceRuntimeServices.createdAt));
1434
+ const grouped = new Map();
1435
+ for (const row of rows) {
1436
+ if (!row.projectWorkspaceId)
1437
+ continue;
1438
+ const existing = grouped.get(row.projectWorkspaceId);
1439
+ if (existing)
1440
+ existing.push(row);
1441
+ else
1442
+ grouped.set(row.projectWorkspaceId, [row]);
1443
+ }
1444
+ return grouped;
1445
+ }
1446
+ export async function reconcilePersistedRuntimeServicesOnStartup(db) {
1447
+ const rows = await db
1448
+ .select()
1449
+ .from(workspaceRuntimeServices)
1450
+ .where(and(eq(workspaceRuntimeServices.provider, "local_process"), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
1451
+ if (rows.length === 0)
1452
+ return { reconciled: 0, adopted: 0, stopped: 0 };
1453
+ let adopted = 0;
1454
+ let stopped = 0;
1455
+ for (const row of rows) {
1456
+ const adoptedRecord = await findLocalServiceRegistryRecordByRuntimeServiceId({
1457
+ runtimeServiceId: row.id,
1458
+ profileKind: "workspace-runtime",
1459
+ });
1460
+ if (adoptedRecord) {
1461
+ const record = {
1462
+ id: row.id,
1463
+ companyId: row.companyId,
1464
+ projectId: row.projectId ?? null,
1465
+ projectWorkspaceId: row.projectWorkspaceId ?? null,
1466
+ executionWorkspaceId: row.executionWorkspaceId ?? null,
1467
+ issueId: row.issueId ?? null,
1468
+ serviceName: row.serviceName,
1469
+ status: "running",
1470
+ lifecycle: row.lifecycle,
1471
+ scopeType: row.scopeType,
1472
+ scopeId: row.scopeId ?? null,
1473
+ reuseKey: row.reuseKey ?? null,
1474
+ command: row.command ?? null,
1475
+ cwd: row.cwd ?? null,
1476
+ port: adoptedRecord.port ?? row.port ?? null,
1477
+ url: adoptedRecord.url ?? row.url ?? null,
1478
+ provider: "local_process",
1479
+ providerRef: String(adoptedRecord.pid),
1480
+ ownerAgentId: row.ownerAgentId ?? null,
1481
+ startedByRunId: row.startedByRunId ?? null,
1482
+ lastUsedAt: new Date().toISOString(),
1483
+ startedAt: row.startedAt.toISOString(),
1484
+ stoppedAt: null,
1485
+ stopPolicy: row.stopPolicy ?? null,
1486
+ healthStatus: "healthy",
1487
+ reused: true,
1488
+ db,
1489
+ child: null,
1490
+ leaseRunIds: new Set(),
1491
+ idleTimer: null,
1492
+ envFingerprint: row.reuseKey ?? "",
1493
+ serviceKey: adoptedRecord.serviceKey,
1494
+ profileKind: "workspace-runtime",
1495
+ processGroupId: adoptedRecord.processGroupId ?? null,
1496
+ };
1497
+ registerRuntimeService(db, record);
1498
+ await touchLocalServiceRegistryRecord(adoptedRecord.serviceKey, {
1499
+ runtimeServiceId: row.id,
1500
+ lastSeenAt: record.lastUsedAt,
1501
+ });
1502
+ await persistRuntimeServiceRecord(db, record);
1503
+ adopted += 1;
1504
+ continue;
1505
+ }
1506
+ const now = new Date();
1507
+ await db
1508
+ .update(workspaceRuntimeServices)
1509
+ .set({
1510
+ status: "stopped",
1511
+ healthStatus: "unknown",
1512
+ stoppedAt: now,
1513
+ lastUsedAt: now,
1514
+ updatedAt: now,
1515
+ })
1516
+ .where(eq(workspaceRuntimeServices.id, row.id));
1517
+ const registryRecord = await findLocalServiceRegistryRecordByRuntimeServiceId({
1518
+ runtimeServiceId: row.id,
1519
+ profileKind: "workspace-runtime",
1520
+ });
1521
+ if (registryRecord) {
1522
+ await removeLocalServiceRegistryRecord(registryRecord.serviceKey);
1523
+ }
1524
+ stopped += 1;
1525
+ }
1526
+ return { reconciled: rows.length, adopted, stopped };
1527
+ }
1528
+ export async function restartDesiredRuntimeServicesOnStartup(db) {
1529
+ let restarted = 0;
1530
+ let failed = 0;
1531
+ const projectWorkspaceRows = await db
1532
+ .select()
1533
+ .from(projectWorkspaces);
1534
+ for (const row of projectWorkspaceRows) {
1535
+ const runtimeConfig = readProjectWorkspaceRuntimeConfig(row.metadata ?? null);
1536
+ if (runtimeConfig?.desiredState !== "running" || !runtimeConfig.workspaceRuntime || !row.cwd)
1537
+ continue;
1538
+ try {
1539
+ const refs = await startRuntimeServicesForWorkspaceControl({
1540
+ db,
1541
+ actor: { id: null, name: "zmeel", companyId: row.companyId },
1542
+ issue: null,
1543
+ workspace: {
1544
+ baseCwd: row.cwd,
1545
+ source: "project_primary",
1546
+ projectId: row.projectId,
1547
+ workspaceId: row.id,
1548
+ repoUrl: row.repoUrl ?? null,
1549
+ repoRef: row.repoRef ?? null,
1550
+ strategy: "project_primary",
1551
+ cwd: row.cwd,
1552
+ branchName: row.defaultRef ?? row.repoRef ?? null,
1553
+ worktreePath: null,
1554
+ warnings: [],
1555
+ created: false,
1556
+ },
1557
+ config: { workspaceRuntime: runtimeConfig.workspaceRuntime },
1558
+ adapterEnv: {},
1559
+ });
1560
+ if (refs.length > 0)
1561
+ restarted += refs.filter((ref) => !ref.reused).length;
1562
+ }
1563
+ catch {
1564
+ failed += 1;
1565
+ }
1566
+ }
1567
+ const executionWorkspaceRows = await db
1568
+ .select()
1569
+ .from(executionWorkspaces)
1570
+ .where(inArray(executionWorkspaces.status, ["active", "idle", "in_review", "cleanup_failed"]));
1571
+ for (const row of executionWorkspaceRows) {
1572
+ const config = readExecutionWorkspaceConfig(row.metadata ?? null);
1573
+ if (config?.desiredState !== "running" || !config.workspaceRuntime || !row.cwd)
1574
+ continue;
1575
+ try {
1576
+ const refs = await startRuntimeServicesForWorkspaceControl({
1577
+ db,
1578
+ actor: { id: null, name: "zmeel", companyId: row.companyId },
1579
+ issue: row.sourceIssueId
1580
+ ? {
1581
+ id: row.sourceIssueId,
1582
+ identifier: null,
1583
+ title: row.name,
1584
+ }
1585
+ : null,
1586
+ workspace: {
1587
+ baseCwd: row.cwd,
1588
+ source: row.mode === "shared_workspace" ? "project_primary" : "task_session",
1589
+ projectId: row.projectId,
1590
+ workspaceId: row.projectWorkspaceId ?? null,
1591
+ repoUrl: row.repoUrl ?? null,
1592
+ repoRef: row.baseRef ?? null,
1593
+ strategy: row.strategyType === "git_worktree" ? "git_worktree" : "project_primary",
1594
+ cwd: row.cwd,
1595
+ branchName: row.branchName ?? null,
1596
+ worktreePath: row.strategyType === "git_worktree" ? row.cwd : null,
1597
+ warnings: [],
1598
+ created: false,
1599
+ },
1600
+ executionWorkspaceId: row.id,
1601
+ config: { workspaceRuntime: config.workspaceRuntime },
1602
+ adapterEnv: {},
1603
+ });
1604
+ if (refs.length > 0)
1605
+ restarted += refs.filter((ref) => !ref.reused).length;
1606
+ }
1607
+ catch {
1608
+ failed += 1;
1609
+ }
1610
+ }
1611
+ return { restarted, failed };
1612
+ }
1613
+ export async function persistAdapterManagedRuntimeServices(input) {
1614
+ const refs = normalizeAdapterManagedRuntimeServices(input);
1615
+ if (refs.length === 0)
1616
+ return refs;
1617
+ const existingRows = await input.db
1618
+ .select()
1619
+ .from(workspaceRuntimeServices)
1620
+ .where(inArray(workspaceRuntimeServices.id, refs.map((ref) => ref.id)));
1621
+ const existingById = new Map(existingRows.map((row) => [row.id, row]));
1622
+ for (const ref of refs) {
1623
+ const existing = existingById.get(ref.id);
1624
+ const startedAt = existing?.startedAt ?? new Date(ref.startedAt);
1625
+ const createdAt = existing?.createdAt ?? new Date();
1626
+ await input.db
1627
+ .insert(workspaceRuntimeServices)
1628
+ .values({
1629
+ id: ref.id,
1630
+ companyId: ref.companyId,
1631
+ projectId: ref.projectId,
1632
+ projectWorkspaceId: ref.projectWorkspaceId,
1633
+ executionWorkspaceId: ref.executionWorkspaceId,
1634
+ issueId: ref.issueId,
1635
+ scopeType: ref.scopeType,
1636
+ scopeId: ref.scopeId,
1637
+ serviceName: ref.serviceName,
1638
+ status: ref.status,
1639
+ lifecycle: ref.lifecycle,
1640
+ reuseKey: ref.reuseKey,
1641
+ command: ref.command,
1642
+ cwd: ref.cwd,
1643
+ port: ref.port,
1644
+ url: ref.url,
1645
+ provider: ref.provider,
1646
+ providerRef: ref.providerRef,
1647
+ ownerAgentId: ref.ownerAgentId,
1648
+ startedByRunId: ref.startedByRunId,
1649
+ lastUsedAt: new Date(ref.lastUsedAt),
1650
+ startedAt,
1651
+ stoppedAt: ref.stoppedAt ? new Date(ref.stoppedAt) : null,
1652
+ stopPolicy: ref.stopPolicy,
1653
+ healthStatus: ref.healthStatus,
1654
+ createdAt,
1655
+ updatedAt: new Date(),
1656
+ })
1657
+ .onConflictDoUpdate({
1658
+ target: workspaceRuntimeServices.id,
1659
+ set: {
1660
+ projectId: ref.projectId,
1661
+ projectWorkspaceId: ref.projectWorkspaceId,
1662
+ executionWorkspaceId: ref.executionWorkspaceId,
1663
+ issueId: ref.issueId,
1664
+ scopeType: ref.scopeType,
1665
+ scopeId: ref.scopeId,
1666
+ serviceName: ref.serviceName,
1667
+ status: ref.status,
1668
+ lifecycle: ref.lifecycle,
1669
+ reuseKey: ref.reuseKey,
1670
+ command: ref.command,
1671
+ cwd: ref.cwd,
1672
+ port: ref.port,
1673
+ url: ref.url,
1674
+ provider: ref.provider,
1675
+ providerRef: ref.providerRef,
1676
+ ownerAgentId: ref.ownerAgentId,
1677
+ startedByRunId: ref.startedByRunId,
1678
+ lastUsedAt: new Date(ref.lastUsedAt),
1679
+ startedAt,
1680
+ stoppedAt: ref.stoppedAt ? new Date(ref.stoppedAt) : null,
1681
+ stopPolicy: ref.stopPolicy,
1682
+ healthStatus: ref.healthStatus,
1683
+ updatedAt: new Date(),
1684
+ },
1685
+ });
1686
+ }
1687
+ return refs;
1688
+ }
1689
+ export function buildWorkspaceReadyComment(input) {
1690
+ const lines = ["## Workspace Ready", ""];
1691
+ lines.push(`- Strategy: \`${input.workspace.strategy}\``);
1692
+ if (input.workspace.branchName)
1693
+ lines.push(`- Branch: \`${input.workspace.branchName}\``);
1694
+ lines.push(`- CWD: \`${input.workspace.cwd}\``);
1695
+ if (input.workspace.worktreePath && input.workspace.worktreePath !== input.workspace.cwd) {
1696
+ lines.push(`- Worktree: \`${input.workspace.worktreePath}\``);
1697
+ }
1698
+ for (const service of input.runtimeServices) {
1699
+ const detail = service.url ? `${service.serviceName}: ${service.url}` : `${service.serviceName}: running`;
1700
+ const suffix = service.reused ? " (reused)" : "";
1701
+ lines.push(`- Service: ${detail}${suffix}`);
1702
+ }
1703
+ return lines.join("\n");
1704
+ }
1705
+ //# sourceMappingURL=workspace-runtime.js.map