chatlab-cli 0.35.0 → 0.36.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.
Files changed (185) hide show
  1. package/dist/{chat-command-24RYGJAS.mjs → chat-command-SXW67RF7.mjs} +9 -9
  2. package/dist/{chunk-4GWWKHWA.mjs → chunk-4YPNYQSP.mjs} +672 -7064
  3. package/dist/chunk-4YPNYQSP.mjs.map +1 -0
  4. package/dist/{chunk-KXDJ7N6N.mjs → chunk-AAGDVTP2.mjs} +2 -2
  5. package/dist/{chunk-7IGBPZMI.mjs → chunk-BSGLH6G3.mjs} +163 -36
  6. package/dist/chunk-BSGLH6G3.mjs.map +1 -0
  7. package/dist/{chunk-ZBPPLXM4.mjs → chunk-CNEWMCGX.mjs} +18 -18
  8. package/dist/{chunk-QKEARRFH.mjs → chunk-GVW3BDGZ.mjs} +3 -3
  9. package/dist/{chunk-BRZ6YIBR.mjs → chunk-JHON5FN7.mjs} +2 -2
  10. package/dist/{chunk-DEFEU567.mjs → chunk-LZGOIRLV.mjs} +8 -10
  11. package/dist/{chunk-DEFEU567.mjs.map → chunk-LZGOIRLV.mjs.map} +1 -1
  12. package/dist/chunk-OWOEWZIC.mjs +19072 -0
  13. package/dist/chunk-OWOEWZIC.mjs.map +1 -0
  14. package/dist/{chunk-DC7IUDNV.mjs → chunk-U2NXHIJK.mjs} +27 -9
  15. package/dist/chunk-U2NXHIJK.mjs.map +1 -0
  16. package/dist/{chunk-U36TQMAF.mjs → chunk-UNIKQFI5.mjs} +2 -2
  17. package/dist/{chunk-GQMCDWZQ.mjs → chunk-VDWI4A4U.mjs} +2 -2
  18. package/dist/{chunk-KIMJXKZO.mjs → chunk-XDF6PMVZ.mjs} +2 -2
  19. package/dist/chunk-YKMQLAVP.mjs +25 -0
  20. package/dist/chunk-YKMQLAVP.mjs.map +1 -0
  21. package/dist/cli.mjs +10 -10
  22. package/dist/contacts-worker.mjs +2 -2
  23. package/dist/global-insight-worker.mjs +136 -4
  24. package/dist/global-insight-worker.mjs.map +1 -1
  25. package/dist/{http-3K4YMWDE.mjs → http-LVOGJFDL.mjs} +13 -13
  26. package/dist/{import-D4LV565A.mjs → import-7OU57ZHM.mjs} +8 -8
  27. package/dist/index.mjs +13 -13
  28. package/dist/{mcp-KL22FKQ2.mjs → mcp-CUKHTTII.mjs} +9 -9
  29. package/dist/people-relationships-worker.mjs +2 -2
  30. package/dist/semantic-index-worker.mjs +1 -1
  31. package/dist/{src-COIB6Z4P.mjs → src-LORFXAUE.mjs} +120 -98
  32. package/dist/{stream-import-FSXCFG4M.mjs → stream-import-7YUWIAD6.mjs} +8 -8
  33. package/dist/{worker-runtime-DPS2LURI.mjs → worker-runtime-GQ5SY7E3.mjs} +6 -6
  34. package/dist-cli-web/assets/AISettingsTab-BmhNcUEh.js +1 -0
  35. package/dist-cli-web/assets/AboutTab-CFklrZt8.js +1 -0
  36. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-B-dIPvcs.js +110 -0
  37. package/dist-cli-web/assets/Alert-DJzXKcec.js +1 -0
  38. package/dist-cli-web/assets/{ApiSettingsTab-CtXl4I28.js → ApiSettingsTab-DvDm421U.js} +1 -1
  39. package/dist-cli-web/assets/BatchManageTab-DhIDH3Q1.js +1 -0
  40. package/dist-cli-web/assets/{BufferResource-BXSJADxx.js → BufferResource-DY3P-dGs.js} +1 -1
  41. package/dist-cli-web/assets/{CanvasRenderer-Cq--8UQ_.js → CanvasRenderer-As2MJTWZ.js} +1 -1
  42. package/dist-cli-web/assets/ChatRecordDrawer-DHdas7Jp.js +1 -0
  43. package/dist-cli-web/assets/ChatRecordWorkspace-CVDPBmcl.js +11 -0
  44. package/dist-cli-web/assets/ChatRecordWorkspace-D_oJMtqh.css +1 -0
  45. package/dist-cli-web/assets/Checkbox-4F1WAuVF.js +1 -0
  46. package/dist-cli-web/assets/DataDirCleanupNotice-jebQ9il3.js +1 -0
  47. package/dist-cli-web/assets/{DatePicker.vue_vue_type_script_setup_true_lang-C4CsoIlq.js → DatePicker.vue_vue_type_script_setup_true_lang-Cal624eP.js} +1 -1
  48. package/dist-cli-web/assets/DebugToolsPanel-BLU6SY8a.js +1 -0
  49. package/dist-cli-web/assets/EChart.vue_vue_type_script_setup_true_lang-CsgJ-Xn3.js +1 -0
  50. package/dist-cli-web/assets/EChartLine.vue_vue_type_script_setup_true_lang-BYhukELX.js +1 -0
  51. package/dist-cli-web/assets/{EChartWordcloud-KV0MdsDE.js → EChartWordcloud-C16xh7Tx.js} +1 -1
  52. package/dist-cli-web/assets/{Filter-DVaqcFmI.js → Filter-BEtPORqF.js} +1 -1
  53. package/dist-cli-web/assets/GlobalTaskBar-BvNmFO7q.js +1 -0
  54. package/dist-cli-web/assets/GroupRelationshipGalaxyView-DEUIrvgz.js +1 -0
  55. package/dist-cli-web/assets/Label-Dgl3ghzT.js +1 -0
  56. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-CwDIA0UP.js +1 -0
  57. package/dist-cli-web/assets/{MessageExportModal-BozaR9UZ.js → MessageExportModal-DYjhBuzO.js} +1 -1
  58. package/dist-cli-web/assets/PageHeader-CL9AFfvl.js +1 -0
  59. package/dist-cli-web/assets/PageTabs.vue_vue_type_script_setup_true_lang-C22kOxIK.js +1 -0
  60. package/dist-cli-web/assets/{RelationshipGalaxyCanvas-6EamagxG.js → RelationshipGalaxyCanvas-BnkcrIpk.js} +3 -3
  61. package/dist-cli-web/assets/{RelationshipGalaxyThreeCanvas-B6GB4PWS.js → RelationshipGalaxyThreeCanvas-CqdqveEJ.js} +1 -1
  62. package/dist-cli-web/assets/{RenderTargetSystem-mYuj4uBS.js → RenderTargetSystem-CPwnC2X3.js} +1 -1
  63. package/dist-cli-web/assets/{RovingFocusItem-B2y6BG1a.js → RovingFocusItem-j33Nsbbn.js} +1 -1
  64. package/dist-cli-web/assets/ScreenCaptureModal-ByKxzNQe.js +1 -0
  65. package/dist-cli-web/assets/{SectionTabs.vue_vue_type_script_setup_true_lang-ueEF4zHE.js → SectionTabs.vue_vue_type_script_setup_true_lang-C6EHKB_i.js} +1 -1
  66. package/dist-cli-web/assets/Select-jVtfc_xc.js +1 -0
  67. package/dist-cli-web/assets/SettingsModal-Dg27piEO.js +2 -0
  68. package/dist-cli-web/assets/StorageTab-QdcDqA6Q.js +1 -0
  69. package/dist-cli-web/assets/Switch-DYHM64k9.js +1 -0
  70. package/dist-cli-web/assets/Tabs-B6Nzq2NQ.js +1 -0
  71. package/dist-cli-web/assets/{Tabs-Dqwkh3Ea.js → Tabs-CRZdCcU4.js} +1 -1
  72. package/dist-cli-web/assets/{ThemeCard.vue_vue_type_script_setup_true_lang-DPIvbq75.js → ThemeCard.vue_vue_type_script_setup_true_lang-Bsq7gpC0.js} +1 -1
  73. package/dist-cli-web/assets/{TimeSelect.vue_vue_type_script_setup_true_lang-dEdo6CqM.js → TimeSelect.vue_vue_type_script_setup_true_lang-BLpQds4F.js} +1 -1
  74. package/dist-cli-web/assets/{VisuallyHiddenInput-BOdkR_GC.js → VisuallyHiddenInput-IQpmK9yR.js} +1 -1
  75. package/dist-cli-web/assets/{WebGLRenderer-BB8ukBI_.js → WebGLRenderer-8JHbnkTc.js} +1 -1
  76. package/dist-cli-web/assets/{WebGPURenderer-DDOzF1Kc.js → WebGPURenderer-CLWfB4CC.js} +1 -1
  77. package/dist-cli-web/assets/{aiChat-CzFSFuOJ.js → aiChat-4JvxWGXZ.js} +6 -6
  78. package/dist-cli-web/assets/base-D6fxqD_X.js +1 -0
  79. package/dist-cli-web/assets/{browserAll-BRqlnNxq.js → browserAll-Cin6ghNg.js} +1 -1
  80. package/dist-cli-web/assets/{cli-web-ClAJ6Tao.js → cli-web-D7IBc3AX.js} +1 -1
  81. package/dist-cli-web/assets/{dateFormat-DXuDxIye.js → dateFormat-Bu4-Ux3L.js} +1 -1
  82. package/dist-cli-web/assets/{fetch-CGu53cxT.js → fetch-1NiXh-_B.js} +1 -1
  83. package/dist-cli-web/assets/{fetch-q480XYZQ.js → fetch-2QEQPA9q.js} +8 -5
  84. package/dist-cli-web/assets/fetch-B2agy1hy.js +1 -0
  85. package/dist-cli-web/assets/{fetch-LY-yerw1.js → fetch-B7kuohCt.js} +1 -1
  86. package/dist-cli-web/assets/{fetch-Dy38lkAa.js → fetch-BR71C0K9.js} +1 -1
  87. package/dist-cli-web/assets/{fetch-CP1afnT0.js → fetch-Bk-7vxHV.js} +1 -1
  88. package/dist-cli-web/assets/fetch-C8tTTsCm.js +1 -0
  89. package/dist-cli-web/assets/{fetch-DijSOvop.js → fetch-CuUeyk0N.js} +1 -1
  90. package/dist-cli-web/assets/{fetch-DzKlTaLz.js → fetch-DPRDSI39.js} +1 -1
  91. package/dist-cli-web/assets/{fetch-Bcy2T8Fe.js → fetch-OnnCjzee.js} +1 -1
  92. package/dist-cli-web/assets/{fetch-DWAIk_6_.js → fetch-_CN1EVMt.js} +1 -1
  93. package/dist-cli-web/assets/index-B4J99zv3.css +1 -0
  94. package/dist-cli-web/assets/index-BBeqtL8d.css +1 -0
  95. package/dist-cli-web/assets/{index-Di6FmCdk.js → index-BCEk6ZpL.js} +9 -9
  96. package/dist-cli-web/assets/{index-CNzv7aBW.js → index-BIHFuCJK.js} +1 -1
  97. package/dist-cli-web/assets/index-BUz_Vl9U.js +2 -0
  98. package/dist-cli-web/assets/index-BWZIoPV3.css +1 -0
  99. package/dist-cli-web/assets/index-BYQV3OA5.js +1 -0
  100. package/dist-cli-web/assets/index-CVVv_6qu.js +2 -0
  101. package/dist-cli-web/assets/index-CacwXQL4.js +1 -0
  102. package/dist-cli-web/assets/{index-BRV_D8dv.js → index-Colc58j-.js} +1 -1
  103. package/dist-cli-web/assets/index-DImo7TQN.js +1 -0
  104. package/dist-cli-web/assets/index-DV9zQVPV.js +137 -0
  105. package/dist-cli-web/assets/index-DXKS-q-w.css +1 -0
  106. package/dist-cli-web/assets/index-DZc5A4_J.js +1 -0
  107. package/dist-cli-web/assets/index-DkWTvE7d.js +36 -0
  108. package/dist-cli-web/assets/index-DmEn0PAI.js +1 -0
  109. package/dist-cli-web/assets/index-b9eEQeVt.js +1 -0
  110. package/dist-cli-web/assets/index-waDxab2e.css +1 -0
  111. package/dist-cli-web/assets/insight-time-range-MJxLEu6o.js +1 -0
  112. package/dist-cli-web/assets/{people-page-header-Bh3KXD4g.js → people-page-header-DNPjaSt4.js} +1 -1
  113. package/dist-cli-web/assets/{prompt-DcAcgQiB.js → prompt-BgywZQ_g.js} +1 -1
  114. package/dist-cli-web/assets/{semantic-index-config-builder-CK6v64Y1.js → semantic-index-config-builder-bji_UxYE.js} +1 -1
  115. package/dist-cli-web/assets/{service-YZnJyEMq.js → service-DpU9fa-l.js} +1 -1
  116. package/dist-cli-web/assets/{useFormControl-B-aXrJZN.js → useFormControl-De24E2zT.js} +1 -1
  117. package/dist-cli-web/assets/useTable-C7BH94MF.js +1 -0
  118. package/dist-cli-web/assets/{useToast-B36MzFFy.js → useToast-CxhJkhXK.js} +1 -1
  119. package/dist-cli-web/assets/{webworkerAll-Dwqmy_YO.js → webworkerAll-BRnv6GvJ.js} +1 -1
  120. package/dist-cli-web/index.html +2 -2
  121. package/package.json +1 -1
  122. package/dist/chunk-22YJOBA3.mjs +0 -9826
  123. package/dist/chunk-22YJOBA3.mjs.map +0 -1
  124. package/dist/chunk-4GWWKHWA.mjs.map +0 -1
  125. package/dist/chunk-7IGBPZMI.mjs.map +0 -1
  126. package/dist/chunk-DC7IUDNV.mjs.map +0 -1
  127. package/dist/chunk-QZCNVAH6.mjs +0 -14
  128. package/dist/chunk-QZCNVAH6.mjs.map +0 -1
  129. package/dist-cli-web/assets/AISettingsTab-rQC2ocFH.js +0 -1
  130. package/dist-cli-web/assets/AboutTab-DMPziKjj.js +0 -1
  131. package/dist-cli-web/assets/ActionToolsPanel.vue_vue_type_script_setup_true_lang-CnRLt_1j.js +0 -110
  132. package/dist-cli-web/assets/Alert--bTQXRcZ.js +0 -1
  133. package/dist-cli-web/assets/BatchManageTab-1KaCPweN.js +0 -1
  134. package/dist-cli-web/assets/ChatRecordDrawer-BC0F7ok1.js +0 -11
  135. package/dist-cli-web/assets/ChatRecordDrawer-Tt6UduRC.css +0 -1
  136. package/dist-cli-web/assets/Checkbox-CwajNPGF.js +0 -1
  137. package/dist-cli-web/assets/DataDirCleanupNotice-D0Oruka2.js +0 -1
  138. package/dist-cli-web/assets/DebugToolsPanel-DVDwS-wz.js +0 -1
  139. package/dist-cli-web/assets/GlobalTaskBar-DpPMX0jx.js +0 -1
  140. package/dist-cli-web/assets/GroupRelationshipGalaxyView-CLnO3phW.js +0 -1
  141. package/dist-cli-web/assets/Label-Bt2U4lGy.js +0 -1
  142. package/dist-cli-web/assets/LoadingState.vue_vue_type_script_setup_true_lang-Cnshyn0f.js +0 -1
  143. package/dist-cli-web/assets/PageHeader-CEe0xTl3.js +0 -1
  144. package/dist-cli-web/assets/PageTabs.vue_vue_type_script_setup_true_lang-D2DZrrnv.js +0 -1
  145. package/dist-cli-web/assets/ScreenCaptureModal-BvAtSNNR.js +0 -1
  146. package/dist-cli-web/assets/Select-Cm4I8u9n.js +0 -1
  147. package/dist-cli-web/assets/SettingsModal-Cwshzj7i.js +0 -2
  148. package/dist-cli-web/assets/StorageTab-D7HzH16Y.js +0 -1
  149. package/dist-cli-web/assets/Switch-BVw4e_19.js +0 -1
  150. package/dist-cli-web/assets/Tabs-OrJkANIA.js +0 -1
  151. package/dist-cli-web/assets/annual-summary-time-range-CmrAqcuj.js +0 -1
  152. package/dist-cli-web/assets/base-CawUl6ET.js +0 -1
  153. package/dist-cli-web/assets/fetch-3_xX8Yi8.js +0 -1
  154. package/dist-cli-web/assets/index-0dp58uL4.css +0 -1
  155. package/dist-cli-web/assets/index-1X7zdLgJ.css +0 -1
  156. package/dist-cli-web/assets/index-4enwdBcq.css +0 -1
  157. package/dist-cli-web/assets/index-AudHHbMs.js +0 -1
  158. package/dist-cli-web/assets/index-CF4DTbvD.js +0 -1
  159. package/dist-cli-web/assets/index-CMLoht5R.js +0 -1
  160. package/dist-cli-web/assets/index-CMPHZH6B.css +0 -1
  161. package/dist-cli-web/assets/index-CXUTiy-V.js +0 -1
  162. package/dist-cli-web/assets/index-D5m0P4ss.js +0 -36
  163. package/dist-cli-web/assets/index-DkOrt7_X.js +0 -2
  164. package/dist-cli-web/assets/index-Dlb6fC68.js +0 -1
  165. package/dist-cli-web/assets/index-IA7YUjQX.js +0 -2
  166. package/dist-cli-web/assets/index-ZsZwPLWy.css +0 -1
  167. package/dist-cli-web/assets/index-kzU381y1.js +0 -1
  168. package/dist-cli-web/assets/index-z8Vogc-b.js +0 -137
  169. package/dist-cli-web/assets/lazy-overlay-visibility-Bd9ZFOgR.js +0 -1
  170. package/dist-cli-web/assets/member-select-utils-BXZ3oHct.js +0 -1
  171. package/dist-cli-web/assets/useTable-DPEMaGby.js +0 -1
  172. /package/dist/{chat-command-24RYGJAS.mjs.map → chat-command-SXW67RF7.mjs.map} +0 -0
  173. /package/dist/{chunk-KXDJ7N6N.mjs.map → chunk-AAGDVTP2.mjs.map} +0 -0
  174. /package/dist/{chunk-ZBPPLXM4.mjs.map → chunk-CNEWMCGX.mjs.map} +0 -0
  175. /package/dist/{chunk-QKEARRFH.mjs.map → chunk-GVW3BDGZ.mjs.map} +0 -0
  176. /package/dist/{chunk-BRZ6YIBR.mjs.map → chunk-JHON5FN7.mjs.map} +0 -0
  177. /package/dist/{chunk-U36TQMAF.mjs.map → chunk-UNIKQFI5.mjs.map} +0 -0
  178. /package/dist/{chunk-GQMCDWZQ.mjs.map → chunk-VDWI4A4U.mjs.map} +0 -0
  179. /package/dist/{chunk-KIMJXKZO.mjs.map → chunk-XDF6PMVZ.mjs.map} +0 -0
  180. /package/dist/{http-3K4YMWDE.mjs.map → http-LVOGJFDL.mjs.map} +0 -0
  181. /package/dist/{import-D4LV565A.mjs.map → import-7OU57ZHM.mjs.map} +0 -0
  182. /package/dist/{mcp-KL22FKQ2.mjs.map → mcp-CUKHTTII.mjs.map} +0 -0
  183. /package/dist/{src-COIB6Z4P.mjs.map → src-LORFXAUE.mjs.map} +0 -0
  184. /package/dist/{stream-import-FSXCFG4M.mjs.map → stream-import-7YUWIAD6.mjs.map} +0 -0
  185. /package/dist/{worker-runtime-DPS2LURI.mjs.map → worker-runtime-GQ5SY7E3.mjs.map} +0 -0
@@ -6,14 +6,14 @@ const __filename = __fileURLToPath(import.meta.url);
6
6
  const __dirname = __pathDirname(__filename);
7
7
  import {
8
8
  computeContactsSnapshot
9
- } from "./chunk-KIMJXKZO.mjs";
9
+ } from "./chunk-XDF6PMVZ.mjs";
10
10
  import {
11
11
  DatabaseManager,
12
12
  StaticPathProvider,
13
13
  createDatabaseManagerAdapter,
14
14
  getContactsFactsCacheDir,
15
15
  initAppLogger
16
- } from "./chunk-22YJOBA3.mjs";
16
+ } from "./chunk-OWOEWZIC.mjs";
17
17
  import "./chunk-VSOWNKPA.mjs";
18
18
 
19
19
  // ../../packages/node-runtime/src/services/contacts/worker-entry.ts
@@ -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
- } from "./chunk-QZCNVAH6.mjs";
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-22YJOBA3.mjs";
29
+ } from "./chunk-OWOEWZIC.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.listSessionIds();
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-7IGBPZMI.mjs";
13
- import "./chunk-DEFEU567.mjs";
14
- import "./chunk-BRZ6YIBR.mjs";
15
- import "./chunk-U36TQMAF.mjs";
12
+ } from "./chunk-BSGLH6G3.mjs";
13
+ import "./chunk-LZGOIRLV.mjs";
14
+ import "./chunk-JHON5FN7.mjs";
15
+ import "./chunk-UNIKQFI5.mjs";
16
16
  import "./chunk-5FGB42EQ.mjs";
17
- import "./chunk-QKEARRFH.mjs";
18
- import "./chunk-GQMCDWZQ.mjs";
17
+ import "./chunk-GVW3BDGZ.mjs";
18
+ import "./chunk-VDWI4A4U.mjs";
19
19
  import "./chunk-5ADKYYNA.mjs";
20
20
  import "./chunk-FJ35V3TE.mjs";
21
- import "./chunk-DC7IUDNV.mjs";
22
- import "./chunk-4GWWKHWA.mjs";
23
- import "./chunk-KIMJXKZO.mjs";
24
- import "./chunk-KXDJ7N6N.mjs";
25
- import "./chunk-QZCNVAH6.mjs";
26
- import "./chunk-22YJOBA3.mjs";
21
+ import "./chunk-U2NXHIJK.mjs";
22
+ import "./chunk-4YPNYQSP.mjs";
23
+ import "./chunk-XDF6PMVZ.mjs";
24
+ import "./chunk-AAGDVTP2.mjs";
25
+ import "./chunk-YKMQLAVP.mjs";
26
+ import "./chunk-OWOEWZIC.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-3K4YMWDE.mjs.map
34
+ //# sourceMappingURL=http-LVOGJFDL.mjs.map
@@ -13,8 +13,8 @@ import {
13
13
  autoImportBatch,
14
14
  incrementalImport,
15
15
  streamImport
16
- } from "./chunk-QKEARRFH.mjs";
17
- import "./chunk-DC7IUDNV.mjs";
16
+ } from "./chunk-GVW3BDGZ.mjs";
17
+ import "./chunk-U2NXHIJK.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-4GWWKHWA.mjs";
26
- import "./chunk-KIMJXKZO.mjs";
27
- import "./chunk-KXDJ7N6N.mjs";
28
- import "./chunk-QZCNVAH6.mjs";
29
- import "./chunk-22YJOBA3.mjs";
25
+ } from "./chunk-4YPNYQSP.mjs";
26
+ import "./chunk-XDF6PMVZ.mjs";
27
+ import "./chunk-AAGDVTP2.mjs";
28
+ import "./chunk-YKMQLAVP.mjs";
29
+ import "./chunk-OWOEWZIC.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-D4LV565A.mjs.map
46
+ //# sourceMappingURL=import-7OU57ZHM.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-7IGBPZMI.mjs";
11
- import "./chunk-DEFEU567.mjs";
12
- import "./chunk-BRZ6YIBR.mjs";
10
+ } from "./chunk-BSGLH6G3.mjs";
11
+ import "./chunk-LZGOIRLV.mjs";
12
+ import "./chunk-JHON5FN7.mjs";
13
13
  import {
14
14
  run
15
- } from "./chunk-ZBPPLXM4.mjs";
16
- import "./chunk-U36TQMAF.mjs";
15
+ } from "./chunk-CNEWMCGX.mjs";
16
+ import "./chunk-UNIKQFI5.mjs";
17
17
  import "./chunk-5FGB42EQ.mjs";
18
- import "./chunk-QKEARRFH.mjs";
19
- import "./chunk-GQMCDWZQ.mjs";
18
+ import "./chunk-GVW3BDGZ.mjs";
19
+ import "./chunk-VDWI4A4U.mjs";
20
20
  import "./chunk-5ADKYYNA.mjs";
21
21
  import "./chunk-FJ35V3TE.mjs";
22
- import "./chunk-DC7IUDNV.mjs";
23
- import "./chunk-4GWWKHWA.mjs";
24
- import "./chunk-KIMJXKZO.mjs";
25
- import "./chunk-KXDJ7N6N.mjs";
26
- import "./chunk-QZCNVAH6.mjs";
27
- import "./chunk-22YJOBA3.mjs";
22
+ import "./chunk-U2NXHIJK.mjs";
23
+ import "./chunk-4YPNYQSP.mjs";
24
+ import "./chunk-XDF6PMVZ.mjs";
25
+ import "./chunk-AAGDVTP2.mjs";
26
+ import "./chunk-YKMQLAVP.mjs";
27
+ import "./chunk-OWOEWZIC.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-BRZ6YIBR.mjs";
10
+ } from "./chunk-JHON5FN7.mjs";
11
11
  import {
12
12
  assertCliDataDirCompatible
13
- } from "./chunk-GQMCDWZQ.mjs";
13
+ } from "./chunk-VDWI4A4U.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-DC7IUDNV.mjs";
24
- import "./chunk-4GWWKHWA.mjs";
25
- import "./chunk-KIMJXKZO.mjs";
26
- import "./chunk-KXDJ7N6N.mjs";
27
- import "./chunk-QZCNVAH6.mjs";
23
+ } from "./chunk-U2NXHIJK.mjs";
24
+ import "./chunk-4YPNYQSP.mjs";
25
+ import "./chunk-XDF6PMVZ.mjs";
26
+ import "./chunk-AAGDVTP2.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-22YJOBA3.mjs";
35
+ } from "./chunk-OWOEWZIC.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-KL22FKQ2.mjs.map
419
+ //# sourceMappingURL=mcp-CUKHTTII.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-KXDJ7N6N.mjs";
9
+ } from "./chunk-AAGDVTP2.mjs";
10
10
  import {
11
11
  DatabaseManager,
12
12
  StaticPathProvider,
13
13
  createDatabaseManagerAdapter,
14
14
  getPeopleRelationshipsFactsCacheDir,
15
15
  initAppLogger
16
- } from "./chunk-22YJOBA3.mjs";
16
+ } from "./chunk-OWOEWZIC.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-DPS2LURI.mjs");
12
+ const { createSemanticIndexWorkerRuntime, createSemanticIndexWorkerServiceFactory } = await import("./worker-runtime-GQ5SY7E3.mjs");
13
13
  const runtime = createSemanticIndexWorkerRuntime({
14
14
  serviceFactory: createSemanticIndexWorkerServiceFactory(startup)
15
15
  });