zora-agent 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/CHANGELOG.md +145 -0
  2. package/LICENSE +21 -0
  3. package/README.md +159 -0
  4. package/dist/cli/audit-commands.d.ts +8 -0
  5. package/dist/cli/audit-commands.d.ts.map +1 -0
  6. package/dist/cli/audit-commands.js +67 -0
  7. package/dist/cli/audit-commands.js.map +1 -0
  8. package/dist/cli/daemon.d.ts +9 -0
  9. package/dist/cli/daemon.d.ts.map +1 -0
  10. package/dist/cli/daemon.js +107 -0
  11. package/dist/cli/daemon.js.map +1 -0
  12. package/dist/cli/doctor.d.ts +21 -0
  13. package/dist/cli/doctor.d.ts.map +1 -0
  14. package/dist/cli/doctor.js +31 -0
  15. package/dist/cli/doctor.js.map +1 -0
  16. package/dist/cli/edit-commands.d.ts +8 -0
  17. package/dist/cli/edit-commands.d.ts.map +1 -0
  18. package/dist/cli/edit-commands.js +46 -0
  19. package/dist/cli/edit-commands.js.map +1 -0
  20. package/dist/cli/index.d.ts +11 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +319 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/init-command.d.ts +30 -0
  25. package/dist/cli/init-command.d.ts.map +1 -0
  26. package/dist/cli/init-command.js +425 -0
  27. package/dist/cli/init-command.js.map +1 -0
  28. package/dist/cli/memory-commands.d.ts +11 -0
  29. package/dist/cli/memory-commands.d.ts.map +1 -0
  30. package/dist/cli/memory-commands.js +57 -0
  31. package/dist/cli/memory-commands.js.map +1 -0
  32. package/dist/cli/presets.d.ts +12 -0
  33. package/dist/cli/presets.d.ts.map +1 -0
  34. package/dist/cli/presets.js +169 -0
  35. package/dist/cli/presets.js.map +1 -0
  36. package/dist/cli/skill-commands.d.ts +10 -0
  37. package/dist/cli/skill-commands.d.ts.map +1 -0
  38. package/dist/cli/skill-commands.js +73 -0
  39. package/dist/cli/skill-commands.js.map +1 -0
  40. package/dist/cli/steer-commands.d.ts +10 -0
  41. package/dist/cli/steer-commands.d.ts.map +1 -0
  42. package/dist/cli/steer-commands.js +92 -0
  43. package/dist/cli/steer-commands.js.map +1 -0
  44. package/dist/cli/team-commands.d.ts +8 -0
  45. package/dist/cli/team-commands.d.ts.map +1 -0
  46. package/dist/cli/team-commands.js +93 -0
  47. package/dist/cli/team-commands.js.map +1 -0
  48. package/dist/config/defaults.d.ts +26 -0
  49. package/dist/config/defaults.d.ts.map +1 -0
  50. package/dist/config/defaults.js +173 -0
  51. package/dist/config/defaults.js.map +1 -0
  52. package/dist/config/index.d.ts +3 -0
  53. package/dist/config/index.d.ts.map +1 -0
  54. package/dist/config/index.js +3 -0
  55. package/dist/config/index.js.map +1 -0
  56. package/dist/config/loader.d.ts +30 -0
  57. package/dist/config/loader.d.ts.map +1 -0
  58. package/dist/config/loader.js +130 -0
  59. package/dist/config/loader.js.map +1 -0
  60. package/dist/config/policy-loader.d.ts +18 -0
  61. package/dist/config/policy-loader.d.ts.map +1 -0
  62. package/dist/config/policy-loader.js +72 -0
  63. package/dist/config/policy-loader.js.map +1 -0
  64. package/dist/dashboard/auth-middleware.d.ts +15 -0
  65. package/dist/dashboard/auth-middleware.d.ts.map +1 -0
  66. package/dist/dashboard/auth-middleware.js +44 -0
  67. package/dist/dashboard/auth-middleware.js.map +1 -0
  68. package/dist/dashboard/frontend/vite.config.d.ts +3 -0
  69. package/dist/dashboard/frontend/vite.config.d.ts.map +1 -0
  70. package/dist/dashboard/frontend/vite.config.js +11 -0
  71. package/dist/dashboard/frontend/vite.config.js.map +1 -0
  72. package/dist/dashboard/server.d.ts +55 -0
  73. package/dist/dashboard/server.d.ts.map +1 -0
  74. package/dist/dashboard/server.js +254 -0
  75. package/dist/dashboard/server.js.map +1 -0
  76. package/dist/index.d.ts +20 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +19 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/memory/category-organizer.d.ts +33 -0
  81. package/dist/memory/category-organizer.d.ts.map +1 -0
  82. package/dist/memory/category-organizer.js +137 -0
  83. package/dist/memory/category-organizer.js.map +1 -0
  84. package/dist/memory/extraction-pipeline.d.ts +22 -0
  85. package/dist/memory/extraction-pipeline.d.ts.map +1 -0
  86. package/dist/memory/extraction-pipeline.js +156 -0
  87. package/dist/memory/extraction-pipeline.js.map +1 -0
  88. package/dist/memory/index.d.ts +7 -0
  89. package/dist/memory/index.d.ts.map +1 -0
  90. package/dist/memory/index.js +7 -0
  91. package/dist/memory/index.js.map +1 -0
  92. package/dist/memory/memory-manager.d.ts +56 -0
  93. package/dist/memory/memory-manager.d.ts.map +1 -0
  94. package/dist/memory/memory-manager.js +198 -0
  95. package/dist/memory/memory-manager.js.map +1 -0
  96. package/dist/memory/memory-types.d.ts +44 -0
  97. package/dist/memory/memory-types.d.ts.map +1 -0
  98. package/dist/memory/memory-types.js +8 -0
  99. package/dist/memory/memory-types.js.map +1 -0
  100. package/dist/memory/salience-scorer.d.ts +19 -0
  101. package/dist/memory/salience-scorer.d.ts.map +1 -0
  102. package/dist/memory/salience-scorer.js +72 -0
  103. package/dist/memory/salience-scorer.js.map +1 -0
  104. package/dist/memory/structured-memory.d.ts +28 -0
  105. package/dist/memory/structured-memory.d.ts.map +1 -0
  106. package/dist/memory/structured-memory.js +140 -0
  107. package/dist/memory/structured-memory.js.map +1 -0
  108. package/dist/orchestrator/auth-monitor.d.ts +28 -0
  109. package/dist/orchestrator/auth-monitor.d.ts.map +1 -0
  110. package/dist/orchestrator/auth-monitor.js +49 -0
  111. package/dist/orchestrator/auth-monitor.js.map +1 -0
  112. package/dist/orchestrator/execution-loop.d.ts +59 -0
  113. package/dist/orchestrator/execution-loop.d.ts.map +1 -0
  114. package/dist/orchestrator/execution-loop.js +94 -0
  115. package/dist/orchestrator/execution-loop.js.map +1 -0
  116. package/dist/orchestrator/failover-controller.d.ts +32 -0
  117. package/dist/orchestrator/failover-controller.d.ts.map +1 -0
  118. package/dist/orchestrator/failover-controller.js +111 -0
  119. package/dist/orchestrator/failover-controller.js.map +1 -0
  120. package/dist/orchestrator/index.d.ts +11 -0
  121. package/dist/orchestrator/index.d.ts.map +1 -0
  122. package/dist/orchestrator/index.js +11 -0
  123. package/dist/orchestrator/index.js.map +1 -0
  124. package/dist/orchestrator/orchestrator.d.ts +99 -0
  125. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  126. package/dist/orchestrator/orchestrator.js +456 -0
  127. package/dist/orchestrator/orchestrator.js.map +1 -0
  128. package/dist/orchestrator/retry-queue.d.ts +39 -0
  129. package/dist/orchestrator/retry-queue.d.ts.map +1 -0
  130. package/dist/orchestrator/retry-queue.js +99 -0
  131. package/dist/orchestrator/retry-queue.js.map +1 -0
  132. package/dist/orchestrator/router.d.ts +49 -0
  133. package/dist/orchestrator/router.d.ts.map +1 -0
  134. package/dist/orchestrator/router.js +167 -0
  135. package/dist/orchestrator/router.js.map +1 -0
  136. package/dist/orchestrator/session-manager.d.ts +39 -0
  137. package/dist/orchestrator/session-manager.d.ts.map +1 -0
  138. package/dist/orchestrator/session-manager.js +117 -0
  139. package/dist/orchestrator/session-manager.js.map +1 -0
  140. package/dist/providers/claude-provider.d.ts +182 -0
  141. package/dist/providers/claude-provider.d.ts.map +1 -0
  142. package/dist/providers/claude-provider.js +443 -0
  143. package/dist/providers/claude-provider.js.map +1 -0
  144. package/dist/providers/gemini-provider.d.ts +46 -0
  145. package/dist/providers/gemini-provider.d.ts.map +1 -0
  146. package/dist/providers/gemini-provider.js +336 -0
  147. package/dist/providers/gemini-provider.js.map +1 -0
  148. package/dist/providers/index.d.ts +10 -0
  149. package/dist/providers/index.d.ts.map +1 -0
  150. package/dist/providers/index.js +10 -0
  151. package/dist/providers/index.js.map +1 -0
  152. package/dist/providers/ollama-provider.d.ts +61 -0
  153. package/dist/providers/ollama-provider.d.ts.map +1 -0
  154. package/dist/providers/ollama-provider.js +319 -0
  155. package/dist/providers/ollama-provider.js.map +1 -0
  156. package/dist/routines/event-triggers.d.ts +34 -0
  157. package/dist/routines/event-triggers.d.ts.map +1 -0
  158. package/dist/routines/event-triggers.js +104 -0
  159. package/dist/routines/event-triggers.js.map +1 -0
  160. package/dist/routines/heartbeat.d.ts +35 -0
  161. package/dist/routines/heartbeat.d.ts.map +1 -0
  162. package/dist/routines/heartbeat.js +93 -0
  163. package/dist/routines/heartbeat.js.map +1 -0
  164. package/dist/routines/index.d.ts +7 -0
  165. package/dist/routines/index.d.ts.map +1 -0
  166. package/dist/routines/index.js +7 -0
  167. package/dist/routines/index.js.map +1 -0
  168. package/dist/routines/routine-manager.d.ts +62 -0
  169. package/dist/routines/routine-manager.d.ts.map +1 -0
  170. package/dist/routines/routine-manager.js +148 -0
  171. package/dist/routines/routine-manager.js.map +1 -0
  172. package/dist/security/audit-logger.d.ts +55 -0
  173. package/dist/security/audit-logger.d.ts.map +1 -0
  174. package/dist/security/audit-logger.js +252 -0
  175. package/dist/security/audit-logger.js.map +1 -0
  176. package/dist/security/capability-tokens.d.ts +30 -0
  177. package/dist/security/capability-tokens.d.ts.map +1 -0
  178. package/dist/security/capability-tokens.js +110 -0
  179. package/dist/security/capability-tokens.js.map +1 -0
  180. package/dist/security/index.d.ts +18 -0
  181. package/dist/security/index.d.ts.map +1 -0
  182. package/dist/security/index.js +12 -0
  183. package/dist/security/index.js.map +1 -0
  184. package/dist/security/integrity-guardian.d.ts +43 -0
  185. package/dist/security/integrity-guardian.d.ts.map +1 -0
  186. package/dist/security/integrity-guardian.js +103 -0
  187. package/dist/security/integrity-guardian.js.map +1 -0
  188. package/dist/security/intent-capsule.d.ts +52 -0
  189. package/dist/security/intent-capsule.d.ts.map +1 -0
  190. package/dist/security/intent-capsule.js +157 -0
  191. package/dist/security/intent-capsule.js.map +1 -0
  192. package/dist/security/leak-detector.d.ts +26 -0
  193. package/dist/security/leak-detector.d.ts.map +1 -0
  194. package/dist/security/leak-detector.js +75 -0
  195. package/dist/security/leak-detector.js.map +1 -0
  196. package/dist/security/policy-engine.d.ts +188 -0
  197. package/dist/security/policy-engine.d.ts.map +1 -0
  198. package/dist/security/policy-engine.js +799 -0
  199. package/dist/security/policy-engine.js.map +1 -0
  200. package/dist/security/prompt-defense.d.ts +30 -0
  201. package/dist/security/prompt-defense.d.ts.map +1 -0
  202. package/dist/security/prompt-defense.js +164 -0
  203. package/dist/security/prompt-defense.js.map +1 -0
  204. package/dist/security/secrets-manager.d.ts +47 -0
  205. package/dist/security/secrets-manager.d.ts.map +1 -0
  206. package/dist/security/secrets-manager.js +132 -0
  207. package/dist/security/secrets-manager.js.map +1 -0
  208. package/dist/security/security-types.d.ts +84 -0
  209. package/dist/security/security-types.d.ts.map +1 -0
  210. package/dist/security/security-types.js +8 -0
  211. package/dist/security/security-types.js.map +1 -0
  212. package/dist/skills/index.d.ts +5 -0
  213. package/dist/skills/index.d.ts.map +1 -0
  214. package/dist/skills/index.js +5 -0
  215. package/dist/skills/index.js.map +1 -0
  216. package/dist/skills/skill-loader.d.ts +25 -0
  217. package/dist/skills/skill-loader.d.ts.map +1 -0
  218. package/dist/skills/skill-loader.js +64 -0
  219. package/dist/skills/skill-loader.js.map +1 -0
  220. package/dist/steering/flag-manager.d.ts +52 -0
  221. package/dist/steering/flag-manager.d.ts.map +1 -0
  222. package/dist/steering/flag-manager.js +160 -0
  223. package/dist/steering/flag-manager.js.map +1 -0
  224. package/dist/steering/index.d.ts +8 -0
  225. package/dist/steering/index.d.ts.map +1 -0
  226. package/dist/steering/index.js +8 -0
  227. package/dist/steering/index.js.map +1 -0
  228. package/dist/steering/steer-injector.d.ts +15 -0
  229. package/dist/steering/steer-injector.d.ts.map +1 -0
  230. package/dist/steering/steer-injector.js +41 -0
  231. package/dist/steering/steer-injector.js.map +1 -0
  232. package/dist/steering/steering-manager.d.ts +33 -0
  233. package/dist/steering/steering-manager.d.ts.map +1 -0
  234. package/dist/steering/steering-manager.js +79 -0
  235. package/dist/steering/steering-manager.js.map +1 -0
  236. package/dist/steering/telegram-gateway.d.ts +27 -0
  237. package/dist/steering/telegram-gateway.d.ts.map +1 -0
  238. package/dist/steering/telegram-gateway.js +89 -0
  239. package/dist/steering/telegram-gateway.js.map +1 -0
  240. package/dist/steering/types.d.ts +54 -0
  241. package/dist/steering/types.d.ts.map +1 -0
  242. package/dist/steering/types.js +11 -0
  243. package/dist/steering/types.js.map +1 -0
  244. package/dist/teams/agent-loader.d.ts +38 -0
  245. package/dist/teams/agent-loader.d.ts.map +1 -0
  246. package/dist/teams/agent-loader.js +85 -0
  247. package/dist/teams/agent-loader.js.map +1 -0
  248. package/dist/teams/bridge-watchdog.d.ts +44 -0
  249. package/dist/teams/bridge-watchdog.d.ts.map +1 -0
  250. package/dist/teams/bridge-watchdog.js +118 -0
  251. package/dist/teams/bridge-watchdog.js.map +1 -0
  252. package/dist/teams/gemini-bridge.d.ts +43 -0
  253. package/dist/teams/gemini-bridge.d.ts.map +1 -0
  254. package/dist/teams/gemini-bridge.js +132 -0
  255. package/dist/teams/gemini-bridge.js.map +1 -0
  256. package/dist/teams/index.d.ts +11 -0
  257. package/dist/teams/index.d.ts.map +1 -0
  258. package/dist/teams/index.js +11 -0
  259. package/dist/teams/index.js.map +1 -0
  260. package/dist/teams/mailbox.d.ts +33 -0
  261. package/dist/teams/mailbox.d.ts.map +1 -0
  262. package/dist/teams/mailbox.js +97 -0
  263. package/dist/teams/mailbox.js.map +1 -0
  264. package/dist/teams/pr-lifecycle.d.ts +47 -0
  265. package/dist/teams/pr-lifecycle.d.ts.map +1 -0
  266. package/dist/teams/pr-lifecycle.js +83 -0
  267. package/dist/teams/pr-lifecycle.js.map +1 -0
  268. package/dist/teams/team-manager.d.ts +57 -0
  269. package/dist/teams/team-manager.d.ts.map +1 -0
  270. package/dist/teams/team-manager.js +170 -0
  271. package/dist/teams/team-manager.js.map +1 -0
  272. package/dist/teams/team-types.d.ts +35 -0
  273. package/dist/teams/team-types.d.ts.map +1 -0
  274. package/dist/teams/team-types.js +9 -0
  275. package/dist/teams/team-types.js.map +1 -0
  276. package/dist/tools/index.d.ts +8 -0
  277. package/dist/tools/index.d.ts.map +1 -0
  278. package/dist/tools/index.js +8 -0
  279. package/dist/tools/index.js.map +1 -0
  280. package/dist/tools/notifications.d.ts +13 -0
  281. package/dist/tools/notifications.d.ts.map +1 -0
  282. package/dist/tools/notifications.js +30 -0
  283. package/dist/tools/notifications.js.map +1 -0
  284. package/dist/types.d.ts +311 -0
  285. package/dist/types.d.ts.map +1 -0
  286. package/dist/types.js +8 -0
  287. package/dist/types.js.map +1 -0
  288. package/dist/utils/fs.d.ts +9 -0
  289. package/dist/utils/fs.d.ts.map +1 -0
  290. package/dist/utils/fs.js +31 -0
  291. package/dist/utils/fs.js.map +1 -0
  292. package/dist/utils/logger.d.ts +43 -0
  293. package/dist/utils/logger.d.ts.map +1 -0
  294. package/dist/utils/logger.js +139 -0
  295. package/dist/utils/logger.js.map +1 -0
  296. package/dist/wasm/wasmtime-spike.d.ts +19 -0
  297. package/dist/wasm/wasmtime-spike.d.ts.map +1 -0
  298. package/dist/wasm/wasmtime-spike.js +39 -0
  299. package/dist/wasm/wasmtime-spike.js.map +1 -0
  300. package/examples/routines/content-pipeline.toml +20 -0
  301. package/examples/routines/job-search.toml +19 -0
  302. package/examples/routines/repo-cleanup.toml +14 -0
  303. package/package.json +66 -0
@@ -0,0 +1,156 @@
1
+ /**
2
+ * ExtractionPipeline — Schema-guided memory extraction.
3
+ *
4
+ * Spec SS5.4 "Proactive Memory Extraction Pipeline":
5
+ * Extracts structured MemoryItems from conversation messages,
6
+ * validates against the schema, and deduplicates against existing items.
7
+ */
8
+ const VALID_TYPES = ['profile', 'event', 'knowledge', 'behavior', 'skill', 'tool'];
9
+ const VALID_SOURCE_TYPES = ['user_instruction', 'agent_analysis', 'tool_output'];
10
+ const MAX_RETRIES = 2;
11
+ const DEDUP_THRESHOLD = 0.8;
12
+ export class ExtractionPipeline {
13
+ _extractFn;
14
+ constructor(extractFn) {
15
+ this._extractFn = extractFn;
16
+ }
17
+ async extract(messages, existingCategories) {
18
+ const errors = [];
19
+ let retries = 0;
20
+ let lastErrors = [];
21
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
22
+ const prompt = this._buildPrompt(messages, existingCategories, lastErrors);
23
+ let raw;
24
+ try {
25
+ raw = await this._extractFn(prompt);
26
+ }
27
+ catch (err) {
28
+ errors.push(`Extraction call failed: ${String(err)}`);
29
+ retries++;
30
+ continue;
31
+ }
32
+ let parsed;
33
+ try {
34
+ parsed = JSON.parse(raw);
35
+ }
36
+ catch {
37
+ const parseErr = 'Response is not valid JSON';
38
+ errors.push(parseErr);
39
+ lastErrors = [parseErr];
40
+ retries++;
41
+ continue;
42
+ }
43
+ if (!Array.isArray(parsed)) {
44
+ const arrErr = 'Response is not a JSON array';
45
+ errors.push(arrErr);
46
+ lastErrors = [arrErr];
47
+ retries++;
48
+ continue;
49
+ }
50
+ const validItems = [];
51
+ const itemErrors = [];
52
+ for (const raw of parsed) {
53
+ const result = this.validateItem(raw);
54
+ if (result.valid) {
55
+ validItems.push(raw);
56
+ }
57
+ else {
58
+ itemErrors.push(...result.errors);
59
+ }
60
+ }
61
+ if (itemErrors.length > 0 && validItems.length === 0 && attempt < MAX_RETRIES) {
62
+ errors.push(...itemErrors);
63
+ lastErrors = itemErrors;
64
+ retries++;
65
+ continue;
66
+ }
67
+ errors.push(...itemErrors);
68
+ return { items: validItems, errors, retries };
69
+ }
70
+ return { items: [], errors, retries };
71
+ }
72
+ validateItem(item) {
73
+ const errors = [];
74
+ if (typeof item !== 'object' || item === null) {
75
+ return { valid: false, errors: ['Item is not an object'] };
76
+ }
77
+ const obj = item;
78
+ const stringFields = ['id', 'summary', 'source', 'created_at', 'last_accessed', 'category'];
79
+ for (const field of stringFields) {
80
+ if (typeof obj[field] !== 'string' || obj[field].length === 0) {
81
+ errors.push(`Missing or invalid field: ${field}`);
82
+ }
83
+ }
84
+ if (typeof obj['type'] !== 'string' || !VALID_TYPES.includes(obj['type'])) {
85
+ errors.push(`Invalid type: ${String(obj['type'])}. Must be one of: ${VALID_TYPES.join(', ')}`);
86
+ }
87
+ if (typeof obj['source_type'] !== 'string' || !VALID_SOURCE_TYPES.includes(obj['source_type'])) {
88
+ errors.push(`Invalid source_type: ${String(obj['source_type'])}. Must be one of: ${VALID_SOURCE_TYPES.join(', ')}`);
89
+ }
90
+ if (typeof obj['access_count'] !== 'number') {
91
+ errors.push('Missing or invalid field: access_count');
92
+ }
93
+ if (typeof obj['reinforcement_score'] !== 'number') {
94
+ errors.push('Missing or invalid field: reinforcement_score');
95
+ }
96
+ if (!Array.isArray(obj['tags'])) {
97
+ errors.push('Missing or invalid field: tags (must be array)');
98
+ }
99
+ return { valid: errors.length === 0, errors };
100
+ }
101
+ deduplicateItems(newItems, existingItems) {
102
+ return newItems.filter(newItem => {
103
+ const newWords = this._wordSet(newItem.summary);
104
+ return !existingItems.some(existing => {
105
+ const existingWords = this._wordSet(existing.summary);
106
+ return this._jaccardSimilarity(newWords, existingWords) > DEDUP_THRESHOLD;
107
+ });
108
+ });
109
+ }
110
+ // ── Private helpers ──────────────────────────────────────────────
111
+ _buildPrompt(messages, existingCategories, previousErrors) {
112
+ const conversationBlock = messages.map((m, i) => `[${i + 1}] ${m}`).join('\n');
113
+ const categoriesBlock = existingCategories.length > 0
114
+ ? `Existing categories: ${existingCategories.join(', ')}`
115
+ : 'No existing categories yet.';
116
+ let errorBlock = '';
117
+ if (previousErrors.length > 0) {
118
+ errorBlock = `\nPrevious attempt had these errors. Please fix them:\n${previousErrors.join('\n')}\n`;
119
+ }
120
+ return `Extract structured memory items from the following conversation.
121
+ Return a JSON array of objects with these required fields:
122
+ - id (string): unique identifier
123
+ - type (string): one of: profile, event, knowledge, behavior, skill, tool
124
+ - summary (string): concise description
125
+ - source (string): session or job ID
126
+ - source_type (string): one of: user_instruction, agent_analysis, tool_output
127
+ - created_at (string): ISO 8601 timestamp
128
+ - last_accessed (string): ISO 8601 timestamp
129
+ - access_count (number): initial 0
130
+ - reinforcement_score (number): initial 0
131
+ - tags (string[]): relevant tags
132
+ - category (string): e.g. "coding/my-web-app"
133
+
134
+ ${categoriesBlock}
135
+ ${errorBlock}
136
+ Conversation:
137
+ ${conversationBlock}
138
+
139
+ Respond with ONLY a JSON array. No markdown fences, no explanation.`;
140
+ }
141
+ _wordSet(text) {
142
+ return new Set(text.toLowerCase().split(/\W+/).filter(w => w.length > 0));
143
+ }
144
+ _jaccardSimilarity(a, b) {
145
+ if (a.size === 0 && b.size === 0)
146
+ return 1;
147
+ let intersection = 0;
148
+ for (const word of a) {
149
+ if (b.has(word))
150
+ intersection++;
151
+ }
152
+ const union = a.size + b.size - intersection;
153
+ return union === 0 ? 0 : intersection / union;
154
+ }
155
+ }
156
+ //# sourceMappingURL=extraction-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-pipeline.js","sourceRoot":"","sources":["../../src/memory/extraction-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './memory-types.js';
2
+ export * from './memory-manager.js';
3
+ export * from './structured-memory.js';
4
+ export * from './salience-scorer.js';
5
+ export * from './extraction-pipeline.js';
6
+ export * from './category-organizer.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ export * from './memory-types.js';
2
+ export * from './memory-manager.js';
3
+ export * from './structured-memory.js';
4
+ export * from './salience-scorer.js';
5
+ export * from './extraction-pipeline.js';
6
+ export * from './category-organizer.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * MemoryManager — Hierarchical context management.
3
+ *
4
+ * Spec §5.4 "Memory System":
5
+ * - Tier 1: Long-term salience (MEMORY.md)
6
+ * - Tier 2: Rolling context (Daily Notes)
7
+ * - Tier 3: Structured items, salience, categories
8
+ * - Aggregates fragments into TaskContext.memoryContext
9
+ */
10
+ import type { MemoryConfig } from '../types.js';
11
+ import { StructuredMemory } from './structured-memory.js';
12
+ import type { MemoryItem, CategorySummary, SalienceScore } from './memory-types.js';
13
+ export declare class MemoryManager {
14
+ private readonly _config;
15
+ private readonly _baseDir;
16
+ private _structuredMemory;
17
+ private _scorer;
18
+ private _categoryOrganizer;
19
+ constructor(config: MemoryConfig, baseDir?: string, summarizeFn?: (items: MemoryItem[]) => Promise<string>);
20
+ /**
21
+ * Initializes memory directories (Tiers 1-3).
22
+ */
23
+ init(): Promise<void>;
24
+ /**
25
+ * Loads context for a new task based on tiers.
26
+ */
27
+ loadContext(days?: number): Promise<string[]>;
28
+ /**
29
+ * Appends an entry to today's daily note.
30
+ */
31
+ appendDailyNote(text: string): Promise<void>;
32
+ /**
33
+ * Searches structured memory items by query, ranked by salience.
34
+ */
35
+ searchMemory(query: string, limit?: number): Promise<SalienceScore[]>;
36
+ /**
37
+ * Deletes a structured memory item by ID.
38
+ */
39
+ forgetItem(id: string): Promise<boolean>;
40
+ /**
41
+ * Returns all category summaries.
42
+ */
43
+ getCategories(): Promise<CategorySummary[]>;
44
+ /**
45
+ * Exposes the underlying StructuredMemory for direct access.
46
+ */
47
+ get structuredMemory(): StructuredMemory;
48
+ private _resolvePath;
49
+ private _getLongTermPath;
50
+ private _getDailyNotesPath;
51
+ private _getItemsPath;
52
+ private _getCategoriesPath;
53
+ private _readLongTerm;
54
+ private _readDailyNotes;
55
+ }
56
+ //# sourceMappingURL=memory-manager.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * MemoryManager — Hierarchical context management.
3
+ *
4
+ * Spec §5.4 "Memory System":
5
+ * - Tier 1: Long-term salience (MEMORY.md)
6
+ * - Tier 2: Rolling context (Daily Notes)
7
+ * - Tier 3: Structured items, salience, categories
8
+ * - Aggregates fragments into TaskContext.memoryContext
9
+ */
10
+ import fs from 'node:fs/promises';
11
+ import path from 'node:path';
12
+ import os from 'node:os';
13
+ import { StructuredMemory } from './structured-memory.js';
14
+ import { SalienceScorer } from './salience-scorer.js';
15
+ import { CategoryOrganizer } from './category-organizer.js';
16
+ export class MemoryManager {
17
+ _config;
18
+ _baseDir;
19
+ _structuredMemory;
20
+ _scorer;
21
+ _categoryOrganizer;
22
+ constructor(config, baseDir = path.join(os.homedir(), '.zora'), summarizeFn) {
23
+ this._config = config;
24
+ this._baseDir = baseDir;
25
+ this._structuredMemory = new StructuredMemory(this._getItemsPath());
26
+ this._scorer = new SalienceScorer();
27
+ this._categoryOrganizer = new CategoryOrganizer(this._getCategoriesPath(), summarizeFn ?? (async (items) => `${items.length} items in category`));
28
+ }
29
+ /**
30
+ * Initializes memory directories (Tiers 1-3).
31
+ */
32
+ async init() {
33
+ const dailyNotesDir = this._getDailyNotesPath();
34
+ await fs.mkdir(dailyNotesDir, { recursive: true, mode: 0o700 });
35
+ const longTermFile = this._getLongTermPath();
36
+ const longTermDir = path.dirname(longTermFile);
37
+ await fs.mkdir(longTermDir, { recursive: true, mode: 0o700 });
38
+ try {
39
+ const defaultContent = '# Zora Long-term Memory\n\n- No persistent memories yet.\n';
40
+ // Use 'wx' to atomically fail if the file already exists (preventing race conditions)
41
+ await fs.writeFile(longTermFile, defaultContent, { mode: 0o600, flag: 'wx' });
42
+ }
43
+ catch (err) {
44
+ if (err.code !== 'EEXIST') {
45
+ throw err;
46
+ }
47
+ }
48
+ // Tier 3: Structured memory + categories
49
+ await this._structuredMemory.init();
50
+ await this._categoryOrganizer.init();
51
+ }
52
+ /**
53
+ * Loads context for a new task based on tiers.
54
+ */
55
+ async loadContext(days = this._config.context_days) {
56
+ const context = [];
57
+ // Tier 1: Long-term salience
58
+ const tier1 = await this._readLongTerm();
59
+ if (tier1)
60
+ context.push(`[LONG-TERM MEMORY]:\n${tier1}`);
61
+ // Tier 2: Rolling context (last N days of notes)
62
+ const tier2 = await this._readDailyNotes(days);
63
+ if (tier2.length > 0) {
64
+ context.push(`[RECENT CONTEXT]:\n${tier2.join('\n\n')}`);
65
+ }
66
+ // Tier 3: Category summaries + top-N salience-ranked items
67
+ const { summaries, topItems } = await this._categoryOrganizer.getDualModeContext('', // empty query for general context loading
68
+ this._structuredMemory, this._scorer, this._config.max_category_summaries, this._config.max_context_items);
69
+ if (summaries.length > 0) {
70
+ const catLines = summaries.map(s => `- [${s.category}]: ${s.summary}`).join('\n');
71
+ context.push(`[CATEGORY SUMMARIES]:\n${catLines}`);
72
+ }
73
+ if (topItems.length > 0) {
74
+ const allItems = await this._structuredMemory.listItems();
75
+ const itemMap = new Map(allItems.map(i => [i.id, i]));
76
+ const itemLines = topItems
77
+ .map(s => {
78
+ const item = itemMap.get(s.itemId);
79
+ return item ? `- [${item.type}] ${item.summary} (salience: ${s.score.toFixed(2)})` : null;
80
+ })
81
+ .filter(Boolean)
82
+ .join('\n');
83
+ if (itemLines) {
84
+ context.push(`[MEMORY ITEMS]:\n${itemLines}`);
85
+ }
86
+ }
87
+ return context;
88
+ }
89
+ /**
90
+ * Appends an entry to today's daily note.
91
+ */
92
+ async appendDailyNote(text) {
93
+ const today = new Date().toISOString().split('T')[0];
94
+ const filePath = path.join(this._getDailyNotesPath(), `${today}.md`);
95
+ const entry = `\n### ${new Date().toLocaleTimeString()}\n${text}\n`;
96
+ try {
97
+ await fs.appendFile(filePath, entry, { mode: 0o600 });
98
+ }
99
+ catch (err) {
100
+ if (err.code === 'ENOENT') {
101
+ // Create file with header if it doesn't exist
102
+ await fs.writeFile(filePath, `# Daily Notes: ${today}\n${entry}`, { mode: 0o600 });
103
+ }
104
+ else {
105
+ throw err;
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * Searches structured memory items by query, ranked by salience.
111
+ */
112
+ async searchMemory(query, limit) {
113
+ const items = await this._structuredMemory.searchItems(query);
114
+ return this._scorer.rankItems(items, query, limit);
115
+ }
116
+ /**
117
+ * Deletes a structured memory item by ID.
118
+ */
119
+ async forgetItem(id) {
120
+ return this._structuredMemory.deleteItem(id);
121
+ }
122
+ /**
123
+ * Returns all category summaries.
124
+ */
125
+ async getCategories() {
126
+ return this._categoryOrganizer.listCategories();
127
+ }
128
+ /**
129
+ * Exposes the underlying StructuredMemory for direct access.
130
+ */
131
+ get structuredMemory() {
132
+ return this._structuredMemory;
133
+ }
134
+ _resolvePath(p) {
135
+ if (p.startsWith('~/')) {
136
+ return path.join(os.homedir(), p.slice(2));
137
+ }
138
+ return p;
139
+ }
140
+ _getLongTermPath() {
141
+ const resolved = this._resolvePath(this._config.long_term_file);
142
+ return path.isAbsolute(resolved)
143
+ ? resolved
144
+ : path.join(this._baseDir, resolved);
145
+ }
146
+ _getDailyNotesPath() {
147
+ const resolved = this._resolvePath(this._config.daily_notes_dir);
148
+ return path.isAbsolute(resolved)
149
+ ? resolved
150
+ : path.join(this._baseDir, resolved);
151
+ }
152
+ _getItemsPath() {
153
+ const resolved = this._resolvePath(this._config.items_dir);
154
+ return path.isAbsolute(resolved)
155
+ ? resolved
156
+ : path.join(this._baseDir, resolved);
157
+ }
158
+ _getCategoriesPath() {
159
+ const resolved = this._resolvePath(this._config.categories_dir);
160
+ return path.isAbsolute(resolved)
161
+ ? resolved
162
+ : path.join(this._baseDir, resolved);
163
+ }
164
+ async _readLongTerm() {
165
+ try {
166
+ return await fs.readFile(this._getLongTermPath(), 'utf8');
167
+ }
168
+ catch (err) {
169
+ if (err.code === 'ENOENT') {
170
+ return null;
171
+ }
172
+ throw err;
173
+ }
174
+ }
175
+ async _readDailyNotes(days) {
176
+ const notes = [];
177
+ const dir = this._getDailyNotesPath();
178
+ try {
179
+ const files = await fs.readdir(dir);
180
+ const dateFiles = files
181
+ .filter(f => /^\d{4}-\d{2}-\d{2}\.md$/.test(f))
182
+ .sort()
183
+ .reverse()
184
+ .slice(0, days);
185
+ for (const file of dateFiles) {
186
+ const content = await fs.readFile(path.join(dir, file), 'utf8');
187
+ notes.push(`--- ${file} ---\n${content}`);
188
+ }
189
+ }
190
+ catch (err) {
191
+ if (err.code !== 'ENOENT') {
192
+ throw err;
193
+ }
194
+ }
195
+ return notes;
196
+ }
197
+ }
198
+ //# sourceMappingURL=memory-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-manager.js","sourceRoot":"","sources":["../../src/memory/memory-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Memory module types — Tier 3 structured memory.
3
+ *
4
+ * Spec SS5.4: Salience-aware retrieval, proactive extraction,
5
+ * category auto-organization.
6
+ */
7
+ export type MemoryItemType = 'profile' | 'event' | 'knowledge' | 'behavior' | 'skill' | 'tool';
8
+ export type SourceType = 'user_instruction' | 'agent_analysis' | 'tool_output';
9
+ export interface MemoryItem {
10
+ id: string;
11
+ type: MemoryItemType;
12
+ summary: string;
13
+ source: string;
14
+ source_type: SourceType;
15
+ created_at: string;
16
+ last_accessed: string;
17
+ access_count: number;
18
+ reinforcement_score: number;
19
+ tags: string[];
20
+ category: string;
21
+ }
22
+ export interface SalienceScore {
23
+ itemId: string;
24
+ score: number;
25
+ components: {
26
+ accessWeight: number;
27
+ recencyDecay: number;
28
+ relevanceScore: number;
29
+ sourceTrustBonus: number;
30
+ };
31
+ }
32
+ export interface CategorySummary {
33
+ category: string;
34
+ summary: string;
35
+ item_count: number;
36
+ last_updated: string;
37
+ member_item_ids: string[];
38
+ }
39
+ export interface ExtractionResult {
40
+ items: MemoryItem[];
41
+ errors: string[];
42
+ retries: number;
43
+ }
44
+ //# sourceMappingURL=memory-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-types.d.ts","sourceRoot":"","sources":["../../src/memory/memory-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAC/F,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAE/E,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Memory module types — Tier 3 structured memory.
3
+ *
4
+ * Spec SS5.4: Salience-aware retrieval, proactive extraction,
5
+ * category auto-organization.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=memory-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-types.js","sourceRoot":"","sources":["../../src/memory/memory-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * SalienceScorer — Ranks memory items by contextual relevance.
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)
9
+ */
10
+ import type { MemoryItem, SalienceScore, SourceType } from './memory-types.js';
11
+ export declare class SalienceScorer {
12
+ scoreItem(item: MemoryItem, query: string): SalienceScore;
13
+ rankItems(items: MemoryItem[], query: string, limit?: number): SalienceScore[];
14
+ recencyDecay(lastAccessed: string): number;
15
+ relevanceScore(query: string, item: MemoryItem): number;
16
+ sourceTrustBonus(sourceType: SourceType): number;
17
+ private _tokenize;
18
+ }
19
+ //# sourceMappingURL=salience-scorer.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * SalienceScorer — Ranks memory items by contextual relevance.
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)
9
+ */
10
+ const HALF_LIFE_DAYS = 7;
11
+ const LN2 = Math.LN2;
12
+ export class SalienceScorer {
13
+ scoreItem(item, query) {
14
+ const accessWeight = item.access_count * 0.3;
15
+ const recencyDecay = this.recencyDecay(item.last_accessed);
16
+ const relevanceScore = this.relevanceScore(query, item);
17
+ const sourceTrustBonus = this.sourceTrustBonus(item.source_type);
18
+ return {
19
+ itemId: item.id,
20
+ score: accessWeight + recencyDecay + relevanceScore + sourceTrustBonus,
21
+ components: {
22
+ accessWeight,
23
+ recencyDecay,
24
+ relevanceScore,
25
+ sourceTrustBonus,
26
+ },
27
+ };
28
+ }
29
+ rankItems(items, query, limit) {
30
+ const scored = items.map(item => this.scoreItem(item, query));
31
+ scored.sort((a, b) => b.score - a.score);
32
+ return limit !== undefined ? scored.slice(0, limit) : scored;
33
+ }
34
+ recencyDecay(lastAccessed) {
35
+ const now = Date.now();
36
+ const accessed = new Date(lastAccessed).getTime();
37
+ const daysSince = Math.max(0, (now - accessed) / (1000 * 60 * 60 * 24));
38
+ // Exponential decay: e^(-ln(2) * days / halfLife)
39
+ return Math.exp((-LN2 * daysSince) / HALF_LIFE_DAYS);
40
+ }
41
+ relevanceScore(query, item) {
42
+ const queryWords = this._tokenize(query);
43
+ if (queryWords.length === 0)
44
+ return 0;
45
+ const itemWords = new Set(this._tokenize(`${item.summary} ${item.tags.join(' ')}`));
46
+ if (itemWords.size === 0)
47
+ return 0;
48
+ let matchCount = 0;
49
+ for (const w of queryWords) {
50
+ if (itemWords.has(w))
51
+ matchCount++;
52
+ }
53
+ return matchCount / queryWords.length; // normalize 0-1
54
+ }
55
+ 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
+ }
64
+ }
65
+ _tokenize(text) {
66
+ return text
67
+ .toLowerCase()
68
+ .split(/\W+/)
69
+ .filter(w => w.length > 0);
70
+ }
71
+ }
72
+ //# sourceMappingURL=salience-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["../../src/memory/salience-scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * StructuredMemory — Tier 3 CRUD for memory items.
3
+ *
4
+ * Stores each MemoryItem as a JSON file in the items directory.
5
+ * Uses atomic writes (write to .tmp, rename) for crash safety.
6
+ */
7
+ import type { MemoryItem, MemoryItemType } from './memory-types.js';
8
+ type CreateItemInput = Omit<MemoryItem, 'id' | 'created_at' | 'last_accessed' | 'access_count' | 'reinforcement_score'>;
9
+ export declare class StructuredMemory {
10
+ private readonly _itemsDir;
11
+ constructor(itemsDir: string);
12
+ init(): Promise<void>;
13
+ createItem(input: CreateItemInput): Promise<MemoryItem>;
14
+ getItem(id: string): Promise<MemoryItem | null>;
15
+ updateItem(id: string, updates: Partial<MemoryItem>): Promise<MemoryItem | null>;
16
+ deleteItem(id: string): Promise<boolean>;
17
+ listItems(filter?: {
18
+ type?: MemoryItemType;
19
+ category?: string;
20
+ tags?: string[];
21
+ }): Promise<MemoryItem[]>;
22
+ searchItems(query: string): Promise<MemoryItem[]>;
23
+ private _itemPath;
24
+ private _writeItem;
25
+ private _readAllItems;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=structured-memory.d.ts.map