hippo-memory 0.10.0 → 0.11.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 (53) hide show
  1. package/README.md +97 -15
  2. package/dist/cli.js +93 -12
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +2 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +3 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/consolidate.d.ts +1 -0
  9. package/dist/consolidate.d.ts.map +1 -1
  10. package/dist/consolidate.js +61 -2
  11. package/dist/consolidate.js.map +1 -1
  12. package/dist/db.d.ts.map +1 -1
  13. package/dist/db.js +19 -1
  14. package/dist/db.js.map +1 -1
  15. package/dist/embeddings.d.ts +1 -0
  16. package/dist/embeddings.d.ts.map +1 -1
  17. package/dist/embeddings.js +31 -1
  18. package/dist/embeddings.js.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp/server.js +9 -3
  24. package/dist/mcp/server.js.map +1 -1
  25. package/dist/memory.d.ts +26 -1
  26. package/dist/memory.d.ts.map +1 -1
  27. package/dist/memory.js +44 -7
  28. package/dist/memory.js.map +1 -1
  29. package/dist/physics-config.d.ts +37 -0
  30. package/dist/physics-config.d.ts.map +1 -0
  31. package/dist/physics-config.js +26 -0
  32. package/dist/physics-config.js.map +1 -0
  33. package/dist/physics-state.d.ts +43 -0
  34. package/dist/physics-state.d.ts.map +1 -0
  35. package/dist/physics-state.js +158 -0
  36. package/dist/physics-state.js.map +1 -0
  37. package/dist/physics.d.ts +115 -0
  38. package/dist/physics.d.ts.map +1 -0
  39. package/dist/physics.js +354 -0
  40. package/dist/physics.js.map +1 -0
  41. package/dist/search.d.ts +13 -0
  42. package/dist/search.d.ts.map +1 -1
  43. package/dist/search.js +105 -0
  44. package/dist/search.js.map +1 -1
  45. package/dist/store.d.ts.map +1 -1
  46. package/dist/store.js +14 -5
  47. package/dist/store.js.map +1 -1
  48. package/extensions/openclaw-plugin/README.md +11 -1
  49. package/extensions/openclaw-plugin/index.ts +62 -1
  50. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  51. package/extensions/openclaw-plugin/package.json +1 -1
  52. package/openclaw.plugin.json +1 -1
  53. package/package.json +6 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-state.d.ts","sourceRoot":"","sources":["../src/physics-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQpD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAGrD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAGrD;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAgB7D;AAgBD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,gBAAgB,EACpB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CA8B9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,gBAAgB,EACpB,SAAS,EAAE,eAAe,EAAE,GAC3B,IAAI,CAkCN;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EAAE,EACnB,GAAG,GAAE,IAAiB,GACrB,eAAe,CAajB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE/E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,gBAAgB,EACpB,OAAO,EAAE,WAAW,EAAE,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACxC,GAAG,GAAE,IAAiB,GACrB,MAAM,CAeR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,eAAe,EAAE,EAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACjC,GAAG,GAAE,IAAiB,GACrB,IAAI,CAYN"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Physics state persistence for Hippo.
3
+ * Stores and loads particle state (position, velocity, mass, charge, temperature)
4
+ * in SQLite using BLOB columns for 384-dim vectors.
5
+ */
6
+ import { computeMass, computeCharge, computeTemperature, vecZero } from './physics.js';
7
+ import { calculateStrength } from './memory.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Float32Array <-> Buffer serialization
10
+ // ---------------------------------------------------------------------------
11
+ export function float32ToBuffer(arr) {
12
+ const f32 = new Float32Array(arr);
13
+ return Buffer.from(f32.buffer);
14
+ }
15
+ export function bufferToFloat32(buf) {
16
+ const f32 = new Float32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);
17
+ return Array.from(f32);
18
+ }
19
+ // ---------------------------------------------------------------------------
20
+ // Schema migration
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Create the memory_physics table (migration v8).
24
+ * Call this from db.ts MIGRATIONS array.
25
+ */
26
+ export function createPhysicsTable(db) {
27
+ db.exec(`
28
+ CREATE TABLE IF NOT EXISTS memory_physics (
29
+ memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
30
+ position_blob BLOB NOT NULL,
31
+ velocity_blob BLOB NOT NULL,
32
+ mass REAL NOT NULL,
33
+ charge REAL NOT NULL,
34
+ temperature REAL NOT NULL,
35
+ last_simulation TEXT NOT NULL,
36
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
37
+ );
38
+
39
+ CREATE INDEX IF NOT EXISTS idx_memory_physics_mass
40
+ ON memory_physics(mass DESC);
41
+ `);
42
+ }
43
+ /**
44
+ * Load physics state for specific memory IDs (or all if no IDs given).
45
+ */
46
+ export function loadPhysicsState(db, memoryIds) {
47
+ const map = new Map();
48
+ let rows;
49
+ if (memoryIds && memoryIds.length > 0) {
50
+ const placeholders = memoryIds.map(() => '?').join(',');
51
+ rows = db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
52
+ FROM memory_physics WHERE memory_id IN (${placeholders})`).all(...memoryIds);
53
+ }
54
+ else {
55
+ rows = db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
56
+ FROM memory_physics`).all();
57
+ }
58
+ for (const row of rows) {
59
+ map.set(row.memory_id, {
60
+ memoryId: row.memory_id,
61
+ position: bufferToFloat32(row.position_blob),
62
+ velocity: bufferToFloat32(row.velocity_blob),
63
+ mass: row.mass,
64
+ charge: row.charge,
65
+ temperature: row.temperature,
66
+ lastSimulation: row.last_simulation,
67
+ });
68
+ }
69
+ return map;
70
+ }
71
+ /**
72
+ * Save physics state for multiple particles (batch upsert).
73
+ */
74
+ export function savePhysicsState(db, particles) {
75
+ if (particles.length === 0)
76
+ return;
77
+ const stmt = db.prepare(`
78
+ INSERT INTO memory_physics (memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation, updated_at)
79
+ VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))
80
+ ON CONFLICT(memory_id) DO UPDATE SET
81
+ position_blob = excluded.position_blob,
82
+ velocity_blob = excluded.velocity_blob,
83
+ mass = excluded.mass,
84
+ charge = excluded.charge,
85
+ temperature = excluded.temperature,
86
+ last_simulation = excluded.last_simulation,
87
+ updated_at = datetime('now')
88
+ `);
89
+ db.exec('BEGIN');
90
+ try {
91
+ for (const p of particles) {
92
+ stmt.run(p.memoryId, float32ToBuffer(p.position), float32ToBuffer(p.velocity), p.mass, p.charge, p.temperature, p.lastSimulation);
93
+ }
94
+ db.exec('COMMIT');
95
+ }
96
+ catch (error) {
97
+ db.exec('ROLLBACK');
98
+ throw error;
99
+ }
100
+ }
101
+ /**
102
+ * Initialize physics state for a memory from its embedding vector.
103
+ * Returns the new particle (does not persist — caller must save).
104
+ */
105
+ export function initializeParticle(entry, embedding, now = new Date()) {
106
+ const strength = calculateStrength(entry, now);
107
+ const ageDays = (now.getTime() - new Date(entry.created).getTime()) / (1000 * 60 * 60 * 24);
108
+ return {
109
+ memoryId: entry.id,
110
+ position: [...embedding], // copy — position will diverge from original embedding
111
+ velocity: vecZero(embedding.length),
112
+ mass: computeMass(strength, entry.retrieval_count),
113
+ charge: computeCharge(entry.emotional_valence),
114
+ temperature: computeTemperature(ageDays, 1.0),
115
+ lastSimulation: now.toISOString(),
116
+ };
117
+ }
118
+ /**
119
+ * Delete physics state for a memory. (Also handled by CASCADE, but explicit for clarity.)
120
+ */
121
+ export function deletePhysicsState(db, memoryId) {
122
+ db.prepare('DELETE FROM memory_physics WHERE memory_id = ?').run(memoryId);
123
+ }
124
+ /**
125
+ * Reset all physics states from original embeddings.
126
+ * Drops existing physics data and re-initializes from the embedding index.
127
+ */
128
+ export function resetAllPhysicsState(db, entries, embeddingIndex, now = new Date()) {
129
+ db.exec('DELETE FROM memory_physics');
130
+ const particles = [];
131
+ for (const entry of entries) {
132
+ const embedding = embeddingIndex[entry.id];
133
+ if (!embedding || embedding.length === 0)
134
+ continue;
135
+ particles.push(initializeParticle(entry, embedding, now));
136
+ }
137
+ if (particles.length > 0) {
138
+ savePhysicsState(db, particles);
139
+ }
140
+ return particles.length;
141
+ }
142
+ /**
143
+ * Refresh mass, charge, and temperature for existing particles
144
+ * based on current memory attributes (called during consolidation).
145
+ */
146
+ export function refreshParticleProperties(particles, entries, now = new Date()) {
147
+ for (const p of particles) {
148
+ const entry = entries.get(p.memoryId);
149
+ if (!entry)
150
+ continue;
151
+ const strength = calculateStrength(entry, now);
152
+ const ageDays = (now.getTime() - new Date(entry.created).getTime()) / (1000 * 60 * 60 * 24);
153
+ p.mass = computeMass(strength, entry.retrieval_count);
154
+ p.charge = computeCharge(entry.emotional_valence);
155
+ p.temperature = computeTemperature(ageDays, 1.0);
156
+ }
157
+ }
158
+ //# sourceMappingURL=physics-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics-state.js","sourceRoot":"","sources":["../src/physics-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Memory-as-Physics engine for Hippo.
3
+ *
4
+ * Pure math module: forces, Velocity Verlet integration, physics-based scoring,
5
+ * and cluster amplification. No I/O — all state is passed in and returned.
6
+ *
7
+ * Memories are particles on the unit hypersphere in embedding space (384-dim).
8
+ * Forces act on them: query gravity (retrieval), inter-memory attraction,
9
+ * conflict repulsion, and drag (consolidation). Nearby high-scoring memories
10
+ * amplify each other via constructive interference.
11
+ */
12
+ import type { EmotionalValence } from './memory.js';
13
+ import type { PhysicsConfig } from './physics-config.js';
14
+ export interface PhysicsParticle {
15
+ memoryId: string;
16
+ position: number[];
17
+ velocity: number[];
18
+ mass: number;
19
+ charge: number;
20
+ temperature: number;
21
+ lastSimulation: string;
22
+ }
23
+ export interface ScoredPhysicsResult {
24
+ memoryId: string;
25
+ baseScore: number;
26
+ clusterAmplification: number;
27
+ finalScore: number;
28
+ }
29
+ export interface SystemEnergy {
30
+ kinetic: number;
31
+ potential: number;
32
+ total: number;
33
+ }
34
+ export interface SimulationStats {
35
+ particleCount: number;
36
+ avgVelocityMagnitude: number;
37
+ maxVelocityMagnitude: number;
38
+ energy: SystemEnergy;
39
+ substepsRun: number;
40
+ }
41
+ export declare function vecDot(a: number[], b: number[]): number;
42
+ export declare function vecNorm(v: number[]): number;
43
+ export declare function vecScale(v: number[], s: number): number[];
44
+ export declare function vecAdd(a: number[], b: number[]): number[];
45
+ export declare function vecSub(a: number[], b: number[]): number[];
46
+ export declare function vecZero(dim: number): number[];
47
+ /** Normalize to unit length. Returns zero vector if magnitude < epsilon. */
48
+ export declare function vecNormalize(v: number[]): number[];
49
+ /** Clamp vector magnitude to maxMag. */
50
+ export declare function vecClampMagnitude(v: number[], maxMag: number): number[];
51
+ export declare function computeMass(strength: number, retrievalCount: number): number;
52
+ export declare function computeCharge(valence: EmotionalValence): number;
53
+ export declare function computeTemperature(ageDays: number, temperatureDecay: number): number;
54
+ /**
55
+ * F1: Query gravity (retrieval-time, virtual — does not update position).
56
+ * Returns scalar force magnitude for ranking.
57
+ *
58
+ * F_query(i) = G_Q * mass(i) * max(0, cosine(pos_i, query))^2
59
+ */
60
+ export declare function queryGravityMagnitude(particle: PhysicsParticle, queryEmbedding: number[], G_query: number): number;
61
+ /**
62
+ * Momentum bonus: how aligned is the particle's velocity with the query direction?
63
+ * Returns a value in [0, 1].
64
+ */
65
+ export declare function velocityAlignmentBonus(particle: PhysicsParticle, queryEmbedding: number[]): number;
66
+ /**
67
+ * F2: Inter-memory attraction force vector (consolidation-time).
68
+ * Attractive force from particle j on particle i.
69
+ *
70
+ * F_attract(i,j) = G_M * m_i * m_j * max(0, cosine(i,j))^3 * direction(j→i in embedding space)
71
+ *
72
+ * Direction is computed as the component of (pos_j - pos_i) that lies tangent to the
73
+ * unit sphere at pos_i (since we normalize positions back to the sphere after integration).
74
+ */
75
+ export declare function attractionForce(pi: PhysicsParticle, pj: PhysicsParticle, G_memory: number): number[];
76
+ /**
77
+ * F3: Conflict repulsion force vector (consolidation-time).
78
+ * Repulsive force pushing i away from j.
79
+ *
80
+ * F_repel(i,j) = K_R * m_i * m_j / max(0.01, cosine_distance(i,j))^2
81
+ * where cosine_distance = 1 - cosine_similarity
82
+ */
83
+ export declare function repulsionForce(pi: PhysicsParticle, pj: PhysicsParticle, K_repulsion: number): number[];
84
+ /**
85
+ * F4: Drag force vector (consolidation-time).
86
+ * F_drag(i) = -drag * velocity(i) / max(1, effective_half_life(i))
87
+ *
88
+ * effectiveHalfLife should be passed in from the memory's current half_life_days.
89
+ */
90
+ export declare function dragForce(particle: PhysicsParticle, drag: number, effectiveHalfLife: number): number[];
91
+ export interface ForceContext {
92
+ /** Map of memory ID -> list of conflicting memory IDs */
93
+ conflictPairs: Map<string, Set<string>>;
94
+ /** Map of memory ID -> effective half-life days */
95
+ halfLives: Map<string, number>;
96
+ config: PhysicsConfig;
97
+ }
98
+ /**
99
+ * Run the full physics simulation for one sleep cycle.
100
+ * Mutates particles in place. Returns simulation statistics.
101
+ */
102
+ export declare function simulate(particles: PhysicsParticle[], ctx: ForceContext): SimulationStats;
103
+ export declare function computeSystemEnergy(particles: PhysicsParticle[], G_memory: number): SystemEnergy;
104
+ /**
105
+ * Score all particles against a query embedding using physics-based ranking.
106
+ * Does NOT modify particle positions (virtual force computation).
107
+ */
108
+ export declare function physicsScore(particles: PhysicsParticle[], queryEmbedding: number[], config: PhysicsConfig): ScoredPhysicsResult[];
109
+ /**
110
+ * Nudge a particle's position toward (good outcome) or away from (bad outcome)
111
+ * the query embedding. Respects temperature: new memories respond more.
112
+ * Mutates particle in place.
113
+ */
114
+ export declare function applyOutcomeFeedback(particle: PhysicsParticle, queryEmbedding: number[], good: boolean, feedbackAlpha: number): void;
115
+ //# sourceMappingURL=physics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics.d.ts","sourceRoot":"","sources":["../src/physics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Memory-as-Physics engine for Hippo.
3
+ *
4
+ * Pure math module: forces, Velocity Verlet integration, physics-based scoring,
5
+ * and cluster amplification. No I/O — all state is passed in and returned.
6
+ *
7
+ * Memories are particles on the unit hypersphere in embedding space (384-dim).
8
+ * Forces act on them: query gravity (retrieval), inter-memory attraction,
9
+ * conflict repulsion, and drag (consolidation). Nearby high-scoring memories
10
+ * amplify each other via constructive interference.
11
+ */
12
+ // ---------------------------------------------------------------------------
13
+ // Vector math (hot path — kept inline for performance)
14
+ // ---------------------------------------------------------------------------
15
+ export function vecDot(a, b) {
16
+ let sum = 0;
17
+ for (let i = 0; i < a.length; i++)
18
+ sum += a[i] * b[i];
19
+ return sum;
20
+ }
21
+ export function vecNorm(v) {
22
+ return Math.sqrt(vecDot(v, v));
23
+ }
24
+ export function vecScale(v, s) {
25
+ const out = new Array(v.length);
26
+ for (let i = 0; i < v.length; i++)
27
+ out[i] = v[i] * s;
28
+ return out;
29
+ }
30
+ export function vecAdd(a, b) {
31
+ const out = new Array(a.length);
32
+ for (let i = 0; i < a.length; i++)
33
+ out[i] = a[i] + b[i];
34
+ return out;
35
+ }
36
+ export function vecSub(a, b) {
37
+ const out = new Array(a.length);
38
+ for (let i = 0; i < a.length; i++)
39
+ out[i] = a[i] - b[i];
40
+ return out;
41
+ }
42
+ export function vecZero(dim) {
43
+ return new Array(dim).fill(0);
44
+ }
45
+ /** Normalize to unit length. Returns zero vector if magnitude < epsilon. */
46
+ export function vecNormalize(v) {
47
+ const mag = vecNorm(v);
48
+ if (mag < 1e-10)
49
+ return vecZero(v.length);
50
+ return vecScale(v, 1 / mag);
51
+ }
52
+ /** Clamp vector magnitude to maxMag. */
53
+ export function vecClampMagnitude(v, maxMag) {
54
+ const mag = vecNorm(v);
55
+ if (mag <= maxMag)
56
+ return v;
57
+ return vecScale(v, maxMag / mag);
58
+ }
59
+ /** Cosine similarity between two vectors. */
60
+ function cosine(a, b) {
61
+ const dot = vecDot(a, b);
62
+ const na = vecNorm(a);
63
+ const nb = vecNorm(b);
64
+ if (na < 1e-10 || nb < 1e-10)
65
+ return 0;
66
+ return Math.min(1, Math.max(-1, dot / (na * nb)));
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Property derivation from memory attributes
70
+ // ---------------------------------------------------------------------------
71
+ const CHARGE_MAP = {
72
+ neutral: 0,
73
+ positive: 0.3,
74
+ negative: -0.5,
75
+ critical: -1.0,
76
+ };
77
+ export function computeMass(strength, retrievalCount) {
78
+ return Math.max(0.01, strength * (1 + 0.1 * Math.log2(retrievalCount + 1)));
79
+ }
80
+ export function computeCharge(valence) {
81
+ return CHARGE_MAP[valence] ?? 0;
82
+ }
83
+ export function computeTemperature(ageDays, temperatureDecay) {
84
+ return 1 / (ageDays * temperatureDecay + 1);
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Force computations
88
+ // ---------------------------------------------------------------------------
89
+ /**
90
+ * F1: Query gravity (retrieval-time, virtual — does not update position).
91
+ * Returns scalar force magnitude for ranking.
92
+ *
93
+ * F_query(i) = G_Q * mass(i) * max(0, cosine(pos_i, query))^2
94
+ */
95
+ export function queryGravityMagnitude(particle, queryEmbedding, G_query) {
96
+ const cos = cosine(particle.position, queryEmbedding);
97
+ return G_query * particle.mass * Math.pow(Math.max(0, cos), 2);
98
+ }
99
+ /**
100
+ * Momentum bonus: how aligned is the particle's velocity with the query direction?
101
+ * Returns a value in [0, 1].
102
+ */
103
+ export function velocityAlignmentBonus(particle, queryEmbedding) {
104
+ const velMag = vecNorm(particle.velocity);
105
+ if (velMag < 1e-10)
106
+ return 0;
107
+ const alignment = vecDot(particle.velocity, queryEmbedding) / (velMag * vecNorm(queryEmbedding));
108
+ return Math.max(0, alignment);
109
+ }
110
+ /**
111
+ * F2: Inter-memory attraction force vector (consolidation-time).
112
+ * Attractive force from particle j on particle i.
113
+ *
114
+ * F_attract(i,j) = G_M * m_i * m_j * max(0, cosine(i,j))^3 * direction(j→i in embedding space)
115
+ *
116
+ * Direction is computed as the component of (pos_j - pos_i) that lies tangent to the
117
+ * unit sphere at pos_i (since we normalize positions back to the sphere after integration).
118
+ */
119
+ export function attractionForce(pi, pj, G_memory) {
120
+ const cos = cosine(pi.position, pj.position);
121
+ if (cos <= 0)
122
+ return vecZero(pi.position.length);
123
+ const magnitude = G_memory * pi.mass * pj.mass * Math.pow(cos, 3);
124
+ // Direction: from i toward j (tangent projection handled by normalization after integration)
125
+ const direction = vecNormalize(vecSub(pj.position, pi.position));
126
+ return vecScale(direction, magnitude);
127
+ }
128
+ /**
129
+ * F3: Conflict repulsion force vector (consolidation-time).
130
+ * Repulsive force pushing i away from j.
131
+ *
132
+ * F_repel(i,j) = K_R * m_i * m_j / max(0.01, cosine_distance(i,j))^2
133
+ * where cosine_distance = 1 - cosine_similarity
134
+ */
135
+ export function repulsionForce(pi, pj, K_repulsion) {
136
+ const cos = cosine(pi.position, pj.position);
137
+ const dist = Math.max(0.01, 1 - cos);
138
+ const magnitude = K_repulsion * pi.mass * pj.mass / (dist * dist);
139
+ // Direction: away from j
140
+ const direction = vecNormalize(vecSub(pi.position, pj.position));
141
+ return vecScale(direction, magnitude);
142
+ }
143
+ /**
144
+ * F4: Drag force vector (consolidation-time).
145
+ * F_drag(i) = -drag * velocity(i) / max(1, effective_half_life(i))
146
+ *
147
+ * effectiveHalfLife should be passed in from the memory's current half_life_days.
148
+ */
149
+ export function dragForce(particle, drag, effectiveHalfLife) {
150
+ const damping = drag / Math.max(1, effectiveHalfLife);
151
+ return vecScale(particle.velocity, -damping);
152
+ }
153
+ /**
154
+ * Compute net force on particle i from all other particles + drag.
155
+ */
156
+ function computeNetForce(i, particles, ctx) {
157
+ const pi = particles[i];
158
+ const dim = pi.position.length;
159
+ let net = vecZero(dim);
160
+ const conflicts = ctx.conflictPairs.get(pi.memoryId);
161
+ for (let j = 0; j < particles.length; j++) {
162
+ if (i === j)
163
+ continue;
164
+ const pj = particles[j];
165
+ // Attraction (all pairs)
166
+ const fa = attractionForce(pi, pj, ctx.config.G_memory);
167
+ net = vecAdd(net, fa);
168
+ // Repulsion (conflict pairs only)
169
+ if (conflicts?.has(pj.memoryId)) {
170
+ const fr = repulsionForce(pi, pj, ctx.config.K_repulsion);
171
+ net = vecAdd(net, fr);
172
+ }
173
+ }
174
+ // Drag
175
+ const fd = dragForce(pi, ctx.config.drag, ctx.halfLives.get(pi.memoryId) ?? 7);
176
+ net = vecAdd(net, fd);
177
+ return net;
178
+ }
179
+ /**
180
+ * Run one Velocity Verlet integration step for all particles.
181
+ * Mutates particles in place for performance.
182
+ */
183
+ function verletStep(particles, accelerations, ctx) {
184
+ const dt = ctx.config.dt;
185
+ const maxVel = ctx.config.max_velocity;
186
+ for (let i = 0; i < particles.length; i++) {
187
+ const p = particles[i];
188
+ // Position update: pos += vel*dt + 0.5*accel*dt^2
189
+ const velDt = vecScale(p.velocity, dt);
190
+ const accelDt2 = vecScale(accelerations[i], 0.5 * dt * dt);
191
+ p.position = vecAdd(vecAdd(p.position, velDt), accelDt2);
192
+ }
193
+ // Compute new accelerations
194
+ const newAccelerations = [];
195
+ for (let i = 0; i < particles.length; i++) {
196
+ const force = computeNetForce(i, particles, ctx);
197
+ newAccelerations.push(vecScale(force, 1 / Math.max(0.01, particles[i].mass)));
198
+ }
199
+ // Velocity update: vel += 0.5*(accel_old + accel_new)*dt
200
+ for (let i = 0; i < particles.length; i++) {
201
+ const p = particles[i];
202
+ const avgAccel = vecScale(vecAdd(accelerations[i], newAccelerations[i]), 0.5);
203
+ p.velocity = vecAdd(p.velocity, vecScale(avgAccel, dt));
204
+ // Stability: clamp velocity and normalize position to unit sphere
205
+ p.velocity = vecClampMagnitude(p.velocity, maxVel);
206
+ p.position = vecNormalize(p.position);
207
+ }
208
+ // Update accelerations for next step
209
+ for (let i = 0; i < accelerations.length; i++) {
210
+ accelerations[i] = newAccelerations[i];
211
+ }
212
+ }
213
+ /**
214
+ * Run the full physics simulation for one sleep cycle.
215
+ * Mutates particles in place. Returns simulation statistics.
216
+ */
217
+ export function simulate(particles, ctx) {
218
+ if (particles.length === 0) {
219
+ return {
220
+ particleCount: 0,
221
+ avgVelocityMagnitude: 0,
222
+ maxVelocityMagnitude: 0,
223
+ energy: { kinetic: 0, potential: 0, total: 0 },
224
+ substepsRun: 0,
225
+ };
226
+ }
227
+ // Initial accelerations
228
+ const accelerations = particles.map((_, i) => {
229
+ const force = computeNetForce(i, particles, ctx);
230
+ return vecScale(force, 1 / Math.max(0.01, particles[i].mass));
231
+ });
232
+ // Run substeps
233
+ for (let step = 0; step < ctx.config.substeps; step++) {
234
+ verletStep(particles, accelerations, ctx);
235
+ }
236
+ // Update timestamps
237
+ const now = new Date().toISOString();
238
+ for (const p of particles) {
239
+ p.lastSimulation = now;
240
+ }
241
+ // Compute stats
242
+ let sumVelMag = 0;
243
+ let maxVelMag = 0;
244
+ for (const p of particles) {
245
+ const mag = vecNorm(p.velocity);
246
+ sumVelMag += mag;
247
+ if (mag > maxVelMag)
248
+ maxVelMag = mag;
249
+ }
250
+ const energy = computeSystemEnergy(particles, ctx.config.G_memory);
251
+ return {
252
+ particleCount: particles.length,
253
+ avgVelocityMagnitude: sumVelMag / particles.length,
254
+ maxVelocityMagnitude: maxVelMag,
255
+ energy,
256
+ substepsRun: ctx.config.substeps,
257
+ };
258
+ }
259
+ // ---------------------------------------------------------------------------
260
+ // System energy (health monitoring)
261
+ // ---------------------------------------------------------------------------
262
+ export function computeSystemEnergy(particles, G_memory) {
263
+ let kinetic = 0;
264
+ let potential = 0;
265
+ for (const p of particles) {
266
+ const velMag = vecNorm(p.velocity);
267
+ kinetic += 0.5 * p.mass * velMag * velMag;
268
+ }
269
+ for (let i = 0; i < particles.length; i++) {
270
+ for (let j = i + 1; j < particles.length; j++) {
271
+ const cos = cosine(particles[i].position, particles[j].position);
272
+ potential -= G_memory * particles[i].mass * particles[j].mass * Math.max(0, cos);
273
+ }
274
+ }
275
+ return { kinetic, potential, total: kinetic + potential };
276
+ }
277
+ // ---------------------------------------------------------------------------
278
+ // Physics-based scoring (retrieval-time)
279
+ // ---------------------------------------------------------------------------
280
+ /**
281
+ * Score all particles against a query embedding using physics-based ranking.
282
+ * Does NOT modify particle positions (virtual force computation).
283
+ */
284
+ export function physicsScore(particles, queryEmbedding, config) {
285
+ if (particles.length === 0 || queryEmbedding.length === 0)
286
+ return [];
287
+ // Pass 1: compute base scores
288
+ const results = particles.map((p) => {
289
+ const gravity = queryGravityMagnitude(p, queryEmbedding, config.G_query);
290
+ const momentum = config.momentum_weight * velocityAlignmentBonus(p, queryEmbedding);
291
+ return {
292
+ memoryId: p.memoryId,
293
+ baseScore: gravity + momentum,
294
+ clusterAmplification: 1.0,
295
+ finalScore: gravity + momentum,
296
+ };
297
+ });
298
+ // Sort by base score for top-K selection
299
+ results.sort((a, b) => b.baseScore - a.baseScore);
300
+ // Pass 2: cluster amplification on top K
301
+ applyClusterAmplification(results, particles, config);
302
+ // Re-sort by final score
303
+ results.sort((a, b) => b.finalScore - a.finalScore);
304
+ return results;
305
+ }
306
+ /**
307
+ * Cluster amplification: nearby high-scoring memories reinforce each other.
308
+ * Mutates results in place.
309
+ */
310
+ function applyClusterAmplification(results, particles, config) {
311
+ const topK = Math.min(config.cluster_top_k, results.length);
312
+ if (topK < 2)
313
+ return;
314
+ // Build a quick lookup from memoryId to particle
315
+ const particleMap = new Map();
316
+ for (const p of particles)
317
+ particleMap.set(p.memoryId, p);
318
+ const top = results.slice(0, topK);
319
+ for (let i = 0; i < top.length; i++) {
320
+ const pi = particleMap.get(top[i].memoryId);
321
+ if (!pi)
322
+ continue;
323
+ let clusterSignal = 0;
324
+ for (let j = 0; j < top.length; j++) {
325
+ if (i === j)
326
+ continue;
327
+ const pj = particleMap.get(top[j].memoryId);
328
+ if (!pj)
329
+ continue;
330
+ const proximity = cosine(pi.position, pj.position);
331
+ if (proximity > config.cluster_threshold) {
332
+ clusterSignal += top[j].baseScore * proximity;
333
+ }
334
+ }
335
+ const amplification = 1 + Math.tanh(clusterSignal * config.interference_gain);
336
+ top[i].clusterAmplification = amplification;
337
+ top[i].finalScore = top[i].baseScore * amplification;
338
+ }
339
+ }
340
+ // ---------------------------------------------------------------------------
341
+ // Outcome feedback (micro-nudge)
342
+ // ---------------------------------------------------------------------------
343
+ /**
344
+ * Nudge a particle's position toward (good outcome) or away from (bad outcome)
345
+ * the query embedding. Respects temperature: new memories respond more.
346
+ * Mutates particle in place.
347
+ */
348
+ export function applyOutcomeFeedback(particle, queryEmbedding, good, feedbackAlpha) {
349
+ const sign = good ? 1 : -1;
350
+ const direction = vecSub(queryEmbedding, particle.position);
351
+ const nudge = vecScale(direction, sign * feedbackAlpha * particle.temperature);
352
+ particle.position = vecNormalize(vecAdd(particle.position, nudge));
353
+ }
354
+ //# sourceMappingURL=physics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physics.js","sourceRoot":"","sources":["../src/physics.ts"],"names":[],"mappings":"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"}