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.
- codeaway/__init__.py +4 -0
- codeaway/__main__.py +5 -0
- codeaway/agents.py +427 -0
- codeaway/cli.py +221 -0
- codeaway/config.py +157 -0
- codeaway/desktop.py +644 -0
- codeaway/server.py +673 -0
- codeaway/web/__init__.py +1 -0
- codeaway/web/app.js +747 -0
- codeaway/web/index.html +41 -0
- codeaway/web/setup.html +57 -0
- codeaway/web/style.css +280 -0
- codeaway-0.1.0.dist-info/METADATA +113 -0
- codeaway-0.1.0.dist-info/RECORD +17 -0
- codeaway-0.1.0.dist-info/WHEEL +4 -0
- codeaway-0.1.0.dist-info/entry_points.txt +2 -0
- codeaway-0.1.0.dist-info/licenses/LICENSE +21 -0
codeaway/web/index.html
ADDED
|
@@ -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>
|
codeaway/web/setup.html
ADDED
|
@@ -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
|
+

|
|
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,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.
|