aicodeman 1.16.3 → 1.16.4
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/README.md +9 -9
- package/dist/claude-credentials.d.ts +50 -0
- package/dist/claude-credentials.d.ts.map +1 -0
- package/dist/claude-credentials.js +102 -0
- package/dist/claude-credentials.js.map +1 -0
- package/dist/config/voice.d.ts +43 -0
- package/dist/config/voice.d.ts.map +1 -0
- package/dist/config/voice.js +48 -0
- package/dist/config/voice.js.map +1 -0
- package/dist/web/ports/config-port.d.ts +2 -0
- package/dist/web/ports/config-port.d.ts.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.f9c6aadd.js.gz +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/constants.53dc0fa1.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/home-sessions.js +15 -4
- package/dist/web/public/home-sessions.js.br +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/i18n.89097ff5.js +1 -0
- package/dist/web/public/i18n.89097ff5.js.br +0 -0
- package/dist/web/public/i18n.89097ff5.js.gz +0 -0
- package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
- package/dist/web/public/index.html +657 -402
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.0f524637.js.gz +0 -0
- package/dist/web/public/mobile-handlers.32fdd57f.js.gz +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.4f875962.css +1 -0
- package/dist/web/public/mobile.4f875962.css.br +0 -0
- package/dist/web/public/mobile.4f875962.css.gz +0 -0
- package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/panels-ui.54b0d004.js.gz +0 -0
- package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
- package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js +20 -4
- package/dist/web/public/readmymind-ui.js.br +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
- package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
- package/dist/web/public/{session-ui.f4fed187.js → session-ui.46a0993c.js} +5 -5
- package/dist/web/public/session-ui.46a0993c.js.br +0 -0
- package/dist/web/public/session-ui.46a0993c.js.gz +0 -0
- package/dist/web/public/settings-ui.63be4178.js +67 -0
- package/dist/web/public/settings-ui.63be4178.js.br +0 -0
- package/dist/web/public/settings-ui.63be4178.js.gz +0 -0
- package/dist/web/public/styles.9e04378d.css +1 -0
- package/dist/web/public/styles.9e04378d.css.br +0 -0
- package/dist/web/public/styles.9e04378d.css.gz +0 -0
- package/dist/web/public/subagent-windows.4cc8b005.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/terminal-ui.ae776405.js +4 -0
- package/dist/web/public/terminal-ui.ae776405.js.br +0 -0
- package/dist/web/public/terminal-ui.ae776405.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.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-predictive-echo.6cec0fba.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.e5461859.js → voice-input.4ec670b0.js} +421 -13
- package/dist/web/public/voice-input.4ec670b0.js.br +0 -0
- package/dist/web/public/voice-input.4ec670b0.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js +57 -0
- package/dist/web/public/voice-pcm-worklet.js.br +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.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/voice-routes.d.ts +45 -0
- package/dist/web/routes/voice-routes.d.ts.map +1 -0
- package/dist/web/routes/voice-routes.js +172 -0
- package/dist/web/routes/voice-routes.js.map +1 -0
- package/dist/web/schemas.d.ts +2 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +12 -0
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +11 -1
- package/dist/web/server.js.map +1 -1
- package/dist/web/voice-stream.d.ts +96 -0
- package/dist/web/voice-stream.d.ts.map +1 -0
- package/dist/web/voice-stream.js +268 -0
- package/dist/web/voice-stream.js.map +1 -0
- package/package.json +1 -1
- package/dist/web/public/i18n.1a8b3412.js +0 -1
- package/dist/web/public/i18n.1a8b3412.js.br +0 -0
- package/dist/web/public/i18n.1a8b3412.js.gz +0 -0
- package/dist/web/public/mobile.52b30b35.css +0 -1
- package/dist/web/public/mobile.52b30b35.css.br +0 -0
- package/dist/web/public/mobile.52b30b35.css.gz +0 -0
- package/dist/web/public/session-ui.f4fed187.js.br +0 -0
- package/dist/web/public/session-ui.f4fed187.js.gz +0 -0
- package/dist/web/public/settings-ui.c674f367.js +0 -67
- package/dist/web/public/settings-ui.c674f367.js.br +0 -0
- package/dist/web/public/settings-ui.c674f367.js.gz +0 -0
- package/dist/web/public/styles.2eb23e0f.css +0 -1
- package/dist/web/public/styles.2eb23e0f.css.br +0 -0
- package/dist/web/public/styles.2eb23e0f.css.gz +0 -0
- package/dist/web/public/terminal-ui.61c7829d.js +0 -4
- package/dist/web/public/terminal-ui.61c7829d.js.br +0 -0
- package/dist/web/public/terminal-ui.61c7829d.js.gz +0 -0
- package/dist/web/public/voice-input.e5461859.js.br +0 -0
- package/dist/web/public/voice-input.e5461859.js.gz +0 -0
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
<link rel="manifest" href="manifest.json">
|
|
17
17
|
<title>Codeman</title>
|
|
18
18
|
<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">
|
|
19
|
-
<link rel="stylesheet" href="styles.
|
|
20
|
-
<link rel="stylesheet" href="mobile.
|
|
19
|
+
<link rel="stylesheet" href="styles.9e04378d.css">
|
|
20
|
+
<link rel="stylesheet" href="mobile.4f875962.css" media="(max-width: 1023px)">
|
|
21
21
|
<!-- xterm.css loaded async — terminal won't display until xterm.js runs anyway -->
|
|
22
22
|
<link rel="preload" href="vendor/xterm.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
23
23
|
<noscript><link rel="stylesheet" href="vendor/xterm.css"></noscript>
|
|
@@ -983,282 +983,382 @@
|
|
|
983
983
|
</div>
|
|
984
984
|
|
|
985
985
|
<!-- Session Options Modal (includes Respawn Settings) -->
|
|
986
|
+
<!-- Session Options: same `set-*` surface as App Settings, but the rail is a
|
|
987
|
+
real switcher (one .set-section at a time) rather than a table of
|
|
988
|
+
contents — see the settings-surface block in styles.css. -->
|
|
986
989
|
<div class="modal" id="sessionOptionsModal">
|
|
987
990
|
<div class="modal-backdrop" onclick="app.closeSessionOptions()"></div>
|
|
988
|
-
<div class="modal-content">
|
|
989
|
-
<div class="modal-header">
|
|
991
|
+
<div class="modal-content modal-lg set-shell">
|
|
992
|
+
<div class="modal-header set-shell-head">
|
|
990
993
|
<h3>Session Options</h3>
|
|
991
|
-
<
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
<div class="modal-tabs">
|
|
995
|
-
<button class="modal-tab-btn active" data-tab="respawn" data-claude-only onclick="app.switchOptionsTab('respawn')">Respawn</button>
|
|
996
|
-
<button class="modal-tab-btn" data-tab="context" onclick="app.switchOptionsTab('context')">Context</button>
|
|
997
|
-
<button class="modal-tab-btn" data-tab="ralph" data-claude-only onclick="app.switchOptionsTab('ralph')">Ralph / Todo</button>
|
|
998
|
-
<button class="modal-tab-btn" data-tab="summary" onclick="app.switchOptionsTab('summary')">Summary</button>
|
|
994
|
+
<div class="set-head-actions">
|
|
995
|
+
<button class="modal-close" onclick="app.closeSessionOptions()" aria-label="Close session options">×</button>
|
|
996
|
+
</div>
|
|
999
997
|
</div>
|
|
1000
|
-
<div class="
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
<
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
<
|
|
998
|
+
<div class="set-body">
|
|
999
|
+
<nav class="set-rail" id="sessionOptionsRail" aria-label="Session option sections">
|
|
1000
|
+
<div class="set-rail-items">
|
|
1001
|
+
<button type="button" class="set-rail-item active" data-tab="respawn" data-claude-only onclick="app.switchOptionsTab('respawn')">
|
|
1002
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg>
|
|
1003
|
+
<span>Respawn</span>
|
|
1004
|
+
</button>
|
|
1005
|
+
<button type="button" class="set-rail-item" data-tab="context" onclick="app.switchOptionsTab('context')">
|
|
1006
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="6" rx="8" ry="3"/><path d="M4 6v6c0 1.7 3.6 3 8 3s8-1.3 8-3V6"/><path d="M4 12v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"/></svg>
|
|
1007
|
+
<span>Session</span>
|
|
1008
|
+
</button>
|
|
1009
|
+
<button type="button" class="set-rail-item" data-tab="ralph" data-claude-only onclick="app.switchOptionsTab('ralph')">
|
|
1010
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6h11"/><path d="M9 12h11"/><path d="M9 18h11"/><polyline points="3 6 4 7 6 5"/><polyline points="3 12 4 13 6 11"/><polyline points="3 18 4 19 6 17"/></svg>
|
|
1011
|
+
<span>Ralph / Todo</span>
|
|
1012
|
+
</button>
|
|
1013
|
+
<button type="button" class="set-rail-item" data-tab="summary" onclick="app.switchOptionsTab('summary')">
|
|
1014
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"/><polyline points="7 14 11 10 14 13 20 7"/></svg>
|
|
1015
|
+
<span>Summary</span>
|
|
1016
|
+
</button>
|
|
1012
1017
|
</div>
|
|
1018
|
+
<p class="set-rail-foot">These options belong to the selected session and save as you change them.</p>
|
|
1019
|
+
</nav>
|
|
1013
1020
|
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
<
|
|
1021
|
+
<div class="set-doc" id="sessionOptionsDoc">
|
|
1022
|
+
<!-- ══ Respawn ══════════════════════════════════════════════════ -->
|
|
1023
|
+
<section class="set-section" id="respawn-tab" data-label="Respawn">
|
|
1024
|
+
<div class="set-section-head">
|
|
1025
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg>
|
|
1026
|
+
<h2>Respawn</h2>
|
|
1027
|
+
</div>
|
|
1028
|
+
<p class="set-section-blurb">One autonomous work cycle, plus what to do when a usage limit pauses the session.</p>
|
|
1029
|
+
|
|
1030
|
+
<!-- The one setting on this tab worth reading before anything
|
|
1031
|
+
else, so it is a callout rather than the first row of a list:
|
|
1032
|
+
it is what turns a limit-halted overnight run back on. -->
|
|
1033
|
+
<label class="set-callout">
|
|
1034
|
+
<span class="set-callout-ico" aria-hidden="true">
|
|
1035
|
+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 15 14"/></svg>
|
|
1036
|
+
</span>
|
|
1037
|
+
<span class="set-callout-text">
|
|
1038
|
+
<span class="set-callout-title">Auto-resume when the usage limit resets</span>
|
|
1039
|
+
<span class="set-callout-desc">Claude stops on a subscription limit ("limit reached · resets 3pm") and sits there until you come back. Switch this on and Codeman waits out the reset, then continues the work on its own. Independent of the respawn loop below.</span>
|
|
1040
|
+
<span class="auto-resume-status" id="autoResumeStatus"></span>
|
|
1041
|
+
</span>
|
|
1042
|
+
<span class="switch switch-sm set-callout-switch"><input type="checkbox" id="modalAutoResumeEnabled" onchange="app.autoSaveAutoResume()"><span class="slider"></span></span>
|
|
1043
|
+
</label>
|
|
1017
1044
|
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
<div
|
|
1021
|
-
<
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1045
|
+
<!-- Hidden wholesale for non-claude sessions and for a session with
|
|
1046
|
+
no live process (session-ui.js: openSessionOptions). -->
|
|
1047
|
+
<div id="sessionRespawnSection">
|
|
1048
|
+
<div class="set-group">
|
|
1049
|
+
<div class="set-group-head"><h4>Loop control</h4></div>
|
|
1050
|
+
<div class="set-group-body">
|
|
1051
|
+
<div class="set-row">
|
|
1052
|
+
<div class="set-row-text">
|
|
1053
|
+
<span class="set-row-label">Status</span>
|
|
1054
|
+
<div class="session-respawn-status" id="sessionRespawnStatus">
|
|
1055
|
+
<span class="respawn-status-indicator"></span>
|
|
1056
|
+
<span class="respawn-status-text">Not active</span>
|
|
1057
|
+
</div>
|
|
1058
|
+
</div>
|
|
1059
|
+
<div class="set-row-actions">
|
|
1060
|
+
<button class="btn-toolbar btn-success btn-sm" onclick="app.enableRespawnFromModal()" id="modalEnableRespawnBtn">Enable</button>
|
|
1061
|
+
<button class="btn-toolbar btn-danger btn-sm" onclick="app.stopRespawnFromModal()" id="modalStopRespawnBtn" style="display: none;">Stop</button>
|
|
1062
|
+
</div>
|
|
1063
|
+
</div>
|
|
1032
1064
|
</div>
|
|
1033
1065
|
</div>
|
|
1034
|
-
</div>
|
|
1035
|
-
</div>
|
|
1036
1066
|
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1067
|
+
<div class="set-group">
|
|
1068
|
+
<div class="set-group-head"><h4>Respawn loop</h4></div>
|
|
1069
|
+
<p class="set-group-hint">Whenever Claude goes idle, Codeman sends the update prompt, optionally runs /clear + /init, and kickstarts the next round — repeating for the chosen duration. Configure it here, then press Enable.</p>
|
|
1070
|
+
<div class="set-group-body">
|
|
1071
|
+
<div class="set-row set-row-block">
|
|
1072
|
+
<div class="set-row-text">
|
|
1073
|
+
<span class="set-row-label">Duration</span>
|
|
1074
|
+
<span class="set-row-desc">How long the loop keeps cycling before it stops on its own.</span>
|
|
1075
|
+
</div>
|
|
1076
|
+
<div class="duration-presets">
|
|
1077
|
+
<button type="button" class="duration-preset-btn" data-minutes="30" onclick="app.selectDurationPreset('30')">30m</button>
|
|
1078
|
+
<button type="button" class="duration-preset-btn" data-minutes="60" onclick="app.selectDurationPreset('60')">1h</button>
|
|
1079
|
+
<button type="button" class="duration-preset-btn" data-minutes="120" onclick="app.selectDurationPreset('120')">2h</button>
|
|
1080
|
+
<button type="button" class="duration-preset-btn" data-minutes="240" onclick="app.selectDurationPreset('240')">4h</button>
|
|
1081
|
+
<button type="button" class="duration-preset-btn" data-minutes="480" onclick="app.selectDurationPreset('480')">8h</button>
|
|
1082
|
+
<button type="button" class="duration-preset-btn active" data-minutes="" onclick="app.selectDurationPreset('')">∞</button>
|
|
1083
|
+
<div class="duration-custom">
|
|
1084
|
+
<button type="button" class="duration-preset-btn" data-minutes="custom" onclick="app.selectDurationPreset('custom')">Custom</button>
|
|
1085
|
+
<div class="input-suffix input-suffix-sm duration-custom-input">
|
|
1086
|
+
<input type="number" id="modalRespawnDuration" value="" min="1" placeholder="min">
|
|
1087
|
+
<span>min</span>
|
|
1088
|
+
</div>
|
|
1089
|
+
</div>
|
|
1090
|
+
</div>
|
|
1091
|
+
</div>
|
|
1053
1092
|
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1093
|
+
<div class="set-row set-row-block">
|
|
1094
|
+
<div class="set-row-text">
|
|
1095
|
+
<span class="set-row-label">Preset</span>
|
|
1096
|
+
<span class="set-row-desc">Load a saved loop configuration, or store the current one under a name.</span>
|
|
1097
|
+
</div>
|
|
1098
|
+
<div class="set-row-actions set-row-actions-wide">
|
|
1099
|
+
<select id="respawnPresetSelect" class="set-select" onchange="app.updatePresetDescription()">
|
|
1100
|
+
<option value="">-- Select preset --</option>
|
|
1101
|
+
<optgroup label="Built-in" id="builtinPresetsGroup">
|
|
1102
|
+
</optgroup>
|
|
1103
|
+
<optgroup label="Custom" id="customPresetsGroup">
|
|
1104
|
+
</optgroup>
|
|
1105
|
+
</select>
|
|
1106
|
+
<button type="button" class="btn-toolbar btn-sm" onclick="app.loadRespawnPreset()" title="Apply preset">Apply</button>
|
|
1107
|
+
<button type="button" class="btn-toolbar btn-sm" onclick="app.saveCurrentAsPreset()" title="Save current config as preset">Save As…</button>
|
|
1108
|
+
</div>
|
|
1109
|
+
<!-- Filled by updatePresetDescription() and CLEARED on every
|
|
1110
|
+
open, so it can never hold the row's own description. -->
|
|
1111
|
+
<span class="set-row-desc set-row-note" id="presetDescriptionHint"></span>
|
|
1112
|
+
</div>
|
|
1113
|
+
</div>
|
|
1114
|
+
</div>
|
|
1059
1115
|
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
<input type="checkbox" id="modalRespawnAutoAccept" checked onchange="app.autoSaveRespawnConfig()">
|
|
1071
|
-
<span>Auto-accept prompts</span>
|
|
1072
|
-
</label>
|
|
1073
|
-
</div>
|
|
1116
|
+
<div class="set-group">
|
|
1117
|
+
<div class="set-group-head"><h4>Cycle steps</h4></div>
|
|
1118
|
+
<div class="set-group-body">
|
|
1119
|
+
<div class="set-row set-row-block">
|
|
1120
|
+
<div class="set-row-text">
|
|
1121
|
+
<span class="set-row-label">1. Update prompt</span>
|
|
1122
|
+
<span class="set-row-desc">Sent as soon as the session goes idle.</span>
|
|
1123
|
+
</div>
|
|
1124
|
+
<textarea id="modalRespawnPrompt" class="set-textarea" rows="1" placeholder="Prompt to send when idle" onchange="app.autoSaveRespawnConfig()">update all the docs and CLAUDE.md</textarea>
|
|
1125
|
+
</div>
|
|
1074
1126
|
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1127
|
+
<!-- Real checkboxes, deliberately: these are numbered steps of
|
|
1128
|
+
one cycle, not a set of independent tags. -->
|
|
1129
|
+
<div class="set-row set-checks">
|
|
1130
|
+
<label class="set-check"><input type="checkbox" id="modalRespawnSendClear" checked onchange="app.autoSaveRespawnConfig()"><span>2. Send /clear</span></label>
|
|
1131
|
+
<label class="set-check"><input type="checkbox" id="modalRespawnSendInit" checked onchange="app.autoSaveRespawnConfig()"><span>3. Send /init</span></label>
|
|
1132
|
+
<label class="set-check" title="Presses Enter for plan approvals and default question options"><input type="checkbox" id="modalRespawnAutoAccept" checked onchange="app.autoSaveRespawnConfig()"><span>Auto-accept prompts</span></label>
|
|
1133
|
+
</div>
|
|
1080
1134
|
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
</div>
|
|
1091
|
-
</div><!-- End respawn-loop-box -->
|
|
1092
|
-
</div>
|
|
1093
|
-
</div><!-- End respawn-tab -->
|
|
1135
|
+
<div class="set-row set-row-block">
|
|
1136
|
+
<div class="set-row-text">
|
|
1137
|
+
<span class="set-row-label">4. Kickstart prompt</span>
|
|
1138
|
+
<span class="set-row-desc">Sent only when /init finishes but Claude stays idle. Optional.</span>
|
|
1139
|
+
</div>
|
|
1140
|
+
<textarea id="modalRespawnKickstart" class="set-textarea" rows="1" placeholder="Optional: prompt if /init doesn't trigger work" onchange="app.autoSaveRespawnConfig()"></textarea>
|
|
1141
|
+
</div>
|
|
1142
|
+
</div>
|
|
1143
|
+
</div>
|
|
1094
1144
|
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
<div
|
|
1101
|
-
<
|
|
1102
|
-
<
|
|
1145
|
+
</div><!-- End sessionRespawnSection -->
|
|
1146
|
+
</section>
|
|
1147
|
+
|
|
1148
|
+
<!-- ══ Context ══════════════════════════════════════════════════ -->
|
|
1149
|
+
<section class="set-section hidden" id="context-tab" data-label="Session">
|
|
1150
|
+
<div class="set-section-head">
|
|
1151
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><ellipse cx="12" cy="6" rx="8" ry="3"/><path d="M4 6v6c0 1.7 3.6 3 8 3s8-1.3 8-3V6"/><path d="M4 12v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"/></svg>
|
|
1152
|
+
<h2>Session</h2>
|
|
1103
1153
|
</div>
|
|
1104
|
-
<
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
<
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1154
|
+
<p class="set-section-blurb">What this tab is called, how its context window is kept from filling up, and what it watches.</p>
|
|
1155
|
+
|
|
1156
|
+
<div class="set-group">
|
|
1157
|
+
<div class="set-group-head"><h4>Identity</h4></div>
|
|
1158
|
+
<div class="set-group-body">
|
|
1159
|
+
<div class="set-row has-field">
|
|
1160
|
+
<div class="set-row-text">
|
|
1161
|
+
<span class="set-row-label">Session name</span>
|
|
1162
|
+
<span class="set-row-desc">Shown in the tab. Right-click a tab to rename it inline.</span>
|
|
1163
|
+
</div>
|
|
1164
|
+
<div class="set-row-actions">
|
|
1165
|
+
<span id="modalSessionPrefix" class="set-static" style="display: none; white-space: nowrap;"></span>
|
|
1166
|
+
<input type="text" id="modalSessionName" class="set-input" maxlength="128" placeholder="Auto (directory name)" onblur="app.saveSessionName()">
|
|
1167
|
+
</div>
|
|
1168
|
+
</div>
|
|
1169
|
+
<div class="set-row set-row-block">
|
|
1170
|
+
<div class="set-row-text">
|
|
1171
|
+
<span class="set-row-label">Session color</span>
|
|
1172
|
+
<span class="set-row-desc">Tints the tab so a session is findable at a glance.</span>
|
|
1173
|
+
</div>
|
|
1174
|
+
<div class="color-picker" id="sessionColorPicker">
|
|
1175
|
+
<button type="button" class="color-swatch" data-color="default" title="Default">
|
|
1176
|
+
<span class="swatch-inner" style="background: var(--bg-hover)"></span>
|
|
1177
|
+
</button>
|
|
1178
|
+
<button type="button" class="color-swatch" data-color="red" title="Red">
|
|
1179
|
+
<span class="swatch-inner" style="background: var(--session-red)"></span>
|
|
1180
|
+
</button>
|
|
1181
|
+
<button type="button" class="color-swatch" data-color="orange" title="Orange">
|
|
1182
|
+
<span class="swatch-inner" style="background: var(--session-orange)"></span>
|
|
1183
|
+
</button>
|
|
1184
|
+
<button type="button" class="color-swatch" data-color="yellow" title="Yellow">
|
|
1185
|
+
<span class="swatch-inner" style="background: var(--session-yellow)"></span>
|
|
1186
|
+
</button>
|
|
1187
|
+
<button type="button" class="color-swatch" data-color="green" title="Green">
|
|
1188
|
+
<span class="swatch-inner" style="background: var(--session-green)"></span>
|
|
1189
|
+
</button>
|
|
1190
|
+
<button type="button" class="color-swatch" data-color="blue" title="Blue">
|
|
1191
|
+
<span class="swatch-inner" style="background: var(--session-blue)"></span>
|
|
1192
|
+
</button>
|
|
1193
|
+
<button type="button" class="color-swatch" data-color="purple" title="Purple">
|
|
1194
|
+
<span class="swatch-inner" style="background: var(--session-purple)"></span>
|
|
1195
|
+
</button>
|
|
1196
|
+
<button type="button" class="color-swatch" data-color="pink" title="Pink">
|
|
1197
|
+
<span class="swatch-inner" style="background: var(--session-pink)"></span>
|
|
1198
|
+
</button>
|
|
1199
|
+
</div>
|
|
1147
1200
|
</div>
|
|
1148
1201
|
</div>
|
|
1149
|
-
<input type="text" id="modalAutoCompactPrompt" value="" placeholder="Focus prompt (optional)" onchange="app.autoSaveAutoCompact()">
|
|
1150
|
-
<span class="form-hint">Summarizes context while preserving key information</span>
|
|
1151
1202
|
</div>
|
|
1152
1203
|
|
|
1153
|
-
<div class="
|
|
1154
|
-
<div class="
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
<
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
<
|
|
1204
|
+
<div class="set-group">
|
|
1205
|
+
<div class="set-group-head"><h4>Context window</h4></div>
|
|
1206
|
+
<div class="set-group-body">
|
|
1207
|
+
<div class="set-row">
|
|
1208
|
+
<div class="set-row-text">
|
|
1209
|
+
<span class="set-row-label">Auto-compact</span>
|
|
1210
|
+
<span class="set-row-desc">Summarizes the context at the threshold while preserving key information.</span>
|
|
1211
|
+
</div>
|
|
1212
|
+
<div class="set-row-actions">
|
|
1213
|
+
<input type="number" id="modalAutoCompactThreshold" class="set-num set-num-wide" value="110000" min="10000" max="500000" step="10000" onchange="app.autoSaveAutoCompact()">
|
|
1214
|
+
<span class="set-unit">tokens</span>
|
|
1215
|
+
<label class="switch switch-sm"><input type="checkbox" id="modalAutoCompactEnabled" onchange="app.autoSaveAutoCompact()"><span class="slider"></span></label>
|
|
1216
|
+
</div>
|
|
1217
|
+
</div>
|
|
1218
|
+
<div class="set-row has-field">
|
|
1219
|
+
<div class="set-row-text">
|
|
1220
|
+
<span class="set-row-label">Compact focus prompt</span>
|
|
1221
|
+
<span class="set-row-desc">Optional: what the summary should hold on to.</span>
|
|
1222
|
+
</div>
|
|
1223
|
+
<input type="text" id="modalAutoCompactPrompt" class="set-input" value="" placeholder="Focus prompt (optional)" onchange="app.autoSaveAutoCompact()">
|
|
1224
|
+
</div>
|
|
1225
|
+
<div class="set-row">
|
|
1226
|
+
<div class="set-row-text">
|
|
1227
|
+
<span class="set-row-label">Auto-clear</span>
|
|
1228
|
+
<span class="set-row-desc">Full context reset at the threshold. Keep it higher than auto-compact.</span>
|
|
1229
|
+
</div>
|
|
1230
|
+
<div class="set-row-actions">
|
|
1231
|
+
<input type="number" id="modalAutoClearThreshold" class="set-num set-num-wide" value="140000" min="10000" max="500000" step="10000" onchange="app.autoSaveAutoClear()">
|
|
1232
|
+
<span class="set-unit">tokens</span>
|
|
1233
|
+
<label class="switch switch-sm"><input type="checkbox" id="modalAutoClearEnabled" onchange="app.autoSaveAutoClear()"><span class="slider"></span></label>
|
|
1234
|
+
</div>
|
|
1162
1235
|
</div>
|
|
1163
1236
|
</div>
|
|
1164
|
-
<span class="form-hint">Full context reset at threshold (use higher than compact)</span>
|
|
1165
1237
|
</div>
|
|
1166
|
-
</div>
|
|
1167
1238
|
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1239
|
+
<div class="set-group">
|
|
1240
|
+
<div class="set-group-head"><h4>Behavior</h4></div>
|
|
1241
|
+
<div class="set-group-body">
|
|
1242
|
+
<div class="set-row">
|
|
1243
|
+
<div class="set-row-text">
|
|
1244
|
+
<span class="set-row-label">Image watcher</span>
|
|
1245
|
+
<span class="set-row-desc">Pops up new images (screenshots, generated files) found in this session's directory.</span>
|
|
1246
|
+
</div>
|
|
1247
|
+
<label class="switch switch-sm"><input type="checkbox" id="modalImageWatcherEnabled" checked onchange="app.toggleSessionImageWatcher()"><span class="slider"></span></label>
|
|
1248
|
+
</div>
|
|
1249
|
+
<div class="set-row">
|
|
1250
|
+
<div class="set-row-text">
|
|
1251
|
+
<span class="set-row-label">Flicker filter</span>
|
|
1252
|
+
<span class="set-row-desc">Buffers output after screen clears to reduce Ink UI flickering. Adds ~50ms latency.</span>
|
|
1253
|
+
</div>
|
|
1254
|
+
<label class="switch switch-sm"><input type="checkbox" id="modalFlickerFilterEnabled" onchange="app.toggleFlickerFilter()"><span class="slider"></span></label>
|
|
1255
|
+
</div>
|
|
1256
|
+
</div>
|
|
1257
|
+
</div>
|
|
1258
|
+
</section>
|
|
1188
1259
|
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
</label>
|
|
1197
|
-
<span class="form-hint">Auto-detects loops and todos in Claude output</span>
|
|
1198
|
-
</div>
|
|
1260
|
+
<!-- ══ Ralph / Todo ═════════════════════════════════════════════ -->
|
|
1261
|
+
<section class="set-section hidden" id="ralph-tab" data-label="Ralph / Todo">
|
|
1262
|
+
<div class="set-section-head">
|
|
1263
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6h11"/><path d="M9 12h11"/><path d="M9 18h11"/><polyline points="3 6 4 7 6 5"/><polyline points="3 12 4 13 6 11"/><polyline points="3 18 4 19 6 17"/></svg>
|
|
1264
|
+
<h2>Ralph / Todo</h2>
|
|
1265
|
+
</div>
|
|
1266
|
+
<p class="set-section-blurb">Loop and todo tracking read out of this session's output.</p>
|
|
1199
1267
|
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
</div>
|
|
1218
|
-
<div class="form-col">
|
|
1219
|
-
<label>Todo Expiration</label>
|
|
1220
|
-
<div class="input-suffix input-suffix-sm">
|
|
1221
|
-
<input type="number" id="modalRalphTodoExpiration" value="60" min="1" max="1440">
|
|
1222
|
-
<span>min</span>
|
|
1268
|
+
<div class="set-group">
|
|
1269
|
+
<div class="set-group-head"><h4>Tracker</h4></div>
|
|
1270
|
+
<div class="set-group-body">
|
|
1271
|
+
<div class="set-row">
|
|
1272
|
+
<div class="set-row-text">
|
|
1273
|
+
<span class="set-row-label">Enable tracker</span>
|
|
1274
|
+
<span class="set-row-desc">Auto-detects loops and todos in Claude's output.</span>
|
|
1275
|
+
</div>
|
|
1276
|
+
<label class="switch switch-sm"><input type="checkbox" id="modalRalphEnabled"><span class="slider"></span></label>
|
|
1277
|
+
</div>
|
|
1278
|
+
<div class="set-row has-field">
|
|
1279
|
+
<div class="set-row-text">
|
|
1280
|
+
<span class="set-row-label">Completion phrase</span>
|
|
1281
|
+
<span class="set-row-desc">What Claude prints when the loop is done, without <promise> tags.</span>
|
|
1282
|
+
</div>
|
|
1283
|
+
<input type="text" id="modalRalphPhrase" class="set-input" placeholder="e.g. COMPLETE, DONE, FINISHED">
|
|
1284
|
+
</div>
|
|
1223
1285
|
</div>
|
|
1224
1286
|
</div>
|
|
1225
|
-
</div>
|
|
1226
1287
|
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1288
|
+
<div class="set-group">
|
|
1289
|
+
<div class="set-group-head"><h4>Limits</h4></div>
|
|
1290
|
+
<div class="set-group-body">
|
|
1291
|
+
<div class="set-row">
|
|
1292
|
+
<div class="set-row-text">
|
|
1293
|
+
<span class="set-row-label">Max iterations</span>
|
|
1294
|
+
<span class="set-row-desc">0 = unlimited.</span>
|
|
1295
|
+
</div>
|
|
1296
|
+
<input type="number" id="modalRalphMaxIterations" class="set-num" value="0" min="0" max="1000">
|
|
1297
|
+
</div>
|
|
1298
|
+
<div class="set-row">
|
|
1299
|
+
<div class="set-row-text">
|
|
1300
|
+
<span class="set-row-label">Max todos</span>
|
|
1301
|
+
<span class="set-row-desc">Per session; the oldest are evicted first.</span>
|
|
1302
|
+
</div>
|
|
1303
|
+
<input type="number" id="modalRalphMaxTodos" class="set-num" value="50" min="1" max="500">
|
|
1304
|
+
</div>
|
|
1305
|
+
<div class="set-row">
|
|
1306
|
+
<div class="set-row-text">
|
|
1307
|
+
<span class="set-row-label">Todo expiration</span>
|
|
1308
|
+
<span class="set-row-desc">How long an untouched todo survives.</span>
|
|
1309
|
+
</div>
|
|
1310
|
+
<div class="set-row-actions">
|
|
1311
|
+
<input type="number" id="modalRalphTodoExpiration" class="set-num" value="60" min="1" max="1440">
|
|
1312
|
+
<span class="set-unit">min</span>
|
|
1313
|
+
</div>
|
|
1314
|
+
</div>
|
|
1315
|
+
<div class="set-row">
|
|
1316
|
+
<div class="set-row-text">
|
|
1317
|
+
<span class="set-row-label">Apply</span>
|
|
1318
|
+
<span class="set-row-desc">Ralph settings are the one group here that does not save on change.</span>
|
|
1319
|
+
</div>
|
|
1320
|
+
<button class="btn-toolbar btn-primary btn-sm" onclick="app.saveRalphConfig()">Save Ralph config</button>
|
|
1321
|
+
</div>
|
|
1322
|
+
</div>
|
|
1323
|
+
</div>
|
|
1324
|
+
</section>
|
|
1242
1325
|
|
|
1243
|
-
<!--
|
|
1244
|
-
<
|
|
1245
|
-
<
|
|
1246
|
-
|
|
1326
|
+
<!-- ══ Summary ══════════════════════════════════════════════════ -->
|
|
1327
|
+
<section class="set-section hidden" id="summary-tab" data-label="Summary">
|
|
1328
|
+
<div class="set-section-head">
|
|
1329
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 3v18h18"/><polyline points="7 14 11 10 14 13 20 7"/></svg>
|
|
1330
|
+
<h2>Summary</h2>
|
|
1331
|
+
</div>
|
|
1332
|
+
<p class="set-section-blurb">What this session has done: respawns, errors, idle stretches.</p>
|
|
1247
1333
|
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1334
|
+
<div class="set-group">
|
|
1335
|
+
<div class="set-group-head"><h4>Timeline</h4><span class="set-scope" id="runSummarySessionInfo"></span></div>
|
|
1336
|
+
<div class="set-group-body">
|
|
1337
|
+
<div class="run-summary-filters">
|
|
1338
|
+
<button class="filter-btn active" data-filter="all" onclick="app.filterRunSummary('all')">All</button>
|
|
1339
|
+
<button class="filter-btn" data-filter="errors" onclick="app.filterRunSummary('errors')">Errors</button>
|
|
1340
|
+
<button class="filter-btn" data-filter="warnings" onclick="app.filterRunSummary('warnings')">Warnings</button>
|
|
1341
|
+
<button class="filter-btn" data-filter="respawn" onclick="app.filterRunSummary('respawn')">Respawn</button>
|
|
1342
|
+
<button class="filter-btn" data-filter="idle" onclick="app.filterRunSummary('idle')">Idle/Working</button>
|
|
1343
|
+
</div>
|
|
1344
|
+
<div class="run-summary-timeline" id="runSummaryTimeline">
|
|
1345
|
+
<p class="empty-message">Select a session to view summary</p>
|
|
1346
|
+
</div>
|
|
1347
|
+
<div class="run-summary-footer">
|
|
1348
|
+
<label class="auto-refresh-label">
|
|
1349
|
+
<input type="checkbox" id="runSummaryAutoRefresh" onchange="app.toggleRunSummaryAutoRefresh()">
|
|
1350
|
+
Auto-refresh
|
|
1351
|
+
</label>
|
|
1352
|
+
<div class="run-summary-actions">
|
|
1353
|
+
<button class="btn-toolbar btn-sm" onclick="app.refreshRunSummary()" title="Refresh summary">↻ Refresh</button>
|
|
1354
|
+
<button class="btn-toolbar btn-sm" onclick="app.exportRunSummary('json')" title="Export as JSON">Export JSON</button>
|
|
1355
|
+
<button class="btn-toolbar btn-sm" onclick="app.exportRunSummary('md')" title="Export as Markdown">Export MD</button>
|
|
1356
|
+
</div>
|
|
1357
|
+
</div>
|
|
1358
|
+
</div>
|
|
1259
1359
|
</div>
|
|
1260
|
-
</
|
|
1261
|
-
</div
|
|
1360
|
+
</section>
|
|
1361
|
+
</div>
|
|
1262
1362
|
</div>
|
|
1263
1363
|
</div>
|
|
1264
1364
|
</div>
|
|
@@ -1312,18 +1412,22 @@
|
|
|
1312
1412
|
<input type="search" id="appSettingsSearch" placeholder="Search settings" autocomplete="off" aria-label="Search settings">
|
|
1313
1413
|
</div>
|
|
1314
1414
|
<div class="set-rail-items" id="appSettingsRailItems">
|
|
1315
|
-
<button type="button" class="set-rail-item active" data-section="settings-
|
|
1415
|
+
<button type="button" class="set-rail-item active" data-section="settings-updates">
|
|
1416
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><polyline points="7 10 12 15 17 10"/><path d="M4 20h16"/></svg>
|
|
1417
|
+
<span>Updates</span>
|
|
1418
|
+
</button>
|
|
1419
|
+
<button type="button" class="set-rail-item" data-section="settings-terminal">
|
|
1316
1420
|
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
|
|
1317
1421
|
<span>Terminal & Input</span>
|
|
1318
1422
|
</button>
|
|
1319
|
-
<button type="button" class="set-rail-item" data-section="settings-appearance">
|
|
1320
|
-
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 3a9 9 0 0 0 0 18 4.5 4.5 0 0 0 0-9 4.5 4.5 0 0 1 0-9z"/></svg>
|
|
1321
|
-
<span>Appearance</span>
|
|
1322
|
-
</button>
|
|
1323
1423
|
<button type="button" class="set-rail-item" data-section="settings-layout">
|
|
1324
1424
|
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
|
|
1325
1425
|
<span>Header & Panels</span>
|
|
1326
1426
|
</button>
|
|
1427
|
+
<button type="button" class="set-rail-item" data-section="settings-appearance">
|
|
1428
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 3a9 9 0 0 0 0 18 4.5 4.5 0 0 0 0-9 4.5 4.5 0 0 1 0-9z"/></svg>
|
|
1429
|
+
<span>Appearance</span>
|
|
1430
|
+
</button>
|
|
1327
1431
|
<button type="button" class="set-rail-item" data-section="settings-models">
|
|
1328
1432
|
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z"/><path d="M12 12l8-4.5M12 12v9M12 12L4 7.5"/></svg>
|
|
1329
1433
|
<span>Models</span>
|
|
@@ -1364,6 +1468,40 @@
|
|
|
1364
1468
|
|
|
1365
1469
|
<p class="set-empty" id="appSettingsSearchEmpty" hidden>No settings match that search.</p>
|
|
1366
1470
|
|
|
1471
|
+
<!-- ══ Updates ══════════════════════════════════════════════════
|
|
1472
|
+
First in the document on purpose: what this install is running,
|
|
1473
|
+
and whether a newer release is waiting, before any preference. -->
|
|
1474
|
+
<section class="set-section" id="settings-updates" data-label="Updates">
|
|
1475
|
+
<div class="set-section-head">
|
|
1476
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3v12"/><polyline points="7 10 12 15 17 10"/><path d="M4 20h16"/></svg>
|
|
1477
|
+
<h2>Updates</h2>
|
|
1478
|
+
</div>
|
|
1479
|
+
<p class="set-section-blurb">The version this install is running, and the one-click update.</p>
|
|
1480
|
+
|
|
1481
|
+
<div class="set-group">
|
|
1482
|
+
<div class="set-group-body">
|
|
1483
|
+
<div class="set-row" data-search="version current release">
|
|
1484
|
+
<div class="set-row-text"><span class="set-row-label">Current version</span></div>
|
|
1485
|
+
<span class="set-static set-static-strong mono" id="updateCurrentVersion">—</span>
|
|
1486
|
+
</div>
|
|
1487
|
+
<div class="set-row" id="updateCheckRow" data-search="check for updates github release">
|
|
1488
|
+
<div class="set-row-text">
|
|
1489
|
+
<span class="set-row-label">Check for updates</span>
|
|
1490
|
+
<span class="set-row-desc">Looks at GitHub for a newer Codeman release.</span>
|
|
1491
|
+
</div>
|
|
1492
|
+
<button class="btn-toolbar btn-sm" id="updateCheckBtn" onclick="app.checkForUpdate()">Check now</button>
|
|
1493
|
+
</div>
|
|
1494
|
+
<div id="updateResult" class="set-note" style="display:none"></div>
|
|
1495
|
+
<div class="set-row" id="updateActionRow" style="display:none">
|
|
1496
|
+
<div class="set-row-text"><span class="set-row-label" id="updateActionLabel">Update available</span></div>
|
|
1497
|
+
<button class="btn-toolbar btn-sm btn-primary" id="updateNowBtn" onclick="app.startSelfUpdate()">Update now</button>
|
|
1498
|
+
</div>
|
|
1499
|
+
<div id="updateNotes" class="set-notes" style="display:none"></div>
|
|
1500
|
+
<div id="updateProgress" class="set-progress" style="display:none"></div>
|
|
1501
|
+
</div>
|
|
1502
|
+
</div>
|
|
1503
|
+
</section>
|
|
1504
|
+
|
|
1367
1505
|
<!-- ══ Terminal & Input ══════════════════════════════════════ -->
|
|
1368
1506
|
<section class="set-section" id="settings-terminal" data-label="Terminal & Input">
|
|
1369
1507
|
<div class="set-section-head">
|
|
@@ -1427,6 +1565,121 @@
|
|
|
1427
1565
|
</div>
|
|
1428
1566
|
</section>
|
|
1429
1567
|
|
|
1568
|
+
<!-- ══ Header & Panels ═══════════════════════════════════════ -->
|
|
1569
|
+
<section class="set-section" id="settings-layout" data-label="Header & Panels">
|
|
1570
|
+
<div class="set-section-head">
|
|
1571
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
|
|
1572
|
+
<h2>Header & Panels</h2>
|
|
1573
|
+
</div>
|
|
1574
|
+
<p class="set-section-blurb">Pick the buttons and panels you actually use. Everything else stays out of the way.</p>
|
|
1575
|
+
|
|
1576
|
+
<!-- Live preview: a scale model of the app that redraws from the
|
|
1577
|
+
chips below on every change, so "what does this add" is answered
|
|
1578
|
+
in place instead of after a save. Icons are CLONED from the
|
|
1579
|
+
chips (settings-ui.js: _syncLayoutPreview), so each icon has
|
|
1580
|
+
exactly one copy in this file and the two can never drift. -->
|
|
1581
|
+
<div class="set-preview" id="appSettingsLayoutPreview">
|
|
1582
|
+
<div class="set-preview-head">
|
|
1583
|
+
<span class="set-preview-title">Live preview</span>
|
|
1584
|
+
<span class="set-preview-hint">Updates as you pick, before you save.</span>
|
|
1585
|
+
</div>
|
|
1586
|
+
<div class="set-preview-frame" data-i18n-skip>
|
|
1587
|
+
<div class="set-preview-bar">
|
|
1588
|
+
<span class="set-preview-logo">C</span>
|
|
1589
|
+
<span class="set-preview-tab">w1-codeman</span>
|
|
1590
|
+
<span class="set-preview-tab set-preview-tab-dim">w2-docs</span>
|
|
1591
|
+
<span class="set-preview-gap"></span>
|
|
1592
|
+
<span class="set-preview-btns" id="appSettingsPreviewHeader"></span>
|
|
1593
|
+
<span class="set-preview-btn set-preview-btn-fixed" title="App Settings"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg></span>
|
|
1594
|
+
</div>
|
|
1595
|
+
<div class="set-preview-stage">
|
|
1596
|
+
<div class="set-preview-term"><span class="set-preview-caret">❯</span> npm run dev</div>
|
|
1597
|
+
<div class="set-preview-panels" id="appSettingsPreviewPanels"></div>
|
|
1598
|
+
<div class="set-preview-floats" id="appSettingsPreviewFloats"></div>
|
|
1599
|
+
</div>
|
|
1600
|
+
<div class="set-preview-tray">
|
|
1601
|
+
<span class="set-preview-run">Run</span>
|
|
1602
|
+
<span class="set-preview-tools" id="appSettingsPreviewToolbar"></span>
|
|
1603
|
+
</div>
|
|
1604
|
+
</div>
|
|
1605
|
+
<p class="set-preview-empty" id="appSettingsPreviewEmpty" hidden>Nothing extra switched on: header keeps the gear only.</p>
|
|
1606
|
+
</div>
|
|
1607
|
+
|
|
1608
|
+
<div class="set-group">
|
|
1609
|
+
<div class="set-group-head"><h4>Header buttons</h4><span class="set-scope">device</span></div>
|
|
1610
|
+
<p class="set-group-hint">Tap to show a control in the header. Multi-monitor is the one entry here that syncs across devices.</p>
|
|
1611
|
+
<div class="set-group-body">
|
|
1612
|
+
<div class="set-chips" data-search="header buttons plan usage font stats lifecycle response file viewer attachments monitor session away cron redraw">
|
|
1613
|
+
<label class="set-chip" data-preview="header" data-preview-order="1" data-preview-text="A+"><input type="checkbox" id="appSettingsShowFontControls"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20 10 5l6 15"/><path d="M6.5 15h7"/><path d="M18 12h4M20 10v4"/></svg><span>Font Size</span></label>
|
|
1614
|
+
<label class="set-chip" data-preview="header" data-preview-order="2" data-preview-text="CPU 12%"><input type="checkbox" id="appSettingsShowSystemStats" checked><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12h4l2.5-7 4 14L16 12h5"/></svg><span>System Stats</span></label>
|
|
1615
|
+
<label class="set-chip" data-preview="header" data-preview-order="3"><input type="checkbox" id="appSettingsShowRedrawButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="1 4 1 10 7 10"/><polyline points="23 20 23 14 17 14"/><path d="M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15"/></svg><span>Redraw Terminal</span></label>
|
|
1616
|
+
<label class="set-chip" data-preview="header" data-preview-order="4"><input type="checkbox" id="appSettingsShowResponseViewer"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg><span>Response Viewer</span></label>
|
|
1617
|
+
<label class="set-chip" data-preview="header" data-preview-order="5"><input type="checkbox" id="appSettingsShowAwayDigestButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 6h13"/><path d="M8 12h13"/><path d="M8 18h13"/><path d="M3 6h.01"/><path d="M3 12h.01"/><path d="M3 18h.01"/></svg><span>Away Digest</span></label>
|
|
1618
|
+
<label class="set-chip" data-preview="header" data-preview-order="6"><input type="checkbox" id="appSettingsShowSessionButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="12 2 2 7 12 12 22 7 12 2"/><polyline points="2 17 12 22 22 17"/><polyline points="2 12 12 17 22 12"/></svg><span>Session Manager</span></label>
|
|
1619
|
+
<label class="set-chip" data-preview="header" data-preview-order="9"><input type="checkbox" id="appSettingsShowAttachmentsButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg><span>Attachments</span></label>
|
|
1620
|
+
<label class="set-chip" data-preview="header" data-preview-order="10"><input type="checkbox" id="appSettingsShowFileViewerButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg><span>File Viewer</span></label>
|
|
1621
|
+
<label class="set-chip" data-preview="header" data-preview-order="11"><input type="checkbox" id="appSettingsShowMultiMonitorButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="4" width="13" height="9" rx="1.5"/><rect x="11" y="9" width="11" height="8" rx="1.5"/></svg><span>Multi-monitor</span></label>
|
|
1622
|
+
<label class="set-chip" data-preview="header" data-preview-order="13" data-preview-text="42%"><input type="checkbox" id="appSettingsShowPlanUsageLimits"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 18a8 8 0 1 1 16 0"/><path d="M12 18l4.5-5"/></svg><span>Plan Usage</span></label>
|
|
1623
|
+
<label class="set-chip" data-preview="header" data-preview-order="14"><input type="checkbox" id="appSettingsShowLifecycleLog"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg><span>Lifecycle Log</span></label>
|
|
1624
|
+
</div>
|
|
1625
|
+
</div>
|
|
1626
|
+
</div>
|
|
1627
|
+
|
|
1628
|
+
<div class="set-group">
|
|
1629
|
+
<div class="set-group-head"><h4>Panels</h4><span class="set-scope">device</span></div>
|
|
1630
|
+
<div class="set-group-body">
|
|
1631
|
+
<div class="set-chips" data-search="panels monitor project insights file browser subagents">
|
|
1632
|
+
<label class="set-chip" data-preview="panel" data-preview-order="1"><input type="checkbox" id="appSettingsShowMonitor" checked><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12h4l2.5-7 4 14L16 12h5"/></svg><span>Monitor</span></label>
|
|
1633
|
+
<label class="set-chip" data-preview="panel" data-preview-order="2"><input type="checkbox" id="appSettingsShowProjectInsights"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 19V9"/><path d="M10 19V5"/><path d="M16 19v-7"/><path d="M22 19H2"/></svg><span>Project Insights</span></label>
|
|
1634
|
+
<label class="set-chip" data-preview="panel" data-preview-order="3"><input type="checkbox" id="appSettingsShowFileBrowser"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg><span>File Browser</span></label>
|
|
1635
|
+
<label class="set-chip" data-preview="panel" data-preview-order="4"><input type="checkbox" id="appSettingsShowSubagents"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="6" cy="6" r="2.5"/><circle cx="6" cy="18" r="2.5"/><circle cx="18" cy="12" r="2.5"/><path d="M8.2 7.2 15.6 11M8.2 16.8 15.6 13"/></svg><span>Subagents</span></label>
|
|
1636
|
+
</div>
|
|
1637
|
+
</div>
|
|
1638
|
+
</div>
|
|
1639
|
+
|
|
1640
|
+
<div class="set-group">
|
|
1641
|
+
<div class="set-group-head"><h4>Cross-session features</h4><span class="set-scope">synced</span></div>
|
|
1642
|
+
<p class="set-group-hint">Approvals answers prompts from any session in one place. Read My Mind captures your prompts and predicts the next one on demand; both cost tokens and never auto-send.</p>
|
|
1643
|
+
<div class="set-group-body">
|
|
1644
|
+
<div class="set-chips" data-search="approvals inbox read my mind ultracode agents floating windows workflow">
|
|
1645
|
+
<label class="set-chip" data-preview="header" data-preview-order="7"><input type="checkbox" id="appSettingsApprovalsInbox"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg><span>Approvals Inbox</span></label>
|
|
1646
|
+
<label class="set-chip" data-preview="header" data-preview-order="8"><input type="checkbox" id="appSettingsReadMyMind"><span class="set-chip-ico set-chip-emoji" aria-hidden="true">🧠</span><span>Read My Mind</span></label>
|
|
1647
|
+
<label class="set-chip" data-preview="header" data-preview-order="12"><input type="checkbox" id="appSettingsShowUltracodeAgents"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="6" cy="6" r="2.5"/><circle cx="6" cy="18" r="2.5"/><circle cx="18" cy="12" r="2.5"/><path d="M8.2 7.2 15.6 11M8.2 16.8 15.6 13"/></svg><span>Ultracode Agents</span></label>
|
|
1648
|
+
<label class="set-chip" data-preview="float" data-preview-order="1"><input type="checkbox" id="appSettingsUltracodeFloatingWindows"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9h18"/><circle cx="6" cy="6.5" r="0.6"/></svg><span>Ultracode Windows</span></label>
|
|
1649
|
+
</div>
|
|
1650
|
+
</div>
|
|
1651
|
+
</div>
|
|
1652
|
+
|
|
1653
|
+
<div class="set-group">
|
|
1654
|
+
<div class="set-group-head"><h4>Scheduling</h4><span class="set-scope">device</span></div>
|
|
1655
|
+
<div class="set-group-body">
|
|
1656
|
+
<div class="set-chips" data-search="cron scheduled jobs toolbar">
|
|
1657
|
+
<label class="set-chip" data-preview="toolbar" data-preview-order="1"><input type="checkbox" id="appSettingsShowCronButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><polyline points="12 7 12 12 15 14"/></svg><span>Cron</span></label>
|
|
1658
|
+
</div>
|
|
1659
|
+
</div>
|
|
1660
|
+
</div>
|
|
1661
|
+
|
|
1662
|
+
<div class="set-group">
|
|
1663
|
+
<div class="set-group-head"><h4>Subagent windows</h4></div>
|
|
1664
|
+
<div class="set-group-body">
|
|
1665
|
+
<div class="set-row" data-search="subagent tracking background agents">
|
|
1666
|
+
<div class="set-row-text">
|
|
1667
|
+
<span class="set-row-label">Track background agents <span class="set-scope">synced</span></span>
|
|
1668
|
+
<span class="set-row-desc">Follow Claude Code subagents in real time.</span>
|
|
1669
|
+
</div>
|
|
1670
|
+
<label class="switch switch-sm"><input type="checkbox" id="appSettingsSubagentTracking" checked><span class="slider"></span></label>
|
|
1671
|
+
</div>
|
|
1672
|
+
<div class="set-row" data-search="subagent active tab only windows">
|
|
1673
|
+
<div class="set-row-text">
|
|
1674
|
+
<span class="set-row-label">Active tab only <span class="set-scope">device</span></span>
|
|
1675
|
+
<span class="set-row-desc">Only show agent windows for the selected session.</span>
|
|
1676
|
+
</div>
|
|
1677
|
+
<label class="switch switch-sm"><input type="checkbox" id="appSettingsSubagentActiveTabOnly" checked><span class="slider"></span></label>
|
|
1678
|
+
</div>
|
|
1679
|
+
</div>
|
|
1680
|
+
</div>
|
|
1681
|
+
</section>
|
|
1682
|
+
|
|
1430
1683
|
<!-- ══ Appearance ═══════════════════════════════════════════════ -->
|
|
1431
1684
|
<section class="set-section" id="settings-appearance" data-label="Appearance">
|
|
1432
1685
|
<div class="set-section-head">
|
|
@@ -1525,81 +1778,6 @@
|
|
|
1525
1778
|
</div>
|
|
1526
1779
|
</section>
|
|
1527
1780
|
|
|
1528
|
-
<!-- ══ Header & Panels ═══════════════════════════════════════ -->
|
|
1529
|
-
<section class="set-section" id="settings-layout" data-label="Header & Panels">
|
|
1530
|
-
<div class="set-section-head">
|
|
1531
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
|
|
1532
|
-
<h2>Header & Panels</h2>
|
|
1533
|
-
</div>
|
|
1534
|
-
<p class="set-section-blurb">Pick the buttons and panels you actually use. Everything else stays out of the way.</p>
|
|
1535
|
-
|
|
1536
|
-
<div class="set-group">
|
|
1537
|
-
<div class="set-group-head"><h4>Header buttons</h4><span class="set-scope">device</span></div>
|
|
1538
|
-
<p class="set-group-hint">Tap to show a control in the header. Multi-monitor is the one entry here that syncs across devices.</p>
|
|
1539
|
-
<div class="set-group-body">
|
|
1540
|
-
<div class="set-chips" data-search="header buttons plan usage font stats lifecycle response file viewer attachments monitor session away cron redraw">
|
|
1541
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowPlanUsageLimits"><span>Plan Usage</span></label>
|
|
1542
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowFontControls"><span>Font Size</span></label>
|
|
1543
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowSystemStats" checked><span>System Stats</span></label>
|
|
1544
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowLifecycleLog"><span>Lifecycle Log</span></label>
|
|
1545
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowResponseViewer"><span>Response Viewer</span></label>
|
|
1546
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowFileViewerButton"><span>File Viewer</span></label>
|
|
1547
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowAttachmentsButton"><span>Attachments</span></label>
|
|
1548
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowMultiMonitorButton"><span>Multi-monitor</span></label>
|
|
1549
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowSessionButton"><span>Session Manager</span></label>
|
|
1550
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowAwayDigestButton"><span>Away Digest</span></label>
|
|
1551
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowCronButton"><span>Cron</span></label>
|
|
1552
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowRedrawButton"><span>Redraw Terminal</span></label>
|
|
1553
|
-
</div>
|
|
1554
|
-
</div>
|
|
1555
|
-
</div>
|
|
1556
|
-
|
|
1557
|
-
<div class="set-group">
|
|
1558
|
-
<div class="set-group-head"><h4>Panels</h4><span class="set-scope">device</span></div>
|
|
1559
|
-
<div class="set-group-body">
|
|
1560
|
-
<div class="set-chips" data-search="panels monitor project insights file browser subagents">
|
|
1561
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowMonitor" checked><span>Monitor</span></label>
|
|
1562
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowProjectInsights"><span>Project Insights</span></label>
|
|
1563
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowFileBrowser"><span>File Browser</span></label>
|
|
1564
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowSubagents"><span>Subagents</span></label>
|
|
1565
|
-
</div>
|
|
1566
|
-
</div>
|
|
1567
|
-
</div>
|
|
1568
|
-
|
|
1569
|
-
<div class="set-group">
|
|
1570
|
-
<div class="set-group-head"><h4>Cross-session features</h4><span class="set-scope">synced</span></div>
|
|
1571
|
-
<p class="set-group-hint">Approvals answers prompts from any session in one place. Read My Mind captures your prompts and predicts the next one on demand; both cost tokens and never auto-send.</p>
|
|
1572
|
-
<div class="set-group-body">
|
|
1573
|
-
<div class="set-chips" data-search="approvals inbox read my mind ultracode agents floating windows workflow">
|
|
1574
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsApprovalsInbox"><span>Approvals Inbox</span></label>
|
|
1575
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsReadMyMind"><span>Read My Mind</span></label>
|
|
1576
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsShowUltracodeAgents"><span>Ultracode Agents</span></label>
|
|
1577
|
-
<label class="set-chip"><input type="checkbox" id="appSettingsUltracodeFloatingWindows"><span>Ultracode Windows</span></label>
|
|
1578
|
-
</div>
|
|
1579
|
-
</div>
|
|
1580
|
-
</div>
|
|
1581
|
-
|
|
1582
|
-
<div class="set-group">
|
|
1583
|
-
<div class="set-group-head"><h4>Subagent windows</h4></div>
|
|
1584
|
-
<div class="set-group-body">
|
|
1585
|
-
<div class="set-row" data-search="subagent tracking background agents">
|
|
1586
|
-
<div class="set-row-text">
|
|
1587
|
-
<span class="set-row-label">Track background agents <span class="set-scope">synced</span></span>
|
|
1588
|
-
<span class="set-row-desc">Follow Claude Code subagents in real time.</span>
|
|
1589
|
-
</div>
|
|
1590
|
-
<label class="switch switch-sm"><input type="checkbox" id="appSettingsSubagentTracking" checked><span class="slider"></span></label>
|
|
1591
|
-
</div>
|
|
1592
|
-
<div class="set-row" data-search="subagent active tab only windows">
|
|
1593
|
-
<div class="set-row-text">
|
|
1594
|
-
<span class="set-row-label">Active tab only <span class="set-scope">device</span></span>
|
|
1595
|
-
<span class="set-row-desc">Only show agent windows for the selected session.</span>
|
|
1596
|
-
</div>
|
|
1597
|
-
<label class="switch switch-sm"><input type="checkbox" id="appSettingsSubagentActiveTabOnly" checked><span class="slider"></span></label>
|
|
1598
|
-
</div>
|
|
1599
|
-
</div>
|
|
1600
|
-
</div>
|
|
1601
|
-
</section>
|
|
1602
|
-
|
|
1603
1781
|
<!-- ══ Models ═══════════════════════════════════════════════════ -->
|
|
1604
1782
|
<section class="set-section" id="settings-models" data-label="Models">
|
|
1605
1783
|
<div class="set-section-head">
|
|
@@ -1966,6 +2144,18 @@
|
|
|
1966
2144
|
<div class="set-row-text"><span class="set-row-label">Active provider</span></div>
|
|
1967
2145
|
<span class="voice-provider-status" id="voiceProviderStatus">—</span>
|
|
1968
2146
|
</div>
|
|
2147
|
+
<div class="set-row has-field" data-search="voice provider claude deepgram web speech engine">
|
|
2148
|
+
<div class="set-row-text">
|
|
2149
|
+
<span class="set-row-label">Speech engine</span>
|
|
2150
|
+
<span class="set-row-desc">Auto prefers Claude when this server can transcribe, then Deepgram, then the browser.</span>
|
|
2151
|
+
</div>
|
|
2152
|
+
<select id="voiceProvider" class="set-select">
|
|
2153
|
+
<option value="auto">Auto</option>
|
|
2154
|
+
<option value="claude">Claude</option>
|
|
2155
|
+
<option value="deepgram">Deepgram</option>
|
|
2156
|
+
<option value="webspeech">Browser (Web Speech)</option>
|
|
2157
|
+
</select>
|
|
2158
|
+
</div>
|
|
1969
2159
|
<div class="set-row has-field" data-search="voice insert mode compose">
|
|
1970
2160
|
<div class="set-row-text">
|
|
1971
2161
|
<span class="set-row-label">Insert mode</span>
|
|
@@ -1976,24 +2166,11 @@
|
|
|
1976
2166
|
<option value="compose">Compose dialog</option>
|
|
1977
2167
|
</select>
|
|
1978
2168
|
</div>
|
|
1979
|
-
|
|
1980
|
-
</div>
|
|
1981
|
-
|
|
1982
|
-
<div class="set-group">
|
|
1983
|
-
<div class="set-group-head"><h4>Deepgram Nova-3</h4><span class="set-scope">device</span></div>
|
|
1984
|
-
<div class="set-group-body">
|
|
1985
|
-
<div class="set-row has-field" data-search="deepgram api key">
|
|
2169
|
+
<div class="set-row has-field" data-search="voice language">
|
|
1986
2170
|
<div class="set-row-text">
|
|
1987
|
-
<span class="set-row-label">
|
|
1988
|
-
<span class="set-row-desc">
|
|
2171
|
+
<span class="set-row-label">Language</span>
|
|
2172
|
+
<span class="set-row-desc">Applies to whichever engine is active.</span>
|
|
1989
2173
|
</div>
|
|
1990
|
-
<div class="set-row-actions set-row-actions-wide">
|
|
1991
|
-
<input type="password" id="voiceDeepgramKey" class="set-input" placeholder="Enter Deepgram API key" autocomplete="off">
|
|
1992
|
-
<button class="btn-toolbar btn-sm" onclick="app.toggleDeepgramKeyVisibility()" id="voiceKeyToggleBtn" type="button">Show</button>
|
|
1993
|
-
</div>
|
|
1994
|
-
</div>
|
|
1995
|
-
<div class="set-row has-field" data-search="voice language">
|
|
1996
|
-
<div class="set-row-text"><span class="set-row-label">Language</span></div>
|
|
1997
2174
|
<select id="voiceLanguage" class="set-select">
|
|
1998
2175
|
<option value="en-US">English (US)</option>
|
|
1999
2176
|
<option value="en-GB">English (UK)</option>
|
|
@@ -2007,12 +2184,45 @@
|
|
|
2007
2184
|
<div class="set-row has-field" data-search="voice keyterms domain keywords">
|
|
2008
2185
|
<div class="set-row-text">
|
|
2009
2186
|
<span class="set-row-label">Domain keywords</span>
|
|
2010
|
-
<span class="set-row-desc">Comma-separated terms to boost recognition accuracy.</span>
|
|
2187
|
+
<span class="set-row-desc">Comma-separated terms to boost recognition accuracy. Sent to Claude and Deepgram alike.</span>
|
|
2011
2188
|
</div>
|
|
2012
2189
|
<input type="text" id="voiceKeyterms" class="set-input" placeholder="codeman, tmux, respawn, subagent">
|
|
2013
2190
|
</div>
|
|
2014
2191
|
</div>
|
|
2015
2192
|
</div>
|
|
2193
|
+
|
|
2194
|
+
<div class="set-group">
|
|
2195
|
+
<div class="set-group-head"><h4>Claude</h4><span class="set-scope">synced</span></div>
|
|
2196
|
+
<div class="set-group-body">
|
|
2197
|
+
<div class="set-row" data-search="claude voice dictation subscription no api key">
|
|
2198
|
+
<div class="set-row-text">
|
|
2199
|
+
<span class="set-row-label">Transcribe with this server's Claude login</span>
|
|
2200
|
+
<span class="set-row-desc">Dictation with no API key, through the same service Claude Code's own /voice mode uses. Microphone audio goes to Anthropic and is billed to this machine's Claude subscription, for everyone who can reach this UI.</span>
|
|
2201
|
+
</div>
|
|
2202
|
+
<label class="switch switch-sm"><input type="checkbox" id="appSettingsClaudeVoice"><span class="slider"></span></label>
|
|
2203
|
+
</div>
|
|
2204
|
+
<div class="set-row" data-search="claude voice status credentials">
|
|
2205
|
+
<div class="set-row-text"><span class="set-row-label">Server status</span></div>
|
|
2206
|
+
<span class="voice-provider-status" id="voiceClaudeStatus" data-i18n-skip>—</span>
|
|
2207
|
+
</div>
|
|
2208
|
+
</div>
|
|
2209
|
+
</div>
|
|
2210
|
+
|
|
2211
|
+
<div class="set-group">
|
|
2212
|
+
<div class="set-group-head"><h4>Deepgram Nova-3</h4><span class="set-scope">device</span></div>
|
|
2213
|
+
<div class="set-group-body">
|
|
2214
|
+
<div class="set-row has-field" data-search="deepgram api key">
|
|
2215
|
+
<div class="set-row-text">
|
|
2216
|
+
<span class="set-row-label">API key</span>
|
|
2217
|
+
<span class="set-row-desc">Stored on this device only, never sent to the server. Get a key at console.deepgram.com</span>
|
|
2218
|
+
</div>
|
|
2219
|
+
<div class="set-row-actions set-row-actions-wide">
|
|
2220
|
+
<input type="password" id="voiceDeepgramKey" class="set-input" placeholder="Enter Deepgram API key" autocomplete="off">
|
|
2221
|
+
<button class="btn-toolbar btn-sm" onclick="app.toggleDeepgramKeyVisibility()" id="voiceKeyToggleBtn" type="button">Show</button>
|
|
2222
|
+
</div>
|
|
2223
|
+
</div>
|
|
2224
|
+
</div>
|
|
2225
|
+
</div>
|
|
2016
2226
|
</section>
|
|
2017
2227
|
|
|
2018
2228
|
<!-- ══ Shortcuts ════════════════════════════════════════════════ -->
|
|
@@ -2032,13 +2242,14 @@
|
|
|
2032
2242
|
</div>
|
|
2033
2243
|
</section>
|
|
2034
2244
|
|
|
2245
|
+
|
|
2035
2246
|
<!-- ══ System ═══════════════════════════════════════════════════ -->
|
|
2036
2247
|
<section class="set-section" id="settings-system" data-label="System">
|
|
2037
2248
|
<div class="set-section-head">
|
|
2038
2249
|
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.6a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9c.26.6.86 1 1.51 1H21a2 2 0 0 1 0 4h-.09c-.65 0-1.25.4-1.51 1z"/></svg>
|
|
2039
2250
|
<h2>System</h2>
|
|
2040
2251
|
</div>
|
|
2041
|
-
<p class="set-section-blurb">Paths, automation
|
|
2252
|
+
<p class="set-section-blurb">Paths, automation and remote access. Set once, rarely touched.</p>
|
|
2042
2253
|
|
|
2043
2254
|
<div class="set-group">
|
|
2044
2255
|
<div class="set-group-head"><h4>Paths</h4><span class="set-scope">synced</span></div>
|
|
@@ -2096,30 +2307,6 @@
|
|
|
2096
2307
|
</div>
|
|
2097
2308
|
</div>
|
|
2098
2309
|
</div>
|
|
2099
|
-
|
|
2100
|
-
<div class="set-group">
|
|
2101
|
-
<div class="set-group-head"><h4>Updates</h4></div>
|
|
2102
|
-
<div class="set-group-body">
|
|
2103
|
-
<div class="set-row" data-search="version current release">
|
|
2104
|
-
<div class="set-row-text"><span class="set-row-label">Current version</span></div>
|
|
2105
|
-
<span class="set-static mono" id="updateCurrentVersion">—</span>
|
|
2106
|
-
</div>
|
|
2107
|
-
<div class="set-row" id="updateCheckRow" data-search="check for updates github release">
|
|
2108
|
-
<div class="set-row-text">
|
|
2109
|
-
<span class="set-row-label">Check for updates</span>
|
|
2110
|
-
<span class="set-row-desc">Looks at GitHub for a newer Codeman release.</span>
|
|
2111
|
-
</div>
|
|
2112
|
-
<button class="btn-toolbar btn-sm" id="updateCheckBtn" onclick="app.checkForUpdate()">Check now</button>
|
|
2113
|
-
</div>
|
|
2114
|
-
<div id="updateResult" class="set-note" style="display:none"></div>
|
|
2115
|
-
<div class="set-row" id="updateActionRow" style="display:none">
|
|
2116
|
-
<div class="set-row-text"><span class="set-row-label" id="updateActionLabel">Update available</span></div>
|
|
2117
|
-
<button class="btn-toolbar btn-sm btn-primary" id="updateNowBtn" onclick="app.startSelfUpdate()">Update now</button>
|
|
2118
|
-
</div>
|
|
2119
|
-
<div id="updateNotes" class="set-notes" style="display:none"></div>
|
|
2120
|
-
<div id="updateProgress" class="set-progress" style="display:none"></div>
|
|
2121
|
-
</div>
|
|
2122
|
-
</div>
|
|
2123
2310
|
</section>
|
|
2124
2311
|
</div>
|
|
2125
2312
|
</div>
|
|
@@ -2148,24 +2335,56 @@
|
|
|
2148
2335
|
</div>
|
|
2149
2336
|
|
|
2150
2337
|
<!-- Create Case Modal -->
|
|
2338
|
+
<!-- Add Case: same `set-*` surface as App Settings and Session Options; the
|
|
2339
|
+
rail switches panels (switchCaseModalTab in session-ui.js). -->
|
|
2151
2340
|
<div class="modal" id="createCaseModal">
|
|
2152
2341
|
<div class="modal-backdrop" onclick="app.closeCreateCaseModal()"></div>
|
|
2153
|
-
<div class="modal-content modal-lg">
|
|
2154
|
-
<div class="modal-header">
|
|
2342
|
+
<div class="modal-content modal-lg set-shell">
|
|
2343
|
+
<div class="modal-header set-shell-head">
|
|
2155
2344
|
<h3>Add Case</h3>
|
|
2156
|
-
<
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
<button class="modal-tab-btn active" data-tab="case-create">Create New</button>
|
|
2160
|
-
<button class="modal-tab-btn" data-tab="case-clone" id="caseCloneTabBtn">Clone Repo</button>
|
|
2161
|
-
<button class="modal-tab-btn" data-tab="case-link">Link Existing</button>
|
|
2162
|
-
<button class="modal-tab-btn" data-tab="case-remote">Remote</button>
|
|
2163
|
-
<button class="modal-tab-btn" data-tab="case-docker">Docker</button>
|
|
2164
|
-
<button class="modal-tab-btn" data-tab="case-manage">Manage</button>
|
|
2345
|
+
<div class="set-head-actions">
|
|
2346
|
+
<button class="modal-close" onclick="app.closeCreateCaseModal()" aria-label="Close create case">×</button>
|
|
2347
|
+
</div>
|
|
2165
2348
|
</div>
|
|
2166
|
-
<div class="
|
|
2349
|
+
<div class="set-body">
|
|
2350
|
+
<nav class="set-rail" id="createCaseRail" aria-label="Add case sections">
|
|
2351
|
+
<div class="set-rail-items">
|
|
2352
|
+
<button type="button" class="set-rail-item active" data-tab="case-create">
|
|
2353
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M12 8v8M8 12h8"/></svg>
|
|
2354
|
+
<span>Create New</span>
|
|
2355
|
+
</button>
|
|
2356
|
+
<button type="button" class="set-rail-item" data-tab="case-clone" id="caseCloneTabBtn">
|
|
2357
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
|
|
2358
|
+
<span>Clone Repo</span>
|
|
2359
|
+
</button>
|
|
2360
|
+
<button type="button" class="set-rail-item" data-tab="case-link">
|
|
2361
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>
|
|
2362
|
+
<span>Link Existing</span>
|
|
2363
|
+
</button>
|
|
2364
|
+
<button type="button" class="set-rail-item" data-tab="case-remote">
|
|
2365
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M3 12h18"/><path d="M12 3a15 15 0 0 1 0 18a15 15 0 0 1 0-18z"/></svg>
|
|
2366
|
+
<span>Remote</span>
|
|
2367
|
+
</button>
|
|
2368
|
+
<button type="button" class="set-rail-item" data-tab="case-docker">
|
|
2369
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12h18v4a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3z"/><rect x="6" y="7" width="4" height="4"/><rect x="11" y="7" width="4" height="4"/><rect x="11" y="2.5" width="4" height="4"/></svg>
|
|
2370
|
+
<span>Docker</span>
|
|
2371
|
+
</button>
|
|
2372
|
+
<button type="button" class="set-rail-item" data-tab="case-manage">
|
|
2373
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="20" y2="18"/><circle cx="9" cy="6" r="2"/><circle cx="15" cy="12" r="2"/><circle cx="8" cy="18" r="2"/></svg>
|
|
2374
|
+
<span>Manage</span>
|
|
2375
|
+
</button>
|
|
2376
|
+
</div>
|
|
2377
|
+
<p class="set-rail-foot">A case is a workspace: a directory, its CLAUDE.md, and where its sessions run.</p>
|
|
2378
|
+
</nav>
|
|
2379
|
+
|
|
2380
|
+
<div class="set-doc" id="createCaseDoc">
|
|
2167
2381
|
<!-- Create New Tab -->
|
|
2168
|
-
<div class="
|
|
2382
|
+
<div class="set-section" id="case-create">
|
|
2383
|
+
<div class="set-section-head">
|
|
2384
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M12 8v8M8 12h8"/></svg>
|
|
2385
|
+
<h2>Create New</h2>
|
|
2386
|
+
</div>
|
|
2387
|
+
<p class="set-section-blurb">A fresh workspace under ~/codeman-cases, scaffolded with its own CLAUDE.md.</p>
|
|
2169
2388
|
<div class="form-row">
|
|
2170
2389
|
<label>Case Name</label>
|
|
2171
2390
|
<input type="text" id="newCaseName" placeholder="my-project" pattern="[a-zA-Z0-9_-]+" autocomplete="off" autocapitalize="off" spellcheck="false">
|
|
@@ -2180,7 +2399,7 @@
|
|
|
2180
2399
|
<span class="form-hint">Runs this case in a hardened, isolated container. The base image is built automatically on first use. Docker/Podman must be installed.</span>
|
|
2181
2400
|
</div>
|
|
2182
2401
|
<details class="advanced-options docker-quick-settings" id="dockerQuickSettings">
|
|
2183
|
-
<summary>Container settings (optional, sensible defaults)</summary>
|
|
2402
|
+
<summary><svg class="set-adv-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg><span>Container settings (optional, sensible defaults)</span></summary>
|
|
2184
2403
|
<div class="advanced-options-content">
|
|
2185
2404
|
<div class="form-row">
|
|
2186
2405
|
<label>Template</label>
|
|
@@ -2224,7 +2443,12 @@
|
|
|
2224
2443
|
</details>
|
|
2225
2444
|
</div>
|
|
2226
2445
|
<!-- Clone Repo Tab (issue #236) -->
|
|
2227
|
-
<div class="
|
|
2446
|
+
<div class="set-section hidden" id="case-clone">
|
|
2447
|
+
<div class="set-section-head">
|
|
2448
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg>
|
|
2449
|
+
<h2>Clone Repo</h2>
|
|
2450
|
+
</div>
|
|
2451
|
+
<p class="set-section-blurb">Clone a public repository into a new case. Anonymous HTTPS or your own credential helper.</p>
|
|
2228
2452
|
<div class="form-row">
|
|
2229
2453
|
<label>Repository URL</label>
|
|
2230
2454
|
<input type="url" id="cloneRepoUrl" placeholder="https://github.com/owner/repo.git" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" oninput="app.onCloneUrlInput()">
|
|
@@ -2255,7 +2479,7 @@
|
|
|
2255
2479
|
<span class="form-hint">Which CLI to point the Run button at once the clone finishes. Changeable any time from the Run dropdown.</span>
|
|
2256
2480
|
</div>
|
|
2257
2481
|
<details class="advanced-options">
|
|
2258
|
-
<summary>Clone options</summary>
|
|
2482
|
+
<summary><svg class="set-adv-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg><span>Clone options</span></summary>
|
|
2259
2483
|
<div class="advanced-options-content">
|
|
2260
2484
|
<div class="form-row">
|
|
2261
2485
|
<label class="checkbox-row"><input type="checkbox" id="cloneShallow"> Shallow clone (--depth 1)</label>
|
|
@@ -2269,7 +2493,12 @@
|
|
|
2269
2493
|
<span class="form-hint" id="cloneCaseNote" style="margin-top: 8px; display: block;">The clone runs while this request is open, so a large repository takes a while. The case appears as soon as git finishes, even if the browser gave up waiting.</span>
|
|
2270
2494
|
</div>
|
|
2271
2495
|
<!-- Link Existing Tab -->
|
|
2272
|
-
<div class="
|
|
2496
|
+
<div class="set-section hidden" id="case-link">
|
|
2497
|
+
<div class="set-section-head">
|
|
2498
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>
|
|
2499
|
+
<h2>Link Existing</h2>
|
|
2500
|
+
</div>
|
|
2501
|
+
<p class="set-section-blurb">Point a case at a folder that already exists on this machine.</p>
|
|
2273
2502
|
<div class="form-row">
|
|
2274
2503
|
<label>Case Name</label>
|
|
2275
2504
|
<input type="text" id="linkCaseName" placeholder="my-project" pattern="[a-zA-Z0-9_-]+" autocomplete="off" autocapitalize="off" spellcheck="false">
|
|
@@ -2285,7 +2514,12 @@
|
|
|
2285
2514
|
</div>
|
|
2286
2515
|
</div>
|
|
2287
2516
|
<!-- Remote Tab -->
|
|
2288
|
-
<div class="
|
|
2517
|
+
<div class="set-section hidden" id="case-remote">
|
|
2518
|
+
<div class="set-section-head">
|
|
2519
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M3 12h18"/><path d="M12 3a15 15 0 0 1 0 18a15 15 0 0 1 0-18z"/></svg>
|
|
2520
|
+
<h2>Remote</h2>
|
|
2521
|
+
</div>
|
|
2522
|
+
<p class="set-section-blurb">Run the agent on another machine over SSH, from a tab here.</p>
|
|
2289
2523
|
<div class="form-row">
|
|
2290
2524
|
<label>Case Name</label>
|
|
2291
2525
|
<input type="text" id="remoteCaseName" placeholder="gpu-work" pattern="[a-zA-Z0-9_-]+" autocomplete="off" autocapitalize="off" spellcheck="false">
|
|
@@ -2319,7 +2553,7 @@
|
|
|
2319
2553
|
<span class="form-hint">Optional. Leave blank to use exec codex on the remote host.</span>
|
|
2320
2554
|
</div>
|
|
2321
2555
|
<details class="advanced-options">
|
|
2322
|
-
<summary>Advanced SSH</summary>
|
|
2556
|
+
<summary><svg class="set-adv-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg><span>Advanced SSH</span></summary>
|
|
2323
2557
|
<div class="advanced-options-content">
|
|
2324
2558
|
<div class="form-row">
|
|
2325
2559
|
<label>Identity File</label>
|
|
@@ -2345,7 +2579,7 @@
|
|
|
2345
2579
|
</details>
|
|
2346
2580
|
<!-- COD-105 — discover + attach existing remote tmux sessions this Codeman didn't create. -->
|
|
2347
2581
|
<details class="advanced-options" id="remoteDiscoverSection">
|
|
2348
|
-
<summary>Discover existing sessions</summary>
|
|
2582
|
+
<summary><svg class="set-adv-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg><span>Discover existing sessions</span></summary>
|
|
2349
2583
|
<div class="advanced-options-content">
|
|
2350
2584
|
<span class="form-hint">Find <code>codeman-*</code> tmux sessions already running on this host (started by the remote's own Codeman or another instance) and attach to one. Attaching shares the session; closing the tab detaches it — it is never killed.</span>
|
|
2351
2585
|
<div class="form-row" style="margin-top: 8px;">
|
|
@@ -2356,7 +2590,12 @@
|
|
|
2356
2590
|
</details>
|
|
2357
2591
|
</div>
|
|
2358
2592
|
<!-- Docker Tab -->
|
|
2359
|
-
<div class="
|
|
2593
|
+
<div class="set-section hidden" id="case-docker">
|
|
2594
|
+
<div class="set-section-head">
|
|
2595
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12h18v4a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3z"/><rect x="6" y="7" width="4" height="4"/><rect x="11" y="7" width="4" height="4"/><rect x="11" y="2.5" width="4" height="4"/></svg>
|
|
2596
|
+
<h2>Docker</h2>
|
|
2597
|
+
</div>
|
|
2598
|
+
<p class="set-section-blurb">Run the case inside a container: one per case, shared by all its sessions.</p>
|
|
2360
2599
|
<div class="form-row">
|
|
2361
2600
|
<label>Case Name</label>
|
|
2362
2601
|
<input type="text" id="dockerCaseName" placeholder="sandbox" pattern="[a-zA-Z0-9_-]+" autocomplete="off" autocapitalize="off" spellcheck="false">
|
|
@@ -2386,7 +2625,7 @@
|
|
|
2386
2625
|
</select>
|
|
2387
2626
|
</div>
|
|
2388
2627
|
<details class="advanced-options">
|
|
2389
|
-
<summary>Advanced container settings</summary>
|
|
2628
|
+
<summary><svg class="set-adv-chev" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg><span>Advanced container settings</span></summary>
|
|
2390
2629
|
<div class="advanced-options-content">
|
|
2391
2630
|
<div class="form-row">
|
|
2392
2631
|
<label>Memory</label>
|
|
@@ -2409,7 +2648,12 @@
|
|
|
2409
2648
|
<span class="form-hint" id="dockerLinkStatus" style="margin-top: 8px; display: block;"></span>
|
|
2410
2649
|
</div>
|
|
2411
2650
|
<!-- Manage Tab -->
|
|
2412
|
-
<div class="
|
|
2651
|
+
<div class="set-section hidden" id="case-manage">
|
|
2652
|
+
<div class="set-section-head">
|
|
2653
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="20" y2="18"/><circle cx="9" cy="6" r="2"/><circle cx="15" cy="12" r="2"/><circle cx="8" cy="18" r="2"/></svg>
|
|
2654
|
+
<h2>Manage</h2>
|
|
2655
|
+
</div>
|
|
2656
|
+
<p class="set-section-blurb">Reorder or remove cases, and pick up anything exported from a docker case.</p>
|
|
2413
2657
|
<div class="case-manage-list" id="caseManageList">
|
|
2414
2658
|
<!-- Populated by JS -->
|
|
2415
2659
|
</div>
|
|
@@ -2422,8 +2666,9 @@
|
|
|
2422
2666
|
<div class="case-manage-list" id="dockerExportsList"><span class="form-hint">No exports yet. Export a docker case from its tab.</span></div>
|
|
2423
2667
|
</div>
|
|
2424
2668
|
</div>
|
|
2669
|
+
</div>
|
|
2425
2670
|
</div>
|
|
2426
|
-
<div class="form-actions">
|
|
2671
|
+
<div class="form-actions set-foot">
|
|
2427
2672
|
<button class="btn-toolbar" onclick="app.closeCreateCaseModal()">Cancel</button>
|
|
2428
2673
|
<button class="btn-toolbar btn-primary" id="caseModalSubmit" onclick="app.submitCaseModal()">Create</button>
|
|
2429
2674
|
</div>
|
|
@@ -2894,13 +3139,23 @@
|
|
|
2894
3139
|
<div class="readmymind-why" id="readMyMindWhy" data-i18n-skip></div>
|
|
2895
3140
|
<div class="readmymind-alternates" id="readMyMindAlternates" data-i18n-skip style="display:none"></div>
|
|
2896
3141
|
</div>
|
|
2897
|
-
<div class="readmymind-error" style="display:none">No suggestion this time. Rethink to try again.</div>
|
|
3142
|
+
<div class="readmymind-error" style="display:none">No suggestion this time. Add a steer note and Rethink to try again.</div>
|
|
3143
|
+
<!-- Rethink steer note: the user's own words about what they actually
|
|
3144
|
+
meant, sent as `steer` with the next Rethink. Shown whenever
|
|
3145
|
+
Rethink is live (ready AND empty-result phases), hidden while a
|
|
3146
|
+
prediction runs. -->
|
|
3147
|
+
<div class="readmymind-steer-row" id="readMyMindSteerRow" style="display:none">
|
|
3148
|
+
<input type="text" id="readMyMindSteer" class="readmymind-steer-input" maxlength="2000" placeholder="Steer the rethink, e.g. 'no, I meant the mobile bug'" aria-label="Steer note for Rethink" onkeydown="if(event.key==='Enter')app.rethinkReadMyMind()">
|
|
3149
|
+
</div>
|
|
2898
3150
|
</div>
|
|
3151
|
+
<!-- btn-toolbar, not bare "btn btn-*": no .btn/.btn-secondary rule exists
|
|
3152
|
+
in this codebase, so the bare classes render as unstyled UA buttons.
|
|
3153
|
+
btn-toolbar is the convention every other modal footer uses. -->
|
|
2899
3154
|
<div class="modal-footer">
|
|
2900
|
-
<button class="btn
|
|
2901
|
-
<button class="btn
|
|
2902
|
-
<button class="btn
|
|
2903
|
-
<button class="btn btn-primary" onclick="app.sendReadMyMind(true)">Send</button>
|
|
3155
|
+
<button class="btn-toolbar" onclick="app.closeReadMyMind()">Dismiss</button>
|
|
3156
|
+
<button class="btn-toolbar" id="readMyMindRethink" onclick="app.rethinkReadMyMind()">Rethink</button>
|
|
3157
|
+
<button class="btn-toolbar" onclick="app.sendReadMyMind(false)" title="Put the text on the session's composer without submitting it">Insert</button>
|
|
3158
|
+
<button class="btn-toolbar btn-primary" onclick="app.sendReadMyMind(true)">Send</button>
|
|
2904
3159
|
</div>
|
|
2905
3160
|
</div>
|
|
2906
3161
|
</div>
|
|
@@ -2917,27 +3172,27 @@
|
|
|
2917
3172
|
</div>
|
|
2918
3173
|
|
|
2919
3174
|
<script defer src="constants.53dc0fa1.js"></script>
|
|
2920
|
-
<script defer src="i18n.
|
|
3175
|
+
<script defer src="i18n.89097ff5.js"></script>
|
|
2921
3176
|
<script defer src="mobile-handlers.32fdd57f.js"></script>
|
|
2922
|
-
<script defer src="voice-input.
|
|
3177
|
+
<script defer src="voice-input.4ec670b0.js"></script>
|
|
2923
3178
|
<script defer src="notification-manager.5d229063.js"></script>
|
|
2924
3179
|
<script defer src="keyboard-accessory.0f524637.js"></script>
|
|
2925
3180
|
<script defer src="input-cjk.63794d0b.js"></script>
|
|
2926
3181
|
<!-- Hardened markdown HTML sanitizer (wires DOMPurify). Must precede app.js. -->
|
|
2927
3182
|
<script defer src="sanitize-html.bc7078d6.js"></script>
|
|
2928
3183
|
<script defer src="app.f9c6aadd.js"></script>
|
|
2929
|
-
<script defer src="terminal-ui.
|
|
3184
|
+
<script defer src="terminal-ui.ae776405.js"></script>
|
|
2930
3185
|
<script defer src="respawn-ui.ff0dae4c.js"></script>
|
|
2931
3186
|
<script defer src="ralph-panel.6de2d0f8.js"></script>
|
|
2932
3187
|
<script defer src="orchestrator-panel.js"></script>
|
|
2933
3188
|
<script defer src="cron-ui.js"></script>
|
|
2934
|
-
<script defer src="settings-ui.
|
|
3189
|
+
<script defer src="settings-ui.63be4178.js"></script>
|
|
2935
3190
|
<script defer src="panels-ui.54b0d004.js"></script>
|
|
2936
3191
|
<script defer src="readmymind-ui.js"></script>
|
|
2937
3192
|
<script defer src="ultracode-panel.js"></script>
|
|
2938
3193
|
<script defer src="approvals-ui.js"></script>
|
|
2939
3194
|
<script defer src="admin-ui.js"></script>
|
|
2940
|
-
<script defer src="session-ui.
|
|
3195
|
+
<script defer src="session-ui.46a0993c.js"></script>
|
|
2941
3196
|
<script defer src="webview-tabs.js"></script>
|
|
2942
3197
|
<script defer src="mobile-overview.js"></script>
|
|
2943
3198
|
<script defer src="home-sessions.js"></script>
|