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,516 @@
1
+ import { q } from "../../core/db";
2
+ import {
3
+ calculateDynamicSalienceWithTimeDecay,
4
+ calculateCrossSectorResonanceScore,
5
+ retrieveMemoriesWithEnergyThresholding,
6
+ applyRetrievalTraceReinforcementToMemory,
7
+ propagateAssociativeReinforcementToLinkedNodes,
8
+ performSpreadingActivationRetrieval,
9
+ buildAssociativeWaypointGraphFromMemories,
10
+ calculateAssociativeWaypointLinkWeight,
11
+ ALPHA_LEARNING_RATE_FOR_RECALL_REINFORCEMENT,
12
+ BETA_LEARNING_RATE_FOR_EMOTIONAL_FREQUENCY,
13
+ GAMMA_ATTENUATION_CONSTANT_FOR_GRAPH_DISTANCE,
14
+ THETA_CONSOLIDATION_COEFFICIENT_FOR_LONG_TERM,
15
+ ETA_REINFORCEMENT_FACTOR_FOR_TRACE_LEARNING,
16
+ LAMBDA_ONE_FAST_DECAY_RATE,
17
+ LAMBDA_TWO_SLOW_DECAY_RATE,
18
+ TAU_ENERGY_THRESHOLD_FOR_RETRIEVAL,
19
+ SECTORAL_INTERDEPENDENCE_MATRIX_FOR_COGNITIVE_RESONANCE,
20
+ } from "../../ops/dynamics";
21
+
22
+ export function dynroutes(app: any) {
23
+ app.get(
24
+ "/dynamics/constants",
25
+ async (incoming_http_request: any, outgoing_http_response: any) => {
26
+ try {
27
+ const advanced_memory_dynamics_configuration_constants = {
28
+ alpha_learning_rate_for_recall_reinforcement_value:
29
+ ALPHA_LEARNING_RATE_FOR_RECALL_REINFORCEMENT,
30
+ beta_learning_rate_for_emotional_frequency_value:
31
+ BETA_LEARNING_RATE_FOR_EMOTIONAL_FREQUENCY,
32
+ gamma_attenuation_constant_for_graph_distance_value:
33
+ GAMMA_ATTENUATION_CONSTANT_FOR_GRAPH_DISTANCE,
34
+ theta_consolidation_coefficient_for_long_term_memory:
35
+ THETA_CONSOLIDATION_COEFFICIENT_FOR_LONG_TERM,
36
+ eta_reinforcement_factor_for_trace_learning_value:
37
+ ETA_REINFORCEMENT_FACTOR_FOR_TRACE_LEARNING,
38
+ lambda_one_fast_decay_rate_for_short_term:
39
+ LAMBDA_ONE_FAST_DECAY_RATE,
40
+ lambda_two_slow_decay_rate_for_consolidation:
41
+ LAMBDA_TWO_SLOW_DECAY_RATE,
42
+ tau_energy_threshold_for_retrieval_cutoff:
43
+ TAU_ENERGY_THRESHOLD_FOR_RETRIEVAL,
44
+ sectoral_interdependence_matrix_for_cross_sector_resonance:
45
+ SECTORAL_INTERDEPENDENCE_MATRIX_FOR_COGNITIVE_RESONANCE,
46
+ };
47
+ outgoing_http_response.json({
48
+ success_status_indicator: true,
49
+ dynamics_constants_configuration:
50
+ advanced_memory_dynamics_configuration_constants,
51
+ });
52
+ } catch (unexpected_error_during_constants_retrieval) {
53
+ console.error(
54
+ "[DYNAMICS] Error retrieving dynamics constants:",
55
+ unexpected_error_during_constants_retrieval,
56
+ );
57
+ outgoing_http_response.status(500).json({ err: "internal" });
58
+ }
59
+ },
60
+ );
61
+
62
+ app.post(
63
+ "/dynamics/salience/calculate",
64
+ async (incoming_http_request: any, outgoing_http_response: any) => {
65
+ try {
66
+ const incoming_request_body_payload =
67
+ incoming_http_request.body;
68
+ const initial_salience_value_from_request =
69
+ incoming_request_body_payload.initial_salience || 0.5;
70
+ const lambda_decay_constant_from_request =
71
+ incoming_request_body_payload.decay_lambda || 0.01;
72
+ const recall_reinforcement_count_from_request =
73
+ incoming_request_body_payload.recall_count || 0;
74
+ const emotional_frequency_metric_from_request =
75
+ incoming_request_body_payload.emotional_frequency || 0;
76
+ const time_elapsed_in_days_from_request =
77
+ incoming_request_body_payload.time_elapsed_days || 0;
78
+
79
+ const calculated_dynamic_salience_result =
80
+ await calculateDynamicSalienceWithTimeDecay(
81
+ initial_salience_value_from_request,
82
+ lambda_decay_constant_from_request,
83
+ recall_reinforcement_count_from_request,
84
+ emotional_frequency_metric_from_request,
85
+ time_elapsed_in_days_from_request,
86
+ );
87
+
88
+ outgoing_http_response.json({
89
+ success_status_indicator: true,
90
+ calculated_salience_value:
91
+ calculated_dynamic_salience_result,
92
+ input_parameters_used: {
93
+ initial_salience: initial_salience_value_from_request,
94
+ decay_lambda: lambda_decay_constant_from_request,
95
+ recall_count: recall_reinforcement_count_from_request,
96
+ emotional_frequency:
97
+ emotional_frequency_metric_from_request,
98
+ time_elapsed_days: time_elapsed_in_days_from_request,
99
+ },
100
+ });
101
+ } catch (unexpected_error_during_salience_calculation) {
102
+ console.error(
103
+ "[DYNAMICS] Error calculating dynamic salience:",
104
+ unexpected_error_during_salience_calculation,
105
+ );
106
+ outgoing_http_response.status(500).json({ err: "internal" });
107
+ }
108
+ },
109
+ );
110
+
111
+ app.post(
112
+ "/dynamics/resonance/calculate",
113
+ async (incoming_http_request: any, outgoing_http_response: any) => {
114
+ try {
115
+ const incoming_request_body_payload =
116
+ incoming_http_request.body;
117
+ const memory_sector_type_from_request =
118
+ incoming_request_body_payload.memory_sector || "semantic";
119
+ const query_sector_type_from_request =
120
+ incoming_request_body_payload.query_sector || "semantic";
121
+ const base_cosine_similarity_from_request =
122
+ incoming_request_body_payload.base_similarity || 0.8;
123
+
124
+ const calculated_cross_sector_resonance_score =
125
+ await calculateCrossSectorResonanceScore(
126
+ memory_sector_type_from_request,
127
+ query_sector_type_from_request,
128
+ base_cosine_similarity_from_request,
129
+ );
130
+
131
+ outgoing_http_response.json({
132
+ success_status_indicator: true,
133
+ resonance_modulated_score:
134
+ calculated_cross_sector_resonance_score,
135
+ input_parameters_used: {
136
+ memory_sector: memory_sector_type_from_request,
137
+ query_sector: query_sector_type_from_request,
138
+ base_similarity: base_cosine_similarity_from_request,
139
+ },
140
+ });
141
+ } catch (unexpected_error_during_resonance_calculation) {
142
+ console.error(
143
+ "[DYNAMICS] Error calculating cross-sector resonance:",
144
+ unexpected_error_during_resonance_calculation,
145
+ );
146
+ outgoing_http_response.status(500).json({ err: "internal" });
147
+ }
148
+ },
149
+ );
150
+
151
+ app.post(
152
+ "/dynamics/retrieval/energy-based",
153
+ async (incoming_http_request: any, outgoing_http_response: any) => {
154
+ try {
155
+ const incoming_request_body_payload =
156
+ incoming_http_request.body;
157
+ const query_text_content_from_request =
158
+ incoming_request_body_payload.query;
159
+ const query_sector_type_from_request =
160
+ incoming_request_body_payload.sector || "semantic";
161
+ const minimum_energy_threshold_from_request =
162
+ incoming_request_body_payload.min_energy ||
163
+ TAU_ENERGY_THRESHOLD_FOR_RETRIEVAL;
164
+
165
+ if (!query_text_content_from_request) {
166
+ return outgoing_http_response
167
+ .status(400)
168
+ .json({ err: "query_required" });
169
+ }
170
+
171
+ const { embedForSector } = await import("../../memory/embed");
172
+ const query_vector_embedding_array = await embedForSector(
173
+ query_text_content_from_request,
174
+ query_sector_type_from_request,
175
+ );
176
+
177
+ const retrieved_memories_with_energy_scores =
178
+ await retrieveMemoriesWithEnergyThresholding(
179
+ query_vector_embedding_array,
180
+ query_sector_type_from_request,
181
+ minimum_energy_threshold_from_request,
182
+ );
183
+
184
+ outgoing_http_response.json({
185
+ success_status_indicator: true,
186
+ query_text: query_text_content_from_request,
187
+ query_sector: query_sector_type_from_request,
188
+ minimum_energy_threshold:
189
+ minimum_energy_threshold_from_request,
190
+ retrieved_memories_count:
191
+ retrieved_memories_with_energy_scores.length,
192
+ memories_with_activation_energy:
193
+ retrieved_memories_with_energy_scores.map(
194
+ (memory_record) => ({
195
+ memory_id: memory_record.id,
196
+ memory_content: memory_record.content,
197
+ primary_sector_classification:
198
+ memory_record.primary_sector,
199
+ salience_score: memory_record.salience,
200
+ activation_energy_level:
201
+ memory_record.activation_energy,
202
+ }),
203
+ ),
204
+ });
205
+ } catch (unexpected_error_during_energy_retrieval) {
206
+ console.error(
207
+ "[DYNAMICS] Error performing energy-based retrieval:",
208
+ unexpected_error_during_energy_retrieval,
209
+ );
210
+ outgoing_http_response.status(500).json({ err: "internal" });
211
+ }
212
+ },
213
+ );
214
+
215
+ app.post(
216
+ "/dynamics/reinforcement/trace",
217
+ async (incoming_http_request: any, outgoing_http_response: any) => {
218
+ try {
219
+ const incoming_request_body_payload =
220
+ incoming_http_request.body;
221
+ const target_memory_id_from_request =
222
+ incoming_request_body_payload.memory_id;
223
+
224
+ if (!target_memory_id_from_request) {
225
+ return outgoing_http_response
226
+ .status(400)
227
+ .json({ err: "memory_id_required" });
228
+ }
229
+
230
+ const memory_record_from_database = await q.get_mem.get(
231
+ target_memory_id_from_request,
232
+ );
233
+ if (!memory_record_from_database) {
234
+ return outgoing_http_response
235
+ .status(404)
236
+ .json({ err: "memory_not_found" });
237
+ }
238
+
239
+ const current_salience_before_reinforcement =
240
+ memory_record_from_database.salience;
241
+ const updated_salience_after_reinforcement =
242
+ await applyRetrievalTraceReinforcementToMemory(
243
+ target_memory_id_from_request,
244
+ current_salience_before_reinforcement,
245
+ );
246
+
247
+ await q.upd_seen.run(
248
+ target_memory_id_from_request,
249
+ Date.now(),
250
+ updated_salience_after_reinforcement,
251
+ Date.now(),
252
+ );
253
+
254
+ const connected_waypoints_from_database =
255
+ await q.get_waypoints_by_src.all(
256
+ target_memory_id_from_request,
257
+ );
258
+ const linked_nodes_with_weights_array =
259
+ connected_waypoints_from_database.map(
260
+ (waypoint_record: any) => ({
261
+ target_id: waypoint_record.dst_id,
262
+ weight: waypoint_record.weight,
263
+ }),
264
+ );
265
+
266
+ const propagated_reinforcement_updates_list =
267
+ await propagateAssociativeReinforcementToLinkedNodes(
268
+ target_memory_id_from_request,
269
+ updated_salience_after_reinforcement,
270
+ linked_nodes_with_weights_array,
271
+ );
272
+
273
+ for (const reinforcement_update_record of propagated_reinforcement_updates_list) {
274
+ await q.upd_seen.run(
275
+ reinforcement_update_record.node_id,
276
+ Date.now(),
277
+ reinforcement_update_record.new_salience,
278
+ Date.now(),
279
+ );
280
+ }
281
+
282
+ outgoing_http_response.json({
283
+ success_status_indicator: true,
284
+ reinforced_memory_id: target_memory_id_from_request,
285
+ previous_salience_value:
286
+ current_salience_before_reinforcement,
287
+ updated_salience_value:
288
+ updated_salience_after_reinforcement,
289
+ salience_increase_amount:
290
+ updated_salience_after_reinforcement -
291
+ current_salience_before_reinforcement,
292
+ linked_nodes_reinforced_count:
293
+ propagated_reinforcement_updates_list.length,
294
+ linked_nodes_updates: propagated_reinforcement_updates_list,
295
+ });
296
+ } catch (unexpected_error_during_trace_reinforcement) {
297
+ console.error(
298
+ "[DYNAMICS] Error applying trace reinforcement:",
299
+ unexpected_error_during_trace_reinforcement,
300
+ );
301
+ outgoing_http_response.status(500).json({ err: "internal" });
302
+ }
303
+ },
304
+ );
305
+
306
+ app.post(
307
+ "/dynamics/activation/spreading",
308
+ async (incoming_http_request: any, outgoing_http_response: any) => {
309
+ try {
310
+ const incoming_request_body_payload =
311
+ incoming_http_request.body;
312
+ const initial_memory_ids_array_from_request =
313
+ incoming_request_body_payload.initial_memory_ids || [];
314
+ const maximum_spreading_iterations_from_request =
315
+ incoming_request_body_payload.max_iterations || 3;
316
+
317
+ if (
318
+ !Array.isArray(initial_memory_ids_array_from_request) ||
319
+ initial_memory_ids_array_from_request.length === 0
320
+ ) {
321
+ return outgoing_http_response
322
+ .status(400)
323
+ .json({ err: "initial_memory_ids_required" });
324
+ }
325
+
326
+ const spreading_activation_results_map =
327
+ await performSpreadingActivationRetrieval(
328
+ initial_memory_ids_array_from_request,
329
+ maximum_spreading_iterations_from_request,
330
+ );
331
+
332
+ const activation_results_as_array = Array.from(
333
+ spreading_activation_results_map.entries(),
334
+ )
335
+ .map(([memory_node_id, activation_energy_level]) => ({
336
+ memory_id: memory_node_id,
337
+ activation_level: activation_energy_level,
338
+ }))
339
+ .sort(
340
+ (first_entry, second_entry) =>
341
+ second_entry.activation_level -
342
+ first_entry.activation_level,
343
+ );
344
+
345
+ outgoing_http_response.json({
346
+ success_status_indicator: true,
347
+ initial_activated_memories_count:
348
+ initial_memory_ids_array_from_request.length,
349
+ maximum_iterations_performed:
350
+ maximum_spreading_iterations_from_request,
351
+ total_activated_nodes_count:
352
+ activation_results_as_array.length,
353
+ spreading_activation_results: activation_results_as_array,
354
+ });
355
+ } catch (unexpected_error_during_spreading_activation) {
356
+ console.error(
357
+ "[DYNAMICS] Error performing spreading activation:",
358
+ unexpected_error_during_spreading_activation,
359
+ );
360
+ outgoing_http_response.status(500).json({ err: "internal" });
361
+ }
362
+ },
363
+ );
364
+
365
+ app.get(
366
+ "/dynamics/waypoints/graph",
367
+ async (incoming_http_request: any, outgoing_http_response: any) => {
368
+ try {
369
+ const waypoint_graph_structure_from_database =
370
+ await buildAssociativeWaypointGraphFromMemories();
371
+
372
+ const graph_statistics_summary = {
373
+ total_nodes_in_graph:
374
+ waypoint_graph_structure_from_database.size,
375
+ total_edges_across_all_nodes: 0,
376
+ average_edges_per_node: 0,
377
+ nodes_with_no_connections: 0,
378
+ };
379
+
380
+ const detailed_graph_nodes_array: any[] = [];
381
+
382
+ for (const [
383
+ memory_node_identifier,
384
+ node_data_structure,
385
+ ] of waypoint_graph_structure_from_database) {
386
+ const number_of_outgoing_edges =
387
+ node_data_structure.connected_waypoint_edges.length;
388
+ graph_statistics_summary.total_edges_across_all_nodes +=
389
+ number_of_outgoing_edges;
390
+
391
+ if (number_of_outgoing_edges === 0) {
392
+ graph_statistics_summary.nodes_with_no_connections++;
393
+ }
394
+
395
+ detailed_graph_nodes_array.push({
396
+ node_memory_id: memory_node_identifier,
397
+ outgoing_edges_count: number_of_outgoing_edges,
398
+ connected_targets:
399
+ node_data_structure.connected_waypoint_edges.map(
400
+ (edge_record) => ({
401
+ target_memory_id:
402
+ edge_record.target_node_id,
403
+ link_weight: edge_record.link_weight_value,
404
+ time_gap_milliseconds:
405
+ edge_record.time_gap_delta_t,
406
+ }),
407
+ ),
408
+ });
409
+ }
410
+
411
+ if (graph_statistics_summary.total_nodes_in_graph > 0) {
412
+ graph_statistics_summary.average_edges_per_node =
413
+ graph_statistics_summary.total_edges_across_all_nodes /
414
+ graph_statistics_summary.total_nodes_in_graph;
415
+ }
416
+
417
+ outgoing_http_response.json({
418
+ success_status_indicator: true,
419
+ graph_summary_statistics: graph_statistics_summary,
420
+ detailed_node_information: detailed_graph_nodes_array,
421
+ });
422
+ } catch (unexpected_error_building_waypoint_graph) {
423
+ console.error(
424
+ "[DYNAMICS] Error building waypoint graph:",
425
+ unexpected_error_building_waypoint_graph,
426
+ );
427
+ outgoing_http_response.status(500).json({ err: "internal" });
428
+ }
429
+ },
430
+ );
431
+
432
+ app.post(
433
+ "/dynamics/waypoints/calculate-weight",
434
+ async (incoming_http_request: any, outgoing_http_response: any) => {
435
+ try {
436
+ const incoming_request_body_payload =
437
+ incoming_http_request.body;
438
+ const source_memory_id_from_request =
439
+ incoming_request_body_payload.source_memory_id;
440
+ const target_memory_id_from_request =
441
+ incoming_request_body_payload.target_memory_id;
442
+
443
+ if (
444
+ !source_memory_id_from_request ||
445
+ !target_memory_id_from_request
446
+ ) {
447
+ return outgoing_http_response
448
+ .status(400)
449
+ .json({ err: "both_memory_ids_required" });
450
+ }
451
+
452
+ const source_memory_record = await q.get_mem.get(
453
+ source_memory_id_from_request,
454
+ );
455
+ const target_memory_record = await q.get_mem.get(
456
+ target_memory_id_from_request,
457
+ );
458
+
459
+ if (!source_memory_record || !target_memory_record) {
460
+ return outgoing_http_response
461
+ .status(404)
462
+ .json({ err: "one_or_both_memories_not_found" });
463
+ }
464
+
465
+ const source_memory_mean_vector = source_memory_record.mean_vec;
466
+ const target_memory_mean_vector = target_memory_record.mean_vec;
467
+
468
+ if (!source_memory_mean_vector || !target_memory_mean_vector) {
469
+ return outgoing_http_response
470
+ .status(400)
471
+ .json({ err: "memories_missing_embeddings" });
472
+ }
473
+
474
+ const { bufferToVector } = await import("../../memory/embed");
475
+ const source_vector_array = bufferToVector(
476
+ source_memory_mean_vector,
477
+ );
478
+ const target_vector_array = bufferToVector(
479
+ target_memory_mean_vector,
480
+ );
481
+
482
+ const time_gap_between_memories_milliseconds = Math.abs(
483
+ source_memory_record.created_at -
484
+ target_memory_record.created_at,
485
+ );
486
+
487
+ const calculated_waypoint_link_weight =
488
+ await calculateAssociativeWaypointLinkWeight(
489
+ source_vector_array,
490
+ target_vector_array,
491
+ time_gap_between_memories_milliseconds,
492
+ );
493
+
494
+ outgoing_http_response.json({
495
+ success_status_indicator: true,
496
+ source_memory_identifier: source_memory_id_from_request,
497
+ target_memory_identifier: target_memory_id_from_request,
498
+ calculated_link_weight_value:
499
+ calculated_waypoint_link_weight,
500
+ time_gap_in_days:
501
+ time_gap_between_memories_milliseconds / 86400000,
502
+ calculation_details: {
503
+ temporal_decay_factor_applied: true,
504
+ cosine_similarity_computed: true,
505
+ },
506
+ });
507
+ } catch (unexpected_error_calculating_waypoint_weight) {
508
+ console.error(
509
+ "[DYNAMICS] Error calculating waypoint weight:",
510
+ unexpected_error_calculating_waypoint_weight,
511
+ );
512
+ outgoing_http_response.status(500).json({ err: "internal" });
513
+ }
514
+ },
515
+ );
516
+ }