ompgui 0.4.0 → 0.4.1
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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +3 -3
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +1 -1
- package/.next/required-server-files.js +2 -2
- package/.next/required-server-files.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/auth/all-providers/route.js +1 -1
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
- package/.next/server/app/api/mcp/route.js +1 -1
- package/.next/server/app/api/models-config/catalog/route.js +1 -1
- package/.next/server/app/api/models-config/route.js +1 -1
- package/.next/server/app/api/models-config/test/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/web-auth/session/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page.js +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +4 -4
- package/.next/server/app/login.segments/_full.segment.rsc +4 -4
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +3 -3
- package/.next/server/chunks/4445.js +1 -1
- package/.next/server/chunks/6209.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/middleware.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/4315-0cf6ce20554dc7e7.js +1 -0
- package/.next/static/chunks/6522.07d01cfb1ad3768e.js +1 -0
- package/.next/static/chunks/app/login/page-529e71a823982db0.js +1 -0
- package/.next/static/chunks/app/{page-60629bbe3fe259ef.js → page-0561f51665caa87b.js} +6 -6
- package/.next/static/chunks/{webpack-11f7dad1df4f814f.js → webpack-d5d95f150515a23a.js} +1 -1
- package/README.ja.md +28 -28
- package/README.ko.md +28 -28
- package/README.md +28 -28
- package/README.zh-CN.md +28 -28
- package/bin/node-version.js +1 -1
- package/bin/omp-web-options.js +1 -85
- package/bin/omp-web.js +1 -153
- package/bin/ompgui-options.js +24 -0
- package/bin/ompgui-security.test.mjs +8 -0
- package/bin/ompgui.js +31 -0
- package/package.json +3 -3
- package/.next/static/chunks/4315-50f4eb7d435d214a.js +0 -1
- package/.next/static/chunks/6522.a49bd5d1f0532830.js +0 -1
- package/.next/static/chunks/app/login/page-e9ec076f136fb627.js +0 -1
- /package/.next/static/{YAZYeEe1KDqN7al9eJ-PR → mAW7tvDf5cfedQcTSaZuq}/_buildManifest.js +0 -0
- /package/.next/static/{YAZYeEe1KDqN7al9eJ-PR → mAW7tvDf5cfedQcTSaZuq}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e,t,a,r,d,c,f,o,n,b={},i={};function l(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={exports:{}},r=!0;try{b[e].call(a.exports,a,a.exports,l),r=!1}finally{r&&delete i[e]}return a.exports}l.m=b,e=[],l.O=(t,a,r,d)=>{if(a){d=d||0;for(var c=e.length;c>0&&e[c-1][2]>d;c--)e[c]=e[c-1];e[c]=[a,r,d];return}for(var f=1/0,c=0;c<e.length;c++){for(var[a,r,d]=e[c],o=!0,n=0;n<a.length;n++)(!1&d||f>=d)&&Object.keys(l.O).every(e=>l.O[e](a[n]))?a.splice(n--,1):(o=!1,d<f&&(f=d));if(o){e.splice(c--,1);var b=r();void 0!==b&&(t=b)}}return t},l.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var d=Object.create(null);l.r(d);var c={};t=t||[null,a({}),a([]),a(a)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=a(f))Object.getOwnPropertyNames(f).forEach(t=>c[t]=()=>e[t]);return c.default=()=>e,l.d(d,c),d},l.d=(e,t)=>{for(var a in t)l.o(t,a)&&!l.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,a)=>(l.f[a](e,t),t),[])),l.u=e=>"static/chunks/"+(({988:"993e5495",1048:"db9d41be",7330:"d3ac728e",8133:"1ba63609",8747:"90542734",8924:"da12927c",9425:"bf2ff291"})[e]||e)+"."+({103:"23142a67b02246a8",268:"ec500965c1761e26",370:"8e8f3cf8eb0e29dd",398:"ffa02af9062a3950",484:"c74eeb0fca9a9ddf",869:"7152372b662e31af",918:"6a9bbe564e4a2d0f",934:"9006461bd0548660",973:"9efc01efd9d768a5",988:"598a97aa1337298f",1032:"d9a9179233599785",1048:"27ee8fcc7bf00d70",1063:"775c442bdbeef08b",1133:"cec7d32308adb5b9",1327:"09252bb80616cc3a",1708:"c3a1896e4cc9f8d9",1781:"9072b4c9586df549",2081:"47b6e9391094055f",2181:"ba21239d3ac39f81",2201:"9abd9168805e51f1",2258:"4defa30121ef44a5",2325:"23caf22075e51aa5",2356:"523277bb8c6bf72a",2418:"b5d9e177e10a686e",2480:"cf27ca02e5b19761",2539:"c5a4f2fd8e421c70",2619:"9431a3f48da8eef4",2695:"b732ef1965253b3f",2703:"495a65ed14b2f094",2821:"934bcf60fbdc28c6",3251:"408c817adb161919",3274:"981684293bab3573",3308:"8e27b5c43a478f0d",3336:"a76f9485fe7cb762",3716:"72bf4c9d7325debd",3995:"eca0f5bef1fc3ae5",4004:"74b9bcf5478b1663",4202:"8440832386f023c7",4238:"6f102dcbcf2ae339",4405:"7a19458960a1058e",4424:"fd0c93a807a333e1",4473:"bb35c176b3f2bf32",4559:"2e7ed39ea2757280",4854:"b64a1daa15899219",4866:"d1060b4faf2ae1e2",4970:"8a63b4953b0e4946",5020:"9ac8d0dc8390bb6e",5137:"f163e94c74a94d01",5199:"9ec1359b9aa220ab",5242:"7b643c6b3394cac1",5361:"afc00ab2626bacbf",5521:"cfdf2cfc6db31407",5526:"ff46471041fdcb79",5658:"d00c8405a87f7366",5681:"dd0e66b0de16e54b",6121:"eb9023b1cbc78ee2",6161:"4836cd7d031026bf",6195:"8710aa41b2319dff",6202:"f4317cf0a48876f9",6294:"24f510c0c3e3714c",6522:"
|
|
1
|
+
(()=>{"use strict";var e,t,a,r,d,c,f,o,n,b={},i={};function l(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={exports:{}},r=!0;try{b[e].call(a.exports,a,a.exports,l),r=!1}finally{r&&delete i[e]}return a.exports}l.m=b,e=[],l.O=(t,a,r,d)=>{if(a){d=d||0;for(var c=e.length;c>0&&e[c-1][2]>d;c--)e[c]=e[c-1];e[c]=[a,r,d];return}for(var f=1/0,c=0;c<e.length;c++){for(var[a,r,d]=e[c],o=!0,n=0;n<a.length;n++)(!1&d||f>=d)&&Object.keys(l.O).every(e=>l.O[e](a[n]))?a.splice(n--,1):(o=!1,d<f&&(f=d));if(o){e.splice(c--,1);var b=r();void 0!==b&&(t=b)}}return t},l.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,r){if(1&r&&(e=this(e)),8&r||"object"==typeof e&&e&&(4&r&&e.__esModule||16&r&&"function"==typeof e.then))return e;var d=Object.create(null);l.r(d);var c={};t=t||[null,a({}),a([]),a(a)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=a(f))Object.getOwnPropertyNames(f).forEach(t=>c[t]=()=>e[t]);return c.default=()=>e,l.d(d,c),d},l.d=(e,t)=>{for(var a in t)l.o(t,a)&&!l.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,a)=>(l.f[a](e,t),t),[])),l.u=e=>"static/chunks/"+(({988:"993e5495",1048:"db9d41be",7330:"d3ac728e",8133:"1ba63609",8747:"90542734",8924:"da12927c",9425:"bf2ff291"})[e]||e)+"."+({103:"23142a67b02246a8",268:"ec500965c1761e26",370:"8e8f3cf8eb0e29dd",398:"ffa02af9062a3950",484:"c74eeb0fca9a9ddf",869:"7152372b662e31af",918:"6a9bbe564e4a2d0f",934:"9006461bd0548660",973:"9efc01efd9d768a5",988:"598a97aa1337298f",1032:"d9a9179233599785",1048:"27ee8fcc7bf00d70",1063:"775c442bdbeef08b",1133:"cec7d32308adb5b9",1327:"09252bb80616cc3a",1708:"c3a1896e4cc9f8d9",1781:"9072b4c9586df549",2081:"47b6e9391094055f",2181:"ba21239d3ac39f81",2201:"9abd9168805e51f1",2258:"4defa30121ef44a5",2325:"23caf22075e51aa5",2356:"523277bb8c6bf72a",2418:"b5d9e177e10a686e",2480:"cf27ca02e5b19761",2539:"c5a4f2fd8e421c70",2619:"9431a3f48da8eef4",2695:"b732ef1965253b3f",2703:"495a65ed14b2f094",2821:"934bcf60fbdc28c6",3251:"408c817adb161919",3274:"981684293bab3573",3308:"8e27b5c43a478f0d",3336:"a76f9485fe7cb762",3716:"72bf4c9d7325debd",3995:"eca0f5bef1fc3ae5",4004:"74b9bcf5478b1663",4202:"8440832386f023c7",4238:"6f102dcbcf2ae339",4405:"7a19458960a1058e",4424:"fd0c93a807a333e1",4473:"bb35c176b3f2bf32",4559:"2e7ed39ea2757280",4854:"b64a1daa15899219",4866:"d1060b4faf2ae1e2",4970:"8a63b4953b0e4946",5020:"9ac8d0dc8390bb6e",5137:"f163e94c74a94d01",5199:"9ec1359b9aa220ab",5242:"7b643c6b3394cac1",5361:"afc00ab2626bacbf",5521:"cfdf2cfc6db31407",5526:"ff46471041fdcb79",5658:"d00c8405a87f7366",5681:"dd0e66b0de16e54b",6121:"eb9023b1cbc78ee2",6161:"4836cd7d031026bf",6195:"8710aa41b2319dff",6202:"f4317cf0a48876f9",6294:"24f510c0c3e3714c",6522:"07d01cfb1ad3768e",6654:"41440ef667144967",6794:"57bf1aff78682f3a",7256:"e07cf52d87d40252",7268:"2f59c671f26160f3",7330:"7964f816a1ca64e5",7331:"2add3c4e125a2dba",7543:"89f7b805ed0f2901",7570:"db2b11eaf9806157",8133:"b2ae90f43319a29e",8200:"a36b9f8c983c6b9e",8717:"4e20eedf9544e286",8747:"ae439f2382f58c51",8863:"fa0320ea586efb3b",8885:"d9308c756376780b",8901:"e117d206a917bda0",8924:"476aa688a637649c",9365:"a3e0e5ac101ccd02",9425:"244c8a7c1c14966a",9522:"c7c6e9c330f9ba6b",9614:"3221013d7f0af27f",9698:"4d09a99b9d99f3e5",9705:"40a82b97f214e28b",9754:"d67dec946fc871d4",9764:"2669775c6e107a01",9793:"4567af813117ad25",9974:"9a0f79beca65e8c4",9981:"64e2a4c3b53b3217"})[e]+".js",l.miniCssF=e=>"static/css/2f46e0db0d4a3aed.css",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},l.l=(e,t,a,d)=>{if(r[e])return void r[e].push(t);if(void 0!==a)for(var c,f,o=document.getElementsByTagName("script"),n=0;n<o.length;n++){var b=o[n];if(b.getAttribute("src")==e||b.getAttribute("data-webpack")=="_N_E:"+a){c=b;break}}c||(f=!0,(c=document.createElement("script")).charset="utf-8",c.timeout=120,l.nc&&c.setAttribute("nonce",l.nc),c.setAttribute("data-webpack","_N_E:"+a),c.src=l.tu(e)),r[e]=[t];var i=(t,a)=>{c.onerror=c.onload=null,clearTimeout(u);var d=r[e];if(delete r[e],c.parentNode&&c.parentNode.removeChild(c),d&&d.forEach(e=>e(a)),t)return t(a)},u=setTimeout(i.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=i.bind(null,c.onerror),c.onload=i.bind(null,c.onload),f&&document.head.appendChild(c)},l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.tt=()=>(void 0===d&&(d={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(d=trustedTypes.createPolicy("nextjs#bundler",d))),d),l.tu=e=>l.tt().createScriptURL(e),l.p="/_next/",c={8068:0},l.f.miniCss=(e,t)=>{if(c[e])t.push(c[e]);else 0!==c[e]&&({5846:1})[e]&&t.push(c[e]=new Promise((t,a)=>{var r=l.miniCssF(e),d=l.p+r;if(((e,t)=>{for(var a=document.getElementsByTagName("link"),r=0;r<a.length;r++){var d=a[r],c=d.getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(c===e||c===t))return d}for(var f=document.getElementsByTagName("style"),r=0;r<f.length;r++){var d=f[r],c=d.getAttribute("data-href");if(c===e||c===t)return d}})(r,d))return t();((e,t,a,r)=>{var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onerror=d.onload=c=>{if(d.onerror=d.onload=null,"load"===c.type)a();else{var f=c&&("load"===c.type?"missing":c.type),o=c&&c.target&&c.target.href||t,n=Error("Loading CSS chunk "+e+" failed.\n("+o+")");n.code="CSS_CHUNK_LOAD_FAILED",n.type=f,n.request=o,d.parentNode.removeChild(d),r(n)}},d.href=t;if("function"==typeof _N_E_STYLE_LOAD){var c=d.href,f=d.onload,o=d.onerror;_N_E_STYLE_LOAD(0===c.indexOf(window.location.origin)?new URL(c).pathname:c).then(function(){f&&f.call(d,{type:"load"})},function(){o&&o.call(d,{})})}else document.head.appendChild(d)})(e,d,t,a)}).then(()=>{c[e]=0},t=>{throw delete c[e],t}))},f={8068:0,2859:0,2160:0,7513:0},l.f.j=(e,t)=>{var a=l.o(f,e)?f[e]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(2160|2859|5846|7513|8068)$/.test(e))f[e]=0;else{var r=new Promise((t,r)=>a=f[e]=[t,r]);t.push(a[2]=r);var d=l.p+l.u(e),c=Error();l.l(d,t=>{if(l.o(f,e)&&(0!==(a=f[e])&&(f[e]=void 0),a)){var r=t&&("load"===t.type?"missing":t.type),d=t&&t.target&&t.target.src;c.message="Loading chunk "+e+" failed.\n("+r+": "+d+")",c.name="ChunkLoadError",c.type=r,c.request=d,a[1](c)}},"chunk-"+e,e)}},l.O.j=e=>0===f[e],o=(e,t)=>{var a,r,[d,c,o]=t,n=0;if(d.some(e=>0!==f[e])){for(a in c)l.o(c,a)&&(l.m[a]=c[a]);if(o)var b=o(l)}for(e&&e(t);n<d.length;n++)r=d[n],l.o(f,r)&&f[r]&&f[r][0](),f[r]=0;return l.O(b)},(n=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(o.bind(null,0)),n.push=o.bind(null,n.push.bind(n)),l.nc=void 0})();
|
package/README.ja.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ompgui
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
[oh-my-pi (omp) コーディングエージェント](https://github.com/can1357/oh-my-pi)のローカル Web UI です。
|
|
5
|
+
[oh-my-pi (omp) コーディングエージェント](https://github.com/can1357/oh-my-pi)のローカル Web UI です。ompgui はローカルの omp セッションファイルを読み込み、セッションの閲覧、リアルタイムチャット、モデル設定、スキル管理、プロジェクトファイルのプレビューを行えるブラウザワークスペースを提供します。
|
|
6
6
|
|
|
7
|
-

|
|
8
8
|
|
|
9
9
|
<details>
|
|
10
10
|
<summary>ダークテーマとコマンドパレット</summary>
|
|
11
11
|
|
|
12
|
-

|
|
13
13
|
|
|
14
|
-

|
|
15
15
|
|
|
16
16
|
</details>
|
|
17
17
|
|
|
@@ -32,33 +32,33 @@ npx ompgui@latest
|
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
34
|
npm install -g ompgui
|
|
35
|
-
|
|
35
|
+
ompgui
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
続いて [http://127.0.0.1:30177](http://127.0.0.1:30177) を開きます。サーバーの準備が整うと、CLI はブラウザを自動的に開こうとします。
|
|
38
|
+
続いて [http://127.0.0.1:30177](http://127.0.0.1:30177) を開きます。サーバーの準備が整うと、CLI はブラウザを自動的に開こうとします。ompgui はデフォルトで `127.0.0.1` で待ち受けます。
|
|
39
39
|
|
|
40
40
|
**オプション:**
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
PORT=8080
|
|
51
|
-
OMP_WEB_HOSTNAME=0.0.0.0
|
|
52
|
-
OMP_WEB_PASSWORD='a-long-random-password'
|
|
53
|
-
# Windows: $env:OMP_WEB_PASSWORD="secret";
|
|
54
|
-
OMP_WEB_NO_OPEN=1
|
|
43
|
+
ompgui --port 8080 # カスタムポート
|
|
44
|
+
ompgui --hostname 0.0.0.0 # 信頼できるネットワークに公開
|
|
45
|
+
ompgui -p 8080 -H 0.0.0.0 # オプションを組み合わせる
|
|
46
|
+
ompgui --no-open # ブラウザを自動的に開かない
|
|
47
|
+
|
|
48
|
+
ompgui --password "a-long-random-password" # パスワードのみのサインインを有効化(Windows でも同様)
|
|
49
|
+
|
|
50
|
+
PORT=8080 ompgui # 環境変数にも対応
|
|
51
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompgui # ネットワーク公開を明示的に有効化
|
|
52
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompgui # 環境変数でも同様(POSIX)
|
|
53
|
+
# Windows: $env:OMP_WEB_PASSWORD="secret"; ompgui
|
|
54
|
+
OMP_WEB_NO_OPEN=1 ompgui # バックグラウンドサービスとして実行する場合に便利
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
`OMP_WEB_PASSWORD` を設定すると、テーマに統合されたパスワードのみのサインイン画面で UI とすべての API エンドポイントを保護できます。サインイン後は HTTP-only の署名付きセッションクッキーが 30 日間有効です。未設定なら認証は無効です。リモート利用では、パスワードとセッションクッキーを守るため、信頼できるリバースプロキシまたは VPN 経由の HTTPS が必要です。
|
|
57
|
+
`OMP_WEB_PASSWORD` を設定すると、テーマに統合されたパスワードのみのサインイン画面で UI とすべての API エンドポイントを保護できます。サインイン後は HTTP-only の署名付きセッションクッキーが 30 日間有効です。未設定なら認証は無効です。リモート利用では、パスワードとセッションクッキーを守るため、信頼できるリバースプロキシまたは VPN 経由の HTTPS が必要です。ompgui をインターネットへ直接公開しないでください。
|
|
58
58
|
|
|
59
59
|
## リモート・モバイルアクセス(Tailscale 推奨)
|
|
60
60
|
|
|
61
|
-
モバイル端末(iPhone、iPad、Android)や外部のノートPCから `
|
|
61
|
+
モバイル端末(iPhone、iPad、Android)や外部のノートPCから `ompgui` にアクセスする場合は、**[Tailscale](https://tailscale.com/) の利用を強く推奨します**。ポート開放やグローバルIPの公開なしに、端末間の暗号化メッシュVPNを通じて最も安全にリモートアクセスできます。
|
|
62
62
|
|
|
63
63
|
### 1. パスワードの設定(セキュリティ上必須)
|
|
64
64
|
|
|
@@ -66,18 +66,18 @@ OMP_WEB_NO_OPEN=1 ompweb # バックグラウンドサービスとして
|
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
68
|
# CLI オプションでパスワードを設定して全インターフェースにバインド
|
|
69
|
-
|
|
69
|
+
ompgui -H 0.0.0.0 --password "your-strong-password"
|
|
70
70
|
|
|
71
71
|
# または環境変数で設定
|
|
72
|
-
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password"
|
|
72
|
+
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
### 2. Tailscale 接続手順
|
|
76
76
|
|
|
77
77
|
1. **Tailscale をインストール**: ホストPCとモバイル端末に [Tailscale](https://tailscale.com/download) をインストールし、同一アカウントでログインします。
|
|
78
|
-
2. **ホストPCで
|
|
78
|
+
2. **ホストPCで ompgui を起動**:
|
|
79
79
|
```bash
|
|
80
|
-
|
|
80
|
+
ompgui --hostname 0.0.0.0 --password "your-strong-password"
|
|
81
81
|
```
|
|
82
82
|
3. **モバイルブラウザからアクセス**:
|
|
83
83
|
- ホストPCの Tailscale IP(例: `100.x.y.z`)または MagicDNS マシン名でアクセスします:
|
|
@@ -117,7 +117,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
|
|
|
117
117
|
|
|
118
118
|
## アーキテクチャ
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
ompgui は Node 上でホストされる Next.js アプリで、インストール済みの `omp` バイナリを操作します。エージェント自体は同梱していません:
|
|
121
121
|
|
|
122
122
|
- **ライブセッション**: `omp --mode rpc-ui`(stdio 上の NDJSON)を、アクティブなセッションごとに 1 つの子プロセスとして起動します。そのため、エージェントのバージョンは常にインストールされているものと完全に一致します。
|
|
123
123
|
- **セッション閲覧**: omp のセッションファイル(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`)を直接読み込みます。タイトル変更、アーカイブ、削除は、OMP のライブ書き込みと競合しないよう保護されたネイティブファイルのメンテナンス操作です。
|
|
@@ -147,7 +147,7 @@ node --test lib/*.test.mjs components/*.test.mjs # テスト実行
|
|
|
147
147
|
|
|
148
148
|
## 国際化
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
ompgui は英語、簡体字中国語(简体中文)、日本語、韓国語(한국어)をサポートし、4 言語で UI 全体の翻訳文字列を提供しています。言語は `navigator.language` から自動検出され、トップバーの言語メニューから実行時に切り替えできます。選択はセッション間で永続化されます。
|
|
151
151
|
|
|
152
152
|
- 辞書ファイル: `lib/i18n/locales/{en,zh-CN,ja,ko}.json`
|
|
153
153
|
- フレームワーク: `lib/i18n/index.tsx` — `useSyncExternalStore` ベースの軽量ストア、`{var}` 補間と複数形サポート(`.one`/`.other`)
|
|
@@ -162,7 +162,7 @@ ompweb は英語、簡体字中国語(简体中文)、日本語、韓国語
|
|
|
162
162
|
|
|
163
163
|
## クレジット
|
|
164
164
|
|
|
165
|
-
|
|
165
|
+
ompgui は [agegr/pi-web](https://github.com/agegr/pi-web)(MIT)のフォークです。pi-web は [badlogic/pi-mono](https://github.com/badlogic/pi-mono) の pi コーディングエージェント向け Web UI で、これを [can1357/oh-my-pi](https://github.com/can1357/oh-my-pi) 向けに適合させたものです。
|
|
166
166
|
|
|
167
167
|
## ライセンス
|
|
168
168
|
|
package/README.ko.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ompgui
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
[oh-my-pi (omp) 코딩 에이전트](https://github.com/can1357/oh-my-pi)를 위한 로컬 웹 UI입니다.
|
|
5
|
+
[oh-my-pi (omp) 코딩 에이전트](https://github.com/can1357/oh-my-pi)를 위한 로컬 웹 UI입니다. ompgui은 로컬 omp 세션 파일을 읽어 브라우저에서 세션 탐색, 실시간 채팅, 모델 설정, 스킬 관리, 프로젝트 파일 미리보기를 제공하는 워크스페이스를 엽니다.
|
|
6
6
|
|
|
7
|
-

|
|
8
8
|
|
|
9
9
|
<details>
|
|
10
10
|
<summary>다크 테마</summary>
|
|
11
11
|
|
|
12
|
-

|
|
13
13
|
|
|
14
14
|
</details>
|
|
15
15
|
|
|
@@ -30,36 +30,36 @@ npx ompgui@latest
|
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
npm install -g ompgui
|
|
33
|
-
|
|
33
|
+
ompgui
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
그다음 [http://127.0.0.1:30177](http://127.0.0.1:30177)을 여세요. 서버가 준비되면 CLI가 브라우저를 자동으로 열려고 시도합니다.
|
|
36
|
+
그다음 [http://127.0.0.1:30177](http://127.0.0.1:30177)을 여세요. 서버가 준비되면 CLI가 브라우저를 자동으로 열려고 시도합니다. ompgui은 기본적으로 `127.0.0.1`에서 수신합니다.
|
|
37
37
|
|
|
38
38
|
**옵션:**
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
ompgui --port 8080 # 포트 지정
|
|
42
|
+
ompgui --hostname 0.0.0.0 # 신뢰할 수 있는 네트워크에 노출
|
|
43
|
+
ompgui -p 8080 -H 0.0.0.0 # 옵션 조합
|
|
44
|
+
ompgui --no-open # 브라우저 자동 열기 안 함
|
|
45
|
+
ompgui --password "a-long-random-password" # POSIX 인라인 환경 변수 없이 비밀번호만으로 로그인
|
|
46
46
|
|
|
47
|
-
PORT=8080
|
|
48
|
-
OMP_WEB_HOSTNAME=0.0.0.0
|
|
49
|
-
OMP_WEB_PASSWORD='a-long-random-password'
|
|
50
|
-
OMP_WEB_NO_OPEN=1
|
|
47
|
+
PORT=8080 ompgui # 환경 변수도 지원
|
|
48
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompgui # 네트워크에 명시적으로 노출
|
|
49
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompgui # 환경 변수 방식(POSIX: 인라인 또는 export)
|
|
50
|
+
OMP_WEB_NO_OPEN=1 ompgui # 백그라운드 서비스로 실행할 때 유용
|
|
51
51
|
|
|
52
52
|
# Windows (PowerShell / CMD)
|
|
53
|
-
# $env:OMP_WEB_PASSWORD="a-long-random-password";
|
|
53
|
+
# $env:OMP_WEB_PASSWORD="a-long-random-password"; ompgui
|
|
54
54
|
# 또는
|
|
55
|
-
#
|
|
55
|
+
# ompgui --password "a-long-random-password"
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
`OMP_WEB_PASSWORD`를 설정하거나 `--password`를 전달하면 테마가 적용된 비밀번호 전용 로그인 화면으로 인터페이스와 모든 API 엔드포인트를 보호합니다. 로그인에 성공하면 30일 동안 유효한 HTTP 전용 서명 세션 쿠키가 생성됩니다. 설정된 비밀번호를 변경하면 기존 세션이 무효화됩니다. 변수를 설정하지 않으면 인증이 비활성화됩니다. 원격 사용 시 비밀번호와 세션 쿠키가 가로채이지 않도록 신뢰할 수 있는 리버스 프록시나 VPN을 통해 HTTPS를 사용해야 합니다. Windows 환경 변수 문법은 `$env:OMP_WEB_PASSWORD="..."`이며, `
|
|
58
|
+
`OMP_WEB_PASSWORD`를 설정하거나 `--password`를 전달하면 테마가 적용된 비밀번호 전용 로그인 화면으로 인터페이스와 모든 API 엔드포인트를 보호합니다. 로그인에 성공하면 30일 동안 유효한 HTTP 전용 서명 세션 쿠키가 생성됩니다. 설정된 비밀번호를 변경하면 기존 세션이 무효화됩니다. 변수를 설정하지 않으면 인증이 비활성화됩니다. 원격 사용 시 비밀번호와 세션 쿠키가 가로채이지 않도록 신뢰할 수 있는 리버스 프록시나 VPN을 통해 HTTPS를 사용해야 합니다. Windows 환경 변수 문법은 `$env:OMP_WEB_PASSWORD="..."`이며, `ompgui --password "..."`는 별도 문법 없이 모든 셸에서 작동합니다.
|
|
59
59
|
|
|
60
60
|
## 원격 및 모바일 접속 (Tailscale 권장)
|
|
61
61
|
|
|
62
|
-
외부나 모바일 기기(iPhone, iPad, Android)에서 로컬 PC의 `
|
|
62
|
+
외부나 모바일 기기(iPhone, iPad, Android)에서 로컬 PC의 `ompgui`에 접속할 때는 **[Tailscale](https://tailscale.com/) 가상 사설망(VPN)을 사용하는 것을 강력히 권장**합니다. 포트 포워딩이나 공인 IP 노출 없이 종단간 암호화(P2P)를 통해 가장 안전하게 원격 접속할 수 있습니다.
|
|
63
63
|
|
|
64
64
|
### 1. 비밀번호 설정 (보안 필수)
|
|
65
65
|
|
|
@@ -67,18 +67,18 @@ OMP_WEB_NO_OPEN=1 ompweb # 백그라운드 서비스로 실행할 때 유
|
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
69
|
# CLI 옵션으로 비밀번호 설정 및 전체 네트워크 바인딩
|
|
70
|
-
|
|
70
|
+
ompgui -H 0.0.0.0 --password "your-strong-password"
|
|
71
71
|
|
|
72
72
|
# 또는 환경 변수로 설정
|
|
73
|
-
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password"
|
|
73
|
+
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
74
74
|
```
|
|
75
75
|
|
|
76
76
|
### 2. Tailscale 연결 단계
|
|
77
77
|
|
|
78
78
|
1. **Tailscale 설치**: 호스트 PC와 모바일 기기에 [Tailscale](https://tailscale.com/download)을 설치하고 동일한 계정으로 로그인합니다.
|
|
79
|
-
2. **호스트 PC에서
|
|
79
|
+
2. **호스트 PC에서 ompgui 실행**:
|
|
80
80
|
```bash
|
|
81
|
-
|
|
81
|
+
ompgui --hostname 0.0.0.0 --password "your-strong-password"
|
|
82
82
|
```
|
|
83
83
|
3. **모바일 브라우저에서 접속**:
|
|
84
84
|
- 호스트 PC의 Tailscale IP(예: `100.x.y.z`) 또는 MagicDNS 머신 이름으로 접속합니다:
|
|
@@ -91,10 +91,10 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
|
|
|
91
91
|
|
|
92
92
|
### 보안 및 문제 해결
|
|
93
93
|
|
|
94
|
-
- 서버는 기본적으로 `127.0.0.1`에 바인딩됩니다. 루프백이 아닌 호스트 이름은 명시적으로 선택해야 하며 신뢰할 수 있는 네트워크 경계 뒤에서만 사용하세요.
|
|
94
|
+
- 서버는 기본적으로 `127.0.0.1`에 바인딩됩니다. 루프백이 아닌 호스트 이름은 명시적으로 선택해야 하며 신뢰할 수 있는 네트워크 경계 뒤에서만 사용하세요. ompgui을 공개적으로 노출하는 것은 안전하지 않습니다.
|
|
95
95
|
- 파일 API는 선택한 워크스페이스, 유효한 Git worktree, 세션에서 참조된 디렉터리, 명시적으로 선택한 루트만 허용합니다. 경로를 정규화하여 경로 탈출과 심볼릭 링크 탈출을 차단합니다.
|
|
96
96
|
- `omp`는 먼저 `OMP_WEB_OMP_BIN`, 다음으로 `PATH`에서 확인합니다. 실시간 채팅을 시작할 수 없으면 같은 터미널에서 `omp --version`을 실행하거나 실행 파일의 절대 경로를 `OMP_WEB_OMP_BIN`에 설정하세요.
|
|
97
|
-
- 세션 기록은 기본 OMP JSONL 형식으로 유지됩니다. 실시간 세션 쓰기는 OMP가 담당하며,
|
|
97
|
+
- 세션 기록은 기본 OMP JSONL 형식으로 유지됩니다. 실시간 세션 쓰기는 OMP가 담당하며, ompgui은 직접 파일을 읽고 실시간 OMP 쓰기와 충돌하지 않을 때만 명시적인 제목·보관·삭제 작업을 수행합니다.
|
|
98
98
|
- 세션 보관은 OMP의 기본 `archive/sessions/<cwd>/<file>.jsonl.gz` 레이아웃을 사용하며, 트랜스크립트와 함께 관련 아티팩트를 이동합니다. 원본 JSONL 바이트는 gzip 안에 보존됩니다.
|
|
99
99
|
|
|
100
100
|
## 기능
|
|
@@ -128,7 +128,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
|
|
|
128
128
|
|
|
129
129
|
## 아키텍처
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
ompgui은 Node가 호스팅하는 Next.js 앱으로, 설치된 `omp` 바이너리를 구동합니다. 에이전트를 내장하지 않습니다.
|
|
132
132
|
|
|
133
133
|
- **실시간 세션**: `omp --mode rpc-ui`(stdio 기반 NDJSON)를 실행하며 활성 세션마다 자식 프로세스를 하나씩 사용합니다. 설치된 OMP가 RPC v2를 알리면 v2를 협상하고, 큰 프레임은 제한된 청크 재조립을 사용하며, 구버전은 v1로 폴백합니다. 실행 전 호스트 환경(`PORT`, `NEXT_*`, `NODE_ENV`)을 제거하고 POSIX(프로세스 그룹)와 Windows(`taskkill /t`) 모두 정상 종료를 지원합니다.
|
|
134
134
|
- **세션 탐색**: omp 세션 파일(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`)을 직접 읽습니다. 제목·보관·삭제는 실시간 OMP 쓰기를 보호하는 제한적인 기본 파일 유지보수 작업입니다. 프로젝트는 안정적인 `projectKey`(Windows 대소문자 무시, 심볼릭 링크 해석)로 묶어 사이드바가 드라이브나 worktree 사이에서 이동하지 않게 합니다.
|
|
@@ -161,7 +161,7 @@ npm run build # 프로덕션 빌드
|
|
|
161
161
|
|
|
162
162
|
## 국제화
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
ompgui은 영어, 중국어 간체(简体中文), 일본어(日本語), 한국어(한국어)를 지원하며 모든 언어에서 전체 UI 문자열을 번역합니다. 언어는 `navigator.language`에서 자동 감지하고 상단 바의 언어 메뉴에서 실행 중 전환할 수 있습니다. 선택한 언어는 세션 간 유지됩니다.
|
|
165
165
|
|
|
166
166
|
- 사전: `lib/i18n/locales/{en,zh-CN,ja,ko}.json`
|
|
167
167
|
- 프레임워크: `lib/i18n/index.tsx` — `{var}` 보간과 복수형(`.one`/`.other`)을 지원하는 `useSyncExternalStore` 기반 경량 스토어
|
|
@@ -176,7 +176,7 @@ ompweb은 영어, 중국어 간체(简体中文), 일본어(日本語), 한국
|
|
|
176
176
|
|
|
177
177
|
## 크레딧
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
ompgui은 [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
180
|
|
|
181
181
|
## 라이선스
|
|
182
182
|
|
package/README.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ompgui
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
Local web UI for the [oh-my-pi (omp) coding agent](https://github.com/can1357/oh-my-pi).
|
|
5
|
+
Local web UI for the [oh-my-pi (omp) coding agent](https://github.com/can1357/oh-my-pi). ompgui 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
6
|
|
|
7
|
-

|
|
8
8
|
|
|
9
9
|
<details>
|
|
10
10
|
<summary>Dark theme</summary>
|
|
11
11
|
|
|
12
|
-

|
|
13
13
|
|
|
14
14
|
</details>
|
|
15
15
|
|
|
@@ -30,36 +30,36 @@ npx ompgui@latest
|
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
npm install -g ompgui
|
|
33
|
-
|
|
33
|
+
ompgui
|
|
34
34
|
```
|
|
35
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.
|
|
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. ompgui listens on `127.0.0.1` by default.
|
|
37
37
|
|
|
38
38
|
**Options:**
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
ompgui --port 8080 # custom port
|
|
42
|
+
ompgui --hostname 0.0.0.0 # expose on a trusted network
|
|
43
|
+
ompgui -p 8080 -H 0.0.0.0 # combine options
|
|
44
|
+
ompgui --no-open # do not open the browser automatically
|
|
45
|
+
ompgui --password "a-long-random-password" # password-only sign-in without POSIX inline-env syntax
|
|
46
46
|
|
|
47
|
-
PORT=8080
|
|
48
|
-
OMP_WEB_HOSTNAME=0.0.0.0
|
|
49
|
-
OMP_WEB_PASSWORD='a-long-random-password'
|
|
50
|
-
OMP_WEB_NO_OPEN=1
|
|
47
|
+
PORT=8080 ompgui # environment variable is also supported
|
|
48
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompgui # explicit network exposure
|
|
49
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompgui # env-variable form (POSIX: inline or exported)
|
|
50
|
+
OMP_WEB_NO_OPEN=1 ompgui # useful when running as a background service
|
|
51
51
|
|
|
52
52
|
# Windows (PowerShell / CMD)
|
|
53
|
-
# $env:OMP_WEB_PASSWORD="a-long-random-password";
|
|
53
|
+
# $env:OMP_WEB_PASSWORD="a-long-random-password"; ompgui
|
|
54
54
|
# or
|
|
55
|
-
#
|
|
55
|
+
# ompgui --password "a-long-random-password"
|
|
56
56
|
```
|
|
57
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="..."`; `
|
|
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="..."`; `ompgui --password "..."` works in every shell without that extra step.
|
|
59
59
|
|
|
60
60
|
## Remote & Mobile Access (Tailscale Recommended)
|
|
61
61
|
|
|
62
|
-
For accessing `
|
|
62
|
+
For accessing `ompgui` 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
63
|
|
|
64
64
|
### 1. Configure Password (Required for Remote Access)
|
|
65
65
|
|
|
@@ -67,18 +67,18 @@ When binding to external network interfaces, setting a password is required to s
|
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
69
|
# CLI option: bind to all interfaces with a password
|
|
70
|
-
|
|
70
|
+
ompgui -H 0.0.0.0 --password "your-strong-password"
|
|
71
71
|
|
|
72
72
|
# Or via environment variables
|
|
73
|
-
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password"
|
|
73
|
+
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
74
74
|
```
|
|
75
75
|
|
|
76
76
|
### 2. Steps to Connect via Tailscale
|
|
77
77
|
|
|
78
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
|
|
79
|
+
2. **Start ompgui on your host machine**:
|
|
80
80
|
```bash
|
|
81
|
-
|
|
81
|
+
ompgui --hostname 0.0.0.0 --password "your-strong-password"
|
|
82
82
|
```
|
|
83
83
|
3. **Access from your mobile browser**:
|
|
84
84
|
- Navigate to your host's Tailscale IP (e.g. `100.x.y.z`) or MagicDNS machine name:
|
|
@@ -91,10 +91,10 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
|
|
|
91
91
|
|
|
92
92
|
### Security and troubleshooting
|
|
93
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;
|
|
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; ompgui is not safe to expose publicly.
|
|
95
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
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;
|
|
97
|
+
- Session history remains native OMP JSONL. OMP owns live-session writes; ompgui reads the files directly and only performs explicit title, archive, and delete maintenance when it is not racing a live OMP write.
|
|
98
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
99
|
|
|
100
100
|
## Features
|
|
@@ -128,7 +128,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
|
|
|
128
128
|
|
|
129
129
|
## Architecture
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
ompgui is a Node-hosted Next.js app that drives your installed `omp` binary — it does not embed the agent:
|
|
132
132
|
|
|
133
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
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.
|
|
@@ -161,7 +161,7 @@ Avoid running `next build` / `npm run build` during local development. It writes
|
|
|
161
161
|
|
|
162
162
|
## Internationalization
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
ompgui 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
165
|
|
|
166
166
|
- Dictionaries: `lib/i18n/locales/{en,zh-CN,ja,ko}.json`
|
|
167
167
|
- Framework: `lib/i18n/index.tsx` — a lightweight store built on `useSyncExternalStore` with `{var}` interpolation and plural support (`.one`/`.other`)
|
|
@@ -176,7 +176,7 @@ ompweb supports English, Simplified Chinese (简体中文), Japanese (日本語)
|
|
|
176
176
|
|
|
177
177
|
## Credits
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
ompgui 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
180
|
|
|
181
181
|
## License
|
|
182
182
|
|
package/README.zh-CN.md
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ompgui
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
[oh-my-pi (omp) 编程智能体](https://github.com/can1357/oh-my-pi)的本地 Web UI。
|
|
5
|
+
[oh-my-pi (omp) 编程智能体](https://github.com/can1357/oh-my-pi)的本地 Web UI。ompgui 读取本机的 omp 会话文件,在浏览器中提供一个工作区,支持会话浏览、实时对话、模型配置、技能管理和项目文件预览。
|
|
6
6
|
|
|
7
|
-

|
|
8
8
|
|
|
9
9
|
<details>
|
|
10
10
|
<summary>深色主题与命令面板</summary>
|
|
11
11
|
|
|
12
|
-

|
|
13
13
|
|
|
14
|
-

|
|
15
15
|
|
|
16
16
|
</details>
|
|
17
17
|
|
|
@@ -32,33 +32,33 @@ npx ompgui@latest
|
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
34
|
npm install -g ompgui
|
|
35
|
-
|
|
35
|
+
ompgui
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
然后打开 [http://127.0.0.1:30177](http://127.0.0.1:30177)。服务器就绪后,CLI 会尝试自动打开浏览器。
|
|
38
|
+
然后打开 [http://127.0.0.1:30177](http://127.0.0.1:30177)。服务器就绪后,CLI 会尝试自动打开浏览器。ompgui 默认监听 `127.0.0.1`。
|
|
39
39
|
|
|
40
40
|
**选项:**
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
PORT=8080
|
|
51
|
-
OMP_WEB_HOSTNAME=0.0.0.0
|
|
52
|
-
OMP_WEB_PASSWORD='a-long-random-password'
|
|
53
|
-
# Windows: $env:OMP_WEB_PASSWORD="secret";
|
|
54
|
-
OMP_WEB_NO_OPEN=1
|
|
43
|
+
ompgui --port 8080 # 自定义端口
|
|
44
|
+
ompgui --hostname 0.0.0.0 # 在可信网络中暴露服务
|
|
45
|
+
ompgui -p 8080 -H 0.0.0.0 # 组合使用
|
|
46
|
+
ompgui --no-open # 不自动打开浏览器
|
|
47
|
+
|
|
48
|
+
ompgui --password "a-long-random-password" # 启用仅密码登录(Windows 同样适用)
|
|
49
|
+
|
|
50
|
+
PORT=8080 ompgui # 也支持环境变量
|
|
51
|
+
OMP_WEB_HOSTNAME=0.0.0.0 ompgui # 显式暴露到网络
|
|
52
|
+
OMP_WEB_PASSWORD='a-long-random-password' ompgui # 环境变量形式(POSIX)
|
|
53
|
+
# Windows: $env:OMP_WEB_PASSWORD="secret"; ompgui
|
|
54
|
+
OMP_WEB_NO_OPEN=1 ompgui # 作为后台服务运行时很有用
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
设置 `OMP_WEB_PASSWORD` 可通过与主题集成的仅密码登录页面保护界面和所有 API 端点。登录成功后,会创建有效期为 30 天的 HTTP-only 签名会话 Cookie;留空则关闭认证。远程访问仍需通过受信任反向代理或 VPN 提供 HTTPS,以保护密码和会话 Cookie。默认仅监听 `127.0.0.1`;不要将
|
|
57
|
+
设置 `OMP_WEB_PASSWORD` 可通过与主题集成的仅密码登录页面保护界面和所有 API 端点。登录成功后,会创建有效期为 30 天的 HTTP-only 签名会话 Cookie;留空则关闭认证。远程访问仍需通过受信任反向代理或 VPN 提供 HTTPS,以保护密码和会话 Cookie。默认仅监听 `127.0.0.1`;不要将 ompgui 直接暴露到互联网。
|
|
58
58
|
|
|
59
59
|
## 远程与移动端访问(推荐使用 Tailscale)
|
|
60
60
|
|
|
61
|
-
从移动设备(iPhone、iPad、Android)或外部笔记本访问 `
|
|
61
|
+
从移动设备(iPhone、iPad、Android)或外部笔记本访问 `ompgui` 时,**强烈推荐使用 [Tailscale](https://tailscale.com/) 虚拟专用网(VPN)**。它通过端到端加密的点对点 Mesh 网络连接设备,无需端口转发或暴露公网 IP。
|
|
62
62
|
|
|
63
63
|
### 1. 配置访问密码(远程访问必备)
|
|
64
64
|
|
|
@@ -66,18 +66,18 @@ OMP_WEB_NO_OPEN=1 ompweb # 作为后台服务运行时很有用
|
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
68
|
# CLI 选项:绑定到所有网络接口并设置密码
|
|
69
|
-
|
|
69
|
+
ompgui -H 0.0.0.0 --password "your-strong-password"
|
|
70
70
|
|
|
71
71
|
# 或通过环境变量设置
|
|
72
|
-
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password"
|
|
72
|
+
OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
### 2. Tailscale 连接步骤
|
|
76
76
|
|
|
77
77
|
1. **安装 Tailscale**:在宿主电脑和移动设备上安装 [Tailscale](https://tailscale.com/download) 并登录同一账户。
|
|
78
|
-
2. **在宿主电脑上启动
|
|
78
|
+
2. **在宿主电脑上启动 ompgui**:
|
|
79
79
|
```bash
|
|
80
|
-
|
|
80
|
+
ompgui --hostname 0.0.0.0 --password "your-strong-password"
|
|
81
81
|
```
|
|
82
82
|
3. **在移动端浏览器中访问**:
|
|
83
83
|
- 访问宿主电脑的 Tailscale IP(如 `100.x.y.z`)或 MagicDNS 机器名:
|
|
@@ -117,7 +117,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompweb
|
|
|
117
117
|
|
|
118
118
|
## 架构
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
ompgui 是一个由 Node 托管的 Next.js 应用,驱动你已安装的 `omp` 二进制文件——它并不内嵌智能体:
|
|
121
121
|
|
|
122
122
|
- **实时会话**:启动 `omp --mode rpc-ui`(基于 stdio 的 NDJSON),每个活动会话对应一个子进程,因此智能体版本始终与你安装的完全一致。
|
|
123
123
|
- **会话浏览**:直接读取 omp 的会话文件(`~/.omp/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`);标题、归档和删除是受保护的原生文件维护操作,不会与 OMP 的实时写入竞争。
|
|
@@ -147,7 +147,7 @@ node --test lib/*.test.mjs components/*.test.mjs # 运行测试
|
|
|
147
147
|
|
|
148
148
|
## 多语言支持
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
ompgui 支持英语、简体中文、日本語和韩语(한국어),四种语言均覆盖整个界面的翻译字符串。语言从 `navigator.language` 自动检测,可通过顶栏的语言菜单在运行时切换。选择会跨会话持久化。
|
|
151
151
|
|
|
152
152
|
- 字典文件:`lib/i18n/locales/{en,zh-CN,ja,ko}.json`
|
|
153
153
|
- 框架:`lib/i18n/index.tsx` — 基于 `useSyncExternalStore` 的轻量 store,支持 `{var}` 插值和复数形式(`.one`/`.other`)
|
|
@@ -162,7 +162,7 @@ ompweb 支持英语、简体中文、日本語和韩语(한국어),四种
|
|
|
162
162
|
|
|
163
163
|
## 致谢
|
|
164
164
|
|
|
165
|
-
|
|
165
|
+
ompgui 分叉自 [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
166
|
|
|
167
167
|
## 许可证
|
|
168
168
|
|
package/bin/node-version.js
CHANGED
|
@@ -22,7 +22,7 @@ function isNodeVersionSupported(version) {
|
|
|
22
22
|
|
|
23
23
|
function getUnsupportedNodeVersionMessage(version) {
|
|
24
24
|
return [
|
|
25
|
-
`
|
|
25
|
+
`ompgui requires Node.js ${MIN_NODE_VERSION} or newer.`,
|
|
26
26
|
`Current Node.js version: ${version}.`,
|
|
27
27
|
"Upgrade Node.js and try again: https://nodejs.org/",
|
|
28
28
|
].join("\n");
|