Commit Graph
59 Commits
Author SHA1 Message Date
Gmer4Lfe 66f9d6f435 Count orchestrators on the board, pin it, and open on the assistant
Counting every step reported a fully scheduled system as 10 of 82, and reopening the last thread
brought its profile with it, so the tab came up as Troubleshoot pointed at nothing.
2026-08-09 13:41:53 -04:00
Gmer4Lfe d6debc5408 Give the chat shortcuts worth listing, and a place to list them
Four new keys alongside Ctrl+Enter, rendered from the same list the handler reads so the panel
cannot advertise a key that stopped working.
2026-08-09 13:15:58 -04:00
Gmer4Lfe c3ed7262cd Separate whether the chat is expanded from how big expanded is
One is an action taken constantly and the other a preference set once, so the banner names the
size and the composer keeps the toggle.
2026-08-09 12:59:30 -04:00
Gmer4Lfe 455fb55857 Let the Scheduler's views shrink so the assistant can grow into them
Flex items default to min-height:auto, so a view holding a log ignored the height it was given
and pushed the composer out of a panel that clips instead of scrolling.
2026-08-09 12:42:32 -04:00
Gmer4Lfe 1370a29233 Tell the page when the chat changes height
The Scheduler sizes the views above the panel from what the chat leaves, so a chat that resizes
silently grew off the bottom and took its own composer with it.
2026-08-09 12:33:29 -04:00
Gmer4Lfe bb5daad3cc Halve the assistant's share of the Scheduler panel
It was the largest thing there before being asked anything, and the view above it is what the
question is usually about.
2026-08-09 12:28:31 -04:00
Gmer4Lfe 8eeb4c3d6c Make the Scheduler panel an instance, not a second chat
It kept its own bar, send loop and poll, which is why a thread there died on reload while the
other two were saved and why its controls had drifted from the same controls everywhere else.
2026-08-09 12:22:07 -04:00
Gmer4Lfe 6cdb0d1eab One profile picker for both surfaces, and open where you left off 2026-08-09 00:56:04 -04:00
Gmer4Lfe 073352b21e Put the Scheduler dock on the same conversation store as everything else 2026-08-09 00:16:09 -04:00
Gmer4Lfe 0f92609425 Give the AI subsystem one profile table and one collection, read everywhere 2026-08-08 22:35:37 -04:00
Gmer4Lfe 228aae31c9 Ask before running a script, which the page header has always said it did
Run was the only mutating control here that did not confirm, and it is the one that executes
shell as root — the library holds cleaners that delete files, and six Run buttons sit a row apart
in a dense tree.
2026-08-07 10:43:43 -04:00
Gmer4Lfe fb50f94ed8 Escape what the monitor page renders, and put the helpers where every page can reach them
The page interpolated media titles, partner hostnames read over the mesh, and docker folder
names straight into innerHTML — its own header claimed otherwise, and the helpers that would
have fixed it were defined in a page it never loads. Container WebUI values now get a scheme
check before they reach window.open().
2026-08-07 10:17:45 -04:00
Gmer4Lfe be306cf86c Let one gate decide every AI surface, so switching AI off actually removes all of it
The Tools card adopted the AI scripts on the host check alone, and api/ai.php only
tested AI_ENABLED in front of ask, so a disabled subsystem still had rows to run and
an endpoint that answered.
2026-08-07 09:49:31 -04:00
Gmer4Lfe 4989486f45 Two thirds of the conf was unreachable from the UI, and an empty Config block said nothing about why 2026-08-06 23:08:49 -04:00
Gmer4Lfe 8b0c2f6d1b Tools had no gear, so nineteen scripts had no Info and Settings at all 2026-08-06 22:57:05 -04:00
Gmer4Lfe 141e2ca37c At full size the dock's own button becomes its collapse, and closing hands the panel back 2026-08-06 22:49:38 -04:00
Gmer4Lfe b803fefebd Give the assistant dock a size toggle, so a long answer can have the panel without hiding what it is about 2026-08-06 22:44:00 -04:00
Gmer4Lfe d5944c2443 Sweep every onclick built from data: an unescaped quote silently killed nine handlers 2026-08-06 22:13:10 -04:00
Gmer4Lfe d135dff5cd An unescaped quote ended the onclick attribute early, so clicking an error line did nothing 2026-08-06 22:08:10 -04:00
Gmer4Lfe 62a838ebdd Clicking a recent error opens the log on that line and acks it, so acknowledged means seen 2026-08-06 22:00:44 -04:00
Gmer4Lfe f2d0e18f2c Ask about a run from the row it is on, and stop spending context on health checks when the run was clean 2026-08-06 21:51:55 -04:00
Gmer4Lfe 10c1705790 An answer sized the assistant dock past the bottom of the page because nothing refit the panel after it landed 2026-08-06 18:36:50 -04:00
Gmer4Lfe e467cdaf23 The scheduler AI dock read the poll envelope as the job, so every answer hung on thinking 2026-08-06 18:28:13 -04:00
Gmer4Lfe 714d97dd49 Add an incident journal the troubleshooter reads back, and thinking for diagnosis 2026-08-05 20:26:56 -04:00
Gmer4Lfe 5a813eb4c8 Add a troubleshooting profile with the scoped log, and a deterministic conf-key lookup 2026-08-05 20:18:05 -04:00
Gmer4Lfe 185abdb442 Add a scope-aware assistant dock to the scheduler right panel 2026-08-05 19:56:02 -04:00
Gmer4Lfe eacea56d9d Title the info banner for its view, and number and stripe the array fields 2026-08-05 18:13:04 -04:00
Gmer4Lfe 99486b1eaf Open on the condensed list, with a More info button for the full document 2026-08-05 18:03:47 -04:00
Gmer4Lfe aeb8c01370 Show the terse control list when the help block is collapsed 2026-08-05 17:58:29 -04:00
Gmer4Lfe 2ad3a1bfed Put the whole help doc back behind the collapse so the live blocks are not buried 2026-08-05 17:51:12 -04:00
Gmer4Lfe 329bf25b14 Number and stripe the per-script settings so each one reads as its own row 2026-08-05 17:44:12 -04:00
Gmer4Lfe 1761087283 Measure the editor chrome instead of assuming 38px, so the last lines are reachable 2026-08-04 21:16:15 -04:00
Gmer4Lfe a13c5541cc Pin the editor highlight overlay to the textarea so long confs scroll to the end 2026-08-04 21:07:27 -04:00
Gmer4Lfe 87fa2693f0 Show the reference tables collapsed and the task guide on expand, from one file 2026-08-04 19:45:23 -04:00
Gmer4Lfe 3ea80ef944 Single-source the scheduler help from markdown the AI index can read 2026-08-04 19:30:38 -04:00
Gmer4Lfe e1bbecad38 Rename the per-orchestrator expander to Steps so it stops colliding with Advanced mode 2026-08-04 19:19:48 -04:00
Gmer4Lfe ccc6c742ee Add structured headers to the PHP pages layer
Documents each tab's purpose, what it renders, and which endpoints it polls.
Pages that start with markup get the header in a <?php ?> block so it never
reaches the browser.

Also corrects the layer diagram in README-unraid.md: eight of eleven pages hold
no PHP logic and poll api/ for everything — only auth, monitor and scheduler
require an include/ file directly.
2026-08-02 00:51:41 -04:00
Gmer4Lfe 6fd22ae4ee Move Custom Scripts out of the repo and add an Import Script picker
Custom Scripts (the Scheduler page's inline editor) used to save into the
git-tracked Custom/ folder, so anything saved there would end up on GitHub.
They now live in /boot/config/plugins/user.scripts/Varaverk/Scripts, same
folder family as Unraid's own User Scripts plugin. Import Script lets you
browse the whole server and move an existing script in instead of only
creating new ones inline — always a move, never a copy, so no stray
duplicate is left where it came from.
2026-07-03 10:57:35 -04:00
Gmer4Lfe c9a0ad187b Fix editor horizontal click offset — force inline fontFamily to override Unraid SPA clear-sans 2026-06-27 13:20:03 -04:00
Gmer4Lfe 0aa5851549 Fix editor line-height mismatch caused by Unraid SPA CSS override
Unraid 7's React CSS overrides line-height: 1.5 on textareas to normal.
vvRestoreEditorPrefs() only called vvFontSize() for non-default sizes, so
the inline style that overrides Unraid's CSS was never set for the default
12px case — leaving Firefox to render at ~14px while our code calculated
positions at 18px, putting the cursor 2-3 lines above where clicked.
Now always calls vvFontSize() so the inline lineHeight is always forced.
2026-06-27 13:05:31 -04:00
Gmer4Lfe ccaf19cfe4 Fix editor click alignment in Firefox and enable arr cleanup scripts in daily maintenance 2026-06-26 22:35:47 -04:00
Gmer4Lfe 9c3ace95a7 Auth stack certs tab, arrs db fallbacks, cert monitor cache, conf parser fix
- Auth stack: fold cert monitor into Auth Stack page as fourth tab (Certs);
  remove standalone cert page and top-level tab
- cert_monitor.sh: write JSON status cache to State_Files/cert_status.json
  after each run; expose per-domain days/expiry via _CERT_DAYS/_CERT_EXPIRY globals
- api/cert.php: new — serves cached cert status; falls back to configured
  domains as UNKN when no cache exists; POST action=run triggers live check
- arrs db fallbacks: vv_arr_cleanup_stats/discovery_stats/recovery_stats now
  read from data/*.db files when log JSON files don't yet exist
- config.php vv_conf_vars(): unescape bash \$ → $ so passwords with dollar
  signs read correctly from conf files
- host1.conf: fill in HOST1_NPM_USER/PASS and HOST1_LLDAP_USER/PASS
- Partnership adapter pattern: Unraid-specific container logic extracted to
  Plugin/unraid/Partnership/; platform-agnostic structure stays in Partnership/
- First-run wizard: uniform multi-step flow for all hosts; HOST2 pull moved
  to checklist; auto SSH keygen and API key creation on save
- api/checklist.php: live setup checklist with pull_master action
- Fullscreen toggle: hide Unraid header/menu; state persists via localStorage
2026-06-05 23:17:30 -04:00
Gmer4Lfe 0b3d7d542f editor: add word wrap toggle to status bar
Adds a "Wrap" button to the editor status bar that toggles word wrap
on/off, persisted in localStorage. Default is nowrap with horizontal
scroll (standard code editor behaviour). In wrap mode the line-number
gutter and current-line highlight are hidden — both rely on fixed
line-height calculations that break when lines wrap visually.

CSS: textarea/overlay default to white-space:pre; .vv-ed-wrap class
(on #vv-editor-wrap) overrides to pre-wrap, hides gutter and cur-line.
JS: vvWordWrap state, vvApplyWordWrap(), vvToggleWordWrap(); guards in
vvUpdateLineNums() and vvUpdateCurLine(); restored via
vvRestoreEditorPrefs() on both script and raw-conf editor entry points.
2026-06-04 21:56:22 -04:00
Gmer4Lfe de6fcc3997 Add Rsync page, upgrade monitor rsync card, partnership overhaul, API key periodic check, docker watchdog manual-stop detection 2026-06-03 15:58:50 -04:00
Gmer4LfeandClaude Sonnet 4.6 586c7c36c1 ui: Find & Replace, multi-line comments, indent guides, font size
Find & Replace (Ctrl+H):
- Two-row find bar: expand › arrow shows replace row (VS Code pattern)
- Replace button (Enter): replaces current match, advances to next
- Replace All: replaces all occurrences, shows count
- Find input searches live; replace row preserved across open/close

Multi-line comment toggle (Ctrl+/):
- With multi-line selection: checks if ALL lines are commented
  → if all commented, uncomments all; otherwise comments all
- Empty lines in selection are skipped
- After toggle: block stays selected (same as VS Code)
- Single-line behavior unchanged

Indent guides:
- CSS repeating-linear-gradient on #vv-editor-inner: 1px guide every 2ch
- First guide at indent level 1 (col 2); then 4, 6, 8... matching 2-space indents
- Shows through the transparent overlay; scales automatically with font size
- Very subtle (0.045 opacity) — visible but not distracting

Font size A− / A+ in status bar (9–22px):
- Persisted to localStorage, restored on every editor open
- Updates textarea, overlay, gutter, and cur-line height together
- All scroll calculations use vvLH() (fontSizePx × 1.5) instead of
  hardcoded 18 — find nav, goto, select-next-occurrence all correct at
  any font size

Also: fixed duplicate id="vv-find-close" in goto bar (now .vv-find-x class)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 21:20:46 -04:00
Gmer4LfeandClaude Sonnet 4.6 beac98427d ui: editor QoL — line ops, auto-close, goto, smart home, Ctrl+D
Line operations:
- Alt+↑/↓   — move current line up / down (swaps with adjacent line)
- Alt+Shift+↓/↑ — duplicate line below / above
- Ctrl+Shift+K  — delete current line
- Ctrl+L        — select entire current line (including newline)

Auto-close brackets and quotes:
- ( [ { " ' ` — inserts matching close, cursor placed inside
- Wrap selection — if text is selected, typing an opener wraps it
- Skip-over — typing a close char when it's already next → jumps past it
- Smart backspace — deletes BOTH chars when cursor sits between a matched pair
- Guards: skip ' auto-close after word chars (contractions); skip auto-close
  when next char is a word char (prevents disrupting existing text)

Navigation:
- Ctrl+G — Go to Line bar (pre-filled with current line, shows "of N")
- Smart Home — first press → first non-whitespace; second → col 0
- Ctrl+D — first press: select word at cursor; subsequent: cycle through
  all occurrences (wraps around), integrates with word highlight overlay

Keyboard shortcuts panel:
- Added "Editor Keyboard Shortcuts" section to the How do I use this panel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 21:02:56 -04:00
Gmer4LfeandClaude Sonnet 4.6 1ea3f595cc ui: custom undo/redo stack for editor — up to 200 steps
Native browser undo breaks when ta.value is set programmatically (tab,
enter, ctrl+/) — replaced with a custom snapshot-based undo system.

Stack behaviour:
- oninput → debounced capture (600ms) — groups rapid typing into chunks
- Tab / Enter / Ctrl+/ → immediate capture BEFORE edit, then capture AFTER
  (each programmatic edit gets its own undo step)
- Content load → vvUndoCaptureInitial() seeds the stack with a clean baseline
- Max 200 history entries (VV_UNDO_MAX); old entries dropped from front

Keyboard: Ctrl/Cmd+Z = undo, Ctrl/Cmd+Y or Ctrl/Cmd+Shift+Z = redo
(both handled in vvEditorKeydown before any other key processing)

Buttons: ↩ Undo / ↪ Redo appear in toolbar beside Cancel/Save when editor
is open; disabled state with 0.28 opacity when no steps available; Undo
button shows step count "↩ Undo 5" so you can see how deep the history is

Cleanup: vvEditorReset() calls vvUndoReset() so stack is cleared on every
editor open/close — fresh baseline each time

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 20:54:42 -04:00
Gmer4LfeandClaude Sonnet 4.6 a250d590ca ui: premium editor overhaul — selection, word highlight, find, status bar
Selection:
- ::selection fix: text selection now visible (bright blue) even when
  textarea color is transparent — the #1 complaint
- Overlay background changed transparent → #vv-editor-inner provides bg,
  allowing #vv-cur-line to show through

Current line highlight:
- #vv-cur-line div positioned absolutely behind overlay, tracks cursor
  line on every keyup/mouseup/click/scroll
- Gutter: current line number highlighted in bright white + bold

Word/variable occurrence highlight:
- Click or position cursor on any identifier → all occurrences highlighted
  in yellow throughout the overlay (whole-word, case-sensitive)
- Select a word → same treatment for the selection text
- Clears when cursor moves off the word or find bar opens

Find in file (Ctrl+F):
- Find bar slides in above editor, pre-filled with selected word
- Highlights all matches orange, current match in bright amber
- ↑/↓ buttons + Enter/Shift+Enter to navigate between matches
- Live match count "N / M"
- Red border + "no matches" feedback when term not found
- Escape or × closes, returns focus to editor

Status bar:
- Persistent bar below editor: Ln N, Col N | selection info | language
- Shows "Bash" or "Bash / Config" depending on file type
- Hides when editor is not open

Visual polish:
- Editor wrap: unified border + border-radius 4px 4px 0 0, overflow:hidden
  clips gutter and inner to rounded corners as one block
- Status bar border-radius 0 0 4px 4px — completes the block
- Gutter: 46px (was 42) — room for 3-digit line numbers
- Slim 8px scrollbar with styled track and hover state
- vvEditorReset() clears all editor state on open/close

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 20:16:26 -04:00
Gmer4LfeandClaude Sonnet 4.6 753f99ac0c ui: editor-like QoL — selection highlight, drag feedback, keyboard nav
Selection / highlight:
- .vv-row-selected: blue tint + left accent bar (was barely-visible gray)
- .vv-sb-selected: same treatment, consistent across both panels
- .vv-df-active (containers): match new selection style
- .vv-job-row + .vv-sb-row: smooth transition on state changes
- .vv-orch-row: hover feedback + pointer cursor (was no visual response)

Drag and drop:
- .vv-drag-ghost: adds dashed ring so source item stays visible while dragging
- .vv-drop-line: blue glow to match selection accent (was flat green)
- All drop targets: unified blue theme (.vv-children, .vv-folder-children)
- .vv-library-zone drop target: improved red with inset glow
- .vv-drag-handle:active: grabbing cursor state
- document.body.vv-is-dragging: cursor:grabbing on entire page during drag
  (added to all three drag start handlers + failsafe document dragend)

Keyboard navigation (scheduler):
- ↑/↓: navigate between top-level orchestrator cards
- Home/End: jump to first/last card
- Escape: close right panel, return to suggestions
- /: focus log search when log panel is open
- All shortcuts suppressed when focus is in any input/textarea/select

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 20:03:27 -04:00
Gmer4LfeandClaude Sonnet 4.6 fb0530deba Consolidate all paths to plugin flash dir, fix watchdog 7.3 triggers
- Move SCRIPTS_DIR/DATA_DIR/STATE_DIR from appdata to /boot/config/plugins/varaverk
- All state files now in STATE_DIR (no more /tmp or /boot/config root writes)
- Bootstrap: Gitea-first clone with GitHub fallback, no array dependency
- varaverk.cfg seeded with Gitea connection settings
- .gitignore: add State_Files/, varaverk.cfg, varaverk-*.txz
- Partnership/transcode/fallback scripts use STATE_DIR variables
- PHP config.php: DATA_DIR/STATE_DIR constants, VV_SETUP_STATE_FILE dynamic
- deploy.sh PROD_ROOT updated to plugin flash dir

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 13:30:20 -04:00