chatlab-cli 0.30.0 → 0.30.1-beta.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 (87) hide show
  1. package/dist/{chat-command-UZ23GKO7.mjs → chat-command-VBDMWOKL.mjs} +8 -8
  2. package/dist/{chunk-RDR6PS2R.mjs → chunk-326OCJOT.mjs} +2 -2
  3. package/dist/{chunk-A2SANKG4.mjs → chunk-36JGKW6K.mjs} +593 -254
  4. package/dist/chunk-36JGKW6K.mjs.map +1 -0
  5. package/dist/{chunk-ZFU2CHW3.mjs → chunk-5EE2EFPE.mjs} +4 -4
  6. package/dist/{chunk-4IZ3WKYU.mjs → chunk-D3DPCDII.mjs} +24 -11
  7. package/dist/chunk-D3DPCDII.mjs.map +1 -0
  8. package/dist/{chunk-FCCL5Z4W.mjs → chunk-KBSAVUFV.mjs} +7 -4
  9. package/dist/chunk-KBSAVUFV.mjs.map +1 -0
  10. package/dist/{chunk-7BZLS2KW.mjs → chunk-LVEJHB3X.mjs} +242 -236
  11. package/dist/chunk-LVEJHB3X.mjs.map +1 -0
  12. package/dist/{chunk-M55KW2HA.mjs → chunk-M2PXDX4G.mjs} +14 -12
  13. package/dist/chunk-M2PXDX4G.mjs.map +1 -0
  14. package/dist/{chunk-5UBHNQFZ.mjs → chunk-TCZHG3G7.mjs} +2 -2
  15. package/dist/{chunk-CNSYXRJP.mjs → chunk-TEX44HNL.mjs} +16 -12
  16. package/dist/chunk-TEX44HNL.mjs.map +1 -0
  17. package/dist/{chunk-P3ZOLTGS.mjs → chunk-ULNRUS55.mjs} +5 -3
  18. package/dist/chunk-ULNRUS55.mjs.map +1 -0
  19. package/dist/{chunk-MUPILWAZ.mjs → chunk-WV5GSRQM.mjs} +2 -2
  20. package/dist/cli.mjs +7 -7
  21. package/dist/contacts-worker.mjs +2 -2
  22. package/dist/{http-UWRA5FLB.mjs → http-L4AMELPZ.mjs} +11 -11
  23. package/dist/{import-745KQL7N.mjs → import-WWCSXGVS.mjs} +7 -7
  24. package/dist/index.mjs +11 -11
  25. package/dist/{mcp-UHN5JOHC.mjs → mcp-A4M3LT5O.mjs} +8 -8
  26. package/dist/people-relationships-worker.mjs +2 -2
  27. package/dist/semantic-index-worker.mjs +1 -1
  28. package/dist/{src-Y7MDRXLJ.mjs → src-MPNBTFOE.mjs} +8 -6
  29. package/dist/{stream-import-3JMXQD7P.mjs → stream-import-HIE7PNL4.mjs} +7 -7
  30. package/dist/{worker-runtime-63RYMGZI.mjs → worker-runtime-BJXO24XX.mjs} +5 -5
  31. package/dist-web/assets/{BufferResource-BVdJ_I5X.js → BufferResource-DPkMC1wo.js} +1 -1
  32. package/dist-web/assets/{CanvasRenderer-BaRuT54R.js → CanvasRenderer-DokMtSX9.js} +1 -1
  33. package/dist-web/assets/{DebugToolsPanel.vue_vue_type_script_setup_true_lang-N5CoiJzN.js → DebugToolsPanel.vue_vue_type_script_setup_true_lang-Ceg-0WOD.js} +4 -4
  34. package/dist-web/assets/{Filter-B7cNFtuE.js → Filter-Bo_p3BVX.js} +1 -1
  35. package/dist-web/assets/{MessageExportModal-B2Qm6VVj.js → MessageExportModal-Ch0tqQix.js} +1 -1
  36. package/dist-web/assets/{PageHeader-PjlWy9fC.js → PageHeader-CRlmZoKw.js} +1 -1
  37. package/dist-web/assets/{RelationshipGalaxyCanvas-11MafciW.js → RelationshipGalaxyCanvas-W_6XfPOG.js} +3 -3
  38. package/dist-web/assets/{RelationshipGalaxyThreeCanvas-C1I4B8NX.js → RelationshipGalaxyThreeCanvas-bB1nCwQ_.js} +1 -1
  39. package/dist-web/assets/{RenderTargetSystem-Chkz1WlI.js → RenderTargetSystem-obRi6fMT.js} +1 -1
  40. package/dist-web/assets/{WebGLRenderer-xK19ru58.js → WebGLRenderer-xcDlnrCZ.js} +1 -1
  41. package/dist-web/assets/{WebGPURenderer-CL5ZaKsn.js → WebGPURenderer-DbAOiiYr.js} +1 -1
  42. package/dist-web/assets/{browserAll-CyyNzRD_.js → browserAll-DVRJimO8.js} +1 -1
  43. package/dist-web/assets/{electron-MXaTKaMu.js → electron-BSGRuxX9.js} +1 -1
  44. package/dist-web/assets/{fetch-D1dDiFO4.js → fetch-7UN4YW3A.js} +1 -1
  45. package/dist-web/assets/{fetch-DaaJwT-5.js → fetch-B2alAySK.js} +1 -1
  46. package/dist-web/assets/{fetch-DpnIGZSN.js → fetch-B2rVTMYY.js} +1 -1
  47. package/dist-web/assets/{fetch-DTwdRTXM.js → fetch-BSShKcMt.js} +1 -1
  48. package/dist-web/assets/{fetch-DsTgYu_X.js → fetch-BmxMf3I6.js} +1 -1
  49. package/dist-web/assets/{fetch-u9GTMhMF.js → fetch-CR5UDFW7.js} +1 -1
  50. package/dist-web/assets/{fetch-DsE-xcP2.js → fetch-ChAsglT5.js} +1 -1
  51. package/dist-web/assets/{fetch-hKE53UO4.js → fetch-DWEjTdcP.js} +1 -1
  52. package/dist-web/assets/{fetch-DDnVXGte.js → fetch-DfoxedXR.js} +1 -1
  53. package/dist-web/assets/{fetch-DeA0ztwT.js → fetch-t0WsRKHW.js} +1 -1
  54. package/dist-web/assets/{index-BcXLcFnV.css → index-B4l3rHie.css} +1 -1
  55. package/dist-web/assets/{index-DqtXt3wl.js → index-BVUTV9_w.js} +1 -1
  56. package/dist-web/assets/{index-DFCYmzGE.js → index-BmXNdMV5.js} +2 -2
  57. package/dist-web/assets/index-BsXljrlg.js +22 -0
  58. package/dist-web/assets/index-CQ5lRCHt.js +173 -0
  59. package/dist-web/assets/{index-Btr5H7d-.js → index-CZv0ZOID.js} +2 -2
  60. package/dist-web/assets/{index-DqXHRIhI.js → index-CfgDqd_z.js} +1 -1
  61. package/dist-web/assets/{index-BnHKyESZ.js → index-CtVR_KuP.js} +1 -1
  62. package/dist-web/assets/{index-Dszv-QFp.js → index-DT0Bu8mH.js} +3 -3
  63. package/dist-web/assets/{index-DzLrWGXu.js → index-DjcWJv4b.js} +1 -1
  64. package/dist-web/assets/{web-DPVWfPS-.js → web-knHSvvNj.js} +1 -1
  65. package/dist-web/assets/{webworkerAll-DF5QV_vN.js → webworkerAll-CMKoykfD.js} +1 -1
  66. package/dist-web/index.html +2 -2
  67. package/package.json +1 -1
  68. package/dist/chunk-4IZ3WKYU.mjs.map +0 -1
  69. package/dist/chunk-7BZLS2KW.mjs.map +0 -1
  70. package/dist/chunk-A2SANKG4.mjs.map +0 -1
  71. package/dist/chunk-CNSYXRJP.mjs.map +0 -1
  72. package/dist/chunk-FCCL5Z4W.mjs.map +0 -1
  73. package/dist/chunk-M55KW2HA.mjs.map +0 -1
  74. package/dist/chunk-P3ZOLTGS.mjs.map +0 -1
  75. package/dist-web/assets/index-BVkE4qis.js +0 -22
  76. package/dist-web/assets/index-D04LWJop.js +0 -173
  77. /package/dist/{chat-command-UZ23GKO7.mjs.map → chat-command-VBDMWOKL.mjs.map} +0 -0
  78. /package/dist/{chunk-RDR6PS2R.mjs.map → chunk-326OCJOT.mjs.map} +0 -0
  79. /package/dist/{chunk-ZFU2CHW3.mjs.map → chunk-5EE2EFPE.mjs.map} +0 -0
  80. /package/dist/{chunk-5UBHNQFZ.mjs.map → chunk-TCZHG3G7.mjs.map} +0 -0
  81. /package/dist/{chunk-MUPILWAZ.mjs.map → chunk-WV5GSRQM.mjs.map} +0 -0
  82. /package/dist/{http-UWRA5FLB.mjs.map → http-L4AMELPZ.mjs.map} +0 -0
  83. /package/dist/{import-745KQL7N.mjs.map → import-WWCSXGVS.mjs.map} +0 -0
  84. /package/dist/{mcp-UHN5JOHC.mjs.map → mcp-A4M3LT5O.mjs.map} +0 -0
  85. /package/dist/{src-Y7MDRXLJ.mjs.map → src-MPNBTFOE.mjs.map} +0 -0
  86. /package/dist/{stream-import-3JMXQD7P.mjs.map → stream-import-HIE7PNL4.mjs.map} +0 -0
  87. /package/dist/{worker-runtime-63RYMGZI.mjs.map → worker-runtime-BJXO24XX.mjs.map} +0 -0
@@ -9,10 +9,10 @@ import {
9
9
  analyzeNewImport,
10
10
  incrementalImport,
11
11
  streamingImport
12
- } from "./chunk-A2SANKG4.mjs";
12
+ } from "./chunk-36JGKW6K.mjs";
13
13
  import {
14
14
  DataDirCompatibilityError
15
- } from "./chunk-7BZLS2KW.mjs";
15
+ } from "./chunk-LVEJHB3X.mjs";
16
16
 
17
17
  // src/import/stream-import.ts
18
18
  import * as crypto from "crypto";
@@ -54,11 +54,14 @@ async function streamImport(dbManager, filePath, options) {
54
54
  stage = "parsing";
55
55
  pct = Math.min(Math.round(progress.percentage * 0.7), 70);
56
56
  break;
57
- case "importing":
58
57
  case "saving":
59
58
  stage = "saving";
60
59
  pct = 80;
61
60
  break;
61
+ case "indexing":
62
+ stage = "indexing";
63
+ pct = 90;
64
+ break;
62
65
  case "done":
63
66
  stage = "done";
64
67
  pct = 100;
@@ -155,4 +158,4 @@ export {
155
158
  analyzeIncrementalImport2 as analyzeIncrementalImport,
156
159
  analyzeNewImport2 as analyzeNewImport
157
160
  };
158
- //# sourceMappingURL=chunk-FCCL5Z4W.mjs.map
161
+ //# sourceMappingURL=chunk-KBSAVUFV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/import/stream-import.ts"],"sourcesContent":["/**\n * Server/CLI streaming import — adapter for @openchatlab/node-runtime StreamingImporter.\n *\n * Replaces the old buffered-in-memory approach with the same high-performance\n * streaming pipeline used by Electron (batched transactions, deferred indexes,\n * nickname history, FTS, format fallback).\n */\n\nimport type { DatabaseManager } from '@openchatlab/node-runtime'\nimport {\n DataDirCompatibilityError,\n streamingImport,\n analyzeNewImport as sharedAnalyzeNewImport,\n analyzeIncrementalImport as sharedAnalyzeIncremental,\n incrementalImport as sharedIncrementalImport,\n} from '@openchatlab/node-runtime'\nimport type {\n StreamImportResult,\n StreamImportDeps,\n ImportProgressCallback,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n IncrementalImportDeps,\n ImportOptions,\n AnalyzeNewImportResult,\n} from '@openchatlab/node-runtime'\nimport {\n detectFormat as parserDetectFormat,\n detectAllFormats,\n getFormatFeatureById,\n getSupportedFormats as parserGetSupportedFormats,\n scanMultiChatFile as parserScanMultiChatFile,\n findEntryFileInDirectory,\n type FormatFeature,\n type MultiChatInfo,\n type ParseProgress,\n} from '@openchatlab/parser'\nimport * as crypto from 'crypto'\n\n// ==================== Legacy progress interface (for SSE routes) ====================\n\nexport interface StreamImportProgress {\n stage: 'detecting' | 'parsing' | 'saving' | 'indexing' | 'done' | 'error'\n progress: number\n message: string\n bytesRead?: number\n totalBytes?: number\n messagesProcessed?: number\n}\n\nexport interface StreamImportOptions {\n formatId?: string\n chatIndex?: number\n nativeBinding?: string\n onProgress?: (progress: StreamImportProgress) => void\n /** Fix the target session ID instead of auto-generating one. Used by sync/pull adapters. */\n sessionId?: string\n}\n\nfunction generateSessionId(): string {\n const ts = Date.now()\n const rand = crypto.randomBytes(4).toString('hex')\n return `chat_${ts}_${rand}`\n}\n\nfunction buildStreamImportDeps(dbManager: DatabaseManager, onProgress?: ImportProgressCallback): StreamImportDeps {\n return {\n openDatabase(sessionId: string) {\n return dbManager.openRawSessionDatabase(sessionId, { create: true, initializeChatTables: true })\n },\n deleteDatabase(sessionId: string) {\n dbManager.deleteSessionDatabaseFiles(sessionId)\n },\n onProgress: onProgress ?? (() => {}),\n generateSessionId,\n }\n}\n\nfunction deleteSessionDatabase(dbManager: DatabaseManager, sessionId: string): void {\n dbManager.deleteSessionDatabaseFiles(sessionId)\n}\n\n/**\n * High-performance streaming import: parse a file and write to DB\n * with batched transactions, deferred indexes, and FTS.\n */\nexport async function streamImport(\n dbManager: DatabaseManager,\n filePath: string,\n options?: StreamImportOptions\n): Promise<StreamImportResult> {\n const { formatId, chatIndex, onProgress, sessionId } = options || {}\n\n const formatOptions: Record<string, unknown> = {}\n if (formatId) formatOptions.formatId = formatId\n if (chatIndex !== undefined) formatOptions.chatIndex = chatIndex\n\n const progressAdapter: ImportProgressCallback = onProgress\n ? (progress) => {\n let stage: StreamImportProgress['stage'] = 'parsing'\n let pct = 0\n switch (progress.stage) {\n case 'detecting':\n stage = 'detecting'\n pct = 5\n break\n case 'parsing':\n stage = 'parsing'\n pct = Math.min(Math.round(progress.percentage * 0.7), 70)\n break\n case 'saving':\n stage = 'saving'\n pct = 80\n break\n case 'indexing':\n stage = 'indexing'\n pct = 90\n break\n case 'done':\n stage = 'done'\n pct = 100\n break\n case 'error':\n stage = 'error'\n pct = 0\n break\n }\n onProgress({\n stage,\n progress: pct,\n message: progress.message || '',\n bytesRead: progress.bytesRead,\n totalBytes: progress.totalBytes,\n messagesProcessed: progress.messagesProcessed,\n })\n }\n : () => {}\n\n const deps = buildStreamImportDeps(dbManager, progressAdapter)\n const result = await streamingImport(filePath, deps, formatOptions, sessionId)\n if (!result.success || !result.sessionId) return result\n\n try {\n dbManager.raiseCurrentChatDbCompatibilityGate()\n } catch (error) {\n deleteSessionDatabase(dbManager, result.sessionId)\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n diagnostics: result.diagnostics,\n }\n }\n\n return result\n}\n\n// ==================== Incremental import ====================\n\nfunction buildIncrementalDeps(\n dbManager: DatabaseManager,\n onProgress?: ImportProgressCallback,\n onCompatibilityError?: (error: DataDirCompatibilityError) => void\n): IncrementalImportDeps {\n return {\n openDatabase(sessionId: string, readonly?: boolean) {\n try {\n return dbManager.openRawSessionDatabase(sessionId, { readonly: readonly ?? false })\n } catch (error) {\n if (error instanceof DataDirCompatibilityError) onCompatibilityError?.(error)\n throw error\n }\n },\n onProgress: onProgress ?? (() => {}),\n }\n}\n\nexport async function incrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n options?: ImportOptions & { onProgress?: ImportProgressCallback }\n): Promise<IncrementalImportResult> {\n const { onProgress, ...importOpts } = options || {}\n let compatibilityError: DataDirCompatibilityError | null = null\n const result = await sharedIncrementalImport(\n sessionId,\n filePath,\n buildIncrementalDeps(dbManager, onProgress, (error) => {\n compatibilityError = error\n }),\n importOpts\n )\n if (compatibilityError) throw compatibilityError\n if (!result.success) return result\n\n try {\n dbManager.raiseCurrentChatDbCompatibilityGate()\n } catch (error) {\n return {\n ...result,\n success: false,\n newMessageCount: 0,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n\n return result\n}\n\nexport async function analyzeIncrementalImport(\n dbManager: DatabaseManager,\n sessionId: string,\n filePath: string,\n onProgress?: ImportProgressCallback\n): Promise<IncrementalAnalyzeResult> {\n let compatibilityError: DataDirCompatibilityError | null = null\n const result = await sharedAnalyzeIncremental(\n sessionId,\n filePath,\n buildIncrementalDeps(dbManager, onProgress, (error) => {\n compatibilityError = error\n })\n )\n if (compatibilityError) throw compatibilityError\n return result\n}\n\nexport async function analyzeNewImport(\n filePath: string,\n onProgress?: ImportProgressCallback\n): Promise<AnalyzeNewImportResult> {\n return sharedAnalyzeNewImport(filePath, onProgress ?? (() => {}))\n}\n\n// ==================== Re-exports from parser ====================\n\nexport {\n parserDetectFormat as detectFormat,\n detectAllFormats,\n getFormatFeatureById,\n parserGetSupportedFormats as getSupportedFormats,\n parserScanMultiChatFile as scanMultiChatFile,\n findEntryFileInDirectory,\n}\nexport type { FormatFeature, MultiChatInfo, ParseProgress }\nexport type {\n StreamImportResult,\n IncrementalImportResult,\n IncrementalAnalyzeResult,\n AnalyzeNewImportResult,\n ImportOptions,\n}\n"],"mappings":"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","names":["incrementalImport","analyzeIncrementalImport","analyzeNewImport"]}
@@ -715,6 +715,223 @@ function openBetterSqliteDatabase(filePath, options) {
715
715
  return new BetterSqliteAdapter(db);
716
716
  }
717
717
 
718
+ // ../../packages/node-runtime/src/ai/ai-logger.ts
719
+ import * as fs10 from "fs";
720
+ import * as path10 from "path";
721
+ var AiLogger = class {
722
+ debugMode = false;
723
+ logDir;
724
+ logFile = null;
725
+ logStream = null;
726
+ constructor(logsDir) {
727
+ this.logDir = path10.join(logsDir, "ai");
728
+ }
729
+ setDebugMode(enabled) {
730
+ this.debugMode = enabled;
731
+ }
732
+ isDebugMode() {
733
+ return this.debugMode;
734
+ }
735
+ debug(category, message, data) {
736
+ this.writeLog("DEBUG", category, message, data);
737
+ }
738
+ info(category, message, data) {
739
+ this.writeLog("INFO", category, message, data);
740
+ }
741
+ warn(category, message, data) {
742
+ this.writeLog("WARN", category, message, data);
743
+ }
744
+ error(category, message, data) {
745
+ this.writeLog("ERROR", category, message, data);
746
+ }
747
+ close() {
748
+ if (this.logStream) {
749
+ this.logStream.end();
750
+ this.logStream = null;
751
+ }
752
+ }
753
+ getLogPath() {
754
+ return this.getLogFilePath();
755
+ }
756
+ getExistingLogPath() {
757
+ if (this.logFile && fs10.existsSync(this.logFile)) {
758
+ return this.logFile;
759
+ }
760
+ return null;
761
+ }
762
+ ensureLogDir() {
763
+ if (!fs10.existsSync(this.logDir)) {
764
+ fs10.mkdirSync(this.logDir, { recursive: true });
765
+ }
766
+ }
767
+ getLogFilePath() {
768
+ if (this.logFile) return this.logFile;
769
+ this.ensureLogDir();
770
+ const now = /* @__PURE__ */ new Date();
771
+ const date = now.toISOString().split("T")[0];
772
+ const hours = String(now.getHours()).padStart(2, "0");
773
+ const minutes = String(now.getMinutes()).padStart(2, "0");
774
+ this.logFile = path10.join(this.logDir, `ai_${date}_${hours}-${minutes}.log`);
775
+ return this.logFile;
776
+ }
777
+ getLogStream() {
778
+ if (this.logStream) return this.logStream;
779
+ const filePath = this.getLogFilePath();
780
+ const isNewOrEmptyFile = !fs10.existsSync(filePath) || fs10.statSync(filePath).size === 0;
781
+ this.logStream = fs10.createWriteStream(filePath, { flags: "a", encoding: "utf-8" });
782
+ if (isNewOrEmptyFile) {
783
+ this.logStream.write(`Local Path: ${filePath.replace(/ /g, "\\ ")}
784
+
785
+ `);
786
+ }
787
+ return this.logStream;
788
+ }
789
+ writeLog(level, category, message, data) {
790
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
791
+ let logLine = `[${timestamp}] [${level}] [${category}] ${message}`;
792
+ if (data !== void 0) {
793
+ try {
794
+ const dataStr = typeof data === "string" ? data : JSON.stringify(data, null, 2);
795
+ if (!this.debugMode && dataStr.length > 2e3) {
796
+ logLine += `
797
+ ${dataStr.slice(0, 2e3)}...[truncated, ${dataStr.length} chars total]`;
798
+ } else {
799
+ logLine += `
800
+ ${dataStr}`;
801
+ }
802
+ } catch {
803
+ logLine += `
804
+ [unserializable data]`;
805
+ }
806
+ }
807
+ logLine += "\n";
808
+ try {
809
+ const stream = this.getLogStream();
810
+ stream.write(logLine);
811
+ } catch (error) {
812
+ console.error("[AiLogger] Failed to write log:", error);
813
+ }
814
+ if (level === "WARN" || level === "ERROR") {
815
+ console.log(`[AI] ${message}`);
816
+ }
817
+ }
818
+ };
819
+ function extractErrorInfo(error) {
820
+ if (error instanceof Error) {
821
+ const info = {
822
+ name: error.name,
823
+ message: error.message
824
+ };
825
+ if ("cause" in error && error.cause) {
826
+ info.cause = extractErrorInfo(error.cause);
827
+ }
828
+ return info;
829
+ }
830
+ if (typeof error === "object" && error !== null) {
831
+ return { raw: JSON.stringify(error) };
832
+ }
833
+ return { message: String(error) };
834
+ }
835
+ function extractErrorStack(error, stackLines = 5) {
836
+ if (error instanceof Error && error.stack) {
837
+ const lines = error.stack.split("\n");
838
+ return lines.slice(1, stackLines + 1).join("\n");
839
+ }
840
+ return null;
841
+ }
842
+
843
+ // ../../packages/node-runtime/src/logging/app-logger.ts
844
+ import * as fs11 from "fs";
845
+ import * as path11 from "path";
846
+ var LEVEL_ORDER = { DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3 };
847
+ var MAX_SIZE_BYTES = 10 * 1024 * 1024;
848
+ var AppLogger = class {
849
+ logFile;
850
+ oldLogFile;
851
+ threshold;
852
+ constructor(logsDir) {
853
+ this.logFile = path11.join(logsDir, "app.log");
854
+ this.oldLogFile = path11.join(logsDir, "app.old.log");
855
+ this.threshold = resolveThreshold();
856
+ }
857
+ debug(scope, message, data) {
858
+ this.write("DEBUG", scope, message, data);
859
+ }
860
+ info(scope, message, data) {
861
+ this.write("INFO", scope, message, data);
862
+ }
863
+ warn(scope, message, data) {
864
+ this.write("WARN", scope, message, data);
865
+ }
866
+ /** `data` may be an Error; its name/message/stack are extracted automatically. */
867
+ error(scope, message, data) {
868
+ this.write("ERROR", scope, message, data);
869
+ }
870
+ getLogPath() {
871
+ return this.logFile;
872
+ }
873
+ write(level, scope, message, data) {
874
+ if (LEVEL_ORDER[level] < LEVEL_ORDER[this.threshold]) return;
875
+ let line = `[${(/* @__PURE__ */ new Date()).toISOString()}] [${level}] [${scope}] ${message}`;
876
+ try {
877
+ const tail = formatData(data);
878
+ if (tail) line += `
879
+ ${tail}`;
880
+ line += "\n";
881
+ ensureDir(path11.dirname(this.logFile));
882
+ this.rotateIfNeeded();
883
+ fs11.appendFileSync(this.logFile, line, "utf-8");
884
+ } catch (err) {
885
+ console.error("[AppLogger] Failed to write log:", err);
886
+ }
887
+ }
888
+ // ponytail: rename-based rotation, atomic, no rewrite, ~20MB total ceiling
889
+ rotateIfNeeded() {
890
+ let size = 0;
891
+ try {
892
+ size = fs11.statSync(this.logFile).size;
893
+ } catch {
894
+ return;
895
+ }
896
+ if (size < MAX_SIZE_BYTES) return;
897
+ fs11.renameSync(this.logFile, this.oldLogFile);
898
+ }
899
+ };
900
+ function resolveThreshold() {
901
+ const raw = (process.env.CHATLAB_LOG_LEVEL || "").toUpperCase();
902
+ if (raw === "DEBUG" || raw === "INFO" || raw === "WARN" || raw === "ERROR") return raw;
903
+ return "INFO";
904
+ }
905
+ function formatData(data) {
906
+ if (data === void 0) return "";
907
+ if (data instanceof Error) {
908
+ const info = extractErrorInfo(data);
909
+ const stack = extractErrorStack(data);
910
+ return JSON.stringify(info) + (stack ? `
911
+ ${stack}` : "");
912
+ }
913
+ if (typeof data === "string") return data;
914
+ try {
915
+ return JSON.stringify(data);
916
+ } catch {
917
+ return "[unserializable data]";
918
+ }
919
+ }
920
+ function ensureDir(dir) {
921
+ if (!fs11.existsSync(dir)) fs11.mkdirSync(dir, { recursive: true });
922
+ }
923
+ var instance = null;
924
+ function initAppLogger(logsDir) {
925
+ instance = new AppLogger(logsDir);
926
+ }
927
+ var appLogger = {
928
+ debug: (scope, message, data) => instance?.debug(scope, message, data),
929
+ info: (scope, message, data) => instance?.info(scope, message, data),
930
+ warn: (scope, message, data) => instance?.warn(scope, message, data),
931
+ error: (scope, message, data) => instance?.error(scope, message, data),
932
+ getLogPath: () => instance?.getLogPath() ?? null
933
+ };
934
+
718
935
  // ../../packages/core/src/ai/tool-catalog.ts
719
936
  var LEGACY_BUILTIN_TOOL_NAME_ALIASES = {
720
937
  get_session_messages: "get_segment_messages",
@@ -3682,8 +3899,14 @@ function notGroupSelfMemberCondition(db, memberAlias) {
3682
3899
  )`;
3683
3900
  }
3684
3901
 
3902
+ // ../../packages/core/src/query/contact-enablement.ts
3903
+ var MIN_PRIVATE_SESSIONS_FOR_CONTACTS = 5;
3904
+ var MIN_GROUP_SESSIONS_FOR_CONTACTS = 1;
3905
+ function shouldEnableContactsEntry(input) {
3906
+ return input.groupSessionCount >= MIN_GROUP_SESSIONS_FOR_CONTACTS || input.privateSessionCount >= MIN_PRIVATE_SESSIONS_FOR_CONTACTS;
3907
+ }
3908
+
3685
3909
  // ../../packages/core/src/query/contact-scoring.ts
3686
- var MIN_PRIVATE_SESSIONS_FOR_CONTACTS = 10;
3687
3910
  var FRIEND_SCORE_WEIGHTS = {
3688
3911
  privateMessage: 0.55,
3689
3912
  privateRegularity: 0.25,
@@ -7208,8 +7431,8 @@ function runMigrations(db, migrationsList, forceRepair = false) {
7208
7431
  }
7209
7432
 
7210
7433
  // ../../packages/node-runtime/src/nlp/segmenter.ts
7211
- import * as fs10 from "fs";
7212
- import * as path10 from "path";
7434
+ import * as fs12 from "fs";
7435
+ import * as path12 from "path";
7213
7436
  import { createRequire } from "module";
7214
7437
  var _nlpDir = null;
7215
7438
  var jiebaInstances = /* @__PURE__ */ new Map();
@@ -7222,14 +7445,14 @@ function getNlpDir() {
7222
7445
  }
7223
7446
  function existsDictOnDisk(dictId) {
7224
7447
  if (!_nlpDir) return false;
7225
- return fs10.existsSync(path10.join(_nlpDir, `${dictId}.dict`));
7448
+ return fs12.existsSync(path12.join(_nlpDir, `${dictId}.dict`));
7226
7449
  }
7227
7450
  function tryLoadDictFromDisk(dictId) {
7228
7451
  if (!_nlpDir) return null;
7229
- const dictPath = path10.join(_nlpDir, `${dictId}.dict`);
7230
- if (!fs10.existsSync(dictPath)) return null;
7452
+ const dictPath = path12.join(_nlpDir, `${dictId}.dict`);
7453
+ if (!fs12.existsSync(dictPath)) return null;
7231
7454
  try {
7232
- return fs10.readFileSync(dictPath);
7455
+ return fs12.readFileSync(dictPath);
7233
7456
  } catch {
7234
7457
  return null;
7235
7458
  }
@@ -7238,9 +7461,9 @@ function getJieba(dictType = "default") {
7238
7461
  const effectiveType = dictType === "default" ? "zh-CN" : dictType;
7239
7462
  const cached = jiebaInstances.get(effectiveType);
7240
7463
  if (cached) {
7241
- if (existsDictOnDisk(effectiveType)) return cached;
7464
+ if (cached.fromDiskDict === existsDictOnDisk(effectiveType)) return cached.instance;
7242
7465
  jiebaInstances.delete(effectiveType);
7243
- console.error(`[NLP] jieba cache invalidated (dict missing): ${effectiveType}`);
7466
+ console.error(`[NLP] jieba cache invalidated (dict ${cached.fromDiskDict ? "removed" : "added"}): ${effectiveType}`);
7244
7467
  }
7245
7468
  try {
7246
7469
  const { Jieba } = require2("@node-rs/jieba");
@@ -7253,7 +7476,7 @@ function getJieba(dictType = "default") {
7253
7476
  instance2 = new Jieba();
7254
7477
  console.warn(`[NLP] jieba dict missing: ${effectiveType}, fallback to built-in tokenizer`);
7255
7478
  }
7256
- jiebaInstances.set(effectiveType, instance2);
7479
+ jiebaInstances.set(effectiveType, { instance: instance2, fromDiskDict: !!diskDict });
7257
7480
  return instance2;
7258
7481
  } catch (error) {
7259
7482
  console.error(`[NLP] Failed to load jieba module (dict=${effectiveType}):`, error);
@@ -7459,223 +7682,6 @@ function tokenizeQueryForFts(keywords) {
7459
7682
  return groups.map((g) => g.includes(" ") ? `(${g})` : g).join(" OR ");
7460
7683
  }
7461
7684
 
7462
- // ../../packages/node-runtime/src/ai/ai-logger.ts
7463
- import * as fs11 from "fs";
7464
- import * as path11 from "path";
7465
- var AiLogger = class {
7466
- debugMode = false;
7467
- logDir;
7468
- logFile = null;
7469
- logStream = null;
7470
- constructor(logsDir) {
7471
- this.logDir = path11.join(logsDir, "ai");
7472
- }
7473
- setDebugMode(enabled) {
7474
- this.debugMode = enabled;
7475
- }
7476
- isDebugMode() {
7477
- return this.debugMode;
7478
- }
7479
- debug(category, message, data) {
7480
- this.writeLog("DEBUG", category, message, data);
7481
- }
7482
- info(category, message, data) {
7483
- this.writeLog("INFO", category, message, data);
7484
- }
7485
- warn(category, message, data) {
7486
- this.writeLog("WARN", category, message, data);
7487
- }
7488
- error(category, message, data) {
7489
- this.writeLog("ERROR", category, message, data);
7490
- }
7491
- close() {
7492
- if (this.logStream) {
7493
- this.logStream.end();
7494
- this.logStream = null;
7495
- }
7496
- }
7497
- getLogPath() {
7498
- return this.getLogFilePath();
7499
- }
7500
- getExistingLogPath() {
7501
- if (this.logFile && fs11.existsSync(this.logFile)) {
7502
- return this.logFile;
7503
- }
7504
- return null;
7505
- }
7506
- ensureLogDir() {
7507
- if (!fs11.existsSync(this.logDir)) {
7508
- fs11.mkdirSync(this.logDir, { recursive: true });
7509
- }
7510
- }
7511
- getLogFilePath() {
7512
- if (this.logFile) return this.logFile;
7513
- this.ensureLogDir();
7514
- const now = /* @__PURE__ */ new Date();
7515
- const date = now.toISOString().split("T")[0];
7516
- const hours = String(now.getHours()).padStart(2, "0");
7517
- const minutes = String(now.getMinutes()).padStart(2, "0");
7518
- this.logFile = path11.join(this.logDir, `ai_${date}_${hours}-${minutes}.log`);
7519
- return this.logFile;
7520
- }
7521
- getLogStream() {
7522
- if (this.logStream) return this.logStream;
7523
- const filePath = this.getLogFilePath();
7524
- const isNewOrEmptyFile = !fs11.existsSync(filePath) || fs11.statSync(filePath).size === 0;
7525
- this.logStream = fs11.createWriteStream(filePath, { flags: "a", encoding: "utf-8" });
7526
- if (isNewOrEmptyFile) {
7527
- this.logStream.write(`Local Path: ${filePath.replace(/ /g, "\\ ")}
7528
-
7529
- `);
7530
- }
7531
- return this.logStream;
7532
- }
7533
- writeLog(level, category, message, data) {
7534
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
7535
- let logLine = `[${timestamp}] [${level}] [${category}] ${message}`;
7536
- if (data !== void 0) {
7537
- try {
7538
- const dataStr = typeof data === "string" ? data : JSON.stringify(data, null, 2);
7539
- if (!this.debugMode && dataStr.length > 2e3) {
7540
- logLine += `
7541
- ${dataStr.slice(0, 2e3)}...[truncated, ${dataStr.length} chars total]`;
7542
- } else {
7543
- logLine += `
7544
- ${dataStr}`;
7545
- }
7546
- } catch {
7547
- logLine += `
7548
- [unserializable data]`;
7549
- }
7550
- }
7551
- logLine += "\n";
7552
- try {
7553
- const stream = this.getLogStream();
7554
- stream.write(logLine);
7555
- } catch (error) {
7556
- console.error("[AiLogger] Failed to write log:", error);
7557
- }
7558
- if (level === "WARN" || level === "ERROR") {
7559
- console.log(`[AI] ${message}`);
7560
- }
7561
- }
7562
- };
7563
- function extractErrorInfo(error) {
7564
- if (error instanceof Error) {
7565
- const info = {
7566
- name: error.name,
7567
- message: error.message
7568
- };
7569
- if ("cause" in error && error.cause) {
7570
- info.cause = extractErrorInfo(error.cause);
7571
- }
7572
- return info;
7573
- }
7574
- if (typeof error === "object" && error !== null) {
7575
- return { raw: JSON.stringify(error) };
7576
- }
7577
- return { message: String(error) };
7578
- }
7579
- function extractErrorStack(error, stackLines = 5) {
7580
- if (error instanceof Error && error.stack) {
7581
- const lines = error.stack.split("\n");
7582
- return lines.slice(1, stackLines + 1).join("\n");
7583
- }
7584
- return null;
7585
- }
7586
-
7587
- // ../../packages/node-runtime/src/logging/app-logger.ts
7588
- import * as fs12 from "fs";
7589
- import * as path12 from "path";
7590
- var LEVEL_ORDER = { DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3 };
7591
- var MAX_SIZE_BYTES = 10 * 1024 * 1024;
7592
- var AppLogger = class {
7593
- logFile;
7594
- oldLogFile;
7595
- threshold;
7596
- constructor(logsDir) {
7597
- this.logFile = path12.join(logsDir, "app.log");
7598
- this.oldLogFile = path12.join(logsDir, "app.old.log");
7599
- this.threshold = resolveThreshold();
7600
- }
7601
- debug(scope, message, data) {
7602
- this.write("DEBUG", scope, message, data);
7603
- }
7604
- info(scope, message, data) {
7605
- this.write("INFO", scope, message, data);
7606
- }
7607
- warn(scope, message, data) {
7608
- this.write("WARN", scope, message, data);
7609
- }
7610
- /** `data` may be an Error; its name/message/stack are extracted automatically. */
7611
- error(scope, message, data) {
7612
- this.write("ERROR", scope, message, data);
7613
- }
7614
- getLogPath() {
7615
- return this.logFile;
7616
- }
7617
- write(level, scope, message, data) {
7618
- if (LEVEL_ORDER[level] < LEVEL_ORDER[this.threshold]) return;
7619
- let line = `[${(/* @__PURE__ */ new Date()).toISOString()}] [${level}] [${scope}] ${message}`;
7620
- try {
7621
- const tail = formatData(data);
7622
- if (tail) line += `
7623
- ${tail}`;
7624
- line += "\n";
7625
- ensureDir(path12.dirname(this.logFile));
7626
- this.rotateIfNeeded();
7627
- fs12.appendFileSync(this.logFile, line, "utf-8");
7628
- } catch (err) {
7629
- console.error("[AppLogger] Failed to write log:", err);
7630
- }
7631
- }
7632
- // ponytail: rename-based rotation, atomic, no rewrite, ~20MB total ceiling
7633
- rotateIfNeeded() {
7634
- let size = 0;
7635
- try {
7636
- size = fs12.statSync(this.logFile).size;
7637
- } catch {
7638
- return;
7639
- }
7640
- if (size < MAX_SIZE_BYTES) return;
7641
- fs12.renameSync(this.logFile, this.oldLogFile);
7642
- }
7643
- };
7644
- function resolveThreshold() {
7645
- const raw = (process.env.CHATLAB_LOG_LEVEL || "").toUpperCase();
7646
- if (raw === "DEBUG" || raw === "INFO" || raw === "WARN" || raw === "ERROR") return raw;
7647
- return "INFO";
7648
- }
7649
- function formatData(data) {
7650
- if (data === void 0) return "";
7651
- if (data instanceof Error) {
7652
- const info = extractErrorInfo(data);
7653
- const stack = extractErrorStack(data);
7654
- return JSON.stringify(info) + (stack ? `
7655
- ${stack}` : "");
7656
- }
7657
- if (typeof data === "string") return data;
7658
- try {
7659
- return JSON.stringify(data);
7660
- } catch {
7661
- return "[unserializable data]";
7662
- }
7663
- }
7664
- function ensureDir(dir) {
7665
- if (!fs12.existsSync(dir)) fs12.mkdirSync(dir, { recursive: true });
7666
- }
7667
- var instance = null;
7668
- function initAppLogger(logsDir) {
7669
- instance = new AppLogger(logsDir);
7670
- }
7671
- var appLogger = {
7672
- debug: (scope, message, data) => instance?.debug(scope, message, data),
7673
- info: (scope, message, data) => instance?.info(scope, message, data),
7674
- warn: (scope, message, data) => instance?.warn(scope, message, data),
7675
- error: (scope, message, data) => instance?.error(scope, message, data),
7676
- getLogPath: () => instance?.getLogPath() ?? null
7677
- };
7678
-
7679
7685
  // ../../packages/node-runtime/src/migrations/electron-data-migration.ts
7680
7686
  import * as fs13 from "fs";
7681
7687
  import * as os3 from "os";
@@ -8809,6 +8815,13 @@ export {
8809
8815
  ALL_MIGRATIONS,
8810
8816
  BetterSqliteAdapter,
8811
8817
  openBetterSqliteDatabase,
8818
+ KNOWN_PLATFORMS,
8819
+ CONTACTS_TIME_RANGE_PRESETS,
8820
+ AiLogger,
8821
+ extractErrorInfo,
8822
+ extractErrorStack,
8823
+ initAppLogger,
8824
+ appLogger,
8812
8825
  getTimeRange,
8813
8826
  getAvailableYears,
8814
8827
  getMemberActivity,
@@ -8853,7 +8866,7 @@ export {
8853
8866
  getPrivateContactFacts,
8854
8867
  getGroupContactFacts,
8855
8868
  getGroupRelationshipGraphFacts,
8856
- MIN_PRIVATE_SESSIONS_FOR_CONTACTS,
8869
+ shouldEnableContactsEntry,
8857
8870
  computeFriendScores,
8858
8871
  computeNonFriendScores,
8859
8872
  buildExcludeKeywordsConditions,
@@ -8885,8 +8898,6 @@ export {
8885
8898
  getMemeBattleAnalysis,
8886
8899
  getNightOwlAnalysis,
8887
8900
  getRepeatAnalysis,
8888
- KNOWN_PLATFORMS,
8889
- CONTACTS_TIME_RANGE_PRESETS,
8890
8901
  messageTypeToString,
8891
8902
  isNewerStableVersion,
8892
8903
  buildChartPayload,
@@ -8927,11 +8938,6 @@ export {
8927
8938
  getPosTagDefinitions,
8928
8939
  tokenizeForFts,
8929
8940
  tokenizeQueryForFts,
8930
- AiLogger,
8931
- extractErrorInfo,
8932
- extractErrorStack,
8933
- initAppLogger,
8934
- appLogger,
8935
8941
  wasElectronUsed,
8936
8942
  verifyCliDataPath,
8937
8943
  migrateFromElectronIfNeeded,
@@ -8962,4 +8968,4 @@ export {
8962
8968
  StaticPathProvider,
8963
8969
  createDatabaseManagerAdapter
8964
8970
  };
8965
- //# sourceMappingURL=chunk-7BZLS2KW.mjs.map
8971
+ //# sourceMappingURL=chunk-LVEJHB3X.mjs.map