Harden maintainer-preview harness and review fixes

Unify conversational domain routing, preserve artifact completion evidence, replace provisional tool-round prose with terminal synthesis, and resolve verified maintainer review findings across search, frontend module identity, path policy, configuration, and built-in skill startup.
This commit is contained in:
pewdiepie-archdaemon
2026-09-21 06:54:03 +00:00
parent d7cad0621f
commit 297ad19248
54 changed files with 1223 additions and 110 deletions
+2 -2
View File
@@ -10,7 +10,7 @@ import modelsModule from './js/models.js';
import ragModule from './js/rag.js';
import presetsModule from './js/presets.js?v=20260908personaname1';
import searchModule from './js/search.js';
import chatModule from './js/chat.js?v=20260916largetoolscroll2';
import chatModule from './js/chat.js?v=20260917toolttft1';
import compareModule from './js/compare/index.js?v=20260909mobilepaneaddscroll1';
import documentModule from './js/document.js?v=20260916docctx2';
import searchChatModule from './js/search-chat.js';
@@ -22,7 +22,7 @@ import {
settleSessionHydration
} from './js/startupShell.js';
import markdownModule from './js/markdown.js';
import chatRenderer from './js/chatRenderer.js?v=20260914pdfstrip1';
import chatRenderer from './js/chatRenderer.js?v=20260914metricssummary1';
// Keep this specifier identical to every consumer (especially chat.js).
// Different query strings create separate ES-module instances with separate
// current-session state, so the picker can display one model while chat sends
+1 -1
View File
@@ -2614,7 +2614,7 @@
<script type="module" src="/static/js/gallery.js?v=20260910promptcopy1"></script>
<script type="module" src="/static/js/chatRenderer.js?v=20260914metricssummary1"></script>
<script type="module" src="/static/js/codeRunner.js?v=20260831richtexttools91"></script>
<script type="module" src="/static/js/chatStream.js?v=20260914aireply3"></script>
<script type="module" src="/static/js/chatStream.js?v=20260914pdfstrip1"></script>
<script type="module" src="/static/js/chat.js?v=20260917toolttft1"></script>
<script type="module" src="/static/js/cookbook.js"></script>
<script src="/static/js/cookbookSchedule.js"></script>
+1 -1
View File
@@ -2,7 +2,7 @@
// Admin-only: users, endpoints, MCP, RAG, embeddings, tokens, webhooks, features
import uiModule from './ui.js?v=20260916largetoolscroll1';
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
import settingsModule from './settings.js?v=20260912writingstyle3';
import { providerLogo, providerLogoFromUrl } from './providers.js';
import { sortModelObjects } from './modelSort.js';
import { PROVIDER_DEVICE_FLOWS, formatDeviceFlowError, runProviderDeviceFlow } from './providerDeviceFlow.js';
+1 -1
View File
@@ -9,7 +9,7 @@ import Storage from './storage.js';
import uiModule from './ui.js?v=20260916largetoolscroll1';
import sessionModule from './sessions.js';
import chatRenderer, { renderToolIcon } from './chatRenderer.js?v=20260914metricssummary1';
import chatStream from './chatStream.js?v=20260913richdiff1';
import chatStream from './chatStream.js?v=20260914pdfstrip1';
import { addAITTSButton } from './tts-ai.js';
import markdownModule from './markdown.js';
import spinnerModule from './spinner.js';
+6 -6
View File
@@ -6,7 +6,7 @@ import markdownModule from './markdown.js';
import { svgifyEmoji } from './markdown.js';
import { addAITTSButton } from './tts-ai.js';
import { providerLogo, providerLabel } from './providers.js';
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
import settingsModule from './settings.js?v=20260912writingstyle3';
import spinnerModule from './spinner.js';
import { bindMenuDismiss } from './escMenuStack.js';
import { loadPanel } from './panels.js?v=20260909movepicklayer1';
@@ -1800,7 +1800,7 @@ function _activateEntityAnchor(e, forcedAnchor = null) {
} else if (panel === 'skills') {
document.getElementById('tool-skills-btn')?.click();
} else if (panel === 'research') {
import('./research/panel.js?v=20260911researchmenu1').then(mod => {
import('./research/panel.js?v=20260913researchrailerrors1').then(mod => {
const open = mod.openPanel || (mod.default && mod.default.openPanel);
if (open) open();
}).catch(() => {});
@@ -1855,7 +1855,7 @@ function _activateEntityAnchor(e, forcedAnchor = null) {
if (open) open(id);
}).catch(() => {});
} else if (kind === 'note') {
import('./notes.js?v=20260910drawmerge1').then(mod => {
import('./notes.js?v=20260911notesselectioncancel1').then(mod => {
const open = mod.openNote || (mod.default && mod.default.openNote);
if (open) open(id);
try {
@@ -1905,7 +1905,7 @@ function _activateEntityAnchor(e, forcedAnchor = null) {
if (open) open(id);
}).catch(() => {});
} else if (kind === 'research') {
import('./research/panel.js?v=20260911researchmenu1').then(mod => {
import('./research/panel.js?v=20260913researchrailerrors1').then(mod => {
const open = mod.openPanel || (mod.default && mod.default.openPanel);
if (open) open(id);
}).catch(() => {});
@@ -2659,8 +2659,8 @@ export function displayMetrics(messageElement, metrics) {
<div class="ctx-popup-title">Message stats</div>
<div class="ctx-stat-section">
<div class="ctx-stat-row"><span class="ctx-label">Model</span><span class="ctx-stat-value">${model.split('/').pop()}</span></div>
<div class="ctx-stat-row"><span class="ctx-label">Input · all rounds</span><span class="ctx-stat-value">${inputTokens.toLocaleString()} tokens${isReal ? '' : '~'}</span></div>
${injectedTokens != null ? `<div class="ctx-stat-row"><span class="ctx-label">Injected · first request</span><span class="ctx-stat-value">${Number(injectedTokens).toLocaleString()} tokens</span></div>` : ''}
<div class="ctx-stat-row"><span class="ctx-label">Input</span><span class="ctx-stat-value">${inputTokens.toLocaleString()} tokens${isReal ? '' : '~'}</span></div>
${injectedTokens != null ? `<div class="ctx-stat-row"><span class="ctx-label">Injected</span><span class="ctx-stat-value">${Number(injectedTokens).toLocaleString()} tokens</span></div>` : ''}
<div class="ctx-stat-row"><span class="ctx-label">Output</span><span class="ctx-stat-value">${outputTokens.toLocaleString()} tokens${isReal ? '' : '~'}</span></div>
<div class="ctx-stat-row"><span class="ctx-label">Total</span><span class="ctx-stat-value">${totalTok.toLocaleString()} tokens</span></div>
</div>
+3 -3
View File
@@ -186,7 +186,7 @@ export function handleUIControl(uiData) {
if (fn) fn();
}).catch(function(){});
} else if (panel === 'calendar') {
import('./calendar.js?v=20260914emailsource9').then(function(mod) {
import('./calendar.js?v=20260914emailsource11').then(function(mod) {
var viewFn = mod.openCalendarView || (mod.default && mod.default.openCalendarView);
var fn = mod.openCalendar || (mod.default && mod.default.openCalendar);
if (viewFn && (uiData.view || uiData.target_date)) viewFn(uiData.view || 'month', uiData.target_date || '');
@@ -208,7 +208,7 @@ export function handleUIControl(uiData) {
if (fn) fn(uiData.view ? { tab: uiData.view } : undefined);
}).catch(function(){});
} else if (panel === 'notes') {
import('./notes.js?v=20260910drawmerge1').then(function(mod) {
import('./notes.js?v=20260911notesselectioncancel1').then(function(mod) {
var fn = mod.openPanel || mod.openNotes || (mod.default && (mod.default.openPanel || mod.default.openNotes));
if (fn) fn();
}).catch(function(){});
@@ -229,7 +229,7 @@ export function handleUIControl(uiData) {
var ids = { memories: 'tool-memory-btn', skills: 'tool-skills-btn', settings: 'open-settings-btn' };
var btn = document.getElementById(ids[panel]);
if (panel === 'settings') {
import('./settings.js?v=20260909defaultmodelfix1').then(function(mod) {
import('./settings.js?v=20260912writingstyle3').then(function(mod) {
var fn = mod.open || (mod.default && mod.default.open);
if (fn) fn();
else if (btn) btn.click();
+1 -1
View File
@@ -1,7 +1,7 @@
// compare/stream.js — SSE streaming to panes
import state from './state.js';
import { addFinishBadge } from './vote.js?v=20260828resendcaldrag1';
import { getModelCost, renderAskUserCard, safeDisplayImageSrc } from '../chatRenderer.js?v=20260910streamlinks2';
import { getModelCost, renderAskUserCard, safeDisplayImageSrc } from '../chatRenderer.js?v=20260914metricssummary1';
import markdownModule from '../markdown.js';
import spinnerModule from '../spinner.js';
import uiModule from '../ui.js?v=20260916largetoolscroll1';
+1 -1
View File
@@ -2,7 +2,7 @@
import Storage from '../storage.js';
import state from './state.js';
import { _modelDisplayNames } from './models.js';
import { getModelCost } from '../chatRenderer.js?v=20260910streamlinks2';
import { getModelCost } from '../chatRenderer.js?v=20260914metricssummary1';
import uiModule from '../ui.js?v=20260916largetoolscroll1';
import { VOTES_STORAGE_KEY, VOTES_MAX } from './icons.js?v=20260908compareprompts1';
import { showScoreboard } from './scoreboard.js?v=20260909voteconfirmalign1';
+1 -1
View File
@@ -7,7 +7,7 @@
import uiModule from './ui.js?v=20260916largetoolscroll1';
import spinnerModule from './spinner.js';
import { providerLogo } from './providers.js';
import { modelColor } from './chatRenderer.js?v=20260913richdiff1';
import { modelColor } from './chatRenderer.js?v=20260914metricssummary1';
import {
bindMenuDismiss,
dismissOrRemove,
+1 -1
View File
@@ -7314,7 +7314,7 @@ import { attachColorPicker } from './colorPicker.js?v=20260910eyedropper1';
}
} catch (_) {}
if (!document.getElementById('notes-pane') && !document.getElementById('notes-pane-backdrop')) return;
import('./notes.js?v=20260910drawmerge1')
import('./notes.js?v=20260911notesselectioncancel1')
.then(mod => {
const close = mod.closeNotes || mod.closePanel || mod.default?.closeNotes || mod.default?.closePanel;
if (typeof close === 'function') close('down');
+1 -1
View File
@@ -6,7 +6,7 @@
import spinnerModule from './spinner.js';
import { styledConfirm, showToast, emptyStateIcon } from './ui.js?v=20260916largetoolscroll1';
import { folderDisplayName, sortedFolders } from './emailInbox.js?v=20260914aireply4';
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
import settingsModule from './settings.js?v=20260912writingstyle3';
import * as Modals from './modalManager.js';
import { topPortalZ } from './toolWindowZOrder.js';
import { makeWindowDraggable } from './windowDrag.js';
+1 -1
View File
@@ -2544,7 +2544,7 @@ export function openGallery() {
if (visionLink) {
visionLink.addEventListener('click', (e) => {
e.preventDefault();
import('./settings.js?v=20260909defaultmodelfix1').then(m => {
import('./settings.js?v=20260912writingstyle3').then(m => {
m.open('ai');
// The gallery modal gets a bumped z-index from modalManager; settings
// opens with its lower static z-index and lands BEHIND it. Raise it above.
+1 -1
View File
@@ -3,7 +3,7 @@
import uiModule from './ui.js?v=20260916largetoolscroll1';
import markdownModule from './markdown.js';
import chatRenderer from './chatRenderer.js?v=20260913richdiff1';
import chatRenderer from './chatRenderer.js?v=20260914metricssummary1';
import spinnerModule from './spinner.js';
import { providerLogo } from './providers.js';
import { PROMPT_TEMPLATES, getUserTemplates } from './presets.js?v=20260908personaname1';
+1 -1
View File
@@ -3,7 +3,7 @@
import { providerLogo } from './providers.js';
import uiModule from './ui.js?v=20260916largetoolscroll1';
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
import settingsModule from './settings.js?v=20260912writingstyle3';
import { sortModelObjects } from './modelSort.js';
import spinnerModule from './spinner.js';
+1 -1
View File
@@ -9,7 +9,7 @@ import uiModule from './ui.js?v=20260916largetoolscroll1';
import sessionModule from './sessions.js';
import dragSortModule from './dragSort.js';
import spinnerModule from './spinner.js';
import { modelColor } from './chatRenderer.js?v=20260913richdiff1';
import { modelColor } from './chatRenderer.js?v=20260914metricssummary1';
import { providerLogo } from './providers.js';
import { sortModelIds } from './modelSort.js';
+1 -1
View File
@@ -3,7 +3,7 @@
import Storage from './storage.js';
import uiModule, { autoResize, styledPrompt } from './ui.js?v=20260916largetoolscroll1';
import chatRenderer from './chatRenderer.js?v=20260913richdiff1';
import chatRenderer from './chatRenderer.js?v=20260914metricssummary1';
import { providerLogo } from './providers.js';
import { initModelPicker, updateModelPicker } from './modelPicker.js?v=20260909routeidentity1';
import themeModule from './theme.js?v=20260911organsrain1';
+5 -1
View File
@@ -286,6 +286,10 @@ export function initSidebarLayout(Storage, opts) {
function checkSidebarAutoCollapse() {
if (_userToggledSidebar) return;
// Mobile uses a fixed overlay drawer. Keyboard and orientation changes
// emit resize events there, but should not run the desktop width-based
// auto-collapse logic against an intentionally opened drawer.
if (window.innerWidth < 768) return;
const sidebar = document.getElementById('sidebar');
if (!sidebar) return;
const isHidden = sidebar.classList.contains('hidden');
@@ -320,7 +324,7 @@ export function initSidebarLayout(Storage, opts) {
const isMobileViewport = window.innerWidth < 768;
if (_wasMobileViewport && !isMobileViewport) _restoreDesktopSidebarSide();
_wasMobileViewport = isMobileViewport;
_userToggledSidebar = false; // allow auto-collapse on actual resize
if (!isMobileViewport) _userToggledSidebar = false; // allow auto-collapse on desktop resize
requestAnimationFrame(checkSidebarAutoCollapse);
});
// Re-check when the document split is opened or closed. Do not react to
+2 -2
View File
@@ -13,12 +13,12 @@ import Storage from './storage.js';
import uiModule from './ui.js?v=20260916largetoolscroll1';
import sessionModule from './sessions.js';
import modelsModule from './models.js';
import chatRenderer from './chatRenderer.js?v=20260913richdiff1';
import chatRenderer from './chatRenderer.js?v=20260914metricssummary1';
import spinnerModule from './spinner.js';
import themeModule from './theme.js?v=20260911organsrain1';
import documentModule from './document.js?v=20260916docctx2';
import workspaceModule from './workspace.js';
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
import settingsModule from './settings.js?v=20260912writingstyle3';
import cookbookModule from './cookbook.js';
import { EVAL_PROMPTS } from './compare/index.js?v=20260909mobilepaneaddscroll1';
import { PROVIDER_DEVICE_FLOWS, formatDeviceFlowError, runProviderDeviceFlow } from './providerDeviceFlow.js';
+5 -3
View File
@@ -800,10 +800,12 @@ function _renderTaskChips() {
b.className = 'memory-cat-chip task-filter-chip' + (kind === 'status' ? ' task-status-filter-chip' : '') + (active ? ' active' : '');
b.textContent = label;
b.addEventListener('click', () => {
if (kind === 'status') _taskStatusFilter = _taskStatusFilter === value ? null : value;
else {
if (kind === 'status') {
_taskStatusFilter = _taskStatusFilter === value ? null : value;
_taskFilter = null;
} else {
_taskFilter = value;
if (value === null) _taskStatusFilter = null;
_taskStatusFilter = null;
}
_renderList();
});
+7 -1
View File
@@ -31,6 +31,7 @@ export const THEMES = {
arcade: { bg:'#15131d', fg:'#f4e85c', panel:'#0b1720', border:'#305f68', red:'#ff4f91' },
blueprint: { bg:'#10263b', fg:'#e8f1f5', panel:'#091a29', border:'#48758d', red:'#e6b84a' },
monolith: { bg:'#202020', fg:'#d8d8d2', panel:'#121212', border:'#50504b', red:'#b6e05c' },
yoyo: { bg:'#211f23', fg:'#dfdbd7', panel:'#141415', border:'#3e5146', red:'#e09d6c' },
};
const DEFAULT_THEME = 'dark';
@@ -67,6 +68,7 @@ const THEME_DEFAULT_PATTERN = {
arcade: 'synapse',
blueprint: 'dots',
monolith: 'perlin-flow',
yoyo: 'ascii-fireflies',
};
// Default effect colors for specific themes (overrides --fg)
@@ -80,6 +82,7 @@ const THEME_DEFAULT_EFFECT_COLOR = {
arcade: '#ff4f91',
blueprint: '#e6b84a',
monolith: '#b6e05c',
yoyo: '#b8e6c1',
};
// Default effect intensity (0..1) per theme. Any theme not listed defaults to 1.
@@ -87,6 +90,7 @@ const THEME_DEFAULT_INTENSITY = {
midnight: 0.5,
cyberpunk: 0.55,
terminal: 0.8,
yoyo: 0.8,
organs: 0.75,
};
@@ -694,7 +698,9 @@ export function initThemeUI() {
// Render custom theme swatches into separate card
const userGrid = document.getElementById('themeUserGrid');
const userCard = document.getElementById('themeUserCard');
const customEntries = Object.entries(customThemes);
// Hide legacy custom copies after a theme graduates into the preset list.
const customEntries = Object.entries(customThemes)
.filter(([name]) => !THEMES[name]);
if (customEntries.length > 0 && userGrid && userCard) {
userCard.style.display = '';
userGrid.innerHTML = customEntries.map(([name, c]) => `
+19 -13
View File
@@ -8809,11 +8809,11 @@ pre { background: var(--code-bg, var(--hl-bg, #282c34)) !important; }
transform-origin: left center;
}
.compare-pane.is-streaming {
border-color: color-mix(in srgb, #4da3ff 34%, var(--border));
box-shadow: inset 0 1px 0 color-mix(in srgb, #4da3ff 12%, transparent);
border-color: color-mix(in srgb, var(--accent, var(--red)) 34%, var(--border));
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--accent, var(--red)) 12%, transparent);
}
.compare-pane.is-streaming::before {
background: linear-gradient(90deg, transparent 0%, #4da3ff 35%, color-mix(in srgb, var(--red) 75%, #4da3ff) 50%, #4da3ff 65%, transparent 100%);
background: linear-gradient(90deg, transparent 0%, var(--accent, var(--red)) 35%, var(--red) 50%, var(--accent, var(--red)) 65%, transparent 100%);
animation: compare-pane-progress 1.25s linear infinite;
}
.compare-pane.is-awaiting-input {
@@ -9127,9 +9127,9 @@ pre { background: var(--code-bg, var(--hl-bg, #282c34)) !important; }
border-color: color-mix(in srgb, var(--border) 70%, transparent);
}
.pane-mode-search {
color: color-mix(in srgb, #4da3ff 82%, var(--fg));
background: color-mix(in srgb, #4da3ff 10%, var(--bg));
border-color: color-mix(in srgb, #4da3ff 28%, var(--border));
color: color-mix(in srgb, var(--accent, var(--red)) 82%, var(--fg));
background: color-mix(in srgb, var(--accent, var(--red)) 10%, var(--bg));
border-color: color-mix(in srgb, var(--accent, var(--red)) 28%, var(--border));
}
.pane-mode-research {
color: color-mix(in srgb, #36c48f 82%, var(--fg));
@@ -20797,6 +20797,13 @@ body:not(.email-doc-split-active) #email-lib-modal.email-lib-fullscreen:not(.mod
flex: 0 0 auto;
min-height: 0;
}
/* The active Tasks filter row is also a compact toolbar. Keep its wrapper
content-sized so changing a filter cannot make the mobile panel grow a
large empty gap between the chips and the task cards. */
.admin-card > .doclib-chip-scroll-frame:has(> #tasks-filter-chips) {
flex: 0 0 auto;
min-height: 0;
}
#memory-category-filters {
flex: 0 0 auto;
min-height: 25px;
@@ -21227,17 +21234,16 @@ body:not(.email-doc-split-active) #email-lib-modal.email-lib-fullscreen:not(.mod
color: color-mix(in srgb, var(--fg) 45%, transparent);
}
.pdf-loading-state {
min-height: 180px;
margin: 16px;
min-height: 120px;
margin: 0;
box-sizing: border-box;
flex-direction: column;
gap: 10px;
border: 1px solid color-mix(in srgb, var(--accent, var(--red)) 22%, var(--border));
border-radius: 12px;
background: color-mix(in srgb, var(--accent, var(--red)) 5%, var(--bg));
border: 0;
border-radius: 0;
background: transparent;
color: color-mix(in srgb, var(--fg) 68%, transparent);
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--fg) 7%, transparent),
0 8px 24px rgba(0, 0, 0, 0.12);
box-shadow: none;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.01em;
+4 -4
View File
@@ -62,7 +62,7 @@ const PRECACHE = [
'/static/js/tts-ai.js',
'/static/js/document.js?v=20260916docctx2',
'/static/js/gallery.js?v=20260910promptcopy1',
'/static/js/chatRenderer.js?v=20260914pdfstrip1',
'/static/js/chatRenderer.js?v=20260914metricssummary1',
'/static/js/codeRunner.js?v=20260831richtexttools91',
'/static/js/chatStream.js?v=20260914pdfstrip1',
'/static/js/chat.js?v=20260917toolttft1',
@@ -72,18 +72,18 @@ const PRECACHE = [
'/static/js/compare/vote.js?v=20260828resendcaldrag1',
'/static/js/colorPicker.js?v=20260910eyedropper1',
'/static/js/panels.js?v=20260909movepicklayer1',
'/static/js/theme.js?v=20260909effectspeed1',
'/static/js/theme.js?v=20260911organsrain1',
'/static/js/censor.js',
'/static/js/settings.js?v=20260912writingstyle3',
'/static/js/admin.js?v=20260914toolschemaprofiles1',
'/static/js/init.js?v=20260829chatstyle12',
'/static/js/slashCommands.js?v=20260902tuiharness1',
'/static/js/research/jobs.js?v=20260910researcherrorpersist1',
'/static/js/emailInbox.js?v=20260903emailsend2',
'/static/js/emailInbox.js?v=20260914aireply4',
'/static/js/emailLibrary/utils.js',
'/static/js/emailLibrary/signatureFold.js',
'/static/js/emailLibrary/state.js',
'/static/js/notes.js?v=20260910drawmerge2',
'/static/js/notes.js?v=20260911notesselectioncancel1',
'/static/js/tasks.js?v=20260914taskmodel1',
'/static/js/calendar.js?v=20260914emailsource11',
'/static/js/calendar/utils.js',