mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-11 09:22:21 +02:00
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:
+1
-1
@@ -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
@@ -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,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>
|
||||
|
||||
@@ -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,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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
@@ -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';
|
||||
|
||||
@@ -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
@@ -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';
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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]) => `
|
||||
|
||||
Reference in New Issue
Block a user