jinzd-ai-cli 0.4.52 → 0.4.53
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/{chunk-XROZQELF.js → chunk-6I5FUNPR.js} +15 -2
- package/dist/{chunk-EAZN6HMU.js → chunk-IXDGWT2Z.js} +1 -1
- package/dist/{chunk-SEVTJVMK.js → chunk-W6AK76UM.js} +1 -1
- package/dist/{chunk-7NX7PDUO.js → chunk-YIMTDKUW.js} +1 -1
- package/dist/{hub-OXCBN2E6.js → hub-4DNFD6JK.js} +1 -1
- package/dist/index.js +6 -6
- package/dist/{run-tests-BPGUDFTV.js → run-tests-3NNL7Z2E.js} +1 -1
- package/dist/{run-tests-6VUMFE6G.js → run-tests-NJQK4B43.js} +1 -1
- package/dist/{server-BB7AJLGF.js → server-PFHWO3HL.js} +66 -7
- package/dist/{task-orchestrator-YMLVD3Z2.js → task-orchestrator-C42TNHE6.js} +2 -2
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
ProviderNotFoundError,
|
|
8
8
|
RateLimitError,
|
|
9
9
|
schemaToJsonSchema
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-IXDGWT2Z.js";
|
|
11
11
|
import {
|
|
12
12
|
APP_NAME,
|
|
13
13
|
CONFIG_DIR_NAME,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
MCP_TOOL_PREFIX,
|
|
21
21
|
PLUGINS_DIR_NAME,
|
|
22
22
|
VERSION
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-YIMTDKUW.js";
|
|
24
24
|
|
|
25
25
|
// src/config/config-manager.ts
|
|
26
26
|
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
@@ -2537,6 +2537,19 @@ var SessionManager = class {
|
|
|
2537
2537
|
this._current = session;
|
|
2538
2538
|
return session;
|
|
2539
2539
|
}
|
|
2540
|
+
/**
|
|
2541
|
+
* 直接设置当前会话(用于从内存缓存恢复未保存的会话)。
|
|
2542
|
+
* 与 `loadSession` 不同,此方法不读取磁盘,也不抛出错误。
|
|
2543
|
+
* Web 多 Tab 场景下,SessionHandler 会维护一份未保存会话的内存缓存,
|
|
2544
|
+
* 切换 Tab 时通过此方法将缓存中的会话设为当前会话,避免"Session not found"。
|
|
2545
|
+
*/
|
|
2546
|
+
setCurrent(session) {
|
|
2547
|
+
this._current = session;
|
|
2548
|
+
}
|
|
2549
|
+
/** 清除当前会话引用(下次访问将触发 lazy 创建)。 */
|
|
2550
|
+
clearCurrent() {
|
|
2551
|
+
this._current = null;
|
|
2552
|
+
}
|
|
2540
2553
|
async save() {
|
|
2541
2554
|
if (!this._current) return;
|
|
2542
2555
|
mkdirSync2(this.historyDir, { recursive: true });
|
|
@@ -385,7 +385,7 @@ ${content}`);
|
|
|
385
385
|
}
|
|
386
386
|
}
|
|
387
387
|
async function runTaskMode(config, providers, configManager, topic) {
|
|
388
|
-
const { TaskOrchestrator } = await import("./task-orchestrator-
|
|
388
|
+
const { TaskOrchestrator } = await import("./task-orchestrator-C42TNHE6.js");
|
|
389
389
|
const orchestrator = new TaskOrchestrator(config, providers, configManager);
|
|
390
390
|
let interrupted = false;
|
|
391
391
|
const onSigint = () => {
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
saveDevState,
|
|
25
25
|
sessionHasMeaningfulContent,
|
|
26
26
|
setupProxy
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-6I5FUNPR.js";
|
|
28
28
|
import {
|
|
29
29
|
ToolExecutor,
|
|
30
30
|
ToolRegistry,
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
spawnAgentContext,
|
|
39
39
|
theme,
|
|
40
40
|
undoStack
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-IXDGWT2Z.js";
|
|
42
42
|
import {
|
|
43
43
|
fileCheckpoints
|
|
44
44
|
} from "./chunk-4BKXL7SM.js";
|
|
@@ -63,7 +63,7 @@ import {
|
|
|
63
63
|
SKILLS_DIR_NAME,
|
|
64
64
|
VERSION,
|
|
65
65
|
buildUserIdentityPrompt
|
|
66
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-YIMTDKUW.js";
|
|
67
67
|
|
|
68
68
|
// src/index.ts
|
|
69
69
|
import { program } from "commander";
|
|
@@ -2106,7 +2106,7 @@ ${hint}` : "")
|
|
|
2106
2106
|
usage: "/test [command|filter]",
|
|
2107
2107
|
async execute(args, ctx) {
|
|
2108
2108
|
try {
|
|
2109
|
-
const { executeTests } = await import("./run-tests-
|
|
2109
|
+
const { executeTests } = await import("./run-tests-3NNL7Z2E.js");
|
|
2110
2110
|
const argStr = args.join(" ").trim();
|
|
2111
2111
|
let testArgs = {};
|
|
2112
2112
|
if (argStr) {
|
|
@@ -5493,7 +5493,7 @@ program.command("web").description("Start Web UI server with browser-based chat
|
|
|
5493
5493
|
console.error("Error: Invalid port number. Must be between 1 and 65535.");
|
|
5494
5494
|
process.exit(1);
|
|
5495
5495
|
}
|
|
5496
|
-
const { startWebServer } = await import("./server-
|
|
5496
|
+
const { startWebServer } = await import("./server-PFHWO3HL.js");
|
|
5497
5497
|
await startWebServer({ port, host: options.host });
|
|
5498
5498
|
});
|
|
5499
5499
|
program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | migrate <name>)").action(async (action, username) => {
|
|
@@ -5726,7 +5726,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
|
|
|
5726
5726
|
}),
|
|
5727
5727
|
config.get("customProviders")
|
|
5728
5728
|
);
|
|
5729
|
-
const { startHub } = await import("./hub-
|
|
5729
|
+
const { startHub } = await import("./hub-4DNFD6JK.js");
|
|
5730
5730
|
await startHub(
|
|
5731
5731
|
{
|
|
5732
5732
|
topic: topic ?? "",
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
hadPreviousWriteToolCalls,
|
|
16
16
|
loadDevState,
|
|
17
17
|
setupProxy
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-6I5FUNPR.js";
|
|
19
19
|
import {
|
|
20
20
|
AuthManager
|
|
21
21
|
} from "./chunk-BYNY5JPB.js";
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
spawnAgentContext,
|
|
35
35
|
truncateOutput,
|
|
36
36
|
undoStack
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-IXDGWT2Z.js";
|
|
38
38
|
import "./chunk-4BKXL7SM.js";
|
|
39
39
|
import {
|
|
40
40
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
@@ -54,7 +54,7 @@ import {
|
|
|
54
54
|
SKILLS_DIR_NAME,
|
|
55
55
|
VERSION,
|
|
56
56
|
buildUserIdentityPrompt
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-YIMTDKUW.js";
|
|
58
58
|
|
|
59
59
|
// src/web/server.ts
|
|
60
60
|
import express from "express";
|
|
@@ -493,6 +493,15 @@ var SessionHandler = class _SessionHandler {
|
|
|
493
493
|
activeSystemPrompt;
|
|
494
494
|
/** Directories added via /add-dir */
|
|
495
495
|
addedDirs = /* @__PURE__ */ new Set();
|
|
496
|
+
/**
|
|
497
|
+
* 未保存会话的内存缓存(per-handler)。
|
|
498
|
+
* 当客户端通过 `session new` 创建新会话时,会话仅存在于 SessionManager._current 中,
|
|
499
|
+
* 未写入磁盘(saveIfNeeded 跳过空会话)。Web UI 多 Tab 场景下每个 Tab 都会创建自己的
|
|
500
|
+
* 空会话,切换 Tab 时 `session load <id>` 会读取磁盘并报"Session not found"。
|
|
501
|
+
* 此 Map 在本 SessionHandler 生命周期内持有这些未保存会话,load 时优先查询。
|
|
502
|
+
* 会话一旦保存到磁盘(有消息后),会从此 Map 中移除。
|
|
503
|
+
*/
|
|
504
|
+
unsavedSessions = /* @__PURE__ */ new Map();
|
|
496
505
|
constructor(ws, shared) {
|
|
497
506
|
this.ws = ws;
|
|
498
507
|
this.config = shared.config;
|
|
@@ -610,13 +619,16 @@ var SessionHandler = class _SessionHandler {
|
|
|
610
619
|
/** Save session only if it exists and has messages (never persist empty "Untitled" sessions). */
|
|
611
620
|
saveIfNeeded() {
|
|
612
621
|
if (this.sessions.current && this.sessions.current.messages.length > 0) {
|
|
622
|
+
const id = this.sessions.current.id;
|
|
613
623
|
this.sessions.save();
|
|
624
|
+
this.unsavedSessions.delete(id);
|
|
614
625
|
}
|
|
615
626
|
}
|
|
616
627
|
/** Lazily create a session if none exists yet (deferred from constructor). */
|
|
617
628
|
ensureSession() {
|
|
618
629
|
if (!this.sessions.current) {
|
|
619
|
-
this.sessions.createSession(this.currentProvider, this.currentModel);
|
|
630
|
+
const created = this.sessions.createSession(this.currentProvider, this.currentModel);
|
|
631
|
+
this.unsavedSessions.set(created.id, created);
|
|
620
632
|
}
|
|
621
633
|
}
|
|
622
634
|
// ── Chat handling ────────────────────────────────────────────────
|
|
@@ -1069,7 +1081,8 @@ Tokens: in=${this.sessionTokenUsage.inputTokens} out=${this.sessionTokenUsage.ou
|
|
|
1069
1081
|
const sub = args[0];
|
|
1070
1082
|
if (sub === "new") {
|
|
1071
1083
|
this.saveIfNeeded();
|
|
1072
|
-
this.sessions.createSession(this.currentProvider, this.currentModel);
|
|
1084
|
+
const created = this.sessions.createSession(this.currentProvider, this.currentModel);
|
|
1085
|
+
this.unsavedSessions.set(created.id, created);
|
|
1073
1086
|
this.sessionTokenUsage = { inputTokens: 0, outputTokens: 0 };
|
|
1074
1087
|
this.send({ type: "info", message: "New session created." });
|
|
1075
1088
|
this.sendStatus();
|
|
@@ -1077,6 +1090,20 @@ Tokens: in=${this.sessionTokenUsage.inputTokens} out=${this.sessionTokenUsage.ou
|
|
|
1077
1090
|
} else if (sub === "load" && args[1]) {
|
|
1078
1091
|
const targetId = args[1];
|
|
1079
1092
|
this.saveIfNeeded();
|
|
1093
|
+
const cachedExact = this.unsavedSessions.get(targetId);
|
|
1094
|
+
const cached = cachedExact ?? [...this.unsavedSessions.values()].find((s) => s.id.startsWith(targetId));
|
|
1095
|
+
if (cached) {
|
|
1096
|
+
this.sessions.setCurrent(cached);
|
|
1097
|
+
this.sessionTokenUsage = { inputTokens: 0, outputTokens: 0 };
|
|
1098
|
+
this.send({
|
|
1099
|
+
type: "info",
|
|
1100
|
+
message: `Loaded session: ${cached.id.slice(0, 8)} "${cached.title ?? ""}" (${cached.messages.length} messages)`
|
|
1101
|
+
});
|
|
1102
|
+
this.sendSessionMessages();
|
|
1103
|
+
this.sendStatus();
|
|
1104
|
+
this.sendSessionList();
|
|
1105
|
+
break;
|
|
1106
|
+
}
|
|
1080
1107
|
const list = this.sessions.listSessions();
|
|
1081
1108
|
const found = list.find((s) => s.id.startsWith(targetId));
|
|
1082
1109
|
if (found) {
|
|
@@ -1087,12 +1114,30 @@ Tokens: in=${this.sessionTokenUsage.inputTokens} out=${this.sessionTokenUsage.ou
|
|
|
1087
1114
|
this.sendStatus();
|
|
1088
1115
|
this.sendSessionList();
|
|
1089
1116
|
} else {
|
|
1090
|
-
this.
|
|
1117
|
+
const recreated = this.sessions.createSession(this.currentProvider, this.currentModel);
|
|
1118
|
+
this.unsavedSessions.set(recreated.id, recreated);
|
|
1119
|
+
this.sessionTokenUsage = { inputTokens: 0, outputTokens: 0 };
|
|
1120
|
+
this.send({
|
|
1121
|
+
type: "info",
|
|
1122
|
+
message: `Previous session (${targetId.slice(0, 8)}) is no longer available \u2014 started a new one.`
|
|
1123
|
+
});
|
|
1124
|
+
this.sendStatus();
|
|
1125
|
+
this.sendSessionList();
|
|
1091
1126
|
}
|
|
1092
1127
|
} else if (sub === "list") {
|
|
1093
1128
|
this.sendSessionList();
|
|
1094
1129
|
} else if (sub === "delete" && args[1]) {
|
|
1095
1130
|
const targetId = args[1];
|
|
1131
|
+
const cachedKey = this.unsavedSessions.has(targetId) ? targetId : [...this.unsavedSessions.keys()].find((k) => k.startsWith(targetId));
|
|
1132
|
+
if (cachedKey) {
|
|
1133
|
+
this.unsavedSessions.delete(cachedKey);
|
|
1134
|
+
if (this.sessions.current?.id === cachedKey) {
|
|
1135
|
+
this.sessions.clearCurrent();
|
|
1136
|
+
}
|
|
1137
|
+
this.send({ type: "info", message: `Deleted session: ${cachedKey.slice(0, 8)}` });
|
|
1138
|
+
this.sendSessionList();
|
|
1139
|
+
break;
|
|
1140
|
+
}
|
|
1096
1141
|
const list = this.sessions.listSessions();
|
|
1097
1142
|
const found = list.find((s) => s.id.startsWith(targetId));
|
|
1098
1143
|
if (found) {
|
|
@@ -1111,6 +1156,12 @@ Tokens: in=${this.sessionTokenUsage.inputTokens} out=${this.sessionTokenUsage.ou
|
|
|
1111
1156
|
const list = this.sessions.listSessions();
|
|
1112
1157
|
let deleted = 0;
|
|
1113
1158
|
for (const targetId of ids) {
|
|
1159
|
+
const cachedKey = this.unsavedSessions.has(targetId) ? targetId : [...this.unsavedSessions.keys()].find((k) => k.startsWith(targetId));
|
|
1160
|
+
if (cachedKey) {
|
|
1161
|
+
this.unsavedSessions.delete(cachedKey);
|
|
1162
|
+
deleted++;
|
|
1163
|
+
continue;
|
|
1164
|
+
}
|
|
1114
1165
|
const found = list.find((s) => s.id.startsWith(targetId));
|
|
1115
1166
|
if (found) {
|
|
1116
1167
|
this.sessions.deleteSession(found.id);
|
|
@@ -1126,6 +1177,14 @@ Tokens: in=${this.sessionTokenUsage.inputTokens} out=${this.sessionTokenUsage.ou
|
|
|
1126
1177
|
this.send({ type: "error", message: "Title cannot be empty." });
|
|
1127
1178
|
break;
|
|
1128
1179
|
}
|
|
1180
|
+
const cachedKey = this.unsavedSessions.has(targetId) ? targetId : [...this.unsavedSessions.keys()].find((k) => k.startsWith(targetId));
|
|
1181
|
+
if (cachedKey) {
|
|
1182
|
+
const session = this.unsavedSessions.get(cachedKey);
|
|
1183
|
+
session.title = newTitle;
|
|
1184
|
+
this.send({ type: "info", message: `Renamed session: "${newTitle}"` });
|
|
1185
|
+
this.sendSessionList();
|
|
1186
|
+
break;
|
|
1187
|
+
}
|
|
1129
1188
|
const list = this.sessions.listSessions();
|
|
1130
1189
|
const found = list.find((s) => s.id.startsWith(targetId));
|
|
1131
1190
|
if (found) {
|
|
@@ -1632,7 +1691,7 @@ ${undoResults.map((r) => ` \u2022 ${r}`).join("\n")}` });
|
|
|
1632
1691
|
case "test": {
|
|
1633
1692
|
this.send({ type: "info", message: "\u{1F9EA} Running tests..." });
|
|
1634
1693
|
try {
|
|
1635
|
-
const { executeTests } = await import("./run-tests-
|
|
1694
|
+
const { executeTests } = await import("./run-tests-3NNL7Z2E.js");
|
|
1636
1695
|
const argStr = args.join(" ").trim();
|
|
1637
1696
|
let testArgs = {};
|
|
1638
1697
|
if (argStr) {
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
getDangerLevel,
|
|
5
5
|
googleSearchContext,
|
|
6
6
|
truncateOutput
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-IXDGWT2Z.js";
|
|
8
8
|
import "./chunk-4BKXL7SM.js";
|
|
9
9
|
import {
|
|
10
10
|
SUBAGENT_ALLOWED_TOOLS
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-YIMTDKUW.js";
|
|
12
12
|
|
|
13
13
|
// src/hub/task-orchestrator.ts
|
|
14
14
|
import { createInterface } from "readline";
|