@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
|
@@ -0,0 +1,237 @@
|
|
|
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 Database from 'better-sqlite3';
|
|
13
|
+
import { homedir } from 'os';
|
|
14
|
+
import { join } from 'path';
|
|
15
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
16
|
+
export class SessionStorage {
|
|
17
|
+
db = null;
|
|
18
|
+
dbPath;
|
|
19
|
+
logger;
|
|
20
|
+
static SESSION_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
21
|
+
constructor(config, logger) {
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
// Session storage path: ~/.ace-cache/sessions.db (or custom cacheDir)
|
|
24
|
+
const cacheDir = config?.cacheDir || join(homedir(), '.ace-cache');
|
|
25
|
+
if (!existsSync(cacheDir)) {
|
|
26
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
this.dbPath = join(cacheDir, 'sessions.db');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize session storage database
|
|
32
|
+
*/
|
|
33
|
+
async initialize() {
|
|
34
|
+
try {
|
|
35
|
+
this.db = new Database(this.dbPath);
|
|
36
|
+
// Create sessions table
|
|
37
|
+
this.db.exec(`
|
|
38
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
39
|
+
session_id TEXT PRIMARY KEY,
|
|
40
|
+
query TEXT NOT NULL,
|
|
41
|
+
threshold REAL NOT NULL,
|
|
42
|
+
top_k INTEGER NOT NULL,
|
|
43
|
+
created_at INTEGER NOT NULL,
|
|
44
|
+
expires_at INTEGER NOT NULL
|
|
45
|
+
)
|
|
46
|
+
`);
|
|
47
|
+
// Create session_patterns table
|
|
48
|
+
this.db.exec(`
|
|
49
|
+
CREATE TABLE IF NOT EXISTS session_patterns (
|
|
50
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
51
|
+
session_id TEXT NOT NULL,
|
|
52
|
+
pattern_data TEXT NOT NULL,
|
|
53
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
|
|
54
|
+
)
|
|
55
|
+
`);
|
|
56
|
+
// Create index for faster lookups
|
|
57
|
+
this.db.exec(`
|
|
58
|
+
CREATE INDEX IF NOT EXISTS idx_session_expires
|
|
59
|
+
ON sessions(expires_at)
|
|
60
|
+
`);
|
|
61
|
+
// Cleanup expired sessions on initialization
|
|
62
|
+
await this.cleanupExpiredSessions();
|
|
63
|
+
this.logger?.debug(`Session storage initialized: ${this.dbPath}`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
this.logger?.error(`Failed to initialize session storage`, error);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Pin patterns to a session
|
|
72
|
+
*/
|
|
73
|
+
async pinSession(sessionId, query, patterns, threshold, topK) {
|
|
74
|
+
if (!this.db) {
|
|
75
|
+
throw new Error('Session storage not initialized');
|
|
76
|
+
}
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const expiresAt = now + SessionStorage.SESSION_TTL_MS;
|
|
79
|
+
try {
|
|
80
|
+
// Start transaction
|
|
81
|
+
const insertSession = this.db.prepare(`
|
|
82
|
+
INSERT OR REPLACE INTO sessions
|
|
83
|
+
(session_id, query, threshold, top_k, created_at, expires_at)
|
|
84
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
85
|
+
`);
|
|
86
|
+
const insertPattern = this.db.prepare(`
|
|
87
|
+
INSERT INTO session_patterns (session_id, pattern_data)
|
|
88
|
+
VALUES (?, ?)
|
|
89
|
+
`);
|
|
90
|
+
// Delete existing patterns for this session (if replacing)
|
|
91
|
+
this.db.prepare('DELETE FROM session_patterns WHERE session_id = ?').run(sessionId);
|
|
92
|
+
// Insert session metadata
|
|
93
|
+
insertSession.run(sessionId, query, threshold, topK, now, expiresAt);
|
|
94
|
+
// Insert patterns
|
|
95
|
+
for (const pattern of patterns) {
|
|
96
|
+
insertPattern.run(sessionId, JSON.stringify(pattern));
|
|
97
|
+
}
|
|
98
|
+
this.logger?.debug(`Pinned ${patterns.length} patterns to session: ${sessionId} (expires in 24h)`);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
this.logger?.error(`Failed to pin session ${sessionId}`, error);
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Recall patterns for a session
|
|
107
|
+
*/
|
|
108
|
+
async recallSession(sessionId) {
|
|
109
|
+
if (!this.db) {
|
|
110
|
+
throw new Error('Session storage not initialized');
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
// Get session metadata
|
|
114
|
+
const session = this.db.prepare(`
|
|
115
|
+
SELECT * FROM sessions WHERE session_id = ?
|
|
116
|
+
`).get(sessionId);
|
|
117
|
+
if (!session) {
|
|
118
|
+
this.logger?.debug(`Session not found: ${sessionId}`);
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// Check if expired
|
|
122
|
+
const now = Date.now();
|
|
123
|
+
if (now > session.expires_at) {
|
|
124
|
+
this.logger?.debug(`Session expired: ${sessionId}`);
|
|
125
|
+
// Cleanup expired session
|
|
126
|
+
this.db.prepare('DELETE FROM sessions WHERE session_id = ?').run(sessionId);
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
// Get patterns
|
|
130
|
+
const patternRows = this.db.prepare(`
|
|
131
|
+
SELECT pattern_data FROM session_patterns WHERE session_id = ?
|
|
132
|
+
`).all(sessionId);
|
|
133
|
+
const patterns = patternRows.map(row => JSON.parse(row.pattern_data));
|
|
134
|
+
this.logger?.debug(`Recalled ${patterns.length} patterns from session: ${sessionId} ` +
|
|
135
|
+
`(expires in ${Math.round((session.expires_at - now) / 1000 / 60 / 60)}h)`);
|
|
136
|
+
return {
|
|
137
|
+
similar_patterns: patterns,
|
|
138
|
+
count: patterns.length,
|
|
139
|
+
threshold: session.threshold,
|
|
140
|
+
top_k: session.top_k,
|
|
141
|
+
session_id: sessionId,
|
|
142
|
+
pinned_at: session.created_at,
|
|
143
|
+
expires_at: session.expires_at
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
this.logger?.error(`Failed to recall session ${sessionId}`, error);
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Delete a specific session
|
|
153
|
+
*/
|
|
154
|
+
async deleteSession(sessionId) {
|
|
155
|
+
if (!this.db) {
|
|
156
|
+
throw new Error('Session storage not initialized');
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const result = this.db.prepare('DELETE FROM sessions WHERE session_id = ?').run(sessionId);
|
|
160
|
+
const deleted = result.changes > 0;
|
|
161
|
+
if (deleted) {
|
|
162
|
+
this.logger?.debug(`Deleted session: ${sessionId}`);
|
|
163
|
+
}
|
|
164
|
+
return deleted;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
this.logger?.error(`Failed to delete session ${sessionId}`, error);
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Cleanup expired sessions (called on initialization and periodically)
|
|
173
|
+
*/
|
|
174
|
+
async cleanupExpiredSessions() {
|
|
175
|
+
if (!this.db) {
|
|
176
|
+
throw new Error('Session storage not initialized');
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const now = Date.now();
|
|
180
|
+
const result = this.db.prepare('DELETE FROM sessions WHERE expires_at < ?').run(now);
|
|
181
|
+
const deletedCount = result.changes;
|
|
182
|
+
if (deletedCount > 0) {
|
|
183
|
+
this.logger?.debug(`Cleaned up ${deletedCount} expired session(s)`);
|
|
184
|
+
}
|
|
185
|
+
return deletedCount;
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
this.logger?.error(`Failed to cleanup expired sessions`, error);
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* List all active sessions
|
|
194
|
+
*/
|
|
195
|
+
async listSessions() {
|
|
196
|
+
if (!this.db) {
|
|
197
|
+
throw new Error('Session storage not initialized');
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const now = Date.now();
|
|
201
|
+
const sessions = this.db.prepare(`
|
|
202
|
+
SELECT
|
|
203
|
+
s.session_id,
|
|
204
|
+
s.query,
|
|
205
|
+
s.created_at,
|
|
206
|
+
s.expires_at,
|
|
207
|
+
COUNT(sp.id) as pattern_count
|
|
208
|
+
FROM sessions s
|
|
209
|
+
LEFT JOIN session_patterns sp ON s.session_id = sp.session_id
|
|
210
|
+
WHERE s.expires_at > ?
|
|
211
|
+
GROUP BY s.session_id
|
|
212
|
+
ORDER BY s.created_at DESC
|
|
213
|
+
`).all(now);
|
|
214
|
+
return sessions.map(s => ({
|
|
215
|
+
sessionId: s.session_id,
|
|
216
|
+
query: s.query,
|
|
217
|
+
patternCount: s.pattern_count,
|
|
218
|
+
createdAt: s.created_at,
|
|
219
|
+
expiresAt: s.expires_at
|
|
220
|
+
}));
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
this.logger?.error(`Failed to list sessions`, error);
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Close database connection
|
|
229
|
+
*/
|
|
230
|
+
close() {
|
|
231
|
+
if (this.db) {
|
|
232
|
+
this.db.close();
|
|
233
|
+
this.db = null;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=session-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-storage.js","sourceRoot":"","sources":["../../src/cache/session-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACE Server Client - HTTP REST API client with 3-tier cache
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* 1. RAM cache (fastest, lost on restart)
|
|
6
|
+
* 2. SQLite cache (fast, survives restart)
|
|
7
|
+
* 3. Remote server (slow, source of truth)
|
|
8
|
+
*
|
|
9
|
+
* @package @ace-sdk/core
|
|
10
|
+
*/
|
|
11
|
+
import { AceConfig, AceContext, ServerConfig } from '../types/config.js';
|
|
12
|
+
import { StructuredPlaybook, PlaybookStats, DeltaOperation, PlaybookBullet, SearchResponseWithMetadata, PlaybookResponseWithMetadata, LearningResponse, BootstrapResponse } from '../types/pattern.js';
|
|
13
|
+
import { LocalCacheService } from '../cache/local-cache.js';
|
|
14
|
+
import { ILogger } from '../logger/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Options for creating an ACE client
|
|
17
|
+
*/
|
|
18
|
+
export interface AceClientOptions {
|
|
19
|
+
/** Logger for output (optional - defaults to silent) */
|
|
20
|
+
logger?: ILogger;
|
|
21
|
+
}
|
|
22
|
+
export declare class AceClient {
|
|
23
|
+
private config;
|
|
24
|
+
private localCache;
|
|
25
|
+
private memoryCache?;
|
|
26
|
+
private logger;
|
|
27
|
+
private configCache;
|
|
28
|
+
private CONFIG_CACHE_TTL;
|
|
29
|
+
constructor(config: AceConfig | AceContext, options?: AceClientOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Extract org_id from API token
|
|
32
|
+
* Format: ace_{base64_with_org_id}
|
|
33
|
+
*/
|
|
34
|
+
private extractOrgId;
|
|
35
|
+
private request;
|
|
36
|
+
/**
|
|
37
|
+
* Save structured playbook to server
|
|
38
|
+
* Server endpoint: POST /patterns (saves individual bullets)
|
|
39
|
+
*/
|
|
40
|
+
savePlaybook(playbook: StructuredPlaybook): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Get structured playbook (3-tier cache: RAM → SQLite → Server)
|
|
43
|
+
* Endpoint: GET /playbook
|
|
44
|
+
*/
|
|
45
|
+
getPlaybook(params?: {
|
|
46
|
+
forceRefresh?: boolean;
|
|
47
|
+
include_metadata?: boolean;
|
|
48
|
+
}): Promise<PlaybookResponseWithMetadata>;
|
|
49
|
+
/**
|
|
50
|
+
* Count total bullets across all playbook sections
|
|
51
|
+
*/
|
|
52
|
+
private countBullets;
|
|
53
|
+
/**
|
|
54
|
+
* Compute embeddings for texts (with SQLite cache if available)
|
|
55
|
+
* Endpoint: POST /embeddings
|
|
56
|
+
*/
|
|
57
|
+
computeEmbeddings(texts: string[]): Promise<number[][]>;
|
|
58
|
+
/**
|
|
59
|
+
* Semantic search for relevant patterns
|
|
60
|
+
* Endpoint: POST /patterns/search
|
|
61
|
+
*/
|
|
62
|
+
searchPatterns(params: {
|
|
63
|
+
query: string;
|
|
64
|
+
section?: string;
|
|
65
|
+
threshold?: number;
|
|
66
|
+
top_k?: number;
|
|
67
|
+
include_metadata?: boolean;
|
|
68
|
+
}): Promise<SearchResponseWithMetadata>;
|
|
69
|
+
/**
|
|
70
|
+
* Get top patterns by helpful score
|
|
71
|
+
* Endpoint: GET /patterns/top
|
|
72
|
+
*/
|
|
73
|
+
getTopPatterns(params: {
|
|
74
|
+
section?: string;
|
|
75
|
+
limit?: number;
|
|
76
|
+
min_helpful?: number;
|
|
77
|
+
}): Promise<PlaybookBullet[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Get playbook analytics
|
|
80
|
+
* Endpoint: GET /analytics
|
|
81
|
+
*/
|
|
82
|
+
getAnalytics(): Promise<PlaybookStats>;
|
|
83
|
+
/**
|
|
84
|
+
* Clear entire playbook
|
|
85
|
+
* Server endpoint: DELETE /patterns
|
|
86
|
+
*/
|
|
87
|
+
clearPlaybook(): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Apply delta operation (ADD/UPDATE/DELETE)
|
|
90
|
+
* Server endpoint: POST /delta
|
|
91
|
+
*/
|
|
92
|
+
applyDelta(operation: DeltaOperation): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Apply multiple delta operations in batch
|
|
95
|
+
*/
|
|
96
|
+
applyDeltas(operations: DeltaOperation[]): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Store execution trace for server-side analysis
|
|
99
|
+
* Server endpoint: POST /traces
|
|
100
|
+
*/
|
|
101
|
+
storeExecutionTrace(trace: any): Promise<LearningResponse>;
|
|
102
|
+
/**
|
|
103
|
+
* Bootstrap playbook from extracted code blocks
|
|
104
|
+
* Server endpoint: POST /bootstrap
|
|
105
|
+
*/
|
|
106
|
+
bootstrap(params: {
|
|
107
|
+
mode: string;
|
|
108
|
+
code_blocks: string[];
|
|
109
|
+
metadata: {
|
|
110
|
+
files_scanned?: number;
|
|
111
|
+
blocks_extracted?: number;
|
|
112
|
+
thoroughness?: string;
|
|
113
|
+
file_extensions?: string[];
|
|
114
|
+
};
|
|
115
|
+
}): Promise<BootstrapResponse>;
|
|
116
|
+
/**
|
|
117
|
+
* Initialize playbook from git repository (server-side)
|
|
118
|
+
* Server endpoint: POST /init
|
|
119
|
+
*/
|
|
120
|
+
initializeFromRepo(params: {
|
|
121
|
+
repo_path: string;
|
|
122
|
+
commit_limit: number;
|
|
123
|
+
days_back: number;
|
|
124
|
+
merge_with_existing: boolean;
|
|
125
|
+
}): Promise<any>;
|
|
126
|
+
/**
|
|
127
|
+
* Get playbook status/statistics
|
|
128
|
+
* Server endpoint: GET /analytics
|
|
129
|
+
*/
|
|
130
|
+
getStatus(): Promise<PlaybookStats>;
|
|
131
|
+
/**
|
|
132
|
+
* Invalidate caches (force refresh on next call)
|
|
133
|
+
*/
|
|
134
|
+
invalidateCache(): void;
|
|
135
|
+
/**
|
|
136
|
+
* Get server configuration with caching (v3.6.0+)
|
|
137
|
+
* Server endpoint: GET /api/v1/config
|
|
138
|
+
*/
|
|
139
|
+
getConfig(useCache?: boolean): Promise<ServerConfig>;
|
|
140
|
+
/**
|
|
141
|
+
* Verify API token and fetch organization info
|
|
142
|
+
* Server endpoint: GET /api/v1/config/verify
|
|
143
|
+
*/
|
|
144
|
+
verifyToken(): Promise<{
|
|
145
|
+
org_id: string;
|
|
146
|
+
org_name: string;
|
|
147
|
+
projects: Array<{
|
|
148
|
+
project_id: string;
|
|
149
|
+
project_name: string;
|
|
150
|
+
}>;
|
|
151
|
+
}>;
|
|
152
|
+
/**
|
|
153
|
+
* Batch retrieve patterns by ID (v3.6.0+)
|
|
154
|
+
* Server endpoint: POST /patterns/batch
|
|
155
|
+
*/
|
|
156
|
+
batchGetPatterns(patternIds: string[]): Promise<{
|
|
157
|
+
patterns: PlaybookBullet[];
|
|
158
|
+
found_count: number;
|
|
159
|
+
not_found: string[];
|
|
160
|
+
}>;
|
|
161
|
+
/**
|
|
162
|
+
* Summarize a recorded session
|
|
163
|
+
* Server endpoint: POST /api/v1/summarize
|
|
164
|
+
*/
|
|
165
|
+
summarizeSession(sessionData: any): Promise<{
|
|
166
|
+
session_id: string;
|
|
167
|
+
summary: string;
|
|
168
|
+
key_events: Array<{
|
|
169
|
+
timestamp: string;
|
|
170
|
+
type: string;
|
|
171
|
+
description: string;
|
|
172
|
+
}>;
|
|
173
|
+
insights: string[];
|
|
174
|
+
duration_ms: number;
|
|
175
|
+
event_count: number;
|
|
176
|
+
}>;
|
|
177
|
+
/**
|
|
178
|
+
* Clear config cache
|
|
179
|
+
*/
|
|
180
|
+
clearConfigCache(): void;
|
|
181
|
+
/**
|
|
182
|
+
* Get local cache instance
|
|
183
|
+
*/
|
|
184
|
+
getLocalCache(): LocalCacheService | null;
|
|
185
|
+
/**
|
|
186
|
+
* Update server configuration (v3.6.0+)
|
|
187
|
+
* Server endpoint: PUT /api/v1/config?scope=project
|
|
188
|
+
*/
|
|
189
|
+
updateConfig(settings: Record<string, any>, scope?: 'project'): Promise<ServerConfig>;
|
|
190
|
+
/**
|
|
191
|
+
* Reset server configuration to defaults (v3.9.0+)
|
|
192
|
+
* Server endpoint: POST /api/v1/config/reset?scope=project
|
|
193
|
+
*/
|
|
194
|
+
resetConfig(scope?: 'project'): Promise<{
|
|
195
|
+
success: boolean;
|
|
196
|
+
message: string;
|
|
197
|
+
}>;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=ace-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ace-client.d.ts","sourceRoot":"","sources":["../../src/client/ace-client.ts"],"names":[],"mappings":"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"}
|