@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
@@ -0,0 +1,196 @@
1
+ import { isDeepStrictEqual } from "node:util";
2
+ import { and, eq } from "drizzle-orm";
3
+ import { assets, documentRevisions, documents, issueAttachments, issueDocuments } from "@paperclipai/db";
4
+ import { MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES, artifactReviewDocumentKey, getAttachmentArtifactWorkProductMetadata, isMarkdownAttachmentContent, } from "@paperclipai/shared";
5
+ import { HttpError, conflict, notFound, payloadTooLarge, unprocessable, unsupportedMediaType, } from "../errors.js";
6
+ import { documentAnnotationService } from "./document-annotations.js";
7
+ import { documentService, issueDocumentSelect, mapIssueDocumentRow } from "./documents.js";
8
+ /**
9
+ * Materializes the review IssueDocument for an eligible Markdown
10
+ * attachment-backed work product under the deterministic
11
+ * `artifact-review-<workProductId>` key. The operation is idempotent: repeated
12
+ * calls return the existing document and only write a new revision when the
13
+ * review content or its work-product provenance changed.
14
+ */
15
+ export function artifactReviewDocumentService(db, storage) {
16
+ const documentsSvc = documentService(db);
17
+ const annotationsSvc = documentAnnotationService(db);
18
+ const getExistingByKey = async (issueId, key) => {
19
+ const document = await db
20
+ .select(issueDocumentSelect)
21
+ .from(issueDocuments)
22
+ .innerJoin(documents, eq(issueDocuments.documentId, documents.id))
23
+ .where(and(eq(issueDocuments.issueId, issueId), eq(issueDocuments.key, key)))
24
+ .then((rows) => (rows[0] ? mapIssueDocumentRow(rows[0], true) : null));
25
+ if (!document)
26
+ return null;
27
+ const latestRevision = document.latestRevisionId
28
+ ? await db
29
+ .select({
30
+ createdByAgentId: documentRevisions.createdByAgentId,
31
+ createdByUserId: documentRevisions.createdByUserId,
32
+ createdByRunId: documentRevisions.createdByRunId,
33
+ })
34
+ .from(documentRevisions)
35
+ .where(and(eq(documentRevisions.id, document.latestRevisionId), eq(documentRevisions.documentId, document.id), eq(documentRevisions.companyId, document.companyId)))
36
+ .then((rows) => rows[0] ?? null)
37
+ : null;
38
+ return { document, latestRevision };
39
+ };
40
+ const readMarkdownAttachmentBody = async (issue, metadata) => {
41
+ const attachment = await db
42
+ .select({
43
+ id: issueAttachments.id,
44
+ companyId: issueAttachments.companyId,
45
+ issueId: issueAttachments.issueId,
46
+ objectKey: assets.objectKey,
47
+ contentType: assets.contentType,
48
+ byteSize: assets.byteSize,
49
+ originalFilename: assets.originalFilename,
50
+ createdByAgentId: assets.createdByAgentId,
51
+ createdByUserId: assets.createdByUserId,
52
+ })
53
+ .from(issueAttachments)
54
+ .innerJoin(assets, eq(issueAttachments.assetId, assets.id))
55
+ .where(eq(issueAttachments.id, metadata.attachmentId))
56
+ .then((rows) => rows[0] ?? null);
57
+ // Unknown and cross-scope attachment ids are deliberately
58
+ // indistinguishable: canonical metadata must reference an attachment on
59
+ // the same issue and company.
60
+ if (!attachment || attachment.companyId !== issue.companyId || attachment.issueId !== issue.id) {
61
+ throw unprocessable("Work product attachment must reference an attachment on the same issue", {
62
+ code: "invalid_attachment_artifact_metadata",
63
+ attachmentId: metadata.attachmentId,
64
+ });
65
+ }
66
+ if (!isMarkdownAttachmentContent(attachment)) {
67
+ throw unsupportedMediaType("Work product attachment is not Markdown", {
68
+ code: "unsupported_review_document_content_type",
69
+ contentType: attachment.contentType,
70
+ });
71
+ }
72
+ if (attachment.byteSize > MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES) {
73
+ throw payloadTooLarge("Markdown attachment exceeds the review document size limit", {
74
+ code: "review_document_too_large",
75
+ byteSize: attachment.byteSize,
76
+ maxBytes: MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES,
77
+ });
78
+ }
79
+ const object = await storage.getObject(attachment.companyId, attachment.objectKey);
80
+ const chunks = [];
81
+ let total = 0;
82
+ for await (const chunk of object.stream) {
83
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
84
+ total += buffer.length;
85
+ // Defense in depth: enforce the cap during streaming too, so a
86
+ // metadata/object size mismatch can never exceed the limit.
87
+ if (total > MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES) {
88
+ object.stream.destroy();
89
+ throw payloadTooLarge("Markdown attachment exceeds the review document size limit", {
90
+ code: "review_document_too_large",
91
+ maxBytes: MARKDOWN_REVIEW_DOCUMENT_MAX_BYTES,
92
+ });
93
+ }
94
+ chunks.push(buffer);
95
+ }
96
+ let body;
97
+ try {
98
+ body = new TextDecoder("utf-8", { fatal: true }).decode(Buffer.concat(chunks));
99
+ }
100
+ catch {
101
+ throw unprocessable("Markdown attachment is not valid UTF-8", {
102
+ code: "invalid_review_document_encoding",
103
+ attachmentId: attachment.id,
104
+ });
105
+ }
106
+ return { attachment, body };
107
+ };
108
+ return {
109
+ ensureForWorkProduct: async (input) => {
110
+ const { issue, workProduct } = input;
111
+ if (workProduct.issueId !== issue.id || workProduct.companyId !== issue.companyId) {
112
+ throw notFound("Work product not found");
113
+ }
114
+ const metadata = getAttachmentArtifactWorkProductMetadata(workProduct);
115
+ if (!metadata) {
116
+ throw unprocessable("Work product is not an attachment-backed Paperclip artifact", {
117
+ code: "not_attachment_backed_artifact",
118
+ workProductId: workProduct.id,
119
+ });
120
+ }
121
+ if (!isMarkdownAttachmentContent(metadata)) {
122
+ throw unsupportedMediaType("Work product attachment is not Markdown", {
123
+ code: "unsupported_review_document_content_type",
124
+ contentType: metadata.contentType,
125
+ });
126
+ }
127
+ const { attachment, body } = await readMarkdownAttachmentBody(issue, metadata);
128
+ const key = artifactReviewDocumentKey(workProduct.id);
129
+ // The review document represents agent-authored attachment content, so
130
+ // attribution promotes the attachment/work-product provenance instead of
131
+ // the actor who triggered materialization.
132
+ const attribution = {
133
+ createdByAgentId: attachment.createdByAgentId ?? null,
134
+ createdByUserId: attachment.createdByUserId ?? null,
135
+ createdByRunId: workProduct.createdByRunId ?? null,
136
+ sourceTrust: workProduct.sourceTrust ?? null,
137
+ };
138
+ for (let attempt = 0; attempt < 2; attempt += 1) {
139
+ const existingState = await getExistingByKey(issue.id, key);
140
+ const existing = existingState?.document ?? null;
141
+ const latestRevision = existingState?.latestRevision ?? null;
142
+ const reviewStateMatches = existing &&
143
+ existing.body === body &&
144
+ existing.title === (workProduct.title ?? null) &&
145
+ existing.format === "markdown" &&
146
+ latestRevision?.createdByAgentId === attribution.createdByAgentId &&
147
+ latestRevision.createdByUserId === attribution.createdByUserId &&
148
+ latestRevision.createdByRunId === attribution.createdByRunId &&
149
+ isDeepStrictEqual(existing.sourceTrust ?? null, attribution.sourceTrust);
150
+ if (reviewStateMatches) {
151
+ return { document: existing, created: false, revisionChanged: false, remappedAnnotations: [] };
152
+ }
153
+ try {
154
+ const result = await documentsSvc.upsertIssueDocument({
155
+ issueId: issue.id,
156
+ key,
157
+ title: workProduct.title ?? null,
158
+ format: "markdown",
159
+ body,
160
+ changeSummary: existing
161
+ ? "Synced from the work product attachment"
162
+ : "Materialized from the Markdown work product attachment",
163
+ baseRevisionId: existing?.latestRevisionId ?? null,
164
+ ...attribution,
165
+ lockedDocumentStrategy: "conflict",
166
+ });
167
+ const remappedAnnotations = result.created
168
+ ? []
169
+ : await annotationsSvc.remapOpenThreadsForDocument({
170
+ issueId: issue.id,
171
+ key: result.document.key,
172
+ documentId: result.document.id,
173
+ nextRevisionId: result.document.latestRevisionId,
174
+ nextRevisionNumber: result.document.latestRevisionNumber,
175
+ nextBody: result.document.body,
176
+ });
177
+ return {
178
+ document: result.document,
179
+ created: result.created,
180
+ revisionChanged: true,
181
+ remappedAnnotations,
182
+ };
183
+ }
184
+ catch (error) {
185
+ // A concurrent materialization or document write raced this one.
186
+ // Re-read once so identical content converges on the winner.
187
+ if (error instanceof HttpError && error.status === 409 && attempt === 0)
188
+ continue;
189
+ throw error;
190
+ }
191
+ }
192
+ throw conflict("Concurrent review-document updates did not converge", { key });
193
+ },
194
+ };
195
+ }
196
+ //# sourceMappingURL=artifact-review-documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-review-documents.js","sourceRoot":"","sources":["../../src/services/artifact-review-documents.ts"],"names":[],"mappings":"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"}
@@ -9,10 +9,10 @@ export declare function assetService(db: Db): {
9
9
  createdAt: Date;
10
10
  updatedAt: Date;
11
11
  provider: string;
12
- sha256: string;
13
12
  contentType: string;
14
13
  byteSize: number;
15
14
  originalFilename: string | null;
15
+ sha256: string;
16
16
  objectKey: string;
17
17
  }>;
18
18
  getById: (id: string) => Promise<{
@@ -0,0 +1,58 @@
1
+ import type { Environment, EnvironmentLease } from "@paperclipai/shared";
2
+ import type { EnvironmentRuntimeService } from "./environment-runtime.js";
3
+ /**
4
+ * The bounded size for the credential payload. A real subscription `auth.json` is
5
+ * a few kilobytes. The read rejects a larger payload before it returns any bytes.
6
+ * The value matches the adapter export bound.
7
+ */
8
+ export declare const MAX_AUTH_JSON_BYTES: number;
9
+ /** The fixed credential file name inside the session home. No caller controls it. */
10
+ export declare const AUTH_JSON_FILE_NAME = "auth.json";
11
+ /**
12
+ * The fixed, non-secret error the read returns on every failed path. The message
13
+ * carries no pathname, no byte, and no other secret detail.
14
+ */
15
+ export declare const DEVICE_LOGIN_AUTH_READ_ERROR = "device login failed: the sandbox credential read errored.";
16
+ /**
17
+ * The fixed helper program. The server reads the helper from its own script file
18
+ * and runs it in the sandbox as `node -e <script> <sessionHome> <maxBytes>
19
+ * [<expectedUid>]`. The sandbox already runs node for the Paperclip bridge, so the
20
+ * helper needs no extra runtime. The helper source lives in
21
+ * `scripts/codex-auth-read.cjs`, so no large script stays as a string literal in
22
+ * this module.
23
+ *
24
+ * The helper opens the filesystem root, then opens each session-home path
25
+ * component in turn with a no-follow, directory-only open, relative to the
26
+ * previous directory descriptor, so a symlink at any component fails. It opens
27
+ * `auth.json` relative to the final directory descriptor with `O_NOFOLLOW`, runs
28
+ * `fstat` on the opened descriptor, and requires a regular file, the expected
29
+ * owner, exact mode `0600`, and a size at or below the bound. It reads only from
30
+ * that same descriptor. The `expectedUid` argument is optional; the server omits
31
+ * it, so the helper uses the login user's own id.
32
+ */
33
+ export declare const DEVICE_LOGIN_AUTH_READ_SCRIPT: string;
34
+ /**
35
+ * Decodes the helper stdout to the credential bytes. It accepts only strict
36
+ * base64 with correct padding, so a truncated or corrupt line returns the fixed
37
+ * error instead of partial bytes. It rejects a decoded payload over the bound.
38
+ */
39
+ export declare function decodeAuthReadOutput(stdout: string): Buffer;
40
+ /** The environment-runtime surface the descriptor-bound read needs. */
41
+ export interface DescriptorBoundAuthReadDeps {
42
+ environmentRuntime: Pick<EnvironmentRuntimeService, "execute">;
43
+ environment: Environment;
44
+ lease: EnvironmentLease;
45
+ /** The verified, server-controlled session home. */
46
+ sessionHome: string;
47
+ /** The host timeout for the read command. */
48
+ timeoutMs: number;
49
+ }
50
+ /**
51
+ * Runs the descriptor-bound credential read once and returns the bytes. It
52
+ * revalidates the session-home shape, then runs the fixed helper as a one-shot,
53
+ * non-session command. It converts a non-zero exit, an empty or malformed stdout,
54
+ * or an oversize payload to the one fixed, non-secret error. It reads no bytes on
55
+ * any failed path.
56
+ */
57
+ export declare function runDescriptorBoundAuthRead(deps: DescriptorBoundAuthReadDeps): Promise<Buffer>;
58
+ //# sourceMappingURL=codex-device-login-credential-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-device-login-credential-read.d.ts","sourceRoot":"","sources":["../../src/services/codex-device-login-credential-read.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAG1E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAE7C,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,4BAA4B,8DACoB,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,6BAA6B,QAGzC,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED,uEAAuE;AACvE,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB,EAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC;IAC/D,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -0,0 +1,118 @@
1
+ // The descriptor-bound credential read for the Codex device login.
2
+ //
3
+ // The login pseudo-terminal (PTY) runs `codex login --device-auth` and writes
4
+ // `auth.json` into the server-controlled session home. The service reads that
5
+ // file after the command exits with code zero. The read must close the
6
+ // time-of-check-to-time-of-use (TOCTOU) window: a pathname check and a later
7
+ // `cat` on the same pathname let an attacker swap the file between the two steps.
8
+ //
9
+ // This module runs one fixed, server-controlled operation inside the sandbox
10
+ // instead. The operation opens the filesystem root, then walks each path
11
+ // component of the session home with no symlink follow. `O_NOFOLLOW` protects
12
+ // only the final component of one open, so the operation opens every intermediate
13
+ // component with a separate no-follow open. A symlink at any ancestor fails the
14
+ // walk. The operation then opens `auth.json` relative to the final directory
15
+ // descriptor without a symlink follow, runs `fstat` on the opened descriptor, and
16
+ // reads only from that same descriptor. The `fstat` check requires a regular
17
+ // file, login-user ownership, exact mode `0600`, and a bounded size. A missing
18
+ // file, a symlink at any component, a non-regular file, a wrong owner, a wrong
19
+ // mode, or an oversize file returns one fixed, non-secret error.
20
+ //
21
+ // The provider exposes no descriptor application programming interface (API), so
22
+ // this module runs a fixed helper program in the sandbox through the environment
23
+ // runtime `execute` seam. The helper is node, because the sandbox already runs
24
+ // node for the Paperclip bridge. The helper never re-opens the pathname after the
25
+ // check: the `fstat` and the read bind to the one opened descriptor.
26
+ //
27
+ // Security: the helper prints only the base64 of the credential bytes on the
28
+ // fully validated success path. It prints one fixed error token on every failed
29
+ // path. It never prints the pathname, the raw bytes, or any other detail. This
30
+ // module converts any failure to one fixed, non-secret error and reads no bytes.
31
+ import { readFileSync } from "node:fs";
32
+ import { fileURLToPath } from "node:url";
33
+ import { validateLoginSessionHome } from "./login-command.js";
34
+ /**
35
+ * The bounded size for the credential payload. A real subscription `auth.json` is
36
+ * a few kilobytes. The read rejects a larger payload before it returns any bytes.
37
+ * The value matches the adapter export bound.
38
+ */
39
+ export const MAX_AUTH_JSON_BYTES = 64 * 1024;
40
+ /** The fixed credential file name inside the session home. No caller controls it. */
41
+ export const AUTH_JSON_FILE_NAME = "auth.json";
42
+ /**
43
+ * The fixed, non-secret error the read returns on every failed path. The message
44
+ * carries no pathname, no byte, and no other secret detail.
45
+ */
46
+ export const DEVICE_LOGIN_AUTH_READ_ERROR = "device login failed: the sandbox credential read errored.";
47
+ /**
48
+ * The fixed helper program. The server reads the helper from its own script file
49
+ * and runs it in the sandbox as `node -e <script> <sessionHome> <maxBytes>
50
+ * [<expectedUid>]`. The sandbox already runs node for the Paperclip bridge, so the
51
+ * helper needs no extra runtime. The helper source lives in
52
+ * `scripts/codex-auth-read.cjs`, so no large script stays as a string literal in
53
+ * this module.
54
+ *
55
+ * The helper opens the filesystem root, then opens each session-home path
56
+ * component in turn with a no-follow, directory-only open, relative to the
57
+ * previous directory descriptor, so a symlink at any component fails. It opens
58
+ * `auth.json` relative to the final directory descriptor with `O_NOFOLLOW`, runs
59
+ * `fstat` on the opened descriptor, and requires a regular file, the expected
60
+ * owner, exact mode `0600`, and a size at or below the bound. It reads only from
61
+ * that same descriptor. The `expectedUid` argument is optional; the server omits
62
+ * it, so the helper uses the login user's own id.
63
+ */
64
+ export const DEVICE_LOGIN_AUTH_READ_SCRIPT = readFileSync(fileURLToPath(new URL("./scripts/codex-auth-read.cjs", import.meta.url)), "utf8");
65
+ /** A strict base64 token: standard alphabet, correct padding, length a multiple
66
+ * of four. The read rejects any other stdout, so malformed helper output never
67
+ * decodes to partial bytes. */
68
+ const STRICT_BASE64_RE = /^[A-Za-z0-9+/]*={0,2}$/;
69
+ /**
70
+ * Decodes the helper stdout to the credential bytes. It accepts only strict
71
+ * base64 with correct padding, so a truncated or corrupt line returns the fixed
72
+ * error instead of partial bytes. It rejects a decoded payload over the bound.
73
+ */
74
+ export function decodeAuthReadOutput(stdout) {
75
+ const encoded = stdout.trim();
76
+ if (encoded.length % 4 !== 0 || !STRICT_BASE64_RE.test(encoded)) {
77
+ throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
78
+ }
79
+ const bytes = Buffer.from(encoded, "base64");
80
+ if (bytes.length > MAX_AUTH_JSON_BYTES) {
81
+ throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
82
+ }
83
+ return bytes;
84
+ }
85
+ /**
86
+ * Runs the descriptor-bound credential read once and returns the bytes. It
87
+ * revalidates the session-home shape, then runs the fixed helper as a one-shot,
88
+ * non-session command. It converts a non-zero exit, an empty or malformed stdout,
89
+ * or an oversize payload to the one fixed, non-secret error. It reads no bytes on
90
+ * any failed path.
91
+ */
92
+ export async function runDescriptorBoundAuthRead(deps) {
93
+ // Revalidate the home shape before the sandbox command. The server derived and
94
+ // validated it earlier; this second check keeps the helper argument fixed.
95
+ validateLoginSessionHome(deps.sessionHome);
96
+ let result;
97
+ try {
98
+ result = await deps.environmentRuntime.execute({
99
+ environment: deps.environment,
100
+ lease: deps.lease,
101
+ command: "node",
102
+ args: ["-e", DEVICE_LOGIN_AUTH_READ_SCRIPT, deps.sessionHome, String(MAX_AUTH_JSON_BYTES)],
103
+ timeoutMs: deps.timeoutMs,
104
+ // The read is one fixed, non-session operation. It must not open or reuse
105
+ // the login session.
106
+ bypassSession: true,
107
+ });
108
+ }
109
+ catch {
110
+ // A driver error may embed sandbox text. Convert it to the fixed error.
111
+ throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
112
+ }
113
+ if (result.exitCode !== 0) {
114
+ throw new Error(DEVICE_LOGIN_AUTH_READ_ERROR);
115
+ }
116
+ return decodeAuthReadOutput(result.stdout ?? "");
117
+ }
118
+ //# sourceMappingURL=codex-device-login-credential-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-device-login-credential-read.js","sourceRoot":"","sources":["../../src/services/codex-device-login-credential-read.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,uEAAuE;AACvE,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,8EAA8E;AAC9E,kFAAkF;AAClF,gFAAgF;AAChF,6EAA6E;AAC7E,kFAAkF;AAClF,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,iEAAiE;AACjE,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,+EAA+E;AAC/E,kFAAkF;AAClF,qEAAqE;AACrE,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE7C,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GACvC,2DAA2D,CAAC;AAE9D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,YAAY,CACvD,aAAa,CAAC,IAAI,GAAG,CAAC,+BAA+B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACxE,MAAM,CACP,CAAC;AAEF;;gCAEgC;AAChC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAiC;IAEjC,+EAA+E;IAC/E,2EAA2E;IAC3E,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,MAAoD,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,IAAI,EAAE,6BAA6B,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC1F,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,0EAA0E;YAC1E,qBAAqB;YACrB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-device-login-reaper.d.ts","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAML,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAwB1E,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;8DAC8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC;8CAC0C;IAC1C,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChE;wBACoB;IACpB,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC5C;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;IAC5B;8CAC0C;IAC1C,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,0BAA0B,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,0BAA0B;iBAyJnD,OAAO,CAAC,iBAAiB,CAAC;EAenD;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAMrF,MAAM,WAAW,uCAAuC;IACtD,EAAE,EAAE,EAAE,CAAC;IACP,kBAAkB,EAAE,yBAAyB,CAAC;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,uCAAuC,GAC5C,0BAA0B,CA6D5B"}
1
+ {"version":3,"file":"codex-device-login-reaper.d.ts","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAwB1E,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;8DAC8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC;8CAC0C;IAC1C,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChE;wBACoB;IACpB,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC5C;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;IAC5B;8CAC0C;IAC1C,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,0BAA0B,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,0BAA0B;iBA0JnD,OAAO,CAAC,iBAAiB,CAAC;EAenD;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAMrF,MAAM,WAAW,uCAAuC;IACtD,EAAE,EAAE,EAAE,CAAC;IACP,kBAAkB,EAAE,yBAAyB,CAAC;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,CACvD,IAAI,EAAE,uCAAuC,GAC5C,0BAA0B,CAkE5B"}
@@ -1,6 +1,6 @@
1
- import { inArray } from "drizzle-orm";
1
+ import { and, eq, inArray } from "drizzle-orm";
2
2
  import { adapterAuthSessions } from "@paperclipai/db";
3
- import { ADAPTER_AUTH_ACTIVE_STATUSES, decodePendingTerminal, LOGIN_LEASE_SESSION_TAG_KEY, observeSandboxDelete, terminalCleanupWrite, } from "./codex-device-login-service.js";
3
+ import { ADAPTER_AUTH_ACTIVE_STATUSES, CODEX_DEVICE_LOGIN_ADAPTER_TYPE, decodePendingTerminal, LOGIN_LEASE_SESSION_TAG_KEY, observeSandboxDelete, terminalCleanupWrite, } from "./codex-device-login-service.js";
4
4
  import { environmentService } from "./environments.js";
5
5
  export function createCodexDeviceLoginReaper(deps) {
6
6
  const { store, runtime } = deps;
@@ -74,7 +74,7 @@ export function createCodexDeviceLoginReaper(deps) {
74
74
  // interleaves with a live write. A crashed owner drops the lock, so the
75
75
  // reaper still reclaims the stalled row on a later sweep.
76
76
  const pendingWrite = terminalCleanupWrite(false, "timed_out", null);
77
- const claimed = await store.withCompanyAdapterPromotionLock(row.companyId, row.adapterType, () => store.compareAndSetStatus({
77
+ const claimed = await store.withCompanyAdapterPromotionLock(row.companyId, row.startedByUserId, row.adapterType, () => store.compareAndSetStatus({
78
78
  sessionId: row.id,
79
79
  expectedStatuses: [row.status],
80
80
  status: pendingWrite.status,
@@ -198,10 +198,13 @@ export function createProductionLoginSessionReaperRuntime(deps) {
198
198
  const environmentRows = await deps.db
199
199
  .selectDistinct({ environmentId: adapterAuthSessions.environmentId })
200
200
  .from(adapterAuthSessions)
201
- .where(inArray(adapterAuthSessions.status, [
201
+ .where(and(
202
+ // The shared table also holds the setup-token rows. Filter by the
203
+ // device-login adapter, so the orphan sweep reads only Codex rows.
204
+ eq(adapterAuthSessions.adapterType, CODEX_DEVICE_LOGIN_ADAPTER_TYPE), inArray(adapterAuthSessions.status, [
202
205
  ...ADAPTER_AUTH_ACTIVE_STATUSES,
203
206
  "cleanup_pending",
204
- ]));
207
+ ])));
205
208
  const tagged = [];
206
209
  for (const { environmentId } of environmentRows) {
207
210
  const leases = await environmentsSvc.listLeases(environmentId, { status: "active" });
@@ -1 +1 @@
1
- {"version":3,"file":"codex-device-login-reaper.js","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-device-login-reaper.js","sourceRoot":"","sources":["../../src/services/codex-device-login-reaper.ts"],"names":[],"mappings":"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"}