chatlab-cli 0.30.0 → 0.30.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chat-command-UZ23GKO7.mjs → chat-command-VBDMWOKL.mjs} +8 -8
- package/dist/{chunk-RDR6PS2R.mjs → chunk-326OCJOT.mjs} +2 -2
- package/dist/{chunk-A2SANKG4.mjs → chunk-36JGKW6K.mjs} +593 -254
- package/dist/chunk-36JGKW6K.mjs.map +1 -0
- package/dist/{chunk-ZFU2CHW3.mjs → chunk-5EE2EFPE.mjs} +4 -4
- package/dist/{chunk-4IZ3WKYU.mjs → chunk-D3DPCDII.mjs} +24 -11
- package/dist/chunk-D3DPCDII.mjs.map +1 -0
- package/dist/{chunk-FCCL5Z4W.mjs → chunk-KBSAVUFV.mjs} +7 -4
- package/dist/chunk-KBSAVUFV.mjs.map +1 -0
- package/dist/{chunk-7BZLS2KW.mjs → chunk-LVEJHB3X.mjs} +242 -236
- package/dist/chunk-LVEJHB3X.mjs.map +1 -0
- package/dist/{chunk-M55KW2HA.mjs → chunk-M2PXDX4G.mjs} +14 -12
- package/dist/chunk-M2PXDX4G.mjs.map +1 -0
- package/dist/{chunk-5UBHNQFZ.mjs → chunk-TCZHG3G7.mjs} +2 -2
- package/dist/{chunk-CNSYXRJP.mjs → chunk-TEX44HNL.mjs} +16 -12
- package/dist/chunk-TEX44HNL.mjs.map +1 -0
- package/dist/{chunk-P3ZOLTGS.mjs → chunk-ULNRUS55.mjs} +5 -3
- package/dist/chunk-ULNRUS55.mjs.map +1 -0
- package/dist/{chunk-MUPILWAZ.mjs → chunk-WV5GSRQM.mjs} +2 -2
- package/dist/cli.mjs +7 -7
- package/dist/contacts-worker.mjs +2 -2
- package/dist/{http-UWRA5FLB.mjs → http-L4AMELPZ.mjs} +11 -11
- package/dist/{import-745KQL7N.mjs → import-WWCSXGVS.mjs} +7 -7
- package/dist/index.mjs +11 -11
- package/dist/{mcp-UHN5JOHC.mjs → mcp-A4M3LT5O.mjs} +8 -8
- package/dist/people-relationships-worker.mjs +2 -2
- package/dist/semantic-index-worker.mjs +1 -1
- package/dist/{src-Y7MDRXLJ.mjs → src-MPNBTFOE.mjs} +8 -6
- package/dist/{stream-import-3JMXQD7P.mjs → stream-import-HIE7PNL4.mjs} +7 -7
- package/dist/{worker-runtime-63RYMGZI.mjs → worker-runtime-BJXO24XX.mjs} +5 -5
- package/dist-web/assets/{BufferResource-BVdJ_I5X.js → BufferResource-DPkMC1wo.js} +1 -1
- package/dist-web/assets/{CanvasRenderer-BaRuT54R.js → CanvasRenderer-DokMtSX9.js} +1 -1
- 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
- package/dist-web/assets/{Filter-B7cNFtuE.js → Filter-Bo_p3BVX.js} +1 -1
- package/dist-web/assets/{MessageExportModal-B2Qm6VVj.js → MessageExportModal-Ch0tqQix.js} +1 -1
- package/dist-web/assets/{PageHeader-PjlWy9fC.js → PageHeader-CRlmZoKw.js} +1 -1
- package/dist-web/assets/{RelationshipGalaxyCanvas-11MafciW.js → RelationshipGalaxyCanvas-W_6XfPOG.js} +3 -3
- package/dist-web/assets/{RelationshipGalaxyThreeCanvas-C1I4B8NX.js → RelationshipGalaxyThreeCanvas-bB1nCwQ_.js} +1 -1
- package/dist-web/assets/{RenderTargetSystem-Chkz1WlI.js → RenderTargetSystem-obRi6fMT.js} +1 -1
- package/dist-web/assets/{WebGLRenderer-xK19ru58.js → WebGLRenderer-xcDlnrCZ.js} +1 -1
- package/dist-web/assets/{WebGPURenderer-CL5ZaKsn.js → WebGPURenderer-DbAOiiYr.js} +1 -1
- package/dist-web/assets/{browserAll-CyyNzRD_.js → browserAll-DVRJimO8.js} +1 -1
- package/dist-web/assets/{electron-MXaTKaMu.js → electron-BSGRuxX9.js} +1 -1
- package/dist-web/assets/{fetch-D1dDiFO4.js → fetch-7UN4YW3A.js} +1 -1
- package/dist-web/assets/{fetch-DaaJwT-5.js → fetch-B2alAySK.js} +1 -1
- package/dist-web/assets/{fetch-DpnIGZSN.js → fetch-B2rVTMYY.js} +1 -1
- package/dist-web/assets/{fetch-DTwdRTXM.js → fetch-BSShKcMt.js} +1 -1
- package/dist-web/assets/{fetch-DsTgYu_X.js → fetch-BmxMf3I6.js} +1 -1
- package/dist-web/assets/{fetch-u9GTMhMF.js → fetch-CR5UDFW7.js} +1 -1
- package/dist-web/assets/{fetch-DsE-xcP2.js → fetch-ChAsglT5.js} +1 -1
- package/dist-web/assets/{fetch-hKE53UO4.js → fetch-DWEjTdcP.js} +1 -1
- package/dist-web/assets/{fetch-DDnVXGte.js → fetch-DfoxedXR.js} +1 -1
- package/dist-web/assets/{fetch-DeA0ztwT.js → fetch-t0WsRKHW.js} +1 -1
- package/dist-web/assets/{index-BcXLcFnV.css → index-B4l3rHie.css} +1 -1
- package/dist-web/assets/{index-DqtXt3wl.js → index-BVUTV9_w.js} +1 -1
- package/dist-web/assets/{index-DFCYmzGE.js → index-BmXNdMV5.js} +2 -2
- package/dist-web/assets/index-BsXljrlg.js +22 -0
- package/dist-web/assets/index-CQ5lRCHt.js +173 -0
- package/dist-web/assets/{index-Btr5H7d-.js → index-CZv0ZOID.js} +2 -2
- package/dist-web/assets/{index-DqXHRIhI.js → index-CfgDqd_z.js} +1 -1
- package/dist-web/assets/{index-BnHKyESZ.js → index-CtVR_KuP.js} +1 -1
- package/dist-web/assets/{index-Dszv-QFp.js → index-DT0Bu8mH.js} +3 -3
- package/dist-web/assets/{index-DzLrWGXu.js → index-DjcWJv4b.js} +1 -1
- package/dist-web/assets/{web-DPVWfPS-.js → web-knHSvvNj.js} +1 -1
- package/dist-web/assets/{webworkerAll-DF5QV_vN.js → webworkerAll-CMKoykfD.js} +1 -1
- package/dist-web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-4IZ3WKYU.mjs.map +0 -1
- package/dist/chunk-7BZLS2KW.mjs.map +0 -1
- package/dist/chunk-A2SANKG4.mjs.map +0 -1
- package/dist/chunk-CNSYXRJP.mjs.map +0 -1
- package/dist/chunk-FCCL5Z4W.mjs.map +0 -1
- package/dist/chunk-M55KW2HA.mjs.map +0 -1
- package/dist/chunk-P3ZOLTGS.mjs.map +0 -1
- package/dist-web/assets/index-BVkE4qis.js +0 -22
- package/dist-web/assets/index-D04LWJop.js +0 -173
- /package/dist/{chat-command-UZ23GKO7.mjs.map → chat-command-VBDMWOKL.mjs.map} +0 -0
- /package/dist/{chunk-RDR6PS2R.mjs.map → chunk-326OCJOT.mjs.map} +0 -0
- /package/dist/{chunk-ZFU2CHW3.mjs.map → chunk-5EE2EFPE.mjs.map} +0 -0
- /package/dist/{chunk-5UBHNQFZ.mjs.map → chunk-TCZHG3G7.mjs.map} +0 -0
- /package/dist/{chunk-MUPILWAZ.mjs.map → chunk-WV5GSRQM.mjs.map} +0 -0
- /package/dist/{http-UWRA5FLB.mjs.map → http-L4AMELPZ.mjs.map} +0 -0
- /package/dist/{import-745KQL7N.mjs.map → import-WWCSXGVS.mjs.map} +0 -0
- /package/dist/{mcp-UHN5JOHC.mjs.map → mcp-A4M3LT5O.mjs.map} +0 -0
- /package/dist/{src-Y7MDRXLJ.mjs.map → src-MPNBTFOE.mjs.map} +0 -0
- /package/dist/{stream-import-3JMXQD7P.mjs.map → stream-import-HIE7PNL4.mjs.map} +0 -0
- /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-
|
|
12
|
+
} from "./chunk-36JGKW6K.mjs";
|
|
13
13
|
import {
|
|
14
14
|
DataDirCompatibilityError
|
|
15
|
-
} from "./chunk-
|
|
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-
|
|
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
|
|
7212
|
-
import * as
|
|
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
|
|
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 =
|
|
7230
|
-
if (!
|
|
7452
|
+
const dictPath = path12.join(_nlpDir, `${dictId}.dict`);
|
|
7453
|
+
if (!fs12.existsSync(dictPath)) return null;
|
|
7231
7454
|
try {
|
|
7232
|
-
return
|
|
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
|
|
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
|
-
|
|
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-
|
|
8971
|
+
//# sourceMappingURL=chunk-LVEJHB3X.mjs.map
|