@paperclipai_dld/server 2026.319.0-canary.3

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 (702) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/codex-models.d.ts +4 -0
  3. package/dist/adapters/codex-models.d.ts.map +1 -0
  4. package/dist/adapters/codex-models.js +98 -0
  5. package/dist/adapters/codex-models.js.map +1 -0
  6. package/dist/adapters/cursor-models.d.ts +13 -0
  7. package/dist/adapters/cursor-models.d.ts.map +1 -0
  8. package/dist/adapters/cursor-models.js +148 -0
  9. package/dist/adapters/cursor-models.js.map +1 -0
  10. package/dist/adapters/http/execute.d.ts +3 -0
  11. package/dist/adapters/http/execute.d.ts.map +1 -0
  12. package/dist/adapters/http/execute.js +39 -0
  13. package/dist/adapters/http/execute.js.map +1 -0
  14. package/dist/adapters/http/index.d.ts +3 -0
  15. package/dist/adapters/http/index.d.ts.map +1 -0
  16. package/dist/adapters/http/index.js +20 -0
  17. package/dist/adapters/http/index.js.map +1 -0
  18. package/dist/adapters/http/test.d.ts +3 -0
  19. package/dist/adapters/http/test.d.ts.map +1 -0
  20. package/dist/adapters/http/test.js +106 -0
  21. package/dist/adapters/http/test.js.map +1 -0
  22. package/dist/adapters/index.d.ts +4 -0
  23. package/dist/adapters/index.d.ts.map +1 -0
  24. package/dist/adapters/index.js +3 -0
  25. package/dist/adapters/index.js.map +1 -0
  26. package/dist/adapters/process/execute.d.ts +3 -0
  27. package/dist/adapters/process/execute.d.ts.map +1 -0
  28. package/dist/adapters/process/execute.js +63 -0
  29. package/dist/adapters/process/execute.js.map +1 -0
  30. package/dist/adapters/process/index.d.ts +3 -0
  31. package/dist/adapters/process/index.d.ts.map +1 -0
  32. package/dist/adapters/process/index.js +23 -0
  33. package/dist/adapters/process/index.js.map +1 -0
  34. package/dist/adapters/process/test.d.ts +3 -0
  35. package/dist/adapters/process/test.d.ts.map +1 -0
  36. package/dist/adapters/process/test.js +77 -0
  37. package/dist/adapters/process/test.js.map +1 -0
  38. package/dist/adapters/registry.d.ts +9 -0
  39. package/dist/adapters/registry.d.ts.map +1 -0
  40. package/dist/adapters/registry.js +142 -0
  41. package/dist/adapters/registry.js.map +1 -0
  42. package/dist/adapters/types.d.ts +2 -0
  43. package/dist/adapters/types.d.ts.map +1 -0
  44. package/dist/adapters/types.js +2 -0
  45. package/dist/adapters/types.js.map +1 -0
  46. package/dist/adapters/utils.d.ts +10 -0
  47. package/dist/adapters/utils.d.ts.map +1 -0
  48. package/dist/adapters/utils.js +14 -0
  49. package/dist/adapters/utils.js.map +1 -0
  50. package/dist/agent-auth-jwt.d.ts +14 -0
  51. package/dist/agent-auth-jwt.d.ts.map +1 -0
  52. package/dist/agent-auth-jwt.js +117 -0
  53. package/dist/agent-auth-jwt.js.map +1 -0
  54. package/dist/app.d.ts +25 -0
  55. package/dist/app.d.ts.map +1 -0
  56. package/dist/app.js +259 -0
  57. package/dist/app.js.map +1 -0
  58. package/dist/attachment-types.d.ts +33 -0
  59. package/dist/attachment-types.d.ts.map +1 -0
  60. package/dist/attachment-types.js +67 -0
  61. package/dist/attachment-types.js.map +1 -0
  62. package/dist/auth/better-auth.d.ts +24 -0
  63. package/dist/auth/better-auth.d.ts.map +1 -0
  64. package/dist/auth/better-auth.js +108 -0
  65. package/dist/auth/better-auth.js.map +1 -0
  66. package/dist/board-claim.d.ts +23 -0
  67. package/dist/board-claim.d.ts.map +1 -0
  68. package/dist/board-claim.js +115 -0
  69. package/dist/board-claim.js.map +1 -0
  70. package/dist/config-file.d.ts +3 -0
  71. package/dist/config-file.d.ts.map +1 -0
  72. package/dist/config-file.js +16 -0
  73. package/dist/config-file.js.map +1 -0
  74. package/dist/config.d.ts +38 -0
  75. package/dist/config.d.ts.map +1 -0
  76. package/dist/config.js +162 -0
  77. package/dist/config.js.map +1 -0
  78. package/dist/errors.d.ts +12 -0
  79. package/dist/errors.d.ts.map +1 -0
  80. package/dist/errors.js +28 -0
  81. package/dist/errors.js.map +1 -0
  82. package/dist/home-paths.d.ts +17 -0
  83. package/dist/home-paths.d.ts.map +1 -0
  84. package/dist/home-paths.js +75 -0
  85. package/dist/home-paths.js.map +1 -0
  86. package/dist/index.d.ts +10 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +581 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/log-redaction.d.ts +10 -0
  91. package/dist/log-redaction.d.ts.map +1 -0
  92. package/dist/log-redaction.js +110 -0
  93. package/dist/log-redaction.js.map +1 -0
  94. package/dist/middleware/auth.d.ts +12 -0
  95. package/dist/middleware/auth.d.ts.map +1 -0
  96. package/dist/middleware/auth.js +124 -0
  97. package/dist/middleware/auth.js.map +1 -0
  98. package/dist/middleware/board-mutation-guard.d.ts +3 -0
  99. package/dist/middleware/board-mutation-guard.d.ts.map +1 -0
  100. package/dist/middleware/board-mutation-guard.js +60 -0
  101. package/dist/middleware/board-mutation-guard.js.map +1 -0
  102. package/dist/middleware/error-handler.d.ts +17 -0
  103. package/dist/middleware/error-handler.d.ts.map +1 -0
  104. package/dist/middleware/error-handler.js +37 -0
  105. package/dist/middleware/error-handler.js.map +1 -0
  106. package/dist/middleware/index.d.ts +4 -0
  107. package/dist/middleware/index.d.ts.map +1 -0
  108. package/dist/middleware/index.js +4 -0
  109. package/dist/middleware/index.js.map +1 -0
  110. package/dist/middleware/logger.d.ts +4 -0
  111. package/dist/middleware/logger.d.ts.map +1 -0
  112. package/dist/middleware/logger.js +87 -0
  113. package/dist/middleware/logger.js.map +1 -0
  114. package/dist/middleware/private-hostname-guard.d.ts +11 -0
  115. package/dist/middleware/private-hostname-guard.d.ts.map +1 -0
  116. package/dist/middleware/private-hostname-guard.js +78 -0
  117. package/dist/middleware/private-hostname-guard.js.map +1 -0
  118. package/dist/middleware/validate.d.ts +4 -0
  119. package/dist/middleware/validate.d.ts.map +1 -0
  120. package/dist/middleware/validate.js +7 -0
  121. package/dist/middleware/validate.js.map +1 -0
  122. package/dist/paths.d.ts +3 -0
  123. package/dist/paths.d.ts.map +1 -0
  124. package/dist/paths.js +31 -0
  125. package/dist/paths.js.map +1 -0
  126. package/dist/realtime/live-events-ws.d.ts +28 -0
  127. package/dist/realtime/live-events-ws.d.ts.map +1 -0
  128. package/dist/realtime/live-events-ws.js +187 -0
  129. package/dist/realtime/live-events-ws.js.map +1 -0
  130. package/dist/redaction.d.ts +4 -0
  131. package/dist/redaction.d.ts.map +1 -0
  132. package/dist/redaction.js +63 -0
  133. package/dist/redaction.js.map +1 -0
  134. package/dist/routes/access.d.ts +56 -0
  135. package/dist/routes/access.d.ts.map +1 -0
  136. package/dist/routes/access.js +2124 -0
  137. package/dist/routes/access.js.map +1 -0
  138. package/dist/routes/activity.d.ts +3 -0
  139. package/dist/routes/activity.d.ts.map +1 -0
  140. package/dist/routes/activity.js +78 -0
  141. package/dist/routes/activity.js.map +1 -0
  142. package/dist/routes/agents.d.ts +4 -0
  143. package/dist/routes/agents.d.ts.map +1 -0
  144. package/dist/routes/agents.js +1390 -0
  145. package/dist/routes/agents.js.map +1 -0
  146. package/dist/routes/approvals.d.ts +3 -0
  147. package/dist/routes/approvals.d.ts.map +1 -0
  148. package/dist/routes/approvals.js +275 -0
  149. package/dist/routes/approvals.js.map +1 -0
  150. package/dist/routes/assets.d.ts +4 -0
  151. package/dist/routes/assets.d.ts.map +1 -0
  152. package/dist/routes/assets.js +309 -0
  153. package/dist/routes/assets.js.map +1 -0
  154. package/dist/routes/authz.d.ts +15 -0
  155. package/dist/routes/authz.d.ts.map +1 -0
  156. package/dist/routes/authz.js +40 -0
  157. package/dist/routes/authz.js.map +1 -0
  158. package/dist/routes/companies.d.ts +3 -0
  159. package/dist/routes/companies.d.ts.map +1 -0
  160. package/dist/routes/companies.js +174 -0
  161. package/dist/routes/companies.js.map +1 -0
  162. package/dist/routes/costs.d.ts +3 -0
  163. package/dist/routes/costs.d.ts.map +1 -0
  164. package/dist/routes/costs.js +268 -0
  165. package/dist/routes/costs.js.map +1 -0
  166. package/dist/routes/dashboard.d.ts +3 -0
  167. package/dist/routes/dashboard.d.ts.map +1 -0
  168. package/dist/routes/dashboard.js +15 -0
  169. package/dist/routes/dashboard.js.map +1 -0
  170. package/dist/routes/execution-workspaces.d.ts +3 -0
  171. package/dist/routes/execution-workspaces.d.ts.map +1 -0
  172. package/dist/routes/execution-workspaces.js +165 -0
  173. package/dist/routes/execution-workspaces.js.map +1 -0
  174. package/dist/routes/goals.d.ts +3 -0
  175. package/dist/routes/goals.d.ts.map +1 -0
  176. package/dist/routes/goals.js +95 -0
  177. package/dist/routes/goals.js.map +1 -0
  178. package/dist/routes/health.d.ts +9 -0
  179. package/dist/routes/health.d.ts.map +1 -0
  180. package/dist/routes/health.js +51 -0
  181. package/dist/routes/health.js.map +1 -0
  182. package/dist/routes/index.d.ts +16 -0
  183. package/dist/routes/index.d.ts.map +1 -0
  184. package/dist/routes/index.js +16 -0
  185. package/dist/routes/index.js.map +1 -0
  186. package/dist/routes/instance-settings.d.ts +3 -0
  187. package/dist/routes/instance-settings.d.ts.map +1 -0
  188. package/dist/routes/instance-settings.js +46 -0
  189. package/dist/routes/instance-settings.js.map +1 -0
  190. package/dist/routes/issues-checkout-wakeup.d.ts +9 -0
  191. package/dist/routes/issues-checkout-wakeup.d.ts.map +1 -0
  192. package/dist/routes/issues-checkout-wakeup.js +12 -0
  193. package/dist/routes/issues-checkout-wakeup.js.map +1 -0
  194. package/dist/routes/issues.d.ts +4 -0
  195. package/dist/routes/issues.d.ts.map +1 -0
  196. package/dist/routes/issues.js +1431 -0
  197. package/dist/routes/issues.js.map +1 -0
  198. package/dist/routes/llms.d.ts +3 -0
  199. package/dist/routes/llms.d.ts.map +1 -0
  200. package/dist/routes/llms.js +78 -0
  201. package/dist/routes/llms.js.map +1 -0
  202. package/dist/routes/plugin-ui-static.d.ts +69 -0
  203. package/dist/routes/plugin-ui-static.d.ts.map +1 -0
  204. package/dist/routes/plugin-ui-static.js +411 -0
  205. package/dist/routes/plugin-ui-static.js.map +1 -0
  206. package/dist/routes/plugins.d.ts +120 -0
  207. package/dist/routes/plugins.d.ts.map +1 -0
  208. package/dist/routes/plugins.js +1784 -0
  209. package/dist/routes/plugins.js.map +1 -0
  210. package/dist/routes/projects.d.ts +3 -0
  211. package/dist/routes/projects.d.ts.map +1 -0
  212. package/dist/routes/projects.js +257 -0
  213. package/dist/routes/projects.js.map +1 -0
  214. package/dist/routes/secrets.d.ts +3 -0
  215. package/dist/routes/secrets.d.ts.map +1 -0
  216. package/dist/routes/secrets.js +128 -0
  217. package/dist/routes/secrets.js.map +1 -0
  218. package/dist/routes/sidebar-badges.d.ts +3 -0
  219. package/dist/routes/sidebar-badges.d.ts.map +1 -0
  220. package/dist/routes/sidebar-badges.js +45 -0
  221. package/dist/routes/sidebar-badges.js.map +1 -0
  222. package/dist/secrets/external-stub-providers.d.ts +5 -0
  223. package/dist/secrets/external-stub-providers.d.ts.map +1 -0
  224. package/dist/secrets/external-stub-providers.js +21 -0
  225. package/dist/secrets/external-stub-providers.js.map +1 -0
  226. package/dist/secrets/local-encrypted-provider.d.ts +3 -0
  227. package/dist/secrets/local-encrypted-provider.d.ts.map +1 -0
  228. package/dist/secrets/local-encrypted-provider.js +116 -0
  229. package/dist/secrets/local-encrypted-provider.js.map +1 -0
  230. package/dist/secrets/provider-registry.d.ts +5 -0
  231. package/dist/secrets/provider-registry.d.ts.map +1 -0
  232. package/dist/secrets/provider-registry.js +20 -0
  233. package/dist/secrets/provider-registry.js.map +1 -0
  234. package/dist/secrets/types.d.ts +21 -0
  235. package/dist/secrets/types.d.ts.map +1 -0
  236. package/dist/secrets/types.js +2 -0
  237. package/dist/secrets/types.js.map +1 -0
  238. package/dist/services/access.d.ts +81 -0
  239. package/dist/services/access.d.ts.map +1 -0
  240. package/dist/services/access.js +187 -0
  241. package/dist/services/access.js.map +1 -0
  242. package/dist/services/activity-log.d.ts +17 -0
  243. package/dist/services/activity-log.d.ts.map +1 -0
  244. package/dist/services/activity-log.js +68 -0
  245. package/dist/services/activity-log.js.map +1 -0
  246. package/dist/services/activity.d.ts +764 -0
  247. package/dist/services/activity.d.ts.map +1 -0
  248. package/dist/services/activity.js +105 -0
  249. package/dist/services/activity.js.map +1 -0
  250. package/dist/services/agent-permissions.d.ts +6 -0
  251. package/dist/services/agent-permissions.d.ts.map +1 -0
  252. package/dist/services/agent-permissions.js +18 -0
  253. package/dist/services/agent-permissions.js.map +1 -0
  254. package/dist/services/agents.d.ts +1530 -0
  255. package/dist/services/agents.d.ts.map +1 -0
  256. package/dist/services/agents.js +566 -0
  257. package/dist/services/agents.js.map +1 -0
  258. package/dist/services/approvals.d.ts +546 -0
  259. package/dist/services/approvals.d.ts.map +1 -0
  260. package/dist/services/approvals.js +206 -0
  261. package/dist/services/approvals.js.map +1 -0
  262. package/dist/services/assets.d.ts +33 -0
  263. package/dist/services/assets.d.ts.map +1 -0
  264. package/dist/services/assets.js +17 -0
  265. package/dist/services/assets.js.map +1 -0
  266. package/dist/services/budgets.d.ts +38 -0
  267. package/dist/services/budgets.d.ts.map +1 -0
  268. package/dist/services/budgets.js +784 -0
  269. package/dist/services/budgets.js.map +1 -0
  270. package/dist/services/companies.d.ts +124 -0
  271. package/dist/services/companies.d.ts.map +1 -0
  272. package/dist/services/companies.js +256 -0
  273. package/dist/services/companies.js.map +1 -0
  274. package/dist/services/company-portability.d.ts +8 -0
  275. package/dist/services/company-portability.d.ts.map +1 -0
  276. package/dist/services/company-portability.js +867 -0
  277. package/dist/services/company-portability.js.map +1 -0
  278. package/dist/services/costs.d.ts +114 -0
  279. package/dist/services/costs.d.ts.map +1 -0
  280. package/dist/services/costs.js +294 -0
  281. package/dist/services/costs.js.map +1 -0
  282. package/dist/services/cron.d.ts +80 -0
  283. package/dist/services/cron.d.ts.map +1 -0
  284. package/dist/services/cron.js +300 -0
  285. package/dist/services/cron.js.map +1 -0
  286. package/dist/services/dashboard.d.ts +26 -0
  287. package/dist/services/dashboard.d.ts.map +1 -0
  288. package/dist/services/dashboard.js +98 -0
  289. package/dist/services/dashboard.js.map +1 -0
  290. package/dist/services/documents.d.ts +164 -0
  291. package/dist/services/documents.d.ts.map +1 -0
  292. package/dist/services/documents.js +382 -0
  293. package/dist/services/documents.js.map +1 -0
  294. package/dist/services/execution-workspace-policy.d.ts +20 -0
  295. package/dist/services/execution-workspace-policy.d.ts.map +1 -0
  296. package/dist/services/execution-workspace-policy.js +165 -0
  297. package/dist/services/execution-workspace-policy.js.map +1 -0
  298. package/dist/services/execution-workspaces.d.ts +19 -0
  299. package/dist/services/execution-workspaces.d.ts.map +1 -0
  300. package/dist/services/execution-workspaces.js +87 -0
  301. package/dist/services/execution-workspaces.js.map +1 -0
  302. package/dist/services/finance.d.ts +93 -0
  303. package/dist/services/finance.d.ts.map +1 -0
  304. package/dist/services/finance.js +120 -0
  305. package/dist/services/finance.js.map +1 -0
  306. package/dist/services/goals.d.ts +433 -0
  307. package/dist/services/goals.d.ts.map +1 -0
  308. package/dist/services/goals.js +54 -0
  309. package/dist/services/goals.js.map +1 -0
  310. package/dist/services/heartbeat-run-summary.d.ts +2 -0
  311. package/dist/services/heartbeat-run-summary.d.ts.map +1 -0
  312. package/dist/services/heartbeat-run-summary.js +30 -0
  313. package/dist/services/heartbeat-run-summary.js.map +1 -0
  314. package/dist/services/heartbeat.d.ts +766 -0
  315. package/dist/services/heartbeat.d.ts.map +1 -0
  316. package/dist/services/heartbeat.js +3024 -0
  317. package/dist/services/heartbeat.js.map +1 -0
  318. package/dist/services/hire-hook.d.ts +14 -0
  319. package/dist/services/hire-hook.d.ts.map +1 -0
  320. package/dist/services/hire-hook.js +85 -0
  321. package/dist/services/hire-hook.js.map +1 -0
  322. package/dist/services/index.d.ts +29 -0
  323. package/dist/services/index.d.ts.map +1 -0
  324. package/dist/services/index.js +29 -0
  325. package/dist/services/index.js.map +1 -0
  326. package/dist/services/instance-settings.d.ts +9 -0
  327. package/dist/services/instance-settings.d.ts.map +1 -0
  328. package/dist/services/instance-settings.js +80 -0
  329. package/dist/services/instance-settings.js.map +1 -0
  330. package/dist/services/issue-approvals.d.ts +56 -0
  331. package/dist/services/issue-approvals.d.ts.map +1 -0
  332. package/dist/services/issue-approvals.js +153 -0
  333. package/dist/services/issue-approvals.js.map +1 -0
  334. package/dist/services/issue-goal-fallback.d.ts +15 -0
  335. package/dist/services/issue-goal-fallback.d.ts.map +1 -0
  336. package/dist/services/issue-goal-fallback.js +15 -0
  337. package/dist/services/issue-goal-fallback.js.map +1 -0
  338. package/dist/services/issues.d.ts +532 -0
  339. package/dist/services/issues.d.ts.map +1 -0
  340. package/dist/services/issues.js +1308 -0
  341. package/dist/services/issues.js.map +1 -0
  342. package/dist/services/live-events.d.ts +17 -0
  343. package/dist/services/live-events.d.ts.map +1 -0
  344. package/dist/services/live-events.js +33 -0
  345. package/dist/services/live-events.js.map +1 -0
  346. package/dist/services/plugin-capability-validator.d.ts +108 -0
  347. package/dist/services/plugin-capability-validator.d.ts.map +1 -0
  348. package/dist/services/plugin-capability-validator.js +268 -0
  349. package/dist/services/plugin-capability-validator.js.map +1 -0
  350. package/dist/services/plugin-config-validator.d.ts +26 -0
  351. package/dist/services/plugin-config-validator.d.ts.map +1 -0
  352. package/dist/services/plugin-config-validator.js +41 -0
  353. package/dist/services/plugin-config-validator.js.map +1 -0
  354. package/dist/services/plugin-dev-watcher.d.ts +30 -0
  355. package/dist/services/plugin-dev-watcher.d.ts.map +1 -0
  356. package/dist/services/plugin-dev-watcher.js +241 -0
  357. package/dist/services/plugin-dev-watcher.js.map +1 -0
  358. package/dist/services/plugin-event-bus.d.ts +149 -0
  359. package/dist/services/plugin-event-bus.d.ts.map +1 -0
  360. package/dist/services/plugin-event-bus.js +258 -0
  361. package/dist/services/plugin-event-bus.js.map +1 -0
  362. package/dist/services/plugin-host-service-cleanup.d.ts +14 -0
  363. package/dist/services/plugin-host-service-cleanup.d.ts.map +1 -0
  364. package/dist/services/plugin-host-service-cleanup.js +37 -0
  365. package/dist/services/plugin-host-service-cleanup.js.map +1 -0
  366. package/dist/services/plugin-host-services.d.ts +13 -0
  367. package/dist/services/plugin-host-services.d.ts.map +1 -0
  368. package/dist/services/plugin-host-services.js +969 -0
  369. package/dist/services/plugin-host-services.js.map +1 -0
  370. package/dist/services/plugin-job-coordinator.d.ts +81 -0
  371. package/dist/services/plugin-job-coordinator.d.ts.map +1 -0
  372. package/dist/services/plugin-job-coordinator.js +172 -0
  373. package/dist/services/plugin-job-coordinator.js.map +1 -0
  374. package/dist/services/plugin-job-scheduler.d.ts +163 -0
  375. package/dist/services/plugin-job-scheduler.d.ts.map +1 -0
  376. package/dist/services/plugin-job-scheduler.js +454 -0
  377. package/dist/services/plugin-job-scheduler.js.map +1 -0
  378. package/dist/services/plugin-job-store.d.ts +208 -0
  379. package/dist/services/plugin-job-store.d.ts.map +1 -0
  380. package/dist/services/plugin-job-store.js +350 -0
  381. package/dist/services/plugin-job-store.js.map +1 -0
  382. package/dist/services/plugin-lifecycle.d.ts +203 -0
  383. package/dist/services/plugin-lifecycle.d.ts.map +1 -0
  384. package/dist/services/plugin-lifecycle.js +476 -0
  385. package/dist/services/plugin-lifecycle.js.map +1 -0
  386. package/dist/services/plugin-loader.d.ts +441 -0
  387. package/dist/services/plugin-loader.d.ts.map +1 -0
  388. package/dist/services/plugin-loader.js +1192 -0
  389. package/dist/services/plugin-loader.js.map +1 -0
  390. package/dist/services/plugin-log-retention.d.ts +20 -0
  391. package/dist/services/plugin-log-retention.d.ts.map +1 -0
  392. package/dist/services/plugin-log-retention.js +63 -0
  393. package/dist/services/plugin-log-retention.js.map +1 -0
  394. package/dist/services/plugin-manifest-validator.d.ts +79 -0
  395. package/dist/services/plugin-manifest-validator.d.ts.map +1 -0
  396. package/dist/services/plugin-manifest-validator.js +84 -0
  397. package/dist/services/plugin-manifest-validator.js.map +1 -0
  398. package/dist/services/plugin-registry.d.ts +2542 -0
  399. package/dist/services/plugin-registry.d.ts.map +1 -0
  400. package/dist/services/plugin-registry.js +539 -0
  401. package/dist/services/plugin-registry.js.map +1 -0
  402. package/dist/services/plugin-runtime-sandbox.d.ts +40 -0
  403. package/dist/services/plugin-runtime-sandbox.d.ts.map +1 -0
  404. package/dist/services/plugin-runtime-sandbox.js +154 -0
  405. package/dist/services/plugin-runtime-sandbox.js.map +1 -0
  406. package/dist/services/plugin-secrets-handler.d.ts +81 -0
  407. package/dist/services/plugin-secrets-handler.d.ts.map +1 -0
  408. package/dist/services/plugin-secrets-handler.js +275 -0
  409. package/dist/services/plugin-secrets-handler.js.map +1 -0
  410. package/dist/services/plugin-state-store.d.ts +92 -0
  411. package/dist/services/plugin-state-store.d.ts.map +1 -0
  412. package/dist/services/plugin-state-store.js +190 -0
  413. package/dist/services/plugin-state-store.js.map +1 -0
  414. package/dist/services/plugin-stream-bus.d.ts +29 -0
  415. package/dist/services/plugin-stream-bus.d.ts.map +1 -0
  416. package/dist/services/plugin-stream-bus.js +48 -0
  417. package/dist/services/plugin-stream-bus.js.map +1 -0
  418. package/dist/services/plugin-tool-dispatcher.d.ts +180 -0
  419. package/dist/services/plugin-tool-dispatcher.d.ts.map +1 -0
  420. package/dist/services/plugin-tool-dispatcher.js +224 -0
  421. package/dist/services/plugin-tool-dispatcher.js.map +1 -0
  422. package/dist/services/plugin-tool-registry.d.ts +192 -0
  423. package/dist/services/plugin-tool-registry.d.ts.map +1 -0
  424. package/dist/services/plugin-tool-registry.js +224 -0
  425. package/dist/services/plugin-tool-registry.js.map +1 -0
  426. package/dist/services/plugin-worker-manager.d.ts +260 -0
  427. package/dist/services/plugin-worker-manager.d.ts.map +1 -0
  428. package/dist/services/plugin-worker-manager.js +835 -0
  429. package/dist/services/plugin-worker-manager.js.map +1 -0
  430. package/dist/services/projects.d.ts +87 -0
  431. package/dist/services/projects.d.ts.map +1 -0
  432. package/dist/services/projects.js +656 -0
  433. package/dist/services/projects.js.map +1 -0
  434. package/dist/services/quota-windows.d.ts +9 -0
  435. package/dist/services/quota-windows.d.ts.map +1 -0
  436. package/dist/services/quota-windows.js +56 -0
  437. package/dist/services/quota-windows.js.map +1 -0
  438. package/dist/services/run-log-store.d.ts +34 -0
  439. package/dist/services/run-log-store.d.ts.map +1 -0
  440. package/dist/services/run-log-store.js +109 -0
  441. package/dist/services/run-log-store.js.map +1 -0
  442. package/dist/services/secrets.d.ts +510 -0
  443. package/dist/services/secrets.d.ts.map +1 -0
  444. package/dist/services/secrets.js +288 -0
  445. package/dist/services/secrets.js.map +1 -0
  446. package/dist/services/sidebar-badges.d.ts +9 -0
  447. package/dist/services/sidebar-badges.d.ts.map +1 -0
  448. package/dist/services/sidebar-badges.js +33 -0
  449. package/dist/services/sidebar-badges.js.map +1 -0
  450. package/dist/services/work-products.d.ts +14 -0
  451. package/dist/services/work-products.d.ts.map +1 -0
  452. package/dist/services/work-products.js +100 -0
  453. package/dist/services/work-products.js.map +1 -0
  454. package/dist/services/workspace-operation-log-store.d.ts +33 -0
  455. package/dist/services/workspace-operation-log-store.d.ts.map +1 -0
  456. package/dist/services/workspace-operation-log-store.js +110 -0
  457. package/dist/services/workspace-operation-log-store.js.map +1 -0
  458. package/dist/services/workspace-operations.d.ts +44 -0
  459. package/dist/services/workspace-operations.d.ts.map +1 -0
  460. package/dist/services/workspace-operations.js +204 -0
  461. package/dist/services/workspace-operations.js.map +1 -0
  462. package/dist/services/workspace-runtime.d.ts +164 -0
  463. package/dist/services/workspace-runtime.d.ts.map +1 -0
  464. package/dist/services/workspace-runtime.js +1235 -0
  465. package/dist/services/workspace-runtime.js.map +1 -0
  466. package/dist/startup-banner.d.ts +31 -0
  467. package/dist/startup-banner.d.ts.map +1 -0
  468. package/dist/startup-banner.js +117 -0
  469. package/dist/startup-banner.js.map +1 -0
  470. package/dist/storage/index.d.ts +6 -0
  471. package/dist/storage/index.d.ts.map +1 -0
  472. package/dist/storage/index.js +29 -0
  473. package/dist/storage/index.js.map +1 -0
  474. package/dist/storage/local-disk-provider.d.ts +3 -0
  475. package/dist/storage/local-disk-provider.d.ts.map +1 -0
  476. package/dist/storage/local-disk-provider.js +79 -0
  477. package/dist/storage/local-disk-provider.js.map +1 -0
  478. package/dist/storage/provider-registry.d.ts +4 -0
  479. package/dist/storage/provider-registry.d.ts.map +1 -0
  480. package/dist/storage/provider-registry.js +15 -0
  481. package/dist/storage/provider-registry.js.map +1 -0
  482. package/dist/storage/s3-provider.d.ts +11 -0
  483. package/dist/storage/s3-provider.d.ts.map +1 -0
  484. package/dist/storage/s3-provider.js +123 -0
  485. package/dist/storage/s3-provider.js.map +1 -0
  486. package/dist/storage/service.d.ts +3 -0
  487. package/dist/storage/service.d.ts.map +1 -0
  488. package/dist/storage/service.js +120 -0
  489. package/dist/storage/service.js.map +1 -0
  490. package/dist/storage/types.d.ts +55 -0
  491. package/dist/storage/types.d.ts.map +1 -0
  492. package/dist/storage/types.js +2 -0
  493. package/dist/storage/types.js.map +1 -0
  494. package/dist/ui-branding.d.ts +13 -0
  495. package/dist/ui-branding.d.ts.map +1 -0
  496. package/dist/ui-branding.js +187 -0
  497. package/dist/ui-branding.js.map +1 -0
  498. package/dist/version.d.ts +2 -0
  499. package/dist/version.d.ts.map +1 -0
  500. package/dist/version.js +5 -0
  501. package/dist/version.js.map +1 -0
  502. package/dist/wallet/connie-wallet.d.ts +8 -0
  503. package/dist/wallet/connie-wallet.d.ts.map +1 -0
  504. package/dist/wallet/connie-wallet.js +28 -0
  505. package/dist/wallet/connie-wallet.js.map +1 -0
  506. package/dist/wallet/signer-service.d.ts +46 -0
  507. package/dist/wallet/signer-service.d.ts.map +1 -0
  508. package/dist/wallet/signer-service.js +51 -0
  509. package/dist/wallet/signer-service.js.map +1 -0
  510. package/package.json +89 -0
  511. package/skills/paperclip/SKILL.md +310 -0
  512. package/skills/paperclip/references/api-reference.md +561 -0
  513. package/skills/paperclip-create-agent/SKILL.md +139 -0
  514. package/skills/paperclip-create-agent/references/api-reference.md +95 -0
  515. package/skills/paperclip-create-plugin/SKILL.md +101 -0
  516. package/skills/para-memory-files/SKILL.md +104 -0
  517. package/skills/para-memory-files/references/schemas.md +35 -0
  518. package/ui-dist/android-chrome-192x192.png +0 -0
  519. package/ui-dist/android-chrome-512x512.png +0 -0
  520. package/ui-dist/apple-touch-icon.png +0 -0
  521. package/ui-dist/assets/_basePickBy-C3SapTV-.js +1 -0
  522. package/ui-dist/assets/_baseUniq-tAa_W7wz.js +1 -0
  523. package/ui-dist/assets/apl-B4CMkyY2.js +1 -0
  524. package/ui-dist/assets/arc-1aKL9N1m.js +1 -0
  525. package/ui-dist/assets/architectureDiagram-VXUJARFQ-C-BWMHir.js +36 -0
  526. package/ui-dist/assets/asciiarmor-Df11BRmG.js +1 -0
  527. package/ui-dist/assets/asn1-EdZsLKOL.js +1 -0
  528. package/ui-dist/assets/asterisk-B-8jnY81.js +1 -0
  529. package/ui-dist/assets/blockDiagram-VD42YOAC-DiZzNyCp.js +122 -0
  530. package/ui-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  531. package/ui-dist/assets/c4Diagram-YG6GDRKO-BxkN6K8Z.js +10 -0
  532. package/ui-dist/assets/channel-g6sWbOF_.js +1 -0
  533. package/ui-dist/assets/chunk-4BX2VUAB-dEQLWXMP.js +1 -0
  534. package/ui-dist/assets/chunk-55IACEB6-DOlf6bGB.js +1 -0
  535. package/ui-dist/assets/chunk-B4BG7PRW-D82iJIh4.js +165 -0
  536. package/ui-dist/assets/chunk-DI55MBZ5-Dvu2BjZt.js +220 -0
  537. package/ui-dist/assets/chunk-FMBD7UC4-zLtBDqIV.js +15 -0
  538. package/ui-dist/assets/chunk-QN33PNHL-BsDTCIez.js +1 -0
  539. package/ui-dist/assets/chunk-QZHKN3VN-CVk0cJt0.js +1 -0
  540. package/ui-dist/assets/chunk-TZMSLE5B-BkF4gaW2.js +1 -0
  541. package/ui-dist/assets/classDiagram-2ON5EDUG-D_SGf4i1.js +1 -0
  542. package/ui-dist/assets/classDiagram-v2-WZHVMYZB-D_SGf4i1.js +1 -0
  543. package/ui-dist/assets/clike-B9uivgTg.js +1 -0
  544. package/ui-dist/assets/clojure-BMjYHr_A.js +1 -0
  545. package/ui-dist/assets/clone-CvdGFEjL.js +1 -0
  546. package/ui-dist/assets/cmake-BQqOBYOt.js +1 -0
  547. package/ui-dist/assets/cobol-CWcv1MsR.js +1 -0
  548. package/ui-dist/assets/coffeescript-S37ZYGWr.js +1 -0
  549. package/ui-dist/assets/commonlisp-DBKNyK5s.js +1 -0
  550. package/ui-dist/assets/cose-bilkent-S5V4N54A-DhXJS1Wr.js +1 -0
  551. package/ui-dist/assets/crystal-SjHAIU92.js +1 -0
  552. package/ui-dist/assets/css-BnMrqG3P.js +1 -0
  553. package/ui-dist/assets/cypher-C_CwsFkJ.js +1 -0
  554. package/ui-dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
  555. package/ui-dist/assets/d-pRatUO7H.js +1 -0
  556. package/ui-dist/assets/dagre-6UL2VRFP-BgSr9M5y.js +4 -0
  557. package/ui-dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  558. package/ui-dist/assets/diagram-PSM6KHXK-RVw3ElKR.js +24 -0
  559. package/ui-dist/assets/diagram-QEK2KX5R-C3K5KNnR.js +43 -0
  560. package/ui-dist/assets/diagram-S2PKOQOG-L2G5bc-i.js +24 -0
  561. package/ui-dist/assets/diff-DbItnlRl.js +1 -0
  562. package/ui-dist/assets/dockerfile-BKs6k2Af.js +1 -0
  563. package/ui-dist/assets/dtd-DF_7sFjM.js +1 -0
  564. package/ui-dist/assets/dylan-DwRh75JA.js +1 -0
  565. package/ui-dist/assets/ebnf-CDyGwa7X.js +1 -0
  566. package/ui-dist/assets/ecl-Cabwm37j.js +1 -0
  567. package/ui-dist/assets/eiffel-CnydiIhH.js +1 -0
  568. package/ui-dist/assets/elm-vLlmbW-K.js +1 -0
  569. package/ui-dist/assets/erDiagram-Q2GNP2WA-B-fEopEW.js +60 -0
  570. package/ui-dist/assets/erlang-BNw1qcRV.js +1 -0
  571. package/ui-dist/assets/factor-kuTfRLto.js +1 -0
  572. package/ui-dist/assets/fcl-Kvtd6kyn.js +1 -0
  573. package/ui-dist/assets/flowDiagram-NV44I4VS-B67TmiaU.js +162 -0
  574. package/ui-dist/assets/forth-Ffai-XNe.js +1 -0
  575. package/ui-dist/assets/fortran-DYz_wnZ1.js +1 -0
  576. package/ui-dist/assets/ganttDiagram-JELNMOA3-DyPUX6hg.js +267 -0
  577. package/ui-dist/assets/gas-Bneqetm1.js +1 -0
  578. package/ui-dist/assets/gherkin-heZmZLOM.js +1 -0
  579. package/ui-dist/assets/gitGraphDiagram-V2S2FVAM--OZSHgOs.js +65 -0
  580. package/ui-dist/assets/graph-BuZXpro8.js +1 -0
  581. package/ui-dist/assets/groovy-D9Dt4D0W.js +1 -0
  582. package/ui-dist/assets/haskell-Cw1EW3IL.js +1 -0
  583. package/ui-dist/assets/haxe-H-WmDvRZ.js +1 -0
  584. package/ui-dist/assets/http-DBlCnlav.js +1 -0
  585. package/ui-dist/assets/idl-BEugSyMb.js +1 -0
  586. package/ui-dist/assets/index-1BDMTcZo.css +1 -0
  587. package/ui-dist/assets/index-5qKrPxpA.js +1 -0
  588. package/ui-dist/assets/index-64g9Tgj8.js +1 -0
  589. package/ui-dist/assets/index-B2BWcxI3.js +1 -0
  590. package/ui-dist/assets/index-BBnLF7s9.js +1 -0
  591. package/ui-dist/assets/index-BcGr-t2T.js +3 -0
  592. package/ui-dist/assets/index-BvFjgW1S.js +1 -0
  593. package/ui-dist/assets/index-Bwu5E0tU.js +1120 -0
  594. package/ui-dist/assets/index-CWdVcwY-.js +7 -0
  595. package/ui-dist/assets/index-CcZ3jKyu.js +1 -0
  596. package/ui-dist/assets/index-CftQkMtr.js +1 -0
  597. package/ui-dist/assets/index-CiuvxTr1.js +13 -0
  598. package/ui-dist/assets/index-CvJFaRY-.js +1 -0
  599. package/ui-dist/assets/index-D2Vi4KQ1.js +1 -0
  600. package/ui-dist/assets/index-D9ei6U88.js +6 -0
  601. package/ui-dist/assets/index-DJHKsR5g.js +1 -0
  602. package/ui-dist/assets/index-DSGN-qDr.js +1 -0
  603. package/ui-dist/assets/index-DVPlvZkH.js +1 -0
  604. package/ui-dist/assets/index-DowQVAaY.js +1 -0
  605. package/ui-dist/assets/index-Dr_PpBCY.js +1 -0
  606. package/ui-dist/assets/index-Ivk3iEUq.js +2 -0
  607. package/ui-dist/assets/index-OVXAhlMW.js +1 -0
  608. package/ui-dist/assets/index-ff_wE0-y.js +1 -0
  609. package/ui-dist/assets/index-tIsOsmOg.js +1 -0
  610. package/ui-dist/assets/infoDiagram-HS3SLOUP-CorcfaW7.js +2 -0
  611. package/ui-dist/assets/init-Gi6I4Gst.js +1 -0
  612. package/ui-dist/assets/javascript-iXu5QeM3.js +1 -0
  613. package/ui-dist/assets/journeyDiagram-XKPGCS4Q-D3K55-qo.js +139 -0
  614. package/ui-dist/assets/julia-DuME0IfC.js +1 -0
  615. package/ui-dist/assets/kanban-definition-3W4ZIXB7-47soc494.js +89 -0
  616. package/ui-dist/assets/katex-O9d3_IXG.js +261 -0
  617. package/ui-dist/assets/layout-mxhxSLBl.js +1 -0
  618. package/ui-dist/assets/linear-D5Y7uAaH.js +1 -0
  619. package/ui-dist/assets/livescript-BwQOo05w.js +1 -0
  620. package/ui-dist/assets/lua-BgMRiT3U.js +1 -0
  621. package/ui-dist/assets/mathematica-DTrFuWx2.js +1 -0
  622. package/ui-dist/assets/mbox-CNhZ1qSd.js +1 -0
  623. package/ui-dist/assets/mermaid.core-7SNUCoBq.js +256 -0
  624. package/ui-dist/assets/mindmap-definition-VGOIOE7T-C37ba4sG.js +68 -0
  625. package/ui-dist/assets/mirc-CjQqDB4T.js +1 -0
  626. package/ui-dist/assets/mllike-CXdrOF99.js +1 -0
  627. package/ui-dist/assets/modelica-Dc1JOy9r.js +1 -0
  628. package/ui-dist/assets/mscgen-BA5vi2Kp.js +1 -0
  629. package/ui-dist/assets/mumps-BT43cFF4.js +1 -0
  630. package/ui-dist/assets/nginx-DdIZxoE0.js +1 -0
  631. package/ui-dist/assets/nsis-LdVXkNf5.js +1 -0
  632. package/ui-dist/assets/ntriples-BfvgReVJ.js +1 -0
  633. package/ui-dist/assets/octave-Ck1zUtKM.js +1 -0
  634. package/ui-dist/assets/ordinal-Cboi1Yqb.js +1 -0
  635. package/ui-dist/assets/oz-BzwKVEFT.js +1 -0
  636. package/ui-dist/assets/pascal--L3eBynH.js +1 -0
  637. package/ui-dist/assets/perl-CdXCOZ3F.js +1 -0
  638. package/ui-dist/assets/pieDiagram-ADFJNKIX-D78e-tVE.js +30 -0
  639. package/ui-dist/assets/pig-CevX1Tat.js +1 -0
  640. package/ui-dist/assets/powershell-CFHJl5sT.js +1 -0
  641. package/ui-dist/assets/properties-C78fOPTZ.js +1 -0
  642. package/ui-dist/assets/protobuf-ChK-085T.js +1 -0
  643. package/ui-dist/assets/pug-DeIclll2.js +1 -0
  644. package/ui-dist/assets/puppet-DMA9R1ak.js +1 -0
  645. package/ui-dist/assets/python-BuPzkPfP.js +1 -0
  646. package/ui-dist/assets/q-pXgVlZs6.js +1 -0
  647. package/ui-dist/assets/quadrantDiagram-AYHSOK5B-CGERMcfi.js +7 -0
  648. package/ui-dist/assets/r-B6wPVr8A.js +1 -0
  649. package/ui-dist/assets/requirementDiagram-UZGBJVZJ-vZWAyhU1.js +64 -0
  650. package/ui-dist/assets/rpm-CTu-6PCP.js +1 -0
  651. package/ui-dist/assets/ruby-B2Rjki9n.js +1 -0
  652. package/ui-dist/assets/sankeyDiagram-TZEHDZUN-C51wCQX7.js +10 -0
  653. package/ui-dist/assets/sas-B4kiWyti.js +1 -0
  654. package/ui-dist/assets/scheme-C41bIUwD.js +1 -0
  655. package/ui-dist/assets/sequenceDiagram-WL72ISMW-eCSbKUaE.js +145 -0
  656. package/ui-dist/assets/shell-CjFT_Tl9.js +1 -0
  657. package/ui-dist/assets/sieve-C3Gn_uJK.js +1 -0
  658. package/ui-dist/assets/simple-mode-GW_nhZxv.js +1 -0
  659. package/ui-dist/assets/smalltalk-CnHTOXQT.js +1 -0
  660. package/ui-dist/assets/solr-DehyRSwq.js +1 -0
  661. package/ui-dist/assets/sparql-DkYu6x3z.js +1 -0
  662. package/ui-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  663. package/ui-dist/assets/sql-D0XecflT.js +1 -0
  664. package/ui-dist/assets/stateDiagram-FKZM4ZOC-H3lI51qU.js +1 -0
  665. package/ui-dist/assets/stateDiagram-v2-4FDKWEC3--Q50auwn.js +1 -0
  666. package/ui-dist/assets/stex-C3f8Ysf7.js +1 -0
  667. package/ui-dist/assets/stylus-B533Al4x.js +1 -0
  668. package/ui-dist/assets/swift-BzpIVaGY.js +1 -0
  669. package/ui-dist/assets/tcl-DVfN8rqt.js +1 -0
  670. package/ui-dist/assets/textile-CnDTJFAw.js +1 -0
  671. package/ui-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  672. package/ui-dist/assets/tiki-DGYXhP31.js +1 -0
  673. package/ui-dist/assets/timeline-definition-IT6M3QCI-CP9CNQLU.js +61 -0
  674. package/ui-dist/assets/toml-Bm5Em-hy.js +1 -0
  675. package/ui-dist/assets/treemap-GDKQZRPO-BfRhErz4.js +162 -0
  676. package/ui-dist/assets/troff-wAsdV37c.js +1 -0
  677. package/ui-dist/assets/ttcn-CfJYG6tj.js +1 -0
  678. package/ui-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  679. package/ui-dist/assets/turtle-B1tBg_DP.js +1 -0
  680. package/ui-dist/assets/vb-CmGdzxic.js +1 -0
  681. package/ui-dist/assets/vbscript-BuJXcnF6.js +1 -0
  682. package/ui-dist/assets/velocity-D8B20fx6.js +1 -0
  683. package/ui-dist/assets/verilog-C6RDOZhf.js +1 -0
  684. package/ui-dist/assets/vhdl-lSbBsy5d.js +1 -0
  685. package/ui-dist/assets/webidl-ZXfAyPTL.js +1 -0
  686. package/ui-dist/assets/xquery-DzFWVndE.js +1 -0
  687. package/ui-dist/assets/xychartDiagram-PRI3JC2R-BSy7gZ_Q.js +7 -0
  688. package/ui-dist/assets/yacas-BJ4BC0dw.js +1 -0
  689. package/ui-dist/assets/z80-Hz9HOZM7.js +1 -0
  690. package/ui-dist/brands/opencode-logo-dark-square.svg +18 -0
  691. package/ui-dist/brands/opencode-logo-light-square.svg +18 -0
  692. package/ui-dist/favicon-16x16.png +0 -0
  693. package/ui-dist/favicon-32x32.png +0 -0
  694. package/ui-dist/favicon.ico +0 -0
  695. package/ui-dist/favicon.svg +9 -0
  696. package/ui-dist/index.html +48 -0
  697. package/ui-dist/site.webmanifest +30 -0
  698. package/ui-dist/sw.js +42 -0
  699. package/ui-dist/worktree-favicon-16x16.png +0 -0
  700. package/ui-dist/worktree-favicon-32x32.png +0 -0
  701. package/ui-dist/worktree-favicon.ico +0 -0
  702. package/ui-dist/worktree-favicon.svg +9 -0
@@ -0,0 +1,867 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { normalizeAgentUrlKey, portabilityManifestSchema } from "@paperclipai_dld/shared";
4
+ import { notFound, unprocessable } from "../errors.js";
5
+ import { accessService } from "./access.js";
6
+ import { agentService } from "./agents.js";
7
+ import { companyService } from "./companies.js";
8
+ const DEFAULT_INCLUDE = {
9
+ company: true,
10
+ agents: true,
11
+ };
12
+ const DEFAULT_COLLISION_STRATEGY = "rename";
13
+ const SENSITIVE_ENV_KEY_RE = /(api[-_]?key|access[-_]?token|auth(?:_?token)?|authorization|bearer|secret|passwd|password|credential|jwt|private[-_]?key|cookie|connectionstring)/i;
14
+ const RUNTIME_DEFAULT_RULES = [
15
+ { path: ["heartbeat", "cooldownSec"], value: 10 },
16
+ { path: ["heartbeat", "intervalSec"], value: 3600 },
17
+ { path: ["heartbeat", "wakeOnOnDemand"], value: true },
18
+ { path: ["heartbeat", "wakeOnAssignment"], value: true },
19
+ { path: ["heartbeat", "wakeOnAutomation"], value: true },
20
+ { path: ["heartbeat", "wakeOnDemand"], value: true },
21
+ { path: ["heartbeat", "maxConcurrentRuns"], value: 3 },
22
+ ];
23
+ const ADAPTER_DEFAULT_RULES_BY_TYPE = {
24
+ codex_local: [
25
+ { path: ["timeoutSec"], value: 0 },
26
+ { path: ["graceSec"], value: 15 },
27
+ ],
28
+ gemini_local: [
29
+ { path: ["timeoutSec"], value: 0 },
30
+ { path: ["graceSec"], value: 15 },
31
+ ],
32
+ opencode_local: [
33
+ { path: ["timeoutSec"], value: 0 },
34
+ { path: ["graceSec"], value: 15 },
35
+ ],
36
+ cursor: [
37
+ { path: ["timeoutSec"], value: 0 },
38
+ { path: ["graceSec"], value: 15 },
39
+ ],
40
+ claude_local: [
41
+ { path: ["timeoutSec"], value: 0 },
42
+ { path: ["graceSec"], value: 15 },
43
+ { path: ["maxTurnsPerRun"], value: 300 },
44
+ ],
45
+ openclaw_gateway: [
46
+ { path: ["timeoutSec"], value: 120 },
47
+ { path: ["waitTimeoutMs"], value: 120000 },
48
+ { path: ["sessionKeyStrategy"], value: "fixed" },
49
+ { path: ["sessionKey"], value: "paperclip" },
50
+ { path: ["role"], value: "operator" },
51
+ { path: ["scopes"], value: ["operator.admin"] },
52
+ ],
53
+ };
54
+ function isPlainRecord(value) {
55
+ return typeof value === "object" && value !== null && !Array.isArray(value);
56
+ }
57
+ function asString(value) {
58
+ if (typeof value !== "string")
59
+ return null;
60
+ const trimmed = value.trim();
61
+ return trimmed.length > 0 ? trimmed : null;
62
+ }
63
+ function toSafeSlug(input, fallback) {
64
+ return normalizeAgentUrlKey(input) ?? fallback;
65
+ }
66
+ function uniqueSlug(base, used) {
67
+ if (!used.has(base)) {
68
+ used.add(base);
69
+ return base;
70
+ }
71
+ let idx = 2;
72
+ while (true) {
73
+ const candidate = `${base}-${idx}`;
74
+ if (!used.has(candidate)) {
75
+ used.add(candidate);
76
+ return candidate;
77
+ }
78
+ idx += 1;
79
+ }
80
+ }
81
+ function uniqueNameBySlug(baseName, existingSlugs) {
82
+ const baseSlug = normalizeAgentUrlKey(baseName) ?? "agent";
83
+ if (!existingSlugs.has(baseSlug))
84
+ return baseName;
85
+ let idx = 2;
86
+ while (true) {
87
+ const candidateName = `${baseName} ${idx}`;
88
+ const candidateSlug = normalizeAgentUrlKey(candidateName) ?? `agent-${idx}`;
89
+ if (!existingSlugs.has(candidateSlug))
90
+ return candidateName;
91
+ idx += 1;
92
+ }
93
+ }
94
+ function normalizeInclude(input) {
95
+ return {
96
+ company: input?.company ?? DEFAULT_INCLUDE.company,
97
+ agents: input?.agents ?? DEFAULT_INCLUDE.agents,
98
+ };
99
+ }
100
+ function ensureMarkdownPath(pathValue) {
101
+ const normalized = pathValue.replace(/\\/g, "/");
102
+ if (!normalized.endsWith(".md")) {
103
+ throw unprocessable(`Manifest file path must end in .md: ${pathValue}`);
104
+ }
105
+ return normalized;
106
+ }
107
+ function normalizePortableEnv(agentSlug, envValue, requiredSecrets) {
108
+ if (typeof envValue !== "object" || envValue === null || Array.isArray(envValue))
109
+ return {};
110
+ const env = envValue;
111
+ const next = {};
112
+ for (const [key, binding] of Object.entries(env)) {
113
+ if (SENSITIVE_ENV_KEY_RE.test(key)) {
114
+ requiredSecrets.push({
115
+ key,
116
+ description: `Set ${key} for agent ${agentSlug}`,
117
+ agentSlug,
118
+ providerHint: null,
119
+ });
120
+ continue;
121
+ }
122
+ next[key] = binding;
123
+ }
124
+ return next;
125
+ }
126
+ function normalizePortableConfig(value, agentSlug, requiredSecrets) {
127
+ if (typeof value !== "object" || value === null || Array.isArray(value))
128
+ return {};
129
+ const input = value;
130
+ const next = {};
131
+ for (const [key, entry] of Object.entries(input)) {
132
+ if (key === "cwd" || key === "instructionsFilePath")
133
+ continue;
134
+ if (key === "env") {
135
+ next[key] = normalizePortableEnv(agentSlug, entry, requiredSecrets);
136
+ continue;
137
+ }
138
+ next[key] = entry;
139
+ }
140
+ return next;
141
+ }
142
+ function jsonEqual(left, right) {
143
+ return JSON.stringify(left) === JSON.stringify(right);
144
+ }
145
+ function isPathDefault(pathSegments, value, rules) {
146
+ return rules.some((rule) => jsonEqual(rule.path, pathSegments) && jsonEqual(rule.value, value));
147
+ }
148
+ function pruneDefaultLikeValue(value, opts) {
149
+ const pathSegments = opts.path ?? [];
150
+ if (opts.defaultRules && isPathDefault(pathSegments, value, opts.defaultRules)) {
151
+ return undefined;
152
+ }
153
+ if (Array.isArray(value)) {
154
+ return value.map((entry) => pruneDefaultLikeValue(entry, { ...opts, path: pathSegments }));
155
+ }
156
+ if (isPlainRecord(value)) {
157
+ const out = {};
158
+ for (const [key, entry] of Object.entries(value)) {
159
+ const next = pruneDefaultLikeValue(entry, {
160
+ ...opts,
161
+ path: [...pathSegments, key],
162
+ });
163
+ if (next === undefined)
164
+ continue;
165
+ out[key] = next;
166
+ }
167
+ return out;
168
+ }
169
+ if (value === undefined)
170
+ return undefined;
171
+ if (opts.dropFalseBooleans && value === false)
172
+ return undefined;
173
+ return value;
174
+ }
175
+ function renderYamlScalar(value) {
176
+ if (value === null)
177
+ return "null";
178
+ if (typeof value === "boolean" || typeof value === "number")
179
+ return String(value);
180
+ if (typeof value === "string")
181
+ return JSON.stringify(value);
182
+ return JSON.stringify(value);
183
+ }
184
+ function isEmptyObject(value) {
185
+ return isPlainRecord(value) && Object.keys(value).length === 0;
186
+ }
187
+ function renderYamlBlock(value, indentLevel) {
188
+ const indent = " ".repeat(indentLevel);
189
+ if (Array.isArray(value)) {
190
+ if (value.length === 0)
191
+ return [`${indent}[]`];
192
+ const lines = [];
193
+ for (const entry of value) {
194
+ const scalar = entry === null ||
195
+ typeof entry === "string" ||
196
+ typeof entry === "boolean" ||
197
+ typeof entry === "number" ||
198
+ Array.isArray(entry) && entry.length === 0 ||
199
+ isEmptyObject(entry);
200
+ if (scalar) {
201
+ lines.push(`${indent}- ${renderYamlScalar(entry)}`);
202
+ continue;
203
+ }
204
+ lines.push(`${indent}-`);
205
+ lines.push(...renderYamlBlock(entry, indentLevel + 1));
206
+ }
207
+ return lines;
208
+ }
209
+ if (isPlainRecord(value)) {
210
+ const entries = Object.entries(value);
211
+ if (entries.length === 0)
212
+ return [`${indent}{}`];
213
+ const lines = [];
214
+ for (const [key, entry] of entries) {
215
+ const scalar = entry === null ||
216
+ typeof entry === "string" ||
217
+ typeof entry === "boolean" ||
218
+ typeof entry === "number" ||
219
+ Array.isArray(entry) && entry.length === 0 ||
220
+ isEmptyObject(entry);
221
+ if (scalar) {
222
+ lines.push(`${indent}${key}: ${renderYamlScalar(entry)}`);
223
+ continue;
224
+ }
225
+ lines.push(`${indent}${key}:`);
226
+ lines.push(...renderYamlBlock(entry, indentLevel + 1));
227
+ }
228
+ return lines;
229
+ }
230
+ return [`${indent}${renderYamlScalar(value)}`];
231
+ }
232
+ function renderFrontmatter(frontmatter) {
233
+ const lines = ["---"];
234
+ for (const [key, value] of Object.entries(frontmatter)) {
235
+ const scalar = value === null ||
236
+ typeof value === "string" ||
237
+ typeof value === "boolean" ||
238
+ typeof value === "number" ||
239
+ Array.isArray(value) && value.length === 0 ||
240
+ isEmptyObject(value);
241
+ if (scalar) {
242
+ lines.push(`${key}: ${renderYamlScalar(value)}`);
243
+ continue;
244
+ }
245
+ lines.push(`${key}:`);
246
+ lines.push(...renderYamlBlock(value, 1));
247
+ }
248
+ lines.push("---");
249
+ return `${lines.join("\n")}\n`;
250
+ }
251
+ function buildMarkdown(frontmatter, body) {
252
+ const cleanBody = body.replace(/\r\n/g, "\n").trim();
253
+ if (!cleanBody) {
254
+ return `${renderFrontmatter(frontmatter)}\n`;
255
+ }
256
+ return `${renderFrontmatter(frontmatter)}\n${cleanBody}\n`;
257
+ }
258
+ function renderCompanyAgentsSection(agentSummaries) {
259
+ const lines = ["# Agents", ""];
260
+ if (agentSummaries.length === 0) {
261
+ lines.push("- _none_");
262
+ return lines.join("\n");
263
+ }
264
+ for (const agent of agentSummaries) {
265
+ lines.push(`- ${agent.slug} - ${agent.name}`);
266
+ }
267
+ return lines.join("\n");
268
+ }
269
+ function parseFrontmatterMarkdown(raw) {
270
+ const normalized = raw.replace(/\r\n/g, "\n");
271
+ if (!normalized.startsWith("---\n")) {
272
+ return { frontmatter: {}, body: normalized.trim() };
273
+ }
274
+ const closing = normalized.indexOf("\n---\n", 4);
275
+ if (closing < 0) {
276
+ return { frontmatter: {}, body: normalized.trim() };
277
+ }
278
+ const frontmatterRaw = normalized.slice(4, closing).trim();
279
+ const body = normalized.slice(closing + 5).trim();
280
+ const frontmatter = {};
281
+ for (const line of frontmatterRaw.split("\n")) {
282
+ const idx = line.indexOf(":");
283
+ if (idx <= 0)
284
+ continue;
285
+ const key = line.slice(0, idx).trim();
286
+ const rawValue = line.slice(idx + 1).trim();
287
+ if (!key)
288
+ continue;
289
+ if (rawValue === "null") {
290
+ frontmatter[key] = null;
291
+ continue;
292
+ }
293
+ if (rawValue === "true" || rawValue === "false") {
294
+ frontmatter[key] = rawValue === "true";
295
+ continue;
296
+ }
297
+ if (/^-?\d+(\.\d+)?$/.test(rawValue)) {
298
+ frontmatter[key] = Number(rawValue);
299
+ continue;
300
+ }
301
+ try {
302
+ frontmatter[key] = JSON.parse(rawValue);
303
+ continue;
304
+ }
305
+ catch {
306
+ frontmatter[key] = rawValue;
307
+ }
308
+ }
309
+ return { frontmatter, body };
310
+ }
311
+ async function fetchJson(url) {
312
+ const response = await fetch(url);
313
+ if (!response.ok) {
314
+ throw unprocessable(`Failed to fetch ${url}: ${response.status}`);
315
+ }
316
+ return response.json();
317
+ }
318
+ async function fetchText(url) {
319
+ const response = await fetch(url);
320
+ if (!response.ok) {
321
+ throw unprocessable(`Failed to fetch ${url}: ${response.status}`);
322
+ }
323
+ return response.text();
324
+ }
325
+ function dedupeRequiredSecrets(values) {
326
+ const seen = new Set();
327
+ const out = [];
328
+ for (const value of values) {
329
+ const key = `${value.agentSlug ?? ""}:${value.key.toUpperCase()}`;
330
+ if (seen.has(key))
331
+ continue;
332
+ seen.add(key);
333
+ out.push(value);
334
+ }
335
+ return out;
336
+ }
337
+ function parseGitHubTreeUrl(rawUrl) {
338
+ const url = new URL(rawUrl);
339
+ if (url.hostname !== "github.com") {
340
+ throw unprocessable("GitHub source must use github.com URL");
341
+ }
342
+ const parts = url.pathname.split("/").filter(Boolean);
343
+ if (parts.length < 2) {
344
+ throw unprocessable("Invalid GitHub URL");
345
+ }
346
+ const owner = parts[0];
347
+ const repo = parts[1].replace(/\.git$/i, "");
348
+ let ref = "main";
349
+ let basePath = "";
350
+ if (parts[2] === "tree") {
351
+ ref = parts[3] ?? "main";
352
+ basePath = parts.slice(4).join("/");
353
+ }
354
+ return { owner, repo, ref, basePath };
355
+ }
356
+ function resolveRawGitHubUrl(owner, repo, ref, filePath) {
357
+ const normalizedFilePath = filePath.replace(/^\/+/, "");
358
+ return `https://raw.githubusercontent.com/${owner}/${repo}/${ref}/${normalizedFilePath}`;
359
+ }
360
+ async function readAgentInstructions(agent) {
361
+ const config = agent.adapterConfig;
362
+ const instructionsFilePath = asString(config.instructionsFilePath);
363
+ if (instructionsFilePath) {
364
+ const workspaceCwd = asString(process.env.PAPERCLIP_WORKSPACE_CWD);
365
+ const candidates = new Set();
366
+ if (path.isAbsolute(instructionsFilePath)) {
367
+ candidates.add(instructionsFilePath);
368
+ }
369
+ else {
370
+ if (workspaceCwd)
371
+ candidates.add(path.resolve(workspaceCwd, instructionsFilePath));
372
+ candidates.add(path.resolve(process.cwd(), instructionsFilePath));
373
+ }
374
+ for (const candidate of candidates) {
375
+ try {
376
+ const stat = await fs.stat(candidate);
377
+ if (!stat.isFile() || stat.size > 1024 * 1024)
378
+ continue;
379
+ const body = await Promise.race([
380
+ fs.readFile(candidate, "utf8"),
381
+ new Promise((_, reject) => {
382
+ setTimeout(() => reject(new Error("timed out reading instructions file")), 1500);
383
+ }),
384
+ ]);
385
+ return { body, warning: null };
386
+ }
387
+ catch {
388
+ // try next candidate
389
+ }
390
+ }
391
+ }
392
+ const promptTemplate = asString(config.promptTemplate);
393
+ if (promptTemplate) {
394
+ const warning = instructionsFilePath
395
+ ? `Agent ${agent.name} instructionsFilePath was not readable; fell back to promptTemplate.`
396
+ : null;
397
+ return {
398
+ body: promptTemplate,
399
+ warning,
400
+ };
401
+ }
402
+ return {
403
+ body: "_No AGENTS instructions were resolved from current agent config._",
404
+ warning: `Agent ${agent.name} has no resolvable instructionsFilePath/promptTemplate; exported placeholder AGENTS.md.`,
405
+ };
406
+ }
407
+ export function companyPortabilityService(db) {
408
+ const companies = companyService(db);
409
+ const agents = agentService(db);
410
+ const access = accessService(db);
411
+ async function resolveSource(source) {
412
+ if (source.type === "inline") {
413
+ return {
414
+ manifest: portabilityManifestSchema.parse(source.manifest),
415
+ files: source.files,
416
+ warnings: [],
417
+ };
418
+ }
419
+ if (source.type === "url") {
420
+ const manifestJson = await fetchJson(source.url);
421
+ const manifest = portabilityManifestSchema.parse(manifestJson);
422
+ const base = new URL(".", source.url);
423
+ const files = {};
424
+ const warnings = [];
425
+ if (manifest.company?.path) {
426
+ const companyPath = ensureMarkdownPath(manifest.company.path);
427
+ files[companyPath] = await fetchText(new URL(companyPath, base).toString());
428
+ }
429
+ for (const agent of manifest.agents) {
430
+ const filePath = ensureMarkdownPath(agent.path);
431
+ files[filePath] = await fetchText(new URL(filePath, base).toString());
432
+ }
433
+ return { manifest, files, warnings };
434
+ }
435
+ const parsed = parseGitHubTreeUrl(source.url);
436
+ let ref = parsed.ref;
437
+ const manifestRelativePath = [parsed.basePath, "paperclip.manifest.json"].filter(Boolean).join("/");
438
+ let manifest = null;
439
+ const warnings = [];
440
+ try {
441
+ manifest = portabilityManifestSchema.parse(await fetchJson(resolveRawGitHubUrl(parsed.owner, parsed.repo, ref, manifestRelativePath)));
442
+ }
443
+ catch (err) {
444
+ if (ref === "main") {
445
+ ref = "master";
446
+ warnings.push("GitHub ref main not found; falling back to master.");
447
+ manifest = portabilityManifestSchema.parse(await fetchJson(resolveRawGitHubUrl(parsed.owner, parsed.repo, ref, manifestRelativePath)));
448
+ }
449
+ else {
450
+ throw err;
451
+ }
452
+ }
453
+ const files = {};
454
+ if (manifest.company?.path) {
455
+ files[manifest.company.path] = await fetchText(resolveRawGitHubUrl(parsed.owner, parsed.repo, ref, [parsed.basePath, manifest.company.path].filter(Boolean).join("/")));
456
+ }
457
+ for (const agent of manifest.agents) {
458
+ files[agent.path] = await fetchText(resolveRawGitHubUrl(parsed.owner, parsed.repo, ref, [parsed.basePath, agent.path].filter(Boolean).join("/")));
459
+ }
460
+ return { manifest, files, warnings };
461
+ }
462
+ async function exportBundle(companyId, input) {
463
+ const include = normalizeInclude(input.include);
464
+ const company = await companies.getById(companyId);
465
+ if (!company)
466
+ throw notFound("Company not found");
467
+ const files = {};
468
+ const warnings = [];
469
+ const requiredSecrets = [];
470
+ const generatedAt = new Date().toISOString();
471
+ const manifest = {
472
+ schemaVersion: 1,
473
+ generatedAt,
474
+ source: {
475
+ companyId: company.id,
476
+ companyName: company.name,
477
+ },
478
+ includes: include,
479
+ company: null,
480
+ agents: [],
481
+ requiredSecrets: [],
482
+ };
483
+ const allAgentRows = include.agents ? await agents.list(companyId, { includeTerminated: true }) : [];
484
+ const agentRows = allAgentRows.filter((agent) => agent.status !== "terminated");
485
+ if (include.agents) {
486
+ const skipped = allAgentRows.length - agentRows.length;
487
+ if (skipped > 0) {
488
+ warnings.push(`Skipped ${skipped} terminated agent${skipped === 1 ? "" : "s"} from export.`);
489
+ }
490
+ }
491
+ const usedSlugs = new Set();
492
+ const idToSlug = new Map();
493
+ for (const agent of agentRows) {
494
+ const baseSlug = toSafeSlug(agent.name, "agent");
495
+ const slug = uniqueSlug(baseSlug, usedSlugs);
496
+ idToSlug.set(agent.id, slug);
497
+ }
498
+ if (include.company) {
499
+ const companyPath = "COMPANY.md";
500
+ const companyAgentSummaries = agentRows.map((agent) => ({
501
+ slug: idToSlug.get(agent.id) ?? "agent",
502
+ name: agent.name,
503
+ }));
504
+ files[companyPath] = buildMarkdown({
505
+ kind: "company",
506
+ name: company.name,
507
+ description: company.description ?? null,
508
+ brandColor: company.brandColor ?? null,
509
+ requireBoardApprovalForNewAgents: company.requireBoardApprovalForNewAgents,
510
+ }, renderCompanyAgentsSection(companyAgentSummaries));
511
+ manifest.company = {
512
+ path: companyPath,
513
+ name: company.name,
514
+ description: company.description ?? null,
515
+ brandColor: company.brandColor ?? null,
516
+ requireBoardApprovalForNewAgents: company.requireBoardApprovalForNewAgents,
517
+ };
518
+ }
519
+ if (include.agents) {
520
+ for (const agent of agentRows) {
521
+ const slug = idToSlug.get(agent.id);
522
+ const instructions = await readAgentInstructions(agent);
523
+ if (instructions.warning)
524
+ warnings.push(instructions.warning);
525
+ const agentPath = `agents/${slug}/AGENTS.md`;
526
+ const secretStart = requiredSecrets.length;
527
+ const adapterDefaultRules = ADAPTER_DEFAULT_RULES_BY_TYPE[agent.adapterType] ?? [];
528
+ const portableAdapterConfig = pruneDefaultLikeValue(normalizePortableConfig(agent.adapterConfig, slug, requiredSecrets), {
529
+ dropFalseBooleans: true,
530
+ defaultRules: adapterDefaultRules,
531
+ });
532
+ const portableRuntimeConfig = pruneDefaultLikeValue(normalizePortableConfig(agent.runtimeConfig, slug, requiredSecrets), {
533
+ dropFalseBooleans: true,
534
+ defaultRules: RUNTIME_DEFAULT_RULES,
535
+ });
536
+ const portablePermissions = pruneDefaultLikeValue(agent.permissions ?? {}, { dropFalseBooleans: true });
537
+ const agentRequiredSecrets = dedupeRequiredSecrets(requiredSecrets
538
+ .slice(secretStart)
539
+ .filter((requirement) => requirement.agentSlug === slug));
540
+ const reportsToSlug = agent.reportsTo ? (idToSlug.get(agent.reportsTo) ?? null) : null;
541
+ files[agentPath] = buildMarkdown({
542
+ name: agent.name,
543
+ slug,
544
+ role: agent.role,
545
+ adapterType: agent.adapterType,
546
+ kind: "agent",
547
+ icon: agent.icon ?? null,
548
+ capabilities: agent.capabilities ?? null,
549
+ reportsTo: reportsToSlug,
550
+ runtimeConfig: portableRuntimeConfig,
551
+ permissions: portablePermissions,
552
+ adapterConfig: portableAdapterConfig,
553
+ requiredSecrets: agentRequiredSecrets,
554
+ }, instructions.body);
555
+ manifest.agents.push({
556
+ slug,
557
+ name: agent.name,
558
+ path: agentPath,
559
+ role: agent.role,
560
+ title: agent.title ?? null,
561
+ icon: agent.icon ?? null,
562
+ capabilities: agent.capabilities ?? null,
563
+ reportsToSlug,
564
+ adapterType: agent.adapterType,
565
+ adapterConfig: portableAdapterConfig,
566
+ runtimeConfig: portableRuntimeConfig,
567
+ permissions: portablePermissions,
568
+ budgetMonthlyCents: agent.budgetMonthlyCents ?? 0,
569
+ metadata: agent.metadata ?? null,
570
+ });
571
+ }
572
+ }
573
+ manifest.requiredSecrets = dedupeRequiredSecrets(requiredSecrets);
574
+ return {
575
+ manifest,
576
+ files,
577
+ warnings,
578
+ };
579
+ }
580
+ async function buildPreview(input) {
581
+ const include = normalizeInclude(input.include);
582
+ const source = await resolveSource(input.source);
583
+ const manifest = source.manifest;
584
+ const collisionStrategy = input.collisionStrategy ?? DEFAULT_COLLISION_STRATEGY;
585
+ const warnings = [...source.warnings];
586
+ const errors = [];
587
+ if (include.company && !manifest.company) {
588
+ errors.push("Manifest does not include company metadata.");
589
+ }
590
+ const selectedSlugs = input.agents && input.agents !== "all"
591
+ ? Array.from(new Set(input.agents))
592
+ : manifest.agents.map((agent) => agent.slug);
593
+ const selectedAgents = manifest.agents.filter((agent) => selectedSlugs.includes(agent.slug));
594
+ const selectedMissing = selectedSlugs.filter((slug) => !manifest.agents.some((agent) => agent.slug === slug));
595
+ for (const missing of selectedMissing) {
596
+ errors.push(`Selected agent slug not found in manifest: ${missing}`);
597
+ }
598
+ if (include.agents && selectedAgents.length === 0) {
599
+ warnings.push("No agents selected for import.");
600
+ }
601
+ for (const agent of selectedAgents) {
602
+ const filePath = ensureMarkdownPath(agent.path);
603
+ const markdown = source.files[filePath];
604
+ if (typeof markdown !== "string") {
605
+ errors.push(`Missing markdown file for agent ${agent.slug}: ${filePath}`);
606
+ continue;
607
+ }
608
+ const parsed = parseFrontmatterMarkdown(markdown);
609
+ if (parsed.frontmatter.kind !== "agent") {
610
+ warnings.push(`Agent markdown ${filePath} does not declare kind: agent in frontmatter.`);
611
+ }
612
+ }
613
+ let targetCompanyId = null;
614
+ let targetCompanyName = null;
615
+ if (input.target.mode === "existing_company") {
616
+ const targetCompany = await companies.getById(input.target.companyId);
617
+ if (!targetCompany)
618
+ throw notFound("Target company not found");
619
+ targetCompanyId = targetCompany.id;
620
+ targetCompanyName = targetCompany.name;
621
+ }
622
+ const agentPlans = [];
623
+ const existingSlugToAgent = new Map();
624
+ const existingSlugs = new Set();
625
+ if (input.target.mode === "existing_company") {
626
+ const existingAgents = await agents.list(input.target.companyId);
627
+ for (const existing of existingAgents) {
628
+ const slug = normalizeAgentUrlKey(existing.name) ?? existing.id;
629
+ if (!existingSlugToAgent.has(slug))
630
+ existingSlugToAgent.set(slug, existing);
631
+ existingSlugs.add(slug);
632
+ }
633
+ }
634
+ for (const manifestAgent of selectedAgents) {
635
+ const existing = existingSlugToAgent.get(manifestAgent.slug) ?? null;
636
+ if (!existing) {
637
+ agentPlans.push({
638
+ slug: manifestAgent.slug,
639
+ action: "create",
640
+ plannedName: manifestAgent.name,
641
+ existingAgentId: null,
642
+ reason: null,
643
+ });
644
+ continue;
645
+ }
646
+ if (collisionStrategy === "replace") {
647
+ agentPlans.push({
648
+ slug: manifestAgent.slug,
649
+ action: "update",
650
+ plannedName: existing.name,
651
+ existingAgentId: existing.id,
652
+ reason: "Existing slug matched; replace strategy.",
653
+ });
654
+ continue;
655
+ }
656
+ if (collisionStrategy === "skip") {
657
+ agentPlans.push({
658
+ slug: manifestAgent.slug,
659
+ action: "skip",
660
+ plannedName: existing.name,
661
+ existingAgentId: existing.id,
662
+ reason: "Existing slug matched; skip strategy.",
663
+ });
664
+ continue;
665
+ }
666
+ const renamed = uniqueNameBySlug(manifestAgent.name, existingSlugs);
667
+ existingSlugs.add(normalizeAgentUrlKey(renamed) ?? manifestAgent.slug);
668
+ agentPlans.push({
669
+ slug: manifestAgent.slug,
670
+ action: "create",
671
+ plannedName: renamed,
672
+ existingAgentId: existing.id,
673
+ reason: "Existing slug matched; rename strategy.",
674
+ });
675
+ }
676
+ const preview = {
677
+ include,
678
+ targetCompanyId,
679
+ targetCompanyName,
680
+ collisionStrategy,
681
+ selectedAgentSlugs: selectedAgents.map((agent) => agent.slug),
682
+ plan: {
683
+ companyAction: input.target.mode === "new_company"
684
+ ? "create"
685
+ : include.company
686
+ ? "update"
687
+ : "none",
688
+ agentPlans,
689
+ },
690
+ requiredSecrets: manifest.requiredSecrets ?? [],
691
+ warnings,
692
+ errors,
693
+ };
694
+ return {
695
+ preview,
696
+ source,
697
+ include,
698
+ collisionStrategy,
699
+ selectedAgents,
700
+ };
701
+ }
702
+ async function previewImport(input) {
703
+ const plan = await buildPreview(input);
704
+ return plan.preview;
705
+ }
706
+ async function importBundle(input, actorUserId) {
707
+ const plan = await buildPreview(input);
708
+ if (plan.preview.errors.length > 0) {
709
+ throw unprocessable(`Import preview has errors: ${plan.preview.errors.join("; ")}`);
710
+ }
711
+ const sourceManifest = plan.source.manifest;
712
+ const warnings = [...plan.preview.warnings];
713
+ const include = plan.include;
714
+ let targetCompany = null;
715
+ let companyAction = "unchanged";
716
+ if (input.target.mode === "new_company") {
717
+ const companyName = asString(input.target.newCompanyName) ??
718
+ sourceManifest.company?.name ??
719
+ sourceManifest.source?.companyName ??
720
+ "Imported Company";
721
+ const created = await companies.create({
722
+ name: companyName,
723
+ description: include.company ? (sourceManifest.company?.description ?? null) : null,
724
+ brandColor: include.company ? (sourceManifest.company?.brandColor ?? null) : null,
725
+ requireBoardApprovalForNewAgents: include.company
726
+ ? (sourceManifest.company?.requireBoardApprovalForNewAgents ?? true)
727
+ : true,
728
+ });
729
+ await access.ensureMembership(created.id, "user", actorUserId ?? "board", "owner", "active");
730
+ targetCompany = created;
731
+ companyAction = "created";
732
+ }
733
+ else {
734
+ targetCompany = await companies.getById(input.target.companyId);
735
+ if (!targetCompany)
736
+ throw notFound("Target company not found");
737
+ if (include.company && sourceManifest.company) {
738
+ const updated = await companies.update(targetCompany.id, {
739
+ name: sourceManifest.company.name,
740
+ description: sourceManifest.company.description,
741
+ brandColor: sourceManifest.company.brandColor,
742
+ requireBoardApprovalForNewAgents: sourceManifest.company.requireBoardApprovalForNewAgents,
743
+ });
744
+ targetCompany = updated ?? targetCompany;
745
+ companyAction = "updated";
746
+ }
747
+ }
748
+ if (!targetCompany)
749
+ throw notFound("Target company not found");
750
+ const resultAgents = [];
751
+ const importedSlugToAgentId = new Map();
752
+ const existingSlugToAgentId = new Map();
753
+ const existingAgents = await agents.list(targetCompany.id);
754
+ for (const existing of existingAgents) {
755
+ existingSlugToAgentId.set(normalizeAgentUrlKey(existing.name) ?? existing.id, existing.id);
756
+ }
757
+ if (include.agents) {
758
+ for (const planAgent of plan.preview.plan.agentPlans) {
759
+ const manifestAgent = plan.selectedAgents.find((agent) => agent.slug === planAgent.slug);
760
+ if (!manifestAgent)
761
+ continue;
762
+ if (planAgent.action === "skip") {
763
+ resultAgents.push({
764
+ slug: planAgent.slug,
765
+ id: planAgent.existingAgentId,
766
+ action: "skipped",
767
+ name: planAgent.plannedName,
768
+ reason: planAgent.reason,
769
+ });
770
+ continue;
771
+ }
772
+ const markdownRaw = plan.source.files[manifestAgent.path];
773
+ if (!markdownRaw) {
774
+ warnings.push(`Missing AGENTS markdown for ${manifestAgent.slug}; imported without prompt template.`);
775
+ }
776
+ const markdown = markdownRaw ? parseFrontmatterMarkdown(markdownRaw) : { frontmatter: {}, body: "" };
777
+ const adapterConfig = {
778
+ ...manifestAgent.adapterConfig,
779
+ promptTemplate: markdown.body || asString(manifestAgent.adapterConfig.promptTemplate) || "",
780
+ };
781
+ delete adapterConfig.instructionsFilePath;
782
+ const patch = {
783
+ name: planAgent.plannedName,
784
+ role: manifestAgent.role,
785
+ title: manifestAgent.title,
786
+ icon: manifestAgent.icon,
787
+ capabilities: manifestAgent.capabilities,
788
+ reportsTo: null,
789
+ adapterType: manifestAgent.adapterType,
790
+ adapterConfig,
791
+ runtimeConfig: manifestAgent.runtimeConfig,
792
+ budgetMonthlyCents: manifestAgent.budgetMonthlyCents,
793
+ permissions: manifestAgent.permissions,
794
+ metadata: manifestAgent.metadata,
795
+ };
796
+ if (planAgent.action === "update" && planAgent.existingAgentId) {
797
+ const updated = await agents.update(planAgent.existingAgentId, patch);
798
+ if (!updated) {
799
+ warnings.push(`Skipped update for missing agent ${planAgent.existingAgentId}.`);
800
+ resultAgents.push({
801
+ slug: planAgent.slug,
802
+ id: null,
803
+ action: "skipped",
804
+ name: planAgent.plannedName,
805
+ reason: "Existing target agent not found.",
806
+ });
807
+ continue;
808
+ }
809
+ importedSlugToAgentId.set(planAgent.slug, updated.id);
810
+ existingSlugToAgentId.set(normalizeAgentUrlKey(updated.name) ?? updated.id, updated.id);
811
+ resultAgents.push({
812
+ slug: planAgent.slug,
813
+ id: updated.id,
814
+ action: "updated",
815
+ name: updated.name,
816
+ reason: planAgent.reason,
817
+ });
818
+ continue;
819
+ }
820
+ const created = await agents.create(targetCompany.id, patch);
821
+ importedSlugToAgentId.set(planAgent.slug, created.id);
822
+ existingSlugToAgentId.set(normalizeAgentUrlKey(created.name) ?? created.id, created.id);
823
+ resultAgents.push({
824
+ slug: planAgent.slug,
825
+ id: created.id,
826
+ action: "created",
827
+ name: created.name,
828
+ reason: planAgent.reason,
829
+ });
830
+ }
831
+ // Apply reporting links once all imported agent ids are available.
832
+ for (const manifestAgent of plan.selectedAgents) {
833
+ const agentId = importedSlugToAgentId.get(manifestAgent.slug);
834
+ if (!agentId)
835
+ continue;
836
+ const managerSlug = manifestAgent.reportsToSlug;
837
+ if (!managerSlug)
838
+ continue;
839
+ const managerId = importedSlugToAgentId.get(managerSlug) ?? existingSlugToAgentId.get(managerSlug) ?? null;
840
+ if (!managerId || managerId === agentId)
841
+ continue;
842
+ try {
843
+ await agents.update(agentId, { reportsTo: managerId });
844
+ }
845
+ catch {
846
+ warnings.push(`Could not assign manager ${managerSlug} for imported agent ${manifestAgent.slug}.`);
847
+ }
848
+ }
849
+ }
850
+ return {
851
+ company: {
852
+ id: targetCompany.id,
853
+ name: targetCompany.name,
854
+ action: companyAction,
855
+ },
856
+ agents: resultAgents,
857
+ requiredSecrets: sourceManifest.requiredSecrets ?? [],
858
+ warnings,
859
+ };
860
+ }
861
+ return {
862
+ exportBundle,
863
+ previewImport,
864
+ importBundle,
865
+ };
866
+ }
867
+ //# sourceMappingURL=company-portability.js.map