zora-agent 0.9.4 → 0.9.6

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 (245) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +103 -92
  3. package/dist/cli/audit-commands.d.ts.map +1 -1
  4. package/dist/cli/audit-commands.js +3 -1
  5. package/dist/cli/audit-commands.js.map +1 -1
  6. package/dist/cli/daemon.js +86 -28
  7. package/dist/cli/daemon.js.map +1 -1
  8. package/dist/cli/edit-commands.d.ts.map +1 -1
  9. package/dist/cli/edit-commands.js +3 -1
  10. package/dist/cli/edit-commands.js.map +1 -1
  11. package/dist/cli/hook-commands.d.ts +9 -0
  12. package/dist/cli/hook-commands.d.ts.map +1 -0
  13. package/dist/cli/hook-commands.js +106 -0
  14. package/dist/cli/hook-commands.js.map +1 -0
  15. package/dist/cli/index.js +87 -35
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/init-command.d.ts.map +1 -1
  18. package/dist/cli/init-command.js +108 -9
  19. package/dist/cli/init-command.js.map +1 -1
  20. package/dist/cli/memory-commands.d.ts +1 -1
  21. package/dist/cli/memory-commands.d.ts.map +1 -1
  22. package/dist/cli/memory-commands.js +213 -1
  23. package/dist/cli/memory-commands.js.map +1 -1
  24. package/dist/cli/presets.d.ts.map +1 -1
  25. package/dist/cli/presets.js +2 -1
  26. package/dist/cli/presets.js.map +1 -1
  27. package/dist/cli/skill-commands.d.ts.map +1 -1
  28. package/dist/cli/skill-commands.js +4 -2
  29. package/dist/cli/skill-commands.js.map +1 -1
  30. package/dist/cli/steer-commands.d.ts.map +1 -1
  31. package/dist/cli/steer-commands.js +6 -4
  32. package/dist/cli/steer-commands.js.map +1 -1
  33. package/dist/cli/team-commands.d.ts.map +1 -1
  34. package/dist/cli/team-commands.js +3 -1
  35. package/dist/cli/team-commands.js.map +1 -1
  36. package/dist/config/defaults.d.ts.map +1 -1
  37. package/dist/config/defaults.js +12 -2
  38. package/dist/config/defaults.js.map +1 -1
  39. package/dist/config/loader.d.ts +23 -0
  40. package/dist/config/loader.d.ts.map +1 -1
  41. package/dist/config/loader.js +64 -3
  42. package/dist/config/loader.js.map +1 -1
  43. package/dist/config/policy-loader.d.ts +14 -0
  44. package/dist/config/policy-loader.d.ts.map +1 -1
  45. package/dist/config/policy-loader.js +33 -0
  46. package/dist/config/policy-loader.js.map +1 -1
  47. package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
  48. package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
  49. package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
  50. package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
  51. package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
  52. package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
  53. package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
  54. package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
  55. package/dist/dashboard/frontend/dist/index.html +17 -0
  56. package/dist/dashboard/server.d.ts +19 -2
  57. package/dist/dashboard/server.d.ts.map +1 -1
  58. package/dist/dashboard/server.js +121 -20
  59. package/dist/dashboard/server.js.map +1 -1
  60. package/dist/hooks/hook-runner.d.ts +55 -0
  61. package/dist/hooks/hook-runner.d.ts.map +1 -0
  62. package/dist/hooks/hook-runner.js +120 -0
  63. package/dist/hooks/hook-runner.js.map +1 -0
  64. package/dist/hooks/hook-types.d.ts +82 -0
  65. package/dist/hooks/hook-types.d.ts.map +1 -0
  66. package/dist/hooks/hook-types.js +20 -0
  67. package/dist/hooks/hook-types.js.map +1 -0
  68. package/dist/hooks/index.d.ts +6 -0
  69. package/dist/hooks/index.d.ts.map +1 -0
  70. package/dist/hooks/index.js +6 -0
  71. package/dist/hooks/index.js.map +1 -0
  72. package/dist/memory/context-compressor.d.ts +108 -0
  73. package/dist/memory/context-compressor.d.ts.map +1 -0
  74. package/dist/memory/context-compressor.js +307 -0
  75. package/dist/memory/context-compressor.js.map +1 -0
  76. package/dist/memory/index.d.ts +1 -0
  77. package/dist/memory/index.d.ts.map +1 -1
  78. package/dist/memory/index.js +1 -0
  79. package/dist/memory/index.js.map +1 -1
  80. package/dist/memory/memory-manager.d.ts +88 -4
  81. package/dist/memory/memory-manager.d.ts.map +1 -1
  82. package/dist/memory/memory-manager.js +299 -7
  83. package/dist/memory/memory-manager.js.map +1 -1
  84. package/dist/memory/observation-store.d.ts +75 -0
  85. package/dist/memory/observation-store.d.ts.map +1 -0
  86. package/dist/memory/observation-store.js +162 -0
  87. package/dist/memory/observation-store.js.map +1 -0
  88. package/dist/memory/observer-worker.d.ts +34 -0
  89. package/dist/memory/observer-worker.d.ts.map +1 -0
  90. package/dist/memory/observer-worker.js +161 -0
  91. package/dist/memory/observer-worker.js.map +1 -0
  92. package/dist/memory/reflector-worker.d.ts +40 -0
  93. package/dist/memory/reflector-worker.d.ts.map +1 -0
  94. package/dist/memory/reflector-worker.js +185 -0
  95. package/dist/memory/reflector-worker.js.map +1 -0
  96. package/dist/memory/salience-scorer.d.ts +16 -6
  97. package/dist/memory/salience-scorer.d.ts.map +1 -1
  98. package/dist/memory/salience-scorer.js +42 -22
  99. package/dist/memory/salience-scorer.js.map +1 -1
  100. package/dist/memory/structured-memory.d.ts +36 -1
  101. package/dist/memory/structured-memory.d.ts.map +1 -1
  102. package/dist/memory/structured-memory.js +207 -8
  103. package/dist/memory/structured-memory.js.map +1 -1
  104. package/dist/memory/token-estimator.d.ts +31 -0
  105. package/dist/memory/token-estimator.d.ts.map +1 -0
  106. package/dist/memory/token-estimator.js +77 -0
  107. package/dist/memory/token-estimator.js.map +1 -0
  108. package/dist/memory/validation-pipeline.d.ts +37 -0
  109. package/dist/memory/validation-pipeline.d.ts.map +1 -0
  110. package/dist/memory/validation-pipeline.js +106 -0
  111. package/dist/memory/validation-pipeline.js.map +1 -0
  112. package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
  113. package/dist/orchestrator/auth-monitor.js +3 -1
  114. package/dist/orchestrator/auth-monitor.js.map +1 -1
  115. package/dist/orchestrator/execution-loop.d.ts +23 -0
  116. package/dist/orchestrator/execution-loop.d.ts.map +1 -1
  117. package/dist/orchestrator/execution-loop.js +60 -19
  118. package/dist/orchestrator/execution-loop.js.map +1 -1
  119. package/dist/orchestrator/failover-controller.d.ts +26 -2
  120. package/dist/orchestrator/failover-controller.d.ts.map +1 -1
  121. package/dist/orchestrator/failover-controller.js +143 -23
  122. package/dist/orchestrator/failover-controller.js.map +1 -1
  123. package/dist/orchestrator/orchestrator.d.ts +70 -7
  124. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  125. package/dist/orchestrator/orchestrator.js +416 -92
  126. package/dist/orchestrator/orchestrator.js.map +1 -1
  127. package/dist/orchestrator/retry-queue.d.ts.map +1 -1
  128. package/dist/orchestrator/retry-queue.js +24 -9
  129. package/dist/orchestrator/retry-queue.js.map +1 -1
  130. package/dist/orchestrator/router.d.ts +16 -1
  131. package/dist/orchestrator/router.d.ts.map +1 -1
  132. package/dist/orchestrator/router.js +79 -20
  133. package/dist/orchestrator/router.js.map +1 -1
  134. package/dist/orchestrator/session-manager.d.ts +26 -1
  135. package/dist/orchestrator/session-manager.d.ts.map +1 -1
  136. package/dist/orchestrator/session-manager.js +88 -4
  137. package/dist/orchestrator/session-manager.js.map +1 -1
  138. package/dist/providers/circuit-breaker.d.ts +78 -0
  139. package/dist/providers/circuit-breaker.d.ts.map +1 -0
  140. package/dist/providers/circuit-breaker.js +129 -0
  141. package/dist/providers/circuit-breaker.js.map +1 -0
  142. package/dist/providers/claude-provider.d.ts +27 -11
  143. package/dist/providers/claude-provider.d.ts.map +1 -1
  144. package/dist/providers/claude-provider.js +161 -46
  145. package/dist/providers/claude-provider.js.map +1 -1
  146. package/dist/providers/gemini-provider.d.ts +9 -1
  147. package/dist/providers/gemini-provider.d.ts.map +1 -1
  148. package/dist/providers/gemini-provider.js +97 -48
  149. package/dist/providers/gemini-provider.js.map +1 -1
  150. package/dist/providers/index.d.ts +1 -0
  151. package/dist/providers/index.d.ts.map +1 -1
  152. package/dist/providers/index.js +1 -0
  153. package/dist/providers/index.js.map +1 -1
  154. package/dist/providers/ollama-provider.d.ts +7 -0
  155. package/dist/providers/ollama-provider.d.ts.map +1 -1
  156. package/dist/providers/ollama-provider.js +89 -18
  157. package/dist/providers/ollama-provider.js.map +1 -1
  158. package/dist/routines/heartbeat.d.ts +10 -2
  159. package/dist/routines/heartbeat.d.ts.map +1 -1
  160. package/dist/routines/heartbeat.js +42 -5
  161. package/dist/routines/heartbeat.js.map +1 -1
  162. package/dist/routines/routine-manager.d.ts.map +1 -1
  163. package/dist/routines/routine-manager.js +22 -15
  164. package/dist/routines/routine-manager.js.map +1 -1
  165. package/dist/security/audit-logger.d.ts.map +1 -1
  166. package/dist/security/audit-logger.js +5 -7
  167. package/dist/security/audit-logger.js.map +1 -1
  168. package/dist/security/policy-engine.d.ts +28 -17
  169. package/dist/security/policy-engine.d.ts.map +1 -1
  170. package/dist/security/policy-engine.js +42 -185
  171. package/dist/security/policy-engine.js.map +1 -1
  172. package/dist/security/policy-serializer.d.ts +19 -0
  173. package/dist/security/policy-serializer.d.ts.map +1 -0
  174. package/dist/security/policy-serializer.js +100 -0
  175. package/dist/security/policy-serializer.js.map +1 -0
  176. package/dist/security/shell-validator.d.ts +42 -0
  177. package/dist/security/shell-validator.d.ts.map +1 -0
  178. package/dist/security/shell-validator.js +231 -0
  179. package/dist/security/shell-validator.js.map +1 -0
  180. package/dist/skills/index.d.ts +1 -0
  181. package/dist/skills/index.d.ts.map +1 -1
  182. package/dist/skills/index.js +1 -0
  183. package/dist/skills/index.js.map +1 -1
  184. package/dist/skills/skill-loader.d.ts +38 -2
  185. package/dist/skills/skill-loader.d.ts.map +1 -1
  186. package/dist/skills/skill-loader.js +83 -2
  187. package/dist/skills/skill-loader.js.map +1 -1
  188. package/dist/skills/subagent-loader.d.ts +66 -0
  189. package/dist/skills/subagent-loader.d.ts.map +1 -0
  190. package/dist/skills/subagent-loader.js +143 -0
  191. package/dist/skills/subagent-loader.js.map +1 -0
  192. package/dist/steering/flag-manager.d.ts +20 -0
  193. package/dist/steering/flag-manager.d.ts.map +1 -1
  194. package/dist/steering/flag-manager.js +94 -11
  195. package/dist/steering/flag-manager.js.map +1 -1
  196. package/dist/steering/steering-manager.d.ts +11 -0
  197. package/dist/steering/steering-manager.d.ts.map +1 -1
  198. package/dist/steering/steering-manager.js +23 -0
  199. package/dist/steering/steering-manager.js.map +1 -1
  200. package/dist/steering/telegram-gateway.d.ts +4 -1
  201. package/dist/steering/telegram-gateway.d.ts.map +1 -1
  202. package/dist/steering/telegram-gateway.js +49 -10
  203. package/dist/steering/telegram-gateway.js.map +1 -1
  204. package/dist/teams/bridge-watchdog.d.ts.map +1 -1
  205. package/dist/teams/bridge-watchdog.js +5 -3
  206. package/dist/teams/bridge-watchdog.js.map +1 -1
  207. package/dist/teams/gemini-bridge.d.ts.map +1 -1
  208. package/dist/teams/gemini-bridge.js +9 -4
  209. package/dist/teams/gemini-bridge.js.map +1 -1
  210. package/dist/tools/index.d.ts +2 -0
  211. package/dist/tools/index.d.ts.map +1 -1
  212. package/dist/tools/index.js +2 -0
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/memory-tools.d.ts +16 -0
  215. package/dist/tools/memory-tools.d.ts.map +1 -0
  216. package/dist/tools/memory-tools.js +207 -0
  217. package/dist/tools/memory-tools.js.map +1 -0
  218. package/dist/tools/notifications.d.ts.map +1 -1
  219. package/dist/tools/notifications.js +3 -1
  220. package/dist/tools/notifications.js.map +1 -1
  221. package/dist/tools/tool-factory.d.ts +36 -0
  222. package/dist/tools/tool-factory.d.ts.map +1 -0
  223. package/dist/tools/tool-factory.js +55 -0
  224. package/dist/tools/tool-factory.js.map +1 -0
  225. package/dist/types.d.ts +205 -1
  226. package/dist/types.d.ts.map +1 -1
  227. package/dist/types.js +47 -1
  228. package/dist/types.js.map +1 -1
  229. package/dist/utils/errors.d.ts +21 -0
  230. package/dist/utils/errors.d.ts.map +1 -0
  231. package/dist/utils/errors.js +29 -0
  232. package/dist/utils/errors.js.map +1 -0
  233. package/dist/utils/event-filter.d.ts +25 -0
  234. package/dist/utils/event-filter.d.ts.map +1 -0
  235. package/dist/utils/event-filter.js +61 -0
  236. package/dist/utils/event-filter.js.map +1 -0
  237. package/dist/utils/logger.d.ts +33 -36
  238. package/dist/utils/logger.d.ts.map +1 -1
  239. package/dist/utils/logger.js +60 -130
  240. package/dist/utils/logger.js.map +1 -1
  241. package/dist/utils/validate-job-id.d.ts +6 -0
  242. package/dist/utils/validate-job-id.d.ts.map +1 -0
  243. package/dist/utils/validate-job-id.js +10 -0
  244. package/dist/utils/validate-job-id.js.map +1 -0
  245. package/package.json +12 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-types.js","sourceRoot":"","sources":["../../src/hooks/hook-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsEH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,aAAa;IACb,mBAAmB;IACnB,kBAAkB;IAClB,WAAW;CACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Hooks barrel exports — ORCH-12
3
+ */
4
+ export * from './hook-types.js';
5
+ export * from './hook-runner.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Hooks barrel exports — ORCH-12
3
+ */
4
+ export * from './hook-types.js';
5
+ export * from './hook-runner.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * ContextCompressor — Rolling context compression with three tiers.
3
+ *
4
+ * Manages a rolling window of conversation history:
5
+ * - Working tier: Recent raw messages (full fidelity)
6
+ * - Session tier: Compressed observations from older messages
7
+ * - Cross-session tier: Key facts from prior sessions
8
+ *
9
+ * Background compression ensures the agent never blocks.
10
+ * Append-only session observations maximize prompt cache hits.
11
+ */
12
+ import type { AgentEvent, CompressionConfig } from '../types.js';
13
+ import { type CompressFn } from './observer-worker.js';
14
+ import { ObservationStore } from './observation-store.js';
15
+ export interface CompressionStats {
16
+ workingTokens: number;
17
+ sessionTokens: number;
18
+ crossSessionTokens: number;
19
+ compressionsPending: number;
20
+ totalMessagesIngested: number;
21
+ totalCompressions: number;
22
+ }
23
+ export interface BuiltContext {
24
+ /** Compressed session-tier observations (append-only text block) */
25
+ sessionObservations: string;
26
+ /** Cross-session context (key facts from prior sessions) */
27
+ crossSessionContext: string;
28
+ /** Recent raw messages (working tier) */
29
+ workingMessages: AgentEvent[];
30
+ /** Current stats */
31
+ stats: CompressionStats;
32
+ }
33
+ export declare class ContextCompressor {
34
+ private readonly _config;
35
+ private readonly _observer;
36
+ private readonly _store;
37
+ /** Working tier: recent raw messages */
38
+ private _workingMessages;
39
+ /** Running token count for working tier */
40
+ private _workingTokens;
41
+ /** Global message index (total messages ingested) */
42
+ private _messageIndex;
43
+ /** Session-tier observations (text blocks, append-only) */
44
+ private _sessionObservations;
45
+ private _sessionTokens;
46
+ /** Cross-session context (loaded once at start) */
47
+ private _crossSessionContext;
48
+ private _crossSessionTokens;
49
+ /** Pending background compressions (tracked for synchronous settlement check) */
50
+ private _pendingCompressions;
51
+ private _totalCompressions;
52
+ /** Session ID for this compressor instance */
53
+ private readonly _sessionId;
54
+ /** Async buffer: pre-computed observations ready to activate */
55
+ private _precomputedBlock;
56
+ private _precomputePromise;
57
+ private _precomputeThreshold;
58
+ /** Track session tier size when precompute started to detect staleness */
59
+ private _precomputeSessionObsCount;
60
+ constructor(config: CompressionConfig, store: ObservationStore, compressFn: CompressFn, sessionId?: string);
61
+ /**
62
+ * Load existing observations for this session (e.g., after restart).
63
+ */
64
+ loadExisting(): Promise<void>;
65
+ /**
66
+ * Ingest a new event from the execution stream.
67
+ * Non-blocking — just appends and updates token count.
68
+ */
69
+ ingest(event: AgentEvent): void;
70
+ /**
71
+ * Check thresholds and trigger background compression if needed.
72
+ * Call this periodically (e.g., every N events or on a timer).
73
+ *
74
+ * If async_buffer is enabled, also manages pre-computation.
75
+ */
76
+ tick(): Promise<void>;
77
+ /**
78
+ * Build the current context for the next API call.
79
+ * Always returns immediately with the latest available state.
80
+ */
81
+ buildContext(): BuiltContext;
82
+ /**
83
+ * Flush: wait for all pending compressions to complete.
84
+ * Call this on session end.
85
+ */
86
+ flush(): Promise<void>;
87
+ /** Get the session ID for this compressor instance. */
88
+ get sessionId(): string;
89
+ /** Get current stats without building full context. */
90
+ get stats(): CompressionStats;
91
+ /** Track a promise for settlement so tick() can clean it up synchronously. */
92
+ private _trackPromise;
93
+ /**
94
+ * Compress the oldest chunk of working messages into a session observation.
95
+ */
96
+ private _compressChunk;
97
+ /**
98
+ * Start pre-computing observations in the background (async buffering).
99
+ * The pre-computed block is held until the threshold is actually hit.
100
+ */
101
+ private _startPrecompute;
102
+ /**
103
+ * Activate a pre-computed observation block.
104
+ * Removes the corresponding messages from the working tier.
105
+ */
106
+ private _activatePrecomputed;
107
+ }
108
+ //# sourceMappingURL=context-compressor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compressor.d.ts","sourceRoot":"","sources":["../../src/memory/context-compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAC;AAKjF,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yCAAyC;IACzC,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,oBAAoB;IACpB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAE1C,wCAAwC;IACxC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,2CAA2C;IAC3C,OAAO,CAAC,cAAc,CAAK;IAC3B,qDAAqD;IACrD,OAAO,CAAC,aAAa,CAAK;IAE1B,2DAA2D;IAC3D,OAAO,CAAC,oBAAoB,CAAgB;IAC5C,OAAO,CAAC,cAAc,CAAK;IAE3B,mDAAmD;IACnD,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,mBAAmB,CAAK;IAEhC,iFAAiF;IACjF,OAAO,CAAC,oBAAoB,CAAsD;IAClF,OAAO,CAAC,kBAAkB,CAAK;IAE/B,8CAA8C;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,gEAAgE;IAChE,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,oBAAoB,CAAS;IACrC,0EAA0E;IAC1E,OAAO,CAAC,0BAA0B,CAAK;gBAGrC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,gBAAgB,EACvB,UAAU,EAAE,UAAU,EACtB,SAAS,CAAC,EAAE,MAAM;IAUpB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBnC;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAM/B;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC3B;;;OAGG;IACH,YAAY,IAAI,YAAY;IAgB5B;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC5B,uDAAuD;IACvD,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,uDAAuD;IACvD,IAAI,KAAK,IAAI,gBAAgB,CAS5B;IAID,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB;;OAEG;YACW,cAAc;IAwD5B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAyD7B"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * ContextCompressor — Rolling context compression with three tiers.
3
+ *
4
+ * Manages a rolling window of conversation history:
5
+ * - Working tier: Recent raw messages (full fidelity)
6
+ * - Session tier: Compressed observations from older messages
7
+ * - Cross-session tier: Key facts from prior sessions
8
+ *
9
+ * Background compression ensures the agent never blocks.
10
+ * Append-only session observations maximize prompt cache hits.
11
+ */
12
+ import { estimateEventTokens, estimateTokens } from './token-estimator.js';
13
+ import { ObserverWorker } from './observer-worker.js';
14
+ import { createLogger } from '../utils/logger.js';
15
+ const log = createLogger('context-compressor');
16
+ export class ContextCompressor {
17
+ _config;
18
+ _observer;
19
+ _store;
20
+ /** Working tier: recent raw messages */
21
+ _workingMessages = [];
22
+ /** Running token count for working tier */
23
+ _workingTokens = 0;
24
+ /** Global message index (total messages ingested) */
25
+ _messageIndex = 0;
26
+ /** Session-tier observations (text blocks, append-only) */
27
+ _sessionObservations = [];
28
+ _sessionTokens = 0;
29
+ /** Cross-session context (loaded once at start) */
30
+ _crossSessionContext = '';
31
+ _crossSessionTokens = 0;
32
+ /** Pending background compressions (tracked for synchronous settlement check) */
33
+ _pendingCompressions = [];
34
+ _totalCompressions = 0;
35
+ /** Session ID for this compressor instance */
36
+ _sessionId;
37
+ /** Async buffer: pre-computed observations ready to activate */
38
+ _precomputedBlock = null;
39
+ _precomputePromise = null;
40
+ _precomputeThreshold;
41
+ /** Track session tier size when precompute started to detect staleness */
42
+ _precomputeSessionObsCount = 0;
43
+ constructor(config, store, compressFn, sessionId) {
44
+ this._config = config;
45
+ this._store = store;
46
+ this._observer = new ObserverWorker(compressFn);
47
+ this._sessionId = sessionId ?? `session_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
48
+ // Start pre-computing when working tier reaches 70% of threshold
49
+ this._precomputeThreshold = Math.floor(config.working_tier_max_tokens * 0.7);
50
+ }
51
+ /**
52
+ * Load existing observations for this session (e.g., after restart).
53
+ */
54
+ async loadExisting() {
55
+ const sessionBlocks = await this._store.loadSession(this._sessionId);
56
+ for (const block of sessionBlocks) {
57
+ this._sessionObservations.push(block.observations);
58
+ this._sessionTokens += block.estimatedTokens;
59
+ }
60
+ this._crossSessionContext = await this._store.buildCrossSessionContext();
61
+ this._crossSessionTokens = estimateTokens(this._crossSessionContext);
62
+ log.info({
63
+ sessionId: this._sessionId,
64
+ sessionBlocks: sessionBlocks.length,
65
+ sessionTokens: this._sessionTokens,
66
+ crossSessionTokens: this._crossSessionTokens,
67
+ }, 'Loaded existing observations');
68
+ }
69
+ /**
70
+ * Ingest a new event from the execution stream.
71
+ * Non-blocking — just appends and updates token count.
72
+ */
73
+ ingest(event) {
74
+ this._workingMessages.push(event);
75
+ this._workingTokens += estimateEventTokens(event);
76
+ this._messageIndex++;
77
+ }
78
+ /**
79
+ * Check thresholds and trigger background compression if needed.
80
+ * Call this periodically (e.g., every N events or on a timer).
81
+ *
82
+ * If async_buffer is enabled, also manages pre-computation.
83
+ */
84
+ async tick() {
85
+ // Clean up completed compressions
86
+ this._pendingCompressions = this._pendingCompressions.filter(t => !t.settled);
87
+ // Safety valve: if working tier exceeds blockAfter, do synchronous compression
88
+ const blockAfter = this._config.block_after_tokens ?? (this._config.working_tier_max_tokens * 2);
89
+ if (this._workingTokens > blockAfter) {
90
+ log.warn({ workingTokens: this._workingTokens, blockAfter }, 'Working tier exceeded blockAfter threshold — forcing synchronous compression');
91
+ await this._compressChunk();
92
+ return;
93
+ }
94
+ // Normal threshold: trigger background compression
95
+ if (this._workingTokens > this._config.working_tier_max_tokens) {
96
+ // Check if we have a pre-computed block ready
97
+ if (this._precomputedBlock) {
98
+ this._activatePrecomputed();
99
+ }
100
+ else {
101
+ // Fire and forget background compression
102
+ this._trackPromise(this._compressChunk());
103
+ }
104
+ return;
105
+ }
106
+ // Async buffer: start pre-computing when approaching threshold
107
+ if (this._config.async_buffer &&
108
+ this._workingTokens > this._precomputeThreshold &&
109
+ !this._precomputePromise &&
110
+ !this._precomputedBlock &&
111
+ this._workingMessages.length >= this._config.chunk_size) {
112
+ this._startPrecompute();
113
+ }
114
+ }
115
+ /**
116
+ * Build the current context for the next API call.
117
+ * Always returns immediately with the latest available state.
118
+ */
119
+ buildContext() {
120
+ return {
121
+ sessionObservations: this._sessionObservations.join('\n\n'),
122
+ crossSessionContext: this._crossSessionContext,
123
+ workingMessages: [...this._workingMessages],
124
+ stats: {
125
+ workingTokens: this._workingTokens,
126
+ sessionTokens: this._sessionTokens,
127
+ crossSessionTokens: this._crossSessionTokens,
128
+ compressionsPending: this._pendingCompressions.filter(t => !t.settled).length,
129
+ totalMessagesIngested: this._messageIndex,
130
+ totalCompressions: this._totalCompressions,
131
+ },
132
+ };
133
+ }
134
+ /**
135
+ * Flush: wait for all pending compressions to complete.
136
+ * Call this on session end.
137
+ */
138
+ async flush() {
139
+ // Wait for any pre-computation
140
+ if (this._precomputePromise) {
141
+ await this._precomputePromise;
142
+ if (this._precomputedBlock) {
143
+ this._activatePrecomputed();
144
+ }
145
+ }
146
+ // Wait for pending compressions (including activation persists) before final compress
147
+ await Promise.allSettled(this._pendingCompressions.map(t => t.promise));
148
+ // Compress any remaining working messages that exceed a minimum
149
+ if (this._workingMessages.length > 5) {
150
+ await this._compressChunk();
151
+ }
152
+ // Final wait for any compression just triggered above
153
+ await Promise.allSettled(this._pendingCompressions.filter(t => !t.settled).map(t => t.promise));
154
+ this._pendingCompressions = [];
155
+ log.info({
156
+ sessionId: this._sessionId,
157
+ totalCompressions: this._totalCompressions,
158
+ sessionTokens: this._sessionTokens,
159
+ remainingWorking: this._workingMessages.length,
160
+ }, 'Context compressor flushed');
161
+ }
162
+ /** Get the session ID for this compressor instance. */
163
+ get sessionId() {
164
+ return this._sessionId;
165
+ }
166
+ /** Get current stats without building full context. */
167
+ get stats() {
168
+ return {
169
+ workingTokens: this._workingTokens,
170
+ sessionTokens: this._sessionTokens,
171
+ crossSessionTokens: this._crossSessionTokens,
172
+ compressionsPending: this._pendingCompressions.filter(t => !t.settled).length,
173
+ totalMessagesIngested: this._messageIndex,
174
+ totalCompressions: this._totalCompressions,
175
+ };
176
+ }
177
+ // ── Private helpers ──────────────────────────────────────────────
178
+ /** Track a promise for settlement so tick() can clean it up synchronously. */
179
+ _trackPromise(p) {
180
+ const tracked = { promise: p, settled: false };
181
+ p.finally(() => { tracked.settled = true; });
182
+ this._pendingCompressions.push(tracked);
183
+ }
184
+ /**
185
+ * Compress the oldest chunk of working messages into a session observation.
186
+ */
187
+ async _compressChunk() {
188
+ const chunkSize = Math.min(this._config.chunk_size, this._workingMessages.length);
189
+ if (chunkSize === 0)
190
+ return;
191
+ // Dequeue the oldest chunk
192
+ const chunk = this._workingMessages.splice(0, chunkSize);
193
+ const startIndex = this._messageIndex - this._workingMessages.length - chunk.length;
194
+ // Recalculate working tier tokens
195
+ this._workingTokens = 0;
196
+ for (const msg of this._workingMessages) {
197
+ this._workingTokens += estimateEventTokens(msg);
198
+ }
199
+ const existingObs = this._sessionObservations.join('\n\n');
200
+ try {
201
+ const block = await this._observer.compress(chunk, startIndex, existingObs, this._sessionId);
202
+ // Persist first, then update in-memory state
203
+ await this._store.append(block);
204
+ // Only update in-memory state after successful persist
205
+ this._sessionObservations.push(block.observations);
206
+ this._sessionTokens += block.estimatedTokens;
207
+ this._totalCompressions++;
208
+ log.info({
209
+ chunkSize: chunk.length,
210
+ observationTokens: block.estimatedTokens,
211
+ sessionTokens: this._sessionTokens,
212
+ workingTokens: this._workingTokens,
213
+ }, 'Chunk compressed');
214
+ // Check if session tier needs condensation
215
+ if (this._sessionTokens > this._config.session_tier_max_tokens) {
216
+ log.info({ sessionTokens: this._sessionTokens, max: this._config.session_tier_max_tokens }, 'Session tier exceeds threshold — reflector pass needed');
217
+ // Reflector integration is handled by the orchestrator (OM-05/OM-07)
218
+ }
219
+ }
220
+ catch (err) {
221
+ // On failure, put the chunk back at the front of working messages
222
+ this._workingMessages = chunk.concat(this._workingMessages);
223
+ this._workingTokens = 0;
224
+ for (const msg of this._workingMessages) {
225
+ this._workingTokens += estimateEventTokens(msg);
226
+ }
227
+ log.error({ err }, 'Compression failed, chunk returned to working tier');
228
+ }
229
+ }
230
+ /**
231
+ * Start pre-computing observations in the background (async buffering).
232
+ * The pre-computed block is held until the threshold is actually hit.
233
+ */
234
+ _startPrecompute() {
235
+ const chunkSize = Math.min(this._config.chunk_size, this._workingMessages.length);
236
+ if (chunkSize === 0)
237
+ return;
238
+ // Snapshot the messages to pre-compute (don't remove from working tier yet)
239
+ const chunk = this._workingMessages.slice(0, chunkSize);
240
+ const startIndex = this._messageIndex - this._workingMessages.length;
241
+ const existingObs = this._sessionObservations.join('\n\n');
242
+ // Snapshot session tier size to detect race condition with _compressChunk
243
+ this._precomputeSessionObsCount = this._sessionObservations.length;
244
+ this._precomputePromise = (async () => {
245
+ try {
246
+ this._precomputedBlock = await this._observer.compress(chunk, startIndex, existingObs, this._sessionId);
247
+ log.info({ tokens: this._precomputedBlock.estimatedTokens }, 'Pre-computed observation block ready');
248
+ }
249
+ catch (err) {
250
+ log.warn({ err }, 'Pre-computation failed (will compress normally when threshold hits)');
251
+ this._precomputedBlock = null;
252
+ }
253
+ finally {
254
+ this._precomputePromise = null;
255
+ }
256
+ })();
257
+ }
258
+ /**
259
+ * Activate a pre-computed observation block.
260
+ * Removes the corresponding messages from the working tier.
261
+ */
262
+ _activatePrecomputed() {
263
+ const block = this._precomputedBlock;
264
+ if (!block)
265
+ return;
266
+ // Check for staleness: if session tier changed since precompute started, discard
267
+ if (this._sessionObservations.length !== this._precomputeSessionObsCount) {
268
+ log.warn({
269
+ expectedCount: this._precomputeSessionObsCount,
270
+ actualCount: this._sessionObservations.length,
271
+ }, 'Pre-computed block is stale (session tier changed), discarding');
272
+ this._precomputedBlock = null;
273
+ return;
274
+ }
275
+ const [start, end] = block.sourceMessageRange;
276
+ const chunkSize = end - start;
277
+ // Remove the pre-computed messages from working tier (capture for rollback)
278
+ const splicedMessages = this._workingMessages.splice(0, Math.min(chunkSize, this._workingMessages.length));
279
+ this._workingTokens = 0;
280
+ for (const msg of this._workingMessages) {
281
+ this._workingTokens += estimateEventTokens(msg);
282
+ }
283
+ // Persist first, then update in-memory state (keeps disk and memory consistent)
284
+ this._trackPromise(this._store.append(block).then(() => {
285
+ // Only update in-memory state after successful persist
286
+ this._sessionObservations.push(block.observations);
287
+ this._sessionTokens += block.estimatedTokens;
288
+ this._totalCompressions++;
289
+ log.info({
290
+ chunkSize,
291
+ observationTokens: block.estimatedTokens,
292
+ sessionTokens: this._sessionTokens,
293
+ workingTokens: this._workingTokens,
294
+ }, 'Pre-computed block activated');
295
+ }).catch(err => {
296
+ // Persist failed — roll back the working tier splice so messages aren't lost
297
+ log.error({ err }, 'Failed to persist pre-computed observation block, rolling back');
298
+ this._workingMessages = splicedMessages.concat(this._workingMessages);
299
+ this._workingTokens = 0;
300
+ for (const msg of this._workingMessages) {
301
+ this._workingTokens += estimateEventTokens(msg);
302
+ }
303
+ }));
304
+ this._precomputedBlock = null;
305
+ }
306
+ }
307
+ //# sourceMappingURL=context-compressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compressor.js","sourceRoot":"","sources":["../../src/memory/context-compressor.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,5 @@ export * from './structured-memory.js';
4
4
  export * from './salience-scorer.js';
5
5
  export * from './extraction-pipeline.js';
6
6
  export * from './category-organizer.js';
7
+ export * from './validation-pipeline.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC"}
@@ -4,4 +4,5 @@ export * from './structured-memory.js';
4
4
  export * from './salience-scorer.js';
5
5
  export * from './extraction-pipeline.js';
6
6
  export * from './category-organizer.js';
7
+ export * from './validation-pipeline.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC"}
@@ -6,10 +6,22 @@
6
6
  * - Tier 2: Rolling context (Daily Notes)
7
7
  * - Tier 3: Structured items, salience, categories
8
8
  * - Aggregates fragments into TaskContext.memoryContext
9
+ *
10
+ * Integrity (MEM-18):
11
+ * - SHA-256 baselines on MEMORY.md to detect tampering
12
+ * - Baselines stored in .memory-integrity.json alongside the memory dir
13
+ * - Mismatch logs a warning (non-fatal — user may legitimately edit)
9
14
  */
10
15
  import type { MemoryConfig } from '../types.js';
11
16
  import { StructuredMemory } from './structured-memory.js';
12
17
  import type { MemoryItem, CategorySummary, SalienceScore } from './memory-types.js';
18
+ /** Lightweight stats about the memory system — no item reads. */
19
+ export interface MemoryIndex {
20
+ itemCount: number;
21
+ categoryNames: string[];
22
+ mostRecentDailyNote: string | null;
23
+ dailyNoteCount: number;
24
+ }
13
25
  export declare class MemoryManager {
14
26
  private readonly _config;
15
27
  private readonly _baseDir;
@@ -21,22 +33,70 @@ export declare class MemoryManager {
21
33
  * Initializes memory directories (Tiers 1-3).
22
34
  */
23
35
  init(): Promise<void>;
36
+ /** Cached memory index — invalidated on writes. */
37
+ private _indexCache;
38
+ /**
39
+ * Returns a lightweight index of memory contents — no item reads.
40
+ * Tells the LLM what's available without dumping everything into context.
41
+ * Cached after first build; invalidated by write operations.
42
+ */
43
+ getMemoryIndex(): Promise<MemoryIndex>;
44
+ /**
45
+ * Loads a lightweight context string for the system prompt.
46
+ * Instead of dumping all memory, provides a summary index that tells the LLM
47
+ * to use tools for on-demand retrieval.
48
+ */
49
+ loadContext(_days?: number): Promise<string[]>;
50
+ /**
51
+ * Full context load (backward compat). Reads ALL items, daily notes, categories.
52
+ * Use only when progressive loading is not suitable (e.g., export, migration).
53
+ */
54
+ loadFullContext(days?: number): Promise<string[]>;
55
+ /**
56
+ * Targeted memory recall — searches items by query using BM25 + salience.
57
+ * This is what the LLM calls via the memory_search tool, but exposed as
58
+ * a method for direct use by the Orchestrator.
59
+ */
60
+ recallMemory(query: string, limit?: number): Promise<{
61
+ items: MemoryItem[];
62
+ scores: SalienceScore[];
63
+ }>;
24
64
  /**
25
- * Loads context for a new task based on tiers.
65
+ * Reads only the requested number of recent daily notes.
66
+ * Exposed for the recall_context tool.
26
67
  */
27
- loadContext(days?: number): Promise<string[]>;
68
+ recallDailyNotes(days?: number): Promise<string[]>;
69
+ /**
70
+ * Archives daily notes older than threshold to memory/daily/archive/.
71
+ * Appends a summary header to MEMORY.md noting the archived date range.
72
+ * Archived notes remain on disk in the archive/ subdirectory for manual
73
+ * review but are excluded from the active daily notes directory.
74
+ *
75
+ * If a reflectFn is provided, it will be called with the combined content
76
+ * of notes being archived. This enables extracting structured memory items
77
+ * from daily notes before they are moved to the archive.
78
+ *
79
+ * @param thresholdDays Notes older than this are archived (default: 7)
80
+ * @param reflectFn Optional function to extract memory from notes before archiving
81
+ * @returns Number of notes archived
82
+ */
83
+ consolidateDailyNotes(thresholdDays?: number, reflectFn?: (notesContent: string) => Promise<void>): Promise<number>;
84
+ /** Invalidate the cached memory index (call after writes). */
85
+ invalidateIndex(): void;
28
86
  /**
29
87
  * Appends an entry to today's daily note.
30
88
  */
31
89
  appendDailyNote(text: string): Promise<void>;
32
90
  /**
33
91
  * Searches structured memory items by query, ranked by salience.
92
+ * Uses MiniSearch BM25+ scores composed with salience factors.
34
93
  */
35
94
  searchMemory(query: string, limit?: number): Promise<SalienceScore[]>;
36
95
  /**
37
- * Deletes a structured memory item by ID.
96
+ * Soft-deletes a structured memory item by ID.
97
+ * Moves the item to an archive directory before removing.
38
98
  */
39
- forgetItem(id: string): Promise<boolean>;
99
+ forgetItem(id: string, reason?: string): Promise<boolean>;
40
100
  /**
41
101
  * Returns all category summaries.
42
102
  */
@@ -45,6 +105,10 @@ export declare class MemoryManager {
45
105
  * Exposes the underlying StructuredMemory for direct access.
46
106
  */
47
107
  get structuredMemory(): StructuredMemory;
108
+ /**
109
+ * Returns the resolved path to the long-term memory file (MEMORY.md).
110
+ */
111
+ getLongTermPath(): string;
48
112
  private _resolvePath;
49
113
  private _getLongTermPath;
50
114
  private _getDailyNotesPath;
@@ -52,5 +116,25 @@ export declare class MemoryManager {
52
116
  private _getCategoriesPath;
53
117
  private _readLongTerm;
54
118
  private _readDailyNotes;
119
+ /** Path to the integrity baseline file alongside the memory directory. */
120
+ private _getIntegrityPath;
121
+ /** Compute SHA-256 hash of the given content. */
122
+ private _computeHash;
123
+ /**
124
+ * Saves a SHA-256 baseline for the current MEMORY.md content.
125
+ * Called after any write to MEMORY.md.
126
+ */
127
+ _saveIntegrityHash(): Promise<void>;
128
+ /**
129
+ * Verifies the current MEMORY.md content against the stored hash baseline.
130
+ * Logs a warning on mismatch but does not throw (the file may have been
131
+ * legitimately edited by the user).
132
+ */
133
+ private _verifyIntegrityHash;
134
+ /**
135
+ * Refreshes the integrity baseline for MEMORY.md.
136
+ * Call this after legitimate external edits to acknowledge the new content.
137
+ */
138
+ refreshIntegrityBaseline(): Promise<void>;
55
139
  }
56
140
  //# sourceMappingURL=memory-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-manager.d.ts","sourceRoot":"","sources":["../../src/memory/memory-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,kBAAkB,CAAoB;gBAG5C,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,MAAyC,EAClD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC;IAYxD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;OAEG;IACG,WAAW,CAAC,IAAI,GAAE,MAAkC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6C9E;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK3E;;OAEG;IACG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI9C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIjD;;OAEG;IACH,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,kBAAkB;YAOZ,aAAa;YAWb,eAAe;CAwB9B"}
1
+ {"version":3,"file":"memory-manager.d.ts","sourceRoot":"","sources":["../../src/memory/memory-manager.ts"],"names":[],"mappings":"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"}