chatlab-cli 0.24.1 → 0.25.1

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.
Files changed (73) hide show
  1. package/dist/chat-command-5XMRLXZM.mjs +166 -0
  2. package/dist/chat-command-5XMRLXZM.mjs.map +1 -0
  3. package/dist/{chunk-N5DGZQB4.mjs → chunk-7VG6QGQ2.mjs} +1543 -664
  4. package/dist/chunk-7VG6QGQ2.mjs.map +1 -0
  5. package/dist/{chunk-QJI6AOAT.mjs → chunk-CUCDRAY6.mjs} +17 -25
  6. package/dist/chunk-CUCDRAY6.mjs.map +1 -0
  7. package/dist/chunk-FDK6SPCG.mjs +40 -0
  8. package/dist/chunk-FDK6SPCG.mjs.map +1 -0
  9. package/dist/{chunk-ZL322NVL.mjs → chunk-GTCTDD2Z.mjs} +116 -504
  10. package/dist/chunk-GTCTDD2Z.mjs.map +1 -0
  11. package/dist/{chunk-43XWYC3M.mjs → chunk-JE3FOFF7.mjs} +219 -123
  12. package/dist/chunk-JE3FOFF7.mjs.map +1 -0
  13. package/dist/{chunk-QY6P2YS7.mjs → chunk-PDQFSQO6.mjs} +59 -33
  14. package/dist/chunk-PDQFSQO6.mjs.map +1 -0
  15. package/dist/chunk-WYHGWTA4.mjs +485 -0
  16. package/dist/chunk-WYHGWTA4.mjs.map +1 -0
  17. package/dist/{chunk-CIIQ3S2X.mjs → chunk-YZYP5ST6.mjs} +37 -8
  18. package/dist/chunk-YZYP5ST6.mjs.map +1 -0
  19. package/dist/cli.mjs +3 -2
  20. package/dist/{http-TPX74BLK.mjs → http-C3CGXUBU.mjs} +8 -6
  21. package/dist/{import-B745DRHD.mjs → import-VS7L5JDX.mjs} +4 -4
  22. package/dist/index.mjs +10 -8
  23. package/dist/{mcp-YWAVG5XW.mjs → mcp-6VXDPUQK.mjs} +11 -6
  24. package/dist/mcp-6VXDPUQK.mjs.map +1 -0
  25. package/dist/{stream-import-OPALPVWF.mjs → stream-import-TFDBNVIW.mjs} +3 -3
  26. package/dist-web/assets/{DebugToolsPanel-DaSNc1o-.css → DebugToolsPanel-vn-bnUxn.css} +1 -1
  27. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-B1xZmp9r.js +161 -0
  28. package/dist-web/assets/{EChartWordcloud-VpNJDurs.js → EChartWordcloud-CzhfrEF_.js} +1 -1
  29. package/dist-web/assets/{MessageExportModal-CSfaY25B.js → MessageExportModal-B79pPBL9.js} +1 -1
  30. package/dist-web/assets/{electron-BUeXfvxT.js → electron-DRkrjeIl.js} +1 -1
  31. package/dist-web/assets/electron-Dv8jdn_2.js +1 -0
  32. package/dist-web/assets/{fetch-RDFt3hmp.js → fetch-BmZIm6mS.js} +1 -1
  33. package/dist-web/assets/fetch-BqLy63aj.js +1 -0
  34. package/dist-web/assets/fetch-BstX-wd4.js +1 -0
  35. package/dist-web/assets/{fetch-BohUj3CQ.js → fetch-Bvcxe5PI.js} +1 -1
  36. package/dist-web/assets/{fetch-BneHn5qk.js → fetch-CDamdvtb.js} +1 -1
  37. package/dist-web/assets/{fetch-DypPduyQ.js → fetch-DWg-2kOp.js} +1 -1
  38. package/dist-web/assets/{fetch-CARsBVl0.js → fetch-DfgdagMN.js} +1 -1
  39. package/dist-web/assets/{fetch-Ck3tjoLa.js → fetch-Drk9dLaF.js} +1 -1
  40. package/dist-web/assets/{fetch-B2q6973s.js → fetch-Y-_WsCuk.js} +1 -1
  41. package/dist-web/assets/{fetch-BGMRmQx0.js → fetch-ph2_d79v.js} +1 -1
  42. package/dist-web/assets/{index-Bvlj3dMn.js → index-9urfJP1r.js} +1 -1
  43. package/dist-web/assets/index-CfKjh0Jr.js +9 -0
  44. package/dist-web/assets/index-CprJOAB1.css +1 -0
  45. package/dist-web/assets/{index-BvaWRM6_.js → index-DMWf5On7.js} +1 -1
  46. package/dist-web/assets/{index-DCWvD-4L.js → index-D_hHm7bQ.js} +2 -2
  47. package/dist-web/assets/index-MCdpiX_O.js +173 -0
  48. package/dist-web/assets/{index-C5LrQG3N.js → index-deYDOVUa.js} +4 -4
  49. package/dist-web/assets/vendor-echarts-CITQeskI.js +11 -0
  50. package/dist-web/assets/{vendor-echarts-wordcloud-CZ9gsX8l.js → vendor-echarts-wordcloud-B1kQMklB.js} +1 -1
  51. package/dist-web/assets/{vendor-nuxt-ui-BYU7dz8t.js → vendor-nuxt-ui-C_8CsH6e.js} +1 -1
  52. package/dist-web/assets/{vendor-reka-ui-CnB0mMNX.js → vendor-reka-ui-CIMXwvEp.js} +1 -1
  53. package/dist-web/assets/{web-CXPkmhis.js → web-XJV6Vj5t.js} +1 -1
  54. package/dist-web/index.html +4 -4
  55. package/package.json +1 -1
  56. package/dist/chunk-43XWYC3M.mjs.map +0 -1
  57. package/dist/chunk-CIIQ3S2X.mjs.map +0 -1
  58. package/dist/chunk-N5DGZQB4.mjs.map +0 -1
  59. package/dist/chunk-QJI6AOAT.mjs.map +0 -1
  60. package/dist/chunk-QY6P2YS7.mjs.map +0 -1
  61. package/dist/chunk-ZL322NVL.mjs.map +0 -1
  62. package/dist/mcp-YWAVG5XW.mjs.map +0 -1
  63. package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-BBDrsJfe.js +0 -161
  64. package/dist-web/assets/electron-BynNUuEA.js +0 -1
  65. package/dist-web/assets/fetch-BtHwWs8A.js +0 -1
  66. package/dist-web/assets/fetch-DzNuFdFM.js +0 -1
  67. package/dist-web/assets/index-BRwEubUe.js +0 -173
  68. package/dist-web/assets/index-DB-iqXzV.css +0 -1
  69. package/dist-web/assets/index-DS1rzk1I.js +0 -8
  70. package/dist-web/assets/vendor-echarts-C5u62NnM.js +0 -11
  71. /package/dist/{http-TPX74BLK.mjs.map → http-C3CGXUBU.mjs.map} +0 -0
  72. /package/dist/{import-B745DRHD.mjs.map → import-VS7L5JDX.mjs.map} +0 -0
  73. /package/dist/{stream-import-OPALPVWF.mjs.map → stream-import-TFDBNVIW.mjs.map} +0 -0
@@ -0,0 +1,166 @@
1
+ import { createRequire as __createRequire } from 'module';
2
+ import { dirname as __pathDirname } from 'path';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ const require = __createRequire(import.meta.url);
5
+ const __filename = __fileURLToPath(import.meta.url);
6
+ const __dirname = __pathDirname(__filename);
7
+ import {
8
+ createCliRunAgentStream
9
+ } from "./chunk-WYHGWTA4.mjs";
10
+ import "./chunk-JE3FOFF7.mjs";
11
+ import "./chunk-7VG6QGQ2.mjs";
12
+ import "./chunk-VSOWNKPA.mjs";
13
+
14
+ // src/ai/chat-command.ts
15
+ import { createInterface } from "readline/promises";
16
+ function write(stream, text) {
17
+ stream.write(text);
18
+ }
19
+ function buildTitle(question) {
20
+ const trimmed = question?.trim();
21
+ if (!trimmed) return "CLI Chat";
22
+ return trimmed.length > 50 ? `${trimmed.slice(0, 50)}...` : trimmed;
23
+ }
24
+ function createAgentStreamError(error) {
25
+ if (error instanceof Error) return error;
26
+ if (typeof error === "string" && error) return new Error(error);
27
+ if (typeof error === "object" && error !== null) {
28
+ const record = error;
29
+ const streamError = new Error(
30
+ typeof record.message === "string" && record.message ? record.message : "Agent stream failed"
31
+ );
32
+ if (typeof record.name === "string" && record.name) streamError.name = record.name;
33
+ if (typeof record.stack === "string" && record.stack) streamError.stack = record.stack;
34
+ return streamError;
35
+ }
36
+ return new Error("Agent stream failed");
37
+ }
38
+ function resolveSingleSessionId(dbManager) {
39
+ const sessionIds = dbManager.listSessionIds();
40
+ if (sessionIds.length === 1) return sessionIds[0];
41
+ if (sessionIds.length === 0) {
42
+ throw new Error("No chat sessions found. Import data first or run `chatlab sessions` to verify available sessions.");
43
+ }
44
+ throw new Error("Missing --session-id. Run `chatlab sessions` to choose a session ID.");
45
+ }
46
+ function assertSessionExists(dbManager, sessionId) {
47
+ const db = dbManager.open(sessionId);
48
+ if (!db) {
49
+ throw new Error(`Session ${sessionId} not found`);
50
+ }
51
+ }
52
+ function resolveAIChatTarget(options, deps) {
53
+ if (options.aiChatId) {
54
+ const aiChat2 = deps.aiChatManager.getAIChat(options.aiChatId);
55
+ if (!aiChat2) {
56
+ throw new Error(`AI chat ${options.aiChatId} not found`);
57
+ }
58
+ if (options.sessionId && options.sessionId !== aiChat2.sessionId) {
59
+ throw new Error(`AI chat ${options.aiChatId} belongs to session ${aiChat2.sessionId}, not ${options.sessionId}`);
60
+ }
61
+ assertSessionExists(deps.dbManager, aiChat2.sessionId);
62
+ return { sessionId: aiChat2.sessionId, aiChatId: aiChat2.id, assistantId: aiChat2.assistantId, created: false };
63
+ }
64
+ const sessionId = options.sessionId ?? resolveSingleSessionId(deps.dbManager);
65
+ assertSessionExists(deps.dbManager, sessionId);
66
+ const aiChat = deps.aiChatManager.createAIChat(sessionId, buildTitle(options.question), "general_cn");
67
+ return { sessionId, aiChatId: aiChat.id, assistantId: aiChat.assistantId, created: true };
68
+ }
69
+ async function runChatTurn(options, deps) {
70
+ const stdout = deps.stdout ?? process.stdout;
71
+ const target = resolveAIChatTarget(options, deps);
72
+ const startedAt = Date.now();
73
+ let answer = "";
74
+ let tokenUsage = null;
75
+ let streamError = null;
76
+ const runAgentStream = (deps.createRunAgentStream ?? createCliRunAgentStream)(deps.dbManager, deps.aiChatManager);
77
+ await runAgentStream(
78
+ {
79
+ userMessage: options.question,
80
+ sessionId: target.sessionId,
81
+ aiChatId: target.aiChatId,
82
+ assistantId: target.assistantId,
83
+ chatType: "group",
84
+ locale: options.locale ?? "zh-CN"
85
+ },
86
+ (chunk) => {
87
+ if (chunk.type === "error") {
88
+ streamError = createAgentStreamError(chunk.error);
89
+ return;
90
+ }
91
+ if (chunk.type === "content" && chunk.content) {
92
+ answer += chunk.content;
93
+ if (!options.json && options.stream !== false) write(stdout, chunk.content);
94
+ }
95
+ if (chunk.type === "done" && chunk.usage) {
96
+ tokenUsage = chunk.usage;
97
+ }
98
+ },
99
+ new AbortController().signal
100
+ );
101
+ if (streamError) throw streamError;
102
+ if (!options.json && options.stream !== false && answer && !answer.endsWith("\n")) {
103
+ write(stdout, "\n");
104
+ }
105
+ deps.aiChatManager.addMessage(target.aiChatId, "user", options.question);
106
+ deps.aiChatManager.addMessage(
107
+ target.aiChatId,
108
+ "assistant",
109
+ answer,
110
+ void 0,
111
+ void 0,
112
+ void 0,
113
+ tokenUsage ?? void 0
114
+ );
115
+ return {
116
+ sessionId: target.sessionId,
117
+ aiChatId: target.aiChatId,
118
+ question: options.question,
119
+ answer,
120
+ usage: {
121
+ durationMs: Date.now() - startedAt,
122
+ tokenUsage
123
+ }
124
+ };
125
+ }
126
+ async function runChatCommand(options, deps) {
127
+ const stdout = deps.stdout ?? process.stdout;
128
+ const stderr = deps.stderr ?? process.stderr;
129
+ if (options.question?.trim()) {
130
+ const result = await runChatTurn({ ...options, question: options.question.trim() }, deps);
131
+ if (options.json) {
132
+ write(stdout, `${JSON.stringify(result, null, 2)}
133
+ `);
134
+ } else if (options.stream === false) {
135
+ write(stdout, `${result.answer}
136
+ `);
137
+ }
138
+ return;
139
+ }
140
+ const rl = createInterface({
141
+ input: deps.stdin ?? process.stdin,
142
+ output: stdout
143
+ });
144
+ try {
145
+ let aiChatId = options.aiChatId;
146
+ while (true) {
147
+ const question = (await rl.question("chatlab> ")).trim();
148
+ if (!question || question === "exit" || question === "quit") break;
149
+ try {
150
+ const result = await runChatTurn({ ...options, aiChatId, question, json: false, stream: true }, deps);
151
+ aiChatId = result.aiChatId;
152
+ } catch (error) {
153
+ write(stderr, `${error instanceof Error ? error.message : String(error)}
154
+ `);
155
+ }
156
+ }
157
+ } finally {
158
+ rl.close();
159
+ }
160
+ }
161
+ export {
162
+ resolveAIChatTarget,
163
+ runChatCommand,
164
+ runChatTurn
165
+ };
166
+ //# sourceMappingURL=chat-command-5XMRLXZM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai/chat-command.ts"],"sourcesContent":["import { createInterface } from 'node:readline/promises'\nimport type { Readable, Writable } from 'node:stream'\nimport type { DatabaseManager, AIChatManager, AgentStreamChunk, TokenUsageData } from '@openchatlab/node-runtime'\nimport type { PathProvider } from '@openchatlab/core'\nimport { createCliRunAgentStream } from './agent-stream-runner'\n\nexport interface ChatCommandOptions {\n sessionId?: string\n aiChatId?: string\n question?: string\n json?: boolean\n stream?: boolean\n locale?: string\n}\n\nexport interface ChatCommandDeps {\n dbManager: DatabaseManager\n pathProvider: PathProvider\n aiChatManager: AIChatManager\n stdout?: Pick<Writable, 'write'>\n stderr?: Pick<Writable, 'write'>\n stdin?: Readable\n createRunAgentStream?: typeof createCliRunAgentStream\n}\n\nexport interface ResolvedAIChatTarget {\n sessionId: string\n aiChatId: string\n assistantId: string\n created: boolean\n}\n\nexport interface ChatTurnResult {\n sessionId: string\n aiChatId: string\n question: string\n answer: string\n usage: {\n durationMs: number\n tokenUsage: TokenUsageData | null\n }\n}\n\nfunction write(stream: Pick<Writable, 'write'>, text: string): void {\n stream.write(text)\n}\n\nfunction buildTitle(question?: string): string {\n const trimmed = question?.trim()\n if (!trimmed) return 'CLI Chat'\n return trimmed.length > 50 ? `${trimmed.slice(0, 50)}...` : trimmed\n}\n\nfunction createAgentStreamError(error: unknown): Error {\n if (error instanceof Error) return error\n if (typeof error === 'string' && error) return new Error(error)\n if (typeof error === 'object' && error !== null) {\n const record = error as { name?: unknown; message?: unknown; stack?: unknown }\n const streamError = new Error(\n typeof record.message === 'string' && record.message ? record.message : 'Agent stream failed'\n )\n if (typeof record.name === 'string' && record.name) streamError.name = record.name\n if (typeof record.stack === 'string' && record.stack) streamError.stack = record.stack\n return streamError\n }\n return new Error('Agent stream failed')\n}\n\nfunction resolveSingleSessionId(dbManager: DatabaseManager): string {\n const sessionIds = dbManager.listSessionIds()\n if (sessionIds.length === 1) return sessionIds[0]!\n if (sessionIds.length === 0) {\n throw new Error('No chat sessions found. Import data first or run `chatlab sessions` to verify available sessions.')\n }\n throw new Error('Missing --session-id. Run `chatlab sessions` to choose a session ID.')\n}\n\nfunction assertSessionExists(dbManager: DatabaseManager, sessionId: string): void {\n const db = dbManager.open(sessionId)\n if (!db) {\n throw new Error(`Session ${sessionId} not found`)\n }\n}\n\nexport function resolveAIChatTarget(\n options: Pick<ChatCommandOptions, 'sessionId' | 'aiChatId' | 'question'>,\n deps: Pick<ChatCommandDeps, 'dbManager' | 'aiChatManager'>\n): ResolvedAIChatTarget {\n if (options.aiChatId) {\n const aiChat = deps.aiChatManager.getAIChat(options.aiChatId)\n if (!aiChat) {\n throw new Error(`AI chat ${options.aiChatId} not found`)\n }\n if (options.sessionId && options.sessionId !== aiChat.sessionId) {\n throw new Error(`AI chat ${options.aiChatId} belongs to session ${aiChat.sessionId}, not ${options.sessionId}`)\n }\n assertSessionExists(deps.dbManager, aiChat.sessionId)\n return { sessionId: aiChat.sessionId, aiChatId: aiChat.id, assistantId: aiChat.assistantId, created: false }\n }\n\n const sessionId = options.sessionId ?? resolveSingleSessionId(deps.dbManager)\n assertSessionExists(deps.dbManager, sessionId)\n const aiChat = deps.aiChatManager.createAIChat(sessionId, buildTitle(options.question), 'general_cn')\n return { sessionId, aiChatId: aiChat.id, assistantId: aiChat.assistantId, created: true }\n}\n\nexport async function runChatTurn(\n options: Required<Pick<ChatCommandOptions, 'question'>> &\n Pick<ChatCommandOptions, 'sessionId' | 'aiChatId' | 'json' | 'stream' | 'locale'>,\n deps: ChatCommandDeps\n): Promise<ChatTurnResult> {\n const stdout = deps.stdout ?? process.stdout\n const target = resolveAIChatTarget(options, deps)\n const startedAt = Date.now()\n let answer = ''\n let tokenUsage: TokenUsageData | null = null\n let streamError: Error | null = null\n\n const runAgentStream = (deps.createRunAgentStream ?? createCliRunAgentStream)(deps.dbManager, deps.aiChatManager)\n\n await runAgentStream(\n {\n userMessage: options.question,\n sessionId: target.sessionId,\n aiChatId: target.aiChatId,\n assistantId: target.assistantId,\n chatType: 'group',\n locale: options.locale ?? 'zh-CN',\n },\n (chunk: AgentStreamChunk) => {\n if (chunk.type === 'error') {\n streamError = createAgentStreamError(chunk.error)\n return\n }\n if (chunk.type === 'content' && chunk.content) {\n answer += chunk.content\n if (!options.json && options.stream !== false) write(stdout, chunk.content)\n }\n if (chunk.type === 'done' && chunk.usage) {\n tokenUsage = chunk.usage\n }\n },\n new AbortController().signal\n )\n\n if (streamError) throw streamError\n\n if (!options.json && options.stream !== false && answer && !answer.endsWith('\\n')) {\n write(stdout, '\\n')\n }\n\n deps.aiChatManager.addMessage(target.aiChatId, 'user', options.question)\n deps.aiChatManager.addMessage(\n target.aiChatId,\n 'assistant',\n answer,\n undefined,\n undefined,\n undefined,\n tokenUsage ?? undefined\n )\n\n return {\n sessionId: target.sessionId,\n aiChatId: target.aiChatId,\n question: options.question,\n answer,\n usage: {\n durationMs: Date.now() - startedAt,\n tokenUsage,\n },\n }\n}\n\nexport async function runChatCommand(options: ChatCommandOptions, deps: ChatCommandDeps): Promise<void> {\n const stdout = deps.stdout ?? process.stdout\n const stderr = deps.stderr ?? process.stderr\n\n if (options.question?.trim()) {\n const result = await runChatTurn({ ...options, question: options.question.trim() }, deps)\n if (options.json) {\n write(stdout, `${JSON.stringify(result, null, 2)}\\n`)\n } else if (options.stream === false) {\n write(stdout, `${result.answer}\\n`)\n }\n return\n }\n\n const rl = createInterface({\n input: deps.stdin ?? process.stdin,\n output: stdout as Writable,\n })\n\n try {\n let aiChatId = options.aiChatId\n while (true) {\n const question = (await rl.question('chatlab> ')).trim()\n if (!question || question === 'exit' || question === 'quit') break\n try {\n const result = await runChatTurn({ ...options, aiChatId, question, json: false, stream: true }, deps)\n aiChatId = result.aiChatId\n } catch (error) {\n write(stderr, `${error instanceof Error ? error.message : String(error)}\\n`)\n }\n }\n } finally {\n rl.close()\n }\n}\n"],"mappings":"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","names":["aiChat"]}