@zhongqian97-code/ecode 0.5.37 → 0.5.39

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.
@@ -3,7 +3,7 @@ const _ew=process.emitWarning.bind(process);process.emitWarning=function(w,...a)
3
3
  import {
4
4
  findSession,
5
5
  listSessions
6
- } from "./chunk-O4YFKL3N.js";
6
+ } from "./chunk-LAAABQR4.js";
7
7
 
8
8
  // src/sessions/command.ts
9
9
  import * as path from "path";
@@ -4,7 +4,7 @@ import {
4
4
  createSessionMetadata,
5
5
  updateSessionMetadata,
6
6
  writeSessionMetadata
7
- } from "./chunk-O4YFKL3N.js";
7
+ } from "./chunk-LAAABQR4.js";
8
8
 
9
9
  // src/providers/openai.ts
10
10
  import OpenAI from "openai";
@@ -5,6 +5,12 @@ const _ew=process.emitWarning.bind(process);process.emitWarning=function(w,...a)
5
5
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
6
6
  import { homedir } from "os";
7
7
  import { join } from "path";
8
+ function expandTilde(p) {
9
+ if (p === "~" || p.startsWith("~/") || p.startsWith("~\\")) {
10
+ return join(homedir(), p.slice(1));
11
+ }
12
+ return p;
13
+ }
8
14
  var MODEL_CONTEXT_LIMITS = {
9
15
  // OpenAI GPT 系列
10
16
  "gpt-4o": 128e3,
@@ -87,7 +93,11 @@ function loadConfig() {
87
93
  // 容易引入歧义,因此仅支持配置文件覆盖
88
94
  dangerousPatterns: fileConfig.dangerousPatterns ?? DEFAULTS.dangerousPatterns,
89
95
  // logDir: ECODE_LOG_DIR 环境变量 > 配置文件 > undefined(禁用日志)
90
- logDir: process.env.ECODE_LOG_DIR ?? fileConfig.logDir ?? DEFAULTS.logDir,
96
+ // expandTilde ~ 替换为 homedir(),Node.js 不执行 shell 的 ~ 展开
97
+ logDir: (() => {
98
+ const raw = process.env.ECODE_LOG_DIR ?? fileConfig.logDir ?? DEFAULTS.logDir;
99
+ return raw ? expandTilde(raw) : raw;
100
+ })(),
91
101
  // contextLimit 仅支持配置文件配置:数值类型在文件中更直观,
92
102
  // 环境变量还需要 parseInt 转换,增加出错风险
93
103
  contextLimit: fileConfig.contextLimit,
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  cmdSessionsInspect,
6
6
  cmdSessionsList,
7
7
  cmdSessionsReplay
8
- } from "./chunk-GR5MASXF.js";
8
+ } from "./chunk-3H2EMIKF.js";
9
9
  import {
10
10
  APPLY_PATCH_TOOL,
11
11
  BASH_TOOL,
@@ -34,14 +34,14 @@ import {
34
34
  todo,
35
35
  webFetch,
36
36
  writeFile
37
- } from "./chunk-7DHMJ6NS.js";
37
+ } from "./chunk-C6OEWQCD.js";
38
38
  import {
39
39
  createSessionMetadata,
40
40
  generateTitle,
41
41
  loadConfig,
42
42
  updateSessionMetadata,
43
43
  writeSessionMetadata
44
- } from "./chunk-O4YFKL3N.js";
44
+ } from "./chunk-LAAABQR4.js";
45
45
 
46
46
  // src/index.ts
47
47
  import { createRequire } from "module";
@@ -810,7 +810,7 @@ if (rawArgs[0] === "web") {
810
810
  webAutoApprove = true;
811
811
  }
812
812
  }
813
- const { buildServer, generateAccessToken } = await import("./web-Y5CK2WBF.js");
813
+ const { buildServer, generateAccessToken } = await import("./web-L77TJPHI.js");
814
814
  const token = generateAccessToken();
815
815
  const manager = new SessionManager(finalConfig);
816
816
  const server = await buildServer({
@@ -905,6 +905,6 @@ Node.js 16/18 \u8BF7\u4F7F\u7528 --web \u6216 --pipe \u6A21\u5F0F\u3002
905
905
  );
906
906
  process.exit(1);
907
907
  }
908
- const { App, React, render } = await import("./ui-XL5IDLH5.js");
908
+ const { App, React, render } = await import("./ui-FSBOFWL3.js");
909
909
  render(React.createElement(App, { config: finalConfig, version: VERSION, autoMode, registry, trustedSkillDirs, initialMessages }));
910
910
  }
@@ -26,7 +26,7 @@ import {
26
26
  todo,
27
27
  webFetch,
28
28
  writeFile
29
- } from "./chunk-7DHMJ6NS.js";
29
+ } from "./chunk-C6OEWQCD.js";
30
30
  import {
31
31
  loadJobs,
32
32
  removeJob,
@@ -38,7 +38,7 @@ import {
38
38
  getContextLimit,
39
39
  updateSessionMetadata,
40
40
  writeSessionMetadata
41
- } from "./chunk-O4YFKL3N.js";
41
+ } from "./chunk-LAAABQR4.js";
42
42
 
43
43
  // src/ui/index.ts
44
44
  import { default as default2 } from "react";
@@ -3,7 +3,7 @@ const _ew=process.emitWarning.bind(process);process.emitWarning=function(w,...a)
3
3
  import {
4
4
  cmdSessionsFork,
5
5
  cmdSessionsReplay
6
- } from "./chunk-GR5MASXF.js";
6
+ } from "./chunk-3H2EMIKF.js";
7
7
  import {
8
8
  loadJobs,
9
9
  removeJob,
@@ -15,7 +15,7 @@ import {
15
15
  listSessions,
16
16
  loadMessagesFromJsonl,
17
17
  saveConfig
18
- } from "./chunk-O4YFKL3N.js";
18
+ } from "./chunk-LAAABQR4.js";
19
19
 
20
20
  // src/web/server.ts
21
21
  import Fastify from "fastify";
@@ -592,6 +592,7 @@ function generateAdminHtml(version) {
592
592
  status: 'idle', // idle | thinking | tool_calling | awaiting_confirm
593
593
  wsRetries: 0,
594
594
  streamingMsgEl: null, // DOM element currently receiving delta tokens
595
+ streamingThinkEl: null, // DOM element currently receiving reasoning tokens
595
596
  showTools: true,
596
597
  skills: [], // cached skills from /api/skills
597
598
  skillsLoaded: false,
@@ -771,6 +772,7 @@ function generateAdminHtml(version) {
771
772
  '<div class="empty-chat">\u2190 \u52A0\u8F7D\u4F1A\u8BDD\u4E2D\u2026</div>';
772
773
  state.messages = [];
773
774
  state.streamingMsgEl = null;
775
+ state.streamingThinkEl = null;
774
776
  }
775
777
 
776
778
  async function loadMessages(sessionId) {
@@ -824,6 +826,7 @@ function generateAdminHtml(version) {
824
826
  if (body) body.classList.remove('cursor-blink');
825
827
  state.streamingMsgEl = null;
826
828
  }
829
+ state.streamingThinkEl = null;
827
830
  }
828
831
 
829
832
  // \u2500\u2500 WebSocket \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -935,14 +938,20 @@ function generateAdminHtml(version) {
935
938
  finalizeStreamingMsg();
936
939
  setStatus('idle');
937
940
  } else if (type === 'message.reasoning') {
941
+ const token = msg.reasoning || msg.text || '';
938
942
  const msgsEl = document.getElementById('messages');
939
- const placeholder = msgsEl.querySelector('.empty-chat');
940
- if (placeholder) placeholder.remove();
941
- const thinkEl = document.createElement('div');
942
- thinkEl.className = 'thinking-block';
943
- thinkEl.textContent = msg.reasoning || msg.text || '';
944
- if (!state.showTools) thinkEl.style.display = 'none';
945
- msgsEl.appendChild(thinkEl);
943
+ if (!state.streamingThinkEl) {
944
+ const placeholder = msgsEl.querySelector('.empty-chat');
945
+ if (placeholder) placeholder.remove();
946
+ const thinkEl = document.createElement('div');
947
+ thinkEl.className = 'thinking-block';
948
+ thinkEl.textContent = token;
949
+ if (!state.showTools) thinkEl.style.display = 'none';
950
+ msgsEl.appendChild(thinkEl);
951
+ state.streamingThinkEl = thinkEl;
952
+ } else {
953
+ state.streamingThinkEl.textContent += token;
954
+ }
946
955
  msgsEl.scrollTop = msgsEl.scrollHeight;
947
956
  } else if (type === 'session.error') {
948
957
  finalizeStreamingMsg();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhongqian97-code/ecode",
3
- "version": "0.5.37",
3
+ "version": "0.5.39",
4
4
  "description": "A minimal Claude Code clone with REPL interface and bash tool calling",
5
5
  "type": "module",
6
6
  "author": "zhongqian97-code",