@akira-tl/forgerelay 0.1.0

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 (373) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE +22 -0
  3. package/NOTICE.md +19 -0
  4. package/README.md +270 -0
  5. package/dist/apply-patch.js +402 -0
  6. package/dist/artifact-error.js +8 -0
  7. package/dist/artifact-tools.js +377 -0
  8. package/dist/cli.js +597 -0
  9. package/dist/config.js +224 -0
  10. package/dist/db/client.js +29 -0
  11. package/dist/db/migrations.js +189 -0
  12. package/dist/db/schema.js +85 -0
  13. package/dist/git-worktrees.js +255 -0
  14. package/dist/git.js +41 -0
  15. package/dist/incoming-artifacts.js +378 -0
  16. package/dist/local-agent-adapters.js +653 -0
  17. package/dist/local-agent-availability.js +119 -0
  18. package/dist/local-agent-path.js +25 -0
  19. package/dist/local-agent-profiles.js +136 -0
  20. package/dist/local-agent-runtime.js +48 -0
  21. package/dist/local-agent-store.js +145 -0
  22. package/dist/local-agent-targets.js +80 -0
  23. package/dist/logger.js +69 -0
  24. package/dist/mcp/server-instructions.js +78 -0
  25. package/dist/mcp-sessions.js +56 -0
  26. package/dist/oauth-provider.js +237 -0
  27. package/dist/oauth-store.js +138 -0
  28. package/dist/pi-tools.js +81 -0
  29. package/dist/process-platform.js +49 -0
  30. package/dist/process-sessions.js +337 -0
  31. package/dist/request-meta.js +9 -0
  32. package/dist/review-checkpoints.js +219 -0
  33. package/dist/roots.js +37 -0
  34. package/dist/server-shutdown.js +12 -0
  35. package/dist/server.js +1596 -0
  36. package/dist/skills.js +89 -0
  37. package/dist/ui/.vite/manifest.json +2521 -0
  38. package/dist/ui/assets/abap-CLvhMVsD.js +1 -0
  39. package/dist/ui/assets/actionscript-3--17pq3dv.js +1 -0
  40. package/dist/ui/assets/ada-C5qYipkI.js +1 -0
  41. package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
  42. package/dist/ui/assets/angular-html-CovppXt5.js +1 -0
  43. package/dist/ui/assets/angular-ts-0Y9l6YXu.js +1 -0
  44. package/dist/ui/assets/apache-U0d_L8uA.js +1 -0
  45. package/dist/ui/assets/apex-CGTLDQj6.js +1 -0
  46. package/dist/ui/assets/apl-BmBhiklA.js +1 -0
  47. package/dist/ui/assets/applescript-CCn79oCD.js +1 -0
  48. package/dist/ui/assets/ara-4CJ0cIlV.js +1 -0
  49. package/dist/ui/assets/asciidoc-DE70LPWp.js +1 -0
  50. package/dist/ui/assets/asm-Cmm7eHzH.js +1 -0
  51. package/dist/ui/assets/astro-BAmqcqyV.js +1 -0
  52. package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
  53. package/dist/ui/assets/awk-BWXHIvNe.js +1 -0
  54. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
  55. package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
  56. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  57. package/dist/ui/assets/ballerina-B7ZEbQpA.js +1 -0
  58. package/dist/ui/assets/bat-Bo4NYOV-.js +1 -0
  59. package/dist/ui/assets/beancount-D-usSTwE.js +1 -0
  60. package/dist/ui/assets/berry-DKpUyyne.js +1 -0
  61. package/dist/ui/assets/bibtex-Ci_nEsc7.js +1 -0
  62. package/dist/ui/assets/bicep-CUHmPFLl.js +1 -0
  63. package/dist/ui/assets/bird2-C2hNVINV.js +1 -0
  64. package/dist/ui/assets/blade-BjFcmRJo.js +1 -0
  65. package/dist/ui/assets/bsl-BkkzgIyY.js +1 -0
  66. package/dist/ui/assets/c-CaOJn4x0.js +1 -0
  67. package/dist/ui/assets/c3-CnJL0r0V.js +1 -0
  68. package/dist/ui/assets/cadence-CQ2zXKGN.js +1 -0
  69. package/dist/ui/assets/cairo-DLTphjLi.js +1 -0
  70. package/dist/ui/assets/catppuccin-frappe-3VR1Za6u.js +1 -0
  71. package/dist/ui/assets/catppuccin-latte-DwIHMF0Q.js +1 -0
  72. package/dist/ui/assets/catppuccin-macchiato-DYnBP6_5.js +1 -0
  73. package/dist/ui/assets/catppuccin-mocha-DYhrFGRu.js +1 -0
  74. package/dist/ui/assets/clarity-SemFz856.js +1 -0
  75. package/dist/ui/assets/clojure-DqKBuwfJ.js +1 -0
  76. package/dist/ui/assets/cmake-Bj61d0ZC.js +1 -0
  77. package/dist/ui/assets/cobol-DR4zWFMt.js +1 -0
  78. package/dist/ui/assets/codeowners-C8r90Shi.js +1 -0
  79. package/dist/ui/assets/codeql-oeQT6MSM.js +1 -0
  80. package/dist/ui/assets/coffee-ReGSThmM.js +1 -0
  81. package/dist/ui/assets/common-lisp-Cv5bFMCO.js +1 -0
  82. package/dist/ui/assets/coq-BrsZFFmf.js +1 -0
  83. package/dist/ui/assets/cpp-CnlQh6MO.js +1 -0
  84. package/dist/ui/assets/crystal-BrpPbH1U.js +1 -0
  85. package/dist/ui/assets/csharp-Ct8U2NOr.js +1 -0
  86. package/dist/ui/assets/css-DRBEvyPU.js +1 -0
  87. package/dist/ui/assets/csv-Dx-8-gkx.js +1 -0
  88. package/dist/ui/assets/cue-CE9AQfxI.js +1 -0
  89. package/dist/ui/assets/cypher-ClKdZ_lG.js +1 -0
  90. package/dist/ui/assets/d-qD-0Kul2.js +1 -0
  91. package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
  92. package/dist/ui/assets/dart-DkHntEIa.js +1 -0
  93. package/dist/ui/assets/dax-BkyTk9wS.js +1 -0
  94. package/dist/ui/assets/desktop-Dlh5hvp9.js +1 -0
  95. package/dist/ui/assets/diff-woXpYk--.js +1 -0
  96. package/dist/ui/assets/docker-IyjqRm3v.js +1 -0
  97. package/dist/ui/assets/dotenv-_5a1GRtc.js +1 -0
  98. package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
  99. package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
  100. package/dist/ui/assets/dream-maker-DW3nJb8Q.js +1 -0
  101. package/dist/ui/assets/edge-cfwpdvl9.js +1 -0
  102. package/dist/ui/assets/elixir-7owrJxb6.js +1 -0
  103. package/dist/ui/assets/elm-udiOjODk.js +1 -0
  104. package/dist/ui/assets/emacs-lisp-C9PiwqqW.js +1 -0
  105. package/dist/ui/assets/erb-8ctXHMkS.js +1 -0
  106. package/dist/ui/assets/erlang-Cphh6RMH.js +1 -0
  107. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
  108. package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
  109. package/dist/ui/assets/fennel-DQxkIbk2.js +1 -0
  110. package/dist/ui/assets/fish-BJitypiv.js +1 -0
  111. package/dist/ui/assets/fluent-C03EYrpw.js +1 -0
  112. package/dist/ui/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  113. package/dist/ui/assets/fortran-free-form-CYNrtFtB.js +1 -0
  114. package/dist/ui/assets/fsharp-D13ZGOAj.js +1 -0
  115. package/dist/ui/assets/gdresource-C0sCabJj.js +1 -0
  116. package/dist/ui/assets/gdscript-Cp2uCuqX.js +1 -0
  117. package/dist/ui/assets/gdshader-CBce3t8t.js +1 -0
  118. package/dist/ui/assets/genie-CV2tkWYe.js +1 -0
  119. package/dist/ui/assets/gherkin-DExj1W_8.js +1 -0
  120. package/dist/ui/assets/git-commit-BSykSTBG.js +1 -0
  121. package/dist/ui/assets/git-rebase-P0V_qK1w.js +1 -0
  122. package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
  123. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
  124. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  125. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  126. package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
  127. package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
  128. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  129. package/dist/ui/assets/gleam-CSRkHgEL.js +1 -0
  130. package/dist/ui/assets/glimmer-js-CZ14ED7U.js +1 -0
  131. package/dist/ui/assets/glimmer-ts-DtBSFP-o.js +1 -0
  132. package/dist/ui/assets/glsl-BX2BkZJK.js +1 -0
  133. package/dist/ui/assets/gn-ilITqXS6.js +1 -0
  134. package/dist/ui/assets/gnuplot-7GGW24-e.js +1 -0
  135. package/dist/ui/assets/go-BJwz_mda.js +1 -0
  136. package/dist/ui/assets/graphql-Dj_cPv4w.js +1 -0
  137. package/dist/ui/assets/groovy-CacY0gHj.js +1 -0
  138. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  139. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  140. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  141. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  142. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  143. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  144. package/dist/ui/assets/hack-DGRkd8xn.js +1 -0
  145. package/dist/ui/assets/haml-BAPSvujW.js +1 -0
  146. package/dist/ui/assets/handlebars-PYksdULG.js +1 -0
  147. package/dist/ui/assets/haskell-D8IpX4py.js +1 -0
  148. package/dist/ui/assets/haxe-OTjmBuCE.js +1 -0
  149. package/dist/ui/assets/hcl-Dh228itO.js +1 -0
  150. package/dist/ui/assets/heavy-payload-BjE0LSUi.js +4 -0
  151. package/dist/ui/assets/hjson-CxZEssPk.js +1 -0
  152. package/dist/ui/assets/hlsl-Cvrh5tZx.js +1 -0
  153. package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
  154. package/dist/ui/assets/horizon-bright-Br1oVSNq.js +1 -0
  155. package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
  156. package/dist/ui/assets/html-DloAPGZ1.js +1 -0
  157. package/dist/ui/assets/html-derivative-C6q86ZrS.js +1 -0
  158. package/dist/ui/assets/http-fPvYDvHA.js +1 -0
  159. package/dist/ui/assets/hurl-Dbir4WvE.js +1 -0
  160. package/dist/ui/assets/hxml-B0Qn7Nwc.js +1 -0
  161. package/dist/ui/assets/hy-CZbG8q4J.js +1 -0
  162. package/dist/ui/assets/imba-DsUTQ-LC.js +1 -0
  163. package/dist/ui/assets/ini-B5eOa1yu.js +1 -0
  164. package/dist/ui/assets/java-DvkqXg3z.js +1 -0
  165. package/dist/ui/assets/javascript-TONTV6Ty.js +1 -0
  166. package/dist/ui/assets/jinja-OM1F5Gct.js +1 -0
  167. package/dist/ui/assets/jison-CBttugts.js +1 -0
  168. package/dist/ui/assets/json-Db5oY-7J.js +1 -0
  169. package/dist/ui/assets/json5-BR5RXkoi.js +1 -0
  170. package/dist/ui/assets/jsonc-CYpm1nAK.js +1 -0
  171. package/dist/ui/assets/jsonl-CmCQp5Yx.js +1 -0
  172. package/dist/ui/assets/jsonnet-CJTPZ8u_.js +1 -0
  173. package/dist/ui/assets/jssm-DXw9l8Rf.js +1 -0
  174. package/dist/ui/assets/jsx-DKeJCgsc.js +1 -0
  175. package/dist/ui/assets/julia-NlIPhXaL.js +1 -0
  176. package/dist/ui/assets/just-BXBJB-mX.js +1 -0
  177. package/dist/ui/assets/kanagawa-dragon-CXtmUGW6.js +1 -0
  178. package/dist/ui/assets/kanagawa-lotus-BN08jTvb.js +1 -0
  179. package/dist/ui/assets/kanagawa-wave-CTweb8Dz.js +1 -0
  180. package/dist/ui/assets/kdl-CsD5j6eV.js +1 -0
  181. package/dist/ui/assets/kotlin-DhhofPvG.js +1 -0
  182. package/dist/ui/assets/kusto-BUv0MjJC.js +1 -0
  183. package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
  184. package/dist/ui/assets/latex-CGK-6yDy.js +1 -0
  185. package/dist/ui/assets/lean-CewbzKMR.js +1 -0
  186. package/dist/ui/assets/less-DVTAwKKz.js +1 -0
  187. package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
  188. package/dist/ui/assets/liquid-D7waQ0MY.js +1 -0
  189. package/dist/ui/assets/llvm-Cm23YOpf.js +1 -0
  190. package/dist/ui/assets/log-BNLmms1o.js +1 -0
  191. package/dist/ui/assets/logo-Cluzi2Zq.js +1 -0
  192. package/dist/ui/assets/lua-C_kkt4h1.js +1 -0
  193. package/dist/ui/assets/luau-CNKltnaQ.js +1 -0
  194. package/dist/ui/assets/make-Dixweg8N.js +1 -0
  195. package/dist/ui/assets/markdown-BYOwaDjH.js +1 -0
  196. package/dist/ui/assets/marko-BokXuCts.js +1 -0
  197. package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
  198. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
  199. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
  200. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  201. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  202. package/dist/ui/assets/matlab-D7qyCx1q.js +1 -0
  203. package/dist/ui/assets/mdc-Bk0nnUJA.js +1 -0
  204. package/dist/ui/assets/mdx-DQZ5AkYe.js +1 -0
  205. package/dist/ui/assets/mermaid-Bk4SNUv9.js +1 -0
  206. package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
  207. package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
  208. package/dist/ui/assets/mipsasm-BMqwQI7S.js +1 -0
  209. package/dist/ui/assets/mojo-BgCJLMeH.js +1 -0
  210. package/dist/ui/assets/monokai-CdkpiU2Y.js +1 -0
  211. package/dist/ui/assets/moonbit-CaWjb8XO.js +1 -0
  212. package/dist/ui/assets/move-B1IS1UjX.js +1 -0
  213. package/dist/ui/assets/narrat-_X_XdTYD.js +1 -0
  214. package/dist/ui/assets/nextflow-Bbiyy34d.js +1 -0
  215. package/dist/ui/assets/nextflow-groovy-Dc_ddanL.js +1 -0
  216. package/dist/ui/assets/nginx-jM6NF9TV.js +1 -0
  217. package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
  218. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
  219. package/dist/ui/assets/nim-hYsL-WKb.js +1 -0
  220. package/dist/ui/assets/nix-IvuFDN5E.js +1 -0
  221. package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
  222. package/dist/ui/assets/nushell-DcLAeLz5.js +1 -0
  223. package/dist/ui/assets/objective-c-D1A_Heim.js +1 -0
  224. package/dist/ui/assets/objective-cpp-BsSzOQcm.js +1 -0
  225. package/dist/ui/assets/ocaml-O90oeIOV.js +1 -0
  226. package/dist/ui/assets/odin-B1RWQWA5.js +1 -0
  227. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
  228. package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
  229. package/dist/ui/assets/openscad-BUDT5pXO.js +1 -0
  230. package/dist/ui/assets/pascal-4ZHwLPI5.js +1 -0
  231. package/dist/ui/assets/perl-DBI_cUHJ.js +1 -0
  232. package/dist/ui/assets/php-BX_aQhFl.js +1 -0
  233. package/dist/ui/assets/pierre-dark-sU4Zdns8.js +1 -0
  234. package/dist/ui/assets/pierre-dark-soft-HXgun5vs.js +1 -0
  235. package/dist/ui/assets/pierre-light-DWBk51d8.js +1 -0
  236. package/dist/ui/assets/pierre-light-soft-CodEzPxf.js +1 -0
  237. package/dist/ui/assets/pkl-ot-7Btpt.js +1 -0
  238. package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
  239. package/dist/ui/assets/plsql-DGHpHOYJ.js +1 -0
  240. package/dist/ui/assets/po-BiJDBrnU.js +1 -0
  241. package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
  242. package/dist/ui/assets/polar-C7UOKdEL.js +1 -0
  243. package/dist/ui/assets/postcss-BXeXVLqQ.js +1 -0
  244. package/dist/ui/assets/powerquery-DNMTfnFr.js +1 -0
  245. package/dist/ui/assets/powershell-DshXNtvi.js +1 -0
  246. package/dist/ui/assets/prisma-BsRQq5mF.js +1 -0
  247. package/dist/ui/assets/prolog-iXnhIJG7.js +1 -0
  248. package/dist/ui/assets/proto-DB4EqR-F.js +1 -0
  249. package/dist/ui/assets/pug-DwFAYy1e.js +1 -0
  250. package/dist/ui/assets/puppet-CDv2pdJW.js +1 -0
  251. package/dist/ui/assets/purescript-9MfHhQsQ.js +1 -0
  252. package/dist/ui/assets/python-gzcpVVnB.js +1 -0
  253. package/dist/ui/assets/qml-eLSwQUKt.js +1 -0
  254. package/dist/ui/assets/qmldir-DCQb3MpD.js +1 -0
  255. package/dist/ui/assets/qss-Fe1Jh2GI.js +1 -0
  256. package/dist/ui/assets/r-BMnQsMLf.js +1 -0
  257. package/dist/ui/assets/racket-DcIDlBhZ.js +1 -0
  258. package/dist/ui/assets/raku-B3gFvitq.js +1 -0
  259. package/dist/ui/assets/razor-CgciiMyw.js +1 -0
  260. package/dist/ui/assets/red-CJ3rzSJv.js +1 -0
  261. package/dist/ui/assets/reg-CRGYupPL.js +1 -0
  262. package/dist/ui/assets/regexp-ZrURNrn5.js +1 -0
  263. package/dist/ui/assets/rel-BtDbiS_P.js +1 -0
  264. package/dist/ui/assets/review-payload-HGkpJjjm.js +1 -0
  265. package/dist/ui/assets/riscv-Ckw8ddFX.js +1 -0
  266. package/dist/ui/assets/ron-VUp2lXgN.js +1 -0
  267. package/dist/ui/assets/rose-pine-BthvhNj6.js +1 -0
  268. package/dist/ui/assets/rose-pine-dawn-Dg85fqjY.js +1 -0
  269. package/dist/ui/assets/rose-pine-moon-hon4tzzS.js +1 -0
  270. package/dist/ui/assets/rosmsg-CAekHB0j.js +1 -0
  271. package/dist/ui/assets/rst-EoAOr3M6.js +1 -0
  272. package/dist/ui/assets/ruby-Dqx5_Rqw.js +1 -0
  273. package/dist/ui/assets/rust-Cfkwpbl8.js +1 -0
  274. package/dist/ui/assets/sas-Bf6xPLSX.js +1 -0
  275. package/dist/ui/assets/sass-DXrisJhu.js +1 -0
  276. package/dist/ui/assets/scala-DKOlJaKm.js +1 -0
  277. package/dist/ui/assets/scheme-DQCgrYNe.js +1 -0
  278. package/dist/ui/assets/scrollbar-DX4Ujotb.js +287 -0
  279. package/dist/ui/assets/scss-DDpW3yTd.js +1 -0
  280. package/dist/ui/assets/sdbl-bTVj8UrX.js +1 -0
  281. package/dist/ui/assets/shaderlab-TOUzSsQk.js +1 -0
  282. package/dist/ui/assets/shellscript-DayAQ-W9.js +1 -0
  283. package/dist/ui/assets/shellsession-jPr_lSnA.js +1 -0
  284. package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
  285. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
  286. package/dist/ui/assets/smalltalk-B16xEiuN.js +1 -0
  287. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
  288. package/dist/ui/assets/solarized-dark-DV17i1UV.js +1 -0
  289. package/dist/ui/assets/solarized-light-DSh2HLQt.js +1 -0
  290. package/dist/ui/assets/solidity-CKzVLygQ.js +1 -0
  291. package/dist/ui/assets/soy-X9adks8G.js +1 -0
  292. package/dist/ui/assets/sparql-D_iOobhT.js +1 -0
  293. package/dist/ui/assets/splunk-BC2Px7Mm.js +1 -0
  294. package/dist/ui/assets/sql-Bmt09AIR.js +1 -0
  295. package/dist/ui/assets/ssh-config-BgfXC-Er.js +1 -0
  296. package/dist/ui/assets/stata-DVkNpH8r.js +1 -0
  297. package/dist/ui/assets/stylus-B6D30XZt.js +1 -0
  298. package/dist/ui/assets/surrealql-eEXzMb8j.js +1 -0
  299. package/dist/ui/assets/svelte-CFoBxZF3.js +1 -0
  300. package/dist/ui/assets/swift-DonLKvLd.js +1 -0
  301. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
  302. package/dist/ui/assets/system-verilog-DJ5XKQeo.js +1 -0
  303. package/dist/ui/assets/systemd-BxMlprV5.js +1 -0
  304. package/dist/ui/assets/talonscript-CohzipZa.js +1 -0
  305. package/dist/ui/assets/tasl-DMoTqEGO.js +1 -0
  306. package/dist/ui/assets/tcl-CZd0xW_V.js +1 -0
  307. package/dist/ui/assets/templ-Da_324JF.js +1 -0
  308. package/dist/ui/assets/terraform-DswuEJGm.js +1 -0
  309. package/dist/ui/assets/tex-HAzlmKJ0.js +1 -0
  310. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
  311. package/dist/ui/assets/toml-CcmNWLt0.js +1 -0
  312. package/dist/ui/assets/ts-tags-7iLrNH8p.js +1 -0
  313. package/dist/ui/assets/tsv-sltzmVWM.js +1 -0
  314. package/dist/ui/assets/tsx-gZaXf8PJ.js +1 -0
  315. package/dist/ui/assets/turtle-ByJddavk.js +1 -0
  316. package/dist/ui/assets/twig-CLpQ7p1N.js +1 -0
  317. package/dist/ui/assets/typescript-B2WWCRI2.js +1 -0
  318. package/dist/ui/assets/typespec-B88KGewJ.js +1 -0
  319. package/dist/ui/assets/typst-DI99ib-x.js +1 -0
  320. package/dist/ui/assets/v-DETTlOr0.js +1 -0
  321. package/dist/ui/assets/vala-zf12oZj6.js +1 -0
  322. package/dist/ui/assets/vb-Djn5o6TS.js +1 -0
  323. package/dist/ui/assets/verilog-CiiDBU1e.js +1 -0
  324. package/dist/ui/assets/vesper-D5bVUKB1.js +1 -0
  325. package/dist/ui/assets/vhdl-BroJfC0k.js +1 -0
  326. package/dist/ui/assets/viml-DvXPmvsu.js +1 -0
  327. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
  328. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
  329. package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
  330. package/dist/ui/assets/vue-No_8Jygd.js +1 -0
  331. package/dist/ui/assets/vue-html-kHJg98Kk.js +1 -0
  332. package/dist/ui/assets/vue-vine-Df4cEYaN.js +1 -0
  333. package/dist/ui/assets/vyper-CgoNMtux.js +1 -0
  334. package/dist/ui/assets/wasm-BnjxR4X6.js +1 -0
  335. package/dist/ui/assets/wasm-ByWQv1Qj.js +1 -0
  336. package/dist/ui/assets/wenyan-C8pVoKbM.js +1 -0
  337. package/dist/ui/assets/wgsl-BsKzXJz4.js +1 -0
  338. package/dist/ui/assets/wikitext-ClFFjSW2.js +1 -0
  339. package/dist/ui/assets/wit-DdvCle-K.js +1 -0
  340. package/dist/ui/assets/wolfram-DLL8P-h_.js +1 -0
  341. package/dist/ui/assets/workspace-app-C_wsC6VL.js +117 -0
  342. package/dist/ui/assets/workspace-app-DHvE2ojW.css +1 -0
  343. package/dist/ui/assets/xml-DUZ05dpG.js +1 -0
  344. package/dist/ui/assets/xsl-Bwp3w2OF.js +1 -0
  345. package/dist/ui/assets/yaml-IA_-TEM1.js +1 -0
  346. package/dist/ui/assets/zenscript-BnlCZFoB.js +1 -0
  347. package/dist/ui/assets/zig-CMLA9XwU.js +1 -0
  348. package/dist/ui/workspace-app.html +15 -0
  349. package/dist/user-config.js +97 -0
  350. package/dist/workspace-store.js +162 -0
  351. package/dist/workspaces.js +528 -0
  352. package/docs/agent-profile-schema.md +119 -0
  353. package/docs/artifact-exchange.md +63 -0
  354. package/docs/chatgpt-coding-workflow.md +183 -0
  355. package/docs/configuration.md +197 -0
  356. package/docs/gotchas.md +243 -0
  357. package/docs/roadmap.md +195 -0
  358. package/docs/security.md +142 -0
  359. package/docs/setup.md +132 -0
  360. package/docs/versioning.md +189 -0
  361. package/examples/agents/claude-implementer.md +30 -0
  362. package/examples/agents/codex-explorer.md +27 -0
  363. package/examples/agents/codex-qa-tester.md +29 -0
  364. package/examples/agents/codex-worker.md +25 -0
  365. package/examples/agents/copilot-reviewer.md +25 -0
  366. package/examples/agents/cursor-agent-worker.md +26 -0
  367. package/examples/agents/opencode-explorer.md +27 -0
  368. package/examples/agents/pi-reviewer.md +27 -0
  369. package/package.json +102 -0
  370. package/scripts/dev-server.mjs +120 -0
  371. package/scripts/fix-node-pty-permissions.mjs +22 -0
  372. package/scripts/release-version.mjs +207 -0
  373. package/skills/subagent-delegation/SKILL.md +132 -0
@@ -0,0 +1,402 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { access, lstat, mkdir, readFile, realpath, rename, rm, stat, writeFile } from "node:fs/promises";
4
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
5
+ import { TextDecoder } from "node:util";
6
+ import { createTwoFilesPatch, FILE_HEADERS_ONLY } from "diff";
7
+ function patchError(message) {
8
+ return new Error(`Invalid patch: ${message}`);
9
+ }
10
+ export function parsePatch(patch) {
11
+ const lines = patchLines(patch);
12
+ if (lines.shift()?.trim() !== "*** Begin Patch") {
13
+ throw patchError("missing *** Begin Patch marker");
14
+ }
15
+ if (lines.pop()?.trim() !== "*** End Patch") {
16
+ throw patchError("missing *** End Patch marker");
17
+ }
18
+ const actions = [];
19
+ let index = 0;
20
+ while (index < lines.length) {
21
+ const header = lines[index++].trim();
22
+ if (header === "")
23
+ continue;
24
+ if (header.startsWith("*** Environment ID: ")) {
25
+ if (!header.slice("*** Environment ID: ".length).trim()) {
26
+ throw patchError("environment id cannot be empty");
27
+ }
28
+ continue;
29
+ }
30
+ if (header.startsWith("*** Add File: ")) {
31
+ const path = header.slice("*** Add File: ".length);
32
+ const content = [];
33
+ while (index < lines.length && !isTopLevelHeader(lines[index])) {
34
+ const line = lines[index++];
35
+ if (!line.startsWith("+")) {
36
+ throw patchError(`added file line must start with +: ${line}`);
37
+ }
38
+ content.push(line.slice(1));
39
+ }
40
+ if (content.length === 0)
41
+ throw patchError(`add file for ${path} has no content`);
42
+ actions.push({
43
+ kind: "add",
44
+ path,
45
+ content: `${content.join("\n")}\n`,
46
+ });
47
+ continue;
48
+ }
49
+ if (header.startsWith("*** Delete File: ")) {
50
+ actions.push({ kind: "delete", path: header.slice("*** Delete File: ".length) });
51
+ continue;
52
+ }
53
+ if (header.startsWith("*** Update File: ")) {
54
+ const path = header.slice("*** Update File: ".length);
55
+ let moveTo;
56
+ const hunks = [];
57
+ if (lines[index]?.trim().startsWith("*** Move to: ")) {
58
+ moveTo = lines[index++].trim().slice("*** Move to: ".length);
59
+ }
60
+ let current;
61
+ const finishCurrent = () => {
62
+ if (!current)
63
+ return;
64
+ if (current.lines.length === 0)
65
+ throw patchError(`empty update hunk for ${path}`);
66
+ hunks.push(current);
67
+ current = undefined;
68
+ };
69
+ while (index < lines.length) {
70
+ const line = lines[index];
71
+ const trimmed = line.trim();
72
+ if (!current && trimmed === "") {
73
+ index++;
74
+ continue;
75
+ }
76
+ if (trimmed === "*** End of File") {
77
+ if (!current)
78
+ throw patchError(`end-of-file marker without update hunk for ${path}`);
79
+ current.endOfFile = true;
80
+ index++;
81
+ continue;
82
+ }
83
+ if ((!current || !line.startsWith(" ")) && isTopLevelHeader(line))
84
+ break;
85
+ if (trimmed.startsWith("@@") && !line.startsWith(" ")) {
86
+ finishCurrent();
87
+ const changeContext = trimmed.slice(2).trim();
88
+ current = { lines: [], changeContext: changeContext || undefined };
89
+ index++;
90
+ continue;
91
+ }
92
+ current ??= { lines: [] };
93
+ index++;
94
+ if (line.startsWith(" "))
95
+ current.lines.push({ kind: "context", text: line.slice(1) });
96
+ else if (line.startsWith("+"))
97
+ current.lines.push({ kind: "add", text: line.slice(1) });
98
+ else if (line.startsWith("-"))
99
+ current.lines.push({ kind: "remove", text: line.slice(1) });
100
+ else if (line === "\")
101
+ continue;
102
+ else
103
+ throw patchError(`hunk line must start with space, +, or -: ${line}`);
104
+ }
105
+ finishCurrent();
106
+ if (hunks.length === 0 && !moveTo) {
107
+ throw patchError(`update for ${path} has no hunks or move destination`);
108
+ }
109
+ actions.push({ kind: "update", path, moveTo, hunks });
110
+ continue;
111
+ }
112
+ throw patchError(`unknown action header: ${header}`);
113
+ }
114
+ if (actions.length === 0)
115
+ throw patchError("contains no file actions");
116
+ return actions;
117
+ }
118
+ function patchLines(patch) {
119
+ let lines = patch.replace(/\r\n/g, "\n").trim().split("\n");
120
+ const first = lines[0]?.trim();
121
+ const last = lines.at(-1)?.trim();
122
+ if ((first === "<<EOF" || first === "<<'EOF'" || first === '<<"EOF"') &&
123
+ last?.endsWith("EOF") &&
124
+ lines.length >= 4) {
125
+ lines = lines.slice(1, -1);
126
+ }
127
+ return lines;
128
+ }
129
+ function isTopLevelHeader(line) {
130
+ const trimmed = line.trim();
131
+ return (trimmed.startsWith("*** Add File: ") ||
132
+ trimmed.startsWith("*** Delete File: ") ||
133
+ trimmed.startsWith("*** Update File: ") ||
134
+ trimmed.startsWith("*** Environment ID: "));
135
+ }
136
+ function isInside(root, path) {
137
+ const rel = relative(root, path);
138
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
139
+ }
140
+ async function resolveConfinedPath(root, input) {
141
+ if (!input || input.includes("\0") || isAbsolute(input)) {
142
+ throw patchError(`path must be relative to the workspace: ${input}`);
143
+ }
144
+ const rootPath = await realpath(root);
145
+ const target = resolve(rootPath, input);
146
+ if (!isInside(rootPath, target)) {
147
+ throw patchError(`path escapes the workspace: ${input}`);
148
+ }
149
+ let existing = target;
150
+ while (true) {
151
+ try {
152
+ const resolved = await realpath(existing);
153
+ if (!isInside(rootPath, resolved)) {
154
+ throw patchError(`path resolves outside the workspace: ${input}`);
155
+ }
156
+ break;
157
+ }
158
+ catch (error) {
159
+ const code = error.code;
160
+ if (code !== "ENOENT")
161
+ throw error;
162
+ const parent = dirname(existing);
163
+ if (parent === existing)
164
+ throw error;
165
+ existing = parent;
166
+ }
167
+ }
168
+ return target;
169
+ }
170
+ function splitFile(content) {
171
+ const eol = content.includes("\r\n") ? "\r\n" : "\n";
172
+ const normalized = content.replace(/\r\n/g, "\n");
173
+ const finalNewline = normalized.endsWith("\n");
174
+ const lines = normalized.split("\n");
175
+ if (finalNewline)
176
+ lines.pop();
177
+ return { lines, eol, finalNewline };
178
+ }
179
+ function findSequence(haystack, needle, from, endOfFile = false) {
180
+ if (needle.length === 0)
181
+ return from;
182
+ const matchAt = (index, normalize) => needle.every((line, offset) => normalize(haystack[index + offset] ?? "") === normalize(line));
183
+ for (const normalize of [
184
+ (value) => value,
185
+ (value) => value.trimEnd(),
186
+ (value) => value.trim(),
187
+ ]) {
188
+ const start = endOfFile ? haystack.length - needle.length : from;
189
+ const end = haystack.length - needle.length;
190
+ for (let index = start; index <= end; index += 1) {
191
+ if (index >= from && matchAt(index, normalize))
192
+ return index;
193
+ }
194
+ }
195
+ return -1;
196
+ }
197
+ function applyHunks(path, content, hunks) {
198
+ const file = splitFile(content);
199
+ const lines = [...file.lines];
200
+ let cursor = 0;
201
+ for (const hunk of hunks) {
202
+ if (hunk.changeContext) {
203
+ const contextIndex = findSequence(lines, [hunk.changeContext], cursor);
204
+ if (contextIndex < 0) {
205
+ throw patchError(`could not find hunk context in ${path}: ${hunk.changeContext}`);
206
+ }
207
+ cursor = contextIndex + 1;
208
+ }
209
+ const oldLines = hunk.lines
210
+ .filter((line) => line.kind !== "add")
211
+ .map((line) => line.text);
212
+ const newLines = hunk.lines
213
+ .filter((line) => line.kind !== "remove")
214
+ .map((line) => line.text);
215
+ const index = hunk.endOfFile && oldLines.length === 0
216
+ ? lines.length
217
+ : findSequence(lines, oldLines, cursor, hunk.endOfFile);
218
+ if (index < 0) {
219
+ const preview = oldLines.slice(0, 3).join("\n");
220
+ throw patchError(`could not find hunk context in ${path}: ${preview}`);
221
+ }
222
+ lines.splice(index, oldLines.length, ...newLines);
223
+ cursor = index + newLines.length;
224
+ }
225
+ const normalized = `${lines.join("\n")}\n`;
226
+ return file.eol === "\r\n" ? normalized.replace(/\n/g, "\r\n") : normalized;
227
+ }
228
+ async function fileExists(path) {
229
+ try {
230
+ await access(path, constants.F_OK);
231
+ return true;
232
+ }
233
+ catch {
234
+ return false;
235
+ }
236
+ }
237
+ export async function replaceFile(temporary, destination, destinationExists, platform = process.platform) {
238
+ if (platform !== "win32" || !destinationExists) {
239
+ await rename(temporary, destination);
240
+ return;
241
+ }
242
+ const backup = `${temporary}.original`;
243
+ await rename(destination, backup);
244
+ try {
245
+ await rename(temporary, destination);
246
+ }
247
+ catch (error) {
248
+ await rename(backup, destination);
249
+ throw error;
250
+ }
251
+ await rm(backup, { force: true });
252
+ }
253
+ export async function isSamePatchFile(source, destination, readIdentity = lstat) {
254
+ if (source === destination)
255
+ return true;
256
+ if (source.toLowerCase() !== destination.toLowerCase())
257
+ return false;
258
+ try {
259
+ const [sourceIdentity, destinationIdentity] = await Promise.all([
260
+ readIdentity(source),
261
+ readIdentity(destination),
262
+ ]);
263
+ return sourceIdentity.dev === destinationIdentity.dev && sourceIdentity.ino === destinationIdentity.ino;
264
+ }
265
+ catch (error) {
266
+ const code = error.code;
267
+ if (code === "ENOENT" || code === "ENOTDIR")
268
+ return false;
269
+ throw error;
270
+ }
271
+ }
272
+ export async function applyPatch(root, patch) {
273
+ const actions = parsePatch(patch);
274
+ const results = [];
275
+ const patches = [];
276
+ const staged = new Map();
277
+ const readStagedOptional = async (absolute, displayPath) => {
278
+ if (staged.has(absolute))
279
+ return staged.get(absolute) ?? null;
280
+ const file = await readOptionalTextFile(absolute, displayPath);
281
+ staged.set(absolute, file);
282
+ return file;
283
+ };
284
+ const readStagedRequired = async (absolute, displayPath) => {
285
+ const file = await readStagedOptional(absolute, displayPath);
286
+ if (!file)
287
+ throw patchError(`file does not exist: ${displayPath}`);
288
+ return file;
289
+ };
290
+ for (const action of actions) {
291
+ if (action.kind === "add") {
292
+ const absolute = await resolveConfinedPath(root, action.path);
293
+ const original = await readStagedOptional(absolute, action.path);
294
+ staged.set(absolute, { content: action.content, mode: original?.mode });
295
+ patches.push(unifiedFilePatch(action.path, action.path, original?.content ?? null, action.content));
296
+ results.push({ path: action.path, operation: original ? "update" : "add" });
297
+ continue;
298
+ }
299
+ const absolute = await resolveConfinedPath(root, action.path);
300
+ const file = await readStagedRequired(absolute, action.path);
301
+ if (action.kind === "delete") {
302
+ staged.set(absolute, null);
303
+ patches.push(unifiedFilePatch(action.path, action.path, file.content, null));
304
+ results.push({ path: action.path, operation: "delete" });
305
+ continue;
306
+ }
307
+ const updated = applyHunks(action.path, file.content, action.hunks);
308
+ if (action.moveTo) {
309
+ const destination = await resolveConfinedPath(root, action.moveTo);
310
+ const samePatchFile = await isSamePatchFile(absolute, destination);
311
+ if (!samePatchFile)
312
+ await readStagedOptional(destination, action.moveTo);
313
+ if (samePatchFile)
314
+ staged.delete(absolute);
315
+ staged.set(destination, { content: updated, mode: file.mode });
316
+ if (!samePatchFile)
317
+ staged.set(absolute, null);
318
+ patches.push(unifiedFilePatch(action.path, action.moveTo, file.content, updated));
319
+ results.push({ path: action.moveTo, previousPath: action.path, operation: "move" });
320
+ }
321
+ else {
322
+ staged.set(absolute, { content: updated, mode: file.mode });
323
+ patches.push(unifiedFilePatch(action.path, action.path, file.content, updated));
324
+ results.push({ path: action.path, operation: "update" });
325
+ }
326
+ }
327
+ for (const [absolute, file] of staged) {
328
+ if (file)
329
+ await writeTextFile(absolute, file.content, file.mode);
330
+ }
331
+ for (const [absolute, file] of staged) {
332
+ if (!file)
333
+ await rm(absolute, { force: true });
334
+ }
335
+ const unifiedPatch = patches.filter(Boolean).join("\n");
336
+ const stats = countPatchStats(unifiedPatch);
337
+ return { files: results, patch: unifiedPatch, ...stats };
338
+ }
339
+ async function readOptionalTextFile(absolute, displayPath) {
340
+ if (!(await fileExists(absolute)))
341
+ return null;
342
+ const metadata = await stat(absolute);
343
+ if (!metadata.isFile())
344
+ throw patchError(`path is not a regular file: ${displayPath}`);
345
+ return { content: await readUtf8Text(absolute, displayPath), mode: metadata.mode };
346
+ }
347
+ async function readUtf8Text(absolute, displayPath) {
348
+ const bytes = await readFile(absolute);
349
+ let content;
350
+ try {
351
+ content = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
352
+ }
353
+ catch {
354
+ throw patchError(`file is not valid UTF-8 text: ${displayPath}`);
355
+ }
356
+ if (content.includes("\0"))
357
+ throw patchError(`file appears to be binary: ${displayPath}`);
358
+ return content;
359
+ }
360
+ async function writeTextFile(destination, content, mode) {
361
+ await mkdir(dirname(destination), { recursive: true });
362
+ const temporary = `${destination}.forgerelay-patch-${process.pid}-${randomUUID()}`;
363
+ try {
364
+ await writeFile(temporary, content, mode === undefined ? undefined : { mode });
365
+ await replaceFile(temporary, destination, await fileExists(destination));
366
+ }
367
+ catch (error) {
368
+ await rm(temporary, { force: true });
369
+ throw error;
370
+ }
371
+ }
372
+ function unifiedFilePatch(oldPath, newPath, oldContent, newContent) {
373
+ const oldFileName = oldContent === null ? "/dev/null" : `a/${oldPath}`;
374
+ const newFileName = newContent === null ? "/dev/null" : `b/${newPath}`;
375
+ const body = createTwoFilesPatch(oldFileName, newFileName, oldContent ?? "", newContent ?? "", "", "", { context: 3, headerOptions: FILE_HEADERS_ONLY });
376
+ return [
377
+ `diff --git a/${oldPath} b/${newPath}`,
378
+ oldContent === null ? "new file mode 100644" : undefined,
379
+ newContent === null ? "deleted file mode 100644" : undefined,
380
+ stripFinalNewline(body),
381
+ ]
382
+ .filter((line) => line !== undefined)
383
+ .join("\n");
384
+ }
385
+ function stripFinalNewline(value) {
386
+ if (value.endsWith("\r\n"))
387
+ return value.slice(0, -2);
388
+ if (value.endsWith("\n"))
389
+ return value.slice(0, -1);
390
+ return value;
391
+ }
392
+ function countPatchStats(patch) {
393
+ let additions = 0;
394
+ let removals = 0;
395
+ for (const line of patch.split("\n")) {
396
+ if (line.startsWith("+") && !line.startsWith("+++"))
397
+ additions += 1;
398
+ if (line.startsWith("-") && !line.startsWith("---"))
399
+ removals += 1;
400
+ }
401
+ return { additions, removals };
402
+ }
@@ -0,0 +1,8 @@
1
+ export class ArtifactError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.name = "ArtifactError";
6
+ this.code = code;
7
+ }
8
+ }