python-codex 0.2.0__py3-none-any.whl → 0.2.1__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.
- {python_codex-0.2.0.dist-info → python_codex-0.2.1.dist-info}/METADATA +1 -1
- {python_codex-0.2.0.dist-info → python_codex-0.2.1.dist-info}/RECORD +6 -6
- workspace_server/workspace.html +228 -94
- {python_codex-0.2.0.dist-info → python_codex-0.2.1.dist-info}/WHEEL +0 -0
- {python_codex-0.2.0.dist-info → python_codex-0.2.1.dist-info}/entry_points.txt +0 -0
- {python_codex-0.2.0.dist-info → python_codex-0.2.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -80,9 +80,9 @@ responses_server/tools/web_search.py,sha256=pm4ZUiHUfxc0bGY1kEvt-BCzDrZIyP24xzPU
|
|
|
80
80
|
workspace_server/__init__.py,sha256=XbSU6aAeYBMsBTVi9Ug6ZW9sxcwefqPS7T_7wpt_VMo,462
|
|
81
81
|
workspace_server/__main__.py,sha256=9SRp-Yw7ShGxc6DhSIXcDLKgGEdAVm3oBZ59rBOPjT0,62
|
|
82
82
|
workspace_server/app.py,sha256=aDfUqIwyMsndavSTP47rfcBKIwgo37F8U_lkCgUfUc0,49260
|
|
83
|
-
workspace_server/workspace.html,sha256=
|
|
84
|
-
python_codex-0.2.
|
|
85
|
-
python_codex-0.2.
|
|
86
|
-
python_codex-0.2.
|
|
87
|
-
python_codex-0.2.
|
|
88
|
-
python_codex-0.2.
|
|
83
|
+
workspace_server/workspace.html,sha256=_vu0Zm6ifuwc5rPx0ZCv-OF9oAb6jo4y4JwtJio3Yq0,29432
|
|
84
|
+
python_codex-0.2.1.dist-info/METADATA,sha256=w0Pmo56JuaxuqaEOrLRB2et6FHDkRUDo64D-oCUlijo,16812
|
|
85
|
+
python_codex-0.2.1.dist-info/WHEEL,sha256=KGYbc1zXlYddvwxnNty23BeaKzh7YuoSIvIMO4jEhvw,87
|
|
86
|
+
python_codex-0.2.1.dist-info/entry_points.txt,sha256=vkV2UWCtEKvQNMJuPNjt8HyBKiwp83JyqBatrBNGDp8,80
|
|
87
|
+
python_codex-0.2.1.dist-info/licenses/LICENSE,sha256=0X8ifk312hYAORM4hlzg8wVSEXYKNmiPgWlB1YIy2Nw,10926
|
|
88
|
+
python_codex-0.2.1.dist-info/RECORD,,
|
workspace_server/workspace.html
CHANGED
|
@@ -7,14 +7,31 @@
|
|
|
7
7
|
<style>
|
|
8
8
|
:root {
|
|
9
9
|
color-scheme: light;
|
|
10
|
-
--bg: #
|
|
10
|
+
--bg: #f2f6f3;
|
|
11
11
|
--panel: #ffffff;
|
|
12
|
-
--ink: #
|
|
13
|
-
--muted: #
|
|
14
|
-
--line: #
|
|
15
|
-
--accent: #
|
|
12
|
+
--ink: #1e2529;
|
|
13
|
+
--muted: #5f6f75;
|
|
14
|
+
--line: #d2ddd5;
|
|
15
|
+
--accent: #0f8f55;
|
|
16
16
|
--accent-ink: #ffffff;
|
|
17
|
-
--
|
|
17
|
+
--warn-soft: #fff5cf;
|
|
18
|
+
--info: #1f6fa4;
|
|
19
|
+
--info-soft: #edf8ff;
|
|
20
|
+
--danger: #b23a3a;
|
|
21
|
+
--danger-soft: #fff1ef;
|
|
22
|
+
--violet: #6b4fb0;
|
|
23
|
+
--violet-soft: #f5f0ff;
|
|
24
|
+
--code: #f3f7f8;
|
|
25
|
+
--entry-shadow: 0 1px 2px rgba(25, 35, 31, 0.04);
|
|
26
|
+
--space-1: 2px;
|
|
27
|
+
--space-2: 4px;
|
|
28
|
+
--space-3: 6px;
|
|
29
|
+
--space-4: 8px;
|
|
30
|
+
--space-5: 10px;
|
|
31
|
+
--space-6: 12px;
|
|
32
|
+
--space-7: 14px;
|
|
33
|
+
--radius-sm: 4px;
|
|
34
|
+
--radius-md: 6px;
|
|
18
35
|
--chat-width: min(42vw, 760px);
|
|
19
36
|
--splitter-width: 8px;
|
|
20
37
|
}
|
|
@@ -34,7 +51,7 @@
|
|
|
34
51
|
min-width: 0;
|
|
35
52
|
}
|
|
36
53
|
.workspace.collapsed .splitter::after {
|
|
37
|
-
background: #
|
|
54
|
+
background: #4f6f60;
|
|
38
55
|
}
|
|
39
56
|
.board-pane {
|
|
40
57
|
min-width: 0;
|
|
@@ -46,7 +63,7 @@
|
|
|
46
63
|
.boardbar {
|
|
47
64
|
min-width: 0;
|
|
48
65
|
border-bottom: 1px solid var(--line);
|
|
49
|
-
padding:
|
|
66
|
+
padding: var(--space-4) var(--space-6);
|
|
50
67
|
color: var(--muted);
|
|
51
68
|
font-size: 12px;
|
|
52
69
|
white-space: nowrap;
|
|
@@ -61,24 +78,36 @@
|
|
|
61
78
|
background: #fff;
|
|
62
79
|
}
|
|
63
80
|
.splitter {
|
|
81
|
+
position: relative;
|
|
64
82
|
width: 8px;
|
|
65
83
|
height: 100dvh;
|
|
66
84
|
border: 0;
|
|
67
|
-
border-left: 1px solid
|
|
68
|
-
border-right: 1px solid
|
|
69
|
-
background: #
|
|
85
|
+
border-left: 1px solid #c1cec6;
|
|
86
|
+
border-right: 1px solid #c1cec6;
|
|
87
|
+
background: #dfe8e2;
|
|
70
88
|
cursor: col-resize;
|
|
71
89
|
padding: 0;
|
|
72
90
|
touch-action: none;
|
|
73
91
|
}
|
|
74
92
|
.splitter::after {
|
|
75
93
|
content: "";
|
|
76
|
-
|
|
77
|
-
|
|
94
|
+
position: absolute;
|
|
95
|
+
left: 50%;
|
|
96
|
+
top: 50%;
|
|
97
|
+
width: 3px;
|
|
78
98
|
height: 42px;
|
|
79
|
-
margin: calc(50dvh - 21px) auto 0;
|
|
80
99
|
border-radius: 999px;
|
|
81
|
-
background: #
|
|
100
|
+
background: #7d9588;
|
|
101
|
+
transform: translate(-50%, -50%);
|
|
102
|
+
}
|
|
103
|
+
.splitter:hover,
|
|
104
|
+
.workspace.resizing .splitter {
|
|
105
|
+
background: #d3dfd7;
|
|
106
|
+
border-color: #aebeb4;
|
|
107
|
+
}
|
|
108
|
+
.splitter:hover::after,
|
|
109
|
+
.workspace.resizing .splitter::after {
|
|
110
|
+
background: #527465;
|
|
82
111
|
}
|
|
83
112
|
.workspace.resizing,
|
|
84
113
|
.workspace.resizing * {
|
|
@@ -96,37 +125,38 @@
|
|
|
96
125
|
}
|
|
97
126
|
.topbar {
|
|
98
127
|
min-width: 0;
|
|
99
|
-
padding:
|
|
128
|
+
padding: var(--space-4) var(--space-7);
|
|
100
129
|
border-bottom: 1px solid var(--line);
|
|
101
130
|
display: grid;
|
|
102
|
-
gap:
|
|
131
|
+
gap: var(--space-4);
|
|
103
132
|
}
|
|
104
133
|
.tabbar {
|
|
105
134
|
display: flex;
|
|
106
135
|
align-items: center;
|
|
107
|
-
gap:
|
|
136
|
+
gap: var(--space-2);
|
|
108
137
|
min-width: 0;
|
|
109
138
|
}
|
|
110
139
|
.tabs {
|
|
111
140
|
display: flex;
|
|
112
141
|
align-items: center;
|
|
113
|
-
gap:
|
|
142
|
+
gap: var(--space-1);
|
|
114
143
|
min-width: 0;
|
|
115
144
|
overflow-x: auto;
|
|
116
145
|
scrollbar-width: thin;
|
|
117
146
|
}
|
|
118
147
|
.tab {
|
|
148
|
+
position: relative;
|
|
119
149
|
display: inline-flex;
|
|
120
150
|
align-items: center;
|
|
121
|
-
gap:
|
|
151
|
+
gap: var(--space-2);
|
|
122
152
|
min-width: 88px;
|
|
123
153
|
max-width: 180px;
|
|
124
|
-
height:
|
|
125
|
-
border: 1px solid
|
|
126
|
-
border-radius:
|
|
127
|
-
background: #
|
|
154
|
+
height: 31px;
|
|
155
|
+
border: 1px solid #d5ddd7;
|
|
156
|
+
border-radius: var(--radius-sm);
|
|
157
|
+
background: #f6f8f7;
|
|
128
158
|
color: var(--ink);
|
|
129
|
-
padding: 0
|
|
159
|
+
padding: 0 var(--space-3) 0 var(--space-4);
|
|
130
160
|
font: inherit;
|
|
131
161
|
cursor: pointer;
|
|
132
162
|
user-select: none;
|
|
@@ -137,8 +167,24 @@
|
|
|
137
167
|
outline-offset: 1px;
|
|
138
168
|
}
|
|
139
169
|
.tab.active {
|
|
140
|
-
border-color: #
|
|
141
|
-
background: #
|
|
170
|
+
border-color: #afd6bd;
|
|
171
|
+
background: #eef7f1;
|
|
172
|
+
box-shadow: inset 0 -2px 0 var(--accent);
|
|
173
|
+
}
|
|
174
|
+
.tab.running::before {
|
|
175
|
+
content: "";
|
|
176
|
+
position: absolute;
|
|
177
|
+
left: 6px;
|
|
178
|
+
top: 50%;
|
|
179
|
+
width: 5px;
|
|
180
|
+
height: 5px;
|
|
181
|
+
margin-top: -2.5px;
|
|
182
|
+
border-radius: 999px;
|
|
183
|
+
background: var(--accent);
|
|
184
|
+
animation: spinner-pulse 1.2s cubic-bezier(0.4, 0, 0.2, 1) infinite;
|
|
185
|
+
}
|
|
186
|
+
.tab.running .tab-label {
|
|
187
|
+
padding-left: var(--space-4);
|
|
142
188
|
}
|
|
143
189
|
.tab-label {
|
|
144
190
|
min-width: 0;
|
|
@@ -150,11 +196,11 @@
|
|
|
150
196
|
}
|
|
151
197
|
.tab-close,
|
|
152
198
|
.tab-new {
|
|
153
|
-
width:
|
|
154
|
-
height:
|
|
199
|
+
width: 31px;
|
|
200
|
+
height: 31px;
|
|
155
201
|
border: 1px solid var(--line);
|
|
156
|
-
border-radius:
|
|
157
|
-
background: #
|
|
202
|
+
border-radius: var(--radius-md);
|
|
203
|
+
background: #eef7f1;
|
|
158
204
|
color: var(--muted);
|
|
159
205
|
padding: 0;
|
|
160
206
|
line-height: 1;
|
|
@@ -166,56 +212,79 @@
|
|
|
166
212
|
height: 18px;
|
|
167
213
|
border: 0;
|
|
168
214
|
background: transparent;
|
|
215
|
+
opacity: 0.42;
|
|
216
|
+
font-size: 17px;
|
|
217
|
+
font-weight: 500;
|
|
218
|
+
line-height: 18px;
|
|
219
|
+
}
|
|
220
|
+
.tab-new {
|
|
221
|
+
font-size: 22px;
|
|
222
|
+
font-weight: 400;
|
|
223
|
+
line-height: 31px;
|
|
224
|
+
}
|
|
225
|
+
.tab:hover .tab-close,
|
|
226
|
+
.tab:focus-within .tab-close,
|
|
227
|
+
.tab.active .tab-close {
|
|
228
|
+
opacity: 0.85;
|
|
229
|
+
}
|
|
230
|
+
.tab-close:disabled {
|
|
231
|
+
opacity: 0.22;
|
|
232
|
+
cursor: default;
|
|
169
233
|
}
|
|
170
234
|
.tab-close:hover,
|
|
171
235
|
.tab-new:hover {
|
|
172
236
|
color: var(--ink);
|
|
173
|
-
background: #
|
|
237
|
+
background: #ffffff;
|
|
174
238
|
}
|
|
175
239
|
.log {
|
|
176
240
|
min-height: 0;
|
|
177
241
|
overflow-y: auto;
|
|
178
242
|
overflow-x: hidden;
|
|
179
|
-
padding:
|
|
243
|
+
padding: var(--space-6) var(--space-7);
|
|
180
244
|
display: flex;
|
|
181
245
|
flex-direction: column;
|
|
182
|
-
gap:
|
|
246
|
+
gap: var(--space-4);
|
|
183
247
|
background: #fbfcfa;
|
|
184
248
|
}
|
|
185
249
|
.entry {
|
|
186
250
|
min-width: 0;
|
|
187
251
|
border: 1px solid var(--line);
|
|
188
|
-
border-radius:
|
|
189
|
-
padding:
|
|
252
|
+
border-radius: var(--radius-sm);
|
|
253
|
+
padding: var(--space-4) var(--space-5);
|
|
190
254
|
background: #fff;
|
|
255
|
+
box-shadow: var(--entry-shadow);
|
|
191
256
|
}
|
|
192
257
|
.entry.user {
|
|
193
|
-
border-color: #
|
|
194
|
-
background:
|
|
258
|
+
border-color: #edd17a;
|
|
259
|
+
background: var(--warn-soft);
|
|
260
|
+
color: #5a4714;
|
|
195
261
|
}
|
|
196
262
|
.entry.response,
|
|
197
263
|
.entry.assistant {
|
|
198
|
-
border-color: #
|
|
264
|
+
border-color: #d0ddd5;
|
|
199
265
|
background: #ffffff;
|
|
200
266
|
}
|
|
201
267
|
.entry.thinking {
|
|
202
|
-
border-color: #
|
|
203
|
-
background: #
|
|
268
|
+
border-color: #b9dcc5;
|
|
269
|
+
background: #f0fbf3;
|
|
270
|
+
color: #256b43;
|
|
271
|
+
animation: thinking-breathe 4.8s ease-in-out infinite;
|
|
204
272
|
}
|
|
205
273
|
.entry.control {
|
|
206
|
-
border-color: #
|
|
207
|
-
background:
|
|
274
|
+
border-color: #b9d8ea;
|
|
275
|
+
background: var(--info-soft);
|
|
276
|
+
color: var(--info);
|
|
208
277
|
}
|
|
209
278
|
.entry.tool {
|
|
210
|
-
border-color: #
|
|
211
|
-
background:
|
|
212
|
-
color:
|
|
279
|
+
border-color: #d7c8f0;
|
|
280
|
+
background: var(--violet-soft);
|
|
281
|
+
color: var(--violet);
|
|
213
282
|
font-size: 12px;
|
|
214
283
|
}
|
|
215
284
|
.entry.error {
|
|
216
|
-
border-color: #
|
|
217
|
-
background:
|
|
218
|
-
color:
|
|
285
|
+
border-color: #efb4ad;
|
|
286
|
+
background: var(--danger-soft);
|
|
287
|
+
color: var(--danger);
|
|
219
288
|
}
|
|
220
289
|
.text {
|
|
221
290
|
white-space: pre-wrap;
|
|
@@ -226,7 +295,7 @@
|
|
|
226
295
|
overflow-wrap: anywhere;
|
|
227
296
|
}
|
|
228
297
|
.markdown p {
|
|
229
|
-
margin: 0 0
|
|
298
|
+
margin: 0 0 var(--space-4);
|
|
230
299
|
}
|
|
231
300
|
.markdown p:last-child,
|
|
232
301
|
.markdown ul:last-child,
|
|
@@ -237,17 +306,17 @@
|
|
|
237
306
|
}
|
|
238
307
|
.markdown ul,
|
|
239
308
|
.markdown ol {
|
|
240
|
-
margin: 0 0
|
|
309
|
+
margin: 0 0 var(--space-4) 18px;
|
|
241
310
|
padding: 0;
|
|
242
311
|
}
|
|
243
312
|
.markdown li {
|
|
244
313
|
margin: 2px 0;
|
|
245
314
|
}
|
|
246
315
|
.markdown pre {
|
|
247
|
-
margin: 0 0
|
|
248
|
-
padding:
|
|
316
|
+
margin: 0 0 var(--space-4);
|
|
317
|
+
padding: var(--space-4) var(--space-5);
|
|
249
318
|
border: 1px solid var(--line);
|
|
250
|
-
border-radius:
|
|
319
|
+
border-radius: var(--radius-sm);
|
|
251
320
|
background: var(--code);
|
|
252
321
|
overflow-x: auto;
|
|
253
322
|
white-space: pre;
|
|
@@ -260,23 +329,23 @@
|
|
|
260
329
|
}
|
|
261
330
|
.markdown table {
|
|
262
331
|
width: 100%;
|
|
263
|
-
margin: 0 0
|
|
332
|
+
margin: 0 0 var(--space-4);
|
|
264
333
|
border-collapse: collapse;
|
|
265
334
|
font-size: 13px;
|
|
266
335
|
}
|
|
267
336
|
.markdown th,
|
|
268
337
|
.markdown td {
|
|
269
338
|
border: 1px solid var(--line);
|
|
270
|
-
padding:
|
|
339
|
+
padding: var(--space-3) var(--space-4);
|
|
271
340
|
text-align: left;
|
|
272
341
|
vertical-align: top;
|
|
273
342
|
}
|
|
274
343
|
.markdown th {
|
|
275
|
-
background: #
|
|
344
|
+
background: #eef7f1;
|
|
276
345
|
font-weight: 650;
|
|
277
346
|
}
|
|
278
347
|
.markdown a {
|
|
279
|
-
color: #
|
|
348
|
+
color: #176fa8;
|
|
280
349
|
text-decoration: none;
|
|
281
350
|
}
|
|
282
351
|
.markdown a:hover {
|
|
@@ -285,22 +354,31 @@
|
|
|
285
354
|
.composer {
|
|
286
355
|
min-width: 0;
|
|
287
356
|
border-top: 1px solid var(--line);
|
|
288
|
-
padding:
|
|
357
|
+
padding: var(--space-4) var(--space-6) var(--space-5);
|
|
289
358
|
display: grid;
|
|
290
|
-
gap:
|
|
359
|
+
gap: var(--space-3);
|
|
360
|
+
align-content: end;
|
|
291
361
|
background: #fff;
|
|
292
362
|
}
|
|
293
363
|
textarea {
|
|
294
364
|
min-width: 0;
|
|
295
365
|
resize: vertical;
|
|
296
|
-
min-height:
|
|
366
|
+
min-height: 40px;
|
|
297
367
|
max-height: 35vh;
|
|
298
368
|
width: 100%;
|
|
299
369
|
border: 1px solid var(--line);
|
|
300
|
-
border-radius:
|
|
301
|
-
padding:
|
|
370
|
+
border-radius: var(--radius-sm);
|
|
371
|
+
padding: var(--space-4) var(--space-5);
|
|
372
|
+
background: #ffffff;
|
|
373
|
+
color: var(--ink);
|
|
302
374
|
font: inherit;
|
|
303
375
|
line-height: 1.4;
|
|
376
|
+
overflow-y: auto;
|
|
377
|
+
}
|
|
378
|
+
textarea:focus {
|
|
379
|
+
border-color: #65b782;
|
|
380
|
+
box-shadow: 0 0 0 3px rgba(15, 143, 85, 0.13);
|
|
381
|
+
outline: 0;
|
|
304
382
|
}
|
|
305
383
|
.actions {
|
|
306
384
|
display: flex;
|
|
@@ -308,21 +386,79 @@
|
|
|
308
386
|
align-items: center;
|
|
309
387
|
}
|
|
310
388
|
.spinner {
|
|
311
|
-
position:
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
389
|
+
position: relative;
|
|
390
|
+
display: inline-flex;
|
|
391
|
+
align-items: center;
|
|
392
|
+
justify-self: start;
|
|
393
|
+
align-self: end;
|
|
394
|
+
max-width: 100%;
|
|
395
|
+
min-height: 20px;
|
|
316
396
|
color: var(--muted);
|
|
317
397
|
font-size: 12px;
|
|
318
398
|
white-space: nowrap;
|
|
319
399
|
overflow: hidden;
|
|
320
400
|
text-overflow: ellipsis;
|
|
401
|
+
padding: var(--space-1) var(--space-4) var(--space-1) 18px;
|
|
402
|
+
border-radius: 999px;
|
|
403
|
+
background: rgba(240, 250, 244, 0.96);
|
|
404
|
+
border: 1px solid rgba(172, 216, 188, 0.9);
|
|
405
|
+
}
|
|
406
|
+
.spinner:empty {
|
|
407
|
+
display: none;
|
|
408
|
+
}
|
|
409
|
+
.spinner:not(:empty) {
|
|
410
|
+
margin-bottom: var(--space-1);
|
|
411
|
+
}
|
|
412
|
+
.spinner:not(:empty)::before {
|
|
413
|
+
content: "";
|
|
414
|
+
position: absolute;
|
|
415
|
+
left: 7px;
|
|
416
|
+
top: 50%;
|
|
417
|
+
width: 6px;
|
|
418
|
+
height: 6px;
|
|
419
|
+
margin-top: -3px;
|
|
420
|
+
border-radius: 999px;
|
|
421
|
+
background: var(--accent);
|
|
422
|
+
animation: spinner-pulse 1.2s cubic-bezier(0.4, 0, 0.2, 1) infinite;
|
|
423
|
+
}
|
|
424
|
+
@keyframes spinner-pulse {
|
|
425
|
+
0%, 100% {
|
|
426
|
+
opacity: 0.45;
|
|
427
|
+
transform: scale(0.82);
|
|
428
|
+
}
|
|
429
|
+
50% {
|
|
430
|
+
opacity: 1;
|
|
431
|
+
transform: scale(1.08);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
@keyframes thinking-breathe {
|
|
435
|
+
0%, 100% {
|
|
436
|
+
border-color: #b9dcc5;
|
|
437
|
+
box-shadow: var(--entry-shadow);
|
|
438
|
+
}
|
|
439
|
+
50% {
|
|
440
|
+
border-color: #72d494;
|
|
441
|
+
box-shadow:
|
|
442
|
+
0 0 0 2px rgba(22, 168, 90, 0.16),
|
|
443
|
+
0 2px 7px rgba(25, 35, 31, 0.08);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
@media (prefers-reduced-motion: reduce) {
|
|
447
|
+
.entry.thinking,
|
|
448
|
+
.tab.running::before,
|
|
449
|
+
.spinner:not(:empty)::before {
|
|
450
|
+
animation: none;
|
|
451
|
+
}
|
|
452
|
+
.tab.running::before,
|
|
453
|
+
.spinner:not(:empty)::before {
|
|
454
|
+
opacity: 0.8;
|
|
455
|
+
transform: none;
|
|
456
|
+
}
|
|
321
457
|
}
|
|
322
458
|
code {
|
|
323
459
|
background: var(--code);
|
|
324
460
|
border: 1px solid var(--line);
|
|
325
|
-
border-radius:
|
|
461
|
+
border-radius: var(--radius-sm);
|
|
326
462
|
padding: 1px 4px;
|
|
327
463
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
328
464
|
font-size: 12px;
|
|
@@ -343,15 +479,15 @@
|
|
|
343
479
|
<section class="chat" aria-label="pycodex chat">
|
|
344
480
|
<div class="topbar">
|
|
345
481
|
<div class="tabbar">
|
|
346
|
-
<div id="tabs" class="tabs"></div>
|
|
482
|
+
<div id="tabs" class="tabs" role="tablist"></div>
|
|
347
483
|
<button id="newTab" class="tab-new" type="button" title="New session" aria-label="New session">+</button>
|
|
348
484
|
</div>
|
|
349
485
|
</div>
|
|
350
486
|
<div id="log" class="log"></div>
|
|
351
487
|
<form id="composer" class="composer">
|
|
488
|
+
<div id="spinner" class="spinner" role="status" aria-live="polite"></div>
|
|
352
489
|
<textarea id="prompt" placeholder="Ask pycodex or type /help..."></textarea>
|
|
353
490
|
</form>
|
|
354
|
-
<div id="spinner" class="spinner"></div>
|
|
355
491
|
</section>
|
|
356
492
|
</div>
|
|
357
493
|
<script src="https://cdn.jsdelivr.net/npm/markdown-it@14.1.0/dist/markdown-it.min.js"></script>
|
|
@@ -373,8 +509,6 @@
|
|
|
373
509
|
let lastBoardSignature = "";
|
|
374
510
|
let lastRenderedSignature = "";
|
|
375
511
|
let resizeStart = null;
|
|
376
|
-
let spinnerTimer = null;
|
|
377
|
-
let spinnerFrameIndex = 0;
|
|
378
512
|
let spinnerText = "";
|
|
379
513
|
let activeSessionId = "";
|
|
380
514
|
let sessions = [];
|
|
@@ -382,7 +516,6 @@
|
|
|
382
516
|
const sessionState = new Map();
|
|
383
517
|
let restoreScrollTop = null;
|
|
384
518
|
let suppressScrollSave = false;
|
|
385
|
-
const spinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
386
519
|
const markdownRenderer = window.markdownit
|
|
387
520
|
? window.markdownit({html: false, linkify: true, breaks: false})
|
|
388
521
|
: null;
|
|
@@ -496,25 +629,7 @@
|
|
|
496
629
|
|
|
497
630
|
function setSpinner(text) {
|
|
498
631
|
spinnerText = String(text || "").trim();
|
|
499
|
-
|
|
500
|
-
renderSpinner();
|
|
501
|
-
if (spinnerText && !spinnerTimer) {
|
|
502
|
-
spinnerTimer = setInterval(renderSpinner, 120);
|
|
503
|
-
}
|
|
504
|
-
if (!spinnerText && spinnerTimer) {
|
|
505
|
-
clearInterval(spinnerTimer);
|
|
506
|
-
spinnerTimer = null;
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
function renderSpinner() {
|
|
511
|
-
if (!spinnerText) {
|
|
512
|
-
spinner.textContent = "";
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
const frame = spinnerFrames[spinnerFrameIndex % spinnerFrames.length];
|
|
516
|
-
spinnerFrameIndex += 1;
|
|
517
|
-
spinner.textContent = `${frame} ${spinnerText}`;
|
|
632
|
+
spinner.textContent = spinnerText;
|
|
518
633
|
}
|
|
519
634
|
|
|
520
635
|
function isNearBottom() {
|
|
@@ -525,6 +640,14 @@
|
|
|
525
640
|
log.scrollTop = log.scrollHeight;
|
|
526
641
|
}
|
|
527
642
|
|
|
643
|
+
function resizePrompt() {
|
|
644
|
+
prompt.style.height = "auto";
|
|
645
|
+
const minHeight = 40;
|
|
646
|
+
const maxHeight = Math.max(minHeight, Math.round(window.innerHeight * 0.35));
|
|
647
|
+
const nextHeight = Math.max(minHeight, Math.min(prompt.scrollHeight, maxHeight));
|
|
648
|
+
prompt.style.height = `${nextHeight}px`;
|
|
649
|
+
}
|
|
650
|
+
|
|
528
651
|
function stateForSession(sessionId) {
|
|
529
652
|
const key = String(sessionId || "");
|
|
530
653
|
if (!sessionState.has(key)) {
|
|
@@ -556,10 +679,14 @@
|
|
|
556
679
|
sessions.forEach((session, index) => {
|
|
557
680
|
const sessionId = session.id || "";
|
|
558
681
|
const tab = document.createElement("div");
|
|
559
|
-
tab.className =
|
|
682
|
+
tab.className =
|
|
683
|
+
"tab" +
|
|
684
|
+
(sessionId === activeSessionId ? " active" : "") +
|
|
685
|
+
(session.running ? " running" : "");
|
|
560
686
|
tab.title = session.title || `Session ${index + 1}`;
|
|
561
687
|
tab.setAttribute("role", "tab");
|
|
562
688
|
tab.setAttribute("aria-selected", sessionId === activeSessionId ? "true" : "false");
|
|
689
|
+
if (session.running) tab.setAttribute("aria-busy", "true");
|
|
563
690
|
tab.addEventListener("click", () => switchSession(sessionId));
|
|
564
691
|
|
|
565
692
|
const label = document.createElement("span");
|
|
@@ -758,6 +885,7 @@
|
|
|
758
885
|
state.lastRenderedSignature = "";
|
|
759
886
|
lastRenderedSignature = "";
|
|
760
887
|
prompt.value = state.draft || "";
|
|
888
|
+
resizePrompt();
|
|
761
889
|
suppressScrollSave = true;
|
|
762
890
|
log.textContent = "";
|
|
763
891
|
suppressScrollSave = false;
|
|
@@ -782,6 +910,7 @@
|
|
|
782
910
|
state.lastRenderedSignature = "";
|
|
783
911
|
lastRenderedSignature = "";
|
|
784
912
|
prompt.value = "";
|
|
913
|
+
resizePrompt();
|
|
785
914
|
restoreScrollTop = null;
|
|
786
915
|
updateSessions(payload.sessions || []);
|
|
787
916
|
renderSnapshot(payload.snapshot);
|
|
@@ -803,6 +932,7 @@
|
|
|
803
932
|
activeSessionId = sessions.length ? sessions[0].id || "" : "";
|
|
804
933
|
lastRenderedSignature = "";
|
|
805
934
|
prompt.value = "";
|
|
935
|
+
resizePrompt();
|
|
806
936
|
suppressScrollSave = true;
|
|
807
937
|
log.textContent = "";
|
|
808
938
|
suppressScrollSave = false;
|
|
@@ -817,12 +947,14 @@
|
|
|
817
947
|
const text = prompt.value.trim();
|
|
818
948
|
if (!text) return;
|
|
819
949
|
prompt.value = "";
|
|
950
|
+
resizePrompt();
|
|
820
951
|
stateForSession(activeSessionId).draft = "";
|
|
821
952
|
submitPrompt(text);
|
|
822
953
|
});
|
|
823
954
|
|
|
824
955
|
prompt.addEventListener("input", () => {
|
|
825
956
|
stateForSession(activeSessionId).draft = prompt.value;
|
|
957
|
+
resizePrompt();
|
|
826
958
|
});
|
|
827
959
|
|
|
828
960
|
prompt.addEventListener("compositionstart", () => {
|
|
@@ -856,9 +988,11 @@
|
|
|
856
988
|
window.addEventListener("resize", () => {
|
|
857
989
|
const current = Number(window.localStorage.getItem("pycodex.workspace.chatWidth") || 0);
|
|
858
990
|
if (current > 0) setChatWidth(current);
|
|
991
|
+
resizePrompt();
|
|
859
992
|
});
|
|
860
993
|
|
|
861
994
|
loadChatWidth();
|
|
995
|
+
resizePrompt();
|
|
862
996
|
startPolling();
|
|
863
997
|
startBoardPolling();
|
|
864
998
|
</script>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|