@hashgraphonline/conversational-agent 0.1.217 → 0.1.218

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 (286) hide show
  1. package/cli/readme.md +181 -0
  2. package/dist/cjs/constants/entity-references.d.ts +18 -0
  3. package/dist/cjs/constants/form-priorities.d.ts +24 -0
  4. package/dist/cjs/constants/index.d.ts +4 -0
  5. package/dist/cjs/constants/messages.d.ts +19 -0
  6. package/dist/cjs/constants/test-constants.d.ts +42 -0
  7. package/dist/cjs/conversational-agent.d.ts +3 -8
  8. package/dist/cjs/core/{ToolRegistry.d.ts → tool-registry.d.ts} +10 -7
  9. package/dist/{types/execution/ExecutionPipeline.d.ts → cjs/execution/execution-pipeline.d.ts} +3 -3
  10. package/dist/cjs/forms/field-guidance-registry.d.ts +108 -0
  11. package/dist/cjs/forms/form-generator.d.ts +2 -7
  12. package/dist/cjs/forms/index.d.ts +3 -0
  13. package/dist/cjs/forms/types.d.ts +9 -1
  14. package/dist/cjs/index.cjs +1 -1
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/index.d.ts +7 -12
  17. package/dist/cjs/langchain/external-tool-wrapper.d.ts +101 -0
  18. package/dist/{types/langchain/FormAwareAgentExecutor.d.ts → cjs/langchain/form-aware-agent-executor.d.ts} +19 -12
  19. package/dist/cjs/langchain/index.d.ts +2 -0
  20. package/dist/{types → cjs/langchain}/langchain-agent.d.ts +15 -7
  21. package/dist/cjs/mcp/adapters/index.d.ts +1 -0
  22. package/dist/cjs/mcp/adapters/langchain.d.ts +1 -1
  23. package/dist/{types/mcp/ContentProcessor.d.ts → cjs/mcp/content-processor.d.ts} +1 -1
  24. package/dist/cjs/mcp/index.d.ts +5 -0
  25. package/dist/{types/mcp/MCPClientManager.d.ts → cjs/mcp/mcp-client-manager.d.ts} +1 -1
  26. package/dist/cjs/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
  27. package/dist/cjs/memory/index.d.ts +5 -7
  28. package/dist/{types/memory/MemoryWindow.d.ts → cjs/memory/memory-window.d.ts} +1 -1
  29. package/dist/{types/memory/SmartMemoryManager.d.ts → cjs/memory/smart-memory-manager.d.ts} +1 -1
  30. package/dist/cjs/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
  31. package/dist/cjs/services/context/resolution-context.d.ts +49 -0
  32. package/dist/cjs/services/entity-resolver.d.ts +58 -0
  33. package/dist/cjs/services/formatters/converters/index.d.ts +2 -0
  34. package/dist/cjs/services/formatters/converters/string-normalization-converter.d.ts +13 -0
  35. package/dist/cjs/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
  36. package/dist/cjs/services/formatters/format-converter-registry.d.ts +66 -0
  37. package/dist/cjs/services/formatters/index.d.ts +3 -0
  38. package/dist/cjs/services/formatters/types.d.ts +29 -0
  39. package/dist/cjs/services/index.d.ts +3 -0
  40. package/dist/cjs/services/resolution/resolution-pipeline.d.ts +44 -0
  41. package/dist/cjs/tools/index.d.ts +1 -0
  42. package/dist/cjs/utils/index.d.ts +1 -0
  43. package/dist/esm/index.js +40 -16
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/index10.js +669 -13
  46. package/dist/esm/index10.js.map +1 -1
  47. package/dist/esm/index11.js +310 -95
  48. package/dist/esm/index11.js.map +1 -1
  49. package/dist/esm/index12.js +130 -95
  50. package/dist/esm/index12.js.map +1 -1
  51. package/dist/esm/index13.js +262 -153
  52. package/dist/esm/index13.js.map +1 -1
  53. package/dist/esm/index14.js +100 -664
  54. package/dist/esm/index14.js.map +1 -1
  55. package/dist/esm/index15.js +135 -408
  56. package/dist/esm/index15.js.map +1 -1
  57. package/dist/esm/index16.js +240 -122
  58. package/dist/esm/index16.js.map +1 -1
  59. package/dist/esm/index17.js +147 -135
  60. package/dist/esm/index17.js.map +1 -1
  61. package/dist/esm/index18.js +376 -533
  62. package/dist/esm/index18.js.map +1 -1
  63. package/dist/esm/index19.js +87 -214
  64. package/dist/esm/index19.js.map +1 -1
  65. package/dist/esm/index2.js +21 -4
  66. package/dist/esm/index2.js.map +1 -1
  67. package/dist/esm/index20.js +158 -92
  68. package/dist/esm/index20.js.map +1 -1
  69. package/dist/esm/index21.js +717 -44
  70. package/dist/esm/index21.js.map +1 -1
  71. package/dist/esm/index22.js +58 -96
  72. package/dist/esm/index22.js.map +1 -1
  73. package/dist/esm/index23.js +324 -34
  74. package/dist/esm/index23.js.map +1 -1
  75. package/dist/esm/index24.js +125 -712
  76. package/dist/esm/index24.js.map +1 -1
  77. package/dist/esm/index25.js +113 -133
  78. package/dist/esm/index25.js.map +1 -1
  79. package/dist/esm/index26.js +18 -152
  80. package/dist/esm/index26.js.map +1 -1
  81. package/dist/esm/index27.js +14 -210
  82. package/dist/esm/index27.js.map +1 -1
  83. package/dist/esm/index28.js +70 -173
  84. package/dist/esm/index28.js.map +1 -1
  85. package/dist/esm/index29.js +811 -224
  86. package/dist/esm/index29.js.map +1 -1
  87. package/dist/esm/index30.js +1245 -122
  88. package/dist/esm/index30.js.map +1 -1
  89. package/dist/esm/index31.js +126 -56
  90. package/dist/esm/index31.js.map +1 -1
  91. package/dist/esm/index32.js +111 -24
  92. package/dist/esm/index32.js.map +1 -1
  93. package/dist/esm/index33.js +41 -87
  94. package/dist/esm/index33.js.map +1 -1
  95. package/dist/esm/index34.js +88 -227
  96. package/dist/esm/index34.js.map +1 -1
  97. package/dist/esm/index35.js +24 -0
  98. package/dist/esm/index35.js.map +1 -0
  99. package/dist/esm/index36.js +15 -0
  100. package/dist/esm/index36.js.map +1 -0
  101. package/dist/esm/index37.js +10 -0
  102. package/dist/esm/index37.js.map +1 -0
  103. package/dist/esm/index38.js +8 -0
  104. package/dist/esm/index38.js.map +1 -0
  105. package/dist/esm/index39.js +227 -0
  106. package/dist/esm/index39.js.map +1 -0
  107. package/dist/esm/index40.js +187 -0
  108. package/dist/esm/index40.js.map +1 -0
  109. package/dist/esm/index41.js +30 -0
  110. package/dist/esm/index41.js.map +1 -0
  111. package/dist/esm/index42.js +95 -0
  112. package/dist/esm/index42.js.map +1 -0
  113. package/dist/esm/index5.js +2 -2
  114. package/dist/esm/index5.js.map +1 -1
  115. package/dist/esm/index6.js +44 -67
  116. package/dist/esm/index6.js.map +1 -1
  117. package/dist/esm/index7.js +9 -0
  118. package/dist/esm/index7.js.map +1 -1
  119. package/dist/esm/index8.js +13 -1095
  120. package/dist/esm/index8.js.map +1 -1
  121. package/dist/esm/index9.js +17 -13
  122. package/dist/esm/index9.js.map +1 -1
  123. package/dist/types/constants/entity-references.d.ts +18 -0
  124. package/dist/types/constants/form-priorities.d.ts +24 -0
  125. package/dist/types/constants/index.d.ts +4 -0
  126. package/dist/types/constants/messages.d.ts +19 -0
  127. package/dist/types/constants/test-constants.d.ts +42 -0
  128. package/dist/types/conversational-agent.d.ts +3 -8
  129. package/dist/types/core/{ToolRegistry.d.ts → tool-registry.d.ts} +10 -7
  130. package/dist/{cjs/execution/ExecutionPipeline.d.ts → types/execution/execution-pipeline.d.ts} +3 -3
  131. package/dist/types/forms/field-guidance-registry.d.ts +108 -0
  132. package/dist/types/forms/form-generator.d.ts +2 -7
  133. package/dist/types/forms/index.d.ts +3 -0
  134. package/dist/types/forms/types.d.ts +9 -1
  135. package/dist/types/index.d.ts +7 -12
  136. package/dist/types/langchain/external-tool-wrapper.d.ts +101 -0
  137. package/dist/{cjs/langchain/FormAwareAgentExecutor.d.ts → types/langchain/form-aware-agent-executor.d.ts} +19 -12
  138. package/dist/types/langchain/index.d.ts +2 -0
  139. package/dist/{cjs → types/langchain}/langchain-agent.d.ts +15 -7
  140. package/dist/types/mcp/adapters/index.d.ts +1 -0
  141. package/dist/types/mcp/adapters/langchain.d.ts +1 -1
  142. package/dist/{cjs/mcp/ContentProcessor.d.ts → types/mcp/content-processor.d.ts} +1 -1
  143. package/dist/types/mcp/index.d.ts +5 -0
  144. package/dist/{cjs/mcp/MCPClientManager.d.ts → types/mcp/mcp-client-manager.d.ts} +1 -1
  145. package/dist/types/memory/{ContentStorage.d.ts → content-storage.d.ts} +4 -4
  146. package/dist/types/memory/index.d.ts +5 -7
  147. package/dist/{cjs/memory/MemoryWindow.d.ts → types/memory/memory-window.d.ts} +1 -1
  148. package/dist/{cjs/memory/SmartMemoryManager.d.ts → types/memory/smart-memory-manager.d.ts} +1 -1
  149. package/dist/types/services/{ContentStoreManager.d.ts → content-store-manager.d.ts} +6 -6
  150. package/dist/types/services/context/resolution-context.d.ts +49 -0
  151. package/dist/types/services/entity-resolver.d.ts +58 -0
  152. package/dist/types/services/formatters/converters/index.d.ts +2 -0
  153. package/dist/types/services/formatters/converters/string-normalization-converter.d.ts +13 -0
  154. package/dist/types/services/formatters/converters/topic-id-to-hrl-converter.d.ts +17 -0
  155. package/dist/types/services/formatters/format-converter-registry.d.ts +66 -0
  156. package/dist/types/services/formatters/index.d.ts +3 -0
  157. package/dist/types/services/formatters/types.d.ts +29 -0
  158. package/dist/types/services/index.d.ts +3 -0
  159. package/dist/types/services/resolution/resolution-pipeline.d.ts +44 -0
  160. package/dist/types/tools/index.d.ts +1 -0
  161. package/dist/types/utils/index.d.ts +1 -0
  162. package/package.json +30 -27
  163. package/src/agent-factory.ts +1 -1
  164. package/src/base-agent.ts +9 -0
  165. package/src/config/system-message.ts +2 -15
  166. package/src/constants/entity-references.ts +23 -0
  167. package/src/constants/form-priorities.ts +25 -0
  168. package/src/constants/index.ts +4 -0
  169. package/src/constants/messages.ts +20 -0
  170. package/src/constants/test-constants.ts +49 -0
  171. package/src/conversational-agent.ts +42 -69
  172. package/src/core/{ToolRegistry.ts → tool-registry.ts} +70 -44
  173. package/src/examples/external-tool-wrapper-example.ts +56 -0
  174. package/src/execution/{ExecutionPipeline.ts → execution-pipeline.ts} +3 -3
  175. package/src/forms/field-guidance-registry.ts +415 -0
  176. package/src/forms/field-type-registry.ts +49 -48
  177. package/src/forms/{FormEngine.ts → form-engine.ts} +66 -43
  178. package/src/forms/form-generator.ts +91 -17
  179. package/src/forms/index.ts +4 -1
  180. package/src/forms/types.ts +9 -1
  181. package/src/index.ts +7 -37
  182. package/src/langchain/external-tool-wrapper.ts +90 -0
  183. package/src/langchain/{FormAwareAgentExecutor.ts → form-aware-agent-executor.ts} +579 -351
  184. package/src/langchain/index.ts +2 -0
  185. package/src/{langchain-agent.ts → langchain/langchain-agent.ts} +389 -113
  186. package/src/mcp/adapters/index.ts +1 -0
  187. package/src/mcp/adapters/langchain.ts +27 -18
  188. package/src/mcp/{ContentProcessor.ts → content-processor.ts} +71 -47
  189. package/src/mcp/index.ts +5 -0
  190. package/src/mcp/{MCPClientManager.ts → mcp-client-manager.ts} +2 -2
  191. package/src/memory/{ContentStorage.ts → content-storage.ts} +263 -167
  192. package/src/memory/index.ts +5 -8
  193. package/src/memory/{MemoryWindow.ts → memory-window.ts} +47 -24
  194. package/src/memory/{SmartMemoryManager.ts → smart-memory-manager.ts} +49 -22
  195. package/src/plugins/hbar/HbarPlugin.ts +1 -1
  196. package/src/plugins/hcs-10/HCS10Plugin.ts +46 -28
  197. package/src/scripts/test-external-tool-wrapper.ts +6 -6
  198. package/src/scripts/test-inscribe-form-generation.ts +22 -21
  199. package/src/scripts/test-inscribe-wrapper-verification.ts +5 -4
  200. package/src/services/{ContentStoreManager.ts → content-store-manager.ts} +75 -33
  201. package/src/services/context/resolution-context.ts +80 -0
  202. package/src/services/entity-resolver.ts +425 -0
  203. package/src/services/formatters/converters/index.ts +2 -0
  204. package/src/services/formatters/converters/string-normalization-converter.ts +106 -0
  205. package/src/services/formatters/converters/topic-id-to-hrl-converter.ts +25 -0
  206. package/src/services/formatters/format-converter-registry.ts +229 -0
  207. package/src/services/formatters/index.ts +3 -0
  208. package/src/services/formatters/types.ts +31 -0
  209. package/src/services/index.ts +3 -0
  210. package/src/services/resolution/resolution-pipeline.ts +106 -0
  211. package/src/tools/index.ts +1 -0
  212. package/src/types/content-reference.ts +87 -60
  213. package/src/utils/index.ts +1 -0
  214. package/cli/dist/CLIApp.d.ts +0 -9
  215. package/cli/dist/CLIApp.js +0 -127
  216. package/cli/dist/LocalConversationalAgent.d.ts +0 -37
  217. package/cli/dist/LocalConversationalAgent.js +0 -58
  218. package/cli/dist/app.d.ts +0 -16
  219. package/cli/dist/app.js +0 -13
  220. package/cli/dist/cli.d.ts +0 -2
  221. package/cli/dist/cli.js +0 -51
  222. package/cli/dist/components/AppContainer.d.ts +0 -16
  223. package/cli/dist/components/AppContainer.js +0 -24
  224. package/cli/dist/components/AppScreens.d.ts +0 -2
  225. package/cli/dist/components/AppScreens.js +0 -259
  226. package/cli/dist/components/ChatScreen.d.ts +0 -15
  227. package/cli/dist/components/ChatScreen.js +0 -39
  228. package/cli/dist/components/DebugLoadingScreen.d.ts +0 -5
  229. package/cli/dist/components/DebugLoadingScreen.js +0 -31
  230. package/cli/dist/components/LoadingScreen.d.ts +0 -2
  231. package/cli/dist/components/LoadingScreen.js +0 -16
  232. package/cli/dist/components/LoadingScreenDebug.d.ts +0 -5
  233. package/cli/dist/components/LoadingScreenDebug.js +0 -27
  234. package/cli/dist/components/MCPConfigScreen.d.ts +0 -28
  235. package/cli/dist/components/MCPConfigScreen.js +0 -168
  236. package/cli/dist/components/ScreenRouter.d.ts +0 -12
  237. package/cli/dist/components/ScreenRouter.js +0 -22
  238. package/cli/dist/components/SetupScreen.d.ts +0 -15
  239. package/cli/dist/components/SetupScreen.js +0 -65
  240. package/cli/dist/components/SingleLoadingScreen.d.ts +0 -5
  241. package/cli/dist/components/SingleLoadingScreen.js +0 -27
  242. package/cli/dist/components/StatusBadge.d.ts +0 -7
  243. package/cli/dist/components/StatusBadge.js +0 -28
  244. package/cli/dist/components/TerminalWindow.d.ts +0 -8
  245. package/cli/dist/components/TerminalWindow.js +0 -24
  246. package/cli/dist/components/WelcomeScreen.d.ts +0 -11
  247. package/cli/dist/components/WelcomeScreen.js +0 -47
  248. package/cli/dist/context/AppContext.d.ts +0 -68
  249. package/cli/dist/context/AppContext.js +0 -363
  250. package/cli/dist/hooks/useInitializeAgent.d.ts +0 -19
  251. package/cli/dist/hooks/useInitializeAgent.js +0 -28
  252. package/cli/dist/hooks/useStableState.d.ts +0 -38
  253. package/cli/dist/hooks/useStableState.js +0 -68
  254. package/cli/dist/managers/AgentManager.d.ts +0 -57
  255. package/cli/dist/managers/AgentManager.js +0 -119
  256. package/cli/dist/managers/ConfigManager.d.ts +0 -53
  257. package/cli/dist/managers/ConfigManager.js +0 -173
  258. package/cli/dist/types.d.ts +0 -31
  259. package/cli/dist/types.js +0 -19
  260. package/dist/cjs/context/ReferenceContextManager.d.ts +0 -84
  261. package/dist/cjs/context/ReferenceResponseProcessor.d.ts +0 -76
  262. package/dist/cjs/langchain/FormValidatingToolWrapper.d.ts +0 -81
  263. package/dist/cjs/services/EntityResolver.d.ts +0 -26
  264. package/dist/types/context/ReferenceContextManager.d.ts +0 -84
  265. package/dist/types/context/ReferenceResponseProcessor.d.ts +0 -76
  266. package/dist/types/langchain/FormValidatingToolWrapper.d.ts +0 -81
  267. package/dist/types/services/EntityResolver.d.ts +0 -26
  268. package/src/context/ReferenceContextManager.ts +0 -350
  269. package/src/context/ReferenceResponseProcessor.ts +0 -295
  270. package/src/langchain/FormValidatingToolWrapper.ts +0 -355
  271. package/src/scripts/test-hedera-kit-wrapper.ts +0 -265
  272. package/src/services/EntityResolver.ts +0 -128
  273. /package/dist/cjs/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
  274. /package/dist/cjs/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
  275. /package/dist/cjs/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
  276. /package/dist/cjs/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
  277. /package/dist/cjs/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
  278. /package/dist/types/forms/{FormEngine.d.ts → form-engine.d.ts} +0 -0
  279. /package/dist/types/memory/{ReferenceIdGenerator.d.ts → reference-id-generator.d.ts} +0 -0
  280. /package/dist/types/memory/{TokenCounter.d.ts → token-counter.d.ts} +0 -0
  281. /package/dist/types/tools/{EntityResolverTool.d.ts → entity-resolver-tool.d.ts} +0 -0
  282. /package/dist/types/utils/{ResponseFormatter.d.ts → response-formatter.d.ts} +0 -0
  283. /package/src/memory/{ReferenceIdGenerator.ts → reference-id-generator.ts} +0 -0
  284. /package/src/memory/{TokenCounter.ts → token-counter.ts} +0 -0
  285. /package/src/tools/{EntityResolverTool.ts → entity-resolver-tool.ts} +0 -0
  286. /package/src/utils/{ResponseFormatter.ts → response-formatter.ts} +0 -0
@@ -1,49 +1,722 @@
1
- import { z } from "zod";
2
- import { AccountBuilder } from "./index33.js";
3
- import { BaseHederaTransactionTool } from "hedera-agent-kit";
4
- const HbarTransferInputSchema = z.object({
5
- accountId: z.string().describe('Account ID for the transfer (e.g., "0.0.xxxx").'),
6
- amount: z.union([z.number(), z.string()]).describe(
7
- "HBAR amount in decimal format (e.g., 1 for 1 HBAR, 0.5 for 0.5 HBAR). Positive for credit, negative for debit. DO NOT multiply by 10^8 for tinybars - just use the HBAR amount directly."
8
- )
9
- });
10
- const TransferHbarZodSchemaCore = z.object({
11
- transfers: z.array(HbarTransferInputSchema).min(1).describe(
12
- 'Array of transfers. For simple transfers from your operator account, just include the recipient with positive amount: [{accountId: "0.0.800", amount: 1}]. For complex multi-party transfers, include all parties with negative amounts for senders and positive for receivers.'
13
- ),
14
- memo: z.string().optional().describe("Optional. Memo for the transaction.")
15
- });
16
- class TransferHbarTool extends BaseHederaTransactionTool {
17
- constructor() {
18
- super(...arguments);
19
- this.name = "hedera-account-transfer-hbar-v2";
20
- this.description = 'PRIMARY TOOL FOR HBAR TRANSFERS: Transfers HBAR between accounts. For simple transfers from the operator account, just specify the recipient with a positive amount (e.g., [{accountId: "0.0.800", amount: 1}] to send 1 HBAR to 0.0.800). The sender will be automatically added. For multi-party transfers (e.g., "A sends 5 HBAR to C and B sends 3 HBAR to C"), include ALL transfers with their amounts (negative for senders, positive for receivers).';
21
- this.specificInputSchema = TransferHbarZodSchemaCore;
22
- this.namespace = "account";
23
- }
24
- /**
25
- * Creates and returns the service builder for account operations.
26
- *
27
- * @returns BaseServiceBuilder instance configured for account operations
28
- */
29
- getServiceBuilder() {
30
- return new AccountBuilder(this.hederaKit);
31
- }
32
- /**
33
- * Executes the HBAR transfer using the provided builder and arguments.
34
- * Validates that all transfers sum to zero before execution.
35
- *
36
- * @param builder - The service builder instance for executing transactions
37
- * @param specificArgs - The validated transfer parameters including transfers array and optional memo
38
- * @returns Promise that resolves when the transfer is complete
39
- */
40
- async callBuilderMethod(builder, specificArgs) {
41
- await builder.transferHbar(
42
- specificArgs
1
+ import { ReferenceIdGenerator } from "./index22.js";
2
+ import { DEFAULT_CONTENT_REFERENCE_CONFIG, ContentReferenceError } from "./index41.js";
3
+ const _ContentStorage = class _ContentStorage {
4
+ constructor(maxStorage = _ContentStorage.DEFAULT_MAX_STORAGE, referenceConfig) {
5
+ this.messages = [];
6
+ this.idCounter = 0;
7
+ this.contentStore = /* @__PURE__ */ new Map();
8
+ this.maxStorage = maxStorage;
9
+ this.referenceConfig = {
10
+ ...DEFAULT_CONTENT_REFERENCE_CONFIG,
11
+ ...referenceConfig
12
+ };
13
+ this.referenceStats = {
14
+ activeReferences: 0,
15
+ totalStorageBytes: 0,
16
+ recentlyCleanedUp: 0,
17
+ totalResolutions: 0,
18
+ failedResolutions: 0,
19
+ averageContentSize: 0,
20
+ storageUtilization: 0,
21
+ performanceMetrics: {
22
+ averageCreationTimeMs: 0,
23
+ averageResolutionTimeMs: 0,
24
+ averageCleanupTimeMs: 0,
25
+ creationTimes: [],
26
+ resolutionTimes: [],
27
+ cleanupTimes: []
28
+ }
29
+ };
30
+ if (this.referenceConfig.enableAutoCleanup) {
31
+ this.startReferenceCleanupTimer();
32
+ }
33
+ }
34
+ /**
35
+ * Store messages in the content storage
36
+ * Automatically drops oldest messages if storage limit is exceeded
37
+ * @param messages - Messages to store
38
+ * @returns Result indicating how many messages were stored and dropped
39
+ */
40
+ storeMessages(messages) {
41
+ if (messages.length === 0) {
42
+ return { stored: 0, dropped: 0 };
43
+ }
44
+ const now = /* @__PURE__ */ new Date();
45
+ let dropped = 0;
46
+ const storedMessages = messages.map((message) => ({
47
+ message,
48
+ storedAt: now,
49
+ id: this.generateId()
50
+ }));
51
+ this.messages.push(...storedMessages);
52
+ while (this.messages.length > this.maxStorage) {
53
+ this.messages.shift();
54
+ dropped++;
55
+ }
56
+ return {
57
+ stored: storedMessages.length,
58
+ dropped
59
+ };
60
+ }
61
+ /**
62
+ * Get the most recent messages from storage
63
+ * @param count - Number of recent messages to retrieve
64
+ * @returns Array of recent messages in chronological order
65
+ */
66
+ getRecentMessages(count) {
67
+ if (count <= 0 || this.messages.length === 0) {
68
+ return [];
69
+ }
70
+ const startIndex = Math.max(0, this.messages.length - count);
71
+ return this.messages.slice(startIndex).map((stored) => stored.message);
72
+ }
73
+ /**
74
+ * Search for messages containing specific text or patterns
75
+ * @param query - Search term or regex pattern
76
+ * @param options - Search configuration options
77
+ * @returns Array of matching messages
78
+ */
79
+ searchMessages(query, options = {}) {
80
+ if (!query || this.messages.length === 0) {
81
+ return [];
82
+ }
83
+ const { caseSensitive = false, limit, useRegex = false } = options;
84
+ let matches = [];
85
+ if (useRegex) {
86
+ try {
87
+ const regex = new RegExp(query, caseSensitive ? "g" : "gi");
88
+ matches = this.messages.filter((stored) => regex.test(stored.message.content)).map((stored) => stored.message);
89
+ } catch {
90
+ return [];
91
+ }
92
+ } else {
93
+ const searchTerm = caseSensitive ? query : query.toLowerCase();
94
+ matches = this.messages.filter((stored) => {
95
+ const content = stored.message.content;
96
+ const searchContent = caseSensitive ? content : content.toLowerCase();
97
+ return searchContent.includes(searchTerm);
98
+ }).map((stored) => stored.message);
99
+ }
100
+ return limit ? matches.slice(0, limit) : matches;
101
+ }
102
+ /**
103
+ * Get messages from a specific time range
104
+ * @param startTime - Start of time range (inclusive)
105
+ * @param endTime - End of time range (inclusive)
106
+ * @returns Array of messages within the time range
107
+ */
108
+ getMessagesFromTimeRange(startTime, endTime) {
109
+ if (startTime > endTime || this.messages.length === 0) {
110
+ return [];
111
+ }
112
+ return this.messages.filter(
113
+ (stored) => stored.storedAt >= startTime && stored.storedAt <= endTime
114
+ ).map((stored) => stored.message);
115
+ }
116
+ /**
117
+ * Get storage statistics and usage information
118
+ * @returns Current storage statistics
119
+ */
120
+ getStorageStats() {
121
+ const totalMessages = this.messages.length;
122
+ const usagePercentage = totalMessages > 0 ? Math.round(totalMessages / this.maxStorage * 100) : 0;
123
+ let oldestMessageTime;
124
+ let newestMessageTime;
125
+ if (totalMessages > 0) {
126
+ oldestMessageTime = this.messages[0].storedAt;
127
+ newestMessageTime = this.messages[totalMessages - 1].storedAt;
128
+ }
129
+ return {
130
+ totalMessages,
131
+ maxStorageLimit: this.maxStorage,
132
+ usagePercentage,
133
+ oldestMessageTime,
134
+ newestMessageTime
135
+ };
136
+ }
137
+ /**
138
+ * Clear all stored messages
139
+ */
140
+ clear() {
141
+ this.messages = [];
142
+ this.idCounter = 0;
143
+ }
144
+ /**
145
+ * Get total number of stored messages
146
+ * @returns Number of messages currently in storage
147
+ */
148
+ getTotalStoredMessages() {
149
+ return this.messages.length;
150
+ }
151
+ /**
152
+ * Update the maximum storage limit
153
+ * @param newLimit - New maximum storage limit
154
+ */
155
+ updateStorageLimit(newLimit) {
156
+ if (newLimit <= 0) {
157
+ throw new Error("Storage limit must be greater than 0");
158
+ }
159
+ this.maxStorage = newLimit;
160
+ while (this.messages.length > this.maxStorage) {
161
+ this.messages.shift();
162
+ }
163
+ }
164
+ /**
165
+ * Get messages by message type
166
+ * @param messageType - Type of messages to retrieve ('human', 'ai', 'system', etc.)
167
+ * @param limit - Maximum number of messages to return
168
+ * @returns Array of messages of the specified type
169
+ */
170
+ getMessagesByType(messageType, limit) {
171
+ const filtered = this.messages.filter((stored) => stored.message._getType() === messageType).map((stored) => stored.message);
172
+ return limit ? filtered.slice(0, limit) : filtered;
173
+ }
174
+ /**
175
+ * Get the current storage configuration
176
+ * @returns Storage configuration object
177
+ */
178
+ getConfig() {
179
+ return {
180
+ maxStorage: this.maxStorage,
181
+ currentUsage: this.messages.length,
182
+ utilizationPercentage: this.messages.length / this.maxStorage * 100
183
+ };
184
+ }
185
+ /**
186
+ * Generate a unique ID for stored messages
187
+ * @returns Unique string identifier
188
+ */
189
+ generateId() {
190
+ return `msg_${++this.idCounter}_${Date.now()}`;
191
+ }
192
+ /**
193
+ * Get messages stored within the last N minutes
194
+ * @param minutes - Number of minutes to look back
195
+ * @returns Array of messages from the last N minutes
196
+ */
197
+ getRecentMessagesByTime(minutes) {
198
+ if (minutes <= 0 || this.messages.length === 0) {
199
+ return [];
200
+ }
201
+ const cutoffTime = new Date(Date.now() - minutes * 60 * 1e3);
202
+ return this.messages.filter((stored) => stored.storedAt >= cutoffTime).map((stored) => stored.message);
203
+ }
204
+ /**
205
+ * Export messages to a JSON-serializable format
206
+ * @returns Serializable representation of stored messages
207
+ */
208
+ exportMessages() {
209
+ return this.messages.map((stored) => ({
210
+ content: stored.message.content,
211
+ type: stored.message._getType(),
212
+ storedAt: stored.storedAt.toISOString(),
213
+ id: stored.id
214
+ }));
215
+ }
216
+ /**
217
+ * Determine if content should be stored as a reference based on size
218
+ */
219
+ shouldUseReference(content) {
220
+ const size = Buffer.isBuffer(content) ? content.length : Buffer.byteLength(content, "utf8");
221
+ return size > this.referenceConfig.sizeThresholdBytes;
222
+ }
223
+ /**
224
+ * Store content and return a reference if it exceeds the size threshold
225
+ * Otherwise returns null to indicate direct content should be used
226
+ *
227
+ * Special case: Image files are ALWAYS stored as references regardless of size
228
+ * because they need special handling for inscription tools
229
+ */
230
+ async storeContentIfLarge(content, metadata) {
231
+ const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content, "utf8");
232
+ const isImageFile = this.isImageContent(
233
+ metadata.mimeType,
234
+ metadata.fileName
235
+ );
236
+ if (!isImageFile && !this.shouldUseReference(buffer)) {
237
+ return null;
238
+ }
239
+ const storeMetadata = {
240
+ contentType: metadata.contentType || this.detectContentType(buffer, metadata.mimeType),
241
+ sizeBytes: buffer.length,
242
+ source: metadata.source,
243
+ tags: []
244
+ };
245
+ if (metadata.mimeType !== void 0) {
246
+ storeMetadata.mimeType = metadata.mimeType;
247
+ }
248
+ if (metadata.mcpToolName !== void 0) {
249
+ storeMetadata.mcpToolName = metadata.mcpToolName;
250
+ }
251
+ if (metadata.fileName !== void 0) {
252
+ storeMetadata.fileName = metadata.fileName;
253
+ }
254
+ if (metadata.tags !== void 0) {
255
+ storeMetadata.tags = metadata.tags;
256
+ }
257
+ if (metadata.customMetadata !== void 0) {
258
+ storeMetadata.customMetadata = metadata.customMetadata;
259
+ }
260
+ return await this.storeContent(buffer, storeMetadata);
261
+ }
262
+ /**
263
+ * Store content and return a reference (implements ContentReferenceStore)
264
+ */
265
+ async storeContent(content, metadata) {
266
+ const startTime = Date.now();
267
+ try {
268
+ const now = /* @__PURE__ */ new Date();
269
+ const referenceId = ReferenceIdGenerator.generateId(content);
270
+ const fullMetadata = {
271
+ ...metadata,
272
+ createdAt: now,
273
+ lastAccessedAt: now,
274
+ accessCount: 0
275
+ };
276
+ const storedContent = {
277
+ content,
278
+ metadata: fullMetadata,
279
+ state: "active"
280
+ };
281
+ const expirationTime = this.calculateExpirationTime(metadata.source);
282
+ if (expirationTime !== void 0) {
283
+ storedContent.expiresAt = expirationTime;
284
+ }
285
+ this.contentStore.set(referenceId, storedContent);
286
+ this.updateStatsAfterStore(content.length);
287
+ await this.enforceReferenceStorageLimits();
288
+ const preview = this.createContentPreview(
289
+ content,
290
+ fullMetadata.contentType
291
+ );
292
+ const referenceMetadata = {
293
+ contentType: fullMetadata.contentType,
294
+ sizeBytes: fullMetadata.sizeBytes,
295
+ source: fullMetadata.source
296
+ };
297
+ if (fullMetadata.fileName !== void 0) {
298
+ referenceMetadata.fileName = fullMetadata.fileName;
299
+ }
300
+ if (fullMetadata.mimeType !== void 0) {
301
+ referenceMetadata.mimeType = fullMetadata.mimeType;
302
+ }
303
+ const reference = {
304
+ referenceId,
305
+ state: "active",
306
+ preview,
307
+ metadata: referenceMetadata,
308
+ createdAt: now,
309
+ format: "ref://{id}"
310
+ };
311
+ const duration = Date.now() - startTime;
312
+ this.recordPerformanceMetric("creation", duration);
313
+ return reference;
314
+ } catch (error) {
315
+ const duration = Date.now() - startTime;
316
+ this.recordPerformanceMetric("creation", duration);
317
+ throw new ContentReferenceError(
318
+ `Failed to store content: ${error instanceof Error ? error.message : "Unknown error"}`,
319
+ "system_error",
320
+ void 0,
321
+ ["Try again", "Check storage limits", "Contact administrator"]
322
+ );
323
+ }
324
+ }
325
+ /**
326
+ * Resolve a reference to its content (implements ContentReferenceStore)
327
+ */
328
+ async resolveReference(referenceId) {
329
+ const startTime = Date.now();
330
+ try {
331
+ if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {
332
+ this.referenceStats.failedResolutions++;
333
+ return {
334
+ success: false,
335
+ error: "Invalid reference ID format",
336
+ errorType: "not_found",
337
+ suggestedActions: [
338
+ "Check the reference ID format",
339
+ "Ensure the reference ID is complete"
340
+ ]
341
+ };
342
+ }
343
+ const storedContent = this.contentStore.get(referenceId);
344
+ if (!storedContent) {
345
+ this.referenceStats.failedResolutions++;
346
+ return {
347
+ success: false,
348
+ error: "Reference not found",
349
+ errorType: "not_found",
350
+ suggestedActions: [
351
+ "Verify the reference ID",
352
+ "Check if the content has expired",
353
+ "Request fresh content"
354
+ ]
355
+ };
356
+ }
357
+ if (storedContent.expiresAt && storedContent.expiresAt < /* @__PURE__ */ new Date()) {
358
+ storedContent.state = "expired";
359
+ this.referenceStats.failedResolutions++;
360
+ return {
361
+ success: false,
362
+ error: "Reference has expired",
363
+ errorType: "expired",
364
+ suggestedActions: [
365
+ "Request fresh content",
366
+ "Use alternative content source"
367
+ ]
368
+ };
369
+ }
370
+ if (storedContent.state !== "active") {
371
+ this.referenceStats.failedResolutions++;
372
+ return {
373
+ success: false,
374
+ error: `Reference is ${storedContent.state}`,
375
+ errorType: storedContent.state === "expired" ? "expired" : "corrupted",
376
+ suggestedActions: [
377
+ "Request fresh content",
378
+ "Check reference validity"
379
+ ]
380
+ };
381
+ }
382
+ storedContent.metadata.lastAccessedAt = /* @__PURE__ */ new Date();
383
+ storedContent.metadata.accessCount++;
384
+ this.referenceStats.totalResolutions++;
385
+ const duration = Date.now() - startTime;
386
+ this.recordPerformanceMetric("resolution", duration);
387
+ return {
388
+ success: true,
389
+ content: storedContent.content,
390
+ metadata: storedContent.metadata
391
+ };
392
+ } catch (error) {
393
+ const duration = Date.now() - startTime;
394
+ this.recordPerformanceMetric("resolution", duration);
395
+ this.referenceStats.failedResolutions++;
396
+ return {
397
+ success: false,
398
+ error: `System error resolving reference: ${error instanceof Error ? error.message : "Unknown error"}`,
399
+ errorType: "system_error",
400
+ suggestedActions: ["Try again", "Contact administrator"]
401
+ };
402
+ }
403
+ }
404
+ /**
405
+ * Check if a reference exists and is valid
406
+ */
407
+ async hasReference(referenceId) {
408
+ if (!ReferenceIdGenerator.isValidReferenceId(referenceId)) {
409
+ return false;
410
+ }
411
+ const storedContent = this.contentStore.get(referenceId);
412
+ if (!storedContent) {
413
+ return false;
414
+ }
415
+ if (storedContent.expiresAt && storedContent.expiresAt < /* @__PURE__ */ new Date()) {
416
+ storedContent.state = "expired";
417
+ return false;
418
+ }
419
+ return storedContent.state === "active";
420
+ }
421
+ /**
422
+ * Mark a reference for cleanup
423
+ */
424
+ async cleanupReference(referenceId) {
425
+ const storedContent = this.contentStore.get(referenceId);
426
+ if (!storedContent) {
427
+ return false;
428
+ }
429
+ this.referenceStats.totalStorageBytes -= storedContent.content.length;
430
+ this.referenceStats.activeReferences--;
431
+ this.referenceStats.recentlyCleanedUp++;
432
+ this.contentStore.delete(referenceId);
433
+ return true;
434
+ }
435
+ /**
436
+ * Get current reference storage statistics (implements ContentReferenceStore)
437
+ */
438
+ async getStats() {
439
+ this.updateReferenceStorageStats();
440
+ return {
441
+ ...this.referenceStats,
442
+ performanceMetrics: {
443
+ averageCreationTimeMs: this.calculateAverage(
444
+ this.referenceStats.performanceMetrics.creationTimes
445
+ ),
446
+ averageResolutionTimeMs: this.calculateAverage(
447
+ this.referenceStats.performanceMetrics.resolutionTimes
448
+ ),
449
+ averageCleanupTimeMs: this.calculateAverage(
450
+ this.referenceStats.performanceMetrics.cleanupTimes
451
+ )
452
+ }
453
+ };
454
+ }
455
+ /**
456
+ * Update reference configuration
457
+ */
458
+ async updateConfig(config) {
459
+ this.referenceConfig = { ...this.referenceConfig, ...config };
460
+ if (this.cleanupTimer) {
461
+ clearInterval(this.cleanupTimer);
462
+ delete this.cleanupTimer;
463
+ }
464
+ if (this.referenceConfig.enableAutoCleanup) {
465
+ this.startReferenceCleanupTimer();
466
+ }
467
+ }
468
+ /**
469
+ * Perform cleanup based on current policies (implements ContentReferenceStore)
470
+ */
471
+ async performCleanup() {
472
+ const startTime = Date.now();
473
+ const errors = [];
474
+ let cleanedUp = 0;
475
+ try {
476
+ const now = /* @__PURE__ */ new Date();
477
+ const toCleanup = [];
478
+ for (const [referenceId, storedContent] of this.contentStore.entries()) {
479
+ let shouldCleanup = false;
480
+ if (storedContent.expiresAt && storedContent.expiresAt < now) {
481
+ shouldCleanup = true;
482
+ storedContent.state = "expired";
483
+ }
484
+ const ageMs = now.getTime() - storedContent.metadata.createdAt.getTime();
485
+ const policy = this.getCleanupPolicy(storedContent.metadata.source);
486
+ if (ageMs > policy.maxAgeMs) {
487
+ shouldCleanup = true;
488
+ }
489
+ if (storedContent.state === "cleanup_pending") {
490
+ shouldCleanup = true;
491
+ }
492
+ if (shouldCleanup) {
493
+ toCleanup.push(referenceId);
494
+ }
495
+ }
496
+ toCleanup.sort((a, b) => {
497
+ const aContent = this.contentStore.get(a);
498
+ const bContent = this.contentStore.get(b);
499
+ const aPriority = this.getCleanupPolicy(
500
+ aContent.metadata.source
501
+ ).priority;
502
+ const bPriority = this.getCleanupPolicy(
503
+ bContent.metadata.source
504
+ ).priority;
505
+ return bPriority - aPriority;
506
+ });
507
+ for (const referenceId of toCleanup) {
508
+ try {
509
+ const success = await this.cleanupReference(referenceId);
510
+ if (success) {
511
+ cleanedUp++;
512
+ }
513
+ } catch (error) {
514
+ errors.push(
515
+ `Failed to cleanup ${referenceId}: ${error instanceof Error ? error.message : "Unknown error"}`
516
+ );
517
+ }
518
+ }
519
+ if (this.contentStore.size > this.referenceConfig.maxReferences) {
520
+ const sortedByAge = Array.from(this.contentStore.entries()).sort(
521
+ ([, a], [, b]) => a.metadata.lastAccessedAt.getTime() - b.metadata.lastAccessedAt.getTime()
522
+ );
523
+ const excessCount = this.contentStore.size - this.referenceConfig.maxReferences;
524
+ for (let i = 0; i < excessCount && i < sortedByAge.length; i++) {
525
+ const [referenceId] = sortedByAge[i];
526
+ try {
527
+ const success = await this.cleanupReference(referenceId);
528
+ if (success) {
529
+ cleanedUp++;
530
+ }
531
+ } catch (error) {
532
+ errors.push(
533
+ `Failed to cleanup excess reference ${referenceId}: ${error instanceof Error ? error.message : "Unknown error"}`
534
+ );
535
+ }
536
+ }
537
+ }
538
+ const duration = Date.now() - startTime;
539
+ this.recordPerformanceMetric("cleanup", duration);
540
+ return { cleanedUp, errors };
541
+ } catch (error) {
542
+ const duration = Date.now() - startTime;
543
+ this.recordPerformanceMetric("cleanup", duration);
544
+ const errorMessage = `Cleanup process failed: ${error instanceof Error ? error.message : "Unknown error"}`;
545
+ errors.push(errorMessage);
546
+ return { cleanedUp, errors };
547
+ }
548
+ }
549
+ /**
550
+ * Get reference configuration for debugging
551
+ */
552
+ getReferenceConfig() {
553
+ return { ...this.referenceConfig };
554
+ }
555
+ async enforceReferenceStorageLimits() {
556
+ if (this.contentStore.size >= this.referenceConfig.maxReferences) {
557
+ await this.performCleanup();
558
+ }
559
+ if (this.referenceStats.totalStorageBytes >= this.referenceConfig.maxTotalStorageBytes) {
560
+ await this.performCleanup();
561
+ }
562
+ }
563
+ calculateExpirationTime(source) {
564
+ const policy = this.getCleanupPolicy(source);
565
+ return new Date(Date.now() + policy.maxAgeMs);
566
+ }
567
+ getCleanupPolicy(source) {
568
+ switch (source) {
569
+ case "mcp_tool":
570
+ return this.referenceConfig.cleanupPolicies.recent;
571
+ case "user_upload":
572
+ return this.referenceConfig.cleanupPolicies.userContent;
573
+ case "agent_generated":
574
+ return this.referenceConfig.cleanupPolicies.agentGenerated;
575
+ default:
576
+ return this.referenceConfig.cleanupPolicies.default;
577
+ }
578
+ }
579
+ detectContentType(content, mimeType) {
580
+ if (mimeType) {
581
+ if (mimeType === "text/html") return "html";
582
+ if (mimeType === "text/markdown") return "markdown";
583
+ if (mimeType === "application/json") return "json";
584
+ if (mimeType.startsWith("text/")) return "text";
585
+ return "binary";
586
+ }
587
+ const contentStr = content.toString(
588
+ "utf8",
589
+ 0,
590
+ Math.min(content.length, 1e3)
43
591
  );
592
+ if (contentStr.startsWith("{") || contentStr.startsWith("[")) return "json";
593
+ if (contentStr.includes("<html>") || contentStr.includes("<!DOCTYPE"))
594
+ return "html";
595
+ if (contentStr.includes("#") && contentStr.includes("\n"))
596
+ return "markdown";
597
+ return "text";
598
+ }
599
+ createContentPreview(content, contentType) {
600
+ const maxLength = 200;
601
+ let preview = content.toString(
602
+ "utf8",
603
+ 0,
604
+ Math.min(content.length, maxLength * 2)
605
+ );
606
+ if (contentType === "html") {
607
+ preview = preview.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim();
608
+ } else if (contentType === "json") {
609
+ try {
610
+ const parsed = JSON.parse(preview);
611
+ preview = JSON.stringify(parsed, null, 0);
612
+ } catch {
613
+ }
614
+ }
615
+ preview = preview.trim();
616
+ if (preview.length > maxLength) {
617
+ preview = preview.substring(0, maxLength) + "...";
618
+ }
619
+ return preview || "[Binary content]";
620
+ }
621
+ updateStatsAfterStore(sizeBytes) {
622
+ this.referenceStats.activeReferences++;
623
+ this.referenceStats.totalStorageBytes += sizeBytes;
624
+ this.updateReferenceStorageStats();
44
625
  }
45
- }
626
+ updateReferenceStorageStats() {
627
+ if (this.referenceStats.activeReferences > 0) {
628
+ this.referenceStats.averageContentSize = this.referenceStats.totalStorageBytes / this.referenceStats.activeReferences;
629
+ }
630
+ this.referenceStats.storageUtilization = this.referenceStats.totalStorageBytes / this.referenceConfig.maxTotalStorageBytes * 100;
631
+ let mostAccessedId;
632
+ let maxAccess = 0;
633
+ for (const [referenceId, storedContent] of this.contentStore.entries()) {
634
+ if (storedContent.metadata.accessCount > maxAccess) {
635
+ maxAccess = storedContent.metadata.accessCount;
636
+ mostAccessedId = referenceId;
637
+ }
638
+ }
639
+ if (mostAccessedId !== void 0) {
640
+ this.referenceStats.mostAccessedReferenceId = mostAccessedId;
641
+ } else {
642
+ delete this.referenceStats.mostAccessedReferenceId;
643
+ }
644
+ }
645
+ /**
646
+ * Check if content is an image file based on MIME type or filename
647
+ */
648
+ isImageContent(mimeType, fileName) {
649
+ if (mimeType && mimeType.startsWith("image/")) {
650
+ return true;
651
+ }
652
+ if (fileName) {
653
+ const lowerFileName = fileName.toLowerCase();
654
+ const imageExtensions = [
655
+ ".png",
656
+ ".jpg",
657
+ ".jpeg",
658
+ ".gif",
659
+ ".bmp",
660
+ ".webp",
661
+ ".svg",
662
+ ".tiff",
663
+ ".ico"
664
+ ];
665
+ return imageExtensions.some((ext) => lowerFileName.endsWith(ext));
666
+ }
667
+ return false;
668
+ }
669
+ recordPerformanceMetric(type, timeMs) {
670
+ const metrics = this.referenceStats.performanceMetrics;
671
+ const maxRecords = 100;
672
+ switch (type) {
673
+ case "creation":
674
+ metrics.creationTimes.push(timeMs);
675
+ if (metrics.creationTimes.length > maxRecords) {
676
+ metrics.creationTimes.shift();
677
+ }
678
+ break;
679
+ case "resolution":
680
+ metrics.resolutionTimes.push(timeMs);
681
+ if (metrics.resolutionTimes.length > maxRecords) {
682
+ metrics.resolutionTimes.shift();
683
+ }
684
+ break;
685
+ case "cleanup":
686
+ metrics.cleanupTimes.push(timeMs);
687
+ if (metrics.cleanupTimes.length > maxRecords) {
688
+ metrics.cleanupTimes.shift();
689
+ }
690
+ break;
691
+ }
692
+ }
693
+ calculateAverage(times) {
694
+ if (times.length === 0) return 0;
695
+ return times.reduce((sum, time) => sum + time, 0) / times.length;
696
+ }
697
+ startReferenceCleanupTimer() {
698
+ this.cleanupTimer = setInterval(async () => {
699
+ try {
700
+ await this.performCleanup();
701
+ } catch {
702
+ }
703
+ }, this.referenceConfig.cleanupIntervalMs);
704
+ }
705
+ /**
706
+ * Clean up resources (enhanced to include reference cleanup)
707
+ */
708
+ async dispose() {
709
+ if (this.cleanupTimer) {
710
+ clearInterval(this.cleanupTimer);
711
+ delete this.cleanupTimer;
712
+ }
713
+ this.contentStore.clear();
714
+ this.clear();
715
+ }
716
+ };
717
+ _ContentStorage.DEFAULT_MAX_STORAGE = 1e3;
718
+ let ContentStorage = _ContentStorage;
46
719
  export {
47
- TransferHbarTool
720
+ ContentStorage
48
721
  };
49
722
  //# sourceMappingURL=index21.js.map