ahok-skill 1.3.1

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 (141) hide show
  1. package/.prettierrc +8 -0
  2. package/Dockerfile +59 -0
  3. package/RAW_SKILL.md +219 -0
  4. package/README.md +277 -0
  5. package/SKILL.md +58 -0
  6. package/bin/opm.js +268 -0
  7. package/data/openmemory.sqlite +0 -0
  8. package/data/openmemory.sqlite-shm +0 -0
  9. package/data/openmemory.sqlite-wal +0 -0
  10. package/dist/ai/graph.js +293 -0
  11. package/dist/ai/mcp.js +397 -0
  12. package/dist/cli.js +78 -0
  13. package/dist/core/cfg.js +87 -0
  14. package/dist/core/db.js +636 -0
  15. package/dist/core/memory.js +116 -0
  16. package/dist/core/migrate.js +227 -0
  17. package/dist/core/models.js +105 -0
  18. package/dist/core/telemetry.js +57 -0
  19. package/dist/core/types.js +2 -0
  20. package/dist/core/vector/postgres.js +52 -0
  21. package/dist/core/vector/valkey.js +246 -0
  22. package/dist/core/vector_store.js +2 -0
  23. package/dist/index.js +44 -0
  24. package/dist/memory/decay.js +301 -0
  25. package/dist/memory/embed.js +675 -0
  26. package/dist/memory/hsg.js +959 -0
  27. package/dist/memory/reflect.js +131 -0
  28. package/dist/memory/user_summary.js +99 -0
  29. package/dist/migrate.js +9 -0
  30. package/dist/ops/compress.js +255 -0
  31. package/dist/ops/dynamics.js +189 -0
  32. package/dist/ops/extract.js +333 -0
  33. package/dist/ops/ingest.js +214 -0
  34. package/dist/server/index.js +109 -0
  35. package/dist/server/middleware/auth.js +137 -0
  36. package/dist/server/routes/auth.js +186 -0
  37. package/dist/server/routes/compression.js +108 -0
  38. package/dist/server/routes/dashboard.js +399 -0
  39. package/dist/server/routes/docs.js +241 -0
  40. package/dist/server/routes/dynamics.js +312 -0
  41. package/dist/server/routes/ide.js +280 -0
  42. package/dist/server/routes/index.js +33 -0
  43. package/dist/server/routes/keys.js +132 -0
  44. package/dist/server/routes/langgraph.js +61 -0
  45. package/dist/server/routes/memory.js +213 -0
  46. package/dist/server/routes/sources.js +140 -0
  47. package/dist/server/routes/system.js +63 -0
  48. package/dist/server/routes/temporal.js +293 -0
  49. package/dist/server/routes/users.js +101 -0
  50. package/dist/server/routes/vercel.js +57 -0
  51. package/dist/server/server.js +211 -0
  52. package/dist/server.js +3 -0
  53. package/dist/sources/base.js +223 -0
  54. package/dist/sources/github.js +171 -0
  55. package/dist/sources/google_drive.js +166 -0
  56. package/dist/sources/google_sheets.js +112 -0
  57. package/dist/sources/google_slides.js +139 -0
  58. package/dist/sources/index.js +34 -0
  59. package/dist/sources/notion.js +165 -0
  60. package/dist/sources/onedrive.js +143 -0
  61. package/dist/sources/web_crawler.js +166 -0
  62. package/dist/temporal_graph/index.js +20 -0
  63. package/dist/temporal_graph/query.js +240 -0
  64. package/dist/temporal_graph/store.js +116 -0
  65. package/dist/temporal_graph/timeline.js +241 -0
  66. package/dist/temporal_graph/types.js +2 -0
  67. package/dist/utils/chunking.js +60 -0
  68. package/dist/utils/index.js +31 -0
  69. package/dist/utils/keyword.js +94 -0
  70. package/dist/utils/text.js +120 -0
  71. package/nodemon.json +7 -0
  72. package/package.json +50 -0
  73. package/references/api_reference.md +66 -0
  74. package/references/examples.md +45 -0
  75. package/src/ai/graph.ts +363 -0
  76. package/src/ai/mcp.ts +494 -0
  77. package/src/cli.ts +94 -0
  78. package/src/core/cfg.ts +110 -0
  79. package/src/core/db.ts +1052 -0
  80. package/src/core/memory.ts +99 -0
  81. package/src/core/migrate.ts +302 -0
  82. package/src/core/models.ts +107 -0
  83. package/src/core/telemetry.ts +47 -0
  84. package/src/core/types.ts +130 -0
  85. package/src/core/vector/postgres.ts +61 -0
  86. package/src/core/vector/valkey.ts +261 -0
  87. package/src/core/vector_store.ts +9 -0
  88. package/src/index.ts +5 -0
  89. package/src/memory/decay.ts +427 -0
  90. package/src/memory/embed.ts +707 -0
  91. package/src/memory/hsg.ts +1245 -0
  92. package/src/memory/reflect.ts +158 -0
  93. package/src/memory/user_summary.ts +110 -0
  94. package/src/migrate.ts +8 -0
  95. package/src/ops/compress.ts +296 -0
  96. package/src/ops/dynamics.ts +272 -0
  97. package/src/ops/extract.ts +360 -0
  98. package/src/ops/ingest.ts +286 -0
  99. package/src/server/index.ts +159 -0
  100. package/src/server/middleware/auth.ts +156 -0
  101. package/src/server/routes/auth.ts +223 -0
  102. package/src/server/routes/compression.ts +106 -0
  103. package/src/server/routes/dashboard.ts +420 -0
  104. package/src/server/routes/docs.ts +380 -0
  105. package/src/server/routes/dynamics.ts +516 -0
  106. package/src/server/routes/ide.ts +283 -0
  107. package/src/server/routes/index.ts +32 -0
  108. package/src/server/routes/keys.ts +131 -0
  109. package/src/server/routes/langgraph.ts +71 -0
  110. package/src/server/routes/memory.ts +440 -0
  111. package/src/server/routes/sources.ts +111 -0
  112. package/src/server/routes/system.ts +68 -0
  113. package/src/server/routes/temporal.ts +335 -0
  114. package/src/server/routes/users.ts +111 -0
  115. package/src/server/routes/vercel.ts +55 -0
  116. package/src/server/server.js +215 -0
  117. package/src/server.ts +1 -0
  118. package/src/sources/base.ts +257 -0
  119. package/src/sources/github.ts +156 -0
  120. package/src/sources/google_drive.ts +144 -0
  121. package/src/sources/google_sheets.ts +85 -0
  122. package/src/sources/google_slides.ts +115 -0
  123. package/src/sources/index.ts +19 -0
  124. package/src/sources/notion.ts +148 -0
  125. package/src/sources/onedrive.ts +131 -0
  126. package/src/sources/web_crawler.ts +161 -0
  127. package/src/temporal_graph/index.ts +4 -0
  128. package/src/temporal_graph/query.ts +299 -0
  129. package/src/temporal_graph/store.ts +156 -0
  130. package/src/temporal_graph/timeline.ts +319 -0
  131. package/src/temporal_graph/types.ts +41 -0
  132. package/src/utils/chunking.ts +66 -0
  133. package/src/utils/index.ts +25 -0
  134. package/src/utils/keyword.ts +137 -0
  135. package/src/utils/text.ts +115 -0
  136. package/tests/test_api_workspace_management.ts +413 -0
  137. package/tests/test_bulk_delete.ts +267 -0
  138. package/tests/test_omnibus.ts +166 -0
  139. package/tests/test_workspace_management.ts +278 -0
  140. package/tests/verify.ts +104 -0
  141. package/tsconfig.json +15 -0
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stop_reflection = exports.start_reflection = exports.run_reflection = void 0;
4
+ const db_1 = require("../core/db");
5
+ const hsg_1 = require("./hsg");
6
+ const cfg_1 = require("../core/cfg");
7
+ const utils_1 = require("../utils");
8
+ const sim = (t1, t2) => {
9
+ // Robust Jaccard overlap
10
+ const s1 = new Set(t1.toLowerCase().split(/\s+/).filter(x => x.length > 0));
11
+ const s2 = new Set(t2.toLowerCase().split(/\s+/).filter(x => x.length > 0));
12
+ if (s1.size === 0 || s2.size === 0)
13
+ return 0;
14
+ let inter = 0;
15
+ for (const token of s1) {
16
+ if (s2.has(token))
17
+ inter++;
18
+ }
19
+ const union = new Set([...s1, ...s2]).size;
20
+ return union > 0 ? inter / union : 0;
21
+ };
22
+ const cluster = (mems) => {
23
+ const cls = [];
24
+ const used = new Set();
25
+ for (const m of mems) {
26
+ if (used.has(m.id) ||
27
+ m.primary_sector === "reflective" ||
28
+ m.metadata?.consolidated)
29
+ continue;
30
+ const c = { mem: [m], n: 1 };
31
+ used.add(m.id);
32
+ for (const o of mems) {
33
+ if (used.has(o.id) || m.primary_sector !== o.primary_sector)
34
+ continue;
35
+ if (sim(m.content, o.content) > 0.8) {
36
+ c.mem.push(o);
37
+ c.n++;
38
+ used.add(o.id);
39
+ }
40
+ }
41
+ if (c.n >= 2)
42
+ cls.push(c);
43
+ }
44
+ return cls;
45
+ };
46
+ const sal = (c) => {
47
+ const now = Date.now();
48
+ const p = c.n / 10;
49
+ const r = c.mem.reduce((s, m) => s +
50
+ Math.exp(-(now - new Date(m.created_at).getTime()) / 43200000), 0) / c.n;
51
+ const e = c.mem.some((m) => m.sectors &&
52
+ Array.isArray(m.sectors) &&
53
+ m.sectors.includes("emotional"))
54
+ ? 1
55
+ : 0;
56
+ return Math.min(1, 0.6 * p + 0.3 * r + 0.1 * e);
57
+ };
58
+ const summ = (c) => {
59
+ const sec = c.mem[0].primary_sector;
60
+ const n = c.n;
61
+ const txt = c.mem.map((m) => m.content.substring(0, 60)).join("; ");
62
+ return `${n} ${sec} pattern: ${txt.substring(0, 200)}`;
63
+ };
64
+ const mark = async (ids) => {
65
+ for (const id of ids) {
66
+ const m = await db_1.q.get_mem.get(id);
67
+ if (m) {
68
+ const meta = JSON.parse(m.meta || "{}");
69
+ meta.consolidated = true;
70
+ await db_1.q.upd_mem.run(m.content, m.tags, JSON.stringify(meta), Date.now(), id);
71
+ }
72
+ }
73
+ };
74
+ const boost = async (ids) => {
75
+ for (const id of ids) {
76
+ const m = await db_1.q.get_mem.get(id);
77
+ if (m)
78
+ await db_1.q.upd_mem.run(m.content, m.tags, m.meta, Date.now(), id);
79
+ await db_1.q.upd_seen.run(id, m.last_seen_at, Math.min(1, m.salience * 1.1), Date.now());
80
+ }
81
+ };
82
+ const run_reflection = async () => {
83
+ console.error("[REFLECT] Starting reflection job...");
84
+ const min = cfg_1.env.reflect_min || 20;
85
+ const mems = await db_1.q.all_mem.all(100, 0);
86
+ console.error(`[REFLECT] Fetched ${mems.length} memories (min required: ${min})`);
87
+ if (mems.length < min) {
88
+ console.error("[REFLECT] Not enough memories, skipping");
89
+ return { created: 0, reason: "low" };
90
+ }
91
+ const cls = cluster(mems);
92
+ console.error(`[REFLECT] Clustered into ${cls.length} groups`);
93
+ let n = 0;
94
+ for (const c of cls) {
95
+ const txt = summ(c);
96
+ const s = sal(c);
97
+ const src = c.mem.map((m) => m.id);
98
+ const meta = {
99
+ type: "auto_reflect",
100
+ sources: src,
101
+ freq: c.n,
102
+ at: new Date().toISOString(),
103
+ };
104
+ console.error(`[REFLECT] Creating reflection: ${c.n} memories, salience=${s.toFixed(3)}, sector=${c.mem[0].primary_sector}`);
105
+ await (0, hsg_1.add_hsg_memory)(txt, (0, utils_1.j)(["reflect:auto"]), meta);
106
+ await mark(src);
107
+ await boost(src);
108
+ n++;
109
+ }
110
+ if (n > 0)
111
+ await (0, db_1.log_maint_op)("reflect", n);
112
+ console.error(`[REFLECT] Job complete: created ${n} reflections`);
113
+ return { created: n, clusters: cls.length };
114
+ };
115
+ exports.run_reflection = run_reflection;
116
+ let timer = null;
117
+ const start_reflection = () => {
118
+ if (!cfg_1.env.auto_reflect || timer)
119
+ return;
120
+ const int = (cfg_1.env.reflect_interval || 10) * 60000;
121
+ timer = setInterval(() => (0, exports.run_reflection)().catch((e) => console.error("[REFLECT]", e)), int);
122
+ console.error(`[REFLECT] Started: every ${cfg_1.env.reflect_interval || 10}m`);
123
+ };
124
+ exports.start_reflection = start_reflection;
125
+ const stop_reflection = () => {
126
+ if (timer) {
127
+ clearInterval(timer);
128
+ timer = null;
129
+ }
130
+ };
131
+ exports.stop_reflection = stop_reflection;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stop_user_summary_reflection = exports.start_user_summary_reflection = exports.auto_update_user_summaries = exports.update_user_summary = exports.gen_user_summary_async = void 0;
4
+ const db_1 = require("../core/db");
5
+ const cfg_1 = require("../core/cfg");
6
+ const cos = (a, b) => {
7
+ let d = 0, ma = 0, mb = 0;
8
+ for (let i = 0; i < a.length; i++) {
9
+ d += a[i] * b[i];
10
+ ma += a[i] * a[i];
11
+ mb += b[i] * b[i];
12
+ }
13
+ return d / (Math.sqrt(ma) * Math.sqrt(mb));
14
+ };
15
+ const gen_user_summary = (mems) => {
16
+ if (!mems.length)
17
+ return "User profile initializing... (No memories recorded yet)";
18
+ const recent = mems.slice(0, 10);
19
+ const projects = new Set();
20
+ const languages = new Set();
21
+ const files = new Set();
22
+ let events = 0;
23
+ let saves = 0;
24
+ for (const m of mems) {
25
+ if (m.meta) {
26
+ try {
27
+ const meta = typeof m.meta === 'string' ? JSON.parse(m.meta) : m.meta;
28
+ if (meta.ide_project_name)
29
+ projects.add(meta.ide_project_name);
30
+ if (meta.language)
31
+ languages.add(meta.language);
32
+ if (meta.ide_file_path)
33
+ files.add(meta.ide_file_path.split(/[\\/]/).pop());
34
+ if (meta.ide_event_type === 'save')
35
+ saves++;
36
+ }
37
+ catch (e) { /* ignore */ }
38
+ }
39
+ events++;
40
+ }
41
+ const project_str = projects.size > 0 ? Array.from(projects).join(", ") : "Unknown Project";
42
+ const lang_str = languages.size > 0 ? Array.from(languages).join(", ") : "General";
43
+ const recent_files = Array.from(files).slice(0, 3).join(", ");
44
+ const last_active = mems[0].created_at ? new Date(mems[0].created_at).toLocaleString() : "Recently";
45
+ return `Active in ${project_str} using ${lang_str}. Focused on ${recent_files || "various files"}. (${mems.length} memories, ${saves} saves). Last active: ${last_active}.`;
46
+ };
47
+ const gen_user_summary_async = async (user_id) => {
48
+ const mems = await db_1.q.all_mem_by_user.all(user_id, 100, 0);
49
+ return gen_user_summary(mems);
50
+ };
51
+ exports.gen_user_summary_async = gen_user_summary_async;
52
+ const update_user_summary = async (user_id) => {
53
+ try {
54
+ const summary = await (0, exports.gen_user_summary_async)(user_id);
55
+ const now = Date.now();
56
+ const existing = await db_1.q.get_user.get(user_id);
57
+ if (!existing) {
58
+ await db_1.q.ins_user.run(user_id, summary, 0, now, now);
59
+ }
60
+ else {
61
+ await db_1.q.upd_user_summary.run(user_id, summary, now);
62
+ }
63
+ }
64
+ catch (e) {
65
+ console.error(`[USER_SUMMARY] Fatal error for ${user_id}:`, e);
66
+ }
67
+ };
68
+ exports.update_user_summary = update_user_summary;
69
+ const auto_update_user_summaries = async () => {
70
+ const all_mems = await db_1.q.all_mem.all(10000, 0);
71
+ const user_ids = new Set(all_mems.map((m) => m.user_id).filter(Boolean));
72
+ let updated = 0;
73
+ for (const uid of user_ids) {
74
+ try {
75
+ await (0, exports.update_user_summary)(uid);
76
+ updated++;
77
+ }
78
+ catch (e) {
79
+ console.error(`[USER_SUMMARY] Failed for ${uid}:`, e);
80
+ }
81
+ }
82
+ return { updated };
83
+ };
84
+ exports.auto_update_user_summaries = auto_update_user_summaries;
85
+ let timer = null;
86
+ const start_user_summary_reflection = () => {
87
+ if (timer)
88
+ return;
89
+ const int = (cfg_1.env.user_summary_interval || 30) * 60000;
90
+ timer = setInterval(() => (0, exports.auto_update_user_summaries)().catch((e) => console.error("[USER_SUMMARY]", e)), int);
91
+ };
92
+ exports.start_user_summary_reflection = start_user_summary_reflection;
93
+ const stop_user_summary_reflection = () => {
94
+ if (timer) {
95
+ clearInterval(timer);
96
+ timer = null;
97
+ }
98
+ };
99
+ exports.stop_user_summary_reflection = stop_user_summary_reflection;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const migrate_1 = require("./core/migrate");
4
+ (0, migrate_1.run_migrations)().then(() => {
5
+ process.exit(0);
6
+ }).catch((err) => {
7
+ console.error(err);
8
+ process.exit(1);
9
+ });
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryCompressionEngine = exports.compressionEngine = void 0;
4
+ const crypto_1 = require("crypto");
5
+ class MemoryCompressionEngine {
6
+ stats = {
7
+ total: 0,
8
+ ogTok: 0,
9
+ compTok: 0,
10
+ saved: 0,
11
+ avgRatio: 0,
12
+ latency: 0,
13
+ algos: {},
14
+ updated: Date.now(),
15
+ };
16
+ cache = new Map();
17
+ MAX = 500;
18
+ MS = 0.05;
19
+ tok(t) {
20
+ if (!t)
21
+ return 0;
22
+ const w = t.split(/\s+/).length;
23
+ const c = t.length;
24
+ return Math.ceil(c / 4 + w / 2);
25
+ }
26
+ sem(t) {
27
+ if (!t || t.length < 50)
28
+ return t;
29
+ let c = t;
30
+ const s = c.split(/[.!?]+\s+/);
31
+ const u = s.filter((x, i, a) => {
32
+ if (i === 0)
33
+ return true;
34
+ const n = x.toLowerCase().trim();
35
+ const p = a[i - 1].toLowerCase().trim();
36
+ return n !== p;
37
+ });
38
+ c = u.join(". ").trim();
39
+ const f = [
40
+ /\b(just|really|very|quite|rather|somewhat|somehow)\b/gi,
41
+ /\b(actually|basically|essentially|literally)\b/gi,
42
+ /\b(I think that|I believe that|It seems that|It appears that)\b/gi,
43
+ /\b(in order to)\b/gi,
44
+ ];
45
+ for (const p of f)
46
+ c = c.replace(p, "");
47
+ c = c.replace(/\s+/g, " ").trim();
48
+ const r = [
49
+ [/\bat this point in time\b/gi, "now"],
50
+ [/\bdue to the fact that\b/gi, "because"],
51
+ [/\bin the event that\b/gi, "if"],
52
+ [/\bfor the purpose of\b/gi, "to"],
53
+ [/\bin the near future\b/gi, "soon"],
54
+ [/\ba number of\b/gi, "several"],
55
+ [/\bprior to\b/gi, "before"],
56
+ [/\bsubsequent to\b/gi, "after"],
57
+ ];
58
+ for (const [p, x] of r)
59
+ c = c.replace(p, x);
60
+ return c;
61
+ }
62
+ syn(t) {
63
+ if (!t || t.length < 30)
64
+ return t;
65
+ let c = t;
66
+ const ct = [
67
+ [/\bdo not\b/gi, "don't"],
68
+ [/\bcannot\b/gi, "can't"],
69
+ [/\bwill not\b/gi, "won't"],
70
+ [/\bshould not\b/gi, "shouldn't"],
71
+ [/\bwould not\b/gi, "wouldn't"],
72
+ [/\bit is\b/gi, "it's"],
73
+ [/\bthat is\b/gi, "that's"],
74
+ [/\bwhat is\b/gi, "what's"],
75
+ [/\bwho is\b/gi, "who's"],
76
+ [/\bthere is\b/gi, "there's"],
77
+ [/\bhas been\b/gi, "been"],
78
+ [/\bhave been\b/gi, "been"],
79
+ ];
80
+ for (const [p, x] of ct)
81
+ c = c.replace(p, x);
82
+ c = c.replace(/\b(the|a|an)\s+(\w+),\s+(the|a|an)\s+/gi, "$2, ");
83
+ c = c.replace(/\s*{\s*/g, "{").replace(/\s*}\s*/g, "}");
84
+ c = c.replace(/\s*\(\s*/g, "(").replace(/\s*\)\s*/g, ")");
85
+ c = c.replace(/\s*;\s*/g, ";");
86
+ return c;
87
+ }
88
+ agg(t) {
89
+ if (!t)
90
+ return t;
91
+ let c = this.sem(t);
92
+ c = this.syn(c);
93
+ c = c.replace(/[*_~`#]/g, "");
94
+ c = c.replace(/https?:\/\/(www\.)?([^\/\s]+)(\/[^\s]*)?/gi, "$2");
95
+ const a = [
96
+ [/\bJavaScript\b/gi, "JS"],
97
+ [/\bTypeScript\b/gi, "TS"],
98
+ [/\bPython\b/gi, "Py"],
99
+ [/\bapplication\b/gi, "app"],
100
+ [/\bfunction\b/gi, "fn"],
101
+ [/\bparameter\b/gi, "param"],
102
+ [/\bargument\b/gi, "arg"],
103
+ [/\breturn\b/gi, "ret"],
104
+ [/\bvariable\b/gi, "var"],
105
+ [/\bconstant\b/gi, "const"],
106
+ [/\bdatabase\b/gi, "db"],
107
+ [/\brepository\b/gi, "repo"],
108
+ [/\benvironment\b/gi, "env"],
109
+ [/\bconfiguration\b/gi, "config"],
110
+ [/\bdocumentation\b/gi, "docs"],
111
+ ];
112
+ for (const [p, x] of a)
113
+ c = c.replace(p, x);
114
+ c = c.replace(/\n{3,}/g, "\n\n");
115
+ c = c
116
+ .split("\n")
117
+ .map((l) => l.trim())
118
+ .join("\n");
119
+ return c.trim();
120
+ }
121
+ compress(t, a = "semantic") {
122
+ if (!t) {
123
+ return {
124
+ og: t,
125
+ comp: t,
126
+ metrics: this.empty(a),
127
+ hash: this.hash(t),
128
+ };
129
+ }
130
+ const k = `${a}:${this.hash(t)}`;
131
+ if (this.cache.has(k))
132
+ return this.cache.get(k);
133
+ const ot = this.tok(t);
134
+ let c;
135
+ switch (a) {
136
+ case "semantic":
137
+ c = this.sem(t);
138
+ break;
139
+ case "syntactic":
140
+ c = this.syn(t);
141
+ break;
142
+ case "aggressive":
143
+ c = this.agg(t);
144
+ break;
145
+ default:
146
+ c = t;
147
+ }
148
+ const ct = this.tok(c);
149
+ const sv = ot - ct;
150
+ const r = ct / ot;
151
+ const p = (sv / ot) * 100;
152
+ const l = sv * this.MS;
153
+ const m = {
154
+ ogTok: ot,
155
+ compTok: ct,
156
+ ratio: r,
157
+ saved: sv,
158
+ pct: p,
159
+ latency: l,
160
+ algo: a,
161
+ ts: Date.now(),
162
+ };
163
+ const res = {
164
+ og: t,
165
+ comp: c,
166
+ metrics: m,
167
+ hash: this.hash(t),
168
+ };
169
+ this.up(m);
170
+ this.store(k, res);
171
+ return res;
172
+ }
173
+ batch(ts, a = "semantic") {
174
+ return ts.map((t) => this.compress(t, a));
175
+ }
176
+ auto(t) {
177
+ if (!t || t.length < 50)
178
+ return this.compress(t, "semantic");
179
+ const code = /\b(function|const|let|var|def|class|import|export)\b/.test(t);
180
+ const urls = /https?:\/\//.test(t);
181
+ const verb = t.split(/\s+/).length > 100;
182
+ let a;
183
+ if (code || urls)
184
+ a = "aggressive";
185
+ else if (verb)
186
+ a = "semantic";
187
+ else
188
+ a = "syntactic";
189
+ return this.compress(t, a);
190
+ }
191
+ getStats() {
192
+ return { ...this.stats };
193
+ }
194
+ analyze(t) {
195
+ const r = {};
196
+ for (const a of ["semantic", "syntactic", "aggressive"]) {
197
+ const x = this.compress(t, a);
198
+ r[a] = x.metrics;
199
+ }
200
+ return r;
201
+ }
202
+ reset() {
203
+ this.stats = {
204
+ total: 0,
205
+ ogTok: 0,
206
+ compTok: 0,
207
+ saved: 0,
208
+ avgRatio: 0,
209
+ latency: 0,
210
+ algos: {},
211
+ updated: Date.now(),
212
+ };
213
+ }
214
+ clear() {
215
+ this.cache.clear();
216
+ }
217
+ empty(a) {
218
+ return {
219
+ ogTok: 0,
220
+ compTok: 0,
221
+ ratio: 1,
222
+ saved: 0,
223
+ pct: 0,
224
+ latency: 0,
225
+ algo: a,
226
+ ts: Date.now(),
227
+ };
228
+ }
229
+ hash(t) {
230
+ return (0, crypto_1.createHash)("md5").update(t).digest("hex").substring(0, 16);
231
+ }
232
+ up(m) {
233
+ this.stats.total++;
234
+ this.stats.ogTok += m.ogTok;
235
+ this.stats.compTok += m.compTok;
236
+ this.stats.saved += m.saved;
237
+ this.stats.latency += m.latency;
238
+ if (this.stats.ogTok > 0)
239
+ this.stats.avgRatio = this.stats.compTok / this.stats.ogTok;
240
+ if (!this.stats.algos[m.algo])
241
+ this.stats.algos[m.algo] = 0;
242
+ this.stats.algos[m.algo]++;
243
+ this.stats.updated = Date.now();
244
+ }
245
+ store(k, r) {
246
+ if (this.cache.size >= this.MAX) {
247
+ const f = this.cache.keys().next().value;
248
+ if (f)
249
+ this.cache.delete(f);
250
+ }
251
+ this.cache.set(k, r);
252
+ }
253
+ }
254
+ exports.MemoryCompressionEngine = MemoryCompressionEngine;
255
+ exports.compressionEngine = new MemoryCompressionEngine();
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apply_decay = exports.linkW = exports.SECTOR_INDEX_MAPPING_FOR_MATRIX_LOOKUP = exports.SECTORAL_INTERDEPENDENCE_MATRIX_FOR_COGNITIVE_RESONANCE = exports.TAU_ENERGY_THRESHOLD_FOR_RETRIEVAL = exports.LAMBDA_TWO_SLOW_DECAY_RATE = exports.LAMBDA_ONE_FAST_DECAY_RATE = exports.ETA_REINFORCEMENT_FACTOR_FOR_TRACE_LEARNING = exports.THETA_CONSOLIDATION_COEFFICIENT_FOR_LONG_TERM = exports.GAMMA_ATTENUATION_CONSTANT_FOR_GRAPH_DISTANCE = exports.BETA_LEARNING_RATE_FOR_EMOTIONAL_FREQUENCY = exports.ALPHA_LEARNING_RATE_FOR_RECALL_REINFORCEMENT = void 0;
4
+ exports.calculateDynamicSalienceWithTimeDecay = calculateDynamicSalienceWithTimeDecay;
5
+ exports.calculateDualPhaseDecayMemoryRetention = calculateDualPhaseDecayMemoryRetention;
6
+ exports.calculateAssociativeWaypointLinkWeight = calculateAssociativeWaypointLinkWeight;
7
+ exports.calculateSpreadingActivationEnergyForNode = calculateSpreadingActivationEnergyForNode;
8
+ exports.applyRetrievalTraceReinforcementToMemory = applyRetrievalTraceReinforcementToMemory;
9
+ exports.propagateAssociativeReinforcementToLinkedNodes = propagateAssociativeReinforcementToLinkedNodes;
10
+ exports.calculateCrossSectorResonanceScore = calculateCrossSectorResonanceScore;
11
+ exports.determineEnergyBasedRetrievalThreshold = determineEnergyBasedRetrievalThreshold;
12
+ exports.applyDualPhaseDecayToAllMemories = applyDualPhaseDecayToAllMemories;
13
+ exports.buildAssociativeWaypointGraphFromMemories = buildAssociativeWaypointGraphFromMemories;
14
+ exports.performSpreadingActivationRetrieval = performSpreadingActivationRetrieval;
15
+ exports.retrieveMemoriesWithEnergyThresholding = retrieveMemoriesWithEnergyThresholding;
16
+ const db_1 = require("../core/db");
17
+ const utils_1 = require("../utils");
18
+ const embed_1 = require("../memory/embed");
19
+ exports.ALPHA_LEARNING_RATE_FOR_RECALL_REINFORCEMENT = 0.15;
20
+ exports.BETA_LEARNING_RATE_FOR_EMOTIONAL_FREQUENCY = 0.2;
21
+ exports.GAMMA_ATTENUATION_CONSTANT_FOR_GRAPH_DISTANCE = 0.35;
22
+ exports.THETA_CONSOLIDATION_COEFFICIENT_FOR_LONG_TERM = 0.4;
23
+ exports.ETA_REINFORCEMENT_FACTOR_FOR_TRACE_LEARNING = 0.18;
24
+ exports.LAMBDA_ONE_FAST_DECAY_RATE = 0.015;
25
+ exports.LAMBDA_TWO_SLOW_DECAY_RATE = 0.002;
26
+ exports.TAU_ENERGY_THRESHOLD_FOR_RETRIEVAL = 0.4;
27
+ exports.SECTORAL_INTERDEPENDENCE_MATRIX_FOR_COGNITIVE_RESONANCE = [
28
+ [1.0, 0.7, 0.3, 0.6, 0.6],
29
+ [0.7, 1.0, 0.4, 0.7, 0.8],
30
+ [0.3, 0.4, 1.0, 0.5, 0.2],
31
+ [0.6, 0.7, 0.5, 1.0, 0.8],
32
+ [0.6, 0.8, 0.2, 0.8, 1.0],
33
+ ];
34
+ exports.SECTOR_INDEX_MAPPING_FOR_MATRIX_LOOKUP = {
35
+ episodic: 0,
36
+ semantic: 1,
37
+ procedural: 2,
38
+ emotional: 3,
39
+ reflective: 4,
40
+ };
41
+ const sig = (x) => 1 / (1 + Math.exp(-x));
42
+ const linkW = (sem, emo, α = 0.7, β = 0.3) => sig(α * sem + β * emo);
43
+ exports.linkW = linkW;
44
+ async function calculateDynamicSalienceWithTimeDecay(i, λ, r, e, t) {
45
+ const d = i * Math.exp(-λ * t);
46
+ const rc = exports.ALPHA_LEARNING_RATE_FOR_RECALL_REINFORCEMENT * r;
47
+ const ef = exports.BETA_LEARNING_RATE_FOR_EMOTIONAL_FREQUENCY * e;
48
+ return Math.max(0, Math.min(1, d + rc + ef));
49
+ }
50
+ async function calculateDualPhaseDecayMemoryRetention(t) {
51
+ const f = Math.exp(-exports.LAMBDA_ONE_FAST_DECAY_RATE * t);
52
+ const s = exports.THETA_CONSOLIDATION_COEFFICIENT_FOR_LONG_TERM *
53
+ Math.exp(-exports.LAMBDA_TWO_SLOW_DECAY_RATE * t);
54
+ return Math.max(0, Math.min(1, f + s));
55
+ }
56
+ async function calculateAssociativeWaypointLinkWeight(sv, tv, tg) {
57
+ const sim = (0, embed_1.cosineSimilarity)(sv, tv);
58
+ const td = tg / 86400000;
59
+ return Math.max(0, sim / (1 + td));
60
+ }
61
+ async function calculateSpreadingActivationEnergyForNode(nid, an, gr) {
62
+ const nd = gr.get(nid);
63
+ if (!nd)
64
+ return 0;
65
+ let tot = 0;
66
+ for (const e of nd.connected_waypoint_edges) {
67
+ const na = an.get(e.target_node_id) || 0;
68
+ const att = Math.exp(-exports.GAMMA_ATTENUATION_CONSTANT_FOR_GRAPH_DISTANCE * 1);
69
+ tot += e.link_weight_value * na * att;
70
+ }
71
+ return tot;
72
+ }
73
+ async function applyRetrievalTraceReinforcementToMemory(mid, sal) {
74
+ return Math.min(1, sal + exports.ETA_REINFORCEMENT_FACTOR_FOR_TRACE_LEARNING * (1 - sal));
75
+ }
76
+ async function propagateAssociativeReinforcementToLinkedNodes(sid, ssal, wps) {
77
+ const ups = [];
78
+ for (const wp of wps) {
79
+ const ld = (await (0, db_1.get_async)("select salience from memories where id=?", [wp.target_id]));
80
+ if (ld) {
81
+ const pr = exports.ETA_REINFORCEMENT_FACTOR_FOR_TRACE_LEARNING * wp.weight * ssal;
82
+ ups.push({
83
+ node_id: wp.target_id,
84
+ new_salience: Math.min(1, ld.salience + pr),
85
+ });
86
+ }
87
+ }
88
+ return ups;
89
+ }
90
+ async function calculateCrossSectorResonanceScore(ms, qs, bs) {
91
+ const si = exports.SECTOR_INDEX_MAPPING_FOR_MATRIX_LOOKUP[ms] ?? 1;
92
+ const ti = exports.SECTOR_INDEX_MAPPING_FOR_MATRIX_LOOKUP[qs] ?? 1;
93
+ return bs * exports.SECTORAL_INTERDEPENDENCE_MATRIX_FOR_COGNITIVE_RESONANCE[si][ti];
94
+ }
95
+ async function determineEnergyBasedRetrievalThreshold(act, tau) {
96
+ const nrm = Math.max(0.1, act);
97
+ return Math.max(0.1, Math.min(0.9, tau * (1 + Math.log(nrm + 1))));
98
+ }
99
+ async function applyDualPhaseDecayToAllMemories() {
100
+ const mems = await (0, db_1.all_async)("select id,salience,decay_lambda,last_seen_at,updated_at,created_at from memories");
101
+ const ts = (0, utils_1.now)();
102
+ const ops = mems.map(async (m) => {
103
+ const tms = Math.max(0, ts - (m.last_seen_at || m.updated_at));
104
+ const td = tms / 86400000;
105
+ const rt = await calculateDualPhaseDecayMemoryRetention(td);
106
+ const nsal = m.salience * rt;
107
+ await (0, db_1.run_async)(`update ${db_1.memories_table} set salience=?,updated_at=? where id=?`, [Math.max(0, nsal), ts, m.id]);
108
+ });
109
+ await Promise.all(ops);
110
+ console.log(`[DECAY] Applied to ${mems.length} memories`);
111
+ }
112
+ async function buildAssociativeWaypointGraphFromMemories() {
113
+ const gr = new Map();
114
+ const wps = (await (0, db_1.all_async)("select src_id,dst_id,weight,created_at from waypoints"));
115
+ const ids = new Set();
116
+ for (const wp of wps) {
117
+ ids.add(wp.src_id);
118
+ ids.add(wp.dst_id);
119
+ }
120
+ for (const id of ids)
121
+ gr.set(id, {
122
+ node_memory_id: id,
123
+ activation_energy_level: 0,
124
+ connected_waypoint_edges: [],
125
+ });
126
+ for (const wp of wps) {
127
+ const sn = gr.get(wp.src_id);
128
+ if (sn) {
129
+ const tg = Math.abs((0, utils_1.now)() - wp.created_at);
130
+ sn.connected_waypoint_edges.push({
131
+ target_node_id: wp.dst_id,
132
+ link_weight_value: wp.weight,
133
+ time_gap_delta_t: tg,
134
+ });
135
+ }
136
+ }
137
+ return gr;
138
+ }
139
+ async function performSpreadingActivationRetrieval(init, max) {
140
+ const gr = await buildAssociativeWaypointGraphFromMemories();
141
+ const act = new Map();
142
+ for (const id of init)
143
+ act.set(id, 1.0);
144
+ for (let i = 0; i < max; i++) {
145
+ const ups = new Map();
146
+ for (const [nid, ca] of act) {
147
+ const nd = gr.get(nid);
148
+ if (!nd)
149
+ continue;
150
+ for (const e of nd.connected_waypoint_edges) {
151
+ const pe = await calculateSpreadingActivationEnergyForNode(e.target_node_id, act, gr);
152
+ const ex = ups.get(e.target_node_id) || 0;
153
+ ups.set(e.target_node_id, ex + pe);
154
+ }
155
+ }
156
+ for (const [uid, nav] of ups) {
157
+ const cv = act.get(uid) || 0;
158
+ act.set(uid, Math.max(cv, nav));
159
+ }
160
+ }
161
+ return act;
162
+ }
163
+ async function retrieveMemoriesWithEnergyThresholding(qv, qs, me) {
164
+ const mems = (await (0, db_1.all_async)("select id,content,primary_sector,salience,mean_vec from memories where salience>0.01"));
165
+ const sc = new Map();
166
+ for (const m of mems) {
167
+ if (!m.mean_vec)
168
+ continue;
169
+ const buf = Buffer.isBuffer(m.mean_vec)
170
+ ? m.mean_vec
171
+ : Buffer.from(m.mean_vec);
172
+ const ev = [];
173
+ for (let i = 0; i < buf.length; i += 4)
174
+ ev.push(buf.readFloatLE(i));
175
+ const bs = (0, embed_1.cosineSimilarity)(qv, ev);
176
+ const cs = await calculateCrossSectorResonanceScore(m.primary_sector, qs, bs);
177
+ sc.set(m.id, cs * m.salience);
178
+ }
179
+ const sp = await performSpreadingActivationRetrieval(Array.from(sc.keys()).slice(0, 5), 3);
180
+ const cmb = new Map();
181
+ for (const m of mems)
182
+ cmb.set(m.id, (sc.get(m.id) || 0) + (sp.get(m.id) || 0) * 0.3);
183
+ const te = Array.from(cmb.values()).reduce((s, v) => s + v, 0);
184
+ const thr = await determineEnergyBasedRetrievalThreshold(te, me);
185
+ return mems
186
+ .filter((m) => (cmb.get(m.id) || 0) > thr)
187
+ .map((m) => ({ ...m, activation_energy: cmb.get(m.id) }));
188
+ }
189
+ exports.apply_decay = applyDualPhaseDecayToAllMemories;