@ace-sdk/core 2.0.1 → 2.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.
- package/dist/cache/project-index.d.ts +152 -0
- package/dist/cache/project-index.d.ts.map +1 -0
- package/dist/cache/project-index.js +290 -0
- package/dist/cache/project-index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/services/bootstrap-stream.d.ts +113 -0
- package/dist/services/bootstrap-stream.d.ts.map +1 -0
- package/dist/services/bootstrap-stream.js +261 -0
- package/dist/services/bootstrap-stream.js.map +1 -0
- package/dist/services/import-graph.d.ts +111 -0
- package/dist/services/import-graph.d.ts.map +1 -0
- package/dist/services/import-graph.js +292 -0
- package/dist/services/import-graph.js.map +1 -0
- package/dist/services/language-detector.d.ts +120 -0
- package/dist/services/language-detector.d.ts.map +1 -0
- package/dist/services/language-detector.js +210 -0
- package/dist/services/language-detector.js.map +1 -0
- package/dist/types/bootstrap-events.d.ts +251 -0
- package/dist/types/bootstrap-events.d.ts.map +1 -0
- package/dist/types/bootstrap-events.js +103 -0
- package/dist/types/bootstrap-events.js.map +1 -0
- package/dist/types/project-dna.d.ts +151 -0
- package/dist/types/project-dna.d.ts.map +1 -0
- package/dist/types/project-dna.js +42 -0
- package/dist/types/project-dna.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Index Cache using SQLite
|
|
3
|
+
*
|
|
4
|
+
* Lightweight persistent index of project files for smart file selection.
|
|
5
|
+
* Uses git commits for invalidation instead of time-based TTL.
|
|
6
|
+
*
|
|
7
|
+
* @package @ace-sdk/core
|
|
8
|
+
*/
|
|
9
|
+
import type { ImportGraph } from '../services/import-graph.js';
|
|
10
|
+
/**
|
|
11
|
+
* Entry for a file in the project index
|
|
12
|
+
*/
|
|
13
|
+
export interface ProjectIndexEntry {
|
|
14
|
+
/** File path relative to repo root */
|
|
15
|
+
path: string;
|
|
16
|
+
/** Detected programming language */
|
|
17
|
+
language: string | null;
|
|
18
|
+
/** Number of imports */
|
|
19
|
+
imports: number;
|
|
20
|
+
/** Number of files importing this */
|
|
21
|
+
importedBy: number;
|
|
22
|
+
/** Is a hub file (5+ importers) */
|
|
23
|
+
isHub: boolean;
|
|
24
|
+
/** Is an entry point (no dependents) */
|
|
25
|
+
isEntryPoint: boolean;
|
|
26
|
+
/** File last modified timestamp */
|
|
27
|
+
lastModified: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Project metadata stored in the index
|
|
31
|
+
*/
|
|
32
|
+
export interface ProjectMetadata {
|
|
33
|
+
/** Last indexed git commit */
|
|
34
|
+
lastCommit: string | null;
|
|
35
|
+
/** Last indexed timestamp */
|
|
36
|
+
lastIndexed: number;
|
|
37
|
+
/** Primary language */
|
|
38
|
+
primaryLanguage: string | null;
|
|
39
|
+
/** Total files indexed */
|
|
40
|
+
totalFiles: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Configuration for project index
|
|
44
|
+
*/
|
|
45
|
+
export interface ProjectIndexConfig {
|
|
46
|
+
/** Organization ID */
|
|
47
|
+
orgId: string;
|
|
48
|
+
/** Project ID */
|
|
49
|
+
projectId: string;
|
|
50
|
+
/** Cache directory (defaults to ~/.ace-cache) */
|
|
51
|
+
cacheDir?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* SQLite-based project file index
|
|
55
|
+
*
|
|
56
|
+
* Stores file metadata for smart bootstrap file selection.
|
|
57
|
+
* Uses git commits for cache invalidation.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const index = new ProjectIndex({ orgId: 'myorg', projectId: 'myproject' });
|
|
62
|
+
*
|
|
63
|
+
* // Check if reindex needed
|
|
64
|
+
* if (index.needsReindex('/path/to/repo')) {
|
|
65
|
+
* const graph = await buildImportGraph({ repoPath: '/path/to/repo' });
|
|
66
|
+
* await index.updateFromGraph(graph, '/path/to/repo');
|
|
67
|
+
* }
|
|
68
|
+
*
|
|
69
|
+
* // Get priority files
|
|
70
|
+
* const hubs = index.getHubFiles(20);
|
|
71
|
+
* const entries = index.getEntryPoints();
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export declare class ProjectIndex {
|
|
75
|
+
private db;
|
|
76
|
+
private readonly orgId;
|
|
77
|
+
private readonly projectId;
|
|
78
|
+
constructor(config: ProjectIndexConfig);
|
|
79
|
+
/**
|
|
80
|
+
* Initialize database schema
|
|
81
|
+
*/
|
|
82
|
+
private initSchema;
|
|
83
|
+
/**
|
|
84
|
+
* Update index from import graph analysis
|
|
85
|
+
*/
|
|
86
|
+
updateFromGraph(graph: ImportGraph, repoPath: string): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Get hub files (most imported)
|
|
89
|
+
*/
|
|
90
|
+
getHubFiles(limit?: number): string[];
|
|
91
|
+
/**
|
|
92
|
+
* Get entry point files
|
|
93
|
+
*/
|
|
94
|
+
getEntryPoints(): string[];
|
|
95
|
+
/**
|
|
96
|
+
* Get files by language
|
|
97
|
+
*/
|
|
98
|
+
getFilesByLanguage(language: string, limit?: number): string[];
|
|
99
|
+
/**
|
|
100
|
+
* Get most imported files (top N by importedBy count)
|
|
101
|
+
*/
|
|
102
|
+
getMostImported(limit?: number): ProjectIndexEntry[];
|
|
103
|
+
/**
|
|
104
|
+
* Get all indexed files
|
|
105
|
+
*/
|
|
106
|
+
getAllFiles(): string[];
|
|
107
|
+
/**
|
|
108
|
+
* Check if reindex is needed based on git commit
|
|
109
|
+
*/
|
|
110
|
+
needsReindex(repoPath: string): {
|
|
111
|
+
needsReindex: boolean;
|
|
112
|
+
changedFiles?: string[];
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Get project metadata
|
|
116
|
+
*/
|
|
117
|
+
getProjectMetadata(): ProjectMetadata;
|
|
118
|
+
/**
|
|
119
|
+
* Get metadata value
|
|
120
|
+
*/
|
|
121
|
+
getMetadata(key: string): string | null;
|
|
122
|
+
/**
|
|
123
|
+
* Set metadata value
|
|
124
|
+
*/
|
|
125
|
+
setMetadata(key: string, value: string): void;
|
|
126
|
+
/**
|
|
127
|
+
* Get current git commit hash
|
|
128
|
+
*/
|
|
129
|
+
private getGitCommit;
|
|
130
|
+
/**
|
|
131
|
+
* Get files changed since a commit
|
|
132
|
+
*/
|
|
133
|
+
private getChangedFilesSince;
|
|
134
|
+
/**
|
|
135
|
+
* Close database connection
|
|
136
|
+
*/
|
|
137
|
+
close(): void;
|
|
138
|
+
/**
|
|
139
|
+
* Clear all data from the index
|
|
140
|
+
*/
|
|
141
|
+
clear(): void;
|
|
142
|
+
/**
|
|
143
|
+
* Get index statistics
|
|
144
|
+
*/
|
|
145
|
+
getStats(): {
|
|
146
|
+
totalFiles: number;
|
|
147
|
+
hubFiles: number;
|
|
148
|
+
entryPoints: number;
|
|
149
|
+
languages: Record<string, number>;
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=project-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-index.d.ts","sourceRoot":"","sources":["../../src/cache/project-index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,wCAAwC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,EAAE,kBAAkB;IAwBtC;;OAEG;IACH,OAAO,CAAC,UAAU;IA4BlB;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC1E;;OAEG;IACH,WAAW,CAAC,KAAK,GAAE,MAAW,GAAG,MAAM,EAAE;IAWzC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAQ1B;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAY9D;;OAEG;IACH,eAAe,CAAC,KAAK,GAAE,MAAW,GAAG,iBAAiB,EAAE;IAmBxD;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAKvB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAuBlF;;OAEG;IACH,kBAAkB,IAAI,eAAe;IASrC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQvC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7C;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC;CAmBF"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Index Cache using SQLite
|
|
3
|
+
*
|
|
4
|
+
* Lightweight persistent index of project files for smart file selection.
|
|
5
|
+
* Uses git commits for invalidation instead of time-based TTL.
|
|
6
|
+
*
|
|
7
|
+
* @package @ace-sdk/core
|
|
8
|
+
*/
|
|
9
|
+
import Database from 'better-sqlite3';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Project Index Class
|
|
16
|
+
// =============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* SQLite-based project file index
|
|
19
|
+
*
|
|
20
|
+
* Stores file metadata for smart bootstrap file selection.
|
|
21
|
+
* Uses git commits for cache invalidation.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const index = new ProjectIndex({ orgId: 'myorg', projectId: 'myproject' });
|
|
26
|
+
*
|
|
27
|
+
* // Check if reindex needed
|
|
28
|
+
* if (index.needsReindex('/path/to/repo')) {
|
|
29
|
+
* const graph = await buildImportGraph({ repoPath: '/path/to/repo' });
|
|
30
|
+
* await index.updateFromGraph(graph, '/path/to/repo');
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // Get priority files
|
|
34
|
+
* const hubs = index.getHubFiles(20);
|
|
35
|
+
* const entries = index.getEntryPoints();
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export class ProjectIndex {
|
|
39
|
+
db;
|
|
40
|
+
orgId;
|
|
41
|
+
projectId;
|
|
42
|
+
constructor(config) {
|
|
43
|
+
// Store for future use (cross-project features)
|
|
44
|
+
this.orgId = config.orgId;
|
|
45
|
+
this.projectId = config.projectId;
|
|
46
|
+
void this.orgId; // Mark as intentionally unused for now
|
|
47
|
+
void this.projectId; // Mark as intentionally unused for now
|
|
48
|
+
// Ensure cache directory exists
|
|
49
|
+
const cacheDir = config.cacheDir || join(homedir(), '.ace-cache');
|
|
50
|
+
if (!existsSync(cacheDir)) {
|
|
51
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
// Create database for this org/project
|
|
54
|
+
const dbPath = join(cacheDir, `${config.orgId}_${config.projectId}_index.db`);
|
|
55
|
+
this.db = new Database(dbPath);
|
|
56
|
+
// Enable WAL mode for better performance
|
|
57
|
+
this.db.pragma('journal_mode = WAL');
|
|
58
|
+
// Initialize schema
|
|
59
|
+
this.initSchema();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Initialize database schema
|
|
63
|
+
*/
|
|
64
|
+
initSchema() {
|
|
65
|
+
this.db.exec(`
|
|
66
|
+
-- Files table
|
|
67
|
+
CREATE TABLE IF NOT EXISTS files (
|
|
68
|
+
path TEXT PRIMARY KEY,
|
|
69
|
+
language TEXT,
|
|
70
|
+
imports INTEGER DEFAULT 0,
|
|
71
|
+
imported_by INTEGER DEFAULT 0,
|
|
72
|
+
is_hub INTEGER DEFAULT 0,
|
|
73
|
+
is_entry_point INTEGER DEFAULT 0,
|
|
74
|
+
last_modified INTEGER,
|
|
75
|
+
indexed_at INTEGER
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
-- Project metadata table
|
|
79
|
+
CREATE TABLE IF NOT EXISTS project_meta (
|
|
80
|
+
key TEXT PRIMARY KEY,
|
|
81
|
+
value TEXT
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
-- Indexes for common queries
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_hub ON files(is_hub) WHERE is_hub = 1;
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_entry ON files(is_entry_point) WHERE is_entry_point = 1;
|
|
87
|
+
CREATE INDEX IF NOT EXISTS idx_language ON files(language);
|
|
88
|
+
CREATE INDEX IF NOT EXISTS idx_imported_by ON files(imported_by DESC);
|
|
89
|
+
`);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Update index from import graph analysis
|
|
93
|
+
*/
|
|
94
|
+
async updateFromGraph(graph, repoPath) {
|
|
95
|
+
const now = Date.now();
|
|
96
|
+
const gitCommit = this.getGitCommit(repoPath);
|
|
97
|
+
const insert = this.db.prepare(`
|
|
98
|
+
INSERT OR REPLACE INTO files
|
|
99
|
+
(path, imports, imported_by, is_hub, is_entry_point, indexed_at)
|
|
100
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
101
|
+
`);
|
|
102
|
+
const transaction = this.db.transaction(() => {
|
|
103
|
+
// Clear existing files
|
|
104
|
+
this.db.exec('DELETE FROM files');
|
|
105
|
+
// Insert all nodes
|
|
106
|
+
for (const [path, node] of graph.nodes) {
|
|
107
|
+
insert.run(path, node.imports.length, node.importedBy.length, node.isHub ? 1 : 0, node.isEntryPoint ? 1 : 0, now);
|
|
108
|
+
}
|
|
109
|
+
// Update metadata
|
|
110
|
+
this.setMetadata('last_commit', gitCommit || '');
|
|
111
|
+
this.setMetadata('last_indexed', String(now));
|
|
112
|
+
this.setMetadata('total_files', String(graph.nodes.size));
|
|
113
|
+
});
|
|
114
|
+
transaction();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get hub files (most imported)
|
|
118
|
+
*/
|
|
119
|
+
getHubFiles(limit = 50) {
|
|
120
|
+
const rows = this.db.prepare(`
|
|
121
|
+
SELECT path FROM files
|
|
122
|
+
WHERE is_hub = 1
|
|
123
|
+
ORDER BY imported_by DESC
|
|
124
|
+
LIMIT ?
|
|
125
|
+
`).all(limit);
|
|
126
|
+
return rows.map(r => r.path);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get entry point files
|
|
130
|
+
*/
|
|
131
|
+
getEntryPoints() {
|
|
132
|
+
const rows = this.db.prepare(`
|
|
133
|
+
SELECT path FROM files WHERE is_entry_point = 1
|
|
134
|
+
`).all();
|
|
135
|
+
return rows.map(r => r.path);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get files by language
|
|
139
|
+
*/
|
|
140
|
+
getFilesByLanguage(language, limit) {
|
|
141
|
+
const query = limit
|
|
142
|
+
? this.db.prepare(`SELECT path FROM files WHERE language = ? LIMIT ?`)
|
|
143
|
+
: this.db.prepare(`SELECT path FROM files WHERE language = ?`);
|
|
144
|
+
const rows = (limit
|
|
145
|
+
? query.all(language, limit)
|
|
146
|
+
: query.all(language));
|
|
147
|
+
return rows.map(r => r.path);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get most imported files (top N by importedBy count)
|
|
151
|
+
*/
|
|
152
|
+
getMostImported(limit = 50) {
|
|
153
|
+
const rows = this.db.prepare(`
|
|
154
|
+
SELECT path, language, imports, imported_by, is_hub, is_entry_point, last_modified
|
|
155
|
+
FROM files
|
|
156
|
+
ORDER BY imported_by DESC
|
|
157
|
+
LIMIT ?
|
|
158
|
+
`).all(limit);
|
|
159
|
+
return rows.map(r => ({
|
|
160
|
+
path: r.path,
|
|
161
|
+
language: r.language,
|
|
162
|
+
imports: r.imports,
|
|
163
|
+
importedBy: r.imported_by,
|
|
164
|
+
isHub: Boolean(r.is_hub),
|
|
165
|
+
isEntryPoint: Boolean(r.is_entry_point),
|
|
166
|
+
lastModified: r.last_modified
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get all indexed files
|
|
171
|
+
*/
|
|
172
|
+
getAllFiles() {
|
|
173
|
+
const rows = this.db.prepare(`SELECT path FROM files`).all();
|
|
174
|
+
return rows.map(r => r.path);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Check if reindex is needed based on git commit
|
|
178
|
+
*/
|
|
179
|
+
needsReindex(repoPath) {
|
|
180
|
+
const lastCommit = this.getMetadata('last_commit');
|
|
181
|
+
const currentCommit = this.getGitCommit(repoPath);
|
|
182
|
+
// No previous index
|
|
183
|
+
if (!lastCommit) {
|
|
184
|
+
return { needsReindex: true };
|
|
185
|
+
}
|
|
186
|
+
// Same commit, no changes
|
|
187
|
+
if (lastCommit === currentCommit) {
|
|
188
|
+
return { needsReindex: false };
|
|
189
|
+
}
|
|
190
|
+
// Get changed files since last index
|
|
191
|
+
const changedFiles = this.getChangedFilesSince(repoPath, lastCommit);
|
|
192
|
+
return {
|
|
193
|
+
needsReindex: true,
|
|
194
|
+
changedFiles
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get project metadata
|
|
199
|
+
*/
|
|
200
|
+
getProjectMetadata() {
|
|
201
|
+
return {
|
|
202
|
+
lastCommit: this.getMetadata('last_commit'),
|
|
203
|
+
lastIndexed: parseInt(this.getMetadata('last_indexed') || '0', 10),
|
|
204
|
+
primaryLanguage: this.getMetadata('primary_language'),
|
|
205
|
+
totalFiles: parseInt(this.getMetadata('total_files') || '0', 10)
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Get metadata value
|
|
210
|
+
*/
|
|
211
|
+
getMetadata(key) {
|
|
212
|
+
const row = this.db.prepare(`
|
|
213
|
+
SELECT value FROM project_meta WHERE key = ?
|
|
214
|
+
`).get(key);
|
|
215
|
+
return row?.value || null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Set metadata value
|
|
219
|
+
*/
|
|
220
|
+
setMetadata(key, value) {
|
|
221
|
+
this.db.prepare(`
|
|
222
|
+
INSERT OR REPLACE INTO project_meta (key, value) VALUES (?, ?)
|
|
223
|
+
`).run(key, value);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get current git commit hash
|
|
227
|
+
*/
|
|
228
|
+
getGitCommit(repoPath) {
|
|
229
|
+
try {
|
|
230
|
+
const result = execSync('git rev-parse HEAD', {
|
|
231
|
+
cwd: repoPath,
|
|
232
|
+
encoding: 'utf8',
|
|
233
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
234
|
+
});
|
|
235
|
+
return result.trim();
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get files changed since a commit
|
|
243
|
+
*/
|
|
244
|
+
getChangedFilesSince(repoPath, commit) {
|
|
245
|
+
try {
|
|
246
|
+
const result = execSync(`git diff --name-only ${commit}..HEAD`, {
|
|
247
|
+
cwd: repoPath,
|
|
248
|
+
encoding: 'utf8',
|
|
249
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
250
|
+
});
|
|
251
|
+
return result.trim().split('\n').filter(Boolean);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return [];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Close database connection
|
|
259
|
+
*/
|
|
260
|
+
close() {
|
|
261
|
+
this.db.close();
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Clear all data from the index
|
|
265
|
+
*/
|
|
266
|
+
clear() {
|
|
267
|
+
this.db.exec('DELETE FROM files');
|
|
268
|
+
this.db.exec('DELETE FROM project_meta');
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get index statistics
|
|
272
|
+
*/
|
|
273
|
+
getStats() {
|
|
274
|
+
const totalFiles = this.db.prepare('SELECT COUNT(*) as count FROM files').get().count;
|
|
275
|
+
const hubFiles = this.db.prepare('SELECT COUNT(*) as count FROM files WHERE is_hub = 1').get().count;
|
|
276
|
+
const entryPoints = this.db.prepare('SELECT COUNT(*) as count FROM files WHERE is_entry_point = 1').get().count;
|
|
277
|
+
const langRows = this.db.prepare(`
|
|
278
|
+
SELECT language, COUNT(*) as count
|
|
279
|
+
FROM files
|
|
280
|
+
WHERE language IS NOT NULL
|
|
281
|
+
GROUP BY language
|
|
282
|
+
`).all();
|
|
283
|
+
const languages = {};
|
|
284
|
+
for (const row of langRows) {
|
|
285
|
+
languages[row.language] = row.count;
|
|
286
|
+
}
|
|
287
|
+
return { totalFiles, hubFiles, entryPoints, languages };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=project-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-index.js","sourceRoot":"","sources":["../../src/cache/project-index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -29,4 +29,16 @@ export type { SemanticVersion } from './utils/semver.js';
|
|
|
29
29
|
export { parseVersion, compareVersions, satisfiesVersion } from './utils/semver.js';
|
|
30
30
|
export type { CodeBlock } from './utils/code-extractor.js';
|
|
31
31
|
export { extractFunctionBodies, isInteresting, extractCodeBlocksFromMarkdown, extractAddedLinesFromDiff } from './utils/code-extractor.js';
|
|
32
|
+
export type { LanguageStats as ProjectLanguageStats, ProjectType, FrameworkInfo, GraphMetrics, CodeHealthMetrics, PatternDetection, Recommendation, ProjectDNA, StoreProjectDNARequest, StoreProjectDNAResponse } from './types/project-dna.js';
|
|
33
|
+
export { createEmptyProjectDNA } from './types/project-dna.js';
|
|
34
|
+
export type { PlaybookSection, BootstrapStage, BootstrapStatistics, ReceivedStageData, AnalyzingStageData, SynthesizingStageData, MergingStageData, DoneStageData, ErrorStageData, BootstrapStageData, BootstrapSSEEvent, BootstrapEventType, BootstrapStartedData, BootstrapProgressData, BootstrapPatternsData, BootstrapHealthData, BootstrapCompleteData, BootstrapErrorData, BootstrapEventData } from './types/bootstrap-events.js';
|
|
35
|
+
export { BOOTSTRAP_STAGE_LABELS, isReceivedEvent, isAnalyzingEvent, isSynthesizingEvent, isMergingEvent, isDoneEvent, isErrorEvent, isTerminalEvent, isStartedEvent, isStageEvent, isProgressEvent, isPatternsEvent, isHealthEvent, isCompleteEvent } from './types/bootstrap-events.js';
|
|
36
|
+
export type { LanguageStats, LanguageAnalysisOptions } from './services/language-detector.js';
|
|
37
|
+
export { LanguageDetector, DEFAULT_IGNORED_PATTERNS, DEFAULT_CATEGORIES } from './services/language-detector.js';
|
|
38
|
+
export type { FileNode, ImportGraph, ImportGraphOptions } from './services/import-graph.js';
|
|
39
|
+
export { buildImportGraph, selectPriorityFiles, graphToMetrics, calculateHealthMetrics, DEFAULT_IGNORE_PATHS, HUB_THRESHOLD } from './services/import-graph.js';
|
|
40
|
+
export type { ProjectIndexEntry, ProjectMetadata, ProjectIndexConfig } from './cache/project-index.js';
|
|
41
|
+
export { ProjectIndex } from './cache/project-index.js';
|
|
42
|
+
export type { BootstrapStreamOptions, BootstrapStreamResult } from './services/bootstrap-stream.js';
|
|
43
|
+
export { bootstrapWithStreaming, bootstrapWithoutStreaming } from './services/bootstrap-stream.js';
|
|
32
44
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,YAAY,EAEV,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,cAAc,EACd,aAAa,EAGb,aAAa,EACb,0BAA0B,EAC1B,4BAA4B,EAG5B,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAGlB,kBAAkB,EAClB,gBAAgB,EAGhB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,YAAY,EAEV,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAM7D,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9C,OAAO,EAEL,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,OAAO,EAEL,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM/D,OAAO,EAEL,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAEL,cAAc,EACf,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AAMpC,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAEL,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAEL,qBAAqB,EACrB,aAAa,EACb,6BAA6B,EAC7B,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -47,4 +47,14 @@ parseVersion, compareVersions, satisfiesVersion } from './utils/semver.js';
|
|
|
47
47
|
export {
|
|
48
48
|
// Code extraction
|
|
49
49
|
extractFunctionBodies, isInteresting, extractCodeBlocksFromMarkdown, extractAddedLinesFromDiff } from './utils/code-extractor.js';
|
|
50
|
+
export { createEmptyProjectDNA } from './types/project-dna.js';
|
|
51
|
+
export { BOOTSTRAP_STAGE_LABELS,
|
|
52
|
+
// New type guards (v3.13.0)
|
|
53
|
+
isReceivedEvent, isAnalyzingEvent, isSynthesizingEvent, isMergingEvent, isDoneEvent, isErrorEvent, isTerminalEvent,
|
|
54
|
+
// Legacy type guards (deprecated)
|
|
55
|
+
isStartedEvent, isStageEvent, isProgressEvent, isPatternsEvent, isHealthEvent, isCompleteEvent } from './types/bootstrap-events.js';
|
|
56
|
+
export { LanguageDetector, DEFAULT_IGNORED_PATTERNS, DEFAULT_CATEGORIES } from './services/language-detector.js';
|
|
57
|
+
export { buildImportGraph, selectPriorityFiles, graphToMetrics, calculateHealthMetrics, DEFAULT_IGNORE_PATHS, HUB_THRESHOLD } from './services/import-graph.js';
|
|
58
|
+
export { ProjectIndex } from './cache/project-index.js';
|
|
59
|
+
export { bootstrapWithStreaming, bootstrapWithoutStreaming } from './services/bootstrap-stream.js';
|
|
50
60
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyCH,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAchF,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,OAAO;AACL,gBAAgB;AAChB,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,oBAAoB,CAAC;AAI5B,OAAO;AACL,oBAAoB;AACpB,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO;AACL,mBAAmB;AACnB,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO;AACL,iBAAiB;AACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO;AACL,qBAAqB;AACrB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,OAAO;AACL,qBAAqB;AACrB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,OAAO;AACL,sCAAsC;AACtC,cAAc,EACf,MAAM,4BAA4B,CAAC;AAcpC,OAAO;AACL,sBAAsB;AACtB,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAI3B,OAAO;AACL,kBAAkB;AAClB,qBAAqB,EACrB,aAAa,EACb,6BAA6B,EAC7B,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyCH,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAchF,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,OAAO;AACL,gBAAgB;AAChB,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,oBAAoB,CAAC;AAI5B,OAAO;AACL,oBAAoB;AACpB,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO;AACL,mBAAmB;AACnB,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO;AACL,iBAAiB;AACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO;AACL,qBAAqB;AACrB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,OAAO;AACL,qBAAqB;AACrB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,OAAO;AACL,sCAAsC;AACtC,cAAc,EACf,MAAM,4BAA4B,CAAC;AAcpC,OAAO;AACL,sBAAsB;AACtB,YAAY,EACZ,eAAe,EACf,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAI3B,OAAO;AACL,kBAAkB;AAClB,qBAAqB,EACrB,aAAa,EACb,6BAA6B,EAC7B,yBAAyB,EAC1B,MAAM,2BAA2B,CAAC;AAmBnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AA8B/D,OAAO,EACL,sBAAsB;AACtB,4BAA4B;AAC5B,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe;AACf,kCAAkC;AAClC,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAWrC,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAYzC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACd,MAAM,4BAA4B,CAAC;AAYpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWxD,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootstrap Streaming Client
|
|
3
|
+
*
|
|
4
|
+
* Connects to server SSE endpoint for streaming bootstrap progress.
|
|
5
|
+
* Handles event parsing, timeout, and error recovery.
|
|
6
|
+
*
|
|
7
|
+
* Updated to match ACE Server v3.13.0 response format.
|
|
8
|
+
*
|
|
9
|
+
* @package @ace-sdk/core
|
|
10
|
+
*/
|
|
11
|
+
import type { BootstrapSSEEvent, PlaybookSection, BootstrapStatistics } from '../types/bootstrap-events.js';
|
|
12
|
+
import type { ProjectDNA } from '../types/project-dna.js';
|
|
13
|
+
import type { BootstrapMode } from '../types/pattern.js';
|
|
14
|
+
import type { VerbosityLevel } from '../types/config.js';
|
|
15
|
+
export type { BootstrapMode, VerbosityLevel };
|
|
16
|
+
/**
|
|
17
|
+
* Options for bootstrap streaming
|
|
18
|
+
*/
|
|
19
|
+
export interface BootstrapStreamOptions {
|
|
20
|
+
/** ACE Server URL (without trailing slash) */
|
|
21
|
+
serverUrl: string;
|
|
22
|
+
/** Organization ID */
|
|
23
|
+
orgId: string;
|
|
24
|
+
/** Project ID */
|
|
25
|
+
projectId: string;
|
|
26
|
+
/** Bootstrap mode (default: 'hybrid') */
|
|
27
|
+
mode?: BootstrapMode;
|
|
28
|
+
/** Code blocks to send for bootstrap */
|
|
29
|
+
codeBlocks: string[];
|
|
30
|
+
/** Metadata about the bootstrap request */
|
|
31
|
+
metadata?: {
|
|
32
|
+
files_scanned?: number;
|
|
33
|
+
blocks_extracted?: number;
|
|
34
|
+
thoroughness?: string;
|
|
35
|
+
};
|
|
36
|
+
/** Project DNA to store (optional) */
|
|
37
|
+
projectDNA?: ProjectDNA;
|
|
38
|
+
/** API token for authentication */
|
|
39
|
+
apiToken?: string;
|
|
40
|
+
/** Callback for each SSE event */
|
|
41
|
+
onEvent: (event: BootstrapSSEEvent) => void;
|
|
42
|
+
/** Callback for errors */
|
|
43
|
+
onError?: (error: Error) => void;
|
|
44
|
+
/** Timeout in milliseconds (default: 120000 = 2 minutes) */
|
|
45
|
+
timeout?: number;
|
|
46
|
+
/** Verbosity level for SSE events (default: 'compact') */
|
|
47
|
+
verbosity?: VerbosityLevel;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Result of bootstrap streaming
|
|
51
|
+
*/
|
|
52
|
+
export interface BootstrapStreamResult {
|
|
53
|
+
/** Whether bootstrap succeeded */
|
|
54
|
+
success: boolean;
|
|
55
|
+
/** Bootstrap statistics on success */
|
|
56
|
+
statistics?: BootstrapStatistics;
|
|
57
|
+
/** Playbook summary on success (derived from statistics) */
|
|
58
|
+
playbook?: {
|
|
59
|
+
totalPatterns: number;
|
|
60
|
+
bySection: Record<PlaybookSection, number>;
|
|
61
|
+
};
|
|
62
|
+
/** Error info on failure */
|
|
63
|
+
error?: {
|
|
64
|
+
code: string;
|
|
65
|
+
message: string;
|
|
66
|
+
retryable: boolean;
|
|
67
|
+
};
|
|
68
|
+
/** Processing time in seconds */
|
|
69
|
+
processingTime?: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Stream bootstrap progress from ACE Server
|
|
73
|
+
*
|
|
74
|
+
* Connects to the server's SSE endpoint and receives progress updates
|
|
75
|
+
* as the bootstrap processes code blocks.
|
|
76
|
+
*
|
|
77
|
+
* @param options - Bootstrap streaming options
|
|
78
|
+
* @returns Promise that resolves when bootstrap completes or fails
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* const result = await bootstrapWithStreaming({
|
|
83
|
+
* serverUrl: 'https://ace-api.code-engine.app',
|
|
84
|
+
* orgId: 'myorg',
|
|
85
|
+
* projectId: 'myproject',
|
|
86
|
+
* mode: 'hybrid',
|
|
87
|
+
* codeBlocks: ['function foo() { ... }', '// STRATEGY: Use DI'],
|
|
88
|
+
* onEvent: (event) => {
|
|
89
|
+
* console.log(`[${event.stage}] ${event.message}`);
|
|
90
|
+
* if (event.stage === 'done') {
|
|
91
|
+
* const stats = event.data as DoneStageData;
|
|
92
|
+
* console.log(`Patterns: ${stats.patterns_extracted}`);
|
|
93
|
+
* }
|
|
94
|
+
* }
|
|
95
|
+
* });
|
|
96
|
+
*
|
|
97
|
+
* if (result.success) {
|
|
98
|
+
* console.log(`Bootstrap complete: ${result.playbook?.totalPatterns} patterns`);
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export declare function bootstrapWithStreaming(options: BootstrapStreamOptions): Promise<BootstrapStreamResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Non-streaming bootstrap fallback
|
|
105
|
+
*
|
|
106
|
+
* For servers that don't support SSE streaming, this function
|
|
107
|
+
* makes a regular POST request and waits for the response.
|
|
108
|
+
*
|
|
109
|
+
* @param options - Bootstrap options (same as streaming but without onEvent)
|
|
110
|
+
* @returns Promise that resolves with bootstrap result
|
|
111
|
+
*/
|
|
112
|
+
export declare function bootstrapWithoutStreaming(options: Omit<BootstrapStreamOptions, 'onEvent'>): Promise<BootstrapStreamResult>;
|
|
113
|
+
//# sourceMappingURL=bootstrap-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-stream.d.ts","sourceRoot":"","sources":["../../src/services/bootstrap-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAGjB,eAAe,EACf,mBAAmB,EACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAM9C;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,wCAAwC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE;QACT,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;KAC5C,CAAC;IACF,4BAA4B;IAC5B,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA4KhC;AAMD;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAC/C,OAAO,CAAC,qBAAqB,CAAC,CAoFhC"}
|