Restored from commit 52be710 (checkpoint before qwen oauth + todo roller): Enhanced UI Features: - SMART FIX button with AI code analysis - APEX (Autonomous Programming EXecution) mode - SHIELD (Auto-approval) mode - MULTIX MODE multi-task pipeline interface - Live streaming token counter - Thinking indicator with bouncing dots animation Components restored: - packages/ui/src/components/chat/multi-task-chat.tsx - packages/ui/src/components/instance/instance-shell2.tsx - packages/ui/src/components/settings/OllamaCloudSettings.tsx - packages/ui/src/components/settings/QwenCodeSettings.tsx - packages/ui/src/stores/solo-store.ts - packages/ui/src/stores/task-actions.ts - packages/ui/src/stores/session-events.ts (autonomous mode) - packages/server/src/integrations/ollama-cloud.ts - packages/server/src/server/routes/ollama.ts - packages/server/src/server/routes/qwen.ts This ensures all custom features are preserved in source control.
78 lines
2.3 KiB
TypeScript
78 lines
2.3 KiB
TypeScript
import { createSignal } from "solid-js"
|
|
import { getLogger } from "../lib/logger"
|
|
|
|
const log = getLogger("solo")
|
|
|
|
export interface SoloState {
|
|
isAutonomous: boolean
|
|
autoApproval: boolean
|
|
maxSteps: number
|
|
currentStep: number
|
|
activeTaskId: string | null
|
|
taskQueue: string[]
|
|
}
|
|
|
|
const [soloStates, setSoloStates] = createSignal<Map<string, SoloState>>(new Map())
|
|
|
|
export function getSoloState(instanceId: string): SoloState {
|
|
const state = soloStates().get(instanceId)
|
|
if (!state) {
|
|
return {
|
|
isAutonomous: false,
|
|
autoApproval: false,
|
|
maxSteps: 50,
|
|
currentStep: 0,
|
|
activeTaskId: null,
|
|
taskQueue: [],
|
|
}
|
|
}
|
|
return state
|
|
}
|
|
|
|
export function setSoloState(instanceId: string, partial: Partial<SoloState>) {
|
|
setSoloStates((prev) => {
|
|
const next = new Map(prev)
|
|
const current = getSoloState(instanceId)
|
|
next.set(instanceId, { ...current, ...partial })
|
|
return next
|
|
})
|
|
}
|
|
|
|
export function toggleAutonomous(instanceId: string) {
|
|
const current = getSoloState(instanceId)
|
|
setSoloState(instanceId, { isAutonomous: !current.isAutonomous })
|
|
log.info(`Autonomous mode ${!current.isAutonomous ? "enabled" : "disabled"} for ${instanceId}`)
|
|
}
|
|
|
|
export function toggleAutoApproval(instanceId: string) {
|
|
const current = getSoloState(instanceId)
|
|
setSoloState(instanceId, { autoApproval: !current.autoApproval })
|
|
log.info(`Auto-approval ${!current.autoApproval ? "enabled" : "disabled"} for ${instanceId}`)
|
|
}
|
|
|
|
export function incrementStep(instanceId: string) {
|
|
const state = getSoloState(instanceId)
|
|
setSoloState(instanceId, { currentStep: state.currentStep + 1 })
|
|
}
|
|
|
|
export function resetSteps(instanceId: string) {
|
|
setSoloState(instanceId, { currentStep: 0 })
|
|
}
|
|
|
|
export function setActiveTaskId(instanceId: string, taskId: string | null) {
|
|
setSoloState(instanceId, { activeTaskId: taskId })
|
|
}
|
|
|
|
export function addToTaskQueue(instanceId: string, taskId: string) {
|
|
const current = getSoloState(instanceId)
|
|
setSoloState(instanceId, { taskQueue: [...current.taskQueue, taskId] })
|
|
}
|
|
|
|
export function popFromTaskQueue(instanceId: string): string | null {
|
|
const current = getSoloState(instanceId)
|
|
if (current.taskQueue.length === 0) return null
|
|
const [next, ...rest] = current.taskQueue
|
|
setSoloState(instanceId, { taskQueue: rest })
|
|
return next
|
|
}
|