Add backups with S3, daily cost push, automation templates and a browser tool

- Daily backups (database + config) into <data_dir>/backups, keep N,
  optional upload to any S3-compatible bucket (SigV4, bucket pruning);
  settings panel with run-now, list and download
- Daily cost summary push at 20:00 (opt-in per user, preview button)
- Automations from templates (dependency check, security review, test
  health, daily summary, TODO report, docs freshness) via POST /jobs/create
- browser tool: headless Chromium over CDP – click, type, keys, waits,
  JavaScript, navigation, screenshots, console errors; requests to private
  network addresses are blocked (sub-resources and redirects included)
- Secrets masked in the config view: S3 secret key, metrics token
- Replace the remaining text arrows/refresh glyphs with SVG icons

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-09 06:07:03 +01:00
1 parent 873447ed17
commit 01c1484033
25 files changed
+1720 -47

No files matched your search

+96
View File
@@ -3346,6 +3346,9 @@ button.danger-solid {
color: var(--fg2);
margin-right: 2px;
}
.palette kbd .tiny {
vertical-align: -1px;
}
.palette-foot {
display: flex;
flex-wrap: wrap;
@@ -3360,3 +3363,96 @@ button.danger-solid {
display: none;
}
}
/* --- backups ------------------------------------------------------------------- */
.backup-s3 {
margin-top: 12px;
}
.backup-s3 summary {
cursor: pointer;
font-weight: 600;
}
.field-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 10px;
}
.field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 13px;
}
.field input {
width: 100%;
}
.backup-list {
margin-top: 10px;
max-height: 260px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 2px;
}
.backup-file {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 8px;
border-radius: 6px;
color: var(--fg1);
text-decoration: none;
font-size: 13px;
}
.backup-file:hover {
background: var(--bg2);
}
.backup-file .grow {
flex: 1;
}
/* --- automation templates ------------------------------------------------------ */
.job-tpl {
width: min(720px, 100%);
display: flex;
flex-direction: column;
gap: 10px;
max-height: 88vh;
}
.job-tpl h3 {
display: flex;
align-items: center;
gap: 8px;
}
.job-tpl-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 8px;
}
.job-tpl-card {
display: flex;
align-items: flex-start;
gap: 10px;
text-align: left;
padding: 12px;
background: var(--bg2);
}
.job-tpl-card:hover {
background: var(--bg3);
}
.job-tpl-card span {
display: flex;
flex-direction: column;
gap: 3px;
}
.job-tpl-card small {
color: var(--muted);
}
.job-tpl textarea {
width: 100%;
resize: vertical;
}
.chip-btn.active {
border-color: var(--accent);
color: var(--accent);
}