@ace-sdk/core 1.0.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 (86) hide show
  1. package/README.md +54 -0
  2. package/dist/cache/index.d.ts +8 -0
  3. package/dist/cache/index.d.ts.map +1 -0
  4. package/dist/cache/index.js +6 -0
  5. package/dist/cache/index.js.map +1 -0
  6. package/dist/cache/local-cache.d.ts +72 -0
  7. package/dist/cache/local-cache.d.ts.map +1 -0
  8. package/dist/cache/local-cache.js +227 -0
  9. package/dist/cache/local-cache.js.map +1 -0
  10. package/dist/cache/session-storage.d.ts +76 -0
  11. package/dist/cache/session-storage.d.ts.map +1 -0
  12. package/dist/cache/session-storage.js +237 -0
  13. package/dist/cache/session-storage.js.map +1 -0
  14. package/dist/client/ace-client.d.ts +199 -0
  15. package/dist/client/ace-client.d.ts.map +1 -0
  16. package/dist/client/ace-client.js +454 -0
  17. package/dist/client/ace-client.js.map +1 -0
  18. package/dist/client/index.d.ts +6 -0
  19. package/dist/client/index.d.ts.map +1 -0
  20. package/dist/client/index.js +5 -0
  21. package/dist/client/index.js.map +1 -0
  22. package/dist/config/context.d.ts +48 -0
  23. package/dist/config/context.d.ts.map +1 -0
  24. package/dist/config/context.js +147 -0
  25. package/dist/config/context.js.map +1 -0
  26. package/dist/config/helpers.d.ts +79 -0
  27. package/dist/config/helpers.d.ts.map +1 -0
  28. package/dist/config/helpers.js +173 -0
  29. package/dist/config/helpers.js.map +1 -0
  30. package/dist/config/index.d.ts +10 -0
  31. package/dist/config/index.d.ts.map +1 -0
  32. package/dist/config/index.js +9 -0
  33. package/dist/config/index.js.map +1 -0
  34. package/dist/config/loader.d.ts +58 -0
  35. package/dist/config/loader.d.ts.map +1 -0
  36. package/dist/config/loader.js +275 -0
  37. package/dist/config/loader.js.map +1 -0
  38. package/dist/config/migration.d.ts +29 -0
  39. package/dist/config/migration.d.ts.map +1 -0
  40. package/dist/config/migration.js +137 -0
  41. package/dist/config/migration.js.map +1 -0
  42. package/dist/config/xdg.d.ts +62 -0
  43. package/dist/config/xdg.d.ts.map +1 -0
  44. package/dist/config/xdg.js +168 -0
  45. package/dist/config/xdg.js.map +1 -0
  46. package/dist/index.d.ts +32 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +50 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/logger/index.d.ts +6 -0
  51. package/dist/logger/index.d.ts.map +1 -0
  52. package/dist/logger/index.js +5 -0
  53. package/dist/logger/index.js.map +1 -0
  54. package/dist/logger/interface.d.ts +73 -0
  55. package/dist/logger/interface.d.ts.map +1 -0
  56. package/dist/logger/interface.js +11 -0
  57. package/dist/logger/interface.js.map +1 -0
  58. package/dist/logger/noop.d.ts +32 -0
  59. package/dist/logger/noop.d.ts.map +1 -0
  60. package/dist/logger/noop.js +53 -0
  61. package/dist/logger/noop.js.map +1 -0
  62. package/dist/types/config.d.ts +94 -0
  63. package/dist/types/config.d.ts.map +1 -0
  64. package/dist/types/config.js +26 -0
  65. package/dist/types/config.js.map +1 -0
  66. package/dist/types/index.d.ts +8 -0
  67. package/dist/types/index.d.ts.map +1 -0
  68. package/dist/types/index.js +6 -0
  69. package/dist/types/index.js.map +1 -0
  70. package/dist/types/pattern.d.ts +246 -0
  71. package/dist/types/pattern.d.ts.map +1 -0
  72. package/dist/types/pattern.js +22 -0
  73. package/dist/types/pattern.js.map +1 -0
  74. package/dist/utils/code-extractor.d.ts +34 -0
  75. package/dist/utils/code-extractor.d.ts.map +1 -0
  76. package/dist/utils/code-extractor.js +116 -0
  77. package/dist/utils/code-extractor.js.map +1 -0
  78. package/dist/utils/index.d.ts +8 -0
  79. package/dist/utils/index.d.ts.map +1 -0
  80. package/dist/utils/index.js +6 -0
  81. package/dist/utils/index.js.map +1 -0
  82. package/dist/utils/semver.d.ts +41 -0
  83. package/dist/utils/semver.d.ts.map +1 -0
  84. package/dist/utils/semver.js +90 -0
  85. package/dist/utils/semver.js.map +1 -0
  86. package/package.json +58 -0
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # @ace-sdk/core
2
+
3
+ Core ACE client library for pattern learning.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@ace-sdk/core.svg)](https://www.npmjs.com/package/@ace-sdk/core)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install @ace-sdk/core
12
+ ```
13
+
14
+ ## Features
15
+
16
+ - **ACE Client**: HTTP client for ACE Server API
17
+ - **3-Tier Caching**: RAM → SQLite → Server for optimal performance
18
+ - **Configuration**: Flexible config resolution (CLI args → env vars → files)
19
+ - **TypeScript Types**: Full type definitions for patterns, playbooks, API responses
20
+
21
+ ## Quick Start
22
+
23
+ ```typescript
24
+ import { ACEClient, createContext } from '@ace-sdk/core';
25
+
26
+ // Create context from environment
27
+ const context = await createContext({
28
+ org: process.env.ACE_ORG_ID,
29
+ project: process.env.ACE_PROJECT_ID
30
+ });
31
+
32
+ // Initialize client
33
+ const client = new ACEClient(context);
34
+
35
+ // Fetch playbook
36
+ const playbook = await client.getPlaybook();
37
+ console.log(`Loaded ${playbook.patterns.length} patterns`);
38
+
39
+ // Search for relevant patterns
40
+ const results = await client.search('authentication patterns');
41
+ ```
42
+
43
+ ## Used By
44
+
45
+ - **@ace-sdk/cli** - Command-line tool
46
+ - **@ace-sdk/mcp** - MCP Server for any MCP-compatible client
47
+
48
+ ## Documentation
49
+
50
+ Full documentation: [packages/core/docs](./docs)
51
+
52
+ ## License
53
+
54
+ MIT © [CE.NET Team](mailto:ace@code-engine.net)
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Cache exports for @ace-sdk/core
3
+ */
4
+ export { LocalCacheService } from './local-cache.js';
5
+ export type { CacheConfig } from './local-cache.js';
6
+ export { SessionStorage } from './session-storage.js';
7
+ export type { SessionStorageConfig, SessionPin, SessionPinResult } from './session-storage.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EACV,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EACjB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Cache exports for @ace-sdk/core
3
+ */
4
+ export { LocalCacheService } from './local-cache.js';
5
+ export { SessionStorage } from './session-storage.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * LocalCacheService - Client-side SQLite cache
3
+ *
4
+ * Architecture:
5
+ * - Location: ./.ace-cache/{org_id}_{project_id}.db (project directory)
6
+ * OR ~/.ace-cache/ (home directory, for production)
7
+ * - Purpose: Fast local cache, survives restarts
8
+ * - TTL: 5 minutes (configurable)
9
+ * - Source of truth: Remote server (ChromaDB)
10
+ *
11
+ * @package @ace-sdk/core
12
+ */
13
+ import { StructuredPlaybook } from '../types/pattern.js';
14
+ import { ILogger } from '../logger/index.js';
15
+ export interface CacheConfig {
16
+ orgId: string;
17
+ projectId: string;
18
+ ttlMinutes?: number;
19
+ cacheDir?: string;
20
+ }
21
+ export declare class LocalCacheService {
22
+ private db;
23
+ private ttlMs;
24
+ private cacheDir;
25
+ private logger;
26
+ constructor(config: CacheConfig, logger?: ILogger);
27
+ /**
28
+ * Initialize SQLite schema
29
+ */
30
+ private initializeSchema;
31
+ /**
32
+ * Get cached playbook (if fresh)
33
+ */
34
+ getPlaybook(): StructuredPlaybook | null;
35
+ /**
36
+ * Save playbook to cache
37
+ */
38
+ savePlaybook(playbook: StructuredPlaybook): void;
39
+ /**
40
+ * Check if cache needs sync (>TTL)
41
+ */
42
+ needsSync(): boolean;
43
+ /**
44
+ * Get cached embedding (if exists)
45
+ */
46
+ getEmbedding(content: string): number[] | null;
47
+ /**
48
+ * Cache embedding
49
+ */
50
+ cacheEmbedding(content: string, embedding: number[]): void;
51
+ /**
52
+ * Get sync state value
53
+ */
54
+ getSyncState(key: string): string | null;
55
+ /**
56
+ * Set sync state value
57
+ */
58
+ setSyncState(key: string, value: string): void;
59
+ /**
60
+ * Clear entire cache
61
+ */
62
+ clear(): void;
63
+ /**
64
+ * Hash content for embedding cache key
65
+ */
66
+ private hashContent;
67
+ /**
68
+ * Close database connection
69
+ */
70
+ close(): void;
71
+ }
72
+ //# sourceMappingURL=local-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-cache.d.ts","sourceRoot":"","sources":["../../src/cache/local-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,kBAAkB,EAAkB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO;IAoBjD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4CxB;;OAEG;IACH,WAAW,IAAI,kBAAkB,GAAG,IAAI;IA0CxC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IA2ChD;;OAEG;IACH,SAAS,IAAI,OAAO;IAYpB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAqB9C;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAa1D;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9C;;OAEG;IACH,KAAK,IAAI,IAAI;IAUb;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * LocalCacheService - Client-side SQLite cache
3
+ *
4
+ * Architecture:
5
+ * - Location: ./.ace-cache/{org_id}_{project_id}.db (project directory)
6
+ * OR ~/.ace-cache/ (home directory, for production)
7
+ * - Purpose: Fast local cache, survives restarts
8
+ * - TTL: 5 minutes (configurable)
9
+ * - Source of truth: Remote server (ChromaDB)
10
+ *
11
+ * @package @ace-sdk/core
12
+ */
13
+ import Database from 'better-sqlite3';
14
+ import { join } from 'path';
15
+ import { mkdirSync, existsSync } from 'fs';
16
+ import { createHash } from 'crypto';
17
+ export class LocalCacheService {
18
+ db;
19
+ ttlMs;
20
+ cacheDir;
21
+ logger;
22
+ constructor(config, logger) {
23
+ const { orgId, projectId, ttlMinutes = 5, cacheDir } = config;
24
+ this.logger = logger;
25
+ // Cache directory: Use provided cacheDir, or default to ./.ace-cache (project directory)
26
+ // For production, pass cacheDir: join(homedir(), '.ace-cache')
27
+ this.cacheDir = cacheDir || join(process.cwd(), '.ace-cache');
28
+ if (!existsSync(this.cacheDir)) {
29
+ mkdirSync(this.cacheDir, { recursive: true });
30
+ }
31
+ // Database file: {org_id}_{project_id}.db
32
+ const dbPath = join(this.cacheDir, `${orgId}_${projectId}.db`);
33
+ this.db = new Database(dbPath);
34
+ this.ttlMs = ttlMinutes * 60 * 1000;
35
+ this.initializeSchema();
36
+ }
37
+ /**
38
+ * Initialize SQLite schema
39
+ */
40
+ initializeSchema() {
41
+ // Table: playbook_bullets (cached from server)
42
+ this.db.exec(`
43
+ CREATE TABLE IF NOT EXISTS playbook_bullets (
44
+ id TEXT PRIMARY KEY,
45
+ section TEXT NOT NULL,
46
+ content TEXT NOT NULL,
47
+ helpful INTEGER DEFAULT 0,
48
+ harmful INTEGER DEFAULT 0,
49
+ confidence REAL DEFAULT 0.5,
50
+ observations INTEGER DEFAULT 0,
51
+ evidence TEXT,
52
+ created_at TEXT DEFAULT CURRENT_TIMESTAMP,
53
+ last_used TEXT DEFAULT CURRENT_TIMESTAMP,
54
+ synced_at TEXT
55
+ );
56
+
57
+ CREATE INDEX IF NOT EXISTS idx_section ON playbook_bullets(section);
58
+ CREATE INDEX IF NOT EXISTS idx_confidence ON playbook_bullets(confidence);
59
+ CREATE INDEX IF NOT EXISTS idx_helpful ON playbook_bullets(helpful DESC);
60
+ `);
61
+ // Table: embedding_cache (avoid re-computing)
62
+ this.db.exec(`
63
+ CREATE TABLE IF NOT EXISTS embedding_cache (
64
+ content_hash TEXT PRIMARY KEY,
65
+ embedding BLOB NOT NULL,
66
+ created_at TEXT NOT NULL
67
+ );
68
+ `);
69
+ // Table: sync_state (metadata)
70
+ this.db.exec(`
71
+ CREATE TABLE IF NOT EXISTS sync_state (
72
+ key TEXT PRIMARY KEY,
73
+ value TEXT NOT NULL,
74
+ updated_at TEXT NOT NULL
75
+ );
76
+ `);
77
+ // Enable WAL mode for better concurrent access performance
78
+ this.db.pragma('journal_mode = WAL');
79
+ }
80
+ /**
81
+ * Get cached playbook (if fresh)
82
+ */
83
+ getPlaybook() {
84
+ if (this.needsSync()) {
85
+ return null; // Cache stale
86
+ }
87
+ const bullets = this.db.prepare(`
88
+ SELECT * FROM playbook_bullets
89
+ `).all();
90
+ if (bullets.length === 0) {
91
+ return null; // No cache
92
+ }
93
+ // Group by section
94
+ const playbook = {
95
+ strategies_and_hard_rules: [],
96
+ useful_code_snippets: [],
97
+ troubleshooting_and_pitfalls: [],
98
+ apis_to_use: []
99
+ };
100
+ for (const row of bullets) {
101
+ const bullet = {
102
+ id: row.id,
103
+ section: row.section,
104
+ content: row.content,
105
+ helpful: row.helpful,
106
+ harmful: row.harmful,
107
+ confidence: row.confidence,
108
+ observations: row.observations,
109
+ evidence: row.evidence ? JSON.parse(row.evidence) : [],
110
+ created_at: row.created_at,
111
+ last_used: row.last_used
112
+ };
113
+ playbook[bullet.section].push(bullet);
114
+ }
115
+ this.logger?.debug('Cache hit (SQLite)');
116
+ return playbook;
117
+ }
118
+ /**
119
+ * Save playbook to cache
120
+ */
121
+ savePlaybook(playbook) {
122
+ const now = new Date().toISOString();
123
+ // Clear old data
124
+ this.db.prepare('DELETE FROM playbook_bullets').run();
125
+ // Insert all bullets
126
+ const insert = this.db.prepare(`
127
+ INSERT INTO playbook_bullets (
128
+ id, section, content, helpful, harmful, confidence,
129
+ observations, evidence, created_at, last_used, synced_at
130
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
131
+ `);
132
+ const insertMany = this.db.transaction((bullets, section) => {
133
+ for (const bullet of bullets) {
134
+ insert.run(bullet.id, section, bullet.content, bullet.helpful, bullet.harmful, bullet.confidence, bullet.observations, JSON.stringify(bullet.evidence), bullet.created_at || now, bullet.last_used || now, now);
135
+ }
136
+ });
137
+ insertMany(playbook.strategies_and_hard_rules, 'strategies_and_hard_rules');
138
+ insertMany(playbook.useful_code_snippets, 'useful_code_snippets');
139
+ insertMany(playbook.troubleshooting_and_pitfalls, 'troubleshooting_and_pitfalls');
140
+ insertMany(playbook.apis_to_use, 'apis_to_use');
141
+ // Update sync state
142
+ this.setSyncState('last_sync', now);
143
+ this.logger?.debug('Playbook cached to SQLite');
144
+ }
145
+ /**
146
+ * Check if cache needs sync (>TTL)
147
+ */
148
+ needsSync() {
149
+ const lastSync = this.getSyncState('last_sync');
150
+ if (!lastSync) {
151
+ return true; // No sync yet
152
+ }
153
+ const lastSyncTime = new Date(lastSync).getTime();
154
+ const now = Date.now();
155
+ return (now - lastSyncTime) > this.ttlMs;
156
+ }
157
+ /**
158
+ * Get cached embedding (if exists)
159
+ */
160
+ getEmbedding(content) {
161
+ const hash = this.hashContent(content);
162
+ const row = this.db.prepare(`
163
+ SELECT embedding FROM embedding_cache WHERE content_hash = ?
164
+ `).get(hash);
165
+ if (!row) {
166
+ return null;
167
+ }
168
+ // Deserialize Float32Array from buffer
169
+ const float32 = new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4);
170
+ return Array.from(float32);
171
+ }
172
+ /**
173
+ * Cache embedding
174
+ */
175
+ cacheEmbedding(content, embedding) {
176
+ const hash = this.hashContent(content);
177
+ // Serialize Float32Array to buffer
178
+ const float32 = new Float32Array(embedding);
179
+ const buffer = Buffer.from(float32.buffer);
180
+ this.db.prepare(`
181
+ INSERT OR REPLACE INTO embedding_cache (content_hash, embedding, created_at)
182
+ VALUES (?, ?, ?)
183
+ `).run(hash, buffer, new Date().toISOString());
184
+ }
185
+ /**
186
+ * Get sync state value
187
+ */
188
+ getSyncState(key) {
189
+ const row = this.db.prepare(`
190
+ SELECT value FROM sync_state WHERE key = ?
191
+ `).get(key);
192
+ return row?.value || null;
193
+ }
194
+ /**
195
+ * Set sync state value
196
+ */
197
+ setSyncState(key, value) {
198
+ this.db.prepare(`
199
+ INSERT OR REPLACE INTO sync_state (key, value, updated_at)
200
+ VALUES (?, ?, ?)
201
+ `).run(key, value, new Date().toISOString());
202
+ }
203
+ /**
204
+ * Clear entire cache
205
+ */
206
+ clear() {
207
+ this.db.exec(`
208
+ DELETE FROM playbook_bullets;
209
+ DELETE FROM embedding_cache;
210
+ DELETE FROM sync_state;
211
+ `);
212
+ this.logger?.debug('Cache cleared');
213
+ }
214
+ /**
215
+ * Hash content for embedding cache key
216
+ */
217
+ hashContent(content) {
218
+ return createHash('sha256').update(content).digest('hex');
219
+ }
220
+ /**
221
+ * Close database connection
222
+ */
223
+ close() {
224
+ this.db.close();
225
+ }
226
+ }
227
+ //# sourceMappingURL=local-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-cache.js","sourceRoot":"","sources":["../../src/cache/local-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Session Storage - Persistent pattern pinning for context compaction
3
+ *
4
+ * Allows patterns retrieved during UserPromptSubmit hook to be "pinned" to a session
5
+ * and later recalled during PreCompact hook without redundant server calls.
6
+ *
7
+ * Storage: ~/.ace-cache/sessions.db (SQLite)
8
+ * TTL: 24 hours (survives cache expiry)
9
+ *
10
+ * @package @ace-sdk/core
11
+ */
12
+ import { PlaybookBullet } from '../types/pattern.js';
13
+ import { ILogger } from '../logger/index.js';
14
+ export interface SessionPin {
15
+ sessionId: string;
16
+ query: string;
17
+ threshold: number;
18
+ topK: number;
19
+ patterns: PlaybookBullet[];
20
+ createdAt: number;
21
+ expiresAt: number;
22
+ }
23
+ export interface SessionPinResult {
24
+ similar_patterns: PlaybookBullet[];
25
+ count: number;
26
+ threshold: number;
27
+ top_k: number;
28
+ session_id: string;
29
+ pinned_at: number;
30
+ expires_at: number;
31
+ }
32
+ export interface SessionStorageConfig {
33
+ cacheDir?: string;
34
+ }
35
+ export declare class SessionStorage {
36
+ private db;
37
+ private dbPath;
38
+ private logger;
39
+ private static readonly SESSION_TTL_MS;
40
+ constructor(config?: SessionStorageConfig, logger?: ILogger);
41
+ /**
42
+ * Initialize session storage database
43
+ */
44
+ initialize(): Promise<void>;
45
+ /**
46
+ * Pin patterns to a session
47
+ */
48
+ pinSession(sessionId: string, query: string, patterns: PlaybookBullet[], threshold: number, topK: number): Promise<void>;
49
+ /**
50
+ * Recall patterns for a session
51
+ */
52
+ recallSession(sessionId: string): Promise<SessionPinResult | null>;
53
+ /**
54
+ * Delete a specific session
55
+ */
56
+ deleteSession(sessionId: string): Promise<boolean>;
57
+ /**
58
+ * Cleanup expired sessions (called on initialization and periodically)
59
+ */
60
+ cleanupExpiredSessions(): Promise<number>;
61
+ /**
62
+ * List all active sessions
63
+ */
64
+ listSessions(): Promise<Array<{
65
+ sessionId: string;
66
+ query: string;
67
+ patternCount: number;
68
+ createdAt: number;
69
+ expiresAt: number;
70
+ }>>;
71
+ /**
72
+ * Close database connection
73
+ */
74
+ close(): void;
75
+ }
76
+ //# sourceMappingURL=session-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../../src/cache/session-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAuB;gBAEjD,MAAM,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,OAAO;IAY3D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CjC;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAoDxE;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBxD;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAqB/C;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IAmCH;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd"}