open-codex-ui 0.1.4__tar.gz → 0.1.7__tar.gz

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 (72) hide show
  1. open_codex_ui-0.1.7/LICENSE +76 -0
  2. open_codex_ui-0.1.7/PKG-INFO +184 -0
  3. open_codex_ui-0.1.7/README.md +167 -0
  4. open_codex_ui-0.1.7/open_codex_ui.egg-info/PKG-INFO +184 -0
  5. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/open_codex_ui.egg-info/SOURCES.txt +19 -9
  6. open_codex_ui-0.1.7/open_codex_ui.egg-info/entry_points.txt +6 -0
  7. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/pyproject.toml +10 -8
  8. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/tests/test_codex_ipc_manager.py +120 -70
  9. open_codex_ui-0.1.7/tests/test_daemon.py +417 -0
  10. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/tests/test_main.py +1 -1
  11. open_codex_ui-0.1.7/tests/test_release_versions.py +21 -0
  12. open_codex_ui-0.1.7/tests/test_ssh_config.py +70 -0
  13. open_codex_ui-0.1.7/tests/test_yier_cli.py +142 -0
  14. open_codex_ui-0.1.7/yier_web/cli.py +309 -0
  15. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/codex/ipc_manager.py +37 -41
  16. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/config.py +15 -2
  17. open_codex_ui-0.1.7/yier_web/daemon.py +284 -0
  18. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/routes/codex.py +32 -13
  19. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/schemas.py +13 -16
  20. open_codex_ui-0.1.7/yier_web/ssh_config.py +153 -0
  21. open_codex_ui-0.1.7/yier_web/static/assets/CodexEmbedView-D2C2AL0J.js +1 -0
  22. open_codex_ui-0.1.7/yier_web/static/assets/CodexView-xCApa-En.js +720 -0
  23. open_codex_ui-0.1.4/yier_web/static/assets/LoginView-CELCom2O.js → open_codex_ui-0.1.7/yier_web/static/assets/LoginView-22G23Nxb.js +2 -2
  24. open_codex_ui-0.1.7/yier_web/static/assets/api-CQ1ZRFSL.js +1098 -0
  25. open_codex_ui-0.1.7/yier_web/static/assets/index--CkIJHj3.css +1 -0
  26. open_codex_ui-0.1.4/yier_web/static/assets/index-mSBvq1p8.js → open_codex_ui-0.1.7/yier_web/static/assets/index-BRPULTI7.js +1 -1
  27. open_codex_ui-0.1.7/yier_web/static/assets/index-CxkjsTB_.js +245 -0
  28. open_codex_ui-0.1.4/yier_web/static/assets/useCodexWorkspace-D1rCOO1x.js → open_codex_ui-0.1.7/yier_web/static/assets/useCodexWorkspace-BZADV-Zo.js +36 -36
  29. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/index.html +2 -2
  30. open_codex_ui-0.1.7/yier_web/static/screenshots/open-codex-ui-desktop.png +0 -0
  31. open_codex_ui-0.1.7/yier_web/static/screenshots/open-codex-ui-mobile-chat.png +0 -0
  32. open_codex_ui-0.1.7/yier_web/static/screenshots/open-codex-ui-mobile-projects.png +0 -0
  33. open_codex_ui-0.1.7/yier_web/system_services.py +375 -0
  34. open_codex_ui-0.1.4/PKG-INFO +0 -249
  35. open_codex_ui-0.1.4/README.md +0 -236
  36. open_codex_ui-0.1.4/open_codex_ui.egg-info/PKG-INFO +0 -249
  37. open_codex_ui-0.1.4/open_codex_ui.egg-info/entry_points.txt +0 -7
  38. open_codex_ui-0.1.4/tests/test_yier_cli.py +0 -38
  39. open_codex_ui-0.1.4/yier_web/cli.py +0 -172
  40. open_codex_ui-0.1.4/yier_web/static/assets/CodexEmbedView-CN_-Mhe2.js +0 -1
  41. open_codex_ui-0.1.4/yier_web/static/assets/CodexView-wpI61iXa.js +0 -606
  42. open_codex_ui-0.1.4/yier_web/static/assets/api-CeihACIV.js +0 -1099
  43. open_codex_ui-0.1.4/yier_web/static/assets/index-BdFqJ-Kl.css +0 -1
  44. open_codex_ui-0.1.4/yier_web/static/assets/index-CjVNk6ja.js +0 -183
  45. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/MANIFEST.in +0 -0
  46. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/open_codex_ui.egg-info/dependency_links.txt +0 -0
  47. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/open_codex_ui.egg-info/requires.txt +0 -0
  48. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/open_codex_ui.egg-info/top_level.txt +0 -0
  49. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/setup.cfg +0 -0
  50. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/tests/test_app.py +0 -0
  51. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/tests/test_shutdown_signals.py +0 -0
  52. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/__init__.py +0 -0
  53. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/app.py +0 -0
  54. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/auth.py +0 -0
  55. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/codex/__init__.py +0 -0
  56. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/codex/session_events.py +0 -0
  57. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/codex/ws_commands.py +0 -0
  58. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/directory_picker.py +0 -0
  59. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/event_stream.py +0 -0
  60. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/frontend.py +0 -0
  61. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/routes/__init__.py +0 -0
  62. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/routes/core.py +0 -0
  63. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/open-codex-ui-icon-DKJ1ZKj4.svg +0 -0
  64. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/primeicons-C6QP2o4f.woff2 +0 -0
  65. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/primeicons-DMOk5skT.eot +0 -0
  66. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/primeicons-Dr5RGzOO.svg +0 -0
  67. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/primeicons-MpK4pl85.ttf +0 -0
  68. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/primeicons-WjwUDZjB.woff +0 -0
  69. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/assets/useCodexWorkspace-6QenDzvb.css +0 -0
  70. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/brand/open-codex-ui-logo.svg +0 -0
  71. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/favicon.ico +0 -0
  72. {open_codex_ui-0.1.4 → open_codex_ui-0.1.7}/yier_web/static/favicon.svg +0 -0
@@ -0,0 +1,76 @@
1
+ # PolyForm Noncommercial License 1.0.0
2
+
3
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
4
+
5
+ Required Notice: Copyright 2026 Sube (zhangluguang).
6
+ Required Notice: Commercial use requires separate written permission from the copyright holder.
7
+
8
+ ## Acceptance
9
+
10
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
11
+
12
+ ## Copyright License
13
+
14
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
15
+
16
+ ## Distribution License
17
+
18
+ The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
19
+
20
+ ## Notices
21
+
22
+ You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
23
+
24
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
25
+
26
+ ## Changes and New Works License
27
+
28
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
29
+
30
+ ## Patent License
31
+
32
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
33
+
34
+ ## Noncommercial Purposes
35
+
36
+ Any noncommercial purpose is a permitted purpose.
37
+
38
+ ## Personal Uses
39
+
40
+ Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
41
+
42
+ ## Noncommercial Organizations
43
+
44
+ Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
45
+
46
+ ## Fair Use
47
+
48
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
49
+
50
+ ## No Other Rights
51
+
52
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
53
+
54
+ ## Patent Defense
55
+
56
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
57
+
58
+ ## Violations
59
+
60
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
61
+
62
+ ## No Liability
63
+
64
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
65
+
66
+ ## Definitions
67
+
68
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
69
+
70
+ **You** refers to the individual or entity agreeing to these terms.
71
+
72
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
73
+
74
+ **Your licenses** are all the licenses granted to you for the software under these terms.
75
+
76
+ **Use** means anything you do with the software requiring one of your licenses.
@@ -0,0 +1,184 @@
1
+ Metadata-Version: 2.4
2
+ Name: open-codex-ui
3
+ Version: 0.1.7
4
+ Summary: Remote-friendly web workspace for Codex sessions
5
+ Author: Sube
6
+ License-Expression: PolyForm-Noncommercial-1.0.0
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: open-codex-bridge>=0.1.9
11
+ Requires-Dist: granian[reload]>=2.7.2
12
+ Requires-Dist: httpx>=0.28.1
13
+ Requires-Dist: litestar>=2.21.1
14
+ Requires-Dist: pydantic>=2.12.5
15
+ Requires-Dist: yier-agents>=0.1.3
16
+ Dynamic: license-file
17
+
18
+ <p align="center">
19
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/brand/open-codex-ui-logo.svg" alt="Open Codex UI" width="520">
20
+ </p>
21
+
22
+ # Open Codex UI
23
+
24
+ A remote-friendly web workspace for continuing Codex sessions from desktop and
25
+ mobile browsers.
26
+
27
+ > [!IMPORTANT]
28
+ > **Non-commercial use only.** This project is provided solely for learning,
29
+ > research, personal use, and other non-commercial purposes. Commercial use
30
+ > requires prior written permission from the copyright holder.
31
+
32
+ ## Preview
33
+
34
+ <p align="center">
35
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-desktop.png" alt="Open Codex UI desktop workspace">
36
+ </p>
37
+
38
+ <p align="center">
39
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-mobile-chat.png" alt="Open Codex UI mobile chat" width="300">
40
+ &nbsp;&nbsp;
41
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-mobile-projects.png" alt="Open Codex UI mobile project drawer" width="300">
42
+ </p>
43
+
44
+ ## Quick Start
45
+
46
+ Run the packaged application through Node.js:
47
+
48
+ ```bash
49
+ npx open-codex-ui
50
+ ```
51
+
52
+ The npm launcher reuses an existing `uvx`, or installs `uv` from Astral's
53
+ official installer into its own cache. You can also run the Python package
54
+ directly with [`uv`](https://docs.astral.sh/uv/):
55
+
56
+ ```bash
57
+ uvx open-codex-ui
58
+ ```
59
+
60
+ Open `http://127.0.0.1:13140`. The wheel already contains the compiled frontend.
61
+ To accept connections from other devices, bind explicitly to the network:
62
+
63
+ ```bash
64
+ uvx open-codex-ui serve --host 0.0.0.0 --port 13140
65
+ ```
66
+
67
+ ## Background Service
68
+
69
+ Install the command persistently and register login startup:
70
+
71
+ ```bash
72
+ npx open-codex-ui daemon install
73
+ # or
74
+ uvx open-codex-ui daemon install
75
+ ```
76
+
77
+ This installs `open-codex-ui` into uv's user bin directory and uses the native
78
+ service manager for the current platform:
79
+
80
+ | Platform | Service |
81
+ | -------- | --------------------------------------- |
82
+ | macOS | LaunchAgent in `~/Library/LaunchAgents` |
83
+ | Linux | `systemd --user` service |
84
+ | Windows | Current-user Task Scheduler task |
85
+
86
+ After opening a new shell, manage the service directly:
87
+
88
+ ```bash
89
+ open-codex-ui daemon status
90
+ open-codex-ui daemon stop
91
+ open-codex-ui daemon start
92
+ open-codex-ui daemon uninstall
93
+ ```
94
+
95
+ The service starts when the user logs in. Runtime state, retained environment,
96
+ and logs live under `~/.yier/web/`. Run `daemon install` again to update its
97
+ host, port, or captured environment; use `update` for application versions.
98
+
99
+ ## Updating
100
+
101
+ Update a persistent installation to the latest stable release:
102
+
103
+ ```bash
104
+ open-codex-ui update
105
+ # or
106
+ npx open-codex-ui update
107
+ ```
108
+
109
+ If the login service is running, it is restarted after the update. Plain
110
+ `uvx` and `npx` runs resolve their release when launched, so the command makes
111
+ no persistent changes when no uv tool installation exists.
112
+
113
+ ## Authentication
114
+
115
+ Authentication is disabled unless a password variable is configured:
116
+
117
+ ```bash
118
+ export YIER_AUTH_PASSWORD='change-this-password'
119
+ uvx open-codex-ui daemon install --host 0.0.0.0
120
+ ```
121
+
122
+ For a hashed password:
123
+
124
+ ```bash
125
+ uv run --with open-codex-ui python -c "from yier_web.auth import hash_password; print(hash_password('change-this-password'))"
126
+ export YIER_AUTH_PASSWORD_HASH='paste-generated-hash-here'
127
+ ```
128
+
129
+ | Variable | Purpose |
130
+ | ----------------------------- | ----------------------------------------- |
131
+ | `YIER_AUTH_PASSWORD` | Plain login password |
132
+ | `YIER_AUTH_PASSWORD_HASH` | Hashed login password |
133
+ | `YIER_AUTH_SECRET` | Additional session-cookie signing secret |
134
+ | `YIER_AUTH_SESSION_TTL_HOURS` | Session lifetime; defaults to `168` hours |
135
+ | `YIER_CODEX_EMBED_TOKEN` | Token for unauthenticated iframe access |
136
+
137
+ `daemon install` retains `HOME`, `PATH`, `CODEX_HOME`, and current `YIER_*`
138
+ variables in a user-only environment file so they remain available after login.
139
+
140
+ ## Development
141
+
142
+ Source development requires Python 3.12+, Node.js 20+, `uv`, and `pnpm`:
143
+
144
+ ```bash
145
+ uv sync
146
+ pnpm --dir web install
147
+ uv run dev
148
+ ```
149
+
150
+ The application remains at `http://127.0.0.1:13140`; in development mode the
151
+ backend proxies frontend traffic to the Vite server on port `5173`.
152
+
153
+ | Command | Purpose |
154
+ | -------------------------------------- | ----------------------------------------------------------- |
155
+ | `uv run dev` | Start frontend and backend with reload |
156
+ | `uv run dev-web` | Start Vite only |
157
+ | `uv run dev-backend` | Start the backend only |
158
+ | `uv run publish` | Type-check and build frontend assets into `yier_web/static` |
159
+ | `uv run open-codex-ui` | Run the source checkout in production mode |
160
+ | `uv run pytest` | Run backend tests |
161
+ | `uv run python -m compileall yier_web` | Check Python compilation |
162
+ | `pnpm --dir web test:unit` | Run frontend unit tests |
163
+ | `pnpm --dir web type-check` | Run frontend type checking |
164
+
165
+ To test the production build from source:
166
+
167
+ ```bash
168
+ uv run publish
169
+ uv run open-codex-ui
170
+ ```
171
+
172
+ Codex integration is provided by the published
173
+ [`open-codex-bridge`](https://pypi.org/project/open-codex-bridge/) package.
174
+
175
+ ## Iframe Embedding
176
+
177
+ See [IFRAME.md](./IFRAME.md) for iframe authentication, setup, and the
178
+ `postMessage` API.
179
+
180
+ ## License
181
+
182
+ Copyright 2026 Sube (zhangluguang). Licensed under the
183
+ [PolyForm Noncommercial License 1.0.0](./LICENSE). Commercial use is not
184
+ permitted without separate written authorization from the copyright holder.
@@ -0,0 +1,167 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/brand/open-codex-ui-logo.svg" alt="Open Codex UI" width="520">
3
+ </p>
4
+
5
+ # Open Codex UI
6
+
7
+ A remote-friendly web workspace for continuing Codex sessions from desktop and
8
+ mobile browsers.
9
+
10
+ > [!IMPORTANT]
11
+ > **Non-commercial use only.** This project is provided solely for learning,
12
+ > research, personal use, and other non-commercial purposes. Commercial use
13
+ > requires prior written permission from the copyright holder.
14
+
15
+ ## Preview
16
+
17
+ <p align="center">
18
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-desktop.png" alt="Open Codex UI desktop workspace">
19
+ </p>
20
+
21
+ <p align="center">
22
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-mobile-chat.png" alt="Open Codex UI mobile chat" width="300">
23
+ &nbsp;&nbsp;
24
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-mobile-projects.png" alt="Open Codex UI mobile project drawer" width="300">
25
+ </p>
26
+
27
+ ## Quick Start
28
+
29
+ Run the packaged application through Node.js:
30
+
31
+ ```bash
32
+ npx open-codex-ui
33
+ ```
34
+
35
+ The npm launcher reuses an existing `uvx`, or installs `uv` from Astral's
36
+ official installer into its own cache. You can also run the Python package
37
+ directly with [`uv`](https://docs.astral.sh/uv/):
38
+
39
+ ```bash
40
+ uvx open-codex-ui
41
+ ```
42
+
43
+ Open `http://127.0.0.1:13140`. The wheel already contains the compiled frontend.
44
+ To accept connections from other devices, bind explicitly to the network:
45
+
46
+ ```bash
47
+ uvx open-codex-ui serve --host 0.0.0.0 --port 13140
48
+ ```
49
+
50
+ ## Background Service
51
+
52
+ Install the command persistently and register login startup:
53
+
54
+ ```bash
55
+ npx open-codex-ui daemon install
56
+ # or
57
+ uvx open-codex-ui daemon install
58
+ ```
59
+
60
+ This installs `open-codex-ui` into uv's user bin directory and uses the native
61
+ service manager for the current platform:
62
+
63
+ | Platform | Service |
64
+ | -------- | --------------------------------------- |
65
+ | macOS | LaunchAgent in `~/Library/LaunchAgents` |
66
+ | Linux | `systemd --user` service |
67
+ | Windows | Current-user Task Scheduler task |
68
+
69
+ After opening a new shell, manage the service directly:
70
+
71
+ ```bash
72
+ open-codex-ui daemon status
73
+ open-codex-ui daemon stop
74
+ open-codex-ui daemon start
75
+ open-codex-ui daemon uninstall
76
+ ```
77
+
78
+ The service starts when the user logs in. Runtime state, retained environment,
79
+ and logs live under `~/.yier/web/`. Run `daemon install` again to update its
80
+ host, port, or captured environment; use `update` for application versions.
81
+
82
+ ## Updating
83
+
84
+ Update a persistent installation to the latest stable release:
85
+
86
+ ```bash
87
+ open-codex-ui update
88
+ # or
89
+ npx open-codex-ui update
90
+ ```
91
+
92
+ If the login service is running, it is restarted after the update. Plain
93
+ `uvx` and `npx` runs resolve their release when launched, so the command makes
94
+ no persistent changes when no uv tool installation exists.
95
+
96
+ ## Authentication
97
+
98
+ Authentication is disabled unless a password variable is configured:
99
+
100
+ ```bash
101
+ export YIER_AUTH_PASSWORD='change-this-password'
102
+ uvx open-codex-ui daemon install --host 0.0.0.0
103
+ ```
104
+
105
+ For a hashed password:
106
+
107
+ ```bash
108
+ uv run --with open-codex-ui python -c "from yier_web.auth import hash_password; print(hash_password('change-this-password'))"
109
+ export YIER_AUTH_PASSWORD_HASH='paste-generated-hash-here'
110
+ ```
111
+
112
+ | Variable | Purpose |
113
+ | ----------------------------- | ----------------------------------------- |
114
+ | `YIER_AUTH_PASSWORD` | Plain login password |
115
+ | `YIER_AUTH_PASSWORD_HASH` | Hashed login password |
116
+ | `YIER_AUTH_SECRET` | Additional session-cookie signing secret |
117
+ | `YIER_AUTH_SESSION_TTL_HOURS` | Session lifetime; defaults to `168` hours |
118
+ | `YIER_CODEX_EMBED_TOKEN` | Token for unauthenticated iframe access |
119
+
120
+ `daemon install` retains `HOME`, `PATH`, `CODEX_HOME`, and current `YIER_*`
121
+ variables in a user-only environment file so they remain available after login.
122
+
123
+ ## Development
124
+
125
+ Source development requires Python 3.12+, Node.js 20+, `uv`, and `pnpm`:
126
+
127
+ ```bash
128
+ uv sync
129
+ pnpm --dir web install
130
+ uv run dev
131
+ ```
132
+
133
+ The application remains at `http://127.0.0.1:13140`; in development mode the
134
+ backend proxies frontend traffic to the Vite server on port `5173`.
135
+
136
+ | Command | Purpose |
137
+ | -------------------------------------- | ----------------------------------------------------------- |
138
+ | `uv run dev` | Start frontend and backend with reload |
139
+ | `uv run dev-web` | Start Vite only |
140
+ | `uv run dev-backend` | Start the backend only |
141
+ | `uv run publish` | Type-check and build frontend assets into `yier_web/static` |
142
+ | `uv run open-codex-ui` | Run the source checkout in production mode |
143
+ | `uv run pytest` | Run backend tests |
144
+ | `uv run python -m compileall yier_web` | Check Python compilation |
145
+ | `pnpm --dir web test:unit` | Run frontend unit tests |
146
+ | `pnpm --dir web type-check` | Run frontend type checking |
147
+
148
+ To test the production build from source:
149
+
150
+ ```bash
151
+ uv run publish
152
+ uv run open-codex-ui
153
+ ```
154
+
155
+ Codex integration is provided by the published
156
+ [`open-codex-bridge`](https://pypi.org/project/open-codex-bridge/) package.
157
+
158
+ ## Iframe Embedding
159
+
160
+ See [IFRAME.md](./IFRAME.md) for iframe authentication, setup, and the
161
+ `postMessage` API.
162
+
163
+ ## License
164
+
165
+ Copyright 2026 Sube (zhangluguang). Licensed under the
166
+ [PolyForm Noncommercial License 1.0.0](./LICENSE). Commercial use is not
167
+ permitted without separate written authorization from the copyright holder.
@@ -0,0 +1,184 @@
1
+ Metadata-Version: 2.4
2
+ Name: open-codex-ui
3
+ Version: 0.1.7
4
+ Summary: Remote-friendly web workspace for Codex sessions
5
+ Author: Sube
6
+ License-Expression: PolyForm-Noncommercial-1.0.0
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: open-codex-bridge>=0.1.9
11
+ Requires-Dist: granian[reload]>=2.7.2
12
+ Requires-Dist: httpx>=0.28.1
13
+ Requires-Dist: litestar>=2.21.1
14
+ Requires-Dist: pydantic>=2.12.5
15
+ Requires-Dist: yier-agents>=0.1.3
16
+ Dynamic: license-file
17
+
18
+ <p align="center">
19
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/brand/open-codex-ui-logo.svg" alt="Open Codex UI" width="520">
20
+ </p>
21
+
22
+ # Open Codex UI
23
+
24
+ A remote-friendly web workspace for continuing Codex sessions from desktop and
25
+ mobile browsers.
26
+
27
+ > [!IMPORTANT]
28
+ > **Non-commercial use only.** This project is provided solely for learning,
29
+ > research, personal use, and other non-commercial purposes. Commercial use
30
+ > requires prior written permission from the copyright holder.
31
+
32
+ ## Preview
33
+
34
+ <p align="center">
35
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-desktop.png" alt="Open Codex UI desktop workspace">
36
+ </p>
37
+
38
+ <p align="center">
39
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-mobile-chat.png" alt="Open Codex UI mobile chat" width="300">
40
+ &nbsp;&nbsp;
41
+ <img src="https://raw.githubusercontent.com/Sube-py/open-codex-ui/main/web/public/screenshots/open-codex-ui-mobile-projects.png" alt="Open Codex UI mobile project drawer" width="300">
42
+ </p>
43
+
44
+ ## Quick Start
45
+
46
+ Run the packaged application through Node.js:
47
+
48
+ ```bash
49
+ npx open-codex-ui
50
+ ```
51
+
52
+ The npm launcher reuses an existing `uvx`, or installs `uv` from Astral's
53
+ official installer into its own cache. You can also run the Python package
54
+ directly with [`uv`](https://docs.astral.sh/uv/):
55
+
56
+ ```bash
57
+ uvx open-codex-ui
58
+ ```
59
+
60
+ Open `http://127.0.0.1:13140`. The wheel already contains the compiled frontend.
61
+ To accept connections from other devices, bind explicitly to the network:
62
+
63
+ ```bash
64
+ uvx open-codex-ui serve --host 0.0.0.0 --port 13140
65
+ ```
66
+
67
+ ## Background Service
68
+
69
+ Install the command persistently and register login startup:
70
+
71
+ ```bash
72
+ npx open-codex-ui daemon install
73
+ # or
74
+ uvx open-codex-ui daemon install
75
+ ```
76
+
77
+ This installs `open-codex-ui` into uv's user bin directory and uses the native
78
+ service manager for the current platform:
79
+
80
+ | Platform | Service |
81
+ | -------- | --------------------------------------- |
82
+ | macOS | LaunchAgent in `~/Library/LaunchAgents` |
83
+ | Linux | `systemd --user` service |
84
+ | Windows | Current-user Task Scheduler task |
85
+
86
+ After opening a new shell, manage the service directly:
87
+
88
+ ```bash
89
+ open-codex-ui daemon status
90
+ open-codex-ui daemon stop
91
+ open-codex-ui daemon start
92
+ open-codex-ui daemon uninstall
93
+ ```
94
+
95
+ The service starts when the user logs in. Runtime state, retained environment,
96
+ and logs live under `~/.yier/web/`. Run `daemon install` again to update its
97
+ host, port, or captured environment; use `update` for application versions.
98
+
99
+ ## Updating
100
+
101
+ Update a persistent installation to the latest stable release:
102
+
103
+ ```bash
104
+ open-codex-ui update
105
+ # or
106
+ npx open-codex-ui update
107
+ ```
108
+
109
+ If the login service is running, it is restarted after the update. Plain
110
+ `uvx` and `npx` runs resolve their release when launched, so the command makes
111
+ no persistent changes when no uv tool installation exists.
112
+
113
+ ## Authentication
114
+
115
+ Authentication is disabled unless a password variable is configured:
116
+
117
+ ```bash
118
+ export YIER_AUTH_PASSWORD='change-this-password'
119
+ uvx open-codex-ui daemon install --host 0.0.0.0
120
+ ```
121
+
122
+ For a hashed password:
123
+
124
+ ```bash
125
+ uv run --with open-codex-ui python -c "from yier_web.auth import hash_password; print(hash_password('change-this-password'))"
126
+ export YIER_AUTH_PASSWORD_HASH='paste-generated-hash-here'
127
+ ```
128
+
129
+ | Variable | Purpose |
130
+ | ----------------------------- | ----------------------------------------- |
131
+ | `YIER_AUTH_PASSWORD` | Plain login password |
132
+ | `YIER_AUTH_PASSWORD_HASH` | Hashed login password |
133
+ | `YIER_AUTH_SECRET` | Additional session-cookie signing secret |
134
+ | `YIER_AUTH_SESSION_TTL_HOURS` | Session lifetime; defaults to `168` hours |
135
+ | `YIER_CODEX_EMBED_TOKEN` | Token for unauthenticated iframe access |
136
+
137
+ `daemon install` retains `HOME`, `PATH`, `CODEX_HOME`, and current `YIER_*`
138
+ variables in a user-only environment file so they remain available after login.
139
+
140
+ ## Development
141
+
142
+ Source development requires Python 3.12+, Node.js 20+, `uv`, and `pnpm`:
143
+
144
+ ```bash
145
+ uv sync
146
+ pnpm --dir web install
147
+ uv run dev
148
+ ```
149
+
150
+ The application remains at `http://127.0.0.1:13140`; in development mode the
151
+ backend proxies frontend traffic to the Vite server on port `5173`.
152
+
153
+ | Command | Purpose |
154
+ | -------------------------------------- | ----------------------------------------------------------- |
155
+ | `uv run dev` | Start frontend and backend with reload |
156
+ | `uv run dev-web` | Start Vite only |
157
+ | `uv run dev-backend` | Start the backend only |
158
+ | `uv run publish` | Type-check and build frontend assets into `yier_web/static` |
159
+ | `uv run open-codex-ui` | Run the source checkout in production mode |
160
+ | `uv run pytest` | Run backend tests |
161
+ | `uv run python -m compileall yier_web` | Check Python compilation |
162
+ | `pnpm --dir web test:unit` | Run frontend unit tests |
163
+ | `pnpm --dir web type-check` | Run frontend type checking |
164
+
165
+ To test the production build from source:
166
+
167
+ ```bash
168
+ uv run publish
169
+ uv run open-codex-ui
170
+ ```
171
+
172
+ Codex integration is provided by the published
173
+ [`open-codex-bridge`](https://pypi.org/project/open-codex-bridge/) package.
174
+
175
+ ## Iframe Embedding
176
+
177
+ See [IFRAME.md](./IFRAME.md) for iframe authentication, setup, and the
178
+ `postMessage` API.
179
+
180
+ ## License
181
+
182
+ Copyright 2026 Sube (zhangluguang). Licensed under the
183
+ [PolyForm Noncommercial License 1.0.0](./LICENSE). Commercial use is not
184
+ permitted without separate written authorization from the copyright holder.
@@ -1,3 +1,4 @@
1
+ LICENSE
1
2
  MANIFEST.in
2
3
  README.md
3
4
  pyproject.toml
@@ -9,18 +10,24 @@ open_codex_ui.egg-info/requires.txt
9
10
  open_codex_ui.egg-info/top_level.txt
10
11
  tests/test_app.py
11
12
  tests/test_codex_ipc_manager.py
13
+ tests/test_daemon.py
12
14
  tests/test_main.py
15
+ tests/test_release_versions.py
13
16
  tests/test_shutdown_signals.py
17
+ tests/test_ssh_config.py
14
18
  tests/test_yier_cli.py
15
19
  yier_web/__init__.py
16
20
  yier_web/app.py
17
21
  yier_web/auth.py
18
22
  yier_web/cli.py
19
23
  yier_web/config.py
24
+ yier_web/daemon.py
20
25
  yier_web/directory_picker.py
21
26
  yier_web/event_stream.py
22
27
  yier_web/frontend.py
23
28
  yier_web/schemas.py
29
+ yier_web/ssh_config.py
30
+ yier_web/system_services.py
24
31
  yier_web/codex/__init__.py
25
32
  yier_web/codex/ipc_manager.py
26
33
  yier_web/codex/session_events.py
@@ -31,13 +38,13 @@ yier_web/routes/core.py
31
38
  yier_web/static/favicon.ico
32
39
  yier_web/static/favicon.svg
33
40
  yier_web/static/index.html
34
- yier_web/static/assets/CodexEmbedView-CN_-Mhe2.js
35
- yier_web/static/assets/CodexView-wpI61iXa.js
36
- yier_web/static/assets/LoginView-CELCom2O.js
37
- yier_web/static/assets/api-CeihACIV.js
38
- yier_web/static/assets/index-BdFqJ-Kl.css
39
- yier_web/static/assets/index-CjVNk6ja.js
40
- yier_web/static/assets/index-mSBvq1p8.js
41
+ yier_web/static/assets/CodexEmbedView-D2C2AL0J.js
42
+ yier_web/static/assets/CodexView-xCApa-En.js
43
+ yier_web/static/assets/LoginView-22G23Nxb.js
44
+ yier_web/static/assets/api-CQ1ZRFSL.js
45
+ yier_web/static/assets/index--CkIJHj3.css
46
+ yier_web/static/assets/index-BRPULTI7.js
47
+ yier_web/static/assets/index-CxkjsTB_.js
41
48
  yier_web/static/assets/open-codex-ui-icon-DKJ1ZKj4.svg
42
49
  yier_web/static/assets/primeicons-C6QP2o4f.woff2
43
50
  yier_web/static/assets/primeicons-DMOk5skT.eot
@@ -45,5 +52,8 @@ yier_web/static/assets/primeicons-Dr5RGzOO.svg
45
52
  yier_web/static/assets/primeicons-MpK4pl85.ttf
46
53
  yier_web/static/assets/primeicons-WjwUDZjB.woff
47
54
  yier_web/static/assets/useCodexWorkspace-6QenDzvb.css
48
- yier_web/static/assets/useCodexWorkspace-D1rCOO1x.js
49
- yier_web/static/brand/open-codex-ui-logo.svg
55
+ yier_web/static/assets/useCodexWorkspace-BZADV-Zo.js
56
+ yier_web/static/brand/open-codex-ui-logo.svg
57
+ yier_web/static/screenshots/open-codex-ui-desktop.png
58
+ yier_web/static/screenshots/open-codex-ui-mobile-chat.png
59
+ yier_web/static/screenshots/open-codex-ui-mobile-projects.png
@@ -0,0 +1,6 @@
1
+ [console_scripts]
2
+ dev = yier_web.cli:dev
3
+ dev-backend = yier_web.cli:dev_backend
4
+ dev-web = yier_web.cli:dev_web
5
+ open-codex-ui = yier_web.cli:main
6
+ publish = yier_web.cli:build_web