@vybestack/llxprt-code-core 0.11.0 → 0.12.0-nightly.260910.2aac6841e

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 (417) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/prompt-config/defaults/default-prompts.json +3 -3
  5. package/dist/src/config/agentClientLifecycle.d.ts +4 -3
  6. package/dist/src/config/agentClientLifecycle.js +27 -14
  7. package/dist/src/config/agentClientLifecycle.js.map +1 -1
  8. package/dist/src/config/config.d.ts +2 -5
  9. package/dist/src/config/config.js +10 -23
  10. package/dist/src/config/config.js.map +1 -1
  11. package/dist/src/config/configBase.d.ts +5 -1
  12. package/dist/src/config/configBase.js +27 -6
  13. package/dist/src/config/configBase.js.map +1 -1
  14. package/dist/src/config/configBaseCore.d.ts +26 -8
  15. package/dist/src/config/configBaseCore.js +30 -26
  16. package/dist/src/config/configBaseCore.js.map +1 -1
  17. package/dist/src/config/configMcpRuntime.d.ts +16 -0
  18. package/dist/src/config/configMcpRuntime.js +31 -0
  19. package/dist/src/config/configMcpRuntime.js.map +1 -0
  20. package/dist/src/config/configMediaDefaults.d.ts +10 -0
  21. package/dist/src/config/configMediaDefaults.js +17 -0
  22. package/dist/src/config/configMediaDefaults.js.map +1 -0
  23. package/dist/src/config/configTestHarness.d.ts +4 -0
  24. package/dist/src/config/configTypes.d.ts +4 -54
  25. package/dist/src/config/configTypes.js +6 -82
  26. package/dist/src/config/configTypes.js.map +1 -1
  27. package/dist/src/config/index.d.ts +1 -2
  28. package/dist/src/config/index.js +1 -2
  29. package/dist/src/config/index.js.map +1 -1
  30. package/dist/src/config/models.d.ts +0 -4
  31. package/dist/src/config/models.js +0 -4
  32. package/dist/src/config/models.js.map +1 -1
  33. package/dist/src/config/toolRegistryFactory.d.ts +2 -2
  34. package/dist/src/core/clientContract.d.ts +4 -6
  35. package/dist/src/core/compression/transcriptPathNotice.d.ts +22 -0
  36. package/dist/src/core/compression/transcriptPathNotice.js +29 -0
  37. package/dist/src/core/compression/transcriptPathNotice.js.map +1 -0
  38. package/dist/src/core/contentGenerator.d.ts +2 -5
  39. package/dist/src/core/contentGenerator.js +10 -24
  40. package/dist/src/core/contentGenerator.js.map +1 -1
  41. package/dist/src/core/logger.d.ts +66 -0
  42. package/dist/src/core/logger.js +345 -30
  43. package/dist/src/core/logger.js.map +1 -1
  44. package/dist/src/core/prompts.d.ts +0 -1
  45. package/dist/src/core/prompts.js +5 -79
  46. package/dist/src/core/prompts.js.map +1 -1
  47. package/dist/src/core/turn.d.ts +3 -3
  48. package/dist/src/hooks/hookTranslator.js +5 -4
  49. package/dist/src/hooks/hookTranslator.js.map +1 -1
  50. package/dist/src/index.d.ts +8 -6
  51. package/dist/src/index.js +8 -6
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/src/llm-types/index.d.ts +1 -1
  54. package/dist/src/llm-types/modelEnvelope.d.ts +2 -1
  55. package/dist/src/llm-types/modelEnvelope.js +17 -1
  56. package/dist/src/llm-types/modelEnvelope.js.map +1 -1
  57. package/dist/src/models/schema.d.ts +40 -40
  58. package/dist/src/policy/policies/read-only.toml +0 -5
  59. package/dist/src/prompt-config/TemplateEngine.js +0 -3
  60. package/dist/src/prompt-config/TemplateEngine.js.map +1 -1
  61. package/dist/src/prompt-config/defaults/providers/gemini/core.md +0 -2
  62. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +0 -2
  63. package/dist/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +0 -2
  64. package/dist/src/prompt-config/prompt-loader.d.ts +1 -1
  65. package/dist/src/prompt-config/prompt-loader.js +4 -4
  66. package/dist/src/prompt-config/prompt-loader.js.map +1 -1
  67. package/dist/src/prompt-config/types.d.ts +0 -1
  68. package/dist/src/recording/CheckpointService.d.ts +4 -0
  69. package/dist/src/recording/CheckpointService.js +67 -46
  70. package/dist/src/recording/CheckpointService.js.map +1 -1
  71. package/dist/src/recording/HistoryMutationService.d.ts +1 -1
  72. package/dist/src/recording/HistoryMutationService.js +27 -4
  73. package/dist/src/recording/HistoryMutationService.js.map +1 -1
  74. package/dist/src/recording/RecordingIntegration.d.ts +36 -2
  75. package/dist/src/recording/RecordingIntegration.js +224 -7
  76. package/dist/src/recording/RecordingIntegration.js.map +1 -1
  77. package/dist/src/recording/ReplayEngine.d.ts +8 -10
  78. package/dist/src/recording/ReplayEngine.js +161 -95
  79. package/dist/src/recording/ReplayEngine.js.map +1 -1
  80. package/dist/src/recording/SessionDiscovery.d.ts +4 -2
  81. package/dist/src/recording/SessionDiscovery.js +13 -5
  82. package/dist/src/recording/SessionDiscovery.js.map +1 -1
  83. package/dist/src/recording/SessionRecordingService.d.ts +23 -3
  84. package/dist/src/recording/SessionRecordingService.js +209 -51
  85. package/dist/src/recording/SessionRecordingService.js.map +1 -1
  86. package/dist/src/recording/SessionTransitionService.d.ts +7 -0
  87. package/dist/src/recording/SessionTransitionService.js +66 -13
  88. package/dist/src/recording/SessionTransitionService.js.map +1 -1
  89. package/dist/src/recording/index.d.ts +1 -0
  90. package/dist/src/recording/index.js +1 -0
  91. package/dist/src/recording/index.js.map +1 -1
  92. package/dist/src/recording/janitor/cleanupTypes.d.ts +3 -0
  93. package/dist/src/recording/janitor/cleanupTypes.js.map +1 -1
  94. package/dist/src/recording/janitor/mediaReclamation.d.ts +23 -0
  95. package/dist/src/recording/janitor/mediaReclamation.js +195 -0
  96. package/dist/src/recording/janitor/mediaReclamation.js.map +1 -0
  97. package/dist/src/recording/janitor/sessionJanitor.js +47 -1
  98. package/dist/src/recording/janitor/sessionJanitor.js.map +1 -1
  99. package/dist/src/recording/janitor/sessionScanner.d.ts +12 -9
  100. package/dist/src/recording/janitor/sessionScanner.js +248 -193
  101. package/dist/src/recording/janitor/sessionScanner.js.map +1 -1
  102. package/dist/src/recording/replay-test-helpers.d.ts +10 -1
  103. package/dist/src/recording/replay-test-helpers.js +24 -2
  104. package/dist/src/recording/replay-test-helpers.js.map +1 -1
  105. package/dist/src/recording/replayCheckpointMetadata.d.ts +28 -0
  106. package/dist/src/recording/replayCheckpointMetadata.js +96 -0
  107. package/dist/src/recording/replayCheckpointMetadata.js.map +1 -0
  108. package/dist/src/recording/replayErrorFormatting.d.ts +6 -0
  109. package/dist/src/recording/replayErrorFormatting.js +38 -0
  110. package/dist/src/recording/replayErrorFormatting.js.map +1 -0
  111. package/dist/src/recording/resumeSession.d.ts +3 -0
  112. package/dist/src/recording/resumeSession.js +7 -1
  113. package/dist/src/recording/resumeSession.js.map +1 -1
  114. package/dist/src/recording/semanticMediaPurgeReplayValidation.d.ts +14 -0
  115. package/dist/src/recording/semanticMediaPurgeReplayValidation.js +24 -0
  116. package/dist/src/recording/semanticMediaPurgeReplayValidation.js.map +1 -0
  117. package/dist/src/recording/session-media-package-blobs.d.ts +8 -0
  118. package/dist/src/recording/session-media-package-blobs.js +72 -0
  119. package/dist/src/recording/session-media-package-blobs.js.map +1 -0
  120. package/dist/src/recording/session-media-package-import.d.ts +26 -0
  121. package/dist/src/recording/session-media-package-import.js +124 -0
  122. package/dist/src/recording/session-media-package-import.js.map +1 -0
  123. package/dist/src/recording/session-media-package-state.d.ts +19 -0
  124. package/dist/src/recording/session-media-package-state.js +56 -0
  125. package/dist/src/recording/session-media-package-state.js.map +1 -0
  126. package/dist/src/recording/session-media-package-validation.d.ts +59 -0
  127. package/dist/src/recording/session-media-package-validation.js +286 -0
  128. package/dist/src/recording/session-media-package-validation.js.map +1 -0
  129. package/dist/src/recording/session-media-package-writer.d.ts +18 -0
  130. package/dist/src/recording/session-media-package-writer.js +70 -0
  131. package/dist/src/recording/session-media-package-writer.js.map +1 -0
  132. package/dist/src/recording/session-media-package.d.ts +27 -0
  133. package/dist/src/recording/session-media-package.js +366 -0
  134. package/dist/src/recording/session-media-package.js.map +1 -0
  135. package/dist/src/recording/types.d.ts +34 -2
  136. package/dist/src/recording/types.js.map +1 -1
  137. package/dist/src/runtime/AgentRuntimeContext.d.ts +22 -5
  138. package/dist/src/runtime/AgentRuntimeLoader.d.ts +6 -0
  139. package/dist/src/runtime/AgentRuntimeLoader.js +25 -6
  140. package/dist/src/runtime/AgentRuntimeLoader.js.map +1 -1
  141. package/dist/src/runtime/contracts/PromptEstimation.d.ts +1 -0
  142. package/dist/src/runtime/contracts/PromptEstimation.js.map +1 -1
  143. package/dist/src/runtime/contracts/RuntimeProvider.d.ts +3 -2
  144. package/dist/src/runtime/contracts/RuntimeProviderManager.d.ts +0 -2
  145. package/dist/src/runtime/createAgentRuntimeContext.js +28 -1
  146. package/dist/src/runtime/createAgentRuntimeContext.js.map +1 -1
  147. package/dist/src/runtime/providerRuntimeContext.d.ts +12 -0
  148. package/dist/src/runtime/providerRuntimeContext.js +3 -0
  149. package/dist/src/runtime/providerRuntimeContext.js.map +1 -1
  150. package/dist/src/runtime/runtimeAdapters.js +2 -2
  151. package/dist/src/runtime/runtimeAdapters.js.map +1 -1
  152. package/dist/src/services/history/ContentConverters.d.ts +11 -7
  153. package/dist/src/services/history/ContentConverters.js +11 -7
  154. package/dist/src/services/history/ContentConverters.js.map +1 -1
  155. package/dist/src/services/history/HistoryService.d.ts +18 -180
  156. package/dist/src/services/history/HistoryService.js +53 -523
  157. package/dist/src/services/history/HistoryService.js.map +1 -1
  158. package/dist/src/services/history/HistoryServiceCore.d.ts +278 -0
  159. package/dist/src/services/history/HistoryServiceCore.js +727 -0
  160. package/dist/src/services/history/HistoryServiceCore.js.map +1 -0
  161. package/dist/src/services/history/IContent.d.ts +118 -16
  162. package/dist/src/services/history/IContent.js +284 -4
  163. package/dist/src/services/history/IContent.js.map +1 -1
  164. package/dist/src/services/history/contentSize.js +22 -2
  165. package/dist/src/services/history/contentSize.js.map +1 -1
  166. package/dist/src/services/history/historyChronology.d.ts +7 -0
  167. package/dist/src/services/history/historyChronology.js +35 -3
  168. package/dist/src/services/history/historyChronology.js.map +1 -1
  169. package/dist/src/services/history/historyCloneUtils.d.ts +5 -4
  170. package/dist/src/services/history/historyCloneUtils.js +23 -16
  171. package/dist/src/services/history/historyCloneUtils.js.map +1 -1
  172. package/dist/src/services/history/historyCompressionQueue.d.ts +33 -0
  173. package/dist/src/services/history/historyCompressionQueue.js +81 -0
  174. package/dist/src/services/history/historyCompressionQueue.js.map +1 -0
  175. package/dist/src/services/history/historyEventTypes.d.ts +3 -0
  176. package/dist/src/services/history/historyMutationFailure.d.ts +15 -0
  177. package/dist/src/services/history/historyMutationFailure.js +22 -0
  178. package/dist/src/services/history/historyMutationFailure.js.map +1 -1
  179. package/dist/src/services/history/historyProviderPipeline.d.ts +1 -1
  180. package/dist/src/services/history/historyProviderPipeline.js +15 -5
  181. package/dist/src/services/history/historyProviderPipeline.js.map +1 -1
  182. package/dist/src/services/history/historyTokenEstimation.js +10 -6
  183. package/dist/src/services/history/historyTokenEstimation.js.map +1 -1
  184. package/dist/src/services/history/historyToolNormalization.d.ts +2 -0
  185. package/dist/src/services/history/historyToolNormalization.js +26 -9
  186. package/dist/src/services/history/historyToolNormalization.js.map +1 -1
  187. package/dist/src/services/history/provider-file-binding.d.ts +11 -0
  188. package/dist/src/services/history/provider-file-binding.js +70 -0
  189. package/dist/src/services/history/provider-file-binding.js.map +1 -0
  190. package/dist/src/services/history/semantic-media-purge.d.ts +66 -0
  191. package/dist/src/services/history/semantic-media-purge.js +404 -0
  192. package/dist/src/services/history/semantic-media-purge.js.map +1 -0
  193. package/dist/src/storage/SessionPersistenceService.d.ts +53 -2
  194. package/dist/src/storage/SessionPersistenceService.js +435 -23
  195. package/dist/src/storage/SessionPersistenceService.js.map +1 -1
  196. package/dist/src/storage/history-media-ownership.d.ts +38 -0
  197. package/dist/src/storage/history-media-ownership.js +136 -0
  198. package/dist/src/storage/history-media-ownership.js.map +1 -0
  199. package/dist/src/storage/local-media-store-child.d.ts +6 -0
  200. package/dist/src/storage/local-media-store-child.js +140 -0
  201. package/dist/src/storage/local-media-store-child.js.map +1 -0
  202. package/dist/src/storage/local-media-store-files.d.ts +44 -0
  203. package/dist/src/storage/local-media-store-files.js +460 -0
  204. package/dist/src/storage/local-media-store-files.js.map +1 -0
  205. package/dist/src/storage/local-media-store-lock-recovery.d.ts +15 -0
  206. package/dist/src/storage/local-media-store-lock-recovery.js +112 -0
  207. package/dist/src/storage/local-media-store-lock-recovery.js.map +1 -0
  208. package/dist/src/storage/local-media-store-persistence.d.ts +48 -0
  209. package/dist/src/storage/local-media-store-persistence.js +443 -0
  210. package/dist/src/storage/local-media-store-persistence.js.map +1 -0
  211. package/dist/src/storage/local-media-store-quota.d.ts +6 -0
  212. package/dist/src/storage/local-media-store-quota.js +66 -0
  213. package/dist/src/storage/local-media-store-quota.js.map +1 -0
  214. package/dist/src/storage/local-media-store-reservations.d.ts +55 -0
  215. package/dist/src/storage/local-media-store-reservations.js +377 -0
  216. package/dist/src/storage/local-media-store-reservations.js.map +1 -0
  217. package/dist/src/storage/local-media-store-types.d.ts +110 -0
  218. package/dist/src/storage/local-media-store-types.js +35 -0
  219. package/dist/src/storage/local-media-store-types.js.map +1 -0
  220. package/dist/src/storage/local-media-store-validation.d.ts +34 -0
  221. package/dist/src/storage/local-media-store-validation.js +449 -0
  222. package/dist/src/storage/local-media-store-validation.js.map +1 -0
  223. package/dist/src/storage/local-media-store.d.ts +47 -0
  224. package/dist/src/storage/local-media-store.js +353 -0
  225. package/dist/src/storage/local-media-store.js.map +1 -0
  226. package/dist/src/storage/media-admission-service.d.ts +49 -0
  227. package/dist/src/storage/media-admission-service.js +333 -0
  228. package/dist/src/storage/media-admission-service.js.map +1 -0
  229. package/dist/src/storage/media-lifecycle-metrics.d.ts +75 -0
  230. package/dist/src/storage/media-lifecycle-metrics.js +105 -0
  231. package/dist/src/storage/media-lifecycle-metrics.js.map +1 -0
  232. package/dist/src/storage/media-reference-lifecycle.d.ts +16 -0
  233. package/dist/src/storage/media-reference-lifecycle.js +84 -0
  234. package/dist/src/storage/media-reference-lifecycle.js.map +1 -0
  235. package/dist/src/storage/request-media-resolver.d.ts +67 -0
  236. package/dist/src/storage/request-media-resolver.js +325 -0
  237. package/dist/src/storage/request-media-resolver.js.map +1 -0
  238. package/dist/src/storage/session-media-service-factories.d.ts +19 -0
  239. package/dist/src/storage/session-media-service-factories.js +34 -0
  240. package/dist/src/storage/session-media-service-factories.js.map +1 -0
  241. package/dist/src/storage/session-persistence-helpers.d.ts +10 -0
  242. package/dist/src/storage/session-persistence-helpers.js +46 -0
  243. package/dist/src/storage/session-persistence-helpers.js.map +1 -0
  244. package/dist/src/test-utils/config.d.ts +2 -0
  245. package/dist/src/test-utils/config.js +5 -5
  246. package/dist/src/test-utils/config.js.map +1 -1
  247. package/dist/src/test-utils/runtime.d.ts +2 -0
  248. package/dist/src/test-utils/runtime.js +1 -2
  249. package/dist/src/test-utils/runtime.js.map +1 -1
  250. package/dist/src/tools-adapters/CoreShellToolHostAdapter.js +1 -9
  251. package/dist/src/tools-adapters/CoreShellToolHostAdapter.js.map +1 -1
  252. package/dist/src/tools-adapters/CoreSkillServiceAdapter.d.ts +0 -2
  253. package/dist/src/tools-adapters/CoreSkillServiceAdapter.js +0 -17
  254. package/dist/src/tools-adapters/CoreSkillServiceAdapter.js.map +1 -1
  255. package/dist/src/tools-adapters/CoreToolHostAdapter.d.ts +0 -21
  256. package/dist/src/tools-adapters/CoreToolHostAdapter.js +0 -8
  257. package/dist/src/tools-adapters/CoreToolHostAdapter.js.map +1 -1
  258. package/dist/src/utils/environmentContext.d.ts +8 -9
  259. package/dist/src/utils/environmentContext.js +11 -22
  260. package/dist/src/utils/environmentContext.js.map +1 -1
  261. package/dist/src/utils/errorParsing.d.ts +1 -2
  262. package/dist/src/utils/errorParsing.js +22 -41
  263. package/dist/src/utils/errorParsing.js.map +1 -1
  264. package/dist/src/utils/generateContentResponseUtilities.js +12 -0
  265. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  266. package/dist/src/utils/summarizer.d.ts +1 -2
  267. package/dist/src/utils/summarizer.js +6 -5
  268. package/dist/src/utils/summarizer.js.map +1 -1
  269. package/dist/src/utils/tool-utils.js +7 -1
  270. package/dist/src/utils/tool-utils.js.map +1 -1
  271. package/index.ts +0 -4
  272. package/package.json +38 -30
  273. package/src/config/agentClientLifecycle.ts +53 -22
  274. package/src/config/config.ts +11 -26
  275. package/src/config/configBase.ts +46 -7
  276. package/src/config/configBaseCore.ts +38 -36
  277. package/src/config/configMcpRuntime.ts +46 -0
  278. package/src/config/configMediaDefaults.ts +19 -0
  279. package/src/config/configTypes.ts +13 -53
  280. package/src/config/index.ts +1 -4
  281. package/src/config/models.ts +0 -6
  282. package/src/config/toolRegistryFactory.ts +2 -2
  283. package/src/core/clientContract.ts +4 -6
  284. package/src/core/compression/transcriptPathNotice.ts +31 -0
  285. package/src/core/contentGenerator.ts +15 -39
  286. package/src/core/logger.ts +370 -39
  287. package/src/core/prompts.ts +4 -114
  288. package/src/core/turn.ts +3 -3
  289. package/src/hooks/hookTranslator.ts +6 -4
  290. package/src/index.ts +7 -7
  291. package/src/llm-types/index.ts +5 -0
  292. package/src/llm-types/modelEnvelope.ts +26 -2
  293. package/src/policy/policies/read-only.toml +0 -5
  294. package/src/prompt-config/TemplateEngine.ts +0 -3
  295. package/src/prompt-config/defaults/providers/gemini/core.md +0 -2
  296. package/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/core.md +0 -2
  297. package/src/prompt-config/defaults/providers/gemini/models/gemini-2.5-flash/gemini-2-5-flash/core.md +0 -2
  298. package/src/prompt-config/prompt-loader.ts +7 -8
  299. package/src/prompt-config/types.ts +0 -1
  300. package/src/recording/CheckpointService.ts +110 -45
  301. package/src/recording/HistoryMutationService.ts +28 -3
  302. package/src/recording/RecordingIntegration.ts +258 -11
  303. package/src/recording/ReplayEngine.ts +220 -110
  304. package/src/recording/SessionDiscovery.ts +30 -4
  305. package/src/recording/SessionRecordingService.ts +253 -55
  306. package/src/recording/SessionTransitionService.ts +75 -12
  307. package/src/recording/index.ts +7 -0
  308. package/src/recording/janitor/cleanupTypes.ts +4 -0
  309. package/src/recording/janitor/mediaReclamation.ts +295 -0
  310. package/src/recording/janitor/sessionJanitor.ts +54 -1
  311. package/src/recording/janitor/sessionScanner.ts +319 -227
  312. package/src/recording/replay-test-helpers.ts +33 -2
  313. package/src/recording/replayCheckpointMetadata.ts +115 -0
  314. package/src/recording/replayErrorFormatting.ts +43 -0
  315. package/src/recording/resumeSession.ts +10 -0
  316. package/src/recording/semanticMediaPurgeReplayValidation.ts +35 -0
  317. package/src/recording/session-media-package-blobs.ts +116 -0
  318. package/src/recording/session-media-package-import.ts +189 -0
  319. package/src/recording/session-media-package-state.ts +120 -0
  320. package/src/recording/session-media-package-validation.ts +400 -0
  321. package/src/recording/session-media-package-writer.ts +117 -0
  322. package/src/recording/session-media-package.ts +692 -0
  323. package/src/recording/types.ts +37 -2
  324. package/src/runtime/AgentRuntimeContext.ts +28 -5
  325. package/src/runtime/AgentRuntimeLoader.ts +32 -7
  326. package/src/runtime/contracts/PromptEstimation.ts +1 -0
  327. package/src/runtime/contracts/RuntimeProvider.ts +3 -8
  328. package/src/runtime/contracts/RuntimeProviderManager.ts +0 -2
  329. package/src/runtime/createAgentRuntimeContext.ts +43 -1
  330. package/src/runtime/providerRuntimeContext.ts +22 -0
  331. package/src/runtime/runtimeAdapters.ts +2 -2
  332. package/src/services/history/ContentConverters.ts +11 -7
  333. package/src/services/history/HistoryService.ts +71 -696
  334. package/src/services/history/HistoryServiceCore.ts +1055 -0
  335. package/src/services/history/IContent.ts +460 -20
  336. package/src/services/history/contentSize.ts +22 -2
  337. package/src/services/history/historyChronology.ts +53 -3
  338. package/src/services/history/historyCloneUtils.ts +26 -22
  339. package/src/services/history/historyCompressionQueue.ts +102 -0
  340. package/src/services/history/historyEventTypes.ts +9 -0
  341. package/src/services/history/historyMutationFailure.ts +33 -0
  342. package/src/services/history/historyProviderPipeline.ts +19 -5
  343. package/src/services/history/historyTokenEstimation.ts +9 -5
  344. package/src/services/history/historyToolNormalization.ts +43 -11
  345. package/src/services/history/provider-file-binding.ts +115 -0
  346. package/src/services/history/semantic-media-purge.ts +593 -0
  347. package/src/storage/SessionPersistenceService.ts +667 -30
  348. package/src/storage/history-media-ownership.ts +185 -0
  349. package/src/storage/local-media-store-child.ts +163 -0
  350. package/src/storage/local-media-store-files.ts +643 -0
  351. package/src/storage/local-media-store-lock-recovery.ts +159 -0
  352. package/src/storage/local-media-store-persistence.ts +737 -0
  353. package/src/storage/local-media-store-quota.ts +111 -0
  354. package/src/storage/local-media-store-reservations.ts +485 -0
  355. package/src/storage/local-media-store-types.ts +161 -0
  356. package/src/storage/local-media-store-validation.ts +643 -0
  357. package/src/storage/local-media-store.ts +696 -0
  358. package/src/storage/media-admission-service.ts +512 -0
  359. package/src/storage/media-lifecycle-metrics.ts +228 -0
  360. package/src/storage/media-reference-lifecycle.ts +164 -0
  361. package/src/storage/request-media-resolver.ts +491 -0
  362. package/src/storage/session-media-service-factories.ts +48 -0
  363. package/src/storage/session-persistence-helpers.ts +85 -0
  364. package/src/test-utils/config.ts +7 -5
  365. package/src/test-utils/runtime.ts +3 -2
  366. package/src/tools-adapters/CoreShellToolHostAdapter.ts +1 -11
  367. package/src/tools-adapters/CoreSkillServiceAdapter.ts +0 -23
  368. package/src/tools-adapters/CoreToolHostAdapter.ts +0 -36
  369. package/src/utils/environmentContext.ts +11 -30
  370. package/src/utils/errorParsing.ts +19 -69
  371. package/src/utils/generateContentResponseUtilities.ts +28 -1
  372. package/src/utils/summarizer.ts +8 -10
  373. package/src/utils/tool-utils.ts +7 -1
  374. package/dist/src/code_assist/codeAssist.d.ts +0 -19
  375. package/dist/src/code_assist/codeAssist.js +0 -41
  376. package/dist/src/code_assist/codeAssist.js.map +0 -1
  377. package/dist/src/code_assist/contentGeneratorAdapters.d.ts +0 -49
  378. package/dist/src/code_assist/contentGeneratorAdapters.js +0 -197
  379. package/dist/src/code_assist/contentGeneratorAdapters.js.map +0 -1
  380. package/dist/src/code_assist/converter.d.ts +0 -74
  381. package/dist/src/code_assist/converter.js +0 -158
  382. package/dist/src/code_assist/converter.js.map +0 -1
  383. package/dist/src/code_assist/googleGenAIWrapper.d.ts +0 -27
  384. package/dist/src/code_assist/googleGenAIWrapper.js +0 -46
  385. package/dist/src/code_assist/googleGenAIWrapper.js.map +0 -1
  386. package/dist/src/code_assist/oauth-credential-storage.d.ts +0 -30
  387. package/dist/src/code_assist/oauth-credential-storage.js +0 -135
  388. package/dist/src/code_assist/oauth-credential-storage.js.map +0 -1
  389. package/dist/src/code_assist/server.d.ts +0 -44
  390. package/dist/src/code_assist/server.js +0 -154
  391. package/dist/src/code_assist/server.js.map +0 -1
  392. package/dist/src/code_assist/setup.d.ts +0 -20
  393. package/dist/src/code_assist/setup.js +0 -126
  394. package/dist/src/code_assist/setup.js.map +0 -1
  395. package/dist/src/code_assist/types.d.ts +0 -161
  396. package/dist/src/code_assist/types.js +0 -46
  397. package/dist/src/code_assist/types.js.map +0 -1
  398. package/dist/src/utils/getFolderStructure.d.ts +0 -31
  399. package/dist/src/utils/getFolderStructure.js +0 -240
  400. package/dist/src/utils/getFolderStructure.js.map +0 -1
  401. package/dist/src/utils/installationManager.d.ts +0 -16
  402. package/dist/src/utils/installationManager.js +0 -51
  403. package/dist/src/utils/installationManager.js.map +0 -1
  404. package/dist/src/utils/llm-edit-fixer.d.ts +0 -25
  405. package/dist/src/utils/llm-edit-fixer.js +0 -120
  406. package/dist/src/utils/llm-edit-fixer.js.map +0 -1
  407. package/src/code_assist/codeAssist.ts +0 -59
  408. package/src/code_assist/contentGeneratorAdapters.ts +0 -275
  409. package/src/code_assist/converter.ts +0 -288
  410. package/src/code_assist/googleGenAIWrapper.ts +0 -90
  411. package/src/code_assist/oauth-credential-storage.ts +0 -171
  412. package/src/code_assist/server.ts +0 -263
  413. package/src/code_assist/setup.ts +0 -189
  414. package/src/code_assist/types.ts +0 -201
  415. package/src/utils/getFolderStructure.ts +0 -382
  416. package/src/utils/installationManager.ts +0 -59
  417. package/src/utils/llm-edit-fixer.ts +0 -157
@@ -0,0 +1,692 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { randomUUID } from 'node:crypto';
8
+ import { readdir, rm, writeFile } from 'node:fs/promises';
9
+ import { dirname, join } from 'node:path';
10
+ import {
11
+ type IContent,
12
+ type MediaReferenceBlock,
13
+ type MediaStoredObject,
14
+ } from '../services/history/IContent.js';
15
+ import type { LocalMediaStore } from '../storage/local-media-store.js';
16
+ import { MediaAdmissionService } from '../storage/media-admission-service.js';
17
+ import { collectMediaReferences } from '../storage/media-reference-lifecycle.js';
18
+ import { replaySession } from './ReplayEngine.js';
19
+
20
+ import {
21
+ MANIFEST_FILE,
22
+ MAX_HISTORY_CONTENTS,
23
+ MAX_MANIFEST_BYTES,
24
+ MAX_OBJECT_AGGREGATE_BYTES,
25
+ MAX_OBJECT_BYTES,
26
+ MAX_PERSISTED_STATES,
27
+ MAX_PERSISTED_STATE_AGGREGATE_BYTES,
28
+ MAX_PERSISTED_STATE_BYTES,
29
+ MAX_RECORDING_BYTES,
30
+ PERSISTED_SESSION_PREFIX,
31
+ SUPPORTED_PERSISTED_SESSION_VERSION,
32
+ boundedAggregate,
33
+ boundedFileSize,
34
+ isContent,
35
+ isRecord,
36
+ parseManifest,
37
+ readBoundedFile,
38
+ requiredObjects,
39
+ requirePortableMediaContent,
40
+ requireRecordingLine,
41
+ uniqueReferences,
42
+ verifyManifestObjectSet,
43
+ type MediaPackageManifest,
44
+ type PortablePersistedState,
45
+ type PortableRecording,
46
+ type VerifiedPackageBlob,
47
+ } from './session-media-package-validation.js';
48
+ import { verifyPackageBlobs } from './session-media-package-blobs.js';
49
+ import {
50
+ assertImportReservationsReleased,
51
+ publishImportedSession,
52
+ releaseImportReservations,
53
+ rollbackImport,
54
+ type ImportReservation,
55
+ type PublishedImportedSession,
56
+ } from './session-media-package-import.js';
57
+ import {
58
+ capturePersistedStates,
59
+ rewrittenPersistedStates,
60
+ verifyHistoryReferences,
61
+ type CapturedPersistedState,
62
+ } from './session-media-package-state.js';
63
+ import {
64
+ publishStagedSessionMediaPackage,
65
+ stageSessionMediaPackage,
66
+ } from './session-media-package-writer.js';
67
+
68
+ export interface ImportedSessionMediaPackage {
69
+ readonly recordingPath: string;
70
+ readonly sessionId: string;
71
+ readonly contentIds: readonly string[];
72
+ }
73
+
74
+ interface ExportReservation {
75
+ readonly contents: readonly IContent[];
76
+ readonly context: {
77
+ readonly turnId: string;
78
+ readonly source: string;
79
+ };
80
+ readonly mode: 'content' | 'contents';
81
+ }
82
+
83
+ interface PortableLineContext {
84
+ readonly admission: MediaAdmissionService | undefined;
85
+ readonly reservations: ExportReservation[] | undefined;
86
+ readonly histories: IContent[][];
87
+ readonly destinationProjectHash: string | undefined;
88
+ readonly destinationSessionId: string | undefined;
89
+ }
90
+
91
+ type PortableLineResult =
92
+ | {
93
+ readonly kind: 'session-start';
94
+ readonly payload: Record<string, unknown>;
95
+ readonly sessionId: string;
96
+ }
97
+ | {
98
+ readonly kind: 'event';
99
+ readonly payload: Record<string, unknown>;
100
+ };
101
+
102
+ function parseRecordingLine(serialized: string, lineNumber: number) {
103
+ let parsed: unknown;
104
+ try {
105
+ parsed = JSON.parse(serialized);
106
+ } catch (error) {
107
+ throw new Error(`Invalid recording JSON at line ${lineNumber}`, {
108
+ cause: error,
109
+ });
110
+ }
111
+ return requireRecordingLine(parsed, lineNumber);
112
+ }
113
+
114
+ async function preparePortableContent(
115
+ content: IContent,
116
+ context: PortableLineContext,
117
+ lineNumber: number,
118
+ ): Promise<IContent> {
119
+ if (context.destinationProjectHash !== undefined) {
120
+ return requirePortableMediaContent(content);
121
+ }
122
+ if (context.admission === undefined) {
123
+ throw new Error('Media store is required when exporting a session package');
124
+ }
125
+ const admissionContext = {
126
+ turnId: `session-package-line-${lineNumber}`,
127
+ source: 'session-package-export',
128
+ };
129
+ const admitted = await context.admission.admitContent(
130
+ content,
131
+ admissionContext,
132
+ );
133
+ context.reservations?.push({
134
+ contents: [admitted],
135
+ context: admissionContext,
136
+ mode: 'content',
137
+ });
138
+ return admitted;
139
+ }
140
+
141
+ async function processPortableLine(
142
+ line: Record<string, unknown>,
143
+ lineNumber: number,
144
+ context: PortableLineContext,
145
+ ): Promise<PortableLineResult> {
146
+ const payload = line['payload'];
147
+ if (!isRecord(payload))
148
+ throw new Error(`Invalid recording line ${lineNumber}`);
149
+ if (line['type'] === 'session_start') {
150
+ const sessionId = payload['sessionId'];
151
+ if (typeof sessionId !== 'string' || sessionId.length === 0) {
152
+ throw new Error('Invalid recording session identifier');
153
+ }
154
+ const nextPayload: Record<string, unknown> = {
155
+ ...payload,
156
+ sessionId: context.destinationSessionId ?? sessionId,
157
+ projectHash: context.destinationProjectHash ?? payload['projectHash'],
158
+ workspaceDirs: [],
159
+ };
160
+ delete nextPayload['cwd'];
161
+ return { kind: 'session-start', payload: nextPayload, sessionId };
162
+ }
163
+ if (line['type'] === 'content' || line['type'] === 'compressed') {
164
+ const key = line['type'] === 'content' ? 'content' : 'summary';
165
+ const content = payload[key];
166
+ if (!isContent(content)) {
167
+ throw new Error(
168
+ `Invalid ${String(line['type'])} recording at line ${lineNumber}`,
169
+ );
170
+ }
171
+ const admitted = await preparePortableContent(content, context, lineNumber);
172
+ context.histories.push([admitted]);
173
+ return { kind: 'event', payload: { ...payload, [key]: admitted } };
174
+ }
175
+ if (line['type'] === 'semantic_media_purge') {
176
+ const history = payload['history'];
177
+ if (!Array.isArray(history) || !history.every(isContent)) {
178
+ throw new Error(`Invalid semantic purge recording at line ${lineNumber}`);
179
+ }
180
+ let admitted: IContent[];
181
+ if (context.destinationProjectHash === undefined) {
182
+ if (context.admission === undefined) {
183
+ throw new Error(
184
+ 'Media store is required when exporting a session package',
185
+ );
186
+ }
187
+ const admissionContext = {
188
+ turnId: `session-package-line-${lineNumber}`,
189
+ source: 'session-package-export',
190
+ };
191
+ admitted = await context.admission.admitContents(
192
+ history,
193
+ admissionContext,
194
+ );
195
+ context.reservations?.push({
196
+ contents: admitted,
197
+ context: admissionContext,
198
+ mode: 'contents',
199
+ });
200
+ } else {
201
+ admitted = history.map(requirePortableMediaContent);
202
+ }
203
+ context.histories.push(admitted);
204
+ return { kind: 'event', payload: { ...payload, history: admitted } };
205
+ }
206
+ return { kind: 'event', payload };
207
+ }
208
+
209
+ async function portableRecording(
210
+ recordingBytes: Uint8Array,
211
+ mediaStore: LocalMediaStore | undefined,
212
+ destinationProjectHash?: string,
213
+ destinationSessionId?: string,
214
+ admission?: MediaAdmissionService,
215
+ reservations?: ExportReservation[],
216
+ ): Promise<PortableRecording> {
217
+ const rawLines = Buffer.from(recordingBytes)
218
+ .toString('utf8')
219
+ .trim()
220
+ .split('\n');
221
+ if (rawLines.length === 0 || rawLines[0] === '') {
222
+ throw new Error('Invalid empty session recording');
223
+ }
224
+ const histories: IContent[][] = [];
225
+ const context: PortableLineContext = {
226
+ admission:
227
+ mediaStore === undefined
228
+ ? undefined
229
+ : (admission ?? new MediaAdmissionService(mediaStore)),
230
+ reservations,
231
+ histories,
232
+ destinationProjectHash,
233
+ destinationSessionId,
234
+ };
235
+ const portableLines: string[] = [];
236
+ let sourceSessionId: string | undefined;
237
+ for (let index = 0; index < rawLines.length; index += 1) {
238
+ const line = parseRecordingLine(rawLines[index], index + 1);
239
+ const result = await processPortableLine(line, index + 1, context);
240
+ if (result.kind === 'session-start') sourceSessionId = result.sessionId;
241
+ portableLines.push(JSON.stringify({ ...line, payload: result.payload }));
242
+ }
243
+ if (sourceSessionId === undefined) {
244
+ throw new Error('Recording does not contain session_start');
245
+ }
246
+ return {
247
+ bytes: Buffer.from(`${portableLines.join('\n')}\n`, 'utf8'),
248
+ sessionId: destinationSessionId ?? sourceSessionId,
249
+ histories,
250
+ };
251
+ }
252
+
253
+ async function readPersistedState(
254
+ recordingPath: string,
255
+ entry: string,
256
+ sessionId: string,
257
+ projectHash: string,
258
+ stateIndex: number,
259
+ admission: MediaAdmissionService,
260
+ reservations: ExportReservation[],
261
+ ): Promise<PortablePersistedState | undefined> {
262
+ if (!entry.startsWith(PERSISTED_SESSION_PREFIX) || !entry.endsWith('.json')) {
263
+ return undefined;
264
+ }
265
+ const parsed: unknown = JSON.parse(
266
+ (
267
+ await readBoundedFile(
268
+ join(dirname(recordingPath), entry),
269
+ MAX_PERSISTED_STATE_BYTES,
270
+ 'Persisted session state',
271
+ )
272
+ ).toString('utf8'),
273
+ );
274
+ if (!isRecord(parsed)) throw new Error(`Invalid persisted session ${entry}`);
275
+ if (
276
+ parsed['sessionId'] !== sessionId ||
277
+ parsed['projectHash'] !== projectHash
278
+ ) {
279
+ return undefined;
280
+ }
281
+ if (parsed['version'] !== SUPPORTED_PERSISTED_SESSION_VERSION) {
282
+ throw new Error(
283
+ `Unsupported persisted session version ${String(parsed['version'])}`,
284
+ );
285
+ }
286
+ const history = parsed['history'];
287
+ if (
288
+ !Array.isArray(history) ||
289
+ !history.every(isContent) ||
290
+ history.length > MAX_HISTORY_CONTENTS
291
+ ) {
292
+ throw new Error(`Invalid persisted session history ${entry}`);
293
+ }
294
+ const admissionContext = {
295
+ turnId: `session-package-persisted-${stateIndex}`,
296
+ source: 'session-package-export',
297
+ };
298
+ const admitted = await admission.admitContents(history, admissionContext);
299
+ reservations.push({
300
+ contents: admitted,
301
+ context: admissionContext,
302
+ mode: 'contents',
303
+ });
304
+ return {
305
+ file: `state/persisted-${stateIndex}.json`,
306
+ history: admitted,
307
+ serialized: JSON.stringify({ ...parsed, history: admitted }),
308
+ };
309
+ }
310
+
311
+ async function readPersistedStates(
312
+ recordingPath: string,
313
+ sessionId: string,
314
+ projectHash: string,
315
+ admission: MediaAdmissionService,
316
+ reservations: ExportReservation[],
317
+ ): Promise<readonly PortablePersistedState[]> {
318
+ const entries = (await readdir(dirname(recordingPath)))
319
+ .filter(
320
+ (entry) =>
321
+ entry.startsWith(PERSISTED_SESSION_PREFIX) && entry.endsWith('.json'),
322
+ )
323
+ .sort();
324
+ if (entries.length > MAX_PERSISTED_STATES) {
325
+ throw new Error('Export persisted state count exceeds limit');
326
+ }
327
+ const sizes: number[] = [];
328
+ for (const entry of entries) {
329
+ sizes.push(
330
+ await boundedFileSize(
331
+ join(dirname(recordingPath), entry),
332
+ MAX_PERSISTED_STATE_BYTES,
333
+ 'Persisted session state',
334
+ ),
335
+ );
336
+ }
337
+ boundedAggregate(
338
+ sizes,
339
+ MAX_PERSISTED_STATE_AGGREGATE_BYTES,
340
+ 'Persisted session states',
341
+ );
342
+ const states: PortablePersistedState[] = [];
343
+ for (const entry of entries) {
344
+ const state = await readPersistedState(
345
+ recordingPath,
346
+ entry,
347
+ sessionId,
348
+ projectHash,
349
+ states.length,
350
+ admission,
351
+ reservations,
352
+ );
353
+ if (state !== undefined) states.push(state);
354
+ }
355
+ return states;
356
+ }
357
+
358
+ async function replayPortableRecording(
359
+ recordingPath: string,
360
+ recordingBytes: Uint8Array,
361
+ projectHash: string,
362
+ mediaStore: LocalMediaStore,
363
+ ): Promise<readonly IContent[]> {
364
+ const replayPath = `${recordingPath}.${randomUUID()}.portable.tmp`;
365
+ let history: readonly IContent[] | undefined;
366
+ let failure: unknown;
367
+ try {
368
+ await writeFile(replayPath, recordingBytes, { mode: 0o600, flag: 'wx' });
369
+ const replay = await replaySession(replayPath, projectHash, { mediaStore });
370
+ if (!replay.ok) {
371
+ throw new Error(`Cannot export session media: ${replay.error}`);
372
+ }
373
+ history = replay.history;
374
+ } catch (error) {
375
+ failure = error;
376
+ }
377
+ try {
378
+ await rm(replayPath, { force: true });
379
+ } catch (cleanupError) {
380
+ failure =
381
+ failure === undefined
382
+ ? cleanupError
383
+ : new AggregateError(
384
+ [failure, cleanupError],
385
+ 'Portable session replay and cleanup failed',
386
+ );
387
+ }
388
+ if (failure !== undefined) throw failure;
389
+ if (history === undefined) throw new Error('Portable session replay failed');
390
+ return history;
391
+ }
392
+
393
+ async function writeSessionMediaPackage(
394
+ recordingPath: string,
395
+ projectHash: string,
396
+ mediaStore: LocalMediaStore,
397
+ temporaryDirectory: string,
398
+ admission: MediaAdmissionService,
399
+ reservations: ExportReservation[],
400
+ ): Promise<void> {
401
+ const sourceBytes = await readBoundedFile(
402
+ recordingPath,
403
+ MAX_RECORDING_BYTES,
404
+ 'Session recording',
405
+ );
406
+ const recording = await portableRecording(
407
+ sourceBytes,
408
+ mediaStore,
409
+ undefined,
410
+ undefined,
411
+ admission,
412
+ reservations,
413
+ );
414
+ const persistedStates = await readPersistedStates(
415
+ recordingPath,
416
+ recording.sessionId,
417
+ projectHash,
418
+ admission,
419
+ reservations,
420
+ );
421
+ const replayHistory = await replayPortableRecording(
422
+ recordingPath,
423
+ recording.bytes,
424
+ projectHash,
425
+ mediaStore,
426
+ );
427
+ const references = uniqueReferences(
428
+ collectMediaReferences([
429
+ ...recording.histories.flat(),
430
+ ...persistedStates.flatMap((state) => state.history),
431
+ ...replayHistory,
432
+ ]),
433
+ );
434
+ const objects = requiredObjects(references);
435
+ await stageSessionMediaPackage({
436
+ temporaryDirectory,
437
+ mediaStore,
438
+ recording,
439
+ persistedStates,
440
+ references,
441
+ objects,
442
+ });
443
+ }
444
+
445
+ async function releaseExportReservations(
446
+ admission: MediaAdmissionService,
447
+ reservations: readonly ExportReservation[],
448
+ ): Promise<void> {
449
+ await admission.releaseAdmissions(reservations);
450
+ }
451
+
452
+ async function cleanupFailedExport(
453
+ temporaryDirectory: string,
454
+ failures: readonly unknown[],
455
+ message: string,
456
+ ): Promise<never> {
457
+ const collected = [...failures];
458
+ try {
459
+ await rm(temporaryDirectory, { recursive: true, force: true });
460
+ } catch (cleanupError) {
461
+ collected.push(cleanupError);
462
+ }
463
+ if (collected.length === 1) throw collected[0];
464
+ throw new AggregateError(collected, message);
465
+ }
466
+
467
+ export async function exportSessionMediaPackage(
468
+ recordingPath: string,
469
+ projectHash: string,
470
+ mediaStore: LocalMediaStore,
471
+ packageDirectory: string,
472
+ ): Promise<void> {
473
+ const admission = new MediaAdmissionService(mediaStore);
474
+ const reservations: ExportReservation[] = [];
475
+ const temporaryDirectory = `${packageDirectory}.${randomUUID()}.tmp`;
476
+ try {
477
+ await writeSessionMediaPackage(
478
+ recordingPath,
479
+ projectHash,
480
+ mediaStore,
481
+ temporaryDirectory,
482
+ admission,
483
+ reservations,
484
+ );
485
+ } catch (error) {
486
+ try {
487
+ await releaseExportReservations(admission, reservations);
488
+ } catch (releaseError) {
489
+ await cleanupFailedExport(
490
+ temporaryDirectory,
491
+ [error, releaseError],
492
+ 'Session package export, owner release, and cleanup failed',
493
+ );
494
+ }
495
+ await cleanupFailedExport(
496
+ temporaryDirectory,
497
+ [error],
498
+ 'Session package export and cleanup failed',
499
+ );
500
+ }
501
+ try {
502
+ await releaseExportReservations(admission, reservations);
503
+ } catch (releaseError) {
504
+ await cleanupFailedExport(
505
+ temporaryDirectory,
506
+ [releaseError],
507
+ 'Session package owner release and cleanup failed',
508
+ );
509
+ }
510
+ try {
511
+ await publishStagedSessionMediaPackage(
512
+ temporaryDirectory,
513
+ packageDirectory,
514
+ );
515
+ } catch (publishError) {
516
+ await cleanupFailedExport(
517
+ temporaryDirectory,
518
+ [publishError],
519
+ 'Session package publication and cleanup failed',
520
+ );
521
+ }
522
+ }
523
+
524
+ export interface ValidatedSessionMediaPackage {
525
+ readonly packageDirectory: string;
526
+ readonly manifest: MediaPackageManifest;
527
+ readonly references: readonly MediaReferenceBlock[];
528
+ readonly objects: readonly MediaStoredObject[];
529
+ readonly blobs: readonly VerifiedPackageBlob[];
530
+ readonly recordingBytes: Uint8Array;
531
+ readonly persistedStates: readonly CapturedPersistedState[];
532
+ }
533
+
534
+ export async function validateSessionMediaPackage(
535
+ packageDirectory: string,
536
+ ): Promise<ValidatedSessionMediaPackage> {
537
+ const manifest = parseManifest(
538
+ (
539
+ await readBoundedFile(
540
+ join(packageDirectory, MANIFEST_FILE),
541
+ MAX_MANIFEST_BYTES,
542
+ 'Session media package manifest',
543
+ )
544
+ ).toString('utf8'),
545
+ );
546
+ const references = uniqueReferences(manifest.references);
547
+ const objects = requiredObjects(references);
548
+ verifyManifestObjectSet(objects, manifest.objects);
549
+ boundedAggregate(
550
+ objects.map((object) => {
551
+ if (object.byteLength > MAX_OBJECT_BYTES) {
552
+ throw new Error('Session media package object exceeds byte limit');
553
+ }
554
+ return object.byteLength;
555
+ }),
556
+ MAX_OBJECT_AGGREGATE_BYTES,
557
+ 'Session media package objects',
558
+ );
559
+ const recordingBytes = new Uint8Array(
560
+ await readBoundedFile(
561
+ join(packageDirectory, manifest.recording),
562
+ MAX_RECORDING_BYTES,
563
+ 'Session media package recording',
564
+ ),
565
+ );
566
+ const persistedStates = await capturePersistedStates(
567
+ packageDirectory,
568
+ manifest.persistedStates,
569
+ );
570
+ const portable = await portableRecording(
571
+ recordingBytes,
572
+ undefined,
573
+ 'package-validation-project',
574
+ 'package-validation-session',
575
+ );
576
+ if (portable.histories.length > MAX_HISTORY_CONTENTS) {
577
+ throw new Error('Session media package history count exceeds limit');
578
+ }
579
+ verifyHistoryReferences(
580
+ 'recording',
581
+ uniqueReferences(collectMediaReferences(portable.histories.flat())),
582
+ references,
583
+ );
584
+ verifyHistoryReferences(
585
+ 'persisted history',
586
+ uniqueReferences(
587
+ collectMediaReferences(persistedStates.flatMap((state) => state.history)),
588
+ ),
589
+ references,
590
+ );
591
+ const blobs = await verifyPackageBlobs(packageDirectory, objects);
592
+ return {
593
+ packageDirectory,
594
+ manifest,
595
+ references,
596
+ objects,
597
+ blobs,
598
+ recordingBytes,
599
+ persistedStates,
600
+ };
601
+ }
602
+
603
+ export function importSessionMediaPackage(
604
+ packageSource: string | ValidatedSessionMediaPackage,
605
+ destinationChatsDirectory: string,
606
+ projectHash: string,
607
+ mediaStore: LocalMediaStore,
608
+ ): Promise<ImportedSessionMediaPackage>;
609
+ export function importSessionMediaPackage<T>(
610
+ packageSource: string | ValidatedSessionMediaPackage,
611
+ destinationChatsDirectory: string,
612
+ projectHash: string,
613
+ mediaStore: LocalMediaStore,
614
+ activate: (imported: ImportedSessionMediaPackage) => Promise<T>,
615
+ ): Promise<T>;
616
+ export async function importSessionMediaPackage<T>(
617
+ packageSource: string | ValidatedSessionMediaPackage,
618
+ destinationChatsDirectory: string,
619
+ projectHash: string,
620
+ mediaStore: LocalMediaStore,
621
+ activate?: (imported: ImportedSessionMediaPackage) => Promise<T>,
622
+ ): Promise<T | ImportedSessionMediaPackage> {
623
+ const validated =
624
+ typeof packageSource === 'string'
625
+ ? await validateSessionMediaPackage(packageSource)
626
+ : packageSource;
627
+ await mediaStore.preflightObjects(validated.objects);
628
+ const importedSessionId = randomUUID();
629
+ const portable = await portableRecording(
630
+ validated.recordingBytes,
631
+ undefined,
632
+ projectHash,
633
+ importedSessionId,
634
+ );
635
+ const persistedStates = rewrittenPersistedStates(
636
+ validated.persistedStates,
637
+ projectHash,
638
+ importedSessionId,
639
+ );
640
+ const recordingPath = join(
641
+ destinationChatsDirectory,
642
+ `session-imported-${importedSessionId}.jsonl`,
643
+ );
644
+ const imported: ImportedSessionMediaPackage = {
645
+ recordingPath,
646
+ sessionId: importedSessionId,
647
+ contentIds: validated.objects.map((object) => object.contentId),
648
+ };
649
+ const stagedMedia = await mediaStore.stageObjectFiles(validated.blobs);
650
+ const reservations: ImportReservation[] = [];
651
+ let published: PublishedImportedSession | undefined;
652
+ try {
653
+ for (const [index, reference] of validated.references.entries()) {
654
+ const ownerId = `session-package-import:${importedSessionId}:${index}`;
655
+ await mediaStore.reserve(reference, ownerId);
656
+ reservations.push({ contentId: reference.contentId, ownerId });
657
+ }
658
+ published = await publishImportedSession({
659
+ destinationChatsDirectory,
660
+ recordingPath,
661
+ recordingBytes: portable.bytes,
662
+ persistedStates,
663
+ });
664
+ const releaseFailures = await releaseImportReservations(
665
+ mediaStore,
666
+ reservations,
667
+ );
668
+ assertImportReservationsReleased(releaseFailures);
669
+ } catch (error) {
670
+ return rollbackImport(
671
+ error,
672
+ published,
673
+ stagedMedia,
674
+ mediaStore,
675
+ reservations,
676
+ );
677
+ }
678
+ let result: T | ImportedSessionMediaPackage;
679
+ try {
680
+ result = activate === undefined ? imported : await activate(imported);
681
+ } catch (error) {
682
+ return rollbackImport(
683
+ error,
684
+ published,
685
+ stagedMedia,
686
+ mediaStore,
687
+ reservations,
688
+ );
689
+ }
690
+ stagedMedia.commit();
691
+ return result;
692
+ }