myagent-ai 1.32.5 → 1.32.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myagent-ai",
3
- "version": "1.32.5",
3
+ "version": "1.32.6",
4
4
  "description": "本地桌面端执行型AI助手 - Open Interpreter 风格 | Local Desktop Execution-Oriented AI Assistant",
5
5
  "main": "main.py",
6
6
  "bin": {
package/web/api_server.py CHANGED
@@ -4331,7 +4331,8 @@ window.addEventListener('beforeunload', function() {{
4331
4331
  if agent:
4332
4332
  # [v1.27.2] 先将 agent 路径转为数字 ID,用数字 ID 精确过滤
4333
4333
  target_aid = self.core.memory.get_agent_id(agent) if agent else 0
4334
- if agent == "1":
4334
+ # [v1.32.4] 兼容旧路径 "default" 和新路径 "1",两者都指全权Agent
4335
+ if agent == "1" or agent == "default":
4335
4336
  # default agent: agent_id=0(未分配)或 agent_id=1(default 的数字 ID)或 旧格式
4336
4337
  rows = conn.execute(
4337
4338
  f"""SELECT DISTINCT session_id, COUNT(*) as cnt, MAX(created_at) as last,
@@ -4400,7 +4401,8 @@ window.addEventListener('beforeunload', function() {{
4400
4401
  return web.json_response({"agent": name, "sessions": []})
4401
4402
  # [v1.27.2] 使用数字 agent_id 精确过滤,同时兼容旧数据
4402
4403
  target_aid = self.core.memory.get_agent_id(name)
4403
- if name == "1":
4404
+ # [v1.32.4] 兼容旧路径 "default" 和新路径 "1"
4405
+ if name == "1" or name == "default":
4404
4406
  # default agent: agent_id=0 或 agent_id=1 或 旧格式
4405
4407
  rows = self.core.memory._get_conn().execute(
4406
4408
  """SELECT DISTINCT session_id, COUNT(*) as cnt, MAX(created_at) as last FROM memories
@@ -150,7 +150,7 @@ function popoutChat() {
150
150
  const h = Math.min(720, screen.height - 100);
151
151
  const left = Math.round((screen.width - w) / 2);
152
152
  const top = Math.round((screen.height - h) / 2);
153
- window.open(popoutUrl, 'myagent_popout_' + (state.activeAgent || 'default'), 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes');
153
+ window.open(popoutUrl, 'myagent_popout_' + (state.activeAgent || '1'), 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',menubar=no,toolbar=no,location=no,status=no,scrollbars=yes,resizable=yes');
154
154
  }
155
155
 
156
156
  // Override toggleAgentPanel for mobile (deferred since function is defined later)
@@ -227,11 +227,11 @@ const state = {
227
227
  // ── Agent state (层级体系) ──
228
228
  agentTree: [], // 树形结构 [{path, name, children: [...], ...}]
229
229
  agentsFlat: [], // 扁平列表 [{path, name, parent, depth, ...}]
230
- activeAgent: 'default',
230
+ activeAgent: '1',
231
231
  agentPanelOpen: true,
232
232
  agentSessions: {}, // {agentPath: [{id, name, messages, last}]}
233
233
  agentDetails: {}, // {agentPath: {soul, identity, model, ...}}
234
- expandedNodes: new Set(['default']), // 树形展开状态
234
+ expandedNodes: new Set(['1']), // 树形展开状态
235
235
  modelsLibrary: [], // 模型库 [{id, name, provider, model, base_url, enabled, has_api_key, ...}]
236
236
  // ── Message queue during generation ──
237
237
  pendingMessages: [], // 待发送的消息队列 [{text, time}]
@@ -330,7 +330,7 @@ const StatePersistence = {
330
330
  // 持久化当前活跃会话ID,用于页面刷新后恢复
331
331
  if (state.activeSessionId && state.activeSessionId !== '__new__') {
332
332
  StatePersistence.save('activeSessionId', state.activeSessionId);
333
- StatePersistence.save('activeSessionAgent', state.activeAgent || 'default');
333
+ StatePersistence.save('activeSessionAgent', state.activeAgent || '1');
334
334
  }
335
335
  // 持久化当前会话的滚动位置(立即保存,不防抖)
336
336
  if (typeof saveScrollPosition === 'function') {
@@ -344,12 +344,12 @@ const StatePersistence = {
344
344
  },
345
345
  /** 恢复 UI 状态 */
346
346
  restoreUIState() {
347
- state.activeAgent = StatePersistence.load('activeAgent', 'default');
347
+ state.activeAgent = StatePersistence.load('activeAgent', '1');
348
348
  state.chatMode = StatePersistence.load('chatMode', 'exec');
349
349
  state.agentPanelOpen = StatePersistence.load('agentPanelOpen', true);
350
350
  var savedRpSections = StatePersistence.load('rpSections');
351
351
  if (savedRpSections) { Object.assign(rpSections, savedRpSections); }
352
- const savedNodes = StatePersistence.load('expandedNodes', ['default']);
352
+ const savedNodes = StatePersistence.load('expandedNodes', ['1']);
353
353
  state.expandedNodes = new Set(savedNodes);
354
354
  // 恢复上次活跃的会话 ID,供 loadSessions() 使用
355
355
  var savedSessionId = StatePersistence.load('activeSessionId', null);
@@ -529,23 +529,23 @@ async function initChat() {
529
529
  } else if (urlAgent) {
530
530
  var resolved = urlAgent;
531
531
  if (!findAgentByPath(resolved)) {
532
- console.warn('URL agent not found, fallback to default:', resolved);
533
- resolved = 'default';
532
+ console.warn('URL agent not found, fallback to master:', resolved);
533
+ resolved = findMasterAgentPath();
534
534
  }
535
535
  if (resolved !== state.activeAgent) {
536
536
  selectAgent(resolved);
537
537
  }
538
538
  } else if (urlSession) {
539
539
  // 只有 session 没有 agent,尝试从 session ID 推断 agent(兼容旧格式 agent_web_xxx)
540
- var targetAgent = 'default';
540
+ var targetAgent = findMasterAgentPath();
541
541
  if (urlSession.indexOf('_web_') >= 0) {
542
- targetAgent = urlSession.split('_web_')[0] || 'default';
542
+ targetAgent = urlSession.split('_web_')[0] || findMasterAgentPath();
543
543
  }
544
- // 新格式 sess_xxx 无法推断 agent,回退 default
544
+ // 新格式 sess_xxx 无法推断 agent,回退 master
545
545
  var target = targetAgent;
546
546
  if (!findAgentByPath(target)) {
547
- console.warn('Session-inferred agent not found, fallback to default:', target);
548
- target = 'default';
547
+ console.warn('Session-inferred agent not found, fallback to master:', target);
548
+ target = findMasterAgentPath();
549
549
  }
550
550
  if (target !== state.activeAgent) {
551
551
  selectAgent(target);
@@ -835,7 +835,7 @@ function hasTaskListChanged() {
835
835
 
836
836
  async function loadTaskPlan() {
837
837
  try {
838
- var agent = state.activeAgent || 'default';
838
+ var agent = state.activeAgent || '1';
839
839
  var session = state.activeSessionId || '';
840
840
  var url = '/api/task-plan?agent=' + encodeURIComponent(agent);
841
841
  if (session) url += '&session=' + encodeURIComponent(session);
@@ -906,7 +906,7 @@ async function toggleTaskDone(idx) {
906
906
  t.done = !t.done;
907
907
  }
908
908
  try {
909
- var agent = state.activeAgent || 'default';
909
+ var agent = state.activeAgent || '1';
910
910
  var session = state.activeSessionId || '';
911
911
  await api('/api/task-plan', {
912
912
  method: 'PUT',
@@ -931,7 +931,7 @@ async function addTaskItem() {
931
931
  if (!text) return;
932
932
  input.value = '';
933
933
  try {
934
- var agent = state.activeAgent || 'default';
934
+ var agent = state.activeAgent || '1';
935
935
  var session = state.activeSessionId || '';
936
936
  var data = await api('/api/task-plan', {
937
937
  method: 'POST',
@@ -948,7 +948,7 @@ async function addTaskItem() {
948
948
  async function deleteTaskItem(idx) {
949
949
  if (idx < 0 || idx >= state.taskItems.length) return;
950
950
  try {
951
- var agent = state.activeAgent || 'default';
951
+ var agent = state.activeAgent || '1';
952
952
  var session = state.activeSessionId || '';
953
953
  var url = '/api/task-plan/' + idx + '?agent=' + encodeURIComponent(agent);
954
954
  if (session) url += '&session=' + encodeURIComponent(session);
@@ -1822,6 +1822,28 @@ function findAgentByPath(path) {
1822
1822
  return state.agentsFlat.find(function(a) { return a.path === path; });
1823
1823
  }
1824
1824
 
1825
+ // [v1.32.4] 查找系统级 Agent 的路径(兼容旧路径 'default'/'配置助手' 和新路径 '1'/'2')
1826
+ function findMasterAgentPath() {
1827
+ // 优先按新路径 "1",兼容旧路径 "default",再按 system 标志+名称兜底
1828
+ var a = state.agentsFlat.find(function(x) { return x.path === '1'; })
1829
+ || state.agentsFlat.find(function(x) { return x.path === 'default'; })
1830
+ || state.agentsFlat.find(function(x) { return x.system && x.name === '全权Agent'; })
1831
+ || state.agentsFlat.find(function(x) { return x.system; });
1832
+ return a ? a.path : 'default';
1833
+ }
1834
+ function findHelperAgentPath() {
1835
+ var a = state.agentsFlat.find(function(x) { return x.path === '2'; })
1836
+ || state.agentsFlat.find(function(x) { return x.path === '配置助手'; })
1837
+ || state.agentsFlat.find(function(x) { return x.system && x.name === '配置助手'; })
1838
+ || null;
1839
+ return a ? a.path : null;
1840
+ }
1841
+ function isSystemAgentPath(path) {
1842
+ var mp = findMasterAgentPath();
1843
+ var hp = findHelperAgentPath();
1844
+ return path === mp || (hp !== null && path === hp);
1845
+ }
1846
+
1825
1847
  function getActiveAgentObj() {
1826
1848
  return findAgentByPath(state.activeAgent);
1827
1849
  }
@@ -1832,18 +1854,16 @@ async function loadAgents() {
1832
1854
  state.agentTree = treeData || [];
1833
1855
  state.agentsFlat = flattenTree(state.agentTree, 0, null);
1834
1856
 
1835
- if (!state.agentsFlat.find(function(a) { return a.path === 'default'; })) {
1836
- var defAgent = {path:'default', name:'default', depth:0, parent:null, description:'默认助手', avatar_emoji:'🤖', execution_mode:'local', avatar_color:getAgentColorClass('default'), session_count:0};
1837
- state.agentsFlat.unshift(defAgent);
1838
- state.agentTree.unshift(Object.assign({}, defAgent, {children:[]}));
1839
- }
1857
+ // [v1.32.4] 兼容旧路径:如果后端没有 path='default' agent,不创建合成的 fake agent
1858
+ // 而是依赖 findMasterAgentPath() 来正确解析 master agent 路径
1859
+ var _masterPath = findMasterAgentPath();
1840
1860
 
1841
1861
  for (var i = 0; i < state.agentsFlat.length; i++) {
1842
1862
  state.expandedNodes.add(state.agentsFlat[i].path);
1843
1863
  }
1844
1864
 
1845
1865
  if (!state.activeAgent || !findAgentByPath(state.activeAgent)) {
1846
- state.activeAgent = 'default';
1866
+ state.activeAgent = _masterPath;
1847
1867
  }
1848
1868
 
1849
1869
  renderAgentTree();
@@ -1852,10 +1872,10 @@ async function loadAgents() {
1852
1872
  await loadSessions();
1853
1873
  loadAllAgentSessions(); // fire-and-forget, will update recent agents
1854
1874
  } catch (e) {
1855
- var defAgent = {path:'default', name:'default', depth:0, parent:null, description:'默认助手', avatar_emoji:'🤖', execution_mode:'local', avatar_color:getAgentColorClass('default'), session_count:0};
1875
+ var defAgent = {path:'1', name:'全权Agent', depth:0, parent:null, description:'全权Agent - 拥有完整权限的本地助手', avatar_emoji:'🤖', execution_mode:'local', system:true, avatar_color:getAgentColorClass('全权Agent'), session_count:0};
1856
1876
  state.agentsFlat = [defAgent];
1857
1877
  state.agentTree = [Object.assign({}, defAgent, {children:[]})];
1858
- state.activeAgent = 'default';
1878
+ state.activeAgent = '1';
1859
1879
  renderAgentTree();
1860
1880
  updateActiveAgentBadge();
1861
1881
  updateExecModeUI();
@@ -1909,18 +1929,20 @@ function renderRightPanelSections() {
1909
1929
  function renderMasterAgentCard() {
1910
1930
  var el = document.getElementById('rpMasterAgent');
1911
1931
  if (!el) return;
1912
- var agent = findAgentByPath('default');
1913
- var isActive = state.activeAgent === 'default';
1932
+ // [v1.32.4] 使用 findMasterAgentPath() 兼容旧路径 'default' 和新路径 '1'
1933
+ var masterPath = findMasterAgentPath();
1934
+ var agent = findAgentByPath(masterPath);
1935
+ var isActive = state.activeAgent === masterPath;
1914
1936
  var name = agent ? agent.name : '全权Agent';
1915
1937
  var emoji = agent ? (agent.avatar_emoji || '🛡️') : '🛡️';
1916
1938
  var desc = agent ? (agent.description || '拥有完整权限的本地助手') : '拥有完整权限的本地助手';
1917
1939
  var color = agent ? (agent.avatar_color || 'linear-gradient(135deg,#6366f1,#8b5cf6)') : 'linear-gradient(135deg,#6366f1,#8b5cf6)';
1918
1940
  var bgStyle = color.includes('gradient') ? 'background:' + color : '';
1919
- var bgClass = color.includes('gradient') ? '' : getAgentColorClass('default');
1941
+ var bgClass = color.includes('gradient') ? '' : getAgentColorClass(masterPath);
1920
1942
  // [v1.20.9] 修复: avatar_image 不为空时显示图片,onerror 回退到 emoji
1921
1943
  var avatarContent = (agent && agent.avatar_image) ? '<img src="' + escapeHtml(agent.avatar_image) + '" style="width:100%;height:100%;object-fit:cover;border-radius:12px" onerror="this.outerHTML=\'' + escapeHtml(emoji) + '\'">' : emoji;
1922
1944
 
1923
- el.innerHTML = '<div class="rp-master-card ' + (isActive ? 'active' : '') + '" onclick="selectAgent(\'default\')">'
1945
+ el.innerHTML = '<div class="rp-master-card ' + (isActive ? 'active' : '') + '" onclick="selectAgent(\'' + escapeHtml(masterPath) + '\')">'
1924
1946
  + '<div class="rp-master-avatar ' + bgClass + '" style="' + bgStyle + '">' + avatarContent + '</div>'
1925
1947
  + '<div class="rp-master-info">'
1926
1948
  + '<div class="rp-master-name">' + escapeHtml(name) + '</div>'
@@ -1931,8 +1953,11 @@ function renderMasterAgentCard() {
1931
1953
  function renderHelperAgentCard() {
1932
1954
  var el = document.getElementById('rpHelperAgent');
1933
1955
  if (!el) return;
1934
- var agent = findAgentByPath('配置助手');
1935
- var isActive = state.activeAgent === '配置助手';
1956
+ // [v1.32.4] 使用 findHelperAgentPath() 兼容旧路径 '配置助手' 和新路径 '2'
1957
+ var helperPath = findHelperAgentPath();
1958
+ if (!helperPath) { el.innerHTML = ''; return; } // 无配置助手则不渲染
1959
+ var agent = findAgentByPath(helperPath);
1960
+ var isActive = state.activeAgent === helperPath;
1936
1961
  var name = agent ? agent.name : '配置助手';
1937
1962
  var emoji = agent ? (agent.avatar_emoji || '🛡️') : '🛡️';
1938
1963
  var desc = agent ? (agent.description || '智能配置助手') : '智能配置助手';
@@ -1945,7 +1970,7 @@ function renderHelperAgentCard() {
1945
1970
  avatarContent = emoji;
1946
1971
  }
1947
1972
 
1948
- el.innerHTML = '<div class="rp-helper-card ' + (isActive ? 'active' : '') + '" onclick="selectAgent(\'配置助手\')">'
1973
+ el.innerHTML = '<div class="rp-helper-card ' + (isActive ? 'active' : '') + '" onclick="selectAgent(\'' + escapeHtml(helperPath) + '\')">'
1949
1974
  + '<div class="rp-helper-avatar" style="' + (avatarImage ? 'background:transparent' : '') + '">' + avatarContent + '</div>'
1950
1975
  + '<div class="rp-master-info">'
1951
1976
  + '<div class="rp-master-name" style="font-size:13px">' + escapeHtml(name) + '</div>'
@@ -1962,7 +1987,7 @@ async function renderRecentAgents() {
1962
1987
  var recentAgents = [];
1963
1988
 
1964
1989
  for (var key in state.agentSessions) {
1965
- if (key === 'default' || key === '配置助手') continue;
1990
+ if (isSystemAgentPath(key)) continue;
1966
1991
  var sessions = state.agentSessions[key];
1967
1992
  if (sessions && sessions.length > 0) {
1968
1993
  var agent = findAgentByPath(key);
@@ -2168,10 +2193,10 @@ function quickChatAgent(agentPath) {
2168
2193
  }
2169
2194
 
2170
2195
  async function selectAgent(agentPath) {
2171
- // 安全校验:agent 必须在已加载的列表中存在,否则回退 default
2196
+ // 安全校验:agent 必须在已加载的列表中存在,否则回退 master agent
2172
2197
  if (!findAgentByPath(agentPath)) {
2173
- console.warn('selectAgent: agent not found, fallback to default:', agentPath);
2174
- agentPath = 'default';
2198
+ console.warn('selectAgent: agent not found, fallback to master:', agentPath);
2199
+ agentPath = findMasterAgentPath();
2175
2200
  }
2176
2201
  // 从群聊视图切换回个人聊天视图
2177
2202
  if (currentView === 'group') {
@@ -2575,7 +2600,7 @@ async function saveAgentModal(editPath, parentPath) {
2575
2600
  }
2576
2601
 
2577
2602
  async function deleteAgent(agentPath) {
2578
- if (agentPath === 'default') { toast('不能删除默认 Agent', 'error'); return; }
2603
+ if (agentPath === findMasterAgentPath()) { toast('不能删除默认 Agent', 'error'); return; }
2579
2604
  var msg = '确定删除 Agent "' + agentPath + '" 吗?\n\n删除后将同时清理:\n 📁 工作目录及所有文件\n 💬 该 Agent 的所有会话历史\n 🧠 相关记忆数据\n 🔗 所有子 Agent\n\n⚠️ 此操作不可撤销!';
2580
2605
  if (!confirm(msg)) return;
2581
2606
  try {
@@ -2583,7 +2608,7 @@ async function deleteAgent(agentPath) {
2583
2608
  toast('Agent 已删除', 'success');
2584
2609
  closeAgentModal();
2585
2610
  if (state.activeAgent === agentPath || state.activeAgent.startsWith(agentPath + '/')) {
2586
- state.activeAgent = 'default';
2611
+ state.activeAgent = findMasterAgentPath();
2587
2612
  }
2588
2613
  await loadAgents();
2589
2614
  } catch (e) {
@@ -5120,7 +5145,8 @@ function skipSetup() {
5120
5145
  StatePersistence.markSetupDone();
5121
5146
  try { api('/api/setup/complete', { method: 'POST' }); } catch(e) {}
5122
5147
  // 自动切换到配置助手 Agent
5123
- selectAgent('配置助手');
5148
+ var _helperPath = findHelperAgentPath();
5149
+ if (_helperPath) selectAgent(_helperPath);
5124
5150
  }
5125
5151
 
5126
5152
  function renderSetupDots() {
@@ -7,7 +7,7 @@
7
7
  // ── 输入框草稿持久化(按 agent + session 维度保存,刷新页面不丢失) ──
8
8
  var _draftTimer = null;
9
9
  function _draftKey() {
10
- return 'myagent_draft_' + (state.activeAgent || 'default') + '_' + (state.activeSessionId || '__new__');
10
+ return 'myagent_draft_' + (state.activeAgent || '1') + '_' + (state.activeSessionId || '__new__');
11
11
  }
12
12
  function saveDraft() {
13
13
  if (_draftTimer) clearTimeout(_draftTimer);
@@ -128,7 +128,7 @@ async function confirmLargeTextAction() {
128
128
  var text = _pendingLargeText;
129
129
  if (text === null || idx === null) return;
130
130
 
131
- var agentPath = state.activeAgent || 'default';
131
+ var agentPath = state.activeAgent || '1';
132
132
 
133
133
  if (idx === 0) {
134
134
  // 导入知识库
@@ -346,7 +346,7 @@ function exitGroupChat() {
346
346
  groupMessages = [];
347
347
  // [v1.23.81] 清除群聊 ?g= session URL,恢复普通聊天 URL
348
348
  var cleanUrl = '/ui/chat/chat_container.html';
349
- if (typeof state !== 'undefined' && state.activeAgent && state.activeAgent !== 'default') {
349
+ if (typeof state !== 'undefined' && state.activeAgent && state.activeAgent !== (typeof findMasterAgentPath === 'function' ? findMasterAgentPath() : '1')) {
350
350
  cleanUrl += '?a=' + encodeURIComponent(state.activeAgent);
351
351
  }
352
352
  if (typeof state !== 'undefined' && state.activeSessionId && state.activeSessionId !== '__new__') {
@@ -456,7 +456,7 @@ function startPrivateChatFromGroup(agentPath) {
456
456
  StatePersistence.remove('currentGroupId');
457
457
  // 清除群聊 URL 中的 ?g= 参数
458
458
  var cleanUrl = '/ui/chat/chat_container.html';
459
- if (typeof state !== 'undefined' && agentPath && agentPath !== 'default') {
459
+ if (typeof state !== 'undefined' && agentPath && agentPath !== (typeof findMasterAgentPath === 'function' ? findMasterAgentPath() : '1')) {
460
460
  cleanUrl += '?a=' + encodeURIComponent(agentPath);
461
461
  }
462
462
  window.history.replaceState({}, '', cleanUrl);