hippo-memory 0.36.0 → 0.37.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.
- package/README.md +16 -0
- package/dist/api.d.ts +20 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +23 -3
- package/dist/api.js.map +1 -1
- package/dist/benchmarks/e1.3/incident-recall-eval.js +74 -0
- package/dist/benchmarks/e1.3/incident-recall-eval.js.map +1 -0
- package/dist/benchmarks/e1.3/scenarios.json +2587 -0
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +102 -0
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +1 -0
- package/dist/cli.js +82 -0
- package/dist/cli.js.map +1 -1
- package/dist/connectors/slack/backfill.d.ts +42 -0
- package/dist/connectors/slack/backfill.d.ts.map +1 -0
- package/dist/connectors/slack/backfill.js +76 -0
- package/dist/connectors/slack/backfill.js.map +1 -0
- package/dist/connectors/slack/deletion.d.ts +14 -0
- package/dist/connectors/slack/deletion.d.ts.map +1 -0
- package/dist/connectors/slack/deletion.js +46 -0
- package/dist/connectors/slack/deletion.js.map +1 -0
- package/dist/connectors/slack/dlq.d.ts +21 -0
- package/dist/connectors/slack/dlq.d.ts.map +1 -0
- package/dist/connectors/slack/dlq.js +23 -0
- package/dist/connectors/slack/dlq.js.map +1 -0
- package/dist/connectors/slack/idempotency.d.ts +5 -0
- package/dist/connectors/slack/idempotency.d.ts.map +1 -0
- package/dist/connectors/slack/idempotency.js +13 -0
- package/dist/connectors/slack/idempotency.js.map +1 -0
- package/dist/connectors/slack/ingest.d.ts +27 -0
- package/dist/connectors/slack/ingest.d.ts.map +1 -0
- package/dist/connectors/slack/ingest.js +48 -0
- package/dist/connectors/slack/ingest.js.map +1 -0
- package/dist/connectors/slack/ratelimit.d.ts +9 -0
- package/dist/connectors/slack/ratelimit.d.ts.map +1 -0
- package/dist/connectors/slack/ratelimit.js +18 -0
- package/dist/connectors/slack/ratelimit.js.map +1 -0
- package/dist/connectors/slack/scope.d.ts +16 -0
- package/dist/connectors/slack/scope.d.ts.map +1 -0
- package/dist/connectors/slack/scope.js +13 -0
- package/dist/connectors/slack/scope.js.map +1 -0
- package/dist/connectors/slack/signature.d.ts +12 -0
- package/dist/connectors/slack/signature.d.ts.map +1 -0
- package/dist/connectors/slack/signature.js +20 -0
- package/dist/connectors/slack/signature.js.map +1 -0
- package/dist/connectors/slack/tenant-routing.d.ts +13 -0
- package/dist/connectors/slack/tenant-routing.d.ts.map +1 -0
- package/dist/connectors/slack/tenant-routing.js +17 -0
- package/dist/connectors/slack/tenant-routing.js.map +1 -0
- package/dist/connectors/slack/transform.d.ts +20 -0
- package/dist/connectors/slack/transform.d.ts.map +1 -0
- package/dist/connectors/slack/transform.js +31 -0
- package/dist/connectors/slack/transform.js.map +1 -0
- package/dist/connectors/slack/types.d.ts +35 -0
- package/dist/connectors/slack/types.d.ts.map +1 -0
- package/dist/connectors/slack/types.js +23 -0
- package/dist/connectors/slack/types.js.map +1 -0
- package/dist/connectors/slack/web-client.d.ts +12 -0
- package/dist/connectors/slack/web-client.d.ts.map +1 -0
- package/dist/connectors/slack/web-client.js +43 -0
- package/dist/connectors/slack/web-client.js.map +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +46 -1
- package/dist/db.js.map +1 -1
- package/dist/importers.js +3 -3
- package/dist/importers.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +174 -2
- package/dist/server.js.map +1 -1
- package/dist/src/ambient.js +147 -0
- package/dist/src/ambient.js.map +1 -0
- package/dist/src/api.js +343 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/audit.js +152 -0
- package/dist/src/audit.js.map +1 -0
- package/dist/src/auth.js +65 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/autolearn.js +143 -0
- package/dist/src/autolearn.js.map +1 -0
- package/dist/src/capture.js +512 -0
- package/dist/src/capture.js.map +1 -0
- package/dist/src/cli.js +4971 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/client.js +181 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.js +108 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/connectors/slack/backfill.js +76 -0
- package/dist/src/connectors/slack/backfill.js.map +1 -0
- package/dist/src/connectors/slack/deletion.js +46 -0
- package/dist/src/connectors/slack/deletion.js.map +1 -0
- package/dist/src/connectors/slack/dlq.js +23 -0
- package/dist/src/connectors/slack/dlq.js.map +1 -0
- package/dist/src/connectors/slack/idempotency.js +13 -0
- package/dist/src/connectors/slack/idempotency.js.map +1 -0
- package/dist/src/connectors/slack/ingest.js +48 -0
- package/dist/src/connectors/slack/ingest.js.map +1 -0
- package/dist/src/connectors/slack/ratelimit.js +18 -0
- package/dist/src/connectors/slack/ratelimit.js.map +1 -0
- package/dist/src/connectors/slack/scope.js +13 -0
- package/dist/src/connectors/slack/scope.js.map +1 -0
- package/dist/src/connectors/slack/signature.js +20 -0
- package/dist/src/connectors/slack/signature.js.map +1 -0
- package/dist/src/connectors/slack/tenant-routing.js +17 -0
- package/dist/src/connectors/slack/tenant-routing.js.map +1 -0
- package/dist/src/connectors/slack/transform.js +31 -0
- package/dist/src/connectors/slack/transform.js.map +1 -0
- package/dist/src/connectors/slack/types.js +23 -0
- package/dist/src/connectors/slack/types.js.map +1 -0
- package/dist/src/connectors/slack/web-client.js +43 -0
- package/dist/src/connectors/slack/web-client.js.map +1 -0
- package/dist/src/consolidate.js +517 -0
- package/dist/src/consolidate.js.map +1 -0
- package/dist/src/dag.js +104 -0
- package/dist/src/dag.js.map +1 -0
- package/dist/src/dashboard.js +409 -0
- package/dist/src/dashboard.js.map +1 -0
- package/dist/src/db.js +584 -0
- package/dist/src/db.js.map +1 -0
- package/dist/src/embeddings.js +344 -0
- package/dist/src/embeddings.js.map +1 -0
- package/dist/src/eval-suite.js +289 -0
- package/dist/src/eval-suite.js.map +1 -0
- package/dist/src/eval.js +187 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/extract.js +87 -0
- package/dist/src/extract.js.map +1 -0
- package/dist/src/handoff.js +30 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/hooks.js +582 -0
- package/dist/src/hooks.js.map +1 -0
- package/dist/src/importers.js +399 -0
- package/dist/src/importers.js.map +1 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/invalidation.js +94 -0
- package/dist/src/invalidation.js.map +1 -0
- package/dist/src/mcp/framing.js +45 -0
- package/dist/src/mcp/framing.js.map +1 -0
- package/dist/src/mcp/server.js +510 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/memory.js +280 -0
- package/dist/src/memory.js.map +1 -0
- package/dist/src/multihop.js +32 -0
- package/dist/src/multihop.js.map +1 -0
- package/dist/src/path-context.js +32 -0
- package/dist/src/path-context.js.map +1 -0
- package/dist/src/physics-config.js +26 -0
- package/dist/src/physics-config.js.map +1 -0
- package/dist/src/physics-state.js +163 -0
- package/dist/src/physics-state.js.map +1 -0
- package/dist/src/physics.js +361 -0
- package/dist/src/physics.js.map +1 -0
- package/dist/src/postinstall.js +68 -0
- package/dist/src/postinstall.js.map +1 -0
- package/dist/src/raw-archive.js +72 -0
- package/dist/src/raw-archive.js.map +1 -0
- package/dist/src/refine-llm.js +147 -0
- package/dist/src/refine-llm.js.map +1 -0
- package/dist/src/replay.js +117 -0
- package/dist/src/replay.js.map +1 -0
- package/dist/src/salience.js +74 -0
- package/dist/src/salience.js.map +1 -0
- package/dist/src/scheduler.js +67 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/scope.js +35 -0
- package/dist/src/scope.js.map +1 -0
- package/dist/src/search.js +801 -0
- package/dist/src/search.js.map +1 -0
- package/dist/src/server-detect.js +70 -0
- package/dist/src/server-detect.js.map +1 -0
- package/dist/src/server.js +784 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/shared.js +309 -0
- package/dist/src/shared.js.map +1 -0
- package/dist/src/sso.js +22 -0
- package/dist/src/sso.js.map +1 -0
- package/dist/src/store.js +1390 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/tenant.js +17 -0
- package/dist/src/tenant.js.map +1 -0
- package/dist/src/trace.js +64 -0
- package/dist/src/trace.js.map +1 -0
- package/dist/src/working-memory.js +149 -0
- package/dist/src/working-memory.js.map +1 -0
- package/dist/src/yaml.js +98 -0
- package/dist/src/yaml.js.map +1 -0
- package/dist/store.d.ts +9 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +30 -2
- package/dist/store.js.map +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/import.d.ts +0 -31
- package/dist/import.d.ts.map +0 -1
- package/dist/import.js +0 -307
- package/dist/import.js.map +0 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core data model for Hippo memory entries.
|
|
3
|
+
* Based on the strength formula from PLAN.md.
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from 'crypto';
|
|
6
|
+
export var Layer;
|
|
7
|
+
(function (Layer) {
|
|
8
|
+
Layer["Buffer"] = "buffer";
|
|
9
|
+
Layer["Episodic"] = "episodic";
|
|
10
|
+
Layer["Semantic"] = "semantic";
|
|
11
|
+
Layer["Trace"] = "trace";
|
|
12
|
+
})(Layer || (Layer = {}));
|
|
13
|
+
export const DECISION_HALF_LIFE_DAYS = 90;
|
|
14
|
+
// Emotional multipliers from PLAN.md
|
|
15
|
+
const EMOTIONAL_MULTIPLIERS = {
|
|
16
|
+
neutral: 1.0,
|
|
17
|
+
positive: 1.3,
|
|
18
|
+
negative: 1.5, // error-tagged
|
|
19
|
+
critical: 2.0,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Compute the reward factor from cumulative outcome counts.
|
|
23
|
+
*
|
|
24
|
+
* reward_ratio = (positive - negative) / (positive + negative + 1)
|
|
25
|
+
* reward_factor = 1 + 0.5 * reward_ratio
|
|
26
|
+
*
|
|
27
|
+
* Range: (0.5, 1.5). Neutral (no outcomes) returns 1.0.
|
|
28
|
+
* Modulates effective half-life: memories with consistent positive outcomes
|
|
29
|
+
* decay slower; consistent negative outcomes decay faster.
|
|
30
|
+
*/
|
|
31
|
+
export function calculateRewardFactor(entry) {
|
|
32
|
+
const pos = entry.outcome_positive ?? 0;
|
|
33
|
+
const neg = entry.outcome_negative ?? 0;
|
|
34
|
+
if (pos === 0 && neg === 0)
|
|
35
|
+
return 1.0;
|
|
36
|
+
const ratio = (pos - neg) / (pos + neg + 1);
|
|
37
|
+
return 1 + 0.5 * ratio;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Calculate current strength at a given time.
|
|
41
|
+
* strength(t) = base_strength * decay * retrieval_boost * emotional_multiplier
|
|
42
|
+
*
|
|
43
|
+
* Decay basis modes:
|
|
44
|
+
* - clock: classic wall-clock decay (daysSince / halfLife)
|
|
45
|
+
* - session: decay by sleep cycles instead of days (sessionsSince / halfLife)
|
|
46
|
+
* - adaptive: wall-clock decay with half-life scaled by session frequency
|
|
47
|
+
*
|
|
48
|
+
* Pinned memories always return 1.0 (no decay).
|
|
49
|
+
*/
|
|
50
|
+
export function calculateStrength(entry, now = new Date(), options = {}) {
|
|
51
|
+
if (entry.pinned)
|
|
52
|
+
return 1.0;
|
|
53
|
+
const lastRetrieved = new Date(entry.last_retrieved);
|
|
54
|
+
const daysSince = (now.getTime() - lastRetrieved.getTime()) / (1000 * 60 * 60 * 24);
|
|
55
|
+
// Reward-proportional half-life modulation
|
|
56
|
+
const rewardFactor = calculateRewardFactor(entry);
|
|
57
|
+
let effectiveHalfLife = entry.half_life_days * rewardFactor;
|
|
58
|
+
// Guard: zero half-life causes 0/0 = NaN in the exponent
|
|
59
|
+
if (effectiveHalfLife <= 0)
|
|
60
|
+
return 0.0;
|
|
61
|
+
const basis = options.decayBasis ?? 'clock';
|
|
62
|
+
let decayExponent;
|
|
63
|
+
if (basis === 'session') {
|
|
64
|
+
// Decay by session count: each sleep cycle = 1 "day" in the decay formula.
|
|
65
|
+
// Estimate sessions since last retrieval from wall-clock time and avg interval.
|
|
66
|
+
const avgInterval = options.avgSessionIntervalDays ?? 1;
|
|
67
|
+
const sessionsSince = avgInterval > 0 ? Math.max(0, daysSince / avgInterval) : daysSince;
|
|
68
|
+
decayExponent = sessionsSince / effectiveHalfLife;
|
|
69
|
+
}
|
|
70
|
+
else if (basis === 'adaptive') {
|
|
71
|
+
// Scale half-life by session frequency: infrequent agents get longer half-lives
|
|
72
|
+
const avgInterval = options.avgSessionIntervalDays ?? 0;
|
|
73
|
+
if (avgInterval > 1) {
|
|
74
|
+
effectiveHalfLife *= avgInterval;
|
|
75
|
+
}
|
|
76
|
+
decayExponent = daysSince / effectiveHalfLife;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// clock: classic wall-clock decay
|
|
80
|
+
decayExponent = daysSince / effectiveHalfLife;
|
|
81
|
+
}
|
|
82
|
+
const decay = Math.pow(0.5, decayExponent);
|
|
83
|
+
// Retrieval boost: 1 + 0.1 * log2(retrieval_count + 1)
|
|
84
|
+
const retrievalBoost = 1 + 0.1 * Math.log2(entry.retrieval_count + 1);
|
|
85
|
+
// Emotional multiplier
|
|
86
|
+
const emotionalMultiplier = EMOTIONAL_MULTIPLIERS[entry.emotional_valence] ?? 1.0;
|
|
87
|
+
const raw = decay * retrievalBoost * emotionalMultiplier;
|
|
88
|
+
// Clamp to [0, 1] with NaN guard
|
|
89
|
+
const clamped = Math.min(1.0, Math.max(0.0, raw));
|
|
90
|
+
return Number.isFinite(clamped) ? clamped : 0.0;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Derive half-life based on signals, as per PLAN.md table.
|
|
94
|
+
*/
|
|
95
|
+
export function deriveHalfLife(base, entry) {
|
|
96
|
+
let hl = base;
|
|
97
|
+
// Error-tagged: 2x half-life
|
|
98
|
+
if (entry.tags?.includes('error')) {
|
|
99
|
+
hl *= 2;
|
|
100
|
+
}
|
|
101
|
+
// High schema fit: consolidates faster (1.5x)
|
|
102
|
+
if (entry.schema_fit !== undefined && entry.schema_fit > 0.7) {
|
|
103
|
+
hl *= 1.5;
|
|
104
|
+
}
|
|
105
|
+
// Low schema fit: decay faster (0.5x)
|
|
106
|
+
if (entry.schema_fit !== undefined && entry.schema_fit < 0.3) {
|
|
107
|
+
hl *= 0.5;
|
|
108
|
+
}
|
|
109
|
+
return hl;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Apply outcome feedback to a memory entry.
|
|
113
|
+
*
|
|
114
|
+
* Increments outcome_positive or outcome_negative counters.
|
|
115
|
+
* The reward factor in calculateStrength() uses these counts to
|
|
116
|
+
* continuously modulate the effective half-life:
|
|
117
|
+
* reward_ratio = (pos - neg) / (pos + neg + 1)
|
|
118
|
+
* reward_factor = 1 + 0.5 * reward_ratio // range (0.5, 1.5)
|
|
119
|
+
* effective_hl = half_life_days * reward_factor
|
|
120
|
+
*
|
|
121
|
+
* No fixed half-life delta. Decay rate adjusts proportionally to
|
|
122
|
+
* cumulative reward signal, inspired by R-STDP in spiking networks.
|
|
123
|
+
*/
|
|
124
|
+
export function applyOutcome(entry, good) {
|
|
125
|
+
const updated = {
|
|
126
|
+
...entry,
|
|
127
|
+
outcome_score: good ? 1 : -1,
|
|
128
|
+
outcome_positive: (entry.outcome_positive ?? 0) + (good ? 1 : 0),
|
|
129
|
+
outcome_negative: (entry.outcome_negative ?? 0) + (good ? 0 : 1),
|
|
130
|
+
};
|
|
131
|
+
updated.strength = calculateStrength(updated);
|
|
132
|
+
return updated;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Generate a random memory ID using crypto.randomUUID().
|
|
136
|
+
*/
|
|
137
|
+
export function generateId(prefix = 'mem') {
|
|
138
|
+
return `${prefix}_${randomUUID().replace(/-/g, '').slice(0, 12)}`;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Resolve the effective confidence for a memory entry.
|
|
142
|
+
* If the entry has not been retrieved in 30+ days and is not 'verified',
|
|
143
|
+
* returns 'stale'. Otherwise returns the stored confidence value.
|
|
144
|
+
*/
|
|
145
|
+
export function resolveConfidence(entry, now = new Date()) {
|
|
146
|
+
if (entry.pinned || entry.confidence === 'verified')
|
|
147
|
+
return entry.confidence;
|
|
148
|
+
const lastRetrieved = new Date(entry.last_retrieved);
|
|
149
|
+
const daysSince = (now.getTime() - lastRetrieved.getTime()) / (1000 * 60 * 60 * 24);
|
|
150
|
+
if (daysSince > 30)
|
|
151
|
+
return 'stale';
|
|
152
|
+
return entry.confidence;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create a new memory entry with defaults.
|
|
156
|
+
*/
|
|
157
|
+
export function createMemory(content, options = {}) {
|
|
158
|
+
const trimmed = content.trim();
|
|
159
|
+
if (trimmed.length < 3) {
|
|
160
|
+
throw new Error(`Memory content too short (${trimmed.length} chars, minimum 3): "${trimmed}"`);
|
|
161
|
+
}
|
|
162
|
+
const validOutcomes = ['success', 'failure', 'partial', null];
|
|
163
|
+
if (options.trace_outcome !== undefined && !validOutcomes.includes(options.trace_outcome)) {
|
|
164
|
+
throw new Error(`Invalid trace_outcome: ${options.trace_outcome}. Must be 'success', 'failure', 'partial', or null.`);
|
|
165
|
+
}
|
|
166
|
+
const now = new Date().toISOString();
|
|
167
|
+
const layer = options.layer ?? Layer.Episodic;
|
|
168
|
+
const tags = options.tags ?? [];
|
|
169
|
+
const emotional_valence = options.emotional_valence ?? inferValence(tags);
|
|
170
|
+
const schema_fit = options.schema_fit ?? 0.5;
|
|
171
|
+
const partial = { tags, schema_fit };
|
|
172
|
+
const half_life_days = deriveHalfLife(options.baseHalfLifeDays ?? 7, partial);
|
|
173
|
+
const entry = {
|
|
174
|
+
id: generateId(layer === Layer.Semantic ? 'sem' : 'mem'),
|
|
175
|
+
created: now,
|
|
176
|
+
last_retrieved: now,
|
|
177
|
+
retrieval_count: 0,
|
|
178
|
+
strength: 1.0,
|
|
179
|
+
half_life_days,
|
|
180
|
+
layer,
|
|
181
|
+
tags,
|
|
182
|
+
emotional_valence,
|
|
183
|
+
schema_fit,
|
|
184
|
+
source: options.source ?? 'cli',
|
|
185
|
+
outcome_score: null,
|
|
186
|
+
outcome_positive: 0,
|
|
187
|
+
outcome_negative: 0,
|
|
188
|
+
conflicts_with: [],
|
|
189
|
+
pinned: options.pinned ?? false,
|
|
190
|
+
confidence: options.confidence ?? 'verified',
|
|
191
|
+
content,
|
|
192
|
+
parents: [],
|
|
193
|
+
starred: false,
|
|
194
|
+
trace_outcome: options.trace_outcome ?? null,
|
|
195
|
+
source_session_id: options.source_session_id ?? null,
|
|
196
|
+
valid_from: options.valid_from ?? now,
|
|
197
|
+
superseded_by: null,
|
|
198
|
+
extracted_from: options.extracted_from ?? null,
|
|
199
|
+
dag_level: options.dag_level ?? 0,
|
|
200
|
+
dag_parent_id: options.dag_parent_id ?? null,
|
|
201
|
+
kind: options.kind ?? 'distilled',
|
|
202
|
+
scope: options.scope ?? null,
|
|
203
|
+
owner: options.owner ?? null,
|
|
204
|
+
artifact_ref: options.artifact_ref ?? null,
|
|
205
|
+
tenantId: options.tenantId ?? 'default',
|
|
206
|
+
};
|
|
207
|
+
// Recalculate strength with the emotional multiplier applied
|
|
208
|
+
entry.strength = calculateStrength(entry);
|
|
209
|
+
return entry;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Compute how well new content fits existing knowledge patterns.
|
|
213
|
+
* Returns 0..1 where:
|
|
214
|
+
* >0.7 = high fit (consistent with existing knowledge, consolidates faster)
|
|
215
|
+
* 0.3-0.7 = moderate fit
|
|
216
|
+
* <0.3 = novel (doesn't match existing patterns, decays faster if unused)
|
|
217
|
+
*
|
|
218
|
+
* Uses tag overlap (always available) weighted by how common each tag is.
|
|
219
|
+
* Rare shared tags signal stronger schema fit than common ones.
|
|
220
|
+
*/
|
|
221
|
+
export function computeSchemaFit(content, tags, existingEntries) {
|
|
222
|
+
if (existingEntries.length === 0)
|
|
223
|
+
return 0.5; // no schema yet, neutral
|
|
224
|
+
// Build tag frequency map across all existing entries
|
|
225
|
+
const tagFreq = new Map();
|
|
226
|
+
for (const entry of existingEntries) {
|
|
227
|
+
for (const tag of entry.tags) {
|
|
228
|
+
tagFreq.set(tag, (tagFreq.get(tag) ?? 0) + 1);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (tags.length === 0 && tagFreq.size === 0)
|
|
232
|
+
return 0.5;
|
|
233
|
+
// Tag overlap: IDF-weighted Jaccard
|
|
234
|
+
// Shared rare tags matter more than shared common tags
|
|
235
|
+
let weightedOverlap = 0;
|
|
236
|
+
let totalWeight = 0;
|
|
237
|
+
const N = existingEntries.length;
|
|
238
|
+
for (const tag of tags) {
|
|
239
|
+
const freq = tagFreq.get(tag) ?? 0;
|
|
240
|
+
// IDF-weighted: rare shared tags score higher
|
|
241
|
+
const maxIdf = Math.log(N + 1) + 1;
|
|
242
|
+
if (freq > 0) {
|
|
243
|
+
const idf = Math.log(N / freq) + 1;
|
|
244
|
+
weightedOverlap += idf;
|
|
245
|
+
}
|
|
246
|
+
totalWeight += maxIdf;
|
|
247
|
+
}
|
|
248
|
+
// Scale so that matching half the tags at average IDF gives ~0.5
|
|
249
|
+
const tagScore = totalWeight > 0 ? Math.min(1, (weightedOverlap / totalWeight) * 2) : 0;
|
|
250
|
+
// Content overlap: check how many existing entries share significant tokens
|
|
251
|
+
const newTokens = new Set(content.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
|
|
252
|
+
if (newTokens.size === 0)
|
|
253
|
+
return Math.min(1, Math.max(0, tagScore));
|
|
254
|
+
let contentMatches = 0;
|
|
255
|
+
for (const entry of existingEntries) {
|
|
256
|
+
const entryTokens = new Set(entry.content.toLowerCase().replace(/[^\w\s]/g, ' ').split(/\s+/).filter((t) => t.length > 3));
|
|
257
|
+
let shared = 0;
|
|
258
|
+
for (const token of newTokens) {
|
|
259
|
+
if (entryTokens.has(token))
|
|
260
|
+
shared++;
|
|
261
|
+
}
|
|
262
|
+
const overlap = shared / Math.max(newTokens.size, 1);
|
|
263
|
+
if (overlap > 0.2)
|
|
264
|
+
contentMatches++;
|
|
265
|
+
}
|
|
266
|
+
const contentScore = Math.min(1, contentMatches / Math.max(5, N * 0.1));
|
|
267
|
+
// Blend: 60% tag overlap, 40% content overlap
|
|
268
|
+
const fit = 0.6 * tagScore + 0.4 * contentScore;
|
|
269
|
+
return Math.min(1, Math.max(0, fit));
|
|
270
|
+
}
|
|
271
|
+
function inferValence(tags) {
|
|
272
|
+
if (tags.includes('critical'))
|
|
273
|
+
return 'critical';
|
|
274
|
+
if (tags.includes('error'))
|
|
275
|
+
return 'negative';
|
|
276
|
+
if (tags.includes('success') || tags.includes('win'))
|
|
277
|
+
return 'positive';
|
|
278
|
+
return 'neutral';
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,CAAN,IAAY,KAKX;AALD,WAAY,KAAK;IACf,0BAAiB,CAAA;IACjB,8BAAqB,CAAA;IACrB,8BAAqB,CAAA;IACrB,wBAAe,CAAA;AACjB,CAAC,EALW,KAAK,KAAL,KAAK,QAKhB;AA+CD,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,qCAAqC;AACrC,MAAM,qBAAqB,GAAqC;IAC9D,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG,EAAG,eAAe;IAC/B,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAkB;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACvC,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;AACzB,CAAC;AAgBD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAkB,EAClB,MAAY,IAAI,IAAI,EAAE,EACtB,UAAwB,EAAE;IAE1B,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IAE7B,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpF,2CAA2C;IAC3C,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,iBAAiB,GAAG,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC;IAE5D,yDAAyD;IACzD,IAAI,iBAAiB,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAEvC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;IAC5C,IAAI,aAAqB,CAAC;IAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,2EAA2E;QAC3E,gFAAgF;QAChF,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,IAAI,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,aAAa,GAAG,aAAa,GAAG,iBAAiB,CAAC;IACpD,CAAC;SAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,gFAAgF;QAChF,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,IAAI,CAAC,CAAC;QACxD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,iBAAiB,IAAI,WAAW,CAAC;QACnC,CAAC;QACD,aAAa,GAAG,SAAS,GAAG,iBAAiB,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,aAAa,GAAG,SAAS,GAAG,iBAAiB,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAE3C,uDAAuD;IACvD,MAAM,cAAc,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAEtE,uBAAuB;IACvB,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC;IAElF,MAAM,GAAG,GAAG,KAAK,GAAG,cAAc,GAAG,mBAAmB,CAAC;IAEzD,iCAAiC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAA2B;IACtE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,6BAA6B;IAC7B,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,EAAE,IAAI,CAAC,CAAC;IACV,CAAC;IAED,8CAA8C;IAC9C,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;QAC7D,EAAE,IAAI,GAAG,CAAC;IACZ,CAAC;IAED,sCAAsC;IACtC,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;QAC7D,EAAE,IAAI,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,KAAkB,EAAE,IAAa;IAC5D,MAAM,OAAO,GAAgB;QAC3B,GAAG,KAAK;QACR,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,gBAAgB,EAAE,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,gBAAgB,EAAE,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACjE,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB,KAAK;IAC/C,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,MAAY,IAAI,IAAI,EAAE;IAC1E,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC;IAE7E,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpF,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IACnC,OAAO,KAAK,CAAC,UAAU,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,UAoBI,EAAE;IAEN,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,MAAM,wBAAwB,OAAO,GAAG,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,aAAa,GAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACjF,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,CAAC,aAAa,qDAAqD,CAAC,CAAC;IACxH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAE7C,MAAM,OAAO,GAAyB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC3D,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAE9E,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,OAAO,EAAE,GAAG;QACZ,cAAc,EAAE,GAAG;QACnB,eAAe,EAAE,CAAC;QAClB,QAAQ,EAAE,GAAG;QACb,cAAc;QACd,KAAK;QACL,IAAI;QACJ,iBAAiB;QACjB,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,CAAC;QACnB,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,UAAU;QAC5C,OAAO;QACP,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;QACpD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG;QACrC,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;QAC9C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW;QACjC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;QAC5B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;KACxC,CAAC;IAEF,6DAA6D;IAC7D,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,IAAc,EACd,eAA8B;IAE9B,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,yBAAyB;IAEvE,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAExD,oCAAoC;IACpC,uDAAuD;IACvD,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,8CAA8C;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,eAAe,IAAI,GAAG,CAAC;QACzB,CAAC;QACD,WAAW,IAAI,MAAM,CAAC;IACxB,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAExF,4EAA4E;IAC5E,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CACxF,CAAC;IAEF,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpE,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAC9F,CAAC;QACF,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,MAAM,EAAE,CAAC;QACvC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrD,IAAI,OAAO,GAAG,GAAG;YAAE,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAExE,8CAA8C;IAC9C,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,GAAG,GAAG,YAAY,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { search } from './search.js';
|
|
2
|
+
export function multihopSearch(query, entries, options = {}) {
|
|
3
|
+
const pass1 = search(query, entries, { ...options, budget: (options.budget ?? 4000) * 2 });
|
|
4
|
+
const topK = pass1.slice(0, 10);
|
|
5
|
+
if (topK.length === 0)
|
|
6
|
+
return [];
|
|
7
|
+
const entityTags = new Set();
|
|
8
|
+
for (const r of topK) {
|
|
9
|
+
for (const tag of r.entry.tags) {
|
|
10
|
+
if (tag.startsWith('speaker:') || tag.startsWith('topic:')) {
|
|
11
|
+
entityTags.add(tag);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const queryLower = query.toLowerCase();
|
|
16
|
+
const newEntities = [...entityTags]
|
|
17
|
+
.map((t) => t.split(':')[1])
|
|
18
|
+
.filter((e) => !queryLower.includes(e.toLowerCase()));
|
|
19
|
+
if (newEntities.length === 0)
|
|
20
|
+
return pass1;
|
|
21
|
+
const followUpQuery = newEntities.join(' ') + ' ' + query;
|
|
22
|
+
const pass2 = search(followUpQuery, entries, options);
|
|
23
|
+
const merged = new Map();
|
|
24
|
+
for (const r of [...pass1, ...pass2]) {
|
|
25
|
+
const existing = merged.get(r.entry.id);
|
|
26
|
+
if (!existing || r.score > existing.score) {
|
|
27
|
+
merged.set(r.entry.id, r);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return [...merged.values()].sort((a, b) => b.score - a.score);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=multihop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multihop.js","sourceRoot":"","sources":["../../src/multihop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,OAAsB,EACtB,UAAgI,EAAE;IAElI,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,GAAG,UAAU,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAExD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract meaningful path segments from a directory path.
|
|
3
|
+
* Returns tags like ['path:src', 'path:api', 'path:my-project'].
|
|
4
|
+
* Filters out noise (node_modules, .git, Users, home dirs, drive letters).
|
|
5
|
+
*/
|
|
6
|
+
export function extractPathTags(dirPath) {
|
|
7
|
+
const normalized = dirPath.replace(/\\/g, '/');
|
|
8
|
+
const segments = normalized.split('/').filter(Boolean);
|
|
9
|
+
const noise = new Set([
|
|
10
|
+
'users', 'home', 'documents', 'desktop', 'downloads',
|
|
11
|
+
'node_modules', '.git', '.hippo', 'dist', 'build',
|
|
12
|
+
'c:', 'd:', 'tmp', 'temp', 'var', 'usr', 'opt', 'etc',
|
|
13
|
+
'appdata', 'local', 'roaming', 'program files', 'program files (x86)',
|
|
14
|
+
]);
|
|
15
|
+
return segments
|
|
16
|
+
.filter(s => s.length >= 2 && !noise.has(s.toLowerCase()))
|
|
17
|
+
.slice(-4) // keep last 4 meaningful segments (most specific)
|
|
18
|
+
.map(s => `path:${s.toLowerCase()}`);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Compute path overlap score between two sets of path tags.
|
|
22
|
+
* Returns 0..1 where 1 = perfect match.
|
|
23
|
+
*/
|
|
24
|
+
export function pathOverlapScore(memoryPathTags, currentPathTags) {
|
|
25
|
+
if (memoryPathTags.length === 0 || currentPathTags.length === 0)
|
|
26
|
+
return 0;
|
|
27
|
+
const memSet = new Set(memoryPathTags);
|
|
28
|
+
const matches = currentPathTags.filter(t => memSet.has(t)).length;
|
|
29
|
+
// Weight toward the memory's path tags (what fraction of the memory's context matches)
|
|
30
|
+
return matches / memoryPathTags.length;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=path-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-context.js","sourceRoot":"","sources":["../../src/path-context.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW;QACpD,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;QACjD,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;QACrD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB;KACtE,CAAC,CAAC;IAEH,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;SACzD,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,kDAAkD;SAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAwB,EAAE,eAAyB;IAClF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE1E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAElE,uFAAuF;IACvF,OAAO,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Physics engine configuration for Hippo memory-as-physics.
|
|
3
|
+
* All constants are tunable; defaults calibrated for ~500 memory corpus.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_PHYSICS_CONFIG = {
|
|
6
|
+
enabled: 'auto',
|
|
7
|
+
G_query: 2.0,
|
|
8
|
+
G_memory: 0.01,
|
|
9
|
+
K_repulsion: 0.5,
|
|
10
|
+
drag: 0.3,
|
|
11
|
+
interference_gain: 0.3,
|
|
12
|
+
momentum_weight: 0.1,
|
|
13
|
+
max_velocity: 0.1,
|
|
14
|
+
dt: 0.1,
|
|
15
|
+
substeps: 5,
|
|
16
|
+
feedback_alpha: 0.01,
|
|
17
|
+
temperature_decay: 1.0,
|
|
18
|
+
cluster_threshold: 0.7,
|
|
19
|
+
cluster_top_k: 20,
|
|
20
|
+
};
|
|
21
|
+
export function mergePhysicsConfig(partial) {
|
|
22
|
+
if (!partial)
|
|
23
|
+
return { ...DEFAULT_PHYSICS_CONFIG };
|
|
24
|
+
return { ...DEFAULT_PHYSICS_CONFIG, ...partial };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=physics-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-config.js","sourceRoot":"","sources":["../../src/physics-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH,MAAM,CAAC,MAAM,sBAAsB,GAA4B;IAC7D,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,GAAG;IAChB,IAAI,EAAE,GAAG;IACT,iBAAiB,EAAE,GAAG;IACtB,eAAe,EAAE,GAAG;IACpB,YAAY,EAAE,GAAG;IACjB,EAAE,EAAE,GAAG;IACP,QAAQ,EAAE,CAAC;IACX,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,GAAG;IACtB,iBAAiB,EAAE,GAAG;IACtB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAgC;IACjE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,GAAG,sBAAsB,EAAE,CAAC;IACnD,OAAO,EAAE,GAAG,sBAAsB,EAAE,GAAG,OAAO,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
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
|
+
if (buf.byteLength === 0 || buf.byteLength % 4 !== 0)
|
|
17
|
+
return [];
|
|
18
|
+
// Ensure we have a properly aligned copy (SQLite may return Uint8Array, not Buffer)
|
|
19
|
+
const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
20
|
+
const aligned = new ArrayBuffer(bytes.length);
|
|
21
|
+
new Uint8Array(aligned).set(bytes);
|
|
22
|
+
return Array.from(new Float32Array(aligned));
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Schema migration
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/**
|
|
28
|
+
* Create the memory_physics table (migration v8).
|
|
29
|
+
* Call this from db.ts MIGRATIONS array.
|
|
30
|
+
*/
|
|
31
|
+
export function createPhysicsTable(db) {
|
|
32
|
+
db.exec(`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS memory_physics (
|
|
34
|
+
memory_id TEXT PRIMARY KEY REFERENCES memories(id) ON DELETE CASCADE,
|
|
35
|
+
position_blob BLOB NOT NULL,
|
|
36
|
+
velocity_blob BLOB NOT NULL,
|
|
37
|
+
mass REAL NOT NULL,
|
|
38
|
+
charge REAL NOT NULL,
|
|
39
|
+
temperature REAL NOT NULL,
|
|
40
|
+
last_simulation TEXT NOT NULL,
|
|
41
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_memory_physics_mass
|
|
45
|
+
ON memory_physics(mass DESC);
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load physics state for specific memory IDs (or all if no IDs given).
|
|
50
|
+
*/
|
|
51
|
+
export function loadPhysicsState(db, memoryIds) {
|
|
52
|
+
const map = new Map();
|
|
53
|
+
let rows;
|
|
54
|
+
if (memoryIds && memoryIds.length > 0) {
|
|
55
|
+
const placeholders = memoryIds.map(() => '?').join(',');
|
|
56
|
+
rows = db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
|
|
57
|
+
FROM memory_physics WHERE memory_id IN (${placeholders})`).all(...memoryIds);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
rows = db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
|
|
61
|
+
FROM memory_physics`).all();
|
|
62
|
+
}
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
map.set(row.memory_id, {
|
|
65
|
+
memoryId: row.memory_id,
|
|
66
|
+
position: bufferToFloat32(row.position_blob),
|
|
67
|
+
velocity: bufferToFloat32(row.velocity_blob),
|
|
68
|
+
mass: row.mass,
|
|
69
|
+
charge: row.charge,
|
|
70
|
+
temperature: row.temperature,
|
|
71
|
+
lastSimulation: row.last_simulation,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return map;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Save physics state for multiple particles (batch upsert).
|
|
78
|
+
*/
|
|
79
|
+
export function savePhysicsState(db, particles) {
|
|
80
|
+
if (particles.length === 0)
|
|
81
|
+
return;
|
|
82
|
+
const stmt = db.prepare(`
|
|
83
|
+
INSERT INTO memory_physics (memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation, updated_at)
|
|
84
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))
|
|
85
|
+
ON CONFLICT(memory_id) DO UPDATE SET
|
|
86
|
+
position_blob = excluded.position_blob,
|
|
87
|
+
velocity_blob = excluded.velocity_blob,
|
|
88
|
+
mass = excluded.mass,
|
|
89
|
+
charge = excluded.charge,
|
|
90
|
+
temperature = excluded.temperature,
|
|
91
|
+
last_simulation = excluded.last_simulation,
|
|
92
|
+
updated_at = datetime('now')
|
|
93
|
+
`);
|
|
94
|
+
db.exec('BEGIN');
|
|
95
|
+
try {
|
|
96
|
+
for (const p of particles) {
|
|
97
|
+
stmt.run(p.memoryId, float32ToBuffer(p.position), float32ToBuffer(p.velocity), p.mass, p.charge, p.temperature, p.lastSimulation);
|
|
98
|
+
}
|
|
99
|
+
db.exec('COMMIT');
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
db.exec('ROLLBACK');
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Initialize physics state for a memory from its embedding vector.
|
|
108
|
+
* Returns the new particle (does not persist — caller must save).
|
|
109
|
+
*/
|
|
110
|
+
export function initializeParticle(entry, embedding, now = new Date()) {
|
|
111
|
+
const strength = calculateStrength(entry, now);
|
|
112
|
+
const ageDays = (now.getTime() - new Date(entry.created).getTime()) / (1000 * 60 * 60 * 24);
|
|
113
|
+
return {
|
|
114
|
+
memoryId: entry.id,
|
|
115
|
+
position: [...embedding], // copy — position will diverge from original embedding
|
|
116
|
+
velocity: vecZero(embedding.length),
|
|
117
|
+
mass: computeMass(strength, entry.retrieval_count),
|
|
118
|
+
charge: computeCharge(entry.emotional_valence),
|
|
119
|
+
temperature: computeTemperature(ageDays, 1.0),
|
|
120
|
+
lastSimulation: now.toISOString(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Delete physics state for a memory. (Also handled by CASCADE, but explicit for clarity.)
|
|
125
|
+
*/
|
|
126
|
+
export function deletePhysicsState(db, memoryId) {
|
|
127
|
+
db.prepare('DELETE FROM memory_physics WHERE memory_id = ?').run(memoryId);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Reset all physics states from original embeddings.
|
|
131
|
+
* Drops existing physics data and re-initializes from the embedding index.
|
|
132
|
+
*/
|
|
133
|
+
export function resetAllPhysicsState(db, entries, embeddingIndex, now = new Date()) {
|
|
134
|
+
db.exec('DELETE FROM memory_physics');
|
|
135
|
+
const particles = [];
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
const embedding = embeddingIndex[entry.id];
|
|
138
|
+
if (!embedding || embedding.length === 0)
|
|
139
|
+
continue;
|
|
140
|
+
particles.push(initializeParticle(entry, embedding, now));
|
|
141
|
+
}
|
|
142
|
+
if (particles.length > 0) {
|
|
143
|
+
savePhysicsState(db, particles);
|
|
144
|
+
}
|
|
145
|
+
return particles.length;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Refresh mass, charge, and temperature for existing particles
|
|
149
|
+
* based on current memory attributes (called during consolidation).
|
|
150
|
+
*/
|
|
151
|
+
export function refreshParticleProperties(particles, entries, now = new Date()) {
|
|
152
|
+
for (const p of particles) {
|
|
153
|
+
const entry = entries.get(p.memoryId);
|
|
154
|
+
if (!entry)
|
|
155
|
+
continue;
|
|
156
|
+
const strength = calculateStrength(entry, now);
|
|
157
|
+
const ageDays = (now.getTime() - new Date(entry.created).getTime()) / (1000 * 60 * 60 * 24);
|
|
158
|
+
p.mass = computeMass(strength, entry.retrieval_count);
|
|
159
|
+
p.charge = computeCharge(entry.emotional_valence);
|
|
160
|
+
p.temperature = computeTemperature(ageDays, 1.0);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# 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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"}
|