@timmeck/brain-core 2.36.56 → 2.36.57
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/action/__tests__/action-bridge.test.d.ts +1 -0
- package/dist/action/__tests__/action-bridge.test.js +145 -0
- package/dist/action/__tests__/action-bridge.test.js.map +1 -0
- package/dist/action/action-bridge.d.ts +95 -0
- package/dist/action/action-bridge.js +241 -0
- package/dist/action/action-bridge.js.map +1 -0
- package/dist/action/index.d.ts +2 -0
- package/dist/action/index.js +2 -0
- package/dist/action/index.js.map +1 -0
- package/dist/codegen/__tests__/code-forge.test.d.ts +1 -0
- package/dist/codegen/__tests__/code-forge.test.js +105 -0
- package/dist/codegen/__tests__/code-forge.test.js.map +1 -0
- package/dist/codegen/code-forge.d.ts +87 -0
- package/dist/codegen/code-forge.js +211 -0
- package/dist/codegen/code-forge.js.map +1 -0
- package/dist/codegen/index.d.ts +2 -0
- package/dist/codegen/index.js +1 -0
- package/dist/codegen/index.js.map +1 -1
- package/dist/content/__tests__/content-forge.test.d.ts +1 -0
- package/dist/content/__tests__/content-forge.test.js +117 -0
- package/dist/content/__tests__/content-forge.test.js.map +1 -0
- package/dist/content/content-forge.d.ts +104 -0
- package/dist/content/content-forge.js +213 -0
- package/dist/content/content-forge.js.map +1 -0
- package/dist/content/index.d.ts +2 -0
- package/dist/content/index.js +2 -0
- package/dist/content/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/research/research-orchestrator.d.ts +12 -0
- package/dist/research/research-orchestrator.js +108 -0
- package/dist/research/research-orchestrator.js.map +1 -1
- package/dist/strategy/__tests__/strategy-forge.test.d.ts +1 -0
- package/dist/strategy/__tests__/strategy-forge.test.js +121 -0
- package/dist/strategy/__tests__/strategy-forge.test.js.map +1 -0
- package/dist/strategy/index.d.ts +2 -0
- package/dist/strategy/index.js +2 -0
- package/dist/strategy/index.js.map +1 -0
- package/dist/strategy/strategy-forge.d.ts +111 -0
- package/dist/strategy/strategy-forge.js +264 -0
- package/dist/strategy/strategy-forge.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-forge.test.js","sourceRoot":"","sources":["../../../src/codegen/__tests__/code-forge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export interface CodeProduct {
|
|
3
|
+
id: number;
|
|
4
|
+
type: 'utility' | 'refactor' | 'scaffold' | 'fix' | 'test';
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
files: Array<{
|
|
8
|
+
path: string;
|
|
9
|
+
content: string;
|
|
10
|
+
action: 'create' | 'modify';
|
|
11
|
+
}>;
|
|
12
|
+
sourcePattern?: string;
|
|
13
|
+
testsPassed?: boolean;
|
|
14
|
+
status: 'generated' | 'tested' | 'applied' | 'failed' | 'rolled_back';
|
|
15
|
+
createdAt?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CodePattern {
|
|
18
|
+
id: number;
|
|
19
|
+
pattern: string;
|
|
20
|
+
occurrences: number;
|
|
21
|
+
files: string[];
|
|
22
|
+
similarity: number;
|
|
23
|
+
}
|
|
24
|
+
export interface CodeForgeConfig {
|
|
25
|
+
brainName: string;
|
|
26
|
+
autoApplyEnabled?: boolean;
|
|
27
|
+
minSimilarityForPattern?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface CodeForgeStatus {
|
|
30
|
+
patterns: number;
|
|
31
|
+
products: number;
|
|
32
|
+
applied: number;
|
|
33
|
+
successRate: number;
|
|
34
|
+
}
|
|
35
|
+
export declare function runCodeForgeMigration(db: Database.Database): void;
|
|
36
|
+
export declare class CodeForge {
|
|
37
|
+
private readonly db;
|
|
38
|
+
private readonly config;
|
|
39
|
+
private readonly log;
|
|
40
|
+
private actionBridge;
|
|
41
|
+
private codeHealthMonitor;
|
|
42
|
+
private selfModificationEngine;
|
|
43
|
+
private guardrailEngine;
|
|
44
|
+
private readonly stmtInsertProduct;
|
|
45
|
+
private readonly stmtInsertPattern;
|
|
46
|
+
private readonly stmtGetProduct;
|
|
47
|
+
private readonly stmtUpdateProductStatus;
|
|
48
|
+
private readonly stmtGetProducts;
|
|
49
|
+
private readonly stmtGetPatterns;
|
|
50
|
+
private readonly stmtCountByStatus;
|
|
51
|
+
private readonly stmtSuccessRate;
|
|
52
|
+
constructor(db: Database.Database, config: CodeForgeConfig);
|
|
53
|
+
setActionBridge(bridge: import('../action/action-bridge.js').ActionBridgeEngine): void;
|
|
54
|
+
setCodeHealthMonitor(monitor: {
|
|
55
|
+
scan: (path: string) => unknown;
|
|
56
|
+
}): void;
|
|
57
|
+
setSelfModificationEngine(engine: any): void;
|
|
58
|
+
setGuardrailEngine(engine: {
|
|
59
|
+
isProtectedPath: (path: string) => boolean;
|
|
60
|
+
}): void;
|
|
61
|
+
/** Extract recurring code patterns from codebase analysis */
|
|
62
|
+
extractPatterns(): CodePattern[];
|
|
63
|
+
/** Record a discovered pattern */
|
|
64
|
+
addPattern(pattern: string, occurrences: number, files: string[], similarity: number): number;
|
|
65
|
+
/** Generate a utility from a recurring pattern */
|
|
66
|
+
generateUtility(pattern: CodePattern): CodeProduct;
|
|
67
|
+
/** Auto-apply a self-modification proposal */
|
|
68
|
+
autoApplyProposal(proposalId: number): {
|
|
69
|
+
success: boolean;
|
|
70
|
+
productId?: number;
|
|
71
|
+
};
|
|
72
|
+
/** Scaffold a new project from a template */
|
|
73
|
+
scaffoldProject(template: string, config: Record<string, unknown>): CodeProduct;
|
|
74
|
+
/** Generate tests for a target file */
|
|
75
|
+
generateTest(targetFile: string): CodeProduct;
|
|
76
|
+
/** Apply a code product (mark as applied) */
|
|
77
|
+
applyProduct(productId: number): {
|
|
78
|
+
success: boolean;
|
|
79
|
+
};
|
|
80
|
+
/** Rollback a product */
|
|
81
|
+
rollback(productId: number): void;
|
|
82
|
+
/** Get products by status */
|
|
83
|
+
getProducts(status?: string): CodeProduct[];
|
|
84
|
+
/** Get status overview */
|
|
85
|
+
getStatus(): CodeForgeStatus;
|
|
86
|
+
private storeProduct;
|
|
87
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { getLogger } from '../utils/logger.js';
|
|
2
|
+
// ── Migration ──────────────────────────────────────────────
|
|
3
|
+
export function runCodeForgeMigration(db) {
|
|
4
|
+
db.exec(`
|
|
5
|
+
CREATE TABLE IF NOT EXISTS code_products (
|
|
6
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
7
|
+
type TEXT NOT NULL,
|
|
8
|
+
name TEXT NOT NULL,
|
|
9
|
+
description TEXT,
|
|
10
|
+
files TEXT DEFAULT '[]',
|
|
11
|
+
source_pattern TEXT,
|
|
12
|
+
tests_passed INTEGER,
|
|
13
|
+
status TEXT DEFAULT 'generated',
|
|
14
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
15
|
+
);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_codeproduct_status ON code_products(status);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_codeproduct_type ON code_products(type);
|
|
18
|
+
|
|
19
|
+
CREATE TABLE IF NOT EXISTS code_patterns (
|
|
20
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
21
|
+
pattern TEXT NOT NULL,
|
|
22
|
+
occurrences INTEGER DEFAULT 1,
|
|
23
|
+
files TEXT DEFAULT '[]',
|
|
24
|
+
similarity REAL DEFAULT 0,
|
|
25
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
26
|
+
);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_codepattern_similarity ON code_patterns(similarity);
|
|
28
|
+
`);
|
|
29
|
+
}
|
|
30
|
+
// ── Engine ──────────────────────────────────────────────────
|
|
31
|
+
export class CodeForge {
|
|
32
|
+
db;
|
|
33
|
+
config;
|
|
34
|
+
log = getLogger();
|
|
35
|
+
actionBridge = null;
|
|
36
|
+
codeHealthMonitor = null;
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
+
selfModificationEngine = null;
|
|
39
|
+
guardrailEngine = null;
|
|
40
|
+
// Prepared statements
|
|
41
|
+
stmtInsertProduct;
|
|
42
|
+
stmtInsertPattern;
|
|
43
|
+
stmtGetProduct;
|
|
44
|
+
stmtUpdateProductStatus;
|
|
45
|
+
stmtGetProducts;
|
|
46
|
+
stmtGetPatterns;
|
|
47
|
+
stmtCountByStatus;
|
|
48
|
+
stmtSuccessRate;
|
|
49
|
+
constructor(db, config) {
|
|
50
|
+
this.db = db;
|
|
51
|
+
this.config = {
|
|
52
|
+
brainName: config.brainName,
|
|
53
|
+
autoApplyEnabled: config.autoApplyEnabled ?? false,
|
|
54
|
+
minSimilarityForPattern: config.minSimilarityForPattern ?? 0.6,
|
|
55
|
+
};
|
|
56
|
+
runCodeForgeMigration(db);
|
|
57
|
+
this.stmtInsertProduct = db.prepare(`
|
|
58
|
+
INSERT INTO code_products (type, name, description, files, source_pattern, status)
|
|
59
|
+
VALUES (?, ?, ?, ?, ?, 'generated')
|
|
60
|
+
`);
|
|
61
|
+
this.stmtInsertPattern = db.prepare(`
|
|
62
|
+
INSERT INTO code_patterns (pattern, occurrences, files, similarity)
|
|
63
|
+
VALUES (?, ?, ?, ?)
|
|
64
|
+
`);
|
|
65
|
+
this.stmtGetProduct = db.prepare(`SELECT * FROM code_products WHERE id = ?`);
|
|
66
|
+
this.stmtUpdateProductStatus = db.prepare(`UPDATE code_products SET status = ?, tests_passed = ? WHERE id = ?`);
|
|
67
|
+
this.stmtGetProducts = db.prepare(`SELECT * FROM code_products WHERE status = ? ORDER BY created_at DESC LIMIT ?`);
|
|
68
|
+
this.stmtGetPatterns = db.prepare(`SELECT * FROM code_patterns ORDER BY similarity DESC, occurrences DESC LIMIT ?`);
|
|
69
|
+
this.stmtCountByStatus = db.prepare(`SELECT status, COUNT(*) as count FROM code_products GROUP BY status`);
|
|
70
|
+
this.stmtSuccessRate = db.prepare(`SELECT COUNT(*) as total, SUM(CASE WHEN status = 'applied' THEN 1 ELSE 0 END) as successes FROM code_products WHERE status IN ('applied', 'failed', 'rolled_back')`);
|
|
71
|
+
}
|
|
72
|
+
setActionBridge(bridge) { this.actionBridge = bridge; }
|
|
73
|
+
setCodeHealthMonitor(monitor) { this.codeHealthMonitor = monitor; }
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
setSelfModificationEngine(engine) { this.selfModificationEngine = engine; }
|
|
76
|
+
setGuardrailEngine(engine) { this.guardrailEngine = engine; }
|
|
77
|
+
/** Extract recurring code patterns from codebase analysis */
|
|
78
|
+
extractPatterns() {
|
|
79
|
+
// This is a placeholder — in production this would scan via CodeHealthMonitor
|
|
80
|
+
const rows = this.stmtGetPatterns.all(50);
|
|
81
|
+
return rows.map(r => ({
|
|
82
|
+
id: r.id,
|
|
83
|
+
pattern: r.pattern,
|
|
84
|
+
occurrences: r.occurrences,
|
|
85
|
+
files: JSON.parse(r.files || '[]'),
|
|
86
|
+
similarity: r.similarity,
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
/** Record a discovered pattern */
|
|
90
|
+
addPattern(pattern, occurrences, files, similarity) {
|
|
91
|
+
const result = this.stmtInsertPattern.run(pattern, occurrences, JSON.stringify(files), similarity);
|
|
92
|
+
return Number(result.lastInsertRowid);
|
|
93
|
+
}
|
|
94
|
+
/** Generate a utility from a recurring pattern */
|
|
95
|
+
generateUtility(pattern) {
|
|
96
|
+
const name = `util-${pattern.pattern.replace(/\s+/g, '-').substring(0, 30)}`;
|
|
97
|
+
const description = `Utility extracted from pattern "${pattern.pattern}" (${pattern.occurrences} occurrences)`;
|
|
98
|
+
const files = [{ path: `src/utils/${name}.ts`, content: `// Auto-generated utility from pattern: ${pattern.pattern}\n`, action: 'create' }];
|
|
99
|
+
return this.storeProduct('utility', name, description, files, pattern.pattern);
|
|
100
|
+
}
|
|
101
|
+
/** Auto-apply a self-modification proposal */
|
|
102
|
+
autoApplyProposal(proposalId) {
|
|
103
|
+
if (!this.selfModificationEngine) {
|
|
104
|
+
return { success: false };
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
this.selfModificationEngine.applyModification(proposalId);
|
|
108
|
+
const product = this.storeProduct('refactor', `selfmod-${proposalId}`, `Auto-applied SelfMod proposal #${proposalId}`, [], undefined);
|
|
109
|
+
this.stmtUpdateProductStatus.run('applied', 1, product.id);
|
|
110
|
+
this.log.info(`[code-forge] Auto-applied SelfMod proposal #${proposalId}`);
|
|
111
|
+
return { success: true, productId: product.id };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
this.log.warn(`[code-forge] Auto-apply failed for proposal #${proposalId}: ${err.message}`);
|
|
115
|
+
return { success: false };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Scaffold a new project from a template */
|
|
119
|
+
scaffoldProject(template, config) {
|
|
120
|
+
const name = config.name ?? template;
|
|
121
|
+
const description = `Scaffolded from template: ${template}`;
|
|
122
|
+
const files = [
|
|
123
|
+
{ path: `${name}/package.json`, content: JSON.stringify({ name, version: '1.0.0' }, null, 2), action: 'create' },
|
|
124
|
+
{ path: `${name}/src/index.ts`, content: `// ${name} — scaffolded from ${template}\nexport {};\n`, action: 'create' },
|
|
125
|
+
{ path: `${name}/tsconfig.json`, content: JSON.stringify({ compilerOptions: { target: 'ES2022', module: 'NodeNext' } }, null, 2), action: 'create' },
|
|
126
|
+
];
|
|
127
|
+
return this.storeProduct('scaffold', name, description, files, template);
|
|
128
|
+
}
|
|
129
|
+
/** Generate tests for a target file */
|
|
130
|
+
generateTest(targetFile) {
|
|
131
|
+
const testPath = targetFile.replace(/\.ts$/, '.test.ts').replace('src/', 'src/__tests__/');
|
|
132
|
+
const name = `test-${targetFile.split('/').pop()?.replace('.ts', '')}`;
|
|
133
|
+
const content = `import { describe, it, expect } from 'vitest';\n\ndescribe('${name}', () => {\n it('should work', () => {\n expect(true).toBe(true);\n });\n});\n`;
|
|
134
|
+
const files = [{ path: testPath, content, action: 'create' }];
|
|
135
|
+
return this.storeProduct('test', name, `Auto-generated test for ${targetFile}`, files, undefined);
|
|
136
|
+
}
|
|
137
|
+
/** Apply a code product (mark as applied) */
|
|
138
|
+
applyProduct(productId) {
|
|
139
|
+
const row = this.stmtGetProduct.get(productId);
|
|
140
|
+
if (!row)
|
|
141
|
+
throw new Error(`Product #${productId} not found`);
|
|
142
|
+
if (row.status !== 'generated' && row.status !== 'tested') {
|
|
143
|
+
throw new Error(`Product #${productId} cannot be applied (status=${row.status})`);
|
|
144
|
+
}
|
|
145
|
+
// Check guardrails
|
|
146
|
+
const product = deserializeProduct(row);
|
|
147
|
+
for (const f of product.files) {
|
|
148
|
+
if (this.guardrailEngine?.isProtectedPath(f.path)) {
|
|
149
|
+
this.log.warn(`[code-forge] Cannot apply #${productId}: ${f.path} is protected`);
|
|
150
|
+
this.stmtUpdateProductStatus.run('failed', null, productId);
|
|
151
|
+
return { success: false };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
this.stmtUpdateProductStatus.run('applied', null, productId);
|
|
155
|
+
this.log.info(`[code-forge] Applied product #${productId}: ${row.name}`);
|
|
156
|
+
return { success: true };
|
|
157
|
+
}
|
|
158
|
+
/** Rollback a product */
|
|
159
|
+
rollback(productId) {
|
|
160
|
+
const row = this.stmtGetProduct.get(productId);
|
|
161
|
+
if (!row)
|
|
162
|
+
throw new Error(`Product #${productId} not found`);
|
|
163
|
+
this.stmtUpdateProductStatus.run('rolled_back', null, productId);
|
|
164
|
+
this.log.info(`[code-forge] Rolled back product #${productId}`);
|
|
165
|
+
}
|
|
166
|
+
/** Get products by status */
|
|
167
|
+
getProducts(status) {
|
|
168
|
+
const rows = (status
|
|
169
|
+
? this.stmtGetProducts.all(status, 100)
|
|
170
|
+
: this.db.prepare(`SELECT * FROM code_products ORDER BY created_at DESC LIMIT 100`).all());
|
|
171
|
+
return rows.map(deserializeProduct);
|
|
172
|
+
}
|
|
173
|
+
/** Get status overview */
|
|
174
|
+
getStatus() {
|
|
175
|
+
const counts = this.stmtCountByStatus.all();
|
|
176
|
+
const countMap = {};
|
|
177
|
+
let total = 0;
|
|
178
|
+
for (const c of counts) {
|
|
179
|
+
countMap[c.status] = c.count;
|
|
180
|
+
total += c.count;
|
|
181
|
+
}
|
|
182
|
+
const sr = this.stmtSuccessRate.get();
|
|
183
|
+
return {
|
|
184
|
+
patterns: this.stmtGetPatterns.all(1000).length,
|
|
185
|
+
products: total,
|
|
186
|
+
applied: countMap['applied'] ?? 0,
|
|
187
|
+
successRate: sr.total > 0 ? sr.successes / sr.total : 0,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// ── Private ──────────────────────────────────────────────
|
|
191
|
+
storeProduct(type, name, description, files, sourcePattern) {
|
|
192
|
+
const result = this.stmtInsertProduct.run(type, name, description, JSON.stringify(files), sourcePattern ?? null);
|
|
193
|
+
const id = Number(result.lastInsertRowid);
|
|
194
|
+
this.log.info(`[code-forge] Created product #${id}: ${name} (${type})`);
|
|
195
|
+
return { id, type, name, description, files, sourcePattern, status: 'generated' };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function deserializeProduct(row) {
|
|
199
|
+
return {
|
|
200
|
+
id: row.id,
|
|
201
|
+
type: row.type,
|
|
202
|
+
name: row.name,
|
|
203
|
+
description: row.description,
|
|
204
|
+
files: JSON.parse(row.files || '[]'),
|
|
205
|
+
sourcePattern: row.source_pattern ?? undefined,
|
|
206
|
+
testsPassed: row.tests_passed !== null ? row.tests_passed === 1 : undefined,
|
|
207
|
+
status: row.status,
|
|
208
|
+
createdAt: row.created_at,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=code-forge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-forge.js","sourceRoot":"","sources":["../../src/codegen/code-forge.ts"],"names":[],"mappings":"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"}
|
package/dist/codegen/index.d.ts
CHANGED
|
@@ -11,4 +11,6 @@ export { FeatureExtractor } from './feature-extractor.js';
|
|
|
11
11
|
export type { ExtractedFeature, FeatureCategory, FeatureExtractionResult, FeatureSearchOptions, FeatureStats } from './feature-extractor.js';
|
|
12
12
|
export { FeatureRecommender } from './feature-recommender.js';
|
|
13
13
|
export type { FeatureWish, FeatureConnection, RecommendationResult, FeatureRecommenderStatus } from './feature-recommender.js';
|
|
14
|
+
export { CodeForge, runCodeForgeMigration } from './code-forge.js';
|
|
15
|
+
export type { CodeProduct, CodePattern, CodeForgeConfig, CodeForgeStatus } from './code-forge.js';
|
|
14
16
|
export type { CodeMinerConfig, RepoContent, CodeMinerSummary, ExtractedPattern, DependencyPattern, TechStack, ProjectStructure, ReadmePattern, ContextBuilderConfig, BuiltContext, CodeGeneratorConfig, GenerationTrigger, GenerationStatus, GenerationRequest, GenerationResult, GenerationRecord, CodeGeneratorSummary, } from './types.js';
|
package/dist/codegen/index.js
CHANGED
|
@@ -6,4 +6,5 @@ export { CodegenServer } from './codegen-server.js';
|
|
|
6
6
|
export { RepoAbsorber } from './repo-absorber.js';
|
|
7
7
|
export { FeatureExtractor } from './feature-extractor.js';
|
|
8
8
|
export { FeatureRecommender } from './feature-recommender.js';
|
|
9
|
+
export { CodeForge, runCodeForgeMigration } from './code-forge.js';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import Database from 'better-sqlite3';
|
|
3
|
+
vi.mock('../../utils/logger.js', () => ({
|
|
4
|
+
getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
|
|
5
|
+
}));
|
|
6
|
+
import { ContentForge, runContentForgeMigration } from '../content-forge.js';
|
|
7
|
+
describe('ContentForge', () => {
|
|
8
|
+
let db;
|
|
9
|
+
beforeEach(() => { db = new Database(':memory:'); });
|
|
10
|
+
afterEach(() => { db.close(); });
|
|
11
|
+
it('generates content from an insight', () => {
|
|
12
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
13
|
+
const piece = forge.generateFromInsight({ id: 1, insight: 'Cross-domain patterns emerge between trading and marketing signals', noveltyScore: 0.8 });
|
|
14
|
+
expect(piece.id).toBeGreaterThan(0);
|
|
15
|
+
expect(piece.sourceType).toBe('insight');
|
|
16
|
+
expect(piece.status).toBe('draft');
|
|
17
|
+
expect(piece.platform).toBe('bluesky');
|
|
18
|
+
});
|
|
19
|
+
it('generates content from a mission', () => {
|
|
20
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
21
|
+
const piece = forge.generateFromMission({ id: 5, topic: 'AI agent architectures', summary: 'Survey of modern agent designs' });
|
|
22
|
+
expect(piece.sourceType).toBe('mission');
|
|
23
|
+
expect(piece.title).toContain('Research');
|
|
24
|
+
});
|
|
25
|
+
it('generates content from a trend', () => {
|
|
26
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
27
|
+
const piece = forge.generateFromTrend({ name: 'WebAssembly', description: 'WASM growing in backend usage', category: 'infrastructure' });
|
|
28
|
+
expect(piece.sourceType).toBe('trend');
|
|
29
|
+
expect(piece.title).toContain('Trend');
|
|
30
|
+
});
|
|
31
|
+
it('generates content from a principle', () => {
|
|
32
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
33
|
+
const piece = forge.generateFromPrinciple({ id: 3, statement: 'Early feedback loops reduce cascading failures', domain: 'engineering' });
|
|
34
|
+
expect(piece.sourceType).toBe('principle');
|
|
35
|
+
});
|
|
36
|
+
it('schedules content for later', () => {
|
|
37
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
38
|
+
const piece = forge.generateFromInsight({ insight: 'Test insight', noveltyScore: 0.5 });
|
|
39
|
+
forge.schedule(piece.id, '2026-03-15T10:00:00Z');
|
|
40
|
+
const scheduled = forge.getSchedule();
|
|
41
|
+
expect(scheduled).toHaveLength(1);
|
|
42
|
+
expect(scheduled[0].scheduledFor).toBe('2026-03-15T10:00:00Z');
|
|
43
|
+
expect(scheduled[0].status).toBe('scheduled');
|
|
44
|
+
});
|
|
45
|
+
it('publishes content via social service', async () => {
|
|
46
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
47
|
+
forge.setSocialService({ post: vi.fn().mockResolvedValue({ id: 'post-123' }) });
|
|
48
|
+
const piece = forge.generateFromInsight({ insight: 'Publish me', noveltyScore: 0.9 });
|
|
49
|
+
const result = await forge.publishNow(piece.id);
|
|
50
|
+
expect(result.success).toBe(true);
|
|
51
|
+
expect(result.postId).toBe('post-123');
|
|
52
|
+
const updated = forge.getPiece(piece.id);
|
|
53
|
+
expect(updated?.status).toBe('published');
|
|
54
|
+
});
|
|
55
|
+
it('handles publish failure', async () => {
|
|
56
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
57
|
+
forge.setSocialService({ post: vi.fn().mockRejectedValue(new Error('Rate limited')) });
|
|
58
|
+
const piece = forge.generateFromInsight({ insight: 'Fail publish', noveltyScore: 0.5 });
|
|
59
|
+
const result = await forge.publishNow(piece.id);
|
|
60
|
+
expect(result.success).toBe(false);
|
|
61
|
+
const updated = forge.getPiece(piece.id);
|
|
62
|
+
expect(updated?.status).toBe('failed');
|
|
63
|
+
});
|
|
64
|
+
it('returns failure when no social service', async () => {
|
|
65
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
66
|
+
const piece = forge.generateFromInsight({ insight: 'No service', noveltyScore: 0.5 });
|
|
67
|
+
const result = await forge.publishNow(piece.id);
|
|
68
|
+
expect(result.success).toBe(false);
|
|
69
|
+
});
|
|
70
|
+
it('records engagement metrics', () => {
|
|
71
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
72
|
+
forge.setSocialService({ post: vi.fn().mockResolvedValue({ id: 'p1' }) });
|
|
73
|
+
const piece = forge.generateFromInsight({ insight: 'Engage me', noveltyScore: 0.7 });
|
|
74
|
+
forge.recordEngagement(piece.id, { likes: 42, reposts: 10, replies: 5 });
|
|
75
|
+
const updated = forge.getPiece(piece.id);
|
|
76
|
+
expect(updated?.engagement?.likes).toBe(42);
|
|
77
|
+
});
|
|
78
|
+
it('gets best performing content', async () => {
|
|
79
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
80
|
+
forge.setSocialService({ post: vi.fn().mockResolvedValue({ id: 'p1' }) });
|
|
81
|
+
const p1 = forge.generateFromInsight({ insight: 'Popular', noveltyScore: 0.9 });
|
|
82
|
+
const p2 = forge.generateFromInsight({ insight: 'Less popular', noveltyScore: 0.5 });
|
|
83
|
+
await forge.publishNow(p1.id);
|
|
84
|
+
await forge.publishNow(p2.id);
|
|
85
|
+
forge.recordEngagement(p1.id, { likes: 100, reposts: 50, replies: 20 });
|
|
86
|
+
forge.recordEngagement(p2.id, { likes: 5, reposts: 1, replies: 0 });
|
|
87
|
+
const best = forge.getBestPerforming(2);
|
|
88
|
+
expect(best).toHaveLength(2);
|
|
89
|
+
expect(best[0].engagement?.likes).toBe(100);
|
|
90
|
+
});
|
|
91
|
+
it('returns optimal posting time', () => {
|
|
92
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
93
|
+
expect(forge.getOptimalTime('bluesky')).toBe('10:00');
|
|
94
|
+
expect(forge.getOptimalTime('reddit')).toBe('08:00');
|
|
95
|
+
});
|
|
96
|
+
it('getStatus returns overview', () => {
|
|
97
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
98
|
+
forge.generateFromInsight({ insight: 'Draft 1', noveltyScore: 0.5 });
|
|
99
|
+
forge.generateFromInsight({ insight: 'Draft 2', noveltyScore: 0.6 });
|
|
100
|
+
const status = forge.getStatus();
|
|
101
|
+
expect(status.drafts).toBe(2);
|
|
102
|
+
expect(status.published).toBe(0);
|
|
103
|
+
});
|
|
104
|
+
it('migration is idempotent', () => {
|
|
105
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
106
|
+
forge.generateFromInsight({ insight: 'Survives', noveltyScore: 0.5 });
|
|
107
|
+
runContentForgeMigration(db);
|
|
108
|
+
const pieces = forge.getByStatus('draft');
|
|
109
|
+
expect(pieces).toHaveLength(1);
|
|
110
|
+
});
|
|
111
|
+
it('uses custom platform', () => {
|
|
112
|
+
const forge = new ContentForge(db, { brainName: 'test' });
|
|
113
|
+
const piece = forge.generateFromInsight({ insight: 'Reddit post', noveltyScore: 0.7 }, 'reddit');
|
|
114
|
+
expect(piece.platform).toBe('reddit');
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=content-forge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-forge.test.js","sourceRoot":"","sources":["../../../src/content/__tests__/content-forge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export interface ContentPiece {
|
|
3
|
+
id: number;
|
|
4
|
+
sourceType: 'insight' | 'mission' | 'trend' | 'principle' | 'manual';
|
|
5
|
+
sourceId?: number;
|
|
6
|
+
platform: 'bluesky' | 'reddit' | 'telegram' | 'discord';
|
|
7
|
+
title: string;
|
|
8
|
+
body: string;
|
|
9
|
+
hashtags: string[];
|
|
10
|
+
scheduledFor?: string;
|
|
11
|
+
status: 'draft' | 'scheduled' | 'published' | 'failed';
|
|
12
|
+
engagement?: ContentEngagement;
|
|
13
|
+
createdAt?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ContentEngagement {
|
|
16
|
+
likes: number;
|
|
17
|
+
reposts: number;
|
|
18
|
+
replies: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ContentForgeConfig {
|
|
21
|
+
brainName: string;
|
|
22
|
+
defaultPlatform?: ContentPiece['platform'];
|
|
23
|
+
maxDraftsPerCycle?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ContentForgeStatus {
|
|
26
|
+
drafts: number;
|
|
27
|
+
scheduled: number;
|
|
28
|
+
published: number;
|
|
29
|
+
avgEngagement: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function runContentForgeMigration(db: Database.Database): void;
|
|
32
|
+
export declare class ContentForge {
|
|
33
|
+
private readonly db;
|
|
34
|
+
private readonly config;
|
|
35
|
+
private readonly log;
|
|
36
|
+
private llmService;
|
|
37
|
+
private socialService;
|
|
38
|
+
private actionBridge;
|
|
39
|
+
private readonly stmtInsert;
|
|
40
|
+
private readonly stmtGetById;
|
|
41
|
+
private readonly stmtUpdateStatus;
|
|
42
|
+
private readonly stmtSetSchedule;
|
|
43
|
+
private readonly stmtSetEngagement;
|
|
44
|
+
private readonly stmtGetByStatus;
|
|
45
|
+
private readonly stmtGetSchedule;
|
|
46
|
+
private readonly stmtGetBest;
|
|
47
|
+
private readonly stmtCountByStatus;
|
|
48
|
+
private readonly stmtAvgEngagement;
|
|
49
|
+
constructor(db: Database.Database, config: ContentForgeConfig);
|
|
50
|
+
setLLMService(service: any): void;
|
|
51
|
+
setSocialService(service: {
|
|
52
|
+
post: (platform: string, content: string) => Promise<{
|
|
53
|
+
id: string;
|
|
54
|
+
}>;
|
|
55
|
+
}): void;
|
|
56
|
+
setActionBridge(bridge: import('../action/action-bridge.js').ActionBridgeEngine): void;
|
|
57
|
+
/** Generate content from an insight */
|
|
58
|
+
generateFromInsight(insight: {
|
|
59
|
+
id?: number;
|
|
60
|
+
insight: string;
|
|
61
|
+
noveltyScore: number;
|
|
62
|
+
}, platform?: ContentPiece['platform']): ContentPiece;
|
|
63
|
+
/** Generate content from a mission report */
|
|
64
|
+
generateFromMission(mission: {
|
|
65
|
+
id?: number;
|
|
66
|
+
topic: string;
|
|
67
|
+
summary?: string;
|
|
68
|
+
}, platform?: ContentPiece['platform']): ContentPiece;
|
|
69
|
+
/** Generate content from a tech trend */
|
|
70
|
+
generateFromTrend(trend: {
|
|
71
|
+
name: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
category?: string;
|
|
74
|
+
}, platform?: ContentPiece['platform']): ContentPiece;
|
|
75
|
+
/** Generate content from a principle */
|
|
76
|
+
generateFromPrinciple(principle: {
|
|
77
|
+
id?: number;
|
|
78
|
+
statement: string;
|
|
79
|
+
domain?: string;
|
|
80
|
+
}, platform?: ContentPiece['platform']): ContentPiece;
|
|
81
|
+
/** Schedule a piece for later publication */
|
|
82
|
+
schedule(pieceId: number, when: string): void;
|
|
83
|
+
/** Publish immediately */
|
|
84
|
+
publishNow(pieceId: number): Promise<{
|
|
85
|
+
success: boolean;
|
|
86
|
+
postId?: string;
|
|
87
|
+
}>;
|
|
88
|
+
/** Get scheduled content */
|
|
89
|
+
getSchedule(): ContentPiece[];
|
|
90
|
+
/** Record engagement metrics */
|
|
91
|
+
recordEngagement(pieceId: number, metrics: ContentEngagement): void;
|
|
92
|
+
/** Get best performing published content */
|
|
93
|
+
getBestPerforming(limit?: number): ContentPiece[];
|
|
94
|
+
/** Get optimal posting time for a platform (placeholder — learns from engagement data) */
|
|
95
|
+
getOptimalTime(platform: string): string;
|
|
96
|
+
/** Get content pieces by status */
|
|
97
|
+
getByStatus(status: string, limit?: number): ContentPiece[];
|
|
98
|
+
/** Get a single piece by ID */
|
|
99
|
+
getPiece(id: number): ContentPiece | null;
|
|
100
|
+
/** Get status overview */
|
|
101
|
+
getStatus(): ContentForgeStatus;
|
|
102
|
+
private storePiece;
|
|
103
|
+
private extractHashtags;
|
|
104
|
+
}
|