115 lines
3.6 KiB
JavaScript
115 lines
3.6 KiB
JavaScript
// state.js -- 全局共享状态
|
||
// 所有可变状态封装在 state 对象中,避免 ES module 只读绑定问题
|
||
|
||
export const STORAGE_DOF = "minor_web_bg_dof";
|
||
export const STORAGE_VIG = "minor_web_bg_vignette";
|
||
export const STORAGE_HEADER_COLLAPSED = "minor_web_header_collapsed";
|
||
|
||
// 声音阈值配置(已优化)
|
||
export const START_THRESHOLD = 0.18;
|
||
export const STOP_THRESHOLD = 0.06;
|
||
export const AUTO_START_DELAY = 100;
|
||
export const AUTO_STOP_DELAY = 800;
|
||
|
||
export const state = {
|
||
/** @type {string} */
|
||
sessionId: "",
|
||
/** @type {string[]} */
|
||
sessions: [],
|
||
/** @type {Object<string,string>} 会话ID → 所属工作区路径(会话列表按工作区分组) */
|
||
sessionWorkspaces: {},
|
||
/** @type {Object<string,string>} 文件相对路径 → git 状态(untracked|modified|deleted,文件树着色) */
|
||
gitStatus: {},
|
||
/** @type {File[]} */
|
||
pendingFiles: [],
|
||
pendingRefs: [], // Edit 模式引用:[{path, name, startLine, endLine, text}]
|
||
sending: false,
|
||
abortController: null,
|
||
mediaRecorder: null,
|
||
recorderStream: null,
|
||
recordedChunks: [],
|
||
recordingMimeType: "",
|
||
sidebarCollapsed: false,
|
||
|
||
// 自动语音输入相关变量
|
||
autoInputEnabled: false,
|
||
audioContext: null,
|
||
analyser: null,
|
||
dataArray: null,
|
||
mediaStreamSource: null,
|
||
autoInputStream: null,
|
||
autoRecordingTimeout: null,
|
||
silenceTimeout: null,
|
||
|
||
/** 最近一次 renderMessages 的 JSON 可序列化快照 */
|
||
lastRenderedMessages: [],
|
||
activeAudioController: null,
|
||
|
||
// 工具调用 / think 展开状态
|
||
liveToolCallExpanded: false,
|
||
thinkExpanded: false,
|
||
|
||
// 设置面板缓存
|
||
cachedAgentConfigs: [],
|
||
cachedToolConfigs: [],
|
||
cachedEnvConfig: {},
|
||
cachedModels: [],
|
||
registeredToolNames: [],
|
||
cachedGuiConfig: { monitors: [], selected_name: "", gui_model_id: "", models: [] },
|
||
editingModelIdx: -1,
|
||
|
||
// Skills 缓存
|
||
cachedSkills: [],
|
||
editingSkillName: "",
|
||
editingSkillAttachments: [],
|
||
|
||
// Todo 悬浮窗引用
|
||
_currentTodoOverlay: null,
|
||
|
||
// HumanInteraction 浮窗引用
|
||
_currentPendingOverlay: null,
|
||
|
||
// HumanInteraction 等待中标记(暂停按钮不恢复)
|
||
_pendingHumanAction: false,
|
||
|
||
// 当前会话的 token 用量
|
||
currentTokens: 0,
|
||
|
||
// 模型选择
|
||
selectedModelId: "",
|
||
|
||
// 输出模式(文字/语音,由 文本语音.svg 按钮开关控制)
|
||
outputMode: "text",
|
||
|
||
// 思考模式档位:low | high | xhigh | max | ultra
|
||
thinkingLevel: "low",
|
||
|
||
// 工作空间
|
||
workspacePath: "", // 当前选中的工作空间路径(空=使用默认)
|
||
workspaceList: [], // 已保存的工作空间路径列表
|
||
workspaceDefault: "", // 默认工作空间路径
|
||
forbiddenWorkspaces: [], // 禁止作为工作区的目录(如桌面),后端返回
|
||
accessMode: "restricted", // 工作空间访问模式:restricted(限制访问) | approval(权限审查) | full(完全访问)
|
||
|
||
// Edit 模式
|
||
editMode: false,
|
||
docFiles: [],
|
||
docOpenTabs: [],
|
||
activeDocFile: null,
|
||
activeDocTab: null,
|
||
_docTreeFolders: {},
|
||
_lastSelection: null,
|
||
_docRootPath: null, // 打开文件夹的根路径
|
||
|
||
// 当前模式:chat | edit | cron(统一源,editMode 保留向后兼容)
|
||
mode: "chat",
|
||
|
||
// Cron 定时任务模式
|
||
cronTasks: [], // 任务列表(summary)
|
||
activeCronTaskId: "", // 当前选中的任务 ID
|
||
cronRunning: false, // 是否有任务正在运行(控制发送按钮)
|
||
_cronLiveStopFn: null, // 当前 cron SSE 连接的停止函数
|
||
_cronPollTimer: null, // cron 模式下的状态轮询定时器
|
||
_cronEditingTaskId: "", // 正在编辑的任务 ID(空=新建)
|
||
};
|