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":"observation-store.js","sourceRoot":"","sources":["../../src/memory/observation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * ObserverWorker — Background agent that compresses raw messages
3
+ * into dated, priority-tagged observations.
4
+ *
5
+ * Runs asynchronously so the agent never blocks during compression.
6
+ * Uses a cheap/fast model (e.g., Gemini Flash) for cost efficiency.
7
+ */
8
+ import type { AgentEvent } from '../types.js';
9
+ import type { ObservationBlock } from './observation-store.js';
10
+ /**
11
+ * Function signature for the LLM compression call.
12
+ * Accepts a prompt string, returns the compressed observations.
13
+ */
14
+ export type CompressFn = (prompt: string) => Promise<string>;
15
+ export declare class ObserverWorker {
16
+ private readonly _compressFn;
17
+ constructor(compressFn: CompressFn);
18
+ /**
19
+ * Compress a chunk of messages into an observation block.
20
+ * This is the core compression operation — called in the background by ContextCompressor.
21
+ *
22
+ * @param messages The raw messages to compress
23
+ * @param startIndex The global message index of the first message (for the prompt)
24
+ * @param existingObservations Previously compressed observations (for dedup context)
25
+ * @param sessionId The session these messages belong to
26
+ */
27
+ compress(messages: AgentEvent[], startIndex: number, existingObservations: string, sessionId: string): Promise<ObservationBlock>;
28
+ /**
29
+ * Fallback compression when the LLM call fails.
30
+ * Produces a minimal summary from event types and timestamps.
31
+ */
32
+ private _fallbackCompress;
33
+ }
34
+ //# sourceMappingURL=observer-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer-worker.d.ts","sourceRoot":"","sources":["../../src/memory/observer-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO/D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAsF7D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAE7B,UAAU,EAAE,UAAU;IAIlC;;;;;;;;OAQG;IACG,QAAQ,CACZ,QAAQ,EAAE,UAAU,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC;IAmC5B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAqC1B"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * ObserverWorker — Background agent that compresses raw messages
3
+ * into dated, priority-tagged observations.
4
+ *
5
+ * Runs asynchronously so the agent never blocks during compression.
6
+ * Uses a cheap/fast model (e.g., Gemini Flash) for cost efficiency.
7
+ */
8
+ import { ObservationStore } from './observation-store.js';
9
+ import { estimateTokens } from './token-estimator.js';
10
+ import { createLogger } from '../utils/logger.js';
11
+ const log = createLogger('observer-worker');
12
+ /**
13
+ * Serializes an AgentEvent into a human-readable string for the observer prompt.
14
+ */
15
+ function serializeEvent(event, index) {
16
+ const ts = event.timestamp instanceof Date
17
+ ? event.timestamp.toISOString()
18
+ : String(event.timestamp);
19
+ const content = event.content;
20
+ if (typeof content === 'string') {
21
+ return `[${index}] ${ts} [${event.type}] ${content}`;
22
+ }
23
+ if (content && typeof content === 'object') {
24
+ const obj = content;
25
+ switch (event.type) {
26
+ case 'text':
27
+ case 'thinking':
28
+ case 'steering':
29
+ return `[${index}] ${ts} [${event.type}] ${String(obj['text'] ?? '')}`;
30
+ case 'tool_call':
31
+ return `[${index}] ${ts} [tool_call] ${String(obj['tool'] ?? 'unknown')}(${JSON.stringify(obj['arguments'] ?? {}).substring(0, 500)})`;
32
+ case 'tool_result': {
33
+ const resultStr = JSON.stringify(obj['result'] ?? '');
34
+ const truncated = resultStr.length > 500 ? resultStr.substring(0, 500) + '...' : resultStr;
35
+ return `[${index}] ${ts} [tool_result] ${truncated}`;
36
+ }
37
+ case 'error':
38
+ return `[${index}] ${ts} [error] ${String(obj['message'] ?? JSON.stringify(content))}`;
39
+ case 'done':
40
+ return `[${index}] ${ts} [done] ${String(obj['text'] ?? '')}`;
41
+ default:
42
+ return `[${index}] ${ts} [${event.type}] ${JSON.stringify(content).substring(0, 500)}`;
43
+ }
44
+ }
45
+ return `[${index}] ${ts} [${event.type}] ${String(content)}`;
46
+ }
47
+ /**
48
+ * Build the observer prompt.
49
+ */
50
+ function buildObserverPrompt(messages, startIndex, existingObservations) {
51
+ const serialized = messages.map((m, i) => serializeEvent(m, startIndex + i)).join('\n');
52
+ const existingBlock = existingObservations
53
+ ? `\nExisting observations (for context, do NOT repeat these):\n${existingObservations}\n`
54
+ : '';
55
+ return `You are a conversation observer. Compress the following messages into concise, dated observations. Preserve:
56
+ - Decisions made and their reasoning
57
+ - Key facts learned or stated
58
+ - Tool results that inform future actions
59
+ - Errors encountered and how they were resolved
60
+ - User preferences expressed
61
+
62
+ Format each observation as:
63
+ [YYYY-MM-DD HH:MM] <PRIORITY> <observation>
64
+
65
+ Priority levels:
66
+ CRITICAL — Decisions, errors, blockers that affect future actions
67
+ IMPORTANT — Key facts, preferences, tool outcomes
68
+ NOTE — Background context, minor details
69
+
70
+ Rules:
71
+ - Be concise. Target 3-6x compression ratio.
72
+ - Preserve exact names, paths, IDs, and values (never paraphrase these).
73
+ - Group related observations by topic when possible.
74
+ - If a tool result is very large, summarize the outcome, not the raw output.
75
+ - Do not repeat information from existing observations.
76
+ ${existingBlock}
77
+ Messages to compress:
78
+ ${serialized}`;
79
+ }
80
+ export class ObserverWorker {
81
+ _compressFn;
82
+ constructor(compressFn) {
83
+ this._compressFn = compressFn;
84
+ }
85
+ /**
86
+ * Compress a chunk of messages into an observation block.
87
+ * This is the core compression operation — called in the background by ContextCompressor.
88
+ *
89
+ * @param messages The raw messages to compress
90
+ * @param startIndex The global message index of the first message (for the prompt)
91
+ * @param existingObservations Previously compressed observations (for dedup context)
92
+ * @param sessionId The session these messages belong to
93
+ */
94
+ async compress(messages, startIndex, existingObservations, sessionId) {
95
+ const prompt = buildObserverPrompt(messages, startIndex, existingObservations);
96
+ let observations;
97
+ try {
98
+ observations = await this._compressFn(prompt);
99
+ }
100
+ catch (err) {
101
+ // On failure, fall back to a basic summary
102
+ log.error({ err, messageCount: messages.length }, 'Observer compression failed, using fallback');
103
+ observations = this._fallbackCompress(messages, startIndex);
104
+ }
105
+ const block = {
106
+ id: ObservationStore.generateId(),
107
+ sessionId,
108
+ createdAt: new Date().toISOString(),
109
+ tier: 'session',
110
+ observations,
111
+ sourceMessageRange: [startIndex, startIndex + messages.length],
112
+ estimatedTokens: estimateTokens(observations),
113
+ };
114
+ log.info({
115
+ sessionId,
116
+ inputMessages: messages.length,
117
+ outputTokens: block.estimatedTokens,
118
+ range: block.sourceMessageRange,
119
+ }, 'Observation block created');
120
+ return block;
121
+ }
122
+ /**
123
+ * Fallback compression when the LLM call fails.
124
+ * Produces a minimal summary from event types and timestamps.
125
+ */
126
+ _fallbackCompress(messages, startIndex) {
127
+ const first = messages[0];
128
+ const last = messages[messages.length - 1];
129
+ const firstTs = first?.timestamp instanceof Date
130
+ ? first.timestamp.toISOString().substring(0, 16).replace('T', ' ')
131
+ : 'unknown';
132
+ const lastTs = last?.timestamp instanceof Date
133
+ ? last.timestamp.toISOString().substring(0, 16).replace('T', ' ')
134
+ : 'unknown';
135
+ const typeCounts = new Map();
136
+ for (const m of messages) {
137
+ typeCounts.set(m.type, (typeCounts.get(m.type) ?? 0) + 1);
138
+ }
139
+ const typeBreakdown = [...typeCounts.entries()]
140
+ .map(([type, count]) => `${count} ${type}`)
141
+ .join(', ');
142
+ // Extract text content from text events for minimal context
143
+ const textSnippets = [];
144
+ for (const m of messages) {
145
+ if (m.type === 'text' && m.content && typeof m.content === 'object') {
146
+ const text = m.content['text'];
147
+ if (typeof text === 'string' && text.length > 0) {
148
+ textSnippets.push(text.substring(0, 100));
149
+ if (textSnippets.length >= 3)
150
+ break;
151
+ }
152
+ }
153
+ }
154
+ let summary = `[${firstTs}] NOTE — Compressed ${messages.length} messages (indices ${startIndex}-${startIndex + messages.length - 1}): ${typeBreakdown}`;
155
+ if (textSnippets.length > 0) {
156
+ summary += `\n[${lastTs}] NOTE — Key content: ${textSnippets.join(' | ')}`;
157
+ }
158
+ return summary;
159
+ }
160
+ }
161
+ //# sourceMappingURL=observer-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observer-worker.js","sourceRoot":"","sources":["../../src/memory/observer-worker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAQ5C;;GAEG;AACH,SAAS,cAAc,CAAC,KAAiB,EAAE,KAAa;IACtD,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,YAAY,IAAI;QACxC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;QAC/B,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAE9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,OAAkC,CAAC;QAC/C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC;YACZ,KAAK,UAAU,CAAC;YAChB,KAAK,UAAU;gBACb,OAAO,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAEzE,KAAK,WAAW;gBACd,OAAO,IAAI,KAAK,KAAK,EAAE,gBAAgB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;YAEzI,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3F,OAAO,IAAI,KAAK,KAAK,EAAE,kBAAkB,SAAS,EAAE,CAAC;YACvD,CAAC;YAED,KAAK,OAAO;gBACV,OAAO,IAAI,KAAK,KAAK,EAAE,YAAY,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAEzF,KAAK,MAAM;gBACT,OAAO,IAAI,KAAK,KAAK,EAAE,WAAW,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAEhE;gBACE,OAAO,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,QAAsB,EACtB,UAAkB,EAClB,oBAA4B;IAE5B,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExF,MAAM,aAAa,GAAG,oBAAoB;QACxC,CAAC,CAAC,gEAAgE,oBAAoB,IAAI;QAC1F,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBP,aAAa;;EAEb,UAAU,EAAE,CAAC;AACf,CAAC;AAED,MAAM,OAAO,cAAc;IACR,WAAW,CAAa;IAEzC,YAAY,UAAsB;QAChC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ,CACZ,QAAsB,EACtB,UAAkB,EAClB,oBAA4B,EAC5B,SAAiB;QAEjB,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAE/E,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2CAA2C;YAC3C,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,6CAA6C,CAAC,CAAC;YACjG,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,KAAK,GAAqB;YAC9B,EAAE,EAAE,gBAAgB,CAAC,UAAU,EAAE;YACjC,SAAS;YACT,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,SAAS;YACf,YAAY;YACZ,kBAAkB,EAAE,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC9D,eAAe,EAAE,cAAc,CAAC,YAAY,CAAC;SAC9C,CAAC;QAEF,GAAG,CAAC,IAAI,CACN;YACE,SAAS;YACT,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,YAAY,EAAE,KAAK,CAAC,eAAe;YACnC,KAAK,EAAE,KAAK,CAAC,kBAAkB;SAChC,EACD,2BAA2B,CAC5B,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,QAAsB,EAAE,UAAkB;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,KAAK,EAAE,SAAS,YAAY,IAAI;YAC9C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;YAClE,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,IAAI,EAAE,SAAS,YAAY,IAAI;YAC5C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;YACjE,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,aAAa,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,4DAA4D;QAC5D,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpE,MAAM,IAAI,GAAI,CAAC,CAAC,OAAmC,CAAC,MAAM,CAAC,CAAC;gBAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAChD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC1C,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC;wBAAE,MAAM;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,OAAO,uBAAuB,QAAQ,CAAC,MAAM,sBAAsB,UAAU,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,MAAM,aAAa,EAAE,CAAC;QACzJ,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,MAAM,MAAM,yBAAyB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * ReflectorWorker — Condenses session observations into cross-session memory.
3
+ *
4
+ * When session-tier observations exceed their token budget, the Reflector:
5
+ * 1. Extracts persistent facts worth remembering across sessions
6
+ * 2. Condenses remaining observations (merge related, drop stale)
7
+ * 3. Feeds extracted facts into StructuredMemory as new MemoryItems
8
+ *
9
+ * Also runs on session end to capture any remaining valuable observations.
10
+ */
11
+ import type { MemoryManager } from './memory-manager.js';
12
+ import { ObservationStore } from './observation-store.js';
13
+ import type { CompressFn } from './observer-worker.js';
14
+ export interface ReflectionResult {
15
+ itemsCreated: number;
16
+ condensedObservations: string;
17
+ condensedTokens: number;
18
+ }
19
+ export declare class ReflectorWorker {
20
+ private readonly _compressFn;
21
+ private readonly _memoryManager;
22
+ constructor(compressFn: CompressFn, memoryManager: MemoryManager);
23
+ /**
24
+ * Reflect on session observations: extract persistent facts and condense.
25
+ *
26
+ * @param observations The session-tier observation text to reflect on
27
+ * @param sessionId The session ID (used as source for created items)
28
+ */
29
+ reflect(observations: string, sessionId: string): Promise<ReflectionResult>;
30
+ /**
31
+ * Run reflection and persist condensed observations as a cross-session block.
32
+ */
33
+ reflectAndPersist(observations: string, sessionId: string, store: ObservationStore): Promise<ReflectionResult>;
34
+ /**
35
+ * Parse the reflector's response into facts and condensed observations.
36
+ * Handles malformed responses gracefully.
37
+ */
38
+ private _parseReflectorResponse;
39
+ }
40
+ //# sourceMappingURL=reflector-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflector-worker.d.ts","sourceRoot":"","sources":["../../src/memory/reflector-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAevD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;CACzB;AAkCD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;gBAEnC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa;IAKhE;;;;;OAKG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkEjF;;OAEG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,CAAC;IAqB5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CAgDhC"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * ReflectorWorker — Condenses session observations into cross-session memory.
3
+ *
4
+ * When session-tier observations exceed their token budget, the Reflector:
5
+ * 1. Extracts persistent facts worth remembering across sessions
6
+ * 2. Condenses remaining observations (merge related, drop stale)
7
+ * 3. Feeds extracted facts into StructuredMemory as new MemoryItems
8
+ *
9
+ * Also runs on session end to capture any remaining valuable observations.
10
+ */
11
+ import { ObservationStore } from './observation-store.js';
12
+ import { estimateTokens } from './token-estimator.js';
13
+ import { createLogger } from '../utils/logger.js';
14
+ const log = createLogger('reflector-worker');
15
+ const VALID_TYPES = ['profile', 'event', 'knowledge', 'behavior', 'skill', 'tool'];
16
+ /**
17
+ * Build the reflector prompt.
18
+ */
19
+ function buildReflectorPrompt(observations) {
20
+ return `You are a memory reflector. Review these session observations and produce TWO sections:
21
+
22
+ ## SECTION 1: PERSISTENT FACTS
23
+ Extract facts worth remembering across sessions. These are things like:
24
+ - User preferences, habits, or identity facts
25
+ - Project decisions that affect future work
26
+ - Important configurations, paths, or environment details
27
+ - Skills or procedures the agent learned
28
+ - Recurring patterns or behaviors
29
+
30
+ Output as a JSON array on a SINGLE line after the header "FACTS:":
31
+ FACTS: [{"summary": "...", "type": "knowledge|behavior|profile|event|skill|tool", "tags": ["tag1", "tag2"]}]
32
+
33
+ If no persistent facts, output: FACTS: []
34
+
35
+ ## SECTION 2: CONDENSED OBSERVATIONS
36
+ Condense the remaining observations:
37
+ - Merge related entries
38
+ - Drop anything no longer relevant (completed tasks, resolved errors)
39
+ - Keep CRITICAL items verbatim
40
+ - Preserve exact names, paths, IDs
41
+
42
+ Output the condensed observations in the same dated format after the header "CONDENSED:"
43
+
44
+ Observations to reflect on:
45
+ ${observations}`;
46
+ }
47
+ export class ReflectorWorker {
48
+ _compressFn;
49
+ _memoryManager;
50
+ constructor(compressFn, memoryManager) {
51
+ this._compressFn = compressFn;
52
+ this._memoryManager = memoryManager;
53
+ }
54
+ /**
55
+ * Reflect on session observations: extract persistent facts and condense.
56
+ *
57
+ * @param observations The session-tier observation text to reflect on
58
+ * @param sessionId The session ID (used as source for created items)
59
+ */
60
+ async reflect(observations, sessionId) {
61
+ if (!observations.trim()) {
62
+ return { itemsCreated: 0, condensedObservations: '', condensedTokens: 0 };
63
+ }
64
+ const prompt = buildReflectorPrompt(observations);
65
+ let response;
66
+ try {
67
+ response = await this._compressFn(prompt);
68
+ }
69
+ catch (err) {
70
+ log.error({ err }, 'Reflector compression call failed');
71
+ // On failure, return observations unchanged
72
+ return {
73
+ itemsCreated: 0,
74
+ condensedObservations: observations,
75
+ condensedTokens: estimateTokens(observations),
76
+ };
77
+ }
78
+ // Parse the response into facts + condensed observations
79
+ const { facts, condensed } = this._parseReflectorResponse(response);
80
+ // Create memory items from extracted facts
81
+ let itemsCreated = 0;
82
+ for (const fact of facts) {
83
+ try {
84
+ const itemType = VALID_TYPES.includes(fact.type)
85
+ ? fact.type
86
+ : 'knowledge';
87
+ await this._memoryManager.structuredMemory.createItem({
88
+ type: itemType,
89
+ summary: fact.summary,
90
+ source: sessionId,
91
+ source_type: 'agent_analysis',
92
+ tags: fact.tags,
93
+ category: `${itemType}/reflected`,
94
+ });
95
+ itemsCreated++;
96
+ }
97
+ catch (err) {
98
+ log.debug({ err, fact: fact.summary }, 'Failed to create reflected memory item');
99
+ }
100
+ }
101
+ // Invalidate memory index since we added items
102
+ if (itemsCreated > 0) {
103
+ this._memoryManager.invalidateIndex();
104
+ }
105
+ const condensedTokens = estimateTokens(condensed);
106
+ log.info({
107
+ sessionId,
108
+ factsExtracted: facts.length,
109
+ itemsCreated,
110
+ inputTokens: estimateTokens(observations),
111
+ condensedTokens,
112
+ }, 'Reflection complete');
113
+ return { itemsCreated, condensedObservations: condensed, condensedTokens };
114
+ }
115
+ /**
116
+ * Run reflection and persist condensed observations as a cross-session block.
117
+ */
118
+ async reflectAndPersist(observations, sessionId, store) {
119
+ const result = await this.reflect(observations, sessionId);
120
+ if (result.condensedObservations.trim()) {
121
+ const block = {
122
+ id: ObservationStore.generateId(),
123
+ sessionId,
124
+ createdAt: new Date().toISOString(),
125
+ tier: 'cross-session',
126
+ observations: result.condensedObservations,
127
+ sourceMessageRange: [0, 0], // Not applicable for cross-session
128
+ estimatedTokens: result.condensedTokens,
129
+ };
130
+ await store.append(block);
131
+ }
132
+ return result;
133
+ }
134
+ // ── Private helpers ──────────────────────────────────────────────
135
+ /**
136
+ * Parse the reflector's response into facts and condensed observations.
137
+ * Handles malformed responses gracefully.
138
+ */
139
+ _parseReflectorResponse(response) {
140
+ let facts = [];
141
+ let condensed = '';
142
+ // Extract FACTS line
143
+ const factsMatch = response.match(/FACTS:\s*(\[[\s\S]*?\])\s*(?:\n|CONDENSED:|$)/);
144
+ if (factsMatch?.[1]) {
145
+ try {
146
+ const parsed = JSON.parse(factsMatch[1]);
147
+ if (Array.isArray(parsed)) {
148
+ facts = parsed.filter((f) => typeof f === 'object' &&
149
+ f !== null &&
150
+ typeof f.summary === 'string' &&
151
+ f.summary.length > 0).map(f => ({
152
+ summary: f.summary,
153
+ type: typeof f.type === 'string' ? f.type : 'knowledge',
154
+ tags: Array.isArray(f.tags) ? f.tags.filter((t) => typeof t === 'string') : [],
155
+ }));
156
+ }
157
+ }
158
+ catch {
159
+ log.debug('Failed to parse FACTS JSON from reflector response');
160
+ }
161
+ }
162
+ // Extract CONDENSED section (everything after "CONDENSED:")
163
+ const condensedMatch = response.match(/CONDENSED:\s*([\s\S]*)/);
164
+ if (condensedMatch?.[1]) {
165
+ condensed = condensedMatch[1].trim();
166
+ }
167
+ else {
168
+ // Fallback: if no CONDENSED marker, use the part after FACTS
169
+ // Use proper bracket matching to avoid cutting off inside JSON arrays
170
+ const factsMatch = response.match(/FACTS:\s*(\[[\s\S]*?\](?:\s*,\s*\[[\s\S]*?\])*)/);
171
+ if (factsMatch) {
172
+ const afterFacts = response.substring(factsMatch.index + factsMatch[0].length).trim();
173
+ if (afterFacts) {
174
+ condensed = afterFacts;
175
+ }
176
+ }
177
+ else {
178
+ // No FACTS found at all, use entire response as condensed
179
+ condensed = response.trim();
180
+ }
181
+ }
182
+ return { facts, condensed };
183
+ }
184
+ }
185
+ //# sourceMappingURL=reflector-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflector-worker.js","sourceRoot":"","sources":["../../src/memory/reflector-worker.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,28 @@
1
1
  /**
2
2
  * SalienceScorer — Ranks memory items by contextual relevance.
3
3
  *
4
- * Spec SS5.4 "Salience-Aware Retrieval":
5
- * salience = (access_count * 0.3)
6
- * + recency_decay(last_accessed)
7
- * + relevance_score(query, item)
8
- * + source_trust_bonus(source_type)
4
+ * Spec SS5.4 "Salience-Aware Retrieval" (updated):
5
+ * salience = bm25Score * recencyDecay * frequencyBoost * trustScore
6
+ *
7
+ * Multiplicative composition ensures all factors contribute.
8
+ * Half-life defaults to 14 days (configurable).
9
9
  */
10
10
  import type { MemoryItem, SalienceScore, SourceType } from './memory-types.js';
11
11
  export declare class SalienceScorer {
12
- scoreItem(item: MemoryItem, query: string): SalienceScore;
12
+ private readonly _halfLifeDays;
13
+ constructor(halfLifeDays?: number);
14
+ /**
15
+ * Score an item using multiplicative composition.
16
+ * When a BM25 score is available (from MiniSearch), pass it as bm25Score.
17
+ * Falls back to keyword relevance score when bm25Score is not provided.
18
+ */
19
+ scoreItem(item: MemoryItem, query: string, bm25Score?: number): SalienceScore;
13
20
  rankItems(items: MemoryItem[], query: string, limit?: number): SalienceScore[];
14
21
  recencyDecay(lastAccessed: string): number;
22
+ frequencyBoost(accessCount: number): number;
23
+ trustScore(sourceType: SourceType): number;
15
24
  relevanceScore(query: string, item: MemoryItem): number;
25
+ /** @deprecated Use trustScore() instead */
16
26
  sourceTrustBonus(sourceType: SourceType): number;
17
27
  private _tokenize;
18
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"salience-scorer.d.ts","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/E,qBAAa,cAAc;IACzB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa;IAkBzD,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAM9E,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAQ1C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM;IAgBvD,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAWhD,OAAO,CAAC,SAAS;CAMlB"}
1
+ {"version":3,"file":"salience-scorer.d.ts","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAK/E,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,YAAY,GAAE,MAA+B;IAIzD;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa;IAkB7E,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAM9E,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAQ1C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAK3C,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAc1C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM;IAgBvD,2CAA2C;IAC3C,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAIhD,OAAO,CAAC,SAAS;CAMlB"}
@@ -1,28 +1,37 @@
1
1
  /**
2
2
  * SalienceScorer — Ranks memory items by contextual relevance.
3
3
  *
4
- * Spec SS5.4 "Salience-Aware Retrieval":
5
- * salience = (access_count * 0.3)
6
- * + recency_decay(last_accessed)
7
- * + relevance_score(query, item)
8
- * + source_trust_bonus(source_type)
4
+ * Spec SS5.4 "Salience-Aware Retrieval" (updated):
5
+ * salience = bm25Score * recencyDecay * frequencyBoost * trustScore
6
+ *
7
+ * Multiplicative composition ensures all factors contribute.
8
+ * Half-life defaults to 14 days (configurable).
9
9
  */
10
- const HALF_LIFE_DAYS = 7;
10
+ const DEFAULT_HALF_LIFE_DAYS = 14;
11
11
  const LN2 = Math.LN2;
12
12
  export class SalienceScorer {
13
- scoreItem(item, query) {
14
- const accessWeight = item.access_count * 0.3;
13
+ _halfLifeDays;
14
+ constructor(halfLifeDays = DEFAULT_HALF_LIFE_DAYS) {
15
+ this._halfLifeDays = halfLifeDays;
16
+ }
17
+ /**
18
+ * Score an item using multiplicative composition.
19
+ * When a BM25 score is available (from MiniSearch), pass it as bm25Score.
20
+ * Falls back to keyword relevance score when bm25Score is not provided.
21
+ */
22
+ scoreItem(item, query, bm25Score) {
15
23
  const recencyDecay = this.recencyDecay(item.last_accessed);
16
- const relevanceScore = this.relevanceScore(query, item);
17
- const sourceTrustBonus = this.sourceTrustBonus(item.source_type);
24
+ const frequencyBoost = this.frequencyBoost(item.access_count);
25
+ const trustScore = this.trustScore(item.source_type);
26
+ const relevanceScore = bm25Score ?? this.relevanceScore(query, item);
18
27
  return {
19
28
  itemId: item.id,
20
- score: accessWeight + recencyDecay + relevanceScore + sourceTrustBonus,
29
+ score: relevanceScore * recencyDecay * frequencyBoost * trustScore,
21
30
  components: {
22
- accessWeight,
31
+ accessWeight: frequencyBoost,
23
32
  recencyDecay,
24
33
  relevanceScore,
25
- sourceTrustBonus,
34
+ sourceTrustBonus: trustScore,
26
35
  },
27
36
  };
28
37
  }
@@ -36,7 +45,24 @@ export class SalienceScorer {
36
45
  const accessed = new Date(lastAccessed).getTime();
37
46
  const daysSince = Math.max(0, (now - accessed) / (1000 * 60 * 60 * 24));
38
47
  // Exponential decay: e^(-ln(2) * days / halfLife)
39
- return Math.exp((-LN2 * daysSince) / HALF_LIFE_DAYS);
48
+ return Math.exp((-LN2 * daysSince) / this._halfLifeDays);
49
+ }
50
+ frequencyBoost(accessCount) {
51
+ // Logarithmic: diminishing returns after ~10 accesses
52
+ return 1.0 + Math.log2(1 + accessCount) * 0.15;
53
+ }
54
+ trustScore(sourceType) {
55
+ switch (sourceType) {
56
+ case 'user_instruction':
57
+ return 1.0;
58
+ case 'agent_analysis':
59
+ return 0.7;
60
+ case 'tool_output':
61
+ return 0.3;
62
+ default:
63
+ // Fallback for unknown source types (should not happen with proper typing)
64
+ return 0.0;
65
+ }
40
66
  }
41
67
  relevanceScore(query, item) {
42
68
  const queryWords = this._tokenize(query);
@@ -52,15 +78,9 @@ export class SalienceScorer {
52
78
  }
53
79
  return matchCount / queryWords.length; // normalize 0-1
54
80
  }
81
+ /** @deprecated Use trustScore() instead */
55
82
  sourceTrustBonus(sourceType) {
56
- switch (sourceType) {
57
- case 'user_instruction':
58
- return 0.2;
59
- case 'agent_analysis':
60
- return 0.1;
61
- case 'tool_output':
62
- return 0.0;
63
- }
83
+ return this.trustScore(sourceType);
64
84
  }
65
85
  _tokenize(text) {
66
86
  return text
@@ -1 +1 @@
1
- {"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"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"}