codeaway 0.1.0__py3-none-any.whl

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.
@@ -0,0 +1,41 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>CodeAway</title>
7
+ <link rel="stylesheet" href="/style.css">
8
+ </head>
9
+ <body>
10
+ <main id="phone-workspace" class="phone-workspace">
11
+ <header id="phone-status" class="phone-status">
12
+ <div>
13
+ <p class="eyebrow">CodeAway</p>
14
+ <p id="status-message" class="status-message" role="status">Connecting…</p>
15
+ </div>
16
+ <a href="/setup">Setup</a>
17
+ </header>
18
+
19
+ <section id="navigator" class="navigator" aria-labelledby="navigator-title">
20
+ <h1 id="navigator-title">Navigator</h1>
21
+ <div id="navigator-projects" class="navigator-projects" aria-live="polite"></div>
22
+ </section>
23
+
24
+ <section id="conversation" class="conversation" aria-labelledby="conversation-title">
25
+ <h2 id="conversation-title">Conversation</h2>
26
+ <p id="conversation-message" class="message" role="status"></p>
27
+ <img id="conversation-image" alt="Current agent conversation">
28
+ </section>
29
+
30
+ <form id="composer" class="composer" aria-labelledby="composer-title">
31
+ <label id="composer-title" for="composer-input">Message</label>
32
+ <div class="composer-controls">
33
+ <textarea id="composer-input" rows="3" placeholder="Send a message to the agent"></textarea>
34
+ <button id="composer-send" type="submit">Send</button>
35
+ </div>
36
+ <p id="composer-message" class="message" role="status"></p>
37
+ </form>
38
+ </main>
39
+ <script src="/app.js"></script>
40
+ </body>
41
+ </html>
@@ -0,0 +1,57 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>CodeAway setup</title>
7
+ <link rel="stylesheet" href="/style.css">
8
+ </head>
9
+ <body>
10
+ <main>
11
+ <header class="page-header">
12
+ <p class="eyebrow">CodeAway</p>
13
+ <h1>Set up your capture areas</h1>
14
+ <p>Choose the local agent window, then draw the three areas CodeAway can safely use.</p>
15
+ </header>
16
+
17
+ <figure class="capture-guide" aria-labelledby="capture-guide-title">
18
+ <figcaption id="capture-guide-title">Capture these three areas</figcaption>
19
+ <div class="agent-window-diagram">
20
+ <div data-region="sidebar">Sidebar<br><small>projects and tasks</small></div>
21
+ <div data-region="conversation">Conversation<br><small>right pane above the input</small></div>
22
+ <div data-region="composer">Composer<br><small>chat box only; it may grow taller</small></div>
23
+ </div>
24
+ <p>Do not include the full-width toolbar or status row in Composer.</p>
25
+ </figure>
26
+
27
+ <section class="setup-editor" aria-labelledby="editor-title">
28
+ <h2 id="editor-title">Calibrate the agent window</h2>
29
+ <p id="setup-message" class="message" role="status">Looking for compatible windows…</p>
30
+
31
+ <label for="window-select">Compatible window</label>
32
+ <div class="window-choice">
33
+ <select id="window-select" disabled></select>
34
+ <button id="load-window" type="button" disabled>Load window</button>
35
+ <button id="refresh-windows" type="button" hidden>Refresh windows</button>
36
+ </div>
37
+
38
+ <fieldset id="region-choice" disabled>
39
+ <legend>Area to draw</legend>
40
+ <label><input type="radio" name="region" value="sidebar" checked> Sidebar</label>
41
+ <label><input type="radio" name="region" value="conversation"> Conversation</label>
42
+ <label><input type="radio" name="region" value="composer"> Composer</label>
43
+ </fieldset>
44
+
45
+ <div id="screenshot-stage" class="screenshot-stage" hidden role="group" aria-label="Window screenshot calibration editor">
46
+ <img id="window-screenshot" alt="Selected agent window screenshot">
47
+ <div id="region-overlays" class="region-overlays" aria-hidden="true"></div>
48
+ </div>
49
+ <p id="drag-help" class="help" hidden>Drag over the selected area. Areas smaller than 1% of the image are not saved.</p>
50
+
51
+ <button id="save-calibration" type="button" disabled>Save calibration</button>
52
+ <p id="setup-complete" class="complete" hidden></p>
53
+ </section>
54
+ </main>
55
+ <script src="/app.js"></script>
56
+ </body>
57
+ </html>
codeaway/web/style.css ADDED
@@ -0,0 +1,280 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --color-page: #f7f7f5;
4
+ --color-surface: #fff;
5
+ --color-surface-muted: #f5f6f8;
6
+ --color-surface-hover: #f4f6fb;
7
+ --color-surface-selected: #edf2ff;
8
+ --color-surface-conversation: #eef9f0;
9
+ --color-surface-composer: #fff3e8;
10
+ --color-surface-media: #e6e7ea;
11
+ --color-text: #1b1c20;
12
+ --color-text-subtle: #50535a;
13
+ --color-text-muted: #6b707a;
14
+ --color-border: #d8d9dd;
15
+ --color-border-soft: #e3e4e7;
16
+ --color-border-strong: #8e939d;
17
+ --color-border-control: #757b87;
18
+ --color-border-media: #aeb2bb;
19
+ --color-primary: #263f77;
20
+ --color-primary-text: #fff;
21
+ --color-selected-text: #193977;
22
+ --color-error: #a12727;
23
+ --color-success: #1b5f35;
24
+ --color-ready: #2c63c5;
25
+ --color-connected: #22844b;
26
+ --color-region-sidebar: #4666a9;
27
+ --color-region-conversation: #46765b;
28
+ --color-region-composer: #a26331;
29
+ --color-focus-outline: #17191d;
30
+ color: var(--color-text);
31
+ background: var(--color-page);
32
+ font-family: Inter, ui-sans-serif, system-ui, sans-serif;
33
+ line-height: 1.45;
34
+ }
35
+
36
+ @media (prefers-color-scheme: dark) {
37
+ :root {
38
+ color-scheme: dark;
39
+ --color-page: #17191d;
40
+ --color-surface: #1e2127;
41
+ --color-surface-muted: #252932;
42
+ --color-surface-hover: #2a303a;
43
+ --color-surface-selected: #1c3158;
44
+ --color-surface-conversation: #1b3022;
45
+ --color-surface-composer: #382819;
46
+ --color-surface-media: #15171c;
47
+ --color-text: #eff1f5;
48
+ --color-text-subtle: #c4c9d2;
49
+ --color-text-muted: #aab1bd;
50
+ --color-border: #424853;
51
+ --color-border-soft: #353b46;
52
+ --color-border-strong: #68707e;
53
+ --color-border-control: #818a9a;
54
+ --color-border-media: #5a626f;
55
+ --color-primary: #8aaaff;
56
+ --color-primary-text: #10131a;
57
+ --color-selected-text: #e0e9ff;
58
+ --color-error: #ffaaa6;
59
+ --color-success: #80df9e;
60
+ --color-ready: #86aeff;
61
+ --color-connected: #61dc91;
62
+ --color-region-sidebar: #9ab5ff;
63
+ --color-region-conversation: #83cd9f;
64
+ --color-region-composer: #f0b177;
65
+ --color-focus-outline: #f5f7fb;
66
+ }
67
+ }
68
+
69
+ * { box-sizing: border-box; }
70
+
71
+ body { margin: 0; }
72
+
73
+ main {
74
+ width: min(100% - 2rem, 52rem);
75
+ margin: 0 auto;
76
+ padding: 2.5rem 0 4rem;
77
+ }
78
+
79
+ h1, h2, p { margin-top: 0; }
80
+ h1 { margin-bottom: .35rem; font-size: clamp(1.8rem, 5vw, 2.5rem); line-height: 1.1; }
81
+ h2 { font-size: 1.25rem; }
82
+ .eyebrow { color: var(--color-text-subtle); font-size: .82rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
83
+ .page-header > p:last-child { max-width: 42rem; color: var(--color-text-subtle); }
84
+
85
+ .capture-guide, .setup-editor {
86
+ margin: 1.75rem 0;
87
+ padding: 1.1rem;
88
+ border: 1px solid var(--color-border);
89
+ border-radius: .6rem;
90
+ background: var(--color-surface);
91
+ }
92
+
93
+ .capture-guide figcaption { margin-bottom: .8rem; font-weight: 700; }
94
+ .capture-guide > p { margin: .8rem 0 0; color: var(--color-text-subtle); font-size: .92rem; }
95
+
96
+ .agent-window-diagram {
97
+ position: relative;
98
+ display: grid;
99
+ grid-template-columns: minmax(6.5rem, .31fr) minmax(0, 1fr);
100
+ grid-template-rows: minmax(5.7rem, 1fr) minmax(3.9rem, .54fr);
101
+ min-height: 12rem;
102
+ overflow: hidden;
103
+ padding: 1.25rem .65rem 1rem;
104
+ border: 1px solid var(--color-border-strong);
105
+ border-radius: .4rem;
106
+ background: var(--color-surface-muted);
107
+ gap: .45rem;
108
+ }
109
+
110
+ .agent-window-diagram::before, .agent-window-diagram::after {
111
+ position: absolute;
112
+ right: 0;
113
+ left: 0;
114
+ color: var(--color-text-muted);
115
+ font-size: .68rem;
116
+ text-align: center;
117
+ }
118
+ .agent-window-diagram::before { top: .28rem; content: "full-width toolbar"; }
119
+ .agent-window-diagram::after { bottom: .15rem; content: "full-width status row — excluded"; }
120
+
121
+ .agent-window-diagram [data-region] {
122
+ position: relative;
123
+ z-index: 1;
124
+ padding: .7rem;
125
+ border: 2px solid;
126
+ border-radius: .3rem;
127
+ font-size: .9rem;
128
+ font-weight: 700;
129
+ }
130
+ .agent-window-diagram small { display: inline-block; margin-top: .2rem; font-size: .7rem; font-weight: 500; line-height: 1.25; }
131
+ .agent-window-diagram [data-region="sidebar"] { grid-row: 1 / span 2; border-color: var(--color-region-sidebar); background: var(--color-surface-selected); }
132
+ .agent-window-diagram [data-region="conversation"] { border-color: var(--color-region-conversation); background: var(--color-surface-conversation); }
133
+ .agent-window-diagram [data-region="composer"] { margin-inline: 13%; border-color: var(--color-region-composer); background: var(--color-surface-composer); }
134
+
135
+ .setup-editor > label, fieldset { display: block; margin-top: 1rem; }
136
+ .window-choice { display: flex; gap: .6rem; margin-top: .35rem; }
137
+ select { min-width: 0; flex: 1; }
138
+ button, select { min-height: 2.35rem; border: 1px solid var(--color-border-control); border-radius: .3rem; background: var(--color-surface); color: inherit; font: inherit; padding: .35rem .65rem; }
139
+ button { cursor: pointer; background: var(--color-primary); border-color: var(--color-primary); color: var(--color-primary-text); font-weight: 700; }
140
+ button:disabled, select:disabled { cursor: not-allowed; opacity: .55; }
141
+ fieldset { border: 0; padding: 0; }
142
+ legend { margin-bottom: .35rem; font-weight: 700; }
143
+ fieldset label { display: inline-flex; align-items: center; margin-right: .85rem; }
144
+ input { accent-color: var(--color-primary); }
145
+ .message { min-height: 1.45rem; color: var(--color-text-subtle); }
146
+ .message.error { color: var(--color-error); }
147
+ .help { color: var(--color-text-subtle); font-size: .9rem; }
148
+
149
+ .screenshot-stage {
150
+ position: relative;
151
+ width: 100%;
152
+ margin-top: 1.1rem;
153
+ overflow: hidden;
154
+ border: 1px solid var(--color-border-media);
155
+ background: var(--color-surface-media);
156
+ cursor: crosshair;
157
+ touch-action: none;
158
+ }
159
+ .screenshot-stage img { display: block; width: 100%; height: auto; }
160
+ .region-overlays { position: absolute; inset: 0; pointer-events: none; }
161
+ .region-overlay {
162
+ --region-color: var(--color-region-sidebar);
163
+ position: absolute;
164
+ border: 2px solid var(--region-color);
165
+ background: color-mix(in srgb, var(--region-color) 12%, transparent);
166
+ }
167
+ .region-overlay span { position: absolute; top: 0; left: 0; padding: .1rem .3rem; background: var(--region-color); color: var(--color-primary-text); font-size: .72rem; font-weight: 700; }
168
+ .region-overlay--sidebar { --region-color: var(--color-region-sidebar); }
169
+ .region-overlay--conversation { --region-color: var(--color-region-conversation); }
170
+ .region-overlay--composer { --region-color: var(--color-region-composer); }
171
+ .region-overlay.selected { box-shadow: 0 0 0 2px var(--color-focus-outline); }
172
+ #save-calibration { margin-top: 1rem; }
173
+ .complete { margin: 1rem 0 0; color: var(--color-success); font-weight: 600; }
174
+ .complete a { color: inherit; }
175
+
176
+ .phone-workspace {
177
+ width: min(100% - 1rem, 42rem);
178
+ padding: 1rem 0 2.5rem;
179
+ }
180
+
181
+ .phone-status {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: space-between;
185
+ gap: 1rem;
186
+ padding: .7rem 0 1rem;
187
+ border-bottom: 1px solid var(--color-border);
188
+ }
189
+ .phone-status .eyebrow { margin: 0; }
190
+ .status-message { margin: .12rem 0 0; color: var(--color-text-subtle); font-size: .9rem; }
191
+ .phone-status a { color: var(--color-primary); font-weight: 700; }
192
+
193
+ .navigator, .conversation, .composer {
194
+ margin-top: 1.25rem;
195
+ padding: 1rem;
196
+ border: 1px solid var(--color-border);
197
+ border-radius: .6rem;
198
+ background: var(--color-surface);
199
+ }
200
+ .navigator h1, .conversation h2 { margin-bottom: .8rem; font-size: 1.1rem; }
201
+ .navigator-projects { display: grid; gap: .45rem; }
202
+ .project { border: 1px solid var(--color-border-soft); border-radius: .4rem; overflow: hidden; }
203
+ .project-toggle, .task {
204
+ display: grid;
205
+ width: 100%;
206
+ min-height: 2.65rem;
207
+ align-items: center;
208
+ text-align: left;
209
+ color: inherit;
210
+ }
211
+ .project-toggle {
212
+ grid-template-columns: 1.25rem minmax(0, 1fr) auto;
213
+ gap: .4rem;
214
+ padding: .45rem .55rem;
215
+ border: 0;
216
+ border-radius: 0;
217
+ background: var(--color-surface);
218
+ font-weight: 700;
219
+ }
220
+ .project-toggle:hover, .task:hover { background: var(--color-surface-hover); }
221
+ .project-chevron, .worktree-marker, .status-icon { width: 16px; height: 16px; flex: none; }
222
+ .project-chevron { transition: transform .12s ease; }
223
+ .project-chevron.expanded { transform: rotate(180deg); }
224
+ .project-name { min-width: 0; overflow-wrap: anywhere; }
225
+ .project-meta, .task-meta { display: inline-flex; align-items: center; justify-self: end; gap: .35rem; }
226
+ .project-host { color: var(--color-text-muted); font-size: .76rem; font-weight: 600; white-space: nowrap; }
227
+ .worktree-marker { color: var(--color-text-subtle); }
228
+ .status-icon--ready { color: var(--color-ready); }
229
+ .status-icon--connected { color: var(--color-connected); }
230
+ .status-icon--busy { color: var(--color-text-muted); }
231
+ .status-icon--ready path, .status-icon--connected path { fill: currentColor; stroke: none; }
232
+ .status-icon--busy { animation: navigator-spinner 1s linear infinite; }
233
+ @keyframes navigator-spinner { to { transform: rotate(360deg); } }
234
+ .task-list { border-top: 1px solid var(--color-border-soft); }
235
+ .task {
236
+ grid-template-columns: minmax(0, 1fr) auto;
237
+ gap: .45rem;
238
+ padding: .5rem .55rem .5rem 3.25rem;
239
+ border: 0;
240
+ border-radius: 0;
241
+ background: var(--color-surface);
242
+ font-weight: 500;
243
+ }
244
+ .task.selected { background: var(--color-surface-selected); color: var(--color-selected-text); }
245
+
246
+ @media (prefers-reduced-motion: reduce) {
247
+ .status-icon--busy { animation: none; }
248
+ }
249
+
250
+ #conversation-image {
251
+ display: block;
252
+ width: 100%;
253
+ min-height: 5rem;
254
+ border: 1px solid var(--color-border-media);
255
+ border-radius: .35rem;
256
+ background: var(--color-surface-media);
257
+ touch-action: none;
258
+ }
259
+ .conversation .message:empty, .composer .message:empty { display: none; }
260
+
261
+ .composer { margin-bottom: 0; }
262
+ .composer > label { display: block; margin-bottom: .45rem; font-weight: 700; }
263
+ .composer-controls { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .55rem; align-items: end; }
264
+ textarea { width: 100%; min-height: 2.7rem; resize: vertical; border: 1px solid var(--color-border-control); border-radius: .3rem; background: var(--color-surface); color: inherit; font: inherit; padding: .45rem .55rem; }
265
+
266
+ @media (max-width: 30rem) {
267
+ .phone-workspace { width: min(100% - .75rem, 42rem); }
268
+ .navigator, .conversation, .composer { padding: .8rem; }
269
+ .composer-controls { grid-template-columns: 1fr; }
270
+ .composer-send { width: 100%; }
271
+ }
272
+
273
+ @media (max-width: 30rem) {
274
+ main { width: min(100% - 1rem, 52rem); padding-top: 1.25rem; }
275
+ .capture-guide, .setup-editor { padding: .85rem; }
276
+ .agent-window-diagram { grid-template-columns: minmax(5.2rem, .31fr) minmax(0, 1fr); gap: .3rem; }
277
+ .agent-window-diagram [data-region] { padding: .45rem; font-size: .78rem; }
278
+ .agent-window-diagram small { font-size: .62rem; }
279
+ .window-choice { align-items: stretch; flex-direction: column; }
280
+ }
@@ -0,0 +1,113 @@
1
+ Metadata-Version: 2.5
2
+ Name: codeaway
3
+ Version: 0.1.0
4
+ Summary: Control a local coding agent from your phone
5
+ Project-URL: Homepage, https://github.com/jmoraispk/codeaway2
6
+ Project-URL: Repository, https://github.com/jmoraispk/codeaway2
7
+ Project-URL: Issues, https://github.com/jmoraispk/codeaway2/issues
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: ai,coding agents,remote control,tailscale
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: Microsoft :: Windows
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Topic :: Software Development
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: pillow>=11.0
21
+ Requires-Dist: uiautomation>=2.0.20; sys_platform == 'win32'
22
+ Provides-Extra: test
23
+ Requires-Dist: pytest>=8.0; extra == 'test'
24
+ Description-Content-Type: text/markdown
25
+
26
+ # CodeAway
27
+
28
+ ![CodeAway sends commands to desktop coding agents and returns replies and live status](https://raw.githubusercontent.com/jmoraispk/codeaway2/main/docs/assets/codeaway-hero.png)
29
+
30
+ CodeAway is a thin, browser-based remote control for local AI coding agents.
31
+ Version 0.1 supports one pairing only: **Windows with Codex Desktop**. The
32
+ source repository is `codeaway2`; the Python package and command are
33
+ `codeaway`.
34
+
35
+ > Status: early alpha. The Windows/Codex Desktop phone flow has been
36
+ > smoke-tested; expect rough edges and breaking changes.
37
+
38
+ ## Install
39
+
40
+ The shortest recommended path is:
41
+
42
+ ```powershell
43
+ uvx codeaway
44
+ ```
45
+
46
+ `uvx` is convenient, not required. You can instead install with either:
47
+
48
+ ```powershell
49
+ pipx install codeaway
50
+ ```
51
+
52
+ ```powershell
53
+ py -m pip install codeaway
54
+ ```
55
+
56
+ ## Platform support
57
+
58
+ Windows with Codex Desktop is the supported pairing. macOS and Linux can
59
+ install the package, but desktop control for those platforms is not implemented
60
+ yet.
61
+
62
+ ## Run CodeAway
63
+
64
+ The first run is laptop-only. Start CodeAway in the foreground:
65
+
66
+ ```powershell
67
+ uvx codeaway
68
+ ```
69
+
70
+ It listens on `127.0.0.1:8765` and opens `/setup` in the laptop browser. Choose
71
+ the visible Codex Desktop window and draw all three capture regions:
72
+
73
+ - **Sidebar:** the projects and tasks on the left.
74
+ - **Conversation:** the right pane above the input.
75
+ - **Composer:** the chat box only; it may grow taller. Do not include the
76
+ full-width toolbar or status row.
77
+
78
+ To enable phone access, restart with an address assigned to the laptop on your
79
+ LAN or Tailscale network:
80
+
81
+ ```powershell
82
+ uvx codeaway --ip <IPv4-LAN-or-Tailscale-address>
83
+ ```
84
+
85
+ The explicit address is saved only after it binds successfully. Later
86
+ `uvx codeaway` launches reuse both that address and the saved calibration. If
87
+ the saved Codex window and all three regions resolve, CodeAway prints the phone
88
+ workspace URL without opening a laptop browser. The phone workspace still
89
+ links to `/setup` when recalibration is needed.
90
+
91
+ If a cached address is no longer available, CodeAway warns, falls back to
92
+ `127.0.0.1`, and saves that fallback. An invalid explicit address exits instead
93
+ of silently changing interfaces. Use `--no-browser` to suppress an otherwise
94
+ necessary setup launch and `--port PORT` to select and cache another port.
95
+ CodeAway v0.1 accepts IPv4 literals only; IPv6 addresses are rejected with an
96
+ actionable startup error.
97
+
98
+ > **Security:** A non-loopback endpoint grants full desktop mouse and keyboard
99
+ > input control to every device that can reach it. CodeAway v0.1 has no pairing
100
+ > or authentication, so expose it only on a network boundary you trust.
101
+
102
+ ## Architecture
103
+
104
+ CodeAway deliberately separates two independent backend axes:
105
+
106
+ | Module | Backends | Responsibility |
107
+ | --- | --- | --- |
108
+ | `agents.py` | Codex first; Claude Code and Cursor later | Owns application semantics: detection, projects and tasks, navigation, calibrated surfaces, and actions |
109
+ | `desktop.py` | Windows first; macOS and Linux later | Owns OS mechanics: windows, screenshots, accessibility, mouse, keyboard, and clipboard operations |
110
+
111
+ The server composes one agent backend with one desktop backend. For the first
112
+ release that pair is Codex Desktop on Windows. Agent backends do not contain
113
+ Windows APIs, and desktop backends do not contain Codex-specific behavior.
@@ -0,0 +1,17 @@
1
+ codeaway/__init__.py,sha256=hME9XcNiqemPkPOG6DvnceQv0gVm3FDF05tsOEODX3Q,79
2
+ codeaway/__main__.py,sha256=slV8z4ZsmB_WW8GbB-coDMaWOk7pVYu8Ggj6PL5eYVg,85
3
+ codeaway/agents.py,sha256=PWFwl_x6BgM7C_BjpxHxH1Cwf3DFrnh_QOsPwV_K-qY,15250
4
+ codeaway/cli.py,sha256=1sLkYuz0wJM1WGW2BVolVVqmY0D1PSAMxob2N_z8Dj0,6973
5
+ codeaway/config.py,sha256=wRHYhzG3F0zgA_CuAk_-RPkS3MHQmrF7IQ0Ef-yXLz4,5385
6
+ codeaway/desktop.py,sha256=EEnfOwkSpsFSfdbd28LakuLNKiOAFCQYlMwQYUEpgz0,23856
7
+ codeaway/server.py,sha256=KtqLVLHknu_HirfCCaTqJ7pWW7d7MXLZ45zWXAKlW5E,27006
8
+ codeaway/web/__init__.py,sha256=qTzh5dF_dbQxxFkmVAZTRjOnl62vWnBGCaWL-0CWe_U,63
9
+ codeaway/web/app.js,sha256=25NHJeznDt47u03ZQGO2I_tLvTg0dCMuKonWfT7HLRQ,26834
10
+ codeaway/web/index.html,sha256=FxwHm7QSynhJS90e9GdeZHsztz_696-yFNnEfkoNaRY,1663
11
+ codeaway/web/setup.html,sha256=iPKu0Di9DgpJIasDrla4cvN9WNB81CGNFQD04x5C_JE,2766
12
+ codeaway/web/style.css,sha256=kfr7odP3IfF0UxqOkbUPUUjs_yShbLnCHuYQWFBkHA0,10984
13
+ codeaway-0.1.0.dist-info/METADATA,sha256=kjvJNxfwSHA2I_fV0zR9Xpae-r8pwRU-lFw5OuB2L9k,4302
14
+ codeaway-0.1.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
15
+ codeaway-0.1.0.dist-info/entry_points.txt,sha256=KcCNxIQzy7pXIwX_4O_SFVlv6lSzu8JEAD708l5T14k,47
16
+ codeaway-0.1.0.dist-info/licenses/LICENSE,sha256=esef7qOzhcPw9TVgQVCcbz37ilPV7T9d_3RfrOyf_48,1099
17
+ codeaway-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ codeaway = codeaway.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CodeAway contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.