aicodeman 1.16.2 → 1.16.3

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.
Files changed (116) hide show
  1. package/README.md +2 -1
  2. package/dist/search-service.d.ts +9 -1
  3. package/dist/search-service.d.ts.map +1 -1
  4. package/dist/search-service.js +13 -3
  5. package/dist/search-service.js.map +1 -1
  6. package/dist/services/unified-session-service.d.ts +9 -0
  7. package/dist/services/unified-session-service.d.ts.map +1 -1
  8. package/dist/services/unified-session-service.js +4 -1
  9. package/dist/services/unified-session-service.js.map +1 -1
  10. package/dist/types/search.d.ts +17 -3
  11. package/dist/types/search.d.ts.map +1 -1
  12. package/dist/web/public/admin-ui.js +35 -20
  13. package/dist/web/public/admin-ui.js.br +0 -0
  14. package/dist/web/public/admin-ui.js.gz +0 -0
  15. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  16. package/dist/web/public/{app.4d006245.js → app.f9c6aadd.js} +18 -18
  17. package/dist/web/public/app.f9c6aadd.js.br +0 -0
  18. package/dist/web/public/app.f9c6aadd.js.gz +0 -0
  19. package/dist/web/public/approvals-ui.js.gz +0 -0
  20. package/dist/web/public/{constants.7d0f4047.js → constants.53dc0fa1.js} +43 -0
  21. package/dist/web/public/constants.53dc0fa1.js.br +0 -0
  22. package/dist/web/public/constants.53dc0fa1.js.gz +0 -0
  23. package/dist/web/public/cron-ui.js.gz +0 -0
  24. package/dist/web/public/entrance-animations.js.gz +0 -0
  25. package/dist/web/public/home-sessions.js +119 -8
  26. package/dist/web/public/home-sessions.js.br +0 -0
  27. package/dist/web/public/home-sessions.js.gz +0 -0
  28. package/dist/web/public/i18n.1a8b3412.js +1 -0
  29. package/dist/web/public/i18n.1a8b3412.js.br +0 -0
  30. package/dist/web/public/i18n.1a8b3412.js.gz +0 -0
  31. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  32. package/dist/web/public/index.html +807 -727
  33. package/dist/web/public/index.html.br +0 -0
  34. package/dist/web/public/index.html.gz +0 -0
  35. package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
  36. package/dist/web/public/{keyboard-accessory.1f35b482.js → keyboard-accessory.0f524637.js} +207 -5
  37. package/dist/web/public/keyboard-accessory.0f524637.js.br +0 -0
  38. package/dist/web/public/keyboard-accessory.0f524637.js.gz +0 -0
  39. package/dist/web/public/mobile-handlers.32fdd57f.js.gz +0 -0
  40. package/dist/web/public/mobile-overview.js.gz +0 -0
  41. package/dist/web/public/mobile.52b30b35.css +1 -0
  42. package/dist/web/public/mobile.52b30b35.css.br +0 -0
  43. package/dist/web/public/mobile.52b30b35.css.gz +0 -0
  44. package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
  45. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  46. package/dist/web/public/{panels-ui.3df9cd95.js → panels-ui.54b0d004.js} +1 -1
  47. package/dist/web/public/panels-ui.54b0d004.js.br +0 -0
  48. package/dist/web/public/panels-ui.54b0d004.js.gz +0 -0
  49. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  50. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  51. package/dist/web/public/readmymind-ui.js +80 -16
  52. package/dist/web/public/readmymind-ui.js.br +0 -0
  53. package/dist/web/public/readmymind-ui.js.gz +0 -0
  54. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  55. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  56. package/dist/web/public/session-ui.f4fed187.js.gz +0 -0
  57. package/dist/web/public/{settings-ui.1c15649c.js → settings-ui.c674f367.js} +9 -9
  58. package/dist/web/public/settings-ui.c674f367.js.br +0 -0
  59. package/dist/web/public/settings-ui.c674f367.js.gz +0 -0
  60. package/dist/web/public/styles.2eb23e0f.css +1 -0
  61. package/dist/web/public/styles.2eb23e0f.css.br +0 -0
  62. package/dist/web/public/styles.2eb23e0f.css.gz +0 -0
  63. package/dist/web/public/subagent-windows.4cc8b005.js.gz +0 -0
  64. package/dist/web/public/sw.js.gz +0 -0
  65. package/dist/web/public/terminal-ui.61c7829d.js +4 -0
  66. package/dist/web/public/terminal-ui.61c7829d.js.br +0 -0
  67. package/dist/web/public/terminal-ui.61c7829d.js.gz +0 -0
  68. package/dist/web/public/ultracode-panel.js.gz +0 -0
  69. package/dist/web/public/ultracode-windows.js.gz +0 -0
  70. package/dist/web/public/upload.html.gz +0 -0
  71. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  72. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  73. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  74. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  75. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  76. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  77. package/dist/web/public/vendor/xterm-predictive-echo.6cec0fba.js.gz +0 -0
  78. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  79. package/dist/web/public/vendor/xterm.css.gz +0 -0
  80. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  81. package/dist/web/public/voice-input.e5461859.js.gz +0 -0
  82. package/dist/web/public/webview-tabs.js.gz +0 -0
  83. package/dist/web/routes/search-routes.d.ts +3 -1
  84. package/dist/web/routes/search-routes.d.ts.map +1 -1
  85. package/dist/web/routes/search-routes.js +34 -1
  86. package/dist/web/routes/search-routes.js.map +1 -1
  87. package/dist/web/routes/session-routes.d.ts.map +1 -1
  88. package/dist/web/routes/session-routes.js +151 -9
  89. package/dist/web/routes/session-routes.js.map +1 -1
  90. package/dist/web/session-history-index.d.ts +108 -0
  91. package/dist/web/session-history-index.d.ts.map +1 -0
  92. package/dist/web/session-history-index.js +118 -0
  93. package/dist/web/session-history-index.js.map +1 -0
  94. package/package.json +1 -1
  95. package/dist/web/public/app.4d006245.js.br +0 -0
  96. package/dist/web/public/app.4d006245.js.gz +0 -0
  97. package/dist/web/public/constants.7d0f4047.js.br +0 -0
  98. package/dist/web/public/constants.7d0f4047.js.gz +0 -0
  99. package/dist/web/public/i18n.ef50083f.js +0 -1
  100. package/dist/web/public/i18n.ef50083f.js.br +0 -0
  101. package/dist/web/public/i18n.ef50083f.js.gz +0 -0
  102. package/dist/web/public/keyboard-accessory.1f35b482.js.br +0 -0
  103. package/dist/web/public/keyboard-accessory.1f35b482.js.gz +0 -0
  104. package/dist/web/public/mobile.5d8c896c.css +0 -1
  105. package/dist/web/public/mobile.5d8c896c.css.br +0 -0
  106. package/dist/web/public/mobile.5d8c896c.css.gz +0 -0
  107. package/dist/web/public/panels-ui.3df9cd95.js.br +0 -0
  108. package/dist/web/public/panels-ui.3df9cd95.js.gz +0 -0
  109. package/dist/web/public/settings-ui.1c15649c.js.br +0 -0
  110. package/dist/web/public/settings-ui.1c15649c.js.gz +0 -0
  111. package/dist/web/public/styles.0024c22e.css +0 -1
  112. package/dist/web/public/styles.0024c22e.css.br +0 -0
  113. package/dist/web/public/styles.0024c22e.css.gz +0 -0
  114. package/dist/web/public/terminal-ui.e7c5d233.js +0 -4
  115. package/dist/web/public/terminal-ui.e7c5d233.js.br +0 -0
  116. package/dist/web/public/terminal-ui.e7c5d233.js.gz +0 -0
@@ -16,16 +16,16 @@
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.0024c22e.css">
20
- <link rel="stylesheet" href="mobile.5d8c896c.css" media="(max-width: 1023px)">
19
+ <link rel="stylesheet" href="styles.2eb23e0f.css">
20
+ <link rel="stylesheet" href="mobile.52b30b35.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>
24
24
  <!-- Preload critical resources — lets browser discover these during HTML parse
25
25
  instead of waiting until <script> tags at bottom-of-body are reached. -->
26
26
  <link rel="preload" href="vendor/xterm.min.js" as="script">
27
- <link rel="preload" href="constants.7d0f4047.js" as="script">
28
- <link rel="preload" href="app.4d006245.js" as="script">
27
+ <link rel="preload" href="constants.53dc0fa1.js" as="script">
28
+ <link rel="preload" href="app.f9c6aadd.js" as="script">
29
29
  <!-- Self-hosted xterm.js — eliminates CDN DNS/TLS latency (~100ms).
30
30
  'defer' preserves execution order (xterm loads before fit addon). -->
31
31
  <script defer src="vendor/xterm.min.js"></script>
@@ -323,9 +323,9 @@
323
323
 
324
324
  <!-- Welcome Overlay (shown when no session active) -->
325
325
  <div class="welcome-overlay" id="welcomeOverlay">
326
- <!-- Open tabs as a vertical column in the left gutter (home-sessions.js).
326
+ <!-- Open tabs as a rail docked to the left edge (home-sessions.js).
327
327
  Absolutely positioned so the centered content below never moves, and
328
- therefore only rendered where the gutter is wider than the column;
328
+ therefore only rendered where the gutter is wider than the rail;
329
329
  ships `hidden` and only that module reveals it. -->
330
330
  <aside class="home-sessions" id="homeSessions" hidden></aside>
331
331
  <div class="welcome-content">
@@ -397,7 +397,27 @@
397
397
  </div>
398
398
  <div class="search-results" id="searchResults" hidden></div>
399
399
  </div>
400
- <h3 class="history-title" id="historyTitle">Resume Conversation</h3>
400
+ <div class="history-header" id="historyHeader">
401
+ <h3 class="history-title" id="historyTitle">Resume Conversation</h3>
402
+ <span class="history-count" id="historyCount" data-i18n-skip></span>
403
+ <div class="history-controls">
404
+ <input
405
+ type="search"
406
+ id="historyFilter"
407
+ class="history-filter"
408
+ placeholder="Filter…"
409
+ autocomplete="off"
410
+ spellcheck="false"
411
+ maxlength="100"
412
+ aria-label="Filter past conversations"
413
+ />
414
+ <select id="historySort" class="search-select history-sort" aria-label="Sort past conversations">
415
+ <option value="recent">Recent</option>
416
+ <option value="name">Name A–Z</option>
417
+ <option value="folder">Folder A–Z</option>
418
+ </select>
419
+ </div>
420
+ </div>
401
421
  <div class="history-list" id="historyList"></div>
402
422
  </div>
403
423
  <p class="welcome-hint">Or click Run to start</p>
@@ -1273,778 +1293,837 @@
1273
1293
  <!-- App Settings Modal -->
1274
1294
  <div class="modal" id="appSettingsModal">
1275
1295
  <div class="modal-backdrop" onclick="app.closeAppSettings()"></div>
1276
- <div class="modal-content modal-lg">
1277
- <div class="modal-header">
1278
- <h3>App Settings</h3>
1279
- <button class="modal-close" onclick="app.closeAppSettings()" aria-label="Close app settings">&times;</button>
1280
- </div>
1281
- <div class="modal-tabs">
1282
- <button class="modal-tab-btn active" data-tab="settings-display">Display</button>
1283
- <button class="modal-tab-btn" data-tab="settings-claude">Claude CLI</button>
1284
- <button class="modal-tab-btn" data-tab="settings-codex">Codex CLI</button>
1285
- <button class="modal-tab-btn" data-tab="settings-models">Models</button>
1286
- <button class="modal-tab-btn" data-tab="settings-paths">Paths</button>
1287
- <button class="modal-tab-btn" data-tab="settings-notifications">Notifications</button>
1288
- <button class="modal-tab-btn" data-tab="settings-voice">Voice</button>
1289
- <button class="modal-tab-btn" data-tab="settings-shortcuts">Shortcuts</button>
1290
- </div>
1291
- <div class="modal-body">
1292
- <!-- Display Tab -->
1293
- <div class="modal-tab-content" id="settings-display">
1294
- <div class="settings-grid">
1295
- <!-- Branding & Language Section -->
1296
- <div class="settings-section-header">Branding &amp; Language</div>
1297
- <div class="settings-item" title="Name shown in the browser UI and window title. Supports Unicode, including Chinese.">
1298
- <span class="settings-item-label">Display Name</span>
1299
- <input type="text" id="appSettingsDisplayName" class="settings-inline-input" maxlength="40" placeholder="Codeman" autocomplete="off">
1300
- </div>
1301
- <div class="settings-item" title="Language for this device. Dynamic status messages and dialogs use the same language.">
1302
- <span class="settings-item-label">Interface Language</span>
1303
- <select id="appSettingsLanguage" class="form-select settings-inline-select">
1304
- <option value="en">English</option>
1305
- <option value="zh-CN">简体中文</option>
1306
- </select>
1307
- </div>
1296
+ <div class="modal-content modal-lg set-shell">
1297
+ <div class="modal-header set-shell-head">
1298
+ <h3>Settings</h3>
1299
+ <!-- Close first in the DOM so the focus trap still lands on it, not on
1300
+ Save; row-reverse keeps Save to the left of it on phones. -->
1301
+ <div class="set-head-actions">
1302
+ <button class="modal-close" onclick="app.closeAppSettings()" aria-label="Close app settings">&times;</button>
1303
+ <button class="set-head-save" onclick="app.saveAppSettings()">Save</button>
1304
+ </div>
1305
+ </div>
1306
+ <div class="set-body">
1307
+ <!-- Left rail: a table of contents over the single scrolling document on
1308
+ the right. On phones it collapses and #appSettingsJump takes over. -->
1309
+ <nav class="set-rail" id="appSettingsRail" aria-label="Settings sections">
1310
+ <div class="set-search">
1311
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>
1312
+ <input type="search" id="appSettingsSearch" placeholder="Search settings" autocomplete="off" aria-label="Search settings">
1313
+ </div>
1314
+ <div class="set-rail-items" id="appSettingsRailItems">
1315
+ <button type="button" class="set-rail-item active" data-section="settings-terminal">
1316
+ <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
+ <span>Terminal &amp; Input</span>
1318
+ </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
+ <button type="button" class="set-rail-item" data-section="settings-layout">
1324
+ <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
+ <span>Header &amp; Panels</span>
1326
+ </button>
1327
+ <button type="button" class="set-rail-item" data-section="settings-models">
1328
+ <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
+ <span>Models</span>
1330
+ </button>
1331
+ <button type="button" class="set-rail-item" data-section="settings-clis">
1332
+ <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="M8 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h2"/><path d="M16 3h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-2"/><circle cx="12" cy="12" r="2.5"/></svg>
1333
+ <span>Agents &amp; CLIs</span>
1334
+ </button>
1335
+ <button type="button" class="set-rail-item" data-section="settings-notifications">
1336
+ <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="M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.7 21a2 2 0 0 1-3.4 0"/></svg>
1337
+ <span>Notifications</span>
1338
+ </button>
1339
+ <button type="button" class="set-rail-item" data-section="settings-voice">
1340
+ <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="9" y="2" width="6" height="12" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v4"/></svg>
1341
+ <span>Voice</span>
1342
+ </button>
1343
+ <button type="button" class="set-rail-item" data-section="settings-shortcuts">
1344
+ <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="2" y="5" width="20" height="14" rx="2"/><path d="M6 9h.01M10 9h.01M14 9h.01M18 9h.01M6 13h.01M18 13h.01M9 13h6"/></svg>
1345
+ <span>Shortcuts</span>
1346
+ </button>
1347
+ <button type="button" class="set-rail-item" data-section="settings-system">
1348
+ <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="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>
1349
+ <span>System</span>
1350
+ </button>
1351
+ </div>
1352
+ <p class="set-rail-foot">Settings marked <b>device</b> stay on this browser. The rest sync to every device.</p>
1353
+ </nav>
1308
1354
 
1309
- <!-- Appearance Section -->
1310
- <div class="settings-section-header">Appearance</div>
1311
- <div class="settings-item settings-item-skin" title="Visual theme for this device (not synced)">
1312
- <span class="settings-item-label">Skin</span>
1313
- <select id="appSettingsSkin" class="form-select">
1314
- <optgroup label="Light">
1315
- <option value="paper-gray">Paper Gray</option>
1316
- <option value="solarized-light">Solarized Light</option>
1317
- <option value="catppuccin-latte">Catppuccin Latte</option>
1318
- <option value="rose-pine-dawn">Rosé Pine Dawn</option>
1319
- </optgroup>
1320
- <optgroup label="Dark">
1321
- <option value="daylight-blue">Daylight Blue</option>
1322
- <option value="daylight-green">Daylight Green</option>
1323
- <option value="og">OG Codeman</option>
1324
- </optgroup>
1325
- </select>
1326
- </div>
1327
- <div class="settings-item settings-item-multiline" title="How new session tabs, the terminal pane, agent windows and their connection lines appear. This device only. For per-surface control and a live preview, add ?animlab=1 to the URL.">
1328
- <div class="settings-item-text">
1329
- <span class="settings-item-label">Entrance Animations</span>
1330
- <span class="settings-item-desc">How new tabs, panes and agent windows arrive</span>
1355
+ <div class="set-doc" id="appSettingsDoc">
1356
+ <!-- Phone only: names the section you are in and opens the jump list -->
1357
+ <button type="button" class="set-jump" id="appSettingsJump" aria-haspopup="menu" aria-expanded="false">
1358
+ <svg class="set-jump-ico" 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="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
1359
+ <span class="set-jump-label">Terminal &amp; Input</span>
1360
+ <svg class="set-jump-chev" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.3" stroke-linecap="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
1361
+ </button>
1362
+ <div class="set-jump-veil" id="appSettingsJumpVeil"></div>
1363
+ <div class="set-jump-menu" id="appSettingsJumpMenu" role="menu"></div>
1364
+
1365
+ <p class="set-empty" id="appSettingsSearchEmpty" hidden>No settings match that search.</p>
1366
+
1367
+ <!-- ══ Terminal &amp; Input ══════════════════════════════════════ -->
1368
+ <section class="set-section" id="settings-terminal" data-label="Terminal &amp; Input">
1369
+ <div class="set-section-head">
1370
+ <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="M4 17l6-6-6-6"/><path d="M12 19h8"/></svg>
1371
+ <h2>Terminal &amp; Input</h2>
1372
+ </div>
1373
+ <p class="set-section-blurb">How keystrokes reach the agent, and how the terminal draws.</p>
1374
+
1375
+ <div class="set-group">
1376
+ <div class="set-group-head"><h4>Typing</h4><span class="set-scope">device</span></div>
1377
+ <div class="set-group-body">
1378
+ <div class="set-row" data-search="local echo typing latency mobile">
1379
+ <div class="set-row-text">
1380
+ <span class="set-row-label">Local Echo</span>
1381
+ <span class="set-row-desc">Paint keystrokes instantly instead of waiting for the round trip. Recommended on phones and high-latency links.</span>
1382
+ </div>
1383
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsLocalEcho"><span class="slider"></span></label>
1384
+ </div>
1385
+ <div class="set-row" data-search="cjk input ime chinese japanese korean">
1386
+ <div class="set-row-text">
1387
+ <span class="set-row-label">CJK Input</span>
1388
+ <span class="set-row-desc">Dedicated IME field for Chinese, Japanese and Korean composition.</span>
1389
+ </div>
1390
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsCjkInput"><span class="slider"></span></label>
1391
+ </div>
1392
+ <div class="set-row" data-search="extended keyboard bar tab esc arrows phone">
1393
+ <div class="set-row-text">
1394
+ <span class="set-row-label">Extended Keyboard Bar <span class="set-tag">phone</span></span>
1395
+ <span class="set-row-desc">Extra phone keys: Tab, Shift+Tab, Esc, arrows, Ctrl+O.</span>
1396
+ </div>
1397
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsExtendedKeyboardBar"><span class="slider"></span></label>
1398
+ </div>
1331
1399
  </div>
1332
- <select id="appSettingsEntranceAnim" class="form-select settings-inline-select">
1333
- <option value="legacy">Off (default)</option>
1334
- <option value="terminal">Terminal (CRT)</option>
1335
- <option value="beamdown">Beam down</option>
1336
- <option value="quiet">Quiet</option>
1337
- <option value="playful">Playful</option>
1338
- <option value="custom">Custom (set in the lab)</option>
1339
- </select>
1340
- </div>
1341
- <div class="settings-item" id="appSettingsWebglRendererItem" title="Use the GPU-accelerated WebGL terminal renderer (desktop only). Turn off to force the DOM renderer if you hit GPU glitches. Codeman also auto-falls-back to the DOM renderer after repeated GPU stalls.">
1342
- <span class="settings-item-label">WebGL Renderer</span>
1343
- <label class="switch switch-sm">
1344
- <input type="checkbox" id="appSettingsWebglRenderer">
1345
- <span class="slider"></span>
1346
- </label>
1347
1400
  </div>
1348
- <!-- Input Section -->
1349
- <div class="settings-section-header">Input</div>
1350
- <div class="settings-item settings-item-multiline" title="Scroll the terminal's own local scrollback with a plain mouse wheel / two-finger swipe, instead of forwarding the wheel to the CLI's transcript. Only Claude sessions forward, so this setting only affects them: Claude redraws the screen in place and keeps almost no local scrollback, so with this ON the wheel has little to scroll and Codeman falls back to paging Claude's own transcript. Codex, Gemini, shell and OpenCode sessions always scroll local scrollback. Shift+wheel always reaches local scrollback regardless.">
1351
- <div class="settings-item-text">
1352
- <span class="settings-item-label">Wheel Scrolls Local History</span>
1353
- <span class="settings-item-desc">Plain wheel/trackpad pages the terminal scrollback</span>
1401
+
1402
+ <div class="set-group">
1403
+ <div class="set-group-head"><h4>Scrolling &amp; rendering</h4></div>
1404
+ <div class="set-group-body">
1405
+ <div class="set-row" data-search="wheel scroll local history scrollback transcript">
1406
+ <div class="set-row-text">
1407
+ <span class="set-row-label">Wheel Scrolls Local History <span class="set-scope">device</span></span>
1408
+ <span class="set-row-desc">Plain wheel or two-finger swipe pages the terminal's own scrollback instead of the CLI transcript. Shift+wheel always reaches local scrollback.</span>
1409
+ </div>
1410
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsTerminalWheelLocal"><span class="slider"></span></label>
1411
+ </div>
1412
+ <div class="set-row" id="appSettingsWebglRendererItem" data-search="webgl renderer gpu terminal">
1413
+ <div class="set-row-text">
1414
+ <span class="set-row-label">WebGL Renderer <span class="set-tag">desktop</span> <span class="set-scope">device</span></span>
1415
+ <span class="set-row-desc">GPU-accelerated terminal drawing. Codeman falls back to the DOM renderer after repeated GPU stalls.</span>
1416
+ </div>
1417
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsWebglRenderer"><span class="slider"></span></label>
1418
+ </div>
1419
+ <div class="set-row" id="appSettingsGestureControlItem" data-search="gesture control camera hand tracking">
1420
+ <div class="set-row-text">
1421
+ <span class="set-row-label">Gesture Control <span class="set-tag set-tag-beta">beta</span> <span class="set-scope">synced</span></span>
1422
+ <span class="set-row-desc">Camera hand-tracking overlay. Applied on reload; the instance must run with CODEMAN_GESTURE=1.</span>
1423
+ </div>
1424
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsGestureControl"><span class="slider"></span></label>
1425
+ </div>
1354
1426
  </div>
1355
- <label class="switch switch-sm">
1356
- <input type="checkbox" id="appSettingsTerminalWheelLocal">
1357
- <span class="slider"></span>
1358
- </label>
1359
1427
  </div>
1360
- <div class="settings-item settings-item-multiline" title="Shows typed characters instantly via overlay while forwarding keystrokes to the server in the background. Enables Tab completion, preserves input across tab switches, and protects against session crashes. Recommended for mobile and high-latency connections.">
1361
- <div class="settings-item-text">
1362
- <span class="settings-item-label">Local Echo</span>
1363
- <span class="settings-item-desc">Instant typing feedback with local echo</span>
1428
+ </section>
1429
+
1430
+ <!-- ══ Appearance ═══════════════════════════════════════════════ -->
1431
+ <section class="set-section" id="settings-appearance" data-label="Appearance">
1432
+ <div class="set-section-head">
1433
+ <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="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>
1434
+ <h2>Appearance</h2>
1435
+ </div>
1436
+ <p class="set-section-blurb">Theme, motion, and what this install calls itself.</p>
1437
+
1438
+ <div class="set-group">
1439
+ <div class="set-group-head"><h4>Theme</h4><span class="set-scope">device</span></div>
1440
+ <div class="set-group-body">
1441
+ <div class="set-row has-field" data-search="skin theme palette colors dark light">
1442
+ <div class="set-row-text">
1443
+ <span class="set-row-label">Skin</span>
1444
+ <span class="set-row-desc">Palette for the terminal and the UI.</span>
1445
+ </div>
1446
+ <select id="appSettingsSkin" class="set-select">
1447
+ <optgroup label="Light">
1448
+ <option value="paper-gray">Paper Gray</option>
1449
+ <option value="solarized-light">Solarized Light</option>
1450
+ <option value="catppuccin-latte">Catppuccin Latte</option>
1451
+ <option value="rose-pine-dawn">Rosé Pine Dawn</option>
1452
+ </optgroup>
1453
+ <optgroup label="Dark">
1454
+ <option value="daylight-blue">Daylight Blue</option>
1455
+ <option value="daylight-green">Daylight Green</option>
1456
+ <option value="og">OG Codeman</option>
1457
+ </optgroup>
1458
+ </select>
1459
+ </div>
1460
+ <div class="set-row has-field" data-search="entrance animations motion tabs windows">
1461
+ <div class="set-row-text">
1462
+ <span class="set-row-label">Entrance Animations</span>
1463
+ <span class="set-row-desc">How new tabs, panes and agent windows arrive. Add ?animlab=1 to the URL for per-surface control.</span>
1464
+ </div>
1465
+ <select id="appSettingsEntranceAnim" class="set-select">
1466
+ <option value="legacy">Off (default)</option>
1467
+ <option value="terminal">Terminal (CRT)</option>
1468
+ <option value="beamdown">Beam down</option>
1469
+ <option value="quiet">Quiet</option>
1470
+ <option value="playful">Playful</option>
1471
+ <option value="custom">Custom (set in the lab)</option>
1472
+ </select>
1473
+ </div>
1364
1474
  </div>
1365
- <label class="switch switch-sm">
1366
- <input type="checkbox" id="appSettingsLocalEcho">
1367
- <span class="slider"></span>
1368
- </label>
1369
1475
  </div>
1370
- <div class="settings-item settings-item-multiline" title="Show a dedicated input field below the terminal for CJK (Chinese/Japanese/Korean) IME composition. Recommended for mobile devices with Chinese input methods where xterm's native input handling may drop characters.">
1371
- <div class="settings-item-text">
1372
- <span class="settings-item-label">CJK Input</span>
1373
- <span class="settings-item-desc">Dedicated IME input field for CJK languages</span>
1476
+
1477
+ <div class="set-group">
1478
+ <div class="set-group-head"><h4>Identity</h4></div>
1479
+ <div class="set-group-body">
1480
+ <div class="set-row has-field" data-search="display name branding title">
1481
+ <div class="set-row-text">
1482
+ <span class="set-row-label">Display Name <span class="set-scope">synced</span></span>
1483
+ <span class="set-row-desc">Shown in the browser UI and the window title. Unicode is fine.</span>
1484
+ </div>
1485
+ <input type="text" id="appSettingsDisplayName" class="set-input" maxlength="40" placeholder="Codeman" autocomplete="off">
1486
+ </div>
1487
+ <div class="set-row has-field" data-search="language interface chinese english">
1488
+ <div class="set-row-text">
1489
+ <span class="set-row-label">Interface Language <span class="set-scope">device</span></span>
1490
+ <span class="set-row-desc">Dialogs and status messages use the same language.</span>
1491
+ </div>
1492
+ <select id="appSettingsLanguage" class="set-select">
1493
+ <option value="en">English</option>
1494
+ <option value="zh-CN">简体中文</option>
1495
+ </select>
1496
+ </div>
1374
1497
  </div>
1375
- <label class="switch switch-sm">
1376
- <input type="checkbox" id="appSettingsCjkInput">
1377
- <span class="slider"></span>
1378
- </label>
1379
1498
  </div>
1380
1499
 
1381
- <div class="settings-item settings-item-multiline" title="Show additional buttons (Tab, Shift+Tab, Ctrl+O, Esc, Alt+Enter, left/right arrows) in the mobile keyboard accessory bar.">
1382
- <div class="settings-item-text">
1383
- <span class="settings-item-label">Extended Keyboard Bar</span>
1384
- <span class="settings-item-desc">Extra keys: Tab, Esc, arrows, Ctrl+O</span>
1500
+ <div class="set-group">
1501
+ <div class="set-group-head"><h4>Tabs</h4><span class="set-scope">device</span></div>
1502
+ <div class="set-group-body">
1503
+ <div class="set-row" data-search="tall tabs folder name two rows">
1504
+ <div class="set-row-text">
1505
+ <span class="set-row-label">Tall Tabs</span>
1506
+ <span class="set-row-desc">Show the folder under the session name and let the tab bar wrap.</span>
1507
+ </div>
1508
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsTabTwoRows"><span class="slider"></span></label>
1509
+ </div>
1510
+ <div class="set-row" data-search="pop out detach tab window">
1511
+ <div class="set-row-text">
1512
+ <span class="set-row-label">Pop-out Button on Tabs</span>
1513
+ <span class="set-row-desc">Open a session in its own window from the tab.</span>
1514
+ </div>
1515
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsShowTabDetachButton"><span class="slider"></span></label>
1516
+ </div>
1517
+ <div class="set-row" id="appSettingsMobileOverviewItem" data-search="overview home screen phone logo">
1518
+ <div class="set-row-text">
1519
+ <span class="set-row-label">Overview Home Screen <span class="set-tag">phone</span></span>
1520
+ <span class="set-row-desc">The C logo opens the session overview instead of the welcome screen.</span>
1521
+ </div>
1522
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsMobileOverview" checked><span class="slider"></span></label>
1523
+ </div>
1385
1524
  </div>
1386
- <label class="switch switch-sm">
1387
- <input type="checkbox" id="appSettingsExtendedKeyboardBar">
1388
- <span class="slider"></span>
1389
- </label>
1390
1525
  </div>
1391
- <div class="settings-item settings-item-multiline" id="appSettingsGestureControlItem" title="Enable the camera hand-tracking gesture overlay (applied on reload). The instance must run with CODEMAN_GESTURE=1.">
1392
- <div class="settings-item-text">
1393
- <span class="settings-item-label">Gesture Control (beta)</span>
1394
- <span class="settings-item-desc">Camera hand-tracking overlay (applied on reload)</span>
1526
+ </section>
1527
+
1528
+ <!-- ══ Header &amp; Panels ═══════════════════════════════════════ -->
1529
+ <section class="set-section" id="settings-layout" data-label="Header &amp; 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 &amp; 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>
1395
1554
  </div>
1396
- <label class="switch switch-sm">
1397
- <input type="checkbox" id="appSettingsGestureControl">
1398
- <span class="slider"></span>
1399
- </label>
1400
1555
  </div>
1401
1556
 
1402
- <!-- Header Displays Section -->
1403
- <div class="settings-section-header">Header Displays</div>
1404
- <div class="settings-item" title="Show Claude plan usage limits (5-hour & weekly) in the header. Applies to newly created sessions.">
1405
- <span class="settings-item-label">Plan Usage Limits</span>
1406
- <label class="switch switch-sm">
1407
- <input type="checkbox" id="appSettingsShowPlanUsageLimits">
1408
- <span class="slider"></span>
1409
- </label>
1410
- </div>
1411
- <div class="settings-item" title="Show A-/A+ font size buttons in header">
1412
- <span class="settings-item-label">Font Controls</span>
1413
- <label class="switch switch-sm">
1414
- <input type="checkbox" id="appSettingsShowFontControls">
1415
- <span class="slider"></span>
1416
- </label>
1417
- </div>
1418
- <div class="settings-item" title="Show CPU and memory usage in header">
1419
- <span class="settings-item-label">System Stats</span>
1420
- <label class="switch switch-sm">
1421
- <input type="checkbox" id="appSettingsShowSystemStats" checked>
1422
- <span class="slider"></span>
1423
- </label>
1424
- </div>
1425
- <div class="settings-item" title="Show session lifecycle log button in header">
1426
- <span class="settings-item-label">Lifecycle Log</span>
1427
- <label class="switch switch-sm">
1428
- <input type="checkbox" id="appSettingsShowLifecycleLog">
1429
- <span class="slider"></span>
1430
- </label>
1431
- </div>
1432
- <div class="settings-item" title="Show the response viewer (eye) button in header">
1433
- <span class="settings-item-label">Response Viewer</span>
1434
- <label class="switch switch-sm">
1435
- <input type="checkbox" id="appSettingsShowResponseViewer">
1436
- <span class="slider"></span>
1437
- </label>
1438
- </div>
1439
- <div class="settings-item" title="Show the file viewer button in header (opens the file browser panel for the active session)">
1440
- <span class="settings-item-label">File Viewer</span>
1441
- <label class="switch switch-sm">
1442
- <input type="checkbox" id="appSettingsShowFileViewerButton">
1443
- <span class="slider"></span>
1444
- </label>
1445
- </div>
1446
- <div class="settings-item" title="Show the attachments button in header (opens the attachment history drawer)">
1447
- <span class="settings-item-label">Attachments Button</span>
1448
- <label class="switch switch-sm">
1449
- <input type="checkbox" id="appSettingsShowAttachmentsButton">
1450
- <span class="slider"></span>
1451
- </label>
1452
- </div>
1453
- <div class="settings-item" title="Show the multi-monitor button in the header (opens Codeman spanned across all displays)">
1454
- <span class="settings-item-label">Multi-monitor Button</span>
1455
- <label class="switch switch-sm">
1456
- <input type="checkbox" id="appSettingsShowMultiMonitorButton">
1457
- <span class="slider"></span>
1458
- </label>
1459
- </div>
1460
- <div class="settings-item" title="Show the session manager button in the header (opens the session manager — sessions also stay reachable via the Ctrl+K palette)">
1461
- <span class="settings-item-label">Session Manager Button</span>
1462
- <label class="switch switch-sm">
1463
- <input type="checkbox" id="appSettingsShowSessionButton">
1464
- <span class="slider"></span>
1465
- </label>
1466
- </div>
1467
- <div class="settings-item" title="Show the away digest button in the header (opens the 'what happened while you were away' summary)">
1468
- <span class="settings-item-label">Away Digest Button</span>
1469
- <label class="switch switch-sm">
1470
- <input type="checkbox" id="appSettingsShowAwayDigestButton">
1471
- <span class="slider"></span>
1472
- </label>
1473
- </div>
1474
- <div class="settings-item" title="Show the Cron button in the footer toolbar (opens the cron jobs manager)">
1475
- <span class="settings-item-label">Cron Button</span>
1476
- <label class="switch switch-sm">
1477
- <input type="checkbox" id="appSettingsShowCronButton">
1478
- <span class="slider"></span>
1479
- </label>
1480
- </div>
1481
- <div class="settings-item" title="Show a terminal redraw button in the header — refit the terminal to the current screen size (useful when switching between devices)">
1482
- <span class="settings-item-label">Redraw Terminal Button</span>
1483
- <label class="switch switch-sm">
1484
- <input type="checkbox" id="appSettingsShowRedrawButton">
1485
- <span class="slider"></span>
1486
- </label>
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>
1487
1567
  </div>
1488
1568
 
1489
- <!-- Phone Section (only meaningful under 430px, hidden elsewhere by settings-ui.js) -->
1490
- <div class="settings-section-header" id="appSettingsPhoneSection">Phone</div>
1491
- <div class="settings-item" id="appSettingsMobileOverviewItem" title="On phones, the C logo opens a session overview (needs you / spaces / idle) instead of the welcome screen">
1492
- <span class="settings-item-label">Overview Home Screen</span>
1493
- <label class="switch switch-sm">
1494
- <input type="checkbox" id="appSettingsMobileOverview" checked>
1495
- <span class="slider"></span>
1496
- </label>
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>
1497
1580
  </div>
1498
1581
 
1499
- <!-- Tab Bar Section -->
1500
- <div class="settings-section-header">Tab Bar</div>
1501
- <div class="settings-item" title="Show folder path below tab name and allow tab bar to wrap into multiple rows">
1502
- <span class="settings-item-label">Tall Tabs (Name + Folder)</span>
1503
- <label class="switch switch-sm">
1504
- <input type="checkbox" id="appSettingsTabTwoRows">
1505
- <span class="slider"></span>
1506
- </label>
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>
1507
1600
  </div>
1508
- <div class="settings-item" title="Show the open-in-new-window (pop-out) button when hovering a session tab">
1509
- <span class="settings-item-label">Pop-out Button on Tabs</span>
1510
- <label class="switch switch-sm">
1511
- <input type="checkbox" id="appSettingsShowTabDetachButton">
1512
- <span class="slider"></span>
1513
- </label>
1601
+ </section>
1602
+
1603
+ <!-- ══ Models ═══════════════════════════════════════════════════ -->
1604
+ <section class="set-section" id="settings-models" data-label="Models">
1605
+ <div class="set-section-head">
1606
+ <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 3l8 4.5v9L12 21l-8-4.5v-9L12 3z"/><path d="M12 12l8-4.5M12 12v9M12 12L4 7.5"/></svg>
1607
+ <h2>Models</h2>
1608
+ </div>
1609
+ <p class="set-section-blurb">One place for what new sessions run on, and what background tasks are routed to.</p>
1610
+
1611
+ <div class="set-group">
1612
+ <div class="set-group-head"><h4>New Claude sessions</h4><span class="set-scope">synced</span></div>
1613
+ <p class="set-group-hint">A soft default, pinned via the case's .claude/settings.local.json. /model still switches inside a running session.</p>
1614
+ <div class="set-group-body">
1615
+ <!-- Cards are built from the select below by settings-ui.js, which keeps
1616
+ the select as the single source of truth for load/save. -->
1617
+ <div class="set-modelgrid" id="appSettingsModelCards" role="radiogroup" aria-label="Model for new Claude sessions" data-search="model opus sonnet haiku fable claude"></div>
1618
+ <select id="appSettingsClaudeModel" class="set-select set-field-hidden" aria-hidden="true" tabindex="-1">
1619
+ <option value="" data-meta="Whatever the CLI picks">Default (CLI setting)</option>
1620
+ <option value="claude-fable-5" data-meta="Most powerful" data-base="claude-fable-5" data-ctx="1">Fable 5</option>
1621
+ <option value="claude-fable-5[1m]" data-variant="1m" data-base="claude-fable-5">Fable 5 (1M context)</option>
1622
+ <option value="opus" data-meta="Most capable" data-base="opus" data-ctx="1">Opus</option>
1623
+ <option value="opus[1m]" data-variant="1m" data-base="opus">Opus (1M context)</option>
1624
+ <option value="claude-opus-4-6" data-meta="Previous generation" data-base="claude-opus-4-6" data-ctx="1">Opus 4.6</option>
1625
+ <option value="claude-opus-4-6[1m]" data-variant="1m" data-base="claude-opus-4-6">Opus 4.6 (1M context)</option>
1626
+ <option value="sonnet" data-meta="Balanced" data-base="sonnet">Sonnet</option>
1627
+ <option value="haiku" data-meta="Fast &amp; cheap" data-base="haiku">Haiku</option>
1628
+ </select>
1629
+ <div class="set-row" id="appSettingsContextRow" data-search="1m context window opus long">
1630
+ <div class="set-row-text">
1631
+ <span class="set-row-label">1M context window</span>
1632
+ <span class="set-row-desc" id="appSettingsContextDesc">Available for Fable 5, Opus and Opus 4.6.</span>
1633
+ </div>
1634
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsOpusContext1m"><span class="slider"></span></label>
1635
+ </div>
1636
+ <div class="set-row set-row-block" data-search="thinking effort ultracode xhigh max reasoning">
1637
+ <div class="set-row-text">
1638
+ <span class="set-row-label">Thinking effort</span>
1639
+ <span class="set-row-desc">Switchable in-session with /effort. Ultracode runs multi-agent workflows.</span>
1640
+ </div>
1641
+ <div class="set-segment" id="appSettingsEffortSegment" role="radiogroup" aria-label="Thinking effort"></div>
1642
+ <select id="appSettingsThinkingEffort" class="set-select set-field-hidden" aria-hidden="true" tabindex="-1">
1643
+ <option value="">Default</option>
1644
+ <option value="low">Low</option>
1645
+ <option value="medium">Medium</option>
1646
+ <option value="high">High</option>
1647
+ <option value="xhigh">XHigh</option>
1648
+ <option value="max">Max</option>
1649
+ <option value="ultracode">Ultracode</option>
1650
+ </select>
1651
+ </div>
1652
+ </div>
1514
1653
  </div>
1515
1654
 
1516
- <!-- Panels Section -->
1517
- <div class="settings-section-header">Panels</div>
1518
- <div class="settings-item" title="Show Monitor panel at bottom right">
1519
- <span class="settings-item-label">Monitor</span>
1520
- <label class="switch switch-sm">
1521
- <input type="checkbox" id="appSettingsShowMonitor" checked>
1522
- <span class="slider"></span>
1523
- </label>
1524
- </div>
1525
- <div class="settings-item" title="Show active tools and file viewers in a floating panel">
1526
- <span class="settings-item-label">Project Insights</span>
1527
- <label class="switch switch-sm">
1528
- <input type="checkbox" id="appSettingsShowProjectInsights">
1529
- <span class="slider"></span>
1530
- </label>
1531
- </div>
1532
- <div class="settings-item" title="Show file browser panel on the right side">
1533
- <span class="settings-item-label">File Browser</span>
1534
- <label class="switch switch-sm">
1535
- <input type="checkbox" id="appSettingsShowFileBrowser">
1536
- <span class="slider"></span>
1537
- </label>
1538
- </div>
1539
- <div class="settings-item" title="Show the Subagents panel (independent from Monitor)">
1540
- <span class="settings-item-label">Subagents</span>
1541
- <label class="switch switch-sm">
1542
- <input type="checkbox" id="appSettingsShowSubagents">
1543
- <span class="slider"></span>
1544
- </label>
1545
- </div>
1546
- <div class="settings-item" title="Cross-session inbox of prompts waiting on you (permission dialogs, questions, idle prompts) with answer-in-place buttons; the header bell appears only while something is pending">
1547
- <span class="settings-item-label">Approvals Inbox</span>
1548
- <label class="switch switch-sm">
1549
- <input type="checkbox" id="appSettingsApprovalsInbox">
1550
- <span class="slider"></span>
1551
- </label>
1552
- </div>
1553
- <div class="settings-item" title="Read My Mind: capture your submitted prompts into a per-case intent profile and predict your next prompt on demand (header 🧠 button on Claude sessions). Predictions cost tokens and are never auto-sent">
1554
- <span class="settings-item-label">Read My Mind</span>
1555
- <label class="switch switch-sm">
1556
- <input type="checkbox" id="appSettingsReadMyMind">
1557
- <span class="slider"></span>
1558
- </label>
1559
- </div>
1560
- <div class="settings-item" title="Show ultracode / Workflow runs as a master-detail tab (tasks on the left, agents with tokens + tool calls on the right)">
1561
- <span class="settings-item-label">Ultracode Agents</span>
1562
- <label class="switch switch-sm">
1563
- <input type="checkbox" id="appSettingsShowUltracodeAgents">
1564
- <span class="slider"></span>
1565
- </label>
1566
- </div>
1567
- <div class="settings-item" title="Pop a floating window for each active ultracode / Workflow run, connected by a line to its session tab (additional to the Ultracode Agents panel)">
1568
- <span class="settings-item-label">Ultracode Floating Windows</span>
1569
- <label class="switch switch-sm">
1570
- <input type="checkbox" id="appSettingsUltracodeFloatingWindows">
1571
- <span class="slider"></span>
1572
- </label>
1655
+ <div class="set-group set-group-advanced" id="appSettingsTaskRouting">
1656
+ <div class="set-group-head set-group-head-toggle" role="button" tabindex="0" aria-expanded="false">
1657
+ <h4>Task routing</h4>
1658
+ <span class="set-scope">synced</span>
1659
+ <span class="set-adv">Advanced
1660
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
1661
+ </span>
1662
+ </div>
1663
+ <p class="set-group-hint">Models for orchestrator and background work. Leave on the default unless you are tuning cost.</p>
1664
+ <div class="set-group-body">
1665
+ <div class="set-row has-field" data-search="default model tasks orchestrator">
1666
+ <div class="set-row-text">
1667
+ <span class="set-row-label">Default for tasks</span>
1668
+ <span class="set-row-desc">Used for execution tasks. Optimizer suggestions stay advisory.</span>
1669
+ </div>
1670
+ <select id="appSettingsDefaultModel" class="set-select">
1671
+ <option value="">Default (CLI default)</option>
1672
+ <option value="claude-fable-5">Fable 5 (Most powerful)</option>
1673
+ <option value="opus">Opus (Most capable)</option>
1674
+ <option value="sonnet">Sonnet (Balanced)</option>
1675
+ <option value="haiku">Haiku (Fast &amp; cheap)</option>
1676
+ </select>
1677
+ </div>
1678
+ <div class="set-minigrid" data-search="explore implement test review agent type overrides">
1679
+ <div class="set-mini">
1680
+ <span class="set-mini-label">Explore</span>
1681
+ <select id="appSettingsModelExplore" class="set-select">
1682
+ <option value="">Use default</option>
1683
+ <option value="haiku">Haiku</option>
1684
+ <option value="sonnet">Sonnet</option>
1685
+ <option value="opus">Opus</option>
1686
+ <option value="claude-fable-5">Fable 5</option>
1687
+ </select>
1688
+ </div>
1689
+ <div class="set-mini">
1690
+ <span class="set-mini-label">Implement</span>
1691
+ <select id="appSettingsModelImplement" class="set-select">
1692
+ <option value="">Use default</option>
1693
+ <option value="haiku">Haiku</option>
1694
+ <option value="sonnet">Sonnet</option>
1695
+ <option value="opus">Opus</option>
1696
+ <option value="claude-fable-5">Fable 5</option>
1697
+ </select>
1698
+ </div>
1699
+ <div class="set-mini">
1700
+ <span class="set-mini-label">Test</span>
1701
+ <select id="appSettingsModelTest" class="set-select">
1702
+ <option value="">Use default</option>
1703
+ <option value="haiku">Haiku</option>
1704
+ <option value="sonnet">Sonnet</option>
1705
+ <option value="opus">Opus</option>
1706
+ <option value="claude-fable-5">Fable 5</option>
1707
+ </select>
1708
+ </div>
1709
+ <div class="set-mini">
1710
+ <span class="set-mini-label">Review</span>
1711
+ <select id="appSettingsModelReview" class="set-select">
1712
+ <option value="">Use default</option>
1713
+ <option value="haiku">Haiku</option>
1714
+ <option value="sonnet">Sonnet</option>
1715
+ <option value="opus">Opus</option>
1716
+ <option value="claude-fable-5">Fable 5</option>
1717
+ </select>
1718
+ </div>
1719
+ </div>
1720
+ <div class="set-row" data-search="optimizer recommendations advisory">
1721
+ <div class="set-row-text">
1722
+ <span class="set-row-label">Show optimizer recommendations</span>
1723
+ <span class="set-row-desc">Advisory only. Never overrides your choice.</span>
1724
+ </div>
1725
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsShowModelRecommendations" checked><span class="slider"></span></label>
1726
+ </div>
1727
+ </div>
1573
1728
  </div>
1729
+ </section>
1574
1730
 
1575
- <!-- Subagent Options Section -->
1576
- <div class="settings-section-header">Subagent Options</div>
1577
- <div class="settings-item" title="Monitor Claude Code background agents in real-time">
1578
- <span class="settings-item-label">Enable Tracking</span>
1579
- <label class="switch switch-sm">
1580
- <input type="checkbox" id="appSettingsSubagentTracking" checked>
1581
- <span class="slider"></span>
1582
- </label>
1583
- </div>
1584
- <div class="settings-item" title="Only show subagent windows when their parent tab is selected">
1585
- <span class="settings-item-label">Active Tab Only</span>
1586
- <label class="switch switch-sm">
1587
- <input type="checkbox" id="appSettingsSubagentActiveTabOnly" checked>
1588
- <span class="slider"></span>
1589
- </label>
1731
+ <!-- ══ Agents &amp; CLIs ═════════════════════════════════════════ -->
1732
+ <section class="set-section" id="settings-clis" data-label="Agents &amp; CLIs">
1733
+ <div class="set-section-head">
1734
+ <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="M8 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h2"/><path d="M16 3h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-2"/><circle cx="12" cy="12" r="2.5"/></svg>
1735
+ <h2>Agents &amp; CLIs</h2>
1590
1736
  </div>
1737
+ <p class="set-section-blurb">Launch flags for the CLIs Codeman spawns.</p>
1591
1738
 
1592
- <!-- Image Watcher Options Section -->
1593
- <div class="settings-section-header">Image Watcher</div>
1594
- <div class="settings-item" title="Automatically detect and popup new images in session directories">
1595
- <span class="settings-item-label">Enable Globally</span>
1596
- <label class="switch switch-sm">
1597
- <input type="checkbox" id="appSettingsImageWatcherEnabled">
1598
- <span class="slider"></span>
1599
- </label>
1739
+ <div class="set-group">
1740
+ <div class="set-group-head"><h4>Claude</h4><span class="set-scope">synced</span></div>
1741
+ <div class="set-group-body">
1742
+ <div class="set-row has-field" data-search="startup mode permissions auto allowed tools">
1743
+ <div class="set-row-text">
1744
+ <span class="set-row-label">Startup Mode</span>
1745
+ <span class="set-row-desc">How the CLI is launched in new sessions. Auto Mode runs without routine prompts behind a background safety classifier.</span>
1746
+ </div>
1747
+ <select id="appSettingsClaudeMode" class="set-select">
1748
+ <option value="dangerously-skip-permissions">Skip Permissions (default)</option>
1749
+ <option value="auto">Auto (classifier-guarded, low prompts)</option>
1750
+ <option value="normal">Normal (with prompts)</option>
1751
+ <option value="allowedTools">Allowed Tools Only</option>
1752
+ </select>
1753
+ </div>
1754
+ <div class="set-row has-field" id="allowedToolsRow" style="display: none;" data-search="allowed tools list">
1755
+ <div class="set-row-text">
1756
+ <span class="set-row-label">Allowed Tools</span>
1757
+ <span class="set-row-desc">Comma-separated list of tools to allow.</span>
1758
+ </div>
1759
+ <input type="text" id="appSettingsAllowedTools" class="set-input" placeholder="Read,Glob,Grep,Bash">
1760
+ </div>
1761
+ <div class="set-row" data-search="ralph todo tracker loop">
1762
+ <div class="set-row-text">
1763
+ <span class="set-row-label">Ralph / Todo Tracker</span>
1764
+ <span class="set-row-desc">Auto-enable for new sessions. Otherwise it enables itself on Ralph pattern detection.</span>
1765
+ </div>
1766
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsRalphEnabled"><span class="slider"></span></label>
1767
+ </div>
1768
+ <div class="set-row" data-search="agent teams experimental">
1769
+ <div class="set-row-text">
1770
+ <span class="set-row-label">Agent Teams</span>
1771
+ <span class="set-row-desc">Experimental multi-agent teams for all new Claude sessions.</span>
1772
+ </div>
1773
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsAgentTeams"><span class="slider"></span></label>
1774
+ </div>
1775
+ <div class="set-row" data-search="agent skill codeman api workers">
1776
+ <div class="set-row-text">
1777
+ <span class="set-row-label">Codeman Agent Skill</span>
1778
+ <span class="set-row-desc">Let new sessions start workers, send prompts and wait for results over the API.</span>
1779
+ </div>
1780
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsAgentSkill"><span class="slider"></span></label>
1781
+ </div>
1782
+ <div class="set-row" data-search="remote auto reconnect ssh">
1783
+ <div class="set-row-text">
1784
+ <span class="set-row-label">Remote auto-reconnect</span>
1785
+ <span class="set-row-desc">Reattach remote SSH sessions to their durable tmux after a dropped link.</span>
1786
+ </div>
1787
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsRemoteAutoReconnect"><span class="slider"></span></label>
1788
+ </div>
1789
+ <div class="set-row" data-search="nice priority cpu">
1790
+ <div class="set-row-text">
1791
+ <span class="set-row-label">Nice priority</span>
1792
+ <span class="set-row-desc">Lower the CPU priority of new sessions to reduce system impact.</span>
1793
+ </div>
1794
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsNiceEnabled"><span class="slider"></span></label>
1795
+ </div>
1796
+ <div class="set-row" id="niceValueRow" data-search="nice value priority number">
1797
+ <div class="set-row-text">
1798
+ <span class="set-row-label">Nice value</span>
1799
+ <span class="set-row-desc">-20 to 19. Higher means lower priority. Default 10.</span>
1800
+ </div>
1801
+ <input type="number" id="appSettingsNiceValue" class="set-num" min="-20" max="19" value="10">
1802
+ </div>
1803
+ </div>
1600
1804
  </div>
1601
1805
 
1602
- <!-- Remote Access Section -->
1603
- <div class="settings-section-header">Remote Access</div>
1604
- <div class="settings-item" title="Expose Codeman via Cloudflare Tunnel for remote access">
1605
- <span class="settings-item-label">Cloudflare Tunnel</span>
1606
- <label class="switch switch-sm">
1607
- <input type="checkbox" id="appSettingsTunnelEnabled">
1608
- <span class="slider"></span>
1609
- </label>
1610
- </div>
1611
- <div class="settings-item" id="tunnelUrlRow" style="display:none">
1612
- <span class="settings-item-label">Tunnel URL</span>
1613
- <div style="display:flex; align-items:center; gap:8px">
1614
- <span id="tunnelUrlDisplay" class="settings-item-value" style="cursor:pointer; text-decoration:underline; font-family:monospace; font-size:12px" title="Click to copy"></span>
1615
- <button class="btn-icon-sm" id="tunnelQrBtn" onclick="app.showTunnelQR()" title="Show QR code" style="font-size:16px; padding:2px 6px; background:none; border:1px solid var(--border); border-radius:4px; cursor:pointer; color:var(--text-secondary)">⊞</button>
1806
+ <div class="set-group" id="appSettingsCodexGroup">
1807
+ <div class="set-group-head"><h4>Codex</h4><span class="set-scope">synced</span></div>
1808
+ <div class="set-group-body">
1809
+ <div class="set-row" data-search="codex bypass approvals sandbox">
1810
+ <div class="set-row-text">
1811
+ <span class="set-row-label">Bypass approvals and sandbox</span>
1812
+ <span class="set-row-desc">Start new Codex sessions with --dangerously-bypass-approvals-and-sandbox.</span>
1813
+ </div>
1814
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsCodexDangerouslyBypassApprovals"><span class="slider"></span></label>
1815
+ </div>
1816
+ <div class="set-row" data-search="codex animations status effects">
1817
+ <div class="set-row-text">
1818
+ <span class="set-row-label">Animated status effects</span>
1819
+ <span class="set-row-desc">Decorative Codex TUI motion. Leave off to reduce remote and mobile redraws.</span>
1820
+ </div>
1821
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsCodexAnimations"><span class="slider"></span></label>
1822
+ </div>
1616
1823
  </div>
1617
1824
  </div>
1618
- <div class="settings-item" id="tunnelUploadUrlRow" style="display:none">
1619
- <span class="settings-item-label">Upload URL</span>
1620
- <span id="tunnelUploadUrlDisplay" class="settings-item-value" style="cursor:pointer; text-decoration:underline; font-family:monospace; font-size:12px" title="Click to copy"></span>
1825
+ </section>
1826
+
1827
+ <!-- ══ Notifications ════════════════════════════════════════════ -->
1828
+ <section class="set-section" id="settings-notifications" data-label="Notifications">
1829
+ <div class="set-section-head">
1830
+ <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="M18 8a6 6 0 1 0-12 0c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.7 21a2 2 0 0 1-3.4 0"/></svg>
1831
+ <h2>Notifications</h2>
1621
1832
  </div>
1833
+ <p class="set-section-blurb">What reaches you, and on which channel.</p>
1622
1834
 
1623
- <!-- Updates Section -->
1624
- <div class="settings-section-header">Updates</div>
1625
- <div class="settings-item" title="Codeman version currently running">
1626
- <span class="settings-item-label">Current Version</span>
1627
- <span class="settings-item-value" id="updateCurrentVersion" style="font-family:monospace">&mdash;</span>
1835
+ <div class="set-group">
1836
+ <div class="set-group-head"><h4>Channels</h4><span class="set-scope">device</span></div>
1837
+ <div class="set-group-body">
1838
+ <div class="set-row" data-search="enable notifications master">
1839
+ <div class="set-row-text">
1840
+ <span class="set-row-label">Notifications</span>
1841
+ <span class="set-row-desc">Master switch for every layer below.</span>
1842
+ </div>
1843
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsNotifEnabled" checked><span class="slider"></span></label>
1844
+ </div>
1845
+ <div class="set-row" data-search="browser notifications os permission">
1846
+ <div class="set-row-text">
1847
+ <span class="set-row-label">Browser</span>
1848
+ <span class="set-row-desc">OS notifications while the tab is hidden. Remote access needs HTTPS: codeman web --https</span>
1849
+ </div>
1850
+ <div class="set-row-actions">
1851
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsNotifBrowser"><span class="slider"></span></label>
1852
+ <button class="btn-toolbar btn-sm" onclick="app.notificationManager?.requestPermission()" title="Request browser notification permission">Ask</button>
1853
+ <span class="settings-status" id="notifPermissionStatus">?</span>
1854
+ </div>
1855
+ </div>
1856
+ <div class="set-row" data-search="push notifications subscribe pwa">
1857
+ <div class="set-row-text">
1858
+ <span class="set-row-label">Push</span>
1859
+ <span class="set-row-desc">Works with the tab closed, and through a Cloudflare tunnel. Requires HTTPS or localhost; iOS requires the PWA.</span>
1860
+ </div>
1861
+ <div class="set-row-actions">
1862
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsPushEnabled"><span class="slider"></span></label>
1863
+ <button class="btn-toolbar btn-sm" id="pushSubscribeBtn" onclick="app.togglePushSubscription()" title="Subscribe or unsubscribe to push notifications">Subscribe</button>
1864
+ <span class="settings-status" id="pushSubscriptionStatus">off</span>
1865
+ </div>
1866
+ </div>
1867
+ <div class="set-row" data-search="audio alerts beep sound">
1868
+ <div class="set-row-text">
1869
+ <span class="set-row-label">Audio alerts</span>
1870
+ <span class="set-row-desc">Short beep on critical events.</span>
1871
+ </div>
1872
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsNotifAudio"><span class="slider"></span></label>
1873
+ </div>
1874
+ <div class="set-row" data-search="idle threshold stuck minutes">
1875
+ <div class="set-row-text">
1876
+ <span class="set-row-label">Idle threshold</span>
1877
+ <span class="set-row-desc">Notify when a session sits idle longer than this.</span>
1878
+ </div>
1879
+ <div class="set-row-actions">
1880
+ <input type="number" id="appSettingsNotifStuckMins" class="set-num" value="10" min="1" max="120">
1881
+ <span class="set-unit">min</span>
1882
+ </div>
1883
+ </div>
1884
+ </div>
1628
1885
  </div>
1629
- <div class="settings-item" id="updateCheckRow" title="Check GitHub for a newer Codeman release">
1630
- <span class="settings-item-label">Check for Updates</span>
1631
- <button class="btn-toolbar btn-sm" id="updateCheckBtn" onclick="app.checkForUpdate()">Check now</button>
1886
+
1887
+ <div class="set-group">
1888
+ <div class="set-group-head"><h4>Levels</h4><span class="set-scope">device</span></div>
1889
+ <div class="set-group-body">
1890
+ <div class="set-chips" data-search="critical warning info levels">
1891
+ <label class="set-chip"><input type="checkbox" id="appSettingsNotifCritical" checked><span>Critical</span></label>
1892
+ <label class="set-chip"><input type="checkbox" id="appSettingsNotifWarning" checked><span>Warning</span></label>
1893
+ <label class="set-chip"><input type="checkbox" id="appSettingsNotifInfo" checked><span>Info</span></label>
1894
+ </div>
1895
+ </div>
1632
1896
  </div>
1633
- <div id="updateResult" style="display:none; padding:4px 2px 8px; font-size:13px; color:var(--text-secondary)"></div>
1634
- <div class="settings-item" id="updateActionRow" style="display:none">
1635
- <span class="settings-item-label" id="updateActionLabel">Update available</span>
1636
- <button class="btn-toolbar btn-sm btn-primary" id="updateNowBtn" onclick="app.startSelfUpdate()">Update now</button>
1897
+
1898
+ <div class="set-group">
1899
+ <div class="set-group-head"><h4>Per event</h4><span class="set-scope">device</span></div>
1900
+ <div class="set-group-body">
1901
+ <div class="event-type-grid" data-search="per event permission question idle response respawn task subagent">
1902
+ <div class="event-header">Event</div>
1903
+ <div class="event-header">On</div>
1904
+ <div class="event-header">Browser</div>
1905
+ <div class="event-header">Push</div>
1906
+ <div class="event-header">Sound</div>
1907
+
1908
+ <div class="event-label">Permission prompts</div>
1909
+ <input type="checkbox" id="eventPermissionEnabled" checked>
1910
+ <input type="checkbox" id="eventPermissionBrowser" checked>
1911
+ <input type="checkbox" id="eventPermissionPush" checked>
1912
+ <input type="checkbox" id="eventPermissionAudio" checked>
1913
+
1914
+ <div class="event-label">Questions from Claude</div>
1915
+ <input type="checkbox" id="eventQuestionEnabled" checked>
1916
+ <input type="checkbox" id="eventQuestionBrowser" checked>
1917
+ <input type="checkbox" id="eventQuestionPush" checked>
1918
+ <input type="checkbox" id="eventQuestionAudio" checked>
1919
+
1920
+ <div class="event-label">Session idle</div>
1921
+ <input type="checkbox" id="eventIdleEnabled" checked>
1922
+ <input type="checkbox" id="eventIdleBrowser" checked>
1923
+ <input type="checkbox" id="eventIdlePush">
1924
+ <input type="checkbox" id="eventIdleAudio">
1925
+
1926
+ <div class="event-label">Response complete</div>
1927
+ <input type="checkbox" id="eventStopEnabled">
1928
+ <input type="checkbox" id="eventStopBrowser">
1929
+ <input type="checkbox" id="eventStopPush">
1930
+ <input type="checkbox" id="eventStopAudio">
1931
+
1932
+ <div class="event-label">Respawn cycles</div>
1933
+ <input type="checkbox" id="eventRespawnEnabled" checked>
1934
+ <input type="checkbox" id="eventRespawnBrowser">
1935
+ <input type="checkbox" id="eventRespawnPush">
1936
+ <input type="checkbox" id="eventRespawnAudio">
1937
+
1938
+ <div class="event-label">Task complete</div>
1939
+ <input type="checkbox" id="eventRalphEnabled" checked>
1940
+ <input type="checkbox" id="eventRalphBrowser" checked>
1941
+ <input type="checkbox" id="eventRalphPush">
1942
+ <input type="checkbox" id="eventRalphAudio" checked>
1943
+
1944
+ <div class="event-label">Subagent activity</div>
1945
+ <input type="checkbox" id="eventSubagentEnabled">
1946
+ <input type="checkbox" id="eventSubagentBrowser">
1947
+ <input type="checkbox" id="eventSubagentPush">
1948
+ <input type="checkbox" id="eventSubagentAudio">
1949
+ </div>
1950
+ </div>
1637
1951
  </div>
1638
- <div id="updateNotes" style="display:none; max-height:160px; overflow:auto; padding:8px 10px; margin:4px 0 8px; font-size:12px; line-height:1.45; white-space:pre-wrap; word-break:break-word; background:rgba(127,127,127,0.08); border:1px solid var(--border); border-radius:6px"></div>
1639
- <div id="updateProgress" style="display:none; padding:8px 10px; margin:4px 0 8px; font-size:13px; border:1px solid var(--border); border-radius:6px"></div>
1952
+ </section>
1640
1953
 
1641
- </div>
1642
- </div>
1643
- <!-- Tab-Switch Tab -->
1644
- <!-- Claude CLI Tab -->
1645
- <div class="modal-tab-content hidden" id="settings-claude">
1646
- <div class="form-row">
1647
- <label>Startup Mode</label>
1648
- <select id="appSettingsClaudeMode" class="form-select">
1649
- <option value="dangerously-skip-permissions">Skip Permissions (default)</option>
1650
- <option value="auto">Auto (classifier-guarded, low prompts)</option>
1651
- <option value="normal">Normal (with prompts)</option>
1652
- <option value="allowedTools">Allowed Tools Only</option>
1653
- </select>
1654
- <span class="form-hint">How Claude CLI is started in screen sessions. Auto Mode runs without routine prompts behind a background safety classifier (needs Claude Code 2.1.207+ and Opus 4.6+/Sonnet 4.6+/Fable 5)</span>
1655
- </div>
1656
- <div class="form-row" id="allowedToolsRow" style="display: none;">
1657
- <label>Allowed Tools</label>
1658
- <input type="text" id="appSettingsAllowedTools" placeholder="Read,Glob,Grep,Bash">
1659
- <span class="form-hint">Comma-separated list of tools to allow</span>
1660
- </div>
1661
- <div class="form-row form-row-switch">
1662
- <label>Enable Ralph / Todo Tracker</label>
1663
- <label class="switch">
1664
- <input type="checkbox" id="appSettingsRalphEnabled">
1665
- <span class="slider"></span>
1666
- </label>
1667
- <span class="form-hint">Auto-enable for new sessions (otherwise auto-enables on Ralph pattern detection)</span>
1668
- </div>
1669
- <!-- Claude Permissions Section -->
1670
- <div class="form-section-header">Claude Permissions</div>
1671
- <div class="form-row form-row-switch">
1672
- <label>Agent Teams</label>
1673
- <label class="switch">
1674
- <input type="checkbox" id="appSettingsAgentTeams">
1675
- <span class="slider"></span>
1676
- </label>
1677
- <span class="form-hint">Enable experimental Agent Teams for all new Claude sessions (disabled by default)</span>
1678
- </div>
1679
- <div class="form-row form-row-switch">
1680
- <label>Agent Skill</label>
1681
- <label class="switch">
1682
- <input type="checkbox" id="appSettingsAgentSkill">
1683
- <span class="slider"></span>
1684
- </label>
1685
- <span class="form-hint">Give new Claude sessions the Codeman skill (start workers, send prompts, wait for results via the API)</span>
1686
- </div>
1687
- <div class="form-row">
1688
- <label>Claude Model</label>
1689
- <select id="appSettingsClaudeModel" class="form-select">
1690
- <option value="">Default (CLI setting)</option>
1691
- <option value="claude-fable-5[1m]">Fable 5 (1M context)</option>
1692
- <option value="claude-fable-5">Fable 5</option>
1693
- <option value="opus[1m]">Opus (1M context)</option>
1694
- <option value="opus">Opus</option>
1695
- <option value="claude-opus-4-6[1m]">Opus 4.6 (1M context)</option>
1696
- <option value="claude-opus-4-6">Opus 4.6</option>
1697
- <option value="sonnet">Sonnet</option>
1698
- <option value="haiku">Haiku</option>
1699
- </select>
1700
- <span class="form-hint">Model for new Claude sessions (pinned via the case's .claude/settings.local.json) — takes precedence over the 1M Opus toggle below</span>
1701
- </div>
1702
- <div class="form-row form-row-switch">
1703
- <label>1M Opus Context</label>
1704
- <label class="switch">
1705
- <input type="checkbox" id="appSettingsOpusContext1m">
1706
- <span class="slider"></span>
1707
- </label>
1708
- <span class="form-hint">Use 1M token context window (model: opus[1m]) for all new sessions — ignored when a Claude Model is selected above</span>
1709
- </div>
1710
- <div class="form-row form-row-switch">
1711
- <label>Remote auto-reconnect</label>
1712
- <label class="switch">
1713
- <input type="checkbox" id="appSettingsRemoteAutoReconnect">
1714
- <span class="slider"></span>
1715
- </label>
1716
- <span class="form-hint">Automatically re-establish remote (SSH) sessions when the connection drops, reattaching to the durable remote tmux session (on by default; bounded backoff)</span>
1717
- </div>
1718
- <div class="form-row">
1719
- <label>Thinking Effort</label>
1720
- <select id="appSettingsThinkingEffort" class="form-select">
1721
- <option value="">Default</option>
1722
- <option value="low">Low</option>
1723
- <option value="medium">Medium</option>
1724
- <option value="high">High</option>
1725
- <option value="xhigh">XHigh</option>
1726
- <option value="max">Max</option>
1727
- <option value="ultracode">Ultracode (multi-agent workflows)</option>
1728
- </select>
1729
- <span class="form-hint">Default effort for new Claude sessions — soft default, switchable anytime in-session via /effort (e.g. /effort ultracode)</span>
1730
- </div>
1731
- <!-- Nice Priority Section -->
1732
- <div class="form-section-header">Nice Priority</div>
1733
- <div class="form-row form-row-switch">
1734
- <label>Enable Nice Priority Reduction</label>
1735
- <label class="switch">
1736
- <input type="checkbox" id="appSettingsNiceEnabled">
1737
- <span class="slider"></span>
1738
- </label>
1739
- <span class="form-hint">Lower priority of Claude sessions (reduces system impact, only affects new sessions)</span>
1740
- </div>
1741
- <div class="form-row" id="niceValueRow">
1742
- <label>Nice Value</label>
1743
- <input type="number" id="appSettingsNiceValue" min="-20" max="19" value="10" style="width: 80px;">
1744
- <span class="form-hint">Process priority (-20 to 19, higher = lower priority, default: 10)</span>
1745
- </div>
1746
- </div>
1747
- <!-- Codex CLI Tab -->
1748
- <div class="modal-tab-content hidden" id="settings-codex">
1749
- <div class="form-section-header">Codex CLI</div>
1750
- <div class="form-row form-row-switch">
1751
- <label>Bypass Approvals and Sandbox</label>
1752
- <label class="switch">
1753
- <input type="checkbox" id="appSettingsCodexDangerouslyBypassApprovals">
1754
- <span class="slider"></span>
1755
- </label>
1756
- <span class="form-hint">Start new Codex sessions with --dangerously-bypass-approvals-and-sandbox</span>
1757
- </div>
1758
- <div class="form-row form-row-switch">
1759
- <label>Animated Status Effects</label>
1760
- <label class="switch">
1761
- <input type="checkbox" id="appSettingsCodexAnimations">
1762
- <span class="slider"></span>
1763
- </label>
1764
- <span class="form-hint">Decorative Codex TUI motion for new local sessions. Leave off to reduce remote and mobile redraws.</span>
1765
- </div>
1766
- </div>
1767
- <!-- Models Tab -->
1768
- <div class="modal-tab-content hidden" id="settings-models">
1769
- <div class="form-row">
1770
- <label>Default Model</label>
1771
- <select id="appSettingsDefaultModel" class="form-select">
1772
- <option value="">Default (CLI default)</option>
1773
- <option value="claude-fable-5">Fable 5 (Most powerful)</option>
1774
- <option value="opus">Opus (Most capable)</option>
1775
- <option value="sonnet">Sonnet (Balanced)</option>
1776
- <option value="haiku">Haiku (Fast & cheap)</option>
1777
- </select>
1778
- <span class="form-hint">Model used for execution tasks. Optimizer suggestions are advisory only.</span>
1779
- </div>
1780
- <div class="form-row form-row-switch">
1781
- <label>Show Optimizer Recommendations</label>
1782
- <label class="switch">
1783
- <input type="checkbox" id="appSettingsShowModelRecommendations" checked>
1784
- <span class="slider"></span>
1785
- </label>
1786
- <span class="form-hint">Show what the optimizer recommends (doesn't override your choice)</span>
1787
- </div>
1788
- <div class="form-section-header">Agent Type Overrides</div>
1789
- <p class="form-hint" style="margin: 0 0 12px 0;">Optionally set specific models for each task type. Leave as "Use Default" to use your default model.</p>
1790
- <div class="form-row">
1791
- <label>Explore Tasks</label>
1792
- <select id="appSettingsModelExplore" class="form-select">
1793
- <option value="">Use Default</option>
1794
- <option value="haiku">Haiku</option>
1795
- <option value="sonnet">Sonnet</option>
1796
- <option value="opus">Opus</option>
1797
- <option value="claude-fable-5">Fable 5</option>
1798
- </select>
1799
- <span class="form-hint">Quick searches, codebase exploration</span>
1800
- </div>
1801
- <div class="form-row">
1802
- <label>Implement Tasks</label>
1803
- <select id="appSettingsModelImplement" class="form-select">
1804
- <option value="">Use Default</option>
1805
- <option value="haiku">Haiku</option>
1806
- <option value="sonnet">Sonnet</option>
1807
- <option value="opus">Opus</option>
1808
- <option value="claude-fable-5">Fable 5</option>
1809
- </select>
1810
- <span class="form-hint">Code writing, feature implementation</span>
1811
- </div>
1812
- <div class="form-row">
1813
- <label>Test Tasks</label>
1814
- <select id="appSettingsModelTest" class="form-select">
1815
- <option value="">Use Default</option>
1816
- <option value="haiku">Haiku</option>
1817
- <option value="sonnet">Sonnet</option>
1818
- <option value="opus">Opus</option>
1819
- <option value="claude-fable-5">Fable 5</option>
1820
- </select>
1821
- <span class="form-hint">Writing and running tests</span>
1822
- </div>
1823
- <div class="form-row">
1824
- <label>Review Tasks</label>
1825
- <select id="appSettingsModelReview" class="form-select">
1826
- <option value="">Use Default</option>
1827
- <option value="haiku">Haiku</option>
1828
- <option value="sonnet">Sonnet</option>
1829
- <option value="opus">Opus</option>
1830
- <option value="claude-fable-5">Fable 5</option>
1831
- </select>
1832
- <span class="form-hint">Code review, quality checks</span>
1833
- </div>
1834
- </div>
1835
- <!-- Paths Tab -->
1836
- <div class="modal-tab-content hidden" id="settings-paths">
1837
- <div class="form-row">
1838
- <label>Default CLAUDE.md Template</label>
1839
- <input type="text" id="appSettingsClaudeMdPath" placeholder="/path/to/CLAUDE.md template">
1840
- <span class="form-hint">Used when creating new cases. Leave empty for built-in template.</span>
1841
- </div>
1842
- <div class="form-row">
1843
- <label>Default Working Directory</label>
1844
- <input type="text" id="appSettingsDefaultDir" placeholder="~/projects">
1845
- <span class="form-hint">Default directory for new sessions.</span>
1846
- </div>
1847
- </div>
1848
- <!-- Notifications Tab -->
1849
- <div class="modal-tab-content hidden" id="settings-notifications">
1850
- <div class="settings-grid">
1851
- <!-- Master Control Section -->
1852
- <div class="settings-section-header">Master Control</div>
1853
- <div class="settings-item" title="Master toggle for all notification layers">
1854
- <span class="settings-item-label">Enable Notifications</span>
1855
- <label class="switch switch-sm">
1856
- <input type="checkbox" id="appSettingsNotifEnabled" checked>
1857
- <span class="slider"></span>
1858
- </label>
1954
+ <!-- ══ Voice ════════════════════════════════════════════════════ -->
1955
+ <section class="set-section" id="settings-voice" data-label="Voice">
1956
+ <div class="set-section-head">
1957
+ <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="9" y="2" width="6" height="12" rx="3"/><path d="M5 11a7 7 0 0 0 14 0"/><path d="M12 18v4"/></svg>
1958
+ <h2>Voice</h2>
1859
1959
  </div>
1860
- <div class="settings-item" title="Show OS-level notifications when tab is hidden">
1861
- <span class="settings-item-label">Browser</span>
1862
- <div class="settings-item-actions">
1863
- <label class="switch switch-sm">
1864
- <input type="checkbox" id="appSettingsNotifBrowser">
1865
- <span class="slider"></span>
1866
- </label>
1867
- <button class="btn-toolbar btn-sm" onclick="app.notificationManager?.requestPermission()" title="Request browser notification permission">Ask</button>
1868
- <span class="settings-status" id="notifPermissionStatus">?</span>
1960
+ <p class="set-section-blurb">Dictation into the composer.</p>
1961
+
1962
+ <div class="set-group">
1963
+ <div class="set-group-head"><h4>Provider</h4><span class="set-scope">device</span></div>
1964
+ <div class="set-group-body">
1965
+ <div class="set-row" data-search="voice provider active">
1966
+ <div class="set-row-text"><span class="set-row-label">Active provider</span></div>
1967
+ <span class="voice-provider-status" id="voiceProviderStatus">&mdash;</span>
1968
+ </div>
1969
+ <div class="set-row has-field" data-search="voice insert mode compose">
1970
+ <div class="set-row-text">
1971
+ <span class="set-row-label">Insert mode</span>
1972
+ <span class="set-row-desc">Where dictated text lands.</span>
1973
+ </div>
1974
+ <select id="voiceInsertMode" class="set-select">
1975
+ <option value="direct">Direct to input</option>
1976
+ <option value="compose">Compose dialog</option>
1977
+ </select>
1978
+ </div>
1869
1979
  </div>
1870
1980
  </div>
1871
- <span class="form-hint" style="grid-column: 1 / -1; margin-top: -8px;">For remote access, HTTPS is required. Start with: <code>codeman web --https</code></span>
1872
1981
 
1873
- <div class="settings-item" title="OS-level push notifications — works even when tab is closed">
1874
- <span class="settings-item-label">Push</span>
1875
- <div class="settings-item-actions">
1876
- <label class="switch switch-sm">
1877
- <input type="checkbox" id="appSettingsPushEnabled">
1878
- <span class="slider"></span>
1879
- </label>
1880
- <button class="btn-toolbar btn-sm" id="pushSubscribeBtn" onclick="app.togglePushSubscription()" title="Subscribe/unsubscribe to push notifications">Subscribe</button>
1881
- <span class="settings-status" id="pushSubscriptionStatus">off</span>
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">
1986
+ <div class="set-row-text">
1987
+ <span class="set-row-label">API key</span>
1988
+ <span class="set-row-desc">Stored on this device only, never sent to the server. Get a key at console.deepgram.com</span>
1989
+ </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
+ <select id="voiceLanguage" class="set-select">
1998
+ <option value="en-US">English (US)</option>
1999
+ <option value="en-GB">English (UK)</option>
2000
+ <option value="es">Spanish</option>
2001
+ <option value="fr">French</option>
2002
+ <option value="de">German</option>
2003
+ <option value="ja">Japanese</option>
2004
+ <option value="multi">Auto-detect (multi)</option>
2005
+ </select>
2006
+ </div>
2007
+ <div class="set-row has-field" data-search="voice keyterms domain keywords">
2008
+ <div class="set-row-text">
2009
+ <span class="set-row-label">Domain keywords</span>
2010
+ <span class="set-row-desc">Comma-separated terms to boost recognition accuracy.</span>
2011
+ </div>
2012
+ <input type="text" id="voiceKeyterms" class="set-input" placeholder="codeman, tmux, respawn, subagent">
2013
+ </div>
1882
2014
  </div>
1883
2015
  </div>
1884
- <span class="form-hint" style="grid-column: 1 / -1; margin-top: -8px;">Works through Cloudflare tunnel. Requires HTTPS or localhost. iOS requires PWA (Add to Home Screen).</span>
2016
+ </section>
1885
2017
 
1886
- <!-- Alerts Section -->
1887
- <div class="settings-section-header">Alerts</div>
1888
- <div class="settings-item" title="Play a short beep for critical events">
1889
- <span class="settings-item-label">Audio Alerts</span>
1890
- <label class="switch switch-sm">
1891
- <input type="checkbox" id="appSettingsNotifAudio">
1892
- <span class="slider"></span>
1893
- </label>
2018
+ <!-- ══ Shortcuts ════════════════════════════════════════════════ -->
2019
+ <section class="set-section" id="settings-shortcuts" data-label="Shortcuts">
2020
+ <div class="set-section-head">
2021
+ <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="2" y="5" width="20" height="14" rx="2"/><path d="M6 9h.01M10 9h.01M14 9h.01M18 9h.01M6 13h.01M18 13h.01M9 13h6"/></svg>
2022
+ <h2>Shortcuts</h2>
1894
2023
  </div>
1895
- <div class="settings-item" title="Notify when a session is idle longer than this">
1896
- <span class="settings-item-label">Idle Threshold</span>
1897
- <div class="settings-item-actions">
1898
- <input type="number" id="appSettingsNotifStuckMins" class="settings-item-input" value="10" min="1" max="120">
1899
- <span style="font-size: 0.65rem; color: var(--text-muted);">min</span>
2024
+ <p class="set-section-blurb">Click a binding to capture a new key combination.</p>
2025
+ <div class="set-group">
2026
+ <div class="set-group-head"><h4>Keyboard</h4><span class="set-scope">device</span></div>
2027
+ <div class="set-group-body">
2028
+ <div id="appSettingsShortcutsList" data-search="keyboard shortcuts bindings keys">
2029
+ <!-- Populated by app.renderShortcutSettingsList() -->
2030
+ </div>
1900
2031
  </div>
1901
2032
  </div>
2033
+ </section>
1902
2034
 
1903
- <!-- Notification Levels Section -->
1904
- <div class="settings-section-header">Notification Levels</div>
1905
- </div>
1906
- <div class="settings-grid settings-grid-3col">
1907
- <div class="settings-item" title="Errors, crashes, agent failures">
1908
- <span class="settings-item-label">Critical</span>
1909
- <label class="switch switch-sm">
1910
- <input type="checkbox" id="appSettingsNotifCritical" checked>
1911
- <span class="slider"></span>
1912
- </label>
2035
+ <!-- ══ System ═══════════════════════════════════════════════════ -->
2036
+ <section class="set-section" id="settings-system" data-label="System">
2037
+ <div class="set-section-head">
2038
+ <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
+ <h2>System</h2>
1913
2040
  </div>
1914
- <div class="settings-item" title="Completions, budget warnings, stuck sessions">
1915
- <span class="settings-item-label">Warning</span>
1916
- <label class="switch switch-sm">
1917
- <input type="checkbox" id="appSettingsNotifWarning" checked>
1918
- <span class="slider"></span>
1919
- </label>
1920
- </div>
1921
- <div class="settings-item" title="Auto-accepts, auto-clears, agent completions">
1922
- <span class="settings-item-label">Info</span>
1923
- <label class="switch switch-sm">
1924
- <input type="checkbox" id="appSettingsNotifInfo" checked>
1925
- <span class="slider"></span>
1926
- </label>
1927
- </div>
1928
- </div>
2041
+ <p class="set-section-blurb">Paths, automation, remote access and updates.</p>
1929
2042
 
1930
- <!-- Event Type Preferences -->
1931
- <div class="settings-grid" style="margin-top: 12px;">
1932
- <div class="settings-section-header">Per-Event Settings</div>
1933
- </div>
1934
- <div class="event-type-grid">
1935
- <div class="event-header">Event</div>
1936
- <div class="event-header">On</div>
1937
- <div class="event-header">Browser</div>
1938
- <div class="event-header">Push</div>
1939
- <div class="event-header">Sound</div>
1940
-
1941
- <div class="event-label">Permission prompts</div>
1942
- <input type="checkbox" id="eventPermissionEnabled" checked>
1943
- <input type="checkbox" id="eventPermissionBrowser" checked>
1944
- <input type="checkbox" id="eventPermissionPush" checked>
1945
- <input type="checkbox" id="eventPermissionAudio" checked>
1946
-
1947
- <div class="event-label">Questions from Claude</div>
1948
- <input type="checkbox" id="eventQuestionEnabled" checked>
1949
- <input type="checkbox" id="eventQuestionBrowser" checked>
1950
- <input type="checkbox" id="eventQuestionPush" checked>
1951
- <input type="checkbox" id="eventQuestionAudio" checked>
1952
-
1953
- <div class="event-label">Session idle</div>
1954
- <input type="checkbox" id="eventIdleEnabled" checked>
1955
- <input type="checkbox" id="eventIdleBrowser" checked>
1956
- <input type="checkbox" id="eventIdlePush">
1957
- <input type="checkbox" id="eventIdleAudio">
1958
-
1959
- <div class="event-label">Response complete</div>
1960
- <input type="checkbox" id="eventStopEnabled">
1961
- <input type="checkbox" id="eventStopBrowser">
1962
- <input type="checkbox" id="eventStopPush">
1963
- <input type="checkbox" id="eventStopAudio">
1964
-
1965
- <div class="event-label">Respawn cycles</div>
1966
- <input type="checkbox" id="eventRespawnEnabled" checked>
1967
- <input type="checkbox" id="eventRespawnBrowser">
1968
- <input type="checkbox" id="eventRespawnPush">
1969
- <input type="checkbox" id="eventRespawnAudio">
1970
-
1971
- <div class="event-label">Task complete</div>
1972
- <input type="checkbox" id="eventRalphEnabled" checked>
1973
- <input type="checkbox" id="eventRalphBrowser" checked>
1974
- <input type="checkbox" id="eventRalphPush">
1975
- <input type="checkbox" id="eventRalphAudio" checked>
1976
-
1977
- <div class="event-label">Subagent activity</div>
1978
- <input type="checkbox" id="eventSubagentEnabled">
1979
- <input type="checkbox" id="eventSubagentBrowser">
1980
- <input type="checkbox" id="eventSubagentPush">
1981
- <input type="checkbox" id="eventSubagentAudio">
1982
- </div>
1983
- </div>
1984
-
1985
- <!-- Voice Tab -->
1986
- <div class="modal-tab-content hidden" id="settings-voice">
1987
- <div class="settings-grid">
1988
- <div class="settings-section-header">Provider</div>
1989
- <div class="settings-item">
1990
- <span class="settings-item-label">Active Provider</span>
1991
- <span class="voice-provider-status" id="voiceProviderStatus">—</span>
1992
- </div>
1993
-
1994
- <div class="settings-section-header">Behavior</div>
1995
- <div class="settings-item" style="grid-column: 1 / -1;">
1996
- <span class="settings-item-label">Insert mode</span>
1997
- <select id="voiceInsertMode" class="form-select" style="width: auto;">
1998
- <option value="direct">Direct to input</option>
1999
- <option value="compose">Compose dialog</option>
2000
- </select>
2043
+ <div class="set-group">
2044
+ <div class="set-group-head"><h4>Paths</h4><span class="set-scope">synced</span></div>
2045
+ <div class="set-group-body">
2046
+ <div class="set-row has-field" data-search="claude.md template path new cases">
2047
+ <div class="set-row-text">
2048
+ <span class="set-row-label">CLAUDE.md template</span>
2049
+ <span class="set-row-desc">Used when creating new cases. Leave empty for the built-in template.</span>
2050
+ </div>
2051
+ <input type="text" id="appSettingsClaudeMdPath" class="set-input" placeholder="/path/to/CLAUDE.md template">
2052
+ </div>
2053
+ <div class="set-row has-field" data-search="default working directory">
2054
+ <div class="set-row-text">
2055
+ <span class="set-row-label">Default working directory</span>
2056
+ <span class="set-row-desc">Starting directory for new sessions.</span>
2057
+ </div>
2058
+ <input type="text" id="appSettingsDefaultDir" class="set-input" placeholder="~/projects">
2059
+ </div>
2060
+ </div>
2001
2061
  </div>
2002
2062
 
2003
- <div class="settings-section-header">Deepgram Nova-3</div>
2004
- <div class="form-row" style="grid-column: 1 / -1;">
2005
- <label for="voiceDeepgramKey">API Key</label>
2006
- <div style="display: flex; gap: 6px; align-items: center;">
2007
- <input type="password" id="voiceDeepgramKey" placeholder="Enter Deepgram API key" autocomplete="off" style="flex: 1; width: 100%; padding: 0.5rem 0.75rem; background: var(--bg-input); border: 1px solid var(--border); border-radius: 4px; color: var(--text); font-size: 0.8rem; font-family: inherit;">
2008
- <button class="btn-toolbar btn-sm" onclick="app.toggleDeepgramKeyVisibility()" id="voiceKeyToggleBtn" type="button">Show</button>
2063
+ <div class="set-group">
2064
+ <div class="set-group-head"><h4>Automation</h4><span class="set-scope">synced</span></div>
2065
+ <div class="set-group-body">
2066
+ <div class="set-row" data-search="image watcher popup screenshots">
2067
+ <div class="set-row-text">
2068
+ <span class="set-row-label">Image watcher</span>
2069
+ <span class="set-row-desc">Detect and pop up new images found in session directories.</span>
2070
+ </div>
2071
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsImageWatcherEnabled"><span class="slider"></span></label>
2072
+ </div>
2009
2073
  </div>
2010
- <span class="form-hint">Stored locally only, never sent to server. Get a key at <a href="https://console.deepgram.com" target="_blank" rel="noopener" style="color: var(--accent);">console.deepgram.com</a></span>
2011
- </div>
2012
-
2013
- <div class="form-row" style="grid-column: 1 / -1;">
2014
- <label for="voiceLanguage">Language</label>
2015
- <select id="voiceLanguage" class="form-select">
2016
- <option value="en-US">English (US)</option>
2017
- <option value="en-GB">English (UK)</option>
2018
- <option value="es">Spanish</option>
2019
- <option value="fr">French</option>
2020
- <option value="de">German</option>
2021
- <option value="ja">Japanese</option>
2022
- <option value="multi">Auto-detect (multi)</option>
2023
- </select>
2024
2074
  </div>
2025
2075
 
2026
- <div class="form-row" style="grid-column: 1 / -1;">
2027
- <label for="voiceKeyterms">Domain Keywords</label>
2028
- <input type="text" id="voiceKeyterms" placeholder="codeman, tmux, respawn, subagent" style="width: 100%; padding: 0.5rem 0.75rem; background: var(--bg-input); border: 1px solid var(--border); border-radius: 4px; color: var(--text); font-size: 0.8rem; font-family: inherit;">
2029
- <span class="form-hint">Comma-separated terms to boost recognition accuracy</span>
2076
+ <div class="set-group">
2077
+ <div class="set-group-head"><h4>Remote access</h4><span class="set-scope">synced</span></div>
2078
+ <div class="set-group-body">
2079
+ <div class="set-row" data-search="cloudflare tunnel remote access url">
2080
+ <div class="set-row-text">
2081
+ <span class="set-row-label">Cloudflare Tunnel</span>
2082
+ <span class="set-row-desc">Expose Codeman on a public URL. Set CODEMAN_PASSWORD first.</span>
2083
+ </div>
2084
+ <label class="switch switch-sm"><input type="checkbox" id="appSettingsTunnelEnabled"><span class="slider"></span></label>
2085
+ </div>
2086
+ <div class="set-row" id="tunnelUrlRow" style="display:none">
2087
+ <div class="set-row-text"><span class="set-row-label">Tunnel URL</span></div>
2088
+ <div class="set-row-actions">
2089
+ <span id="tunnelUrlDisplay" class="set-copy" title="Click to copy"></span>
2090
+ <button class="btn-icon-sm" id="tunnelQrBtn" onclick="app.showTunnelQR()" title="Show QR code">&#x229E;</button>
2091
+ </div>
2092
+ </div>
2093
+ <div class="set-row" id="tunnelUploadUrlRow" style="display:none">
2094
+ <div class="set-row-text"><span class="set-row-label">Upload URL</span></div>
2095
+ <span id="tunnelUploadUrlDisplay" class="set-copy" title="Click to copy"></span>
2096
+ </div>
2097
+ </div>
2030
2098
  </div>
2031
- </div>
2032
- </div>
2033
2099
 
2034
- <!-- Shortcuts tab -->
2035
- <div class="modal-tab-content hidden" id="settings-shortcuts">
2036
- <div class="settings-grid">
2037
- <div class="settings-section-header" style="grid-column: 1 / -1;">Keyboard Shortcuts</div>
2038
- <p class="form-hint" style="grid-column: 1 / -1; margin: 0 0 0.5rem;">
2039
- Customize keyboard shortcuts. Click the binding to capture a new key combination.
2040
- </p>
2041
- <div id="appSettingsShortcutsList" style="grid-column: 1 / -1;">
2042
- <!-- Populated by app.renderShortcutSettingsList() -->
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">&mdash;</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>
2043
2122
  </div>
2044
- </div>
2123
+ </section>
2045
2124
  </div>
2046
2125
  </div>
2047
- <div class="form-actions">
2126
+ <div class="form-actions set-foot">
2048
2127
  <button class="btn-toolbar" onclick="app.closeAppSettings()">Cancel</button>
2049
2128
  <button class="btn-toolbar btn-primary" onclick="app.saveAppSettings()">Save</button>
2050
2129
  </div>
@@ -2813,6 +2892,7 @@
2813
2892
  <input type="text" id="readMyMindPrompt" class="readmymind-prompt-input" data-i18n-skip aria-label="Predicted prompt, editable" onkeydown="if(event.key==='Enter')app.sendReadMyMind(true)">
2814
2893
  </div>
2815
2894
  <div class="readmymind-why" id="readMyMindWhy" data-i18n-skip></div>
2895
+ <div class="readmymind-alternates" id="readMyMindAlternates" data-i18n-skip style="display:none"></div>
2816
2896
  </div>
2817
2897
  <div class="readmymind-error" style="display:none">No suggestion this time. Rethink to try again.</div>
2818
2898
  </div>
@@ -2836,23 +2916,23 @@
2836
2916
  <div class="approvals-list"></div>
2837
2917
  </div>
2838
2918
 
2839
- <script defer src="constants.7d0f4047.js"></script>
2840
- <script defer src="i18n.ef50083f.js"></script>
2919
+ <script defer src="constants.53dc0fa1.js"></script>
2920
+ <script defer src="i18n.1a8b3412.js"></script>
2841
2921
  <script defer src="mobile-handlers.32fdd57f.js"></script>
2842
2922
  <script defer src="voice-input.e5461859.js"></script>
2843
2923
  <script defer src="notification-manager.5d229063.js"></script>
2844
- <script defer src="keyboard-accessory.1f35b482.js"></script>
2924
+ <script defer src="keyboard-accessory.0f524637.js"></script>
2845
2925
  <script defer src="input-cjk.63794d0b.js"></script>
2846
2926
  <!-- Hardened markdown HTML sanitizer (wires DOMPurify). Must precede app.js. -->
2847
2927
  <script defer src="sanitize-html.bc7078d6.js"></script>
2848
- <script defer src="app.4d006245.js"></script>
2849
- <script defer src="terminal-ui.e7c5d233.js"></script>
2928
+ <script defer src="app.f9c6aadd.js"></script>
2929
+ <script defer src="terminal-ui.61c7829d.js"></script>
2850
2930
  <script defer src="respawn-ui.ff0dae4c.js"></script>
2851
2931
  <script defer src="ralph-panel.6de2d0f8.js"></script>
2852
2932
  <script defer src="orchestrator-panel.js"></script>
2853
2933
  <script defer src="cron-ui.js"></script>
2854
- <script defer src="settings-ui.1c15649c.js"></script>
2855
- <script defer src="panels-ui.3df9cd95.js"></script>
2934
+ <script defer src="settings-ui.c674f367.js"></script>
2935
+ <script defer src="panels-ui.54b0d004.js"></script>
2856
2936
  <script defer src="readmymind-ui.js"></script>
2857
2937
  <script defer src="ultracode-panel.js"></script>
2858
2938
  <script defer src="approvals-ui.js"></script>