aicodeman 0.4.5 → 0.4.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/orchestrator-loop.d.ts +124 -0
- package/dist/orchestrator-loop.d.ts.map +1 -0
- package/dist/orchestrator-loop.js +853 -0
- package/dist/orchestrator-loop.js.map +1 -0
- package/dist/orchestrator-planner.d.ts +58 -0
- package/dist/orchestrator-planner.d.ts.map +1 -0
- package/dist/orchestrator-planner.js +342 -0
- package/dist/orchestrator-planner.js.map +1 -0
- package/dist/orchestrator-verifier.d.ts +52 -0
- package/dist/orchestrator-verifier.d.ts.map +1 -0
- package/dist/orchestrator-verifier.js +234 -0
- package/dist/orchestrator-verifier.js.map +1 -0
- package/dist/prompts/index.d.ts +1 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +1 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/orchestrator.d.ts +65 -0
- package/dist/prompts/orchestrator.d.ts.map +1 -0
- package/dist/prompts/orchestrator.js +112 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/state-store.d.ts +6 -0
- package/dist/state-store.d.ts.map +1 -1
- package/dist/state-store.js +21 -0
- package/dist/state-store.js.map +1 -1
- package/dist/types/app-state.d.ts +2 -0
- package/dist/types/app-state.d.ts.map +1 -1
- package/dist/types/app-state.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/orchestrator.d.ts +211 -0
- package/dist/types/orchestrator.d.ts.map +1 -0
- package/dist/types/orchestrator.js +58 -0
- package/dist/types/orchestrator.js.map +1 -0
- package/dist/web/ports/index.d.ts +1 -0
- package/dist/web/ports/index.d.ts.map +1 -1
- package/dist/web/ports/orchestrator-port.d.ts +10 -0
- package/dist/web/ports/orchestrator-port.d.ts.map +1 -0
- package/dist/web/ports/orchestrator-port.js +6 -0
- package/dist/web/ports/orchestrator-port.js.map +1 -0
- package/dist/web/public/api-client.3adebdc2.js.gz +0 -0
- package/dist/web/public/app.cbf6e9e8.js +26 -0
- package/dist/web/public/app.cbf6e9e8.js.br +0 -0
- package/dist/web/public/app.cbf6e9e8.js.gz +0 -0
- package/dist/web/public/{constants.cd61abbc.js → constants.64161167.js} +14 -0
- package/dist/web/public/constants.64161167.js.br +0 -0
- package/dist/web/public/constants.64161167.js.gz +0 -0
- package/dist/web/public/index.html +23 -9
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.92544c51.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.9fb81db6.js.gz +0 -0
- package/dist/web/public/{mobile-handlers.65e5638d.js → mobile-handlers.1e2a8ef8.js} +86 -22
- package/dist/web/public/mobile-handlers.1e2a8ef8.js.br +0 -0
- package/dist/web/public/mobile-handlers.1e2a8ef8.js.gz +0 -0
- package/dist/web/public/mobile.fdd28a54.css +1 -0
- package/dist/web/public/mobile.fdd28a54.css.br +0 -0
- package/dist/web/public/mobile.fdd28a54.css.gz +0 -0
- package/dist/web/public/notification-manager.2d5ea8ec.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js +475 -0
- package/dist/web/public/orchestrator-panel.js.br +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.d7f6be08.js → panels-ui.3dd2e29b.js} +25 -25
- package/dist/web/public/panels-ui.3dd2e29b.js.br +0 -0
- package/dist/web/public/panels-ui.3dd2e29b.js.gz +0 -0
- package/dist/web/public/ralph-panel.7b014f16.js.gz +0 -0
- package/dist/web/public/ralph-wizard.f31ab90e.js.gz +0 -0
- package/dist/web/public/respawn-ui.372c6ea7.js.gz +0 -0
- package/dist/web/public/session-ui.0a07c3b7.js.gz +0 -0
- package/dist/web/public/settings-ui.94c57184.js.gz +0 -0
- package/dist/web/public/styles.8e110d27.css +1 -0
- package/dist/web/public/styles.8e110d27.css.br +0 -0
- package/dist/web/public/styles.8e110d27.css.gz +0 -0
- package/dist/web/public/subagent-windows.a366a4ad.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/terminal-ui.9b40798a.js +3 -0
- package/dist/web/public/terminal-ui.9b40798a.js.br +0 -0
- package/dist/web/public/terminal-ui.9b40798a.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
- package/dist/web/routes/index.d.ts +1 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +1 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/orchestrator-routes.d.ts +21 -0
- package/dist/web/routes/orchestrator-routes.d.ts.map +1 -0
- package/dist/web/routes/orchestrator-routes.js +230 -0
- package/dist/web/routes/orchestrator-routes.js.map +1 -0
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +62 -9
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +25 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +22 -0
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +2 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +23 -1
- package/dist/web/server.js.map +1 -1
- package/dist/web/sse-events.d.ts +37 -1
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +39 -1
- package/dist/web/sse-events.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/app.9dab4ee2.js +0 -26
- package/dist/web/public/app.9dab4ee2.js.br +0 -0
- package/dist/web/public/app.9dab4ee2.js.gz +0 -0
- package/dist/web/public/constants.cd61abbc.js.br +0 -0
- package/dist/web/public/constants.cd61abbc.js.gz +0 -0
- package/dist/web/public/mobile-handlers.65e5638d.js.br +0 -0
- package/dist/web/public/mobile-handlers.65e5638d.js.gz +0 -0
- package/dist/web/public/mobile.b09497a4.css +0 -1
- package/dist/web/public/mobile.b09497a4.css.br +0 -0
- package/dist/web/public/mobile.b09497a4.css.gz +0 -0
- package/dist/web/public/panels-ui.d7f6be08.js.br +0 -0
- package/dist/web/public/panels-ui.d7f6be08.js.gz +0 -0
- package/dist/web/public/styles.b8ec2f5a.css +0 -1
- package/dist/web/public/styles.b8ec2f5a.css.br +0 -0
- package/dist/web/public/styles.b8ec2f5a.css.gz +0 -0
- package/dist/web/public/terminal-ui.e4565c7b.js +0 -3
- package/dist/web/public/terminal-ui.e4565c7b.js.br +0 -0
- package/dist/web/public/terminal-ui.e4565c7b.js.gz +0 -0
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
<link rel="manifest" href="manifest.json">
|
|
10
10
|
<title>Codeman</title>
|
|
11
11
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'%3E%3Cstop offset='0%25' stop-color='%2360a5fa'/%3E%3Cstop offset='100%25' stop-color='%233b82f6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='32' height='32' rx='6' fill='%230a0a0a'/%3E%3Cpath d='M18 4L8 18h6l-2 10 10-14h-6z' fill='url(%23g)'/%3E%3C/svg%3E">
|
|
12
|
-
<link rel="stylesheet" href="styles.
|
|
13
|
-
<link rel="stylesheet" href="mobile.
|
|
12
|
+
<link rel="stylesheet" href="styles.8e110d27.css">
|
|
13
|
+
<link rel="stylesheet" href="mobile.fdd28a54.css" media="(max-width: 1023px)">
|
|
14
14
|
<!-- xterm.css loaded async — terminal won't display until xterm.js runs anyway -->
|
|
15
15
|
<link rel="preload" href="vendor/xterm.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
16
16
|
<noscript><link rel="stylesheet" href="vendor/xterm.css"></noscript>
|
|
17
17
|
<!-- Preload critical resources — lets browser discover these during HTML parse
|
|
18
18
|
instead of waiting until <script> tags at bottom-of-body are reached. -->
|
|
19
19
|
<link rel="preload" href="vendor/xterm.min.js" as="script">
|
|
20
|
-
<link rel="preload" href="constants.
|
|
21
|
-
<link rel="preload" href="app.
|
|
20
|
+
<link rel="preload" href="constants.64161167.js" as="script">
|
|
21
|
+
<link rel="preload" href="app.cbf6e9e8.js" as="script">
|
|
22
22
|
<!-- Self-hosted xterm.js — eliminates CDN DNS/TLS latency (~100ms).
|
|
23
23
|
'defer' preserves execution order (xterm loads before fit addon). -->
|
|
24
24
|
<script defer src="vendor/xterm.min.js"></script>
|
|
@@ -137,6 +137,17 @@
|
|
|
137
137
|
</div>
|
|
138
138
|
</div>
|
|
139
139
|
|
|
140
|
+
<!-- Orchestrator Loop Panel -->
|
|
141
|
+
<div class="orchestrator-panel" id="orchestratorPanel" style="display: none;">
|
|
142
|
+
<div class="orchestrator-header">
|
|
143
|
+
<span class="orchestrator-title">Orchestrator</span>
|
|
144
|
+
<span class="orchestrator-state-badge" id="orchestratorStateBadge">idle</span>
|
|
145
|
+
<div class="orchestrator-actions" id="orchestratorActions"></div>
|
|
146
|
+
<button class="orchestrator-close-btn" onclick="app.closeOrchestratorPanel()" title="Close">×</button>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="orchestrator-body" id="orchestratorBody"></div>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
140
151
|
<!-- Ralph / Todo Tracker Panel -->
|
|
141
152
|
<div class="ralph-panel collapsed" id="ralphStatePanel" style="display: none;">
|
|
142
153
|
<!-- Collapsed Summary Bar -->
|
|
@@ -422,6 +433,8 @@
|
|
|
422
433
|
</div>
|
|
423
434
|
|
|
424
435
|
<div class="toolbar-right">
|
|
436
|
+
<!-- Orchestrator button hidden until feature is ready -->
|
|
437
|
+
<!-- <button class="btn-toolbar btn-sm" onclick="app.toggleOrchestratorPanel()" title="Orchestrator Loop">⚙ Orchestrator</button> -->
|
|
425
438
|
<span class="version-display" id="versionDisplay" title="Codeman version">v0.0.0</span>
|
|
426
439
|
</div>
|
|
427
440
|
</footer>
|
|
@@ -1694,18 +1707,19 @@
|
|
|
1694
1707
|
<!-- Lines drawn dynamically -->
|
|
1695
1708
|
</svg>
|
|
1696
1709
|
|
|
1697
|
-
<script defer src="constants.
|
|
1698
|
-
<script defer src="mobile-handlers.
|
|
1710
|
+
<script defer src="constants.64161167.js"></script>
|
|
1711
|
+
<script defer src="mobile-handlers.1e2a8ef8.js"></script>
|
|
1699
1712
|
<script defer src="voice-input.085e9e73.js"></script>
|
|
1700
1713
|
<script defer src="notification-manager.2d5ea8ec.js"></script>
|
|
1701
1714
|
<script defer src="keyboard-accessory.9fb81db6.js"></script>
|
|
1702
1715
|
<script defer src="input-cjk.92544c51.js"></script>
|
|
1703
|
-
<script defer src="app.
|
|
1704
|
-
<script defer src="terminal-ui.
|
|
1716
|
+
<script defer src="app.cbf6e9e8.js"></script>
|
|
1717
|
+
<script defer src="terminal-ui.9b40798a.js"></script>
|
|
1705
1718
|
<script defer src="respawn-ui.372c6ea7.js"></script>
|
|
1706
1719
|
<script defer src="ralph-panel.7b014f16.js"></script>
|
|
1720
|
+
<script defer src="orchestrator-panel.js"></script>
|
|
1707
1721
|
<script defer src="settings-ui.94c57184.js"></script>
|
|
1708
|
-
<script defer src="panels-ui.
|
|
1722
|
+
<script defer src="panels-ui.3dd2e29b.js"></script>
|
|
1709
1723
|
<script defer src="session-ui.0a07c3b7.js"></script>
|
|
1710
1724
|
<script defer src="ralph-wizard.f31ab90e.js"></script>
|
|
1711
1725
|
<script defer src="api-client.3adebdc2.js"></script>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -36,15 +36,19 @@
|
|
|
36
36
|
const MobileDetection = {
|
|
37
37
|
/** Check if device supports touch input */
|
|
38
38
|
isTouchDevice() {
|
|
39
|
-
return
|
|
39
|
+
return (
|
|
40
|
+
'ontouchstart' in window ||
|
|
40
41
|
navigator.maxTouchPoints > 0 ||
|
|
41
|
-
(window.matchMedia && window.matchMedia('(pointer: coarse)').matches)
|
|
42
|
+
(window.matchMedia && window.matchMedia('(pointer: coarse)').matches)
|
|
43
|
+
);
|
|
42
44
|
},
|
|
43
45
|
|
|
44
46
|
/** Check if device is iOS (iPhone, iPad, iPod) */
|
|
45
47
|
isIOS() {
|
|
46
|
-
return
|
|
47
|
-
(navigator.
|
|
48
|
+
return (
|
|
49
|
+
/iPad|iPhone|iPod/.test(navigator.userAgent) ||
|
|
50
|
+
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)
|
|
51
|
+
);
|
|
48
52
|
},
|
|
49
53
|
|
|
50
54
|
/** Check if browser is Safari */
|
|
@@ -77,7 +81,14 @@ const MobileDetection = {
|
|
|
77
81
|
const isTouch = this.isTouchDevice();
|
|
78
82
|
|
|
79
83
|
// Remove existing device classes
|
|
80
|
-
body.classList.remove(
|
|
84
|
+
body.classList.remove(
|
|
85
|
+
'device-mobile',
|
|
86
|
+
'device-tablet',
|
|
87
|
+
'device-desktop',
|
|
88
|
+
'touch-device',
|
|
89
|
+
'ios-device',
|
|
90
|
+
'safari-browser'
|
|
91
|
+
);
|
|
81
92
|
|
|
82
93
|
// Add current device class
|
|
83
94
|
body.classList.add(`device-${deviceType}`);
|
|
@@ -153,7 +164,7 @@ const MobileDetection = {
|
|
|
153
164
|
this._gestureStartHandler = null;
|
|
154
165
|
this._gestureChangeHandler = null;
|
|
155
166
|
}
|
|
156
|
-
}
|
|
167
|
+
},
|
|
157
168
|
};
|
|
158
169
|
|
|
159
170
|
// ═══════════════════════════════════════════════════════════════
|
|
@@ -202,6 +213,17 @@ const KeyboardHandler = {
|
|
|
202
213
|
// Also handle scroll (iOS scrolls viewport when keyboard appears)
|
|
203
214
|
window.visualViewport.addEventListener('scroll', this._viewportScrollHandler);
|
|
204
215
|
}
|
|
216
|
+
|
|
217
|
+
// Prevent page-level scroll when keyboard is visible.
|
|
218
|
+
// iOS Safari scrolls the document to bring xterm's hidden textarea into
|
|
219
|
+
// view when the user types, pushing the entire UI off-screen. The CSS
|
|
220
|
+
// position:fixed on .app prevents most cases, but reset as a safety net.
|
|
221
|
+
this._windowScrollHandler = () => {
|
|
222
|
+
if (this.keyboardVisible) {
|
|
223
|
+
window.scrollTo(0, 0);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
window.addEventListener('scroll', this._windowScrollHandler);
|
|
205
227
|
},
|
|
206
228
|
|
|
207
229
|
/** Remove event listeners */
|
|
@@ -218,6 +240,10 @@ const KeyboardHandler = {
|
|
|
218
240
|
window.visualViewport.removeEventListener('scroll', this._viewportScrollHandler);
|
|
219
241
|
this._viewportScrollHandler = null;
|
|
220
242
|
}
|
|
243
|
+
if (this._windowScrollHandler) {
|
|
244
|
+
window.removeEventListener('scroll', this._windowScrollHandler);
|
|
245
|
+
this._windowScrollHandler = null;
|
|
246
|
+
}
|
|
221
247
|
},
|
|
222
248
|
|
|
223
249
|
/** Handle viewport resize (keyboard show/hide) */
|
|
@@ -294,9 +320,10 @@ const KeyboardHandler = {
|
|
|
294
320
|
|
|
295
321
|
// Shrink main content area so terminal doesn't extend behind keyboard.
|
|
296
322
|
// Use stable keyboard height (not scroll-dependent) for padding.
|
|
323
|
+
// 84px = toolbar (40px) + accessory bar (44px).
|
|
297
324
|
const keyboardHeight = this.initialViewportHeight - (window.visualViewport.height || window.innerHeight);
|
|
298
325
|
if (main && keyboardHeight > 0) {
|
|
299
|
-
main.style.paddingBottom = `${keyboardHeight +
|
|
326
|
+
main.style.paddingBottom = `${keyboardHeight + 84}px`;
|
|
300
327
|
}
|
|
301
328
|
} else {
|
|
302
329
|
this.resetLayout();
|
|
@@ -327,6 +354,10 @@ const KeyboardHandler = {
|
|
|
327
354
|
KeyboardAccessoryBar.show();
|
|
328
355
|
}
|
|
329
356
|
|
|
357
|
+
// Reset any page scroll that occurred during keyboard open.
|
|
358
|
+
// iOS Safari may scroll the document to reveal xterm's hidden textarea.
|
|
359
|
+
window.scrollTo(0, 0);
|
|
360
|
+
|
|
330
361
|
// Refit terminal locally AND send resize to server so Claude Code (Ink)
|
|
331
362
|
// knows the actual terminal dimensions. Without this, Ink redraws at the
|
|
332
363
|
// old (larger) row count when the user types, causing content to scroll
|
|
@@ -335,11 +366,21 @@ const KeyboardHandler = {
|
|
|
335
366
|
// while keyboard is up — this one-shot resize on open/close is sufficient.
|
|
336
367
|
setTimeout(() => {
|
|
337
368
|
if (typeof app !== 'undefined' && app.terminal) {
|
|
338
|
-
if (app.fitAddon)
|
|
369
|
+
if (app.fitAddon)
|
|
370
|
+
try {
|
|
371
|
+
app.fitAddon.fit();
|
|
372
|
+
} catch {}
|
|
373
|
+
// Eliminate terminal row quantization gap: xterm can only show whole
|
|
374
|
+
// rows, so leftover pixels create dead space below the last row.
|
|
375
|
+
// Shrink .main's paddingBottom by the gap so the terminal fills flush
|
|
376
|
+
// to the accessory bar.
|
|
377
|
+
this._shrinkPaddingToFit();
|
|
339
378
|
app.terminal.scrollToBottom();
|
|
340
379
|
// Send resize to server so PTY dimensions match xterm
|
|
341
380
|
this._sendTerminalResize();
|
|
342
381
|
}
|
|
382
|
+
// Reset again after fit/resize in case layout changes triggered scroll
|
|
383
|
+
window.scrollTo(0, 0);
|
|
343
384
|
}, 150);
|
|
344
385
|
|
|
345
386
|
// Reposition subagent windows to stack from bottom (above keyboard)
|
|
@@ -358,7 +399,9 @@ const KeyboardHandler = {
|
|
|
358
399
|
// Refit terminal, scroll to bottom, and send resize to restore original dimensions
|
|
359
400
|
setTimeout(() => {
|
|
360
401
|
if (typeof app !== 'undefined' && app.fitAddon) {
|
|
361
|
-
try {
|
|
402
|
+
try {
|
|
403
|
+
app.fitAddon.fit();
|
|
404
|
+
} catch {}
|
|
362
405
|
if (app.terminal) app.terminal.scrollToBottom();
|
|
363
406
|
// Send resize to server to restore full terminal size
|
|
364
407
|
this._sendTerminalResize();
|
|
@@ -381,12 +424,37 @@ const KeyboardHandler = {
|
|
|
381
424
|
fetch(`/api/sessions/${app.activeSessionId}/resize`, {
|
|
382
425
|
method: 'POST',
|
|
383
426
|
headers: { 'Content-Type': 'application/json' },
|
|
384
|
-
body: JSON.stringify({ cols, rows })
|
|
427
|
+
body: JSON.stringify({ cols, rows }),
|
|
385
428
|
}).catch(() => {});
|
|
386
429
|
}
|
|
387
430
|
} catch {}
|
|
388
431
|
},
|
|
389
432
|
|
|
433
|
+
/**
|
|
434
|
+
* Shrink .main paddingBottom to eliminate the terminal row quantization gap.
|
|
435
|
+
* xterm can only render whole rows, so fractional-row pixels create dead
|
|
436
|
+
* space below the last row. After fitAddon.fit(), measure the gap and
|
|
437
|
+
* reduce padding by that amount so the terminal sits flush against the bars.
|
|
438
|
+
*/
|
|
439
|
+
_shrinkPaddingToFit() {
|
|
440
|
+
try {
|
|
441
|
+
const container = document.getElementById('terminalContainer');
|
|
442
|
+
const main = document.querySelector('.main');
|
|
443
|
+
if (!container || !main || typeof app === 'undefined' || !app.terminal) return;
|
|
444
|
+
const cellH = app.terminal._core?._renderService?.dimensions?.css?.cell?.height;
|
|
445
|
+
if (!cellH) return;
|
|
446
|
+
const gap = container.clientHeight - app.terminal.rows * cellH;
|
|
447
|
+
if (gap > 0 && gap < cellH) {
|
|
448
|
+
const currentPadding = parseInt(main.style.paddingBottom) || 0;
|
|
449
|
+
main.style.paddingBottom = Math.max(0, currentPadding - gap) + 'px';
|
|
450
|
+
if (app.fitAddon)
|
|
451
|
+
try {
|
|
452
|
+
app.fitAddon.fit();
|
|
453
|
+
} catch {}
|
|
454
|
+
}
|
|
455
|
+
} catch {}
|
|
456
|
+
},
|
|
457
|
+
|
|
390
458
|
/** Check if element is an input that triggers keyboard (excludes terminal) */
|
|
391
459
|
isInputElement(el) {
|
|
392
460
|
if (!el) return false;
|
|
@@ -404,11 +472,7 @@ const KeyboardHandler = {
|
|
|
404
472
|
return false;
|
|
405
473
|
}
|
|
406
474
|
}
|
|
407
|
-
return
|
|
408
|
-
tagName === 'input' ||
|
|
409
|
-
tagName === 'textarea' ||
|
|
410
|
-
el.isContentEditable
|
|
411
|
-
);
|
|
475
|
+
return tagName === 'input' || tagName === 'textarea' || el.isContentEditable;
|
|
412
476
|
},
|
|
413
477
|
|
|
414
478
|
/** Scroll input into view above the keyboard */
|
|
@@ -434,7 +498,7 @@ const KeyboardHandler = {
|
|
|
434
498
|
// For page-level - use scrollIntoView
|
|
435
499
|
input.scrollIntoView({ block: 'center', behavior: 'smooth' });
|
|
436
500
|
}
|
|
437
|
-
}
|
|
501
|
+
},
|
|
438
502
|
};
|
|
439
503
|
|
|
440
504
|
// ═══════════════════════════════════════════════════════════════
|
|
@@ -449,8 +513,8 @@ const SwipeHandler = {
|
|
|
449
513
|
startX: 0,
|
|
450
514
|
startY: 0,
|
|
451
515
|
startTime: 0,
|
|
452
|
-
minSwipeDistance: 80,
|
|
453
|
-
maxSwipeTime: 300,
|
|
516
|
+
minSwipeDistance: 80, // Minimum pixels for a valid swipe
|
|
517
|
+
maxSwipeTime: 300, // Maximum ms for a swipe gesture
|
|
454
518
|
maxVerticalDrift: 100, // Max vertical movement allowed
|
|
455
519
|
|
|
456
520
|
_touchStartHandler: null,
|
|
@@ -501,9 +565,9 @@ const SwipeHandler = {
|
|
|
501
565
|
const deltaX = endX - this.startX;
|
|
502
566
|
const deltaY = Math.abs(endY - this.startY);
|
|
503
567
|
|
|
504
|
-
if (elapsed > this.maxSwipeTime) return;
|
|
505
|
-
if (deltaY > this.maxVerticalDrift) return;
|
|
506
|
-
if (Math.abs(deltaX) < this.minSwipeDistance) return;
|
|
568
|
+
if (elapsed > this.maxSwipeTime) return; // Too slow
|
|
569
|
+
if (deltaY > this.maxVerticalDrift) return; // Too much vertical movement
|
|
570
|
+
if (Math.abs(deltaX) < this.minSwipeDistance) return; // Too short
|
|
507
571
|
|
|
508
572
|
// Valid swipe detected
|
|
509
573
|
if (deltaX > 0) {
|
|
@@ -513,5 +577,5 @@ const SwipeHandler = {
|
|
|
513
577
|
// Swipe left -> next session
|
|
514
578
|
if (typeof app !== 'undefined') app.nextSession();
|
|
515
579
|
}
|
|
516
|
-
}
|
|
580
|
+
},
|
|
517
581
|
};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
html.mobile-init .header-font-controls,html.mobile-init .header-system-stats,html.mobile-init .header-tokens,html.mobile-init .monitor-panel,html.mobile-init .subagents-panel,html.mobile-init .project-insights-panel,html.mobile-init .file-browser-panel{display:none!important}@media(max-width:768px){input,textarea,select{font-size:16px!important}html{touch-action:manipulation}}@media(max-width:768px)and (min-width:430px){.header{position:fixed;top:0;left:0;right:0;min-height:48px;max-height:48px;padding:.35rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));background:#0a0a0a;border-bottom:1px solid rgba(255,255,255,.08);z-index:200}.ios-device .header{padding-top:calc(.35rem + var(--safe-area-top));min-height:calc(48px + var(--safe-area-top));max-height:calc(48px + var(--safe-area-top))}.main{margin-top:54px}.ios-device .main{margin-top:calc(54px + var(--safe-area-top))}.header-font-controls{gap:.15rem;padding:.15rem .25rem}.header-font-controls .btn-icon-sm{width:18px;height:18px}.header-system-stats{font-size:.6rem;gap:.25rem}.header-right{gap:.35rem}.session-tabs,.session-tabs.tabs-two-rows{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none;max-height:52px;gap:3px}.session-tabs::-webkit-scrollbar{display:none}.session-tab{padding:.4rem .6rem;font-size:.75rem;min-height:40px}.session-tab .tab-name{max-width:80px}.toolbar{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));gap:.4rem}.tab-count-group{display:none}.btn-toolbar{padding:.4rem .8rem;font-size:.8rem;min-height:40px}.case-select-group{max-width:150px}.toolbar-select{font-size:.75rem}.monitor-panel,.subagents-panel{width:100%;max-width:100%;left:0;right:0;border-radius:8px 8px 0 0;max-height:40vh}.project-insights-panel{max-width:280px;font-size:.7rem}.modal-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}.modal-tabs::-webkit-scrollbar{display:none}.modal-tab-btn{padding:.4rem .75rem;font-size:.7rem;white-space:nowrap;flex-shrink:0}.settings-grid{gap:.4rem .75rem}.settings-item{font-size:.7rem}.event-type-grid{grid-template-columns:1fr 40px 40px 40px;gap:5px 6px}.event-label{font-size:.7rem}.subagent-window{width:320px;height:280px;min-width:240px;min-height:160px}.subagent-window-header{padding:.35rem .5rem}.subagent-window-title .id{font-size:.7rem;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.subagent-window-title .status{font-size:.55rem}.subagent-window-body{font-size:.7rem}.toolbar-center .btn-toolbar.btn-voice{display:flex!important}.toolbar{padding:0 .5rem;gap:.5rem}.toolbar-left,.toolbar-right,.toolbar-group{gap:.5rem}.btn-toolbar{padding:.4rem .75rem;font-size:.75rem;min-height:unset}}@media(max-width:430px){.header-brand{display:none}.header-font-controls{gap:.1rem;padding:.1rem .2rem}.header-font-controls .btn-icon-sm{width:16px;height:16px}.header-font-controls .font-size-display{font-size:.6rem;min-width:14px}.header-system-stats{font-size:.55rem;gap:.15rem}.header-tokens{font-size:.6rem;padding:.1rem .3rem}.header{position:fixed;top:0;left:0;right:0;min-height:36px;max-height:36px;padding:.15rem .3rem;padding-left:calc(.3rem + var(--safe-area-left));padding-right:calc(.3rem + var(--safe-area-right));gap:.15rem;overflow:hidden;background:#0a0a0a;border-bottom:1px solid rgba(255,255,255,.08);z-index:200}.ios-device .header{padding-top:calc(.15rem + var(--safe-area-top));min-height:calc(36px + var(--safe-area-top));max-height:calc(36px + var(--safe-area-top))}.main{margin-top:42px;padding-bottom:calc(40px + var(--safe-area-bottom))}.ios-device .main{margin-top:calc(42px + var(--safe-area-top))}.ios-device.safari-browser .main{padding-bottom:calc(40px + var(--safe-area-bottom) + (100vh - var(--app-height, 100vh)))}.header-right{padding-left:.2rem;gap:.1rem;flex-shrink:0;border-left:none}.btn-icon-header{width:26px;height:26px;padding:0}.btn-icon-header svg{width:12px;height:12px}.btn-icon-header.btn-settings,.btn-icon-header.btn-lifecycle-log{display:none!important}.btn-voice-mobile{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;background:#1a2a3f;border:1px solid rgba(59,130,246,.3);border-radius:4px;color:#93c5fd;cursor:pointer;flex-shrink:0;order:5}.btn-voice-mobile svg{width:13px;height:13px}.btn-voice-mobile:active{background:#2a3a5f}.btn-voice-mobile.recording{background:#ef444440;border-color:#ef444499;color:#ef4444;animation:voice-pulse 1.2s ease-in-out infinite}.btn-settings-mobile{display:inline-flex!important;align-items:center;justify-content:center;width:26px;height:26px;background:transparent;border:1px solid rgba(255,255,255,.2);border-radius:4px;color:#9ca3af;font-size:.85rem;cursor:pointer;flex-shrink:0;order:6;position:relative}.btn-settings-mobile svg{width:13px;height:13px}.btn-settings-mobile:active{background:#ffffff1a;color:#fff}.app{overflow:hidden;position:relative}.keyboard-visible .app{position:fixed;inset:0}.session-tabs,.session-tabs.tabs-two-rows{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none;max-height:36px;gap:2px;padding:0}.session-tabs::-webkit-scrollbar{display:none}.session-tab{flex-shrink:0;min-height:32px;max-height:32px;padding:.35rem .5rem;font-size:.7rem;gap:.25rem;border-radius:4px}.session-tab .tab-status{width:4px;height:4px}.session-tab .tab-name{max-width:50px;overflow:hidden;text-overflow:ellipsis}.session-tab .tab-close,.session-tab .tab-gear{display:none}.session-tab.active .tab-gear{display:inline-flex;align-items:center;justify-content:center;font-size:.5rem;line-height:1;width:12px;height:12px;margin-left:auto;opacity:.6}.session-tab.active .tab-close{display:inline-flex;align-items:center;justify-content:center;font-size:1.1rem;line-height:1;width:20px;height:18px;margin-left:-2px}.toolbar{position:fixed;bottom:var(--safe-area-bottom);left:0;right:0;height:40px;min-height:40px;max-height:40px;padding:.3rem .4rem;padding-left:calc(.4rem + var(--safe-area-left));padding-right:calc(.4rem + var(--safe-area-right));flex-wrap:nowrap;gap:.3rem;align-items:center;justify-content:space-between;background:#111;border-top:1px solid rgba(255,255,255,.1);z-index:50;transition:transform .15s ease-out;will-change:transform}.ios-device.safari-browser .toolbar{bottom:calc(var(--safe-area-bottom) + (100vh - var(--app-height, 100vh)))}.keyboard-visible.ios-device.safari-browser .toolbar{bottom:var(--safe-area-bottom)}.keyboard-visible.ios-device.safari-browser .keyboard-accessory-bar{bottom:calc(var(--safe-area-bottom) + 40px)}.toolbar-center{display:flex!important;align-items:center}.toolbar-right,.version-display{display:none!important}.toolbar-left{flex:1 1 0;min-width:0;align-items:center;gap:.3rem}.toolbar-left .toolbar-group{display:flex;flex:1 1 0;min-width:0;align-items:center;gap:.3rem}.toolbar-left .toolbar-group:first-child{flex:1 1 0;min-width:0;justify-content:space-between;gap:.3rem;flex-wrap:nowrap;align-items:center}.tab-count-group{display:none!important}.btn-toolbar{min-height:26px!important;max-height:26px!important;height:26px!important;padding:0 .5rem!important;font-size:.65rem!important;border-radius:4px;line-height:26px;display:inline-flex;align-items:center;justify-content:center;font-weight:500;letter-spacing:.01em;color:#fff}.run-btn-group{display:flex;flex:0 0 auto}.btn-toolbar.btn-run{flex:0 0 auto;padding:0 .6rem!important;font-weight:500;border-radius:4px 0 0 4px!important;border-right:none!important}.btn-toolbar.btn-run svg{width:10px;height:10px;margin-right:3px}.btn-toolbar.btn-run-gear{flex:0 0 auto;padding:0 .35rem!important;min-width:unset!important;border-radius:0 4px 4px 0!important;border-left:1px solid rgba(255,255,255,.15)!important}.btn-toolbar.btn-run-gear svg{width:10px;height:10px}.btn-toolbar.btn-run.mode-claude,.btn-toolbar.btn-run-gear.mode-claude{background:#1e3a5f;border-color:#3b82f64d;color:#93c5fd}.btn-toolbar.btn-run.mode-claude:active,.btn-toolbar.btn-run-gear.mode-claude:active{background:#2563eb;border-color:#3b82f680}.btn-toolbar.btn-run.mode-opencode,.btn-toolbar.btn-run-gear.mode-opencode{background:#0a2e2a;border-color:#10b9814d;color:#6ee7b7}.btn-toolbar.btn-run.mode-opencode:active,.btn-toolbar.btn-run-gear.mode-opencode:active{background:#0d4a40;border-color:#10b98180}.run-mode-menu{bottom:100%;left:0;margin-bottom:6px;min-width:160px;max-width:80vw}.run-mode-option{padding:10px 12px;font-size:.8rem;cursor:pointer;-webkit-tap-highlight-color:rgba(255,255,255,.1)}.run-mode-history{-webkit-overflow-scrolling:touch;touch-action:manipulation}.btn-toolbar.btn-stop{display:flex!important;flex:0 0 auto;padding:0 8px!important;min-width:unset;order:3}.btn-toolbar.btn-stop svg{width:10px;height:10px;margin-right:0}.btn-toolbar.btn-shell{flex:0 0 auto;background:transparent;border:1px solid rgba(255,255,255,.2);color:#9ca3af;order:4}.btn-toolbar.btn-shell:hover,.btn-toolbar.btn-shell:active{background:#ffffff1a;color:#fff}.case-select-group{display:none!important}.toolbar-left .toolbar-group:first-child{width:100%;gap:8px}.btn-toolbar.btn-shell{flex:0 0 auto;min-width:fit-content;white-space:nowrap;padding:0 10px!important}.btn-toolbar.btn-case-mobile{display:flex!important;flex:1 1 0!important;min-width:0;padding:0 8px!important;order:2;overflow:hidden;justify-content:center;gap:4px}.btn-toolbar.btn-case-mobile #mobileCaseName{max-width:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-case-settings-mobile{display:inline-flex!important;align-items:center;justify-content:center;width:26px;height:26px;background:transparent;border:1px solid rgba(255,255,255,.2);border-radius:4px;color:#9ca3af;cursor:pointer;flex-shrink:0;order:1}.btn-case-settings-mobile:active{background:#ffffff1a;color:#fff}.case-settings-popover-mobile{position:fixed;bottom:calc(var(--safe-area-bottom) + 46px);left:8px;right:8px;background:#1e1e1e;border:1px solid rgba(255,255,255,.15);border-radius:8px;padding:.6rem .75rem;z-index:1000;box-shadow:0 4px 16px #00000080;display:block}.case-settings-popover-mobile.hidden{display:none!important}.case-settings-popover-mobile .checkbox-inline{display:flex;align-items:center;gap:6px;font-size:.75rem;color:#e5e7eb}.case-settings-popover-mobile .form-hint{display:block;margin-top:.2rem;font-size:.6rem;color:#6b7280}.keyboard-accessory-bar{display:none;position:fixed;bottom:calc(var(--safe-area-bottom) + 40px);left:0;right:0;height:44px;background:#1a1a1a;border-top:1px solid rgba(255,255,255,.1);padding:6px 8px;padding-left:calc(8px + var(--safe-area-left));padding-right:calc(8px + var(--safe-area-right));gap:8px;align-items:center;justify-content:center;z-index:51;transition:transform .15s ease-out;will-change:transform}.keyboard-accessory-bar.visible{display:flex}.accessory-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:6px 12px;background:#2a2a2a;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:#e5e5e5;font-size:.65rem;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s}.accessory-btn.confirming{background:#6b4f00;border-color:#b8860b;color:#ffd54f}.accessory-btn:active{background:#3a3a3a}.accessory-btn svg{width:14px;height:14px}.accessory-btn-arrow{padding:6px 10px;background:#1e3a5f;border-color:#3b82f64d;color:#93c5fd}.accessory-btn-arrow:active{background:#2563eb}.accessory-btn-dismiss{padding:8px 14px;background:#2a2a2a;border:1.5px solid rgba(255,255,255,.25);border-radius:6px;color:#e5e5e5}.accessory-btn-dismiss svg{width:22px;height:22px;stroke-width:3}.accessory-btn-dismiss:active{background:#3a3a3a}.voice-preview{bottom:calc(var(--safe-area-bottom) + 94px);font-size:.8rem;max-width:90%;padding:6px 14px}.btn-case-add,.btn-case-settings{display:none!important}.paste-overlay{position:fixed;inset:0;background:#0009;z-index:10000;display:flex;align-items:flex-end;justify-content:center;padding-bottom:env(safe-area-inset-bottom,12px)}.paste-dialog{background:var(--bg-secondary, #1e1e2e);border:1px solid var(--border-color, #444);border-radius:12px;padding:12px;width:calc(100% - 24px);max-width:400px;margin-bottom:8px}.paste-textarea{width:100%;min-height:60px;max-height:120px;background:var(--bg-primary, #0d0d14);color:var(--text-primary, #e0e0e0);border:1px solid var(--border-color, #444);border-radius:8px;padding:8px;font-family:inherit;font-size:16px;resize:none;box-sizing:border-box}.paste-textarea:focus{outline:none;border-color:var(--accent-color, #7aa2f7)}.paste-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}.paste-cancel,.paste-new,.paste-send{padding:8px 18px;border:none;border-radius:8px;font-size:14px;cursor:pointer}.paste-cancel{background:var(--bg-tertiary, #333);color:var(--text-secondary, #aaa)}.paste-new{background:var(--bg-tertiary, #333);color:var(--accent-color, #7aa2f7);border:1px solid var(--accent-color, #7aa2f7)}.paste-send{background:var(--accent-color, #7aa2f7);color:#fff;font-weight:600}.toolbar-select{display:none!important}.toolbar .btn-case-add{min-width:26px!important;max-width:26px!important;width:26px!important;min-height:26px!important;max-height:26px!important;height:26px!important;padding:0!important;font-size:.9rem;font-weight:700;display:inline-flex!important;align-items:center;justify-content:center;line-height:1;border-radius:4px;background:transparent;border:1px solid rgba(255,255,255,.15);color:#9ca3af}.btn-case-add:hover,.btn-case-add:active{background:#ffffff1a;color:#fff}.monitor-panel,.subagents-panel{width:100%;max-width:100%;left:0;right:0;border-radius:8px 8px 0 0;bottom:calc(44px + 2rem + var(--safe-area-bottom));max-height:35vh}.modal-content{width:100%;max-width:100%;height:100%;max-height:100%;border-radius:0;margin:0;display:flex;flex-direction:column}.modal-content.modal-sm{height:auto;max-height:85vh;border-radius:12px;margin:1rem;width:calc(100% - 2rem)}.ios-device .modal-content{padding-top:var(--safe-area-top);padding-bottom:var(--safe-area-bottom);padding-left:var(--safe-area-left);padding-right:var(--safe-area-right)}.modal-header{padding:.75rem 1rem}.modal-header h3{font-size:1rem}.modal-body{padding:.75rem 1rem;flex:1;min-height:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.modal-footer,.form-actions{padding:.75rem 1rem;padding-bottom:calc(.75rem + var(--safe-area-bottom))}.ios-device .terminal-container{padding-bottom:var(--safe-area-bottom)}.main{flex:1;min-height:0}.cli-info-bar{display:block}.terminal-container{height:100%;min-height:0;position:relative;overflow:visible;touch-action:none}.terminal-container .xterm,.terminal-container .xterm-viewport,.terminal-container .xterm-screen{touch-action:none}.welcome-content{padding:1rem .75rem}.welcome-title{font-size:1.2rem;margin-bottom:.5rem}.welcome-desc{font-size:.8rem;margin-bottom:.4rem}.welcome-actions{flex-direction:column;gap:.5rem;margin-top:1rem}.welcome-btn{width:100%;justify-content:center;min-height:44px;padding:.75rem 1rem;font-size:.85rem}.welcome-hint{font-size:.7rem;margin-top:.75rem}.modal-wizard{display:flex;flex-direction:column}.wizard-progress{padding:.5rem}.wizard-step{padding:.3rem}.wizard-step-number{width:24px;height:24px;font-size:.7rem}.wizard-step-label{display:none}.timer-banner{padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right))}.respawn-banner{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right));font-size:.7rem}.respawn-compact-layout{flex-direction:column;gap:.25rem}.respawn-status-col{flex-shrink:1;min-width:0}.respawn-status-row1{flex-wrap:wrap;gap:.35rem}.respawn-banner .btn-icon-only{min-width:36px;min-height:36px;font-size:1rem;display:flex;align-items:center;justify-content:center;margin-left:auto;border-radius:6px}.respawn-action-log{border-left:none;border-top:1px solid rgba(34,197,94,.2);padding-left:0;padding-top:.25rem;max-height:2em;font-size:.6rem}.respawn-countdown-timers{gap:.2rem}.respawn-countdown-timer{font-size:.55rem;padding:.05rem .25rem}.respawn-header{flex-direction:row;gap:.4rem;align-items:center}.respawn-header .respawn-actions{display:flex;gap:.3rem;flex-shrink:0}.respawn-header .respawn-actions .btn-toolbar{min-height:28px!important;font-size:.7rem!important;padding:.2rem .5rem!important;border-radius:5px}.duration-presets{display:flex;flex-wrap:wrap;gap:.25rem}.duration-preset-btn{min-height:28px;padding:.2rem .4rem;font-size:.65rem;border-radius:5px;text-align:center;flex:1 1 auto;min-width:0}.duration-custom{flex-wrap:wrap;gap:.25rem;flex:1 1 100%}.duration-custom .duration-preset-btn{flex:0 0 auto;min-width:50px}.duration-custom-input.visible{flex:1}.duration-custom-input input{width:100%;min-height:28px;font-size:16px}.preset-selector{display:flex;flex-wrap:wrap;gap:.25rem}.preset-selector select{width:100%;min-height:28px;font-size:16px;border-radius:5px;padding:.2rem .4rem}.preset-selector .btn{flex:1;min-height:28px;font-size:.65rem;border-radius:5px;padding:.2rem .4rem}#sessionOptionsModal textarea{font-size:16px;min-height:32px!important;max-height:56px;height:auto!important;border-radius:6px;padding:.3rem .5rem}#modalRespawnPrompt{min-height:32px!important;max-height:56px}#modalRespawnKickstart{min-height:32px!important;max-height:48px}#sessionOptionsModal .checkbox-inline{min-height:30px;font-size:.75rem;padding:.15rem 0;gap:.4rem}#sessionOptionsModal .checkbox-inline input[type=checkbox]{width:18px;height:18px}#sessionOptionsModal .respawn-options-row{gap:.5rem}#sessionOptionsModal .form-section-header{margin-top:.75rem;padding-top:.5rem;font-size:.65rem}#sessionOptionsModal .form-row{margin-bottom:.5rem}#sessionOptionsModal .form-row label{font-size:.65rem;margin-bottom:.2rem}#sessionOptionsModal .form-hint{font-size:.6rem;margin-top:.2rem}.context-setting{padding:.625rem}.context-setting-header{flex-wrap:wrap;gap:.4rem}.context-setting-header .input-suffix-sm input{width:60px;font-size:16px;min-height:36px}.context-setting input[type=text]{font-size:16px;min-height:36px;padding:.4rem .6rem;border-radius:6px}.color-picker{gap:8px}.color-swatch{width:36px;height:36px;border-radius:6px}.form-row-switch{min-height:40px;gap:.4rem}.context-settings-grid input[type=number]{font-size:16px;min-height:36px}.ralph-limits-grid{grid-template-columns:1fr 1fr;gap:.5rem}.ralph-limits-grid .form-col input[type=number]{font-size:16px;min-height:36px;padding:.4rem .5rem;border-radius:6px}#modalRalphPhrase{font-size:16px;min-height:40px;border-radius:6px}.ralph-config-actions{margin-top:1rem}.ralph-config-actions .btn-toolbar{width:100%;min-height:44px;font-size:.85rem;border-radius:8px}.run-summary-filters{gap:.3rem;margin-bottom:.5rem}.filter-btn{padding:.35rem .75rem;font-size:.7rem;min-height:32px}.timeline-event{padding:.4rem .5rem;margin-bottom:.25rem;font-size:.7rem}.run-summary-footer{flex-direction:column;gap:.4rem;padding:.5rem 0}.run-summary-actions{flex-wrap:wrap;gap:.3rem}.run-summary-actions .btn-toolbar{flex:1;min-height:36px;font-size:.7rem;white-space:nowrap}.auto-refresh-label{font-size:.7rem}.ralph-panel{font-size:.75rem}.ralph-summary{padding:.4rem .5rem;padding-left:calc(.5rem + var(--safe-area-left));padding-right:calc(.5rem + var(--safe-area-right))}.project-insights-panel{max-width:100%;font-size:.65rem;bottom:calc(44px + 2rem + var(--safe-area-bottom))}.file-browser-panel{max-width:100%;max-height:50vh;bottom:calc(44px + 2rem + var(--safe-area-bottom))}.notification-drawer{width:100%;max-width:100%;right:0;border-radius:0;padding-left:var(--safe-area-left);padding-right:var(--safe-area-right);padding-bottom:var(--safe-area-bottom)}input,textarea,[contenteditable]{scroll-margin-bottom:200px;scroll-margin-top:80px}.keyboard-visible .modal-body{max-height:40vh;overflow-y:auto}.keyboard-visible #createCaseModal .modal-body{max-height:60vh}.mobile-case-picker .modal-backdrop{background:#00000080}.mobile-case-picker-sheet{max-height:60vh;padding-bottom:var(--safe-area-bottom);animation:slideUp .2s ease-out}@keyframes slideUp{0%{transform:translateY(100%)}to{transform:translateY(0)}}.mobile-case-picker-header .modal-close{width:32px;height:32px;font-size:1.5rem}.mobile-case-picker-footer{padding-bottom:calc(12px + var(--safe-area-bottom))}.modal-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;gap:.25rem;padding:0 .75rem .5rem;flex-wrap:nowrap}.modal-tabs::-webkit-scrollbar{display:none}.modal-tab-btn{padding:.35rem .6rem;font-size:.65rem;white-space:nowrap;flex-shrink:0}#createCaseModal .modal-tabs{gap:.5rem;padding:.5rem 1rem .75rem}#createCaseModal .modal-tab-btn{flex:1;min-height:44px;padding:.6rem 1rem;font-size:.8rem;font-weight:500;border-radius:8px;justify-content:center;text-align:center}#createCaseModal .form-row{margin-bottom:1rem}#createCaseModal .form-row label{font-size:.8rem;margin-bottom:.4rem;font-weight:500;color:#e5e7eb}#createCaseModal .form-row input[type=text]{min-height:44px;font-size:16px;padding:.5rem .75rem;border-radius:8px}#createCaseModal .form-row .form-hint{font-size:.65rem;margin-top:.35rem;line-height:1.4}#createCaseModal .form-actions{padding:.75rem 1rem;padding-bottom:calc(.75rem + var(--safe-area-bottom));gap:.75rem}#createCaseModal .form-actions .btn-toolbar{min-height:44px!important;max-height:44px!important;height:44px!important;font-size:.85rem!important;font-weight:500;border-radius:8px}#caseModalSubmit.loading{opacity:.6;pointer-events:none}#createCaseModal.from-mobile .modal-content{animation:caseModalSlideUp .25s ease-out}@keyframes caseModalSlideUp{0%{transform:translateY(30px);opacity:0}to{transform:translateY(0);opacity:1}}.btn-case-create-mobile{min-height:48px!important;max-height:48px!important;height:48px!important;font-size:.85rem!important;font-weight:500;border-radius:10px}.settings-grid{grid-template-columns:1fr;gap:.35rem}.settings-grid-3col{grid-template-columns:1fr 1fr 1fr}.settings-item{padding:.35rem .5rem;font-size:.7rem}.settings-item-label{font-size:.7rem}.settings-section-header{font-size:.6rem;padding:.35rem 0 .2rem;margin-top:.5rem}.form-row{margin-bottom:.5rem}.form-row label{font-size:.7rem;margin-bottom:.2rem}.form-row .form-hint{font-size:.6rem}.form-row input[type=text],.form-row input[type=number],.form-row textarea,.form-row .form-select,.form-row select{font-size:.75rem;padding:.35rem .5rem;min-height:32px}.form-row-switch{gap:.3rem}.form-row-switch>label:first-child{font-size:.7rem}.form-section-header{font-size:.6rem;margin-top:.75rem}.event-type-grid{grid-template-columns:1fr 36px 36px 36px;gap:4px 4px;padding:6px;margin-top:6px}.event-header{font-size:.55rem}.event-label{font-size:.65rem}.event-type-grid input[type=checkbox]{width:12px;height:12px}.form-actions{gap:.5rem}.form-actions .btn-toolbar{flex:1;min-height:36px!important;max-height:36px!important;height:36px!important;font-size:.75rem!important}.subagent-window{position:fixed;width:calc(100% - 8px);max-width:calc(100% - 8px);height:110px;min-height:80px;max-height:110px;min-width:200px;border-radius:6px;resize:none;box-shadow:0 2px 8px #0006}.subagent-window:after{display:none}.subagent-window-header{padding:.2rem .4rem;min-height:24px}.subagent-window-title{gap:.2rem;overflow:hidden}.subagent-window-title .icon{font-size:.7rem}.subagent-window-title .id{font-size:.6rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:45vw}.subagent-window-title .status{font-size:.45rem;padding:.05rem .15rem}.subagent-model-badge{font-size:.45rem!important;padding:.05rem .15rem!important}.subagent-window-actions button{font-size:.7rem;padding:.15rem .35rem;min-width:26px;min-height:26px;display:flex;align-items:center;justify-content:center}.subagent-window-body{font-size:.6rem;padding:.2rem .35rem}.subagent-window-body .activity-line{gap:.15rem;padding:.05rem 0}.subagent-window-body .activity-line .time{font-size:.5rem}.subagent-window-body .activity-line .tool-name,.subagent-window-body .activity-line .tool-detail{font-size:.55rem}.subagent-window-parent{display:none}.session-tab .tab-subagent-badge{height:14px;padding:0 3px;border-radius:7px;margin-left:2px}.session-tab .tab-subagent-badge .subagent-label{font-size:.45rem}.subagent-dropdown{position:fixed!important;left:8px!important;right:8px!important;bottom:auto!important;min-width:auto!important;max-width:none!important;border-radius:8px;transform:none!important}}.keyboard-accessory-bar{display:none;height:44px;background:#1a1a1a;border-top:1px solid rgba(255,255,255,.1);padding:6px 8px;gap:8px;align-items:center;justify-content:center;z-index:51}.keyboard-accessory-bar.visible{display:flex}.accessory-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;padding:6px 12px;background:#2a2a2a;border:1px solid rgba(255,255,255,.15);border-radius:6px;color:#e5e5e5;font-size:.65rem;font-weight:500;cursor:pointer;transition:background .15s,border-color .15s}.accessory-btn.confirming{background:#6b4f00;border-color:#b8860b;color:#ffd54f}.accessory-btn:active{background:#3a3a3a}.accessory-btn svg{width:14px;height:14px}.accessory-btn-arrow{padding:6px 10px;background:#1e3a5f;border-color:#3b82f64d;color:#93c5fd}.accessory-btn-arrow:active{background:#2563eb}.accessory-btn-dismiss{padding:8px 14px;background:#2a2a2a;border:1.5px solid rgba(255,255,255,.25);border-radius:6px;color:#e5e5e5}.accessory-btn-dismiss svg{width:22px;height:22px;stroke-width:3}.accessory-btn-dismiss:active{background:#3a3a3a}.ios-device.safari-browser{overscroll-behavior:none}@media(hover:none)and (pointer:coarse){.session-tab .tab-close,.session-tab .tab-gear{opacity:1;width:auto;padding:.15rem .25rem;align-items:center;justify-content:center}.btn-toolbar:hover,.btn-icon-header:hover{transform:none}.subagent-dropdown-trigger:active+.subagent-dropdown-menu,.subagent-dropdown-trigger:focus+.subagent-dropdown-menu{display:block}}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|