@paperclipai/server 2026.824.0 → 2026.825.0-beta.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 (519) hide show
  1. package/dist/adapters/builtin-adapter-types.d.ts.map +1 -1
  2. package/dist/adapters/builtin-adapter-types.js +1 -0
  3. package/dist/adapters/builtin-adapter-types.js.map +1 -1
  4. package/dist/adapters/plugin-loader.d.ts +1 -0
  5. package/dist/adapters/plugin-loader.d.ts.map +1 -1
  6. package/dist/adapters/plugin-loader.js +12 -1
  7. package/dist/adapters/plugin-loader.js.map +1 -1
  8. package/dist/adapters/plugin-loader.test.d.ts +2 -0
  9. package/dist/adapters/plugin-loader.test.d.ts.map +1 -0
  10. package/dist/adapters/plugin-loader.test.js +37 -0
  11. package/dist/adapters/plugin-loader.test.js.map +1 -0
  12. package/dist/adapters/registry.d.ts.map +1 -1
  13. package/dist/adapters/registry.js +68 -5
  14. package/dist/adapters/registry.js.map +1 -1
  15. package/dist/adapters/registry.test.d.ts +2 -0
  16. package/dist/adapters/registry.test.d.ts.map +1 -0
  17. package/dist/adapters/registry.test.js +35 -0
  18. package/dist/adapters/registry.test.js.map +1 -0
  19. package/dist/app.d.ts.map +1 -1
  20. package/dist/app.js +5 -7
  21. package/dist/app.js.map +1 -1
  22. package/dist/auth/better-auth.d.ts +10 -0
  23. package/dist/auth/better-auth.d.ts.map +1 -1
  24. package/dist/auth/better-auth.js +47 -0
  25. package/dist/auth/better-auth.js.map +1 -1
  26. package/dist/auth/workspace-login-handoff-exchange.d.ts +75 -0
  27. package/dist/auth/workspace-login-handoff-exchange.d.ts.map +1 -0
  28. package/dist/auth/workspace-login-handoff-exchange.js +73 -0
  29. package/dist/auth/workspace-login-handoff-exchange.js.map +1 -0
  30. package/dist/auth/workspace-login-handoff-plugin.d.ts +40 -0
  31. package/dist/auth/workspace-login-handoff-plugin.d.ts.map +1 -0
  32. package/dist/auth/workspace-login-handoff-plugin.js +140 -0
  33. package/dist/auth/workspace-login-handoff-plugin.js.map +1 -0
  34. package/dist/auth/workspace-login-handoff.d.ts +189 -0
  35. package/dist/auth/workspace-login-handoff.d.ts.map +1 -0
  36. package/dist/auth/workspace-login-handoff.js +319 -0
  37. package/dist/auth/workspace-login-handoff.js.map +1 -0
  38. package/dist/build-info.json +3 -0
  39. package/dist/config.d.ts +1 -0
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +14 -0
  42. package/dist/config.js.map +1 -1
  43. package/dist/dev-runner-worktree.d.ts.map +1 -1
  44. package/dist/dev-runner-worktree.js +5 -0
  45. package/dist/dev-runner-worktree.js.map +1 -1
  46. package/dist/duplex-aggregate-ceiling-env.d.ts +21 -0
  47. package/dist/duplex-aggregate-ceiling-env.d.ts.map +1 -0
  48. package/dist/duplex-aggregate-ceiling-env.js +23 -0
  49. package/dist/duplex-aggregate-ceiling-env.js.map +1 -0
  50. package/dist/embedded-postgres-supervisor.d.ts +27 -0
  51. package/dist/embedded-postgres-supervisor.d.ts.map +1 -0
  52. package/dist/embedded-postgres-supervisor.js +72 -0
  53. package/dist/embedded-postgres-supervisor.js.map +1 -0
  54. package/dist/errors.d.ts +2 -0
  55. package/dist/errors.d.ts.map +1 -1
  56. package/dist/errors.js +6 -0
  57. package/dist/errors.js.map +1 -1
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +115 -7
  60. package/dist/index.js.map +1 -1
  61. package/dist/instrumentation.d.ts +33 -0
  62. package/dist/instrumentation.d.ts.map +1 -1
  63. package/dist/instrumentation.js +68 -1
  64. package/dist/instrumentation.js.map +1 -1
  65. package/dist/middleware/auth.d.ts.map +1 -1
  66. package/dist/middleware/auth.js +35 -10
  67. package/dist/middleware/auth.js.map +1 -1
  68. package/dist/middleware/error-handler.d.ts.map +1 -1
  69. package/dist/middleware/error-handler.js +8 -1
  70. package/dist/middleware/error-handler.js.map +1 -1
  71. package/dist/middleware/logger.d.ts.map +1 -1
  72. package/dist/middleware/logger.js +5 -2
  73. package/dist/middleware/logger.js.map +1 -1
  74. package/dist/middleware/redact-sensitive.d.ts.map +1 -1
  75. package/dist/middleware/redact-sensitive.js +4 -0
  76. package/dist/middleware/redact-sensitive.js.map +1 -1
  77. package/dist/middleware/validate.d.ts +3 -1
  78. package/dist/middleware/validate.d.ts.map +1 -1
  79. package/dist/middleware/validate.js +37 -0
  80. package/dist/middleware/validate.js.map +1 -1
  81. package/dist/routes/access.d.ts.map +1 -1
  82. package/dist/routes/access.js +20 -0
  83. package/dist/routes/access.js.map +1 -1
  84. package/dist/routes/activity.js +4 -4
  85. package/dist/routes/activity.js.map +1 -1
  86. package/dist/routes/adapter-login-route-spine.d.ts +81 -0
  87. package/dist/routes/adapter-login-route-spine.d.ts.map +1 -0
  88. package/dist/routes/adapter-login-route-spine.js +40 -0
  89. package/dist/routes/adapter-login-route-spine.js.map +1 -0
  90. package/dist/routes/adapters.d.ts +33 -0
  91. package/dist/routes/adapters.d.ts.map +1 -1
  92. package/dist/routes/adapters.js +35 -1
  93. package/dist/routes/adapters.js.map +1 -1
  94. package/dist/routes/adapters.test.d.ts +2 -0
  95. package/dist/routes/adapters.test.d.ts.map +1 -0
  96. package/dist/routes/adapters.test.js +58 -0
  97. package/dist/routes/adapters.test.js.map +1 -0
  98. package/dist/routes/agents.d.ts.map +1 -1
  99. package/dist/routes/agents.js +281 -91
  100. package/dist/routes/agents.js.map +1 -1
  101. package/dist/routes/cases.d.ts +11 -22
  102. package/dist/routes/cases.d.ts.map +1 -1
  103. package/dist/routes/cases.js +13 -13
  104. package/dist/routes/companies.js +3 -3
  105. package/dist/routes/decision-training.js +6 -6
  106. package/dist/routes/decisions.js +4 -4
  107. package/dist/routes/decisions.js.map +1 -1
  108. package/dist/routes/environments.d.ts.map +1 -1
  109. package/dist/routes/environments.js +79 -6
  110. package/dist/routes/environments.js.map +1 -1
  111. package/dist/routes/execution-workspaces.d.ts.map +1 -1
  112. package/dist/routes/execution-workspaces.js +384 -16
  113. package/dist/routes/execution-workspaces.js.map +1 -1
  114. package/dist/routes/file-resources.js +2 -2
  115. package/dist/routes/health.d.ts.map +1 -1
  116. package/dist/routes/health.js +58 -4
  117. package/dist/routes/health.js.map +1 -1
  118. package/dist/routes/instance-settings.d.ts.map +1 -1
  119. package/dist/routes/instance-settings.js +40 -0
  120. package/dist/routes/instance-settings.js.map +1 -1
  121. package/dist/routes/issues.d.ts +10 -0
  122. package/dist/routes/issues.d.ts.map +1 -1
  123. package/dist/routes/issues.js +495 -65
  124. package/dist/routes/issues.js.map +1 -1
  125. package/dist/routes/openapi.d.ts.map +1 -1
  126. package/dist/routes/openapi.js +241 -122
  127. package/dist/routes/openapi.js.map +1 -1
  128. package/dist/routes/pipelines.js +19 -19
  129. package/dist/routes/plugins.d.ts.map +1 -1
  130. package/dist/routes/plugins.js +22 -0
  131. package/dist/routes/plugins.js.map +1 -1
  132. package/dist/routes/projects.d.ts.map +1 -1
  133. package/dist/routes/projects.js +2 -0
  134. package/dist/routes/projects.js.map +1 -1
  135. package/dist/routes/routines.js +2 -2
  136. package/dist/routes/routines.js.map +1 -1
  137. package/dist/routes/secrets.d.ts +1 -1
  138. package/dist/routes/secrets.d.ts.map +1 -1
  139. package/dist/routes/secrets.js +39 -50
  140. package/dist/routes/secrets.js.map +1 -1
  141. package/dist/routes/setup-token-route.test.js +50 -3
  142. package/dist/routes/setup-token-route.test.js.map +1 -1
  143. package/dist/services/adapter-login-lease.d.ts +50 -0
  144. package/dist/services/adapter-login-lease.d.ts.map +1 -0
  145. package/dist/services/adapter-login-lease.js +26 -0
  146. package/dist/services/adapter-login-lease.js.map +1 -0
  147. package/dist/services/adapter-login-lease.test.d.ts +2 -0
  148. package/dist/services/adapter-login-lease.test.d.ts.map +1 -0
  149. package/dist/services/adapter-login-lease.test.js +68 -0
  150. package/dist/services/adapter-login-lease.test.js.map +1 -0
  151. package/dist/services/agent-action-audit.js +1 -1
  152. package/dist/services/agent-secret-bindings.d.ts +15 -0
  153. package/dist/services/agent-secret-bindings.d.ts.map +1 -1
  154. package/dist/services/agent-secret-bindings.js +2 -2
  155. package/dist/services/agent-secret-bindings.js.map +1 -1
  156. package/dist/services/agents.d.ts +13 -13
  157. package/dist/services/agents.d.ts.map +1 -1
  158. package/dist/services/agents.js +46 -5
  159. package/dist/services/agents.js.map +1 -1
  160. package/dist/services/artifact-review-documents.d.ts +34 -0
  161. package/dist/services/artifact-review-documents.d.ts.map +1 -0
  162. package/dist/services/artifact-review-documents.js +196 -0
  163. package/dist/services/artifact-review-documents.js.map +1 -0
  164. package/dist/services/assets.d.ts +1 -1
  165. package/dist/services/codex-device-login-credential-read.d.ts +58 -0
  166. package/dist/services/codex-device-login-credential-read.d.ts.map +1 -0
  167. package/dist/services/codex-device-login-credential-read.js +118 -0
  168. package/dist/services/codex-device-login-credential-read.js.map +1 -0
  169. package/dist/services/codex-device-login-reaper.d.ts.map +1 -1
  170. package/dist/services/codex-device-login-reaper.js +8 -5
  171. package/dist/services/codex-device-login-reaper.js.map +1 -1
  172. package/dist/services/codex-device-login-service.d.ts +127 -36
  173. package/dist/services/codex-device-login-service.d.ts.map +1 -1
  174. package/dist/services/codex-device-login-service.js +204 -84
  175. package/dist/services/codex-device-login-service.js.map +1 -1
  176. package/dist/services/company-portability.d.ts +3 -1
  177. package/dist/services/company-portability.d.ts.map +1 -1
  178. package/dist/services/company-portability.js +76 -20
  179. package/dist/services/company-portability.js.map +1 -1
  180. package/dist/services/company-skill-policy.d.ts +1 -1
  181. package/dist/services/costs.d.ts +1 -1
  182. package/dist/services/decisions.d.ts +6 -6
  183. package/dist/services/duplex-observability-recorder.d.ts +62 -0
  184. package/dist/services/duplex-observability-recorder.d.ts.map +1 -0
  185. package/dist/services/duplex-observability-recorder.js +54 -0
  186. package/dist/services/duplex-observability-recorder.js.map +1 -0
  187. package/dist/services/environment-config.js +5 -5
  188. package/dist/services/environment-config.js.map +1 -1
  189. package/dist/services/environment-custom-image-runtime.d.ts +116 -0
  190. package/dist/services/environment-custom-image-runtime.d.ts.map +1 -1
  191. package/dist/services/environment-custom-image-runtime.js +255 -1
  192. package/dist/services/environment-custom-image-runtime.js.map +1 -1
  193. package/dist/services/environment-custom-images.d.ts +39 -0
  194. package/dist/services/environment-custom-images.d.ts.map +1 -1
  195. package/dist/services/environment-custom-images.js +219 -17
  196. package/dist/services/environment-custom-images.js.map +1 -1
  197. package/dist/services/environment-driver-traits.d.ts +109 -0
  198. package/dist/services/environment-driver-traits.d.ts.map +1 -0
  199. package/dist/services/environment-driver-traits.js +102 -0
  200. package/dist/services/environment-driver-traits.js.map +1 -0
  201. package/dist/services/environment-execution-target.d.ts +4 -0
  202. package/dist/services/environment-execution-target.d.ts.map +1 -1
  203. package/dist/services/environment-execution-target.js +63 -7
  204. package/dist/services/environment-execution-target.js.map +1 -1
  205. package/dist/services/environment-run-orchestrator.d.ts +27 -1
  206. package/dist/services/environment-run-orchestrator.d.ts.map +1 -1
  207. package/dist/services/environment-run-orchestrator.js +24 -4
  208. package/dist/services/environment-run-orchestrator.js.map +1 -1
  209. package/dist/services/environment-runtime.d.ts +118 -20
  210. package/dist/services/environment-runtime.d.ts.map +1 -1
  211. package/dist/services/environment-runtime.js +436 -91
  212. package/dist/services/environment-runtime.js.map +1 -1
  213. package/dist/services/environments.d.ts.map +1 -1
  214. package/dist/services/environments.js +20 -2
  215. package/dist/services/environments.js.map +1 -1
  216. package/dist/services/execution-workspace-branch-ownership.d.ts +4 -0
  217. package/dist/services/execution-workspace-branch-ownership.d.ts.map +1 -0
  218. package/dist/services/execution-workspace-branch-ownership.js +9 -0
  219. package/dist/services/execution-workspace-branch-ownership.js.map +1 -0
  220. package/dist/services/execution-workspace-policy.d.ts.map +1 -1
  221. package/dist/services/execution-workspace-policy.js +3 -0
  222. package/dist/services/execution-workspace-policy.js.map +1 -1
  223. package/dist/services/execution-workspaces.d.ts +2 -0
  224. package/dist/services/execution-workspaces.d.ts.map +1 -1
  225. package/dist/services/execution-workspaces.js +90 -2
  226. package/dist/services/execution-workspaces.js.map +1 -1
  227. package/dist/services/external-objects.d.ts +19 -19
  228. package/dist/services/finance.d.ts +1 -1
  229. package/dist/services/goals.d.ts +2 -2
  230. package/dist/services/heartbeat-policy.d.ts +3 -0
  231. package/dist/services/heartbeat-policy.d.ts.map +1 -0
  232. package/dist/services/heartbeat-policy.js +10 -0
  233. package/dist/services/heartbeat-policy.js.map +1 -0
  234. package/dist/services/heartbeat-run-runtime-status.test.js +1 -1
  235. package/dist/services/heartbeat-run-runtime-status.test.js.map +1 -1
  236. package/dist/services/heartbeat.d.ts +23 -1
  237. package/dist/services/heartbeat.d.ts.map +1 -1
  238. package/dist/services/heartbeat.js +192 -11
  239. package/dist/services/heartbeat.js.map +1 -1
  240. package/dist/services/index.d.ts +1 -0
  241. package/dist/services/index.d.ts.map +1 -1
  242. package/dist/services/index.js +1 -0
  243. package/dist/services/index.js.map +1 -1
  244. package/dist/services/instance-settings.d.ts.map +1 -1
  245. package/dist/services/instance-settings.js +2 -0
  246. package/dist/services/instance-settings.js.map +1 -1
  247. package/dist/services/issue-dependency-wakeups.d.ts +57 -9
  248. package/dist/services/issue-dependency-wakeups.d.ts.map +1 -1
  249. package/dist/services/issue-dependency-wakeups.js +146 -14
  250. package/dist/services/issue-dependency-wakeups.js.map +1 -1
  251. package/dist/services/issue-dependency-wakeups.test.d.ts +2 -0
  252. package/dist/services/issue-dependency-wakeups.test.d.ts.map +1 -0
  253. package/dist/services/issue-dependency-wakeups.test.js +183 -0
  254. package/dist/services/issue-dependency-wakeups.test.js.map +1 -0
  255. package/dist/services/issue-recovery-actions.d.ts +6 -1
  256. package/dist/services/issue-recovery-actions.d.ts.map +1 -1
  257. package/dist/services/issue-recovery-actions.js +123 -44
  258. package/dist/services/issue-recovery-actions.js.map +1 -1
  259. package/dist/services/issue-thread-interactions.d.ts +8 -0
  260. package/dist/services/issue-thread-interactions.d.ts.map +1 -1
  261. package/dist/services/issue-thread-interactions.js +220 -10
  262. package/dist/services/issue-thread-interactions.js.map +1 -1
  263. package/dist/services/issues.d.ts +8 -7
  264. package/dist/services/issues.d.ts.map +1 -1
  265. package/dist/services/issues.js +84 -12
  266. package/dist/services/issues.js.map +1 -1
  267. package/dist/services/local-service-supervisor.d.ts +61 -1
  268. package/dist/services/local-service-supervisor.d.ts.map +1 -1
  269. package/dist/services/local-service-supervisor.js +221 -25
  270. package/dist/services/local-service-supervisor.js.map +1 -1
  271. package/dist/services/login-command.d.ts +46 -0
  272. package/dist/services/login-command.d.ts.map +1 -0
  273. package/dist/services/login-command.js +87 -0
  274. package/dist/services/login-command.js.map +1 -0
  275. package/dist/services/login-command.test.d.ts +2 -0
  276. package/dist/services/login-command.test.d.ts.map +1 -0
  277. package/dist/services/login-command.test.js +71 -0
  278. package/dist/services/login-command.test.js.map +1 -0
  279. package/dist/services/managed-workspace-identity.d.ts +140 -0
  280. package/dist/services/managed-workspace-identity.d.ts.map +1 -0
  281. package/dist/services/managed-workspace-identity.js +277 -0
  282. package/dist/services/managed-workspace-identity.js.map +1 -0
  283. package/dist/services/plugin-environment-driver.d.ts +15 -1
  284. package/dist/services/plugin-environment-driver.d.ts.map +1 -1
  285. package/dist/services/plugin-environment-driver.js +23 -1
  286. package/dist/services/plugin-environment-driver.js.map +1 -1
  287. package/dist/services/plugin-host-services.d.ts +3 -2
  288. package/dist/services/plugin-host-services.d.ts.map +1 -1
  289. package/dist/services/plugin-host-services.js +11 -2
  290. package/dist/services/plugin-host-services.js.map +1 -1
  291. package/dist/services/plugin-loader.d.ts.map +1 -1
  292. package/dist/services/plugin-loader.js +39 -8
  293. package/dist/services/plugin-loader.js.map +1 -1
  294. package/dist/services/plugin-managed-agents.d.ts.map +1 -1
  295. package/dist/services/plugin-managed-agents.js +50 -5
  296. package/dist/services/plugin-managed-agents.js.map +1 -1
  297. package/dist/services/plugin-manifest-validator.d.ts.map +1 -1
  298. package/dist/services/plugin-manifest-validator.js +5 -2
  299. package/dist/services/plugin-manifest-validator.js.map +1 -1
  300. package/dist/services/plugin-registry.d.ts +5 -5
  301. package/dist/services/plugin-worker-manager.d.ts +158 -11
  302. package/dist/services/plugin-worker-manager.d.ts.map +1 -1
  303. package/dist/services/plugin-worker-manager.js +1139 -79
  304. package/dist/services/plugin-worker-manager.js.map +1 -1
  305. package/dist/services/projects.d.ts +1 -1
  306. package/dist/services/recovery/disposition-repair.d.ts +24 -0
  307. package/dist/services/recovery/disposition-repair.d.ts.map +1 -0
  308. package/dist/services/recovery/disposition-repair.js +125 -0
  309. package/dist/services/recovery/disposition-repair.js.map +1 -0
  310. package/dist/services/recovery/service.d.ts +6 -6
  311. package/dist/services/recovery/service.d.ts.map +1 -1
  312. package/dist/services/recovery/service.js +856 -384
  313. package/dist/services/recovery/service.js.map +1 -1
  314. package/dist/services/recovery/stranded-notice.js +4 -4
  315. package/dist/services/recovery/stranded-notice.js.map +1 -1
  316. package/dist/services/recovery/stranded-notice.test.js +1 -1
  317. package/dist/services/recovery/stranded-notice.test.js.map +1 -1
  318. package/dist/services/recovery/successful-run-handoff.d.ts +1 -1
  319. package/dist/services/recovery/successful-run-handoff.d.ts.map +1 -1
  320. package/dist/services/recovery/successful-run-handoff.js +6 -4
  321. package/dist/services/recovery/successful-run-handoff.js.map +1 -1
  322. package/dist/services/recovery/successful-run-handoff.test.js +1 -1
  323. package/dist/services/recovery/successful-run-handoff.test.js.map +1 -1
  324. package/dist/services/recovery-observability.d.ts +1 -1
  325. package/dist/services/recovery-observability.d.ts.map +1 -1
  326. package/dist/services/recovery-observability.js +4 -1
  327. package/dist/services/recovery-observability.js.map +1 -1
  328. package/dist/services/routines.d.ts.map +1 -1
  329. package/dist/services/routines.js +86 -1
  330. package/dist/services/routines.js.map +1 -1
  331. package/dist/services/runtime-exposure/loopback-listener.js +1 -1
  332. package/dist/services/runtime-exposure/loopback-listener.js.map +1 -1
  333. package/dist/services/runtime-exposure/loopback-listener.test.js +1 -1
  334. package/dist/services/runtime-exposure/loopback-listener.test.js.map +1 -1
  335. package/dist/services/scripts/codex-auth-read.cjs +93 -0
  336. package/dist/services/secret-proposal-authorization.d.ts +15 -0
  337. package/dist/services/secret-proposal-authorization.d.ts.map +1 -0
  338. package/dist/services/secret-proposal-authorization.js +29 -0
  339. package/dist/services/secret-proposal-authorization.js.map +1 -0
  340. package/dist/services/secret-proposal-notifications.d.ts +18 -0
  341. package/dist/services/secret-proposal-notifications.d.ts.map +1 -0
  342. package/dist/services/secret-proposal-notifications.js +37 -0
  343. package/dist/services/secret-proposal-notifications.js.map +1 -0
  344. package/dist/services/secret-proposals.d.ts +20 -10
  345. package/dist/services/secret-proposals.d.ts.map +1 -1
  346. package/dist/services/secret-proposals.js +205 -14
  347. package/dist/services/secret-proposals.js.map +1 -1
  348. package/dist/services/secrets.d.ts +3 -3
  349. package/dist/services/settings-visibility.d.ts +17 -0
  350. package/dist/services/settings-visibility.d.ts.map +1 -0
  351. package/dist/services/settings-visibility.js +29 -0
  352. package/dist/services/settings-visibility.js.map +1 -0
  353. package/dist/services/setup-token-reaper.d.ts +36 -0
  354. package/dist/services/setup-token-reaper.d.ts.map +1 -0
  355. package/dist/services/setup-token-reaper.js +38 -0
  356. package/dist/services/setup-token-reaper.js.map +1 -0
  357. package/dist/services/setup-token-reaper.test.d.ts +2 -0
  358. package/dist/services/setup-token-reaper.test.d.ts.map +1 -0
  359. package/dist/services/setup-token-reaper.test.js +123 -0
  360. package/dist/services/setup-token-reaper.test.js.map +1 -0
  361. package/dist/services/setup-token-session.d.ts +57 -45
  362. package/dist/services/setup-token-session.d.ts.map +1 -1
  363. package/dist/services/setup-token-session.js +118 -110
  364. package/dist/services/setup-token-session.js.map +1 -1
  365. package/dist/services/setup-token-session.test.js +88 -47
  366. package/dist/services/setup-token-session.test.js.map +1 -1
  367. package/dist/services/setup-token-transport-binding.d.ts +20 -12
  368. package/dist/services/setup-token-transport-binding.d.ts.map +1 -1
  369. package/dist/services/setup-token-transport-binding.js +59 -32
  370. package/dist/services/setup-token-transport-binding.js.map +1 -1
  371. package/dist/services/setup-token-transport-binding.test.js +50 -17
  372. package/dist/services/setup-token-transport-binding.test.js.map +1 -1
  373. package/dist/services/smoke-lab.d.ts +1 -1
  374. package/dist/services/stalled-review-decisions.d.ts +1 -1
  375. package/dist/services/status-cards.d.ts +168 -168
  376. package/dist/services/tool-access-policy.d.ts +2 -2
  377. package/dist/services/tool-gateway.d.ts +1 -1
  378. package/dist/services/work-products.d.ts +19 -0
  379. package/dist/services/work-products.d.ts.map +1 -1
  380. package/dist/services/work-products.js +50 -3
  381. package/dist/services/work-products.js.map +1 -1
  382. package/dist/services/workspace-git-operation-scheduler.test.js +10 -3
  383. package/dist/services/workspace-git-operation-scheduler.test.js.map +1 -1
  384. package/dist/services/workspace-instance-cleanup.d.ts +9 -0
  385. package/dist/services/workspace-instance-cleanup.d.ts.map +1 -1
  386. package/dist/services/workspace-instance-cleanup.js +29 -3
  387. package/dist/services/workspace-instance-cleanup.js.map +1 -1
  388. package/dist/services/workspace-login-handoff-issuer.d.ts +95 -0
  389. package/dist/services/workspace-login-handoff-issuer.d.ts.map +1 -0
  390. package/dist/services/workspace-login-handoff-issuer.js +147 -0
  391. package/dist/services/workspace-login-handoff-issuer.js.map +1 -0
  392. package/dist/services/workspace-operations.d.ts +4 -1
  393. package/dist/services/workspace-operations.d.ts.map +1 -1
  394. package/dist/services/workspace-operations.js +29 -15
  395. package/dist/services/workspace-operations.js.map +1 -1
  396. package/dist/services/workspace-readiness.d.ts +56 -0
  397. package/dist/services/workspace-readiness.d.ts.map +1 -0
  398. package/dist/services/workspace-readiness.js +250 -0
  399. package/dist/services/workspace-readiness.js.map +1 -0
  400. package/dist/services/workspace-realization.d.ts.map +1 -1
  401. package/dist/services/workspace-realization.js +5 -33
  402. package/dist/services/workspace-realization.js.map +1 -1
  403. package/dist/services/workspace-runtime-exposure.test.js +321 -12
  404. package/dist/services/workspace-runtime-exposure.test.js.map +1 -1
  405. package/dist/services/workspace-runtime-leases.d.ts.map +1 -1
  406. package/dist/services/workspace-runtime-leases.js +1 -1
  407. package/dist/services/workspace-runtime-leases.js.map +1 -1
  408. package/dist/services/workspace-runtime-read-model.d.ts +8 -8
  409. package/dist/services/workspace-runtime-read-model.test.js +20 -0
  410. package/dist/services/workspace-runtime-read-model.test.js.map +1 -1
  411. package/dist/services/workspace-runtime-ready-comment.test.js +1 -0
  412. package/dist/services/workspace-runtime-ready-comment.test.js.map +1 -1
  413. package/dist/services/workspace-runtime.d.ts +77 -4
  414. package/dist/services/workspace-runtime.d.ts.map +1 -1
  415. package/dist/services/workspace-runtime.js +1020 -126
  416. package/dist/services/workspace-runtime.js.map +1 -1
  417. package/dist/worktree-config.d.ts.map +1 -1
  418. package/dist/worktree-config.js +3 -76
  419. package/dist/worktree-config.js.map +1 -1
  420. package/dist/worktree-seed-manifest.d.ts +8 -0
  421. package/dist/worktree-seed-manifest.d.ts.map +1 -0
  422. package/dist/worktree-seed-manifest.js +47 -0
  423. package/dist/worktree-seed-manifest.js.map +1 -0
  424. package/package.json +34 -30
  425. package/skills/paperclip/SKILL.md +2 -0
  426. package/skills/paperclip/references/api-reference.md +44 -2
  427. package/ui-dist/assets/CompanyExport-DnEsO-St.js +4 -0
  428. package/ui-dist/assets/{abnfDiagram-N423BO3Z-BvgoV-u5.js → abnfDiagram-N423BO3Z-2ff8TsQ0.js} +1 -1
  429. package/ui-dist/assets/{arc-BInnUBUU.js → arc-B2AXsH34.js} +1 -1
  430. package/ui-dist/assets/architectureDiagram-T3A2C74G-BDxtKMxk.js +36 -0
  431. package/ui-dist/assets/{blockDiagram-VBNYF7ZC-D9kzAkLN.js → blockDiagram-VBNYF7ZC-BB8T5Mj5.js} +1 -1
  432. package/ui-dist/assets/{c4Diagram-5PPSVZJV-BwzsgV_0.js → c4Diagram-5PPSVZJV-lMo8qk-x.js} +1 -1
  433. package/ui-dist/assets/channel-DCTVZpyq.js +1 -0
  434. package/ui-dist/assets/{chunk-2GRJ4B5K-D2EQ9vrl.js → chunk-2GRJ4B5K-CsS7EB3G.js} +1 -1
  435. package/ui-dist/assets/{chunk-2Q5K7J3B-DOA_8fSd.js → chunk-2Q5K7J3B-DFyQPjoR.js} +1 -1
  436. package/ui-dist/assets/{chunk-5RXB4S5H-CT5ukRiT.js → chunk-5RXB4S5H-No2SHOQR.js} +1 -1
  437. package/ui-dist/assets/{chunk-5VM5RSS4-D2gOlkyB.js → chunk-5VM5RSS4-DdxQO7V9.js} +1 -1
  438. package/ui-dist/assets/{chunk-6Q2QTUOP-DUb6aG8c.js → chunk-6Q2QTUOP-gbHjh-aK.js} +1 -1
  439. package/ui-dist/assets/{chunk-GF5L2VYU-BPabG3Cx.js → chunk-GF5L2VYU-h-BBl6NY.js} +1 -1
  440. package/ui-dist/assets/{chunk-JWPE2WC7-scNfhlZz.js → chunk-JWPE2WC7-Q3pJdTz5.js} +1 -1
  441. package/ui-dist/assets/{chunk-KBJHAD2P-BcRAzRpq.js → chunk-KBJHAD2P-Ba8LGLSx.js} +1 -1
  442. package/ui-dist/assets/{chunk-RYQCIY6F-BiZ0-EGh.js → chunk-RYQCIY6F-9VcvykBo.js} +1 -1
  443. package/ui-dist/assets/{chunk-XXDRQBXY-lJULxFIE.js → chunk-XXDRQBXY-NVbjDH4W.js} +1 -1
  444. package/ui-dist/assets/classDiagram-JCYQIIEL-CzJ88u6h.js +1 -0
  445. package/ui-dist/assets/classDiagram-v2-OCEON4UE-CzJ88u6h.js +1 -0
  446. package/ui-dist/assets/cose-bilkent-JH36ORCC-Cdz4wtUh.js +1 -0
  447. package/ui-dist/assets/{cynefin-VYW2F7L2-B34jJY1x.js → cynefin-VYW2F7L2-MpzJkW5s.js} +1 -1
  448. package/ui-dist/assets/{cynefinDiagram-MW4NZA55-DQ8QK8JK.js → cynefinDiagram-MW4NZA55-_Nx8av7i.js} +1 -1
  449. package/ui-dist/assets/{dagre-VZM6K2ZE-B7lSKgxH.js → dagre-VZM6K2ZE-DcZTQ4Oh.js} +1 -1
  450. package/ui-dist/assets/{diagram-7IWD3JNH-B3hLAFGE.js → diagram-7IWD3JNH-UyLi2mee.js} +1 -1
  451. package/ui-dist/assets/{diagram-B4RE2ZJO-CH9Ro9e0.js → diagram-B4RE2ZJO-B6p0Ivqg.js} +1 -1
  452. package/ui-dist/assets/{diagram-LBJQPF4R-DdPVMii7.js → diagram-LBJQPF4R-C8u6pa97.js} +1 -1
  453. package/ui-dist/assets/{diagram-Q27KOJAE-f5VXswjc.js → diagram-Q27KOJAE-DbwyagW0.js} +1 -1
  454. package/ui-dist/assets/{diagram-UB23O5K3-DGqxixsR.js → diagram-UB23O5K3-Cn5BMEH7.js} +1 -1
  455. package/ui-dist/assets/{ebnfDiagram-BXEA7PRR-C-1klg_w.js → ebnfDiagram-BXEA7PRR-vE0IZma9.js} +1 -1
  456. package/ui-dist/assets/{erDiagram-JOGREHBK-Dt4qK4gv.js → erDiagram-JOGREHBK-3OZVIlVG.js} +1 -1
  457. package/ui-dist/assets/{flowDiagram-UKHOOZJN-9ZlrTuET.js → flowDiagram-UKHOOZJN-C94FiPyr.js} +1 -1
  458. package/ui-dist/assets/ganttDiagram-PKOTCBZU-DMVaPmF-.js +292 -0
  459. package/ui-dist/assets/{gitGraphDiagram-DS77QQ5N-HH2fSgad.js → gitGraphDiagram-DS77QQ5N-yeFtJ689.js} +1 -1
  460. package/ui-dist/assets/{index-Cm6iEYPt.js → index-B4ZF3vY8.js} +288 -224
  461. package/ui-dist/assets/{index-CHXG4GPL.js → index-Bi_vqkcQ.js} +1 -1
  462. package/ui-dist/assets/{index-Bc9g6q63.js → index-BjDGQg9-.js} +1 -1
  463. package/ui-dist/assets/{index-FHzrJ7iQ.js → index-BnpyUMTb.js} +1 -1
  464. package/ui-dist/assets/{index-C1mpWCcn.js → index-BoqQTVMA.js} +1 -1
  465. package/ui-dist/assets/index-Bq-Mr-4x.js +1 -0
  466. package/ui-dist/assets/{index-DceuCrr8.js → index-Brb2U7N4.js} +1 -1
  467. package/ui-dist/assets/{index-DQIrrn2L.js → index-BsBybVwH.js} +1 -1
  468. package/ui-dist/assets/{index-CQhaM6qd.js → index-C2iv4Wgu.js} +1 -1
  469. package/ui-dist/assets/{index-DV2FOgyD.js → index-CKxIu7uO.js} +1 -1
  470. package/ui-dist/assets/{index-DU4U1fuv.js → index-Cb4VGIwp.js} +1 -1
  471. package/ui-dist/assets/{index-B61ORkIb.js → index-ChpszwcO.js} +1 -1
  472. package/ui-dist/assets/{index-DlVBBF8o.js → index-CoQFdT8N.js} +1 -1
  473. package/ui-dist/assets/index-D6P8_f0W.css +1 -0
  474. package/ui-dist/assets/index-DKdmghUG.js +1 -0
  475. package/ui-dist/assets/{index-CVTL3aAL.js → index-DaBci7Bx.js} +1 -1
  476. package/ui-dist/assets/{index-diFs0CNC.js → index-DjYaNiXZ.js} +1 -1
  477. package/ui-dist/assets/{index-Bf7tyGxE.js → index-DxTBJl4h.js} +1 -1
  478. package/ui-dist/assets/{index-DsdVneqe.js → index-Dz3E8nn0.js} +1 -1
  479. package/ui-dist/assets/{index-DvFUXI-Q.js → index-J7dz_hap.js} +1 -1
  480. package/ui-dist/assets/{index-CLu3Tfpv.js → index-JMp2Gpnz.js} +1 -1
  481. package/ui-dist/assets/{index-CcRTJ93J.js → index-Kp6wavQt.js} +1 -1
  482. package/ui-dist/assets/{index-BvFx-4KW.js → index-LBhYZ0L4.js} +1 -1
  483. package/ui-dist/assets/{index-BbAhzCq8.js → index-c3C0P6l8.js} +4 -4
  484. package/ui-dist/assets/{index-BY5ITKmG.js → index-pBEPheTW.js} +1 -1
  485. package/ui-dist/assets/{infoDiagram-6WML65LV-2jai2fw-.js → infoDiagram-6WML65LV-BiL7jKLA.js} +1 -1
  486. package/ui-dist/assets/{ishikawaDiagram-WSZJBQD7-CUmGhmEb.js → ishikawaDiagram-WSZJBQD7-DYcQy41D.js} +1 -1
  487. package/ui-dist/assets/{journeyDiagram-NVQOT4AX-CGQuPDO1.js → journeyDiagram-NVQOT4AX-Bxva6JgA.js} +1 -1
  488. package/ui-dist/assets/{kanban-definition-27J2QSJJ-zgEPcbHl.js → kanban-definition-27J2QSJJ-B2HpN34Q.js} +1 -1
  489. package/ui-dist/assets/{linear-BVf5VtLS.js → linear-Dq8qSESw.js} +1 -1
  490. package/ui-dist/assets/{mermaid.core-D2TFkGfI.js → mermaid.core-Ikay8Cpl.js} +35 -35
  491. package/ui-dist/assets/{mindmap-definition-FAOFIHXS-xoAQ0Lb_.js → mindmap-definition-FAOFIHXS-C-SIdYSY.js} +1 -1
  492. package/ui-dist/assets/{pegDiagram-VL7TDLO6-CBR1PWLr.js → pegDiagram-VL7TDLO6-C7rIJ_13.js} +1 -1
  493. package/ui-dist/assets/{pieDiagram-7S7Q4E2Y-BMPnzK_e.js → pieDiagram-7S7Q4E2Y-3gx0a0ve.js} +1 -1
  494. package/ui-dist/assets/{quadrantDiagram-CIZ2JOQS-CPtVUPkR.js → quadrantDiagram-CIZ2JOQS-BiwM9QGv.js} +1 -1
  495. package/ui-dist/assets/{railroadDiagram-AXF67PYL-DC0lsZV1.js → railroadDiagram-AXF67PYL-rFS8XcFA.js} +1 -1
  496. package/ui-dist/assets/{requirementDiagram-LRYGKXZP-BF6k05SB.js → requirementDiagram-LRYGKXZP-CEAUDUTQ.js} +1 -1
  497. package/ui-dist/assets/{sankeyDiagram-W5VNT64P-CRN0ibiP.js → sankeyDiagram-W5VNT64P-B7anpjlM.js} +1 -1
  498. package/ui-dist/assets/{sequenceDiagram-SI44F4Z6-CQtTiPWm.js → sequenceDiagram-SI44F4Z6-CJEdJvm_.js} +1 -1
  499. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-BdjuGZd1.js → sizeCapture-X5ZJPWSS-CU1Vm6c1.js} +1 -1
  500. package/ui-dist/assets/{stateDiagram-OKZ733FA-B99onxyh.js → stateDiagram-OKZ733FA-wxVV9WIi.js} +1 -1
  501. package/ui-dist/assets/stateDiagram-v2-UEYNNEHI-BIFLqlqR.js +1 -0
  502. package/ui-dist/assets/{swimlanes-SLNWSIFB-BIByPbrL.js → swimlanes-SLNWSIFB-Cd-C1Z_k.js} +2 -2
  503. package/ui-dist/assets/swimlanesDiagram-ULZ7WXOC-CoBROkkd.js +8 -0
  504. package/ui-dist/assets/{timeline-definition-Z64GVDOM-I1NgOcn9.js → timeline-definition-Z64GVDOM-SWngk4aR.js} +1 -1
  505. package/ui-dist/assets/{vennDiagram-T6HMQDX7-D6t2Njcl.js → vennDiagram-T6HMQDX7-DFdPUr36.js} +1 -1
  506. package/ui-dist/assets/{wardleyDiagram-T6FBY63Y-BiYKm9gh.js → wardleyDiagram-T6FBY63Y-C6IlrZ7t.js} +1 -1
  507. package/ui-dist/assets/{xychartDiagram-ELKLHX3M-BhwXKWIa.js → xychartDiagram-ELKLHX3M-BNm6hHGl.js} +1 -1
  508. package/ui-dist/index.html +2 -2
  509. package/ui-dist/assets/architectureDiagram-T3A2C74G-Dg4MziOm.js +0 -36
  510. package/ui-dist/assets/channel-qoSYbCn0.js +0 -1
  511. package/ui-dist/assets/classDiagram-JCYQIIEL-B24u1REs.js +0 -1
  512. package/ui-dist/assets/classDiagram-v2-OCEON4UE-B24u1REs.js +0 -1
  513. package/ui-dist/assets/cose-bilkent-JH36ORCC-Do8pe8JB.js +0 -1
  514. package/ui-dist/assets/ganttDiagram-PKOTCBZU-CE3lyvFq.js +0 -292
  515. package/ui-dist/assets/index-BHiUiToL.css +0 -1
  516. package/ui-dist/assets/index-hkanj4t6.js +0 -1
  517. package/ui-dist/assets/index-yRJnh4vx.js +0 -1
  518. package/ui-dist/assets/stateDiagram-v2-UEYNNEHI-bzFlYBZ1.js +0 -1
  519. package/ui-dist/assets/swimlanesDiagram-ULZ7WXOC-DgdkBnuK.js +0 -8
@@ -4,10 +4,12 @@ import { execFile as execFileCallback } from "node:child_process";
4
4
  import { promisify } from "node:util";
5
5
  import { createHash, randomUUID } from "node:crypto";
6
6
  import { and, asc, desc, eq, getTableColumns, gt, gte, inArray, isNull, lt, lte, ne, notInArray, or, sql } from "drizzle-orm";
7
- import { AGENT_DEFAULT_MAX_CONCURRENT_RUNS, ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY, MODEL_PROFILE_KEYS, PROVIDER_QUOTA_MONITOR_SERVICE_NAME, envBindingSchema, } from "@paperclipai/shared";
7
+ import { AGENT_DEFAULT_MAX_CONCURRENT_RUNS, ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY, ISSUE_DISPOSITION_REPAIR_RETRY_REASON, MODEL_PROFILE_KEYS, PROVIDER_QUOTA_MONITOR_SERVICE_NAME, envBindingSchema, } from "@paperclipai/shared";
8
8
  import { agents, agentConfigRevisions, agentRuntimeState, agentTaskSessions, agentWakeupRequests, activityLog, approvals, companyMemberships, companySkillTestRuns, companySkillVersions, companySkills as companySkillsTable, companies, costEvents, documentAnnotationComments, documentAnnotationThreads, documentRevisions, environmentLeases, issueDocuments, executionWorkspaces, heartbeatRunEvents, heartbeatRuns, issueApprovals, issueComments, issuePlanDecompositions, issueRecoveryActions, issueRelations, issueThreadInteractions, issues, issueWorkProducts, projects, projectWorkspaces, routineRevisions, routineRuns, routines, toolMcpGateways, toolMcpGatewayTokens, toolConnections, toolProfiles, workspaceOperations, } from "@paperclipai/db";
9
9
  import { conflict, HttpError, notFound } from "../errors.js";
10
- import { getStartupTraceContext } from "../instrumentation.js";
10
+ import { getStartupTraceContext, getStartupTracer } from "../instrumentation.js";
11
+ import { createHostDuplexObservabilityRecorder } from "./duplex-observability-recorder.js";
12
+ import { incrementToolRuntimeMetricCounter } from "./tool-runtime-metrics.js";
11
13
  import { logger } from "../middleware/logger.js";
12
14
  import { createGitRemoteAuthProvider, describeGitAuthFailure, scrubGitCredentialText, } from "./git-credentials.js";
13
15
  // Re-exported because heartbeat's workspace surface exposed the scrubber before the
@@ -31,10 +33,11 @@ import { buildHeartbeatRunStopMetadata, mergeHeartbeatRunStopMetadata, normalize
31
33
  import { classifyRunLiveness, } from "./run-liveness.js";
32
34
  import { ISSUE_NEW_INPUT_ACTIVITY_ACTIONS, ISSUE_PROGRESS_ACTIVITY_ACTIONS, ISSUE_REWAKE_LOOKBACK_MS, ISSUE_REWAKE_RUN_SAMPLE_LIMIT, evaluateIssueRewakeThrottle, isThrottleCandidateIssueRewake, } from "./issue-rewake-throttle.js";
33
35
  import { logActivity, publishPluginDomainEvent } from "./activity-log.js";
34
- import { buildWorkspaceReadyComment, buildWorkspaceReadyMetadata, buildWorkspaceReadyPresentation, cleanupExecutionWorkspaceArtifacts, ensureGitWorktreeBranchCoherent, ensurePersistedExecutionWorkspaceAvailable, ensureRuntimeServicesForRun, formatManagedGitWorktreeBranchInspection, inspectManagedGitWorktreeBranch, persistAdapterManagedRuntimeServices, realizeExecutionWorkspace, releaseRuntimeServicesForRun, sanitizeRuntimeServiceBaseEnv, } from "./workspace-runtime.js";
36
+ import { buildWorkspaceReadyComment, buildWorkspaceReadyMetadata, buildWorkspaceReadyPresentation, cleanupExecutionWorkspaceArtifacts, ensureGitWorktreeBranchCoherent, ensurePersistedExecutionWorkspaceAvailable, ensureRuntimeServicesForRun, formatManagedGitWorktreeBranchInspection, inspectManagedGitWorktreeBranch, persistAdapterManagedRuntimeServices, realizeExecutionWorkspace, releaseRuntimeServicesForRun, isUnresolvedWorkspaceBaseRefError, sanitizeRuntimeServiceBaseEnv, } from "./workspace-runtime.js";
35
37
  import { readManagedWorktreeInstanceOwnership, WORKTREE_INSTANCE_ROOT_METADATA_KEY, } from "./workspace-instance-cleanup.js";
36
38
  import { issueService } from "./issues.js";
37
39
  import { projectService } from "./projects.js";
40
+ import { getEnvironmentDriverTraits } from "./environment-driver-traits.js";
38
41
  import { authorizationService } from "./authorization.js";
39
42
  import { createToolGatewayService } from "./tool-gateway.js";
40
43
  import { toolAccessService } from "./tool-access.js";
@@ -45,6 +48,7 @@ import { ISSUE_TREE_CONTROL_INTERACTION_WAKE_REASONS, isVerifiedIssueTreeControl
45
48
  import { continuationSummaryParksExecutor, getIssueContinuationSummaryDocument, refreshIssueContinuationSummary, } from "./issue-continuation-summary.js";
46
49
  import { buildDocumentReviewContext, buildPlanReviewContext } from "./plan-review-context.js";
47
50
  import { executionWorkspaceService, mergeExecutionWorkspaceConfig } from "./execution-workspaces.js";
51
+ import { GIT_BRANCH_OWNERSHIP_METADATA_KEY, GIT_BRANCH_OWNERSHIP_METADATA_VERSION, isRuntimeOwnedGitBranch, } from "./execution-workspace-branch-ownership.js";
48
52
  import { workspaceOperationService } from "./workspace-operations.js";
49
53
  import { isProcessGroupAlive, terminateLocalService } from "./local-service-supervisor.js";
50
54
  import { HEARTBEAT_RUN_SCRATCH_MARKER, buildHeartbeatRunScratchEnv, cleanupHeartbeatRunScratch, prepareHeartbeatRunScratch, } from "./run-scratch.js";
@@ -56,12 +60,14 @@ import { isAutomaticRecoverySuppressedByPauseHold } from "./recovery/pause-hold-
56
60
  import { buildConfigurationIncompleteRecoveryNoticeSeed, buildExecutionReviewParticipantRecoveryNoticeSeed, buildImmediateExecutionPathRecoveryNoticeSeed, buildWorkspaceValidationRecoveryNoticeSeed, } from "./recovery/stranded-notice.js";
57
61
  import { recoveryAssigneeAdapterOverrides, withRecoveryModelProfileHint, } from "./recovery/model-profile-hint.js";
58
62
  import { ACTIVE_RUN_OUTPUT_SUSPICION_THRESHOLD_MS as RECOVERY_ACTIVE_RUN_OUTPUT_SUSPICION_THRESHOLD_MS, recoveryService } from "./recovery/service.js";
63
+ import { collectDispositionRepairSourceState } from "./recovery/disposition-repair.js";
59
64
  import { buildIssueReviewPathLostIdempotencyKey, decideIssueReviewPathRecovery, ISSUE_REVIEW_PATH_LOST_WAKE_REASON, isReviewPathRecoveryIdempotencyConflict, REVIEW_PATH_RECOVERY_INSTRUCTION, reviewPathConsumedRefFromRun, } from "./recovery/review-path-recovery.js";
60
65
  import { productivityReviewService } from "./productivity-review.js";
61
66
  import { resolveRequiredSuccessfulRunHandoffOnValidPath } from "./successful-run-handoff-state.js";
62
67
  import { taskWatchdogService } from "./task-watchdogs.js";
63
68
  import { withAgentStartLock } from "./agent-start-lock.js";
64
69
  import { evaluateAgentInvokability, evaluateAgentInvokabilityFromDb, shouldCancelRunsForNonInvokableAgent, DIRECT_NON_INVOKABLE_STATUSES, } from "./agent-invokability.js";
70
+ import { isHeartbeatWakeOnDemandEnabled } from "./heartbeat-policy.js";
65
71
  import { redactQuarantinedBodyForHigherTrust, sanitizeQuarantinedCommentForHigherTrust, } from "./source-trust.js";
66
72
  import { redactCurrentUserText, redactCurrentUserValue, } from "../log-redaction.js";
67
73
  import { redactEventPayload, redactSensitiveText } from "../redaction.js";
@@ -202,6 +208,14 @@ const WORKSPACE_VALIDATION_FAILURE_CODE = "workspace_validation_failed";
202
208
  const WORKSPACE_VALIDATION_RECOVERY_CAUSE = "workspace_validation_failed";
203
209
  const CONFIGURATION_INCOMPLETE_FAILURE_CODE = "configuration_incomplete";
204
210
  const CONFIGURATION_INCOMPLETE_RECOVERY_CAUSE = "configuration_incomplete";
211
+ // Error codes that mark a pre-dispatch setup failure. The adapter process never
212
+ // started, so no agent could post an issue comment. The setup catch writes one
213
+ // of these codes when a failure happens before `adapter.execute`.
214
+ const PRE_ADAPTER_SETUP_FAILURE_CODES = new Set([
215
+ "setup_failed",
216
+ CONFIGURATION_INCOMPLETE_FAILURE_CODE,
217
+ WORKSPACE_VALIDATION_FAILURE_CODE,
218
+ ]);
205
219
  const EXECUTION_REVIEW_PARTICIPANT_RECOVERY_RETRY_REASON = "execution_review_participant_recovery";
206
220
  const EXECUTION_REVIEW_PARTICIPANT_RECOVERY_WAKE_REASON = "execution_review_participant_recovery";
207
221
  const EXECUTION_REVIEW_PARTICIPANT_RECOVERY_CAUSE = "execution_review_participant_recovery";
@@ -216,6 +230,7 @@ const GIT_SENSITIVE_LOCAL_ADAPTER_TYPES = new Set([
216
230
  "gemini_local",
217
231
  "grok_local",
218
232
  "hermes_local",
233
+ "kimi_local",
219
234
  "opencode_local",
220
235
  "pi_local",
221
236
  ]);
@@ -268,6 +283,31 @@ export class ConfigurationIncompleteFailure extends Error {
268
283
  this.resultJson = resultJson;
269
284
  }
270
285
  }
286
+ // Build the configuration-incomplete result payload for a workspace base ref
287
+ // that never resolved to a commit. The setup catch maps this to errorCode
288
+ // `configuration_incomplete`, so the recovery path routes it to a human owner
289
+ // instead of a dispatched-then-failed run. The `fingerprint` uses the canonical
290
+ // remote ref, not the operator spelling. Two equivalent spellings of one remote
291
+ // branch (`fix/foo` and `origin/fix/foo`) share one fingerprint, so a repeated
292
+ // failure reuses one active recovery action and does not reset the attempt
293
+ // count or post a duplicate notice. A different branch makes a new action.
294
+ function buildUnresolvedWorkspaceBaseRefResultJson(run, error) {
295
+ const context = parseObject(run.contextSnapshot);
296
+ return {
297
+ configurationIncomplete: {
298
+ reason: "workspace_base_ref_unresolved",
299
+ companyId: run.companyId,
300
+ agentId: run.agentId,
301
+ issueId: readNonEmptyString(context.issueId) ?? null,
302
+ projectId: readNonEmptyString(context.projectId) ?? null,
303
+ requestedRef: error.requestedRef,
304
+ attemptedRefs: error.attemptedRefs,
305
+ fetchError: error.fetchError,
306
+ fingerprint: `workspace_base_ref:${error.recoveryIdentityRef}`,
307
+ missingBindings: [],
308
+ },
309
+ };
310
+ }
271
311
  // Pre-dispatch gate outcome: another running run currently holds the issue's
272
312
  // shared project workspace. Not a failure — the run is parked as a bounded
273
313
  // scheduled retry and re-attempted once the holder finishes, so two agents
@@ -450,6 +490,7 @@ const SESSIONED_LOCAL_ADAPTERS = new Set([
450
490
  "cursor",
451
491
  "gemini_local",
452
492
  "hermes_local",
493
+ "kimi_local",
453
494
  "opencode_local",
454
495
  "pi_local",
455
496
  ]);
@@ -931,6 +972,12 @@ export function mergeExecutionWorkspaceMetadataForPersistence(input) {
931
972
  source: input.source,
932
973
  createdByRuntime: input.createdByRuntime,
933
974
  };
975
+ if (input.strategyType === "git_worktree") {
976
+ base[GIT_BRANCH_OWNERSHIP_METADATA_KEY] = GIT_BRANCH_OWNERSHIP_METADATA_VERSION;
977
+ }
978
+ else {
979
+ delete base[GIT_BRANCH_OWNERSHIP_METADATA_KEY];
980
+ }
934
981
  const existingSnapshot = parseObject(base.baseRefSnapshot);
935
982
  if (typeof existingSnapshot.resolvedSha !== "string"
936
983
  && input.baseRefSha) {
@@ -953,6 +1000,9 @@ export function mergeExecutionWorkspaceMetadataForPersistence(input) {
953
1000
  }
954
1001
  return mergeExecutionWorkspaceConfig(base, input.configSnapshot);
955
1002
  }
1003
+ export function resolveExecutionWorkspaceBranchOwnership(executionWorkspace) {
1004
+ return executionWorkspace.branchCreatedByRuntime;
1005
+ }
956
1006
  export function stripWorkspaceRuntimeFromExecutionRunConfig(config) {
957
1007
  const nextConfig = { ...config };
958
1008
  delete nextConfig.workspaceRuntime;
@@ -1902,7 +1952,7 @@ export function isMultiProjectWorkspaceSyncEnabled(env = process.env) {
1902
1952
  * treated as local.
1903
1953
  */
1904
1954
  export function isRemoteExecutionEnvironmentDriver(driver) {
1905
- return driver === "ssh" || driver === "sandbox" || driver === "plugin";
1955
+ return getEnvironmentDriverTraits(driver)?.runsWorkspaceOffHost ?? false;
1906
1956
  }
1907
1957
  /**
1908
1958
  * Environment flag (kill-switch, default ON) that gates whether a *remote* run stages the
@@ -1931,7 +1981,7 @@ export function isMultiProjectWorkspaceSyncRemoteEnabled(env = process.env) {
1931
1981
  * confines each staged referenced tree.
1932
1982
  */
1933
1983
  export function isConfinedRemoteStagingDriver(driver) {
1934
- return driver === "sandbox";
1984
+ return getEnvironmentDriverTraits(driver)?.confinesStagedProjects ?? false;
1935
1985
  }
1936
1986
  /**
1937
1987
  * Upper bound on how many additional (mentioned) projects a single run may materialize
@@ -2195,6 +2245,9 @@ export function buildReferencedProjectRunObservability(input) {
2195
2245
  referenced_project_failures: input.failures.map((failure) => ({
2196
2246
  project_id: failure.projectId,
2197
2247
  reason: failure.reason,
2248
+ // Carry the error only when the layer produced one, so an authorization or resolution drop
2249
+ // stays a two-field entry and a staging drop names its reason.
2250
+ ...(failure.error !== undefined ? { error: failure.error } : {}),
2198
2251
  })),
2199
2252
  };
2200
2253
  }
@@ -3040,7 +3093,16 @@ const EFFECTIVE_RUN_WORKSPACE_CONFIG_CATEGORIES = [
3040
3093
  ];
3041
3094
  export function resolveExecutionWorkspaceReuseRequestForIssue(input) {
3042
3095
  const requestedExecutionWorkspaceId = readNonEmptyString(input.issueExecutionWorkspaceId);
3043
- const requestedShouldReuseExisting = input.issueExecutionWorkspacePreference === "reuse_existing" && requestedExecutionWorkspaceId !== null;
3096
+ // An explicitly pinned existing branch outranks an inherited reuse_existing
3097
+ // binding: a persisted workspace on any other branch (or with no recorded
3098
+ // branch) is stale for this issue, so dispatch realizes the pinned branch
3099
+ // instead of restoring the mismatched workspace.
3100
+ const requestedExistingBranch = readNonEmptyString(input.requestedExistingBranch);
3101
+ const existingWorkspaceMatchesRequestedBranch = requestedExistingBranch === null ||
3102
+ readNonEmptyString(input.existingExecutionWorkspaceBranchName) === requestedExistingBranch;
3103
+ const requestedShouldReuseExisting = input.issueExecutionWorkspacePreference === "reuse_existing" &&
3104
+ requestedExecutionWorkspaceId !== null &&
3105
+ existingWorkspaceMatchesRequestedBranch;
3044
3106
  return {
3045
3107
  requestedExecutionWorkspaceId,
3046
3108
  requestedShouldReuseExisting,
@@ -4799,6 +4861,7 @@ export function heartbeatService(db, options = {}) {
4799
4861
  const envOrchestrator = environmentRunOrchestrator(db, {
4800
4862
  pluginWorkerManager: options.pluginWorkerManager,
4801
4863
  environmentRuntime,
4864
+ duplexAggregateByteLedger: options.duplexAggregateByteLedger,
4802
4865
  });
4803
4866
  const workspaceOperationsSvc = workspaceOperationService(db);
4804
4867
  const liveRunExecutions = {
@@ -7424,6 +7487,21 @@ export function heartbeatService(db, options = {}) {
7424
7487
  }
7425
7488
  return { outcome: "not_applicable", queuedRun: null };
7426
7489
  }
7490
+ // A pre-dispatch setup failure means the adapter process never started (for
7491
+ // example an unresolved workspace base ref). No agent could run, so no agent
7492
+ // could post an issue comment. A missing-comment retry cannot help and would
7493
+ // loop the identical pre-adapter failure, so mark the policy not_applicable
7494
+ // and queue nothing.
7495
+ if (run.errorCode != null && PRE_ADAPTER_SETUP_FAILURE_CODES.has(run.errorCode)) {
7496
+ if (run.issueCommentStatus !== "not_applicable") {
7497
+ await patchRunIssueCommentStatus(run.id, {
7498
+ issueCommentStatus: "not_applicable",
7499
+ issueCommentSatisfiedByCommentId: null,
7500
+ issueCommentRetryQueuedAt: null,
7501
+ });
7502
+ }
7503
+ return { outcome: "not_applicable", queuedRun: null };
7504
+ }
7427
7505
  const postedComment = await findRunIssueComment(run.id, run.companyId, issueId);
7428
7506
  if (postedComment) {
7429
7507
  await patchRunIssueCommentStatus(run.id, {
@@ -8077,15 +8155,28 @@ export function heartbeatService(db, options = {}) {
8077
8155
  },
8078
8156
  };
8079
8157
  }
8158
+ if (!isHeartbeatWakeOnDemandEnabled(agent)) {
8159
+ return {
8160
+ allowed: false,
8161
+ reason: "Scheduled retry suppressed because on-demand agent wakes are disabled",
8162
+ errorCode: "heartbeat_wake_on_demand_disabled",
8163
+ issueId,
8164
+ details: { agentId: agent.id },
8165
+ };
8166
+ }
8080
8167
  if (!issueId)
8081
8168
  return { allowed: true };
8082
8169
  const issue = await db
8083
8170
  .select({
8084
8171
  id: issues.id,
8172
+ companyId: issues.companyId,
8085
8173
  status: issues.status,
8086
8174
  assigneeAgentId: issues.assigneeAgentId,
8175
+ assigneeUserId: issues.assigneeUserId,
8087
8176
  executionRunId: issues.executionRunId,
8177
+ executionPolicy: issues.executionPolicy,
8088
8178
  executionState: issues.executionState,
8179
+ monitorNextCheckAt: issues.monitorNextCheckAt,
8089
8180
  })
8090
8181
  .from(issues)
8091
8182
  .where(and(eq(issues.id, issueId), eq(issues.companyId, run.companyId)))
@@ -8099,6 +8190,32 @@ export function heartbeatService(db, options = {}) {
8099
8190
  details: { issueId },
8100
8191
  };
8101
8192
  }
8193
+ if (retryReason === ISSUE_DISPOSITION_REPAIR_RETRY_REASON) {
8194
+ const expectedFingerprint = readNonEmptyString(contextSnapshot.dispositionRepairFingerprint);
8195
+ const sourceState = await collectDispositionRepairSourceState(db, {
8196
+ issue,
8197
+ excludeRunId: run.id,
8198
+ excludeWakeupRequestId: run.wakeupRequestId,
8199
+ });
8200
+ if (!expectedFingerprint ||
8201
+ sourceState.fingerprint !== expectedFingerprint ||
8202
+ sourceState.hasActiveExecutionPath ||
8203
+ sourceState.hasDurableWaitingPath) {
8204
+ return {
8205
+ allowed: false,
8206
+ reason: "Scheduled disposition repair suppressed because the source state changed or gained a durable path",
8207
+ errorCode: "issue_disposition_repair_superseded",
8208
+ issueId,
8209
+ details: {
8210
+ issueId,
8211
+ expectedFingerprint,
8212
+ currentFingerprint: sourceState.fingerprint,
8213
+ hasActiveExecutionPath: sourceState.hasActiveExecutionPath,
8214
+ durablePathReason: sourceState.durablePathReason,
8215
+ },
8216
+ };
8217
+ }
8218
+ }
8102
8219
  if (issue.assigneeAgentId !== run.agentId) {
8103
8220
  if (!isNonAssigneeWorkspaceBusyRetry(retryReason, contextSnapshot)) {
8104
8221
  return {
@@ -9196,7 +9313,7 @@ export function heartbeatService(db, options = {}) {
9196
9313
  return {
9197
9314
  enabled: asBoolean(heartbeat.enabled, false),
9198
9315
  intervalSec: Math.max(0, asNumber(heartbeat.intervalSec, 0)),
9199
- wakeOnDemand: asBoolean(heartbeat.wakeOnDemand ?? heartbeat.wakeOnAssignment ?? heartbeat.wakeOnOnDemand ?? heartbeat.wakeOnAutomation, true),
9316
+ wakeOnDemand: isHeartbeatWakeOnDemandEnabled(agent),
9200
9317
  maxConcurrentRuns: normalizeMaxConcurrentRuns(heartbeat.maxConcurrentRuns),
9201
9318
  skipTimerWhenNoActionableWork: asBoolean(heartbeat.skipTimerWhenNoActionableWork ??
9202
9319
  heartbeat.requireActionableTimerWork ??
@@ -9624,9 +9741,19 @@ export function heartbeatService(db, options = {}) {
9624
9741
  const reviewParticipant = reviewExecutionState?.currentParticipant ?? null;
9625
9742
  const isCurrentReviewParticipant = reviewParticipant?.type === "agent" &&
9626
9743
  reviewParticipant.agentId === run.agentId;
9744
+ const recoveryActionId = readNonEmptyString(context.recoveryActionId);
9745
+ const authorizedSourceScopedRecovery = wakeReason === "source_scoped_recovery_action" && recoveryActionId
9746
+ ? await db
9747
+ .select({ id: issueRecoveryActions.id })
9748
+ .from(issueRecoveryActions)
9749
+ .where(and(eq(issueRecoveryActions.id, recoveryActionId), eq(issueRecoveryActions.companyId, run.companyId), eq(issueRecoveryActions.sourceIssueId, issue.id), eq(issueRecoveryActions.ownerAgentId, run.agentId), inArray(issueRecoveryActions.status, ["active", "escalated"])))
9750
+ .limit(1)
9751
+ .then((rows) => Boolean(rows[0]))
9752
+ : false;
9627
9753
  if (issue.assigneeAgentId !== run.agentId &&
9628
9754
  !isInteractionWake &&
9629
9755
  !isCurrentReviewParticipant &&
9756
+ !authorizedSourceScopedRecovery &&
9630
9757
  !isNonAssigneeWorkspaceBusyRetry(retryReason, context)) {
9631
9758
  return {
9632
9759
  stale: true,
@@ -10939,6 +11066,8 @@ export function heartbeatService(db, options = {}) {
10939
11066
  issueExecutionWorkspaceId: requestedExecutionWorkspaceId,
10940
11067
  issueExecutionWorkspacePreference: issueRef?.executionWorkspacePreference ?? null,
10941
11068
  existingExecutionWorkspaceStatus: existingExecutionWorkspace?.status ?? null,
11069
+ requestedExistingBranch: issueExecutionWorkspaceSettings?.workspaceStrategy?.existingBranch ?? null,
11070
+ existingExecutionWorkspaceBranchName: existingExecutionWorkspace?.branchName ?? null,
10942
11071
  });
10943
11072
  const requestedShouldReuseExisting = workspaceReuseRequest.requestedShouldReuseExisting;
10944
11073
  const reusableExistingExecutionWorkspace = workspaceReuseRequest.existingExecutionWorkspaceAvailable
@@ -11462,6 +11591,13 @@ export function heartbeatService(db, options = {}) {
11462
11591
  name: agent.name,
11463
11592
  companyId: agent.companyId,
11464
11593
  },
11594
+ recordedBranchOwnership: existingExecutionWorkspace?.status !== "archived"
11595
+ && existingExecutionWorkspace?.branchName
11596
+ ? {
11597
+ branchName: existingExecutionWorkspace.branchName,
11598
+ createdByRuntime: isRuntimeOwnedGitBranch(existingExecutionWorkspace.metadata),
11599
+ }
11600
+ : null,
11465
11601
  heartbeatRunId: run.id,
11466
11602
  enableWorkspaceBranchReconcileForward: resolvedInstanceSettings.experimental.enableWorkspaceBranchReconcileForward,
11467
11603
  enableWorkspaceDirtyQuarantineRepair: resolvedInstanceSettings.experimental.enableWorkspaceDirtyQuarantineRepair,
@@ -11477,7 +11613,11 @@ export function heartbeatService(db, options = {}) {
11477
11613
  ? reusableExistingExecutionWorkspace?.metadata ?? null
11478
11614
  : null,
11479
11615
  source: executionWorkspace.source,
11480
- createdByRuntime: executionWorkspace.created,
11616
+ // Branch ownership, not worktree freshness: attaching a worktree to a
11617
+ // pre-existing branch reports created=true but must never make terminal
11618
+ // cleanup delete that operator-owned branch.
11619
+ createdByRuntime: resolveExecutionWorkspaceBranchOwnership(executionWorkspace),
11620
+ strategyType: executionWorkspace.strategy,
11481
11621
  configSnapshot,
11482
11622
  shouldReuseExisting: resolvedWorkspaceReusePolicy.shouldRestoreExistingWorkspace,
11483
11623
  shouldRefreshConfigSnapshot: resolvedWorkspaceReusePolicy.shouldRefreshWorkspaceConfigSnapshot,
@@ -11686,6 +11826,33 @@ export function heartbeatService(db, options = {}) {
11686
11826
  lease: acquiredEnvironment.lease,
11687
11827
  leaseContext: acquiredEnvironment.leaseContext,
11688
11828
  };
11829
+ // The host duplex observability recorder for this run. It binds the fixed duplex
11830
+ // observability surface to real sinks: the spans to the OTel tracer, the
11831
+ // guarded counters to the tool-runtime metric store, and the transport event
11832
+ // to the run-event path. Each sink runs guarded and fire-and-forget, so a
11833
+ // telemetry failure never breaks the run. The orchestrator stamps it on the
11834
+ // sandbox target; a non-duplex run keeps the safe no-op default in the bridge.
11835
+ const duplexObservabilityRecorder = createHostDuplexObservabilityRecorder({
11836
+ tracer: getStartupTracer(),
11837
+ incrementCounter: (metric) => {
11838
+ void incrementToolRuntimeMetricCounter(db, {
11839
+ companyId: run.companyId,
11840
+ metric,
11841
+ }).catch(() => { });
11842
+ },
11843
+ emitTransportEvent: (event) => {
11844
+ void (async () => {
11845
+ const eventRun = run;
11846
+ const seq = await nextRunEventSeq(eventRun.id);
11847
+ await appendRunEvent(eventRun, seq, {
11848
+ eventType: event.name,
11849
+ stream: "system",
11850
+ level: event.dimensions.outcome === "error" ? "warn" : "info",
11851
+ payload: { ...event.dimensions },
11852
+ });
11853
+ })().catch(() => { });
11854
+ },
11855
+ });
11689
11856
  const realizationResult = await envOrchestrator.realizeForRun({
11690
11857
  environment: selectedEnvironment,
11691
11858
  lease: activeEnvironmentLease.lease,
@@ -11696,6 +11863,7 @@ export function heartbeatService(db, options = {}) {
11696
11863
  executionWorkspace,
11697
11864
  effectiveExecutionWorkspaceMode,
11698
11865
  persistedExecutionWorkspace,
11866
+ duplexObservabilityRecorder,
11699
11867
  });
11700
11868
  activeEnvironmentLease = {
11701
11869
  ...activeEnvironmentLease,
@@ -12508,6 +12676,7 @@ export function heartbeatService(db, options = {}) {
12508
12676
  failures: referencedProjectStagingFailures.map((failure) => ({
12509
12677
  projectId: failure.projectId,
12510
12678
  reason: "staging",
12679
+ error: failure.error,
12511
12680
  })),
12512
12681
  });
12513
12682
  logger.info({
@@ -12967,9 +13136,15 @@ export function heartbeatService(db, options = {}) {
12967
13136
  // recovery path routes it to a human owner instead of looping retries.
12968
13137
  const workspaceValidationSetupFailure = isWorkspaceValidationFailure(outerErr) ? outerErr : null;
12969
13138
  const configurationIncompleteSetupFailure = isConfigurationIncompleteFailure(outerErr) ? outerErr : null;
13139
+ // A remote-only base ref that never resolved is a known pre-dispatch
13140
+ // configuration gap, not an opaque setup crash. Map it to the same
13141
+ // configuration-incomplete code so the recovery path routes it to a
13142
+ // human owner and bounds the repeat by its per-ref fingerprint.
13143
+ const unresolvedBaseRefSetupFailure = isUnresolvedWorkspaceBaseRefError(outerErr) ? outerErr : null;
12970
13144
  const recordedResponsibleUserDenialCode = normalizeResponsibleUserDenialCode((await getRun(runId).catch(() => null))?.errorCode);
12971
13145
  const setupFailureErrorCode = workspaceValidationSetupFailure?.code ??
12972
13146
  configurationIncompleteSetupFailure?.code ??
13147
+ (unresolvedBaseRefSetupFailure ? CONFIGURATION_INCOMPLETE_FAILURE_CODE : null) ??
12973
13148
  recordedResponsibleUserDenialCode ??
12974
13149
  "setup_failed";
12975
13150
  logger.error({ err: outerErr, runId }, "heartbeat execution setup failed");
@@ -12982,7 +13157,11 @@ export function heartbeatService(db, options = {}) {
12982
13157
  resultJson: mergeRunStopMetadataForAgent(setupFailureAgent, "failed", {
12983
13158
  errorCode: setupFailureErrorCode,
12984
13159
  errorMessage: message,
12985
- resultJson: workspaceValidationSetupFailure?.resultJson ?? configurationIncompleteSetupFailure?.resultJson ?? null,
13160
+ resultJson: workspaceValidationSetupFailure?.resultJson ??
13161
+ configurationIncompleteSetupFailure?.resultJson ??
13162
+ (unresolvedBaseRefSetupFailure
13163
+ ? buildUnresolvedWorkspaceBaseRefResultJson(run, unresolvedBaseRefSetupFailure)
13164
+ : null),
12986
13165
  }),
12987
13166
  } : {}),
12988
13167
  }).catch(() => ({ run: null, updated: false }));
@@ -13502,7 +13681,6 @@ export function heartbeatService(db, options = {}) {
13502
13681
  previousStatus: issue.status,
13503
13682
  notice: buildExecutionReviewParticipantRecoveryNoticeSeed(),
13504
13683
  recoveryCause: EXECUTION_REVIEW_PARTICIPANT_RECOVERY_CAUSE,
13505
- recoveryOwnerAgentId: currentParticipant.agentId,
13506
13684
  };
13507
13685
  }
13508
13686
  const now = new Date();
@@ -13579,6 +13757,10 @@ export function heartbeatService(db, options = {}) {
13579
13757
  !issue.assigneeUserId &&
13580
13758
  issue.assigneeAgentId === run.agentId &&
13581
13759
  (run.status === "failed" || run.status === "timed_out" || run.status === "cancelled");
13760
+ if (readNonEmptyString(parseObject(run.contextSnapshot).retryReason) ===
13761
+ ISSUE_DISPOSITION_REPAIR_RETRY_REASON) {
13762
+ return { kind: "released" };
13763
+ }
13582
13764
  if (!issueNeedsImmediateRecovery) {
13583
13765
  return { kind: "released" };
13584
13766
  }
@@ -13729,7 +13911,6 @@ export function heartbeatService(db, options = {}) {
13729
13911
  : promotionResult.recoveryCause === EXECUTION_REVIEW_PARTICIPANT_RECOVERY_CAUSE
13730
13912
  ? EXECUTION_REVIEW_PARTICIPANT_RECOVERY_CAUSE
13731
13913
  : undefined,
13732
- recoveryOwnerAgentId: promotionResult.recoveryOwnerAgentId,
13733
13914
  });
13734
13915
  return;
13735
13916
  }