genesis-ai-cli 7.4.5
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/.env.example +78 -0
- package/README.md +282 -0
- package/dist/src/active-inference/actions.d.ts +75 -0
- package/dist/src/active-inference/actions.js +250 -0
- package/dist/src/active-inference/autonomous-loop.d.ts +103 -0
- package/dist/src/active-inference/autonomous-loop.js +289 -0
- package/dist/src/active-inference/core.d.ts +85 -0
- package/dist/src/active-inference/core.js +555 -0
- package/dist/src/active-inference/demo-autonomous-loop.d.ts +8 -0
- package/dist/src/active-inference/demo-autonomous-loop.js +338 -0
- package/dist/src/active-inference/demo-value-integration.d.ts +8 -0
- package/dist/src/active-inference/demo-value-integration.js +174 -0
- package/dist/src/active-inference/index.d.ts +32 -0
- package/dist/src/active-inference/index.js +88 -0
- package/dist/src/active-inference/integration.d.ts +114 -0
- package/dist/src/active-inference/integration.js +698 -0
- package/dist/src/active-inference/memory-integration.d.ts +51 -0
- package/dist/src/active-inference/memory-integration.js +232 -0
- package/dist/src/active-inference/observations.d.ts +67 -0
- package/dist/src/active-inference/observations.js +147 -0
- package/dist/src/active-inference/test-active-inference.d.ts +8 -0
- package/dist/src/active-inference/test-active-inference.js +320 -0
- package/dist/src/active-inference/test-value-integration.d.ts +6 -0
- package/dist/src/active-inference/test-value-integration.js +168 -0
- package/dist/src/active-inference/types.d.ts +150 -0
- package/dist/src/active-inference/types.js +59 -0
- package/dist/src/active-inference/value-integration.d.ts +164 -0
- package/dist/src/active-inference/value-integration.js +459 -0
- package/dist/src/agents/base-agent.d.ts +53 -0
- package/dist/src/agents/base-agent.js +178 -0
- package/dist/src/agents/builder.d.ts +67 -0
- package/dist/src/agents/builder.js +537 -0
- package/dist/src/agents/critic.d.ts +35 -0
- package/dist/src/agents/critic.js +322 -0
- package/dist/src/agents/ethicist.d.ts +54 -0
- package/dist/src/agents/ethicist.js +393 -0
- package/dist/src/agents/explorer.d.ts +26 -0
- package/dist/src/agents/explorer.js +216 -0
- package/dist/src/agents/feeling.d.ts +41 -0
- package/dist/src/agents/feeling.js +320 -0
- package/dist/src/agents/index.d.ts +111 -0
- package/dist/src/agents/index.js +222 -0
- package/dist/src/agents/memory.d.ts +69 -0
- package/dist/src/agents/memory.js +404 -0
- package/dist/src/agents/message-bus.d.ts +88 -0
- package/dist/src/agents/message-bus.js +267 -0
- package/dist/src/agents/narrator.d.ts +90 -0
- package/dist/src/agents/narrator.js +473 -0
- package/dist/src/agents/planner.d.ts +38 -0
- package/dist/src/agents/planner.js +341 -0
- package/dist/src/agents/predictor.d.ts +73 -0
- package/dist/src/agents/predictor.js +506 -0
- package/dist/src/agents/sensor.d.ts +88 -0
- package/dist/src/agents/sensor.js +377 -0
- package/dist/src/agents/test-agents.d.ts +6 -0
- package/dist/src/agents/test-agents.js +73 -0
- package/dist/src/agents/types.d.ts +194 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/brain/index.d.ts +185 -0
- package/dist/src/brain/index.js +843 -0
- package/dist/src/brain/trace.d.ts +91 -0
- package/dist/src/brain/trace.js +327 -0
- package/dist/src/brain/types.d.ts +165 -0
- package/dist/src/brain/types.js +51 -0
- package/dist/src/cli/chat.d.ts +237 -0
- package/dist/src/cli/chat.js +1959 -0
- package/dist/src/cli/dispatcher.d.ts +182 -0
- package/dist/src/cli/dispatcher.js +718 -0
- package/dist/src/cli/human-loop.d.ts +170 -0
- package/dist/src/cli/human-loop.js +543 -0
- package/dist/src/cli/index.d.ts +12 -0
- package/dist/src/cli/index.js +28 -0
- package/dist/src/cli/interactive.d.ts +141 -0
- package/dist/src/cli/interactive.js +757 -0
- package/dist/src/cli/ui.d.ts +205 -0
- package/dist/src/cli/ui.js +632 -0
- package/dist/src/consciousness/attention-schema.d.ts +154 -0
- package/dist/src/consciousness/attention-schema.js +432 -0
- package/dist/src/consciousness/global-workspace.d.ts +149 -0
- package/dist/src/consciousness/global-workspace.js +422 -0
- package/dist/src/consciousness/index.d.ts +186 -0
- package/dist/src/consciousness/index.js +476 -0
- package/dist/src/consciousness/phi-calculator.d.ts +119 -0
- package/dist/src/consciousness/phi-calculator.js +445 -0
- package/dist/src/consciousness/phi-decisions.d.ts +169 -0
- package/dist/src/consciousness/phi-decisions.js +383 -0
- package/dist/src/consciousness/phi-monitor.d.ts +153 -0
- package/dist/src/consciousness/phi-monitor.js +465 -0
- package/dist/src/consciousness/types.d.ts +260 -0
- package/dist/src/consciousness/types.js +44 -0
- package/dist/src/daemon/dream-mode.d.ts +115 -0
- package/dist/src/daemon/dream-mode.js +470 -0
- package/dist/src/daemon/index.d.ts +162 -0
- package/dist/src/daemon/index.js +542 -0
- package/dist/src/daemon/maintenance.d.ts +139 -0
- package/dist/src/daemon/maintenance.js +549 -0
- package/dist/src/daemon/process.d.ts +82 -0
- package/dist/src/daemon/process.js +442 -0
- package/dist/src/daemon/scheduler.d.ts +90 -0
- package/dist/src/daemon/scheduler.js +494 -0
- package/dist/src/daemon/types.d.ts +213 -0
- package/dist/src/daemon/types.js +50 -0
- package/dist/src/epistemic/index.d.ts +74 -0
- package/dist/src/epistemic/index.js +225 -0
- package/dist/src/grounding/epistemic-stack.d.ts +100 -0
- package/dist/src/grounding/epistemic-stack.js +408 -0
- package/dist/src/grounding/feedback.d.ts +98 -0
- package/dist/src/grounding/feedback.js +276 -0
- package/dist/src/grounding/index.d.ts +123 -0
- package/dist/src/grounding/index.js +224 -0
- package/dist/src/grounding/verifier.d.ts +149 -0
- package/dist/src/grounding/verifier.js +484 -0
- package/dist/src/healing/detector.d.ts +110 -0
- package/dist/src/healing/detector.js +436 -0
- package/dist/src/healing/fixer.d.ts +138 -0
- package/dist/src/healing/fixer.js +572 -0
- package/dist/src/healing/index.d.ts +23 -0
- package/dist/src/healing/index.js +43 -0
- package/dist/src/hooks/index.d.ts +135 -0
- package/dist/src/hooks/index.js +317 -0
- package/dist/src/index.d.ts +23 -0
- package/dist/src/index.js +1266 -0
- package/dist/src/kernel/index.d.ts +155 -0
- package/dist/src/kernel/index.js +795 -0
- package/dist/src/kernel/invariants.d.ts +153 -0
- package/dist/src/kernel/invariants.js +355 -0
- package/dist/src/kernel/test-kernel.d.ts +6 -0
- package/dist/src/kernel/test-kernel.js +108 -0
- package/dist/src/kernel/test-real-mcp.d.ts +10 -0
- package/dist/src/kernel/test-real-mcp.js +295 -0
- package/dist/src/llm/index.d.ts +146 -0
- package/dist/src/llm/index.js +428 -0
- package/dist/src/llm/router.d.ts +136 -0
- package/dist/src/llm/router.js +510 -0
- package/dist/src/mcp/index.d.ts +85 -0
- package/dist/src/mcp/index.js +657 -0
- package/dist/src/mcp/resilient.d.ts +139 -0
- package/dist/src/mcp/resilient.js +417 -0
- package/dist/src/memory/cache.d.ts +118 -0
- package/dist/src/memory/cache.js +356 -0
- package/dist/src/memory/cognitive-workspace.d.ts +231 -0
- package/dist/src/memory/cognitive-workspace.js +521 -0
- package/dist/src/memory/consolidation.d.ts +99 -0
- package/dist/src/memory/consolidation.js +443 -0
- package/dist/src/memory/episodic.d.ts +114 -0
- package/dist/src/memory/episodic.js +394 -0
- package/dist/src/memory/forgetting.d.ts +134 -0
- package/dist/src/memory/forgetting.js +324 -0
- package/dist/src/memory/index.d.ts +211 -0
- package/dist/src/memory/index.js +367 -0
- package/dist/src/memory/indexer.d.ts +123 -0
- package/dist/src/memory/indexer.js +479 -0
- package/dist/src/memory/procedural.d.ts +136 -0
- package/dist/src/memory/procedural.js +479 -0
- package/dist/src/memory/semantic.d.ts +132 -0
- package/dist/src/memory/semantic.js +497 -0
- package/dist/src/memory/types.d.ts +193 -0
- package/dist/src/memory/types.js +15 -0
- package/dist/src/orchestrator.d.ts +65 -0
- package/dist/src/orchestrator.js +317 -0
- package/dist/src/persistence/index.d.ts +257 -0
- package/dist/src/persistence/index.js +763 -0
- package/dist/src/pipeline/executor.d.ts +51 -0
- package/dist/src/pipeline/executor.js +695 -0
- package/dist/src/pipeline/index.d.ts +7 -0
- package/dist/src/pipeline/index.js +11 -0
- package/dist/src/self-production.d.ts +67 -0
- package/dist/src/self-production.js +205 -0
- package/dist/src/subagents/executor.d.ts +58 -0
- package/dist/src/subagents/executor.js +283 -0
- package/dist/src/subagents/index.d.ts +37 -0
- package/dist/src/subagents/index.js +53 -0
- package/dist/src/subagents/registry.d.ts +23 -0
- package/dist/src/subagents/registry.js +167 -0
- package/dist/src/subagents/types.d.ts +79 -0
- package/dist/src/subagents/types.js +14 -0
- package/dist/src/tools/bash.d.ts +139 -0
- package/dist/src/tools/bash.js +583 -0
- package/dist/src/tools/edit.d.ts +125 -0
- package/dist/src/tools/edit.js +424 -0
- package/dist/src/tools/git.d.ts +179 -0
- package/dist/src/tools/git.js +504 -0
- package/dist/src/tools/index.d.ts +21 -0
- package/dist/src/tools/index.js +163 -0
- package/dist/src/types.d.ts +145 -0
- package/dist/src/types.js +7 -0
- package/dist/src/world-model/decoder.d.ts +163 -0
- package/dist/src/world-model/decoder.js +517 -0
- package/dist/src/world-model/digital-twin.d.ts +219 -0
- package/dist/src/world-model/digital-twin.js +695 -0
- package/dist/src/world-model/encoder.d.ts +141 -0
- package/dist/src/world-model/encoder.js +564 -0
- package/dist/src/world-model/index.d.ts +221 -0
- package/dist/src/world-model/index.js +772 -0
- package/dist/src/world-model/predictor.d.ts +161 -0
- package/dist/src/world-model/predictor.js +681 -0
- package/dist/src/world-model/test-value-jepa.d.ts +8 -0
- package/dist/src/world-model/test-value-jepa.js +430 -0
- package/dist/src/world-model/types.d.ts +341 -0
- package/dist/src/world-model/types.js +69 -0
- package/dist/src/world-model/value-jepa.d.ts +247 -0
- package/dist/src/world-model/value-jepa.js +622 -0
- package/dist/test/brain.test.d.ts +11 -0
- package/dist/test/brain.test.js +358 -0
- package/dist/test/cli/dispatcher.test.d.ts +4 -0
- package/dist/test/cli/dispatcher.test.js +332 -0
- package/dist/test/cli/human-loop.test.d.ts +4 -0
- package/dist/test/cli/human-loop.test.js +270 -0
- package/dist/test/grounding/feedback.test.d.ts +4 -0
- package/dist/test/grounding/feedback.test.js +462 -0
- package/dist/test/grounding/verifier.test.d.ts +4 -0
- package/dist/test/grounding/verifier.test.js +442 -0
- package/dist/test/grounding.test.d.ts +6 -0
- package/dist/test/grounding.test.js +246 -0
- package/dist/test/healing/detector.test.d.ts +4 -0
- package/dist/test/healing/detector.test.js +266 -0
- package/dist/test/healing/fixer.test.d.ts +4 -0
- package/dist/test/healing/fixer.test.js +369 -0
- package/dist/test/integration.test.d.ts +5 -0
- package/dist/test/integration.test.js +290 -0
- package/dist/test/tools/bash.test.d.ts +4 -0
- package/dist/test/tools/bash.test.js +348 -0
- package/dist/test/tools/edit.test.d.ts +4 -0
- package/dist/test/tools/edit.test.js +350 -0
- package/dist/test/tools/git.test.d.ts +4 -0
- package/dist/test/tools/git.test.js +350 -0
- package/package.json +60 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Genesis 4.0 - Builder Agent
|
|
4
|
+
*
|
|
5
|
+
* Generates code, artifacts, and structures.
|
|
6
|
+
* The craftsman: "Let me build that for you"
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Code generation from specifications
|
|
10
|
+
* - Iteration based on Critic feedback
|
|
11
|
+
* - Template-based generation
|
|
12
|
+
* - Quality checks before output
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.BuilderAgent = void 0;
|
|
16
|
+
exports.createBuilderAgent = createBuilderAgent;
|
|
17
|
+
const base_agent_js_1 = require("./base-agent.js");
|
|
18
|
+
const message_bus_js_1 = require("./message-bus.js");
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Builder Agent
|
|
21
|
+
// ============================================================================
|
|
22
|
+
class BuilderAgent extends base_agent_js_1.BaseAgent {
|
|
23
|
+
// Build history
|
|
24
|
+
buildHistory = [];
|
|
25
|
+
// Templates library
|
|
26
|
+
templates = new Map();
|
|
27
|
+
// Max iterations for improvement cycles
|
|
28
|
+
maxIterations = 5;
|
|
29
|
+
constructor(bus = message_bus_js_1.messageBus) {
|
|
30
|
+
super({ type: 'builder' }, bus);
|
|
31
|
+
this.initializeTemplates();
|
|
32
|
+
}
|
|
33
|
+
initializeTemplates() {
|
|
34
|
+
// TypeScript function template
|
|
35
|
+
this.templates.set('ts-function', {
|
|
36
|
+
name: 'ts-function',
|
|
37
|
+
type: 'code',
|
|
38
|
+
language: 'typescript',
|
|
39
|
+
template: `/**
|
|
40
|
+
* {{description}}
|
|
41
|
+
* {{params}}
|
|
42
|
+
* @returns {{returnType}}
|
|
43
|
+
*/
|
|
44
|
+
export function {{name}}({{parameters}}): {{returnType}} {
|
|
45
|
+
{{body}}
|
|
46
|
+
}`,
|
|
47
|
+
placeholders: ['description', 'params', 'returnType', 'name', 'parameters', 'body'],
|
|
48
|
+
});
|
|
49
|
+
// TypeScript class template
|
|
50
|
+
this.templates.set('ts-class', {
|
|
51
|
+
name: 'ts-class',
|
|
52
|
+
type: 'code',
|
|
53
|
+
language: 'typescript',
|
|
54
|
+
template: `/**
|
|
55
|
+
* {{description}}
|
|
56
|
+
*/
|
|
57
|
+
export class {{name}} {{extends}} {{implements}} {
|
|
58
|
+
{{properties}}
|
|
59
|
+
|
|
60
|
+
constructor({{constructorParams}}) {
|
|
61
|
+
{{constructorBody}}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
{{methods}}
|
|
65
|
+
}`,
|
|
66
|
+
placeholders: ['description', 'name', 'extends', 'implements', 'properties', 'constructorParams', 'constructorBody', 'methods'],
|
|
67
|
+
});
|
|
68
|
+
// Test template
|
|
69
|
+
this.templates.set('ts-test', {
|
|
70
|
+
name: 'ts-test',
|
|
71
|
+
type: 'test',
|
|
72
|
+
language: 'typescript',
|
|
73
|
+
template: `import { describe, it, expect, beforeEach } from 'vitest';
|
|
74
|
+
import { {{imports}} } from '{{importPath}}';
|
|
75
|
+
|
|
76
|
+
describe('{{suiteName}}', () => {
|
|
77
|
+
{{setup}}
|
|
78
|
+
|
|
79
|
+
{{testCases}}
|
|
80
|
+
});`,
|
|
81
|
+
placeholders: ['imports', 'importPath', 'suiteName', 'setup', 'testCases'],
|
|
82
|
+
});
|
|
83
|
+
// JSON config template
|
|
84
|
+
this.templates.set('json-config', {
|
|
85
|
+
name: 'json-config',
|
|
86
|
+
type: 'config',
|
|
87
|
+
language: 'json',
|
|
88
|
+
template: `{
|
|
89
|
+
"name": "{{name}}",
|
|
90
|
+
"version": "{{version}}",
|
|
91
|
+
"description": "{{description}}",
|
|
92
|
+
{{additionalFields}}
|
|
93
|
+
}`,
|
|
94
|
+
placeholders: ['name', 'version', 'description', 'additionalFields'],
|
|
95
|
+
});
|
|
96
|
+
// Markdown documentation template
|
|
97
|
+
this.templates.set('md-doc', {
|
|
98
|
+
name: 'md-doc',
|
|
99
|
+
type: 'documentation',
|
|
100
|
+
language: 'markdown',
|
|
101
|
+
template: `# {{title}}
|
|
102
|
+
|
|
103
|
+
{{overview}}
|
|
104
|
+
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
{{features}}
|
|
108
|
+
|
|
109
|
+
## Usage
|
|
110
|
+
|
|
111
|
+
{{usage}}
|
|
112
|
+
|
|
113
|
+
## API
|
|
114
|
+
|
|
115
|
+
{{api}}
|
|
116
|
+
|
|
117
|
+
## Examples
|
|
118
|
+
|
|
119
|
+
{{examples}}
|
|
120
|
+
`,
|
|
121
|
+
placeholders: ['title', 'overview', 'features', 'usage', 'api', 'examples'],
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Message Handling
|
|
126
|
+
// ============================================================================
|
|
127
|
+
getMessageTypes() {
|
|
128
|
+
return ['BUILD', 'CRITIQUE', 'QUERY', 'COMMAND'];
|
|
129
|
+
}
|
|
130
|
+
async process(message) {
|
|
131
|
+
switch (message.type) {
|
|
132
|
+
case 'BUILD':
|
|
133
|
+
return this.handleBuildRequest(message);
|
|
134
|
+
case 'CRITIQUE':
|
|
135
|
+
return this.handleCritique(message);
|
|
136
|
+
case 'QUERY':
|
|
137
|
+
return this.handleQuery(message);
|
|
138
|
+
case 'COMMAND':
|
|
139
|
+
return this.handleCommand(message);
|
|
140
|
+
default:
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// ============================================================================
|
|
145
|
+
// Build Logic
|
|
146
|
+
// ============================================================================
|
|
147
|
+
async handleBuildRequest(message) {
|
|
148
|
+
const request = message.payload;
|
|
149
|
+
const result = await this.build(request);
|
|
150
|
+
this.log(`Built ${result.artifacts.length} artifact(s) in ${result.iterations} iteration(s)`);
|
|
151
|
+
// Broadcast build result for auto-critique
|
|
152
|
+
await this.broadcast('BUILD_RESULT', {
|
|
153
|
+
artifacts: result.artifacts,
|
|
154
|
+
specification: request.specification,
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
...this.createResponse(message, 'RESPONSE', result),
|
|
158
|
+
id: '',
|
|
159
|
+
timestamp: new Date(),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async build(request) {
|
|
163
|
+
let artifacts = this.generate(request);
|
|
164
|
+
let iterations = 1;
|
|
165
|
+
let passedReview = false;
|
|
166
|
+
let finalScore = 0;
|
|
167
|
+
// If iteration requested, loop until pass or max iterations
|
|
168
|
+
if (request.iterateUntilPass) {
|
|
169
|
+
const maxIter = request.maxIterations || this.maxIterations;
|
|
170
|
+
while (iterations < maxIter && !passedReview) {
|
|
171
|
+
// Request critique from Critic agent
|
|
172
|
+
const critique = await this.requestCritique(artifacts);
|
|
173
|
+
finalScore = critique.overallScore;
|
|
174
|
+
passedReview = critique.passesReview;
|
|
175
|
+
if (!passedReview) {
|
|
176
|
+
// Iterate based on suggestions
|
|
177
|
+
artifacts = this.iterate(artifacts, critique);
|
|
178
|
+
iterations++;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const result = {
|
|
183
|
+
artifacts,
|
|
184
|
+
iterations,
|
|
185
|
+
passedReview,
|
|
186
|
+
finalScore,
|
|
187
|
+
};
|
|
188
|
+
this.buildHistory.push(result);
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
generate(request) {
|
|
192
|
+
const artifacts = [];
|
|
193
|
+
switch (request.type) {
|
|
194
|
+
case 'code':
|
|
195
|
+
artifacts.push(this.generateCode(request));
|
|
196
|
+
break;
|
|
197
|
+
case 'config':
|
|
198
|
+
artifacts.push(this.generateConfig(request));
|
|
199
|
+
break;
|
|
200
|
+
case 'documentation':
|
|
201
|
+
artifacts.push(this.generateDocumentation(request));
|
|
202
|
+
break;
|
|
203
|
+
case 'test':
|
|
204
|
+
artifacts.push(this.generateTest(request));
|
|
205
|
+
break;
|
|
206
|
+
case 'schema':
|
|
207
|
+
artifacts.push(this.generateSchema(request));
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
return artifacts;
|
|
211
|
+
}
|
|
212
|
+
// ============================================================================
|
|
213
|
+
// Code Generation
|
|
214
|
+
// ============================================================================
|
|
215
|
+
generateCode(request) {
|
|
216
|
+
const spec = request.specification;
|
|
217
|
+
const language = request.language || 'typescript';
|
|
218
|
+
// Parse specification to determine structure
|
|
219
|
+
const structure = this.parseSpecification(spec);
|
|
220
|
+
let content;
|
|
221
|
+
if (structure.type === 'function') {
|
|
222
|
+
content = this.generateFunction(structure, language);
|
|
223
|
+
}
|
|
224
|
+
else if (structure.type === 'class') {
|
|
225
|
+
content = this.generateClass(structure, language);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
content = this.generateGenericCode(spec, language);
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
type: 'file',
|
|
232
|
+
name: structure.name || 'generated',
|
|
233
|
+
language,
|
|
234
|
+
content,
|
|
235
|
+
metadata: {
|
|
236
|
+
generatedAt: new Date().toISOString(),
|
|
237
|
+
specification: spec.slice(0, 100),
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
parseSpecification(spec) {
|
|
242
|
+
const specLower = spec.toLowerCase();
|
|
243
|
+
// Try to detect type
|
|
244
|
+
let type = 'unknown';
|
|
245
|
+
if (specLower.includes('function') || specLower.includes('funzione')) {
|
|
246
|
+
type = 'function';
|
|
247
|
+
}
|
|
248
|
+
else if (specLower.includes('class') || specLower.includes('classe')) {
|
|
249
|
+
type = 'class';
|
|
250
|
+
}
|
|
251
|
+
else if (specLower.includes('module') || specLower.includes('modulo')) {
|
|
252
|
+
type = 'module';
|
|
253
|
+
}
|
|
254
|
+
// Extract name (look for quoted strings or camelCase/PascalCase words)
|
|
255
|
+
const nameMatch = spec.match(/["']([^"']+)["']/) || spec.match(/\b([A-Z][a-zA-Z0-9]+)\b/);
|
|
256
|
+
const name = nameMatch ? nameMatch[1] : 'Generated';
|
|
257
|
+
return {
|
|
258
|
+
type,
|
|
259
|
+
name,
|
|
260
|
+
description: spec,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
generateFunction(structure, language) {
|
|
264
|
+
const template = this.templates.get('ts-function');
|
|
265
|
+
if (!template || language !== 'typescript') {
|
|
266
|
+
return this.generateGenericCode(structure.description, language);
|
|
267
|
+
}
|
|
268
|
+
// Simple placeholder replacement
|
|
269
|
+
let code = template.template;
|
|
270
|
+
code = code.replace('{{description}}', structure.description || 'Generated function');
|
|
271
|
+
code = code.replace('{{params}}', '');
|
|
272
|
+
code = code.replace('{{returnType}}', 'void');
|
|
273
|
+
code = code.replace('{{name}}', this.toCamelCase(structure.name));
|
|
274
|
+
code = code.replace('{{parameters}}', '');
|
|
275
|
+
code = code.replace('{{body}}', '// TODO: Implement');
|
|
276
|
+
return code;
|
|
277
|
+
}
|
|
278
|
+
generateClass(structure, language) {
|
|
279
|
+
const template = this.templates.get('ts-class');
|
|
280
|
+
if (!template || language !== 'typescript') {
|
|
281
|
+
return this.generateGenericCode(structure.description, language);
|
|
282
|
+
}
|
|
283
|
+
let code = template.template;
|
|
284
|
+
code = code.replace('{{description}}', structure.description || 'Generated class');
|
|
285
|
+
code = code.replace('{{name}}', this.toPascalCase(structure.name));
|
|
286
|
+
code = code.replace('{{extends}}', '');
|
|
287
|
+
code = code.replace('{{implements}}', '');
|
|
288
|
+
code = code.replace('{{properties}}', '');
|
|
289
|
+
code = code.replace('{{constructorParams}}', '');
|
|
290
|
+
code = code.replace('{{constructorBody}}', '');
|
|
291
|
+
code = code.replace('{{methods}}', '');
|
|
292
|
+
return code;
|
|
293
|
+
}
|
|
294
|
+
generateGenericCode(spec, language) {
|
|
295
|
+
// Fallback: generate a stub with the specification as comment
|
|
296
|
+
const commentStyle = language === 'python' ? '#' : '//';
|
|
297
|
+
return `${commentStyle} Generated from specification:
|
|
298
|
+
${commentStyle} ${spec.split('\n').join(`\n${commentStyle} `)}
|
|
299
|
+
|
|
300
|
+
${commentStyle} TODO: Implement this code
|
|
301
|
+
`;
|
|
302
|
+
}
|
|
303
|
+
// ============================================================================
|
|
304
|
+
// Other Generators
|
|
305
|
+
// ============================================================================
|
|
306
|
+
generateConfig(request) {
|
|
307
|
+
const template = this.templates.get('json-config');
|
|
308
|
+
let content;
|
|
309
|
+
if (template) {
|
|
310
|
+
content = template.template;
|
|
311
|
+
content = content.replace('{{name}}', 'generated-config');
|
|
312
|
+
content = content.replace('{{version}}', '1.0.0');
|
|
313
|
+
content = content.replace('{{description}}', request.specification);
|
|
314
|
+
content = content.replace('{{additionalFields}}', '');
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
content = JSON.stringify({ specification: request.specification }, null, 2);
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
type: 'file',
|
|
321
|
+
name: 'config.json',
|
|
322
|
+
language: 'json',
|
|
323
|
+
content,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
generateDocumentation(request) {
|
|
327
|
+
const template = this.templates.get('md-doc');
|
|
328
|
+
let content;
|
|
329
|
+
if (template) {
|
|
330
|
+
content = template.template;
|
|
331
|
+
content = content.replace('{{title}}', 'Generated Documentation');
|
|
332
|
+
content = content.replace('{{overview}}', request.specification);
|
|
333
|
+
content = content.replace('{{features}}', '- Feature 1\n- Feature 2');
|
|
334
|
+
content = content.replace('{{usage}}', '```\n// Usage example\n```');
|
|
335
|
+
content = content.replace('{{api}}', '## Methods\n\n(API documentation here)');
|
|
336
|
+
content = content.replace('{{examples}}', '```\n// Example\n```');
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
content = `# Documentation\n\n${request.specification}`;
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
type: 'file',
|
|
343
|
+
name: 'README.md',
|
|
344
|
+
language: 'markdown',
|
|
345
|
+
content,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
generateTest(request) {
|
|
349
|
+
const template = this.templates.get('ts-test');
|
|
350
|
+
let content;
|
|
351
|
+
if (template) {
|
|
352
|
+
content = template.template;
|
|
353
|
+
content = content.replace('{{imports}}', 'subject');
|
|
354
|
+
content = content.replace('{{importPath}}', './subject');
|
|
355
|
+
content = content.replace('{{suiteName}}', 'Generated Tests');
|
|
356
|
+
content = content.replace('{{setup}}', '');
|
|
357
|
+
content = content.replace('{{testCases}}', `it('should work', () => {
|
|
358
|
+
// TODO: Implement test
|
|
359
|
+
expect(true).toBe(true);
|
|
360
|
+
});`);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
content = `// Test for: ${request.specification}`;
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
type: 'file',
|
|
367
|
+
name: 'generated.test.ts',
|
|
368
|
+
language: 'typescript',
|
|
369
|
+
content,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
generateSchema(request) {
|
|
373
|
+
// Generate a JSON Schema from specification
|
|
374
|
+
const schema = {
|
|
375
|
+
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
376
|
+
title: 'Generated Schema',
|
|
377
|
+
description: request.specification,
|
|
378
|
+
type: 'object',
|
|
379
|
+
properties: {},
|
|
380
|
+
required: [],
|
|
381
|
+
};
|
|
382
|
+
return {
|
|
383
|
+
type: 'file',
|
|
384
|
+
name: 'schema.json',
|
|
385
|
+
language: 'json',
|
|
386
|
+
content: JSON.stringify(schema, null, 2),
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
// ============================================================================
|
|
390
|
+
// Iteration (based on Critique)
|
|
391
|
+
// ============================================================================
|
|
392
|
+
async requestCritique(artifacts) {
|
|
393
|
+
try {
|
|
394
|
+
const response = await this.bus.request(this.id, 'critic', 'CRITIQUE', {
|
|
395
|
+
target: artifacts[0]?.name || 'artifact',
|
|
396
|
+
content: artifacts.map((a) => a.content).join('\n\n'),
|
|
397
|
+
type: 'code',
|
|
398
|
+
}, this.timeout);
|
|
399
|
+
return response.payload.critique;
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
// Return a passing critique if Critic is unavailable
|
|
403
|
+
return {
|
|
404
|
+
target: 'artifact',
|
|
405
|
+
problems: [],
|
|
406
|
+
suggestions: [],
|
|
407
|
+
overallScore: 0.8,
|
|
408
|
+
passesReview: true,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
iterate(artifacts, critique) {
|
|
413
|
+
// Apply suggestions to improve artifacts
|
|
414
|
+
return artifacts.map((artifact) => {
|
|
415
|
+
let improved = artifact.content;
|
|
416
|
+
for (const suggestion of critique.suggestions) {
|
|
417
|
+
// Simple improvements
|
|
418
|
+
if (suggestion.description.includes('console.log')) {
|
|
419
|
+
improved = improved.replace(/console\.log\([^)]*\);?\n?/g, '');
|
|
420
|
+
}
|
|
421
|
+
if (suggestion.description.includes('TODO')) {
|
|
422
|
+
// Replace TODOs with placeholder implementations
|
|
423
|
+
improved = improved.replace(/\/\/ TODO:.*\n/g, '// Implemented\n');
|
|
424
|
+
}
|
|
425
|
+
if (suggestion.description.includes('documentation')) {
|
|
426
|
+
// Add basic JSDoc if missing
|
|
427
|
+
if (!improved.includes('/**')) {
|
|
428
|
+
improved = `/**\n * Auto-generated documentation\n */\n${improved}`;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return {
|
|
433
|
+
...artifact,
|
|
434
|
+
content: improved,
|
|
435
|
+
metadata: {
|
|
436
|
+
...artifact.metadata,
|
|
437
|
+
iteration: (artifact.metadata?.iteration || 0) + 1,
|
|
438
|
+
},
|
|
439
|
+
};
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
// ============================================================================
|
|
443
|
+
// Critique Handling (from external Critic)
|
|
444
|
+
// ============================================================================
|
|
445
|
+
async handleCritique(message) {
|
|
446
|
+
const { artifact, critique } = message.payload;
|
|
447
|
+
this.log(`Received critique for "${artifact}": score ${critique.overallScore}`);
|
|
448
|
+
// Could trigger re-iteration here
|
|
449
|
+
// For now, just acknowledge
|
|
450
|
+
return {
|
|
451
|
+
...this.createResponse(message, 'RESPONSE', { acknowledged: true }),
|
|
452
|
+
id: '',
|
|
453
|
+
timestamp: new Date(),
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
// ============================================================================
|
|
457
|
+
// Query & Commands
|
|
458
|
+
// ============================================================================
|
|
459
|
+
async handleQuery(message) {
|
|
460
|
+
const { query } = message.payload;
|
|
461
|
+
if (query === 'templates') {
|
|
462
|
+
return {
|
|
463
|
+
...this.createResponse(message, 'RESPONSE', {
|
|
464
|
+
templates: Array.from(this.templates.keys()),
|
|
465
|
+
}),
|
|
466
|
+
id: '',
|
|
467
|
+
timestamp: new Date(),
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
if (query === 'stats') {
|
|
471
|
+
return {
|
|
472
|
+
...this.createResponse(message, 'RESPONSE', this.getStats()),
|
|
473
|
+
id: '',
|
|
474
|
+
timestamp: new Date(),
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
return null;
|
|
478
|
+
}
|
|
479
|
+
async handleCommand(message) {
|
|
480
|
+
const { command, params } = message.payload;
|
|
481
|
+
switch (command) {
|
|
482
|
+
case 'add_template':
|
|
483
|
+
this.templates.set(params.name, params.template);
|
|
484
|
+
return {
|
|
485
|
+
...this.createResponse(message, 'RESPONSE', { success: true }),
|
|
486
|
+
id: '',
|
|
487
|
+
timestamp: new Date(),
|
|
488
|
+
};
|
|
489
|
+
case 'execute_step':
|
|
490
|
+
// Handle step execution from Planner
|
|
491
|
+
const result = await this.build({
|
|
492
|
+
type: 'code',
|
|
493
|
+
specification: params.step,
|
|
494
|
+
});
|
|
495
|
+
return {
|
|
496
|
+
...this.createResponse(message, 'RESPONSE', result),
|
|
497
|
+
id: '',
|
|
498
|
+
timestamp: new Date(),
|
|
499
|
+
};
|
|
500
|
+
default:
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
// ============================================================================
|
|
505
|
+
// Utilities
|
|
506
|
+
// ============================================================================
|
|
507
|
+
toCamelCase(str) {
|
|
508
|
+
return str
|
|
509
|
+
.replace(/[^a-zA-Z0-9]+(.)/g, (_, chr) => chr.toUpperCase())
|
|
510
|
+
.replace(/^[A-Z]/, (chr) => chr.toLowerCase());
|
|
511
|
+
}
|
|
512
|
+
toPascalCase(str) {
|
|
513
|
+
const camel = this.toCamelCase(str);
|
|
514
|
+
return camel.charAt(0).toUpperCase() + camel.slice(1);
|
|
515
|
+
}
|
|
516
|
+
getStats() {
|
|
517
|
+
const builds = this.buildHistory;
|
|
518
|
+
const totalArtifacts = builds.reduce((sum, b) => sum + b.artifacts.length, 0);
|
|
519
|
+
const avgIterations = builds.reduce((sum, b) => sum + b.iterations, 0) / (builds.length || 1);
|
|
520
|
+
const passRate = builds.filter((b) => b.passedReview).length / (builds.length || 1);
|
|
521
|
+
return {
|
|
522
|
+
totalBuilds: builds.length,
|
|
523
|
+
totalArtifacts,
|
|
524
|
+
avgIterations,
|
|
525
|
+
passRate,
|
|
526
|
+
templates: this.templates.size,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
exports.BuilderAgent = BuilderAgent;
|
|
531
|
+
// ============================================================================
|
|
532
|
+
// Register Factory
|
|
533
|
+
// ============================================================================
|
|
534
|
+
(0, base_agent_js_1.registerAgentFactory)('builder', (bus) => new BuilderAgent(bus));
|
|
535
|
+
function createBuilderAgent(bus) {
|
|
536
|
+
return new BuilderAgent(bus);
|
|
537
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Genesis 4.0 - Critic Agent
|
|
3
|
+
*
|
|
4
|
+
* Analyzes artifacts for problems, finds weaknesses, suggests improvements.
|
|
5
|
+
* The "criticone" that iterates and improves.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseAgent } from './base-agent.js';
|
|
8
|
+
import { MessageBus } from './message-bus.js';
|
|
9
|
+
import { Message, MessageType, Critique, Problem } from './types.js';
|
|
10
|
+
export declare class CriticAgent extends BaseAgent {
|
|
11
|
+
private critiqueHistory;
|
|
12
|
+
private problemPatterns;
|
|
13
|
+
constructor(bus?: MessageBus);
|
|
14
|
+
protected getMessageTypes(): MessageType[];
|
|
15
|
+
process(message: Message): Promise<Message | null>;
|
|
16
|
+
private handleCritiqueRequest;
|
|
17
|
+
critique(content: string, target: string, type?: 'code' | 'text' | 'design' | 'plan'): Promise<Critique>;
|
|
18
|
+
private critiqueCode;
|
|
19
|
+
private critiqueStructure;
|
|
20
|
+
private generateSuggestion;
|
|
21
|
+
private estimateEffort;
|
|
22
|
+
private estimateImpact;
|
|
23
|
+
private calculateScore;
|
|
24
|
+
private handleBuildResult;
|
|
25
|
+
private handleQuery;
|
|
26
|
+
getStats(): {
|
|
27
|
+
totalCritiques: number;
|
|
28
|
+
totalProblems: number;
|
|
29
|
+
avgProblemsPerCritique: number;
|
|
30
|
+
passRate: number;
|
|
31
|
+
avgScore: number;
|
|
32
|
+
};
|
|
33
|
+
addPattern(pattern: RegExp | string, severity: Problem['severity'], category: string): void;
|
|
34
|
+
}
|
|
35
|
+
export declare function createCriticAgent(bus?: MessageBus): CriticAgent;
|