feat: Claude Agent integration + cookbook reconnect + UI polish

- Claude Agent integration: AGENT_CONFIGS.claude, INTG_TYPES.claude,
  setup_claude_routes + integrations/claude/ skill bundle. Wired in
  app.py alongside the existing Codex integration; same scope-gated
  /api/codex/* backend; agent form has new description so users know
  it's setup for an external CLI, not an agent streamed inside Odysseus.
- Remove mark_email_boundaries action: not good enough yet. Stripped
  from task UI, scheduler defaults, registry, tool schema, clear-cache
  route. Added to RETIRED_HOUSEKEEPING_ACTIONS so existing rows + their
  task_runs auto-purge on startup.
- Cookbook download reliability: "Reconnect" fix button in the crash
  diagnosis runs _reconnectTask after probing has-session. 30s confirm
  window before marking a download "done" — kills the Finished/Downloading
  flicker when tmux briefly drops between captures.
- Mobile UX: tap anywhere on a note card body opens the editor;
  Update button morphs to Archive when no text was edited; bell icon
  accent-colored; chip-trashing notif pills fade so only the icon
  rotates into the trash zone.
- Settings integrations: SVG-per-provider in email + API preset
  dropdowns, custom drop-up-aware menus, accent sub-header icons
  (IMAP/SMTP), consistent card styling between list + edit, contacts
  Edit/Delete icons, agent form description copy.
This commit is contained in:
pewdiepie-archdaemon
2026-06-04 08:27:26 +09:00
parent 6e80d0de08
commit 089246614d
17 changed files with 1301 additions and 387 deletions
+63 -3
View File
@@ -1008,6 +1008,16 @@ body.bg-pattern-sparkles {
opacity: 1;
animation: whirlpool-burst 0.36s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
/* When a chip is swirling into the trash X, its inline `rotate(720deg)`
drags every child + ::after badge along with it the count/dot pill
spinning looks chaotic. Fade those out fast at the start of the close
so visually only the icon glyph rotates. */
.minimized-dock-chip.chip-trashing > :not(svg),
.minimized-dock-chip.chip-trashing::after,
.minimized-dock-chip.chip-trashing::before {
opacity: 0 !important;
transition: opacity 0.16s ease-out !important;
}
@keyframes whirlpool-spin { to { transform: rotate(360deg); } }
@keyframes whirlpool-burst {
0% { transform: rotate(0deg) scale(1); opacity: 1; }
@@ -10326,7 +10336,7 @@ textarea.memory-add-input {
}
.task-state-badge svg {
position: relative;
top: -1px;
top: 0;
}
.task-status-badge:hover {
filter: brightness(1.08) saturate(1.15);
@@ -13290,6 +13300,13 @@ body:has(.doc-version-panel:not(.hidden)) .hamburger-btn {
padding: 12px;
margin-bottom: 10px;
}
/* When the integrations editor opens, the inner admin-card should match the
listed integration cards (subtle tint, same border) instead of reverting
to the solid-panel admin-card surface used elsewhere. */
#unified-intg-form .admin-card,
#integrations-form .admin-card {
background: color-mix(in srgb, var(--fg) 3%, transparent);
}
.admin-card h2 {
font-size: 14px;
font-weight: 600;
@@ -21544,9 +21561,11 @@ body:not(.welcome-ready) #welcome-screen {
position: relative;
top: -1px;
}
.task-log-force-run svg {
.task-log-force-run svg,
.task-log-stop svg {
display: block;
flex-shrink: 0;
transform: translateY(1px);
}
.task-log-force-run:hover {
opacity: 1;
@@ -21918,13 +21937,14 @@ a.chat-link[href^="#research-"] {
padding-right: 0;
box-sizing: border-box;
justify-content: center;
top: 2px !important;
}
.task-card .task-state-badge .task-state-label {
display: none;
}
.task-card .task-card-run-btn {
margin-right: 1px !important;
top: 0;
top: 2px;
}
}
@@ -27291,6 +27311,20 @@ button .spinner-whirlpool {
max-width: 100%;
}
}
/* Mobile: long recipient lists (To/Cc with many addresses) shouldn't wrap to
N rows and push the body down. Keep them on one row, horizontally scrollable,
no scrollbar chrome. */
@media (max-width: 768px) {
.recipient-chips {
flex-wrap: nowrap !important;
overflow-x: auto !important;
overflow-y: hidden !important;
scrollbar-width: none;
-webkit-overflow-scrolling: touch;
}
.recipient-chips::-webkit-scrollbar { display: none; }
.recipient-chip { flex-shrink: 0; }
}
.email-reader-actions {
display: flex; gap: 4px; flex-wrap: nowrap; align-items: center;
flex-shrink: 0;
@@ -30837,6 +30871,20 @@ body.notes-mobile-mode.notes-drag-mode .note-card-pin.active {
margin-top: -2px;
}
/* Reminder bell button */
/* Mobile-only: bell icon in the note editor is accent-coloured so it pops as
the primary "set a reminder" affordance. The Archive button is hidden the
Update () button morphs into an Archive action when the user opens a note
and clicks without making any edits (see notes.js `archive-mode` toggle). */
@media (max-width: 768px) {
.note-form-remind-btn { color: var(--accent, var(--red)) !important; }
.note-form-remind-btn > svg { color: var(--accent, var(--red)); }
.note-form-archive-btn { display: none !important; }
.note-form-save.archive-mode {
color: var(--accent, var(--red)) !important;
border-color: color-mix(in srgb, var(--accent, var(--red)) 50%, transparent) !important;
background: color-mix(in srgb, var(--accent, var(--red)) 10%, transparent) !important;
}
}
.note-form-remind-btn {
flex: 0 0 auto;
background: transparent;
@@ -33174,6 +33222,18 @@ button.cal-add-btn.cal-add-btn-text.cal-add-btn-sm:hover .cal-add-label {
.email-attach-toggle-inline,
.email-undone-toggle-inline,
.email-reminder-toggle-inline { border-radius: 50% !important; opacity: 1 !important; }
/* Mobile: enlarge the icons inside the inline search-bar toggles
(done / attachment / reminders) buttons themselves stay the same,
only the SVG glyph scales up so it's tappable + visible. */
@media (max-width: 768px) {
.email-attach-toggle-inline svg,
.email-undone-toggle-inline svg,
.email-reminder-toggle-inline svg,
.email-filter-refresh-btn svg {
width: 15px !important;
height: 15px !important;
}
}
.email-attach-toggle:not(.email-attach-toggle-inline):hover svg {
animation: email-undone-jiggle 0.45s ease-in-out;
transform-origin: 50% 50%;