@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,117 @@
1
+ /**
2
+ * Minimal Hetzner Cloud API client for the Remote Validation Runner (#RVR).
3
+ *
4
+ * Only the four calls the runner needs: create a server from a snapshot, poll
5
+ * its status, delete it, and list servers by label (leak reconciliation). Uses
6
+ * the platform's native `fetch` — no runtime dependency, same as ntfy.ts.
7
+ *
8
+ * The API token comes from `HETZNER_API_TOKEN` (env only, never a git-tracked
9
+ * config key). Every method throws `HetznerApiError` on a non-2xx response so
10
+ * the runner can classify the failure as transient infra trouble.
11
+ */
12
+ const API_BASE = "https://api.hetzner.cloud/v1";
13
+ export class HetznerApiError extends Error {
14
+ status;
15
+ constructor(message, status) {
16
+ super(message);
17
+ this.status = status;
18
+ this.name = "HetznerApiError";
19
+ }
20
+ }
21
+ function toServer(raw) {
22
+ return {
23
+ id: raw.id,
24
+ name: raw.name,
25
+ status: raw.status,
26
+ ipv4: raw.public_net?.ipv4?.ip ?? null,
27
+ created: raw.created,
28
+ labels: raw.labels ?? {},
29
+ };
30
+ }
31
+ export function createHetznerClient(token) {
32
+ const request = async (path, init) => {
33
+ if (!token)
34
+ throw new HetznerApiError("HETZNER_API_TOKEN is not set");
35
+ let resp;
36
+ try {
37
+ resp = await fetch(`${API_BASE}${path}`, {
38
+ ...init,
39
+ headers: {
40
+ Authorization: `Bearer ${token}`,
41
+ "Content-Type": "application/json",
42
+ ...init?.headers,
43
+ },
44
+ });
45
+ }
46
+ catch (e) {
47
+ throw new HetznerApiError(`network error calling Hetzner API: ${e.message}`);
48
+ }
49
+ if (resp.status === 204)
50
+ return {};
51
+ let body;
52
+ try {
53
+ body = await resp.json();
54
+ }
55
+ catch {
56
+ body = {};
57
+ }
58
+ if (!resp.ok) {
59
+ const err = body?.error?.message;
60
+ throw new HetznerApiError(`Hetzner API ${init?.method ?? "GET"} ${path} → ${resp.status}${err ? `: ${err}` : ""}`, resp.status);
61
+ }
62
+ return body;
63
+ };
64
+ return {
65
+ async createServer(opts) {
66
+ const body = await request("/servers", {
67
+ method: "POST",
68
+ body: JSON.stringify({
69
+ name: opts.name,
70
+ server_type: opts.serverType,
71
+ location: opts.location,
72
+ // The API distinguishes an image *ID* (int) from an image *name/slug*
73
+ // (string). A snapshot has a numeric ID, so a bare-number string like
74
+ // "123456789" must go up as a number or the API returns "image not
75
+ // found". A real slug ("ubuntu-24.04") stays a string.
76
+ image: /^\d+$/.test(opts.image) ? Number(opts.image) : opts.image,
77
+ ssh_keys: opts.sshKeyNames,
78
+ labels: opts.labels ?? {},
79
+ start_after_create: true,
80
+ ...(opts.userData ? { user_data: opts.userData } : {}),
81
+ }),
82
+ });
83
+ const raw = body.server;
84
+ if (!raw)
85
+ throw new HetznerApiError("Hetzner create-server response had no server object");
86
+ return toServer(raw);
87
+ },
88
+ async getServer(id) {
89
+ try {
90
+ const body = await request(`/servers/${id}`);
91
+ const raw = body.server;
92
+ return raw ? toServer(raw) : null;
93
+ }
94
+ catch (e) {
95
+ if (e instanceof HetznerApiError && e.status === 404)
96
+ return null;
97
+ throw e;
98
+ }
99
+ },
100
+ async deleteServer(id) {
101
+ try {
102
+ await request(`/servers/${id}`, { method: "DELETE" });
103
+ }
104
+ catch (e) {
105
+ // A server that is already gone is a success for our purposes.
106
+ if (e instanceof HetznerApiError && e.status === 404)
107
+ return;
108
+ throw e;
109
+ }
110
+ },
111
+ async listServers(labelSelector) {
112
+ const body = await request(`/servers?label_selector=${encodeURIComponent(labelSelector)}`);
113
+ const raw = body.servers ?? [];
114
+ return raw.map(toServer);
115
+ },
116
+ };
117
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Render the per-instance app icon as a PNG.
3
+ * @param repoName instance name used to derive color/lettering
4
+ * @param size icon dimensions (square)
5
+ * @param color optional hex color (e.g. the repo's chosen color) that
6
+ * overrides the name-derived hue.
7
+ */
8
+ export declare function renderInstanceIcon(repoName: string, size: number, color?: string): Buffer;
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Per-instance PWA icons, generated at request time with no runtime deps.
3
+ *
4
+ * Every RepoOS install is a different repo, and installs need to be
5
+ * distinguishable on a home screen. The icon is derived deterministically
6
+ * from the repo name: a rounded square in an instance hue with the RepoOS
7
+ * diamond mark in the same hue. Pure zlib (node:zlib) PNG encoding — no
8
+ * image libraries.
9
+ *
10
+ * When a `color` (hex) is supplied (e.g. the repo's chosen color from the
11
+ * color picker), it overrides the name-derived hue so the installed-app icon
12
+ * matches the tab favicon for the currently-selected repo color.
13
+ */
14
+ import { deflateSync } from "node:zlib";
15
+ /** Stable 0-359 hue from the repo name. */
16
+ function hueFor(name) {
17
+ let h = 2167;
18
+ for (let i = 0; i < name.length; i++)
19
+ h = (h * 31 + name.charCodeAt(i)) >>> 0;
20
+ return h % 360;
21
+ }
22
+ function hslToRgb(h, s, l) {
23
+ const c = (1 - Math.abs(2 * l - 1)) * s;
24
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
25
+ const m = l - c / 2;
26
+ let rgb;
27
+ if (h < 60)
28
+ rgb = [c, x, 0];
29
+ else if (h < 120)
30
+ rgb = [x, c, 0];
31
+ else if (h < 180)
32
+ rgb = [0, c, x];
33
+ else if (h < 240)
34
+ rgb = [0, x, c];
35
+ else if (h < 300)
36
+ rgb = [x, 0, c];
37
+ else
38
+ rgb = [c, 0, x];
39
+ return [(rgb[0] + m) * 255, (rgb[1] + m) * 255, (rgb[2] + m) * 255];
40
+ }
41
+ function hexToRgb(h) {
42
+ const m = /^#([0-9a-f]{6})$/i.exec(h.trim());
43
+ if (!m)
44
+ return null;
45
+ const n = parseInt(m[1], 16);
46
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
47
+ }
48
+ /**
49
+ * Derive the icon's color scheme from an explicit hex color. The given color
50
+ * becomes the glowing diamond mark; the rounded-square background is a
51
+ * darkened version of the same hue so the mark stays legible against it.
52
+ * Returns null when the hex is invalid.
53
+ */
54
+ function schemeForHex(hex) {
55
+ const rgb = hexToRgb(hex);
56
+ if (!rgb)
57
+ return null;
58
+ const [r, g, b] = rgb;
59
+ const scale = (v, f) => Math.min(255, Math.round(v * f));
60
+ return {
61
+ glow: [r, g, b],
62
+ bgTop: [scale(r, 0.18), scale(g, 0.18), scale(b, 0.22)],
63
+ bgBottom: [scale(r, 0.36), scale(g, 0.36), scale(b, 0.42)],
64
+ };
65
+ }
66
+ /** True if (x,y) is inside the convex polygon pts (screen coords). */
67
+ function inPolygon(x, y, pts) {
68
+ let inside = false;
69
+ for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {
70
+ const [xi, yi] = pts[i];
71
+ const [xj, yj] = pts[j];
72
+ if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)
73
+ inside = !inside;
74
+ }
75
+ return inside;
76
+ }
77
+ const CRC_TABLE = (() => {
78
+ const t = new Uint32Array(256);
79
+ for (let n = 0; n < 256; n++) {
80
+ let c = n;
81
+ for (let k = 0; k < 8; k++)
82
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
83
+ t[n] = c >>> 0;
84
+ }
85
+ return t;
86
+ })();
87
+ function crc32(buf) {
88
+ let c = 0xffffffff;
89
+ for (let i = 0; i < buf.length; i++)
90
+ c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);
91
+ return (c ^ 0xffffffff) >>> 0;
92
+ }
93
+ function chunk(type, data) {
94
+ const len = Buffer.alloc(4);
95
+ len.writeUInt32BE(data.length);
96
+ const typeBuf = Buffer.from(type, "ascii");
97
+ const crcBuf = Buffer.alloc(4);
98
+ crcBuf.writeUInt32BE(crc32(Buffer.concat([typeBuf, data])));
99
+ return Buffer.concat([len, typeBuf, data, crcBuf]);
100
+ }
101
+ /** Encode an RGBA pixel buffer as a PNG. */
102
+ function encodePng(width, height, rgba) {
103
+ const ihdr = Buffer.alloc(13);
104
+ ihdr.writeUInt32BE(width, 0);
105
+ ihdr.writeUInt32BE(height, 4);
106
+ ihdr[8] = 8; // bit depth
107
+ ihdr[9] = 6; // color type RGBA
108
+ // compression(10), filter(11), interlace(12) already 0
109
+ const stride = width * 4;
110
+ const raw = Buffer.alloc((stride + 1) * height);
111
+ for (let y = 0; y < height; y++) {
112
+ raw[y * (stride + 1)] = 0; // filter: none
113
+ rgba.subarray(y * stride, (y + 1) * stride).forEach((v, i) => {
114
+ raw[y * (stride + 1) + 1 + i] = v;
115
+ });
116
+ }
117
+ const idat = deflateSync(raw, { level: 9 });
118
+ return Buffer.concat([
119
+ Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),
120
+ chunk("IHDR", ihdr),
121
+ chunk("IDAT", idat),
122
+ chunk("IEND", Buffer.alloc(0)),
123
+ ]);
124
+ }
125
+ /**
126
+ * Render the per-instance app icon as a PNG.
127
+ * @param repoName instance name used to derive color/lettering
128
+ * @param size icon dimensions (square)
129
+ * @param color optional hex color (e.g. the repo's chosen color) that
130
+ * overrides the name-derived hue.
131
+ */
132
+ export function renderInstanceIcon(repoName, size, color) {
133
+ const chosen = color ? schemeForHex(color) : null;
134
+ const hue = chosen ? null : hueFor(repoName);
135
+ const pad = size * 0.07;
136
+ const r = size * 0.22; // rounded-corner radius
137
+ const glow = chosen ? chosen.glow : hslToRgb(hue, 0.7, 0.5);
138
+ const bgTop = chosen
139
+ ? chosen.bgTop
140
+ : hslToRgb(hue, 0.55, 0.14);
141
+ const bgBottom = chosen
142
+ ? chosen.bgBottom
143
+ : hslToRgb(hue, 0.6, 0.26);
144
+ const inner = [7, 10, 18]; // --bg-2
145
+ // Diamond mark, same geometry as the favicon (a square rotated 45°).
146
+ const cx = size / 2;
147
+ const d = size * 0.36; // half-diagonal-ish scale
148
+ const outer = [
149
+ [cx, cx - d],
150
+ [cx + d * 0.87, cx - d * 0.35],
151
+ [cx + d * 0.87, cx + d * 0.35],
152
+ [cx, cx + d],
153
+ [cx - d * 0.87, cx + d * 0.35],
154
+ [cx - d * 0.87, cx - d * 0.35],
155
+ ];
156
+ const innerPts = outer.map(([x, y]) => {
157
+ const vx = x - cx;
158
+ const vy = y - cx;
159
+ const s = 0.62;
160
+ return [cx + vx * s, cx + vy * s];
161
+ });
162
+ const px = new Uint8Array(size * size * 4);
163
+ const inRoundRect = (x, y) => {
164
+ if (x < pad || x >= size - pad || y < pad || y >= size - pad)
165
+ return false;
166
+ const nx = Math.min(Math.max(x, pad + r), size - pad - r);
167
+ const ny = Math.min(Math.max(y, pad + r), size - pad - r);
168
+ const dx = x - nx;
169
+ const dy = y - ny;
170
+ return dx * dx + dy * dy <= r * r;
171
+ };
172
+ for (let y = 0; y < size; y++) {
173
+ for (let x = 0; x < size; x++) {
174
+ const o = (y * size + x) * 4;
175
+ const a = y / size;
176
+ if (!inRoundRect(x + 0.5, y + 0.5))
177
+ continue;
178
+ let c;
179
+ const inOuter = inPolygon(x + 0.5, y + 0.5, outer);
180
+ if (inOuter)
181
+ c = inPolygon(x + 0.5, y + 0.5, innerPts) ? [inner[0], inner[1], inner[2]] : glow;
182
+ else {
183
+ const t = bgTop[0] + (bgBottom[0] - bgTop[0]) * a;
184
+ const u = bgTop[1] + (bgBottom[1] - bgTop[1]) * a;
185
+ const v = bgTop[2] + (bgBottom[2] - bgTop[2]) * a;
186
+ c = [t, u, v];
187
+ }
188
+ px[o] = Math.round(c[0]);
189
+ px[o + 1] = Math.round(c[1]);
190
+ px[o + 2] = Math.round(c[2]);
191
+ px[o + 3] = 255;
192
+ }
193
+ }
194
+ return encodePng(size, size, px);
195
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Serialized, durable close-out coordination. Each repository maintains a FIFO queue of
3
+ * integration jobs, one per task. Jobs are persisted atomically under `.repoos/` so the
4
+ * server survives restarts and never duplicates a merge.
5
+ *
6
+ * Phases: queued -> syncing -> validating -> publishing -> done or failed.
7
+ * Failures retain phase and recovery action; retry resumes safely from where it was interrupted.
8
+ */
9
+ import type { Task } from "../core/types.js";
10
+ export type JobPhase = "queued" | "syncing" | "validating" | "publishing" | "cleanup" | "done" | "failed";
11
+ export interface IntegrationJob {
12
+ /** Unique ID: task ID */
13
+ taskId: string;
14
+ /** Feature branch to integrate (the task's `branch` field). */
15
+ branch?: string;
16
+ /** Current phase */
17
+ phase: JobPhase;
18
+ /** The phase the job was in when it failed (only set when `phase` is "failed"). */
19
+ failedPhase?: JobPhase;
20
+ /** When the job was enqueued (ISO string) */
21
+ enqueuedAt: string;
22
+ /** When job processing started (ISO string, null if not yet started) */
23
+ startedAt: string | null;
24
+ /** Main checkout SHA at validation start (null if not yet validated) */
25
+ baseMainSha: string | null;
26
+ /** Feature branch SHA being merged */
27
+ branchSha: string | null;
28
+ /** Candidate merge result SHA (null until candidate is built) */
29
+ candidateSha: string | null;
30
+ /** Failure reason or recovery action (when phase is "failed") */
31
+ reason?: string;
32
+ /** Queue position (0-indexed; set by coordinator) */
33
+ queuePosition?: number;
34
+ /**
35
+ * Consecutive publish-time "main advanced" resyncs for this job (#0386).
36
+ * Capped at MAX_PUBLISH_DRIFT_RETRIES in integration-orchestrator.ts, same
37
+ * shape as the other close-out retry caps — bounds a job that keeps losing
38
+ * the race to publish on a busy board instead of resyncing forever.
39
+ */
40
+ publishDriftCount?: number;
41
+ }
42
+ export interface JobCoordinator {
43
+ /**
44
+ * Enqueue a close-out job for the task. Returns the job if enqueued/already queued,
45
+ * or null if the task doesn't have a branch. Idempotent per task ID.
46
+ */
47
+ enqueue(task: Task): IntegrationJob | null;
48
+ /**
49
+ * Get the current job for a task ID, or null if no job exists.
50
+ */
51
+ getJob(taskId: string): IntegrationJob | null;
52
+ /** Get all jobs in FIFO order. */
53
+ allJobs(): IntegrationJob[];
54
+ /**
55
+ * Peek at the next job to process (at front of queue), or null if queue is empty.
56
+ * Does not dequeue or change phase.
57
+ */
58
+ peekNext(): IntegrationJob | null;
59
+ /**
60
+ * Update a job's phase and state. Persists atomically. Called by the close-out
61
+ * orchestrator as each phase completes.
62
+ */
63
+ updateJob(taskId: string, update: Partial<IntegrationJob>): IntegrationJob | null;
64
+ /** Remove a job from the queue (after successful cleanup or explicit cancellation). */
65
+ removeJob(taskId: string): void;
66
+ /**
67
+ * Recover a job from an interrupted phase. Called on server startup to find
68
+ * jobs that were interrupted and need resumption or cleanup.
69
+ */
70
+ findInterruptedJobs(): IntegrationJob[];
71
+ }
72
+ /**
73
+ * Create a job coordinator for a repository root.
74
+ */
75
+ export declare function createJobCoordinator(root: string): JobCoordinator;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Serialized, durable close-out coordination. Each repository maintains a FIFO queue of
3
+ * integration jobs, one per task. Jobs are persisted atomically under `.repoos/` so the
4
+ * server survives restarts and never duplicates a merge.
5
+ *
6
+ * Phases: queued -> syncing -> validating -> publishing -> done or failed.
7
+ * Failures retain phase and recovery action; retry resumes safely from where it was interrupted.
8
+ */
9
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, unlinkSync, } from "node:fs";
10
+ import { join } from "node:path";
11
+ const JOBS_DIR = ".repoos/integration-jobs";
12
+ const VERSION = 1;
13
+ function jobPath(root, taskId) {
14
+ return join(root, JOBS_DIR, `${taskId}.json`);
15
+ }
16
+ function ensureJobsDir(root) {
17
+ const dir = join(root, JOBS_DIR);
18
+ mkdirSync(dir, { recursive: true });
19
+ }
20
+ function readJob(root, taskId) {
21
+ const path = jobPath(root, taskId);
22
+ if (!existsSync(path))
23
+ return null;
24
+ try {
25
+ const stored = JSON.parse(readFileSync(path, "utf8"));
26
+ if (stored.version !== VERSION)
27
+ return null;
28
+ return {
29
+ taskId: stored.taskId,
30
+ branch: stored.branch,
31
+ phase: stored.phase,
32
+ failedPhase: stored.failedPhase,
33
+ enqueuedAt: stored.enqueuedAt,
34
+ startedAt: stored.startedAt,
35
+ baseMainSha: stored.baseMainSha,
36
+ branchSha: stored.branchSha,
37
+ candidateSha: stored.candidateSha,
38
+ reason: stored.reason,
39
+ publishDriftCount: stored.publishDriftCount,
40
+ };
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function writeJob(root, job) {
47
+ ensureJobsDir(root);
48
+ const path = jobPath(root, job.taskId);
49
+ const stored = { ...job, version: VERSION };
50
+ writeFileSync(path, JSON.stringify(stored, null, 2));
51
+ }
52
+ /**
53
+ * Create a job coordinator for a repository root.
54
+ */
55
+ export function createJobCoordinator(root) {
56
+ return {
57
+ enqueue(task) {
58
+ if (!task.branch)
59
+ return null;
60
+ const existing = readJob(root, task.id);
61
+ // A job that already completed or is in flight is left alone; a FAILED
62
+ // job is stale (the earlier attempt ended without publishing), so it is
63
+ // re-enqueued as a fresh queued job — this is how a "Move to done" retry
64
+ // unblocks a task stuck behind an old failure.
65
+ //
66
+ // A DONE job is stale too, in exactly one case: the task itself is no
67
+ // longer `done` (#0195, 2026-08-15 — nothing blocks a task leaving
68
+ // `done` via a plain PATCH, and once it does, the old job record never
69
+ // gets cleared. Without this check, `enqueue()` hands back the same
70
+ // finished job forever and "Move to done" silently does nothing —
71
+ // `ok: true` with a job whose phase is already terminal). The task's
72
+ // own current status is the authority here, same principle as #0210:
73
+ // a job record must never outrank observable task state.
74
+ const staleDoneJob = existing?.phase === "done" && task.status !== "done";
75
+ if (existing && existing.phase !== "failed" && !staleDoneJob)
76
+ return existing;
77
+ const job = {
78
+ taskId: task.id,
79
+ branch: task.branch,
80
+ phase: "queued",
81
+ enqueuedAt: new Date().toISOString(),
82
+ startedAt: null,
83
+ baseMainSha: null,
84
+ branchSha: null,
85
+ candidateSha: null,
86
+ };
87
+ writeJob(root, job);
88
+ return job;
89
+ },
90
+ getJob(taskId) {
91
+ return readJob(root, taskId);
92
+ },
93
+ allJobs() {
94
+ ensureJobsDir(root);
95
+ const dir = join(root, JOBS_DIR);
96
+ if (!existsSync(dir))
97
+ return [];
98
+ const jobs = [];
99
+ for (const file of readdirSync(dir)) {
100
+ if (!file.endsWith(".json"))
101
+ continue;
102
+ const taskId = file.slice(0, -5);
103
+ const job = readJob(root, taskId);
104
+ if (job)
105
+ jobs.push(job);
106
+ }
107
+ return jobs.sort((a, b) => a.enqueuedAt.localeCompare(b.enqueuedAt));
108
+ },
109
+ peekNext() {
110
+ const all = this.allJobs();
111
+ const notDone = all.filter((j) => j.phase !== "done" && j.phase !== "failed");
112
+ return notDone.length > 0 ? notDone[0] : null;
113
+ },
114
+ updateJob(taskId, update) {
115
+ const existing = readJob(root, taskId);
116
+ if (!existing)
117
+ return null;
118
+ const updated = { ...existing, ...update, taskId: existing.taskId };
119
+ writeJob(root, updated);
120
+ return updated;
121
+ },
122
+ removeJob(taskId) {
123
+ const path = jobPath(root, taskId);
124
+ try {
125
+ if (existsSync(path)) {
126
+ unlinkSync(path);
127
+ }
128
+ }
129
+ catch {
130
+ /* best-effort cleanup */
131
+ }
132
+ },
133
+ findInterruptedJobs() {
134
+ const jobs = this.allJobs();
135
+ return jobs.filter((j) => {
136
+ if (j.phase === "done" || j.phase === "failed")
137
+ return false;
138
+ if (j.phase === "queued" && !j.startedAt)
139
+ return false;
140
+ return true;
141
+ });
142
+ },
143
+ };
144
+ }