@zhongqian97-code/ecode 0.5.61 → 0.5.62

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.
@@ -126,6 +126,23 @@ async function loadSkillsFromDir(dir) {
126
126
  return skills.sort((a, b) => a.name.localeCompare(b.name));
127
127
  }
128
128
 
129
+ // src/llm.ts
130
+ function buildAssistantMessage(assistantText, toolCalls, assistantReasoning) {
131
+ const msg = {
132
+ role: "assistant",
133
+ content: assistantText || (toolCalls.length > 0 ? null : ""),
134
+ reasoning_content: assistantReasoning ?? ""
135
+ };
136
+ if (toolCalls.length > 0) {
137
+ msg.tool_calls = toolCalls.map((tc) => ({
138
+ id: tc.id,
139
+ type: "function",
140
+ function: { name: tc.name, arguments: tc.arguments }
141
+ }));
142
+ }
143
+ return msg;
144
+ }
145
+
129
146
  // src/tools/read.ts
130
147
  import * as fs from "fs/promises";
131
148
  var READ_TOOL = {
@@ -1708,6 +1725,7 @@ ${prompt}` : prompt;
1708
1725
  export {
1709
1726
  isTrustedSkillPath,
1710
1727
  loadSkillsFromDir,
1728
+ buildAssistantMessage,
1711
1729
  READ_TOOL,
1712
1730
  readFile3 as readFile,
1713
1731
  GLOB_TOOL,
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ import {
20
20
  WEB_FETCH_TOOL,
21
21
  WRITE_TOOL,
22
22
  applyPatch,
23
+ buildAssistantMessage,
23
24
  classifyCommand,
24
25
  createLogger,
25
26
  createLoggerAtPath,
@@ -33,7 +34,7 @@ import {
33
34
  todo,
34
35
  webFetch,
35
36
  writeFile
36
- } from "./chunk-HC62ZZI6.js";
37
+ } from "./chunk-ZLF4HLQ7.js";
37
38
  import {
38
39
  createProvider,
39
40
  createSessionMetadata,
@@ -185,14 +186,7 @@ async function runPipe(prompt, llm, out = process.stdout, systemPrompt) {
185
186
  }
186
187
  if (toolCalls.length > 0) {
187
188
  messages.push({
188
- role: "assistant",
189
- content: assistantText || null,
190
- tool_calls: toolCalls.map((tc) => ({
191
- id: tc.id,
192
- type: "function",
193
- function: { name: tc.name, arguments: tc.arguments }
194
- })),
195
- ...lastReasoning ? { reasoning_content: lastReasoning } : {},
189
+ ...buildAssistantMessage(assistantText, toolCalls, lastReasoning),
196
190
  ...lastReasoningDetails ? { reasoning_details: lastReasoningDetails } : {}
197
191
  });
198
192
  for (const tc of toolCalls) {
@@ -456,14 +450,7 @@ var SessionRuntime = class {
456
450
  if (toolCalls.length > 0) {
457
451
  this._status = "tool_calling";
458
452
  this.messages.push({
459
- role: "assistant",
460
- content: assistantText || null,
461
- tool_calls: toolCalls.map((tc) => ({
462
- id: tc.id,
463
- type: "function",
464
- function: { name: tc.name, arguments: tc.arguments }
465
- })),
466
- ...assistantReasoning ? { reasoning_content: assistantReasoning } : {},
453
+ ...buildAssistantMessage(assistantText, toolCalls, assistantReasoning),
467
454
  ...lastReasoningDetails ? { reasoning_details: lastReasoningDetails } : {}
468
455
  });
469
456
  (_a = this.logger) == null ? void 0 : _a.append({
@@ -486,11 +473,7 @@ var SessionRuntime = class {
486
473
  }
487
474
  } else {
488
475
  if (assistantText) {
489
- this.messages.push({
490
- role: "assistant",
491
- content: assistantText,
492
- ...assistantReasoning ? { reasoning_content: assistantReasoning } : {}
493
- });
476
+ this.messages.push(buildAssistantMessage(assistantText, [], assistantReasoning));
494
477
  (_c = this.logger) == null ? void 0 : _c.append({ ts: (/* @__PURE__ */ new Date()).toISOString(), role: "assistant", content: assistantText || null });
495
478
  }
496
479
  break;
@@ -916,7 +899,7 @@ Node.js 16/18 \u8BF7\u4F7F\u7528 --web \u6216 --pipe \u6A21\u5F0F\u3002
916
899
  );
917
900
  process.exit(1);
918
901
  }
919
- const { App, React, render, createStdinFilter } = await import("./ui-DFEOOA36.js");
902
+ const { App, React, render, createStdinFilter } = await import("./ui-445CQEQR.js");
920
903
  const stdinFilter = process.stdin.isTTY ? createStdinFilter(process.stdin) : process.stdin;
921
904
  render(
922
905
  React.createElement(App, { config: finalConfig, version: VERSION, autoMode, registry, trustedSkillDirs, initialMessages, stdinFilter }),
@@ -12,6 +12,7 @@ import {
12
12
  WEB_FETCH_TOOL,
13
13
  WRITE_TOOL,
14
14
  applyPatch,
15
+ buildAssistantMessage,
15
16
  createLogger,
16
17
  editFile,
17
18
  executeBash,
@@ -24,7 +25,7 @@ import {
24
25
  todo,
25
26
  webFetch,
26
27
  writeFile
27
- } from "./chunk-HC62ZZI6.js";
28
+ } from "./chunk-ZLF4HLQ7.js";
28
29
  import {
29
30
  handleSkillInput,
30
31
  loadJobs,
@@ -2969,18 +2970,11 @@ function App({ config, version, autoMode = false, registry, trustedSkillDirs = [
2969
2970
  throw err;
2970
2971
  }
2971
2972
  if (toolCalls.length > 0) {
2972
- const assistantMsg = {
2973
- role: "assistant",
2974
- // content 可能为空字符串(纯工具调用),存 null 符合 OpenAI API 规范
2975
- content: assistantText || null,
2976
- tool_calls: toolCalls.map((tc) => ({
2977
- id: tc.id,
2978
- type: "function",
2979
- function: { name: tc.name, arguments: tc.arguments }
2980
- })),
2981
- // 仅在存在思考内容时扩展 reasoning_content 字段
2982
- ...assistantReasoning ? { reasoning_content: assistantReasoning } : {}
2983
- };
2973
+ const assistantMsg = buildAssistantMessage(
2974
+ assistantText,
2975
+ toolCalls,
2976
+ assistantReasoning
2977
+ );
2984
2978
  setMessages((prev) => {
2985
2979
  const last = prev[prev.length - 1];
2986
2980
  const withoutStreaming = (last == null ? void 0 : last.role) === "assistant" && !last.tool_calls ? prev.slice(0, -1) : prev;
@@ -3056,11 +3050,7 @@ function App({ config, version, autoMode = false, registry, trustedSkillDirs = [
3056
3050
  setMessages((prev) => {
3057
3051
  const last = prev[prev.length - 1];
3058
3052
  if ((last == null ? void 0 : last.role) === "assistant" && !last.tool_calls) {
3059
- const updated = {
3060
- role: "assistant",
3061
- content: assistantText,
3062
- ...assistantReasoning ? { reasoning_content: assistantReasoning } : {}
3063
- };
3053
+ const updated = buildAssistantMessage(assistantText, [], assistantReasoning);
3064
3054
  return [...prev.slice(0, -1), updated];
3065
3055
  }
3066
3056
  return prev;
@@ -3068,11 +3058,7 @@ function App({ config, version, autoMode = false, registry, trustedSkillDirs = [
3068
3058
  if (assistantText) {
3069
3059
  currentMessages = [
3070
3060
  ...currentMessages,
3071
- {
3072
- role: "assistant",
3073
- content: assistantText,
3074
- ...assistantReasoning ? { reasoning_content: assistantReasoning } : {}
3075
- }
3061
+ buildAssistantMessage(assistantText, [], assistantReasoning)
3076
3062
  ];
3077
3063
  }
3078
3064
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhongqian97-code/ecode",
3
- "version": "0.5.61",
3
+ "version": "0.5.62",
4
4
  "description": "A minimal Claude Code clone with REPL interface and bash tool calling",
5
5
  "type": "module",
6
6
  "author": "zhongqian97-code",