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.
Files changed (61) hide show
  1. package/README.md +5 -5
  2. package/dist/{chunk-2AIOU3PW.mjs → chunk-6NB475AA.mjs} +12 -3
  3. package/dist/chunk-6NB475AA.mjs.map +1 -0
  4. package/dist/{chunk-OZWXLRJL.mjs → chunk-LZ3W6NS5.mjs} +24 -15
  5. package/dist/chunk-LZ3W6NS5.mjs.map +1 -0
  6. package/dist/{chunk-OQVKZTVD.mjs → chunk-OC2W5Q5T.mjs} +2 -2
  7. package/dist/{chunk-AIR7EAF4.mjs → chunk-QRC3RSER.mjs} +2 -2
  8. package/dist/{chunk-7HQWGLX6.mjs → chunk-SQKT45MM.mjs} +174 -120
  9. package/dist/chunk-SQKT45MM.mjs.map +1 -0
  10. package/dist/chunk-VSOWNKPA.mjs +49 -0
  11. package/dist/{chunk-LI4X52E7.mjs → chunk-XPBPKH6B.mjs} +350 -100
  12. package/dist/chunk-XPBPKH6B.mjs.map +1 -0
  13. package/dist/{chunk-4GI2UPCS.mjs → chunk-Z2LYMKCC.mjs} +2 -2
  14. package/dist/cli.mjs +4 -3
  15. package/dist/{http-DHQI4G5J.mjs → http-O5P4BYXU.mjs} +8 -7
  16. package/dist/{import-CQWGIMZQ.mjs → import-BDLL3DG7.mjs} +5 -4
  17. package/dist/index.mjs +8 -7
  18. package/dist/{mcp-7Q3FEI3Z.mjs → mcp-L2TPZFE7.mjs} +8 -7
  19. package/dist/mcp-L2TPZFE7.mjs.map +1 -0
  20. package/dist/{src-QBT5SYW5.mjs → src-FVJL5ENA.mjs} +3 -2
  21. package/dist/{stream-import-VG7RP6KJ.mjs → stream-import-ZTEW3YVL.mjs} +4 -3
  22. package/dist/stream-import-ZTEW3YVL.mjs.map +1 -0
  23. package/dist/update-checker-MQMQ6A4B.mjs +191 -0
  24. package/dist/update-checker-MQMQ6A4B.mjs.map +1 -0
  25. package/dist-web/assets/{DebugToolsPanel-CoBtqb--.css → DebugToolsPanel-DkbsB6lr.css} +1 -1
  26. 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
  27. package/dist-web/assets/{EChartWordcloud-BYLFxPAX.js → EChartWordcloud-Ubal_aYg.js} +1 -1
  28. package/dist-web/assets/{MessageExportModal-DTgxz1eQ.js → MessageExportModal-D1GY6WSV.js} +1 -1
  29. package/dist-web/assets/{electron-CTK4NJag.js → electron-CRSL7qPM.js} +1 -1
  30. package/dist-web/assets/{electron-H65bUnhW.js → electron-CsUM2O_Y.js} +1 -1
  31. package/dist-web/assets/{fetch-CTZXLLcn.js → fetch-BOogCPfg.js} +1 -1
  32. package/dist-web/assets/{fetch-C2vUkdnA.js → fetch-CxwnEEqk.js} +1 -1
  33. package/dist-web/assets/index-CM29Kc4p.js +173 -0
  34. package/dist-web/assets/index-D183wYuz.js +7 -0
  35. package/dist-web/assets/{index-DeG0EHOT.js → index-DOwQB7In.js} +1 -1
  36. package/dist-web/assets/index-DSpvXged.css +1 -0
  37. package/dist-web/assets/{index-C4B0hv6C.js → index-DTxRy2FH.js} +4 -4
  38. package/dist-web/assets/{index-DuhN8jAf.js → index-grds3iG-.js} +2 -2
  39. package/dist-web/assets/logo-DXIuG_WE.svg +17 -0
  40. package/dist-web/assets/{vendor-echarts-C13vDgZW.js → vendor-echarts-C5u62NnM.js} +1 -1
  41. package/dist-web/assets/{vendor-echarts-wordcloud-uVdwYsYa.js → vendor-echarts-wordcloud-CZ9gsX8l.js} +1 -1
  42. package/dist-web/assets/{vendor-nuxt-ui-CYMNNdeD.js → vendor-nuxt-ui-7OAuiz_i.js} +1 -1
  43. package/dist-web/assets/{vendor-zrender-5DcYjSZk.js → vendor-zrender-DFl4U2Oe.js} +1 -1
  44. package/dist-web/assets/{web-DImo6Kjz.js → web-Cx5APyCN.js} +1 -1
  45. package/dist-web/index.html +3 -3
  46. package/package.json +4 -3
  47. package/dist/chunk-2AIOU3PW.mjs.map +0 -1
  48. package/dist/chunk-7HQWGLX6.mjs.map +0 -1
  49. package/dist/chunk-LI4X52E7.mjs.map +0 -1
  50. package/dist/chunk-OZWXLRJL.mjs.map +0 -1
  51. package/dist/mcp-7Q3FEI3Z.mjs.map +0 -1
  52. package/dist-web/assets/index-B8867dX7.css +0 -1
  53. package/dist-web/assets/index-DUXf21MT.js +0 -173
  54. package/dist-web/assets/index-DZiH2cC1.js +0 -7
  55. /package/dist/{chunk-OQVKZTVD.mjs.map → chunk-OC2W5Q5T.mjs.map} +0 -0
  56. /package/dist/{chunk-AIR7EAF4.mjs.map → chunk-QRC3RSER.mjs.map} +0 -0
  57. /package/dist/{http-DHQI4G5J.mjs.map → chunk-VSOWNKPA.mjs.map} +0 -0
  58. /package/dist/{chunk-4GI2UPCS.mjs.map → chunk-Z2LYMKCC.mjs.map} +0 -0
  59. /package/dist/{import-CQWGIMZQ.mjs.map → http-O5P4BYXU.mjs.map} +0 -0
  60. /package/dist/{src-QBT5SYW5.mjs.map → import-BDLL3DG7.mjs.map} +0 -0
  61. /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
- var __create = Object.create;
8
- var __defProp = Object.defineProperty;
9
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
- var __getOwnPropNames = Object.getOwnPropertyNames;
11
- var __getProtoOf = Object.getPrototypeOf;
12
- var __hasOwnProp = Object.prototype.hasOwnProperty;
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 = (0, import_stream_chain.chain)([readStream, (0, import_stream_json.parser)(), (0, import_Pick.pick)({ filter: /^messages\.\d+$/ }), (0, import_StreamValues.streamValues)()]);
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 = (0, import_stream_chain2.chain)([readStream, (0, import_stream_json2.parser)(), (0, import_Pick2.pick)({ filter: /^messages\.\d+$/ }), (0, import_StreamValues2.streamValues)()]);
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 = (0, import_stream_chain3.chain)([readStream, (0, import_stream_json3.parser)(), (0, import_Pick3.pick)({ filter: /^messages\.\d+$/ }), (0, import_StreamValues3.streamValues)()]);
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 = (0, import_stream_chain4.chain)([scanStream, (0, import_stream_json4.parser)(), (0, import_Pick4.pick)({ filter: /^messages\.\d+$/ }), (0, import_StreamValues4.streamValues)()]);
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 = (0, import_stream_chain4.chain)([readStream, (0, import_stream_json4.parser)(), (0, import_Pick4.pick)({ filter: /^messages\.\d+$/ }), (0, import_StreamValues4.streamValues)()]);
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 = (0, import_stream_chain5.chain)([readStream, (0, import_stream_json5.parser)(), (0, import_Pick5.pick)({ filter: /^messages\.\d+$/ }), (0, import_StreamValues5.streamValues)()]);
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 = (0, import_stream_chain6.chain)([readStream, (0, import_stream_json6.parser)(), (0, import_Pick6.pick)({ filter: /^chats\.list\.\d+$/ }), (0, import_StreamValues6.streamValues)()]);
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 = (0, import_stream_chain6.chain)([
8278
+ const pipeline = chain6([
8284
8279
  readStream,
8285
- (0, import_stream_json6.parser)(),
8286
- (0, import_Pick6.pick)({ filter: new RegExp(`^${chatPathFilter.replace(".", "\\.")}$`) }),
8287
- (0, import_StreamValues6.streamValues)()
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 = (0, import_stream_chain7.chain)([readStream, (0, import_stream_json7.parser)(), (0, import_StreamValues7.streamValues)()]);
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 } = __require("@node-rs/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 skill = getSkillConfig(params.skill_id);
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: params.skill_id, found: false }
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: params.skill_id, found: true, applicable: false }
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: params.skill_id, found: true, applicable: false, missingTools: missing }
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: params.skill_id, found: true, applicable: true }
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 "@mariozechner/pi-ai";
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 "@mariozechner/pi-agent-core";
13178
+ import { Agent as PiAgentCore } from "@earendil-works/pi-agent-core";
13177
13179
  import {
13178
13180
  streamSimple as defaultStreamSimple
13179
- } from "@mariozechner/pi-ai";
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.setTools([]);
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.error || void 0,
13356
- finalMessages: [...coreAgent.state.messages],
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 (messageCount <= 10) return 50;
14909
- if (messageCount <= 30) return 80;
14910
- if (messageCount <= 100) return 120;
14911
- return 200;
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\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
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 conversation concisely (max ${lengthLimit} characters). Output only the summary, no prefix, explanation, or quotes.
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\u8FC750\u5B57\uFF09\u6982\u62EC\u4EE5\u4E0B\u5BF9\u8BDD\u7247\u6BB5\u7684\u4E3B\u8981\u5185\u5BB9\u3002\u53EA\u8F93\u51FA\u6458\u8981\u5185\u5BB9\uFF0C\u4E0D\u8981\u6DFB\u52A0\u4EFB\u4F55\u524D\u7F00\u3001\u89E3\u91CA\u6216\u5F15\u53F7\u3002
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 one sentence (max 50 characters). Output only the summary, no prefix or quotes.
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: 300 }
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: 100 }
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: 300 }
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 "@mariozechner/pi-ai";
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 "@mariozechner/pi-ai";
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 "@mariozechner/pi-ai";
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 "@mariozechner/pi-ai";
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-7HQWGLX6.mjs.map
19204
+ //# sourceMappingURL=chunk-SQKT45MM.mjs.map