chatlab-cli 0.28.0 → 0.29.0
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-7WL5NMZ6.mjs → chat-command-JKG3FY5B.mjs} +8 -5
- package/dist/{chat-command-7WL5NMZ6.mjs.map → chat-command-JKG3FY5B.mjs.map} +1 -1
- package/dist/chunk-2MZ6G4AC.mjs +1339 -0
- package/dist/chunk-2MZ6G4AC.mjs.map +1 -0
- package/dist/chunk-5FGB42EQ.mjs +7 -0
- package/dist/{chunk-WGS33EWH.mjs → chunk-6FPEP2ZX.mjs} +2 -2
- package/dist/chunk-7RW4CQAO.mjs +1310 -0
- package/dist/chunk-7RW4CQAO.mjs.map +1 -0
- package/dist/{chunk-GFRG7TZQ.mjs → chunk-ARZM6HBX.mjs} +17 -15
- package/dist/{chunk-GFRG7TZQ.mjs.map → chunk-ARZM6HBX.mjs.map} +1 -1
- package/dist/{chunk-VASK54KT.mjs → chunk-CIB23U32.mjs} +2 -2
- package/dist/chunk-D4WTE7LV.mjs +526 -0
- package/dist/chunk-D4WTE7LV.mjs.map +1 -0
- package/dist/{chunk-ZSFVX6FM.mjs → chunk-I35WHWA6.mjs} +7 -21
- package/dist/chunk-I35WHWA6.mjs.map +1 -0
- package/dist/{chunk-YQ2FJGBT.mjs → chunk-KL2NGIMQ.mjs} +241 -80
- package/dist/chunk-KL2NGIMQ.mjs.map +1 -0
- package/dist/{chunk-55WR6WKW.mjs → chunk-QQK7MLCR.mjs} +10044 -8354
- package/dist/chunk-QQK7MLCR.mjs.map +1 -0
- package/dist/{chunk-XNU5X7EV.mjs → chunk-SKUG5XVD.mjs} +10 -8
- package/dist/{chunk-XNU5X7EV.mjs.map → chunk-SKUG5XVD.mjs.map} +1 -1
- package/dist/chunk-WPI6YSAR.mjs +8813 -0
- package/dist/chunk-WPI6YSAR.mjs.map +1 -0
- package/dist/cli.mjs +7 -4
- package/dist/contacts-worker.mjs +48 -0
- package/dist/contacts-worker.mjs.map +1 -0
- package/dist/{http-C2FBHNZG.mjs → http-5E7ARYFW.mjs} +12 -9
- package/dist/{import-ED6JCPSJ.mjs → import-3KG6VK6O.mjs} +8 -12
- package/dist/index.mjs +12 -9
- package/dist/{mcp-5JIBER4M.mjs → mcp-JBI4CUQT.mjs} +8 -5
- package/dist/{mcp-5JIBER4M.mjs.map → mcp-JBI4CUQT.mjs.map} +1 -1
- package/dist/people-relationships-worker.mjs +48 -0
- package/dist/people-relationships-worker.mjs.map +1 -0
- package/dist/semantic-index-worker.mjs +1 -1
- package/dist/{src-WBNM42SL.mjs → src-UTBQAOJ3.mjs} +86 -66
- package/dist/{stream-import-37U3SROO.mjs → stream-import-7HZ4IRYJ.mjs} +7 -4
- package/dist/stream-import-7HZ4IRYJ.mjs.map +1 -0
- package/dist/undici-ZSXBT7EA.mjs +18389 -0
- package/dist/undici-ZSXBT7EA.mjs.map +1 -0
- package/dist/{worker-runtime-6DGYL4TF.mjs → worker-runtime-ALS4MR2A.mjs} +13 -5
- package/dist/worker-runtime-ALS4MR2A.mjs.map +1 -0
- package/dist-web/assets/BufferResource-MsqP5sq3.js +185 -0
- package/dist-web/assets/CanvasRenderer-BKCvcc2p.js +1 -0
- package/dist-web/assets/DebugToolsPanel-D_lFIW6j.css +1 -0
- package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-HGJb0Et1.js +110 -0
- package/dist-web/assets/{EChartWordcloud-B_YisOW5.js → EChartWordcloud-Clg60FMo.js} +1 -1
- package/dist-web/assets/Filter-wRJtdXx9.js +1 -0
- package/dist-web/assets/MessageExportModal-BCrMf5Kw.js +1 -0
- package/dist-web/assets/PageHeader-Bbn87QZS.css +1 -0
- package/dist-web/assets/PageHeader-C_yw54le.js +1 -0
- package/dist-web/assets/RelationshipGalaxyCanvas-DTzJq7q7.js +244 -0
- package/dist-web/assets/RelationshipGalaxyThreeCanvas-BluPHjCR.css +1 -0
- package/dist-web/assets/RelationshipGalaxyThreeCanvas-DIE-0_iM.js +4108 -0
- package/dist-web/assets/RenderTargetSystem-BSAQFamI.js +184 -0
- package/dist-web/assets/WebGLRenderer-lfzmCZNT.js +156 -0
- package/dist-web/assets/WebGPURenderer-BnEdfdr_.js +41 -0
- package/dist-web/assets/browserAll-gRNfDyPu.js +14 -0
- package/dist-web/assets/{electron-DjminAKK.js → electron-BHaEaaZP.js} +1 -1
- package/dist-web/assets/{fetch-B_kLRm6-.js → fetch-BW3aO7PS.js} +1 -1
- package/dist-web/assets/fetch-BwF5hNuF.js +1 -0
- package/dist-web/assets/{fetch-DV8A1dGB.js → fetch-C1fI_KOX.js} +1 -1
- package/dist-web/assets/{fetch-uM3erGZm.js → fetch-CBZbgZqk.js} +1 -1
- package/dist-web/assets/{fetch-Wad5mWVH.js → fetch-CFRoSIAn.js} +1 -1
- package/dist-web/assets/fetch-CN91TIwV.js +1 -0
- package/dist-web/assets/{fetch-DOhCQ5J8.js → fetch-CQt-gb-f.js} +1 -1
- package/dist-web/assets/{fetch-Cle6QKmL.js → fetch-DPCJ-1l-.js} +1 -1
- package/dist-web/assets/{fetch-r83wdzHy.js → fetch-gMB4wuBd.js} +1 -1
- package/dist-web/assets/{fetch-srCJzcWc.js → fetch-mFlEBZyB.js} +1 -1
- package/dist-web/assets/index---rXG1hZ.css +1 -0
- package/dist-web/assets/index--6C0sK6a.css +1 -0
- package/dist-web/assets/index-B6wEGata.js +173 -0
- package/dist-web/assets/index-Bg4GGPXv.js +1 -0
- package/dist-web/assets/index-BgVbj5qX.js +12 -0
- package/dist-web/assets/index-BkoXaBV_.js +64 -0
- package/dist-web/assets/index-C56IuV5U.css +1 -0
- package/dist-web/assets/index-CLRaKwpT.js +2 -0
- package/dist-web/assets/index-Dj1BSD7O.js +1 -0
- package/dist-web/assets/index-DosG7LmJ.css +1 -0
- package/dist-web/assets/index-DveHdPfK.js +1 -0
- package/dist-web/assets/{index-BX3tqfLz.css → index-MBRD3wPd.css} +1 -1
- package/dist-web/assets/index-RoDgJcHU.js +2 -0
- package/dist-web/assets/{index-tkbEq8av.js → index-ZdCB7xcf.js} +4 -4
- package/dist-web/assets/index-aljYO5ms.js +1 -0
- package/dist-web/assets/people-page-header-Mupn-U_b.js +1 -0
- package/dist-web/assets/relationship-galaxy-viewport-Cwfa51ER.js +1 -0
- package/dist-web/assets/{vendor-echarts-CITQeskI.js → vendor-echarts-hJVnODyU.js} +2 -2
- package/dist-web/assets/{vendor-echarts-wordcloud-B1kQMklB.js → vendor-echarts-wordcloud-k5ih2Jl4.js} +1 -1
- package/dist-web/assets/{vendor-nuxt-ui-Zy8txNdC.js → vendor-nuxt-ui-Dr2T8_OZ.js} +2 -2
- package/dist-web/assets/{vendor-reka-ui-mMvma1EP.js → vendor-reka-ui-CzM4kDQ7.js} +1 -1
- package/dist-web/assets/{vendor-zrender-DFl4U2Oe.js → vendor-zrender-5DcYjSZk.js} +1 -1
- package/dist-web/assets/{web-D27K6zSX.js → web-BakeV58u.js} +1 -1
- package/dist-web/assets/webworkerAll-D_6PgURS.js +83 -0
- package/dist-web/index.html +4 -4
- package/package.json +1 -1
- package/dist/chunk-55WR6WKW.mjs.map +0 -1
- package/dist/chunk-GPF34WXV.mjs +0 -9573
- package/dist/chunk-GPF34WXV.mjs.map +0 -1
- package/dist/chunk-YQ2FJGBT.mjs.map +0 -1
- package/dist/chunk-YZDEZ6UI.mjs +0 -389
- package/dist/chunk-YZDEZ6UI.mjs.map +0 -1
- package/dist/chunk-ZSFVX6FM.mjs.map +0 -1
- package/dist/worker-runtime-6DGYL4TF.mjs.map +0 -1
- package/dist-web/assets/DebugToolsPanel-DFw6_G5V.css +0 -1
- package/dist-web/assets/DebugToolsPanel.vue_vue_type_script_setup_true_lang-CCz0Syxo.js +0 -110
- package/dist-web/assets/MessageExportModal-Dd6R-cX_.js +0 -1
- package/dist-web/assets/fetch-CURbMNJV.js +0 -1
- package/dist-web/assets/fetch-DFCYOQe5.js +0 -1
- package/dist-web/assets/index-7E5GSvR2.css +0 -1
- package/dist-web/assets/index-BCRHSc1k.js +0 -173
- package/dist-web/assets/index-BIvLzdwg.js +0 -1
- package/dist-web/assets/index-BpszRZ8V.js +0 -64
- package/dist-web/assets/index-D5UgZUpS.js +0 -12
- package/dist-web/assets/index-I3SWZjnW.css +0 -1
- package/dist-web/assets/index-hOsKRsp6.js +0 -2
- /package/dist/{http-C2FBHNZG.mjs.map → chunk-5FGB42EQ.mjs.map} +0 -0
- /package/dist/{chunk-WGS33EWH.mjs.map → chunk-6FPEP2ZX.mjs.map} +0 -0
- /package/dist/{chunk-VASK54KT.mjs.map → chunk-CIB23U32.mjs.map} +0 -0
- /package/dist/{import-ED6JCPSJ.mjs.map → http-5E7ARYFW.mjs.map} +0 -0
- /package/dist/{src-WBNM42SL.mjs.map → import-3KG6VK6O.mjs.map} +0 -0
- /package/dist/{stream-import-37U3SROO.mjs.map → src-UTBQAOJ3.mjs.map} +0 -0
package/dist/cli.mjs
CHANGED
|
@@ -6,12 +6,15 @@ const __filename = __fileURLToPath(import.meta.url);
|
|
|
6
6
|
const __dirname = __pathDirname(__filename);
|
|
7
7
|
import {
|
|
8
8
|
run
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-ARZM6HBX.mjs";
|
|
10
|
+
import "./chunk-6FPEP2ZX.mjs";
|
|
11
11
|
import "./chunk-5ADKYYNA.mjs";
|
|
12
12
|
import "./chunk-FJ35V3TE.mjs";
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-7RW4CQAO.mjs";
|
|
14
|
+
import "./chunk-QQK7MLCR.mjs";
|
|
15
|
+
import "./chunk-D4WTE7LV.mjs";
|
|
16
|
+
import "./chunk-2MZ6G4AC.mjs";
|
|
17
|
+
import "./chunk-WPI6YSAR.mjs";
|
|
15
18
|
import "./chunk-GFHSSCCR.mjs";
|
|
16
19
|
export {
|
|
17
20
|
run
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'module';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
4
|
+
const require = __createRequire(import.meta.url);
|
|
5
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = __pathDirname(__filename);
|
|
7
|
+
import {
|
|
8
|
+
computeContactsSnapshot
|
|
9
|
+
} from "./chunk-D4WTE7LV.mjs";
|
|
10
|
+
import {
|
|
11
|
+
DatabaseManager,
|
|
12
|
+
StaticPathProvider,
|
|
13
|
+
createDatabaseManagerAdapter,
|
|
14
|
+
getContactsFactsCacheDir,
|
|
15
|
+
initAppLogger
|
|
16
|
+
} from "./chunk-WPI6YSAR.mjs";
|
|
17
|
+
import "./chunk-GFHSSCCR.mjs";
|
|
18
|
+
|
|
19
|
+
// ../../packages/node-runtime/src/services/contacts/worker-entry.ts
|
|
20
|
+
import { parentPort, workerData } from "worker_threads";
|
|
21
|
+
async function main() {
|
|
22
|
+
if (!parentPort) throw new Error("contacts worker requires parentPort");
|
|
23
|
+
const options = workerData;
|
|
24
|
+
initAppLogger(options.paths.logsDir);
|
|
25
|
+
const pathProvider = new StaticPathProvider(options.paths);
|
|
26
|
+
const dbManager = new DatabaseManager(pathProvider, {
|
|
27
|
+
nativeBinding: options.nativeBinding,
|
|
28
|
+
runtime: options.runtimeIdentity,
|
|
29
|
+
allowMissingRuntimeForTests: !options.runtimeIdentity
|
|
30
|
+
});
|
|
31
|
+
const adapter = createDatabaseManagerAdapter(dbManager);
|
|
32
|
+
const onProgress = (progress) => parentPort?.postMessage({ type: "progress", progress });
|
|
33
|
+
const snapshot = computeContactsSnapshot({
|
|
34
|
+
adapter,
|
|
35
|
+
signature: options.signature,
|
|
36
|
+
timeRangePreset: options.timeRangePreset,
|
|
37
|
+
factsCacheDir: getContactsFactsCacheDir(pathProvider.getUserDataDir()),
|
|
38
|
+
onProgress
|
|
39
|
+
});
|
|
40
|
+
parentPort.postMessage({ type: "success", snapshot });
|
|
41
|
+
}
|
|
42
|
+
main().catch((error) => {
|
|
43
|
+
parentPort?.postMessage({
|
|
44
|
+
type: "error",
|
|
45
|
+
error: error instanceof Error ? error.message : String(error)
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=contacts-worker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/node-runtime/src/services/contacts/worker-entry.ts"],"sourcesContent":["import { parentPort, workerData } from 'node:worker_threads'\nimport type { ContactsTimeRangePreset } from '@openchatlab/shared-types'\nimport { DatabaseManager } from '../../database-manager'\nimport type { RuntimeIdentity } from '../../data-dir-compat'\nimport { initAppLogger } from '../../logging/app-logger'\nimport { StaticPathProvider, type StaticPathProviderSnapshot } from '../../semantic-index/static-path-provider'\nimport { createDatabaseManagerAdapter } from '../adapters'\nimport { computeContactsSnapshot, type ContactsComputeProgress } from './compute'\nimport { getContactsFactsCacheDir } from './paths'\n\ninterface ContactsWorkerStartupOptions {\n paths: StaticPathProviderSnapshot\n runtimeIdentity?: RuntimeIdentity\n nativeBinding?: string\n signature: string\n timeRangePreset?: ContactsTimeRangePreset\n}\n\nasync function main(): Promise<void> {\n if (!parentPort) throw new Error('contacts worker requires parentPort')\n const options = workerData as ContactsWorkerStartupOptions\n initAppLogger(options.paths.logsDir)\n const pathProvider = new StaticPathProvider(options.paths)\n const dbManager = new DatabaseManager(pathProvider, {\n nativeBinding: options.nativeBinding,\n runtime: options.runtimeIdentity,\n allowMissingRuntimeForTests: !options.runtimeIdentity,\n })\n const adapter = createDatabaseManagerAdapter(dbManager)\n const onProgress = (progress: ContactsComputeProgress) => parentPort?.postMessage({ type: 'progress', progress })\n const snapshot = computeContactsSnapshot({\n adapter,\n signature: options.signature,\n timeRangePreset: options.timeRangePreset,\n factsCacheDir: getContactsFactsCacheDir(pathProvider.getUserDataDir()),\n onProgress,\n })\n parentPort.postMessage({ type: 'success', snapshot })\n}\n\nmain().catch((error) => {\n parentPort?.postMessage({\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n })\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAkBvC,eAAe,OAAsB;AACnC,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,qCAAqC;AACtE,QAAM,UAAU;AAChB,gBAAc,QAAQ,MAAM,OAAO;AACnC,QAAM,eAAe,IAAI,mBAAmB,QAAQ,KAAK;AACzD,QAAM,YAAY,IAAI,gBAAgB,cAAc;AAAA,IAClD,eAAe,QAAQ;AAAA,IACvB,SAAS,QAAQ;AAAA,IACjB,6BAA6B,CAAC,QAAQ;AAAA,EACxC,CAAC;AACD,QAAM,UAAU,6BAA6B,SAAS;AACtD,QAAM,aAAa,CAAC,aAAsC,YAAY,YAAY,EAAE,MAAM,YAAY,SAAS,CAAC;AAChH,QAAM,WAAW,wBAAwB;AAAA,IACvC;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,eAAe,yBAAyB,aAAa,eAAe,CAAC;AAAA,IACrE;AAAA,EACF,CAAC;AACD,aAAW,YAAY,EAAE,MAAM,WAAW,SAAS,CAAC;AACtD;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAC9D,CAAC;AACH,CAAC;","names":[]}
|
|
@@ -9,16 +9,19 @@ import {
|
|
|
9
9
|
registerWebRoutes,
|
|
10
10
|
startHttpServer,
|
|
11
11
|
stopHttpServer
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-KL2NGIMQ.mjs";
|
|
13
|
+
import "./chunk-5FGB42EQ.mjs";
|
|
14
|
+
import "./chunk-I35WHWA6.mjs";
|
|
15
|
+
import "./chunk-SKUG5XVD.mjs";
|
|
16
|
+
import "./chunk-CIB23U32.mjs";
|
|
17
|
+
import "./chunk-6FPEP2ZX.mjs";
|
|
16
18
|
import "./chunk-5ADKYYNA.mjs";
|
|
17
19
|
import "./chunk-FJ35V3TE.mjs";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-7RW4CQAO.mjs";
|
|
21
|
+
import "./chunk-QQK7MLCR.mjs";
|
|
22
|
+
import "./chunk-D4WTE7LV.mjs";
|
|
23
|
+
import "./chunk-2MZ6G4AC.mjs";
|
|
24
|
+
import "./chunk-WPI6YSAR.mjs";
|
|
22
25
|
import "./chunk-GFHSSCCR.mjs";
|
|
23
26
|
export {
|
|
24
27
|
createServer,
|
|
@@ -26,4 +29,4 @@ export {
|
|
|
26
29
|
startHttpServer,
|
|
27
30
|
stopHttpServer
|
|
28
31
|
};
|
|
29
|
-
//# sourceMappingURL=http-
|
|
32
|
+
//# sourceMappingURL=http-5E7ARYFW.mjs.map
|
|
@@ -4,17 +4,14 @@ 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
|
-
import
|
|
8
|
-
detectFormat as detectFormat2,
|
|
9
|
-
importData,
|
|
10
|
-
parseFile
|
|
11
|
-
} from "./chunk-YZDEZ6UI.mjs";
|
|
7
|
+
import "./chunk-5FGB42EQ.mjs";
|
|
12
8
|
import {
|
|
13
9
|
analyzeIncrementalImport,
|
|
14
10
|
analyzeNewImport,
|
|
15
11
|
incrementalImport,
|
|
16
12
|
streamImport
|
|
17
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-I35WHWA6.mjs";
|
|
14
|
+
import "./chunk-7RW4CQAO.mjs";
|
|
18
15
|
import {
|
|
19
16
|
detectAllFormats,
|
|
20
17
|
detectFormat,
|
|
@@ -22,22 +19,21 @@ import {
|
|
|
22
19
|
getFormatFeatureById,
|
|
23
20
|
getSupportedFormats,
|
|
24
21
|
scanMultiChatFile
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-QQK7MLCR.mjs";
|
|
23
|
+
import "./chunk-D4WTE7LV.mjs";
|
|
24
|
+
import "./chunk-2MZ6G4AC.mjs";
|
|
25
|
+
import "./chunk-WPI6YSAR.mjs";
|
|
27
26
|
import "./chunk-GFHSSCCR.mjs";
|
|
28
27
|
export {
|
|
29
28
|
analyzeIncrementalImport,
|
|
30
29
|
analyzeNewImport,
|
|
31
30
|
detectAllFormats,
|
|
32
|
-
detectFormat2 as detectChatLabFormat,
|
|
33
31
|
detectFormat,
|
|
34
32
|
findEntryFileInDirectory,
|
|
35
33
|
getFormatFeatureById,
|
|
36
34
|
getSupportedFormats,
|
|
37
|
-
importData,
|
|
38
35
|
incrementalImport,
|
|
39
|
-
parseFile,
|
|
40
36
|
scanMultiChatFile,
|
|
41
37
|
streamImport
|
|
42
38
|
};
|
|
43
|
-
//# sourceMappingURL=import-
|
|
39
|
+
//# sourceMappingURL=import-3KG6VK6O.mjs.map
|
package/dist/index.mjs
CHANGED
|
@@ -7,19 +7,22 @@ const __dirname = __pathDirname(__filename);
|
|
|
7
7
|
import {
|
|
8
8
|
startHttpServer,
|
|
9
9
|
stopHttpServer
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-KL2NGIMQ.mjs";
|
|
11
|
+
import "./chunk-5FGB42EQ.mjs";
|
|
12
|
+
import "./chunk-I35WHWA6.mjs";
|
|
13
|
+
import "./chunk-SKUG5XVD.mjs";
|
|
14
|
+
import "./chunk-CIB23U32.mjs";
|
|
13
15
|
import {
|
|
14
16
|
run
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-ARZM6HBX.mjs";
|
|
18
|
+
import "./chunk-6FPEP2ZX.mjs";
|
|
17
19
|
import "./chunk-5ADKYYNA.mjs";
|
|
18
20
|
import "./chunk-FJ35V3TE.mjs";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-7RW4CQAO.mjs";
|
|
22
|
+
import "./chunk-QQK7MLCR.mjs";
|
|
23
|
+
import "./chunk-D4WTE7LV.mjs";
|
|
24
|
+
import "./chunk-2MZ6G4AC.mjs";
|
|
25
|
+
import "./chunk-WPI6YSAR.mjs";
|
|
23
26
|
import "./chunk-GFHSSCCR.mjs";
|
|
24
27
|
export {
|
|
25
28
|
run,
|
|
@@ -7,10 +7,10 @@ const __dirname = __pathDirname(__filename);
|
|
|
7
7
|
import {
|
|
8
8
|
CoreDataProvider,
|
|
9
9
|
MCP_TOOL_REGISTRY
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CIB23U32.mjs";
|
|
11
11
|
import {
|
|
12
12
|
assertCliDataDirCompatible
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6FPEP2ZX.mjs";
|
|
14
14
|
import {
|
|
15
15
|
getVersion
|
|
16
16
|
} from "./chunk-5ADKYYNA.mjs";
|
|
@@ -20,7 +20,10 @@ import {
|
|
|
20
20
|
import {
|
|
21
21
|
NodePathProvider,
|
|
22
22
|
hasPendingElectronDataWarning
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-7RW4CQAO.mjs";
|
|
24
|
+
import "./chunk-QQK7MLCR.mjs";
|
|
25
|
+
import "./chunk-D4WTE7LV.mjs";
|
|
26
|
+
import "./chunk-2MZ6G4AC.mjs";
|
|
24
27
|
import {
|
|
25
28
|
DatabaseManager,
|
|
26
29
|
getDatabaseSchema,
|
|
@@ -28,7 +31,7 @@ import {
|
|
|
28
31
|
getSessionOverview,
|
|
29
32
|
loadConfig,
|
|
30
33
|
verifyCliDataPath
|
|
31
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-WPI6YSAR.mjs";
|
|
32
35
|
import "./chunk-GFHSSCCR.mjs";
|
|
33
36
|
|
|
34
37
|
// src/mcp.ts
|
|
@@ -412,4 +415,4 @@ export {
|
|
|
412
415
|
initMcpRuntime,
|
|
413
416
|
startCliMcpServer
|
|
414
417
|
};
|
|
415
|
-
//# sourceMappingURL=mcp-
|
|
418
|
+
//# sourceMappingURL=mcp-JBI4CUQT.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp.ts","../../../packages/mcp-server/src/server.ts","../../../packages/mcp-server/src/schema.ts","../../../packages/mcp-server/src/format.ts"],"sourcesContent":["/**\n * CLI MCP Server entry point\n *\n * Thin wrapper: initializes Node.js runtime, then delegates to chatlab-mcp.\n */\n\nimport fs from 'fs'\nimport { loadConfig } from '@openchatlab/config'\nimport {\n NodePathProvider,\n DatabaseManager,\n hasPendingElectronDataWarning,\n verifyCliDataPath,\n} from '@openchatlab/node-runtime'\nimport { startMcpServer } from 'chatlab-mcp'\nimport { getVersion } from './version'\nimport { resolveCliPath } from './paths'\nimport { assertCliDataDirCompatible } from './runtime-compat'\n\nfunction resolveNativeBinding(): string | undefined {\n if (process.versions.electron) return undefined\n const nativePath = resolveCliPath('native/better_sqlite3.node')\n if (fs.existsSync(nativePath)) return nativePath\n return undefined\n}\n\nexport function initMcpRuntime(): DatabaseManager {\n const config = loadConfig()\n const userDataDir = config.data.user_data_dir || undefined\n const pathProvider = new NodePathProvider(userDataDir)\n pathProvider.ensureAllDirs()\n const runtime = assertCliDataDirCompatible(pathProvider, 'mcp')\n\n if (hasPendingElectronDataWarning() || !verifyCliDataPath(pathProvider.getDatabaseDir())) {\n console.error('[MCP] Electron desktop data detected but databases not found.')\n console.error('[MCP] Set CHATLAB_DATA_DIR or edit ~/.chatlab/config.toml to point to your data directory.')\n process.exit(1)\n }\n\n const nativeBinding = resolveNativeBinding()\n return new DatabaseManager(pathProvider, { nativeBinding, runtime })\n}\n\nexport async function startCliMcpServer(): Promise<void> {\n const dbManager = initMcpRuntime()\n await startMcpServer({ version: getVersion(), dbManager })\n}\n","/**\n * ChatLab MCP Server core\n *\n * Registers @openchatlab/tools as MCP tools and exposes session data as MCP resources.\n * Communicates with AI agents (ClaudeCode, Cursor, etc.) via stdio transport.\n */\n\nimport { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { getSessionMeta, getSessionOverview, getDatabaseSchema } from '@openchatlab/core'\nimport { MCP_TOOL_REGISTRY, CoreDataProvider } from '@openchatlab/tools'\nimport type { SessionListContext } from '@openchatlab/tools/src/definitions/sessions'\nimport type { McpDatabaseManager, McpServerOptions } from './types'\nimport { jsonSchemaToZod } from './schema'\nimport { formatToolResultAsText } from './format'\n\nconst MCP_TOOL_PREFIX = 'chatlab_'\n\nconst FORMAT_PARAM = z.enum(['text', 'json']).optional().describe('text (default) or json')\n\n/** Tools where JSON is a better default (raw SQL results, schema) */\nconst JSON_DEFAULT_TOOLS = new Set(['execute_sql', 'get_schema'])\n\nfunction applyFormat(content: string, format: string | undefined, toolName: string): string {\n const effectiveFormat = format ?? (JSON_DEFAULT_TOOLS.has(toolName) ? 'json' : 'text')\n if (effectiveFormat === 'json') return content\n\n const textResult = formatToolResultAsText(content)\n return textResult ?? content\n}\n\nfunction registerTools(server: McpServer, dbManager: McpDatabaseManager): void {\n for (const tool of MCP_TOOL_REGISTRY) {\n const mcpName = `${MCP_TOOL_PREFIX}${tool.name}`\n\n if (tool.name === 'list_sessions') {\n const zodShape = {\n ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),\n format: FORMAT_PARAM,\n }\n\n server.tool(mcpName, tool.description, zodShape, async (params) => {\n const format = params.format as string | undefined\n const context: SessionListContext = {\n db: null as any,\n sessionId: '',\n listSessionIds: () => dbManager.listSessionIds(),\n openDb: (id) => dbManager.open(id),\n }\n const toolParams = { ...params } as Record<string, unknown>\n delete toolParams.format\n const result = await tool.handler(toolParams, context)\n const text = applyFormat(result.content, format, tool.name)\n return { content: [{ type: 'text' as const, text }] }\n })\n continue\n }\n\n const zodShape = {\n session_id: z.string().describe('Session ID'),\n ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),\n format: FORMAT_PARAM,\n }\n\n server.tool(mcpName, tool.description, zodShape, async (params) => {\n const sessionId = params.session_id as string\n const format = params.format as string | undefined\n const db = dbManager.open(sessionId)\n if (!db) {\n return {\n content: [{ type: 'text' as const, text: `Session not found: ${sessionId}` }],\n isError: true,\n }\n }\n\n const toolParams = { ...params } as Record<string, unknown>\n delete toolParams.session_id\n delete toolParams.format\n\n const result = await tool.handler(toolParams, { db, sessionId, dataProvider: new CoreDataProvider(db) })\n const text = applyFormat(result.content, format, tool.name)\n return { content: [{ type: 'text' as const, text }] }\n })\n }\n}\n\nfunction registerResources(server: McpServer, dbManager: McpDatabaseManager): void {\n server.resource('sessions-list', 'chatlab://sessions', { description: '所有已导入的聊天会话列表' }, async () => {\n const sessionIds = dbManager.listSessionIds()\n const sessions = sessionIds\n .map((id) => {\n const db = dbManager.open(id)\n if (!db) return null\n const meta = getSessionMeta(db)\n if (!meta) return null\n return { id, name: meta.name, platform: meta.platform, type: meta.type }\n })\n .filter(Boolean)\n\n return {\n contents: [\n {\n uri: 'chatlab://sessions',\n text: JSON.stringify(sessions, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n })\n\n server.resource(\n 'session-meta',\n new ResourceTemplate('chatlab://sessions/{sessionId}/meta', { list: undefined }),\n { description: '会话元信息(名称、平台、消息数等)' },\n async (uri, params) => {\n const sessionId = params.sessionId as string\n const db = dbManager.open(sessionId)\n if (!db) {\n return { contents: [{ uri: uri.href, text: '{\"error\": \"Session not found\"}', mimeType: 'application/json' }] }\n }\n\n const meta = getSessionMeta(db)\n const overview = getSessionOverview(db)\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify({ ...meta, ...overview }, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n }\n )\n\n server.resource(\n 'session-schema',\n new ResourceTemplate('chatlab://sessions/{sessionId}/schema', { list: undefined }),\n { description: '会话数据库的表结构' },\n async (uri, params) => {\n const sessionId = params.sessionId as string\n const db = dbManager.open(sessionId)\n if (!db) {\n return { contents: [{ uri: uri.href, text: '{\"error\": \"Session not found\"}', mimeType: 'application/json' }] }\n }\n\n const schema = getDatabaseSchema(db)\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(schema, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n }\n )\n}\n\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\n const { version, name = 'chatlab', dbManager } = options\n\n const server = new McpServer({ name, version })\n\n registerTools(server, dbManager)\n registerResources(server, dbManager)\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n","/**\n * JSON Schema → Zod conversion for MCP tool registration\n */\n\nimport { z } from 'zod'\n\n/**\n * Convert simple JSON Schema properties to a Zod shape object.\n * Supports string / number / boolean / enum types.\n */\nexport function jsonSchemaToZod(\n properties: Record<string, { type: string; description?: string; default?: unknown; enum?: unknown[] }>,\n required?: string[]\n): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {}\n const requiredSet = new Set(required ?? [])\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodTypeAny\n\n switch (prop.type) {\n case 'number':\n zodType = z.number().describe(prop.description ?? '')\n break\n case 'boolean':\n zodType = z.boolean().describe(prop.description ?? '')\n break\n case 'string':\n default:\n if (prop.enum) {\n zodType = z.enum(prop.enum as [string, ...string[]]).describe(prop.description ?? '')\n } else {\n zodType = z.string().describe(prop.description ?? '')\n }\n break\n }\n\n if (!requiredSet.has(key)) {\n zodType = zodType.optional()\n }\n\n shape[key] = zodType\n }\n\n return shape\n}\n","/**\n * MCP output formatting for token-efficient LLM consumption\n *\n * Provides message filtering, merging, truncation, and compact text output.\n * Inspired by community chatlab-mcp-server's format.ts.\n */\n\nconst MAX_CONTENT_LENGTH = 200\nconst MAX_MERGED_CONTENT_LENGTH = 400\n\nconst PLACEHOLDER_CONTENTS = new Set([\n '[图片]',\n '[语音]',\n '[视频]',\n '[文件]',\n '[表情]',\n '[动画表情]',\n '[位置]',\n '[名片]',\n '[红包]',\n '[转账]',\n '[撤回消息]',\n '[分享]',\n '[image]',\n '[voice]',\n '[video]',\n '[file]',\n '[sticker]',\n '[animated sticker]',\n '[location]',\n '[contact]',\n '[red packet]',\n '[transfer]',\n '[recalled message]',\n '[photo]',\n '[audio]',\n '[gif]',\n '[share]',\n])\n\nconst MEANINGLESS_SHORT_EN = new Set([\n 'ok',\n 'k',\n 'yes',\n 'no',\n 'ya',\n 'yep',\n 'nope',\n 'lol',\n 'haha',\n 'hehe',\n 'hmm',\n 'ah',\n 'oh',\n 'wow',\n 'thx',\n 'ty',\n 'np',\n 'gg',\n 'brb',\n 'idk',\n])\n\nconst MEANINGFUL_SHORT_ZH = new Set(['好的', '不是', '是的', '可以', '不行', '好吧', '明白', '知道', '同意'])\n\nconst SYSTEM_PATTERNS_ZH = [/^.*邀请.*加入了群聊$/, /^.*退出了群聊$/, /^.*撤回了一条消息$/, /^你撤回了一条消息$/]\n\nconst SYSTEM_PATTERNS_EN = [\n /^.*invited.*to the group$/i,\n /^.*left the group$/i,\n /^.*recalled a message$/i,\n /^.*joined the group$/i,\n /^.*has been removed$/i,\n]\n\nconst EMOJI_ONLY = /^[\\p{Emoji}\\s[\\]()()]+$/u\n\ninterface FormattableMessage {\n senderName: string\n content: string | null\n timestamp: number\n}\n\n/**\n * Check if message content is meaningful (not noise).\n */\nexport function isValidMessage(content: string): boolean {\n const trimmed = content.trim()\n if (!trimmed) return false\n\n if (trimmed.length <= 2 && !MEANINGFUL_SHORT_ZH.has(trimmed)) return false\n if (MEANINGLESS_SHORT_EN.has(trimmed.toLowerCase())) return false\n if (EMOJI_ONLY.test(trimmed)) return false\n if (PLACEHOLDER_CONTENTS.has(trimmed.toLowerCase())) return false\n if (SYSTEM_PATTERNS_ZH.some((p) => p.test(trimmed))) return false\n if (SYSTEM_PATTERNS_EN.some((p) => p.test(trimmed))) return false\n\n return true\n}\n\nfunction truncate(text: string, maxLen: number): string {\n return text.length <= maxLen ? text : text.slice(0, maxLen) + '...'\n}\n\nfunction formatTimestamp(ts: number): string {\n const d = new Date(ts * 1000)\n const M = d.getMonth() + 1\n const D = d.getDate()\n const h = String(d.getHours()).padStart(2, '0')\n const m = String(d.getMinutes()).padStart(2, '0')\n return `${M}/${D} ${h}:${m}`\n}\n\n/**\n * Format messages as compact plain text with consecutive-sender merging.\n * Filters out noise messages, merges same-sender runs, truncates long content.\n */\nexport function formatMessagesCompact(messages: FormattableMessage[]): string {\n if (messages.length === 0) return ''\n\n const valid = messages.filter((m) => m.content && isValidMessage(m.content))\n if (valid.length === 0) return ''\n\n const lines: string[] = []\n let prevSender = ''\n let pendingContents: string[] = []\n let pendingTs = 0\n\n const flush = () => {\n if (pendingContents.length === 0) return\n const combined = pendingContents.join('; ')\n const maxLen = pendingContents.length > 1 ? MAX_MERGED_CONTENT_LENGTH : MAX_CONTENT_LENGTH\n lines.push(`${formatTimestamp(pendingTs)} ${prevSender}: ${truncate(combined, maxLen)}`)\n }\n\n for (const msg of valid) {\n const content = msg.content!.trim()\n if (msg.senderName === prevSender) {\n pendingContents.push(content)\n } else {\n flush()\n prevSender = msg.senderName\n pendingContents = [content]\n pendingTs = msg.timestamp\n }\n }\n flush()\n\n return lines.join('\\n')\n}\n\n/**\n * Try to parse a tool result's JSON content and convert to compact text.\n * Returns null if the content is not suitable for text formatting.\n */\nexport function formatToolResultAsText(content: string): string | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(content)\n } catch {\n return null\n }\n\n if (!parsed || typeof parsed !== 'object') return null\n const obj = parsed as Record<string, unknown>\n\n // If there's a messages array with senderName/content/timestamp, format it\n if (Array.isArray(obj.messages) && obj.messages.length > 0) {\n const msgs = obj.messages as FormattableMessage[]\n if (msgs[0] && 'senderName' in msgs[0] && 'timestamp' in msgs[0]) {\n return formatObjectWithMessages(obj, msgs)\n }\n }\n\n // If there are ranking/keywords arrays, format as numbered list\n if (Array.isArray(obj.ranking) || Array.isArray(obj.keywords)) {\n return formatArrayResult(obj)\n }\n\n // If there are sessions, format them compactly\n if (Array.isArray(obj.sessions)) {\n return formatSessionsList(obj)\n }\n\n return null\n}\n\nfunction formatObjectWithMessages(obj: Record<string, unknown>, msgs: FormattableMessage[]): string {\n const lines: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'messages') continue\n if (value === undefined || value === null) continue\n if (typeof value === 'object' && !Array.isArray(value)) continue\n if (Array.isArray(value)) continue\n lines.push(`${key}: ${value}`)\n }\n\n const formatted = formatMessagesCompact(msgs)\n if (formatted) {\n if (lines.length > 0) lines.push('')\n lines.push(formatted)\n }\n\n return lines.join('\\n')\n}\n\nfunction formatArrayResult(obj: Record<string, unknown>): string {\n const lines: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'string') {\n if (lines.length > 0) lines.push('')\n lines.push(...value)\n } else if (!Array.isArray(value) && value !== undefined && value !== null) {\n lines.push(`${key}: ${value}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatSessionsList(obj: Record<string, unknown>): string {\n const sessions = obj.sessions as Array<Record<string, unknown>>\n const total = obj.total ?? sessions.length\n const lines: string[] = [`${total} sessions:`]\n\n for (const s of sessions) {\n const name = s.name ?? s.id\n const platform = s.platform ? ` (${s.platform})` : ''\n const msgCount = s.totalMessages ?? s.messageCount ?? ''\n const members = s.totalMembers ?? s.memberCount ?? ''\n const stats = msgCount ? ` — ${msgCount} msgs, ${members} members` : ''\n lines.push(`- ${name}${platform}${stats} [${s.id}]`)\n }\n\n return lines.join('\\n')\n}\n"],"mappings":"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","names":["z","z","zodShape"]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp.ts","../../../packages/mcp-server/src/server.ts","../../../packages/mcp-server/src/schema.ts","../../../packages/mcp-server/src/format.ts"],"sourcesContent":["/**\n * CLI MCP Server entry point\n *\n * Thin wrapper: initializes Node.js runtime, then delegates to chatlab-mcp.\n */\n\nimport fs from 'fs'\nimport { loadConfig } from '@openchatlab/config'\nimport {\n NodePathProvider,\n DatabaseManager,\n hasPendingElectronDataWarning,\n verifyCliDataPath,\n} from '@openchatlab/node-runtime'\nimport { startMcpServer } from 'chatlab-mcp'\nimport { getVersion } from './version'\nimport { resolveCliPath } from './paths'\nimport { assertCliDataDirCompatible } from './runtime-compat'\n\nfunction resolveNativeBinding(): string | undefined {\n if (process.versions.electron) return undefined\n const nativePath = resolveCliPath('native/better_sqlite3.node')\n if (fs.existsSync(nativePath)) return nativePath\n return undefined\n}\n\nexport function initMcpRuntime(): DatabaseManager {\n const config = loadConfig()\n const userDataDir = config.data.user_data_dir || undefined\n const pathProvider = new NodePathProvider(userDataDir)\n pathProvider.ensureAllDirs()\n const runtime = assertCliDataDirCompatible(pathProvider, 'mcp')\n\n if (hasPendingElectronDataWarning() || !verifyCliDataPath(pathProvider.getDatabaseDir())) {\n console.error('[MCP] Electron desktop data detected but databases not found.')\n console.error('[MCP] Set CHATLAB_DATA_DIR or edit ~/.chatlab/config.toml to point to your data directory.')\n process.exit(1)\n }\n\n const nativeBinding = resolveNativeBinding()\n return new DatabaseManager(pathProvider, { nativeBinding, runtime })\n}\n\nexport async function startCliMcpServer(): Promise<void> {\n const dbManager = initMcpRuntime()\n await startMcpServer({ version: getVersion(), dbManager })\n}\n","/**\n * ChatLab MCP Server core\n *\n * Registers @openchatlab/tools as MCP tools and exposes session data as MCP resources.\n * Communicates with AI agents (ClaudeCode, Cursor, etc.) via stdio transport.\n */\n\nimport { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { z } from 'zod'\nimport { getSessionMeta, getSessionOverview, getDatabaseSchema } from '@openchatlab/core'\nimport { MCP_TOOL_REGISTRY, CoreDataProvider } from '@openchatlab/tools'\nimport type { SessionListContext } from '@openchatlab/tools/src/definitions/sessions'\nimport type { McpDatabaseManager, McpServerOptions } from './types'\nimport { jsonSchemaToZod } from './schema'\nimport { formatToolResultAsText } from './format'\n\nconst MCP_TOOL_PREFIX = 'chatlab_'\n\nconst FORMAT_PARAM = z.enum(['text', 'json']).optional().describe('text (default) or json')\n\n/** Tools where JSON is a better default (raw SQL results, schema) */\nconst JSON_DEFAULT_TOOLS = new Set(['execute_sql', 'get_schema'])\n\nfunction applyFormat(content: string, format: string | undefined, toolName: string): string {\n const effectiveFormat = format ?? (JSON_DEFAULT_TOOLS.has(toolName) ? 'json' : 'text')\n if (effectiveFormat === 'json') return content\n\n const textResult = formatToolResultAsText(content)\n return textResult ?? content\n}\n\nfunction registerTools(server: McpServer, dbManager: McpDatabaseManager): void {\n for (const tool of MCP_TOOL_REGISTRY) {\n const mcpName = `${MCP_TOOL_PREFIX}${tool.name}`\n\n if (tool.name === 'list_sessions') {\n const zodShape = {\n ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),\n format: FORMAT_PARAM,\n }\n\n server.tool(mcpName, tool.description, zodShape, async (params) => {\n const format = params.format as string | undefined\n const context: SessionListContext = {\n db: null as any,\n sessionId: '',\n listSessionIds: () => dbManager.listSessionIds(),\n openDb: (id) => dbManager.open(id),\n }\n const toolParams = { ...params } as Record<string, unknown>\n delete toolParams.format\n const result = await tool.handler(toolParams, context)\n const text = applyFormat(result.content, format, tool.name)\n return { content: [{ type: 'text' as const, text }] }\n })\n continue\n }\n\n const zodShape = {\n session_id: z.string().describe('Session ID'),\n ...jsonSchemaToZod(tool.inputSchema.properties, tool.inputSchema.required),\n format: FORMAT_PARAM,\n }\n\n server.tool(mcpName, tool.description, zodShape, async (params) => {\n const sessionId = params.session_id as string\n const format = params.format as string | undefined\n const db = dbManager.open(sessionId)\n if (!db) {\n return {\n content: [{ type: 'text' as const, text: `Session not found: ${sessionId}` }],\n isError: true,\n }\n }\n\n const toolParams = { ...params } as Record<string, unknown>\n delete toolParams.session_id\n delete toolParams.format\n\n const result = await tool.handler(toolParams, { db, sessionId, dataProvider: new CoreDataProvider(db) })\n const text = applyFormat(result.content, format, tool.name)\n return { content: [{ type: 'text' as const, text }] }\n })\n }\n}\n\nfunction registerResources(server: McpServer, dbManager: McpDatabaseManager): void {\n server.resource('sessions-list', 'chatlab://sessions', { description: '所有已导入的聊天会话列表' }, async () => {\n const sessionIds = dbManager.listSessionIds()\n const sessions = sessionIds\n .map((id) => {\n const db = dbManager.open(id)\n if (!db) return null\n const meta = getSessionMeta(db)\n if (!meta) return null\n return { id, name: meta.name, platform: meta.platform, type: meta.type }\n })\n .filter(Boolean)\n\n return {\n contents: [\n {\n uri: 'chatlab://sessions',\n text: JSON.stringify(sessions, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n })\n\n server.resource(\n 'session-meta',\n new ResourceTemplate('chatlab://sessions/{sessionId}/meta', { list: undefined }),\n { description: '会话元信息(名称、平台、消息数等)' },\n async (uri, params) => {\n const sessionId = params.sessionId as string\n const db = dbManager.open(sessionId)\n if (!db) {\n return { contents: [{ uri: uri.href, text: '{\"error\": \"Session not found\"}', mimeType: 'application/json' }] }\n }\n\n const meta = getSessionMeta(db)\n const overview = getSessionOverview(db)\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify({ ...meta, ...overview }, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n }\n )\n\n server.resource(\n 'session-schema',\n new ResourceTemplate('chatlab://sessions/{sessionId}/schema', { list: undefined }),\n { description: '会话数据库的表结构' },\n async (uri, params) => {\n const sessionId = params.sessionId as string\n const db = dbManager.open(sessionId)\n if (!db) {\n return { contents: [{ uri: uri.href, text: '{\"error\": \"Session not found\"}', mimeType: 'application/json' }] }\n }\n\n const schema = getDatabaseSchema(db)\n\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(schema, null, 2),\n mimeType: 'application/json',\n },\n ],\n }\n }\n )\n}\n\nexport async function startMcpServer(options: McpServerOptions): Promise<void> {\n const { version, name = 'chatlab', dbManager } = options\n\n const server = new McpServer({ name, version })\n\n registerTools(server, dbManager)\n registerResources(server, dbManager)\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n","/**\n * JSON Schema → Zod conversion for MCP tool registration\n */\n\nimport { z } from 'zod'\n\n/**\n * Convert simple JSON Schema properties to a Zod shape object.\n * Supports string / number / boolean / enum types.\n */\nexport function jsonSchemaToZod(\n properties: Record<string, { type: string; description?: string; default?: unknown; enum?: unknown[] }>,\n required?: string[]\n): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {}\n const requiredSet = new Set(required ?? [])\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodTypeAny\n\n switch (prop.type) {\n case 'number':\n zodType = z.number().describe(prop.description ?? '')\n break\n case 'boolean':\n zodType = z.boolean().describe(prop.description ?? '')\n break\n case 'string':\n default:\n if (prop.enum) {\n zodType = z.enum(prop.enum as [string, ...string[]]).describe(prop.description ?? '')\n } else {\n zodType = z.string().describe(prop.description ?? '')\n }\n break\n }\n\n if (!requiredSet.has(key)) {\n zodType = zodType.optional()\n }\n\n shape[key] = zodType\n }\n\n return shape\n}\n","/**\n * MCP output formatting for token-efficient LLM consumption\n *\n * Provides message filtering, merging, truncation, and compact text output.\n * Inspired by community chatlab-mcp-server's format.ts.\n */\n\nconst MAX_CONTENT_LENGTH = 200\nconst MAX_MERGED_CONTENT_LENGTH = 400\n\nconst PLACEHOLDER_CONTENTS = new Set([\n '[图片]',\n '[语音]',\n '[视频]',\n '[文件]',\n '[表情]',\n '[动画表情]',\n '[位置]',\n '[名片]',\n '[红包]',\n '[转账]',\n '[撤回消息]',\n '[分享]',\n '[image]',\n '[voice]',\n '[video]',\n '[file]',\n '[sticker]',\n '[animated sticker]',\n '[location]',\n '[contact]',\n '[red packet]',\n '[transfer]',\n '[recalled message]',\n '[photo]',\n '[audio]',\n '[gif]',\n '[share]',\n])\n\nconst MEANINGLESS_SHORT_EN = new Set([\n 'ok',\n 'k',\n 'yes',\n 'no',\n 'ya',\n 'yep',\n 'nope',\n 'lol',\n 'haha',\n 'hehe',\n 'hmm',\n 'ah',\n 'oh',\n 'wow',\n 'thx',\n 'ty',\n 'np',\n 'gg',\n 'brb',\n 'idk',\n])\n\nconst MEANINGFUL_SHORT_ZH = new Set(['好的', '不是', '是的', '可以', '不行', '好吧', '明白', '知道', '同意'])\n\nconst SYSTEM_PATTERNS_ZH = [/^.*邀请.*加入了群聊$/, /^.*退出了群聊$/, /^.*撤回了一条消息$/, /^你撤回了一条消息$/]\n\nconst SYSTEM_PATTERNS_EN = [\n /^.*invited.*to the group$/i,\n /^.*left the group$/i,\n /^.*recalled a message$/i,\n /^.*joined the group$/i,\n /^.*has been removed$/i,\n]\n\nconst EMOJI_ONLY = /^[\\p{Emoji}\\s[\\]()()]+$/u\n\ninterface FormattableMessage {\n senderName: string\n content: string | null\n timestamp: number\n}\n\n/**\n * Check if message content is meaningful (not noise).\n */\nexport function isValidMessage(content: string): boolean {\n const trimmed = content.trim()\n if (!trimmed) return false\n\n if (trimmed.length <= 2 && !MEANINGFUL_SHORT_ZH.has(trimmed)) return false\n if (MEANINGLESS_SHORT_EN.has(trimmed.toLowerCase())) return false\n if (EMOJI_ONLY.test(trimmed)) return false\n if (PLACEHOLDER_CONTENTS.has(trimmed.toLowerCase())) return false\n if (SYSTEM_PATTERNS_ZH.some((p) => p.test(trimmed))) return false\n if (SYSTEM_PATTERNS_EN.some((p) => p.test(trimmed))) return false\n\n return true\n}\n\nfunction truncate(text: string, maxLen: number): string {\n return text.length <= maxLen ? text : text.slice(0, maxLen) + '...'\n}\n\nfunction formatTimestamp(ts: number): string {\n const d = new Date(ts * 1000)\n const M = d.getMonth() + 1\n const D = d.getDate()\n const h = String(d.getHours()).padStart(2, '0')\n const m = String(d.getMinutes()).padStart(2, '0')\n return `${M}/${D} ${h}:${m}`\n}\n\n/**\n * Format messages as compact plain text with consecutive-sender merging.\n * Filters out noise messages, merges same-sender runs, truncates long content.\n */\nexport function formatMessagesCompact(messages: FormattableMessage[]): string {\n if (messages.length === 0) return ''\n\n const valid = messages.filter((m) => m.content && isValidMessage(m.content))\n if (valid.length === 0) return ''\n\n const lines: string[] = []\n let prevSender = ''\n let pendingContents: string[] = []\n let pendingTs = 0\n\n const flush = () => {\n if (pendingContents.length === 0) return\n const combined = pendingContents.join('; ')\n const maxLen = pendingContents.length > 1 ? MAX_MERGED_CONTENT_LENGTH : MAX_CONTENT_LENGTH\n lines.push(`${formatTimestamp(pendingTs)} ${prevSender}: ${truncate(combined, maxLen)}`)\n }\n\n for (const msg of valid) {\n const content = msg.content!.trim()\n if (msg.senderName === prevSender) {\n pendingContents.push(content)\n } else {\n flush()\n prevSender = msg.senderName\n pendingContents = [content]\n pendingTs = msg.timestamp\n }\n }\n flush()\n\n return lines.join('\\n')\n}\n\n/**\n * Try to parse a tool result's JSON content and convert to compact text.\n * Returns null if the content is not suitable for text formatting.\n */\nexport function formatToolResultAsText(content: string): string | null {\n let parsed: unknown\n try {\n parsed = JSON.parse(content)\n } catch {\n return null\n }\n\n if (!parsed || typeof parsed !== 'object') return null\n const obj = parsed as Record<string, unknown>\n\n // If there's a messages array with senderName/content/timestamp, format it\n if (Array.isArray(obj.messages) && obj.messages.length > 0) {\n const msgs = obj.messages as FormattableMessage[]\n if (msgs[0] && 'senderName' in msgs[0] && 'timestamp' in msgs[0]) {\n return formatObjectWithMessages(obj, msgs)\n }\n }\n\n // If there are ranking/keywords arrays, format as numbered list\n if (Array.isArray(obj.ranking) || Array.isArray(obj.keywords)) {\n return formatArrayResult(obj)\n }\n\n // If there are sessions, format them compactly\n if (Array.isArray(obj.sessions)) {\n return formatSessionsList(obj)\n }\n\n return null\n}\n\nfunction formatObjectWithMessages(obj: Record<string, unknown>, msgs: FormattableMessage[]): string {\n const lines: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'messages') continue\n if (value === undefined || value === null) continue\n if (typeof value === 'object' && !Array.isArray(value)) continue\n if (Array.isArray(value)) continue\n lines.push(`${key}: ${value}`)\n }\n\n const formatted = formatMessagesCompact(msgs)\n if (formatted) {\n if (lines.length > 0) lines.push('')\n lines.push(formatted)\n }\n\n return lines.join('\\n')\n}\n\nfunction formatArrayResult(obj: Record<string, unknown>): string {\n const lines: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'string') {\n if (lines.length > 0) lines.push('')\n lines.push(...value)\n } else if (!Array.isArray(value) && value !== undefined && value !== null) {\n lines.push(`${key}: ${value}`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatSessionsList(obj: Record<string, unknown>): string {\n const sessions = obj.sessions as Array<Record<string, unknown>>\n const total = obj.total ?? sessions.length\n const lines: string[] = [`${total} sessions:`]\n\n for (const s of sessions) {\n const name = s.name ?? s.id\n const platform = s.platform ? ` (${s.platform})` : ''\n const msgCount = s.totalMessages ?? s.messageCount ?? ''\n const members = s.totalMembers ?? s.memberCount ?? ''\n const stats = msgCount ? ` — ${msgCount} msgs, ${members} members` : ''\n lines.push(`- ${name}${platform}${stats} [${s.id}]`)\n }\n\n return lines.join('\\n')\n}\n"],"mappings":"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","names":["z","z","zodShape"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'module';
|
|
2
|
+
import { dirname as __pathDirname } from 'path';
|
|
3
|
+
import { fileURLToPath as __fileURLToPath } from 'url';
|
|
4
|
+
const require = __createRequire(import.meta.url);
|
|
5
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = __pathDirname(__filename);
|
|
7
|
+
import {
|
|
8
|
+
computePeopleRelationshipsSnapshot
|
|
9
|
+
} from "./chunk-2MZ6G4AC.mjs";
|
|
10
|
+
import {
|
|
11
|
+
DatabaseManager,
|
|
12
|
+
StaticPathProvider,
|
|
13
|
+
createDatabaseManagerAdapter,
|
|
14
|
+
getPeopleRelationshipsFactsCacheDir,
|
|
15
|
+
initAppLogger
|
|
16
|
+
} from "./chunk-WPI6YSAR.mjs";
|
|
17
|
+
import "./chunk-GFHSSCCR.mjs";
|
|
18
|
+
|
|
19
|
+
// ../../packages/node-runtime/src/services/people/relationships/worker-entry.ts
|
|
20
|
+
import { parentPort, workerData } from "worker_threads";
|
|
21
|
+
async function main() {
|
|
22
|
+
if (!parentPort) throw new Error("people relationships worker requires parentPort");
|
|
23
|
+
const options = workerData;
|
|
24
|
+
initAppLogger(options.paths.logsDir);
|
|
25
|
+
const pathProvider = new StaticPathProvider(options.paths);
|
|
26
|
+
const dbManager = new DatabaseManager(pathProvider, {
|
|
27
|
+
nativeBinding: options.nativeBinding,
|
|
28
|
+
runtime: options.runtimeIdentity,
|
|
29
|
+
allowMissingRuntimeForTests: !options.runtimeIdentity
|
|
30
|
+
});
|
|
31
|
+
const adapter = createDatabaseManagerAdapter(dbManager);
|
|
32
|
+
const onProgress = (progress) => parentPort?.postMessage({ type: "progress", progress });
|
|
33
|
+
const snapshot = computePeopleRelationshipsSnapshot({
|
|
34
|
+
adapter,
|
|
35
|
+
signature: options.signature,
|
|
36
|
+
timeRangePreset: options.timeRangePreset,
|
|
37
|
+
factsCacheDir: getPeopleRelationshipsFactsCacheDir(pathProvider.getUserDataDir()),
|
|
38
|
+
onProgress
|
|
39
|
+
});
|
|
40
|
+
parentPort.postMessage({ type: "success", snapshot });
|
|
41
|
+
}
|
|
42
|
+
main().catch((error) => {
|
|
43
|
+
parentPort?.postMessage({
|
|
44
|
+
type: "error",
|
|
45
|
+
error: error instanceof Error ? error.message : String(error)
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=people-relationships-worker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/node-runtime/src/services/people/relationships/worker-entry.ts"],"sourcesContent":["import { parentPort, workerData } from 'node:worker_threads'\nimport type { ContactsTimeRangePreset } from '@openchatlab/shared-types'\nimport { DatabaseManager } from '../../../database-manager'\nimport type { RuntimeIdentity } from '../../../data-dir-compat'\nimport { initAppLogger } from '../../../logging/app-logger'\nimport { StaticPathProvider, type StaticPathProviderSnapshot } from '../../../semantic-index/static-path-provider'\nimport { createDatabaseManagerAdapter } from '../../adapters'\nimport { computePeopleRelationshipsSnapshot, type PeopleRelationshipsComputeProgress } from './compute'\nimport { getPeopleRelationshipsFactsCacheDir } from './paths'\n\ninterface PeopleRelationshipsWorkerStartupOptions {\n paths: StaticPathProviderSnapshot\n runtimeIdentity?: RuntimeIdentity\n nativeBinding?: string\n signature: string\n timeRangePreset?: ContactsTimeRangePreset\n}\n\nasync function main(): Promise<void> {\n if (!parentPort) throw new Error('people relationships worker requires parentPort')\n const options = workerData as PeopleRelationshipsWorkerStartupOptions\n initAppLogger(options.paths.logsDir)\n const pathProvider = new StaticPathProvider(options.paths)\n const dbManager = new DatabaseManager(pathProvider, {\n nativeBinding: options.nativeBinding,\n runtime: options.runtimeIdentity,\n allowMissingRuntimeForTests: !options.runtimeIdentity,\n })\n const adapter = createDatabaseManagerAdapter(dbManager)\n const onProgress = (progress: PeopleRelationshipsComputeProgress) =>\n parentPort?.postMessage({ type: 'progress', progress })\n const snapshot = computePeopleRelationshipsSnapshot({\n adapter,\n signature: options.signature,\n timeRangePreset: options.timeRangePreset,\n factsCacheDir: getPeopleRelationshipsFactsCacheDir(pathProvider.getUserDataDir()),\n onProgress,\n })\n parentPort.postMessage({ type: 'success', snapshot })\n}\n\nmain().catch((error) => {\n parentPort?.postMessage({\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n })\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAkBvC,eAAe,OAAsB;AACnC,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,iDAAiD;AAClF,QAAM,UAAU;AAChB,gBAAc,QAAQ,MAAM,OAAO;AACnC,QAAM,eAAe,IAAI,mBAAmB,QAAQ,KAAK;AACzD,QAAM,YAAY,IAAI,gBAAgB,cAAc;AAAA,IAClD,eAAe,QAAQ;AAAA,IACvB,SAAS,QAAQ;AAAA,IACjB,6BAA6B,CAAC,QAAQ;AAAA,EACxC,CAAC;AACD,QAAM,UAAU,6BAA6B,SAAS;AACtD,QAAM,aAAa,CAAC,aAClB,YAAY,YAAY,EAAE,MAAM,YAAY,SAAS,CAAC;AACxD,QAAM,WAAW,mCAAmC;AAAA,IAClD;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,eAAe,oCAAoC,aAAa,eAAe,CAAC;AAAA,IAChF;AAAA,EACF,CAAC;AACD,aAAW,YAAY,EAAE,MAAM,WAAW,SAAS,CAAC;AACtD;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EAC9D,CAAC;AACH,CAAC;","names":[]}
|
|
@@ -9,7 +9,7 @@ const __dirname = __pathDirname(__filename);
|
|
|
9
9
|
import { parentPort, workerData } from "worker_threads";
|
|
10
10
|
var startup = workerData;
|
|
11
11
|
async function main() {
|
|
12
|
-
const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-
|
|
12
|
+
const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-ALS4MR2A.mjs");
|
|
13
13
|
const runtime = createSemanticIndexWorkerRuntime({
|
|
14
14
|
serviceFactory: createSemanticIndexWorkerServiceFactory(startup)
|
|
15
15
|
});
|