@manifesto-ai/compiler 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +313 -0
- package/dist/__tests__/domain.test.d.ts +2 -0
- package/dist/__tests__/domain.test.d.ts.map +1 -0
- package/dist/__tests__/domain.test.js +56 -0
- package/dist/__tests__/domain.test.js.map +1 -0
- package/dist/__tests__/effects.test.d.ts +2 -0
- package/dist/__tests__/effects.test.d.ts.map +1 -0
- package/dist/__tests__/effects.test.js +145 -0
- package/dist/__tests__/effects.test.js.map +1 -0
- package/dist/__tests__/helpers/mock-adapter.d.ts +47 -0
- package/dist/__tests__/helpers/mock-adapter.d.ts.map +1 -0
- package/dist/__tests__/helpers/mock-adapter.js +135 -0
- package/dist/__tests__/helpers/mock-adapter.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +220 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/parser.test.d.ts +2 -0
- package/dist/__tests__/parser.test.d.ts.map +1 -0
- package/dist/__tests__/parser.test.js +118 -0
- package/dist/__tests__/parser.test.js.map +1 -0
- package/dist/__tests__/telemetry.test.d.ts +2 -0
- package/dist/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry.test.js +207 -0
- package/dist/__tests__/telemetry.test.js.map +1 -0
- package/dist/api/compiler.d.ts +86 -0
- package/dist/api/compiler.d.ts.map +1 -0
- package/dist/api/compiler.js +302 -0
- package/dist/api/compiler.js.map +1 -0
- package/dist/api/factory.d.ts +27 -0
- package/dist/api/factory.d.ts.map +1 -0
- package/dist/api/factory.js +60 -0
- package/dist/api/factory.js.map +1 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +3 -0
- package/dist/api/index.js.map +1 -0
- package/dist/cli/App.d.ts +10 -0
- package/dist/cli/App.d.ts.map +1 -0
- package/dist/cli/App.js +75 -0
- package/dist/cli/App.js.map +1 -0
- package/dist/cli/components/Error.d.ts +10 -0
- package/dist/cli/components/Error.d.ts.map +1 -0
- package/dist/cli/components/Error.js +21 -0
- package/dist/cli/components/Error.js.map +1 -0
- package/dist/cli/components/Header.d.ts +10 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +11 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Metrics.d.ts +10 -0
- package/dist/cli/components/Metrics.d.ts.map +1 -0
- package/dist/cli/components/Metrics.js +29 -0
- package/dist/cli/components/Metrics.js.map +1 -0
- package/dist/cli/components/Progress.d.ts +10 -0
- package/dist/cli/components/Progress.d.ts.map +1 -0
- package/dist/cli/components/Progress.js +37 -0
- package/dist/cli/components/Progress.js.map +1 -0
- package/dist/cli/components/Resolution.d.ts +11 -0
- package/dist/cli/components/Resolution.d.ts.map +1 -0
- package/dist/cli/components/Resolution.js +26 -0
- package/dist/cli/components/Resolution.js.map +1 -0
- package/dist/cli/components/Result.d.ts +10 -0
- package/dist/cli/components/Result.d.ts.map +1 -0
- package/dist/cli/components/Result.js +38 -0
- package/dist/cli/components/Result.js.map +1 -0
- package/dist/cli/components/StatusBar.d.ts +10 -0
- package/dist/cli/components/StatusBar.d.ts.map +1 -0
- package/dist/cli/components/StatusBar.js +21 -0
- package/dist/cli/components/StatusBar.js.map +1 -0
- package/dist/cli/hooks/useCompiler.d.ts +22 -0
- package/dist/cli/hooks/useCompiler.d.ts.map +1 -0
- package/dist/cli/hooks/useCompiler.js +214 -0
- package/dist/cli/hooks/useCompiler.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +178 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types.d.ts +96 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +26 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/domain/domain.d.ts +76 -0
- package/dist/domain/domain.d.ts.map +1 -0
- package/dist/domain/domain.js +251 -0
- package/dist/domain/domain.js.map +1 -0
- package/dist/domain/index.d.ts +4 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +4 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/schema.d.ts +198 -0
- package/dist/domain/schema.d.ts.map +1 -0
- package/dist/domain/schema.js +131 -0
- package/dist/domain/schema.js.map +1 -0
- package/dist/domain/types.d.ts +360 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/effects/builder/index.d.ts +2 -0
- package/dist/effects/builder/index.d.ts.map +1 -0
- package/dist/effects/builder/index.js +2 -0
- package/dist/effects/builder/index.js.map +1 -0
- package/dist/effects/builder/validate-handler.d.ts +27 -0
- package/dist/effects/builder/validate-handler.d.ts.map +1 -0
- package/dist/effects/builder/validate-handler.js +153 -0
- package/dist/effects/builder/validate-handler.js.map +1 -0
- package/dist/effects/index.d.ts +3 -0
- package/dist/effects/index.d.ts.map +1 -0
- package/dist/effects/index.js +5 -0
- package/dist/effects/index.js.map +1 -0
- package/dist/effects/llm/adapter.d.ts +123 -0
- package/dist/effects/llm/adapter.d.ts.map +1 -0
- package/dist/effects/llm/adapter.js +13 -0
- package/dist/effects/llm/adapter.js.map +1 -0
- package/dist/effects/llm/anthropic-adapter.d.ts +65 -0
- package/dist/effects/llm/anthropic-adapter.d.ts.map +1 -0
- package/dist/effects/llm/anthropic-adapter.js +178 -0
- package/dist/effects/llm/anthropic-adapter.js.map +1 -0
- package/dist/effects/llm/handlers.d.ts +44 -0
- package/dist/effects/llm/handlers.d.ts.map +1 -0
- package/dist/effects/llm/handlers.js +127 -0
- package/dist/effects/llm/handlers.js.map +1 -0
- package/dist/effects/llm/index.d.ts +7 -0
- package/dist/effects/llm/index.d.ts.map +1 -0
- package/dist/effects/llm/index.js +10 -0
- package/dist/effects/llm/index.js.map +1 -0
- package/dist/effects/llm/openai-adapter.d.ts +59 -0
- package/dist/effects/llm/openai-adapter.d.ts.map +1 -0
- package/dist/effects/llm/openai-adapter.js +206 -0
- package/dist/effects/llm/openai-adapter.js.map +1 -0
- package/dist/effects/llm/parser.d.ts +63 -0
- package/dist/effects/llm/parser.d.ts.map +1 -0
- package/dist/effects/llm/parser.js +177 -0
- package/dist/effects/llm/parser.js.map +1 -0
- package/dist/effects/llm/prompts/index.d.ts +4 -0
- package/dist/effects/llm/prompts/index.d.ts.map +1 -0
- package/dist/effects/llm/prompts/index.js +4 -0
- package/dist/effects/llm/prompts/index.js.map +1 -0
- package/dist/effects/llm/prompts/normalize.d.ts +19 -0
- package/dist/effects/llm/prompts/normalize.d.ts.map +1 -0
- package/dist/effects/llm/prompts/normalize.js +98 -0
- package/dist/effects/llm/prompts/normalize.js.map +1 -0
- package/dist/effects/llm/prompts/propose.d.ts +21 -0
- package/dist/effects/llm/prompts/propose.d.ts.map +1 -0
- package/dist/effects/llm/prompts/propose.js +326 -0
- package/dist/effects/llm/prompts/propose.js.map +1 -0
- package/dist/effects/llm/prompts/segment.d.ts +16 -0
- package/dist/effects/llm/prompts/segment.d.ts.map +1 -0
- package/dist/effects/llm/prompts/segment.js +57 -0
- package/dist/effects/llm/prompts/segment.js.map +1 -0
- package/dist/effects/types.d.ts +10 -0
- package/dist/effects/types.d.ts.map +1 -0
- package/dist/effects/types.js +2 -0
- package/dist/effects/types.js.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
package/README.md
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# @manifesto-ai/compiler
|
|
2
|
+
|
|
3
|
+
> **Compiler** compiles natural language specifications into Manifesto DomainSchemas using LLM-powered pipelines.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What is Compiler?
|
|
8
|
+
|
|
9
|
+
Compiler takes natural language descriptions and produces valid DomainSchemas. It uses LLM adapters for parsing and proposal, then validates the output using Builder.
|
|
10
|
+
|
|
11
|
+
Importantly, Compiler is itself a Manifesto application (dogfooding).
|
|
12
|
+
|
|
13
|
+
In the Manifesto architecture:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Natural Language ──→ COMPILER ──→ DomainSchema
|
|
17
|
+
│
|
|
18
|
+
LLM-powered pipeline (segment → normalize → propose)
|
|
19
|
+
Builder validation as authority
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## What Compiler Does
|
|
25
|
+
|
|
26
|
+
| Responsibility | Description |
|
|
27
|
+
|----------------|-------------|
|
|
28
|
+
| Parse natural language | Segment text into semantic units |
|
|
29
|
+
| Normalize intents | Convert segments to structured requirements |
|
|
30
|
+
| Propose schema | Generate DomainSchema draft via LLM |
|
|
31
|
+
| Validate output | Use Builder to validate generated schema |
|
|
32
|
+
| Handle ambiguity | Request user resolution for unclear requirements |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## What Compiler Does NOT Do
|
|
37
|
+
|
|
38
|
+
| NOT Responsible For | Who Is |
|
|
39
|
+
|--------------------|--------|
|
|
40
|
+
| Execute domains | Host |
|
|
41
|
+
| Provide LLM infrastructure | Your LLM provider (Anthropic, OpenAI, etc.) |
|
|
42
|
+
| Run the domain | Host, World, Bridge |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Installation
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm install @manifesto-ai/compiler @manifesto-ai/builder
|
|
50
|
+
# or
|
|
51
|
+
pnpm add @manifesto-ai/compiler @manifesto-ai/builder
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### LLM Provider (choose one)
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install @anthropic-ai/sdk # For Anthropic
|
|
58
|
+
# or
|
|
59
|
+
npm install openai # For OpenAI
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Quick Example
|
|
65
|
+
|
|
66
|
+
### Using Anthropic (Built-in)
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { createCompiler } from "@manifesto-ai/compiler";
|
|
70
|
+
|
|
71
|
+
const compiler = createCompiler({
|
|
72
|
+
anthropic: { apiKey: process.env.ANTHROPIC_API_KEY },
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Subscribe to state changes
|
|
76
|
+
compiler.subscribe((state) => {
|
|
77
|
+
console.log("Status:", state.status);
|
|
78
|
+
|
|
79
|
+
if (state.status === "success") {
|
|
80
|
+
console.log("Generated schema:", state.result);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (state.status === "discarded") {
|
|
84
|
+
console.log("Discarded:", state.discardReason);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Start compilation
|
|
89
|
+
await compiler.start({
|
|
90
|
+
text: `
|
|
91
|
+
Track a list of todos with title and completion status.
|
|
92
|
+
Users can add new todos, toggle completion, and delete todos.
|
|
93
|
+
Show a count of remaining incomplete todos.
|
|
94
|
+
`,
|
|
95
|
+
context: {
|
|
96
|
+
domainName: "todo",
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Using OpenAI
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
import { createCompiler, createOpenAIAdapter } from "@manifesto-ai/compiler";
|
|
105
|
+
import OpenAI from "openai";
|
|
106
|
+
|
|
107
|
+
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
|
|
108
|
+
const adapter = createOpenAIAdapter({ client: openai, model: "gpt-4" });
|
|
109
|
+
|
|
110
|
+
const compiler = createCompiler({
|
|
111
|
+
llmAdapter: adapter,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await compiler.start({ text: "Track user profiles with name and email..." });
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
> See [GUIDE.md](../../docs/packages/compiler/GUIDE.md) for the full tutorial.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## CLI Usage
|
|
122
|
+
|
|
123
|
+
The compiler includes an interactive CLI tool:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Direct input
|
|
127
|
+
manifesto-compile "Track user name and email"
|
|
128
|
+
|
|
129
|
+
# From file
|
|
130
|
+
manifesto-compile --file requirements.txt
|
|
131
|
+
|
|
132
|
+
# Output to file
|
|
133
|
+
manifesto-compile "Track todos" -o schema.json
|
|
134
|
+
|
|
135
|
+
# Use Anthropic provider
|
|
136
|
+
manifesto-compile --provider anthropic "Create a counter"
|
|
137
|
+
|
|
138
|
+
# Show progress
|
|
139
|
+
manifesto-compile --verbose "Complex requirements..."
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### CLI Options
|
|
143
|
+
|
|
144
|
+
| Option | Description |
|
|
145
|
+
|--------|-------------|
|
|
146
|
+
| `--provider` | LLM provider: `openai` (default) or `anthropic` |
|
|
147
|
+
| `--model` | Model name |
|
|
148
|
+
| `--file` | Read input from file |
|
|
149
|
+
| `--stdin` | Read input from stdin |
|
|
150
|
+
| `-o, --output` | Write result to file |
|
|
151
|
+
| `--verbose` | Show phase progress |
|
|
152
|
+
| `--full` | Show full metrics |
|
|
153
|
+
|
|
154
|
+
> See [GUIDE.md](../../docs/packages/compiler/GUIDE.md#cli-usage) for detailed CLI documentation.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Compiler API
|
|
159
|
+
|
|
160
|
+
### Main Exports
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// Factory
|
|
164
|
+
function createCompiler(options: CompilerOptions): Compiler;
|
|
165
|
+
|
|
166
|
+
// Compiler interface
|
|
167
|
+
interface Compiler {
|
|
168
|
+
start(input: CompileInput): Promise<void>;
|
|
169
|
+
subscribe(callback: (state: CompilerState) => void): Unsubscribe;
|
|
170
|
+
requestResolution(optionId: string): Promise<void>;
|
|
171
|
+
getState(): CompilerState;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// LLM Adapters
|
|
175
|
+
function createAnthropicAdapter(options: AnthropicAdapterOptions): LLMAdapter;
|
|
176
|
+
function createOpenAIAdapter(options: OpenAIAdapterOptions): LLMAdapter;
|
|
177
|
+
|
|
178
|
+
// Types
|
|
179
|
+
type CompilerStatus =
|
|
180
|
+
| "idle"
|
|
181
|
+
| "segmenting"
|
|
182
|
+
| "normalizing"
|
|
183
|
+
| "proposing"
|
|
184
|
+
| "validating"
|
|
185
|
+
| "awaiting_resolution"
|
|
186
|
+
| "success"
|
|
187
|
+
| "discarded";
|
|
188
|
+
|
|
189
|
+
type CompilerState = {
|
|
190
|
+
status: CompilerStatus;
|
|
191
|
+
segments?: string[];
|
|
192
|
+
intents?: NormalizedIntent[];
|
|
193
|
+
draft?: DomainSchema;
|
|
194
|
+
result?: DomainSchema;
|
|
195
|
+
diagnostics?: CompilerDiagnostics;
|
|
196
|
+
resolutionOptions?: ResolutionOption[];
|
|
197
|
+
discardReason?: DiscardReason;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
interface LLMAdapter {
|
|
201
|
+
segment(input: SegmentInput): Promise<LLMResult<SegmentResult>>;
|
|
202
|
+
normalize(input: NormalizeInput): Promise<LLMResult<NormalizeResult>>;
|
|
203
|
+
propose(input: ProposeInput): Promise<LLMResult<ProposeResult>>;
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
> See [SPEC.md](../../docs/packages/compiler/SPEC.md) for complete API reference.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Core Concepts
|
|
212
|
+
|
|
213
|
+
### Pipeline Stages
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
idle → segmenting → normalizing → proposing → validating → success
|
|
217
|
+
↓ ↓
|
|
218
|
+
awaiting_resolution discarded
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
1. **Segmenting**: Parse NL text into semantic segments
|
|
222
|
+
2. **Normalizing**: Convert segments to structured NormalizedIntents
|
|
223
|
+
3. **Proposing**: Generate DomainSchema draft via LLM
|
|
224
|
+
4. **Validating**: Validate draft using Builder (the "judge")
|
|
225
|
+
5. **Resolution**: Handle ambiguities (user choice or auto-discard)
|
|
226
|
+
6. **Success/Discarded**: Terminal states
|
|
227
|
+
|
|
228
|
+
### LLM as Untrusted Proposer
|
|
229
|
+
|
|
230
|
+
The LLM generates schema proposals, but Builder validates them. This ensures type safety and structural correctness regardless of LLM output quality.
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
LLM (untrusted proposer) → Draft Schema
|
|
234
|
+
↓
|
|
235
|
+
Builder (judge) → Validation
|
|
236
|
+
↓
|
|
237
|
+
Valid? → Success
|
|
238
|
+
Invalid? → Retry or Discard
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Custom LLM Adapters
|
|
242
|
+
|
|
243
|
+
Implement `LLMAdapter` interface for any LLM provider:
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
const myAdapter: LLMAdapter = {
|
|
247
|
+
async segment({ text }) {
|
|
248
|
+
// Call your LLM
|
|
249
|
+
return { ok: true, data: { segments: [...] } };
|
|
250
|
+
},
|
|
251
|
+
async normalize({ segments, schema, context }) {
|
|
252
|
+
return { ok: true, data: { intents: [...] } };
|
|
253
|
+
},
|
|
254
|
+
async propose({ schema, intents, history, context }) {
|
|
255
|
+
return { ok: true, data: { draft: {...} } };
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Relationship with Other Packages
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
┌─────────────┐
|
|
266
|
+
│ Your │ ← Uses Compiler for NL→Schema
|
|
267
|
+
│ Tool │
|
|
268
|
+
└──────┬──────┘
|
|
269
|
+
│
|
|
270
|
+
▼
|
|
271
|
+
┌─────────────┐
|
|
272
|
+
│ COMPILER │
|
|
273
|
+
└──────┬──────┘
|
|
274
|
+
│
|
|
275
|
+
▼
|
|
276
|
+
┌─────────────┐
|
|
277
|
+
│ Builder │ ← Validates generated schemas
|
|
278
|
+
└─────────────┘
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
| Relationship | Package | How |
|
|
282
|
+
|--------------|---------|-----|
|
|
283
|
+
| Depends on | `@manifesto-ai/builder` | Validates generated schemas |
|
|
284
|
+
| Depends on | `@manifesto-ai/core` | Uses Core types |
|
|
285
|
+
| Used by | Developer tools | For AI-assisted domain creation |
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## When to Use Compiler
|
|
290
|
+
|
|
291
|
+
Use Compiler when:
|
|
292
|
+
- Building AI-assisted domain definition tools
|
|
293
|
+
- Creating no-code/low-code domain builders
|
|
294
|
+
- Prototyping domains from natural language specs
|
|
295
|
+
- Building developer productivity tools
|
|
296
|
+
|
|
297
|
+
For manual domain definition, use [`@manifesto-ai/builder`](../builder/) directly.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Documentation
|
|
302
|
+
|
|
303
|
+
| Document | Purpose |
|
|
304
|
+
|----------|---------|
|
|
305
|
+
| [GUIDE.md](../../docs/packages/compiler/GUIDE.md) | Step-by-step usage guide |
|
|
306
|
+
| [SPEC.md](../../docs/packages/compiler/SPEC.md) | Complete specification |
|
|
307
|
+
| [FDR.md](../../docs/packages/compiler/FDR.md) | Design rationale |
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## License
|
|
312
|
+
|
|
313
|
+
[MIT](../../LICENSE)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/domain.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { CompilerDomain, INITIAL_STATE } from "../domain/domain.js";
|
|
3
|
+
import { CompilerStateSchema } from "../domain/schema.js";
|
|
4
|
+
describe("CompilerDomain", () => {
|
|
5
|
+
describe("schema", () => {
|
|
6
|
+
it("should have valid schema structure", () => {
|
|
7
|
+
expect(CompilerDomain.schema).toBeDefined();
|
|
8
|
+
expect(CompilerDomain.schema.id).toBe("manifesto:compiler");
|
|
9
|
+
expect(CompilerDomain.schema.version).toBe("1.0.0");
|
|
10
|
+
});
|
|
11
|
+
it("should have all required actions", () => {
|
|
12
|
+
const actionNames = Object.keys(CompilerDomain.schema.actions);
|
|
13
|
+
expect(actionNames).toContain("start");
|
|
14
|
+
expect(actionNames).toContain("receiveSegments");
|
|
15
|
+
expect(actionNames).toContain("receiveIntents");
|
|
16
|
+
expect(actionNames).toContain("receiveDraft");
|
|
17
|
+
expect(actionNames).toContain("receiveValidation");
|
|
18
|
+
expect(actionNames).toContain("requestResolution");
|
|
19
|
+
expect(actionNames).toContain("resolve");
|
|
20
|
+
expect(actionNames).toContain("discard");
|
|
21
|
+
expect(actionNames).toContain("reset");
|
|
22
|
+
});
|
|
23
|
+
it("should have all required computed values", () => {
|
|
24
|
+
const computedNames = Object.keys(CompilerDomain.schema.computed.fields);
|
|
25
|
+
expect(computedNames).toContain("computed.isIdle");
|
|
26
|
+
expect(computedNames).toContain("computed.isSegmenting");
|
|
27
|
+
expect(computedNames).toContain("computed.isNormalizing");
|
|
28
|
+
expect(computedNames).toContain("computed.isProposing");
|
|
29
|
+
expect(computedNames).toContain("computed.isValidating");
|
|
30
|
+
expect(computedNames).toContain("computed.isAwaitingResolution");
|
|
31
|
+
expect(computedNames).toContain("computed.isTerminal");
|
|
32
|
+
expect(computedNames).toContain("computed.canRetry");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("initial state", () => {
|
|
36
|
+
it("should validate against schema", () => {
|
|
37
|
+
const result = CompilerStateSchema.safeParse(INITIAL_STATE);
|
|
38
|
+
expect(result.success).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it("should have correct default values", () => {
|
|
41
|
+
expect(INITIAL_STATE.status).toBe("idle");
|
|
42
|
+
expect(INITIAL_STATE.maxRetries).toBe(5);
|
|
43
|
+
expect(INITIAL_STATE.traceDrafts).toBe(false);
|
|
44
|
+
expect(INITIAL_STATE.attemptCount).toBe(0);
|
|
45
|
+
expect(INITIAL_STATE.input).toBeNull();
|
|
46
|
+
expect(INITIAL_STATE.result).toBeNull();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe("diagnostics", () => {
|
|
50
|
+
it("should have valid diagnostics", () => {
|
|
51
|
+
expect(CompilerDomain.diagnostics).toBeDefined();
|
|
52
|
+
expect(CompilerDomain.diagnostics.valid).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=domain.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.test.js","sourceRoot":"","sources":["../../src/__tests__/domain.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/effects.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { createSegmentHandler, createNormalizeHandler, createProposeHandler, } from "../effects/llm/handlers.js";
|
|
3
|
+
import { createBuilderValidateHandler } from "../effects/builder/validate-handler.js";
|
|
4
|
+
describe("Effect Handlers", () => {
|
|
5
|
+
describe("createSegmentHandler", () => {
|
|
6
|
+
it("should return receiveSegments action on success", async () => {
|
|
7
|
+
const mockAdapter = {
|
|
8
|
+
segment: vi.fn().mockResolvedValue({
|
|
9
|
+
ok: true,
|
|
10
|
+
data: { segments: ["seg1", "seg2"] },
|
|
11
|
+
}),
|
|
12
|
+
normalize: vi.fn(),
|
|
13
|
+
propose: vi.fn(),
|
|
14
|
+
};
|
|
15
|
+
const handler = createSegmentHandler(mockAdapter);
|
|
16
|
+
const result = await handler({ text: "test input" });
|
|
17
|
+
expect(result.action).toBe("receiveSegments");
|
|
18
|
+
expect(result.input.segments).toEqual(["seg1", "seg2"]);
|
|
19
|
+
});
|
|
20
|
+
it("should return requestResolution action on resolution", async () => {
|
|
21
|
+
const mockAdapter = {
|
|
22
|
+
segment: vi.fn().mockResolvedValue({
|
|
23
|
+
ok: "resolution",
|
|
24
|
+
reason: "Ambiguous",
|
|
25
|
+
options: [{ id: "opt1", description: "Option 1" }],
|
|
26
|
+
}),
|
|
27
|
+
normalize: vi.fn(),
|
|
28
|
+
propose: vi.fn(),
|
|
29
|
+
};
|
|
30
|
+
const handler = createSegmentHandler(mockAdapter);
|
|
31
|
+
const result = await handler({ text: "test input" });
|
|
32
|
+
expect(result.action).toBe("requestResolution");
|
|
33
|
+
expect(result.input.reason).toBe("Ambiguous");
|
|
34
|
+
});
|
|
35
|
+
it("should return discard action on error", async () => {
|
|
36
|
+
const mockAdapter = {
|
|
37
|
+
segment: vi.fn().mockResolvedValue({
|
|
38
|
+
ok: false,
|
|
39
|
+
error: "Failed",
|
|
40
|
+
}),
|
|
41
|
+
normalize: vi.fn(),
|
|
42
|
+
propose: vi.fn(),
|
|
43
|
+
};
|
|
44
|
+
const handler = createSegmentHandler(mockAdapter);
|
|
45
|
+
const result = await handler({ text: "test input" });
|
|
46
|
+
expect(result.action).toBe("discard");
|
|
47
|
+
expect(result.input.reason).toBe("SEGMENTATION_FAILED");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("createNormalizeHandler", () => {
|
|
51
|
+
it("should return receiveIntents action on success", async () => {
|
|
52
|
+
const mockAdapter = {
|
|
53
|
+
segment: vi.fn(),
|
|
54
|
+
normalize: vi.fn().mockResolvedValue({
|
|
55
|
+
ok: true,
|
|
56
|
+
data: {
|
|
57
|
+
intents: [{ kind: "state", description: "test", confidence: 0.9 }],
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
propose: vi.fn(),
|
|
61
|
+
};
|
|
62
|
+
const handler = createNormalizeHandler(mockAdapter, { onResolutionRequired: "await" });
|
|
63
|
+
const result = await handler({ segments: ["seg1"], schema: null });
|
|
64
|
+
expect(result.action).toBe("receiveIntents");
|
|
65
|
+
expect(result.input.intents).toHaveLength(1);
|
|
66
|
+
});
|
|
67
|
+
it("should respect discard policy on resolution", async () => {
|
|
68
|
+
const mockAdapter = {
|
|
69
|
+
segment: vi.fn(),
|
|
70
|
+
normalize: vi.fn().mockResolvedValue({
|
|
71
|
+
ok: "resolution",
|
|
72
|
+
reason: "Ambiguous",
|
|
73
|
+
options: [],
|
|
74
|
+
}),
|
|
75
|
+
propose: vi.fn(),
|
|
76
|
+
};
|
|
77
|
+
const handler = createNormalizeHandler(mockAdapter, { onResolutionRequired: "discard" });
|
|
78
|
+
const result = await handler({ segments: ["seg1"], schema: null });
|
|
79
|
+
expect(result.action).toBe("discard");
|
|
80
|
+
expect(result.input.reason).toBe("RESOLUTION_REQUIRED_BUT_DISABLED");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("createProposeHandler", () => {
|
|
84
|
+
it("should return receiveDraft action on success", async () => {
|
|
85
|
+
const mockAdapter = {
|
|
86
|
+
segment: vi.fn(),
|
|
87
|
+
normalize: vi.fn(),
|
|
88
|
+
propose: vi.fn().mockResolvedValue({
|
|
89
|
+
ok: true,
|
|
90
|
+
data: { draft: { id: "test" } },
|
|
91
|
+
}),
|
|
92
|
+
};
|
|
93
|
+
const handler = createProposeHandler(mockAdapter, { onResolutionRequired: "await" });
|
|
94
|
+
const result = await handler({
|
|
95
|
+
schema: null,
|
|
96
|
+
intents: [],
|
|
97
|
+
history: [],
|
|
98
|
+
});
|
|
99
|
+
expect(result.action).toBe("receiveDraft");
|
|
100
|
+
expect(result.input.draft).toEqual({ id: "test" });
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe("createBuilderValidateHandler", () => {
|
|
104
|
+
it("should return receiveValidation with valid result", async () => {
|
|
105
|
+
const handler = createBuilderValidateHandler();
|
|
106
|
+
const result = await handler({
|
|
107
|
+
draft: {
|
|
108
|
+
id: "test",
|
|
109
|
+
version: "1.0.0",
|
|
110
|
+
hash: "",
|
|
111
|
+
state: { fields: {} },
|
|
112
|
+
computed: { fields: {} },
|
|
113
|
+
actions: {},
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
expect(result.action).toBe("receiveValidation");
|
|
117
|
+
expect(result.input.valid).toBe(true);
|
|
118
|
+
expect(result.input.schemaHash).toBeDefined();
|
|
119
|
+
});
|
|
120
|
+
it("should return receiveValidation with invalid result for missing fields", async () => {
|
|
121
|
+
const handler = createBuilderValidateHandler();
|
|
122
|
+
const result = await handler({
|
|
123
|
+
draft: { id: "test" },
|
|
124
|
+
});
|
|
125
|
+
expect(result.action).toBe("receiveValidation");
|
|
126
|
+
expect(result.input.valid).toBe(false);
|
|
127
|
+
expect(result.input.diagnostics).toBeDefined();
|
|
128
|
+
});
|
|
129
|
+
it("should handle custom validation function", async () => {
|
|
130
|
+
const customValidate = vi.fn().mockReturnValue({
|
|
131
|
+
valid: false,
|
|
132
|
+
diagnostics: {
|
|
133
|
+
valid: false,
|
|
134
|
+
errors: [{ code: "CUSTOM_ERROR", message: "Custom error" }],
|
|
135
|
+
warnings: [],
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
const handler = createBuilderValidateHandler(customValidate);
|
|
139
|
+
const result = await handler({ draft: {} });
|
|
140
|
+
expect(customValidate).toHaveBeenCalled();
|
|
141
|
+
expect(result.input.valid).toBe(false);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=effects.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.test.js","sourceRoot":"","sources":["../../src/__tests__/effects.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { LLMAdapter, SegmentResult, NormalizeResult, ProposeResult, NormalizedIntent } from "../../domain/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default successful segment response
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_SEGMENT_RESPONSE: SegmentResult;
|
|
6
|
+
/**
|
|
7
|
+
* Default successful normalize response
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_NORMALIZE_RESPONSE: NormalizeResult;
|
|
10
|
+
/**
|
|
11
|
+
* Default successful propose response (minimal valid DomainDraft)
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_PROPOSE_RESPONSE: ProposeResult;
|
|
14
|
+
/**
|
|
15
|
+
* Mock adapter options
|
|
16
|
+
*/
|
|
17
|
+
export interface MockAdapterOptions {
|
|
18
|
+
segmentResponse?: SegmentResult | (() => SegmentResult);
|
|
19
|
+
normalizeResponse?: NormalizeResult | (() => NormalizeResult);
|
|
20
|
+
proposeResponse?: ProposeResult | (() => ProposeResult);
|
|
21
|
+
proposeResponses?: ProposeResult[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a mock LLM adapter for testing
|
|
25
|
+
*/
|
|
26
|
+
export declare function createMockAdapter(options?: MockAdapterOptions): LLMAdapter;
|
|
27
|
+
/**
|
|
28
|
+
* Create a mock adapter that always succeeds
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSuccessMockAdapter(): LLMAdapter;
|
|
31
|
+
/**
|
|
32
|
+
* Create a mock adapter that fails at segmentation
|
|
33
|
+
*/
|
|
34
|
+
export declare function createSegmentFailMockAdapter(error?: string): LLMAdapter;
|
|
35
|
+
/**
|
|
36
|
+
* Create a mock adapter that requires resolution
|
|
37
|
+
*/
|
|
38
|
+
export declare function createResolutionMockAdapter(reason?: string): LLMAdapter;
|
|
39
|
+
/**
|
|
40
|
+
* Create a mock adapter that produces invalid drafts (for retry testing)
|
|
41
|
+
*/
|
|
42
|
+
export declare function createInvalidDraftMockAdapter(failCount?: number, eventualResponse?: ProposeResult): LLMAdapter;
|
|
43
|
+
/**
|
|
44
|
+
* Create custom intents for testing
|
|
45
|
+
*/
|
|
46
|
+
export declare function createIntents(intents: Partial<NormalizedIntent>[]): NormalizedIntent[];
|
|
47
|
+
//# sourceMappingURL=mock-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-adapter.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/mock-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAKtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,eAQxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAiBtC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC;IACxD,iBAAiB,CAAC,EAAE,eAAe,GAAG,CAAC,MAAM,eAAe,CAAC,CAAC;IAC9D,eAAe,CAAC,EAAE,aAAa,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC;IACxD,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,UAAU,CAoC9E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,CAErD;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,GAAE,MAA8B,GAAG,UAAU,CAI9F;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,GAAE,MAAgC,GAAG,UAAU,CAWhG;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,GAAE,MAAU,EACrB,gBAAgB,GAAE,aAAwC,GACzD,UAAU,CAeZ;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAMtF"}
|