@runeachai/server 2026.322.0-canary.0

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 (744) 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 +63 -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 +9 -0
  39. package/dist/adapters/registry.d.ts.map +1 -0
  40. package/dist/adapters/registry.js +166 -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 +10 -0
  47. package/dist/adapters/utils.d.ts.map +1 -0
  48. package/dist/adapters/utils.js +14 -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 +25 -0
  55. package/dist/app.d.ts.map +1 -0
  56. package/dist/app.js +263 -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 +38 -0
  75. package/dist/config.d.ts.map +1 -0
  76. package/dist/config.js +162 -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/errors.d.ts +12 -0
  83. package/dist/errors.d.ts.map +1 -0
  84. package/dist/errors.js +28 -0
  85. package/dist/errors.js.map +1 -0
  86. package/dist/home-paths.d.ts +17 -0
  87. package/dist/home-paths.d.ts.map +1 -0
  88. package/dist/home-paths.js +76 -0
  89. package/dist/home-paths.js.map +1 -0
  90. package/dist/index.d.ts +10 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +577 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/log-redaction.d.ts +11 -0
  95. package/dist/log-redaction.d.ts.map +1 -0
  96. package/dist/log-redaction.js +118 -0
  97. package/dist/log-redaction.js.map +1 -0
  98. package/dist/middleware/auth.d.ts +12 -0
  99. package/dist/middleware/auth.d.ts.map +1 -0
  100. package/dist/middleware/auth.js +124 -0
  101. package/dist/middleware/auth.js.map +1 -0
  102. package/dist/middleware/board-mutation-guard.d.ts +3 -0
  103. package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
  104. package/dist/middleware/board-mutation-guard.js +60 -0
  105. package/dist/middleware/board-mutation-guard.js.map +1 -0
  106. package/dist/middleware/error-handler.d.ts +17 -0
  107. package/dist/middleware/error-handler.d.ts.map +1 -0
  108. package/dist/middleware/error-handler.js +37 -0
  109. package/dist/middleware/error-handler.js.map +1 -0
  110. package/dist/middleware/index.d.ts +4 -0
  111. package/dist/middleware/index.d.ts.map +1 -0
  112. package/dist/middleware/index.js +4 -0
  113. package/dist/middleware/index.js.map +1 -0
  114. package/dist/middleware/logger.d.ts +4 -0
  115. package/dist/middleware/logger.d.ts.map +1 -0
  116. package/dist/middleware/logger.js +87 -0
  117. package/dist/middleware/logger.js.map +1 -0
  118. package/dist/middleware/private-hostname-guard.d.ts +11 -0
  119. package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
  120. package/dist/middleware/private-hostname-guard.js +78 -0
  121. package/dist/middleware/private-hostname-guard.js.map +1 -0
  122. package/dist/middleware/validate.d.ts +4 -0
  123. package/dist/middleware/validate.d.ts.map +1 -0
  124. package/dist/middleware/validate.js +7 -0
  125. package/dist/middleware/validate.js.map +1 -0
  126. package/dist/onboarding-assets/ceo/AGENTS.md +24 -0
  127. package/dist/onboarding-assets/ceo/HEARTBEAT.md +72 -0
  128. package/dist/onboarding-assets/ceo/SOUL.md +33 -0
  129. package/dist/onboarding-assets/ceo/TOOLS.md +3 -0
  130. package/dist/onboarding-assets/default/AGENTS.md +3 -0
  131. package/dist/paths.d.ts +3 -0
  132. package/dist/paths.d.ts.map +1 -0
  133. package/dist/paths.js +32 -0
  134. package/dist/paths.js.map +1 -0
  135. package/dist/realtime/live-events-ws.d.ts +28 -0
  136. package/dist/realtime/live-events-ws.d.ts.map +1 -0
  137. package/dist/realtime/live-events-ws.js +187 -0
  138. package/dist/realtime/live-events-ws.js.map +1 -0
  139. package/dist/redaction.d.ts +4 -0
  140. package/dist/redaction.d.ts.map +1 -0
  141. package/dist/redaction.js +63 -0
  142. package/dist/redaction.js.map +1 -0
  143. package/dist/routes/access.d.ts +56 -0
  144. package/dist/routes/access.d.ts.map +1 -0
  145. package/dist/routes/access.js +2125 -0
  146. package/dist/routes/access.js.map +1 -0
  147. package/dist/routes/activity.d.ts +3 -0
  148. package/dist/routes/activity.d.ts.map +1 -0
  149. package/dist/routes/activity.js +78 -0
  150. package/dist/routes/activity.js.map +1 -0
  151. package/dist/routes/agents.d.ts +3 -0
  152. package/dist/routes/agents.d.ts.map +1 -0
  153. package/dist/routes/agents.js +1808 -0
  154. package/dist/routes/agents.js.map +1 -0
  155. package/dist/routes/approvals.d.ts +3 -0
  156. package/dist/routes/approvals.d.ts.map +1 -0
  157. package/dist/routes/approvals.js +275 -0
  158. package/dist/routes/approvals.js.map +1 -0
  159. package/dist/routes/assets.d.ts +4 -0
  160. package/dist/routes/assets.d.ts.map +1 -0
  161. package/dist/routes/assets.js +309 -0
  162. package/dist/routes/assets.js.map +1 -0
  163. package/dist/routes/authz.d.ts +15 -0
  164. package/dist/routes/authz.d.ts.map +1 -0
  165. package/dist/routes/authz.js +40 -0
  166. package/dist/routes/authz.js.map +1 -0
  167. package/dist/routes/companies.d.ts +4 -0
  168. package/dist/routes/companies.d.ts.map +1 -0
  169. package/dist/routes/companies.js +303 -0
  170. package/dist/routes/companies.js.map +1 -0
  171. package/dist/routes/company-skills.d.ts +3 -0
  172. package/dist/routes/company-skills.d.ts.map +1 -0
  173. package/dist/routes/company-skills.js +228 -0
  174. package/dist/routes/company-skills.js.map +1 -0
  175. package/dist/routes/costs.d.ts +3 -0
  176. package/dist/routes/costs.d.ts.map +1 -0
  177. package/dist/routes/costs.js +268 -0
  178. package/dist/routes/costs.js.map +1 -0
  179. package/dist/routes/dashboard.d.ts +3 -0
  180. package/dist/routes/dashboard.d.ts.map +1 -0
  181. package/dist/routes/dashboard.js +15 -0
  182. package/dist/routes/dashboard.js.map +1 -0
  183. package/dist/routes/execution-workspaces.d.ts +3 -0
  184. package/dist/routes/execution-workspaces.d.ts.map +1 -0
  185. package/dist/routes/execution-workspaces.js +165 -0
  186. package/dist/routes/execution-workspaces.js.map +1 -0
  187. package/dist/routes/goals.d.ts +3 -0
  188. package/dist/routes/goals.d.ts.map +1 -0
  189. package/dist/routes/goals.js +95 -0
  190. package/dist/routes/goals.js.map +1 -0
  191. package/dist/routes/health.d.ts +9 -0
  192. package/dist/routes/health.d.ts.map +1 -0
  193. package/dist/routes/health.js +69 -0
  194. package/dist/routes/health.js.map +1 -0
  195. package/dist/routes/index.d.ts +18 -0
  196. package/dist/routes/index.d.ts.map +1 -0
  197. package/dist/routes/index.js +18 -0
  198. package/dist/routes/index.js.map +1 -0
  199. package/dist/routes/instance-settings.d.ts +3 -0
  200. package/dist/routes/instance-settings.d.ts.map +1 -0
  201. package/dist/routes/instance-settings.js +71 -0
  202. package/dist/routes/instance-settings.js.map +1 -0
  203. package/dist/routes/issues-checkout-wakeup.d.ts +9 -0
  204. package/dist/routes/issues-checkout-wakeup.d.ts.map +1 -0
  205. package/dist/routes/issues-checkout-wakeup.js +12 -0
  206. package/dist/routes/issues-checkout-wakeup.js.map +1 -0
  207. package/dist/routes/issues.d.ts +4 -0
  208. package/dist/routes/issues.d.ts.map +1 -0
  209. package/dist/routes/issues.js +1440 -0
  210. package/dist/routes/issues.js.map +1 -0
  211. package/dist/routes/llms.d.ts +3 -0
  212. package/dist/routes/llms.d.ts.map +1 -0
  213. package/dist/routes/llms.js +78 -0
  214. package/dist/routes/llms.js.map +1 -0
  215. package/dist/routes/org-chart-svg.d.ts +17 -0
  216. package/dist/routes/org-chart-svg.d.ts.map +1 -0
  217. package/dist/routes/org-chart-svg.js +461 -0
  218. package/dist/routes/org-chart-svg.js.map +1 -0
  219. package/dist/routes/plugin-ui-static.d.ts +69 -0
  220. package/dist/routes/plugin-ui-static.d.ts.map +1 -0
  221. package/dist/routes/plugin-ui-static.js +411 -0
  222. package/dist/routes/plugin-ui-static.js.map +1 -0
  223. package/dist/routes/plugins.d.ts +120 -0
  224. package/dist/routes/plugins.d.ts.map +1 -0
  225. package/dist/routes/plugins.js +1784 -0
  226. package/dist/routes/plugins.js.map +1 -0
  227. package/dist/routes/projects.d.ts +3 -0
  228. package/dist/routes/projects.d.ts.map +1 -0
  229. package/dist/routes/projects.js +257 -0
  230. package/dist/routes/projects.js.map +1 -0
  231. package/dist/routes/routines.d.ts +3 -0
  232. package/dist/routes/routines.d.ts.map +1 -0
  233. package/dist/routes/routines.js +277 -0
  234. package/dist/routes/routines.js.map +1 -0
  235. package/dist/routes/secrets.d.ts +3 -0
  236. package/dist/routes/secrets.d.ts.map +1 -0
  237. package/dist/routes/secrets.js +128 -0
  238. package/dist/routes/secrets.js.map +1 -0
  239. package/dist/routes/sidebar-badges.d.ts +3 -0
  240. package/dist/routes/sidebar-badges.d.ts.map +1 -0
  241. package/dist/routes/sidebar-badges.js +45 -0
  242. package/dist/routes/sidebar-badges.js.map +1 -0
  243. package/dist/secrets/external-stub-providers.d.ts +5 -0
  244. package/dist/secrets/external-stub-providers.d.ts.map +1 -0
  245. package/dist/secrets/external-stub-providers.js +21 -0
  246. package/dist/secrets/external-stub-providers.js.map +1 -0
  247. package/dist/secrets/local-encrypted-provider.d.ts +3 -0
  248. package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
  249. package/dist/secrets/local-encrypted-provider.js +116 -0
  250. package/dist/secrets/local-encrypted-provider.js.map +1 -0
  251. package/dist/secrets/provider-registry.d.ts +5 -0
  252. package/dist/secrets/provider-registry.d.ts.map +1 -0
  253. package/dist/secrets/provider-registry.js +20 -0
  254. package/dist/secrets/provider-registry.js.map +1 -0
  255. package/dist/secrets/types.d.ts +21 -0
  256. package/dist/secrets/types.d.ts.map +1 -0
  257. package/dist/secrets/types.js +2 -0
  258. package/dist/secrets/types.js.map +1 -0
  259. package/dist/services/access.d.ts +113 -0
  260. package/dist/services/access.d.ts.map +1 -0
  261. package/dist/services/access.js +247 -0
  262. package/dist/services/access.js.map +1 -0
  263. package/dist/services/activity-log.d.ts +17 -0
  264. package/dist/services/activity-log.d.ts.map +1 -0
  265. package/dist/services/activity-log.js +74 -0
  266. package/dist/services/activity-log.js.map +1 -0
  267. package/dist/services/activity.d.ts +764 -0
  268. package/dist/services/activity.d.ts.map +1 -0
  269. package/dist/services/activity.js +105 -0
  270. package/dist/services/activity.js.map +1 -0
  271. package/dist/services/agent-instructions.d.ts +91 -0
  272. package/dist/services/agent-instructions.d.ts.map +1 -0
  273. package/dist/services/agent-instructions.js +505 -0
  274. package/dist/services/agent-instructions.js.map +1 -0
  275. package/dist/services/agent-permissions.d.ts +6 -0
  276. package/dist/services/agent-permissions.d.ts.map +1 -0
  277. package/dist/services/agent-permissions.js +18 -0
  278. package/dist/services/agent-permissions.js.map +1 -0
  279. package/dist/services/agents.d.ts +1670 -0
  280. package/dist/services/agents.d.ts.map +1 -0
  281. package/dist/services/agents.js +566 -0
  282. package/dist/services/agents.js.map +1 -0
  283. package/dist/services/approvals.d.ts +546 -0
  284. package/dist/services/approvals.d.ts.map +1 -0
  285. package/dist/services/approvals.js +212 -0
  286. package/dist/services/approvals.js.map +1 -0
  287. package/dist/services/assets.d.ts +33 -0
  288. package/dist/services/assets.d.ts.map +1 -0
  289. package/dist/services/assets.js +17 -0
  290. package/dist/services/assets.js.map +1 -0
  291. package/dist/services/budgets.d.ts +38 -0
  292. package/dist/services/budgets.d.ts.map +1 -0
  293. package/dist/services/budgets.js +784 -0
  294. package/dist/services/budgets.js.map +1 -0
  295. package/dist/services/companies.d.ts +124 -0
  296. package/dist/services/companies.d.ts.map +1 -0
  297. package/dist/services/companies.js +256 -0
  298. package/dist/services/companies.js.map +1 -0
  299. package/dist/services/company-export-readme.d.ts +17 -0
  300. package/dist/services/company-export-readme.d.ts.map +1 -0
  301. package/dist/services/company-export-readme.js +148 -0
  302. package/dist/services/company-export-readme.js.map +1 -0
  303. package/dist/services/company-portability.d.ts +16 -0
  304. package/dist/services/company-portability.d.ts.map +1 -0
  305. package/dist/services/company-portability.js +2849 -0
  306. package/dist/services/company-portability.js.map +1 -0
  307. package/dist/services/company-skills.d.ts +76 -0
  308. package/dist/services/company-skills.d.ts.map +1 -0
  309. package/dist/services/company-skills.js +2016 -0
  310. package/dist/services/company-skills.js.map +1 -0
  311. package/dist/services/costs.d.ts +114 -0
  312. package/dist/services/costs.d.ts.map +1 -0
  313. package/dist/services/costs.js +294 -0
  314. package/dist/services/costs.js.map +1 -0
  315. package/dist/services/cron.d.ts +80 -0
  316. package/dist/services/cron.d.ts.map +1 -0
  317. package/dist/services/cron.js +300 -0
  318. package/dist/services/cron.js.map +1 -0
  319. package/dist/services/dashboard.d.ts +26 -0
  320. package/dist/services/dashboard.d.ts.map +1 -0
  321. package/dist/services/dashboard.js +98 -0
  322. package/dist/services/dashboard.js.map +1 -0
  323. package/dist/services/default-agent-instructions.d.ts +9 -0
  324. package/dist/services/default-agent-instructions.d.ts.map +1 -0
  325. package/dist/services/default-agent-instructions.js +20 -0
  326. package/dist/services/default-agent-instructions.js.map +1 -0
  327. package/dist/services/documents.d.ts +164 -0
  328. package/dist/services/documents.d.ts.map +1 -0
  329. package/dist/services/documents.js +382 -0
  330. package/dist/services/documents.js.map +1 -0
  331. package/dist/services/execution-workspace-policy.d.ts +20 -0
  332. package/dist/services/execution-workspace-policy.d.ts.map +1 -0
  333. package/dist/services/execution-workspace-policy.js +165 -0
  334. package/dist/services/execution-workspace-policy.js.map +1 -0
  335. package/dist/services/execution-workspaces.d.ts +19 -0
  336. package/dist/services/execution-workspaces.d.ts.map +1 -0
  337. package/dist/services/execution-workspaces.js +87 -0
  338. package/dist/services/execution-workspaces.js.map +1 -0
  339. package/dist/services/finance.d.ts +93 -0
  340. package/dist/services/finance.d.ts.map +1 -0
  341. package/dist/services/finance.js +120 -0
  342. package/dist/services/finance.js.map +1 -0
  343. package/dist/services/goals.d.ts +433 -0
  344. package/dist/services/goals.d.ts.map +1 -0
  345. package/dist/services/goals.js +54 -0
  346. package/dist/services/goals.js.map +1 -0
  347. package/dist/services/heartbeat-run-summary.d.ts +2 -0
  348. package/dist/services/heartbeat-run-summary.d.ts.map +1 -0
  349. package/dist/services/heartbeat-run-summary.js +30 -0
  350. package/dist/services/heartbeat-run-summary.js.map +1 -0
  351. package/dist/services/heartbeat.d.ts +796 -0
  352. package/dist/services/heartbeat.d.ts.map +1 -0
  353. package/dist/services/heartbeat.js +3052 -0
  354. package/dist/services/heartbeat.js.map +1 -0
  355. package/dist/services/hire-hook.d.ts +14 -0
  356. package/dist/services/hire-hook.d.ts.map +1 -0
  357. package/dist/services/hire-hook.js +85 -0
  358. package/dist/services/hire-hook.js.map +1 -0
  359. package/dist/services/index.d.ts +32 -0
  360. package/dist/services/index.d.ts.map +1 -0
  361. package/dist/services/index.js +32 -0
  362. package/dist/services/index.js.map +1 -0
  363. package/dist/services/instance-settings.d.ts +11 -0
  364. package/dist/services/instance-settings.d.ts.map +1 -0
  365. package/dist/services/instance-settings.js +116 -0
  366. package/dist/services/instance-settings.js.map +1 -0
  367. package/dist/services/issue-approvals.d.ts +56 -0
  368. package/dist/services/issue-approvals.d.ts.map +1 -0
  369. package/dist/services/issue-approvals.js +153 -0
  370. package/dist/services/issue-approvals.js.map +1 -0
  371. package/dist/services/issue-assignment-wakeup.d.ts +29 -0
  372. package/dist/services/issue-assignment-wakeup.d.ts.map +1 -0
  373. package/dist/services/issue-assignment-wakeup.js +22 -0
  374. package/dist/services/issue-assignment-wakeup.js.map +1 -0
  375. package/dist/services/issue-goal-fallback.d.ts +15 -0
  376. package/dist/services/issue-goal-fallback.d.ts.map +1 -0
  377. package/dist/services/issue-goal-fallback.js +15 -0
  378. package/dist/services/issue-goal-fallback.js.map +1 -0
  379. package/dist/services/issues.d.ts +538 -0
  380. package/dist/services/issues.d.ts.map +1 -0
  381. package/dist/services/issues.js +1317 -0
  382. package/dist/services/issues.js.map +1 -0
  383. package/dist/services/live-events.d.ts +17 -0
  384. package/dist/services/live-events.d.ts.map +1 -0
  385. package/dist/services/live-events.js +33 -0
  386. package/dist/services/live-events.js.map +1 -0
  387. package/dist/services/plugin-capability-validator.d.ts +108 -0
  388. package/dist/services/plugin-capability-validator.d.ts.map +1 -0
  389. package/dist/services/plugin-capability-validator.js +268 -0
  390. package/dist/services/plugin-capability-validator.js.map +1 -0
  391. package/dist/services/plugin-config-validator.d.ts +26 -0
  392. package/dist/services/plugin-config-validator.d.ts.map +1 -0
  393. package/dist/services/plugin-config-validator.js +41 -0
  394. package/dist/services/plugin-config-validator.js.map +1 -0
  395. package/dist/services/plugin-dev-watcher.d.ts +30 -0
  396. package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
  397. package/dist/services/plugin-dev-watcher.js +241 -0
  398. package/dist/services/plugin-dev-watcher.js.map +1 -0
  399. package/dist/services/plugin-event-bus.d.ts +149 -0
  400. package/dist/services/plugin-event-bus.d.ts.map +1 -0
  401. package/dist/services/plugin-event-bus.js +258 -0
  402. package/dist/services/plugin-event-bus.js.map +1 -0
  403. package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
  404. package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
  405. package/dist/services/plugin-host-service-cleanup.js +37 -0
  406. package/dist/services/plugin-host-service-cleanup.js.map +1 -0
  407. package/dist/services/plugin-host-services.d.ts +13 -0
  408. package/dist/services/plugin-host-services.d.ts.map +1 -0
  409. package/dist/services/plugin-host-services.js +969 -0
  410. package/dist/services/plugin-host-services.js.map +1 -0
  411. package/dist/services/plugin-job-coordinator.d.ts +81 -0
  412. package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
  413. package/dist/services/plugin-job-coordinator.js +172 -0
  414. package/dist/services/plugin-job-coordinator.js.map +1 -0
  415. package/dist/services/plugin-job-scheduler.d.ts +163 -0
  416. package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
  417. package/dist/services/plugin-job-scheduler.js +454 -0
  418. package/dist/services/plugin-job-scheduler.js.map +1 -0
  419. package/dist/services/plugin-job-store.d.ts +208 -0
  420. package/dist/services/plugin-job-store.d.ts.map +1 -0
  421. package/dist/services/plugin-job-store.js +350 -0
  422. package/dist/services/plugin-job-store.js.map +1 -0
  423. package/dist/services/plugin-lifecycle.d.ts +203 -0
  424. package/dist/services/plugin-lifecycle.d.ts.map +1 -0
  425. package/dist/services/plugin-lifecycle.js +476 -0
  426. package/dist/services/plugin-lifecycle.js.map +1 -0
  427. package/dist/services/plugin-loader.d.ts +441 -0
  428. package/dist/services/plugin-loader.d.ts.map +1 -0
  429. package/dist/services/plugin-loader.js +1192 -0
  430. package/dist/services/plugin-loader.js.map +1 -0
  431. package/dist/services/plugin-log-retention.d.ts +20 -0
  432. package/dist/services/plugin-log-retention.d.ts.map +1 -0
  433. package/dist/services/plugin-log-retention.js +63 -0
  434. package/dist/services/plugin-log-retention.js.map +1 -0
  435. package/dist/services/plugin-manifest-validator.d.ts +79 -0
  436. package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
  437. package/dist/services/plugin-manifest-validator.js +84 -0
  438. package/dist/services/plugin-manifest-validator.js.map +1 -0
  439. package/dist/services/plugin-registry.d.ts +2542 -0
  440. package/dist/services/plugin-registry.d.ts.map +1 -0
  441. package/dist/services/plugin-registry.js +539 -0
  442. package/dist/services/plugin-registry.js.map +1 -0
  443. package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
  444. package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
  445. package/dist/services/plugin-runtime-sandbox.js +154 -0
  446. package/dist/services/plugin-runtime-sandbox.js.map +1 -0
  447. package/dist/services/plugin-secrets-handler.d.ts +81 -0
  448. package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
  449. package/dist/services/plugin-secrets-handler.js +275 -0
  450. package/dist/services/plugin-secrets-handler.js.map +1 -0
  451. package/dist/services/plugin-state-store.d.ts +92 -0
  452. package/dist/services/plugin-state-store.d.ts.map +1 -0
  453. package/dist/services/plugin-state-store.js +190 -0
  454. package/dist/services/plugin-state-store.js.map +1 -0
  455. package/dist/services/plugin-stream-bus.d.ts +29 -0
  456. package/dist/services/plugin-stream-bus.d.ts.map +1 -0
  457. package/dist/services/plugin-stream-bus.js +48 -0
  458. package/dist/services/plugin-stream-bus.js.map +1 -0
  459. package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
  460. package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
  461. package/dist/services/plugin-tool-dispatcher.js +224 -0
  462. package/dist/services/plugin-tool-dispatcher.js.map +1 -0
  463. package/dist/services/plugin-tool-registry.d.ts +192 -0
  464. package/dist/services/plugin-tool-registry.d.ts.map +1 -0
  465. package/dist/services/plugin-tool-registry.js +224 -0
  466. package/dist/services/plugin-tool-registry.js.map +1 -0
  467. package/dist/services/plugin-worker-manager.d.ts +260 -0
  468. package/dist/services/plugin-worker-manager.d.ts.map +1 -0
  469. package/dist/services/plugin-worker-manager.js +835 -0
  470. package/dist/services/plugin-worker-manager.js.map +1 -0
  471. package/dist/services/projects.d.ts +87 -0
  472. package/dist/services/projects.d.ts.map +1 -0
  473. package/dist/services/projects.js +656 -0
  474. package/dist/services/projects.js.map +1 -0
  475. package/dist/services/quota-windows.d.ts +9 -0
  476. package/dist/services/quota-windows.d.ts.map +1 -0
  477. package/dist/services/quota-windows.js +56 -0
  478. package/dist/services/quota-windows.js.map +1 -0
  479. package/dist/services/routines.d.ts +135 -0
  480. package/dist/services/routines.d.ts.map +1 -0
  481. package/dist/services/routines.js +1105 -0
  482. package/dist/services/routines.js.map +1 -0
  483. package/dist/services/run-log-store.d.ts +34 -0
  484. package/dist/services/run-log-store.d.ts.map +1 -0
  485. package/dist/services/run-log-store.js +109 -0
  486. package/dist/services/run-log-store.js.map +1 -0
  487. package/dist/services/secrets.d.ts +511 -0
  488. package/dist/services/secrets.d.ts.map +1 -0
  489. package/dist/services/secrets.js +289 -0
  490. package/dist/services/secrets.js.map +1 -0
  491. package/dist/services/sidebar-badges.d.ts +9 -0
  492. package/dist/services/sidebar-badges.d.ts.map +1 -0
  493. package/dist/services/sidebar-badges.js +33 -0
  494. package/dist/services/sidebar-badges.js.map +1 -0
  495. package/dist/services/work-products.d.ts +14 -0
  496. package/dist/services/work-products.d.ts.map +1 -0
  497. package/dist/services/work-products.js +100 -0
  498. package/dist/services/work-products.js.map +1 -0
  499. package/dist/services/workspace-operation-log-store.d.ts +33 -0
  500. package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
  501. package/dist/services/workspace-operation-log-store.js +110 -0
  502. package/dist/services/workspace-operation-log-store.js.map +1 -0
  503. package/dist/services/workspace-operations.d.ts +44 -0
  504. package/dist/services/workspace-operations.d.ts.map +1 -0
  505. package/dist/services/workspace-operations.js +211 -0
  506. package/dist/services/workspace-operations.js.map +1 -0
  507. package/dist/services/workspace-runtime.d.ts +164 -0
  508. package/dist/services/workspace-runtime.d.ts.map +1 -0
  509. package/dist/services/workspace-runtime.js +1328 -0
  510. package/dist/services/workspace-runtime.js.map +1 -0
  511. package/dist/startup-banner.d.ts +31 -0
  512. package/dist/startup-banner.d.ts.map +1 -0
  513. package/dist/startup-banner.js +117 -0
  514. package/dist/startup-banner.js.map +1 -0
  515. package/dist/storage/index.d.ts +6 -0
  516. package/dist/storage/index.d.ts.map +1 -0
  517. package/dist/storage/index.js +29 -0
  518. package/dist/storage/index.js.map +1 -0
  519. package/dist/storage/local-disk-provider.d.ts +3 -0
  520. package/dist/storage/local-disk-provider.d.ts.map +1 -0
  521. package/dist/storage/local-disk-provider.js +79 -0
  522. package/dist/storage/local-disk-provider.js.map +1 -0
  523. package/dist/storage/provider-registry.d.ts +4 -0
  524. package/dist/storage/provider-registry.d.ts.map +1 -0
  525. package/dist/storage/provider-registry.js +15 -0
  526. package/dist/storage/provider-registry.js.map +1 -0
  527. package/dist/storage/s3-provider.d.ts +11 -0
  528. package/dist/storage/s3-provider.d.ts.map +1 -0
  529. package/dist/storage/s3-provider.js +123 -0
  530. package/dist/storage/s3-provider.js.map +1 -0
  531. package/dist/storage/service.d.ts +3 -0
  532. package/dist/storage/service.d.ts.map +1 -0
  533. package/dist/storage/service.js +120 -0
  534. package/dist/storage/service.js.map +1 -0
  535. package/dist/storage/types.d.ts +55 -0
  536. package/dist/storage/types.d.ts.map +1 -0
  537. package/dist/storage/types.js +2 -0
  538. package/dist/storage/types.js.map +1 -0
  539. package/dist/ui-branding.d.ts +4 -0
  540. package/dist/ui-branding.d.ts.map +1 -0
  541. package/dist/ui-branding.js +37 -0
  542. package/dist/ui-branding.js.map +1 -0
  543. package/dist/version.d.ts +2 -0
  544. package/dist/version.d.ts.map +1 -0
  545. package/dist/version.js +5 -0
  546. package/dist/version.js.map +1 -0
  547. package/package.json +91 -0
  548. package/skills/para-memory-files/SKILL.md +104 -0
  549. package/skills/para-memory-files/references/schemas.md +35 -0
  550. package/skills/runeach/SKILL.md +365 -0
  551. package/skills/runeach/references/api-reference.md +647 -0
  552. package/skills/runeach/references/company-skills.md +193 -0
  553. package/skills/runeach-create-agent/SKILL.md +142 -0
  554. package/skills/runeach-create-agent/references/api-reference.md +105 -0
  555. package/skills/runeach-create-plugin/SKILL.md +101 -0
  556. package/ui-dist/android-chrome-192x192.png +0 -0
  557. package/ui-dist/android-chrome-512x512.png +0 -0
  558. package/ui-dist/apple-touch-icon.png +0 -0
  559. package/ui-dist/assets/_basePickBy-C-f2VpOb.js +1 -0
  560. package/ui-dist/assets/_baseUniq-C0sOLLwt.js +1 -0
  561. package/ui-dist/assets/apl-B4CMkyY2.js +1 -0
  562. package/ui-dist/assets/arc-B5YoroE1.js +1 -0
  563. package/ui-dist/assets/architectureDiagram-VXUJARFQ-C0jft_H-.js +36 -0
  564. package/ui-dist/assets/asciiarmor-Df11BRmG.js +1 -0
  565. package/ui-dist/assets/asn1-EdZsLKOL.js +1 -0
  566. package/ui-dist/assets/asterisk-B-8jnY81.js +1 -0
  567. package/ui-dist/assets/blockDiagram-VD42YOAC-gJAJLeBh.js +122 -0
  568. package/ui-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  569. package/ui-dist/assets/c4Diagram-YG6GDRKO-DyT4ytTh.js +10 -0
  570. package/ui-dist/assets/channel-B5FbyG9T.js +1 -0
  571. package/ui-dist/assets/chunk-4BX2VUAB-DDZTJyxy.js +1 -0
  572. package/ui-dist/assets/chunk-55IACEB6-Dxux8OqO.js +1 -0
  573. package/ui-dist/assets/chunk-B4BG7PRW-gRbRQJea.js +165 -0
  574. package/ui-dist/assets/chunk-DI55MBZ5-BQMp_P2Y.js +220 -0
  575. package/ui-dist/assets/chunk-FMBD7UC4-BxjSf7Ct.js +15 -0
  576. package/ui-dist/assets/chunk-QN33PNHL-Bib47ixj.js +1 -0
  577. package/ui-dist/assets/chunk-QZHKN3VN-D6IdN4rO.js +1 -0
  578. package/ui-dist/assets/chunk-TZMSLE5B-DDN1LQwt.js +1 -0
  579. package/ui-dist/assets/classDiagram-2ON5EDUG-eayvT6QW.js +1 -0
  580. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-eayvT6QW.js +1 -0
  581. package/ui-dist/assets/clike-B9uivgTg.js +1 -0
  582. package/ui-dist/assets/clojure-BMjYHr_A.js +1 -0
  583. package/ui-dist/assets/clone-DVEK997l.js +1 -0
  584. package/ui-dist/assets/cmake-BQqOBYOt.js +1 -0
  585. package/ui-dist/assets/cobol-CWcv1MsR.js +1 -0
  586. package/ui-dist/assets/coffeescript-S37ZYGWr.js +1 -0
  587. package/ui-dist/assets/commonlisp-DBKNyK5s.js +1 -0
  588. package/ui-dist/assets/cose-bilkent-S5V4N54A-HUaJQyyR.js +1 -0
  589. package/ui-dist/assets/crystal-SjHAIU92.js +1 -0
  590. package/ui-dist/assets/css-BnMrqG3P.js +1 -0
  591. package/ui-dist/assets/cypher-C_CwsFkJ.js +1 -0
  592. package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  593. package/ui-dist/assets/d-pRatUO7H.js +1 -0
  594. package/ui-dist/assets/dagre-6UL2VRFP-BhCxA5La.js +4 -0
  595. package/ui-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  596. package/ui-dist/assets/diagram-PSM6KHXK-7YtPygAG.js +24 -0
  597. package/ui-dist/assets/diagram-QEK2KX5R-C7VqsYaN.js +43 -0
  598. package/ui-dist/assets/diagram-S2PKOQOG-DdhGZZte.js +24 -0
  599. package/ui-dist/assets/diff-DbItnlRl.js +1 -0
  600. package/ui-dist/assets/dockerfile-BKs6k2Af.js +1 -0
  601. package/ui-dist/assets/dtd-DF_7sFjM.js +1 -0
  602. package/ui-dist/assets/dylan-DwRh75JA.js +1 -0
  603. package/ui-dist/assets/ebnf-CDyGwa7X.js +1 -0
  604. package/ui-dist/assets/ecl-Cabwm37j.js +1 -0
  605. package/ui-dist/assets/eiffel-CnydiIhH.js +1 -0
  606. package/ui-dist/assets/elm-vLlmbW-K.js +1 -0
  607. package/ui-dist/assets/erDiagram-Q2GNP2WA-CrywAkk0.js +60 -0
  608. package/ui-dist/assets/erlang-BNw1qcRV.js +1 -0
  609. package/ui-dist/assets/factor-kuTfRLto.js +1 -0
  610. package/ui-dist/assets/fcl-Kvtd6kyn.js +1 -0
  611. package/ui-dist/assets/flowDiagram-NV44I4VS-BVLQ2ziQ.js +162 -0
  612. package/ui-dist/assets/forth-Ffai-XNe.js +1 -0
  613. package/ui-dist/assets/fortran-DYz_wnZ1.js +1 -0
  614. package/ui-dist/assets/ganttDiagram-JELNMOA3-B4Vdn1Vq.js +267 -0
  615. package/ui-dist/assets/gas-Bneqetm1.js +1 -0
  616. package/ui-dist/assets/gherkin-heZmZLOM.js +1 -0
  617. package/ui-dist/assets/gitGraphDiagram-V2S2FVAM-CRuyzwKK.js +65 -0
  618. package/ui-dist/assets/graph-6AZK0J0v.js +1 -0
  619. package/ui-dist/assets/groovy-D9Dt4D0W.js +1 -0
  620. package/ui-dist/assets/haskell-Cw1EW3IL.js +1 -0
  621. package/ui-dist/assets/haxe-H-WmDvRZ.js +1 -0
  622. package/ui-dist/assets/http-DBlCnlav.js +1 -0
  623. package/ui-dist/assets/idl-BEugSyMb.js +1 -0
  624. package/ui-dist/assets/index-B227gQBb.js +1 -0
  625. package/ui-dist/assets/index-B5o7fkIP.js +1 -0
  626. package/ui-dist/assets/index-BEk5lUFS.js +1 -0
  627. package/ui-dist/assets/index-BG63jdYx.js +2 -0
  628. package/ui-dist/assets/index-BROnpdJz.js +7 -0
  629. package/ui-dist/assets/index-BWqcLttP.css +1 -0
  630. package/ui-dist/assets/index-Be_mtDjq.js +1 -0
  631. package/ui-dist/assets/index-BmrGb0mq.js +1 -0
  632. package/ui-dist/assets/index-Bq4_PPAO.js +1 -0
  633. package/ui-dist/assets/index-BwLm-DuE.js +6 -0
  634. package/ui-dist/assets/index-BwPP_ofG.js +1 -0
  635. package/ui-dist/assets/index-C9ky_6kl.js +1200 -0
  636. package/ui-dist/assets/index-CA7JonJl.js +1 -0
  637. package/ui-dist/assets/index-CFrz72Rj.js +1 -0
  638. package/ui-dist/assets/index-CglN0YyL.js +3 -0
  639. package/ui-dist/assets/index-CvZTVkfn.js +1 -0
  640. package/ui-dist/assets/index-CvwIDvhA.js +13 -0
  641. package/ui-dist/assets/index-CxGIPvIW.js +1 -0
  642. package/ui-dist/assets/index-D-i9ffbs.js +1 -0
  643. package/ui-dist/assets/index-DEhb3Dc4.js +1 -0
  644. package/ui-dist/assets/index-Daucgg1k.js +1 -0
  645. package/ui-dist/assets/index-DiomxB5x.js +1 -0
  646. package/ui-dist/assets/index-NegvqlTS.js +1 -0
  647. package/ui-dist/assets/index-uuQQsJYn.js +1 -0
  648. package/ui-dist/assets/infoDiagram-HS3SLOUP-9Giytul1.js +2 -0
  649. package/ui-dist/assets/init-Gi6I4Gst.js +1 -0
  650. package/ui-dist/assets/javascript-iXu5QeM3.js +1 -0
  651. package/ui-dist/assets/journeyDiagram-XKPGCS4Q-BEACKoUK.js +139 -0
  652. package/ui-dist/assets/julia-DuME0IfC.js +1 -0
  653. package/ui-dist/assets/kanban-definition-3W4ZIXB7-0EHidIP_.js +89 -0
  654. package/ui-dist/assets/katex-O9d3_IXG.js +261 -0
  655. package/ui-dist/assets/layout-CBe7CRHj.js +1 -0
  656. package/ui-dist/assets/linear-3a0n6tQ7.js +1 -0
  657. package/ui-dist/assets/livescript-BwQOo05w.js +1 -0
  658. package/ui-dist/assets/lua-BgMRiT3U.js +1 -0
  659. package/ui-dist/assets/mathematica-DTrFuWx2.js +1 -0
  660. package/ui-dist/assets/mbox-CNhZ1qSd.js +1 -0
  661. package/ui-dist/assets/mermaid.core-D-414OJw.js +256 -0
  662. package/ui-dist/assets/mindmap-definition-VGOIOE7T-BZHwCr9L.js +68 -0
  663. package/ui-dist/assets/mirc-CjQqDB4T.js +1 -0
  664. package/ui-dist/assets/mllike-CXdrOF99.js +1 -0
  665. package/ui-dist/assets/modelica-Dc1JOy9r.js +1 -0
  666. package/ui-dist/assets/mscgen-BA5vi2Kp.js +1 -0
  667. package/ui-dist/assets/mumps-BT43cFF4.js +1 -0
  668. package/ui-dist/assets/nginx-DdIZxoE0.js +1 -0
  669. package/ui-dist/assets/nsis-LdVXkNf5.js +1 -0
  670. package/ui-dist/assets/ntriples-BfvgReVJ.js +1 -0
  671. package/ui-dist/assets/octave-Ck1zUtKM.js +1 -0
  672. package/ui-dist/assets/ordinal-Cboi1Yqb.js +1 -0
  673. package/ui-dist/assets/oz-BzwKVEFT.js +1 -0
  674. package/ui-dist/assets/pascal--L3eBynH.js +1 -0
  675. package/ui-dist/assets/perl-CdXCOZ3F.js +1 -0
  676. package/ui-dist/assets/pieDiagram-ADFJNKIX-B1tk7bRZ.js +30 -0
  677. package/ui-dist/assets/pig-CevX1Tat.js +1 -0
  678. package/ui-dist/assets/powershell-CFHJl5sT.js +1 -0
  679. package/ui-dist/assets/properties-C78fOPTZ.js +1 -0
  680. package/ui-dist/assets/protobuf-ChK-085T.js +1 -0
  681. package/ui-dist/assets/pug-DeIclll2.js +1 -0
  682. package/ui-dist/assets/puppet-DMA9R1ak.js +1 -0
  683. package/ui-dist/assets/python-BuPzkPfP.js +1 -0
  684. package/ui-dist/assets/q-pXgVlZs6.js +1 -0
  685. package/ui-dist/assets/quadrantDiagram-AYHSOK5B-8vxydMM9.js +7 -0
  686. package/ui-dist/assets/r-B6wPVr8A.js +1 -0
  687. package/ui-dist/assets/requirementDiagram-UZGBJVZJ-C0ZnVeqT.js +64 -0
  688. package/ui-dist/assets/rpm-CTu-6PCP.js +1 -0
  689. package/ui-dist/assets/ruby-B2Rjki9n.js +1 -0
  690. package/ui-dist/assets/sankeyDiagram-TZEHDZUN-DVL_rhWz.js +10 -0
  691. package/ui-dist/assets/sas-B4kiWyti.js +1 -0
  692. package/ui-dist/assets/scheme-C41bIUwD.js +1 -0
  693. package/ui-dist/assets/sequenceDiagram-WL72ISMW-BQ_Qb09w.js +145 -0
  694. package/ui-dist/assets/shell-CjFT_Tl9.js +1 -0
  695. package/ui-dist/assets/sieve-C3Gn_uJK.js +1 -0
  696. package/ui-dist/assets/simple-mode-GW_nhZxv.js +1 -0
  697. package/ui-dist/assets/smalltalk-CnHTOXQT.js +1 -0
  698. package/ui-dist/assets/solr-DehyRSwq.js +1 -0
  699. package/ui-dist/assets/sparql-DkYu6x3z.js +1 -0
  700. package/ui-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  701. package/ui-dist/assets/sql-D0XecflT.js +1 -0
  702. package/ui-dist/assets/stateDiagram-FKZM4ZOC-Cno_nwZD.js +1 -0
  703. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3-CbIx37bI.js +1 -0
  704. package/ui-dist/assets/stex-C3f8Ysf7.js +1 -0
  705. package/ui-dist/assets/stylus-B533Al4x.js +1 -0
  706. package/ui-dist/assets/swift-BzpIVaGY.js +1 -0
  707. package/ui-dist/assets/tcl-DVfN8rqt.js +1 -0
  708. package/ui-dist/assets/textile-CnDTJFAw.js +1 -0
  709. package/ui-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  710. package/ui-dist/assets/tiki-DGYXhP31.js +1 -0
  711. package/ui-dist/assets/timeline-definition-IT6M3QCI-CcvzhhiV.js +61 -0
  712. package/ui-dist/assets/toml-Bm5Em-hy.js +1 -0
  713. package/ui-dist/assets/treemap-GDKQZRPO-CScjuJaG.js +162 -0
  714. package/ui-dist/assets/troff-wAsdV37c.js +1 -0
  715. package/ui-dist/assets/ttcn-CfJYG6tj.js +1 -0
  716. package/ui-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  717. package/ui-dist/assets/turtle-B1tBg_DP.js +1 -0
  718. package/ui-dist/assets/vb-CmGdzxic.js +1 -0
  719. package/ui-dist/assets/vbscript-BuJXcnF6.js +1 -0
  720. package/ui-dist/assets/velocity-D8B20fx6.js +1 -0
  721. package/ui-dist/assets/verilog-C6RDOZhf.js +1 -0
  722. package/ui-dist/assets/vhdl-lSbBsy5d.js +1 -0
  723. package/ui-dist/assets/webidl-ZXfAyPTL.js +1 -0
  724. package/ui-dist/assets/xquery-DzFWVndE.js +1 -0
  725. package/ui-dist/assets/xychartDiagram-PRI3JC2R-DT6zxfDx.js +7 -0
  726. package/ui-dist/assets/yacas-BJ4BC0dw.js +1 -0
  727. package/ui-dist/assets/z80-Hz9HOZM7.js +1 -0
  728. package/ui-dist/brands/codebuddy-logo.svg +1 -0
  729. package/ui-dist/brands/gemini-logo.png +0 -0
  730. package/ui-dist/brands/kilo-logo.png +0 -0
  731. package/ui-dist/brands/opencode-logo-dark-square.svg +18 -0
  732. package/ui-dist/brands/opencode-logo-light-square.svg +18 -0
  733. package/ui-dist/brands/qwen-logo.png +0 -0
  734. package/ui-dist/favicon-16x16.png +0 -0
  735. package/ui-dist/favicon-32x32.png +0 -0
  736. package/ui-dist/favicon.ico +0 -0
  737. package/ui-dist/favicon.svg +17 -0
  738. package/ui-dist/index.html +50 -0
  739. package/ui-dist/site.webmanifest +30 -0
  740. package/ui-dist/sw.js +42 -0
  741. package/ui-dist/worktree-favicon-16x16.png +0 -0
  742. package/ui-dist/worktree-favicon-32x32.png +0 -0
  743. package/ui-dist/worktree-favicon.ico +0 -0
  744. package/ui-dist/worktree-favicon.svg +17 -0
@@ -0,0 +1,1328 @@
1
+ import { spawn, spawnSync } 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 { workspaceRuntimeServices } from "@runeachai/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
+ const runtimeServicesById = new Map();
12
+ const runtimeServicesByReuseKey = new Map();
13
+ const runtimeServiceLeasesByRun = new Map();
14
+ function stableStringify(value) {
15
+ if (Array.isArray(value)) {
16
+ return `[${value.map((entry) => stableStringify(entry)).join(",")}]`;
17
+ }
18
+ if (value && typeof value === "object") {
19
+ const rec = value;
20
+ return `{${Object.keys(rec).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(rec[key])}`).join(",")}}`;
21
+ }
22
+ return JSON.stringify(value);
23
+ }
24
+ export function sanitizeRuntimeServiceBaseEnv(baseEnv) {
25
+ const env = { ...baseEnv };
26
+ for (const key of Object.keys(env)) {
27
+ if (key.startsWith("RUNEACH_")) {
28
+ delete env[key];
29
+ }
30
+ }
31
+ delete env.DATABASE_URL;
32
+ return env;
33
+ }
34
+ function stableRuntimeServiceId(input) {
35
+ if (input.reportId)
36
+ return input.reportId;
37
+ const digest = createHash("sha256")
38
+ .update(stableStringify({
39
+ adapterType: input.adapterType,
40
+ runId: input.runId,
41
+ scopeType: input.scopeType,
42
+ scopeId: input.scopeId,
43
+ serviceName: input.serviceName,
44
+ providerRef: input.providerRef,
45
+ reuseKey: input.reuseKey,
46
+ }))
47
+ .digest("hex")
48
+ .slice(0, 32);
49
+ return `${input.adapterType}-${digest}`;
50
+ }
51
+ function toRuntimeServiceRef(record, overrides) {
52
+ return {
53
+ id: record.id,
54
+ companyId: record.companyId,
55
+ projectId: record.projectId,
56
+ projectWorkspaceId: record.projectWorkspaceId,
57
+ executionWorkspaceId: record.executionWorkspaceId,
58
+ issueId: record.issueId,
59
+ serviceName: record.serviceName,
60
+ status: record.status,
61
+ lifecycle: record.lifecycle,
62
+ scopeType: record.scopeType,
63
+ scopeId: record.scopeId,
64
+ reuseKey: record.reuseKey,
65
+ command: record.command,
66
+ cwd: record.cwd,
67
+ port: record.port,
68
+ url: record.url,
69
+ provider: record.provider,
70
+ providerRef: record.providerRef,
71
+ ownerAgentId: record.ownerAgentId,
72
+ startedByRunId: record.startedByRunId,
73
+ lastUsedAt: record.lastUsedAt,
74
+ startedAt: record.startedAt,
75
+ stoppedAt: record.stoppedAt,
76
+ stopPolicy: record.stopPolicy,
77
+ healthStatus: record.healthStatus,
78
+ reused: record.reused,
79
+ ...overrides,
80
+ };
81
+ }
82
+ function sanitizeSlugPart(value, fallback) {
83
+ const raw = (value ?? "").trim().toLowerCase();
84
+ const normalized = raw
85
+ .replace(/[^a-z0-9/_-]+/g, "-")
86
+ .replace(/-+/g, "-")
87
+ .replace(/^[-/]+|[-/]+$/g, "");
88
+ return normalized.length > 0 ? normalized : fallback;
89
+ }
90
+ function renderWorkspaceTemplate(template, input) {
91
+ const issueIdentifier = input.issue?.identifier ?? input.issue?.id ?? "issue";
92
+ const slug = sanitizeSlugPart(input.issue?.title, sanitizeSlugPart(issueIdentifier, "issue"));
93
+ return renderTemplate(template, {
94
+ issue: {
95
+ id: input.issue?.id ?? "",
96
+ identifier: input.issue?.identifier ?? "",
97
+ title: input.issue?.title ?? "",
98
+ },
99
+ agent: {
100
+ id: input.agent.id,
101
+ name: input.agent.name,
102
+ },
103
+ project: {
104
+ id: input.projectId ?? "",
105
+ },
106
+ workspace: {
107
+ repoRef: input.repoRef ?? "",
108
+ },
109
+ slug,
110
+ });
111
+ }
112
+ function sanitizeBranchName(value) {
113
+ return value
114
+ .trim()
115
+ .replace(/[^A-Za-z0-9._/-]+/g, "-")
116
+ .replace(/-+/g, "-")
117
+ .replace(/^[-/.]+|[-/.]+$/g, "")
118
+ .slice(0, 120) || "runeach-work";
119
+ }
120
+ function isAbsolutePath(value) {
121
+ return path.isAbsolute(value) || value.startsWith("~");
122
+ }
123
+ function resolveConfiguredPath(value, baseDir) {
124
+ if (isAbsolutePath(value)) {
125
+ return resolveHomeAwarePath(value);
126
+ }
127
+ return path.resolve(baseDir, value);
128
+ }
129
+ function formatCommandForDisplay(command, args) {
130
+ return [command, ...args]
131
+ .map((part) => (/^[A-Za-z0-9_./:-]+$/.test(part) ? part : JSON.stringify(part)))
132
+ .join(" ");
133
+ }
134
+ async function executeProcess(input) {
135
+ const proc = await new Promise((resolve, reject) => {
136
+ const child = spawn(input.command, input.args, {
137
+ cwd: input.cwd,
138
+ stdio: ["ignore", "pipe", "pipe"],
139
+ env: input.env ?? process.env,
140
+ });
141
+ let stdout = "";
142
+ let stderr = "";
143
+ child.stdout?.on("data", (chunk) => {
144
+ stdout += String(chunk);
145
+ });
146
+ child.stderr?.on("data", (chunk) => {
147
+ stderr += String(chunk);
148
+ });
149
+ child.on("error", reject);
150
+ child.on("close", (code) => resolve({ stdout, stderr, code }));
151
+ });
152
+ return proc;
153
+ }
154
+ async function runGit(args, cwd) {
155
+ const proc = await executeProcess({
156
+ command: "git",
157
+ args,
158
+ cwd,
159
+ });
160
+ if (proc.code !== 0) {
161
+ throw new Error(proc.stderr.trim() || proc.stdout.trim() || `git ${args.join(" ")} failed`);
162
+ }
163
+ return proc.stdout.trim();
164
+ }
165
+ function gitErrorIncludes(error, needle) {
166
+ const message = error instanceof Error ? error.message : String(error);
167
+ return message.toLowerCase().includes(needle.toLowerCase());
168
+ }
169
+ async function directoryExists(value) {
170
+ return fs.stat(value).then((stats) => stats.isDirectory()).catch(() => false);
171
+ }
172
+ function parseGitWorktreeList(raw) {
173
+ const entries = [];
174
+ let current = {};
175
+ for (const line of raw.split("\n")) {
176
+ if (line.startsWith("worktree ")) {
177
+ current = { worktree: line.slice("worktree ".length) };
178
+ continue;
179
+ }
180
+ if (line.startsWith("branch ")) {
181
+ current.branch = line.slice("branch ".length);
182
+ continue;
183
+ }
184
+ if (line === "bare") {
185
+ current.bare = true;
186
+ continue;
187
+ }
188
+ if (line === "detached") {
189
+ current.detached = true;
190
+ continue;
191
+ }
192
+ if (line === "" && current.worktree) {
193
+ entries.push({
194
+ worktree: current.worktree,
195
+ branch: current.branch ?? null,
196
+ bare: current.bare ?? false,
197
+ detached: current.detached ?? false,
198
+ });
199
+ current = {};
200
+ }
201
+ }
202
+ if (current.worktree) {
203
+ entries.push({
204
+ worktree: current.worktree,
205
+ branch: current.branch ?? null,
206
+ bare: current.bare ?? false,
207
+ detached: current.detached ?? false,
208
+ });
209
+ }
210
+ return entries;
211
+ }
212
+ async function findCheckedOutBranchWorktree(input) {
213
+ const branchRef = `refs/heads/${input.branchName}`;
214
+ const targetWorktreePath = path.resolve(input.targetWorktreePath);
215
+ const raw = await runGit(["worktree", "list", "--porcelain"], input.repoRoot);
216
+ const worktrees = parseGitWorktreeList(raw);
217
+ for (const worktree of worktrees) {
218
+ if (worktree.branch !== branchRef)
219
+ continue;
220
+ const resolvedPath = path.resolve(worktree.worktree);
221
+ if (resolvedPath === targetWorktreePath)
222
+ return null;
223
+ return resolvedPath;
224
+ }
225
+ return null;
226
+ }
227
+ function terminateChildProcess(child) {
228
+ if (!child.pid)
229
+ return;
230
+ if (process.platform !== "win32") {
231
+ try {
232
+ process.kill(-child.pid, "SIGTERM");
233
+ return;
234
+ }
235
+ catch {
236
+ // Fall through to the direct child kill.
237
+ }
238
+ }
239
+ if (process.platform === "win32") {
240
+ try {
241
+ spawnSync("taskkill", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore" });
242
+ return;
243
+ }
244
+ catch {
245
+ // Fall through to the direct child kill.
246
+ }
247
+ }
248
+ if (!child.killed) {
249
+ child.kill("SIGTERM");
250
+ }
251
+ }
252
+ function buildWorkspaceCommandEnv(input) {
253
+ const env = { ...process.env };
254
+ env.RUNEACH_WORKSPACE_CWD = input.worktreePath;
255
+ env.RUNEACH_WORKSPACE_PATH = input.worktreePath;
256
+ env.RUNEACH_WORKSPACE_WORKTREE_PATH = input.worktreePath;
257
+ env.RUNEACH_WORKSPACE_BRANCH = input.branchName;
258
+ env.RUNEACH_WORKSPACE_BASE_CWD = input.base.baseCwd;
259
+ env.RUNEACH_WORKSPACE_REPO_ROOT = input.repoRoot;
260
+ env.RUNEACH_WORKSPACE_SOURCE = input.base.source;
261
+ env.RUNEACH_WORKSPACE_REPO_REF = input.base.repoRef ?? "";
262
+ env.RUNEACH_WORKSPACE_REPO_URL = input.base.repoUrl ?? "";
263
+ env.RUNEACH_WORKSPACE_CREATED = input.created ? "true" : "false";
264
+ env.RUNEACH_PROJECT_ID = input.base.projectId ?? "";
265
+ env.RUNEACH_PROJECT_WORKSPACE_ID = input.base.workspaceId ?? "";
266
+ env.RUNEACH_AGENT_ID = input.agent.id;
267
+ env.RUNEACH_AGENT_NAME = input.agent.name;
268
+ env.RUNEACH_COMPANY_ID = input.agent.companyId;
269
+ env.RUNEACH_ISSUE_ID = input.issue?.id ?? "";
270
+ env.RUNEACH_ISSUE_IDENTIFIER = input.issue?.identifier ?? "";
271
+ env.RUNEACH_ISSUE_TITLE = input.issue?.title ?? "";
272
+ return env;
273
+ }
274
+ function resolveShellInvocation(command) {
275
+ if (process.platform === "win32") {
276
+ const shell = process.env.ComSpec?.trim() || "cmd.exe";
277
+ return {
278
+ shell,
279
+ args: ["/d", "/s", "/c", command],
280
+ };
281
+ }
282
+ const shell = process.env.SHELL?.trim() || "/bin/sh";
283
+ return {
284
+ shell,
285
+ args: ["-c", command],
286
+ };
287
+ }
288
+ async function runWorkspaceCommand(input) {
289
+ const invocation = resolveShellInvocation(input.command);
290
+ const proc = await executeProcess({
291
+ command: invocation.shell,
292
+ args: invocation.args,
293
+ cwd: input.cwd,
294
+ env: input.env,
295
+ });
296
+ if (proc.code === 0)
297
+ return;
298
+ const details = [proc.stderr.trim(), proc.stdout.trim()].filter(Boolean).join("\n");
299
+ throw new Error(details.length > 0
300
+ ? `${input.label} failed: ${details}`
301
+ : `${input.label} failed with exit code ${proc.code ?? -1}`);
302
+ }
303
+ async function recordGitOperation(recorder, input) {
304
+ if (!recorder) {
305
+ return runGit(input.args, input.cwd);
306
+ }
307
+ let stdout = "";
308
+ let stderr = "";
309
+ let code = null;
310
+ await recorder.recordOperation({
311
+ phase: input.phase,
312
+ command: formatCommandForDisplay("git", input.args),
313
+ cwd: input.cwd,
314
+ metadata: input.metadata ?? null,
315
+ run: async () => {
316
+ const result = await executeProcess({
317
+ command: "git",
318
+ args: input.args,
319
+ cwd: input.cwd,
320
+ });
321
+ stdout = result.stdout;
322
+ stderr = result.stderr;
323
+ code = result.code;
324
+ return {
325
+ status: result.code === 0 ? "succeeded" : "failed",
326
+ exitCode: result.code,
327
+ stdout: result.stdout,
328
+ stderr: result.stderr,
329
+ system: result.code === 0 ? input.successMessage ?? null : null,
330
+ };
331
+ },
332
+ });
333
+ if (code !== 0) {
334
+ const details = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
335
+ throw new Error(details.length > 0
336
+ ? `${input.failureLabel ?? `git ${input.args.join(" ")}`} failed: ${details}`
337
+ : `${input.failureLabel ?? `git ${input.args.join(" ")}`} failed with exit code ${code ?? -1}`);
338
+ }
339
+ return stdout.trim();
340
+ }
341
+ async function recordWorkspaceCommandOperation(recorder, input) {
342
+ if (!recorder) {
343
+ await runWorkspaceCommand(input);
344
+ return;
345
+ }
346
+ let stdout = "";
347
+ let stderr = "";
348
+ let code = null;
349
+ await recorder.recordOperation({
350
+ phase: input.phase,
351
+ command: input.command,
352
+ cwd: input.cwd,
353
+ metadata: input.metadata ?? null,
354
+ run: async () => {
355
+ const invocation = resolveShellInvocation(input.command);
356
+ const result = await executeProcess({
357
+ command: invocation.shell,
358
+ args: invocation.args,
359
+ cwd: input.cwd,
360
+ env: input.env,
361
+ });
362
+ stdout = result.stdout;
363
+ stderr = result.stderr;
364
+ code = result.code;
365
+ return {
366
+ status: result.code === 0 ? "succeeded" : "failed",
367
+ exitCode: result.code,
368
+ stdout: result.stdout,
369
+ stderr: result.stderr,
370
+ system: result.code === 0 ? input.successMessage ?? null : null,
371
+ };
372
+ },
373
+ });
374
+ if (code === 0)
375
+ return;
376
+ const details = [stderr.trim(), stdout.trim()].filter(Boolean).join("\n");
377
+ throw new Error(details.length > 0
378
+ ? `${input.label} failed: ${details}`
379
+ : `${input.label} failed with exit code ${code ?? -1}`);
380
+ }
381
+ async function provisionExecutionWorktree(input) {
382
+ const provisionCommand = asString(input.strategy.provisionCommand, "").trim();
383
+ if (!provisionCommand)
384
+ return;
385
+ await recordWorkspaceCommandOperation(input.recorder, {
386
+ phase: "workspace_provision",
387
+ command: provisionCommand,
388
+ cwd: input.worktreePath,
389
+ env: buildWorkspaceCommandEnv({
390
+ base: input.base,
391
+ repoRoot: input.repoRoot,
392
+ worktreePath: input.worktreePath,
393
+ branchName: input.branchName,
394
+ issue: input.issue,
395
+ agent: input.agent,
396
+ created: input.created,
397
+ }),
398
+ label: `Execution workspace provision command "${provisionCommand}"`,
399
+ metadata: {
400
+ repoRoot: input.repoRoot,
401
+ worktreePath: input.worktreePath,
402
+ branchName: input.branchName,
403
+ created: input.created,
404
+ },
405
+ successMessage: `Provisioned workspace at ${input.worktreePath}\n`,
406
+ });
407
+ }
408
+ function buildExecutionWorkspaceCleanupEnv(input) {
409
+ const env = sanitizeRuntimeServiceBaseEnv(process.env);
410
+ env.RUNEACH_WORKSPACE_CWD = input.workspace.cwd ?? "";
411
+ env.RUNEACH_WORKSPACE_PATH = input.workspace.cwd ?? "";
412
+ env.RUNEACH_WORKSPACE_WORKTREE_PATH =
413
+ input.workspace.providerRef ?? input.workspace.cwd ?? "";
414
+ env.RUNEACH_WORKSPACE_BRANCH = input.workspace.branchName ?? "";
415
+ env.RUNEACH_WORKSPACE_BASE_CWD = input.projectWorkspaceCwd ?? "";
416
+ env.RUNEACH_WORKSPACE_REPO_ROOT = input.projectWorkspaceCwd ?? "";
417
+ env.RUNEACH_WORKSPACE_REPO_URL = input.workspace.repoUrl ?? "";
418
+ env.RUNEACH_WORKSPACE_REPO_REF = input.workspace.baseRef ?? "";
419
+ env.RUNEACH_PROJECT_ID = input.workspace.projectId ?? "";
420
+ env.RUNEACH_PROJECT_WORKSPACE_ID = input.workspace.projectWorkspaceId ?? "";
421
+ env.RUNEACH_ISSUE_ID = input.workspace.sourceIssueId ?? "";
422
+ return env;
423
+ }
424
+ async function resolveGitRepoRootForWorkspaceCleanup(worktreePath, projectWorkspaceCwd) {
425
+ if (projectWorkspaceCwd) {
426
+ const resolvedProjectWorkspaceCwd = path.resolve(projectWorkspaceCwd);
427
+ const gitDir = await runGit(["rev-parse", "--git-common-dir"], resolvedProjectWorkspaceCwd)
428
+ .catch(() => null);
429
+ if (gitDir) {
430
+ const resolvedGitDir = path.resolve(resolvedProjectWorkspaceCwd, gitDir);
431
+ return path.dirname(resolvedGitDir);
432
+ }
433
+ }
434
+ const gitDir = await runGit(["rev-parse", "--git-common-dir"], worktreePath).catch(() => null);
435
+ if (!gitDir)
436
+ return null;
437
+ const resolvedGitDir = path.resolve(worktreePath, gitDir);
438
+ return path.dirname(resolvedGitDir);
439
+ }
440
+ export async function realizeExecutionWorkspace(input) {
441
+ const rawStrategy = parseObject(input.config.workspaceStrategy);
442
+ const strategyType = asString(rawStrategy.type, "project_primary");
443
+ if (strategyType !== "git_worktree") {
444
+ return {
445
+ ...input.base,
446
+ strategy: "project_primary",
447
+ cwd: input.base.baseCwd,
448
+ branchName: null,
449
+ worktreePath: null,
450
+ warnings: [],
451
+ created: false,
452
+ };
453
+ }
454
+ const repoRoot = await runGit(["rev-parse", "--show-toplevel"], input.base.baseCwd);
455
+ const branchTemplate = asString(rawStrategy.branchTemplate, "{{issue.identifier}}-{{slug}}");
456
+ const renderedBranch = renderWorkspaceTemplate(branchTemplate, {
457
+ issue: input.issue,
458
+ agent: input.agent,
459
+ projectId: input.base.projectId,
460
+ repoRef: input.base.repoRef,
461
+ });
462
+ const branchName = sanitizeBranchName(renderedBranch);
463
+ const configuredParentDir = asString(rawStrategy.worktreeParentDir, "");
464
+ const worktreeParentDir = configuredParentDir
465
+ ? resolveConfiguredPath(configuredParentDir, repoRoot)
466
+ : path.join(repoRoot, ".runeach", "worktrees");
467
+ const worktreePath = path.join(worktreeParentDir, branchName);
468
+ const baseRef = asString(rawStrategy.baseRef, input.base.repoRef ?? "HEAD");
469
+ const defaultWorktreeParentDir = path.join(repoRoot, ".runeach", "worktrees");
470
+ await fs.mkdir(worktreeParentDir, { recursive: true });
471
+ const existingWorktree = await directoryExists(worktreePath);
472
+ if (existingWorktree) {
473
+ const existingGitDir = await runGit(["rev-parse", "--git-dir"], worktreePath).catch(() => null);
474
+ if (existingGitDir) {
475
+ if (input.recorder) {
476
+ await input.recorder.recordOperation({
477
+ phase: "worktree_prepare",
478
+ cwd: repoRoot,
479
+ metadata: {
480
+ repoRoot,
481
+ worktreePath,
482
+ branchName,
483
+ baseRef,
484
+ created: false,
485
+ reused: true,
486
+ },
487
+ run: async () => ({
488
+ status: "succeeded",
489
+ exitCode: 0,
490
+ system: `Reused existing git worktree at ${worktreePath}\n`,
491
+ }),
492
+ });
493
+ }
494
+ await provisionExecutionWorktree({
495
+ strategy: rawStrategy,
496
+ base: input.base,
497
+ repoRoot,
498
+ worktreePath,
499
+ branchName,
500
+ issue: input.issue,
501
+ agent: input.agent,
502
+ created: false,
503
+ recorder: input.recorder ?? null,
504
+ });
505
+ return {
506
+ ...input.base,
507
+ strategy: "git_worktree",
508
+ cwd: worktreePath,
509
+ branchName,
510
+ worktreePath,
511
+ warnings: [],
512
+ created: false,
513
+ };
514
+ }
515
+ throw new Error(`Configured worktree path "${worktreePath}" already exists and is not a git worktree.`);
516
+ }
517
+ const conflictingWorktreePath = await findCheckedOutBranchWorktree({
518
+ repoRoot,
519
+ branchName,
520
+ targetWorktreePath: worktreePath,
521
+ });
522
+ if (conflictingWorktreePath) {
523
+ if (!configuredParentDir) {
524
+ throw new Error(`Execution worktree branch "${branchName}" is already checked out at ${conflictingWorktreePath}. ` +
525
+ `RunEach now uses ${defaultWorktreeParentDir} as the default worktree root; remove or migrate ` +
526
+ `the existing worktree before retrying, or set workspaceStrategy.worktreeParentDir explicitly.`);
527
+ }
528
+ throw new Error(`Execution worktree branch "${branchName}" is already checked out at ${conflictingWorktreePath}. ` +
529
+ "Clean up the existing worktree or change workspaceStrategy.branchTemplate before retrying.");
530
+ }
531
+ try {
532
+ await recordGitOperation(input.recorder, {
533
+ phase: "worktree_prepare",
534
+ args: ["worktree", "add", "-b", branchName, worktreePath, baseRef],
535
+ cwd: repoRoot,
536
+ metadata: {
537
+ repoRoot,
538
+ worktreePath,
539
+ branchName,
540
+ baseRef,
541
+ created: true,
542
+ },
543
+ successMessage: `Created git worktree at ${worktreePath}\n`,
544
+ failureLabel: `git worktree add ${worktreePath}`,
545
+ });
546
+ }
547
+ catch (error) {
548
+ if (!gitErrorIncludes(error, "already exists")) {
549
+ throw error;
550
+ }
551
+ await recordGitOperation(input.recorder, {
552
+ phase: "worktree_prepare",
553
+ args: ["worktree", "add", worktreePath, branchName],
554
+ cwd: repoRoot,
555
+ metadata: {
556
+ repoRoot,
557
+ worktreePath,
558
+ branchName,
559
+ baseRef,
560
+ created: false,
561
+ reusedExistingBranch: true,
562
+ },
563
+ successMessage: `Attached existing branch ${branchName} at ${worktreePath}\n`,
564
+ failureLabel: `git worktree add ${worktreePath}`,
565
+ });
566
+ }
567
+ await provisionExecutionWorktree({
568
+ strategy: rawStrategy,
569
+ base: input.base,
570
+ repoRoot,
571
+ worktreePath,
572
+ branchName,
573
+ issue: input.issue,
574
+ agent: input.agent,
575
+ created: true,
576
+ recorder: input.recorder ?? null,
577
+ });
578
+ return {
579
+ ...input.base,
580
+ strategy: "git_worktree",
581
+ cwd: worktreePath,
582
+ branchName,
583
+ worktreePath,
584
+ warnings: [],
585
+ created: true,
586
+ };
587
+ }
588
+ export async function cleanupExecutionWorkspaceArtifacts(input) {
589
+ const warnings = [];
590
+ const workspacePath = input.workspace.providerRef ?? input.workspace.cwd;
591
+ const cleanupEnv = buildExecutionWorkspaceCleanupEnv({
592
+ workspace: input.workspace,
593
+ projectWorkspaceCwd: input.projectWorkspace?.cwd ?? null,
594
+ });
595
+ const createdByRuntime = input.workspace.metadata?.createdByRuntime === true;
596
+ const cleanupCommands = [
597
+ input.projectWorkspace?.cleanupCommand ?? null,
598
+ input.teardownCommand ?? null,
599
+ ]
600
+ .map((value) => asString(value, "").trim())
601
+ .filter(Boolean);
602
+ for (const command of cleanupCommands) {
603
+ try {
604
+ await recordWorkspaceCommandOperation(input.recorder, {
605
+ phase: "workspace_teardown",
606
+ command,
607
+ cwd: workspacePath ?? input.projectWorkspace?.cwd ?? process.cwd(),
608
+ env: cleanupEnv,
609
+ label: `Execution workspace cleanup command "${command}"`,
610
+ metadata: {
611
+ workspaceId: input.workspace.id,
612
+ workspacePath,
613
+ branchName: input.workspace.branchName,
614
+ providerType: input.workspace.providerType,
615
+ },
616
+ successMessage: `Completed cleanup command "${command}"\n`,
617
+ });
618
+ }
619
+ catch (err) {
620
+ warnings.push(err instanceof Error ? err.message : String(err));
621
+ }
622
+ }
623
+ if (input.workspace.providerType === "git_worktree" && workspacePath) {
624
+ const repoRoot = await resolveGitRepoRootForWorkspaceCleanup(workspacePath, input.projectWorkspace?.cwd ?? null);
625
+ const worktreeExists = await directoryExists(workspacePath);
626
+ if (worktreeExists) {
627
+ if (!repoRoot) {
628
+ warnings.push(`Could not resolve git repo root for "${workspacePath}".`);
629
+ }
630
+ else {
631
+ try {
632
+ await recordGitOperation(input.recorder, {
633
+ phase: "worktree_cleanup",
634
+ args: ["worktree", "remove", "--force", workspacePath],
635
+ cwd: repoRoot,
636
+ metadata: {
637
+ workspaceId: input.workspace.id,
638
+ workspacePath,
639
+ branchName: input.workspace.branchName,
640
+ cleanupAction: "worktree_remove",
641
+ },
642
+ successMessage: `Removed git worktree ${workspacePath}\n`,
643
+ failureLabel: `git worktree remove ${workspacePath}`,
644
+ });
645
+ }
646
+ catch (err) {
647
+ warnings.push(err instanceof Error ? err.message : String(err));
648
+ }
649
+ }
650
+ }
651
+ if (createdByRuntime && input.workspace.branchName) {
652
+ if (!repoRoot) {
653
+ warnings.push(`Could not resolve git repo root to delete branch "${input.workspace.branchName}".`);
654
+ }
655
+ else {
656
+ try {
657
+ await recordGitOperation(input.recorder, {
658
+ phase: "worktree_cleanup",
659
+ args: ["branch", "-d", input.workspace.branchName],
660
+ cwd: repoRoot,
661
+ metadata: {
662
+ workspaceId: input.workspace.id,
663
+ workspacePath,
664
+ branchName: input.workspace.branchName,
665
+ cleanupAction: "branch_delete",
666
+ },
667
+ successMessage: `Deleted branch ${input.workspace.branchName}\n`,
668
+ failureLabel: `git branch -d ${input.workspace.branchName}`,
669
+ });
670
+ }
671
+ catch (err) {
672
+ const message = err instanceof Error ? err.message : String(err);
673
+ warnings.push(`Skipped deleting branch "${input.workspace.branchName}": ${message}`);
674
+ }
675
+ }
676
+ }
677
+ }
678
+ else if (input.workspace.providerType === "local_fs" && createdByRuntime && workspacePath) {
679
+ const projectWorkspaceCwd = input.projectWorkspace?.cwd ? path.resolve(input.projectWorkspace.cwd) : null;
680
+ const resolvedWorkspacePath = path.resolve(workspacePath);
681
+ const containsProjectWorkspace = projectWorkspaceCwd
682
+ ? (resolvedWorkspacePath === projectWorkspaceCwd ||
683
+ projectWorkspaceCwd.startsWith(`${resolvedWorkspacePath}${path.sep}`))
684
+ : false;
685
+ if (containsProjectWorkspace) {
686
+ warnings.push(`Refusing to remove path "${workspacePath}" because it contains the project workspace.`);
687
+ }
688
+ else {
689
+ await fs.rm(resolvedWorkspacePath, { recursive: true, force: true });
690
+ if (input.recorder) {
691
+ await input.recorder.recordOperation({
692
+ phase: "workspace_teardown",
693
+ cwd: projectWorkspaceCwd ?? process.cwd(),
694
+ metadata: {
695
+ workspaceId: input.workspace.id,
696
+ workspacePath: resolvedWorkspacePath,
697
+ cleanupAction: "remove_local_fs",
698
+ },
699
+ run: async () => ({
700
+ status: "succeeded",
701
+ exitCode: 0,
702
+ system: `Removed local workspace directory ${resolvedWorkspacePath}\n`,
703
+ }),
704
+ });
705
+ }
706
+ }
707
+ }
708
+ const cleaned = !workspacePath ||
709
+ !(await directoryExists(workspacePath));
710
+ return {
711
+ cleanedPath: workspacePath,
712
+ cleaned,
713
+ warnings,
714
+ };
715
+ }
716
+ async function allocatePort() {
717
+ return await new Promise((resolve, reject) => {
718
+ const server = net.createServer();
719
+ server.listen(0, "127.0.0.1", () => {
720
+ const address = server.address();
721
+ server.close((err) => {
722
+ if (err) {
723
+ reject(err);
724
+ return;
725
+ }
726
+ if (!address || typeof address === "string") {
727
+ reject(new Error("Failed to allocate port"));
728
+ return;
729
+ }
730
+ resolve(address.port);
731
+ });
732
+ });
733
+ server.on("error", reject);
734
+ });
735
+ }
736
+ function buildTemplateData(input) {
737
+ return {
738
+ workspace: {
739
+ cwd: input.workspace.cwd,
740
+ branchName: input.workspace.branchName ?? "",
741
+ worktreePath: input.workspace.worktreePath ?? "",
742
+ repoUrl: input.workspace.repoUrl ?? "",
743
+ repoRef: input.workspace.repoRef ?? "",
744
+ env: input.adapterEnv,
745
+ },
746
+ issue: {
747
+ id: input.issue?.id ?? "",
748
+ identifier: input.issue?.identifier ?? "",
749
+ title: input.issue?.title ?? "",
750
+ },
751
+ agent: {
752
+ id: input.agent.id,
753
+ name: input.agent.name,
754
+ },
755
+ port: input.port ?? "",
756
+ };
757
+ }
758
+ function resolveServiceScopeId(input) {
759
+ const scopeTypeRaw = asString(input.service.reuseScope, input.service.lifecycle === "shared" ? "project_workspace" : "run");
760
+ const scopeType = scopeTypeRaw === "project_workspace" ||
761
+ scopeTypeRaw === "execution_workspace" ||
762
+ scopeTypeRaw === "agent"
763
+ ? scopeTypeRaw
764
+ : "run";
765
+ if (scopeType === "project_workspace")
766
+ return { scopeType, scopeId: input.workspace.workspaceId ?? input.workspace.projectId };
767
+ if (scopeType === "execution_workspace") {
768
+ return { scopeType, scopeId: input.executionWorkspaceId ?? input.workspace.cwd };
769
+ }
770
+ if (scopeType === "agent")
771
+ return { scopeType, scopeId: input.agent.id };
772
+ return { scopeType: "run", scopeId: input.runId };
773
+ }
774
+ async function waitForReadiness(input) {
775
+ const readiness = parseObject(input.service.readiness);
776
+ const readinessType = asString(readiness.type, "");
777
+ if (readinessType !== "http" || !input.url)
778
+ return;
779
+ const timeoutSec = Math.max(1, asNumber(readiness.timeoutSec, 30));
780
+ const intervalMs = Math.max(100, asNumber(readiness.intervalMs, 500));
781
+ const deadline = Date.now() + timeoutSec * 1000;
782
+ let lastError = "service did not become ready";
783
+ while (Date.now() < deadline) {
784
+ try {
785
+ const response = await fetch(input.url);
786
+ if (response.ok)
787
+ return;
788
+ lastError = `received HTTP ${response.status}`;
789
+ }
790
+ catch (err) {
791
+ lastError = err instanceof Error ? err.message : String(err);
792
+ }
793
+ await delay(intervalMs);
794
+ }
795
+ throw new Error(`Readiness check failed for ${input.url}: ${lastError}`);
796
+ }
797
+ function toPersistedWorkspaceRuntimeService(record) {
798
+ return {
799
+ id: record.id,
800
+ companyId: record.companyId,
801
+ projectId: record.projectId,
802
+ projectWorkspaceId: record.projectWorkspaceId,
803
+ executionWorkspaceId: record.executionWorkspaceId,
804
+ issueId: record.issueId,
805
+ scopeType: record.scopeType,
806
+ scopeId: record.scopeId,
807
+ serviceName: record.serviceName,
808
+ status: record.status,
809
+ lifecycle: record.lifecycle,
810
+ reuseKey: record.reuseKey,
811
+ command: record.command,
812
+ cwd: record.cwd,
813
+ port: record.port,
814
+ url: record.url,
815
+ provider: record.provider,
816
+ providerRef: record.providerRef,
817
+ ownerAgentId: record.ownerAgentId,
818
+ startedByRunId: record.startedByRunId,
819
+ lastUsedAt: new Date(record.lastUsedAt),
820
+ startedAt: new Date(record.startedAt),
821
+ stoppedAt: record.stoppedAt ? new Date(record.stoppedAt) : null,
822
+ stopPolicy: record.stopPolicy,
823
+ healthStatus: record.healthStatus,
824
+ updatedAt: new Date(),
825
+ };
826
+ }
827
+ async function persistRuntimeServiceRecord(db, record) {
828
+ if (!db)
829
+ return;
830
+ const values = toPersistedWorkspaceRuntimeService(record);
831
+ await db
832
+ .insert(workspaceRuntimeServices)
833
+ .values(values)
834
+ .onConflictDoUpdate({
835
+ target: workspaceRuntimeServices.id,
836
+ set: {
837
+ projectId: values.projectId,
838
+ projectWorkspaceId: values.projectWorkspaceId,
839
+ executionWorkspaceId: values.executionWorkspaceId,
840
+ issueId: values.issueId,
841
+ scopeType: values.scopeType,
842
+ scopeId: values.scopeId,
843
+ serviceName: values.serviceName,
844
+ status: values.status,
845
+ lifecycle: values.lifecycle,
846
+ reuseKey: values.reuseKey,
847
+ command: values.command,
848
+ cwd: values.cwd,
849
+ port: values.port,
850
+ url: values.url,
851
+ provider: values.provider,
852
+ providerRef: values.providerRef,
853
+ ownerAgentId: values.ownerAgentId,
854
+ startedByRunId: values.startedByRunId,
855
+ lastUsedAt: values.lastUsedAt,
856
+ startedAt: values.startedAt,
857
+ stoppedAt: values.stoppedAt,
858
+ stopPolicy: values.stopPolicy,
859
+ healthStatus: values.healthStatus,
860
+ updatedAt: values.updatedAt,
861
+ },
862
+ });
863
+ }
864
+ function clearIdleTimer(record) {
865
+ if (!record.idleTimer)
866
+ return;
867
+ clearTimeout(record.idleTimer);
868
+ record.idleTimer = null;
869
+ }
870
+ export function normalizeAdapterManagedRuntimeServices(input) {
871
+ const nowIso = (input.now ?? new Date()).toISOString();
872
+ return input.reports.map((report) => {
873
+ const scopeType = report.scopeType ?? "run";
874
+ const scopeId = report.scopeId ??
875
+ (scopeType === "project_workspace"
876
+ ? input.workspace.workspaceId
877
+ : scopeType === "execution_workspace"
878
+ ? input.executionWorkspaceId ?? input.workspace.cwd
879
+ : scopeType === "agent"
880
+ ? input.agent.id
881
+ : input.runId) ??
882
+ null;
883
+ const serviceName = asString(report.serviceName, "").trim() || "service";
884
+ const status = report.status ?? "running";
885
+ const lifecycle = report.lifecycle ?? "ephemeral";
886
+ const healthStatus = report.healthStatus ??
887
+ (status === "running" ? "healthy" : status === "failed" ? "unhealthy" : "unknown");
888
+ return {
889
+ id: stableRuntimeServiceId({
890
+ adapterType: input.adapterType,
891
+ runId: input.runId,
892
+ scopeType,
893
+ scopeId,
894
+ serviceName,
895
+ reportId: report.id ?? null,
896
+ providerRef: report.providerRef ?? null,
897
+ reuseKey: report.reuseKey ?? null,
898
+ }),
899
+ companyId: input.agent.companyId,
900
+ projectId: report.projectId ?? input.workspace.projectId,
901
+ projectWorkspaceId: report.projectWorkspaceId ?? input.workspace.workspaceId,
902
+ executionWorkspaceId: input.executionWorkspaceId ?? null,
903
+ issueId: report.issueId ?? input.issue?.id ?? null,
904
+ serviceName,
905
+ status,
906
+ lifecycle,
907
+ scopeType,
908
+ scopeId,
909
+ reuseKey: report.reuseKey ?? null,
910
+ command: report.command ?? null,
911
+ cwd: report.cwd ?? null,
912
+ port: report.port ?? null,
913
+ url: report.url ?? null,
914
+ provider: "adapter_managed",
915
+ providerRef: report.providerRef ?? null,
916
+ ownerAgentId: report.ownerAgentId ?? input.agent.id,
917
+ startedByRunId: input.runId,
918
+ lastUsedAt: nowIso,
919
+ startedAt: nowIso,
920
+ stoppedAt: status === "running" || status === "starting" ? null : nowIso,
921
+ stopPolicy: report.stopPolicy ?? null,
922
+ healthStatus,
923
+ reused: false,
924
+ };
925
+ });
926
+ }
927
+ async function startLocalRuntimeService(input) {
928
+ const serviceName = asString(input.service.name, "service");
929
+ const lifecycle = asString(input.service.lifecycle, "shared") === "ephemeral" ? "ephemeral" : "shared";
930
+ const command = asString(input.service.command, "");
931
+ if (!command)
932
+ throw new Error(`Runtime service "${serviceName}" is missing command`);
933
+ const serviceCwdTemplate = asString(input.service.cwd, ".");
934
+ const portConfig = parseObject(input.service.port);
935
+ const port = asString(portConfig.type, "") === "auto" ? await allocatePort() : null;
936
+ const envConfig = parseObject(input.service.env);
937
+ const templateData = buildTemplateData({
938
+ workspace: input.workspace,
939
+ agent: input.agent,
940
+ issue: input.issue,
941
+ adapterEnv: input.adapterEnv,
942
+ port,
943
+ });
944
+ const serviceCwd = resolveConfiguredPath(renderTemplate(serviceCwdTemplate, templateData), input.workspace.cwd);
945
+ const env = {
946
+ ...sanitizeRuntimeServiceBaseEnv(process.env),
947
+ ...input.adapterEnv,
948
+ };
949
+ for (const [key, value] of Object.entries(envConfig)) {
950
+ if (typeof value === "string") {
951
+ env[key] = renderTemplate(value, templateData);
952
+ }
953
+ }
954
+ if (port) {
955
+ const portEnvKey = asString(portConfig.envKey, "PORT");
956
+ env[portEnvKey] = String(port);
957
+ }
958
+ const invocation = resolveShellInvocation(command);
959
+ const child = spawn(invocation.shell, invocation.args, {
960
+ cwd: serviceCwd,
961
+ env,
962
+ detached: process.platform !== "win32",
963
+ stdio: ["ignore", "pipe", "pipe"],
964
+ });
965
+ let stderrExcerpt = "";
966
+ let stdoutExcerpt = "";
967
+ child.stdout?.on("data", async (chunk) => {
968
+ const text = String(chunk);
969
+ stdoutExcerpt = (stdoutExcerpt + text).slice(-4096);
970
+ if (input.onLog)
971
+ await input.onLog("stdout", `[service:${serviceName}] ${text}`);
972
+ });
973
+ child.stderr?.on("data", async (chunk) => {
974
+ const text = String(chunk);
975
+ stderrExcerpt = (stderrExcerpt + text).slice(-4096);
976
+ if (input.onLog)
977
+ await input.onLog("stderr", `[service:${serviceName}] ${text}`);
978
+ });
979
+ const expose = parseObject(input.service.expose);
980
+ const readiness = parseObject(input.service.readiness);
981
+ const urlTemplate = asString(expose.urlTemplate, "") ||
982
+ asString(readiness.urlTemplate, "");
983
+ const url = urlTemplate ? renderTemplate(urlTemplate, templateData) : null;
984
+ try {
985
+ await waitForReadiness({ service: input.service, url });
986
+ }
987
+ catch (err) {
988
+ terminateChildProcess(child);
989
+ throw new Error(`Failed to start runtime service "${serviceName}": ${err instanceof Error ? err.message : String(err)}${stderrExcerpt ? ` | stderr: ${stderrExcerpt.trim()}` : ""}`);
990
+ }
991
+ const envFingerprint = createHash("sha256").update(stableStringify(envConfig)).digest("hex");
992
+ return {
993
+ id: randomUUID(),
994
+ companyId: input.agent.companyId,
995
+ projectId: input.workspace.projectId,
996
+ projectWorkspaceId: input.workspace.workspaceId,
997
+ executionWorkspaceId: input.executionWorkspaceId ?? null,
998
+ issueId: input.issue?.id ?? null,
999
+ serviceName,
1000
+ status: "running",
1001
+ lifecycle,
1002
+ scopeType: input.scopeType,
1003
+ scopeId: input.scopeId,
1004
+ reuseKey: input.reuseKey,
1005
+ command,
1006
+ cwd: serviceCwd,
1007
+ port,
1008
+ url,
1009
+ provider: "local_process",
1010
+ providerRef: child.pid ? String(child.pid) : null,
1011
+ ownerAgentId: input.agent.id,
1012
+ startedByRunId: input.runId,
1013
+ lastUsedAt: new Date().toISOString(),
1014
+ startedAt: new Date().toISOString(),
1015
+ stoppedAt: null,
1016
+ stopPolicy: parseObject(input.service.stopPolicy),
1017
+ healthStatus: "healthy",
1018
+ reused: false,
1019
+ db: input.db,
1020
+ child,
1021
+ leaseRunIds: new Set([input.runId]),
1022
+ idleTimer: null,
1023
+ envFingerprint,
1024
+ };
1025
+ }
1026
+ function scheduleIdleStop(record) {
1027
+ clearIdleTimer(record);
1028
+ const stopType = asString(record.stopPolicy?.type, "manual");
1029
+ if (stopType !== "idle_timeout")
1030
+ return;
1031
+ const idleSeconds = Math.max(1, asNumber(record.stopPolicy?.idleSeconds, 1800));
1032
+ record.idleTimer = setTimeout(() => {
1033
+ stopRuntimeService(record.id).catch(() => undefined);
1034
+ }, idleSeconds * 1000);
1035
+ }
1036
+ async function stopRuntimeService(serviceId) {
1037
+ const record = runtimeServicesById.get(serviceId);
1038
+ if (!record)
1039
+ return;
1040
+ clearIdleTimer(record);
1041
+ record.status = "stopped";
1042
+ record.lastUsedAt = new Date().toISOString();
1043
+ record.stoppedAt = new Date().toISOString();
1044
+ if (record.child && record.child.pid) {
1045
+ terminateChildProcess(record.child);
1046
+ }
1047
+ runtimeServicesById.delete(serviceId);
1048
+ if (record.reuseKey) {
1049
+ runtimeServicesByReuseKey.delete(record.reuseKey);
1050
+ }
1051
+ await persistRuntimeServiceRecord(record.db, record);
1052
+ }
1053
+ async function markPersistedRuntimeServicesStoppedForExecutionWorkspace(input) {
1054
+ const now = new Date();
1055
+ await input.db
1056
+ .update(workspaceRuntimeServices)
1057
+ .set({
1058
+ status: "stopped",
1059
+ healthStatus: "unknown",
1060
+ stoppedAt: now,
1061
+ lastUsedAt: now,
1062
+ updatedAt: now,
1063
+ })
1064
+ .where(and(eq(workspaceRuntimeServices.executionWorkspaceId, input.executionWorkspaceId), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
1065
+ }
1066
+ function registerRuntimeService(db, record) {
1067
+ record.db = db;
1068
+ runtimeServicesById.set(record.id, record);
1069
+ if (record.reuseKey) {
1070
+ runtimeServicesByReuseKey.set(record.reuseKey, record.id);
1071
+ }
1072
+ record.child?.on("exit", (code, signal) => {
1073
+ const current = runtimeServicesById.get(record.id);
1074
+ if (!current)
1075
+ return;
1076
+ clearIdleTimer(current);
1077
+ current.status = code === 0 || signal === "SIGTERM" ? "stopped" : "failed";
1078
+ current.healthStatus = current.status === "failed" ? "unhealthy" : "unknown";
1079
+ current.lastUsedAt = new Date().toISOString();
1080
+ current.stoppedAt = new Date().toISOString();
1081
+ runtimeServicesById.delete(current.id);
1082
+ if (current.reuseKey && runtimeServicesByReuseKey.get(current.reuseKey) === current.id) {
1083
+ runtimeServicesByReuseKey.delete(current.reuseKey);
1084
+ }
1085
+ void persistRuntimeServiceRecord(db, current);
1086
+ });
1087
+ }
1088
+ export async function ensureRuntimeServicesForRun(input) {
1089
+ const runtime = parseObject(input.config.workspaceRuntime);
1090
+ const rawServices = Array.isArray(runtime.services)
1091
+ ? runtime.services.filter((entry) => typeof entry === "object" && entry !== null)
1092
+ : [];
1093
+ const acquiredServiceIds = [];
1094
+ const refs = [];
1095
+ runtimeServiceLeasesByRun.set(input.runId, acquiredServiceIds);
1096
+ try {
1097
+ for (const service of rawServices) {
1098
+ const lifecycle = asString(service.lifecycle, "shared") === "ephemeral" ? "ephemeral" : "shared";
1099
+ const { scopeType, scopeId } = resolveServiceScopeId({
1100
+ service,
1101
+ workspace: input.workspace,
1102
+ executionWorkspaceId: input.executionWorkspaceId,
1103
+ issue: input.issue,
1104
+ runId: input.runId,
1105
+ agent: input.agent,
1106
+ });
1107
+ const envConfig = parseObject(service.env);
1108
+ const envFingerprint = createHash("sha256").update(stableStringify(envConfig)).digest("hex");
1109
+ const serviceName = asString(service.name, "service");
1110
+ const reuseKey = lifecycle === "shared"
1111
+ ? [scopeType, scopeId ?? "", serviceName, envFingerprint].join(":")
1112
+ : null;
1113
+ if (reuseKey) {
1114
+ const existingId = runtimeServicesByReuseKey.get(reuseKey);
1115
+ const existing = existingId ? runtimeServicesById.get(existingId) : null;
1116
+ if (existing && existing.status === "running") {
1117
+ existing.leaseRunIds.add(input.runId);
1118
+ existing.lastUsedAt = new Date().toISOString();
1119
+ existing.stoppedAt = null;
1120
+ clearIdleTimer(existing);
1121
+ await persistRuntimeServiceRecord(input.db, existing);
1122
+ acquiredServiceIds.push(existing.id);
1123
+ refs.push(toRuntimeServiceRef(existing, { reused: true }));
1124
+ continue;
1125
+ }
1126
+ }
1127
+ const record = await startLocalRuntimeService({
1128
+ db: input.db,
1129
+ runId: input.runId,
1130
+ agent: input.agent,
1131
+ issue: input.issue,
1132
+ workspace: input.workspace,
1133
+ executionWorkspaceId: input.executionWorkspaceId,
1134
+ adapterEnv: input.adapterEnv,
1135
+ service,
1136
+ onLog: input.onLog,
1137
+ reuseKey,
1138
+ scopeType,
1139
+ scopeId,
1140
+ });
1141
+ registerRuntimeService(input.db, record);
1142
+ await persistRuntimeServiceRecord(input.db, record);
1143
+ acquiredServiceIds.push(record.id);
1144
+ refs.push(toRuntimeServiceRef(record));
1145
+ }
1146
+ }
1147
+ catch (err) {
1148
+ await releaseRuntimeServicesForRun(input.runId);
1149
+ throw err;
1150
+ }
1151
+ return refs;
1152
+ }
1153
+ export async function releaseRuntimeServicesForRun(runId) {
1154
+ const acquired = runtimeServiceLeasesByRun.get(runId) ?? [];
1155
+ runtimeServiceLeasesByRun.delete(runId);
1156
+ for (const serviceId of acquired) {
1157
+ const record = runtimeServicesById.get(serviceId);
1158
+ if (!record)
1159
+ continue;
1160
+ record.leaseRunIds.delete(runId);
1161
+ record.lastUsedAt = new Date().toISOString();
1162
+ const stopType = asString(record.stopPolicy?.type, record.lifecycle === "ephemeral" ? "on_run_finish" : "manual");
1163
+ await persistRuntimeServiceRecord(record.db, record);
1164
+ if (record.leaseRunIds.size === 0) {
1165
+ if (record.lifecycle === "ephemeral" || stopType === "on_run_finish") {
1166
+ await stopRuntimeService(serviceId);
1167
+ continue;
1168
+ }
1169
+ scheduleIdleStop(record);
1170
+ }
1171
+ }
1172
+ }
1173
+ export async function stopRuntimeServicesForExecutionWorkspace(input) {
1174
+ const normalizedWorkspaceCwd = input.workspaceCwd ? path.resolve(input.workspaceCwd) : null;
1175
+ const matchingServiceIds = Array.from(runtimeServicesById.values())
1176
+ .filter((record) => {
1177
+ if (record.executionWorkspaceId === input.executionWorkspaceId)
1178
+ return true;
1179
+ if (!normalizedWorkspaceCwd || !record.cwd)
1180
+ return false;
1181
+ const resolvedCwd = path.resolve(record.cwd);
1182
+ return (resolvedCwd === normalizedWorkspaceCwd ||
1183
+ resolvedCwd.startsWith(`${normalizedWorkspaceCwd}${path.sep}`));
1184
+ })
1185
+ .map((record) => record.id);
1186
+ for (const serviceId of matchingServiceIds) {
1187
+ await stopRuntimeService(serviceId);
1188
+ }
1189
+ if (input.db) {
1190
+ await markPersistedRuntimeServicesStoppedForExecutionWorkspace({
1191
+ db: input.db,
1192
+ executionWorkspaceId: input.executionWorkspaceId,
1193
+ });
1194
+ }
1195
+ }
1196
+ export async function listWorkspaceRuntimeServicesForProjectWorkspaces(db, companyId, projectWorkspaceIds) {
1197
+ if (projectWorkspaceIds.length === 0)
1198
+ return new Map();
1199
+ const rows = await db
1200
+ .select()
1201
+ .from(workspaceRuntimeServices)
1202
+ .where(and(eq(workspaceRuntimeServices.companyId, companyId), inArray(workspaceRuntimeServices.projectWorkspaceId, projectWorkspaceIds)))
1203
+ .orderBy(desc(workspaceRuntimeServices.updatedAt), desc(workspaceRuntimeServices.createdAt));
1204
+ const grouped = new Map();
1205
+ for (const row of rows) {
1206
+ if (!row.projectWorkspaceId)
1207
+ continue;
1208
+ const existing = grouped.get(row.projectWorkspaceId);
1209
+ if (existing)
1210
+ existing.push(row);
1211
+ else
1212
+ grouped.set(row.projectWorkspaceId, [row]);
1213
+ }
1214
+ return grouped;
1215
+ }
1216
+ export async function reconcilePersistedRuntimeServicesOnStartup(db) {
1217
+ const staleRows = await db
1218
+ .select({ id: workspaceRuntimeServices.id })
1219
+ .from(workspaceRuntimeServices)
1220
+ .where(and(eq(workspaceRuntimeServices.provider, "local_process"), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
1221
+ if (staleRows.length === 0)
1222
+ return { reconciled: 0 };
1223
+ const now = new Date();
1224
+ await db
1225
+ .update(workspaceRuntimeServices)
1226
+ .set({
1227
+ status: "stopped",
1228
+ healthStatus: "unknown",
1229
+ stoppedAt: now,
1230
+ lastUsedAt: now,
1231
+ updatedAt: now,
1232
+ })
1233
+ .where(and(eq(workspaceRuntimeServices.provider, "local_process"), inArray(workspaceRuntimeServices.status, ["starting", "running"])));
1234
+ return { reconciled: staleRows.length };
1235
+ }
1236
+ export async function persistAdapterManagedRuntimeServices(input) {
1237
+ const refs = normalizeAdapterManagedRuntimeServices(input);
1238
+ if (refs.length === 0)
1239
+ return refs;
1240
+ const existingRows = await input.db
1241
+ .select()
1242
+ .from(workspaceRuntimeServices)
1243
+ .where(inArray(workspaceRuntimeServices.id, refs.map((ref) => ref.id)));
1244
+ const existingById = new Map(existingRows.map((row) => [row.id, row]));
1245
+ for (const ref of refs) {
1246
+ const existing = existingById.get(ref.id);
1247
+ const startedAt = existing?.startedAt ?? new Date(ref.startedAt);
1248
+ const createdAt = existing?.createdAt ?? new Date();
1249
+ await input.db
1250
+ .insert(workspaceRuntimeServices)
1251
+ .values({
1252
+ id: ref.id,
1253
+ companyId: ref.companyId,
1254
+ projectId: ref.projectId,
1255
+ projectWorkspaceId: ref.projectWorkspaceId,
1256
+ executionWorkspaceId: ref.executionWorkspaceId,
1257
+ issueId: ref.issueId,
1258
+ scopeType: ref.scopeType,
1259
+ scopeId: ref.scopeId,
1260
+ serviceName: ref.serviceName,
1261
+ status: ref.status,
1262
+ lifecycle: ref.lifecycle,
1263
+ reuseKey: ref.reuseKey,
1264
+ command: ref.command,
1265
+ cwd: ref.cwd,
1266
+ port: ref.port,
1267
+ url: ref.url,
1268
+ provider: ref.provider,
1269
+ providerRef: ref.providerRef,
1270
+ ownerAgentId: ref.ownerAgentId,
1271
+ startedByRunId: ref.startedByRunId,
1272
+ lastUsedAt: new Date(ref.lastUsedAt),
1273
+ startedAt,
1274
+ stoppedAt: ref.stoppedAt ? new Date(ref.stoppedAt) : null,
1275
+ stopPolicy: ref.stopPolicy,
1276
+ healthStatus: ref.healthStatus,
1277
+ createdAt,
1278
+ updatedAt: new Date(),
1279
+ })
1280
+ .onConflictDoUpdate({
1281
+ target: workspaceRuntimeServices.id,
1282
+ set: {
1283
+ projectId: ref.projectId,
1284
+ projectWorkspaceId: ref.projectWorkspaceId,
1285
+ executionWorkspaceId: ref.executionWorkspaceId,
1286
+ issueId: ref.issueId,
1287
+ scopeType: ref.scopeType,
1288
+ scopeId: ref.scopeId,
1289
+ serviceName: ref.serviceName,
1290
+ status: ref.status,
1291
+ lifecycle: ref.lifecycle,
1292
+ reuseKey: ref.reuseKey,
1293
+ command: ref.command,
1294
+ cwd: ref.cwd,
1295
+ port: ref.port,
1296
+ url: ref.url,
1297
+ provider: ref.provider,
1298
+ providerRef: ref.providerRef,
1299
+ ownerAgentId: ref.ownerAgentId,
1300
+ startedByRunId: ref.startedByRunId,
1301
+ lastUsedAt: new Date(ref.lastUsedAt),
1302
+ startedAt,
1303
+ stoppedAt: ref.stoppedAt ? new Date(ref.stoppedAt) : null,
1304
+ stopPolicy: ref.stopPolicy,
1305
+ healthStatus: ref.healthStatus,
1306
+ updatedAt: new Date(),
1307
+ },
1308
+ });
1309
+ }
1310
+ return refs;
1311
+ }
1312
+ export function buildWorkspaceReadyComment(input) {
1313
+ const lines = ["## Workspace Ready", ""];
1314
+ lines.push(`- Strategy: \`${input.workspace.strategy}\``);
1315
+ if (input.workspace.branchName)
1316
+ lines.push(`- Branch: \`${input.workspace.branchName}\``);
1317
+ lines.push(`- CWD: \`${input.workspace.cwd}\``);
1318
+ if (input.workspace.worktreePath && input.workspace.worktreePath !== input.workspace.cwd) {
1319
+ lines.push(`- Worktree: \`${input.workspace.worktreePath}\``);
1320
+ }
1321
+ for (const service of input.runtimeServices) {
1322
+ const detail = service.url ? `${service.serviceName}: ${service.url}` : `${service.serviceName}: running`;
1323
+ const suffix = service.reused ? " (reused)" : "";
1324
+ lines.push(`- Service: ${detail}${suffix}`);
1325
+ }
1326
+ return lines.join("\n");
1327
+ }
1328
+ //# sourceMappingURL=workspace-runtime.js.map