chatlab-cli 0.21.1 → 0.22.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.
- package/README.md +5 -5
- package/dist/{chunk-2AIOU3PW.mjs → chunk-6NB475AA.mjs} +12 -3
- package/dist/chunk-6NB475AA.mjs.map +1 -0
- package/dist/{chunk-OZWXLRJL.mjs → chunk-LZ3W6NS5.mjs} +24 -15
- package/dist/chunk-LZ3W6NS5.mjs.map +1 -0
- package/dist/{chunk-OQVKZTVD.mjs → chunk-OC2W5Q5T.mjs} +2 -2
- package/dist/{chunk-AIR7EAF4.mjs → chunk-QRC3RSER.mjs} +2 -2
- package/dist/{chunk-7HQWGLX6.mjs → chunk-SQKT45MM.mjs} +174 -120
- package/dist/chunk-SQKT45MM.mjs.map +1 -0
- package/dist/chunk-VSOWNKPA.mjs +49 -0
- package/dist/{chunk-LI4X52E7.mjs → chunk-XPBPKH6B.mjs} +350 -100
- package/dist/chunk-XPBPKH6B.mjs.map +1 -0
- package/dist/{chunk-4GI2UPCS.mjs → chunk-Z2LYMKCC.mjs} +2 -2
- package/dist/cli.mjs +4 -3
- package/dist/{http-DHQI4G5J.mjs → http-O5P4BYXU.mjs} +8 -7
- package/dist/{import-CQWGIMZQ.mjs → import-BDLL3DG7.mjs} +5 -4
- package/dist/index.mjs +8 -7
- package/dist/{mcp-7Q3FEI3Z.mjs → mcp-L2TPZFE7.mjs} +8 -7
- package/dist/mcp-L2TPZFE7.mjs.map +1 -0
- package/dist/{src-QBT5SYW5.mjs → src-FVJL5ENA.mjs} +3 -2
- package/dist/{stream-import-VG7RP6KJ.mjs → stream-import-ZTEW3YVL.mjs} +4 -3
- package/dist/stream-import-ZTEW3YVL.mjs.map +1 -0
- package/dist/update-checker-MQMQ6A4B.mjs +191 -0
- package/dist/update-checker-MQMQ6A4B.mjs.map +1 -0
- package/dist-web/assets/{DebugToolsPanel-CoBtqb--.css → DebugToolsPanel-DkbsB6lr.css} +1 -1
- package/dist-web/assets/{DebugToolsPanel.vue_vue_type_script_setup_true_lang-CpFGhsl5.js → DebugToolsPanel.vue_vue_type_script_setup_true_lang-CqacsKDU.js} +5 -5
- package/dist-web/assets/{EChartWordcloud-BYLFxPAX.js → EChartWordcloud-Ubal_aYg.js} +1 -1
- package/dist-web/assets/{MessageExportModal-DTgxz1eQ.js → MessageExportModal-D1GY6WSV.js} +1 -1
- package/dist-web/assets/{electron-CTK4NJag.js → electron-CRSL7qPM.js} +1 -1
- package/dist-web/assets/{electron-H65bUnhW.js → electron-CsUM2O_Y.js} +1 -1
- package/dist-web/assets/{fetch-CTZXLLcn.js → fetch-BOogCPfg.js} +1 -1
- package/dist-web/assets/{fetch-C2vUkdnA.js → fetch-CxwnEEqk.js} +1 -1
- package/dist-web/assets/index-CM29Kc4p.js +173 -0
- package/dist-web/assets/index-D183wYuz.js +7 -0
- package/dist-web/assets/{index-DeG0EHOT.js → index-DOwQB7In.js} +1 -1
- package/dist-web/assets/index-DSpvXged.css +1 -0
- package/dist-web/assets/{index-C4B0hv6C.js → index-DTxRy2FH.js} +4 -4
- package/dist-web/assets/{index-DuhN8jAf.js → index-grds3iG-.js} +2 -2
- package/dist-web/assets/logo-DXIuG_WE.svg +17 -0
- package/dist-web/assets/{vendor-echarts-C13vDgZW.js → vendor-echarts-C5u62NnM.js} +1 -1
- package/dist-web/assets/{vendor-echarts-wordcloud-uVdwYsYa.js → vendor-echarts-wordcloud-CZ9gsX8l.js} +1 -1
- package/dist-web/assets/{vendor-nuxt-ui-CYMNNdeD.js → vendor-nuxt-ui-7OAuiz_i.js} +1 -1
- package/dist-web/assets/{vendor-zrender-5DcYjSZk.js → vendor-zrender-DFl4U2Oe.js} +1 -1
- package/dist-web/assets/{web-DImo6Kjz.js → web-Cx5APyCN.js} +1 -1
- package/dist-web/index.html +3 -3
- package/package.json +4 -3
- package/dist/chunk-2AIOU3PW.mjs.map +0 -1
- package/dist/chunk-7HQWGLX6.mjs.map +0 -1
- package/dist/chunk-LI4X52E7.mjs.map +0 -1
- package/dist/chunk-OZWXLRJL.mjs.map +0 -1
- package/dist/mcp-7Q3FEI3Z.mjs.map +0 -1
- package/dist-web/assets/index-B8867dX7.css +0 -1
- package/dist-web/assets/index-DUXf21MT.js +0 -173
- package/dist-web/assets/index-DZiH2cC1.js +0 -7
- /package/dist/{chunk-OQVKZTVD.mjs.map → chunk-OC2W5Q5T.mjs.map} +0 -0
- /package/dist/{chunk-AIR7EAF4.mjs.map → chunk-QRC3RSER.mjs.map} +0 -0
- /package/dist/{http-DHQI4G5J.mjs.map → chunk-VSOWNKPA.mjs.map} +0 -0
- /package/dist/{chunk-4GI2UPCS.mjs.map → chunk-Z2LYMKCC.mjs.map} +0 -0
- /package/dist/{import-CQWGIMZQ.mjs.map → http-O5P4BYXU.mjs.map} +0 -0
- /package/dist/{src-QBT5SYW5.mjs.map → import-BDLL3DG7.mjs.map} +0 -0
- /package/dist/{stream-import-VG7RP6KJ.mjs.map → src-FVJL5ENA.mjs.map} +0 -0
|
@@ -4,41 +4,12 @@ import { fileURLToPath as __fileURLToPath } from 'url';
|
|
|
4
4
|
const require = __createRequire(import.meta.url);
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __pathDirname(__filename);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
14
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
15
|
-
}) : x)(function(x) {
|
|
16
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
17
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
18
|
-
});
|
|
19
|
-
var __commonJS = (cb, mod) => function __require2() {
|
|
20
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
21
|
-
};
|
|
22
|
-
var __export = (target, all) => {
|
|
23
|
-
for (var name in all)
|
|
24
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
25
|
-
};
|
|
26
|
-
var __copyProps = (to, from, except, desc) => {
|
|
27
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
28
|
-
for (let key of __getOwnPropNames(from))
|
|
29
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
30
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
31
|
-
}
|
|
32
|
-
return to;
|
|
33
|
-
};
|
|
34
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
35
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
36
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
37
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
38
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
39
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
40
|
-
mod
|
|
41
|
-
));
|
|
7
|
+
import {
|
|
8
|
+
__commonJS,
|
|
9
|
+
__export,
|
|
10
|
+
__require,
|
|
11
|
+
__toESM
|
|
12
|
+
} from "./chunk-VSOWNKPA.mjs";
|
|
42
13
|
|
|
43
14
|
// ../../node_modules/stream-json/utils/Utf8Stream.js
|
|
44
15
|
var require_Utf8Stream = __commonJS({
|
|
@@ -6251,10 +6222,10 @@ function createSniffer() {
|
|
|
6251
6222
|
}
|
|
6252
6223
|
|
|
6253
6224
|
// ../../packages/parser/src/formats/chatlab.ts
|
|
6254
|
-
var import_stream_json = __toESM(require_stream_json());
|
|
6255
|
-
var import_Pick = __toESM(require_Pick());
|
|
6256
|
-
var import_StreamValues = __toESM(require_StreamValues());
|
|
6257
|
-
var import_stream_chain = __toESM(require_stream_chain());
|
|
6225
|
+
var import_stream_json = __toESM(require_stream_json(), 1);
|
|
6226
|
+
var import_Pick = __toESM(require_Pick(), 1);
|
|
6227
|
+
var import_StreamValues = __toESM(require_StreamValues(), 1);
|
|
6228
|
+
var import_stream_chain = __toESM(require_stream_chain(), 1);
|
|
6258
6229
|
import * as fs4 from "fs";
|
|
6259
6230
|
|
|
6260
6231
|
// ../../packages/shared-types/index.ts
|
|
@@ -6309,6 +6280,10 @@ function isValidYear(timestampSeconds) {
|
|
|
6309
6280
|
|
|
6310
6281
|
// ../../packages/parser/src/formats/chatlab.ts
|
|
6311
6282
|
import * as path3 from "path";
|
|
6283
|
+
var { parser } = import_stream_json.default;
|
|
6284
|
+
var { pick } = import_Pick.default;
|
|
6285
|
+
var { streamValues } = import_StreamValues.default;
|
|
6286
|
+
var { chain } = import_stream_chain.default;
|
|
6312
6287
|
function extractNameFromFilePath(filePath) {
|
|
6313
6288
|
const basename13 = path3.basename(filePath);
|
|
6314
6289
|
const name = basename13.replace(/\.json$/i, "");
|
|
@@ -6403,7 +6378,7 @@ async function* parseChatLab(options) {
|
|
|
6403
6378
|
readStream.on("data", (chunk) => {
|
|
6404
6379
|
bytesRead += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
|
|
6405
6380
|
});
|
|
6406
|
-
const pipeline =
|
|
6381
|
+
const pipeline = chain([readStream, parser(), pick({ filter: /^messages\.\d+$/ }), streamValues()]);
|
|
6407
6382
|
const batchCollector = [];
|
|
6408
6383
|
pipeline.on("data", ({ value }) => {
|
|
6409
6384
|
const msg = value;
|
|
@@ -6643,21 +6618,25 @@ var module_2 = {
|
|
|
6643
6618
|
var chatlab_jsonl_default = module_2;
|
|
6644
6619
|
|
|
6645
6620
|
// ../../packages/parser/src/formats/shuakami-qq-exporter.ts
|
|
6646
|
-
var import_stream_json3 = __toESM(require_stream_json());
|
|
6647
|
-
var import_Pick3 = __toESM(require_Pick());
|
|
6648
|
-
var import_StreamValues3 = __toESM(require_StreamValues());
|
|
6649
|
-
var import_stream_chain3 = __toESM(require_stream_chain());
|
|
6621
|
+
var import_stream_json3 = __toESM(require_stream_json(), 1);
|
|
6622
|
+
var import_Pick3 = __toESM(require_Pick(), 1);
|
|
6623
|
+
var import_StreamValues3 = __toESM(require_StreamValues(), 1);
|
|
6624
|
+
var import_stream_chain3 = __toESM(require_stream_chain(), 1);
|
|
6650
6625
|
import * as fs7 from "fs";
|
|
6651
6626
|
import * as path6 from "path";
|
|
6652
6627
|
|
|
6653
6628
|
// ../../packages/parser/src/formats/shuakami-qq-preprocessor.ts
|
|
6654
|
-
var import_stream_json2 = __toESM(require_stream_json());
|
|
6655
|
-
var import_Pick2 = __toESM(require_Pick());
|
|
6656
|
-
var import_StreamValues2 = __toESM(require_StreamValues());
|
|
6657
|
-
var import_stream_chain2 = __toESM(require_stream_chain());
|
|
6629
|
+
var import_stream_json2 = __toESM(require_stream_json(), 1);
|
|
6630
|
+
var import_Pick2 = __toESM(require_Pick(), 1);
|
|
6631
|
+
var import_StreamValues2 = __toESM(require_StreamValues(), 1);
|
|
6632
|
+
var import_stream_chain2 = __toESM(require_stream_chain(), 1);
|
|
6658
6633
|
import * as fs6 from "fs";
|
|
6659
6634
|
import * as path5 from "path";
|
|
6660
6635
|
import * as os from "os";
|
|
6636
|
+
var { parser: parser3 } = import_stream_json2.default;
|
|
6637
|
+
var { pick: pick2 } = import_Pick2.default;
|
|
6638
|
+
var { streamValues: streamValues2 } = import_StreamValues2.default;
|
|
6639
|
+
var { chain: chain2 } = import_stream_chain2.default;
|
|
6661
6640
|
var PREPROCESS_THRESHOLD = 50 * 1024 * 1024;
|
|
6662
6641
|
function getTempDir() {
|
|
6663
6642
|
return path5.join(os.tmpdir(), "chatlab");
|
|
@@ -6824,7 +6803,7 @@ async function preprocessQQJson(inputPath, onProgress) {
|
|
|
6824
6803
|
const headerJson = JSON.stringify(header);
|
|
6825
6804
|
writeStream.write(headerJson.slice(0, -2) + "\n");
|
|
6826
6805
|
let isFirstMessage = true;
|
|
6827
|
-
const pipeline = (
|
|
6806
|
+
const pipeline = chain2([readStream, parser3(), pick2({ filter: /^messages\.\d+$/ }), streamValues2()]);
|
|
6828
6807
|
pipeline.on("data", ({ value }) => {
|
|
6829
6808
|
const slimMsg = slimMessage(value);
|
|
6830
6809
|
const msgJson = JSON.stringify(slimMsg);
|
|
@@ -6888,6 +6867,10 @@ var qqPreprocessor = {
|
|
|
6888
6867
|
};
|
|
6889
6868
|
|
|
6890
6869
|
// ../../packages/parser/src/formats/shuakami-qq-exporter.ts
|
|
6870
|
+
var { parser: parser4 } = import_stream_json3.default;
|
|
6871
|
+
var { pick: pick3 } = import_Pick3.default;
|
|
6872
|
+
var { streamValues: streamValues3 } = import_StreamValues3.default;
|
|
6873
|
+
var { chain: chain3 } = import_stream_chain3.default;
|
|
6891
6874
|
var feature3 = {
|
|
6892
6875
|
id: "shuakami-qq-exporter",
|
|
6893
6876
|
name: "shuakami/qq-chat-exporter",
|
|
@@ -7026,7 +7009,7 @@ async function* parseV4(options) {
|
|
|
7026
7009
|
readStream.on("data", (chunk) => {
|
|
7027
7010
|
bytesRead += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
|
|
7028
7011
|
});
|
|
7029
|
-
const pipeline = (
|
|
7012
|
+
const pipeline = chain3([readStream, parser4(), pick3({ filter: /^messages\.\d+$/ }), streamValues3()]);
|
|
7030
7013
|
pipeline.on("data", ({ value }) => {
|
|
7031
7014
|
const platformId = value.sender.uin || value.sender.uid || value.rawMessage?.senderUin || value.rawMessage?.senderUid;
|
|
7032
7015
|
if (!platformId) {
|
|
@@ -7445,10 +7428,10 @@ var module_4 = {
|
|
|
7445
7428
|
var shuakami_qq_exporter_chunked_default = module_4;
|
|
7446
7429
|
|
|
7447
7430
|
// ../../packages/parser/src/formats/weflow.ts
|
|
7448
|
-
var import_stream_json4 = __toESM(require_stream_json());
|
|
7449
|
-
var import_Pick4 = __toESM(require_Pick());
|
|
7450
|
-
var import_StreamValues4 = __toESM(require_StreamValues());
|
|
7451
|
-
var import_stream_chain4 = __toESM(require_stream_chain());
|
|
7431
|
+
var import_stream_json4 = __toESM(require_stream_json(), 1);
|
|
7432
|
+
var import_Pick4 = __toESM(require_Pick(), 1);
|
|
7433
|
+
var import_StreamValues4 = __toESM(require_StreamValues(), 1);
|
|
7434
|
+
var import_stream_chain4 = __toESM(require_stream_chain(), 1);
|
|
7452
7435
|
import * as fs9 from "fs";
|
|
7453
7436
|
import * as path8 from "path";
|
|
7454
7437
|
|
|
@@ -7477,6 +7460,10 @@ var weflowPreprocessor = {
|
|
|
7477
7460
|
};
|
|
7478
7461
|
|
|
7479
7462
|
// ../../packages/parser/src/formats/weflow.ts
|
|
7463
|
+
var { parser: parser5 } = import_stream_json4.default;
|
|
7464
|
+
var { pick: pick4 } = import_Pick4.default;
|
|
7465
|
+
var { streamValues: streamValues4 } = import_StreamValues4.default;
|
|
7466
|
+
var { chain: chain4 } = import_stream_chain4.default;
|
|
7480
7467
|
function extractNameFromFilePath4(filePath) {
|
|
7481
7468
|
const basename13 = path8.basename(filePath);
|
|
7482
7469
|
const name = basename13.replace(/\.json$/i, "");
|
|
@@ -7738,7 +7725,7 @@ async function* parseWeFlow(options) {
|
|
|
7738
7725
|
try {
|
|
7739
7726
|
await new Promise((resolve) => {
|
|
7740
7727
|
const scanStream = fs9.createReadStream(filePath, { encoding: "utf-8" });
|
|
7741
|
-
const scanPipeline = (
|
|
7728
|
+
const scanPipeline = chain4([scanStream, parser5(), pick4({ filter: /^messages\.\d+$/ }), streamValues4()]);
|
|
7742
7729
|
scanPipeline.on("data", ({ value }) => {
|
|
7743
7730
|
if (value.isSend === 1 && value.senderUsername && !value.senderUsername.endsWith("@chatroom")) {
|
|
7744
7731
|
ownerId = value.senderUsername;
|
|
@@ -7767,7 +7754,7 @@ async function* parseWeFlow(options) {
|
|
|
7767
7754
|
readStream.on("data", (chunk) => {
|
|
7768
7755
|
bytesRead += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
|
|
7769
7756
|
});
|
|
7770
|
-
const pipeline = (
|
|
7757
|
+
const pipeline = chain4([readStream, parser5(), pick4({ filter: /^messages\.\d+$/ }), streamValues4()]);
|
|
7771
7758
|
const processMessage = (msg) => {
|
|
7772
7759
|
if (!msg.senderUsername || msg.createTime === void 0) {
|
|
7773
7760
|
return null;
|
|
@@ -7895,11 +7882,15 @@ var module_6 = {
|
|
|
7895
7882
|
var ycccccccy_echotrace_default = module_6;
|
|
7896
7883
|
|
|
7897
7884
|
// ../../packages/parser/src/formats/tyrrrz-discord-exporter.ts
|
|
7898
|
-
var import_stream_json5 = __toESM(require_stream_json());
|
|
7899
|
-
var import_Pick5 = __toESM(require_Pick());
|
|
7900
|
-
var import_StreamValues5 = __toESM(require_StreamValues());
|
|
7901
|
-
var import_stream_chain5 = __toESM(require_stream_chain());
|
|
7885
|
+
var import_stream_json5 = __toESM(require_stream_json(), 1);
|
|
7886
|
+
var import_Pick5 = __toESM(require_Pick(), 1);
|
|
7887
|
+
var import_StreamValues5 = __toESM(require_StreamValues(), 1);
|
|
7888
|
+
var import_stream_chain5 = __toESM(require_stream_chain(), 1);
|
|
7902
7889
|
import * as fs10 from "fs";
|
|
7890
|
+
var { parser: parser6 } = import_stream_json5.default;
|
|
7891
|
+
var { pick: pick5 } = import_Pick5.default;
|
|
7892
|
+
var { streamValues: streamValues5 } = import_StreamValues5.default;
|
|
7893
|
+
var { chain: chain5 } = import_stream_chain5.default;
|
|
7903
7894
|
function mapDiscordMessageType(type) {
|
|
7904
7895
|
switch (type) {
|
|
7905
7896
|
// 内容消息
|
|
@@ -8049,7 +8040,7 @@ async function* parseDiscordExporter(options) {
|
|
|
8049
8040
|
readStream.on("data", (chunk) => {
|
|
8050
8041
|
bytesRead += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
|
|
8051
8042
|
});
|
|
8052
|
-
const pipeline = (
|
|
8043
|
+
const pipeline = chain5([readStream, parser6(), pick5({ filter: /^messages\.\d+$/ }), streamValues5()]);
|
|
8053
8044
|
const batchCollector = [];
|
|
8054
8045
|
pipeline.on("data", ({ value }) => {
|
|
8055
8046
|
const msg = value;
|
|
@@ -8157,10 +8148,10 @@ var module_7 = {
|
|
|
8157
8148
|
var tyrrrz_discord_exporter_default = module_7;
|
|
8158
8149
|
|
|
8159
8150
|
// ../../packages/parser/src/formats/telegram-native.ts
|
|
8160
|
-
var import_stream_chain6 = __toESM(require_stream_chain());
|
|
8161
|
-
var import_stream_json6 = __toESM(require_stream_json());
|
|
8162
|
-
var import_Pick6 = __toESM(require_Pick());
|
|
8163
|
-
var import_StreamValues6 = __toESM(require_StreamValues());
|
|
8151
|
+
var import_stream_chain6 = __toESM(require_stream_chain(), 1);
|
|
8152
|
+
var import_stream_json6 = __toESM(require_stream_json(), 1);
|
|
8153
|
+
var import_Pick6 = __toESM(require_Pick(), 1);
|
|
8154
|
+
var import_StreamValues6 = __toESM(require_StreamValues(), 1);
|
|
8164
8155
|
import * as fs11 from "fs";
|
|
8165
8156
|
|
|
8166
8157
|
// ../../packages/parser/src/formats/utils/telegram-utils.ts
|
|
@@ -8226,6 +8217,10 @@ function buildContent(msg) {
|
|
|
8226
8217
|
}
|
|
8227
8218
|
|
|
8228
8219
|
// ../../packages/parser/src/formats/telegram-native.ts
|
|
8220
|
+
var { chain: chain6 } = import_stream_chain6.default;
|
|
8221
|
+
var { parser: parser7 } = import_stream_json6.default;
|
|
8222
|
+
var { pick: pick6 } = import_Pick6.default;
|
|
8223
|
+
var { streamValues: streamValues6 } = import_StreamValues6.default;
|
|
8229
8224
|
var feature8 = {
|
|
8230
8225
|
id: "telegram-native",
|
|
8231
8226
|
name: "Telegram \u5B98\u65B9\u5BFC\u51FA (JSON)",
|
|
@@ -8244,7 +8239,7 @@ async function scanChats(filePath) {
|
|
|
8244
8239
|
const chats = [];
|
|
8245
8240
|
return new Promise((resolve, reject) => {
|
|
8246
8241
|
const readStream = fs11.createReadStream(filePath, { encoding: "utf-8" });
|
|
8247
|
-
const pipeline = (
|
|
8242
|
+
const pipeline = chain6([readStream, parser7(), pick6({ filter: /^chats\.list\.\d+$/ }), streamValues6()]);
|
|
8248
8243
|
pipeline.on("data", ({ value }) => {
|
|
8249
8244
|
const chat = value;
|
|
8250
8245
|
chats.push({
|
|
@@ -8280,11 +8275,11 @@ async function* parseTelegram(options) {
|
|
|
8280
8275
|
readStream.on("data", (chunk) => {
|
|
8281
8276
|
bytesRead += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
|
|
8282
8277
|
});
|
|
8283
|
-
const pipeline = (
|
|
8278
|
+
const pipeline = chain6([
|
|
8284
8279
|
readStream,
|
|
8285
|
-
(
|
|
8286
|
-
(
|
|
8287
|
-
(
|
|
8280
|
+
parser7(),
|
|
8281
|
+
pick6({ filter: new RegExp(`^${chatPathFilter.replace(".", "\\.")}$`) }),
|
|
8282
|
+
streamValues6()
|
|
8288
8283
|
]);
|
|
8289
8284
|
let found = false;
|
|
8290
8285
|
pipeline.on("data", ({ value }) => {
|
|
@@ -8381,10 +8376,13 @@ var module_8 = {
|
|
|
8381
8376
|
var telegram_native_default = module_8;
|
|
8382
8377
|
|
|
8383
8378
|
// ../../packages/parser/src/formats/telegram-native-single.ts
|
|
8384
|
-
var import_stream_chain7 = __toESM(require_stream_chain());
|
|
8385
|
-
var import_stream_json7 = __toESM(require_stream_json());
|
|
8386
|
-
var import_StreamValues7 = __toESM(require_StreamValues());
|
|
8379
|
+
var import_stream_chain7 = __toESM(require_stream_chain(), 1);
|
|
8380
|
+
var import_stream_json7 = __toESM(require_stream_json(), 1);
|
|
8381
|
+
var import_StreamValues7 = __toESM(require_StreamValues(), 1);
|
|
8387
8382
|
import * as fs12 from "fs";
|
|
8383
|
+
var { chain: chain7 } = import_stream_chain7.default;
|
|
8384
|
+
var { parser: parser8 } = import_stream_json7.default;
|
|
8385
|
+
var { streamValues: streamValues7 } = import_StreamValues7.default;
|
|
8388
8386
|
var feature9 = {
|
|
8389
8387
|
id: "telegram-native-single",
|
|
8390
8388
|
name: "Telegram \u5355\u804A\u5929\u5BFC\u51FA (JSON)",
|
|
@@ -8412,7 +8410,7 @@ async function* parseTelegramSingle(options) {
|
|
|
8412
8410
|
onLog?.("info", `\u5F00\u59CB\u89E3\u6790 Telegram \u5355\u804A\u5929 JSON \u6587\u4EF6\uFF0C\u5927\u5C0F: ${(totalBytes / 1024 / 1024).toFixed(2)} MB`);
|
|
8413
8411
|
const chatData = await new Promise((resolve, reject) => {
|
|
8414
8412
|
const readStream = fs12.createReadStream(filePath, { encoding: "utf-8" });
|
|
8415
|
-
const pipeline = (
|
|
8413
|
+
const pipeline = chain7([readStream, parser8(), streamValues7()]);
|
|
8416
8414
|
let found = false;
|
|
8417
8415
|
pipeline.on("data", ({ value }) => {
|
|
8418
8416
|
if (!found) {
|
|
@@ -9775,8 +9773,10 @@ import * as fs20 from "fs";
|
|
|
9775
9773
|
// ../../packages/node-runtime/src/nlp/segmenter.ts
|
|
9776
9774
|
import * as fs18 from "fs";
|
|
9777
9775
|
import * as path14 from "path";
|
|
9776
|
+
import { createRequire } from "module";
|
|
9778
9777
|
var _nlpDir = null;
|
|
9779
9778
|
var jiebaInstances = /* @__PURE__ */ new Map();
|
|
9779
|
+
var require2 = createRequire(import.meta.url);
|
|
9780
9780
|
function initNlpDir(nlpDir) {
|
|
9781
9781
|
_nlpDir = nlpDir;
|
|
9782
9782
|
}
|
|
@@ -9806,7 +9806,7 @@ function getJieba(dictType = "default") {
|
|
|
9806
9806
|
console.log(`[NLP] jieba cache invalidated (dict missing): ${effectiveType}`);
|
|
9807
9807
|
}
|
|
9808
9808
|
try {
|
|
9809
|
-
const { Jieba } =
|
|
9809
|
+
const { Jieba } = require2("@node-rs/jieba");
|
|
9810
9810
|
let instance;
|
|
9811
9811
|
const diskDict = tryLoadDictFromDisk(effectiveType);
|
|
9812
9812
|
if (diskDict) {
|
|
@@ -12372,18 +12372,20 @@ function createActivateSkillTool(options) {
|
|
|
12372
12372
|
required: ["skill_id"]
|
|
12373
12373
|
},
|
|
12374
12374
|
execute: async (_toolCallId, params) => {
|
|
12375
|
-
const
|
|
12375
|
+
const toolParams = params && typeof params === "object" ? params : {};
|
|
12376
|
+
const skillId = toolParams.skill_id || "";
|
|
12377
|
+
const skill = getSkillConfig(skillId);
|
|
12376
12378
|
if (!skill) {
|
|
12377
12379
|
return {
|
|
12378
12380
|
content: [{ type: "text", text: isZh ? "\u6280\u80FD\u4E0D\u5B58\u5728" : "Skill not found" }],
|
|
12379
|
-
details: { skillId
|
|
12381
|
+
details: { skillId, found: false }
|
|
12380
12382
|
};
|
|
12381
12383
|
}
|
|
12382
12384
|
if (skill.chatScope !== "all" && skill.chatScope !== chatType) {
|
|
12383
12385
|
const scopeMsg = isZh ? `\u8BE5\u6280\u80FD\u4EC5\u9002\u7528\u4E8E${skill.chatScope === "group" ? "\u7FA4\u804A" : "\u79C1\u804A"}\u573A\u666F` : `This skill is only applicable to ${skill.chatScope === "group" ? "group chat" : "private chat"} scenarios`;
|
|
12384
12386
|
return {
|
|
12385
12387
|
content: [{ type: "text", text: scopeMsg }],
|
|
12386
|
-
details: { skillId
|
|
12388
|
+
details: { skillId, found: true, applicable: false }
|
|
12387
12389
|
};
|
|
12388
12390
|
}
|
|
12389
12391
|
if (skill.tools.length > 0 && allowedTools && allowedTools.length > 0) {
|
|
@@ -12392,14 +12394,14 @@ function createActivateSkillTool(options) {
|
|
|
12392
12394
|
const msg = isZh ? `\u5F53\u524D\u52A9\u624B\u7F3A\u5C11\u8BE5\u6280\u80FD\u6240\u9700\u7684\u5DE5\u5177\uFF1A${missing.join(", ")}` : `Current assistant lacks tools required by this skill: ${missing.join(", ")}`;
|
|
12393
12395
|
return {
|
|
12394
12396
|
content: [{ type: "text", text: msg }],
|
|
12395
|
-
details: { skillId
|
|
12397
|
+
details: { skillId, found: true, applicable: false, missingTools: missing }
|
|
12396
12398
|
};
|
|
12397
12399
|
}
|
|
12398
12400
|
}
|
|
12399
12401
|
const actionPrompt = isZh ? "\n\n[System]: \u4F60\u5DF2\u6210\u529F\u52A0\u8F7D\u8BE5\u6280\u80FD\u624B\u518C\u3002\u73B0\u5728\uFF0C\u8BF7\u7ACB\u5373\u3001\u81EA\u52A8\u5730\u5F00\u59CB\u6267\u884C\u6B65\u9AA41\uFF0C\u8C03\u7528\u76F8\u5173\u7684\u57FA\u7840\u6570\u636E\u5DE5\u5177\uFF0C\u4E0D\u8981\u7B49\u5F85\u7528\u6237\u7684\u8FDB\u4E00\u6B65\u786E\u8BA4\uFF01" : "\n\n[System]: You have successfully loaded this skill manual. Now, immediately start executing step 1 by calling the relevant data tools. Do not wait for further user confirmation!";
|
|
12400
12402
|
return {
|
|
12401
12403
|
content: [{ type: "text", text: `${skill.prompt}${actionPrompt}` }],
|
|
12402
|
-
details: { skillId
|
|
12404
|
+
details: { skillId, found: true, applicable: true }
|
|
12403
12405
|
};
|
|
12404
12406
|
}
|
|
12405
12407
|
};
|
|
@@ -12591,7 +12593,7 @@ function forceTruncate(input, targetTokens) {
|
|
|
12591
12593
|
// ../../packages/node-runtime/src/ai/compression/adapter-factory.ts
|
|
12592
12594
|
import {
|
|
12593
12595
|
completeSimple
|
|
12594
|
-
} from "@
|
|
12596
|
+
} from "@earendil-works/pi-ai";
|
|
12595
12597
|
var DEFAULT_CONTEXT_WINDOW2 = 128e3;
|
|
12596
12598
|
function createCompressionLlmAdapter(options) {
|
|
12597
12599
|
const { piModel, apiKey, onCompressing, onError } = options;
|
|
@@ -13173,10 +13175,10 @@ function applyPreprocessingPipeline(options) {
|
|
|
13173
13175
|
}
|
|
13174
13176
|
|
|
13175
13177
|
// ../../packages/node-runtime/src/ai/agent/core.ts
|
|
13176
|
-
import { Agent as PiAgentCore } from "@
|
|
13178
|
+
import { Agent as PiAgentCore } from "@earendil-works/pi-agent-core";
|
|
13177
13179
|
import {
|
|
13178
13180
|
streamSimple as defaultStreamSimple
|
|
13179
|
-
} from "@
|
|
13181
|
+
} from "@earendil-works/pi-ai";
|
|
13180
13182
|
function createEmptyPiUsage() {
|
|
13181
13183
|
return {
|
|
13182
13184
|
input: 0,
|
|
@@ -13208,6 +13210,9 @@ function toPiHistoryMessages(messages) {
|
|
|
13208
13210
|
};
|
|
13209
13211
|
});
|
|
13210
13212
|
}
|
|
13213
|
+
function isPiMessage(message) {
|
|
13214
|
+
return message.role === "user" || message.role === "assistant" || message.role === "toolResult";
|
|
13215
|
+
}
|
|
13211
13216
|
async function runAgentCore(options) {
|
|
13212
13217
|
const {
|
|
13213
13218
|
piModel,
|
|
@@ -13238,8 +13243,11 @@ async function runAgentCore(options) {
|
|
|
13238
13243
|
}
|
|
13239
13244
|
const coreAgent = new PiAgentCore({
|
|
13240
13245
|
initialState: {
|
|
13246
|
+
systemPrompt,
|
|
13241
13247
|
model: piModel,
|
|
13242
|
-
thinkingLevel: piModel.reasoning ? "medium" : "off"
|
|
13248
|
+
thinkingLevel: piModel.reasoning ? "medium" : "off",
|
|
13249
|
+
tools: maxToolRounds > 0 ? tools : [],
|
|
13250
|
+
messages: toPiHistoryMessages(history)
|
|
13243
13251
|
},
|
|
13244
13252
|
getApiKey: () => apiKey,
|
|
13245
13253
|
streamFn: resolvedStreamFn,
|
|
@@ -13251,9 +13259,6 @@ async function runAgentCore(options) {
|
|
|
13251
13259
|
return filtered;
|
|
13252
13260
|
}
|
|
13253
13261
|
});
|
|
13254
|
-
coreAgent.setSystemPrompt(systemPrompt);
|
|
13255
|
-
coreAgent.setTools(maxToolRounds > 0 ? tools : []);
|
|
13256
|
-
coreAgent.replaceMessages(toPiHistoryMessages(history));
|
|
13257
13262
|
let hasReachedToolRoundLimit = false;
|
|
13258
13263
|
const thinkingStartTime = /* @__PURE__ */ new Map();
|
|
13259
13264
|
const useThinkParser = needsStreamingThinkParsing(piModel.provider, piModel.id);
|
|
@@ -13313,7 +13318,7 @@ async function runAgentCore(options) {
|
|
|
13313
13318
|
toolRounds += 1;
|
|
13314
13319
|
if (!hasReachedToolRoundLimit && maxToolRounds > 0 && toolRounds >= maxToolRounds) {
|
|
13315
13320
|
hasReachedToolRoundLimit = true;
|
|
13316
|
-
coreAgent.
|
|
13321
|
+
coreAgent.state.tools = [];
|
|
13317
13322
|
coreAgent.steer({
|
|
13318
13323
|
role: "user",
|
|
13319
13324
|
content: [{ type: "text", text: steerMessage }],
|
|
@@ -13352,8 +13357,8 @@ async function runAgentCore(options) {
|
|
|
13352
13357
|
await coreAgent.prompt(userMessage);
|
|
13353
13358
|
return {
|
|
13354
13359
|
usage: totalUsage,
|
|
13355
|
-
error: coreAgent.state.
|
|
13356
|
-
finalMessages:
|
|
13360
|
+
error: coreAgent.state.errorMessage || void 0,
|
|
13361
|
+
finalMessages: coreAgent.state.messages.filter(isPiMessage),
|
|
13357
13362
|
toolsUsed: [...toolsUsed],
|
|
13358
13363
|
toolRounds
|
|
13359
13364
|
};
|
|
@@ -14904,11 +14909,17 @@ var aiLocales = { "zh-CN": zh_CN_default, "en-US": en_US_default, "ja-JP": ja_JP
|
|
|
14904
14909
|
var MIN_MESSAGE_COUNT = 3;
|
|
14905
14910
|
var MAX_CONTENT_PER_CALL = 8e3;
|
|
14906
14911
|
var SEGMENT_THRESHOLD = 8e3;
|
|
14907
|
-
function getSummaryLengthLimit(messageCount) {
|
|
14908
|
-
if (
|
|
14909
|
-
|
|
14910
|
-
|
|
14911
|
-
|
|
14912
|
+
function getSummaryLengthLimit(messageCount, strategy = "standard") {
|
|
14913
|
+
if (strategy === "brief") {
|
|
14914
|
+
if (messageCount <= 10) return 50;
|
|
14915
|
+
if (messageCount <= 30) return 80;
|
|
14916
|
+
if (messageCount <= 100) return 120;
|
|
14917
|
+
return 200;
|
|
14918
|
+
}
|
|
14919
|
+
if (messageCount <= 10) return 100;
|
|
14920
|
+
if (messageCount <= 30) return 200;
|
|
14921
|
+
if (messageCount <= 100) return 350;
|
|
14922
|
+
return 500;
|
|
14912
14923
|
}
|
|
14913
14924
|
var MEANINGFUL_SHORT_ZH = ["\u597D\u7684", "\u4E0D\u662F", "\u662F\u7684", "\u53EF\u4EE5", "\u4E0D\u884C", "\u597D\u5427", "\u660E\u767D", "\u77E5\u9053", "\u540C\u610F"];
|
|
14914
14925
|
var MEANINGLESS_SHORT_EN = [
|
|
@@ -15004,34 +15015,55 @@ function splitIntoSegments(messages, maxCharsPerSegment) {
|
|
|
15004
15015
|
if (currentSegment.length > 0) segments.push(currentSegment);
|
|
15005
15016
|
return segments;
|
|
15006
15017
|
}
|
|
15007
|
-
function buildSummaryPrompt(content, lengthLimit, locale) {
|
|
15018
|
+
function buildSummaryPrompt(content, lengthLimit, locale, strategy) {
|
|
15019
|
+
if (strategy === "brief") {
|
|
15020
|
+
if (locale.startsWith("zh")) {
|
|
15021
|
+
return `\u8BF7\u7528\u7B80\u6D01\u7684\u8BED\u8A00\uFF08${lengthLimit}\u5B57\u4EE5\u5185\uFF09\u603B\u7ED3\u4EE5\u4E0B\u5BF9\u8BDD\u7684\u4E3B\u8981\u5185\u5BB9\u6216\u8BDD\u9898\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
|
|
15022
|
+
|
|
15023
|
+
${content}`;
|
|
15024
|
+
}
|
|
15025
|
+
return `Summarize the following conversation concisely (max ${lengthLimit} characters). Output only the summary, no prefix, explanation, or quotes.
|
|
15026
|
+
|
|
15027
|
+
${content}`;
|
|
15028
|
+
}
|
|
15008
15029
|
if (locale.startsWith("zh")) {
|
|
15009
|
-
return `\u8BF7\
|
|
15030
|
+
return `\u8BF7\u603B\u7ED3\u4EE5\u4E0B\u804A\u5929\u8BB0\u5F55\uFF08${lengthLimit}\u5B57\u4EE5\u5185\uFF09\uFF0C\u9700\u5305\u542B\uFF1A\u8C01\u53C2\u4E0E\u4E86\u8BA8\u8BBA\u3001\u8BA8\u8BBA\u4E86\u4EC0\u4E48\u4E8B\u60C5\u3001\u5173\u952E\u7EC6\u8282\u548C\u7ED3\u8BBA\u3002\u75282-4\u53E5\u8BDD\u63CF\u8FF0\uFF0C\u4E0D\u8981\u7F57\u5217\u6BCF\u6761\u6D88\u606F\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
|
|
15010
15031
|
|
|
15011
15032
|
${content}`;
|
|
15012
15033
|
}
|
|
15013
|
-
return `Summarize the following
|
|
15034
|
+
return `Summarize the following chat log (max ${lengthLimit} characters). Include: who participated, what was discussed, key details and conclusions. Use 2-4 sentences, don't list individual messages. Output only the summary, no prefix, explanation, or quotes.
|
|
15014
15035
|
|
|
15015
15036
|
${content}`;
|
|
15016
15037
|
}
|
|
15017
|
-
function buildSubSummaryPrompt(content, locale) {
|
|
15038
|
+
function buildSubSummaryPrompt(content, locale, strategy) {
|
|
15039
|
+
const limit = strategy === "brief" ? 50 : 100;
|
|
15018
15040
|
if (locale.startsWith("zh")) {
|
|
15019
|
-
return `\u8BF7\u7528\u4E00\u53E5\u8BDD\uFF08\u4E0D\u8D85\
|
|
15041
|
+
return `\u8BF7\u7528\u4E00\u5230\u4E24\u53E5\u8BDD\uFF08\u4E0D\u8D85\u8FC7${limit}\u5B57\uFF09\u6982\u62EC\u4EE5\u4E0B\u5BF9\u8BDD\u7247\u6BB5\u7684\u4E3B\u8981\u5185\u5BB9\uFF0C\u5305\u62EC\u8C01\u8BF4\u4E86\u4EC0\u4E48\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
|
|
15020
15042
|
|
|
15021
15043
|
${content}`;
|
|
15022
15044
|
}
|
|
15023
|
-
return `Summarize this conversation segment in
|
|
15045
|
+
return `Summarize this conversation segment in 1-2 sentences (max ${limit} characters), including who said what. Output only the summary, no prefix or quotes.
|
|
15024
15046
|
|
|
15025
15047
|
${content}`;
|
|
15026
15048
|
}
|
|
15027
|
-
function buildMergePrompt(subSummaries, lengthLimit, locale) {
|
|
15049
|
+
function buildMergePrompt(subSummaries, lengthLimit, locale, strategy) {
|
|
15028
15050
|
const list = subSummaries.map((s, i) => `${i + 1}. ${s}`).join("\n");
|
|
15051
|
+
if (strategy === "brief") {
|
|
15052
|
+
if (locale.startsWith("zh")) {
|
|
15053
|
+
return `\u4EE5\u4E0B\u662F\u4E00\u6BB5\u5BF9\u8BDD\u7684\u591A\u4E2A\u7247\u6BB5\u6458\u8981\uFF0C\u8BF7\u5C06\u5B83\u4EEC\u5408\u5E76\u6210\u4E00\u4E2A\u5B8C\u6574\u7684\u603B\u7ED3\uFF08${lengthLimit}\u5B57\u4EE5\u5185\uFF09\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
|
|
15054
|
+
|
|
15055
|
+
${list}`;
|
|
15056
|
+
}
|
|
15057
|
+
return `Below are summaries of different parts of a conversation. Merge them into one cohesive summary (max ${lengthLimit} characters). Output only the summary, no prefix or quotes.
|
|
15058
|
+
|
|
15059
|
+
${list}`;
|
|
15060
|
+
}
|
|
15029
15061
|
if (locale.startsWith("zh")) {
|
|
15030
|
-
return `\u4EE5\u4E0B\u662F\u4E00\u6BB5\u5BF9\u8BDD\u7684\u591A\u4E2A\u7247\u6BB5\u6458\u8981\uFF0C\u8BF7\u5C06\u5B83\u4EEC\u5408\u5E76\u6210\u4E00\u4E2A\u5B8C\u6574\u7684\u603B\u7ED3\uFF08${lengthLimit}\u5B57\u4EE5\u5185\uFF09\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
|
|
15062
|
+
return `\u4EE5\u4E0B\u662F\u4E00\u6BB5\u5BF9\u8BDD\u7684\u591A\u4E2A\u7247\u6BB5\u6458\u8981\uFF0C\u8BF7\u5C06\u5B83\u4EEC\u5408\u5E76\u6210\u4E00\u4E2A\u5B8C\u6574\u7684\u603B\u7ED3\uFF08${lengthLimit}\u5B57\u4EE5\u5185\uFF09\u3002\u4FDD\u7559\u53C2\u4E0E\u8005\u3001\u4E8B\u4EF6\u548C\u5173\u952E\u7EC6\u8282\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
|
|
15031
15063
|
|
|
15032
15064
|
${list}`;
|
|
15033
15065
|
}
|
|
15034
|
-
return `Below are summaries of different parts of a conversation. Merge them into one cohesive summary (max ${lengthLimit} characters). Output only the summary, no prefix or quotes.
|
|
15066
|
+
return `Below are summaries of different parts of a conversation. Merge them into one cohesive summary (max ${lengthLimit} characters). Preserve participants, events, and key details. Output only the summary, no prefix or quotes.
|
|
15035
15067
|
|
|
15036
15068
|
${list}`;
|
|
15037
15069
|
}
|
|
@@ -15047,7 +15079,7 @@ function postProcessSummary(summary, lengthLimit) {
|
|
|
15047
15079
|
return result;
|
|
15048
15080
|
}
|
|
15049
15081
|
async function generateSessionSummary(deps, chatSessionId, options = {}) {
|
|
15050
|
-
const { locale = "zh-CN", forceRegenerate = false } = options;
|
|
15082
|
+
const { locale = "zh-CN", forceRegenerate = false, strategy = "standard" } = options;
|
|
15051
15083
|
const log = deps.logger;
|
|
15052
15084
|
try {
|
|
15053
15085
|
if (!forceRegenerate) {
|
|
@@ -15065,18 +15097,20 @@ async function generateSessionSummary(deps, chatSessionId, options = {}) {
|
|
|
15065
15097
|
if (validMessages.length < MIN_MESSAGE_COUNT) {
|
|
15066
15098
|
return { success: false, error: deps.t("summary.tooFewValidMessages", { count: MIN_MESSAGE_COUNT }) };
|
|
15067
15099
|
}
|
|
15068
|
-
const lengthLimit = getSummaryLengthLimit(validMessages.length);
|
|
15100
|
+
const lengthLimit = getSummaryLengthLimit(validMessages.length, strategy);
|
|
15101
|
+
const maxTokens = strategy === "brief" ? 300 : 600;
|
|
15102
|
+
const subMaxTokens = strategy === "brief" ? 100 : 200;
|
|
15069
15103
|
const content = formatMessages(validMessages);
|
|
15070
15104
|
log?.info(
|
|
15071
15105
|
"Summary",
|
|
15072
|
-
`Generating summary: sessionId=${chatSessionId}, raw=${rawMessages.length}, valid=${validMessages.length}, chars=${content.length}`
|
|
15106
|
+
`Generating summary: sessionId=${chatSessionId}, strategy=${strategy}, raw=${rawMessages.length}, valid=${validMessages.length}, chars=${content.length}`
|
|
15073
15107
|
);
|
|
15074
15108
|
let summary;
|
|
15075
15109
|
if (content.length <= SEGMENT_THRESHOLD) {
|
|
15076
15110
|
summary = await deps.llmComplete(
|
|
15077
15111
|
deps.t("summary.systemPromptDirect"),
|
|
15078
|
-
buildSummaryPrompt(content, lengthLimit, locale),
|
|
15079
|
-
{ temperature: 0.3, maxTokens
|
|
15112
|
+
buildSummaryPrompt(content, lengthLimit, locale, strategy),
|
|
15113
|
+
{ temperature: 0.3, maxTokens }
|
|
15080
15114
|
);
|
|
15081
15115
|
summary = summary.trim();
|
|
15082
15116
|
} else {
|
|
@@ -15087,8 +15121,8 @@ async function generateSessionSummary(deps, chatSessionId, options = {}) {
|
|
|
15087
15121
|
const segContent = formatMessages(segment2);
|
|
15088
15122
|
const sub = await deps.llmComplete(
|
|
15089
15123
|
deps.t("summary.systemPromptDirect"),
|
|
15090
|
-
buildSubSummaryPrompt(segContent, locale),
|
|
15091
|
-
{ temperature: 0.3, maxTokens:
|
|
15124
|
+
buildSubSummaryPrompt(segContent, locale, strategy),
|
|
15125
|
+
{ temperature: 0.3, maxTokens: subMaxTokens }
|
|
15092
15126
|
);
|
|
15093
15127
|
subSummaries.push(sub.trim());
|
|
15094
15128
|
}
|
|
@@ -15097,8 +15131,8 @@ async function generateSessionSummary(deps, chatSessionId, options = {}) {
|
|
|
15097
15131
|
} else {
|
|
15098
15132
|
summary = await deps.llmComplete(
|
|
15099
15133
|
deps.t("summary.systemPromptMerge"),
|
|
15100
|
-
buildMergePrompt(subSummaries, lengthLimit, locale),
|
|
15101
|
-
{ temperature: 0.3, maxTokens
|
|
15134
|
+
buildMergePrompt(subSummaries, lengthLimit, locale, strategy),
|
|
15135
|
+
{ temperature: 0.3, maxTokens }
|
|
15102
15136
|
);
|
|
15103
15137
|
summary = summary.trim();
|
|
15104
15138
|
}
|
|
@@ -15408,7 +15442,7 @@ function buildPiModel(config, options) {
|
|
|
15408
15442
|
}
|
|
15409
15443
|
|
|
15410
15444
|
// ../../packages/node-runtime/src/ai/remote-api.ts
|
|
15411
|
-
import { completeSimple as completeSimple2 } from "@
|
|
15445
|
+
import { completeSimple as completeSimple2 } from "@earendil-works/pi-ai";
|
|
15412
15446
|
async function fetchRemoteModels(provider, apiKey, baseUrl, apiFormat, options) {
|
|
15413
15447
|
const effectiveApiFormat = apiFormat || "openai-completions";
|
|
15414
15448
|
if (effectiveApiFormat === "anthropic-messages") {
|
|
@@ -15513,7 +15547,7 @@ async function validateApiKey(provider, apiKey, baseUrl, model, apiFormat, optio
|
|
|
15513
15547
|
}
|
|
15514
15548
|
|
|
15515
15549
|
// ../../packages/node-runtime/src/ai/llm-stream.ts
|
|
15516
|
-
import { streamSimple } from "@
|
|
15550
|
+
import { streamSimple } from "@earendil-works/pi-ai";
|
|
15517
15551
|
function toPiMessages(messages, timestamp) {
|
|
15518
15552
|
return messages.map((m) => ({
|
|
15519
15553
|
role: m.role,
|
|
@@ -15584,7 +15618,7 @@ async function runSimpleLlmStream(options) {
|
|
|
15584
15618
|
}
|
|
15585
15619
|
|
|
15586
15620
|
// ../../packages/node-runtime/src/ai/index.ts
|
|
15587
|
-
import { Type, completeSimple as completeSimple4, streamSimple as streamSimple2 } from "@
|
|
15621
|
+
import { Type, completeSimple as completeSimple4, streamSimple as streamSimple2 } from "@earendil-works/pi-ai";
|
|
15588
15622
|
|
|
15589
15623
|
// ../../packages/node-runtime/src/ai/rag/config.ts
|
|
15590
15624
|
import * as fs24 from "fs";
|
|
@@ -16627,7 +16661,7 @@ async function getVectorStoreStats() {
|
|
|
16627
16661
|
}
|
|
16628
16662
|
|
|
16629
16663
|
// ../../packages/node-runtime/src/ai/rag/pipeline/semantic.ts
|
|
16630
|
-
import { completeSimple as completeSimple3 } from "@
|
|
16664
|
+
import { completeSimple as completeSimple3 } from "@earendil-works/pi-ai";
|
|
16631
16665
|
var _logger8 = getNoopLogger();
|
|
16632
16666
|
var _getLLMConfig2 = null;
|
|
16633
16667
|
function initSemanticPipeline(logger, getLLMConfig) {
|
|
@@ -16824,7 +16858,8 @@ var llmConfigSchema = z.object({
|
|
|
16824
16858
|
base_url: z.string().default("")
|
|
16825
16859
|
});
|
|
16826
16860
|
var dataConfigSchema = z.object({
|
|
16827
|
-
user_data_dir: z.string().default("")
|
|
16861
|
+
user_data_dir: z.string().default(""),
|
|
16862
|
+
electron_migration_done: z.boolean().default(false)
|
|
16828
16863
|
});
|
|
16829
16864
|
var apiConfigSchema = z.object({
|
|
16830
16865
|
port: z.number().int().min(1).max(65535).default(DEFAULT_API_PORT),
|
|
@@ -16836,7 +16871,8 @@ var localeConfigSchema = z.object({
|
|
|
16836
16871
|
});
|
|
16837
16872
|
var uiConfigSchema = z.object({
|
|
16838
16873
|
default_session_tab: z.enum(["overview", "ai-chat"]).default("overview"),
|
|
16839
|
-
session_gap_threshold: z.number().int().min(60).max(86400).default(1800)
|
|
16874
|
+
session_gap_threshold: z.number().int().min(60).max(86400).default(1800),
|
|
16875
|
+
summary_strategy: z.enum(["brief", "standard"]).default("standard")
|
|
16840
16876
|
});
|
|
16841
16877
|
var configSchema = z.object({
|
|
16842
16878
|
llm: llmConfigSchema.default({}),
|
|
@@ -18800,6 +18836,7 @@ function rebuildFts(adapter, sessionId) {
|
|
|
18800
18836
|
// ../../packages/node-runtime/src/services/summary-service.ts
|
|
18801
18837
|
var summary_service_exports = {};
|
|
18802
18838
|
__export(summary_service_exports, {
|
|
18839
|
+
checkCanGenerate: () => checkCanGenerate,
|
|
18803
18840
|
generateAllSummaries: () => generateAllSummaries,
|
|
18804
18841
|
generateSummary: () => generateSummary
|
|
18805
18842
|
});
|
|
@@ -18857,6 +18894,23 @@ async function generateAllSummaries(adapter, sessionId, serviceDeps, options) {
|
|
|
18857
18894
|
}
|
|
18858
18895
|
return { success, failed, total: chatSessions.length };
|
|
18859
18896
|
}
|
|
18897
|
+
function checkCanGenerate(adapter, sessionId, chatSessionIds) {
|
|
18898
|
+
const db = adapter.ensureReadonly(sessionId);
|
|
18899
|
+
const deps = {
|
|
18900
|
+
loadMessages(chatSessionId, limit = 500) {
|
|
18901
|
+
const data = getSessionMessages(db, chatSessionId, limit);
|
|
18902
|
+
if (!data) return null;
|
|
18903
|
+
return data.messages.map((m) => ({ senderName: m.senderName, content: m.content }));
|
|
18904
|
+
},
|
|
18905
|
+
t: (key) => key
|
|
18906
|
+
};
|
|
18907
|
+
const resultMap = checkSessionsCanGenerateSummary(deps, chatSessionIds);
|
|
18908
|
+
const result = {};
|
|
18909
|
+
for (const [id, info] of resultMap) {
|
|
18910
|
+
result[id] = info;
|
|
18911
|
+
}
|
|
18912
|
+
return result;
|
|
18913
|
+
}
|
|
18860
18914
|
|
|
18861
18915
|
// ../../packages/node-runtime/src/services/export-service.ts
|
|
18862
18916
|
var export_service_exports = {};
|
|
@@ -19147,4 +19201,4 @@ export {
|
|
|
19147
19201
|
export_service_exports,
|
|
19148
19202
|
createDatabaseManagerAdapter
|
|
19149
19203
|
};
|
|
19150
|
-
//# sourceMappingURL=chunk-
|
|
19204
|
+
//# sourceMappingURL=chunk-SQKT45MM.mjs.map
|