ec-web 0.0.2 → 0.0.3

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/dist/fs-utils.js CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
- * 文件系统工具层(独立版)— 内联自 evolclaw session-fs-store + watch-msg 数据层。
2
+ * 文件系统工具层(独立版)— 内联自 evolcore session-fs-store + watch-msg 数据层。
3
3
  *
4
4
  * 只包含 watch-web 实际用到的函数,无任何 npm 依赖。
5
5
  */
6
6
  import fs from 'fs';
7
7
  import path from 'path';
8
8
  import { resolvePaths } from './paths.js';
9
- // ── 编解码(与 evolclaw encodeSegment / decodeDirSegment 一致)──
9
+ // ── 编解码(与 evolcore encodeSegment / decodeDirSegment 一致)──
10
10
  const UNSAFE_CHARS_RE = /[<>:"/\\|?*\x00-\x1F%]/g;
11
11
  export function encodeSegment(s) {
12
12
  return s.replace(UNSAFE_CHARS_RE, ch => '%' + ch.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0'));
@@ -14,7 +14,7 @@ export function encodeSegment(s) {
14
14
  export function decodeDirSegment(seg) {
15
15
  return seg.replace(/%([0-9A-Fa-f]{2})/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
16
16
  }
17
- /** 与 evolclaw cross-platform.ts encodePath 一致(CC transcript 目录名) */
17
+ /** 与 evolcore cross-platform.ts encodePath 一致(CC transcript 目录名) */
18
18
  export function encodePath(p) {
19
19
  const isWindows = process.platform === 'win32';
20
20
  const norm = isWindows ? p.replace(/\\/g, '/') : p;
package/dist/index.js CHANGED
@@ -3,10 +3,10 @@
3
3
  * ec-web — EvolCore 监控面板独立程序。
4
4
  *
5
5
  * 用法:
6
- * ec-web [--port 42705] [--home <EVOLCLAW_HOME>]
6
+ * ec-web [--port 42705] [--home <EVOLCORE_HOME>]
7
7
  *
8
- * 通过 EVOLCLAW_HOME 定位 evolclaw 数据目录,启动 HTTP+WS 服务,浏览器配对码登录。
9
- * 与 evolclaw daemon 通过 IPC socket(live 状态)+ 文件系统(历史数据)旁路通信。
8
+ * 通过 EVOLCORE_HOME 定位 evolcore 数据目录,启动 HTTP+WS 服务,浏览器配对码登录。
9
+ * 与 evolcore daemon 通过 IPC socket(live 状态)+ 文件系统(历史数据)旁路通信。
10
10
  */
11
11
  import fs from 'fs';
12
12
  import path from 'path';
@@ -22,20 +22,20 @@ for (let i = 0; i < argv.length; i++) {
22
22
  else if (a === '--home' || a === '-h')
23
23
  home = argv[++i];
24
24
  else if (a === '--help') {
25
- process.stdout.write(`ec-web — EvolCore 监控面板\n\n用法:\n ec-web [--port 42705] [--home <EVOLCLAW_HOME>]\n\n选项:\n --port, -p 监听端口(默认 42705,占用则自动 +1)\n --home 当前运行时数据目录(现阶段默认读 EVOLCLAW_HOME 或 ~/.evolclaw)\n`);
25
+ process.stdout.write(`ec-web — EvolCore 监控面板\n\n用法:\n ec-web [--port 42705] [--home <EVOLCORE_HOME>]\n\n选项:\n --port, -p 监听端口(默认 42705,占用则自动 +1)\n --home 当前运行时数据目录(现阶段默认读 EVOLCORE_HOME 或 ~/.evolcore)\n`);
26
26
  process.exit(0);
27
27
  }
28
28
  }
29
29
  // --home 优先级最高:写入环境变量,paths.ts 读取
30
30
  if (home)
31
- process.env.EVOLCLAW_HOME = path.resolve(home);
31
+ process.env.EVOLCORE_HOME = path.resolve(home);
32
32
  // 延迟到环境变量设置后再导入(paths.ts 缓存 root)
33
33
  const { resolvePaths } = await import('./paths.js');
34
34
  const { startWatchWebServer } = await import('./server.js');
35
35
  const p = resolvePaths();
36
36
  // 校验 home 目录存在
37
37
  if (!fs.existsSync(p.root)) {
38
- process.stderr.write(`❌ EVOLCLAW_HOME 不存在: ${p.root}\n 用 --home 指定正确路径,或设置 EVOLCLAW_HOME 环境变量。\n`);
38
+ process.stderr.write(`❌ EVOLCORE_HOME 不存在: ${p.root}\n 用 --home 指定正确路径,或设置 EVOLCORE_HOME 环境变量。\n`);
39
39
  process.exit(1);
40
40
  }
41
41
  const useColor = !!process.stdout.isTTY;
@@ -1,8 +1,8 @@
1
1
  /**
2
- * evolclaw IPC client(独立版)— 通过 Unix socket / 命名管道查询运行中的 daemon。
2
+ * evolcore IPC client(独立版)— 通过 Unix socket / 命名管道查询运行中的 daemon。
3
3
  *
4
4
  * 协议:newline-delimited JSON,一问一答即断。
5
- * 与 evolclaw src/ipc.ts 的 ipcQuery 一致;连不上返回 null(daemon 未运行)。
5
+ * 与 evolcore src/ipc.ts 的 ipcQuery 一致;连不上返回 null(daemon 未运行)。
6
6
  *
7
7
  * watch 用到的只读查询:aun-aids / aun-aid-stats / status / evolagent.list / ping
8
8
  */
package/dist/paths.js CHANGED
@@ -1,14 +1,14 @@
1
1
  /**
2
- * evolclaw 路径解析(独立版)。
2
+ * evolcore 路径解析(独立版)。
3
3
  *
4
- * watch 进程只需要 EVOLCLAW_HOME 根目录,所有地址从它派生。
5
- * 逻辑与 evolclaw src/paths.ts 对齐,但不依赖 evolclaw 代码。
4
+ * watch 进程只需要 EVOLCORE_HOME 根目录,所有地址从它派生。
5
+ * 逻辑与 evolcore src/paths.ts 对齐,但不依赖 evolcore 代码。
6
6
  *
7
7
  * 根目录解析优先级:
8
- * 1. --home 命令行参数(由 index.ts 写入 process.env.EVOLCLAW_HOME)
9
- * 2. EVOLCLAW_HOME 环境变量
8
+ * 1. --home 命令行参数(由 index.ts 写入 process.env.EVOLCORE_HOME)
9
+ * 2. EVOLCORE_HOME 环境变量
10
10
  * 3. cwd/agents/defaults.json 存在 → cwd(开发模式)
11
- * 4. ~/.evolclaw
11
+ * 4. ~/.evolcore
12
12
  */
13
13
  import path from 'path';
14
14
  import os from 'os';
@@ -19,24 +19,24 @@ let _root = null;
19
19
  export function resolveRoot() {
20
20
  if (_root)
21
21
  return _root;
22
- if (process.env.EVOLCLAW_HOME) {
23
- _root = process.env.EVOLCLAW_HOME;
22
+ if (process.env.EVOLCORE_HOME) {
23
+ _root = process.env.EVOLCORE_HOME;
24
24
  }
25
25
  else if (fs.existsSync(path.join(process.cwd(), 'agents', 'defaults.json'))) {
26
26
  _root = process.cwd();
27
27
  }
28
28
  else {
29
- _root = path.join(os.homedir(), '.evolclaw');
29
+ _root = path.join(os.homedir(), '.evolcore');
30
30
  }
31
31
  return _root;
32
32
  }
33
- /** socket 路径派生:与 evolclaw resolveInstanceSocketPath 完全一致 */
33
+ /** socket 路径派生:与 evolcore resolveInstanceSocketPath 完全一致 */
34
34
  function resolveInstanceSocketPath(root) {
35
35
  if (isWindows) {
36
36
  const hash = crypto.createHash('sha1').update(root).digest('hex').slice(0, 12);
37
- return `\\\\.\\pipe\\evolclaw-${hash}`;
37
+ return `\\\\.\\pipe\\daemon-${hash}`;
38
38
  }
39
- return path.join(root, 'data', 'instance', 'evolclaw.sock');
39
+ return path.join(root, 'data', 'instance', 'daemon.sock');
40
40
  }
41
41
  export function resolvePaths() {
42
42
  const root = resolveRoot();
@@ -1,7 +1,7 @@
1
1
  /**
2
- * 进程工具(独立版)— 内联自 evolclaw cross-platform + process-introspect + instance-registry。
2
+ * 进程工具(独立版)— 内联自 evolcore cross-platform + process-introspect + instance-registry。
3
3
  *
4
- * 只包含 ecweb 单实例保护实际用到的函数,无任何 evolclaw 代码依赖。
4
+ * 只包含 ecweb 单实例保护实际用到的函数,无任何 evolcore 代码依赖。
5
5
  * 关键不变量:杀进程前用启动时间比对防 PID 复用,按端口兜底时只杀确认是 ecweb 的进程。
6
6
  */
7
7
  import fs from 'fs';
package/dist/server.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * - 鉴权: 6 位配对码(5 分钟有效)→ token(30 天,有访问自动续期),持久化到磁盘
7
7
  * - 安全: 绑定 0.0.0.0(支持远程访问),token 校验,只读
8
8
  *
9
- * 与 evolclaw 的唯一通信:启动时发 ping 检查 protocolVersion(soft 校验)。
9
+ * 与 evolcore 的唯一通信:启动时发 ping 检查 protocolVersion(soft 校验)。
10
10
  */
11
11
  import http from 'http';
12
12
  import fs from 'fs';
@@ -39,7 +39,7 @@ const STATIC_DIR = path.join(__dirname, 'static');
39
39
  const TOKEN_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30天(滑动窗口:每次有效访问刷新 lastActive 自动续期)
40
40
  const PAIRING_TTL_MS = 5 * 60 * 1000; // 5min
41
41
  const DEFAULT_PORT = 42705;
42
- const PROTOCOL_VERSION = 1; // 与 evolclaw ping response 对齐的软校验版本
42
+ const PROTOCOL_VERSION = 1; // 与 evolcore ping response 对齐的软校验版本
43
43
  function daemonOwnerMenuAuth() {
44
44
  return { localDirect: true, actorAid: null };
45
45
  }
@@ -644,7 +644,7 @@ export async function startWatchWebServer(opts = {}) {
644
644
  const p = resolvePaths();
645
645
  const pingResp = await ipcQuery(p.socket, { type: 'ping' }, 1000);
646
646
  if (pingResp && pingResp.protocolVersion !== undefined && pingResp.protocolVersion < PROTOCOL_VERSION) {
647
- log(`⚠️ evolclaw protocolVersion=${pingResp.protocolVersion},watch 期望 >=${PROTOCOL_VERSION},部分功能可能异常`);
647
+ log(`⚠️ evolcore protocolVersion=${pingResp.protocolVersion},watch 期望 >=${PROTOCOL_VERSION},部分功能可能异常`);
648
648
  }
649
649
  let pairingCode = genPairingCode();
650
650
  let pairingExpiry = Date.now() + PAIRING_TTL_MS;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * AID 数据源 — 复用 daemon 的 IPC socket(与 evolclaw `watch aid` 同源)。
2
+ * AID 数据源 — 复用 daemon 的 IPC socket(与 evolcore `watch aid` 同源)。
3
3
  *
4
4
  * daemon 运行时:拉 aun-aids / aun-aid-stats / agent-stats / status / evolagent.list。
5
5
  * daemon 未运行时:降级到读 instance/ 目录的 aid-*.jsonl(精简版 scanInstances)。
@@ -64,7 +64,7 @@ function scanAidActivity() {
64
64
  }
65
65
  return result;
66
66
  }
67
- // evolclaw 版本:与 watch aid 状态栏一致。daemon 进程级、整轮 watch 不变,
67
+ // evolcore 版本:与 watch aid 状态栏一致。daemon 进程级、整轮 watch 不变,
68
68
  // 故缓存一次(首次 menu.query name=system 拿到后复用),避免每秒多发一次 IPC。
69
69
  let _cachedVersion = null;
70
70
  async function fetchVersion(socket) {
@@ -14,7 +14,7 @@ async function getSnapshot() {
14
14
  const sock = resolvePaths().socket;
15
15
  const resp = await ipcQuery(sock, { type: 'menu.exec', payload: { type: 'menu.query', name: 'gateway', id: 'ecw-gateway-snap' }, auth: { source: 'ecweb', localDirect: true } }, 5000);
16
16
  if (!resp) {
17
- return { gateways: [], scopes: [], types: [], error: 'evolclaw 未运行或 socket 不可达' };
17
+ return { gateways: [], scopes: [], types: [], error: 'evolcore 未运行或 socket 不可达' };
18
18
  }
19
19
  if (!resp.ok) {
20
20
  return { gateways: [], scopes: [], types: [], error: resp.error || 'daemon 返回失败' };
@@ -2,7 +2,7 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { resolvePaths } from '../paths.js';
4
4
  const LOG_SOURCES = [
5
- { id: 'evolclaw', label: 'Daemon', pattern: /^evolclaw(?:-.+)?\.log$/ },
5
+ { id: 'daemon', label: 'Daemon', pattern: /^daemon(?:-.+)?\.log$/ },
6
6
  { id: 'ecweb', label: 'ECWeb', pattern: /^(?:watch-web|ecweb[^/]*)\.(?:log|out)$/ },
7
7
  { id: 'stdout', label: 'Standard output', pattern: /^stdout\.log(?:\..+)?$/ },
8
8
  { id: 'aun', label: 'AUN', pattern: /^aun(?:-.+)?\.log$/ },
@@ -350,7 +350,7 @@ function buildSnapshot(params = {}) {
350
350
  const requested = String(params.source || '');
351
351
  const selectedSource = sources.some(source => source.id === requested)
352
352
  ? requested
353
- : (sources.some(source => source.id === 'evolclaw') ? 'evolclaw' : (sources[0]?.id || null));
353
+ : (sources.some(source => source.id === 'daemon') ? 'daemon' : (sources[0]?.id || null));
354
354
  const source = LOG_SOURCES.find(item => item.id === selectedSource);
355
355
  const limit = Math.min(MAX_LIMIT, Math.max(100, Number(params.limit) || DEFAULT_LIMIT));
356
356
  const lines = source ? linesFor(files, source, limit) : [];
@@ -550,7 +550,7 @@ async function buildSessionContext(chat) {
550
550
  catch { }
551
551
  return {
552
552
  sessionId: active.agentSessionId || active.id || null,
553
- evolclawSessionId: active.id || null,
553
+ evolcoreSessionId: active.id || null,
554
554
  name: active.name || null,
555
555
  baseagent: active.baseagent || active.agentType || null,
556
556
  chatMode,
@@ -3,13 +3,13 @@ import path from 'path';
3
3
  import { createRequire } from 'module';
4
4
  import { fileURLToPath } from 'url';
5
5
  let packageRootCache = null;
6
- function isEvolclawPackageRoot(dir) {
6
+ function isEvolcorePackageRoot(dir) {
7
7
  const pkgPath = path.join(dir, 'package.json');
8
8
  if (!fs.existsSync(pkgPath))
9
9
  return false;
10
10
  try {
11
11
  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
12
- return pkg?.name === 'evolclaw';
12
+ return pkg?.name === 'evolcore';
13
13
  }
14
14
  catch {
15
15
  return false;
@@ -18,7 +18,7 @@ function isEvolclawPackageRoot(dir) {
18
18
  function findUp(start) {
19
19
  let dir = path.resolve(start);
20
20
  while (true) {
21
- if (isEvolclawPackageRoot(dir))
21
+ if (isEvolcorePackageRoot(dir))
22
22
  return dir;
23
23
  const parent = path.dirname(dir);
24
24
  if (parent === dir)
@@ -29,14 +29,14 @@ function findUp(start) {
29
29
  function candidateStarts() {
30
30
  const here = path.dirname(fileURLToPath(import.meta.url));
31
31
  const starts = [
32
- process.env.EVOLCLAW_PACKAGE_ROOT,
32
+ process.env.EVOLCORE_PACKAGE_ROOT,
33
33
  here,
34
34
  process.cwd(),
35
35
  process.argv[1] ? path.dirname(process.argv[1]) : undefined,
36
36
  ];
37
37
  return [...new Set(starts.filter((item) => !!item))];
38
38
  }
39
- export function resolveEvolclawPackageRoot() {
39
+ export function resolveEvolcorePackageRoot() {
40
40
  if (packageRootCache)
41
41
  return packageRootCache;
42
42
  const searched = [];
@@ -50,9 +50,9 @@ export function resolveEvolclawPackageRoot() {
50
50
  }
51
51
  try {
52
52
  const require = createRequire(import.meta.url);
53
- const pkgJson = require.resolve('evolclaw/package.json');
53
+ const pkgJson = require.resolve('evolcore/package.json');
54
54
  const root = path.dirname(pkgJson);
55
- if (isEvolclawPackageRoot(root)) {
55
+ if (isEvolcorePackageRoot(root)) {
56
56
  packageRootCache = root;
57
57
  return root;
58
58
  }
@@ -63,7 +63,7 @@ export function resolveEvolclawPackageRoot() {
63
63
  throw new Error(`Main package root not found. searched=${searched.join(', ')}`);
64
64
  }
65
65
  export function resolveParentDistModule(...segments) {
66
- const root = resolveEvolclawPackageRoot();
66
+ const root = resolveEvolcorePackageRoot();
67
67
  const modulePath = path.join(root, 'dist', ...segments);
68
68
  if (!fs.existsSync(modulePath)) {
69
69
  throw new Error(`Main package dist module not found: ${modulePath}. Run npm run build in ${root}.`);
@@ -7,15 +7,15 @@
7
7
  * 3. WebSocket 推送角色配置变化
8
8
  *
9
9
  * 数据流:
10
- * - 读取:从 evolclaw/dist/config/roles.ts 导入 readRolesConfig
11
- * - 写入:保存到 .evolclaw/roles.json
10
+ * - 读取:从 evolcore/dist/config/roles.ts 导入 readRolesConfig
11
+ * - 写入:保存到 .evolcore/roles.json
12
12
  * - 推送:2秒轮询 + JSON diff
13
13
  */
14
14
  import { getModelCatalogSnapshot } from './models.js';
15
15
  import { resolveParentDistModule, toFileUrl } from './parent-package.js';
16
16
  import { resolvePaths } from '../paths.js';
17
17
  import { ipcQuery } from '../ipc-client.js';
18
- // 动态导入 evolclaw 主项目的角色配置模块
18
+ // 动态导入 evolcore 主项目的角色配置模块
19
19
  async function getRolesModule() {
20
20
  const rolesPath = resolveParentDistModule('config', 'roles.js');
21
21
  const cmPath = resolveParentDistModule('config', 'config-manager.js');
@@ -424,8 +424,8 @@ function validateCommandPermissionConstraints(rule, constraints, errors) {
424
424
  if (!Number.isInteger(value) || value < 0)
425
425
  errors.push(`${label} must be a non-negative integer`);
426
426
  }
427
- else if (key === 'cwdPolicy' && !['agentProject', 'evolclawHome', 'none'].includes(String(value))) {
428
- errors.push(`${label} must be agentProject, evolclawHome, or none`);
427
+ else if (key === 'cwdPolicy' && !['agentProject', 'evolcoreHome', 'none'].includes(String(value))) {
428
+ errors.push(`${label} must be agentProject, evolcoreHome, or none`);
429
429
  }
430
430
  else if (key === 'allowedArgs' || key === 'deniedArgs') {
431
431
  validateScalarArrayMap(value, label, errors);
@@ -712,7 +712,7 @@ export function subscribeCodex(params, push) {
712
712
  }
713
713
  catch { }
714
714
  }
715
- // 监听 evolclaw sessionsDir 的 active.json 变化
715
+ // 监听 evolcore sessionsDir 的 active.json 变化
716
716
  try {
717
717
  sessionWatcher = fs.watch(p.sessionsDir, { recursive: true }, (_evt, filename) => {
718
718
  if (filename && String(filename).endsWith('active.json'))
@@ -8,7 +8,7 @@
8
8
  * snapshot:
9
9
  * - 无 sessionId: 项目列表 + 选中项目的全部 transcript 概要
10
10
  * - 有 sessionId: 该 transcript 的结构化轮次 + 会话头统计
11
- * subscribe: 监听对应目录的文件变化 + evolclaw sessionsDir active.json 变化,防抖 150ms。
11
+ * subscribe: 监听对应目录的文件变化 + evolcore sessionsDir active.json 变化,防抖 150ms。
12
12
  */
13
13
  import fs from 'fs';
14
14
  import path from 'path';
@@ -119,7 +119,7 @@ const translations = {
119
119
  'logs.noSources': '未找到日志文件',
120
120
  'logs.direction.in': 'IN',
121
121
  'logs.direction.out': 'OUT',
122
- 'logs.source.evolclaw': 'Daemon',
122
+ 'logs.source.daemon': 'Daemon',
123
123
  'logs.source.ecweb': 'ECWeb',
124
124
  'logs.source.stdout': '标准输出',
125
125
  'logs.source.aun': 'AUN',
@@ -452,7 +452,7 @@ const translations = {
452
452
  'gateway.key.notConfigured': '未配置',
453
453
  'gateway.key.plainTitle': '明文密钥已隐藏,建议改用 $ENV 引用',
454
454
  'gateway.key.plainLabel': '*** (明文)',
455
- 'gateway.error.daemonUnavailable': 'evolclaw 未运行或 socket 不可达',
455
+ 'gateway.error.daemonUnavailable': 'evolcore 未运行或 socket 不可达',
456
456
  'gateway.error.daemonFailed': 'daemon 返回失败',
457
457
 
458
458
  // Triggers view
@@ -977,7 +977,7 @@ const translations = {
977
977
  'logs.noSources': 'No log files found',
978
978
  'logs.direction.in': 'IN',
979
979
  'logs.direction.out': 'OUT',
980
- 'logs.source.evolclaw': 'Daemon',
980
+ 'logs.source.daemon': 'Daemon',
981
981
  'logs.source.ecweb': 'ECWeb',
982
982
  'logs.source.stdout': 'Standard output',
983
983
  'logs.source.aun': 'AUN',
@@ -1310,7 +1310,7 @@ const translations = {
1310
1310
  'gateway.key.notConfigured': 'Not configured',
1311
1311
  'gateway.key.plainTitle': 'Plaintext key is hidden; $ENV references are recommended',
1312
1312
  'gateway.key.plainLabel': '*** (plaintext)',
1313
- 'gateway.error.daemonUnavailable': 'evolclaw is not running or the socket is unreachable',
1313
+ 'gateway.error.daemonUnavailable': 'evolcore is not running or the socket is unreachable',
1314
1314
  'gateway.error.daemonFailed': 'daemon returned an error',
1315
1315
 
1316
1316
  // Triggers view
@@ -4682,7 +4682,7 @@ function renderSystem(data) {
4682
4682
 
4683
4683
  // ① 版本卡
4684
4684
  html += '<div class="cache-cards" style="margin-bottom:16px">';
4685
- html += vcard('evolclaw', sys.version, up?.evolclaw);
4685
+ html += vcard('evolcore', sys.version, up?.evolcore);
4686
4686
  html += vcard('FASTAUN', sys.fastaunVersion, up?.fastaun);
4687
4687
  html += vcard('ECWEB', data.ecwebVersion, up?.ecweb ? {
4688
4688
  remote: up.ecweb.remote,
@@ -4801,7 +4801,7 @@ function renderGateway(data) {
4801
4801
 
4802
4802
  if (!data) { el.innerHTML = `<div class="empty">${t('common.loading')}</div>`; return; }
4803
4803
  if (data.error) {
4804
- const errorText = data.error === 'evolclaw 未运行或 socket 不可达'
4804
+ const errorText = data.error === 'evolcore 未运行或 socket 不可达'
4805
4805
  ? t('gateway.error.daemonUnavailable')
4806
4806
  : (data.error === 'daemon 返回失败' ? t('gateway.error.daemonFailed') : data.error);
4807
4807
  el.innerHTML = `<div class="empty">⚠ ${esc(errorText)}</div>`;
@@ -47,7 +47,7 @@
47
47
 
48
48
  </nav>
49
49
  <span style="flex:1"></span>
50
- 2026-07-23 11:27
50
+ 2026-07-23 12:11
51
51
  <span id="conn-status" class="conn-status" data-i18n="status.connecting">连接中…</span>
52
52
  <button id="lang-btn" class="theme-btn" data-i18n-title="language.buttonTitle" title="切换语言">🌐</button>
53
53
  <button id="theme-btn" class="theme-btn" data-i18n-title="theme.buttonTitle" title="主题">🌗</button>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ec-web",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Web console and monitoring dashboard for EvolCore",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,7 +22,7 @@
22
22
  "author": "",
23
23
  "license": "MIT",
24
24
  "peerDependencies": {
25
- "evolclaw": ">=3.0.0"
25
+ "evolcore": ">=0.0.2"
26
26
  },
27
27
  "dependencies": {
28
28
  "ws": "^8.18.0"