@repo-os/repoos 0.5.45

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 (362) hide show
  1. package/LICENSE.md +110 -0
  2. package/README.md +272 -0
  3. package/dist/.build-info.json +4 -0
  4. package/dist/.build-stamp.json +3 -0
  5. package/dist/cli/colors.d.ts +13 -0
  6. package/dist/cli/colors.js +37 -0
  7. package/dist/cli/index.d.ts +2 -0
  8. package/dist/cli/index.js +221 -0
  9. package/dist/commands/check.d.ts +170 -0
  10. package/dist/commands/check.js +1227 -0
  11. package/dist/commands/docs.d.ts +2 -0
  12. package/dist/commands/docs.js +70 -0
  13. package/dist/commands/gc.d.ts +1 -0
  14. package/dist/commands/gc.js +57 -0
  15. package/dist/commands/init.d.ts +9 -0
  16. package/dist/commands/init.js +699 -0
  17. package/dist/commands/screenshots.d.ts +7 -0
  18. package/dist/commands/screenshots.js +77 -0
  19. package/dist/commands/serve.d.ts +55 -0
  20. package/dist/commands/serve.js +204 -0
  21. package/dist/commands/status.d.ts +140 -0
  22. package/dist/commands/status.js +569 -0
  23. package/dist/commands/stop.d.ts +1 -0
  24. package/dist/commands/stop.js +59 -0
  25. package/dist/commands/tasks.d.ts +47 -0
  26. package/dist/commands/tasks.js +334 -0
  27. package/dist/commands/tunnel.d.ts +1 -0
  28. package/dist/commands/tunnel.js +1271 -0
  29. package/dist/commands/ui-harness.d.ts +53 -0
  30. package/dist/commands/ui-harness.js +62 -0
  31. package/dist/commands/ui-smoke.d.ts +6 -0
  32. package/dist/commands/ui-smoke.js +220 -0
  33. package/dist/commands/upgrade.d.ts +15 -0
  34. package/dist/commands/upgrade.js +188 -0
  35. package/dist/core/auth-store.d.ts +81 -0
  36. package/dist/core/auth-store.js +530 -0
  37. package/dist/core/auth.d.ts +75 -0
  38. package/dist/core/auth.js +124 -0
  39. package/dist/core/bootstrap.d.ts +41 -0
  40. package/dist/core/bootstrap.js +236 -0
  41. package/dist/core/build.d.ts +92 -0
  42. package/dist/core/build.js +249 -0
  43. package/dist/core/canary.d.ts +10 -0
  44. package/dist/core/canary.js +14 -0
  45. package/dist/core/check-failure-summary.d.ts +10 -0
  46. package/dist/core/check-failure-summary.js +34 -0
  47. package/dist/core/config.d.ts +160 -0
  48. package/dist/core/config.js +1288 -0
  49. package/dist/core/context-pack.d.ts +74 -0
  50. package/dist/core/context-pack.js +778 -0
  51. package/dist/core/db.d.ts +236 -0
  52. package/dist/core/db.js +747 -0
  53. package/dist/core/detect.d.ts +69 -0
  54. package/dist/core/detect.js +251 -0
  55. package/dist/core/docs.d.ts +76 -0
  56. package/dist/core/docs.js +225 -0
  57. package/dist/core/frontmatter.d.ts +29 -0
  58. package/dist/core/frontmatter.js +215 -0
  59. package/dist/core/git.d.ts +505 -0
  60. package/dist/core/git.js +1453 -0
  61. package/dist/core/indexer.d.ts +33 -0
  62. package/dist/core/indexer.js +282 -0
  63. package/dist/core/input.d.ts +66 -0
  64. package/dist/core/input.js +222 -0
  65. package/dist/core/logger.d.ts +70 -0
  66. package/dist/core/logger.js +138 -0
  67. package/dist/core/models.d.ts +45 -0
  68. package/dist/core/models.js +291 -0
  69. package/dist/core/net-probe.d.ts +4 -0
  70. package/dist/core/net-probe.js +20 -0
  71. package/dist/core/providers/deepinfra.d.ts +23 -0
  72. package/dist/core/providers/deepinfra.js +44 -0
  73. package/dist/core/providers/index.d.ts +24 -0
  74. package/dist/core/providers/index.js +59 -0
  75. package/dist/core/providers/openrouter.d.ts +28 -0
  76. package/dist/core/providers/openrouter.js +82 -0
  77. package/dist/core/providers/spend.d.ts +86 -0
  78. package/dist/core/providers/spend.js +286 -0
  79. package/dist/core/providers/types.d.ts +56 -0
  80. package/dist/core/providers/types.js +39 -0
  81. package/dist/core/repoos.d.ts +59 -0
  82. package/dist/core/repoos.js +221 -0
  83. package/dist/core/runtime.d.ts +35 -0
  84. package/dist/core/runtime.js +167 -0
  85. package/dist/core/skills-registry.d.ts +39 -0
  86. package/dist/core/skills-registry.js +148 -0
  87. package/dist/core/skills-registry.test.d.ts +1 -0
  88. package/dist/core/skills-registry.test.js +52 -0
  89. package/dist/core/sysmem.d.ts +7 -0
  90. package/dist/core/sysmem.js +55 -0
  91. package/dist/core/tailscale.d.ts +2 -0
  92. package/dist/core/tailscale.js +19 -0
  93. package/dist/core/task.d.ts +53 -0
  94. package/dist/core/task.js +310 -0
  95. package/dist/core/toml-line.d.ts +20 -0
  96. package/dist/core/toml-line.js +52 -0
  97. package/dist/core/toml-validate.d.ts +44 -0
  98. package/dist/core/toml-validate.js +335 -0
  99. package/dist/core/tunnel-assistant.d.ts +30 -0
  100. package/dist/core/tunnel-assistant.js +65 -0
  101. package/dist/core/tunnel-registry.d.ts +96 -0
  102. package/dist/core/tunnel-registry.js +267 -0
  103. package/dist/core/tunnel-registry.test.d.ts +1 -0
  104. package/dist/core/tunnel-registry.test.js +309 -0
  105. package/dist/core/tunnel.d.ts +103 -0
  106. package/dist/core/tunnel.js +320 -0
  107. package/dist/core/types.d.ts +811 -0
  108. package/dist/core/types.js +27 -0
  109. package/dist/core/worktree-gc.d.ts +57 -0
  110. package/dist/core/worktree-gc.js +194 -0
  111. package/dist/server/__tests__/integration-job.test.d.ts +1 -0
  112. package/dist/server/__tests__/integration-job.test.js +129 -0
  113. package/dist/server/agents.d.ts +1020 -0
  114. package/dist/server/agents.js +4070 -0
  115. package/dist/server/attachments.d.ts +51 -0
  116. package/dist/server/attachments.js +130 -0
  117. package/dist/server/auto-engineering.d.ts +45 -0
  118. package/dist/server/auto-engineering.js +275 -0
  119. package/dist/server/branchless-release.d.ts +22 -0
  120. package/dist/server/branchless-release.js +67 -0
  121. package/dist/server/built-in-agents.d.ts +305 -0
  122. package/dist/server/built-in-agents.js +1838 -0
  123. package/dist/server/cto-monitor.d.ts +35 -0
  124. package/dist/server/cto-monitor.js +281 -0
  125. package/dist/server/cto.d.ts +125 -0
  126. package/dist/server/cto.js +590 -0
  127. package/dist/server/deployments.d.ts +119 -0
  128. package/dist/server/deployments.js +325 -0
  129. package/dist/server/diff-snapshot.d.ts +20 -0
  130. package/dist/server/diff-snapshot.js +73 -0
  131. package/dist/server/done.d.ts +160 -0
  132. package/dist/server/done.js +488 -0
  133. package/dist/server/freeform.d.ts +55 -0
  134. package/dist/server/freeform.js +179 -0
  135. package/dist/server/handoff.d.ts +99 -0
  136. package/dist/server/handoff.js +575 -0
  137. package/dist/server/hetzner.d.ts +45 -0
  138. package/dist/server/hetzner.js +117 -0
  139. package/dist/server/icons.d.ts +8 -0
  140. package/dist/server/icons.js +195 -0
  141. package/dist/server/integration-job.d.ts +75 -0
  142. package/dist/server/integration-job.js +144 -0
  143. package/dist/server/integration-orchestrator.d.ts +211 -0
  144. package/dist/server/integration-orchestrator.js +1299 -0
  145. package/dist/server/integration-status.d.ts +48 -0
  146. package/dist/server/integration-status.js +71 -0
  147. package/dist/server/live-index.d.ts +295 -0
  148. package/dist/server/live-index.js +452 -0
  149. package/dist/server/model-test.d.ts +20 -0
  150. package/dist/server/model-test.js +100 -0
  151. package/dist/server/ntfy.d.ts +57 -0
  152. package/dist/server/ntfy.js +112 -0
  153. package/dist/server/pm-attachments.d.ts +35 -0
  154. package/dist/server/pm-attachments.js +181 -0
  155. package/dist/server/pm-runs.d.ts +58 -0
  156. package/dist/server/pm-runs.js +80 -0
  157. package/dist/server/preview.d.ts +174 -0
  158. package/dist/server/preview.js +641 -0
  159. package/dist/server/release.d.ts +88 -0
  160. package/dist/server/release.js +449 -0
  161. package/dist/server/reload.d.ts +194 -0
  162. package/dist/server/reload.js +586 -0
  163. package/dist/server/remote-validation.d.ts +132 -0
  164. package/dist/server/remote-validation.js +478 -0
  165. package/dist/server/repo-lock.d.ts +36 -0
  166. package/dist/server/repo-lock.js +141 -0
  167. package/dist/server/review-guard.d.ts +14 -0
  168. package/dist/server/review-guard.js +159 -0
  169. package/dist/server/review.d.ts +243 -0
  170. package/dist/server/review.js +1211 -0
  171. package/dist/server/routes/agents.d.ts +6 -0
  172. package/dist/server/routes/agents.js +28 -0
  173. package/dist/server/routes/auth.d.ts +60 -0
  174. package/dist/server/routes/auth.js +755 -0
  175. package/dist/server/routes/config.d.ts +20 -0
  176. package/dist/server/routes/config.js +347 -0
  177. package/dist/server/routes/debugger.d.ts +33 -0
  178. package/dist/server/routes/debugger.js +360 -0
  179. package/dist/server/routes/deployments.d.ts +3 -0
  180. package/dist/server/routes/deployments.js +16 -0
  181. package/dist/server/routes/docs.d.ts +8 -0
  182. package/dist/server/routes/docs.js +135 -0
  183. package/dist/server/routes/helpers.d.ts +21 -0
  184. package/dist/server/routes/helpers.js +171 -0
  185. package/dist/server/routes/index.d.ts +19 -0
  186. package/dist/server/routes/index.js +18 -0
  187. package/dist/server/routes/info.d.ts +17 -0
  188. package/dist/server/routes/info.js +177 -0
  189. package/dist/server/routes/inputs.d.ts +7 -0
  190. package/dist/server/routes/inputs.js +125 -0
  191. package/dist/server/routes/model-providers.d.ts +27 -0
  192. package/dist/server/routes/model-providers.js +94 -0
  193. package/dist/server/routes/models.d.ts +3 -0
  194. package/dist/server/routes/models.js +36 -0
  195. package/dist/server/routes/notify.d.ts +2 -0
  196. package/dist/server/routes/notify.js +17 -0
  197. package/dist/server/routes/playground.d.ts +29 -0
  198. package/dist/server/routes/playground.js +81 -0
  199. package/dist/server/routes/release.d.ts +20 -0
  200. package/dist/server/routes/release.js +86 -0
  201. package/dist/server/routes/router.d.ts +12 -0
  202. package/dist/server/routes/router.js +32 -0
  203. package/dist/server/routes/skill-registry.d.ts +5 -0
  204. package/dist/server/routes/skill-registry.js +51 -0
  205. package/dist/server/routes/tasks.d.ts +58 -0
  206. package/dist/server/routes/tasks.js +1442 -0
  207. package/dist/server/routes/transcribe.d.ts +2 -0
  208. package/dist/server/routes/transcribe.js +124 -0
  209. package/dist/server/routes/types.d.ts +68 -0
  210. package/dist/server/routes/types.js +1 -0
  211. package/dist/server/routes/ui.d.ts +5 -0
  212. package/dist/server/routes/ui.js +81 -0
  213. package/dist/server/routes/utils.d.ts +3 -0
  214. package/dist/server/routes/utils.js +23 -0
  215. package/dist/server/serve-reaper.d.ts +135 -0
  216. package/dist/server/serve-reaper.js +491 -0
  217. package/dist/server/server.d.ts +49 -0
  218. package/dist/server/server.js +2171 -0
  219. package/dist/server/supervisor.d.ts +89 -0
  220. package/dist/server/supervisor.js +231 -0
  221. package/dist/server/system.d.ts +198 -0
  222. package/dist/server/system.js +480 -0
  223. package/dist/server/task-check.d.ts +45 -0
  224. package/dist/server/task-check.js +71 -0
  225. package/dist/server/task-transitions.d.ts +51 -0
  226. package/dist/server/task-transitions.js +78 -0
  227. package/dist/server/task-watchdog.d.ts +158 -0
  228. package/dist/server/task-watchdog.js +681 -0
  229. package/dist/server/test-run.d.ts +28 -0
  230. package/dist/server/test-run.js +81 -0
  231. package/dist/server/watcher.d.ts +21 -0
  232. package/dist/server/watcher.js +194 -0
  233. package/dist/server/write.d.ts +94 -0
  234. package/dist/server/write.js +345 -0
  235. package/dist/ui/assets/AgentsView-CF4wRvHh.css +1 -0
  236. package/dist/ui/assets/AgentsView-D-myL-kA.js +1 -0
  237. package/dist/ui/assets/ContextView-D3TC-RSp.css +1 -0
  238. package/dist/ui/assets/ContextView-DsOqAdyE.js +4 -0
  239. package/dist/ui/assets/DashboardView-BOhsIJqO.js +1 -0
  240. package/dist/ui/assets/DashboardView-Ck9o0RP2.css +1 -0
  241. package/dist/ui/assets/DeploymentsView--iIUVfEH.css +1 -0
  242. package/dist/ui/assets/DeploymentsView-DXu_FYR2.js +1 -0
  243. package/dist/ui/assets/InputsView-24HVbVPk.js +1 -0
  244. package/dist/ui/assets/InputsView-BLb7GHtx.css +1 -0
  245. package/dist/ui/assets/LoginView-6QlGg6cx.css +1 -0
  246. package/dist/ui/assets/LoginView-BqupI0Lt.js +1 -0
  247. package/dist/ui/assets/ReleasesView-BEG1A0YH.css +1 -0
  248. package/dist/ui/assets/ReleasesView-CAgMuxpe.js +3 -0
  249. package/dist/ui/assets/SettingsView-CA-NYSMK.css +1 -0
  250. package/dist/ui/assets/SettingsView-O3iZSnjg.js +3 -0
  251. package/dist/ui/assets/WorkView-D8Tl6qwy.js +1 -0
  252. package/dist/ui/assets/WorkView-DMYL2s3W.css +1 -0
  253. package/dist/ui/assets/abnfDiagram-VCTEODGH-J5lkSnEE.js +1 -0
  254. package/dist/ui/assets/arc-BHZnmhhM.js +1 -0
  255. package/dist/ui/assets/architecture-7GRP2DOG-pLdFt-xS.js +1 -0
  256. package/dist/ui/assets/architectureDiagram-5GKGNRK7-C3k89uKX.js +36 -0
  257. package/dist/ui/assets/array-BifhSqXX.js +1 -0
  258. package/dist/ui/assets/blockDiagram-I7D4REHJ-AWNoBzop.js +129 -0
  259. package/dist/ui/assets/button-lbikqSph.js +1 -0
  260. package/dist/ui/assets/c4Diagram-7LVT6UL2-DKG1D5gd.js +38 -0
  261. package/dist/ui/assets/channel-gA4qBv3A.js +1 -0
  262. package/dist/ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  263. package/dist/ui/assets/chunk-4HAMMTFA-D1YR8lF_.js +62 -0
  264. package/dist/ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  265. package/dist/ui/assets/chunk-75Z2AOVW-5GuBxfsL.js +2 -0
  266. package/dist/ui/assets/chunk-DU6HZSFF-DfdNNqwa.js +127 -0
  267. package/dist/ui/assets/chunk-F27PBJKO-BPZzinQ4.js +1 -0
  268. package/dist/ui/assets/chunk-FOHPRMQF-l2z4K2jD.js +161 -0
  269. package/dist/ui/assets/chunk-GMAD6QVW-DGWvSKj5.js +72 -0
  270. package/dist/ui/assets/chunk-GVQU2GXP-D6Aw75wJ.js +1 -0
  271. package/dist/ui/assets/chunk-IMKFNOWR-B8mMBKCW.js +231 -0
  272. package/dist/ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  273. package/dist/ui/assets/chunk-L3NEJ4N5-D5OJuXYE.js +1 -0
  274. package/dist/ui/assets/chunk-OSK3NFVY-B7r9w2UW.js +10 -0
  275. package/dist/ui/assets/chunk-P2QGCYS3-C74X4AQX.js +1 -0
  276. package/dist/ui/assets/chunk-POPQ4Y6H-C5_u1gUS.js +1 -0
  277. package/dist/ui/assets/chunk-PWAF6VOD-DfoTLtxn.js +1 -0
  278. package/dist/ui/assets/chunk-SHT3W25Y-D40m2eqz.js +168 -0
  279. package/dist/ui/assets/chunk-SVP7TREG-euxi0Kap.js +88 -0
  280. package/dist/ui/assets/chunk-TICWLB2K-fkdxngzN.js +206 -0
  281. package/dist/ui/assets/chunk-XXDRQBXY-DFBUG-OT.js +1 -0
  282. package/dist/ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  283. package/dist/ui/assets/classDiagram-ZZMXUADV-BzW8bq2P.js +1 -0
  284. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-BzW8bq2P.js +1 -0
  285. package/dist/ui/assets/cose-bilkent-JH36ORCC-BTcgMon1.js +1 -0
  286. package/dist/ui/assets/cynefin-OW5HDTMX-B5m_COsS.js +1 -0
  287. package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-C-AG6CGe.js +62 -0
  288. package/dist/ui/assets/cytoscape.esm-FBntH-9t.js +321 -0
  289. package/dist/ui/assets/dagre-GXQ25YYZ-DDfDnp8L.js +4 -0
  290. package/dist/ui/assets/dagre-PrKaheQc.js +1 -0
  291. package/dist/ui/assets/defaultLocale-BFoDCU3G.js +1 -0
  292. package/dist/ui/assets/diagram-S7CK7UJ4-DjQZAlEY.js +30 -0
  293. package/dist/ui/assets/diagram-UQ7AKVKN-DAZ9yp1B.js +41 -0
  294. package/dist/ui/assets/diagram-VSXAHHWV-BWepUKJD.js +3 -0
  295. package/dist/ui/assets/diagram-VX7I27RA-EcV1J81b.js +24 -0
  296. package/dist/ui/assets/diagram-Z3DM3KII-Dbz7XU_K.js +24 -0
  297. package/dist/ui/assets/dist-DTg6UBE_.js +1 -0
  298. package/dist/ui/assets/ebnfDiagram-PWID7BFC-BUyQw8Mm.js +1 -0
  299. package/dist/ui/assets/erDiagram-RLTQ6QDP-WVf8ukKt.js +99 -0
  300. package/dist/ui/assets/eventmodeling-NTZA5JFV-DHqyLOAn.js +1 -0
  301. package/dist/ui/assets/flowDiagram-HODETNUW-CYk_ze5K.js +1 -0
  302. package/dist/ui/assets/ganttDiagram-EL5Y4UJY-rB4MZuB-.js +292 -0
  303. package/dist/ui/assets/gitGraph-4MIJSDKK-BOTWM8dY.js +1 -0
  304. package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-eYscuhtP.js +106 -0
  305. package/dist/ui/assets/graphlib-DS17s2tU.js +1 -0
  306. package/dist/ui/assets/index-BACBfnga.css +1 -0
  307. package/dist/ui/assets/index-BOQ-ust6.js +26 -0
  308. package/dist/ui/assets/info-A6RAGUB7-_67wOORe.js +1 -0
  309. package/dist/ui/assets/infoDiagram-27XIBGKW-XVXbddTA.js +2 -0
  310. package/dist/ui/assets/init-C-OQMol4.js +1 -0
  311. package/dist/ui/assets/ishikawaDiagram-5VMMS53U-ClLNiEru.js +70 -0
  312. package/dist/ui/assets/journeyDiagram-3NMN7TZE-NRawjR6i.js +139 -0
  313. package/dist/ui/assets/kanban-definition-UXKFOSKX-BgSzBfIx.js +89 -0
  314. package/dist/ui/assets/katex-DolUETbr.js +257 -0
  315. package/dist/ui/assets/line-KAyfuul4.js +1 -0
  316. package/dist/ui/assets/linear-cCCPOpu7.js +1 -0
  317. package/dist/ui/assets/mermaid-parser.core-CgXZk1iN.js +7 -0
  318. package/dist/ui/assets/mermaid.core-BUUkChHW.js +44 -0
  319. package/dist/ui/assets/mindmap-definition-YA3MSWOX-Cpn7vW4r.js +96 -0
  320. package/dist/ui/assets/ordinal-BDEzSJ7C.js +1 -0
  321. package/dist/ui/assets/packet-AYTQ26CC-0lZwM-d6.js +1 -0
  322. package/dist/ui/assets/path-COt_16Va.js +1 -0
  323. package/dist/ui/assets/pegDiagram-XKGWAZYB-impy0inn.js +1 -0
  324. package/dist/ui/assets/pie-WAS4IAKB-CqfdGHYg.js +1 -0
  325. package/dist/ui/assets/pieDiagram-E7YTZNPT-CxjL4I1h.js +39 -0
  326. package/dist/ui/assets/quadrantDiagram-AXDQQJYC-Cjd1QMIe.js +7 -0
  327. package/dist/ui/assets/radar-RG4KPBEZ-CRkQIwiv.js +1 -0
  328. package/dist/ui/assets/railroad-74A4TZTK-i67XSWTB.js +1 -0
  329. package/dist/ui/assets/railroad-abnf-HS5TGJTU-Cv9m5aS3.js +1 -0
  330. package/dist/ui/assets/railroad-ebnf-LZEXJU2U-C5ZIn-Jh.js +1 -0
  331. package/dist/ui/assets/railroad-peg-WCYAUIDC-CGra9Oq-.js +1 -0
  332. package/dist/ui/assets/railroadDiagram-O6MQD6OU-_pK0qyaY.js +1 -0
  333. package/dist/ui/assets/releases-B0WNV-SY.js +1 -0
  334. package/dist/ui/assets/repoos-cto-square.webp +0 -0
  335. package/dist/ui/assets/repoos-helpful-pm-square.webp +0 -0
  336. package/dist/ui/assets/repoos-orchestrator-square.webp +0 -0
  337. package/dist/ui/assets/repoos-performance-agent-square.webp +0 -0
  338. package/dist/ui/assets/repoos-ross-from-friends-square.webp +0 -0
  339. package/dist/ui/assets/repoos-tech-debt-agent-square.webp +0 -0
  340. package/dist/ui/assets/requirementDiagram-BXWQKSXE-CRrFX-yw.js +84 -0
  341. package/dist/ui/assets/rough.esm-By172zw-.js +1 -0
  342. package/dist/ui/assets/sankeyDiagram-P5KCCOFB-X_xFRj9E.js +40 -0
  343. package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-Byb49lKf.js +162 -0
  344. package/dist/ui/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  345. package/dist/ui/assets/src-BH-TyZbA.js +1 -0
  346. package/dist/ui/assets/stateDiagram-D77RDMKH-CzaPrqYF.js +1 -0
  347. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-BCXckz7K.js +1 -0
  348. package/dist/ui/assets/swimlanes-42K2YHIH-Cx_1lnqr.js +1 -0
  349. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-54qsKi6A.js +8 -0
  350. package/dist/ui/assets/timeline-definition-24CTP7MA-B1IbZPQ-.js +120 -0
  351. package/dist/ui/assets/treeView-Q6P3EWNA-DFWhVE3d.js +1 -0
  352. package/dist/ui/assets/treemap-WGGIJYW6-BmbYPThn.js +1 -0
  353. package/dist/ui/assets/vendor-ui-DPm7zLxi.js +3 -0
  354. package/dist/ui/assets/vendor-vue-CobgyEJp.js +1 -0
  355. package/dist/ui/assets/vennDiagram-4TSXK5OY-Ae2AtRpt.js +34 -0
  356. package/dist/ui/assets/wardley-WFR3VGLG-BtD4X4tL.js +1 -0
  357. package/dist/ui/assets/wardleyDiagram-VM6X3IG4-B3YN2fTd.js +78 -0
  358. package/dist/ui/assets/xychartDiagram-S5SC5T6Z-CIzJfMKA.js +7 -0
  359. package/dist/ui/favicon.svg +11 -0
  360. package/dist/ui/index.html +49 -0
  361. package/dist/ui/sw.js +48 -0
  362. package/package.json +91 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Centralized logging for RepoOS system, tasks, and agents.
3
+ * Logs are stored as newline-delimited JSON (NDJSON) in .repoos/logs/
4
+ * Structure:
5
+ * .repoos/logs/system.log - System-wide errors and critical events
6
+ * .repoos/logs/tasks/<id>.log - Per-task lifecycle and state changes
7
+ * .repoos/logs/agents/<id>.log - Per-agent activity and errors
8
+ */
9
+ import { appendFileSync, mkdirSync, existsSync, readFileSync } from "node:fs";
10
+ import { join, dirname } from "node:path";
11
+ /**
12
+ * Central logger for RepoOS. Creates and manages log files in .repoos/logs/
13
+ */
14
+ export class Logger {
15
+ root;
16
+ logsDir;
17
+ constructor(opts) {
18
+ this.root = opts.root;
19
+ this.logsDir = join(opts.root, ".repoos", "logs");
20
+ }
21
+ /**
22
+ * Log a system-wide event or error. Includes fatal crashes and critical failures.
23
+ */
24
+ system(level, message, context) {
25
+ this.write("system.log", {
26
+ timestamp: new Date().toISOString(),
27
+ level,
28
+ component: "system",
29
+ message,
30
+ context,
31
+ });
32
+ }
33
+ /**
34
+ * Log a task lifecycle event: state changes, errors, transitions through pipeline.
35
+ */
36
+ task(taskId, level, message, context) {
37
+ this.write(`tasks/${taskId}.log`, {
38
+ timestamp: new Date().toISOString(),
39
+ level,
40
+ component: "task",
41
+ message,
42
+ context,
43
+ });
44
+ }
45
+ /**
46
+ * Log agent activity: startup, completion, errors, output streams.
47
+ */
48
+ agent(agentId, level, message, context) {
49
+ this.write(`agents/${agentId}.log`, {
50
+ timestamp: new Date().toISOString(),
51
+ level,
52
+ component: "agent",
53
+ message,
54
+ context,
55
+ });
56
+ }
57
+ /**
58
+ * Log integration/merge job activity (phase transitions, errors).
59
+ */
60
+ integration(taskId, level, message, context) {
61
+ this.write(`tasks/${taskId}.log`, {
62
+ timestamp: new Date().toISOString(),
63
+ level,
64
+ component: "integration",
65
+ message,
66
+ context,
67
+ });
68
+ }
69
+ /**
70
+ * Read up to `limit` log entries for a specific task or agent, in
71
+ * chronological order (oldest first). Callers that want most-recent-first
72
+ * (`getTaskLogs`, `getAgentLogs`, `getSystemLogs`) reverse the result.
73
+ */
74
+ readLogs(logPath, limit = 1000) {
75
+ const fullPath = join(this.logsDir, logPath);
76
+ if (!existsSync(fullPath))
77
+ return [];
78
+ try {
79
+ const content = readFileSync(fullPath, "utf8");
80
+ const lines = content.split("\n").filter((line) => line.trim());
81
+ const entries = [];
82
+ for (const line of lines) {
83
+ try {
84
+ entries.push(JSON.parse(line));
85
+ }
86
+ catch {
87
+ // Skip malformed lines
88
+ }
89
+ }
90
+ return entries.slice(Math.max(0, entries.length - limit));
91
+ }
92
+ catch {
93
+ return [];
94
+ }
95
+ }
96
+ /**
97
+ * Get task logs in reverse order (most recent first).
98
+ */
99
+ getTaskLogs(taskId, limit = 1000) {
100
+ const entries = this.readLogs(`tasks/${taskId}.log`, limit);
101
+ return entries.reverse();
102
+ }
103
+ /**
104
+ * Get agent logs in reverse order (most recent first).
105
+ */
106
+ getAgentLogs(agentId, limit = 1000) {
107
+ const entries = this.readLogs(`agents/${agentId}.log`, limit);
108
+ return entries.reverse();
109
+ }
110
+ /**
111
+ * Get system logs in reverse order (most recent first).
112
+ */
113
+ getSystemLogs(limit = 1000) {
114
+ const entries = this.readLogs("system.log", limit);
115
+ return entries.reverse();
116
+ }
117
+ /**
118
+ * Write a log entry as NDJSON to the appropriate log file.
119
+ */
120
+ write(logPath, entry) {
121
+ try {
122
+ const fullPath = join(this.logsDir, logPath);
123
+ const dir = dirname(fullPath);
124
+ mkdirSync(dir, { recursive: true });
125
+ appendFileSync(fullPath, JSON.stringify(entry) + "\n", "utf8");
126
+ }
127
+ catch (err) {
128
+ // Logging should never crash the system. Silent failure.
129
+ console.error(`Failed to write log: ${err}`);
130
+ }
131
+ }
132
+ }
133
+ /**
134
+ * Create a logger for a repository root.
135
+ */
136
+ export function createLogger(root) {
137
+ return new Logger({ root });
138
+ }
@@ -0,0 +1,45 @@
1
+ /** Default ceiling on the `opencode models` probe, ms. A hung CLI is SIGKILLed. */
2
+ export declare const MODELS_TIMEOUT_MS = 5000;
3
+ /** Codex app-server has a heavier cold start than a one-shot CLI command. */
4
+ export declare const CODEX_MODELS_TIMEOUT_MS = 15000;
5
+ /** Hard cap on collected stdout so a runaway provider list can't balloon memory. */
6
+ export declare const MODELS_MAX_BYTES: number;
7
+ /** Outcome of probing one model source. `models` is never null. */
8
+ export interface ModelSourceResult {
9
+ supported: boolean;
10
+ models: string[];
11
+ /** True when the source supports a cache-refreshing re-probe. */
12
+ refreshable: boolean;
13
+ }
14
+ /** Options handed to an adapter's `list`. */
15
+ export interface ListModelsOptions {
16
+ /** Re-probe with the source's refresh flag (e.g. `--refresh`). */
17
+ refresh?: boolean;
18
+ /** Working directory the probe runs in (repo root). */
19
+ cwd?: string;
20
+ /** Optional Agent.cli allowlist; avoids probing unrelated installed CLIs. */
21
+ clis?: string[];
22
+ }
23
+ /** A per-CLI model source. `list` never throws — failures resolve empty. */
24
+ export interface ModelSourceAdapter {
25
+ /** Stable id, e.g. "opencode". */
26
+ id: string;
27
+ /** The `Agent.cli` value this adapter serves, e.g. "claude code". */
28
+ cli: string;
29
+ supported: boolean;
30
+ list(opts: ListModelsOptions): Promise<ModelSourceResult>;
31
+ }
32
+ /**
33
+ * Parse `opencode models` stdout into a sorted, unique list of model ids. The
34
+ * command emits one `provider/model` id per line; anything else (headers, help
35
+ * text, ANSI noise) is dropped.
36
+ */
37
+ export declare function parseLiveModels(text: string): string[];
38
+ /** Registry keyed by `Agent.cli`. Only opencode lists models; the rest are stubs. */
39
+ export declare const MODEL_SOURCES: Record<string, ModelSourceAdapter>;
40
+ /**
41
+ * Probe every registered model source, fail-soft. Never throws and never
42
+ * hangs: a bad PATH, missing binary, or timeout resolves an empty result.
43
+ * Returns results keyed by `Agent.cli` for `GET /api/models`.
44
+ */
45
+ export declare function listModelSources(opts?: ListModelsOptions): Promise<Record<string, ModelSourceResult>>;
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Per-CLI model-source adapters — feeds the Agents page model dropdown from
3
+ * what each coding agent can actually run. Today only opencode has a
4
+ * machine-readable model list (`opencode models`); the other known CLIs are
5
+ * registered as `{ supported: false }` placeholders so a future adapter is a
6
+ * one-file change.
7
+ *
8
+ * Zero runtime deps: `node:child_process` only (binary resolution reuses
9
+ * src/core/detect.ts). Everything is fail-soft: a missing binary, a hung
10
+ * probe, or unparseable output must never throw — callers get
11
+ * `{ models: [] }` and degrade to the static model list.
12
+ */
13
+ import { spawn } from "node:child_process";
14
+ import { resolveBinary, KNOWN_AGENTS } from "./detect.js";
15
+ /** Default ceiling on the `opencode models` probe, ms. A hung CLI is SIGKILLed. */
16
+ export const MODELS_TIMEOUT_MS = 5000;
17
+ /** Codex app-server has a heavier cold start than a one-shot CLI command. */
18
+ export const CODEX_MODELS_TIMEOUT_MS = 15_000;
19
+ /** Hard cap on collected stdout so a runaway provider list can't balloon memory. */
20
+ export const MODELS_MAX_BYTES = 64 * 1024;
21
+ /** Longest accepted model id — keeps the dropdown readable. */
22
+ const MODEL_ID_MAX_LEN = 120;
23
+ /**
24
+ * Parse `opencode models` stdout into a sorted, unique list of model ids. The
25
+ * command emits one `provider/model` id per line; anything else (headers, help
26
+ * text, ANSI noise) is dropped.
27
+ */
28
+ export function parseLiveModels(text) {
29
+ const seen = new Set();
30
+ for (const raw of text.split("\n")) {
31
+ const id = raw.trim();
32
+ if (!id || id.length > MODEL_ID_MAX_LEN)
33
+ continue;
34
+ if (!id.includes("/"))
35
+ continue;
36
+ seen.add(id);
37
+ }
38
+ return [...seen].sort();
39
+ }
40
+ /** Spawn `<bin> <args>` and collect stdout up to MODELS_MAX_BYTES. */
41
+ function spawnModels(bin, args, opts) {
42
+ return new Promise((resolve) => {
43
+ let proc;
44
+ try {
45
+ proc = spawn(bin, args, {
46
+ cwd: opts.cwd ?? process.cwd(),
47
+ stdio: ["ignore", "pipe", "pipe"],
48
+ });
49
+ }
50
+ catch {
51
+ resolve("");
52
+ return;
53
+ }
54
+ let out = "";
55
+ let settled = false;
56
+ const done = (text) => {
57
+ if (settled)
58
+ return;
59
+ settled = true;
60
+ resolve(text);
61
+ };
62
+ const timer = setTimeout(() => {
63
+ try {
64
+ proc.kill("SIGKILL");
65
+ }
66
+ catch {
67
+ /* already gone */
68
+ }
69
+ done("");
70
+ }, opts.timeoutMs);
71
+ proc.stdout?.on("data", (c) => {
72
+ if (out.length < MODELS_MAX_BYTES)
73
+ out += c.toString("utf8");
74
+ });
75
+ proc.on("error", () => {
76
+ clearTimeout(timer);
77
+ done("");
78
+ });
79
+ proc.on("exit", () => {
80
+ clearTimeout(timer);
81
+ done(out);
82
+ });
83
+ });
84
+ }
85
+ /** Query Codex's account-aware picker catalog through its stdio app-server. */
86
+ function listCodexModels(bin, opts) {
87
+ return new Promise((resolve) => {
88
+ let proc;
89
+ try {
90
+ proc = spawn(bin, ["app-server", "--listen", "stdio://"], {
91
+ cwd: opts.cwd ?? process.cwd(),
92
+ stdio: ["pipe", "pipe", "pipe"],
93
+ });
94
+ }
95
+ catch {
96
+ resolve([]);
97
+ return;
98
+ }
99
+ let pending = "";
100
+ let settled = false;
101
+ const done = (models) => {
102
+ if (settled)
103
+ return;
104
+ settled = true;
105
+ clearTimeout(timer);
106
+ try {
107
+ proc.kill("SIGTERM");
108
+ }
109
+ catch {
110
+ /* already exited */
111
+ }
112
+ resolve(models);
113
+ };
114
+ const timer = setTimeout(() => {
115
+ try {
116
+ proc.kill("SIGKILL");
117
+ }
118
+ catch {
119
+ /* already exited */
120
+ }
121
+ done([]);
122
+ }, CODEX_MODELS_TIMEOUT_MS);
123
+ proc.stdout?.on("data", (chunk) => {
124
+ pending += chunk.toString("utf8");
125
+ const lines = pending.split("\n");
126
+ pending = lines.pop() ?? "";
127
+ for (const line of lines) {
128
+ try {
129
+ const message = JSON.parse(line);
130
+ if (message.id !== 2 || !Array.isArray(message.result?.data))
131
+ continue;
132
+ done(message.result.data
133
+ .map((entry) => entry.model)
134
+ .filter((model) => typeof model === "string" && model.length > 0));
135
+ }
136
+ catch {
137
+ /* notifications and malformed lines are irrelevant */
138
+ }
139
+ }
140
+ });
141
+ proc.on("error", () => done([]));
142
+ proc.on("close", () => done([]));
143
+ proc.stdin?.write([
144
+ JSON.stringify({
145
+ id: 1,
146
+ method: "initialize",
147
+ params: { clientInfo: { name: "repoos", version: "0.3.0" }, capabilities: {} },
148
+ }),
149
+ JSON.stringify({
150
+ id: 2,
151
+ method: "model/list",
152
+ params: { limit: 100, includeHidden: false },
153
+ }),
154
+ "",
155
+ ].join("\n"));
156
+ });
157
+ }
158
+ /** The opencode adapter: spawns `opencode models` and parses `provider/model`. */
159
+ const opencodeAdapter = {
160
+ id: "opencode",
161
+ cli: "opencode",
162
+ supported: true,
163
+ async list(opts = {}) {
164
+ // "default" (the coding agent's own default) is always offered first.
165
+ const bin = resolveBinary("opencode", process.env.PATH ?? "");
166
+ if (!bin)
167
+ return { supported: true, models: ["default"], refreshable: true };
168
+ const args = opts.refresh ? ["models", "--refresh"] : ["models"];
169
+ const out = await spawnModels(bin, args, {
170
+ timeoutMs: MODELS_TIMEOUT_MS,
171
+ cwd: opts.cwd,
172
+ });
173
+ return { supported: true, models: ["default", ...parseLiveModels(out)], refreshable: true };
174
+ },
175
+ };
176
+ const codexAdapter = {
177
+ id: "codex",
178
+ cli: "codex",
179
+ supported: true,
180
+ async list(opts = {}) {
181
+ const bin = resolveBinary("codex", process.env.PATH ?? "");
182
+ if (!bin)
183
+ return { supported: true, models: ["default"], refreshable: true };
184
+ const models = await listCodexModels(bin, opts);
185
+ return { supported: true, models: ["default", ...new Set(models)], refreshable: true };
186
+ },
187
+ };
188
+ /**
189
+ * Copilot accepts a model with every prompt, but its CLI does not expose a
190
+ * stable machine-readable model catalog. Offer the CLI default and let the
191
+ * existing per-model compatibility probe validate any manually configured id.
192
+ */
193
+ const copilotAdapter = {
194
+ id: "copilot",
195
+ cli: "github copilot",
196
+ supported: true,
197
+ async list() {
198
+ return { supported: true, models: ["default"], refreshable: false };
199
+ },
200
+ };
201
+ /**
202
+ * Kiro adapter: parses `kiro-cli chat --list-models` plain-text output.
203
+ * The CLI emits a human-readable table; we strip ANSI codes and take the
204
+ * first whitespace-delimited token from each model row (e.g. "auto",
205
+ * "claude-sonnet-4.5"). A leading "*" marks the default model and is
206
+ * stripped before taking the token. Token counts are not reported by the
207
+ * CLI; cost tracking uses the credits footer parsed by extractUsage.
208
+ */
209
+ function parseKiroModels(text) {
210
+ const seen = new Set();
211
+ // Strip ANSI escape sequences
212
+ const clean = text.replace(/\x1b\[[^m]*m/g, "").replace(/\x1b\[[?][0-9]*[a-zA-Z]/g, "");
213
+ for (const raw of clean.split("\n")) {
214
+ const line = raw.trim().replace(/^\*\s*/, ""); // strip leading "*"
215
+ if (!line)
216
+ continue;
217
+ const token = line.split(/\s+/)[0];
218
+ // Must look like a model id: alphanumeric, hyphens, dots — no spaces
219
+ if (!token || token.length > MODEL_ID_MAX_LEN)
220
+ continue;
221
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(token))
222
+ continue;
223
+ // Skip header lines like "Available" or "models"
224
+ if (/^available$/i.test(token) || /^models$/i.test(token))
225
+ continue;
226
+ seen.add(token);
227
+ }
228
+ return [...seen];
229
+ }
230
+ const kiroAdapter = {
231
+ id: "kiro",
232
+ cli: "kiro",
233
+ supported: true,
234
+ async list(opts = {}) {
235
+ const bin = resolveBinary("kiro-cli", process.env.PATH ?? "");
236
+ if (!bin)
237
+ return { supported: true, models: ["default"], refreshable: true };
238
+ const out = await spawnModels(bin, ["chat", "--list-models"], {
239
+ timeoutMs: MODELS_TIMEOUT_MS,
240
+ cwd: opts.cwd,
241
+ });
242
+ const models = parseKiroModels(out);
243
+ return { supported: true, models: ["default", ...models], refreshable: true };
244
+ },
245
+ };
246
+ /** Placeholder adapter for CLIs with no machine-readable model list. */
247
+ function unsupported(id, cli) {
248
+ return {
249
+ id,
250
+ cli,
251
+ supported: false,
252
+ async list() {
253
+ return { supported: false, models: [], refreshable: false };
254
+ },
255
+ };
256
+ }
257
+ /** Registry keyed by `Agent.cli`. Only opencode lists models; the rest are stubs. */
258
+ export const MODEL_SOURCES = {
259
+ opencode: opencodeAdapter,
260
+ codex: codexAdapter,
261
+ "github copilot": copilotAdapter,
262
+ kiro: kiroAdapter,
263
+ };
264
+ for (const known of KNOWN_AGENTS) {
265
+ if (known.id === "opencode" ||
266
+ known.id === "codex" ||
267
+ known.id === "copilot" ||
268
+ known.id === "kiro")
269
+ continue;
270
+ MODEL_SOURCES[known.name] = unsupported(known.id, known.name);
271
+ }
272
+ /**
273
+ * Probe every registered model source, fail-soft. Never throws and never
274
+ * hangs: a bad PATH, missing binary, or timeout resolves an empty result.
275
+ * Returns results keyed by `Agent.cli` for `GET /api/models`.
276
+ */
277
+ export async function listModelSources(opts = {}) {
278
+ const out = {};
279
+ const selected = opts.clis?.length
280
+ ? Object.values(MODEL_SOURCES).filter((source) => opts.clis.includes(source.cli))
281
+ : Object.values(MODEL_SOURCES);
282
+ await Promise.all(selected.map(async (src) => {
283
+ try {
284
+ out[src.cli] = await src.list(opts);
285
+ }
286
+ catch {
287
+ out[src.cli] = { supported: src.supported, models: [], refreshable: src.supported };
288
+ }
289
+ }));
290
+ return out;
291
+ }
@@ -0,0 +1,4 @@
1
+ /** True if a TCP connection to `127.0.0.1:port` succeeds within `timeoutMs`. */
2
+ export declare function portListening(port: number, timeoutMs?: number): Promise<boolean>;
3
+ /** Extract the port from a `http://localhost:PORT` style origin, or null if unparseable. */
4
+ export declare function originPort(service: string): number | null;
@@ -0,0 +1,20 @@
1
+ /** Tiny TCP reachability probe — used to answer "is anything listening on this local port?" */
2
+ import { connect } from "node:net";
3
+ /** True if a TCP connection to `127.0.0.1:port` succeeds within `timeoutMs`. */
4
+ export function portListening(port, timeoutMs = 800) {
5
+ return new Promise((resolve) => {
6
+ const socket = connect({ host: "127.0.0.1", port });
7
+ const finish = (value) => {
8
+ socket.destroy();
9
+ resolve(value);
10
+ };
11
+ socket.once("connect", () => finish(true));
12
+ socket.once("error", () => finish(false));
13
+ socket.setTimeout(timeoutMs, () => finish(false));
14
+ });
15
+ }
16
+ /** Extract the port from a `http://localhost:PORT` style origin, or null if unparseable. */
17
+ export function originPort(service) {
18
+ const m = service.match(/:(\d+)(?:\/|$)/);
19
+ return m ? Number(m[1]) : null;
20
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * DeepInfra provider adapter (0313). DeepInfra's "featured" endpoint is a
3
+ * public, unauthenticated JSON list that already curates a small set of
4
+ * attractive models with a human-written `description` — exactly the "worth
5
+ * trying" + "one-line reason" shape the playground sidebar needs, with no
6
+ * curation logic of our own required.
7
+ */
8
+ import type { PlaygroundModel, PlaygroundProviderAdapter } from "./types.js";
9
+ interface DeepInfraModel {
10
+ model_name: string;
11
+ type: string;
12
+ description?: string;
13
+ pricing?: {
14
+ type?: string;
15
+ cents_per_input_token?: number;
16
+ cents_per_output_token?: number;
17
+ };
18
+ max_tokens?: number;
19
+ }
20
+ /** Parse DeepInfra's featured-models response into playground models. Exported for tests. */
21
+ export declare function parseDeepInfraFeatured(models: DeepInfraModel[]): PlaygroundModel[];
22
+ export declare const deepinfraProvider: PlaygroundProviderAdapter;
23
+ export {};
@@ -0,0 +1,44 @@
1
+ import { oneLineReason, parseJsonResponse } from "./types.js";
2
+ const FEATURED_URL = "https://api.deepinfra.com/models/featured";
3
+ const FETCH_TIMEOUT_MS = 8000;
4
+ const MAX_MODELS = 12;
5
+ /** DeepInfra prices in cents-per-token; $/1M tokens = cents-per-token * 10,000. */
6
+ function dollarsPerMillion(centsPerToken) {
7
+ return typeof centsPerToken === "number" && Number.isFinite(centsPerToken) && centsPerToken >= 0
8
+ ? centsPerToken * 10_000
9
+ : null;
10
+ }
11
+ /** A malformed/negative `max_tokens` isn't a usable context window. */
12
+ function positiveContextWindow(maxTokens) {
13
+ return typeof maxTokens === "number" && Number.isFinite(maxTokens) && maxTokens > 0
14
+ ? maxTokens
15
+ : null;
16
+ }
17
+ /** Parse DeepInfra's featured-models response into playground models. Exported for tests. */
18
+ export function parseDeepInfraFeatured(models) {
19
+ return models
20
+ .filter((m) => m.type === "text-generation" && m.pricing?.type === "tokens")
21
+ .slice(0, MAX_MODELS)
22
+ .map((m) => ({
23
+ id: m.model_name,
24
+ runId: `deepinfra/${m.model_name}`,
25
+ name: m.model_name,
26
+ reason: oneLineReason(m.description, "Featured on DeepInfra."),
27
+ inputPricePerM: dollarsPerMillion(m.pricing?.cents_per_input_token),
28
+ outputPricePerM: dollarsPerMillion(m.pricing?.cents_per_output_token),
29
+ contextWindow: positiveContextWindow(m.max_tokens),
30
+ }));
31
+ }
32
+ export const deepinfraProvider = {
33
+ id: "deepinfra",
34
+ label: "DeepInfra",
35
+ async fetchModels() {
36
+ const res = await fetch(FEATURED_URL, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
37
+ if (!res.ok)
38
+ throw new Error(`DeepInfra API returned ${res.status}`);
39
+ const data = await parseJsonResponse(res, "DeepInfra");
40
+ if (!Array.isArray(data))
41
+ throw new Error("DeepInfra API returned an unexpected shape");
42
+ return parseDeepInfraFeatured(data);
43
+ },
44
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Registry + cache for the Model Playground's provider adapters (0313).
3
+ *
4
+ * Cache/rate-limit-aware fetching: each provider's live result is cached for
5
+ * CACHE_TTL_MS so a busy Agents page doesn't hammer DeepInfra/OpenRouter on
6
+ * every load; concurrent callers during a cold/expired cache share one
7
+ * in-flight fetch instead of firing duplicate requests. A transient fetch
8
+ * failure falls back to the last good snapshot when one exists, so a single
9
+ * provider outage never blanks the whole sidebar — only a cold-cache failure
10
+ * surfaces as an error to the client, and it never takes the other provider
11
+ * down with it (each adapter is isolated in its own try/catch).
12
+ */
13
+ import type { PlaygroundProviderAdapter, PlaygroundProviderGroup } from "./types.js";
14
+ export * from "./types.js";
15
+ export { parseDeepInfraFeatured } from "./deepinfra.js";
16
+ export { curateOpenRouterModels } from "./openrouter.js";
17
+ export declare const PLAYGROUND_PROVIDERS: PlaygroundProviderAdapter[];
18
+ export declare const CACHE_TTL_MS: number;
19
+ /** Test-only hook to reset module-level cache state between test cases. */
20
+ export declare function resetPlaygroundProviderCache(): void;
21
+ /** Fetch (or serve cached) model catalogs from every registered provider. Never throws. */
22
+ export declare function listPlaygroundModels(opts?: {
23
+ refresh?: boolean;
24
+ }): Promise<PlaygroundProviderGroup[]>;
@@ -0,0 +1,59 @@
1
+ import { deepinfraProvider } from "./deepinfra.js";
2
+ import { openrouterProvider } from "./openrouter.js";
3
+ export * from "./types.js";
4
+ export { parseDeepInfraFeatured } from "./deepinfra.js";
5
+ export { curateOpenRouterModels } from "./openrouter.js";
6
+ export const PLAYGROUND_PROVIDERS = [
7
+ deepinfraProvider,
8
+ openrouterProvider,
9
+ ];
10
+ export const CACHE_TTL_MS = 15 * 60 * 1000;
11
+ const cache = new Map();
12
+ const inFlight = new Map();
13
+ /** Test-only hook to reset module-level cache state between test cases. */
14
+ export function resetPlaygroundProviderCache() {
15
+ cache.clear();
16
+ inFlight.clear();
17
+ }
18
+ async function loadProvider(adapter, refresh) {
19
+ const cached = cache.get(adapter.id);
20
+ if (!refresh && cached && Date.now() - cached.at < CACHE_TTL_MS)
21
+ return cached.group;
22
+ const existing = inFlight.get(adapter.id);
23
+ if (existing)
24
+ return existing;
25
+ const promise = (async () => {
26
+ try {
27
+ const models = await adapter.fetchModels();
28
+ const group = {
29
+ id: adapter.id,
30
+ label: adapter.label,
31
+ models,
32
+ fetchedAt: new Date().toISOString(),
33
+ };
34
+ cache.set(adapter.id, { at: Date.now(), group });
35
+ return group;
36
+ }
37
+ catch (err) {
38
+ if (cached)
39
+ return cached.group;
40
+ const reason = err instanceof Error ? err.message : String(err);
41
+ return {
42
+ id: adapter.id,
43
+ label: adapter.label,
44
+ models: [],
45
+ error: reason,
46
+ fetchedAt: new Date().toISOString(),
47
+ };
48
+ }
49
+ finally {
50
+ inFlight.delete(adapter.id);
51
+ }
52
+ })();
53
+ inFlight.set(adapter.id, promise);
54
+ return promise;
55
+ }
56
+ /** Fetch (or serve cached) model catalogs from every registered provider. Never throws. */
57
+ export async function listPlaygroundModels(opts = {}) {
58
+ return Promise.all(PLAYGROUND_PROVIDERS.map((p) => loadProvider(p, opts.refresh ?? false)));
59
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * OpenRouter provider adapter (0313). Unlike DeepInfra, the public
3
+ * `GET /api/v1/models` endpoint lists hundreds of models with no "featured"
4
+ * signal, so curation happens here: drop free/non-text/low-context entries,
5
+ * then keep the single best (largest context) model per top-level namespace
6
+ * (e.g. "qwen/…", "deepseek/…") so the sidebar shows variety instead of a
7
+ * wall of one vendor's SKUs. Never hardcode specific model ids — the live
8
+ * catalog changes constantly and a stale id would just silently vanish.
9
+ */
10
+ import type { PlaygroundModel, PlaygroundProviderAdapter } from "./types.js";
11
+ interface OpenRouterModel {
12
+ id: string;
13
+ name?: string;
14
+ description?: string;
15
+ context_length?: number;
16
+ architecture?: {
17
+ input_modalities?: string[];
18
+ output_modalities?: string[];
19
+ };
20
+ pricing?: {
21
+ prompt?: string;
22
+ completion?: string;
23
+ };
24
+ }
25
+ /** Curate + parse OpenRouter's models response into playground models. Exported for tests. */
26
+ export declare function curateOpenRouterModels(models: OpenRouterModel[]): PlaygroundModel[];
27
+ export declare const openrouterProvider: PlaygroundProviderAdapter;
28
+ export {};