@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.
- package/README.md +54 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +6 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/local-cache.d.ts +72 -0
- package/dist/cache/local-cache.d.ts.map +1 -0
- package/dist/cache/local-cache.js +227 -0
- package/dist/cache/local-cache.js.map +1 -0
- package/dist/cache/session-storage.d.ts +76 -0
- package/dist/cache/session-storage.d.ts.map +1 -0
- package/dist/cache/session-storage.js +237 -0
- package/dist/cache/session-storage.js.map +1 -0
- package/dist/client/ace-client.d.ts +199 -0
- package/dist/client/ace-client.d.ts.map +1 -0
- package/dist/client/ace-client.js +454 -0
- package/dist/client/ace-client.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config/context.d.ts +48 -0
- package/dist/config/context.d.ts.map +1 -0
- package/dist/config/context.js +147 -0
- package/dist/config/context.js.map +1 -0
- package/dist/config/helpers.d.ts +79 -0
- package/dist/config/helpers.d.ts.map +1 -0
- package/dist/config/helpers.js +173 -0
- package/dist/config/helpers.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +58 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +275 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/migration.d.ts +29 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +137 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/xdg.d.ts +62 -0
- package/dist/config/xdg.d.ts.map +1 -0
- package/dist/config/xdg.js +168 -0
- package/dist/config/xdg.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/index.d.ts +6 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +5 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/interface.d.ts +73 -0
- package/dist/logger/interface.d.ts.map +1 -0
- package/dist/logger/interface.js +11 -0
- package/dist/logger/interface.js.map +1 -0
- package/dist/logger/noop.d.ts +32 -0
- package/dist/logger/noop.d.ts.map +1 -0
- package/dist/logger/noop.js +53 -0
- package/dist/logger/noop.js.map +1 -0
- package/dist/types/config.d.ts +94 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +26 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pattern.d.ts +246 -0
- package/dist/types/pattern.d.ts.map +1 -0
- package/dist/types/pattern.js +22 -0
- package/dist/types/pattern.js.map +1 -0
- package/dist/utils/code-extractor.d.ts +34 -0
- package/dist/utils/code-extractor.d.ts.map +1 -0
- package/dist/utils/code-extractor.js +116 -0
- package/dist/utils/code-extractor.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/semver.d.ts +41 -0
- package/dist/utils/semver.d.ts.map +1 -0
- package/dist/utils/semver.js +90 -0
- package/dist/utils/semver.js.map +1 -0
- 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
|
+
[](https://www.npmjs.com/package/@ace-sdk/core)
|
|
6
|
+
[](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 @@
|
|
|
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"}
|