Make Gitea publishing claimant controlled

This commit is contained in:
2026-08-27 16:13:29 -07:00
parent 41e08611c9
commit a76ad5258b
10 changed files with 797 additions and 215 deletions
+113 -35
View File
@@ -471,6 +471,7 @@ async function syncIdeaToOpenGist(ideaId) {
async function syncIdeaToGitea(ideaId) {
const btn = document.getElementById('sync-gitea-btn');
const originalLabel = btn ? btn.innerText : '';
if (btn) btn.innerText = 'Publishing to Gitea...';
sessionStorage.setItem(`thinkstorm_active_tab_${window.location.pathname}`, 'tab-artifacts');
history.replaceState(null, null, '#artifacts');
@@ -482,7 +483,7 @@ async function syncIdeaToGitea(ideaId) {
setTimeout(() => window.location.reload(), 800);
} catch (err) {
showToast(err.message, 'danger');
if (btn) btn.innerText = '🔄 Publish / Re-sync to Gitea';
if (btn) btn.innerText = originalLabel;
}
}
@@ -535,32 +536,50 @@ function initMarkdownViews(root = document) {
if (container.dataset.initialized === 'true') return;
container.dataset.initialized = 'true';
const formattedBox = container.querySelector('.markdown-formatted');
const codeBox = container.querySelector('.markdown-code');
const rawSourceEl = container.querySelector('.raw-markdown-source');
let rawText = '';
if (rawSourceEl) {
rawText = rawSourceEl.value || rawSourceEl.textContent || '';
} else if (codeBox && codeBox.querySelector('code')) {
rawText = codeBox.querySelector('code').textContent || '';
} else if (container.dataset.content) {
rawText = container.dataset.content;
}
// Check if this container has multi-version panes
const versionPanes = container.querySelectorAll('.research-version-pane');
if (versionPanes.length > 0) {
versionPanes.forEach(pane => {
const formattedBox = pane.querySelector('.markdown-formatted');
const codeBox = pane.querySelector('.markdown-code');
const rawSourceEl = pane.querySelector('.raw-markdown-source');
const rawText = rawSourceEl ? (rawSourceEl.value || rawSourceEl.textContent || '') : '';
// Render formatted markdown HTML
if (formattedBox && rawText) {
formattedBox.innerHTML = renderMarkdownContent(rawText);
}
if (formattedBox && rawText) {
formattedBox.innerHTML = renderMarkdownContent(rawText);
}
if (codeBox && (!codeBox.querySelector('code') || !codeBox.querySelector('code').textContent)) {
codeBox.innerHTML = `<pre><code>${escapeHtml(rawText)}</code></pre>`;
}
});
} else {
const formattedBox = container.querySelector('.markdown-formatted');
const codeBox = container.querySelector('.markdown-code');
const rawSourceEl = container.querySelector('.raw-markdown-source');
let rawText = '';
if (rawSourceEl) {
rawText = rawSourceEl.value || rawSourceEl.textContent || '';
} else if (codeBox && codeBox.querySelector('code')) {
rawText = codeBox.querySelector('code').textContent || '';
} else if (container.dataset.content) {
rawText = container.dataset.content;
}
// Ensure codeBox has raw text
if (codeBox && (!codeBox.querySelector('code') || !codeBox.querySelector('code').textContent)) {
codeBox.innerHTML = `<pre><code>${escapeHtml(rawText)}</code></pre>`;
}
// Render formatted markdown HTML
if (formattedBox && rawText) {
formattedBox.innerHTML = renderMarkdownContent(rawText);
}
// Default to Formatted view
if (formattedBox) formattedBox.style.display = 'block';
if (codeBox) codeBox.style.display = 'none';
// Ensure codeBox has raw text
if (codeBox && (!codeBox.querySelector('code') || !codeBox.querySelector('code').textContent)) {
codeBox.innerHTML = `<pre><code>${escapeHtml(rawText)}</code></pre>`;
}
// Default to Formatted view
if (formattedBox) formattedBox.style.display = 'block';
if (codeBox) codeBox.style.display = 'none';
}
// Setup toggle buttons
const toggleBtns = container.querySelectorAll('.btn-toggle-view');
@@ -587,10 +606,7 @@ function initMarkdownViews(root = document) {
}
function setMarkdownContainerView(container, mode) {
const formattedBox = container.querySelector('.markdown-formatted');
const codeBox = container.querySelector('.markdown-code');
const toggleBtns = container.querySelectorAll('.btn-toggle-view');
toggleBtns.forEach(b => {
if (b.getAttribute('data-view') === mode) {
b.classList.add('active');
@@ -599,21 +615,82 @@ function setMarkdownContainerView(container, mode) {
}
});
if (mode === 'code') {
if (formattedBox) formattedBox.style.display = 'none';
if (codeBox) codeBox.style.display = 'block';
const versionPanes = container.querySelectorAll('.research-version-pane');
if (versionPanes.length > 0) {
versionPanes.forEach(pane => {
const formattedBox = pane.querySelector('.markdown-formatted');
const codeBox = pane.querySelector('.markdown-code');
if (mode === 'code') {
if (formattedBox) formattedBox.style.display = 'none';
if (codeBox) codeBox.style.display = 'block';
} else {
if (formattedBox) formattedBox.style.display = 'block';
if (codeBox) codeBox.style.display = 'none';
}
});
} else {
// Formatted by default
if (formattedBox) formattedBox.style.display = 'block';
if (codeBox) codeBox.style.display = 'none';
const formattedBox = container.querySelector('.markdown-formatted');
const codeBox = container.querySelector('.markdown-code');
if (mode === 'code') {
if (formattedBox) formattedBox.style.display = 'none';
if (codeBox) codeBox.style.display = 'block';
} else {
if (formattedBox) formattedBox.style.display = 'block';
if (codeBox) codeBox.style.display = 'none';
}
}
}
function switchResearchVersion(selectEl, stage) {
const selectedVersion = String(selectEl.value);
const container = selectEl.closest('.tab-panel') || document.getElementById(`tab-${stage.toLowerCase().replace('_', '-')}`);
if (!container) return;
// Toggle panes for this stage
const panes = container.querySelectorAll(`.research-version-pane[data-stage="${stage}"]`);
let activePane = null;
panes.forEach(pane => {
if (String(pane.dataset.version) === selectedVersion) {
pane.style.display = 'block';
activePane = pane;
} else {
pane.style.display = 'none';
}
});
// Update header meta badges
if (activePane) {
const metaContainer = container.querySelector('.markdown-view-meta');
if (metaContainer) {
const modelBadge = metaContainer.querySelector('.research-meta-model');
if (modelBadge && activePane.dataset.model) {
modelBadge.innerText = `🤖 ${activePane.dataset.model}`;
}
const tokenBadge = metaContainer.querySelector('.research-meta-tokens');
if (tokenBadge && activePane.dataset.tokens) {
tokenBadge.innerText = `${activePane.dataset.tokens} tokens`;
}
const timeBadge = metaContainer.querySelector('.research-meta-time');
if (timeBadge && activePane.dataset.time) {
timeBadge.innerText = `🕒 ${activePane.dataset.time}`;
}
}
}
}
async function copyMarkdownFromContainer(btn) {
const container = btn.closest('.markdown-view-container');
if (!container) return;
const rawSourceEl = container.querySelector('.raw-markdown-source');
const codeEl = container.querySelector('.markdown-code code');
// Find visible pane if multi-version
let targetRoot = container;
const visiblePane = container.querySelector('.research-version-pane:not([style*="display:none"]):not([style*="display: none"])');
if (visiblePane) {
targetRoot = visiblePane;
}
const rawSourceEl = targetRoot.querySelector('.raw-markdown-source');
const codeEl = targetRoot.querySelector('.markdown-code code');
const text = rawSourceEl ? (rawSourceEl.value || rawSourceEl.textContent) : (codeEl ? codeEl.textContent : '');
if (!text) {
@@ -660,4 +737,5 @@ function escapeHtml(text) {
window.renderMarkdownContent = renderMarkdownContent;
window.initMarkdownViews = initMarkdownViews;
window.setMarkdownContainerView = setMarkdownContainerView;
window.switchResearchVersion = switchResearchVersion;
window.copyMarkdownFromContainer = copyMarkdownFromContainer;