chatlab-cli 0.35.0 → 0.36.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/{chat-command-24RYGJAS.mjs → chat-command-XPJ43KSW.mjs} +11 -11
- package/dist/chat-command-XPJ43KSW.mjs.map +1 -0
- package/dist/{chunk-7IGBPZMI.mjs → chunk-2JPFBIAG.mjs} +268 -76
- package/dist/chunk-2JPFBIAG.mjs.map +1 -0
- package/dist/{chunk-GQMCDWZQ.mjs → chunk-5MJO4AJB.mjs} +2 -2
- package/dist/{chunk-QKEARRFH.mjs → chunk-67HNPYZJ.mjs} +3 -3
- package/dist/{chunk-U36TQMAF.mjs → chunk-6QP47LID.mjs} +2 -2
- package/dist/{chunk-4GWWKHWA.mjs → chunk-FJOGBUXU.mjs} +892 -6990
- package/dist/chunk-FJOGBUXU.mjs.map +1 -0
- package/dist/{chunk-KIMJXKZO.mjs → chunk-JOVL7OTW.mjs} +2 -2
- package/dist/{chunk-ZBPPLXM4.mjs → chunk-L7TIIVAY.mjs} +63 -63
- package/dist/chunk-L7TIIVAY.mjs.map +1 -0
- package/dist/{chunk-DC7IUDNV.mjs → chunk-NFTCEJBJ.mjs} +27 -9
- package/dist/chunk-NFTCEJBJ.mjs.map +1 -0
- package/dist/{chunk-KXDJ7N6N.mjs → chunk-NQHZPSW2.mjs} +2 -2
- package/dist/chunk-Q3NEL2KK.mjs +19126 -0
- package/dist/chunk-Q3NEL2KK.mjs.map +1 -0
- package/dist/{chunk-DEFEU567.mjs → chunk-R73XMAB2.mjs} +13 -11
- package/dist/chunk-R73XMAB2.mjs.map +1 -0
- package/dist/{chunk-BRZ6YIBR.mjs → chunk-X2QBH24F.mjs} +8 -3
- package/dist/chunk-X2QBH24F.mjs.map +1 -0
- package/dist/chunk-YKMQLAVP.mjs +25 -0
- package/dist/chunk-YKMQLAVP.mjs.map +1 -0
- package/dist/cli.mjs +10 -10
- package/dist/contacts-worker.mjs +2 -2
- package/dist/global-insight-worker.mjs +136 -4
- package/dist/global-insight-worker.mjs.map +1 -1
- package/dist/{http-3K4YMWDE.mjs → http-5RVY5J5U.mjs} +13 -13
- package/dist/{import-D4LV565A.mjs → import-ILTWVHKU.mjs} +8 -8
- package/dist/index.mjs +13 -13
- package/dist/{mcp-KL22FKQ2.mjs → mcp-Y2YXOFB4.mjs} +9 -9
- package/dist/people-relationships-worker.mjs +2 -2
- package/dist/semantic-index-worker.mjs +1 -1
- package/dist/{service-KZTHBDQ5.mjs → service-ZAHXRSFD.mjs} +6 -6
- package/dist/service-ZAHXRSFD.mjs.map +1 -0
- package/dist/{src-COIB6Z4P.mjs → src-OV5ZNE3Z.mjs} +124 -98
- package/dist/{stream-import-FSXCFG4M.mjs → stream-import-XOUM3Z5W.mjs} +8 -8
- package/dist/{undici-MU5I3L6Q.mjs → undici-UGXDRJLV.mjs} +193 -193
- package/dist/undici-UGXDRJLV.mjs.map +1 -0
- package/dist/{update-checker-3N7HQEP2.mjs → update-checker-UL2FBLXH.mjs} +3 -5
- package/dist/{update-checker-3N7HQEP2.mjs.map → update-checker-UL2FBLXH.mjs.map} +1 -1
- package/dist/{worker-runtime-DPS2LURI.mjs → worker-runtime-JNGURHDM.mjs} +6 -6
- package/dist-cli-web/assets/AISettingsTab-vvjijrc5.js +1 -0
- package/dist-cli-web/assets/{AboutTab-DMPziKjj.js → AboutTab-CxI8zJNz.js} +1 -1
- package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-w0hHEodr.js +110 -0
- package/dist-cli-web/assets/Alert-_MYcI_E2.js +1 -0
- package/dist-cli-web/assets/ApiSettingsTab-CK7U6dVA.js +2 -0
- package/dist-cli-web/assets/BatchManageTab-1WnEqqpB.js +1 -0
- package/dist-cli-web/assets/{BufferResource-BXSJADxx.js → BufferResource-i64DlwQT.js} +1 -1
- package/dist-cli-web/assets/{CanvasRenderer-Cq--8UQ_.js → CanvasRenderer-B76mEt9A.js} +1 -1
- package/dist-cli-web/assets/ChatRecordDrawer-Bp6OSCrz.js +1 -0
- package/dist-cli-web/assets/ChatRecordWorkspace-CyfPIlIy.js +11 -0
- package/dist-cli-web/assets/ChatRecordWorkspace-D_oJMtqh.css +1 -0
- package/dist-cli-web/assets/Checkbox-Ci7IeRw1.js +1 -0
- package/dist-cli-web/assets/DataDirCleanupNotice-Dh63pOLt.js +1 -0
- package/dist-cli-web/assets/DatePicker.vue_vue_type_script_setup_true_lang-DqNBNa1D.js +1 -0
- package/dist-cli-web/assets/DebugToolsPanel-CbNsD9co.js +1 -0
- package/dist-cli-web/assets/EChart.vue_vue_type_script_setup_true_lang-YeqmodwE.js +1 -0
- package/dist-cli-web/assets/EChartBar.vue_vue_type_script_setup_true_lang-C3pZmq0v.js +1 -0
- package/dist-cli-web/assets/EChartLine.vue_vue_type_script_setup_true_lang-Co6olfwv.js +1 -0
- package/dist-cli-web/assets/{EChartWordcloud-KV0MdsDE.js → EChartWordcloud-rDusZwSq.js} +1 -1
- package/dist-cli-web/assets/{Filter-DVaqcFmI.js → Filter-yxkeHO78.js} +1 -1
- package/dist-cli-web/assets/GlobalTaskBar-BlZ-fFiq.js +1 -0
- package/dist-cli-web/assets/GroupRelationshipGalaxyView-BXQBX0zJ.js +1 -0
- package/dist-cli-web/assets/Label-CFAZFBQX.js +1 -0
- package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-CwgpqtMZ.js +1 -0
- package/dist-cli-web/assets/MessageExportModal-DU71grc7.js +1 -0
- package/dist-cli-web/assets/PageHeader-BDPf4NuI.js +1 -0
- package/dist-cli-web/assets/PageTabs.vue_vue_type_script_setup_true_lang-_j82asQU.js +1 -0
- package/dist-cli-web/assets/{RelationshipGalaxyCanvas-6EamagxG.js → RelationshipGalaxyCanvas-BODk18aA.js} +14 -14
- package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-BJyuRiC-.js +4168 -0
- package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-CCasBcBQ.css +1 -0
- package/dist-cli-web/assets/{RenderTargetSystem-mYuj4uBS.js → RenderTargetSystem-CVMvAUSv.js} +1 -1
- package/dist-cli-web/assets/RovingFocusItem-DC_06OmN.js +1 -0
- package/dist-cli-web/assets/ScreenCaptureModal-DrBFDOtC.js +1 -0
- package/dist-cli-web/assets/SectionTabs.vue_vue_type_script_setup_true_lang-C-Zj2biH.js +1 -0
- package/dist-cli-web/assets/Select-DLK2LYhO.js +1 -0
- package/dist-cli-web/assets/SettingsModal-BFkxzo0Y.css +1 -0
- package/dist-cli-web/assets/SettingsModal-DqaR4Dx5.js +2 -0
- package/dist-cli-web/assets/StorageTab-B0ebN0f8.js +1 -0
- package/dist-cli-web/assets/Switch-CokhQWxm.js +1 -0
- package/dist-cli-web/assets/Tabs-D1UiZNaZ.js +1 -0
- package/dist-cli-web/assets/Tabs-N3Q-Mpqi.js +1 -0
- package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-DPIvbq75.js → ThemeCard.vue_vue_type_script_setup_true_lang-OT-I0mbU.js} +1 -1
- package/dist-cli-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-Ccunouyf.js +1 -0
- package/dist-cli-web/assets/{VisuallyHiddenInput-BOdkR_GC.js → VisuallyHiddenInput-OAJEt_Y5.js} +1 -1
- package/dist-cli-web/assets/{WebGLRenderer-BB8ukBI_.js → WebGLRenderer-DuUeftYD.js} +1 -1
- package/dist-cli-web/assets/{WebGPURenderer-DDOzF1Kc.js → WebGPURenderer-DoWQxiWZ.js} +1 -1
- package/dist-cli-web/assets/aiChat-CdADfRnU.js +8 -0
- package/dist-cli-web/assets/{browserAll-BRqlnNxq.js → browserAll-Cb-mtR2y.js} +1 -1
- package/dist-cli-web/assets/{cli-web-ClAJ6Tao.js → cli-web-BHQCZLLg.js} +1 -1
- package/dist-cli-web/assets/{fetch-LY-yerw1.js → fetch-AvsnJLWJ.js} +1 -1
- package/dist-cli-web/assets/{fetch-Dy38lkAa.js → fetch-B-6tyYWu.js} +1 -1
- package/dist-cli-web/assets/{fetch-Bcy2T8Fe.js → fetch-B4PYy5JS.js} +1 -1
- package/dist-cli-web/assets/{fetch-DWAIk_6_.js → fetch-BbcFaCRB.js} +1 -1
- package/dist-cli-web/assets/fetch-BkA_so1e.js +1 -0
- package/dist-cli-web/assets/{fetch-q480XYZQ.js → fetch-BzXuAaT3.js} +8 -5
- package/dist-cli-web/assets/fetch-CW2fKvGp.js +1 -0
- package/dist-cli-web/assets/{fetch-DijSOvop.js → fetch-DEub4tOo.js} +1 -1
- package/dist-cli-web/assets/{fetch-CGu53cxT.js → fetch-DLTlYnDB.js} +1 -1
- package/dist-cli-web/assets/fetch-Qs38Hx1V.js +1 -0
- package/dist-cli-web/assets/{fetch-CP1afnT0.js → fetch-sYDJ-Zs8.js} +1 -1
- package/dist-cli-web/assets/{fetch-DzKlTaLz.js → fetch-ul8-uQIb.js} +1 -1
- package/dist-cli-web/assets/host-B6SQ6OGo.js +1 -0
- package/dist-cli-web/assets/host-DYIkQqvY.js +1 -0
- package/dist-cli-web/assets/{index-Di6FmCdk.js → index--IEkRjKe.js} +10 -10
- package/dist-cli-web/assets/index-9iaY_EWG.js +1 -0
- package/dist-cli-web/assets/index-B4J99zv3.css +1 -0
- package/dist-cli-web/assets/index-BBeqtL8d.css +1 -0
- package/dist-cli-web/assets/index-BnaLj2dx.css +1 -0
- package/dist-cli-web/assets/index-C7omDgiJ.js +2 -0
- package/dist-cli-web/assets/index-CHsM84U1.js +2 -0
- package/dist-cli-web/assets/index-CL8u01Pf.js +137 -0
- package/dist-cli-web/assets/{index-CNzv7aBW.js → index-CShh95fU.js} +1 -1
- package/dist-cli-web/assets/index-C_OS8Y8W.js +1 -0
- package/dist-cli-web/assets/{index-BRV_D8dv.js → index-D64XYYts.js} +1 -1
- package/dist-cli-web/assets/index-DrCc8p_I.css +1 -0
- package/dist-cli-web/assets/index-Dz_ddyZS.css +1 -0
- package/dist-cli-web/assets/index-UpTe1KzQ.js +1 -0
- package/dist-cli-web/assets/index-a8Hw6eD8.js +1 -0
- package/dist-cli-web/assets/index-jwjzZNKm.js +1 -0
- package/dist-cli-web/assets/index-pkxlF8Ee.js +1 -0
- package/dist-cli-web/assets/index-sWxuTsa7.js +36 -0
- package/dist-cli-web/assets/{people-page-header-Bh3KXD4g.js → people-page-header-0jvXFFnh.js} +1 -1
- package/dist-cli-web/assets/{prompt-DcAcgQiB.js → prompt-BPYj29Vq.js} +1 -1
- package/dist-cli-web/assets/{semantic-index-config-builder-CK6v64Y1.js → semantic-index-config-builder-vO37z355.js} +1 -1
- package/dist-cli-web/assets/service-CVoA9yNf.js +1 -0
- package/dist-cli-web/assets/{service-YZnJyEMq.js → service-D29Vftq9.js} +1 -1
- package/dist-cli-web/assets/service-DMysyLCa.js +1 -0
- package/dist-cli-web/assets/{useFormControl-B-aXrJZN.js → useFormControl-DVawP2DO.js} +1 -1
- package/dist-cli-web/assets/useTable-Bv3R_Hux.js +1 -0
- package/dist-cli-web/assets/useToast-BA0EwImD.js +1 -0
- package/dist-cli-web/assets/{vendor-echarts-DfAMQxdr.js → vendor-echarts-hTLhTs52.js} +5 -5
- package/dist-cli-web/assets/{vendor-echarts-wordcloud-BsaEJTPY.js → vendor-echarts-wordcloud-B8CF_NgP.js} +1 -1
- package/dist-cli-web/assets/{vendor-zrender-PFmZe1EY.js → vendor-zrender-D8psf1AA.js} +2 -2
- package/dist-cli-web/assets/{webworkerAll-Dwqmy_YO.js → webworkerAll-ZPE_yGnC.js} +1 -1
- package/dist-cli-web/index.html +2 -2
- package/package.json +4 -4
- package/dist/chat-command-24RYGJAS.mjs.map +0 -1
- package/dist/chunk-22YJOBA3.mjs +0 -9826
- package/dist/chunk-22YJOBA3.mjs.map +0 -1
- package/dist/chunk-4GWWKHWA.mjs.map +0 -1
- package/dist/chunk-7IGBPZMI.mjs.map +0 -1
- package/dist/chunk-BRZ6YIBR.mjs.map +0 -1
- package/dist/chunk-DC7IUDNV.mjs.map +0 -1
- package/dist/chunk-DEFEU567.mjs.map +0 -1
- package/dist/chunk-QZCNVAH6.mjs +0 -14
- package/dist/chunk-QZCNVAH6.mjs.map +0 -1
- package/dist/chunk-ZBPPLXM4.mjs.map +0 -1
- package/dist/service-KZTHBDQ5.mjs.map +0 -1
- package/dist/undici-MU5I3L6Q.mjs.map +0 -1
- package/dist-cli-web/assets/AISettingsTab-rQC2ocFH.js +0 -1
- package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-CnRLt_1j.js +0 -110
- package/dist-cli-web/assets/Alert--bTQXRcZ.js +0 -1
- package/dist-cli-web/assets/ApiSettingsTab-CtXl4I28.js +0 -2
- package/dist-cli-web/assets/BatchManageTab-1KaCPweN.js +0 -1
- package/dist-cli-web/assets/ChatRecordDrawer-BC0F7ok1.js +0 -11
- package/dist-cli-web/assets/ChatRecordDrawer-Tt6UduRC.css +0 -1
- package/dist-cli-web/assets/Checkbox-CwajNPGF.js +0 -1
- package/dist-cli-web/assets/DataDirCleanupNotice-D0Oruka2.js +0 -1
- package/dist-cli-web/assets/DatePicker.vue_vue_type_script_setup_true_lang-C4CsoIlq.js +0 -1
- package/dist-cli-web/assets/DebugToolsPanel-DVDwS-wz.js +0 -1
- package/dist-cli-web/assets/GlobalTaskBar-DpPMX0jx.js +0 -1
- package/dist-cli-web/assets/GroupRelationshipGalaxyView-CLnO3phW.js +0 -1
- package/dist-cli-web/assets/Label-Bt2U4lGy.js +0 -1
- package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-Cnshyn0f.js +0 -1
- package/dist-cli-web/assets/MessageExportModal-BozaR9UZ.js +0 -1
- package/dist-cli-web/assets/PageHeader-CEe0xTl3.js +0 -1
- package/dist-cli-web/assets/PageTabs.vue_vue_type_script_setup_true_lang-D2DZrrnv.js +0 -1
- package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-B6GB4PWS.js +0 -4108
- package/dist-cli-web/assets/RelationshipGalaxyThreeCanvas-TYGOUDiv.css +0 -1
- package/dist-cli-web/assets/RovingFocusItem-B2y6BG1a.js +0 -1
- package/dist-cli-web/assets/ScreenCaptureModal-BvAtSNNR.js +0 -1
- package/dist-cli-web/assets/SectionTabs.vue_vue_type_script_setup_true_lang-ueEF4zHE.js +0 -1
- package/dist-cli-web/assets/Select-Cm4I8u9n.js +0 -1
- package/dist-cli-web/assets/SettingsModal-CjVax3I6.css +0 -1
- package/dist-cli-web/assets/SettingsModal-Cwshzj7i.js +0 -2
- package/dist-cli-web/assets/StorageTab-D7HzH16Y.js +0 -1
- package/dist-cli-web/assets/Switch-BVw4e_19.js +0 -1
- package/dist-cli-web/assets/Tabs-Dqwkh3Ea.js +0 -1
- package/dist-cli-web/assets/Tabs-OrJkANIA.js +0 -1
- package/dist-cli-web/assets/TimeSelect.vue_vue_type_script_setup_true_lang-dEdo6CqM.js +0 -1
- package/dist-cli-web/assets/aiChat-CzFSFuOJ.js +0 -8
- package/dist-cli-web/assets/annual-summary-time-range-CmrAqcuj.js +0 -1
- package/dist-cli-web/assets/base-CawUl6ET.js +0 -1
- package/dist-cli-web/assets/dateFormat-DXuDxIye.js +0 -1
- package/dist-cli-web/assets/fetch-3_xX8Yi8.js +0 -1
- package/dist-cli-web/assets/index-0dp58uL4.css +0 -1
- package/dist-cli-web/assets/index-1X7zdLgJ.css +0 -1
- package/dist-cli-web/assets/index-4enwdBcq.css +0 -1
- package/dist-cli-web/assets/index-AudHHbMs.js +0 -1
- package/dist-cli-web/assets/index-CF4DTbvD.js +0 -1
- package/dist-cli-web/assets/index-CMLoht5R.js +0 -1
- package/dist-cli-web/assets/index-CMPHZH6B.css +0 -1
- package/dist-cli-web/assets/index-CXUTiy-V.js +0 -1
- package/dist-cli-web/assets/index-D5m0P4ss.js +0 -36
- package/dist-cli-web/assets/index-DkOrt7_X.js +0 -2
- package/dist-cli-web/assets/index-Dlb6fC68.js +0 -1
- package/dist-cli-web/assets/index-IA7YUjQX.js +0 -2
- package/dist-cli-web/assets/index-ZsZwPLWy.css +0 -1
- package/dist-cli-web/assets/index-kzU381y1.js +0 -1
- package/dist-cli-web/assets/index-z8Vogc-b.js +0 -137
- package/dist-cli-web/assets/lazy-overlay-visibility-Bd9ZFOgR.js +0 -1
- package/dist-cli-web/assets/member-select-utils-BXZ3oHct.js +0 -1
- package/dist-cli-web/assets/useTable-DPEMaGby.js +0 -1
- package/dist-cli-web/assets/useToast-B36MzFFy.js +0 -1
- /package/dist/{chunk-GQMCDWZQ.mjs.map → chunk-5MJO4AJB.mjs.map} +0 -0
- /package/dist/{chunk-QKEARRFH.mjs.map → chunk-67HNPYZJ.mjs.map} +0 -0
- /package/dist/{chunk-U36TQMAF.mjs.map → chunk-6QP47LID.mjs.map} +0 -0
- /package/dist/{chunk-KIMJXKZO.mjs.map → chunk-JOVL7OTW.mjs.map} +0 -0
- /package/dist/{chunk-KXDJ7N6N.mjs.map → chunk-NQHZPSW2.mjs.map} +0 -0
- /package/dist/{http-3K4YMWDE.mjs.map → http-5RVY5J5U.mjs.map} +0 -0
- /package/dist/{import-D4LV565A.mjs.map → import-ILTWVHKU.mjs.map} +0 -0
- /package/dist/{mcp-KL22FKQ2.mjs.map → mcp-Y2YXOFB4.mjs.map} +0 -0
- /package/dist/{src-COIB6Z4P.mjs.map → src-OV5ZNE3Z.mjs.map} +0 -0
- /package/dist/{stream-import-FSXCFG4M.mjs.map → stream-import-XOUM3Z5W.mjs.map} +0 -0
- /package/dist/{worker-runtime-DPS2LURI.mjs.map → worker-runtime-JNGURHDM.mjs.map} +0 -0
|
@@ -5,12 +5,15 @@ const require = __createRequire(import.meta.url);
|
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __pathDirname(__filename);
|
|
7
7
|
import {
|
|
8
|
-
ANNUAL_SUMMARY_ALGORITHM_VERSION
|
|
9
|
-
|
|
8
|
+
ANNUAL_SUMMARY_ALGORITHM_VERSION,
|
|
9
|
+
TIME_INVESTMENT_ALGORITHM_VERSION,
|
|
10
|
+
listOwnerInsightSessionIds
|
|
11
|
+
} from "./chunk-YKMQLAVP.mjs";
|
|
10
12
|
import {
|
|
11
13
|
DatabaseManager,
|
|
12
14
|
StaticPathProvider,
|
|
13
15
|
aggregateAnnualSummaryFacts,
|
|
16
|
+
aggregateTimeInvestmentFacts,
|
|
14
17
|
appLogger,
|
|
15
18
|
createDatabaseManagerAdapter,
|
|
16
19
|
getAnnualSummaryElapsedDayCount,
|
|
@@ -18,10 +21,12 @@ import {
|
|
|
18
21
|
getCache,
|
|
19
22
|
getDbFileVersion,
|
|
20
23
|
getGlobalInsightFactsCacheDir,
|
|
24
|
+
getTimeInvestmentFactsCacheDir,
|
|
25
|
+
getTimeInvestmentSessionFacts,
|
|
21
26
|
initAppLogger,
|
|
22
27
|
setCache,
|
|
23
28
|
toAnnualSummaryRangeKey
|
|
24
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-Q3NEL2KK.mjs";
|
|
25
30
|
import "./chunk-VSOWNKPA.mjs";
|
|
26
31
|
|
|
27
32
|
// ../../packages/node-runtime/src/services/global-insight/worker-entry.ts
|
|
@@ -69,7 +74,7 @@ function isRecord(value) {
|
|
|
69
74
|
// ../../packages/node-runtime/src/services/global-insight/compute.ts
|
|
70
75
|
function computeAnnualSummarySnapshot(options) {
|
|
71
76
|
const startedAt = options.now?.() ?? Date.now();
|
|
72
|
-
const sessionIds = options.adapter.
|
|
77
|
+
const sessionIds = listOwnerInsightSessionIds(options.adapter, options.excludedSessionIds);
|
|
73
78
|
const facts = [];
|
|
74
79
|
let cacheHits = 0;
|
|
75
80
|
let cacheMisses = 0;
|
|
@@ -151,6 +156,119 @@ function computeAnnualSummarySnapshot(options) {
|
|
|
151
156
|
return snapshot;
|
|
152
157
|
}
|
|
153
158
|
|
|
159
|
+
// ../../packages/node-runtime/src/services/global-insight/time-investment-facts-cache.ts
|
|
160
|
+
var FACTS_FORMAT_VERSION2 = 1;
|
|
161
|
+
function buildTimeInvestmentFactsCacheKey(algorithmVersion, range) {
|
|
162
|
+
return `global-insight:time-investment:facts:v${FACTS_FORMAT_VERSION2}:${algorithmVersion}:${toAnnualSummaryRangeKey(range)}`;
|
|
163
|
+
}
|
|
164
|
+
function readCachedTimeInvestmentSessionFacts(sessionId, cacheDir, key, dbVersion, range) {
|
|
165
|
+
const cached = getCache(sessionId, key, cacheDir);
|
|
166
|
+
if (!cached || cached.v !== dbVersion || cached.rangeIdentity !== buildRangeIdentity(range) || !isTimeInvestmentSessionFacts(cached.data)) {
|
|
167
|
+
return { hit: false };
|
|
168
|
+
}
|
|
169
|
+
return { hit: true, data: cached.data };
|
|
170
|
+
}
|
|
171
|
+
function writeCachedTimeInvestmentSessionFacts(sessionId, cacheDir, key, dbVersion, range, data) {
|
|
172
|
+
setCache(sessionId, key, { v: dbVersion, rangeIdentity: buildRangeIdentity(range), data }, cacheDir);
|
|
173
|
+
}
|
|
174
|
+
function buildRangeIdentity(range) {
|
|
175
|
+
return `${toAnnualSummaryRangeKey(range)}:${range.startTs}:${range.endTs}`;
|
|
176
|
+
}
|
|
177
|
+
function isTimeInvestmentSessionFacts(value) {
|
|
178
|
+
if (!value || typeof value !== "object") return false;
|
|
179
|
+
const record = value;
|
|
180
|
+
if (typeof record.kind !== "string" || !Array.isArray(record.availableDataYears)) return false;
|
|
181
|
+
if (record.kind !== "analyzed") return true;
|
|
182
|
+
return typeof record.sessionId === "string" && typeof record.sessionName === "string" && typeof record.platform === "string" && typeof record.chatType === "string" && isIntervals(record.investmentIntervals);
|
|
183
|
+
}
|
|
184
|
+
function isIntervals(value) {
|
|
185
|
+
return Array.isArray(value) && value.every(
|
|
186
|
+
(item) => item !== null && typeof item === "object" && typeof item.startTs === "number" && typeof item.endTs === "number"
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ../../packages/node-runtime/src/services/global-insight/time-investment-compute.ts
|
|
191
|
+
function computeTimeInvestmentSnapshot(options) {
|
|
192
|
+
const startedAt = options.now?.() ?? Date.now();
|
|
193
|
+
const sessionIds = listOwnerInsightSessionIds(options.adapter, options.excludedSessionIds);
|
|
194
|
+
const facts = [];
|
|
195
|
+
let cacheHits = 0;
|
|
196
|
+
let cacheMisses = 0;
|
|
197
|
+
const cacheKey = buildTimeInvestmentFactsCacheKey(TIME_INVESTMENT_ALGORITHM_VERSION, options.range);
|
|
198
|
+
appLogger.info("global-insight", "time investment compute started", {
|
|
199
|
+
mode: options.range.mode,
|
|
200
|
+
year: options.range.year,
|
|
201
|
+
totalSessions: sessionIds.length
|
|
202
|
+
});
|
|
203
|
+
for (const [index, sessionId] of sessionIds.entries()) {
|
|
204
|
+
options.onProgress?.({ processedSessions: index, totalSessions: sessionIds.length, currentSessionId: sessionId });
|
|
205
|
+
const dbPath = options.adapter.getDbPath(sessionId);
|
|
206
|
+
const dbVersion = getDbFileVersion(dbPath);
|
|
207
|
+
const cached = readCachedTimeInvestmentSessionFacts(
|
|
208
|
+
sessionId,
|
|
209
|
+
options.factsCacheDir,
|
|
210
|
+
cacheKey,
|
|
211
|
+
dbVersion,
|
|
212
|
+
options.range
|
|
213
|
+
);
|
|
214
|
+
if (cached.hit) {
|
|
215
|
+
cacheHits++;
|
|
216
|
+
facts.push(cached.data);
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
cacheMisses++;
|
|
220
|
+
try {
|
|
221
|
+
const db = options.adapter.openReadonly(sessionId);
|
|
222
|
+
if (!db) {
|
|
223
|
+
facts.push({ kind: "failed", availableDataYears: [] });
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const sessionFacts = getTimeInvestmentSessionFacts(db, sessionId, options.range);
|
|
227
|
+
facts.push(sessionFacts);
|
|
228
|
+
if (dbVersion === getDbFileVersion(dbPath)) {
|
|
229
|
+
writeCachedTimeInvestmentSessionFacts(
|
|
230
|
+
sessionId,
|
|
231
|
+
options.factsCacheDir,
|
|
232
|
+
cacheKey,
|
|
233
|
+
dbVersion,
|
|
234
|
+
options.range,
|
|
235
|
+
sessionFacts
|
|
236
|
+
);
|
|
237
|
+
} else {
|
|
238
|
+
appLogger.debug("global-insight", "skipped time investment facts cache write because DB changed");
|
|
239
|
+
}
|
|
240
|
+
} catch (error) {
|
|
241
|
+
facts.push({ kind: "failed", availableDataYears: [] });
|
|
242
|
+
appLogger.error("global-insight", "failed to process time investment session", error);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
options.onProgress?.({ processedSessions: sessionIds.length, totalSessions: sessionIds.length });
|
|
246
|
+
const aggregated = aggregateTimeInvestmentFacts(facts, options.range);
|
|
247
|
+
const finishedAt = options.now?.() ?? Date.now();
|
|
248
|
+
const snapshot = {
|
|
249
|
+
algorithmVersion: TIME_INVESTMENT_ALGORITHM_VERSION,
|
|
250
|
+
signature: options.signature,
|
|
251
|
+
computedAt: finishedAt,
|
|
252
|
+
range: options.range,
|
|
253
|
+
...aggregated,
|
|
254
|
+
workerStats: {
|
|
255
|
+
durationMs: Math.max(0, finishedAt - startedAt),
|
|
256
|
+
totalSessions: sessionIds.length,
|
|
257
|
+
processedSessions: sessionIds.length,
|
|
258
|
+
cacheHits,
|
|
259
|
+
cacheMisses
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
appLogger.info("global-insight", "time investment compute completed", {
|
|
263
|
+
totalSessions: sessionIds.length,
|
|
264
|
+
analyzedSessions: snapshot.coverage.analyzedSessions,
|
|
265
|
+
cacheHits,
|
|
266
|
+
cacheMisses,
|
|
267
|
+
durationMs: snapshot.workerStats.durationMs
|
|
268
|
+
});
|
|
269
|
+
return snapshot;
|
|
270
|
+
}
|
|
271
|
+
|
|
154
272
|
// ../../packages/node-runtime/src/services/global-insight/worker-entry.ts
|
|
155
273
|
async function main() {
|
|
156
274
|
if (!parentPort) throw new Error("annual summary worker requires parentPort");
|
|
@@ -163,10 +281,24 @@ async function main() {
|
|
|
163
281
|
allowMissingRuntimeForTests: !options.runtimeIdentity
|
|
164
282
|
});
|
|
165
283
|
const adapter = createDatabaseManagerAdapter(dbManager);
|
|
284
|
+
if (options.reportType === "time-investment") {
|
|
285
|
+
const computeOptions2 = {
|
|
286
|
+
adapter,
|
|
287
|
+
signature: options.signature,
|
|
288
|
+
range: options.range,
|
|
289
|
+
excludedSessionIds: options.excludedSessionIds,
|
|
290
|
+
factsCacheDir: getTimeInvestmentFactsCacheDir(pathProvider.getUserDataDir()),
|
|
291
|
+
onProgress: (progress) => parentPort?.postMessage({ type: "progress", progress })
|
|
292
|
+
};
|
|
293
|
+
const snapshot2 = computeTimeInvestmentSnapshot(computeOptions2);
|
|
294
|
+
parentPort.postMessage({ type: "success", snapshot: snapshot2 });
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
166
297
|
const computeOptions = {
|
|
167
298
|
adapter,
|
|
168
299
|
signature: options.signature,
|
|
169
300
|
range: options.range,
|
|
301
|
+
excludedSessionIds: options.excludedSessionIds,
|
|
170
302
|
factsCacheDir: getGlobalInsightFactsCacheDir(pathProvider.getUserDataDir()),
|
|
171
303
|
onProgress: (progress) => parentPort?.postMessage({ type: "progress", progress })
|
|
172
304
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/node-runtime/src/services/global-insight/worker-entry.ts","../../../packages/node-runtime/src/services/global-insight/facts-cache.ts","../../../packages/node-runtime/src/services/global-insight/compute.ts"],"sourcesContent":["import { parentPort, workerData } from 'node:worker_threads'\nimport type { AnnualSummaryRange } 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 { computeAnnualSummarySnapshot, type ComputeAnnualSummarySnapshotOptions } from './compute'\nimport { getGlobalInsightFactsCacheDir } from './paths'\n\ninterface StartupOptions {\n paths: StaticPathProviderSnapshot\n runtimeIdentity?: RuntimeIdentity\n nativeBinding?: string\n signature: string\n range: AnnualSummaryRange\n}\n\nasync function main(): Promise<void> {\n if (!parentPort) throw new Error('annual summary worker requires parentPort')\n const options = workerData as StartupOptions\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 computeOptions: ComputeAnnualSummarySnapshotOptions = {\n adapter,\n signature: options.signature,\n range: options.range,\n factsCacheDir: getGlobalInsightFactsCacheDir(pathProvider.getUserDataDir()),\n onProgress: (progress) => parentPort?.postMessage({ type: 'progress', progress }),\n }\n const snapshot = computeAnnualSummarySnapshot(computeOptions)\n parentPort.postMessage({ type: 'success', snapshot })\n}\n\nmain().catch((error) => {\n parentPort?.postMessage({ type: 'error', error: error instanceof Error ? error.message : String(error) })\n})\n","import type { AnnualSummarySessionFacts } from '@openchatlab/core'\nimport type { AnnualSummaryRange } from '@openchatlab/shared-types'\nimport { getCache, setCache } from '../../cache/session-cache'\nimport { toAnnualSummaryRangeKey } from './time-range'\n\nconst FACTS_FORMAT_VERSION = 1\n\ninterface CachedFactsEntry {\n v: string\n rangeIdentity: string\n data: AnnualSummarySessionFacts\n}\n\nexport type AnnualSummaryFactsCacheReadResult = { hit: true; data: AnnualSummarySessionFacts } | { hit: false }\n\nexport function buildAnnualSummaryFactsCacheKey(algorithmVersion: string, range: AnnualSummaryRange): string {\n return `global-insight:facts:v${FACTS_FORMAT_VERSION}:${algorithmVersion}:${toAnnualSummaryRangeKey(range)}`\n}\n\nexport function readCachedAnnualSummarySessionFacts(\n sessionId: string,\n cacheDir: string,\n key: string,\n dbVersion: string,\n range: AnnualSummaryRange\n): AnnualSummaryFactsCacheReadResult {\n const cached = getCache<CachedFactsEntry>(sessionId, key, cacheDir)\n if (\n !cached ||\n cached.v !== dbVersion ||\n cached.rangeIdentity !== buildFactsRangeIdentity(range) ||\n !isAnnualSummarySessionFacts(cached.data)\n ) {\n return { hit: false }\n }\n return { hit: true, data: cached.data }\n}\n\nexport function writeCachedAnnualSummarySessionFacts(\n sessionId: string,\n cacheDir: string,\n key: string,\n dbVersion: string,\n range: AnnualSummaryRange,\n data: AnnualSummarySessionFacts\n): void {\n setCache<CachedFactsEntry>(\n sessionId,\n key,\n { v: dbVersion, rangeIdentity: buildFactsRangeIdentity(range), data },\n cacheDir\n )\n}\n\nfunction buildFactsRangeIdentity(range: AnnualSummaryRange): string {\n if (range.mode === 'year') return `year:${range.year}`\n return `recent:${toLocalDate(range.startTs)}:${toLocalDate(range.endTs)}`\n}\n\nfunction toLocalDate(ts: number): string {\n const date = new Date(ts * 1000)\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`\n}\n\nfunction isAnnualSummarySessionFacts(value: unknown): value is AnnualSummarySessionFacts {\n if (!value || typeof value !== 'object') return false\n const record = value as Record<string, unknown>\n if (typeof record.kind !== 'string' || !Array.isArray(record.availableDataYears)) return false\n if (record.kind !== 'analyzed') return true\n return (\n isRecord(record.ownerMessagesByDay) &&\n isRecord(record.directContactKeysByDay) &&\n isRecord(record.messageTypeCounts) &&\n isRecord(record.textLengthCounts)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import {\n aggregateAnnualSummaryFacts,\n getAnnualSummarySessionFacts,\n type AnnualSummarySessionFacts,\n} from '@openchatlab/core'\nimport type { AnnualSummaryRange } from '@openchatlab/shared-types'\nimport { getDbFileVersion } from '../../cache/analytics-cache'\nimport { appLogger } from '../../logging/app-logger'\nimport type { SessionRuntimeAdapter } from '../adapters'\nimport {\n buildAnnualSummaryFactsCacheKey,\n readCachedAnnualSummarySessionFacts,\n writeCachedAnnualSummarySessionFacts,\n} from './facts-cache'\nimport { getAnnualSummaryElapsedDayCount } from './time-range'\nimport {\n ANNUAL_SUMMARY_ALGORITHM_VERSION,\n type AnnualSummaryComputeProgress,\n type AnnualSummarySnapshot,\n} from './types'\n\nexport interface ComputeAnnualSummarySnapshotOptions {\n adapter: SessionRuntimeAdapter\n signature: string\n range: AnnualSummaryRange\n factsCacheDir: string\n onProgress?: (progress: AnnualSummaryComputeProgress) => void\n now?: () => number\n}\n\nexport function computeAnnualSummarySnapshot(options: ComputeAnnualSummarySnapshotOptions): AnnualSummarySnapshot {\n const startedAt = options.now?.() ?? Date.now()\n const sessionIds = options.adapter.listSessionIds()\n const facts: AnnualSummarySessionFacts[] = []\n let cacheHits = 0\n let cacheMisses = 0\n const cacheKey = buildAnnualSummaryFactsCacheKey(ANNUAL_SUMMARY_ALGORITHM_VERSION, options.range)\n\n appLogger.info('global-insight', 'annual summary compute started', {\n mode: options.range.mode,\n year: options.range.year,\n totalSessions: sessionIds.length,\n })\n\n for (const [index, sessionId] of sessionIds.entries()) {\n options.onProgress?.({\n processedSessions: index,\n totalSessions: sessionIds.length,\n currentSessionId: sessionId,\n })\n const dbVersion = getDbFileVersion(options.adapter.getDbPath(sessionId))\n const cached = readCachedAnnualSummarySessionFacts(\n sessionId,\n options.factsCacheDir,\n cacheKey,\n dbVersion,\n options.range\n )\n if (cached.hit) {\n cacheHits++\n facts.push(cached.data)\n continue\n }\n\n cacheMisses++\n try {\n const db = options.adapter.openReadonly(sessionId)\n if (!db) {\n facts.push({ kind: 'failed', availableDataYears: [] })\n continue\n }\n const sessionFacts = getAnnualSummarySessionFacts(db, sessionId, options.range)\n facts.push(sessionFacts)\n if (dbVersion === getDbFileVersion(options.adapter.getDbPath(sessionId))) {\n writeCachedAnnualSummarySessionFacts(\n sessionId,\n options.factsCacheDir,\n cacheKey,\n dbVersion,\n options.range,\n sessionFacts\n )\n } else {\n appLogger.debug('global-insight', 'skipped annual summary facts cache write because DB changed')\n }\n } catch (error) {\n facts.push({ kind: 'failed', availableDataYears: [] })\n appLogger.error('global-insight', 'failed to process annual summary session', error)\n }\n }\n\n options.onProgress?.({ processedSessions: sessionIds.length, totalSessions: sessionIds.length })\n const aggregated = aggregateAnnualSummaryFacts(facts, options.range, getAnnualSummaryElapsedDayCount(options.range))\n const finishedAt = options.now?.() ?? Date.now()\n const snapshot: AnnualSummarySnapshot = {\n algorithmVersion: ANNUAL_SUMMARY_ALGORITHM_VERSION,\n signature: options.signature,\n computedAt: finishedAt,\n range: options.range,\n ...aggregated,\n workerStats: {\n durationMs: Math.max(0, finishedAt - startedAt),\n totalSessions: sessionIds.length,\n processedSessions: sessionIds.length,\n cacheHits,\n cacheMisses,\n },\n }\n appLogger.info('global-insight', 'annual summary compute completed', {\n totalSessions: sessionIds.length,\n analyzedSessions: snapshot.coverage.analyzedSessions,\n cacheHits,\n cacheMisses,\n durationMs: snapshot.workerStats.durationMs,\n })\n return snapshot\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/node-runtime/src/services/global-insight/worker-entry.ts","../../../packages/node-runtime/src/services/global-insight/facts-cache.ts","../../../packages/node-runtime/src/services/global-insight/compute.ts","../../../packages/node-runtime/src/services/global-insight/time-investment-facts-cache.ts","../../../packages/node-runtime/src/services/global-insight/time-investment-compute.ts"],"sourcesContent":["import { parentPort, workerData } from 'node:worker_threads'\nimport type { AnnualSummaryRange } 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 { computeAnnualSummarySnapshot, type ComputeAnnualSummarySnapshotOptions } from './compute'\nimport { getGlobalInsightFactsCacheDir } from './paths'\nimport { getTimeInvestmentFactsCacheDir } from './paths'\nimport { computeTimeInvestmentSnapshot, type ComputeTimeInvestmentSnapshotOptions } from './time-investment-compute'\n\ninterface StartupOptions {\n reportType?: 'annual-summary' | 'time-investment'\n paths: StaticPathProviderSnapshot\n runtimeIdentity?: RuntimeIdentity\n nativeBinding?: string\n signature: string\n range: AnnualSummaryRange\n excludedSessionIds: string[]\n}\n\nasync function main(): Promise<void> {\n if (!parentPort) throw new Error('annual summary worker requires parentPort')\n const options = workerData as StartupOptions\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 if (options.reportType === 'time-investment') {\n const computeOptions: ComputeTimeInvestmentSnapshotOptions = {\n adapter,\n signature: options.signature,\n range: options.range,\n excludedSessionIds: options.excludedSessionIds,\n factsCacheDir: getTimeInvestmentFactsCacheDir(pathProvider.getUserDataDir()),\n onProgress: (progress) => parentPort?.postMessage({ type: 'progress', progress }),\n }\n const snapshot = computeTimeInvestmentSnapshot(computeOptions)\n parentPort.postMessage({ type: 'success', snapshot })\n return\n }\n const computeOptions: ComputeAnnualSummarySnapshotOptions = {\n adapter,\n signature: options.signature,\n range: options.range,\n excludedSessionIds: options.excludedSessionIds,\n factsCacheDir: getGlobalInsightFactsCacheDir(pathProvider.getUserDataDir()),\n onProgress: (progress) => parentPort?.postMessage({ type: 'progress', progress }),\n }\n const snapshot = computeAnnualSummarySnapshot(computeOptions)\n parentPort.postMessage({ type: 'success', snapshot })\n}\n\nmain().catch((error) => {\n parentPort?.postMessage({ type: 'error', error: error instanceof Error ? error.message : String(error) })\n})\n","import type { AnnualSummarySessionFacts } from '@openchatlab/core'\nimport type { AnnualSummaryRange } from '@openchatlab/shared-types'\nimport { getCache, setCache } from '../../cache/session-cache'\nimport { toAnnualSummaryRangeKey } from './time-range'\n\nconst FACTS_FORMAT_VERSION = 1\n\ninterface CachedFactsEntry {\n v: string\n rangeIdentity: string\n data: AnnualSummarySessionFacts\n}\n\nexport type AnnualSummaryFactsCacheReadResult = { hit: true; data: AnnualSummarySessionFacts } | { hit: false }\n\nexport function buildAnnualSummaryFactsCacheKey(algorithmVersion: string, range: AnnualSummaryRange): string {\n return `global-insight:facts:v${FACTS_FORMAT_VERSION}:${algorithmVersion}:${toAnnualSummaryRangeKey(range)}`\n}\n\nexport function readCachedAnnualSummarySessionFacts(\n sessionId: string,\n cacheDir: string,\n key: string,\n dbVersion: string,\n range: AnnualSummaryRange\n): AnnualSummaryFactsCacheReadResult {\n const cached = getCache<CachedFactsEntry>(sessionId, key, cacheDir)\n if (\n !cached ||\n cached.v !== dbVersion ||\n cached.rangeIdentity !== buildFactsRangeIdentity(range) ||\n !isAnnualSummarySessionFacts(cached.data)\n ) {\n return { hit: false }\n }\n return { hit: true, data: cached.data }\n}\n\nexport function writeCachedAnnualSummarySessionFacts(\n sessionId: string,\n cacheDir: string,\n key: string,\n dbVersion: string,\n range: AnnualSummaryRange,\n data: AnnualSummarySessionFacts\n): void {\n setCache<CachedFactsEntry>(\n sessionId,\n key,\n { v: dbVersion, rangeIdentity: buildFactsRangeIdentity(range), data },\n cacheDir\n )\n}\n\nfunction buildFactsRangeIdentity(range: AnnualSummaryRange): string {\n if (range.mode === 'year') return `year:${range.year}`\n return `recent:${toLocalDate(range.startTs)}:${toLocalDate(range.endTs)}`\n}\n\nfunction toLocalDate(ts: number): string {\n const date = new Date(ts * 1000)\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`\n}\n\nfunction isAnnualSummarySessionFacts(value: unknown): value is AnnualSummarySessionFacts {\n if (!value || typeof value !== 'object') return false\n const record = value as Record<string, unknown>\n if (typeof record.kind !== 'string' || !Array.isArray(record.availableDataYears)) return false\n if (record.kind !== 'analyzed') return true\n return (\n isRecord(record.ownerMessagesByDay) &&\n isRecord(record.directContactKeysByDay) &&\n isRecord(record.messageTypeCounts) &&\n isRecord(record.textLengthCounts)\n )\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import {\n aggregateAnnualSummaryFacts,\n getAnnualSummarySessionFacts,\n type AnnualSummarySessionFacts,\n} from '@openchatlab/core'\nimport type { AnnualSummaryRange } from '@openchatlab/shared-types'\nimport { getDbFileVersion } from '../../cache/analytics-cache'\nimport { appLogger } from '../../logging/app-logger'\nimport type { SessionRuntimeAdapter } from '../adapters'\nimport {\n buildAnnualSummaryFactsCacheKey,\n readCachedAnnualSummarySessionFacts,\n writeCachedAnnualSummarySessionFacts,\n} from './facts-cache'\nimport { getAnnualSummaryElapsedDayCount } from './time-range'\nimport {\n ANNUAL_SUMMARY_ALGORITHM_VERSION,\n type AnnualSummaryComputeProgress,\n type AnnualSummarySnapshot,\n} from './types'\nimport { listOwnerInsightSessionIds } from './session-scope'\n\nexport interface ComputeAnnualSummarySnapshotOptions {\n adapter: SessionRuntimeAdapter\n signature: string\n range: AnnualSummaryRange\n factsCacheDir: string\n excludedSessionIds?: readonly string[]\n onProgress?: (progress: AnnualSummaryComputeProgress) => void\n now?: () => number\n}\n\nexport function computeAnnualSummarySnapshot(options: ComputeAnnualSummarySnapshotOptions): AnnualSummarySnapshot {\n const startedAt = options.now?.() ?? Date.now()\n const sessionIds = listOwnerInsightSessionIds(options.adapter, options.excludedSessionIds)\n const facts: AnnualSummarySessionFacts[] = []\n let cacheHits = 0\n let cacheMisses = 0\n const cacheKey = buildAnnualSummaryFactsCacheKey(ANNUAL_SUMMARY_ALGORITHM_VERSION, options.range)\n\n appLogger.info('global-insight', 'annual summary compute started', {\n mode: options.range.mode,\n year: options.range.year,\n totalSessions: sessionIds.length,\n })\n\n for (const [index, sessionId] of sessionIds.entries()) {\n options.onProgress?.({\n processedSessions: index,\n totalSessions: sessionIds.length,\n currentSessionId: sessionId,\n })\n const dbVersion = getDbFileVersion(options.adapter.getDbPath(sessionId))\n const cached = readCachedAnnualSummarySessionFacts(\n sessionId,\n options.factsCacheDir,\n cacheKey,\n dbVersion,\n options.range\n )\n if (cached.hit) {\n cacheHits++\n facts.push(cached.data)\n continue\n }\n\n cacheMisses++\n try {\n const db = options.adapter.openReadonly(sessionId)\n if (!db) {\n facts.push({ kind: 'failed', availableDataYears: [] })\n continue\n }\n const sessionFacts = getAnnualSummarySessionFacts(db, sessionId, options.range)\n facts.push(sessionFacts)\n if (dbVersion === getDbFileVersion(options.adapter.getDbPath(sessionId))) {\n writeCachedAnnualSummarySessionFacts(\n sessionId,\n options.factsCacheDir,\n cacheKey,\n dbVersion,\n options.range,\n sessionFacts\n )\n } else {\n appLogger.debug('global-insight', 'skipped annual summary facts cache write because DB changed')\n }\n } catch (error) {\n facts.push({ kind: 'failed', availableDataYears: [] })\n appLogger.error('global-insight', 'failed to process annual summary session', error)\n }\n }\n\n options.onProgress?.({ processedSessions: sessionIds.length, totalSessions: sessionIds.length })\n const aggregated = aggregateAnnualSummaryFacts(facts, options.range, getAnnualSummaryElapsedDayCount(options.range))\n const finishedAt = options.now?.() ?? Date.now()\n const snapshot: AnnualSummarySnapshot = {\n algorithmVersion: ANNUAL_SUMMARY_ALGORITHM_VERSION,\n signature: options.signature,\n computedAt: finishedAt,\n range: options.range,\n ...aggregated,\n workerStats: {\n durationMs: Math.max(0, finishedAt - startedAt),\n totalSessions: sessionIds.length,\n processedSessions: sessionIds.length,\n cacheHits,\n cacheMisses,\n },\n }\n appLogger.info('global-insight', 'annual summary compute completed', {\n totalSessions: sessionIds.length,\n analyzedSessions: snapshot.coverage.analyzedSessions,\n cacheHits,\n cacheMisses,\n durationMs: snapshot.workerStats.durationMs,\n })\n return snapshot\n}\n","import type { TimeInvestmentSessionFacts } from '@openchatlab/core'\nimport type { AnnualSummaryRange } from '@openchatlab/shared-types'\nimport { getCache, setCache } from '../../cache/session-cache'\nimport { toAnnualSummaryRangeKey } from './time-range'\n\nconst FACTS_FORMAT_VERSION = 1\n\ninterface CachedFactsEntry {\n v: string\n rangeIdentity: string\n data: TimeInvestmentSessionFacts\n}\n\nexport type TimeInvestmentFactsCacheReadResult = { hit: true; data: TimeInvestmentSessionFacts } | { hit: false }\n\nexport function buildTimeInvestmentFactsCacheKey(algorithmVersion: string, range: AnnualSummaryRange): string {\n return `global-insight:time-investment:facts:v${FACTS_FORMAT_VERSION}:${algorithmVersion}:${toAnnualSummaryRangeKey(range)}`\n}\n\nexport function readCachedTimeInvestmentSessionFacts(\n sessionId: string,\n cacheDir: string,\n key: string,\n dbVersion: string,\n range: AnnualSummaryRange\n): TimeInvestmentFactsCacheReadResult {\n const cached = getCache<CachedFactsEntry>(sessionId, key, cacheDir)\n if (\n !cached ||\n cached.v !== dbVersion ||\n cached.rangeIdentity !== buildRangeIdentity(range) ||\n !isTimeInvestmentSessionFacts(cached.data)\n ) {\n return { hit: false }\n }\n return { hit: true, data: cached.data }\n}\n\nexport function writeCachedTimeInvestmentSessionFacts(\n sessionId: string,\n cacheDir: string,\n key: string,\n dbVersion: string,\n range: AnnualSummaryRange,\n data: TimeInvestmentSessionFacts\n): void {\n setCache<CachedFactsEntry>(sessionId, key, { v: dbVersion, rangeIdentity: buildRangeIdentity(range), data }, cacheDir)\n}\n\nfunction buildRangeIdentity(range: AnnualSummaryRange): string {\n return `${toAnnualSummaryRangeKey(range)}:${range.startTs}:${range.endTs}`\n}\n\nfunction isTimeInvestmentSessionFacts(value: unknown): value is TimeInvestmentSessionFacts {\n if (!value || typeof value !== 'object') return false\n const record = value as Record<string, unknown>\n if (typeof record.kind !== 'string' || !Array.isArray(record.availableDataYears)) return false\n if (record.kind !== 'analyzed') return true\n return (\n typeof record.sessionId === 'string' &&\n typeof record.sessionName === 'string' &&\n typeof record.platform === 'string' &&\n typeof record.chatType === 'string' &&\n isIntervals(record.investmentIntervals)\n )\n}\n\nfunction isIntervals(value: unknown): boolean {\n return (\n Array.isArray(value) &&\n value.every(\n (item) =>\n item !== null &&\n typeof item === 'object' &&\n typeof (item as Record<string, unknown>).startTs === 'number' &&\n typeof (item as Record<string, unknown>).endTs === 'number'\n )\n )\n}\n","import {\n aggregateTimeInvestmentFacts,\n getTimeInvestmentSessionFacts,\n type TimeInvestmentSessionFacts,\n} from '@openchatlab/core'\nimport type { AnnualSummaryRange } from '@openchatlab/shared-types'\nimport { getDbFileVersion } from '../../cache/analytics-cache'\nimport { appLogger } from '../../logging/app-logger'\nimport type { SessionRuntimeAdapter } from '../adapters'\nimport {\n buildTimeInvestmentFactsCacheKey,\n readCachedTimeInvestmentSessionFacts,\n writeCachedTimeInvestmentSessionFacts,\n} from './time-investment-facts-cache'\nimport { TIME_INVESTMENT_ALGORITHM_VERSION, type TimeInvestmentSnapshot } from './time-investment-types'\nimport type { AnnualSummaryComputeProgress } from './types'\nimport { listOwnerInsightSessionIds } from './session-scope'\n\nexport interface ComputeTimeInvestmentSnapshotOptions {\n adapter: SessionRuntimeAdapter\n signature: string\n range: AnnualSummaryRange\n factsCacheDir: string\n excludedSessionIds?: readonly string[]\n onProgress?: (progress: AnnualSummaryComputeProgress) => void\n now?: () => number\n}\n\nexport function computeTimeInvestmentSnapshot(options: ComputeTimeInvestmentSnapshotOptions): TimeInvestmentSnapshot {\n const startedAt = options.now?.() ?? Date.now()\n const sessionIds = listOwnerInsightSessionIds(options.adapter, options.excludedSessionIds)\n const facts: TimeInvestmentSessionFacts[] = []\n let cacheHits = 0\n let cacheMisses = 0\n const cacheKey = buildTimeInvestmentFactsCacheKey(TIME_INVESTMENT_ALGORITHM_VERSION, options.range)\n\n appLogger.info('global-insight', 'time investment compute started', {\n mode: options.range.mode,\n year: options.range.year,\n totalSessions: sessionIds.length,\n })\n\n for (const [index, sessionId] of sessionIds.entries()) {\n options.onProgress?.({ processedSessions: index, totalSessions: sessionIds.length, currentSessionId: sessionId })\n const dbPath = options.adapter.getDbPath(sessionId)\n const dbVersion = getDbFileVersion(dbPath)\n const cached = readCachedTimeInvestmentSessionFacts(\n sessionId,\n options.factsCacheDir,\n cacheKey,\n dbVersion,\n options.range\n )\n if (cached.hit) {\n cacheHits++\n facts.push(cached.data)\n continue\n }\n\n cacheMisses++\n try {\n const db = options.adapter.openReadonly(sessionId)\n if (!db) {\n facts.push({ kind: 'failed', availableDataYears: [] })\n continue\n }\n const sessionFacts = getTimeInvestmentSessionFacts(db, sessionId, options.range)\n facts.push(sessionFacts)\n if (dbVersion === getDbFileVersion(dbPath)) {\n writeCachedTimeInvestmentSessionFacts(\n sessionId,\n options.factsCacheDir,\n cacheKey,\n dbVersion,\n options.range,\n sessionFacts\n )\n } else {\n appLogger.debug('global-insight', 'skipped time investment facts cache write because DB changed')\n }\n } catch (error) {\n facts.push({ kind: 'failed', availableDataYears: [] })\n appLogger.error('global-insight', 'failed to process time investment session', error)\n }\n }\n\n options.onProgress?.({ processedSessions: sessionIds.length, totalSessions: sessionIds.length })\n const aggregated = aggregateTimeInvestmentFacts(facts, options.range)\n const finishedAt = options.now?.() ?? Date.now()\n const snapshot: TimeInvestmentSnapshot = {\n algorithmVersion: TIME_INVESTMENT_ALGORITHM_VERSION,\n signature: options.signature,\n computedAt: finishedAt,\n range: options.range,\n ...aggregated,\n workerStats: {\n durationMs: Math.max(0, finishedAt - startedAt),\n totalSessions: sessionIds.length,\n processedSessions: sessionIds.length,\n cacheHits,\n cacheMisses,\n },\n }\n appLogger.info('global-insight', 'time investment compute completed', {\n totalSessions: sessionIds.length,\n analyzedSessions: snapshot.coverage.analyzedSessions,\n cacheHits,\n cacheMisses,\n durationMs: snapshot.workerStats.durationMs,\n })\n return snapshot\n}\n"],"mappings":"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","names":["FACTS_FORMAT_VERSION","computeOptions","snapshot"]}
|
|
@@ -9,21 +9,21 @@ 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-2JPFBIAG.mjs";
|
|
13
|
+
import "./chunk-R73XMAB2.mjs";
|
|
14
|
+
import "./chunk-X2QBH24F.mjs";
|
|
15
|
+
import "./chunk-6QP47LID.mjs";
|
|
16
16
|
import "./chunk-5FGB42EQ.mjs";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-67HNPYZJ.mjs";
|
|
18
|
+
import "./chunk-5MJO4AJB.mjs";
|
|
19
19
|
import "./chunk-5ADKYYNA.mjs";
|
|
20
20
|
import "./chunk-FJ35V3TE.mjs";
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-NFTCEJBJ.mjs";
|
|
22
|
+
import "./chunk-FJOGBUXU.mjs";
|
|
23
|
+
import "./chunk-JOVL7OTW.mjs";
|
|
24
|
+
import "./chunk-NQHZPSW2.mjs";
|
|
25
|
+
import "./chunk-YKMQLAVP.mjs";
|
|
26
|
+
import "./chunk-Q3NEL2KK.mjs";
|
|
27
27
|
import "./chunk-VSOWNKPA.mjs";
|
|
28
28
|
export {
|
|
29
29
|
createServer,
|
|
@@ -31,4 +31,4 @@ export {
|
|
|
31
31
|
startHttpServer,
|
|
32
32
|
stopHttpServer
|
|
33
33
|
};
|
|
34
|
-
//# sourceMappingURL=http-
|
|
34
|
+
//# sourceMappingURL=http-5RVY5J5U.mjs.map
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
autoImportBatch,
|
|
14
14
|
incrementalImport,
|
|
15
15
|
streamImport
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-67HNPYZJ.mjs";
|
|
17
|
+
import "./chunk-NFTCEJBJ.mjs";
|
|
18
18
|
import {
|
|
19
19
|
detectAllFormats,
|
|
20
20
|
detectFormat,
|
|
@@ -22,11 +22,11 @@ import {
|
|
|
22
22
|
getFormatFeatureById,
|
|
23
23
|
getSupportedFormats,
|
|
24
24
|
scanMultiChatFile
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
29
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-FJOGBUXU.mjs";
|
|
26
|
+
import "./chunk-JOVL7OTW.mjs";
|
|
27
|
+
import "./chunk-NQHZPSW2.mjs";
|
|
28
|
+
import "./chunk-YKMQLAVP.mjs";
|
|
29
|
+
import "./chunk-Q3NEL2KK.mjs";
|
|
30
30
|
import "./chunk-VSOWNKPA.mjs";
|
|
31
31
|
export {
|
|
32
32
|
analyzeAutoImport,
|
|
@@ -43,4 +43,4 @@ export {
|
|
|
43
43
|
scanMultiChatFile,
|
|
44
44
|
streamImport
|
|
45
45
|
};
|
|
46
|
-
//# sourceMappingURL=import-
|
|
46
|
+
//# sourceMappingURL=import-ILTWVHKU.mjs.map
|
package/dist/index.mjs
CHANGED
|
@@ -7,24 +7,24 @@ 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-2JPFBIAG.mjs";
|
|
11
|
+
import "./chunk-R73XMAB2.mjs";
|
|
12
|
+
import "./chunk-X2QBH24F.mjs";
|
|
13
13
|
import {
|
|
14
14
|
run
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-L7TIIVAY.mjs";
|
|
16
|
+
import "./chunk-6QP47LID.mjs";
|
|
17
17
|
import "./chunk-5FGB42EQ.mjs";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-67HNPYZJ.mjs";
|
|
19
|
+
import "./chunk-5MJO4AJB.mjs";
|
|
20
20
|
import "./chunk-5ADKYYNA.mjs";
|
|
21
21
|
import "./chunk-FJ35V3TE.mjs";
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-NFTCEJBJ.mjs";
|
|
23
|
+
import "./chunk-FJOGBUXU.mjs";
|
|
24
|
+
import "./chunk-JOVL7OTW.mjs";
|
|
25
|
+
import "./chunk-NQHZPSW2.mjs";
|
|
26
|
+
import "./chunk-YKMQLAVP.mjs";
|
|
27
|
+
import "./chunk-Q3NEL2KK.mjs";
|
|
28
28
|
import "./chunk-VSOWNKPA.mjs";
|
|
29
29
|
export {
|
|
30
30
|
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-X2QBH24F.mjs";
|
|
11
11
|
import {
|
|
12
12
|
assertCliDataDirCompatible
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-5MJO4AJB.mjs";
|
|
14
14
|
import {
|
|
15
15
|
getVersion
|
|
16
16
|
} from "./chunk-5ADKYYNA.mjs";
|
|
@@ -20,11 +20,11 @@ import {
|
|
|
20
20
|
import {
|
|
21
21
|
NodePathProvider,
|
|
22
22
|
hasPendingElectronDataWarning
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-NFTCEJBJ.mjs";
|
|
24
|
+
import "./chunk-FJOGBUXU.mjs";
|
|
25
|
+
import "./chunk-JOVL7OTW.mjs";
|
|
26
|
+
import "./chunk-NQHZPSW2.mjs";
|
|
27
|
+
import "./chunk-YKMQLAVP.mjs";
|
|
28
28
|
import {
|
|
29
29
|
DatabaseManager,
|
|
30
30
|
getDatabaseSchema,
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
getSessionOverview,
|
|
33
33
|
loadConfig,
|
|
34
34
|
verifyCliDataPath
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-Q3NEL2KK.mjs";
|
|
36
36
|
import "./chunk-VSOWNKPA.mjs";
|
|
37
37
|
|
|
38
38
|
// src/mcp.ts
|
|
@@ -416,4 +416,4 @@ export {
|
|
|
416
416
|
initMcpRuntime,
|
|
417
417
|
startCliMcpServer
|
|
418
418
|
};
|
|
419
|
-
//# sourceMappingURL=mcp-
|
|
419
|
+
//# sourceMappingURL=mcp-Y2YXOFB4.mjs.map
|
|
@@ -6,14 +6,14 @@ const __filename = __fileURLToPath(import.meta.url);
|
|
|
6
6
|
const __dirname = __pathDirname(__filename);
|
|
7
7
|
import {
|
|
8
8
|
computePeopleRelationshipsSnapshot
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-NQHZPSW2.mjs";
|
|
10
10
|
import {
|
|
11
11
|
DatabaseManager,
|
|
12
12
|
StaticPathProvider,
|
|
13
13
|
createDatabaseManagerAdapter,
|
|
14
14
|
getPeopleRelationshipsFactsCacheDir,
|
|
15
15
|
initAppLogger
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-Q3NEL2KK.mjs";
|
|
17
17
|
import "./chunk-VSOWNKPA.mjs";
|
|
18
18
|
|
|
19
19
|
// ../../packages/node-runtime/src/services/people/relationships/worker-entry.ts
|
|
@@ -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-JNGURHDM.mjs");
|
|
13
13
|
const runtime = createSemanticIndexWorkerRuntime({
|
|
14
14
|
serviceFactory: createSemanticIndexWorkerServiceFactory(startup)
|
|
15
15
|
});
|
|
@@ -43,7 +43,7 @@ function buildPlist(options) {
|
|
|
43
43
|
const port = options.port ?? 3110;
|
|
44
44
|
const host = options.host ?? "127.0.0.1";
|
|
45
45
|
const cliEntry = resolveCliPath("bin/chatlab.mjs");
|
|
46
|
-
const args = ["
|
|
46
|
+
const args = ["web", "--no-open", "--port", String(port), "--host", host];
|
|
47
47
|
if (options.token) args.push("--token", options.token);
|
|
48
48
|
if (options.headless) args.push("--headless");
|
|
49
49
|
if (options.requireAuth) args.push("--require-auth");
|
|
@@ -111,7 +111,7 @@ ChatLab is now running as a system service`);
|
|
|
111
111
|
console.log(` Logs: ${LOG_FILE}`);
|
|
112
112
|
console.log(` Service: ${SERVICE_LABEL} (launchd)`);
|
|
113
113
|
console.log(`
|
|
114
|
-
Auto-starts on login. Use \`
|
|
114
|
+
Auto-starts on login. Use \`clb stop\` to remove.
|
|
115
115
|
`);
|
|
116
116
|
}
|
|
117
117
|
function uninstallMacos() {
|
|
@@ -147,7 +147,7 @@ function buildUnit(options) {
|
|
|
147
147
|
const port = options.port ?? 3110;
|
|
148
148
|
const host = options.host ?? "127.0.0.1";
|
|
149
149
|
const cliEntry = resolveCliPath("bin/chatlab.mjs");
|
|
150
|
-
const args = ["
|
|
150
|
+
const args = ["web", "--no-open", "--port", String(port), "--host", host];
|
|
151
151
|
if (options.token) args.push("--token", options.token);
|
|
152
152
|
if (options.headless) args.push("--headless");
|
|
153
153
|
if (options.requireAuth) args.push("--require-auth");
|
|
@@ -186,7 +186,7 @@ ChatLab is now running as a system service`);
|
|
|
186
186
|
console.log(` Logs: ${LOG_FILE}`);
|
|
187
187
|
console.log(` Unit: ${SYSTEMD_SERVICE} (systemd)`);
|
|
188
188
|
console.log(`
|
|
189
|
-
Auto-starts on login. Use \`
|
|
189
|
+
Auto-starts on login. Use \`clb stop\` to remove.
|
|
190
190
|
`);
|
|
191
191
|
}
|
|
192
192
|
function uninstallLinux() {
|
|
@@ -227,7 +227,7 @@ function serviceInstall(options) {
|
|
|
227
227
|
return installLinux(options);
|
|
228
228
|
default:
|
|
229
229
|
console.error("Windows is not yet supported for daemon mode.");
|
|
230
|
-
console.error("Please use `
|
|
230
|
+
console.error("Please use `clb web` to run in the foreground instead.");
|
|
231
231
|
process.exit(1);
|
|
232
232
|
}
|
|
233
233
|
}
|
|
@@ -257,4 +257,4 @@ export {
|
|
|
257
257
|
serviceInstall,
|
|
258
258
|
serviceUninstall
|
|
259
259
|
};
|
|
260
|
-
//# sourceMappingURL=service-
|
|
260
|
+
//# sourceMappingURL=service-ZAHXRSFD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/daemon/service.ts"],"sourcesContent":["/**\n * System service management — register ChatLab as a launchd (macOS) or\n * systemd --user (Linux) service for auto-start on login and crash recovery.\n *\n * macOS : ~/Library/LaunchAgents/fun.chatlab.daemon.plist\n * Linux : ~/.config/systemd/user/chatlab.service\n * Meta : ~/.chatlab/daemon.json { port, host, installedAt }\n */\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\nimport { execSync } from 'child_process'\nimport { resolveCliPath } from '../paths'\n\nconst SERVICE_LABEL = 'fun.chatlab.daemon'\nconst PLIST_PATH = path.join(os.homedir(), 'Library', 'LaunchAgents', `${SERVICE_LABEL}.plist`)\nconst SYSTEMD_DIR = path.join(os.homedir(), '.config', 'systemd', 'user')\nconst SYSTEMD_SERVICE = path.join(SYSTEMD_DIR, 'chatlab.service')\nconst SYSTEM_DIR = path.join(os.homedir(), '.chatlab')\nconst LOG_FILE = path.join(SYSTEM_DIR, 'logs', 'daemon.log')\nconst META_FILE = path.join(SYSTEM_DIR, 'daemon.json')\n\ninterface DaemonMeta {\n port: number\n host: string\n installedAt: string\n}\n\nfunction writeMeta(meta: DaemonMeta): void {\n fs.mkdirSync(SYSTEM_DIR, { recursive: true })\n fs.writeFileSync(META_FILE, JSON.stringify(meta, null, 2))\n}\n\nfunction readMeta(): DaemonMeta | null {\n try {\n if (!fs.existsSync(META_FILE)) return null\n return JSON.parse(fs.readFileSync(META_FILE, 'utf-8')) as DaemonMeta\n } catch {\n return null\n }\n}\n\nfunction removeMeta(): void {\n try {\n fs.unlinkSync(META_FILE)\n } catch {\n // already removed, ignore\n }\n}\n\n// ── Public types ──────────────────────────────────────────────────────\n\nexport interface ServiceInstallOptions {\n port?: number\n host?: string\n token?: string\n headless?: boolean\n requireAuth?: boolean\n}\n\nexport interface ServiceStatus {\n installed: boolean\n running: boolean\n port?: number\n host?: string\n}\n\n// ── macOS (launchd) ───────────────────────────────────────────────────\n\nfunction buildPlist(options: ServiceInstallOptions): string {\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n const cliEntry = resolveCliPath('bin/chatlab.mjs')\n const args = ['web', '--no-open', '--port', String(port), '--host', host]\n if (options.token) args.push('--token', options.token)\n if (options.headless) args.push('--headless')\n if (options.requireAuth) args.push('--require-auth')\n\n const programArgs = [process.execPath, cliEntry, ...args].map((a) => ` <string>${a}</string>`).join('\\n')\n\n fs.mkdirSync(path.join(SYSTEM_DIR, 'logs'), { recursive: true })\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${SERVICE_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n${programArgs}\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${LOG_FILE}</string>\n <key>StandardErrorPath</key>\n <string>${LOG_FILE}</string>\n</dict>\n</plist>\n`\n}\n\nfunction getUid(): string {\n return execSync('id -u', { encoding: 'utf-8' }).trim()\n}\n\nfunction launchctlLoad(plistPath: string): void {\n try {\n execSync(`launchctl bootstrap gui/${getUid()} \"${plistPath}\"`, { stdio: 'pipe' })\n } catch {\n try {\n execSync(`launchctl load \"${plistPath}\"`, { stdio: 'pipe' })\n } catch (err) {\n throw new Error(`launchctl load failed: ${err instanceof Error ? err.message : err}`)\n }\n }\n}\n\nfunction launchctlUnload(plistPath: string): void {\n try {\n execSync(`launchctl bootout gui/${getUid()}/${SERVICE_LABEL}`, { stdio: 'pipe' })\n } catch {\n try {\n execSync(`launchctl unload \"${plistPath}\"`, { stdio: 'pipe' })\n } catch {\n // already unloaded, ignore\n }\n }\n}\n\nfunction installMacos(options: ServiceInstallOptions): void {\n fs.mkdirSync(path.dirname(PLIST_PATH), { recursive: true })\n\n if (fs.existsSync(PLIST_PATH)) {\n launchctlUnload(PLIST_PATH)\n }\n\n fs.writeFileSync(PLIST_PATH, buildPlist(options))\n launchctlLoad(PLIST_PATH)\n\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n writeMeta({ port, host, installedAt: new Date().toISOString() })\n\n console.log(`\\nChatLab is now running as a system service`)\n console.log(` API: http://${host}:${port}`)\n console.log(` Logs: ${LOG_FILE}`)\n console.log(` Service: ${SERVICE_LABEL} (launchd)`)\n console.log(`\\nAuto-starts on login. Use \\`clb stop\\` to remove.\\n`)\n}\n\nfunction uninstallMacos(): void {\n if (!fs.existsSync(PLIST_PATH)) {\n console.log('No system service found.')\n removeMeta()\n return\n }\n launchctlUnload(PLIST_PATH)\n fs.unlinkSync(PLIST_PATH)\n removeMeta()\n console.log(`ChatLab system service removed.`)\n}\n\nfunction statusMacos(): ServiceStatus {\n if (!fs.existsSync(PLIST_PATH)) return { installed: false, running: false }\n let running = false\n try {\n const out = execSync(`launchctl list | grep ${SERVICE_LABEL}`, {\n encoding: 'utf-8',\n stdio: 'pipe',\n }).trim()\n // launchctl list: PID Status Label — PID is '-' when not running\n running = out.length > 0 && !out.startsWith('-')\n } catch {\n running = false\n }\n const meta = readMeta()\n return { installed: true, running, port: meta?.port, host: meta?.host }\n}\n\n// ── Linux (systemd --user) ────────────────────────────────────────────\n\nfunction escapeSystemdArg(arg: string): string {\n return '\"' + arg.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') + '\"'\n}\n\nfunction buildUnit(options: ServiceInstallOptions): string {\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n const cliEntry = resolveCliPath('bin/chatlab.mjs')\n const args = ['web', '--no-open', '--port', String(port), '--host', host]\n if (options.token) args.push('--token', options.token)\n if (options.headless) args.push('--headless')\n if (options.requireAuth) args.push('--require-auth')\n const execStart = [process.execPath, cliEntry, ...args].map(escapeSystemdArg).join(' ')\n\n return `[Unit]\nDescription=ChatLab daemon\nAfter=network.target\n\n[Service]\nExecStart=${execStart}\nRestart=always\nRestartSec=5\nStandardOutput=append:${LOG_FILE}\nStandardError=append:${LOG_FILE}\n\n[Install]\nWantedBy=default.target\n`\n}\n\nfunction installLinux(options: ServiceInstallOptions): void {\n fs.mkdirSync(SYSTEMD_DIR, { recursive: true })\n fs.mkdirSync(path.join(SYSTEM_DIR, 'logs'), { recursive: true })\n\n fs.writeFileSync(SYSTEMD_SERVICE, buildUnit(options))\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' })\n execSync('systemctl --user enable --now chatlab.service', { stdio: 'pipe' })\n } catch (err) {\n throw new Error(`systemctl failed: ${err instanceof Error ? err.message : err}`)\n }\n\n const port = options.port ?? 3110\n const host = options.host ?? '127.0.0.1'\n writeMeta({ port, host, installedAt: new Date().toISOString() })\n\n console.log(`\\nChatLab is now running as a system service`)\n console.log(` API: http://${host}:${port}`)\n console.log(` Logs: ${LOG_FILE}`)\n console.log(` Unit: ${SYSTEMD_SERVICE} (systemd)`)\n console.log(`\\nAuto-starts on login. Use \\`clb stop\\` to remove.\\n`)\n}\n\nfunction uninstallLinux(): void {\n if (!fs.existsSync(SYSTEMD_SERVICE)) {\n console.log('No system service found.')\n removeMeta()\n return\n }\n try {\n execSync('systemctl --user disable --now chatlab.service', { stdio: 'pipe' })\n } catch {\n // already stopped\n }\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'pipe' })\n } catch {\n // ignore\n }\n fs.unlinkSync(SYSTEMD_SERVICE)\n removeMeta()\n console.log(`ChatLab system service removed.`)\n}\n\nfunction statusLinux(): ServiceStatus {\n if (!fs.existsSync(SYSTEMD_SERVICE)) return { installed: false, running: false }\n let running = false\n try {\n execSync('systemctl --user is-active --quiet chatlab.service', { stdio: 'pipe' })\n running = true\n } catch {\n running = false\n }\n const meta = readMeta()\n return { installed: true, running, port: meta?.port, host: meta?.host }\n}\n\n// ── Public API ────────────────────────────────────────────────────────\n\nexport function serviceInstall(options: ServiceInstallOptions): void {\n switch (process.platform) {\n case 'darwin':\n return installMacos(options)\n case 'linux':\n return installLinux(options)\n default:\n console.error('Windows is not yet supported for daemon mode.')\n console.error('Please use `clb web` to run in the foreground instead.')\n process.exit(1)\n }\n}\n\nexport function serviceUninstall(): void {\n switch (process.platform) {\n case 'darwin':\n return uninstallMacos()\n case 'linux':\n return uninstallLinux()\n default:\n console.error('Windows is not yet supported for daemon mode.')\n process.exit(1)\n }\n}\n\nexport function getServiceStatus(): ServiceStatus {\n switch (process.platform) {\n case 'darwin':\n return statusMacos()\n case 'linux':\n return statusLinux()\n default:\n return { installed: false, running: false }\n }\n}\n"],"mappings":";;;;;;;;;;;;AASA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,gBAAgB;AAGzB,IAAM,gBAAgB;AACtB,IAAM,aAAkB,UAAQ,WAAQ,GAAG,WAAW,gBAAgB,GAAG,aAAa,QAAQ;AAC9F,IAAM,cAAmB,UAAQ,WAAQ,GAAG,WAAW,WAAW,MAAM;AACxE,IAAM,kBAAuB,UAAK,aAAa,iBAAiB;AAChE,IAAM,aAAkB,UAAQ,WAAQ,GAAG,UAAU;AACrD,IAAM,WAAgB,UAAK,YAAY,QAAQ,YAAY;AAC3D,IAAM,YAAiB,UAAK,YAAY,aAAa;AAQrD,SAAS,UAAU,MAAwB;AACzC,EAAG,aAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAG,iBAAc,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3D;AAEA,SAAS,WAA8B;AACrC,MAAI;AACF,QAAI,CAAI,cAAW,SAAS,EAAG,QAAO;AACtC,WAAO,KAAK,MAAS,gBAAa,WAAW,OAAO,CAAC;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAmB;AAC1B,MAAI;AACF,IAAG,cAAW,SAAS;AAAA,EACzB,QAAQ;AAAA,EAER;AACF;AAqBA,SAAS,WAAW,SAAwC;AAC1D,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,WAAW,eAAe,iBAAiB;AACjD,QAAM,OAAO,CAAC,OAAO,aAAa,UAAU,OAAO,IAAI,GAAG,UAAU,IAAI;AACxE,MAAI,QAAQ,MAAO,MAAK,KAAK,WAAW,QAAQ,KAAK;AACrD,MAAI,QAAQ,SAAU,MAAK,KAAK,YAAY;AAC5C,MAAI,QAAQ,YAAa,MAAK,KAAK,gBAAgB;AAEnD,QAAM,cAAc,CAAC,QAAQ,UAAU,UAAU,GAAG,IAAI,EAAE,IAAI,CAAC,MAAM,eAAe,CAAC,WAAW,EAAE,KAAK,IAAI;AAE3G,EAAG,aAAe,UAAK,YAAY,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAE/D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKG,aAAa;AAAA;AAAA;AAAA,EAGvB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOD,QAAQ;AAAA;AAAA,YAER,QAAQ;AAAA;AAAA;AAAA;AAIpB;AAEA,SAAS,SAAiB;AACxB,SAAO,SAAS,SAAS,EAAE,UAAU,QAAQ,CAAC,EAAE,KAAK;AACvD;AAEA,SAAS,cAAc,WAAyB;AAC9C,MAAI;AACF,aAAS,2BAA2B,OAAO,CAAC,KAAK,SAAS,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,EAClF,QAAQ;AACN,QAAI;AACF,eAAS,mBAAmB,SAAS,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IAC7D,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,0BAA0B,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAAA,IACtF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,WAAyB;AAChD,MAAI;AACF,aAAS,yBAAyB,OAAO,CAAC,IAAI,aAAa,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EAClF,QAAQ;AACN,QAAI;AACF,eAAS,qBAAqB,SAAS,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IAC/D,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,aAAa,SAAsC;AAC1D,EAAG,aAAe,aAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAE1D,MAAO,cAAW,UAAU,GAAG;AAC7B,oBAAgB,UAAU;AAAA,EAC5B;AAEA,EAAG,iBAAc,YAAY,WAAW,OAAO,CAAC;AAChD,gBAAc,UAAU;AAExB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,YAAU,EAAE,MAAM,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAE/D,UAAQ,IAAI;AAAA,2CAA8C;AAC1D,UAAQ,IAAI,qBAAqB,IAAI,IAAI,IAAI,EAAE;AAC/C,UAAQ,IAAI,cAAc,QAAQ,EAAE;AACpC,UAAQ,IAAI,cAAc,aAAa,YAAY;AACnD,UAAQ,IAAI;AAAA;AAAA,CAAuD;AACrE;AAEA,SAAS,iBAAuB;AAC9B,MAAI,CAAI,cAAW,UAAU,GAAG;AAC9B,YAAQ,IAAI,0BAA0B;AACtC,eAAW;AACX;AAAA,EACF;AACA,kBAAgB,UAAU;AAC1B,EAAG,cAAW,UAAU;AACxB,aAAW;AACX,UAAQ,IAAI,iCAAiC;AAC/C;AAEA,SAAS,cAA6B;AACpC,MAAI,CAAI,cAAW,UAAU,EAAG,QAAO,EAAE,WAAW,OAAO,SAAS,MAAM;AAC1E,MAAI,UAAU;AACd,MAAI;AACF,UAAM,MAAM,SAAS,yBAAyB,aAAa,IAAI;AAAA,MAC7D,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC,EAAE,KAAK;AAER,cAAU,IAAI,SAAS,KAAK,CAAC,IAAI,WAAW,GAAG;AAAA,EACjD,QAAQ;AACN,cAAU;AAAA,EACZ;AACA,QAAM,OAAO,SAAS;AACtB,SAAO,EAAE,WAAW,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AACxE;AAIA,SAAS,iBAAiB,KAAqB;AAC7C,SAAO,MAAM,IAAI,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,IAAI;AACjE;AAEA,SAAS,UAAU,SAAwC;AACzD,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,WAAW,eAAe,iBAAiB;AACjD,QAAM,OAAO,CAAC,OAAO,aAAa,UAAU,OAAO,IAAI,GAAG,UAAU,IAAI;AACxE,MAAI,QAAQ,MAAO,MAAK,KAAK,WAAW,QAAQ,KAAK;AACrD,MAAI,QAAQ,SAAU,MAAK,KAAK,YAAY;AAC5C,MAAI,QAAQ,YAAa,MAAK,KAAK,gBAAgB;AACnD,QAAM,YAAY,CAAC,QAAQ,UAAU,UAAU,GAAG,IAAI,EAAE,IAAI,gBAAgB,EAAE,KAAK,GAAG;AAEtF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKG,SAAS;AAAA;AAAA;AAAA,wBAGG,QAAQ;AAAA,uBACT,QAAQ;AAAA;AAAA;AAAA;AAAA;AAK/B;AAEA,SAAS,aAAa,SAAsC;AAC1D,EAAG,aAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC7C,EAAG,aAAe,UAAK,YAAY,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAE/D,EAAG,iBAAc,iBAAiB,UAAU,OAAO,CAAC;AAEpD,MAAI;AACF,aAAS,kCAAkC,EAAE,OAAO,OAAO,CAAC;AAC5D,aAAS,iDAAiD,EAAE,OAAO,OAAO,CAAC;AAAA,EAC7E,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,qBAAqB,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE;AAAA,EACjF;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,YAAU,EAAE,MAAM,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAE/D,UAAQ,IAAI;AAAA,2CAA8C;AAC1D,UAAQ,IAAI,kBAAkB,IAAI,IAAI,IAAI,EAAE;AAC5C,UAAQ,IAAI,WAAW,QAAQ,EAAE;AACjC,UAAQ,IAAI,WAAW,eAAe,YAAY;AAClD,UAAQ,IAAI;AAAA;AAAA,CAAuD;AACrE;AAEA,SAAS,iBAAuB;AAC9B,MAAI,CAAI,cAAW,eAAe,GAAG;AACnC,YAAQ,IAAI,0BAA0B;AACtC,eAAW;AACX;AAAA,EACF;AACA,MAAI;AACF,aAAS,kDAAkD,EAAE,OAAO,OAAO,CAAC;AAAA,EAC9E,QAAQ;AAAA,EAER;AACA,MAAI;AACF,aAAS,kCAAkC,EAAE,OAAO,OAAO,CAAC;AAAA,EAC9D,QAAQ;AAAA,EAER;AACA,EAAG,cAAW,eAAe;AAC7B,aAAW;AACX,UAAQ,IAAI,iCAAiC;AAC/C;AAEA,SAAS,cAA6B;AACpC,MAAI,CAAI,cAAW,eAAe,EAAG,QAAO,EAAE,WAAW,OAAO,SAAS,MAAM;AAC/E,MAAI,UAAU;AACd,MAAI;AACF,aAAS,sDAAsD,EAAE,OAAO,OAAO,CAAC;AAChF,cAAU;AAAA,EACZ,QAAQ;AACN,cAAU;AAAA,EACZ;AACA,QAAM,OAAO,SAAS;AACtB,SAAO,EAAE,WAAW,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AACxE;AAIO,SAAS,eAAe,SAAsC;AACnE,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,aAAa,OAAO;AAAA,IAC7B,KAAK;AACH,aAAO,aAAa,OAAO;AAAA,IAC7B;AACE,cAAQ,MAAM,+CAA+C;AAC7D,cAAQ,MAAM,wDAAwD;AACtE,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEO,SAAS,mBAAyB;AACvC,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,eAAe;AAAA,IACxB,KAAK;AACH,aAAO,eAAe;AAAA,IACxB;AACE,cAAQ,MAAM,+CAA+C;AAC7D,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEO,SAAS,mBAAkC;AAChD,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,YAAY;AAAA,IACrB,KAAK;AACH,aAAO,YAAY;AAAA,IACrB;AACE,aAAO,EAAE,WAAW,OAAO,SAAS,MAAM;AAAA,EAC9C;AACF;","names":[]}
|