@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
@@ -28,7 +28,7 @@ upsertSidebarOrderPreferenceSchema,
28
28
  // Execution workspaces
29
29
  reconcileExecutionWorkspaceBranchSchema, updateExecutionWorkspaceSchema, workspaceOverviewQuerySchema, workspaceRuntimeControlTargetSchema,
30
30
  // Environments
31
- createEnvironmentSchema, cancelEnvironmentCustomImageSetupSessionSchema, createEnvironmentCustomImageTerminalSessionTokenSchema, environmentCustomImageSetupSessionSchema, environmentCustomImageTerminalSessionTokenSchema, environmentCustomImageTemplateSchema, finishEnvironmentCustomImageSetupSessionSchema, updateEnvironmentSchema, probeEnvironmentConfigSchema, startEnvironmentCustomImageSetupSessionSchema,
31
+ createEnvironmentSchema, cancelEnvironmentCustomImageSetupSessionSchema, createEnvironmentCustomImageTerminalSessionTokenSchema, environmentCustomImageSetupSessionSchema, environmentCustomImageTerminalSessionTokenSchema, environmentCustomImageTemplateSchema, finishEnvironmentCustomImageSetupSessionSchema, relinkEnvironmentCustomImageTemplateSchema, updateEnvironmentSchema, probeEnvironmentConfigSchema, startEnvironmentCustomImageSetupSessionSchema,
32
32
  // Company skills
33
33
  companySkillCreateSchema, companySkillFileDeleteSchema, companySkillFileUpdateSchema, companySkillImportSchema, companySkillProjectBrowseRequestSchema, companySkillProjectBrowseResultSchema, companySkillProjectScanRequestSchema, companySkillProjectScanResultSchema, companySkillRenameResultSchema, companySkillRenameSchema, companySkillTestInputCreateSchema, companySkillTestInputUpdateSchema, companySkillTestRunCreateSchema, companySkillTestRunListQuerySchema, companySkillTestRunTemplateCreateSchema, companySkillTestRunTemplateUpdateSchema, evaluateSkillPolicySchema, replaceSkillPolicySchema, updateInboxAgentPolicySchema,
34
34
  // Issue tree
@@ -54,141 +54,173 @@ createSecretProviderConfigSchema, updateSecretProviderConfigSchema, secretProvid
54
54
  // Tool access
55
55
  connectToolAppSchema, createToolApplicationSchema, updateToolApplicationSchema, createToolConnectionSchema, connectionTokenRequestSchema, startConnectionAuthorizationSchema, createToolStdioCommandTemplateSchema, disableToolStdioCommandTemplateSchema, finishToolAppSchema, reconnectToolAppSchema, updateToolConnectionSchema, putToolConnectionInstallsSchema, toolConnectionTestCallSchema, createToolPolicySchema, duplicateToolPolicySchema, createToolProfileBindingForProfileSchema, createToolProfileEntryForProfileSchema, createToolProfileWithEntriesSchema, deleteToolProfileSchema, duplicateToolProfileSchema, reorderToolPoliciesSchema, reviewToolProfileNewToolsSchema, updateToolPolicySchema, updateToolProfileEntrySchema, updateToolProfileWithEntriesSchema, createToolTrustRuleFromActionRequestSchema, revokeToolTrustRuleSchema, unbindToolProfileBindingSchema, importMcpJsonSchema, toolPolicyTestRequestSchema, createToolMcpGatewaySchema, startClaudeSetupTokenSessionRequestSchema, submitBrowserCodeRequestSchema, claudeSetupTokenSessionResponseSchema, claudeSetupTokenSessionPromptSchema, claudeSetupTokenSessionOwnerResponseSchema, claudeSetupTokenCompletionResponseSchema, claudeOAuthTokenStatusResponseSchema, } from "@paperclipai/shared";
56
56
  import { COMPANY_IMPORT_TRANSFERS_API_PATH, companyImportTransferDeclarationSchema, } from "@paperclipai/shared/company-import-transfer";
57
- const zodTypeName = (schema) => schema._def.typeName;
57
+ const zodDef = (schema) => schema._def;
58
+ const zodTypeName = (schema) => zodDef(schema).type;
58
59
  function unwrapSchema(schema) {
59
- const typeName = zodTypeName(schema);
60
- if (typeName === "ZodOptional" || typeName === "ZodDefault" || typeName === "ZodCatch") {
61
- return unwrapSchema(schema._def.innerType);
60
+ const def = zodDef(schema);
61
+ if (def.type === "optional" || def.type === "default" || def.type === "catch") {
62
+ return unwrapSchema(def.innerType);
62
63
  }
63
- if (typeName === "ZodEffects") {
64
- return unwrapSchema(schema._def.schema);
64
+ // A `.transform()` or `.pipe()` becomes a pipe. Read the input schema so the
65
+ // published contract describes the value a client sends.
66
+ if (def.type === "pipe") {
67
+ return unwrapSchema(def.in);
65
68
  }
66
69
  return schema;
67
70
  }
68
71
  function isOptionalSchema(schema) {
69
- const typeName = zodTypeName(schema);
70
- if (typeName === "ZodOptional" || typeName === "ZodDefault" || typeName === "ZodCatch") {
72
+ const def = zodDef(schema);
73
+ if (def.type === "optional" || def.type === "default" || def.type === "catch") {
71
74
  return true;
72
75
  }
73
- if (typeName === "ZodEffects") {
74
- return isOptionalSchema(schema._def.schema);
76
+ if (def.type === "pipe") {
77
+ return isOptionalSchema(def.in);
75
78
  }
76
- if (typeName === "ZodNullable") {
77
- return isOptionalSchema(schema._def.innerType);
79
+ if (def.type === "nullable") {
80
+ return isOptionalSchema(def.innerType);
78
81
  }
79
82
  return false;
80
83
  }
84
+ // Zod 4 stores each check as an object with a `_zod.def` that carries a `check`
85
+ // name and the check members. Read that def to describe the constraint.
86
+ function checkDef(check) {
87
+ return check._zod?.def;
88
+ }
81
89
  function applyStringChecks(jsonSchema, checks) {
82
90
  for (const check of checks) {
83
- if (check.kind === "min")
84
- jsonSchema.minLength = check.value;
85
- if (check.kind === "max")
86
- jsonSchema.maxLength = check.value;
87
- if (check.kind === "email")
88
- jsonSchema.format = "email";
89
- if (check.kind === "url")
90
- jsonSchema.format = "uri";
91
- if (check.kind === "uuid")
92
- jsonSchema.format = "uuid";
93
- if (check.kind === "datetime")
94
- jsonSchema.format = "date-time";
95
- if (check.kind === "regex" && check.regex instanceof RegExp) {
96
- jsonSchema.pattern = check.regex.source;
91
+ const def = checkDef(check);
92
+ if (!def)
93
+ continue;
94
+ if (def.check === "min_length")
95
+ jsonSchema.minLength = def.minimum;
96
+ else if (def.check === "max_length")
97
+ jsonSchema.maxLength = def.maximum;
98
+ else if (def.check === "string_format") {
99
+ if (def.format === "email")
100
+ jsonSchema.format = "email";
101
+ else if (def.format === "url")
102
+ jsonSchema.format = "uri";
103
+ // Zod 3 `.uuid()` maps to `.guid()` in zod 4 to keep the loose UUID
104
+ // format. Publish both as the OpenAPI `uuid` format so the spec does not
105
+ // change.
106
+ else if (def.format === "uuid" || def.format === "guid")
107
+ jsonSchema.format = "uuid";
108
+ else if (def.format === "datetime")
109
+ jsonSchema.format = "date-time";
110
+ // Zod 4 stores a `.regex()` pattern as a `RegExp`; publish its source.
111
+ else if (def.format === "regex") {
112
+ if (def.pattern instanceof RegExp)
113
+ jsonSchema.pattern = def.pattern.source;
114
+ else if (typeof def.pattern === "string")
115
+ jsonSchema.pattern = def.pattern;
116
+ }
97
117
  }
98
118
  }
99
119
  }
100
120
  function applyNumberChecks(jsonSchema, checks) {
101
121
  for (const check of checks) {
102
- if (check.kind === "int")
103
- jsonSchema.type = "integer";
104
- if (check.kind === "min") {
105
- jsonSchema.minimum = check.value;
106
- if (!check.inclusive)
122
+ const def = checkDef(check);
123
+ if (!def)
124
+ continue;
125
+ // `.int()` records a number-format check such as `safeint`.
126
+ if (def.check === "number_format") {
127
+ if (typeof def.format === "string" && def.format.includes("int")) {
128
+ jsonSchema.type = "integer";
129
+ }
130
+ }
131
+ else if (def.check === "greater_than") {
132
+ jsonSchema.minimum = def.value;
133
+ if (!def.inclusive)
107
134
  jsonSchema.exclusiveMinimum = true;
108
135
  }
109
- if (check.kind === "max") {
110
- jsonSchema.maximum = check.value;
111
- if (!check.inclusive)
136
+ else if (def.check === "less_than") {
137
+ jsonSchema.maximum = def.value;
138
+ if (!def.inclusive)
112
139
  jsonSchema.exclusiveMaximum = true;
113
140
  }
114
141
  }
115
142
  }
116
143
  function zodToOpenApiSchema(schema) {
117
144
  const unwrapped = unwrapSchema(schema);
118
- const typeName = zodTypeName(unwrapped);
119
- if (typeName === "ZodString") {
145
+ const def = zodDef(unwrapped);
146
+ const typeName = def.type;
147
+ if (typeName === "string") {
120
148
  const jsonSchema = { type: "string" };
121
- applyStringChecks(jsonSchema, unwrapped._def.checks ?? []);
149
+ applyStringChecks(jsonSchema, def.checks ?? []);
122
150
  return jsonSchema;
123
151
  }
124
- if (typeName === "ZodNumber") {
152
+ if (typeName === "number") {
125
153
  const jsonSchema = { type: "number" };
126
- applyNumberChecks(jsonSchema, unwrapped._def.checks ?? []);
154
+ applyNumberChecks(jsonSchema, def.checks ?? []);
127
155
  return jsonSchema;
128
156
  }
129
- if (typeName === "ZodBoolean")
157
+ if (typeName === "boolean")
130
158
  return { type: "boolean" };
131
- if (typeName === "ZodDate")
159
+ if (typeName === "date")
132
160
  return { type: "string", format: "date-time" };
133
- if (typeName === "ZodAny" || typeName === "ZodUnknown")
161
+ if (typeName === "any" || typeName === "unknown")
134
162
  return {};
135
- if (typeName === "ZodLiteral") {
136
- const value = unwrapped._def.value;
137
- return { type: typeof value, enum: [value] };
138
- }
139
- if (typeName === "ZodEnum") {
140
- return { type: "string", enum: unwrapped._def.values };
163
+ if (typeName === "literal") {
164
+ const values = def.values;
165
+ return { type: typeof values[0], enum: values };
141
166
  }
142
- if (typeName === "ZodNativeEnum") {
143
- const values = Object.values(unwrapped._def.values).filter((value) => typeof value === "string" || typeof value === "number");
144
- return { enum: Array.from(new Set(values)) };
167
+ // Zod 4 merges string enums and native enums into one `enum` type and stores
168
+ // the members on `entries`. A pure string enum keeps `type: "string"`; a
169
+ // native enum can hold numbers, so it publishes the values without a type.
170
+ if (typeName === "enum") {
171
+ const values = Array.from(new Set(Object.values(def.entries).filter((value) => typeof value === "string" || typeof value === "number")));
172
+ if (values.every((value) => typeof value === "string")) {
173
+ return { type: "string", enum: values };
174
+ }
175
+ return { enum: values };
145
176
  }
146
- if (typeName === "ZodArray") {
147
- return { type: "array", items: zodToOpenApiSchema(unwrapped._def.type) };
177
+ if (typeName === "array") {
178
+ return { type: "array", items: zodToOpenApiSchema(def.element) };
148
179
  }
149
- if (typeName === "ZodRecord") {
180
+ if (typeName === "record") {
150
181
  return {
151
182
  type: "object",
152
- additionalProperties: zodToOpenApiSchema(unwrapped._def.valueType),
183
+ additionalProperties: zodToOpenApiSchema(def.valueType),
153
184
  };
154
185
  }
155
- if (typeName === "ZodNullable") {
156
- return { ...zodToOpenApiSchema(unwrapped._def.innerType), nullable: true };
157
- }
158
- if (typeName === "ZodUnion") {
159
- return { oneOf: unwrapped._def.options.map((option) => zodToOpenApiSchema(option)) };
186
+ if (typeName === "nullable") {
187
+ return { ...zodToOpenApiSchema(def.innerType), nullable: true };
160
188
  }
161
- if (typeName === "ZodDiscriminatedUnion") {
189
+ // Zod 4 represents a plain union and a discriminated union as one `union`
190
+ // type with the members on `options`.
191
+ if (typeName === "union") {
162
192
  return {
163
- oneOf: Array.from(unwrapped._def.options.values()).map((option) => zodToOpenApiSchema(option)),
193
+ oneOf: def.options.map((option) => zodToOpenApiSchema(option)),
164
194
  };
165
195
  }
166
- if (typeName === "ZodIntersection") {
196
+ if (typeName === "intersection") {
167
197
  return {
168
198
  allOf: [
169
- zodToOpenApiSchema(unwrapped._def.left),
170
- zodToOpenApiSchema(unwrapped._def.right),
199
+ zodToOpenApiSchema(def.left),
200
+ zodToOpenApiSchema(def.right),
171
201
  ],
172
202
  };
173
203
  }
174
- if (typeName === "ZodObject") {
175
- const shape = unwrapped._def.shape();
204
+ if (typeName === "object") {
205
+ const shape = def.shape;
176
206
  const properties = {};
177
207
  const required = [];
178
208
  for (const [key, value] of Object.entries(shape)) {
179
- const propertySchema = value;
180
- properties[key] = zodToOpenApiSchema(propertySchema);
181
- if (!isOptionalSchema(propertySchema))
209
+ properties[key] = zodToOpenApiSchema(value);
210
+ if (!isOptionalSchema(value))
182
211
  required.push(key);
183
212
  }
184
213
  const jsonSchema = { type: "object", properties };
185
214
  if (required.length > 0)
186
215
  jsonSchema.required = required;
187
- // A `.strict()` Zod object forbids an unknown key. Publish that constraint
188
- // as `additionalProperties: false`, so a client, a gateway, or a handler
189
- // that treats the contract as authoritative rejects an extra property too.
190
- if (unwrapped._def.unknownKeys === "strict")
216
+ // A `.strict()` Zod object forbids an unknown key. Zod 4 records that as a
217
+ // `never` catchall. Publish the constraint as `additionalProperties: false`,
218
+ // so a client, a gateway, or a handler that treats the contract as
219
+ // authoritative rejects an extra property too.
220
+ const catchall = def.catchall;
221
+ if (catchall && zodDef(catchall).type === "never") {
191
222
  jsonSchema.additionalProperties = false;
223
+ }
192
224
  return jsonSchema;
193
225
  }
194
226
  return {};
@@ -226,9 +258,9 @@ function normalizeResponses(responses = {}) {
226
258
  }
227
259
  function parametersFromSchema(schema, location) {
228
260
  const objectSchema = unwrapSchema(schema);
229
- if (zodTypeName(objectSchema) !== "ZodObject")
261
+ if (zodTypeName(objectSchema) !== "object")
230
262
  return [];
231
- const shape = objectSchema._def.shape();
263
+ const shape = zodDef(objectSchema).shape;
232
264
  return Object.entries(shape).map(([name, value]) => ({
233
265
  name,
234
266
  in: location,
@@ -281,7 +313,7 @@ const registry = new OpenAPIRegistry();
281
313
  // ─── Common schemas ──────────────────────────────────────────────────────────
282
314
  const ErrorSchema = registry.register("Error", z.object({ error: z.string() }));
283
315
  const responses = {
284
- ok: (schema = z.record(z.unknown())) => ({
316
+ ok: (schema = z.record(z.string(), z.unknown())) => ({
285
317
  description: "Success",
286
318
  content: { "application/json": { schema } },
287
319
  }),
@@ -306,6 +338,14 @@ const responses = {
306
338
  description: "Conflict",
307
339
  content: { "application/json": { schema: ErrorSchema } },
308
340
  },
341
+ payloadTooLarge: {
342
+ description: "Payload too large",
343
+ content: { "application/json": { schema: ErrorSchema } },
344
+ },
345
+ unsupportedMediaType: {
346
+ description: "Unsupported media type",
347
+ content: { "application/json": { schema: ErrorSchema } },
348
+ },
309
349
  unprocessable: {
310
350
  description: "Unprocessable entity",
311
351
  content: { "application/json": { schema: ErrorSchema } },
@@ -357,10 +397,10 @@ const importRequestBody = (schema) => ({
357
397
  });
358
398
  const r = responses;
359
399
  const externalObjectSummariesBodySchema = z.object({
360
- issueIds: z.array(z.string().uuid()).max(1000),
400
+ issueIds: z.array(z.string().guid()).max(1000),
361
401
  }).strict();
362
402
  const refreshExternalObjectsBodySchema = z.object({
363
- objectIds: z.array(z.string().uuid()).max(50).optional(),
403
+ objectIds: z.array(z.string().guid()).max(50).optional(),
364
404
  }).strict();
365
405
  // The start route reads the body directly, so document the accepted fields
366
406
  // here. A sandbox environment is required. The time-to-live is optional.
@@ -390,13 +430,17 @@ const environmentCustomImageTemplateRollbackResultSchema = z.object({
390
430
  activeTemplate: environmentCustomImageTemplateSchema,
391
431
  supersededTemplate: environmentCustomImageTemplateSchema,
392
432
  }).strict();
433
+ const environmentCustomImageTemplateRelinkResultSchema = z.object({
434
+ template: environmentCustomImageTemplateSchema,
435
+ classification: z.enum(["knob_only", "boot_source_drift", "unclassified"]),
436
+ }).strict();
393
437
  const workTimelineQuerySchema = z.object({
394
438
  from: z.string().optional(),
395
439
  to: z.string().optional(),
396
440
  userId: z.string().optional(),
397
- goalId: z.string().uuid().optional(),
398
- projectId: z.string().uuid().optional(),
399
- issueId: z.string().uuid().optional(),
441
+ goalId: z.string().guid().optional(),
442
+ projectId: z.string().guid().optional(),
443
+ issueId: z.string().guid().optional(),
400
444
  limit: z.string().optional(),
401
445
  offset: z.string().optional(),
402
446
  }).strict();
@@ -536,6 +580,7 @@ const BOARD_ONLY_OPERATIONS = new Set([
536
580
  "PATCH /api/companies/{companyId}/members/{memberId}/permissions",
537
581
  "GET /api/companies/{companyId}/user-directory",
538
582
  "POST /api/execution-workspaces/{id}/reconcile-branch",
583
+ "POST /api/execution-workspaces/{id}/login-handoff",
539
584
  "GET /api/board-api-keys",
540
585
  "POST /api/board-api-keys",
541
586
  "DELETE /api/board-api-keys/{keyId}",
@@ -1368,6 +1413,7 @@ registry.registerPath({
1368
1413
  });
1369
1414
  const AgentSecretListResponseSchema = z.object({
1370
1415
  secrets: z.array(z.object({
1416
+ secretRef: z.string().guid(),
1371
1417
  key: z.string(),
1372
1418
  name: z.string(),
1373
1419
  description: z.string().nullable(),
@@ -1388,19 +1434,29 @@ const createAgentSecretProposalSchema = z.discriminatedUnion("kind", [
1388
1434
  }),
1389
1435
  z.object({
1390
1436
  kind: z.literal("binding"),
1391
- secretId: z.string().uuid().optional(),
1392
- secretProposalId: z.string().uuid().optional(),
1393
- targetAgentId: z.string().uuid().optional(),
1437
+ secretId: z.string().guid().optional(),
1438
+ sourceConfigPath: z.string().min(1).optional(),
1439
+ secretProposalId: z.string().guid().optional(),
1440
+ targetAgentId: z.string().guid().optional(),
1394
1441
  configPath: z.string().min(1),
1395
1442
  justification: z.string().min(1),
1396
1443
  }),
1397
- ]);
1444
+ ]).superRefine((value, ctx) => {
1445
+ if (value.kind === "binding"
1446
+ && [value.secretId, value.sourceConfigPath, value.secretProposalId]
1447
+ .filter((reference) => Boolean(reference)).length !== 1) {
1448
+ ctx.addIssue({
1449
+ code: z.ZodIssueCode.custom,
1450
+ message: "Provide exactly one of secretId, sourceConfigPath, or secretProposalId",
1451
+ });
1452
+ }
1453
+ });
1398
1454
  const approveSecretProposalSchema = z.object({
1399
1455
  cascade: z.boolean().optional(),
1400
1456
  overrides: z.object({
1401
1457
  name: z.string().min(1).optional(),
1402
1458
  description: z.string().optional().nullable(),
1403
- providerConfigId: z.string().uuid().optional().nullable(),
1459
+ providerConfigId: z.string().guid().optional().nullable(),
1404
1460
  }).optional(),
1405
1461
  });
1406
1462
  const rejectSecretProposalSchema = z.object({ reason: z.string().min(1) });
@@ -1424,7 +1480,7 @@ registry.registerPath({
1424
1480
  path: "/api/agents/me/secret-proposals/{id}",
1425
1481
  tags: ["secrets"],
1426
1482
  summary: "Withdraw a pending secret proposal",
1427
- request: { params: z.object({ id: z.string().uuid() }) },
1483
+ request: { params: z.object({ id: z.string().guid() }) },
1428
1484
  responses: { 200: r.ok(), 401: r.unauthorized, 403: r.forbidden, 404: r.notFound, 409: r.conflict },
1429
1485
  });
1430
1486
  registry.registerPath({
@@ -1808,7 +1864,7 @@ registry.registerPath({
1808
1864
  params: z.object({ companyId: z.string() }),
1809
1865
  body: jsonBody(createIssueSchema),
1810
1866
  },
1811
- responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
1867
+ responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 422: r.unprocessable },
1812
1868
  });
1813
1869
  registry.registerPath({
1814
1870
  method: "get",
@@ -1827,7 +1883,7 @@ registry.registerPath({
1827
1883
  params: z.object({ id: z.string() }),
1828
1884
  body: jsonBody(updateIssueSchema.partial()),
1829
1885
  },
1830
- responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 404: r.notFound },
1886
+ responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 404: r.notFound, 422: r.unprocessable },
1831
1887
  });
1832
1888
  registry.registerPath({
1833
1889
  method: "post",
@@ -1909,6 +1965,24 @@ registry.registerPath({
1909
1965
  },
1910
1966
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
1911
1967
  });
1968
+ registry.registerPath({
1969
+ method: "post",
1970
+ path: "/api/issues/{id}/work-products/{workProductId}/review-document",
1971
+ tags: ["issues"],
1972
+ summary: "Ensure the review document for a Markdown work product",
1973
+ request: { params: z.object({ id: z.string(), workProductId: z.string() }) },
1974
+ responses: {
1975
+ 200: r.ok(),
1976
+ 201: r.ok(),
1977
+ 401: r.unauthorized,
1978
+ 403: r.forbidden,
1979
+ 404: r.notFound,
1980
+ 409: r.conflict,
1981
+ 413: r.payloadTooLarge,
1982
+ 415: r.unsupportedMediaType,
1983
+ 422: r.unprocessable,
1984
+ },
1985
+ });
1912
1986
  registry.registerPath({
1913
1987
  method: "patch",
1914
1988
  path: "/api/work-products/{id}",
@@ -2384,7 +2458,7 @@ registry.registerPath({
2384
2458
  params: z.object({ id: z.string() }),
2385
2459
  body: jsonBody(runRoutineSchema),
2386
2460
  },
2387
- responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
2461
+ responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 422: r.unprocessable },
2388
2462
  });
2389
2463
  registry.registerPath({
2390
2464
  method: "post",
@@ -2524,7 +2598,7 @@ registry.registerPath({
2524
2598
  tags: ["secrets"],
2525
2599
  summary: "List company secret proposals for board review",
2526
2600
  request: {
2527
- params: z.object({ companyId: z.string().uuid() }),
2601
+ params: z.object({ companyId: z.string().guid() }),
2528
2602
  query: z.object({ status: z.enum(["pending", "approved", "rejected", "withdrawn", "expired"]).optional() }),
2529
2603
  },
2530
2604
  responses: { 200: r.ok(), 401: r.unauthorized, 403: r.forbidden },
@@ -2535,7 +2609,7 @@ registry.registerPath({
2535
2609
  tags: ["secrets"],
2536
2610
  summary: "Approve and execute a secret proposal as the approving board user",
2537
2611
  request: {
2538
- params: z.object({ companyId: z.string().uuid(), id: z.string().uuid() }),
2612
+ params: z.object({ companyId: z.string().guid(), id: z.string().guid() }),
2539
2613
  body: jsonBody(approveSecretProposalSchema),
2540
2614
  },
2541
2615
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 403: r.forbidden, 404: r.notFound, 409: r.conflict, 422: r.unprocessable },
@@ -2546,7 +2620,7 @@ registry.registerPath({
2546
2620
  tags: ["secrets"],
2547
2621
  summary: "Reject a pending secret proposal and dependent bindings",
2548
2622
  request: {
2549
- params: z.object({ companyId: z.string().uuid(), id: z.string().uuid() }),
2623
+ params: z.object({ companyId: z.string().guid(), id: z.string().guid() }),
2550
2624
  body: jsonBody(rejectSecretProposalSchema),
2551
2625
  },
2552
2626
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 403: r.forbidden, 404: r.notFound, 409: r.conflict, 422: r.unprocessable },
@@ -2882,9 +2956,9 @@ registry.registerPath({
2882
2956
  request: {
2883
2957
  params: z.object({ companyId: z.string() }),
2884
2958
  query: z.object({
2885
- agentId: z.string().uuid().optional(),
2959
+ agentId: z.string().guid().optional(),
2886
2960
  responsibleUserId: z.string().min(1).optional(),
2887
- runId: z.string().uuid().optional(),
2961
+ runId: z.string().guid().optional(),
2888
2962
  entityType: z.string().min(1).optional(),
2889
2963
  entityId: z.string().min(1).optional(),
2890
2964
  action: z.string().min(1).optional(),
@@ -2905,9 +2979,9 @@ registry.registerPath({
2905
2979
  request: {
2906
2980
  params: z.object({ companyId: z.string() }),
2907
2981
  query: z.object({
2908
- agentId: z.string().uuid().optional(),
2982
+ agentId: z.string().guid().optional(),
2909
2983
  responsibleUserId: z.string().min(1).optional(),
2910
- runId: z.string().uuid().optional(),
2984
+ runId: z.string().guid().optional(),
2911
2985
  entityType: z.string().min(1).optional(),
2912
2986
  entityId: z.string().min(1).optional(),
2913
2987
  action: z.string().min(1).optional(),
@@ -2941,8 +3015,8 @@ registry.registerPath({
2941
3015
  action: z.string().min(1),
2942
3016
  entityType: z.string().min(1),
2943
3017
  entityId: z.string().min(1),
2944
- agentId: z.string().uuid().optional().nullable(),
2945
- details: z.record(z.unknown()).optional().nullable(),
3018
+ agentId: z.string().guid().optional().nullable(),
3019
+ details: z.record(z.string(), z.unknown()).optional().nullable(),
2946
3020
  })),
2947
3021
  },
2948
3022
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
@@ -3274,9 +3348,9 @@ registerCurrentRoute({
3274
3348
  summary: "List decisions",
3275
3349
  query: z.object({
3276
3350
  status: z.enum(["open", "decided", "expired", "cancelled"]).optional(),
3277
- bundleId: z.string().uuid().optional(),
3278
- targetIssueId: z.string().uuid().optional(),
3279
- originAgentId: z.string().uuid().optional(),
3351
+ bundleId: z.string().guid().optional(),
3352
+ targetIssueId: z.string().guid().optional(),
3353
+ originAgentId: z.string().guid().optional(),
3280
3354
  limit: z.coerce.number().int().positive().max(100).optional(),
3281
3355
  }),
3282
3356
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 403: r.forbidden },
@@ -3288,7 +3362,7 @@ registerCurrentRoute({
3288
3362
  summary: "Get decision telemetry grouped by rule key",
3289
3363
  query: z.object({
3290
3364
  groupBy: z.literal("ruleKey"),
3291
- originAgentId: z.string().uuid().optional(),
3365
+ originAgentId: z.string().guid().optional(),
3292
3366
  since: z.string().datetime().optional(),
3293
3367
  }),
3294
3368
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 403: r.forbidden },
@@ -3336,8 +3410,8 @@ registerCurrentRoute({
3336
3410
  summary: "Capture a decision training example",
3337
3411
  body: z.object({
3338
3412
  sourceKind: decisionTrainingSourceKindSchema,
3339
- sourceId: z.string().uuid(),
3340
- issueId: z.string().uuid(),
3413
+ sourceId: z.string().guid(),
3414
+ issueId: z.string().guid(),
3341
3415
  notes: z.string().max(100_000).default(""),
3342
3416
  }).strict(),
3343
3417
  responses: { 201: r.ok(), 400: r.badRequest, 401: r.unauthorized, 403: r.forbidden, 404: r.notFound, 409: r.conflict },
@@ -3349,8 +3423,8 @@ registerCurrentRoute({
3349
3423
  summary: "Preview a decision training snapshot",
3350
3424
  body: z.object({
3351
3425
  sourceKind: decisionTrainingSourceKindSchema,
3352
- sourceId: z.string().uuid(),
3353
- issueId: z.string().uuid(),
3426
+ sourceId: z.string().guid(),
3427
+ issueId: z.string().guid(),
3354
3428
  }).strict(),
3355
3429
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 403: r.forbidden, 404: r.notFound, 409: r.conflict },
3356
3430
  });
@@ -3360,7 +3434,7 @@ registerCurrentRoute({
3360
3434
  tags: ["decision-training"],
3361
3435
  summary: "List decision training examples",
3362
3436
  query: z.object({
3363
- project: z.string().uuid().optional(),
3437
+ project: z.string().guid().optional(),
3364
3438
  kind: decisionTrainingSourceKindSchema.optional(),
3365
3439
  author: z.string().optional(),
3366
3440
  q: z.string().max(500).optional(),
@@ -4101,7 +4175,7 @@ registry.registerPath({
4101
4175
  tags: ["issues"],
4102
4176
  summary: "Create child issues",
4103
4177
  request: { params: z.object({ id: z.string() }), body: jsonBody(createChildIssueSchema) },
4104
- responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
4178
+ responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized, 422: r.unprocessable },
4105
4179
  });
4106
4180
  registry.registerPath({
4107
4181
  method: "post",
@@ -4624,6 +4698,32 @@ registry.registerPath({
4624
4698
  },
4625
4699
  responses: { 200: r.ok(), 401: r.unauthorized, 403: r.forbidden, 422: r.unprocessable },
4626
4700
  });
4701
+ registry.registerPath({
4702
+ method: "post",
4703
+ path: "/api/execution-workspaces/{id}/login-handoff",
4704
+ tags: ["execution-workspaces"],
4705
+ summary: "Issue a single-use workspace login handoff",
4706
+ description: "Mints a short-lived, single-use ticket the isolated workspace exchanges for its own "
4707
+ + "instance-scoped session, so opening a managed workspace does not depend on a cloned "
4708
+ + "password. Board actors only. The response `url` must be navigated to, not stored: the "
4709
+ + "workspace answers it with a redirect so the ticket never enters browser history. A refusal "
4710
+ + "carries a machine `reason` and, where the control plane probed it, the workspace's own "
4711
+ + "readiness.",
4712
+ request: {
4713
+ params: z.object({ id: z.string() }),
4714
+ body: jsonBody(z.object({
4715
+ next: z.string().optional().describe("Same-origin path to land on; anything else collapses to `/`."),
4716
+ })),
4717
+ },
4718
+ responses: {
4719
+ 201: r.ok(),
4720
+ 401: r.unauthorized,
4721
+ 403: r.forbidden,
4722
+ 404: r.notFound,
4723
+ 409: r.conflict,
4724
+ 501: r.serverError,
4725
+ },
4726
+ });
4627
4727
  registry.registerPath({
4628
4728
  method: "post",
4629
4729
  path: "/api/execution-workspaces/{id}/runtime-services/{action}",
@@ -4864,6 +4964,25 @@ registry.registerPath({
4864
4964
  404: r.notFound,
4865
4965
  },
4866
4966
  });
4967
+ registry.registerPath({
4968
+ method: "post",
4969
+ path: "/api/environments/{environmentId}/custom-image-template/relink",
4970
+ tags: ["environments"],
4971
+ summary: "Relink a detached environment customImage template to the current config",
4972
+ request: {
4973
+ params: z.object({ environmentId: z.string() }),
4974
+ query: environmentCustomImageCompanyQuerySchema,
4975
+ body: jsonBody(relinkEnvironmentCustomImageTemplateSchema),
4976
+ },
4977
+ responses: {
4978
+ 200: r.ok(environmentCustomImageTemplateRelinkResultSchema),
4979
+ 400: r.badRequest,
4980
+ 401: r.unauthorized,
4981
+ 403: r.forbidden,
4982
+ 404: r.notFound,
4983
+ 409: r.conflict,
4984
+ },
4985
+ });
4867
4986
  registry.registerPath({
4868
4987
  method: "delete",
4869
4988
  path: "/api/environments/{environmentId}/custom-image-template",
@@ -4993,7 +5112,7 @@ registry.registerPath({
4993
5112
  request: {
4994
5113
  body: jsonBody(z.object({
4995
5114
  tool: z.string(),
4996
- parameters: z.record(z.unknown()).optional(),
5115
+ parameters: z.record(z.string(), z.unknown()).optional(),
4997
5116
  runContext: z.object({
4998
5117
  agentId: z.string(),
4999
5118
  runId: z.string(),
@@ -5092,7 +5211,7 @@ registry.registerPath({
5092
5211
  summary: "Set company-scoped plugin config",
5093
5212
  request: {
5094
5213
  params: z.object({ pluginId: z.string() }),
5095
- body: jsonBody(z.object({ companyId: z.string(), configJson: z.record(z.unknown()) })),
5214
+ body: jsonBody(z.object({ companyId: z.string(), configJson: z.record(z.string(), z.unknown()) })),
5096
5215
  },
5097
5216
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
5098
5217
  });
@@ -5103,7 +5222,7 @@ registry.registerPath({
5103
5222
  summary: "Test company-scoped plugin config",
5104
5223
  request: {
5105
5224
  params: z.object({ pluginId: z.string() }),
5106
- body: jsonBody(z.object({ companyId: z.string(), configJson: z.record(z.unknown()) })),
5225
+ body: jsonBody(z.object({ companyId: z.string(), configJson: z.record(z.string(), z.unknown()) })),
5107
5226
  },
5108
5227
  responses: { 200: r.ok(), 400: r.badRequest, 401: r.unauthorized },
5109
5228
  });
@@ -5159,7 +5278,7 @@ registry.registerPath({
5159
5278
  body: jsonBody(z.object({
5160
5279
  key: z.string(),
5161
5280
  companyId: z.string().optional(),
5162
- params: z.record(z.unknown()).optional(),
5281
+ params: z.record(z.string(), z.unknown()).optional(),
5163
5282
  })),
5164
5283
  },
5165
5284
  responses: { 200: r.ok(), 401: r.unauthorized },
@@ -5174,7 +5293,7 @@ registry.registerPath({
5174
5293
  body: jsonBody(z.object({
5175
5294
  key: z.string(),
5176
5295
  companyId: z.string().optional(),
5177
- params: z.record(z.unknown()).optional(),
5296
+ params: z.record(z.string(), z.unknown()).optional(),
5178
5297
  })),
5179
5298
  },
5180
5299
  responses: { 200: r.ok(), 401: r.unauthorized },
@@ -5188,7 +5307,7 @@ registry.registerPath({
5188
5307
  params: z.object({ pluginId: z.string(), key: z.string() }),
5189
5308
  body: jsonBody(z.object({
5190
5309
  companyId: z.string().optional(),
5191
- params: z.record(z.unknown()).optional(),
5310
+ params: z.record(z.string(), z.unknown()).optional(),
5192
5311
  })),
5193
5312
  },
5194
5313
  responses: { 200: r.ok(), 401: r.unauthorized },
@@ -5202,7 +5321,7 @@ registry.registerPath({
5202
5321
  params: z.object({ pluginId: z.string(), key: z.string() }),
5203
5322
  body: jsonBody(z.object({
5204
5323
  companyId: z.string().optional(),
5205
- params: z.record(z.unknown()).optional(),
5324
+ params: z.record(z.string(), z.unknown()).optional(),
5206
5325
  })),
5207
5326
  },
5208
5327
  responses: { 200: r.ok(), 401: r.unauthorized },
@@ -5880,7 +5999,7 @@ for (const route of [
5880
5999
  path: route[1],
5881
6000
  tags: ["skills"],
5882
6001
  summary: route[2],
5883
- ...(route[0] === "post" ? { body: z.record(z.unknown()).optional() } : {}),
6002
+ ...(route[0] === "post" ? { body: z.record(z.string(), z.unknown()).optional() } : {}),
5884
6003
  });
5885
6004
  }
5886
6005
  registerCurrentRoute({
@@ -5946,7 +6065,7 @@ registerCurrentRoute({
5946
6065
  summary: "Promote quarantined low-trust output",
5947
6066
  body: z.object({
5948
6067
  sourceArtifactKind: z.enum(["comment", "document", "work_product", "issue"]),
5949
- sourceArtifactId: z.string().uuid(),
6068
+ sourceArtifactId: z.string().guid(),
5950
6069
  title: z.string().trim().min(1).max(200),
5951
6070
  summary: z.string().trim().min(1).max(8_000),
5952
6071
  }),
@@ -6571,7 +6690,7 @@ const toolGatewaySessionSchema = z.object({
6571
6690
  });
6572
6691
  const toolGatewayCallSchema = z.object({
6573
6692
  tool: z.string(),
6574
- parameters: z.record(z.unknown()).optional(),
6693
+ parameters: z.record(z.string(), z.unknown()).optional(),
6575
6694
  timeoutMs: z.number().int().positive().optional(),
6576
6695
  approvedActionRequestId: z.string().optional(),
6577
6696
  idempotencyKey: z.string().optional(),
@@ -6582,7 +6701,7 @@ const toolGatewayCompanyQuerySchema = z.object({
6582
6701
  const toolGatewayCompanyBodySchema = z.object({
6583
6702
  companyId: z.string(),
6584
6703
  }).passthrough();
6585
- const mcpGatewayProtocolSchema = z.record(z.unknown());
6704
+ const mcpGatewayProtocolSchema = z.record(z.string(), z.unknown());
6586
6705
  registerCurrentRoute({
6587
6706
  method: "get",
6588
6707
  path: "/mcp/gateways/{gatewayPublicId}",