chore: bump version to 0.5.0
Some checks failed
Beta Release / beta (push) Failing after 31s

💘 Generated with Crush

Assisted-by: GLM-5.1 via Crush <crush@charm.land>
This commit is contained in:
Augustin
2026-04-27 00:16:28 +02:00
parent d2bb42b212
commit 2a6647b5cb
3 changed files with 11 additions and 26 deletions

View File

@@ -7,7 +7,7 @@ import (
const (
Name = "muyue"
Version = "0.4.1"
Version = "0.5.0"
Author = "La Légion de Muyue"
)

View File

@@ -214,7 +214,6 @@ function getTheme(themeName) {
}
function createTerminal(container, settings = {}) {
console.log('[Shell] createTerminal called with settings:', JSON.stringify({ fontSize: settings.fontSize, fontFamily: settings.fontFamily?.slice(0, 30), theme: settings.theme }))
const theme = getTheme(settings.theme || 'system')
const actualFontSize = settings.fontSize || 14
const term = new XTerm({
@@ -528,20 +527,15 @@ export default function Shell({ api, isSudo }) {
setSystemTerminals(d.system || [])
}).catch(() => {})
api.getConfig().then(d => {
console.log('[Shell] config response terminal:', JSON.stringify(d?.terminal))
if (d.terminal) {
const fontSize = d.terminal.font_size || 14
const fontFamily = d.terminal.font_family || "'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', 'Menlo', monospace"
const theme = d.terminal.theme || 'system'
console.log('[Shell] setting fontSize to:', fontSize, 'from config')
setTerminalSettings({ fontSize, fontFamily, theme })
settingsRef.current = { fontSize, fontFamily, theme }
baseFontSizeRef.current = fontSize
} else {
console.log('[Shell] no terminal config in response, using defaults')
}
setConfigLoaded(true)
console.log('[Shell] configLoaded = true, settingsRef:', JSON.stringify(settingsRef.current))
}).catch((err) => { console.warn('[Shell] getConfig failed:', err); setConfigLoaded(true) })
}, [])
@@ -553,7 +547,6 @@ export default function Shell({ api, isSudo }) {
const s = settingsRef.current
const effectiveFontSize = s.fontSize + zoomLevel * 2
console.log(`[Shell] initTerminal tab=${tabId}: settingsRef.fontSize=${s.fontSize}, zoomLevel=${zoomLevel}, effectiveFontSize=${effectiveFontSize}`)
const { term, fitAddon, searchAddon } = createTerminal(container, {
fontSize: effectiveFontSize,
fontFamily: s.fontFamily,
@@ -646,14 +639,11 @@ export default function Shell({ api, isSudo }) {
const bufferSaveInterval = setInterval(() => { if (!disposed) saveBuffer() }, 5000)
console.log(`[Shell] initTerminal tab=${tabId} type=${tab.type} name="${tab.name}" shell="${tab.shell || '(default)'}"`)
tabsRef.current[tabId] = { term, fitAddon, searchAddon, ws, resizeObserver, onResize, bufferSaveInterval, saveBuffer, disposed: () => disposed }
tabsRef.current[tabId]._markDisposed = () => { disposed = true }
console.log(`[Shell] initTerminal tab=${tabId} done, tabsRef keys:`, Object.keys(tabsRef.current))
const pending = pendingCommandsRef.current[tabId]
if (pending && pending.length > 0) {
console.log(`[Shell] Flushing ${pending.length} pending commands for tab ${tabId}`)
for (const cmd of pending) {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: 'input', data: cmd + '\r' }))
@@ -709,7 +699,6 @@ export default function Shell({ api, isSudo }) {
const tryInitTab = (tab, attempt) => {
if (cancelled) return
if (attempt > 20) {
console.warn(`[Shell] max attempts reached for tab ${tab.id}`)
return
}
@@ -733,7 +722,6 @@ export default function Shell({ api, isSudo }) {
}
if (!tabsRef.current[tab.id]) {
console.log(`[Shell] tryInitTab: calling initTerminal for tab ${tab.id}, configLoaded=${configLoaded}`)
initTerminal(tab.id, tab)
}
@@ -752,7 +740,6 @@ export default function Shell({ api, isSudo }) {
})
}
console.log(`[Shell] init effect: tabs=${tabs.length}, configLoaded=${configLoaded}`)
for (const tab of tabs) {
if (configLoaded && !tabsRef.current[tab.id]) {
tryInitTab(tab, 0)
@@ -1033,7 +1020,6 @@ export default function Shell({ api, isSudo }) {
pendingCommandsRef.current[targetId].push(code)
return
}
console.log(`[Shell] sendToTerminal: tab ${targetId}${code.length} chars`)
entry.ws.send(JSON.stringify({ type: 'input', data: code + '\r' }))
}, [])
@@ -1120,7 +1106,6 @@ export default function Shell({ api, isSudo }) {
}
const currentTab = activeTabRef.current
console.log(`[Shell] _sendAiMessage: activeTab=${currentTab}, fromEvent=${fromEvent}, text="${trimmed.slice(0, 50)}"`)
setAiMessages(prev => [...prev, { role: 'user', content: trimmed, _tabId: currentTab, _analysis: isAnalysis || undefined }])
setAiLoading(true)

View File

@@ -270,7 +270,7 @@ function CodeBlockWithCopy({ part, index, copiedIdx, setCopiedIdx }) {
)
}
function FeedItem({ msg }) {
function FeedItem({ msg, activeAgents, onModeChange }) {
const isUser = msg.role === 'user'
const isSystem = msg.role === 'system'
const rank = getRank(msg.role)
@@ -352,7 +352,7 @@ function FeedItem({ msg }) {
const result = r && (r.content !== undefined || r.is_error !== undefined)
? { content: r.content, is_error: r.is_error }
: null
return <ToolCallBlock key={`tc${i}`} call={seg.call} result={result} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
return <ToolCallBlock key={`tc${i}`} call={seg.call} result={result} activeAgents={activeAgents} onModeChange={onModeChange} />
}
return null
})
@@ -365,7 +365,7 @@ function FeedItem({ msg }) {
const result = resultData
? { content: resultData.result, is_error: resultData.is_error }
: null
return <ToolCallBlock key={tc.tool_call_id || i} call={tc} result={result} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
return <ToolCallBlock key={tc.tool_call_id || i} call={tc} result={result} activeAgents={activeAgents} onModeChange={onModeChange} />
})}
{cleanContent && (
<div className="feed-content">
@@ -385,7 +385,7 @@ function FeedItem({ msg }) {
)
}
function StreamingItem({ content, thinking, toolCalls, segments }) {
function StreamingItem({ content, thinking, toolCalls, segments, activeAgents, onModeChange }) {
const rank = RANKS.general
const cleanContent = content.replace(/<think[^>]*>[\s\S]*?<\/think>/gi, '')
const hasToolCalls = toolCalls && toolCalls.length > 0
@@ -434,14 +434,14 @@ function StreamingItem({ content, thinking, toolCalls, segments }) {
)
}
if (seg.type === 'tool') {
return <ToolCallBlock key={`tc${i}`} call={seg.call} result={seg.result} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
return <ToolCallBlock key={`tc${i}`} call={seg.call} result={seg.result} activeAgents={activeAgents} onModeChange={onModeChange} />
}
return null
})
) : (
<>
{hasToolCalls && toolCalls.map((tc, i) => (
<ToolCallBlock key={tc.call?.tool_call_id || i} call={tc.call} result={tc.result} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
<ToolCallBlock key={tc.call?.tool_call_id || i} call={tc.call} result={tc.result} activeAgents={activeAgents} onModeChange={onModeChange} />
))}
{cleanContent && (
<div className="feed-content">
@@ -882,7 +882,7 @@ export default function Studio({ api }) {
<span className="feed-summary-toggle">{summarizedExpanded ? 'masquer' : 'voir'}</span>
</div>
{summarizedExpanded && summarizedMsgs.map(msg => (
<FeedItem key={msg.id} msg={msg} />
<FeedItem key={msg.id} msg={msg} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
))}
</div>
)
@@ -894,7 +894,7 @@ export default function Studio({ api }) {
<>
{renderSummaryBlock()}
{activeMsgs.slice(0, visibleCount).map(msg => (
<FeedItem key={msg.id} msg={msg} />
<FeedItem key={msg.id} msg={msg} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
))}
<div className="feed-collapsed-messages" onClick={handleToggleCollapsed}>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
@@ -911,7 +911,7 @@ export default function Studio({ api }) {
<>
{renderSummaryBlock()}
{activeMsgs.map(msg => (
<FeedItem key={msg.id} msg={msg} />
<FeedItem key={msg.id} msg={msg} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
))}
</>
)
@@ -935,7 +935,7 @@ export default function Studio({ api }) {
<div className="studio-feed" ref={feedRef}>
{renderMessages()}
{(streaming || streamThinking || loading || streamToolCalls.length > 0) && (
<StreamingItem content={streaming} thinking={streamThinking} toolCalls={streamToolCalls} segments={streamSegments} />
<StreamingItem content={streaming} thinking={streamThinking} toolCalls={streamToolCalls} segments={streamSegments} activeAgents={activeAgents} onModeChange={handleToolModeChange} />
)}
<div ref={messagesEnd} style={{ height: '24px' }} />
</div>