@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.
Files changed (158) hide show
  1. package/README.md +313 -0
  2. package/dist/__tests__/domain.test.d.ts +2 -0
  3. package/dist/__tests__/domain.test.d.ts.map +1 -0
  4. package/dist/__tests__/domain.test.js +56 -0
  5. package/dist/__tests__/domain.test.js.map +1 -0
  6. package/dist/__tests__/effects.test.d.ts +2 -0
  7. package/dist/__tests__/effects.test.d.ts.map +1 -0
  8. package/dist/__tests__/effects.test.js +145 -0
  9. package/dist/__tests__/effects.test.js.map +1 -0
  10. package/dist/__tests__/helpers/mock-adapter.d.ts +47 -0
  11. package/dist/__tests__/helpers/mock-adapter.d.ts.map +1 -0
  12. package/dist/__tests__/helpers/mock-adapter.js +135 -0
  13. package/dist/__tests__/helpers/mock-adapter.js.map +1 -0
  14. package/dist/__tests__/integration.test.d.ts +2 -0
  15. package/dist/__tests__/integration.test.d.ts.map +1 -0
  16. package/dist/__tests__/integration.test.js +220 -0
  17. package/dist/__tests__/integration.test.js.map +1 -0
  18. package/dist/__tests__/parser.test.d.ts +2 -0
  19. package/dist/__tests__/parser.test.d.ts.map +1 -0
  20. package/dist/__tests__/parser.test.js +118 -0
  21. package/dist/__tests__/parser.test.js.map +1 -0
  22. package/dist/__tests__/telemetry.test.d.ts +2 -0
  23. package/dist/__tests__/telemetry.test.d.ts.map +1 -0
  24. package/dist/__tests__/telemetry.test.js +207 -0
  25. package/dist/__tests__/telemetry.test.js.map +1 -0
  26. package/dist/api/compiler.d.ts +86 -0
  27. package/dist/api/compiler.d.ts.map +1 -0
  28. package/dist/api/compiler.js +302 -0
  29. package/dist/api/compiler.js.map +1 -0
  30. package/dist/api/factory.d.ts +27 -0
  31. package/dist/api/factory.d.ts.map +1 -0
  32. package/dist/api/factory.js +60 -0
  33. package/dist/api/factory.js.map +1 -0
  34. package/dist/api/index.d.ts +3 -0
  35. package/dist/api/index.d.ts.map +1 -0
  36. package/dist/api/index.js +3 -0
  37. package/dist/api/index.js.map +1 -0
  38. package/dist/cli/App.d.ts +10 -0
  39. package/dist/cli/App.d.ts.map +1 -0
  40. package/dist/cli/App.js +75 -0
  41. package/dist/cli/App.js.map +1 -0
  42. package/dist/cli/components/Error.d.ts +10 -0
  43. package/dist/cli/components/Error.d.ts.map +1 -0
  44. package/dist/cli/components/Error.js +21 -0
  45. package/dist/cli/components/Error.js.map +1 -0
  46. package/dist/cli/components/Header.d.ts +10 -0
  47. package/dist/cli/components/Header.d.ts.map +1 -0
  48. package/dist/cli/components/Header.js +11 -0
  49. package/dist/cli/components/Header.js.map +1 -0
  50. package/dist/cli/components/Metrics.d.ts +10 -0
  51. package/dist/cli/components/Metrics.d.ts.map +1 -0
  52. package/dist/cli/components/Metrics.js +29 -0
  53. package/dist/cli/components/Metrics.js.map +1 -0
  54. package/dist/cli/components/Progress.d.ts +10 -0
  55. package/dist/cli/components/Progress.d.ts.map +1 -0
  56. package/dist/cli/components/Progress.js +37 -0
  57. package/dist/cli/components/Progress.js.map +1 -0
  58. package/dist/cli/components/Resolution.d.ts +11 -0
  59. package/dist/cli/components/Resolution.d.ts.map +1 -0
  60. package/dist/cli/components/Resolution.js +26 -0
  61. package/dist/cli/components/Resolution.js.map +1 -0
  62. package/dist/cli/components/Result.d.ts +10 -0
  63. package/dist/cli/components/Result.d.ts.map +1 -0
  64. package/dist/cli/components/Result.js +38 -0
  65. package/dist/cli/components/Result.js.map +1 -0
  66. package/dist/cli/components/StatusBar.d.ts +10 -0
  67. package/dist/cli/components/StatusBar.d.ts.map +1 -0
  68. package/dist/cli/components/StatusBar.js +21 -0
  69. package/dist/cli/components/StatusBar.js.map +1 -0
  70. package/dist/cli/hooks/useCompiler.d.ts +22 -0
  71. package/dist/cli/hooks/useCompiler.d.ts.map +1 -0
  72. package/dist/cli/hooks/useCompiler.js +214 -0
  73. package/dist/cli/hooks/useCompiler.js.map +1 -0
  74. package/dist/cli/index.d.ts +13 -0
  75. package/dist/cli/index.d.ts.map +1 -0
  76. package/dist/cli/index.js +178 -0
  77. package/dist/cli/index.js.map +1 -0
  78. package/dist/cli/types.d.ts +96 -0
  79. package/dist/cli/types.d.ts.map +1 -0
  80. package/dist/cli/types.js +26 -0
  81. package/dist/cli/types.js.map +1 -0
  82. package/dist/domain/domain.d.ts +76 -0
  83. package/dist/domain/domain.d.ts.map +1 -0
  84. package/dist/domain/domain.js +251 -0
  85. package/dist/domain/domain.js.map +1 -0
  86. package/dist/domain/index.d.ts +4 -0
  87. package/dist/domain/index.d.ts.map +1 -0
  88. package/dist/domain/index.js +4 -0
  89. package/dist/domain/index.js.map +1 -0
  90. package/dist/domain/schema.d.ts +198 -0
  91. package/dist/domain/schema.d.ts.map +1 -0
  92. package/dist/domain/schema.js +131 -0
  93. package/dist/domain/schema.js.map +1 -0
  94. package/dist/domain/types.d.ts +360 -0
  95. package/dist/domain/types.d.ts.map +1 -0
  96. package/dist/domain/types.js +2 -0
  97. package/dist/domain/types.js.map +1 -0
  98. package/dist/effects/builder/index.d.ts +2 -0
  99. package/dist/effects/builder/index.d.ts.map +1 -0
  100. package/dist/effects/builder/index.js +2 -0
  101. package/dist/effects/builder/index.js.map +1 -0
  102. package/dist/effects/builder/validate-handler.d.ts +27 -0
  103. package/dist/effects/builder/validate-handler.d.ts.map +1 -0
  104. package/dist/effects/builder/validate-handler.js +153 -0
  105. package/dist/effects/builder/validate-handler.js.map +1 -0
  106. package/dist/effects/index.d.ts +3 -0
  107. package/dist/effects/index.d.ts.map +1 -0
  108. package/dist/effects/index.js +5 -0
  109. package/dist/effects/index.js.map +1 -0
  110. package/dist/effects/llm/adapter.d.ts +123 -0
  111. package/dist/effects/llm/adapter.d.ts.map +1 -0
  112. package/dist/effects/llm/adapter.js +13 -0
  113. package/dist/effects/llm/adapter.js.map +1 -0
  114. package/dist/effects/llm/anthropic-adapter.d.ts +65 -0
  115. package/dist/effects/llm/anthropic-adapter.d.ts.map +1 -0
  116. package/dist/effects/llm/anthropic-adapter.js +178 -0
  117. package/dist/effects/llm/anthropic-adapter.js.map +1 -0
  118. package/dist/effects/llm/handlers.d.ts +44 -0
  119. package/dist/effects/llm/handlers.d.ts.map +1 -0
  120. package/dist/effects/llm/handlers.js +127 -0
  121. package/dist/effects/llm/handlers.js.map +1 -0
  122. package/dist/effects/llm/index.d.ts +7 -0
  123. package/dist/effects/llm/index.d.ts.map +1 -0
  124. package/dist/effects/llm/index.js +10 -0
  125. package/dist/effects/llm/index.js.map +1 -0
  126. package/dist/effects/llm/openai-adapter.d.ts +59 -0
  127. package/dist/effects/llm/openai-adapter.d.ts.map +1 -0
  128. package/dist/effects/llm/openai-adapter.js +206 -0
  129. package/dist/effects/llm/openai-adapter.js.map +1 -0
  130. package/dist/effects/llm/parser.d.ts +63 -0
  131. package/dist/effects/llm/parser.d.ts.map +1 -0
  132. package/dist/effects/llm/parser.js +177 -0
  133. package/dist/effects/llm/parser.js.map +1 -0
  134. package/dist/effects/llm/prompts/index.d.ts +4 -0
  135. package/dist/effects/llm/prompts/index.d.ts.map +1 -0
  136. package/dist/effects/llm/prompts/index.js +4 -0
  137. package/dist/effects/llm/prompts/index.js.map +1 -0
  138. package/dist/effects/llm/prompts/normalize.d.ts +19 -0
  139. package/dist/effects/llm/prompts/normalize.d.ts.map +1 -0
  140. package/dist/effects/llm/prompts/normalize.js +98 -0
  141. package/dist/effects/llm/prompts/normalize.js.map +1 -0
  142. package/dist/effects/llm/prompts/propose.d.ts +21 -0
  143. package/dist/effects/llm/prompts/propose.d.ts.map +1 -0
  144. package/dist/effects/llm/prompts/propose.js +326 -0
  145. package/dist/effects/llm/prompts/propose.js.map +1 -0
  146. package/dist/effects/llm/prompts/segment.d.ts +16 -0
  147. package/dist/effects/llm/prompts/segment.d.ts.map +1 -0
  148. package/dist/effects/llm/prompts/segment.js +57 -0
  149. package/dist/effects/llm/prompts/segment.js.map +1 -0
  150. package/dist/effects/types.d.ts +10 -0
  151. package/dist/effects/types.d.ts.map +1 -0
  152. package/dist/effects/types.js +2 -0
  153. package/dist/effects/types.js.map +1 -0
  154. package/dist/index.d.ts +64 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +81 -0
  157. package/dist/index.js.map +1 -0
  158. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=domain.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=effects.test.d.ts.map
@@ -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"}