@tienne/gestalt 0.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/CLAUDE.md +203 -0
- package/README.md +60 -0
- package/agents/closure-completer/AGENT.md +32 -0
- package/agents/continuity-judge/AGENT.md +40 -0
- package/agents/ground-mapper/AGENT.md +31 -0
- package/agents/proximity-worker/AGENT.md +33 -0
- package/agents/similarity-crystallizer/AGENT.md +34 -0
- package/dist/agents/closure-completer/AGENT.md +32 -0
- package/dist/agents/continuity-judge/AGENT.md +40 -0
- package/dist/agents/ground-mapper/AGENT.md +31 -0
- package/dist/agents/proximity-worker/AGENT.md +33 -0
- package/dist/agents/similarity-crystallizer/AGENT.md +34 -0
- package/dist/bin/gestalt.d.ts +3 -0
- package/dist/bin/gestalt.d.ts.map +1 -0
- package/dist/bin/gestalt.js +5 -0
- package/dist/bin/gestalt.js.map +1 -0
- package/dist/skills/execute/SKILL.md +84 -0
- package/dist/skills/interview/SKILL.md +82 -0
- package/dist/skills/seed/SKILL.md +92 -0
- package/dist/skills/spec/SKILL.md +92 -0
- package/dist/src/agent/figural-router.d.ts +48 -0
- package/dist/src/agent/figural-router.d.ts.map +1 -0
- package/dist/src/agent/figural-router.js +55 -0
- package/dist/src/agent/figural-router.js.map +1 -0
- package/dist/src/agent/parser.d.ts +3 -0
- package/dist/src/agent/parser.d.ts.map +1 -0
- package/dist/src/agent/parser.js +32 -0
- package/dist/src/agent/parser.js.map +1 -0
- package/dist/src/agent/prompt-resolver.d.ts +17 -0
- package/dist/src/agent/prompt-resolver.d.ts.map +1 -0
- package/dist/src/agent/prompt-resolver.js +31 -0
- package/dist/src/agent/prompt-resolver.js.map +1 -0
- package/dist/src/agent/registry.d.ts +9 -0
- package/dist/src/agent/registry.d.ts.map +1 -0
- package/dist/src/agent/registry.js +22 -0
- package/dist/src/agent/registry.js.map +1 -0
- package/dist/src/cli/commands/interview.d.ts +2 -0
- package/dist/src/cli/commands/interview.d.ts.map +1 -0
- package/dist/src/cli/commands/interview.js +67 -0
- package/dist/src/cli/commands/interview.js.map +1 -0
- package/dist/src/cli/commands/seed.d.ts +4 -0
- package/dist/src/cli/commands/seed.d.ts.map +1 -0
- package/dist/src/cli/commands/seed.js +34 -0
- package/dist/src/cli/commands/seed.js.map +1 -0
- package/dist/src/cli/commands/serve.d.ts +2 -0
- package/dist/src/cli/commands/serve.d.ts.map +1 -0
- package/dist/src/cli/commands/serve.js +5 -0
- package/dist/src/cli/commands/serve.js.map +1 -0
- package/dist/src/cli/commands/spec.d.ts +4 -0
- package/dist/src/cli/commands/spec.d.ts.map +1 -0
- package/dist/src/cli/commands/spec.js +34 -0
- package/dist/src/cli/commands/spec.js.map +1 -0
- package/dist/src/cli/commands/status.d.ts +2 -0
- package/dist/src/cli/commands/status.d.ts.map +1 -0
- package/dist/src/cli/commands/status.js +66 -0
- package/dist/src/cli/commands/status.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +39 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/core/config.d.ts +36 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +65 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/constants.d.ts +34 -0
- package/dist/src/core/constants.d.ts.map +1 -0
- package/dist/src/core/constants.js +68 -0
- package/dist/src/core/constants.js.map +1 -0
- package/dist/src/core/errors.d.ts +50 -0
- package/dist/src/core/errors.d.ts.map +1 -0
- package/dist/src/core/errors.js +99 -0
- package/dist/src/core/errors.js.map +1 -0
- package/dist/src/core/log.d.ts +5 -0
- package/dist/src/core/log.d.ts.map +1 -0
- package/dist/src/core/log.js +7 -0
- package/dist/src/core/log.js.map +1 -0
- package/dist/src/core/result.d.ts +20 -0
- package/dist/src/core/result.d.ts.map +1 -0
- package/dist/src/core/result.js +43 -0
- package/dist/src/core/result.js.map +1 -0
- package/dist/src/core/types.d.ts +289 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +15 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/events/store.d.ts +22 -0
- package/dist/src/events/store.d.ts.map +1 -0
- package/dist/src/events/store.js +130 -0
- package/dist/src/events/store.js.map +1 -0
- package/dist/src/events/types.d.ts +33 -0
- package/dist/src/events/types.d.ts.map +1 -0
- package/dist/src/events/types.js +35 -0
- package/dist/src/events/types.js.map +1 -0
- package/dist/src/execute/dag-validator.d.ts +7 -0
- package/dist/src/execute/dag-validator.d.ts.map +1 -0
- package/dist/src/execute/dag-validator.js +141 -0
- package/dist/src/execute/dag-validator.js.map +1 -0
- package/dist/src/execute/drift-detector.d.ts +11 -0
- package/dist/src/execute/drift-detector.d.ts.map +1 -0
- package/dist/src/execute/drift-detector.js +111 -0
- package/dist/src/execute/drift-detector.js.map +1 -0
- package/dist/src/execute/impact-identifier.d.ts +12 -0
- package/dist/src/execute/impact-identifier.d.ts.map +1 -0
- package/dist/src/execute/impact-identifier.js +60 -0
- package/dist/src/execute/impact-identifier.js.map +1 -0
- package/dist/src/execute/passthrough-engine.d.ts +181 -0
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -0
- package/dist/src/execute/passthrough-engine.js +795 -0
- package/dist/src/execute/passthrough-engine.js.map +1 -0
- package/dist/src/execute/prompts.d.ts +19 -0
- package/dist/src/execute/prompts.d.ts.map +1 -0
- package/dist/src/execute/prompts.js +505 -0
- package/dist/src/execute/prompts.js.map +1 -0
- package/dist/src/execute/repository.d.ts +30 -0
- package/dist/src/execute/repository.d.ts.map +1 -0
- package/dist/src/execute/repository.js +248 -0
- package/dist/src/execute/repository.js.map +1 -0
- package/dist/src/execute/session.d.ts +34 -0
- package/dist/src/execute/session.d.ts.map +1 -0
- package/dist/src/execute/session.js +273 -0
- package/dist/src/execute/session.js.map +1 -0
- package/dist/src/execute/spec-patch-applier.d.ts +13 -0
- package/dist/src/execute/spec-patch-applier.d.ts.map +1 -0
- package/dist/src/execute/spec-patch-applier.js +83 -0
- package/dist/src/execute/spec-patch-applier.js.map +1 -0
- package/dist/src/execute/spec-patch-validator.d.ts +20 -0
- package/dist/src/execute/spec-patch-validator.d.ts.map +1 -0
- package/dist/src/execute/spec-patch-validator.js +60 -0
- package/dist/src/execute/spec-patch-validator.js.map +1 -0
- package/dist/src/execute/termination-detector.d.ts +20 -0
- package/dist/src/execute/termination-detector.d.ts.map +1 -0
- package/dist/src/execute/termination-detector.js +77 -0
- package/dist/src/execute/termination-detector.js.map +1 -0
- package/dist/src/gestalt/analyzer.d.ts +18 -0
- package/dist/src/gestalt/analyzer.d.ts.map +1 -0
- package/dist/src/gestalt/analyzer.js +59 -0
- package/dist/src/gestalt/analyzer.js.map +1 -0
- package/dist/src/gestalt/principles.d.ts +21 -0
- package/dist/src/gestalt/principles.d.ts.map +1 -0
- package/dist/src/gestalt/principles.js +66 -0
- package/dist/src/gestalt/principles.js.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +22 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interview/ambiguity.d.ts +8 -0
- package/dist/src/interview/ambiguity.d.ts.map +1 -0
- package/dist/src/interview/ambiguity.js +69 -0
- package/dist/src/interview/ambiguity.js.map +1 -0
- package/dist/src/interview/brownfield.d.ts +7 -0
- package/dist/src/interview/brownfield.d.ts.map +1 -0
- package/dist/src/interview/brownfield.js +28 -0
- package/dist/src/interview/brownfield.js.map +1 -0
- package/dist/src/interview/engine.d.ts +31 -0
- package/dist/src/interview/engine.d.ts.map +1 -0
- package/dist/src/interview/engine.js +110 -0
- package/dist/src/interview/engine.js.map +1 -0
- package/dist/src/interview/passthrough-engine.d.ts +52 -0
- package/dist/src/interview/passthrough-engine.d.ts.map +1 -0
- package/dist/src/interview/passthrough-engine.js +174 -0
- package/dist/src/interview/passthrough-engine.js.map +1 -0
- package/dist/src/interview/questions.d.ts +12 -0
- package/dist/src/interview/questions.d.ts.map +1 -0
- package/dist/src/interview/questions.js +54 -0
- package/dist/src/interview/questions.js.map +1 -0
- package/dist/src/interview/repository.d.ts +25 -0
- package/dist/src/interview/repository.d.ts.map +1 -0
- package/dist/src/interview/repository.js +102 -0
- package/dist/src/interview/repository.js.map +1 -0
- package/dist/src/interview/session.d.ts +22 -0
- package/dist/src/interview/session.d.ts.map +1 -0
- package/dist/src/interview/session.js +120 -0
- package/dist/src/interview/session.js.map +1 -0
- package/dist/src/llm/adapter.d.ts +8 -0
- package/dist/src/llm/adapter.d.ts.map +1 -0
- package/dist/src/llm/adapter.js +42 -0
- package/dist/src/llm/adapter.js.map +1 -0
- package/dist/src/llm/openai-adapter.d.ts +8 -0
- package/dist/src/llm/openai-adapter.d.ts.map +1 -0
- package/dist/src/llm/openai-adapter.js +45 -0
- package/dist/src/llm/openai-adapter.js.map +1 -0
- package/dist/src/llm/prompts.d.ts +15 -0
- package/dist/src/llm/prompts.d.ts.map +1 -0
- package/dist/src/llm/prompts.js +83 -0
- package/dist/src/llm/prompts.js.map +1 -0
- package/dist/src/llm/types.d.ts +21 -0
- package/dist/src/llm/types.d.ts.map +1 -0
- package/dist/src/llm/types.js +2 -0
- package/dist/src/llm/types.js.map +1 -0
- package/dist/src/mcp/schemas.d.ts +799 -0
- package/dist/src/mcp/schemas.d.ts.map +1 -0
- package/dist/src/mcp/schemas.js +151 -0
- package/dist/src/mcp/schemas.js.map +1 -0
- package/dist/src/mcp/server.d.ts +13 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +255 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/execute-passthrough.d.ts +4 -0
- package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/execute-passthrough.js +349 -0
- package/dist/src/mcp/tools/execute-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/index.d.ts +4 -0
- package/dist/src/mcp/tools/index.d.ts.map +1 -0
- package/dist/src/mcp/tools/index.js +4 -0
- package/dist/src/mcp/tools/index.js.map +1 -0
- package/dist/src/mcp/tools/interview-passthrough.d.ts +4 -0
- package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/interview-passthrough.js +96 -0
- package/dist/src/mcp/tools/interview-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/interview.d.ts +4 -0
- package/dist/src/mcp/tools/interview.d.ts.map +1 -0
- package/dist/src/mcp/tools/interview.js +85 -0
- package/dist/src/mcp/tools/interview.js.map +1 -0
- package/dist/src/mcp/tools/seed-passthrough.d.ts +5 -0
- package/dist/src/mcp/tools/seed-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/seed-passthrough.js +29 -0
- package/dist/src/mcp/tools/seed-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/seed.d.ts +5 -0
- package/dist/src/mcp/tools/seed.d.ts.map +1 -0
- package/dist/src/mcp/tools/seed.js +19 -0
- package/dist/src/mcp/tools/seed.js.map +1 -0
- package/dist/src/mcp/tools/spec-passthrough.d.ts +5 -0
- package/dist/src/mcp/tools/spec-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/spec-passthrough.js +29 -0
- package/dist/src/mcp/tools/spec-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/spec.d.ts +5 -0
- package/dist/src/mcp/tools/spec.d.ts.map +1 -0
- package/dist/src/mcp/tools/spec.js +19 -0
- package/dist/src/mcp/tools/spec.js.map +1 -0
- package/dist/src/mcp/tools/status.d.ts +4 -0
- package/dist/src/mcp/tools/status.d.ts.map +1 -0
- package/dist/src/mcp/tools/status.js +45 -0
- package/dist/src/mcp/tools/status.js.map +1 -0
- package/dist/src/registry/base-registry.d.ts +26 -0
- package/dist/src/registry/base-registry.d.ts.map +1 -0
- package/dist/src/registry/base-registry.js +82 -0
- package/dist/src/registry/base-registry.js.map +1 -0
- package/dist/src/seed/extractor.d.ts +15 -0
- package/dist/src/seed/extractor.d.ts.map +1 -0
- package/dist/src/seed/extractor.js +88 -0
- package/dist/src/seed/extractor.js.map +1 -0
- package/dist/src/seed/generator.d.ts +12 -0
- package/dist/src/seed/generator.d.ts.map +1 -0
- package/dist/src/seed/generator.js +66 -0
- package/dist/src/seed/generator.js.map +1 -0
- package/dist/src/seed/passthrough-generator.d.ts +31 -0
- package/dist/src/seed/passthrough-generator.d.ts.map +1 -0
- package/dist/src/seed/passthrough-generator.js +80 -0
- package/dist/src/seed/passthrough-generator.js.map +1 -0
- package/dist/src/seed/schema.d.ts +145 -0
- package/dist/src/seed/schema.d.ts.map +1 -0
- package/dist/src/seed/schema.js +37 -0
- package/dist/src/seed/schema.js.map +1 -0
- package/dist/src/skills/executor.d.ts +14 -0
- package/dist/src/skills/executor.d.ts.map +1 -0
- package/dist/src/skills/executor.js +17 -0
- package/dist/src/skills/executor.js.map +1 -0
- package/dist/src/skills/parser.d.ts +3 -0
- package/dist/src/skills/parser.d.ts.map +1 -0
- package/dist/src/skills/parser.js +37 -0
- package/dist/src/skills/parser.js.map +1 -0
- package/dist/src/skills/registry.d.ts +8 -0
- package/dist/src/skills/registry.d.ts.map +1 -0
- package/dist/src/skills/registry.js +19 -0
- package/dist/src/skills/registry.js.map +1 -0
- package/dist/src/skills/types.d.ts +19 -0
- package/dist/src/skills/types.d.ts.map +1 -0
- package/dist/src/skills/types.js +2 -0
- package/dist/src/skills/types.js.map +1 -0
- package/dist/src/spec/extractor.d.ts +15 -0
- package/dist/src/spec/extractor.d.ts.map +1 -0
- package/dist/src/spec/extractor.js +88 -0
- package/dist/src/spec/extractor.js.map +1 -0
- package/dist/src/spec/generator.d.ts +12 -0
- package/dist/src/spec/generator.d.ts.map +1 -0
- package/dist/src/spec/generator.js +66 -0
- package/dist/src/spec/generator.js.map +1 -0
- package/dist/src/spec/passthrough-generator.d.ts +34 -0
- package/dist/src/spec/passthrough-generator.d.ts.map +1 -0
- package/dist/src/spec/passthrough-generator.js +86 -0
- package/dist/src/spec/passthrough-generator.js.map +1 -0
- package/dist/src/spec/schema.d.ts +145 -0
- package/dist/src/spec/schema.d.ts.map +1 -0
- package/dist/src/spec/schema.js +37 -0
- package/dist/src/spec/schema.js.map +1 -0
- package/package.json +53 -0
- package/skills/execute/SKILL.md +84 -0
- package/skills/interview/SKILL.md +82 -0
- package/skills/spec/SKILL.md +92 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
import { loadConfig } from '../../core/config.js';
|
|
3
|
+
import { EventStore } from '../../events/store.js';
|
|
4
|
+
import { AnthropicAdapter } from '../../llm/adapter.js';
|
|
5
|
+
import { InterviewEngine } from '../../interview/engine.js';
|
|
6
|
+
export async function interviewCommand(topic) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
if (!config.anthropicApiKey) {
|
|
9
|
+
console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const eventStore = new EventStore(config.dbPath);
|
|
13
|
+
const llm = new AnthropicAdapter(config.anthropicApiKey, config.model);
|
|
14
|
+
const engine = new InterviewEngine(llm, eventStore);
|
|
15
|
+
const rl = createInterface({
|
|
16
|
+
input: process.stdin,
|
|
17
|
+
output: process.stdout,
|
|
18
|
+
});
|
|
19
|
+
const prompt = (question) => new Promise((resolve) => rl.question(question, resolve));
|
|
20
|
+
try {
|
|
21
|
+
console.log(`\n🔍 Starting Gestalt interview for: "${topic}"\n`);
|
|
22
|
+
const startResult = await engine.start(topic);
|
|
23
|
+
if (!startResult.ok) {
|
|
24
|
+
console.error(`Error: ${startResult.error.message}`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const { session, firstQuestion, projectType, detectedFiles } = startResult.value;
|
|
28
|
+
console.log(`Project type: ${projectType}`);
|
|
29
|
+
if (detectedFiles.length > 0) {
|
|
30
|
+
console.log(`Detected: ${detectedFiles.join(', ')}`);
|
|
31
|
+
}
|
|
32
|
+
console.log('');
|
|
33
|
+
let sessionId = session.sessionId;
|
|
34
|
+
let currentQuestion = firstQuestion;
|
|
35
|
+
while (true) {
|
|
36
|
+
console.log(`📋 Q${session.rounds.length}: ${currentQuestion}\n`);
|
|
37
|
+
const response = await prompt('> ');
|
|
38
|
+
if (response.trim().toLowerCase() === 'done') {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
const respondResult = await engine.respond(sessionId, response);
|
|
42
|
+
if (!respondResult.ok) {
|
|
43
|
+
console.error(`Error: ${respondResult.error.message}`);
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
const { nextQuestion, ambiguityScore } = respondResult.value;
|
|
47
|
+
console.log(`\n📊 Ambiguity: ${(ambiguityScore.overall * 100).toFixed(0)}%`);
|
|
48
|
+
if (ambiguityScore.isReady) {
|
|
49
|
+
console.log('✅ Requirements are clear enough! Type "done" to finish or continue.\n');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log('');
|
|
53
|
+
}
|
|
54
|
+
currentQuestion = nextQuestion;
|
|
55
|
+
}
|
|
56
|
+
const completeResult = engine.complete(sessionId);
|
|
57
|
+
if (completeResult.ok) {
|
|
58
|
+
console.log(`\n✅ Interview completed. Session ID: ${sessionId}`);
|
|
59
|
+
console.log('Run `gestalt spec ' + sessionId + '` to generate a spec.\n');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
rl.close();
|
|
64
|
+
eventStore.close();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=interview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interview.js","sourceRoot":"","sources":["../../../../src/cli/commands/interview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/seed.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { loadConfig } from '../../core/config.js';
|
|
2
|
+
import { EventStore } from '../../events/store.js';
|
|
3
|
+
import { AnthropicAdapter } from '../../llm/adapter.js';
|
|
4
|
+
import { InterviewEngine } from '../../interview/engine.js';
|
|
5
|
+
import { SeedGenerator } from '../../seed/generator.js';
|
|
6
|
+
export async function seedCommand(sessionId, options) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
if (!config.anthropicApiKey) {
|
|
9
|
+
console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const eventStore = new EventStore(config.dbPath);
|
|
13
|
+
const llm = new AnthropicAdapter(config.anthropicApiKey, config.model);
|
|
14
|
+
const engine = new InterviewEngine(llm, eventStore);
|
|
15
|
+
const generator = new SeedGenerator(llm, eventStore);
|
|
16
|
+
try {
|
|
17
|
+
const session = engine.getSession(sessionId);
|
|
18
|
+
console.log(`\n🌱 Generating seed for session: ${session.topic}\n`);
|
|
19
|
+
const result = await generator.generate(session, options.force ?? false);
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
console.error(`Error: ${result.error.message}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(JSON.stringify(result.value, null, 2));
|
|
25
|
+
console.log('\n✅ Seed generated successfully.\n');
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
eventStore.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../../src/cli/commands/seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,OAA4B;IAC/E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/spec.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { loadConfig } from '../../core/config.js';
|
|
2
|
+
import { EventStore } from '../../events/store.js';
|
|
3
|
+
import { AnthropicAdapter } from '../../llm/adapter.js';
|
|
4
|
+
import { InterviewEngine } from '../../interview/engine.js';
|
|
5
|
+
import { SpecGenerator } from '../../spec/generator.js';
|
|
6
|
+
export async function specCommand(sessionId, options) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
if (!config.anthropicApiKey) {
|
|
9
|
+
console.error('Error: ANTHROPIC_API_KEY is required for CLI mode. Set it in .env or as environment variable.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const eventStore = new EventStore(config.dbPath);
|
|
13
|
+
const llm = new AnthropicAdapter(config.anthropicApiKey, config.model);
|
|
14
|
+
const engine = new InterviewEngine(llm, eventStore);
|
|
15
|
+
const generator = new SpecGenerator(llm, eventStore);
|
|
16
|
+
try {
|
|
17
|
+
const session = engine.getSession(sessionId);
|
|
18
|
+
console.log(`\n📋 Generating spec for session: ${session.topic}\n`);
|
|
19
|
+
const result = await generator.generate(session, options.force ?? false);
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
console.error(`Error: ${result.error.message}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log(JSON.stringify(result.value, null, 2));
|
|
25
|
+
console.log('\n✅ Spec generated successfully.\n');
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error(`Error: ${e instanceof Error ? e.message : String(e)}`);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
eventStore.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../../src/cli/commands/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,OAA4B;IAC/E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAMA,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAkEtD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { EventStore } from '../../events/store.js';
|
|
2
|
+
import { EventType } from '../../events/types.js';
|
|
3
|
+
const DEFAULT_DB_PATH = '.gestalt/events.db';
|
|
4
|
+
export function statusCommand(sessionId) {
|
|
5
|
+
const dbPath = process.env['GESTALT_DB_PATH'] ?? DEFAULT_DB_PATH;
|
|
6
|
+
const eventStore = new EventStore(dbPath);
|
|
7
|
+
try {
|
|
8
|
+
if (sessionId) {
|
|
9
|
+
const events = eventStore.getByAggregate('interview', sessionId);
|
|
10
|
+
if (events.length === 0) {
|
|
11
|
+
console.log(JSON.stringify({ error: `Session not found: ${sessionId}` }, null, 2));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const startEvent = events.find((e) => e.eventType === EventType.INTERVIEW_SESSION_STARTED);
|
|
15
|
+
const completeEvent = events.find((e) => e.eventType === EventType.INTERVIEW_SESSION_COMPLETED);
|
|
16
|
+
const scoreEvents = events.filter((e) => e.eventType === EventType.INTERVIEW_AMBIGUITY_SCORED);
|
|
17
|
+
const questionEvents = events.filter((e) => e.eventType === EventType.INTERVIEW_QUESTION_ASKED);
|
|
18
|
+
const latestScore = scoreEvents.length > 0 ? scoreEvents[scoreEvents.length - 1] : null;
|
|
19
|
+
const payload = (event) => event?.payload;
|
|
20
|
+
console.log(JSON.stringify({
|
|
21
|
+
session: {
|
|
22
|
+
sessionId,
|
|
23
|
+
topic: payload(startEvent)?.topic ?? 'Unknown',
|
|
24
|
+
status: completeEvent ? 'completed' : 'in_progress',
|
|
25
|
+
projectType: payload(startEvent)?.projectType ?? 'unknown',
|
|
26
|
+
totalRounds: questionEvents.length,
|
|
27
|
+
ambiguityScore: latestScore
|
|
28
|
+
? { overall: payload(latestScore)?.overall, isReady: payload(latestScore)?.isReady }
|
|
29
|
+
: null,
|
|
30
|
+
createdAt: startEvent?.timestamp,
|
|
31
|
+
},
|
|
32
|
+
}, null, 2));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// List all sessions from events
|
|
36
|
+
const startEvents = eventStore.getByType(EventType.INTERVIEW_SESSION_STARTED, 100);
|
|
37
|
+
if (startEvents.length === 0) {
|
|
38
|
+
console.log(JSON.stringify({ sessions: [], total: 0, message: 'No interview sessions found.' }, null, 2));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const sessions = startEvents.map((start) => {
|
|
42
|
+
const sessionEvents = eventStore.getByAggregate('interview', start.aggregateId);
|
|
43
|
+
const completeEvent = sessionEvents.find((e) => e.eventType === EventType.INTERVIEW_SESSION_COMPLETED);
|
|
44
|
+
const questionEvents = sessionEvents.filter((e) => e.eventType === EventType.INTERVIEW_QUESTION_ASKED);
|
|
45
|
+
const scoreEvents = sessionEvents.filter((e) => e.eventType === EventType.INTERVIEW_AMBIGUITY_SCORED);
|
|
46
|
+
const latestScore = scoreEvents.length > 0 ? scoreEvents[scoreEvents.length - 1] : null;
|
|
47
|
+
return {
|
|
48
|
+
sessionId: start.aggregateId,
|
|
49
|
+
topic: start.payload?.topic ?? 'Unknown',
|
|
50
|
+
status: completeEvent ? 'completed' : 'in_progress',
|
|
51
|
+
projectType: start.payload?.projectType ?? 'unknown',
|
|
52
|
+
totalRounds: questionEvents.length,
|
|
53
|
+
ambiguityScore: latestScore
|
|
54
|
+
? latestScore.payload?.overall
|
|
55
|
+
: 'N/A',
|
|
56
|
+
createdAt: start.timestamp,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
console.log(JSON.stringify({ sessions, total: sessions.length }, null, 2));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
eventStore.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,SAAS,IAAI,OAAO,CAsCnC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { interviewCommand } from './commands/interview.js';
|
|
3
|
+
import { specCommand } from './commands/spec.js';
|
|
4
|
+
import { serveCommand } from './commands/serve.js';
|
|
5
|
+
import { statusCommand } from './commands/status.js';
|
|
6
|
+
export function createCli() {
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name('gestalt')
|
|
10
|
+
.description('Gestalt — AI Development Harness with Gestalt psychology-driven requirement clarification')
|
|
11
|
+
.version('0.1.0');
|
|
12
|
+
program
|
|
13
|
+
.command('serve', { isDefault: true })
|
|
14
|
+
.description('Start the Gestalt MCP server (stdio transport)')
|
|
15
|
+
.action(async () => {
|
|
16
|
+
await serveCommand();
|
|
17
|
+
});
|
|
18
|
+
program
|
|
19
|
+
.command('interview [topic]')
|
|
20
|
+
.description('Start an interactive Gestalt interview')
|
|
21
|
+
.action(async (topic) => {
|
|
22
|
+
await interviewCommand(topic ?? 'Untitled project');
|
|
23
|
+
});
|
|
24
|
+
program
|
|
25
|
+
.command('spec <session-id>')
|
|
26
|
+
.description('Generate a Spec from a completed interview')
|
|
27
|
+
.option('-f, --force', 'Force generation even if ambiguity threshold is not met')
|
|
28
|
+
.action(async (sessionId, options) => {
|
|
29
|
+
await specCommand(sessionId, options);
|
|
30
|
+
});
|
|
31
|
+
program
|
|
32
|
+
.command('status [session-id]')
|
|
33
|
+
.description('Check interview session status')
|
|
34
|
+
.action((sessionId) => {
|
|
35
|
+
statusCommand(sessionId);
|
|
36
|
+
});
|
|
37
|
+
return program;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2FAA2F,CAAC;SACxG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO;SACJ,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SACrC,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,EAAE;QAC1C,MAAM,gBAAgB,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,aAAa,EAAE,yDAAyD,CAAC;SAChF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAA4B,EAAE,EAAE;QAChE,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,CAAC,SAAkB,EAAE,EAAE;QAC7B,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const configSchema: z.ZodObject<{
|
|
3
|
+
anthropicApiKey: z.ZodDefault<z.ZodString>;
|
|
4
|
+
model: z.ZodDefault<z.ZodString>;
|
|
5
|
+
ambiguityThreshold: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
maxInterviewRounds: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
dbPath: z.ZodDefault<z.ZodString>;
|
|
8
|
+
skillsDir: z.ZodDefault<z.ZodString>;
|
|
9
|
+
agentsDir: z.ZodDefault<z.ZodString>;
|
|
10
|
+
logLevel: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
|
|
11
|
+
driftThreshold: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
anthropicApiKey: string;
|
|
14
|
+
model: string;
|
|
15
|
+
ambiguityThreshold: number;
|
|
16
|
+
maxInterviewRounds: number;
|
|
17
|
+
dbPath: string;
|
|
18
|
+
skillsDir: string;
|
|
19
|
+
agentsDir: string;
|
|
20
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
21
|
+
driftThreshold: number;
|
|
22
|
+
}, {
|
|
23
|
+
anthropicApiKey?: string | undefined;
|
|
24
|
+
model?: string | undefined;
|
|
25
|
+
ambiguityThreshold?: number | undefined;
|
|
26
|
+
maxInterviewRounds?: number | undefined;
|
|
27
|
+
dbPath?: string | undefined;
|
|
28
|
+
skillsDir?: string | undefined;
|
|
29
|
+
agentsDir?: string | undefined;
|
|
30
|
+
logLevel?: "debug" | "info" | "warn" | "error" | undefined;
|
|
31
|
+
driftThreshold?: number | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
export type GestaltConfig = z.infer<typeof configSchema>;
|
|
34
|
+
export declare function loadConfig(overrides?: Partial<Record<string, unknown>>): GestaltConfig;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUhB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAiBzD,wBAAgB,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GAAG,aAAa,CA8B1F"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { DEFAULT_MODEL, AMBIGUITY_THRESHOLD, MAX_INTERVIEW_ROUNDS, DRIFT_THRESHOLD } from './constants.js';
|
|
7
|
+
import { ConfigError } from './errors.js';
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const PACKAGE_ROOT = resolve(__dirname, '..', '..');
|
|
10
|
+
const GLOBAL_DB_PATH = join(homedir(), '.gestalt', 'events.db');
|
|
11
|
+
const configSchema = z.object({
|
|
12
|
+
anthropicApiKey: z.string().default(''),
|
|
13
|
+
model: z.string().default(DEFAULT_MODEL),
|
|
14
|
+
ambiguityThreshold: z.number().min(0).max(1).default(AMBIGUITY_THRESHOLD),
|
|
15
|
+
maxInterviewRounds: z.number().int().positive().default(MAX_INTERVIEW_ROUNDS),
|
|
16
|
+
dbPath: z.string().default(GLOBAL_DB_PATH),
|
|
17
|
+
skillsDir: z.string().default('skills'),
|
|
18
|
+
agentsDir: z.string().default('agents'),
|
|
19
|
+
logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
20
|
+
driftThreshold: z.number().min(0).max(1).default(DRIFT_THRESHOLD),
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a directory path:
|
|
24
|
+
* 1. Absolute path → use as-is
|
|
25
|
+
* 2. CWD-relative → if exists, use it
|
|
26
|
+
* 3. Fallback to package root (for plugin/npm install environments)
|
|
27
|
+
*/
|
|
28
|
+
function resolveDir(dir) {
|
|
29
|
+
if (isAbsolute(dir))
|
|
30
|
+
return dir;
|
|
31
|
+
const cwdResolved = resolve(dir);
|
|
32
|
+
if (existsSync(cwdResolved))
|
|
33
|
+
return cwdResolved;
|
|
34
|
+
return resolve(PACKAGE_ROOT, dir);
|
|
35
|
+
}
|
|
36
|
+
export function loadConfig(overrides = {}) {
|
|
37
|
+
const raw = {
|
|
38
|
+
anthropicApiKey: process.env['ANTHROPIC_API_KEY'] ?? '',
|
|
39
|
+
model: process.env['GESTALT_MODEL'] ?? DEFAULT_MODEL,
|
|
40
|
+
ambiguityThreshold: process.env['GESTALT_AMBIGUITY_THRESHOLD']
|
|
41
|
+
? Number(process.env['GESTALT_AMBIGUITY_THRESHOLD'])
|
|
42
|
+
: AMBIGUITY_THRESHOLD,
|
|
43
|
+
maxInterviewRounds: process.env['GESTALT_MAX_ROUNDS']
|
|
44
|
+
? Number(process.env['GESTALT_MAX_ROUNDS'])
|
|
45
|
+
: MAX_INTERVIEW_ROUNDS,
|
|
46
|
+
dbPath: process.env['GESTALT_DB_PATH'] ?? GLOBAL_DB_PATH,
|
|
47
|
+
skillsDir: process.env['GESTALT_SKILLS_DIR'] ?? 'skills',
|
|
48
|
+
agentsDir: process.env['GESTALT_AGENTS_DIR'] ?? 'agents',
|
|
49
|
+
logLevel: process.env['GESTALT_LOG_LEVEL'] ?? 'info',
|
|
50
|
+
driftThreshold: process.env['GESTALT_DRIFT_THRESHOLD']
|
|
51
|
+
? Number(process.env['GESTALT_DRIFT_THRESHOLD'])
|
|
52
|
+
: DRIFT_THRESHOLD,
|
|
53
|
+
...overrides,
|
|
54
|
+
};
|
|
55
|
+
const result = configSchema.safeParse(raw);
|
|
56
|
+
if (!result.success) {
|
|
57
|
+
const messages = result.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`);
|
|
58
|
+
throw new ConfigError(`Invalid configuration:\n${messages.join('\n')}`);
|
|
59
|
+
}
|
|
60
|
+
const config = result.data;
|
|
61
|
+
config.skillsDir = resolveDir(config.skillsDir);
|
|
62
|
+
config.agentsDir = resolveDir(config.agentsDir);
|
|
63
|
+
return config;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GestaltPrinciple } from './types.js';
|
|
2
|
+
export declare const AMBIGUITY_THRESHOLD = 0.2;
|
|
3
|
+
export declare const MAX_INTERVIEW_ROUNDS = 15;
|
|
4
|
+
export declare const MAX_SPEC_RETRIES = 3;
|
|
5
|
+
export declare const LLM_TEMPERATURE = 0.3;
|
|
6
|
+
export declare const LLM_MAX_TOKENS = 4096;
|
|
7
|
+
export declare const DEFAULT_MODEL = "claude-sonnet-4-20250514";
|
|
8
|
+
export declare const GREENFIELD_WEIGHTS: Record<GestaltPrinciple, number>;
|
|
9
|
+
export declare const BROWNFIELD_WEIGHTS: Record<GestaltPrinciple, number>;
|
|
10
|
+
export declare const CONTINUITY_PENALTY_MIN = 0.05;
|
|
11
|
+
export declare const CONTINUITY_PENALTY_MAX = 0.15;
|
|
12
|
+
export declare const PRINCIPLE_QUESTION_STRATEGIES: Record<GestaltPrinciple, string>;
|
|
13
|
+
export declare const EVENT_STORE_TABLE = "events";
|
|
14
|
+
export declare const SKILLS_DIR = "skills";
|
|
15
|
+
export declare const PLANNING_PRINCIPLE_SEQUENCE: readonly [GestaltPrinciple.FIGURE_GROUND, GestaltPrinciple.CLOSURE, GestaltPrinciple.PROXIMITY, GestaltPrinciple.CONTINUITY];
|
|
16
|
+
export declare const PLANNING_TOTAL_STEPS = 4;
|
|
17
|
+
export declare const PLANNING_PRINCIPLE_STRATEGIES: Record<string, string>;
|
|
18
|
+
export declare const MAX_ATOMIC_TASKS = 100;
|
|
19
|
+
export declare const MAX_TASK_GROUPS = 20;
|
|
20
|
+
export declare const EXECUTION_PRINCIPLE_STRATEGY: Record<string, string>;
|
|
21
|
+
export declare const DRIFT_THRESHOLD = 0.3;
|
|
22
|
+
export declare const DRIFT_WEIGHTS: {
|
|
23
|
+
readonly goal: 0.5;
|
|
24
|
+
readonly constraint: 0.3;
|
|
25
|
+
readonly ontology: 0.2;
|
|
26
|
+
};
|
|
27
|
+
export declare const EVOLVE_MAX_STRUCTURAL_FIX = 3;
|
|
28
|
+
export declare const EVOLVE_MAX_CONTEXTUAL = 3;
|
|
29
|
+
export declare const EVOLVE_SUCCESS_THRESHOLD: number;
|
|
30
|
+
export declare const EVOLVE_GOAL_ALIGNMENT_THRESHOLD: number;
|
|
31
|
+
export declare const EVOLVE_STAGNATION_DELTA = 0.05;
|
|
32
|
+
export declare const EVOLVE_STAGNATION_COUNT = 2;
|
|
33
|
+
export declare const EVOLVE_OSCILLATION_COUNT = 2;
|
|
34
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,aAAa,6BAA6B,CAAC;AAExD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAM/D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAM/D,CAAC;AAEF,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAW1E,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAC1C,eAAO,MAAM,UAAU,WAAW,CAAC;AAGnC,eAAO,MAAM,2BAA2B,8HAK9B,CAAC;AAEX,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAShE,CAAC;AAEF,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,eAAe,KAAK,CAAC;AAGlC,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAG/D,CAAC;AAGF,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAGX,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,wBAAwB,QAEpC,CAAC;AACF,eAAO,MAAM,+BAA+B,QAE3C,CAAC;AACF,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,wBAAwB,IAAI,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { GestaltPrinciple } from './types.js';
|
|
2
|
+
export const AMBIGUITY_THRESHOLD = 0.2;
|
|
3
|
+
export const MAX_INTERVIEW_ROUNDS = 15;
|
|
4
|
+
export const MAX_SPEC_RETRIES = 3;
|
|
5
|
+
export const LLM_TEMPERATURE = 0.3;
|
|
6
|
+
export const LLM_MAX_TOKENS = 4096;
|
|
7
|
+
export const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
|
|
8
|
+
export const GREENFIELD_WEIGHTS = {
|
|
9
|
+
[GestaltPrinciple.CLOSURE]: 0.40,
|
|
10
|
+
[GestaltPrinciple.PROXIMITY]: 0.25,
|
|
11
|
+
[GestaltPrinciple.SIMILARITY]: 0.20,
|
|
12
|
+
[GestaltPrinciple.FIGURE_GROUND]: 0.15,
|
|
13
|
+
[GestaltPrinciple.CONTINUITY]: 0,
|
|
14
|
+
};
|
|
15
|
+
export const BROWNFIELD_WEIGHTS = {
|
|
16
|
+
[GestaltPrinciple.CLOSURE]: 0.30,
|
|
17
|
+
[GestaltPrinciple.PROXIMITY]: 0.20,
|
|
18
|
+
[GestaltPrinciple.SIMILARITY]: 0.15,
|
|
19
|
+
[GestaltPrinciple.FIGURE_GROUND]: 0.15,
|
|
20
|
+
[GestaltPrinciple.CONTINUITY]: 0.20,
|
|
21
|
+
};
|
|
22
|
+
export const CONTINUITY_PENALTY_MIN = 0.05;
|
|
23
|
+
export const CONTINUITY_PENALTY_MAX = 0.15;
|
|
24
|
+
export const PRINCIPLE_QUESTION_STRATEGIES = {
|
|
25
|
+
[GestaltPrinciple.CLOSURE]: 'Identify missing requirements. Ask: "You mentioned X, but how should Y be handled?"',
|
|
26
|
+
[GestaltPrinciple.PROXIMITY]: 'Group related requirements. Ask: "Should A and B be combined into one feature?"',
|
|
27
|
+
[GestaltPrinciple.SIMILARITY]: 'Identify patterns. Ask: "X and Y share a pattern — should they use a consistent approach?"',
|
|
28
|
+
[GestaltPrinciple.FIGURE_GROUND]: 'Separate essential from optional. Ask: "What must be in the MVP?"',
|
|
29
|
+
[GestaltPrinciple.CONTINUITY]: 'Cross-check consistency. Ask: "Earlier you said X, but now Y seems contradictory?"',
|
|
30
|
+
};
|
|
31
|
+
export const EVENT_STORE_TABLE = 'events';
|
|
32
|
+
export const SKILLS_DIR = 'skills';
|
|
33
|
+
// ─── Execute Engine ──────────────────────────────────────────────
|
|
34
|
+
export const PLANNING_PRINCIPLE_SEQUENCE = [
|
|
35
|
+
GestaltPrinciple.FIGURE_GROUND,
|
|
36
|
+
GestaltPrinciple.CLOSURE,
|
|
37
|
+
GestaltPrinciple.PROXIMITY,
|
|
38
|
+
GestaltPrinciple.CONTINUITY,
|
|
39
|
+
];
|
|
40
|
+
export const PLANNING_TOTAL_STEPS = 4;
|
|
41
|
+
export const PLANNING_PRINCIPLE_STRATEGIES = {
|
|
42
|
+
[GestaltPrinciple.FIGURE_GROUND]: 'Separate essential (figure) from supplementary (ground) acceptance criteria. Assign priority levels based on impact and dependencies.',
|
|
43
|
+
[GestaltPrinciple.CLOSURE]: 'Identify implicit sub-tasks that are not explicitly stated but required for completeness. Decompose each AC into atomic, independently executable tasks.',
|
|
44
|
+
[GestaltPrinciple.PROXIMITY]: 'Group related atomic tasks by domain or functional area. Tasks that naturally belong together should share a group.',
|
|
45
|
+
[GestaltPrinciple.CONTINUITY]: 'Validate the dependency graph for consistency. Ensure no cycles, no conflicts between groups, and a clear execution order exists.',
|
|
46
|
+
};
|
|
47
|
+
export const MAX_ATOMIC_TASKS = 100;
|
|
48
|
+
export const MAX_TASK_GROUPS = 20;
|
|
49
|
+
// ─── Execution Phase ────────────────────────────────────────────
|
|
50
|
+
export const EXECUTION_PRINCIPLE_STRATEGY = {
|
|
51
|
+
[GestaltPrinciple.SIMILARITY]: 'Leverage Similarity: when executing a task, reference completed tasks with similar patterns to provide consistent implementation context.',
|
|
52
|
+
};
|
|
53
|
+
// ─── Drift Detection ───────────────────────────────────────────
|
|
54
|
+
export const DRIFT_THRESHOLD = 0.3;
|
|
55
|
+
export const DRIFT_WEIGHTS = {
|
|
56
|
+
goal: 0.5,
|
|
57
|
+
constraint: 0.3,
|
|
58
|
+
ontology: 0.2,
|
|
59
|
+
};
|
|
60
|
+
// ─── Evolution Loop ────────────────────────────────────────────
|
|
61
|
+
export const EVOLVE_MAX_STRUCTURAL_FIX = 3;
|
|
62
|
+
export const EVOLVE_MAX_CONTEXTUAL = 3;
|
|
63
|
+
export const EVOLVE_SUCCESS_THRESHOLD = parseFloat(process.env.GESTALT_EVOLVE_THRESHOLD ?? '0.85');
|
|
64
|
+
export const EVOLVE_GOAL_ALIGNMENT_THRESHOLD = parseFloat(process.env.GESTALT_EVOLVE_GOAL_THRESHOLD ?? '0.80');
|
|
65
|
+
export const EVOLVE_STAGNATION_DELTA = 0.05;
|
|
66
|
+
export const EVOLVE_STAGNATION_COUNT = 2;
|
|
67
|
+
export const EVOLVE_OSCILLATION_COUNT = 2;
|
|
68
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAI;IAChC,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI;IAClC,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI;IACnC,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAI;IACtC,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAI;IAChC,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,IAAI;IAClC,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI;IACnC,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAI;IACtC,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C,MAAM,CAAC,MAAM,6BAA6B,GAAqC;IAC7E,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACxB,qFAAqF;IACvF,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAC1B,iFAAiF;IACnF,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAC3B,4FAA4F;IAC9F,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAC9B,mEAAmE;IACrE,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAC3B,oFAAoF;CACvF,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAEnC,oEAAoE;AACpE,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,gBAAgB,CAAC,aAAa;IAC9B,gBAAgB,CAAC,OAAO;IACxB,gBAAgB,CAAC,SAAS;IAC1B,gBAAgB,CAAC,UAAU;CACnB,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,6BAA6B,GAA2B;IACnE,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAC9B,uIAAuI;IACzI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACxB,0JAA0J;IAC5J,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAC1B,qHAAqH;IACvH,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAC3B,mIAAmI;CACtI,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,mEAAmE;AACnE,MAAM,CAAC,MAAM,4BAA4B,GAA2B;IAClE,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAC3B,2IAA2I;CAC9I,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,GAAG;IACT,UAAU,EAAE,GAAG;IACf,QAAQ,EAAE,GAAG;CACL,CAAC;AAEX,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,MAAM,CAC/C,CAAC;AACF,MAAM,CAAC,MAAM,+BAA+B,GAAG,UAAU,CACvD,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,MAAM,CACpD,CAAC;AACF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare class GestaltError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
constructor(message: string, code: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class InterviewError extends GestaltError {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class SessionNotFoundError extends InterviewError {
|
|
9
|
+
constructor(sessionId: string);
|
|
10
|
+
}
|
|
11
|
+
export declare class SessionAlreadyCompletedError extends InterviewError {
|
|
12
|
+
constructor(sessionId: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class AmbiguityThresholdError extends GestaltError {
|
|
15
|
+
constructor(score: number, threshold: number);
|
|
16
|
+
}
|
|
17
|
+
export declare class SpecGenerationError extends GestaltError {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class LLMError extends GestaltError {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class SkillParseError extends GestaltError {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
export declare class EventStoreError extends GestaltError {
|
|
27
|
+
constructor(message: string);
|
|
28
|
+
}
|
|
29
|
+
export declare class ConfigError extends GestaltError {
|
|
30
|
+
constructor(message: string);
|
|
31
|
+
}
|
|
32
|
+
export declare class ExecuteError extends GestaltError {
|
|
33
|
+
constructor(message: string);
|
|
34
|
+
}
|
|
35
|
+
export declare class ExecuteSessionNotFoundError extends ExecuteError {
|
|
36
|
+
constructor(sessionId: string);
|
|
37
|
+
}
|
|
38
|
+
export declare class InvalidPlanningStepError extends ExecuteError {
|
|
39
|
+
constructor(message: string);
|
|
40
|
+
}
|
|
41
|
+
export declare class DAGCycleError extends ExecuteError {
|
|
42
|
+
constructor(details: string);
|
|
43
|
+
}
|
|
44
|
+
export declare class TaskExecutionError extends ExecuteError {
|
|
45
|
+
constructor(message: string);
|
|
46
|
+
}
|
|
47
|
+
export declare class EvaluationError extends ExecuteError {
|
|
48
|
+
constructor(message: string);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;aAGnB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM;CAK/B;AAED,qBAAa,cAAe,SAAQ,YAAY;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,oBAAqB,SAAQ,cAAc;gBAC1C,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,4BAA6B,SAAQ,cAAc;gBAClD,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,uBAAwB,SAAQ,YAAY;gBAC3C,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;CAO7C;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,QAAS,SAAQ,YAAY;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,WAAY,SAAQ,YAAY;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,YAAY;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,2BAA4B,SAAQ,YAAY;gBAC/C,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,wBAAyB,SAAQ,YAAY;gBAC5C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,aAAc,SAAQ,YAAY;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,MAAM;CAI5B"}
|