ompgui 0.4.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 (668) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +59 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/images-manifest.json +68 -0
  6. package/.next/next-minimal-server.js.nft.json +1 -0
  7. package/.next/next-server.js.nft.json +1 -0
  8. package/.next/package.json +1 -0
  9. package/.next/prerender-manifest.json +157 -0
  10. package/.next/react-loadable-manifest.json +480 -0
  11. package/.next/required-server-files.js +364 -0
  12. package/.next/required-server-files.json +364 -0
  13. package/.next/routes-manifest.json +471 -0
  14. package/.next/server/app/_global-error/page.js +31 -0
  15. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  16. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  17. package/.next/server/app/_global-error.html +1 -0
  18. package/.next/server/app/_global-error.meta +27 -0
  19. package/.next/server/app/_global-error.rsc +15 -0
  20. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  21. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +21 -0
  22. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  23. package/.next/server/app/_not-found/page.js +1 -0
  24. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  25. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  26. package/.next/server/app/_not-found.html +1 -0
  27. package/.next/server/app/_not-found.meta +27 -0
  28. package/.next/server/app/_not-found.rsc +23 -0
  29. package/.next/server/app/_not-found.segments/_full.segment.rsc +23 -0
  30. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +25 -0
  31. package/.next/server/app/_not-found.segments/_tree.segment.rsc +8 -0
  32. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
  33. package/.next/server/app/api/agent/[id]/bash-output/route.js.nft.json +1 -0
  34. package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -0
  35. package/.next/server/app/api/agent/[id]/events/route.js +5 -0
  36. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -0
  37. package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -0
  38. package/.next/server/app/api/agent/[id]/route.js +1 -0
  39. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -0
  40. package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -0
  41. package/.next/server/app/api/agent/new/route.js +1 -0
  42. package/.next/server/app/api/agent/new/route.js.nft.json +1 -0
  43. package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
  44. package/.next/server/app/api/agent/running/events/route.js +3 -0
  45. package/.next/server/app/api/agent/running/events/route.js.nft.json +1 -0
  46. package/.next/server/app/api/agent/running/events/route_client-reference-manifest.js +1 -0
  47. package/.next/server/app/api/agents/[name]/route.js +6 -0
  48. package/.next/server/app/api/agents/[name]/route.js.nft.json +1 -0
  49. package/.next/server/app/api/agents/[name]/route_client-reference-manifest.js +1 -0
  50. package/.next/server/app/api/agents/route.js +6 -0
  51. package/.next/server/app/api/agents/route.js.nft.json +1 -0
  52. package/.next/server/app/api/agents/route_client-reference-manifest.js +1 -0
  53. package/.next/server/app/api/agents/unpack/route.js +6 -0
  54. package/.next/server/app/api/agents/unpack/route.js.nft.json +1 -0
  55. package/.next/server/app/api/agents/unpack/route_client-reference-manifest.js +1 -0
  56. package/.next/server/app/api/app-update/route.js +1 -0
  57. package/.next/server/app/api/app-update/route.js.nft.json +1 -0
  58. package/.next/server/app/api/app-update/route_client-reference-manifest.js +1 -0
  59. package/.next/server/app/api/auth/all-providers/route.js +1 -0
  60. package/.next/server/app/api/auth/all-providers/route.js.nft.json +1 -0
  61. package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -0
  62. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -0
  63. package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +1 -0
  64. package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -0
  65. package/.next/server/app/api/auth/login/[provider]/route.js +3 -0
  66. package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -0
  67. package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -0
  68. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -0
  69. package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +1 -0
  70. package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -0
  71. package/.next/server/app/api/auth/providers/route.js +1 -0
  72. package/.next/server/app/api/auth/providers/route.js.nft.json +1 -0
  73. package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
  74. package/.next/server/app/api/cwd/browse/route.js +1 -0
  75. package/.next/server/app/api/cwd/browse/route.js.nft.json +1 -0
  76. package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -0
  77. package/.next/server/app/api/cwd/validate/route.js +1 -0
  78. package/.next/server/app/api/cwd/validate/route.js.nft.json +1 -0
  79. package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -0
  80. package/.next/server/app/api/default-cwd/route.js +1 -0
  81. package/.next/server/app/api/default-cwd/route.js.nft.json +1 -0
  82. package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
  83. package/.next/server/app/api/file-index/route.js +1 -0
  84. package/.next/server/app/api/file-index/route.js.nft.json +1 -0
  85. package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -0
  86. package/.next/server/app/api/files/[...path]/route.js +49 -0
  87. package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -0
  88. package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
  89. package/.next/server/app/api/git/diff/route.js +6 -0
  90. package/.next/server/app/api/git/diff/route.js.nft.json +1 -0
  91. package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -0
  92. package/.next/server/app/api/git/status/route.js +6 -0
  93. package/.next/server/app/api/git/status/route.js.nft.json +1 -0
  94. package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -0
  95. package/.next/server/app/api/home/route.js +1 -0
  96. package/.next/server/app/api/home/route.js.nft.json +1 -0
  97. package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
  98. package/.next/server/app/api/mcp/route.js +3 -0
  99. package/.next/server/app/api/mcp/route.js.nft.json +1 -0
  100. package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -0
  101. package/.next/server/app/api/model-roles/route.js +1 -0
  102. package/.next/server/app/api/model-roles/route.js.nft.json +1 -0
  103. package/.next/server/app/api/model-roles/route_client-reference-manifest.js +1 -0
  104. package/.next/server/app/api/models/route.js +1 -0
  105. package/.next/server/app/api/models/route.js.nft.json +1 -0
  106. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  107. package/.next/server/app/api/models-config/catalog/route.js +1 -0
  108. package/.next/server/app/api/models-config/catalog/route.js.nft.json +1 -0
  109. package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -0
  110. package/.next/server/app/api/models-config/route.js +1 -0
  111. package/.next/server/app/api/models-config/route.js.nft.json +1 -0
  112. package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -0
  113. package/.next/server/app/api/models-config/test/route.js +1 -0
  114. package/.next/server/app/api/models-config/test/route.js.nft.json +1 -0
  115. package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
  116. package/.next/server/app/api/omp-settings/route.js +1 -0
  117. package/.next/server/app/api/omp-settings/route.js.nft.json +1 -0
  118. package/.next/server/app/api/omp-settings/route_client-reference-manifest.js +1 -0
  119. package/.next/server/app/api/omp-update/route.js +2 -0
  120. package/.next/server/app/api/omp-update/route.js.nft.json +1 -0
  121. package/.next/server/app/api/omp-update/route_client-reference-manifest.js +1 -0
  122. package/.next/server/app/api/omp-version/route.js +1 -0
  123. package/.next/server/app/api/omp-version/route.js.nft.json +1 -0
  124. package/.next/server/app/api/omp-version/route_client-reference-manifest.js +1 -0
  125. package/.next/server/app/api/plugins/route.js +1 -0
  126. package/.next/server/app/api/plugins/route.js.nft.json +1 -0
  127. package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
  128. package/.next/server/app/api/projects/route.js +2 -0
  129. package/.next/server/app/api/projects/route.js.nft.json +1 -0
  130. package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -0
  131. package/.next/server/app/api/providers/enable/route.js +1 -0
  132. package/.next/server/app/api/providers/enable/route.js.nft.json +1 -0
  133. package/.next/server/app/api/providers/enable/route_client-reference-manifest.js +1 -0
  134. package/.next/server/app/api/sessions/[id]/archive/route.js +1 -0
  135. package/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -0
  136. package/.next/server/app/api/sessions/[id]/archive/route_client-reference-manifest.js +1 -0
  137. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -0
  138. package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -0
  139. package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -0
  140. package/.next/server/app/api/sessions/[id]/context/route.js +1 -0
  141. package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -0
  142. package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
  143. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -0
  144. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js.nft.json +1 -0
  145. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -0
  146. package/.next/server/app/api/sessions/[id]/export/route.js +1 -0
  147. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -0
  148. package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -0
  149. package/.next/server/app/api/sessions/[id]/route.js +1 -0
  150. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -0
  151. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
  152. package/.next/server/app/api/sessions/[id]/state/route.js +1 -0
  153. package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -0
  154. package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -0
  155. package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route.js +1 -0
  156. package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route.js.nft.json +1 -0
  157. package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route_client-reference-manifest.js +1 -0
  158. package/.next/server/app/api/sessions/[id]/subagents/route.js +1 -0
  159. package/.next/server/app/api/sessions/[id]/subagents/route.js.nft.json +1 -0
  160. package/.next/server/app/api/sessions/[id]/subagents/route_client-reference-manifest.js +1 -0
  161. package/.next/server/app/api/sessions/import/route.js +1 -0
  162. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -0
  163. package/.next/server/app/api/sessions/import/route_client-reference-manifest.js +1 -0
  164. package/.next/server/app/api/sessions/route.js +1 -0
  165. package/.next/server/app/api/sessions/route.js.nft.json +1 -0
  166. package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -0
  167. package/.next/server/app/api/skills/check/route.js +1 -0
  168. package/.next/server/app/api/skills/check/route.js.nft.json +1 -0
  169. package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -0
  170. package/.next/server/app/api/skills/install/route.js +1 -0
  171. package/.next/server/app/api/skills/install/route.js.nft.json +1 -0
  172. package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
  173. package/.next/server/app/api/skills/route.js +4 -0
  174. package/.next/server/app/api/skills/route.js.nft.json +1 -0
  175. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
  176. package/.next/server/app/api/skills/search/route.js +1 -0
  177. package/.next/server/app/api/skills/search/route.js.nft.json +1 -0
  178. package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
  179. package/.next/server/app/api/skills/update/route.js +1 -0
  180. package/.next/server/app/api/skills/update/route.js.nft.json +1 -0
  181. package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
  182. package/.next/server/app/api/web-auth/session/route.js +1 -0
  183. package/.next/server/app/api/web-auth/session/route.js.nft.json +1 -0
  184. package/.next/server/app/api/web-auth/session/route_client-reference-manifest.js +1 -0
  185. package/.next/server/app/api/worktrees/route.js +1 -0
  186. package/.next/server/app/api/worktrees/route.js.nft.json +1 -0
  187. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -0
  188. package/.next/server/app/favicon.ico/route.js +1 -0
  189. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  190. package/.next/server/app/favicon.ico.body +0 -0
  191. package/.next/server/app/favicon.ico.meta +1 -0
  192. package/.next/server/app/index.html +1 -0
  193. package/.next/server/app/index.meta +21 -0
  194. package/.next/server/app/index.rsc +22 -0
  195. package/.next/server/app/index.segments/__PAGE__.segment.rsc +23 -0
  196. package/.next/server/app/index.segments/_full.segment.rsc +22 -0
  197. package/.next/server/app/index.segments/_tree.segment.rsc +8 -0
  198. package/.next/server/app/login/page.js +1 -0
  199. package/.next/server/app/login/page.js.nft.json +1 -0
  200. package/.next/server/app/login/page_client-reference-manifest.js +1 -0
  201. package/.next/server/app/login.html +1 -0
  202. package/.next/server/app/login.meta +26 -0
  203. package/.next/server/app/login.rsc +24 -0
  204. package/.next/server/app/login.segments/_full.segment.rsc +24 -0
  205. package/.next/server/app/login.segments/_tree.segment.rsc +8 -0
  206. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +26 -0
  207. package/.next/server/app/page.js +76 -0
  208. package/.next/server/app/page.js.nft.json +1 -0
  209. package/.next/server/app/page_client-reference-manifest.js +1 -0
  210. package/.next/server/app-paths-manifest.json +59 -0
  211. package/.next/server/chunks/1094.js +160 -0
  212. package/.next/server/chunks/1515.js +1 -0
  213. package/.next/server/chunks/1555.js +1 -0
  214. package/.next/server/chunks/1601.js +24 -0
  215. package/.next/server/chunks/1625.js +1 -0
  216. package/.next/server/chunks/1671.js +1 -0
  217. package/.next/server/chunks/1800.js +1 -0
  218. package/.next/server/chunks/1813.js +1 -0
  219. package/.next/server/chunks/1860.js +1 -0
  220. package/.next/server/chunks/2075.js +23 -0
  221. package/.next/server/chunks/2106.js +1 -0
  222. package/.next/server/chunks/2169.js +36 -0
  223. package/.next/server/chunks/2190.js +1 -0
  224. package/.next/server/chunks/2325.js +82 -0
  225. package/.next/server/chunks/2349.js +1 -0
  226. package/.next/server/chunks/2408.js +1 -0
  227. package/.next/server/chunks/2452.js +93 -0
  228. package/.next/server/chunks/2744.js +1 -0
  229. package/.next/server/chunks/2865.js +1 -0
  230. package/.next/server/chunks/2903.js +1 -0
  231. package/.next/server/chunks/295.js +1 -0
  232. package/.next/server/chunks/3012.js +1 -0
  233. package/.next/server/chunks/3186.js +86 -0
  234. package/.next/server/chunks/3294.js +25 -0
  235. package/.next/server/chunks/3379.js +1 -0
  236. package/.next/server/chunks/3383.js +27 -0
  237. package/.next/server/chunks/3425.js +163 -0
  238. package/.next/server/chunks/3569.js +1 -0
  239. package/.next/server/chunks/3798.js +5 -0
  240. package/.next/server/chunks/3869.js +8 -0
  241. package/.next/server/chunks/3894.js +1 -0
  242. package/.next/server/chunks/4267.js +1 -0
  243. package/.next/server/chunks/4315.js +1 -0
  244. package/.next/server/chunks/4367.js +1 -0
  245. package/.next/server/chunks/4372.js +1 -0
  246. package/.next/server/chunks/4445.js +1 -0
  247. package/.next/server/chunks/4538.js +24 -0
  248. package/.next/server/chunks/4548.js +1 -0
  249. package/.next/server/chunks/4563.js +38 -0
  250. package/.next/server/chunks/4674.js +1 -0
  251. package/.next/server/chunks/4741.js +165 -0
  252. package/.next/server/chunks/477.js +1 -0
  253. package/.next/server/chunks/4980.js +1 -0
  254. package/.next/server/chunks/5029.js +1 -0
  255. package/.next/server/chunks/5318.js +1 -0
  256. package/.next/server/chunks/5974.js +77 -0
  257. package/.next/server/chunks/6052.js +141 -0
  258. package/.next/server/chunks/611.js +1 -0
  259. package/.next/server/chunks/6209.js +12 -0
  260. package/.next/server/chunks/6253.js +104 -0
  261. package/.next/server/chunks/6337.js +1 -0
  262. package/.next/server/chunks/6366.js +80 -0
  263. package/.next/server/chunks/6465.js +1 -0
  264. package/.next/server/chunks/673.js +287 -0
  265. package/.next/server/chunks/6916.js +226 -0
  266. package/.next/server/chunks/6980.js +1 -0
  267. package/.next/server/chunks/703.js +1 -0
  268. package/.next/server/chunks/714.js +1 -0
  269. package/.next/server/chunks/7233.js +1 -0
  270. package/.next/server/chunks/7265.js +215 -0
  271. package/.next/server/chunks/7307.js +1 -0
  272. package/.next/server/chunks/7561.js +1 -0
  273. package/.next/server/chunks/7567.js +1 -0
  274. package/.next/server/chunks/7710.js +1 -0
  275. package/.next/server/chunks/7744.js +64 -0
  276. package/.next/server/chunks/7790.js +1 -0
  277. package/.next/server/chunks/7799.js +34 -0
  278. package/.next/server/chunks/7834.js +5 -0
  279. package/.next/server/chunks/7872.js +1 -0
  280. package/.next/server/chunks/8106.js +1 -0
  281. package/.next/server/chunks/8170.js +1 -0
  282. package/.next/server/chunks/8294.js +1 -0
  283. package/.next/server/chunks/8333.js +79 -0
  284. package/.next/server/chunks/835.js +1 -0
  285. package/.next/server/chunks/8353.js +4 -0
  286. package/.next/server/chunks/8397.js +41 -0
  287. package/.next/server/chunks/8501.js +1 -0
  288. package/.next/server/chunks/8604.js +115 -0
  289. package/.next/server/chunks/8713.js +148 -0
  290. package/.next/server/chunks/8782.js +153 -0
  291. package/.next/server/chunks/8920.js +62 -0
  292. package/.next/server/chunks/922.js +5 -0
  293. package/.next/server/chunks/9280.js +255 -0
  294. package/.next/server/chunks/9486.js +1 -0
  295. package/.next/server/chunks/9509.js +1 -0
  296. package/.next/server/chunks/9510.js +90 -0
  297. package/.next/server/functions-config-manifest.json +15 -0
  298. package/.next/server/instrumentation.js +1 -0
  299. package/.next/server/instrumentation.js.nft.json +1 -0
  300. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  301. package/.next/server/middleware-build-manifest.js +1 -0
  302. package/.next/server/middleware-manifest.json +6 -0
  303. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  304. package/.next/server/middleware.js +163 -0
  305. package/.next/server/middleware.js.nft.json +1 -0
  306. package/.next/server/next-font-manifest.js +1 -0
  307. package/.next/server/next-font-manifest.json +1 -0
  308. package/.next/server/pages/404.html +1 -0
  309. package/.next/server/pages/500.html +1 -0
  310. package/.next/server/pages-manifest.json +4 -0
  311. package/.next/server/prefetch-hints.json +53 -0
  312. package/.next/server/server-reference-manifest.js +1 -0
  313. package/.next/server/server-reference-manifest.json +1 -0
  314. package/.next/server/webpack-runtime.js +1 -0
  315. package/.next/static/YAZYeEe1KDqN7al9eJ-PR/_buildManifest.js +1 -0
  316. package/.next/static/YAZYeEe1KDqN7al9eJ-PR/_ssgManifest.js +1 -0
  317. package/.next/static/chunks/103.23142a67b02246a8.js +215 -0
  318. package/.next/static/chunks/1032.d9a9179233599785.js +1 -0
  319. package/.next/static/chunks/1063.775c442bdbeef08b.js +1 -0
  320. package/.next/static/chunks/1133.cec7d32308adb5b9.js +1 -0
  321. package/.next/static/chunks/1327.09252bb80616cc3a.js +1 -0
  322. package/.next/static/chunks/1708.c3a1896e4cc9f8d9.js +1 -0
  323. package/.next/static/chunks/1781.9072b4c9586df549.js +1 -0
  324. package/.next/static/chunks/1ba63609.b2ae90f43319a29e.js +153 -0
  325. package/.next/static/chunks/2081.47b6e9391094055f.js +1 -0
  326. package/.next/static/chunks/2181.ba21239d3ac39f81.js +1 -0
  327. package/.next/static/chunks/2201.9abd9168805e51f1.js +1 -0
  328. package/.next/static/chunks/2258.4defa30121ef44a5.js +1 -0
  329. package/.next/static/chunks/2325.23caf22075e51aa5.js +1 -0
  330. package/.next/static/chunks/2356.523277bb8c6bf72a.js +23 -0
  331. package/.next/static/chunks/2418.b5d9e177e10a686e.js +1 -0
  332. package/.next/static/chunks/2480.cf27ca02e5b19761.js +24 -0
  333. package/.next/static/chunks/2539.c5a4f2fd8e421c70.js +41 -0
  334. package/.next/static/chunks/2619.9431a3f48da8eef4.js +1 -0
  335. package/.next/static/chunks/268.ec500965c1761e26.js +80 -0
  336. package/.next/static/chunks/2695.b732ef1965253b3f.js +90 -0
  337. package/.next/static/chunks/2703.495a65ed14b2f094.js +36 -0
  338. package/.next/static/chunks/2821.934bcf60fbdc28c6.js +1 -0
  339. package/.next/static/chunks/3251.408c817adb161919.js +1 -0
  340. package/.next/static/chunks/3274.981684293bab3573.js +1 -0
  341. package/.next/static/chunks/3308.8e27b5c43a478f0d.js +73 -0
  342. package/.next/static/chunks/3336.a76f9485fe7cb762.js +1 -0
  343. package/.next/static/chunks/370.8e8f3cf8eb0e29dd.js +1 -0
  344. package/.next/static/chunks/3716.72bf4c9d7325debd.js +1 -0
  345. package/.next/static/chunks/3794-d7cddff008311ab3.js +52 -0
  346. package/.next/static/chunks/398.ffa02af9062a3950.js +77 -0
  347. package/.next/static/chunks/3995.eca0f5bef1fc3ae5.js +38 -0
  348. package/.next/static/chunks/4004.74b9bcf5478b1663.js +160 -0
  349. package/.next/static/chunks/4202.8440832386f023c7.js +226 -0
  350. package/.next/static/chunks/4238.6f102dcbcf2ae339.js +141 -0
  351. package/.next/static/chunks/4315-50f4eb7d435d214a.js +1 -0
  352. package/.next/static/chunks/4405.7a19458960a1058e.js +287 -0
  353. package/.next/static/chunks/4424.fd0c93a807a333e1.js +1 -0
  354. package/.next/static/chunks/4473.bb35c176b3f2bf32.js +1 -0
  355. package/.next/static/chunks/4559.2e7ed39ea2757280.js +1 -0
  356. package/.next/static/chunks/484.c74eeb0fca9a9ddf.js +1 -0
  357. package/.next/static/chunks/4854.b64a1daa15899219.js +1 -0
  358. package/.next/static/chunks/4866.d1060b4faf2ae1e2.js +1 -0
  359. package/.next/static/chunks/4970.8a63b4953b0e4946.js +1 -0
  360. package/.next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js +1 -0
  361. package/.next/static/chunks/5020.9ac8d0dc8390bb6e.js +1 -0
  362. package/.next/static/chunks/5137.f163e94c74a94d01.js +1 -0
  363. package/.next/static/chunks/5199.9ec1359b9aa220ab.js +1 -0
  364. package/.next/static/chunks/5242.7b643c6b3394cac1.js +1 -0
  365. package/.next/static/chunks/5361.afc00ab2626bacbf.js +1 -0
  366. package/.next/static/chunks/5521.cfdf2cfc6db31407.js +1 -0
  367. package/.next/static/chunks/5526.ff46471041fdcb79.js +86 -0
  368. package/.next/static/chunks/5658.d00c8405a87f7366.js +1 -0
  369. package/.next/static/chunks/5681.dd0e66b0de16e54b.js +27 -0
  370. package/.next/static/chunks/6121.eb9023b1cbc78ee2.js +1 -0
  371. package/.next/static/chunks/6161.4836cd7d031026bf.js +1 -0
  372. package/.next/static/chunks/6195.8710aa41b2319dff.js +24 -0
  373. package/.next/static/chunks/6202.f4317cf0a48876f9.js +1 -0
  374. package/.next/static/chunks/6294.24f510c0c3e3714c.js +1 -0
  375. package/.next/static/chunks/6522.a49bd5d1f0532830.js +1 -0
  376. package/.next/static/chunks/6654.41440ef667144967.js +1 -0
  377. package/.next/static/chunks/6794.57bf1aff78682f3a.js +93 -0
  378. package/.next/static/chunks/6876-5f6f58395158f0b8.js +1 -0
  379. package/.next/static/chunks/7256.e07cf52d87d40252.js +1 -0
  380. package/.next/static/chunks/7268.2f59c671f26160f3.js +1 -0
  381. package/.next/static/chunks/7331.2add3c4e125a2dba.js +104 -0
  382. package/.next/static/chunks/7543.89f7b805ed0f2901.js +1 -0
  383. package/.next/static/chunks/7570.db2b11eaf9806157.js +1 -0
  384. package/.next/static/chunks/8200.a36b9f8c983c6b9e.js +5 -0
  385. package/.next/static/chunks/869.7152372b662e31af.js +1 -0
  386. package/.next/static/chunks/8717.4e20eedf9544e286.js +1 -0
  387. package/.next/static/chunks/8863.fa0320ea586efb3b.js +1 -0
  388. package/.next/static/chunks/8885.d9308c756376780b.js +79 -0
  389. package/.next/static/chunks/8901.e117d206a917bda0.js +1 -0
  390. package/.next/static/chunks/90542734.ae439f2382f58c51.js +1 -0
  391. package/.next/static/chunks/918.6a9bbe564e4a2d0f.js +115 -0
  392. package/.next/static/chunks/934.9006461bd0548660.js +1 -0
  393. package/.next/static/chunks/9365.a3e0e5ac101ccd02.js +1 -0
  394. package/.next/static/chunks/9522.c7c6e9c330f9ba6b.js +1 -0
  395. package/.next/static/chunks/9614.3221013d7f0af27f.js +64 -0
  396. package/.next/static/chunks/9698.4d09a99b9d99f3e5.js +148 -0
  397. package/.next/static/chunks/9705.40a82b97f214e28b.js +1 -0
  398. package/.next/static/chunks/973.9efc01efd9d768a5.js +8 -0
  399. package/.next/static/chunks/9754.d67dec946fc871d4.js +25 -0
  400. package/.next/static/chunks/9764.2669775c6e107a01.js +62 -0
  401. package/.next/static/chunks/9793.4567af813117ad25.js +1 -0
  402. package/.next/static/chunks/993e5495.598a97aa1337298f.js +62 -0
  403. package/.next/static/chunks/9974.9a0f79beca65e8c4.js +34 -0
  404. package/.next/static/chunks/9981.64e2a4c3b53b3217.js +1 -0
  405. package/.next/static/chunks/app/_global-error/page-db1bed60c4bd0656.js +1 -0
  406. package/.next/static/chunks/app/_not-found/page-29d942d61dc402df.js +1 -0
  407. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-db1bed60c4bd0656.js +1 -0
  408. package/.next/static/chunks/app/api/agent/[id]/events/route-db1bed60c4bd0656.js +1 -0
  409. package/.next/static/chunks/app/api/agent/[id]/route-db1bed60c4bd0656.js +1 -0
  410. package/.next/static/chunks/app/api/agent/new/route-db1bed60c4bd0656.js +1 -0
  411. package/.next/static/chunks/app/api/agent/running/events/route-db1bed60c4bd0656.js +1 -0
  412. package/.next/static/chunks/app/api/agents/[name]/route-db1bed60c4bd0656.js +1 -0
  413. package/.next/static/chunks/app/api/agents/route-db1bed60c4bd0656.js +1 -0
  414. package/.next/static/chunks/app/api/agents/unpack/route-db1bed60c4bd0656.js +1 -0
  415. package/.next/static/chunks/app/api/app-update/route-db1bed60c4bd0656.js +1 -0
  416. package/.next/static/chunks/app/api/auth/all-providers/route-db1bed60c4bd0656.js +1 -0
  417. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-db1bed60c4bd0656.js +1 -0
  418. package/.next/static/chunks/app/api/auth/login/[provider]/route-db1bed60c4bd0656.js +1 -0
  419. package/.next/static/chunks/app/api/auth/logout/[provider]/route-db1bed60c4bd0656.js +1 -0
  420. package/.next/static/chunks/app/api/auth/providers/route-db1bed60c4bd0656.js +1 -0
  421. package/.next/static/chunks/app/api/cwd/browse/route-db1bed60c4bd0656.js +1 -0
  422. package/.next/static/chunks/app/api/cwd/validate/route-db1bed60c4bd0656.js +1 -0
  423. package/.next/static/chunks/app/api/default-cwd/route-db1bed60c4bd0656.js +1 -0
  424. package/.next/static/chunks/app/api/file-index/route-db1bed60c4bd0656.js +1 -0
  425. package/.next/static/chunks/app/api/files/[...path]/route-db1bed60c4bd0656.js +1 -0
  426. package/.next/static/chunks/app/api/git/diff/route-db1bed60c4bd0656.js +1 -0
  427. package/.next/static/chunks/app/api/git/status/route-db1bed60c4bd0656.js +1 -0
  428. package/.next/static/chunks/app/api/home/route-db1bed60c4bd0656.js +1 -0
  429. package/.next/static/chunks/app/api/mcp/route-db1bed60c4bd0656.js +1 -0
  430. package/.next/static/chunks/app/api/model-roles/route-db1bed60c4bd0656.js +1 -0
  431. package/.next/static/chunks/app/api/models/route-db1bed60c4bd0656.js +1 -0
  432. package/.next/static/chunks/app/api/models-config/catalog/route-db1bed60c4bd0656.js +1 -0
  433. package/.next/static/chunks/app/api/models-config/route-db1bed60c4bd0656.js +1 -0
  434. package/.next/static/chunks/app/api/models-config/test/route-db1bed60c4bd0656.js +1 -0
  435. package/.next/static/chunks/app/api/omp-settings/route-db1bed60c4bd0656.js +1 -0
  436. package/.next/static/chunks/app/api/omp-update/route-db1bed60c4bd0656.js +1 -0
  437. package/.next/static/chunks/app/api/omp-version/route-db1bed60c4bd0656.js +1 -0
  438. package/.next/static/chunks/app/api/plugins/route-db1bed60c4bd0656.js +1 -0
  439. package/.next/static/chunks/app/api/projects/route-db1bed60c4bd0656.js +1 -0
  440. package/.next/static/chunks/app/api/providers/enable/route-db1bed60c4bd0656.js +1 -0
  441. package/.next/static/chunks/app/api/sessions/[id]/archive/route-db1bed60c4bd0656.js +1 -0
  442. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-db1bed60c4bd0656.js +1 -0
  443. package/.next/static/chunks/app/api/sessions/[id]/context/route-db1bed60c4bd0656.js +1 -0
  444. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-db1bed60c4bd0656.js +1 -0
  445. package/.next/static/chunks/app/api/sessions/[id]/export/route-db1bed60c4bd0656.js +1 -0
  446. package/.next/static/chunks/app/api/sessions/[id]/route-db1bed60c4bd0656.js +1 -0
  447. package/.next/static/chunks/app/api/sessions/[id]/state/route-db1bed60c4bd0656.js +1 -0
  448. package/.next/static/chunks/app/api/sessions/[id]/subagents/[subagentId]/route-db1bed60c4bd0656.js +1 -0
  449. package/.next/static/chunks/app/api/sessions/[id]/subagents/route-db1bed60c4bd0656.js +1 -0
  450. package/.next/static/chunks/app/api/sessions/import/route-db1bed60c4bd0656.js +1 -0
  451. package/.next/static/chunks/app/api/sessions/route-db1bed60c4bd0656.js +1 -0
  452. package/.next/static/chunks/app/api/skills/check/route-db1bed60c4bd0656.js +1 -0
  453. package/.next/static/chunks/app/api/skills/install/route-db1bed60c4bd0656.js +1 -0
  454. package/.next/static/chunks/app/api/skills/route-db1bed60c4bd0656.js +1 -0
  455. package/.next/static/chunks/app/api/skills/search/route-db1bed60c4bd0656.js +1 -0
  456. package/.next/static/chunks/app/api/skills/update/route-db1bed60c4bd0656.js +1 -0
  457. package/.next/static/chunks/app/api/web-auth/session/route-db1bed60c4bd0656.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/route-db1bed60c4bd0656.js +1 -0
  459. package/.next/static/chunks/app/error-b1ed788ca548b925.js +1 -0
  460. package/.next/static/chunks/app/global-error-d103ca6500636699.js +1 -0
  461. package/.next/static/chunks/app/layout-27cadb6f9894131c.js +1 -0
  462. package/.next/static/chunks/app/login/page-e9ec076f136fb627.js +1 -0
  463. package/.next/static/chunks/app/page-60629bbe3fe259ef.js +76 -0
  464. package/.next/static/chunks/bf2ff291.244c8a7c1c14966a.js +122 -0
  465. package/.next/static/chunks/d3ac728e.7964f816a1ca64e5.js +1 -0
  466. package/.next/static/chunks/da12927c.476aa688a637649c.js +82 -0
  467. package/.next/static/chunks/db9d41be.27ee8fcc7bf00d70.js +1 -0
  468. package/.next/static/chunks/framework-b33a8f5d57cd8d87.js +1 -0
  469. package/.next/static/chunks/main-354b27ede3eb835a.js +5 -0
  470. package/.next/static/chunks/main-app-0f81281390bb2b72.js +1 -0
  471. package/.next/static/chunks/next/dist/client/components/builtin/app-error-db1bed60c4bd0656.js +1 -0
  472. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-db1bed60c4bd0656.js +1 -0
  473. package/.next/static/chunks/next/dist/client/components/builtin/not-found-db1bed60c4bd0656.js +1 -0
  474. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-db1bed60c4bd0656.js +1 -0
  475. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  476. package/.next/static/chunks/webpack-11f7dad1df4f814f.js +1 -0
  477. package/.next/static/css/14563335c571ff8f.css +1 -0
  478. package/.next/static/css/2f46e0db0d4a3aed.css +1 -0
  479. package/.next/static/css/5fe2a8af79a7efdf.css +1 -0
  480. package/.next/static/css/921bec6c70de20d4.css +1 -0
  481. package/.next/static/media/01bdb1c2bb2f530a-s.woff2 +0 -0
  482. package/.next/static/media/060fd7a2ba6f57dc-s.woff2 +0 -0
  483. package/.next/static/media/06d755a5cd3e2b96-s.woff2 +0 -0
  484. package/.next/static/media/09341845bc7215c3-s.woff2 +0 -0
  485. package/.next/static/media/09d8b46d011a8a55-s.woff2 +0 -0
  486. package/.next/static/media/0ac3ab6b6a54cd96-s.woff2 +0 -0
  487. package/.next/static/media/0cb7a0edc360425e-s.woff2 +0 -0
  488. package/.next/static/media/0de82041d2acf4c3-s.woff2 +0 -0
  489. package/.next/static/media/1249fbbadbb69451-s.woff2 +0 -0
  490. package/.next/static/media/15605e25b523335c-s.woff2 +0 -0
  491. package/.next/static/media/182682366c265526-s.woff2 +0 -0
  492. package/.next/static/media/1a3dce5cfb5f7760-s.woff2 +0 -0
  493. package/.next/static/media/1cdd02902f937a18-s.woff2 +0 -0
  494. package/.next/static/media/246116fa49278f72-s.woff2 +0 -0
  495. package/.next/static/media/2ad4a039dd2c0f35-s.woff2 +0 -0
  496. package/.next/static/media/2cd94acf7f6a8cd1-s.woff2 +0 -0
  497. package/.next/static/media/30af2a5bc088caeb-s.woff2 +0 -0
  498. package/.next/static/media/3117748ae3be552d-s.woff2 +0 -0
  499. package/.next/static/media/373befd5a68230ff-s.woff2 +0 -0
  500. package/.next/static/media/37ae20ae1d329cc2-s.woff2 +0 -0
  501. package/.next/static/media/3832bef2caf4f297-s.woff2 +0 -0
  502. package/.next/static/media/3b6ebd4dd223d8c1-s.woff2 +0 -0
  503. package/.next/static/media/3d165c286d94e27c-s.woff2 +0 -0
  504. package/.next/static/media/3da25081fc21e3b2-s.woff2 +0 -0
  505. package/.next/static/media/3eb545844a1630b6-s.woff2 +0 -0
  506. package/.next/static/media/41870aeb5505be99-s.woff2 +0 -0
  507. package/.next/static/media/45c8f5377f81d417-s.woff2 +0 -0
  508. package/.next/static/media/48d86e2f8821c61e-s.woff2 +0 -0
  509. package/.next/static/media/4957022da3161c6e-s.woff2 +0 -0
  510. package/.next/static/media/4be71ddc6c749643-s.woff2 +0 -0
  511. package/.next/static/media/4c4b3b30b6bcb2be-s.woff2 +0 -0
  512. package/.next/static/media/4dc4381bbf526d04-s.woff2 +0 -0
  513. package/.next/static/media/4eb0814ea9e22f45-s.woff2 +0 -0
  514. package/.next/static/media/4f86cf50532e0e9b-s.woff2 +0 -0
  515. package/.next/static/media/5022b11bb4a81e48-s.woff2 +0 -0
  516. package/.next/static/media/5080c55e2dccd63d-s.woff2 +0 -0
  517. package/.next/static/media/5348b1e69a651725-s.woff2 +0 -0
  518. package/.next/static/media/54c50561be23e605-s.woff2 +0 -0
  519. package/.next/static/media/567d6f765096ee76-s.woff2 +0 -0
  520. package/.next/static/media/58045d1f8695a418-s.woff2 +0 -0
  521. package/.next/static/media/591e43f23f51e5a5-s.woff2 +0 -0
  522. package/.next/static/media/5a274ddc03d9a5ab-s.woff2 +0 -0
  523. package/.next/static/media/5feee92221bb8605-s.woff2 +0 -0
  524. package/.next/static/media/6067d3f78ecc4535-s.woff2 +0 -0
  525. package/.next/static/media/61a11ca45429493a-s.woff2 +0 -0
  526. package/.next/static/media/63d030730737efae-s.woff2 +0 -0
  527. package/.next/static/media/641a7b8a5800ee0e-s.woff2 +0 -0
  528. package/.next/static/media/6bd056ddce336924-s.woff2 +0 -0
  529. package/.next/static/media/6dc0bae4a5666821-s.woff2 +0 -0
  530. package/.next/static/media/7513cc52807669ca-s.woff2 +0 -0
  531. package/.next/static/media/75ae81fea4aec8c5-s.woff2 +0 -0
  532. package/.next/static/media/77f6534b6a3eb37a-s.woff2 +0 -0
  533. package/.next/static/media/782d4006a26041e7-s.woff2 +0 -0
  534. package/.next/static/media/7c21074d9bafed1b-s.woff2 +0 -0
  535. package/.next/static/media/7d509f4f988023eb-s.woff2 +0 -0
  536. package/.next/static/media/7d58f39a50828c68-s.woff2 +0 -0
  537. package/.next/static/media/7db71cc013812f1c-s.woff2 +0 -0
  538. package/.next/static/media/7deddc85b7ffd1dc-s.p.woff2 +0 -0
  539. package/.next/static/media/7eb3f914ae6dd7a0-s.woff2 +0 -0
  540. package/.next/static/media/8051eb8307aa13c8-s.woff2 +0 -0
  541. package/.next/static/media/829dca987e1e010e-s.woff2 +0 -0
  542. package/.next/static/media/842f675c7a332a48-s.woff2 +0 -0
  543. package/.next/static/media/866e2e7b0cbc2cb4-s.woff2 +0 -0
  544. package/.next/static/media/86b38dc7f713ddda-s.woff2 +0 -0
  545. package/.next/static/media/8a3a66ae6bb27151-s.woff2 +0 -0
  546. package/.next/static/media/8b56b70f6d577d9f-s.woff2 +0 -0
  547. package/.next/static/media/8d93dbb77672da11-s.woff2 +0 -0
  548. package/.next/static/media/8f5c2d0a25b8f50c-s.woff2 +0 -0
  549. package/.next/static/media/916860560b9a2bc2-s.woff2 +0 -0
  550. package/.next/static/media/966e6d14b6c229fc-s.woff2 +0 -0
  551. package/.next/static/media/97ac91773d3121b2-s.p.woff2 +0 -0
  552. package/.next/static/media/9877fefe733dd250-s.woff2 +0 -0
  553. package/.next/static/media/9c57f4420502d43a-s.woff2 +0 -0
  554. package/.next/static/media/9cedd2ad7b0bcf3d-s.woff2 +0 -0
  555. package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
  556. package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
  557. package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
  558. package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
  559. package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
  560. package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
  561. package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
  562. package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
  563. package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
  564. package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
  565. package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
  566. package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
  567. package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
  568. package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
  569. package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
  570. package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
  571. package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
  572. package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
  573. package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
  574. package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
  575. package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
  576. package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
  577. package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
  578. package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
  579. package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
  580. package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
  581. package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
  582. package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
  583. package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
  584. package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
  585. package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
  586. package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
  587. package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
  588. package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
  589. package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
  590. package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
  591. package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
  592. package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
  593. package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
  594. package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
  595. package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
  596. package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
  597. package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
  598. package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
  599. package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
  600. package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
  601. package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
  602. package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
  603. package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
  604. package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
  605. package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
  606. package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
  607. package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
  608. package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
  609. package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
  610. package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
  611. package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
  612. package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
  613. package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
  614. package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
  615. package/.next/static/media/a00fb5ef1ca68e5d-s.woff2 +0 -0
  616. package/.next/static/media/a171b1d72388367c-s.woff2 +0 -0
  617. package/.next/static/media/a310fb84e6868735-s.woff2 +0 -0
  618. package/.next/static/media/a53504b22c396db6-s.woff2 +0 -0
  619. package/.next/static/media/aabb87babcdda375-s.woff2 +0 -0
  620. package/.next/static/media/afe75c8050c8fd4e-s.woff2 +0 -0
  621. package/.next/static/media/b201193f76404e13-s.woff2 +0 -0
  622. package/.next/static/media/b20daecae68a588f-s.p.woff2 +0 -0
  623. package/.next/static/media/b2574bc564dca98d-s.woff2 +0 -0
  624. package/.next/static/media/b6a1339c290590d0-s.woff2 +0 -0
  625. package/.next/static/media/b6fe4b2295863fe4-s.woff2 +0 -0
  626. package/.next/static/media/bb8ff9c700288292-s.woff2 +0 -0
  627. package/.next/static/media/bc1ccfae4ae17995-s.woff2 +0 -0
  628. package/.next/static/media/be15c189f996aeb2-s.woff2 +0 -0
  629. package/.next/static/media/c0d1f6928a1dbc31-s.woff2 +0 -0
  630. package/.next/static/media/c36d8bb68a53eb60-s.woff2 +0 -0
  631. package/.next/static/media/c5db947ee2561e06-s.woff2 +0 -0
  632. package/.next/static/media/c77ac7f613b44045-s.woff2 +0 -0
  633. package/.next/static/media/ca73d0c74010e612-s.woff2 +0 -0
  634. package/.next/static/media/cfbad6ceeeca5c58-s.woff2 +0 -0
  635. package/.next/static/media/d24aebb82f01e48d-s.woff2 +0 -0
  636. package/.next/static/media/d2c6107607eb7d44-s.woff2 +0 -0
  637. package/.next/static/media/d2c7d5e8db7ce20a-s.woff2 +0 -0
  638. package/.next/static/media/d51f7558abc55aa6-s.woff2 +0 -0
  639. package/.next/static/media/da718921282f76d0-s.woff2 +0 -0
  640. package/.next/static/media/dae37106d788c7c9-s.woff2 +0 -0
  641. package/.next/static/media/e0d4cd45847004a4-s.woff2 +0 -0
  642. package/.next/static/media/e100c7a7874aebd9-s.woff2 +0 -0
  643. package/.next/static/media/e26dff18031f4a7e-s.woff2 +0 -0
  644. package/.next/static/media/e54d16b9f2c4535b-s.woff2 +0 -0
  645. package/.next/static/media/e5b759c1d5c42d99-s.woff2 +0 -0
  646. package/.next/static/media/ea21a07081db26d0-s.woff2 +0 -0
  647. package/.next/static/media/eaee7682c49bd1c2-s.woff2 +0 -0
  648. package/.next/static/media/ec14413c594b3356-s.p.woff2 +0 -0
  649. package/.next/static/media/ec408158b9e08aea-s.woff2 +0 -0
  650. package/.next/static/media/ee5d9aad76ea4c0a-s.woff2 +0 -0
  651. package/.next/static/media/efdbc7cff3271ee9-s.woff2 +0 -0
  652. package/.next/static/media/f128be4e72405705-s.woff2 +0 -0
  653. package/.next/static/media/fb6cfff6119f26e8-s.woff2 +0 -0
  654. package/.next/static/media/fd516adbc3328c82-s.woff2 +0 -0
  655. package/LICENSE +21 -0
  656. package/README.ja.md +169 -0
  657. package/README.ko.md +183 -0
  658. package/README.md +183 -0
  659. package/README.zh-CN.md +169 -0
  660. package/bin/node-version.js +35 -0
  661. package/bin/omp-web-options.js +86 -0
  662. package/bin/omp-web-security.test.mjs +9 -0
  663. package/bin/omp-web.js +155 -0
  664. package/bin/port-availability.js +27 -0
  665. package/bin/process-lifecycle.js +71 -0
  666. package/bin/process-lifecycle.test.mjs +83 -0
  667. package/next.config.ts +91 -0
  668. package/package.json +82 -0
package/README.ko.md ADDED
@@ -0,0 +1,183 @@
1
+ # ompweb
2
+
3
+ [English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
4
+
5
+ [oh-my-pi (omp) 코딩 에이전트](https://github.com/can1357/oh-my-pi)를 위한 로컬 웹 UI입니다. ompweb은 로컬 omp 세션 파일을 읽어 브라우저에서 세션 탐색, 실시간 채팅, 모델 설정, 스킬 관리, 프로젝트 파일 미리보기를 제공하는 워크스페이스를 엽니다.
6
+
7
+ ![ompweb — 라이트 테마](docs/screenshot-light.png)
8
+
9
+ <details>
10
+ <summary>다크 테마</summary>
11
+
12
+ ![ompweb — 다크 테마](docs/screenshot-dark.png)
13
+
14
+ </details>
15
+
16
+ ## 요구 사항
17
+
18
+ - [omp](https://github.com/can1357/oh-my-pi)가 설치되어 `PATH`에 있어야 합니다(또는 `OMP_WEB_OMP_BIN`으로 바이너리를 지정).
19
+ - Node.js 22.19.0 이상(`node --version`)
20
+
21
+ ## 빠른 시작
22
+
23
+ **설치 없이 실행:**
24
+
25
+ ```bash
26
+ npx ompgui@latest
27
+ ```
28
+
29
+ **또는 전역 설치:**
30
+
31
+ ```bash
32
+ npm install -g ompgui
33
+ ompweb
34
+ ```
35
+
36
+ 그다음 [http://127.0.0.1:30177](http://127.0.0.1:30177)을 여세요. 서버가 준비되면 CLI가 브라우저를 자동으로 열려고 시도합니다. ompweb은 기본적으로 `127.0.0.1`에서 수신합니다.
37
+
38
+ **옵션:**
39
+
40
+ ```bash
41
+ ompweb --port 8080 # 포트 지정
42
+ ompweb --hostname 0.0.0.0 # 신뢰할 수 있는 네트워크에 노출
43
+ ompweb -p 8080 -H 0.0.0.0 # 옵션 조합
44
+ ompweb --no-open # 브라우저 자동 열기 안 함
45
+ ompweb --password "a-long-random-password" # POSIX 인라인 환경 변수 없이 비밀번호만으로 로그인
46
+
47
+ PORT=8080 ompweb # 환경 변수도 지원
48
+ OMP_WEB_HOSTNAME=0.0.0.0 ompweb # 네트워크에 명시적으로 노출
49
+ OMP_WEB_PASSWORD='a-long-random-password' ompweb # 환경 변수 방식(POSIX: 인라인 또는 export)
50
+ OMP_WEB_NO_OPEN=1 ompweb # 백그라운드 서비스로 실행할 때 유용
51
+
52
+ # Windows (PowerShell / CMD)
53
+ # $env:OMP_WEB_PASSWORD="a-long-random-password"; ompweb
54
+ # 또는
55
+ # ompweb --password "a-long-random-password"
56
+ ```
57
+
58
+ `OMP_WEB_PASSWORD`를 설정하거나 `--password`를 전달하면 테마가 적용된 비밀번호 전용 로그인 화면으로 인터페이스와 모든 API 엔드포인트를 보호합니다. 로그인에 성공하면 30일 동안 유효한 HTTP 전용 서명 세션 쿠키가 생성됩니다. 설정된 비밀번호를 변경하면 기존 세션이 무효화됩니다. 변수를 설정하지 않으면 인증이 비활성화됩니다. 원격 사용 시 비밀번호와 세션 쿠키가 가로채이지 않도록 신뢰할 수 있는 리버스 프록시나 VPN을 통해 HTTPS를 사용해야 합니다. Windows 환경 변수 문법은 `$env:OMP_WEB_PASSWORD="..."`이며, `ompweb --password "..."`는 별도 문법 없이 모든 셸에서 작동합니다.
59
+
60
+ ## 원격 및 모바일 접속 (Tailscale 권장)
61
+
62
+ 외부나 모바일 기기(iPhone, iPad, Android)에서 로컬 PC의 `ompweb`에 접속할 때는 **[Tailscale](https://tailscale.com/) 가상 사설망(VPN)을 사용하는 것을 강력히 권장**합니다. 포트 포워딩이나 공인 IP 노출 없이 종단간 암호화(P2P)를 통해 가장 안전하게 원격 접속할 수 있습니다.
63
+
64
+ ### 1. 비밀번호 설정 (보안 필수)
65
+
66
+ 외부 네트워크에 바인딩할 때는 인증 보호를 위해 반드시 비밀번호를 설정해야 합니다:
67
+
68
+ ```bash
69
+ # CLI 옵션으로 비밀번호 설정 및 전체 네트워크 바인딩
70
+ ompweb -H 0.0.0.0 --password "your-strong-password"
71
+
72
+ # 또는 환경 변수로 설정
73
+ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
74
+ ```
75
+
76
+ ### 2. Tailscale 연결 단계
77
+
78
+ 1. **Tailscale 설치**: 호스트 PC와 모바일 기기에 [Tailscale](https://tailscale.com/download)을 설치하고 동일한 계정으로 로그인합니다.
79
+ 2. **호스트 PC에서 ompweb 실행**:
80
+ ```bash
81
+ ompweb --hostname 0.0.0.0 --password "your-strong-password"
82
+ ```
83
+ 3. **모바일 브라우저에서 접속**:
84
+ - 호스트 PC의 Tailscale IP(예: `100.x.y.z`) 또는 MagicDNS 머신 이름으로 접속합니다:
85
+ ```text
86
+ http://100.x.y.z:30177
87
+ # 또는 MagicDNS 활성화 시
88
+ http://my-macbook:30177
89
+ ```
90
+ 4. **로그인**: 설정한 비밀번호를 입력하면 모바일에서도 안전하게 실시간 코딩 에이전트와 대화하고 작업할 수 있습니다.
91
+
92
+ ### 보안 및 문제 해결
93
+
94
+ - 서버는 기본적으로 `127.0.0.1`에 바인딩됩니다. 루프백이 아닌 호스트 이름은 명시적으로 선택해야 하며 신뢰할 수 있는 네트워크 경계 뒤에서만 사용하세요. ompweb을 공개적으로 노출하는 것은 안전하지 않습니다.
95
+ - 파일 API는 선택한 워크스페이스, 유효한 Git worktree, 세션에서 참조된 디렉터리, 명시적으로 선택한 루트만 허용합니다. 경로를 정규화하여 경로 탈출과 심볼릭 링크 탈출을 차단합니다.
96
+ - `omp`는 먼저 `OMP_WEB_OMP_BIN`, 다음으로 `PATH`에서 확인합니다. 실시간 채팅을 시작할 수 없으면 같은 터미널에서 `omp --version`을 실행하거나 실행 파일의 절대 경로를 `OMP_WEB_OMP_BIN`에 설정하세요.
97
+ - 세션 기록은 기본 OMP JSONL 형식으로 유지됩니다. 실시간 세션 쓰기는 OMP가 담당하며, ompweb은 직접 파일을 읽고 실시간 OMP 쓰기와 충돌하지 않을 때만 명시적인 제목·보관·삭제 작업을 수행합니다.
98
+ - 세션 보관은 OMP의 기본 `archive/sessions/<cwd>/<file>.jsonl.gz` 레이아웃을 사용하며, 트랜스크립트와 함께 관련 아티팩트를 이동합니다. 원본 JSONL 바이트는 gzip 안에 보존됩니다.
99
+
100
+ ## 기능
101
+
102
+ - **이전 작업 이어가기**: 터미널 기록이나 세션 경로를 뒤지지 않고 프로젝트별로 이전 omp 대화를 탐색합니다.
103
+ - **안전하게 다른 방향 시도하기**: 이전 메시지에서 계속하거나 세션을 별도 경로로 포크합니다.
104
+ - **깔끔한 사이드바 유지**: 기본 트랜스크립트를 삭제하지 않고 비활성 세션을 보관하거나, 더 이상 필요하지 않을 때 명시적으로 삭제합니다.
105
+ - **브랜치 간 작업**: 사이드바에서 Git worktree를 전환하면 새 세션과 Explorer가 선택한 체크아웃을 따릅니다.
106
+ - **프로젝트 옆에서 채팅**: 왼쪽에서 파일을 탐색하고 오른쪽에서 소스, 문서, 이미지, 오디오, PDF를 미리 보면서 에이전트의 작업을 확인합니다.
107
+ - **정확한 Markdown 미리보기**: YAML frontmatter를 요약 카드(제목 및 키/값 행)로 렌더링하고, 수식 펜스를 목록 안에서도 정렬하며, `5~7U` 같은 CJK 범위를 올바르게 표시합니다(GFM에서는 취소선에 이제 `~~`가 필요합니다).
108
+ - **Windows에서 자연스럽게 프로젝트 선택**: 파일 시스템 루트의 드라이브 선택기와 대소문자 무시·심볼릭 링크 인식 프로젝트 식별자로 드라이브와 worktree 사이에서도 사이드바를 안정적으로 유지합니다.
109
+ - **세션 상태 명확히 확인**: 상단 바에서 컨텍스트 사용량, 비용, 압축 상태, 시스템 프롬프트 세부 정보를 확인합니다.
110
+ - **터미널 설정 줄이기**: 웹 UI에서 모델, 로그인/API 키, 모델 테스트, OMP 기본 제어(어드바이저, 승인, Bash 정책, 추론, 압축, 메모리, 자동 학습, 재시도/폴백), 스킬, 플러그인, 프로젝트 MCP 서버를 관리합니다.
111
+ - **Settings에서 MCP 관리**: 전용 MCP 탭에서 설치된 프로젝트 서버의 상태(활성화/비활성화/잘못됨)를 확인하고 추가·편집·이름 변경·검증·삭제를 수행하며 설정 오류를 코너 토스트로 표시합니다.
112
+ - **OMP 최신 상태 유지**: Settings에서 설치된 런타임 버전을 확인하고 업데이트하거나 필요할 때 활성 세션을 재시작합니다.
113
+ - **완료 알림 받기**: 에이전트가 작업을 마치면 브라우저 알림을 받도록 선택하고 설치된 스킬의 업데이트를 확인합니다.
114
+ - **⌘K로 어디서든 이동**: 명령 팔레트(⌘K / Ctrl+K)로 세션 전환, 새 세션 시작, 테마 변경을 수행합니다.
115
+ - **따뜻한 종이 느낌의 디자인**: 세리프 디스플레이 글꼴과 WCAG AA 검증 대비를 사용하는 라이트/다크 테마를 토큰 기반 UI 키트(Base UI primitives, cmdk, lucide 아이콘)로 구현했습니다.
116
+
117
+ ## 설정
118
+
119
+ | 변수 | 의미 |
120
+ | --- | --- |
121
+ | `PORT` | 서버 포트(기본 `30177`; `-p/--port`가 우선) |
122
+ | `OMP_WEB_HOSTNAME` | 바인딩할 호스트 이름(기본 `127.0.0.1`; `-H/--hostname`이 우선) |
123
+ | `OMP_WEB_PASSWORD` / `--password` | 로그인 화면의 비밀번호. `--password`는 PowerShell/CMD에서도 `$env:` 문법 없이 사용 가능 |
124
+ | `OMP_WEB_NO_OPEN` | `1` 또는 `true`로 설정하면 브라우저 자동 열기 건너뜀 |
125
+ | `OMP_WEB_OMP_BIN` | `PATH`에 `omp`가 없을 때 사용할 절대 경로 |
126
+ | `PI_CODING_AGENT_DIR` | 다른 omp 에이전트 디렉터리 지정(기본 `~/.omp/agent`) |
127
+ | `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 서버 측 요청에 사용하는 표준 프록시 변수 |
128
+
129
+ ## 아키텍처
130
+
131
+ ompweb은 Node가 호스팅하는 Next.js 앱으로, 설치된 `omp` 바이너리를 구동합니다. 에이전트를 내장하지 않습니다.
132
+
133
+ - **실시간 세션**: `omp --mode rpc-ui`(stdio 기반 NDJSON)를 실행하며 활성 세션마다 자식 프로세스를 하나씩 사용합니다. 설치된 OMP가 RPC v2를 알리면 v2를 협상하고, 큰 프레임은 제한된 청크 재조립을 사용하며, 구버전은 v1로 폴백합니다. 실행 전 호스트 환경(`PORT`, `NEXT_*`, `NODE_ENV`)을 제거하고 POSIX(프로세스 그룹)와 Windows(`taskkill /t`) 모두 정상 종료를 지원합니다.
134
+ - **세션 탐색**: omp 세션 파일(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`)을 직접 읽습니다. 제목·보관·삭제는 실시간 OMP 쓰기를 보호하는 제한적인 기본 파일 유지보수 작업입니다. 프로젝트는 안정적인 `projectKey`(Windows 대소문자 무시, 심볼릭 링크 해석)로 묶어 사이드바가 드라이브나 worktree 사이에서 이동하지 않게 합니다.
135
+ - **모델 및 인증**: 엄격한 페이로드 검증(알 수 없는 형태 차단, 안전한 폴백)을 적용한 RPC 명령으로 omp 자식 프로세스와 통신합니다. Models 패널은 omp 에이전트 디렉터리의 `models.yml`을 편집하며 빈 자리 행을 제거하고 모호한 `enabledModels` 항목을 거부합니다.
136
+ - **기본 설정**: General/MCP 설정 패널은 `~/.omp/agent/config.yml`(또는 `config.yaml` 폴백)의 허용 목록에 포함된 항목을 읽고 씁니다. 관련 없는 키와 주석은 보존하며 변경 사항은 새 세션과 재시작한 세션에 적용됩니다.
137
+ - **스킬 및 플러그인**: omp 스킬 디렉터리(`~/.omp/agent/skills`, 프로젝트 `.omp/skills`, 호환 디렉터리)를 검색하고 플러그인 관리는 `omp plugin`을 호출합니다.
138
+ - **MCP 서버**: 프로젝트 서버는 Git 최상위의 OMP 기본 위치(`.omp/mcp.json`, 이후 호환 파일)를 통해 관리하며 stdio/http/sse 스키마를 검증하고 원자적으로 기록합니다.
139
+ - **파일 접근**: 파일 탐색과 미리보기는 선택한 프로젝트 디렉터리 및 세션에 나타난 작업 디렉터리로 제한됩니다. `isWindowsAbsolutePath`/`samePath` 단일 헬퍼로 경로를 정규화하고 `realpath` 해석 뒤 심볼릭 링크 탈출을 거부합니다. Windows에서는 루트에서 드라이브 목록을 제공하는 디렉터리 선택기를 사용합니다.
140
+ - **포크와 세션 내 브랜치**: 포크는 새 `.jsonl` 파일을 만듭니다. “여기서 편집”은 같은 세션 파일 안에 다른 브랜치를 만듭니다.
141
+
142
+ ## 개발
143
+
144
+ ```bash
145
+ npm install
146
+ npm run dev
147
+ ```
148
+
149
+ 로컬 개발 서버는 [http://127.0.0.1:30178](http://127.0.0.1:30178)에서 실행됩니다.
150
+
151
+ 일반적인 검사:
152
+
153
+ ```bash
154
+ npm run typecheck # 타입 검사
155
+ npm run lint # ESLint(경고 0개 적용)
156
+ npm test # 테스트 스위트 실행
157
+ npm run build # 프로덕션 빌드
158
+ ```
159
+
160
+ 로컬 개발 중에는 `next build`/`npm run build`를 실행하지 마세요. `.next/`에 기록하여 개발 서버에 간섭할 수 있으므로 빌드는 릴리스 작업으로 남겨 두세요.
161
+
162
+ ## 국제화
163
+
164
+ ompweb은 영어, 중국어 간체(简体中文), 일본어(日本語), 한국어(한국어)를 지원하며 모든 언어에서 전체 UI 문자열을 번역합니다. 언어는 `navigator.language`에서 자동 감지하고 상단 바의 언어 메뉴에서 실행 중 전환할 수 있습니다. 선택한 언어는 세션 간 유지됩니다.
165
+
166
+ - 사전: `lib/i18n/locales/{en,zh-CN,ja,ko}.json`
167
+ - 프레임워크: `lib/i18n/index.tsx` — `{var}` 보간과 복수형(`.one`/`.other`)을 지원하는 `useSyncExternalStore` 기반 경량 스토어
168
+ - API 오류 메시지: 안정적인 오류 코드(`errors.<code>`)를 클라이언트에서 조회해 번역
169
+
170
+ ## 품질
171
+
172
+ - **접근성**: WCAG AA 준수 — Lighthouse 접근성 점수 100/100, 전면 키보드 탐색, focus-visible 링, ARIA 역할
173
+ - **성능**: 메모이제이션된 목록 컴포넌트, RAF로 제한한 스크롤/마우스 핸들러, 디바운스 검색, 스트리밍 JSONL 리더, ETag 캐시 세션 목록
174
+ - **복원력**: omp 자식 프로세스의 정상 종료(프로세스 그룹 종료), 오류 경계, 원자적 세션 파일 재작성
175
+ - **테스트**: 세션 파싱, 터미널 입력, Markdown 렌더링, 메시지 표시, 기본 설정, MCP 구성을 다루는 집중 테스트 스위트
176
+
177
+ ## 크레딧
178
+
179
+ ompweb은 [earendil-works/pi](https://github.com/earendil-works/pi) pi 코딩 에이전트의 웹 UI인 [agegr/pi-web](https://github.com/agegr/pi-web)(MIT)을 포크하여 [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi)에 맞게 수정한 프로젝트입니다.
180
+
181
+ ## 라이선스
182
+
183
+ MIT
package/README.md ADDED
@@ -0,0 +1,183 @@
1
+ # ompweb
2
+
3
+ [English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
4
+
5
+ Local web UI for the [oh-my-pi (omp) coding agent](https://github.com/can1357/oh-my-pi). ompweb reads your local omp session files and gives you a browser workspace for session browsing, real-time chat, model configuration, skill management, and project file preview.
6
+
7
+ ![ompweb — light theme](docs/screenshot-light.png)
8
+
9
+ <details>
10
+ <summary>Dark theme</summary>
11
+
12
+ ![ompweb — dark theme](docs/screenshot-dark.png)
13
+
14
+ </details>
15
+
16
+ ## Requirements
17
+
18
+ - [omp](https://github.com/can1357/oh-my-pi) installed and on your `PATH` (or point `OMP_WEB_OMP_BIN` at the binary)
19
+ - Node.js 22.19.0 or newer (`node --version`)
20
+
21
+ ## Quick Start
22
+
23
+ **Run without installing:**
24
+
25
+ ```bash
26
+ npx ompgui@latest
27
+ ```
28
+
29
+ **Or install globally:**
30
+
31
+ ```bash
32
+ npm install -g ompgui
33
+ ompweb
34
+ ```
35
+
36
+ Then open [http://127.0.0.1:30177](http://127.0.0.1:30177). The CLI will try to open the browser automatically after the server is ready. ompweb listens on `127.0.0.1` by default.
37
+
38
+ **Options:**
39
+
40
+ ```bash
41
+ ompweb --port 8080 # custom port
42
+ ompweb --hostname 0.0.0.0 # expose on a trusted network
43
+ ompweb -p 8080 -H 0.0.0.0 # combine options
44
+ ompweb --no-open # do not open the browser automatically
45
+ ompweb --password "a-long-random-password" # password-only sign-in without POSIX inline-env syntax
46
+
47
+ PORT=8080 ompweb # environment variable is also supported
48
+ OMP_WEB_HOSTNAME=0.0.0.0 ompweb # explicit network exposure
49
+ OMP_WEB_PASSWORD='a-long-random-password' ompweb # env-variable form (POSIX: inline or exported)
50
+ OMP_WEB_NO_OPEN=1 ompweb # useful when running as a background service
51
+
52
+ # Windows (PowerShell / CMD)
53
+ # $env:OMP_WEB_PASSWORD="a-long-random-password"; ompweb
54
+ # or
55
+ # ompweb --password "a-long-random-password"
56
+ ```
57
+
58
+ Set `OMP_WEB_PASSWORD` (or pass `--password`) to protect the interface and every API endpoint with a themed, password-only sign-in screen. A successful sign-in creates an HTTP-only signed session cookie for 30 days; changing the configured password invalidates existing sessions. Leaving the variable unset disables authentication. Remote use still requires HTTPS through a trusted reverse proxy or VPN so the password and session cookie cannot be intercepted. On Windows the env-variable syntax is `$env:OMP_WEB_PASSWORD="..."`; `ompweb --password "..."` works in every shell without that extra step.
59
+
60
+ ## Remote & Mobile Access (Tailscale Recommended)
61
+
62
+ For accessing `ompweb` from mobile devices (iPhone, iPad, Android) or external laptops, **using [Tailscale](https://tailscale.com/) is strongly recommended**. Tailscale creates a private, point-to-point WireGuard mesh VPN between your devices without exposing your host machine to the public internet or requiring port forwarding.
63
+
64
+ ### 1. Configure Password (Required for Remote Access)
65
+
66
+ When binding to external network interfaces, setting a password is required to secure the workspace:
67
+
68
+ ```bash
69
+ # CLI option: bind to all interfaces with a password
70
+ ompweb -H 0.0.0.0 --password "your-strong-password"
71
+
72
+ # Or via environment variables
73
+ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
74
+ ```
75
+
76
+ ### 2. Steps to Connect via Tailscale
77
+
78
+ 1. **Install Tailscale**: Download and sign into [Tailscale](https://tailscale.com/download) on both your host machine and your mobile device using the same account.
79
+ 2. **Start ompweb on your host machine**:
80
+ ```bash
81
+ ompweb --hostname 0.0.0.0 --password "your-strong-password"
82
+ ```
83
+ 3. **Access from your mobile browser**:
84
+ - Navigate to your host's Tailscale IP (e.g. `100.x.y.z`) or MagicDNS machine name:
85
+ ```text
86
+ http://100.x.y.z:30177
87
+ # Or with MagicDNS enabled:
88
+ http://my-macbook:30177
89
+ ```
90
+ 4. **Log in**: Enter your configured password to securely control and chat with your coding agent on mobile.
91
+
92
+ ### Security and troubleshooting
93
+
94
+ - The server binds to `127.0.0.1` by default. A non-loopback hostname is an explicit opt-in and should only be used behind a trusted network boundary; ompweb is not safe to expose publicly.
95
+ - File APIs are allow-listed to the selected workspace, its valid Git worktrees, session-referenced directories, and explicitly selected roots. Paths are canonicalized to reject traversal and symlink escapes.
96
+ - `omp` is resolved from `OMP_WEB_OMP_BIN` first, then `PATH`. If live chat cannot start, run `omp --version` in the same terminal or set `OMP_WEB_OMP_BIN` to the executable's absolute path.
97
+ - Session history remains native OMP JSONL. OMP owns live-session writes; ompweb reads the files directly and only performs explicit title, archive, and delete maintenance when it is not racing a live OMP write.
98
+ - Session archive uses OMP's native `archive/sessions/<cwd>/<file>.jsonl.gz` layout and moves sibling artifacts with the transcript; the original JSONL bytes are preserved inside the gzip.
99
+
100
+ ## Features
101
+
102
+ - **Pick work back up**: browse previous omp conversations by project without digging through terminal history or session paths.
103
+ - **Try different directions safely**: continue from an earlier message or fork a session into a separate route.
104
+ - **Keep the sidebar tidy**: archive an inactive session without deleting its native transcript, or delete it explicitly when it is no longer needed.
105
+ - **Work across branches**: switch Git worktrees from the sidebar so new sessions and the Explorer follow the checkout you choose.
106
+ - **Chat beside the project**: browse files on the left and preview source, docs, images, audio, and PDFs on the right while the agent works.
107
+ - **Preview markdown faithfully**: YAML frontmatter renders in a summary card (title + key/value rows), math fences stay aligned inside lists, and CJK ranges like `5~7U` are no longer mangled (GFM now requires `~~` for strikethrough).
108
+ - **Pick projects naturally on Windows**: a drive picker at the filesystem root and a case-folded, symlink-aware project identity keep the sidebar stable across drives and worktrees.
109
+ - **See session state clearly**: context usage, cost, compaction state, and system prompt details are visible from the top bar.
110
+ - **Configure less from the terminal**: manage models, login/API keys, model tests, native OMP controls (advisor, approval, Bash policy, thinking, compaction, memory, auto-learn, retry/fallback), skills, plugins, and project MCP servers from the web UI.
111
+ - **MCP management in Settings**: a dedicated MCP tab lists installed project servers with status (enabled / disabled / invalid), supports add/edit/rename/validate/remove, and surfaces configuration failures as corner toasts.
112
+ - **Keep OMP current**: check the installed runtime version, update it, and restart active sessions from Settings when needed.
113
+ - **Stay informed**: opt into browser notifications when an agent finishes, and check installed skills for updates.
114
+ - **Jump anywhere with ⌘K**: a command palette (⌘K / Ctrl+K) for switching sessions, starting new ones, and toggling the theme.
115
+ - **Warm, paper-like design**: light and dark themes with serif display type and WCAG AA-verified contrast, built on a token-driven UI kit (Base UI primitives, cmdk, lucide icons).
116
+
117
+ ## Configuration
118
+
119
+ | Variable | Meaning |
120
+ | --- | --- |
121
+ | `PORT` | Server port (default `30177`; `-p/--port` wins) |
122
+ | `OMP_WEB_HOSTNAME` | Bind hostname (default `127.0.0.1`; `-H/--hostname` wins) |
123
+ | `OMP_WEB_PASSWORD` / `--password` | Password for the sign-in screen; `--password` works in every shell (PowerShell/CMD) without ` $env:` syntax |
124
+ | `OMP_WEB_NO_OPEN` | Set to `1`/`true` to skip auto-opening the browser |
125
+ | `OMP_WEB_OMP_BIN` | Absolute path to the `omp` binary when it is not on `PATH` |
126
+ | `PI_CODING_AGENT_DIR` | Point at another omp agent directory (default `~/.omp/agent`) |
127
+ | `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | Standard proxy variables for server-side requests |
128
+
129
+ ## Architecture
130
+
131
+ ompweb is a Node-hosted Next.js app that drives your installed `omp` binary — it does not embed the agent:
132
+
133
+ - **Live sessions**: spawns `omp --mode rpc-ui` (NDJSON over stdio), one child process per active session, so the agent version is always exactly what you have installed. It negotiates RPC v2 when the installed OMP advertises it, uses bounded chunk reassembly for large frames, and falls back to v1 for older versions. Host env (`PORT`, `NEXT_*`, `NODE_ENV`) is stripped before spawn, and shutdown is graceful on both POSIX (process-group) and Windows (`taskkill /t`).
134
+ - **Session browsing**: reads omp's session files (`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`) directly; title, archive, and delete are narrow native-file maintenance operations guarded against live OMP writes. Projects are grouped by a stable `projectKey` (Windows case-folded, symlink-resolved) so the sidebar doesn't jump between drives or worktrees.
135
+ - **Models and auth**: RPC commands against the omp child process with strict payload validation (unknown-shape guards, safe fallbacks); the Models panel edits `models.yml` in the omp agent directory, dropping blank placeholder rows and rejecting ambiguous `enabledModels` entries.
136
+ - **Native settings**: the General/MCP settings panels read and write the allow-listed subset of `~/.omp/agent/config.yml` (or `config.yaml` fallback), preserving unrelated keys and comments. Changes apply to new and restarted sessions.
137
+ - **Skills and plugins**: scans omp's skill directories (`~/.omp/agent/skills`, project `.omp/skills`, and compat dirs) and shells out to `omp plugin` for plugin management.
138
+ - **MCP servers**: project servers are managed through OMP's native locations (`.omp/mcp.json`, then compatibility files) at the git top level, validated against the stdio/http/sse schema and written atomically.
139
+ - **File access**: file browsing and preview are scoped to the selected project directory and working directories that appear in sessions; paths are canonicalized via a single `isWindowsAbsolutePath`/`samePath` helper and symlink escapes are rejected after `realpath` resolution. On Windows the directory picker offers a drive list at the root.
140
+ - **Forks vs in-session branches**: Fork creates a new `.jsonl` file. "Edit from here" creates another branch inside the same session file.
141
+
142
+ ## Development
143
+
144
+ ```bash
145
+ npm install
146
+ npm run dev
147
+ ```
148
+
149
+ The local dev server runs at [http://127.0.0.1:30178](http://127.0.0.1:30178).
150
+
151
+ Common checks:
152
+
153
+ ```bash
154
+ npm run typecheck # type check
155
+ npm run lint # ESLint (zero warnings enforced)
156
+ npm test # run test suite
157
+ npm run build # production build
158
+ ```
159
+
160
+ Avoid running `next build` / `npm run build` during local development. It writes to `.next/` and can interfere with the dev server; leave builds for release work.
161
+
162
+ ## Internationalization
163
+
164
+ ompweb supports English, Simplified Chinese (简体中文), Japanese (日本語), and Korean (한국어) with translated UI strings across all languages. The language is auto-detected from `navigator.language` and can be switched at runtime via the language menu in the top bar. The choice persists across sessions.
165
+
166
+ - Dictionaries: `lib/i18n/locales/{en,zh-CN,ja,ko}.json`
167
+ - Framework: `lib/i18n/index.tsx` — a lightweight store built on `useSyncExternalStore` with `{var}` interpolation and plural support (`.one`/`.other`)
168
+ - API error messages are translated via stable error codes (`errors.<code>`) looked up client-side
169
+
170
+ ## Quality
171
+
172
+ - **Accessibility**: WCAG AA compliant — Lighthouse a11y score 100/100, keyboard navigation throughout, focus-visible rings, ARIA roles
173
+ - **Performance**: memoized list components, RAF-gated scroll/mouse handlers, debounced search, streaming JSONL reader, ETag-cached session listing
174
+ - **Resilience**: graceful shutdown of spawned omp processes (process-group kill), error boundaries, atomic session file rewrites
175
+ - **Tests**: a focused test suite covering session parsing, terminal input, markdown rendering, message display, native settings, and MCP configuration
176
+
177
+ ## Credits
178
+
179
+ ompweb is a fork of [agegr/pi-web](https://github.com/agegr/pi-web) (MIT), the web UI for the [earendil/pi-mono](https://github.com/earendil-works/pi) pi coding agent, adapted for [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi).
180
+
181
+ ## License
182
+
183
+ MIT
@@ -0,0 +1,169 @@
1
+ # ompweb
2
+
3
+ [English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
4
+
5
+ [oh-my-pi (omp) 编程智能体](https://github.com/can1357/oh-my-pi)的本地 Web UI。ompweb 读取本机的 omp 会话文件,在浏览器中提供一个工作区,支持会话浏览、实时对话、模型配置、技能管理和项目文件预览。
6
+
7
+ ![ompweb — 浅色主题](docs/screenshot-light.png)
8
+
9
+ <details>
10
+ <summary>深色主题与命令面板</summary>
11
+
12
+ ![ompweb — 深色主题](docs/screenshot-dark.png)
13
+
14
+ ![ompweb — 命令面板](docs/screenshot-palette.png)
15
+
16
+ </details>
17
+
18
+ ## 环境要求
19
+
20
+ - 已安装 [omp](https://github.com/can1357/oh-my-pi) 且在 `PATH` 中(或通过 `OMP_WEB_OMP_BIN` 指向其二进制文件)
21
+ - Node.js 22.19.0 或更高版本(`node --version`)
22
+
23
+ ## 快速开始
24
+
25
+ **无需安装直接运行:**
26
+
27
+ ```bash
28
+ npx ompgui@latest
29
+ ```
30
+
31
+ **或全局安装:**
32
+
33
+ ```bash
34
+ npm install -g ompgui
35
+ ompweb
36
+ ```
37
+
38
+ 然后打开 [http://127.0.0.1:30177](http://127.0.0.1:30177)。服务器就绪后,CLI 会尝试自动打开浏览器。ompweb 默认监听 `127.0.0.1`。
39
+
40
+ **选项:**
41
+
42
+ ```bash
43
+ ompweb --port 8080 # 自定义端口
44
+ ompweb --hostname 0.0.0.0 # 在可信网络中暴露服务
45
+ ompweb -p 8080 -H 0.0.0.0 # 组合使用
46
+ ompweb --no-open # 不自动打开浏览器
47
+
48
+ ompweb --password "a-long-random-password" # 启用仅密码登录(Windows 同样适用)
49
+
50
+ PORT=8080 ompweb # 也支持环境变量
51
+ OMP_WEB_HOSTNAME=0.0.0.0 ompweb # 显式暴露到网络
52
+ OMP_WEB_PASSWORD='a-long-random-password' ompweb # 环境变量形式(POSIX)
53
+ # Windows: $env:OMP_WEB_PASSWORD="secret"; ompweb
54
+ OMP_WEB_NO_OPEN=1 ompweb # 作为后台服务运行时很有用
55
+ ```
56
+
57
+ 设置 `OMP_WEB_PASSWORD` 可通过与主题集成的仅密码登录页面保护界面和所有 API 端点。登录成功后,会创建有效期为 30 天的 HTTP-only 签名会话 Cookie;留空则关闭认证。远程访问仍需通过受信任反向代理或 VPN 提供 HTTPS,以保护密码和会话 Cookie。默认仅监听 `127.0.0.1`;不要将 ompweb 直接暴露到互联网。
58
+
59
+ ## 远程与移动端访问(推荐使用 Tailscale)
60
+
61
+ 从移动设备(iPhone、iPad、Android)或外部笔记本访问 `ompweb` 时,**强烈推荐使用 [Tailscale](https://tailscale.com/) 虚拟专用网(VPN)**。它通过端到端加密的点对点 Mesh 网络连接设备,无需端口转发或暴露公网 IP。
62
+
63
+ ### 1. 配置访问密码(远程访问必备)
64
+
65
+ 当绑定到外部网络接口时,必须配置密码以保护工作区:
66
+
67
+ ```bash
68
+ # CLI 选项:绑定到所有网络接口并设置密码
69
+ ompweb -H 0.0.0.0 --password "your-strong-password"
70
+
71
+ # 或通过环境变量设置
72
+ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
73
+ ```
74
+
75
+ ### 2. Tailscale 连接步骤
76
+
77
+ 1. **安装 Tailscale**:在宿主电脑和移动设备上安装 [Tailscale](https://tailscale.com/download) 并登录同一账户。
78
+ 2. **在宿主电脑上启动 ompweb**:
79
+ ```bash
80
+ ompweb --hostname 0.0.0.0 --password "your-strong-password"
81
+ ```
82
+ 3. **在移动端浏览器中访问**:
83
+ - 访问宿主电脑的 Tailscale IP(如 `100.x.y.z`)或 MagicDNS 机器名:
84
+ ```text
85
+ http://100.x.y.z:30177
86
+ # 或启用 MagicDNS 时
87
+ http://my-macbook:30177
88
+ ```
89
+ 4. **登录**:输入设置的密码即可在移动设备上安全地与编程智能体进行实时交互与操作。
90
+
91
+ ## 功能特性
92
+
93
+ - **随时接续之前的工作**:按项目浏览以往的 omp 对话,不必翻找终端历史或会话文件路径。
94
+ - **放心尝试不同方向**:从更早的消息继续,或将会话分叉为一条独立路线。
95
+ - **整理侧边栏**:归档不活跃会话而不删除原生记录,或在不再需要时明确删除。
96
+ - **跨分支工作**:在侧边栏切换 Git 工作树,新会话和资源管理器都会跟随你选择的检出。
97
+ - **边看项目边聊天**:左侧浏览文件,右侧预览源码、文档、图片、音频和 PDF,同时智能体继续工作。
98
+ - **清晰掌握会话状态**:上下文用量、费用、压缩上下文状态和系统提示词详情都显示在顶栏。
99
+ - **减少对终端配置的依赖**:在 Web UI 中管理模型、登录/API 密钥、模型测试、原生 OMP 控制(顾问、审批、Bash 策略、思考、压缩、记忆、自动学习、重试/回退)、技能、插件和项目 MCP 服务器。
100
+ - **在设置中管理 MCP**:专用 MCP 标签页显示项目服务器状态(已启用 / 已禁用 / 无效),支持添加、编辑、重命名、校验和删除,并通过角落提示显示配置失败。
101
+ - **保持 OMP 为最新版本**:可在设置中检查已安装运行时、更新它,并按需重启活动会话。
102
+ - **及时获知完成状态**:可选择在智能体完成时接收浏览器通知,并检查已安装技能的更新。
103
+ - **⌘K 随处跳转**:命令面板(⌘K / Ctrl+K)支持切换会话、新建会话和切换主题。
104
+ - **温暖的纸感设计**:浅色/深色双主题,衬线展示字体,对比度经 WCAG AA 验证,基于令牌驱动的 UI 套件(Base UI 基元、cmdk、lucide 图标)构建。
105
+
106
+ ## 配置
107
+
108
+ | 变量 | 含义 |
109
+ | --- | --- |
110
+ | `PORT` | 服务器端口(默认 `30177`;`-p/--port` 优先) |
111
+ | `OMP_WEB_HOSTNAME` | 绑定主机名(默认 `127.0.0.1`;`-H/--hostname` 优先) |
112
+ | `OMP_WEB_PASSWORD` | 登录页面使用的可选密码 |
113
+ | `OMP_WEB_NO_OPEN` | 设为 `1`/`true` 可跳过自动打开浏览器 |
114
+ | `OMP_WEB_OMP_BIN` | `omp` 不在 `PATH` 中时,指向其二进制文件的绝对路径 |
115
+ | `PI_CODING_AGENT_DIR` | 指向其他 omp agent 目录(默认 `~/.omp/agent`) |
116
+ | `HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` | 服务器端请求使用的标准代理变量 |
117
+
118
+ ## 架构
119
+
120
+ ompweb 是一个由 Node 托管的 Next.js 应用,驱动你已安装的 `omp` 二进制文件——它并不内嵌智能体:
121
+
122
+ - **实时会话**:启动 `omp --mode rpc-ui`(基于 stdio 的 NDJSON),每个活动会话对应一个子进程,因此智能体版本始终与你安装的完全一致。
123
+ - **会话浏览**:直接读取 omp 的会话文件(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`);标题、归档和删除是受保护的原生文件维护操作,不会与 OMP 的实时写入竞争。
124
+ - **模型与认证**:通过 RPC 命令与 omp 子进程交互;模型面板编辑 omp agent 目录中的 `models.yml`。
125
+ - **技能与插件**:扫描 omp 的技能目录(`~/.omp/agent/skills`、项目内 `.omp/skills` 及兼容目录),并调用 `omp plugin` 进行插件管理。
126
+ - **文件访问**:文件浏览与预览仅限于所选项目目录以及会话中出现过的工作目录。
127
+ - **分叉与会话内分支**:分叉会创建新的 `.jsonl` 文件;“从此处编辑”则在同一会话文件内创建另一个分支。
128
+
129
+ ## 开发
130
+
131
+ ```bash
132
+ npm install
133
+ npm run dev
134
+ ```
135
+
136
+ 本地开发服务器运行在 [http://127.0.0.1:30177](http://127.0.0.1:30177)。
137
+
138
+ 常用检查:
139
+
140
+ ```bash
141
+ npx tsc --noEmit # 类型检查
142
+ npm run lint # ESLint(零警告)
143
+ node --test lib/*.test.mjs components/*.test.mjs # 运行测试
144
+ ```
145
+
146
+ 本地开发时请避免运行 `next build` / `npm run build`。它会写入 `.next/`,可能干扰开发服务器;构建请留到发布阶段。
147
+
148
+ ## 多语言支持
149
+
150
+ ompweb 支持英语、简体中文、日本語和韩语(한국어),四种语言均覆盖整个界面的翻译字符串。语言从 `navigator.language` 自动检测,可通过顶栏的语言菜单在运行时切换。选择会跨会话持久化。
151
+
152
+ - 字典文件:`lib/i18n/locales/{en,zh-CN,ja,ko}.json`
153
+ - 框架:`lib/i18n/index.tsx` — 基于 `useSyncExternalStore` 的轻量 store,支持 `{var}` 插值和复数形式(`.one`/`.other`)
154
+ - API 错误消息通过稳定的错误码(`errors.<code>`)在客户端翻译
155
+
156
+ ## 质量
157
+
158
+ - **可访问性**:符合 WCAG AA 标准 — Lighthouse 可访问性评分 100/100,全键盘导航,焦点可见环,ARIA 角色
159
+ - **性能**:列表组件 memo 化、RAF 节流滚动/鼠标处理、防抖搜索、流式 JSONL 读取器、ETag 缓存会话列表
160
+ - **健壮性**:优雅关闭 omp 子进程(进程组杀死)、错误边界、原子化会话文件重写
161
+ - **测试**:聚焦的测试套件覆盖会话解析、终端输入、Markdown 渲染、消息展示、原生设置和 MCP 配置
162
+
163
+ ## 致谢
164
+
165
+ ompweb 分叉自 [agegr/pi-web](https://github.com/agegr/pi-web)(MIT)——[badlogic/pi-mono](https://github.com/badlogic/pi-mono) pi 编程智能体的 Web UI,并针对 [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) 进行了适配。
166
+
167
+ ## 许可证
168
+
169
+ MIT
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ const MIN_NODE_VERSION = "22.19.0";
4
+
5
+ function parseNodeVersion(version) {
6
+ const match = /^v?(\d+)\.(\d+)\.(\d+)/.exec(version);
7
+ if (!match) return null;
8
+ return match.slice(1).map(Number);
9
+ }
10
+
11
+ function isNodeVersionSupported(version) {
12
+ const current = parseNodeVersion(version);
13
+ const minimum = parseNodeVersion(MIN_NODE_VERSION);
14
+ if (!current || !minimum) return false;
15
+
16
+ for (let index = 0; index < minimum.length; index += 1) {
17
+ if (current[index] > minimum[index]) return true;
18
+ if (current[index] < minimum[index]) return false;
19
+ }
20
+ return true;
21
+ }
22
+
23
+ function getUnsupportedNodeVersionMessage(version) {
24
+ return [
25
+ `ompweb requires Node.js ${MIN_NODE_VERSION} or newer.`,
26
+ `Current Node.js version: ${version}.`,
27
+ "Upgrade Node.js and try again: https://nodejs.org/",
28
+ ].join("\n");
29
+ }
30
+
31
+ module.exports = {
32
+ MIN_NODE_VERSION,
33
+ getUnsupportedNodeVersionMessage,
34
+ isNodeVersionSupported,
35
+ };
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
4
+ const { parseArgs } = require("util");
5
+
6
+ const TRUE_VALUES = new Set(["1", "true", "yes", "on"]);
7
+
8
+ function isEnabled(value) {
9
+ return typeof value === "string" && TRUE_VALUES.has(value.trim().toLowerCase());
10
+ }
11
+
12
+
13
+ function printHelp() {
14
+ console.log(`Usage: ompweb [options]
15
+
16
+ Options:
17
+ -p, --port <port> Server port (default 30177, env PORT)
18
+ -H, --hostname <host> Bind hostname (default 127.0.0.1, env OMP_WEB_HOSTNAME)
19
+ --password <pass> Password for the web sign-in screen (env OMP_WEB_PASSWORD)
20
+ --no-open Do not open the browser automatically
21
+ -h, --help Show this help
22
+ --version Show version
23
+
24
+ Password:
25
+ ompweb --password "a-long-random-password"
26
+ # env-variable forms (POSIX, PowerShell, CMD handled uniformly)
27
+ OMP_WEB_PASSWORD="secret" ompweb
28
+ $env:OMP_WEB_PASSWORD="secret"; ompweb # PowerShell
29
+ set OMP_WEB_PASSWORD=secret&& ompweb # CMD
30
+
31
+ Security: use HTTPS via a trusted reverse proxy or VPN when binding to a
32
+ non-loopback hostname, so the password and session cookie stay private.`);
33
+ }
34
+
35
+ function parseLaunchOptions(args = process.argv.slice(2), env = process.env) {
36
+ const { values: cliArgs } = parseArgs({
37
+ args,
38
+ options: {
39
+ port: { type: "string", short: "p" },
40
+ hostname: { type: "string", short: "H" },
41
+ password: { type: "string" },
42
+ help: { type: "boolean", short: "h" },
43
+ version: { type: "boolean" },
44
+ "no-open": { type: "boolean" },
45
+ },
46
+ strict: false,
47
+ });
48
+
49
+ // --password wins over env so Windows users without POSIX inline-env syntax have a first-class option.
50
+ const password = cliArgs.password ?? env.OMP_WEB_PASSWORD;
51
+ if (cliArgs.version) {
52
+ try {
53
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
54
+ const pkg = require("../package.json");
55
+ console.log(pkg.version ?? "0.0.0");
56
+ } catch { console.log("0.0.0"); }
57
+ return {
58
+ port: cliArgs.port ?? env.PORT ?? "30177",
59
+ hostname: cliArgs.hostname ?? env.OMP_WEB_HOSTNAME ?? "127.0.0.1",
60
+ password,
61
+ openBrowser: !cliArgs["no-open"] && !isEnabled(env.OMP_WEB_NO_OPEN),
62
+ version: true,
63
+ };
64
+ }
65
+ // Expose help flag without exiting here — caller (bin/omp-web.js) decides
66
+ // whether to exit, keeping parseLaunchOptions testable. Print here so
67
+ // --help works even when the caller is a test.
68
+ if (cliArgs.help) {
69
+ printHelp();
70
+ return {
71
+ port: cliArgs.port ?? env.PORT ?? "30177",
72
+ hostname: cliArgs.hostname ?? env.OMP_WEB_HOSTNAME ?? "127.0.0.1",
73
+ password,
74
+ openBrowser: !cliArgs["no-open"] && !isEnabled(env.OMP_WEB_NO_OPEN),
75
+ help: true,
76
+ };
77
+ }
78
+ return {
79
+ port: cliArgs.port ?? env.PORT ?? "30177",
80
+ hostname: cliArgs.hostname ?? env.OMP_WEB_HOSTNAME ?? "127.0.0.1",
81
+ password,
82
+ openBrowser: !cliArgs["no-open"] && !isEnabled(env.OMP_WEB_NO_OPEN),
83
+ };
84
+ }
85
+
86
+ module.exports = { parseLaunchOptions };