@psiclawops/hypermem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/ARCHITECTURE.md +296 -0
  2. package/LICENSE +190 -0
  3. package/README.md +243 -0
  4. package/dist/background-indexer.d.ts +117 -0
  5. package/dist/background-indexer.d.ts.map +1 -0
  6. package/dist/background-indexer.js +732 -0
  7. package/dist/compaction-fence.d.ts +89 -0
  8. package/dist/compaction-fence.d.ts.map +1 -0
  9. package/dist/compaction-fence.js +153 -0
  10. package/dist/compositor.d.ts +139 -0
  11. package/dist/compositor.d.ts.map +1 -0
  12. package/dist/compositor.js +1109 -0
  13. package/dist/cross-agent.d.ts +57 -0
  14. package/dist/cross-agent.d.ts.map +1 -0
  15. package/dist/cross-agent.js +254 -0
  16. package/dist/db.d.ts +131 -0
  17. package/dist/db.d.ts.map +1 -0
  18. package/dist/db.js +398 -0
  19. package/dist/desired-state-store.d.ts +100 -0
  20. package/dist/desired-state-store.d.ts.map +1 -0
  21. package/dist/desired-state-store.js +212 -0
  22. package/dist/doc-chunk-store.d.ts +115 -0
  23. package/dist/doc-chunk-store.d.ts.map +1 -0
  24. package/dist/doc-chunk-store.js +278 -0
  25. package/dist/doc-chunker.d.ts +99 -0
  26. package/dist/doc-chunker.d.ts.map +1 -0
  27. package/dist/doc-chunker.js +324 -0
  28. package/dist/episode-store.d.ts +48 -0
  29. package/dist/episode-store.d.ts.map +1 -0
  30. package/dist/episode-store.js +135 -0
  31. package/dist/fact-store.d.ts +57 -0
  32. package/dist/fact-store.d.ts.map +1 -0
  33. package/dist/fact-store.js +175 -0
  34. package/dist/fleet-store.d.ts +144 -0
  35. package/dist/fleet-store.d.ts.map +1 -0
  36. package/dist/fleet-store.js +276 -0
  37. package/dist/hybrid-retrieval.d.ts +60 -0
  38. package/dist/hybrid-retrieval.d.ts.map +1 -0
  39. package/dist/hybrid-retrieval.js +340 -0
  40. package/dist/index.d.ts +611 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +1042 -0
  43. package/dist/knowledge-graph.d.ts +110 -0
  44. package/dist/knowledge-graph.d.ts.map +1 -0
  45. package/dist/knowledge-graph.js +305 -0
  46. package/dist/knowledge-store.d.ts +72 -0
  47. package/dist/knowledge-store.d.ts.map +1 -0
  48. package/dist/knowledge-store.js +241 -0
  49. package/dist/library-schema.d.ts +22 -0
  50. package/dist/library-schema.d.ts.map +1 -0
  51. package/dist/library-schema.js +717 -0
  52. package/dist/message-store.d.ts +76 -0
  53. package/dist/message-store.d.ts.map +1 -0
  54. package/dist/message-store.js +273 -0
  55. package/dist/preference-store.d.ts +54 -0
  56. package/dist/preference-store.d.ts.map +1 -0
  57. package/dist/preference-store.js +109 -0
  58. package/dist/preservation-gate.d.ts +82 -0
  59. package/dist/preservation-gate.d.ts.map +1 -0
  60. package/dist/preservation-gate.js +150 -0
  61. package/dist/provider-translator.d.ts +40 -0
  62. package/dist/provider-translator.d.ts.map +1 -0
  63. package/dist/provider-translator.js +349 -0
  64. package/dist/rate-limiter.d.ts +76 -0
  65. package/dist/rate-limiter.d.ts.map +1 -0
  66. package/dist/rate-limiter.js +179 -0
  67. package/dist/redis.d.ts +188 -0
  68. package/dist/redis.d.ts.map +1 -0
  69. package/dist/redis.js +534 -0
  70. package/dist/schema.d.ts +15 -0
  71. package/dist/schema.d.ts.map +1 -0
  72. package/dist/schema.js +203 -0
  73. package/dist/secret-scanner.d.ts +51 -0
  74. package/dist/secret-scanner.d.ts.map +1 -0
  75. package/dist/secret-scanner.js +248 -0
  76. package/dist/seed.d.ts +108 -0
  77. package/dist/seed.d.ts.map +1 -0
  78. package/dist/seed.js +177 -0
  79. package/dist/system-store.d.ts +73 -0
  80. package/dist/system-store.d.ts.map +1 -0
  81. package/dist/system-store.js +182 -0
  82. package/dist/topic-store.d.ts +45 -0
  83. package/dist/topic-store.d.ts.map +1 -0
  84. package/dist/topic-store.js +136 -0
  85. package/dist/types.d.ts +329 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +9 -0
  88. package/dist/vector-store.d.ts +132 -0
  89. package/dist/vector-store.d.ts.map +1 -0
  90. package/dist/vector-store.js +498 -0
  91. package/dist/work-store.d.ts +112 -0
  92. package/dist/work-store.d.ts.map +1 -0
  93. package/dist/work-store.js +273 -0
  94. package/package.json +57 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * HyperMem Rate Limiter
3
+ *
4
+ * Token-bucket rate limiter for embedding API calls.
5
+ * Prevents hammering Ollama during bulk indexing.
6
+ *
7
+ * Strategy:
8
+ * - Burst: allow immediate calls up to bucket capacity
9
+ * - Sustained: refill tokens at a steady rate
10
+ * - Backpressure: when tokens exhausted, delay until available
11
+ * - Priority: high-priority requests (user-facing recall) get reserved tokens
12
+ *
13
+ * Usage:
14
+ * const limiter = new RateLimiter({ tokensPerSecond: 5, burstSize: 10 });
15
+ * await limiter.acquire(); // Waits if necessary
16
+ * const embeddings = await generateEmbeddings(texts);
17
+ */
18
+ const DEFAULT_CONFIG = {
19
+ tokensPerSecond: 5,
20
+ burstSize: 10,
21
+ reservedHigh: 2,
22
+ maxWaitMs: 30000,
23
+ };
24
+ export class RateLimiter {
25
+ tokens;
26
+ lastRefill;
27
+ config;
28
+ waitQueue = [];
29
+ refillTimer = null;
30
+ _totalAcquired = 0;
31
+ _totalWaited = 0;
32
+ _totalRejected = 0;
33
+ constructor(config) {
34
+ this.config = { ...DEFAULT_CONFIG, ...config };
35
+ this.tokens = this.config.burstSize;
36
+ this.lastRefill = Date.now();
37
+ // Refill tokens periodically
38
+ this.refillTimer = setInterval(() => this.refill(), 200); // 5x per second
39
+ }
40
+ /**
41
+ * Acquire tokens. Blocks until tokens are available or maxWaitMs expires.
42
+ *
43
+ * @param count - Number of tokens to acquire (default 1)
44
+ * @param priority - Request priority (high gets reserved tokens)
45
+ * @throws Error if wait exceeds maxWaitMs
46
+ */
47
+ async acquire(count = 1, priority = 'normal') {
48
+ this.refill();
49
+ // High priority can use reserved tokens
50
+ const available = priority === 'high'
51
+ ? this.tokens
52
+ : Math.max(0, this.tokens - this.config.reservedHigh);
53
+ if (available >= count) {
54
+ this.tokens -= count;
55
+ this._totalAcquired += count;
56
+ return;
57
+ }
58
+ // Need to wait
59
+ this._totalWaited++;
60
+ const deadline = Date.now() + this.config.maxWaitMs;
61
+ return new Promise((resolve, reject) => {
62
+ this.waitQueue.push({
63
+ resolve,
64
+ reject,
65
+ priority,
66
+ tokensNeeded: count,
67
+ deadline,
68
+ });
69
+ // Sort by priority (high first) then by deadline (earliest first)
70
+ this.waitQueue.sort((a, b) => {
71
+ const priOrder = { high: 0, normal: 1, low: 2 };
72
+ const priDiff = priOrder[a.priority] - priOrder[b.priority];
73
+ if (priDiff !== 0)
74
+ return priDiff;
75
+ return a.deadline - b.deadline;
76
+ });
77
+ });
78
+ }
79
+ /**
80
+ * Try to acquire tokens without waiting.
81
+ * Returns true if tokens were acquired, false if not.
82
+ */
83
+ tryAcquire(count = 1, priority = 'normal') {
84
+ this.refill();
85
+ const available = priority === 'high'
86
+ ? this.tokens
87
+ : Math.max(0, this.tokens - this.config.reservedHigh);
88
+ if (available >= count) {
89
+ this.tokens -= count;
90
+ this._totalAcquired += count;
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ /**
96
+ * Get current limiter state.
97
+ */
98
+ get state() {
99
+ this.refill();
100
+ return {
101
+ availableTokens: Math.floor(this.tokens),
102
+ pendingRequests: this.waitQueue.length,
103
+ stats: {
104
+ acquired: this._totalAcquired,
105
+ waited: this._totalWaited,
106
+ rejected: this._totalRejected,
107
+ },
108
+ };
109
+ }
110
+ /**
111
+ * Stop the refill timer.
112
+ */
113
+ destroy() {
114
+ if (this.refillTimer) {
115
+ clearInterval(this.refillTimer);
116
+ this.refillTimer = null;
117
+ }
118
+ // Reject all pending
119
+ for (const waiter of this.waitQueue) {
120
+ waiter.reject(new Error('Rate limiter destroyed'));
121
+ }
122
+ this.waitQueue = [];
123
+ }
124
+ // ─── Internal ──────────────────────────────────────────────
125
+ refill() {
126
+ const now = Date.now();
127
+ const elapsed = (now - this.lastRefill) / 1000; // seconds
128
+ const newTokens = elapsed * this.config.tokensPerSecond;
129
+ if (newTokens > 0) {
130
+ this.tokens = Math.min(this.config.burstSize, this.tokens + newTokens);
131
+ this.lastRefill = now;
132
+ }
133
+ // Process wait queue
134
+ this.processQueue();
135
+ }
136
+ processQueue() {
137
+ const now = Date.now();
138
+ const toRemove = [];
139
+ for (let i = 0; i < this.waitQueue.length; i++) {
140
+ const waiter = this.waitQueue[i];
141
+ // Check deadline
142
+ if (now > waiter.deadline) {
143
+ waiter.reject(new Error(`Rate limit wait exceeded ${this.config.maxWaitMs}ms`));
144
+ this._totalRejected++;
145
+ toRemove.push(i);
146
+ continue;
147
+ }
148
+ // Check if tokens available
149
+ const available = waiter.priority === 'high'
150
+ ? this.tokens
151
+ : Math.max(0, this.tokens - this.config.reservedHigh);
152
+ if (available >= waiter.tokensNeeded) {
153
+ this.tokens -= waiter.tokensNeeded;
154
+ this._totalAcquired += waiter.tokensNeeded;
155
+ waiter.resolve();
156
+ toRemove.push(i);
157
+ }
158
+ }
159
+ // Remove processed entries (reverse order to maintain indices)
160
+ for (let i = toRemove.length - 1; i >= 0; i--) {
161
+ this.waitQueue.splice(toRemove[i], 1);
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * Rate-limited embedding generator.
167
+ * Wraps generateEmbeddings with rate limiting.
168
+ */
169
+ export function createRateLimitedEmbedder(embedFn, limiter) {
170
+ return async (texts, priority = 'normal') => {
171
+ if (texts.length === 0)
172
+ return [];
173
+ // Each batch counts as 1 token regardless of batch size
174
+ // This limits the number of API calls, not the number of texts
175
+ await limiter.acquire(1, priority);
176
+ return embedFn(texts);
177
+ };
178
+ }
179
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1,188 @@
1
+ /**
2
+ * HyperMem Redis Layer
3
+ *
4
+ * Manages the hot-state compositor cache.
5
+ * Per-agent, per-session keyspace with TTL management.
6
+ * Falls back gracefully when Redis is unavailable.
7
+ */
8
+ import type { RedisConfig, SessionMeta, SessionCursor, StoredMessage, NeutralMessage } from './types.js';
9
+ export declare class RedisLayer {
10
+ private client;
11
+ private readonly config;
12
+ private connected;
13
+ constructor(config?: Partial<RedisConfig>);
14
+ /**
15
+ * Connect to Redis. Non-blocking — operations degrade gracefully if connection fails.
16
+ */
17
+ connect(): Promise<boolean>;
18
+ get isConnected(): boolean;
19
+ private agentKey;
20
+ private sessionKey;
21
+ /**
22
+ * Set the agent's profile in Redis.
23
+ */
24
+ setProfile(agentId: string, profile: Record<string, unknown>): Promise<void>;
25
+ /**
26
+ * Get the agent's profile.
27
+ */
28
+ getProfile(agentId: string): Promise<Record<string, unknown> | null>;
29
+ /**
30
+ * Track active sessions for an agent.
31
+ */
32
+ addActiveSession(agentId: string, sessionKey: string): Promise<void>;
33
+ removeActiveSession(agentId: string, sessionKey: string): Promise<void>;
34
+ getActiveSessions(agentId: string): Promise<string[]>;
35
+ /**
36
+ * Set a session slot value.
37
+ */
38
+ setSlot(agentId: string, sessionKey: string, slot: string, value: string): Promise<void>;
39
+ /**
40
+ * Get a session slot value.
41
+ */
42
+ getSlot(agentId: string, sessionKey: string, slot: string): Promise<string | null>;
43
+ /**
44
+ * Set session metadata.
45
+ */
46
+ setSessionMeta(agentId: string, sessionKey: string, meta: SessionMeta): Promise<void>;
47
+ /**
48
+ * Get session metadata.
49
+ */
50
+ getSessionMeta(agentId: string, sessionKey: string): Promise<SessionMeta | null>;
51
+ /**
52
+ * Push messages to the session history list.
53
+ *
54
+ * History retention strategy:
55
+ * - No aggressive LTRIM. Cap at maxMessages (default 250) to prevent
56
+ * unbounded growth, but the real budget enforcement happens in the
57
+ * compositor at compose time.
58
+ * - TTL is historyTTL (default 24h), not sessionTTL. History outlives
59
+ * other session slots because it's the primary context source.
60
+ * - System/identity slots are refreshed on every warmSession() call,
61
+ * so they effectively never expire during an active session.
62
+ */
63
+ pushHistory(agentId: string, sessionKey: string, messages: StoredMessage[], maxMessages?: number): Promise<void>;
64
+ /**
65
+ * Get session history from Redis.
66
+ *
67
+ * @param limit - When provided, return only the last N messages using
68
+ * negative indexing (LRANGE -limit -1). This is the correct enforcement
69
+ * point for historyDepth — previously the limit param was ignored on the
70
+ * Redis path and only applied to the SQLite fallback.
71
+ */
72
+ getHistory(agentId: string, sessionKey: string, limit?: number): Promise<StoredMessage[]>;
73
+ /**
74
+ * Check whether a session already has history in Redis.
75
+ * Used by the bootstrap idempotency guard to avoid re-warming hot sessions.
76
+ *
77
+ * Single EXISTS call — sub-millisecond, no data transferred.
78
+ */
79
+ sessionExists(agentId: string, sessionKey: string): Promise<boolean>;
80
+ /**
81
+ * Trim Redis history to fit within a token budget.
82
+ *
83
+ * Walks the history newest→oldest, accumulating estimated tokens.
84
+ * When the budget is exceeded, trims everything older via LTRIM.
85
+ * This is the guardrail against model switches: if an agent ran on a
86
+ * 1M-context model and accumulated a huge history, then switched to a
87
+ * 120K model, the first assemble() call trims the excess.
88
+ *
89
+ * Token estimation: text at length/4, tool JSON at length/2 (dense).
90
+ *
91
+ * @returns Number of messages trimmed, or 0 if already within budget.
92
+ */
93
+ trimHistoryToTokenBudget(agentId: string, sessionKey: string, tokenBudget: number): Promise<number>;
94
+ /**
95
+ * Cache the compositor's assembled submission window.
96
+ *
97
+ * The window is the token-budgeted, deduplicated output of compose() —
98
+ * what actually gets sent to the provider. Separate from history (the
99
+ * append-only archive). Short TTL: 120s default, refreshed each compose.
100
+ */
101
+ setWindow(agentId: string, sessionKey: string, messages: NeutralMessage[], ttlSeconds?: number): Promise<void>;
102
+ /**
103
+ * Get the cached submission window.
104
+ * Returns null on cache miss — caller should run full compose().
105
+ */
106
+ getWindow(agentId: string, sessionKey: string): Promise<NeutralMessage[] | null>;
107
+ /**
108
+ * Invalidate the submission window cache.
109
+ * Called after afterTurn ingest writes new messages — ensures the next
110
+ * compose() runs fresh instead of serving a stale cached window.
111
+ */
112
+ invalidateWindow(agentId: string, sessionKey: string): Promise<void>;
113
+ /**
114
+ * Write the session cursor after compose().
115
+ * Tracks the boundary between "LLM has seen this" and "new since last compose."
116
+ * TTL matches history (24h) so the cursor outlives the window cache.
117
+ */
118
+ setCursor(agentId: string, sessionKey: string, cursor: SessionCursor): Promise<void>;
119
+ /**
120
+ * Get the session cursor.
121
+ * Returns null if no cursor exists (first compose, or Redis eviction).
122
+ */
123
+ getCursor(agentId: string, sessionKey: string): Promise<SessionCursor | null>;
124
+ /**
125
+ * Warm all slots for a session at once.
126
+ */
127
+ warmSession(agentId: string, sessionKey: string, slots: {
128
+ system?: string;
129
+ identity?: string;
130
+ context?: string;
131
+ facts?: string;
132
+ tools?: string;
133
+ meta?: SessionMeta;
134
+ history?: StoredMessage[];
135
+ }): Promise<void>;
136
+ /**
137
+ * Evict all keys for a session.
138
+ */
139
+ evictSession(agentId: string, sessionKey: string): Promise<void>;
140
+ /**
141
+ * Refresh TTL on all session keys.
142
+ * Uses historyTTL for the history slot, sessionTTL for everything else.
143
+ */
144
+ touchSession(agentId: string, sessionKey: string): Promise<void>;
145
+ /**
146
+ * Flush all keys matching this instance's prefix. For testing only.
147
+ */
148
+ flushPrefix(): Promise<number>;
149
+ /**
150
+ * Cache a fleet-level value. Used for library data that's read frequently.
151
+ * TTL defaults to 10 minutes — short enough to pick up changes, long enough
152
+ * to avoid hammering SQLite on every heartbeat.
153
+ */
154
+ setFleetCache(key: string, value: string, ttl?: number): Promise<void>;
155
+ /**
156
+ * Get a fleet-level cached value.
157
+ */
158
+ getFleetCache(key: string): Promise<string | null>;
159
+ /**
160
+ * Delete a fleet-level cached value.
161
+ */
162
+ delFleetCache(key: string): Promise<void>;
163
+ /**
164
+ * Cache a fleet agent's full profile (fleet registry + capabilities + desired state).
165
+ * Structured so a single key read gives the dashboard everything it needs.
166
+ */
167
+ cacheFleetAgent(agentId: string, data: Record<string, unknown>): Promise<void>;
168
+ /**
169
+ * Get a cached fleet agent profile.
170
+ */
171
+ getCachedFleetAgent(agentId: string): Promise<Record<string, unknown> | null>;
172
+ /**
173
+ * Cache the fleet summary (agent count, drift count, etc.).
174
+ * Short TTL — recalculated frequently.
175
+ */
176
+ cacheFleetSummary(summary: Record<string, unknown>): Promise<void>;
177
+ /**
178
+ * Get the cached fleet summary.
179
+ */
180
+ getCachedFleetSummary(): Promise<Record<string, unknown> | null>;
181
+ /**
182
+ * Invalidate all fleet cache entries for a specific agent.
183
+ * Call after mutations to fleet registry / desired state.
184
+ */
185
+ invalidateFleetAgent(agentId: string): Promise<void>;
186
+ disconnect(): Promise<void>;
187
+ }
188
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../src/redis.ts"],"names":[],"mappings":"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"}