@plumbus/core 0.2.9 → 0.3.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 (176) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ai/__tests__/ai-service.test.js +704 -1
  3. package/dist/ai/__tests__/ai-service.test.js.map +1 -1
  4. package/dist/ai/__tests__/chunking.test.js +34 -0
  5. package/dist/ai/__tests__/chunking.test.js.map +1 -1
  6. package/dist/ai/__tests__/provider.test.d.ts.map +1 -1
  7. package/dist/ai/__tests__/provider.test.js +425 -0
  8. package/dist/ai/__tests__/provider.test.js.map +1 -1
  9. package/dist/ai/__tests__/validation.test.js +200 -1
  10. package/dist/ai/__tests__/validation.test.js.map +1 -1
  11. package/dist/ai/__tests__/zod-to-provider-schema.test.d.ts +2 -0
  12. package/dist/ai/__tests__/zod-to-provider-schema.test.d.ts.map +1 -0
  13. package/dist/ai/__tests__/zod-to-provider-schema.test.js +60 -0
  14. package/dist/ai/__tests__/zod-to-provider-schema.test.js.map +1 -0
  15. package/dist/ai/ai-service.d.ts +19 -2
  16. package/dist/ai/ai-service.d.ts.map +1 -1
  17. package/dist/ai/ai-service.js +544 -110
  18. package/dist/ai/ai-service.js.map +1 -1
  19. package/dist/ai/cost-tracker.d.ts +26 -1
  20. package/dist/ai/cost-tracker.d.ts.map +1 -1
  21. package/dist/ai/cost-tracker.js +1 -0
  22. package/dist/ai/cost-tracker.js.map +1 -1
  23. package/dist/ai/index.d.ts +5 -3
  24. package/dist/ai/index.d.ts.map +1 -1
  25. package/dist/ai/index.js +5 -1
  26. package/dist/ai/index.js.map +1 -1
  27. package/dist/ai/provider.d.ts +45 -1
  28. package/dist/ai/provider.d.ts.map +1 -1
  29. package/dist/ai/provider.js +226 -32
  30. package/dist/ai/provider.js.map +1 -1
  31. package/dist/ai/rag/chunking.js +53 -3
  32. package/dist/ai/rag/chunking.js.map +1 -1
  33. package/dist/ai/refusal.d.ts +28 -0
  34. package/dist/ai/refusal.d.ts.map +1 -0
  35. package/dist/ai/refusal.js +36 -0
  36. package/dist/ai/refusal.js.map +1 -0
  37. package/dist/ai/validation.d.ts +40 -8
  38. package/dist/ai/validation.d.ts.map +1 -1
  39. package/dist/ai/validation.js +97 -6
  40. package/dist/ai/validation.js.map +1 -1
  41. package/dist/ai/zod-to-provider-schema.d.ts +15 -0
  42. package/dist/ai/zod-to-provider-schema.d.ts.map +1 -0
  43. package/dist/ai/zod-to-provider-schema.js +200 -0
  44. package/dist/ai/zod-to-provider-schema.js.map +1 -0
  45. package/dist/cli/__tests__/doctor.test.js +104 -2
  46. package/dist/cli/__tests__/doctor.test.js.map +1 -1
  47. package/dist/cli/__tests__/init.test.js +127 -7
  48. package/dist/cli/__tests__/init.test.js.map +1 -1
  49. package/dist/cli/__tests__/migrate.test.js +159 -2
  50. package/dist/cli/__tests__/migrate.test.js.map +1 -1
  51. package/dist/cli/commands/__tests__/commands.test.js +5 -0
  52. package/dist/cli/commands/__tests__/commands.test.js.map +1 -1
  53. package/dist/cli/commands/dev.d.ts.map +1 -1
  54. package/dist/cli/commands/dev.js +21 -1
  55. package/dist/cli/commands/dev.js.map +1 -1
  56. package/dist/cli/commands/doctor.d.ts +2 -0
  57. package/dist/cli/commands/doctor.d.ts.map +1 -1
  58. package/dist/cli/commands/doctor.js +78 -0
  59. package/dist/cli/commands/doctor.js.map +1 -1
  60. package/dist/cli/commands/generate.d.ts.map +1 -1
  61. package/dist/cli/commands/generate.js +7 -2
  62. package/dist/cli/commands/generate.js.map +1 -1
  63. package/dist/cli/commands/init.d.ts +16 -2
  64. package/dist/cli/commands/init.d.ts.map +1 -1
  65. package/dist/cli/commands/init.js +226 -25
  66. package/dist/cli/commands/init.js.map +1 -1
  67. package/dist/cli/commands/migrate.d.ts.map +1 -1
  68. package/dist/cli/commands/migrate.js +258 -8
  69. package/dist/cli/commands/migrate.js.map +1 -1
  70. package/dist/cli/commands/start.d.ts.map +1 -1
  71. package/dist/cli/commands/start.js +21 -1
  72. package/dist/cli/commands/start.js.map +1 -1
  73. package/dist/data/__tests__/drift-inspector.test.d.ts +2 -0
  74. package/dist/data/__tests__/drift-inspector.test.d.ts.map +1 -0
  75. package/dist/data/__tests__/drift-inspector.test.js +170 -0
  76. package/dist/data/__tests__/drift-inspector.test.js.map +1 -0
  77. package/dist/data/__tests__/framework-migration-rewriter.test.d.ts +2 -0
  78. package/dist/data/__tests__/framework-migration-rewriter.test.d.ts.map +1 -0
  79. package/dist/data/__tests__/framework-migration-rewriter.test.js +329 -0
  80. package/dist/data/__tests__/framework-migration-rewriter.test.js.map +1 -0
  81. package/dist/data/__tests__/migration.test.js +93 -2
  82. package/dist/data/__tests__/migration.test.js.map +1 -1
  83. package/dist/data/__tests__/repository.test.js +126 -0
  84. package/dist/data/__tests__/repository.test.js.map +1 -1
  85. package/dist/data/drift-inspector.d.ts +41 -0
  86. package/dist/data/drift-inspector.d.ts.map +1 -0
  87. package/dist/data/drift-inspector.js +197 -0
  88. package/dist/data/drift-inspector.js.map +1 -0
  89. package/dist/data/framework-migration-rewriter.d.ts +61 -0
  90. package/dist/data/framework-migration-rewriter.d.ts.map +1 -0
  91. package/dist/data/framework-migration-rewriter.js +357 -0
  92. package/dist/data/framework-migration-rewriter.js.map +1 -0
  93. package/dist/data/index.d.ts +2 -1
  94. package/dist/data/index.d.ts.map +1 -1
  95. package/dist/data/index.js +2 -1
  96. package/dist/data/index.js.map +1 -1
  97. package/dist/data/migration.d.ts +31 -1
  98. package/dist/data/migration.d.ts.map +1 -1
  99. package/dist/data/migration.js +113 -3
  100. package/dist/data/migration.js.map +1 -1
  101. package/dist/data/repository.d.ts.map +1 -1
  102. package/dist/data/repository.js +21 -0
  103. package/dist/data/repository.js.map +1 -1
  104. package/dist/define/__tests__/definePrompt.test.js +37 -0
  105. package/dist/define/__tests__/definePrompt.test.js.map +1 -1
  106. package/dist/define/definePrompt.d.ts +13 -0
  107. package/dist/define/definePrompt.d.ts.map +1 -1
  108. package/dist/define/definePrompt.js +3 -0
  109. package/dist/define/definePrompt.js.map +1 -1
  110. package/dist/errors/http.d.ts.map +1 -1
  111. package/dist/errors/http.js +2 -0
  112. package/dist/errors/http.js.map +1 -1
  113. package/dist/errors/index.d.ts +12 -0
  114. package/dist/errors/index.d.ts.map +1 -1
  115. package/dist/errors/index.js +21 -0
  116. package/dist/errors/index.js.map +1 -1
  117. package/dist/events/__tests__/event-emitter.test.js +72 -0
  118. package/dist/events/__tests__/event-emitter.test.js.map +1 -1
  119. package/dist/events/emitter.d.ts.map +1 -1
  120. package/dist/events/emitter.js +51 -0
  121. package/dist/events/emitter.js.map +1 -1
  122. package/dist/execution/__tests__/context-factory.test.js +1 -0
  123. package/dist/execution/__tests__/context-factory.test.js.map +1 -1
  124. package/dist/execution/context-factory.d.ts.map +1 -1
  125. package/dist/execution/context-factory.js +2 -0
  126. package/dist/execution/context-factory.js.map +1 -1
  127. package/dist/flows/__tests__/flow-engine.test.js +451 -4
  128. package/dist/flows/__tests__/flow-engine.test.js.map +1 -1
  129. package/dist/flows/__tests__/flow-service.test.js +8 -0
  130. package/dist/flows/__tests__/flow-service.test.js.map +1 -1
  131. package/dist/flows/__tests__/step-executor.test.js +8 -2
  132. package/dist/flows/__tests__/step-executor.test.js.map +1 -1
  133. package/dist/flows/engine.d.ts +50 -1
  134. package/dist/flows/engine.d.ts.map +1 -1
  135. package/dist/flows/engine.js +427 -23
  136. package/dist/flows/engine.js.map +1 -1
  137. package/dist/flows/flow-service.d.ts.map +1 -1
  138. package/dist/flows/flow-service.js +4 -0
  139. package/dist/flows/flow-service.js.map +1 -1
  140. package/dist/flows/index.d.ts +1 -1
  141. package/dist/flows/index.d.ts.map +1 -1
  142. package/dist/flows/index.js +1 -1
  143. package/dist/flows/index.js.map +1 -1
  144. package/dist/flows/schema.d.ts +34 -0
  145. package/dist/flows/schema.d.ts.map +1 -1
  146. package/dist/flows/schema.js +3 -0
  147. package/dist/flows/schema.js.map +1 -1
  148. package/dist/index.d.ts +4 -4
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/index.js +3 -3
  151. package/dist/index.js.map +1 -1
  152. package/dist/server/bootstrap.d.ts +14 -0
  153. package/dist/server/bootstrap.d.ts.map +1 -1
  154. package/dist/server/bootstrap.js +23 -4
  155. package/dist/server/bootstrap.js.map +1 -1
  156. package/dist/testing/context.d.ts.map +1 -1
  157. package/dist/testing/context.js +37 -1
  158. package/dist/testing/context.js.map +1 -1
  159. package/dist/types/context.d.ts +110 -0
  160. package/dist/types/context.d.ts.map +1 -1
  161. package/dist/types/enums.d.ts +2 -0
  162. package/dist/types/enums.d.ts.map +1 -1
  163. package/dist/types/enums.js +2 -0
  164. package/dist/types/enums.js.map +1 -1
  165. package/dist/types/prompt.d.ts +64 -0
  166. package/dist/types/prompt.d.ts.map +1 -1
  167. package/dist/worker/__tests__/bootstrap.test.js +36 -2
  168. package/dist/worker/__tests__/bootstrap.test.js.map +1 -1
  169. package/dist/worker/bootstrap.d.ts +7 -0
  170. package/dist/worker/bootstrap.d.ts.map +1 -1
  171. package/dist/worker/bootstrap.js +153 -12
  172. package/dist/worker/bootstrap.js.map +1 -1
  173. package/instructions/framework.md +7 -0
  174. package/instructions/guardrails.md +39 -0
  175. package/instructions/patterns.md +10 -0
  176. package/package.json +3 -2
@@ -1,10 +1,7 @@
1
- import type { z } from 'zod';
2
- import type { AIProviderAdapter, ProviderRequest } from './provider.js';
3
- export interface ValidationRetryConfig {
4
- /** Max retries on validation failure (default 2) */
5
- maxRetries?: number;
6
- /** Whether to append validation error to retry prompt */
7
- feedbackOnError?: boolean;
1
+ import { z } from 'zod';
2
+ import type { AIValidationOptions } from '../types/context.js';
3
+ import type { AIProviderAdapter, ProviderRequest, TokenUsage } from './provider.js';
4
+ export interface ValidationRetryConfig extends AIValidationOptions {
8
5
  }
9
6
  export interface ValidatedResponse<T> {
10
7
  data: T;
@@ -16,5 +13,40 @@ export interface ValidatedResponse<T> {
16
13
  totalTokens: number;
17
14
  };
18
15
  }
19
- export declare function generateWithValidation<T>(provider: AIProviderAdapter, request: ProviderRequest, schema: z.ZodType<T>, config?: ValidationRetryConfig): Promise<ValidatedResponse<T>>;
16
+ export declare class AIValidationError extends Error {
17
+ readonly attempts: number;
18
+ readonly rawOutput: string | null;
19
+ readonly validationMessage: string | null;
20
+ /**
21
+ * Accumulated token usage across all retry attempts the provider actually
22
+ * ran before this error was thrown. Present when the caller threaded
23
+ * provider metadata through `generateWithValidation`; otherwise a zero
24
+ * record (kept non-optional so failure-path cost recording does not need
25
+ * null-checks).
26
+ */
27
+ readonly usage: TokenUsage;
28
+ /** Resolved model name when the error was thrown (empty string if unknown). */
29
+ readonly model: string;
30
+ /** Resolved provider name when the error was thrown (empty string if unknown). */
31
+ readonly provider: string;
32
+ constructor(input: {
33
+ attempts: number;
34
+ rawOutput: string | null;
35
+ lastError: Error | null;
36
+ usage?: TokenUsage;
37
+ model?: string;
38
+ provider?: string;
39
+ });
40
+ }
41
+ export declare function generateWithValidation<T>(provider: AIProviderAdapter, request: ProviderRequest, schema: z.ZodType<T>, config?: ValidationRetryConfig & {
42
+ /**
43
+ * Optional resolved model + provider metadata attached to any
44
+ * `AIValidationError` thrown from this call. Used by the AI service
45
+ * failure-path cost recorder so it can bill the sunk spend against the
46
+ * right model. Omitted = error is thrown with empty strings (still
47
+ * compiles and still carries `usage`).
48
+ */
49
+ model?: string;
50
+ provider?: string;
51
+ }): Promise<ValidatedResponse<T>>;
20
52
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAGhB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AA2ID,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAoD/B"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAEf,UAAU,EACX,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;CAAG;AAErE,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3E;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,KAAK,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;QACxB,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;CAYF;AAiLD,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,EAAE,qBAAqB,GAAG;IAC/B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAgF/B"}
@@ -1,6 +1,35 @@
1
1
  // ── Output Validation with Retry ──
2
2
  // Validates AI responses against Zod schemas, retries on mismatch
3
3
  import { parse as parseJsonc } from 'jsonc-parser';
4
+ import { z } from 'zod';
5
+ import { AIIncompleteOutputError } from './refusal.js';
6
+ export class AIValidationError extends Error {
7
+ attempts;
8
+ rawOutput;
9
+ validationMessage;
10
+ /**
11
+ * Accumulated token usage across all retry attempts the provider actually
12
+ * ran before this error was thrown. Present when the caller threaded
13
+ * provider metadata through `generateWithValidation`; otherwise a zero
14
+ * record (kept non-optional so failure-path cost recording does not need
15
+ * null-checks).
16
+ */
17
+ usage;
18
+ /** Resolved model name when the error was thrown (empty string if unknown). */
19
+ model;
20
+ /** Resolved provider name when the error was thrown (empty string if unknown). */
21
+ provider;
22
+ constructor(input) {
23
+ super(`AI output validation failed after ${input.attempts} attempts: ${input.lastError?.message}`);
24
+ this.name = 'AIValidationError';
25
+ this.attempts = input.attempts;
26
+ this.rawOutput = input.rawOutput;
27
+ this.validationMessage = input.lastError?.message ?? null;
28
+ this.usage = input.usage ?? { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
29
+ this.model = input.model ?? '';
30
+ this.provider = input.provider ?? '';
31
+ }
32
+ }
4
33
  function stripMarkdownCodeFence(content) {
5
34
  const trimmed = content.trim();
6
35
  const fenced = trimmed.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```$/i);
@@ -76,6 +105,41 @@ function parseJsonCandidate(candidate) {
76
105
  }
77
106
  return parsed;
78
107
  }
108
+ /**
109
+ * Detects whether an output schema accepts a raw string at the top level.
110
+ *
111
+ * When the prompt author declares `output: z.string()` (or a trivially
112
+ * wrapped variant like `z.string().optional()` / `.nullable()`), the intent
113
+ * is to let the AI return raw text — typically a custom line-delimited
114
+ * format parsed by the capability. In that case we MUST NOT force the
115
+ * provider into JSON mode (OpenAI `response_format: json_object`), because
116
+ * the model will wrap the text into a JSON object and downstream
117
+ * `schema.parse(<object>)` will blow up with "Expected string, received
118
+ * object".
119
+ *
120
+ * Unwrapping `.optional()` / `.nullable()` is safe: they still pass a raw
121
+ * string through unchanged.
122
+ */
123
+ function isStringOutputSchema(schema) {
124
+ let current = schema;
125
+ // Unwrap one level of optional/nullable/default at a time, capping the
126
+ // loop so a bad schema can never hang the process.
127
+ for (let depth = 0; depth < 5; depth += 1) {
128
+ if (current instanceof z.ZodString) {
129
+ return true;
130
+ }
131
+ if (current instanceof z.ZodOptional || current instanceof z.ZodNullable) {
132
+ current = current._def.innerType;
133
+ continue;
134
+ }
135
+ if (current instanceof z.ZodDefault) {
136
+ current = current._def.innerType;
137
+ continue;
138
+ }
139
+ return false;
140
+ }
141
+ return false;
142
+ }
79
143
  function parseStructuredResponse(content) {
80
144
  try {
81
145
  return JSON.parse(content);
@@ -118,21 +182,41 @@ function parseStructuredResponse(content) {
118
182
  export async function generateWithValidation(provider, request, schema, config) {
119
183
  const maxRetries = config?.maxRetries ?? 2;
120
184
  const feedbackOnError = config?.feedbackOnError ?? true;
185
+ // Prompts with `output: z.string()` want raw text (e.g. a pipe-separated
186
+ // line format parsed by the capability). Forcing JSON mode on those
187
+ // would make the model wrap the text in a JSON object and shatter
188
+ // schema validation, so we switch to text mode and skip JSON parsing.
189
+ const textOutput = isStringOutputSchema(schema);
121
190
  let totalUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
122
191
  let lastError = null;
192
+ let lastRawOutput = null;
123
193
  let currentPrompt = request.prompt;
124
194
  for (let attempt = 1; attempt <= maxRetries + 1; attempt++) {
125
- // OpenAI requires the word "json" in the prompt when using json_object response format.
126
- // Auto-inject a JSON instruction if the prompt doesn't already mention it.
127
195
  let promptForRequest = currentPrompt;
128
- if (!currentPrompt.toLowerCase().includes('json')) {
196
+ if (!textOutput && !request.responseSchema && !currentPrompt.toLowerCase().includes('json')) {
197
+ // OpenAI requires the word "json" in the prompt when using
198
+ // json_object response format. Only inject the hint for JSON-mode
199
+ // prompts without a provider schema — text-mode prompts never go into
200
+ // json_object, and json_schema requests should not need a prose JSON
201
+ // instruction as a substitute for constrained decoding.
129
202
  promptForRequest = `${currentPrompt}\n\nRespond with a valid JSON object.`;
130
203
  }
131
204
  const response = await provider.complete({
132
205
  ...request,
133
206
  prompt: promptForRequest,
134
- responseFormat: 'json',
207
+ responseFormat: textOutput ? 'text' : 'json',
135
208
  });
209
+ lastRawOutput = response.content;
210
+ if (!textOutput &&
211
+ (response.finishReason === 'length' || response.finishReason === 'max_tokens')) {
212
+ throw new AIIncompleteOutputError({
213
+ provider: config?.provider ?? provider.name,
214
+ model: config?.model ?? response.model,
215
+ partialText: response.content,
216
+ usage: response.usage,
217
+ finishReason: response.finishReason,
218
+ });
219
+ }
136
220
  totalUsage = {
137
221
  inputTokens: totalUsage.inputTokens + response.usage.inputTokens,
138
222
  outputTokens: totalUsage.outputTokens + response.usage.outputTokens,
@@ -141,7 +225,7 @@ export async function generateWithValidation(provider, request, schema, config)
141
225
  cacheWriteTokens: (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0),
142
226
  };
143
227
  try {
144
- const parsed = parseStructuredResponse(response.content);
228
+ const parsed = textOutput ? response.content : parseStructuredResponse(response.content);
145
229
  const result = schema.parse(parsed);
146
230
  return {
147
231
  data: result,
@@ -157,6 +241,13 @@ export async function generateWithValidation(provider, request, schema, config)
157
241
  }
158
242
  }
159
243
  }
160
- throw new Error(`AI output validation failed after ${maxRetries + 1} attempts: ${lastError?.message}`);
244
+ throw new AIValidationError({
245
+ attempts: maxRetries + 1,
246
+ rawOutput: lastRawOutput,
247
+ lastError,
248
+ usage: totalUsage,
249
+ model: config?.model ?? '',
250
+ provider: config?.provider ?? provider.name,
251
+ });
161
252
  }
162
253
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/ai/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { z } from 'zod';
2
+ export interface ProviderJsonSchemaResult {
3
+ schema: Record<string, unknown>;
4
+ optionalParameterCount: number;
5
+ unionParameterCount: number;
6
+ }
7
+ export interface ProviderJsonSchemaOptions {
8
+ promptName?: string;
9
+ }
10
+ export declare class ProviderJsonSchemaError extends Error {
11
+ readonly promptName?: string;
12
+ constructor(message: string, promptName?: string);
13
+ }
14
+ export declare function zodToProviderJsonSchema(zodSchema: z.ZodTypeAny, options?: ProviderJsonSchemaOptions): ProviderJsonSchemaResult;
15
+ //# sourceMappingURL=zod-to-provider-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-to-provider-schema.d.ts","sourceRoot":"","sources":["../../src/ai/zod-to-provider-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgB7B,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAKjD;AA2MD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,CAAC,CAAC,UAAU,EACvB,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CAkC1B"}
@@ -0,0 +1,200 @@
1
+ import { zodToJsonSchema } from 'zod-to-json-schema';
2
+ const allowedStringFormats = new Set([
3
+ 'date-time',
4
+ 'time',
5
+ 'date',
6
+ 'duration',
7
+ 'email',
8
+ 'hostname',
9
+ 'uri',
10
+ 'ipv4',
11
+ 'ipv6',
12
+ 'uuid',
13
+ ]);
14
+ export class ProviderJsonSchemaError extends Error {
15
+ promptName;
16
+ constructor(message, promptName) {
17
+ super(promptName ? `${promptName}: ${message}` : message);
18
+ this.name = 'ProviderJsonSchemaError';
19
+ this.promptName = promptName;
20
+ }
21
+ }
22
+ function isRecord(value) {
23
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
24
+ }
25
+ function fail(message, state) {
26
+ throw new ProviderJsonSchemaError(message, state.promptName);
27
+ }
28
+ function appendDescription(schema, message) {
29
+ const existing = typeof schema.description === 'string' ? schema.description.trim() : '';
30
+ schema.description = existing ? `${existing} ${message}` : message;
31
+ }
32
+ function stripConstraint(schema, key, describe) {
33
+ if (!(key in schema))
34
+ return;
35
+ appendDescription(schema, describe(schema[key]));
36
+ delete schema[key];
37
+ }
38
+ function isPrimitiveEnumValue(value) {
39
+ return (value === null ||
40
+ typeof value === 'string' ||
41
+ typeof value === 'number' ||
42
+ typeof value === 'boolean');
43
+ }
44
+ function hasUnsupportedRegex(pattern) {
45
+ return (/\\[1-9]/.test(pattern) ||
46
+ /\(\?[:=!<]/.test(pattern) ||
47
+ /\\[bB]/.test(pattern) ||
48
+ /\{\d{4,}(?:,\d*)?\}/.test(pattern) ||
49
+ /\{\d+,\d{4,}\}/.test(pattern));
50
+ }
51
+ function normalizeArray(value, path, state) {
52
+ return value.map((item, index) => normalizeSchemaNode(item, `${path}[${index}]`, state));
53
+ }
54
+ function normalizeSchemaNode(value, path, state) {
55
+ if (typeof value === 'boolean') {
56
+ fail(`boolean JSON Schema nodes are not supported at ${path}`, state);
57
+ }
58
+ if (Array.isArray(value)) {
59
+ return normalizeArray(value, path, state);
60
+ }
61
+ if (!isRecord(value)) {
62
+ return value;
63
+ }
64
+ const schema = {};
65
+ for (const [key, child] of Object.entries(value)) {
66
+ if (key === '$schema')
67
+ continue;
68
+ schema[key] = child;
69
+ }
70
+ if (Array.isArray(schema.enum)) {
71
+ if (schema.enum.length === 0)
72
+ fail(`empty enum is not supported at ${path}`, state);
73
+ if (!schema.enum.every(isPrimitiveEnumValue)) {
74
+ fail(`enum values must be primitive at ${path}`, state);
75
+ }
76
+ }
77
+ if (Array.isArray(schema.anyOf)) {
78
+ if (schema.anyOf.length === 0)
79
+ fail(`empty anyOf is not supported at ${path}`, state);
80
+ state.unionParameterCount += 1;
81
+ schema.anyOf = normalizeArray(schema.anyOf, `${path}.anyOf`, state);
82
+ }
83
+ if (Array.isArray(schema.oneOf)) {
84
+ if (schema.oneOf.length === 0)
85
+ fail(`empty oneOf is not supported at ${path}`, state);
86
+ state.unionParameterCount += 1;
87
+ schema.anyOf = normalizeArray(schema.oneOf, `${path}.oneOf`, state);
88
+ delete schema.oneOf;
89
+ }
90
+ if (Array.isArray(schema.allOf)) {
91
+ for (const child of schema.allOf) {
92
+ if (isRecord(child) && '$ref' in child) {
93
+ fail(`allOf with $ref is not supported at ${path}`, state);
94
+ }
95
+ }
96
+ schema.allOf = normalizeArray(schema.allOf, `${path}.allOf`, state);
97
+ }
98
+ if (Array.isArray(schema.type)) {
99
+ state.unionParameterCount += 1;
100
+ }
101
+ if (schema.type === 'object' || isRecord(schema.properties)) {
102
+ schema.type = 'object';
103
+ if ('additionalProperties' in schema && schema.additionalProperties !== false) {
104
+ fail(`additionalProperties must be false at ${path}`, state);
105
+ }
106
+ schema.additionalProperties = false;
107
+ const properties = isRecord(schema.properties) ? schema.properties : {};
108
+ const required = Array.isArray(schema.required)
109
+ ? new Set(schema.required.filter((key) => typeof key === 'string'))
110
+ : new Set();
111
+ const normalizedProperties = {};
112
+ for (const [propertyName, propertySchema] of Object.entries(properties)) {
113
+ if (!required.has(propertyName)) {
114
+ state.optionalParameterCount += 1;
115
+ }
116
+ normalizedProperties[propertyName] = normalizeSchemaNode(propertySchema, `${path}.properties.${propertyName}`, state);
117
+ }
118
+ schema.properties = normalizedProperties;
119
+ if (required.size > 0) {
120
+ schema.required = [...required];
121
+ }
122
+ else {
123
+ delete schema.required;
124
+ }
125
+ }
126
+ if (schema.type === 'array' || 'items' in schema || 'prefixItems' in schema) {
127
+ if (Array.isArray(schema.items)) {
128
+ schema.prefixItems = normalizeArray(schema.items, `${path}.items`, state);
129
+ delete schema.items;
130
+ }
131
+ else if ('items' in schema) {
132
+ schema.items = normalizeSchemaNode(schema.items, `${path}.items`, state);
133
+ }
134
+ if (Array.isArray(schema.prefixItems)) {
135
+ schema.prefixItems = normalizeArray(schema.prefixItems, `${path}.prefixItems`, state);
136
+ }
137
+ if (typeof schema.minItems === 'number' && schema.minItems > 1) {
138
+ appendDescription(schema, `Must contain at least ${schema.minItems} items.`);
139
+ schema.minItems = 1;
140
+ }
141
+ stripConstraint(schema, 'maxItems', (constraint) => `Must contain at most ${constraint} items.`);
142
+ delete schema.minContains;
143
+ delete schema.maxContains;
144
+ }
145
+ if (typeof schema.format === 'string' && !allowedStringFormats.has(schema.format)) {
146
+ appendDescription(schema, `Expected string format: ${schema.format}.`);
147
+ delete schema.format;
148
+ }
149
+ if (typeof schema.pattern === 'string' && hasUnsupportedRegex(schema.pattern)) {
150
+ appendDescription(schema, `Must match pattern: ${schema.pattern}.`);
151
+ delete schema.pattern;
152
+ }
153
+ stripConstraint(schema, 'minimum', (constraint) => `Must be at least ${constraint}.`);
154
+ stripConstraint(schema, 'maximum', (constraint) => `Must be at most ${constraint}.`);
155
+ stripConstraint(schema, 'exclusiveMinimum', (constraint) => `Must be greater than ${constraint}.`);
156
+ stripConstraint(schema, 'exclusiveMaximum', (constraint) => `Must be less than ${constraint}.`);
157
+ stripConstraint(schema, 'multipleOf', (constraint) => `Must be a multiple of ${constraint}.`);
158
+ stripConstraint(schema, 'minLength', (constraint) => `Must be at least ${constraint} characters.`);
159
+ stripConstraint(schema, 'maxLength', (constraint) => `Must be at most ${constraint} characters.`);
160
+ for (const [key, child] of Object.entries(schema)) {
161
+ if (key === 'properties' ||
162
+ key === 'items' ||
163
+ key === 'prefixItems' ||
164
+ key === 'anyOf' ||
165
+ key === 'allOf') {
166
+ continue;
167
+ }
168
+ if (isRecord(child) || Array.isArray(child)) {
169
+ schema[key] = normalizeSchemaNode(child, `${path}.${key}`, state);
170
+ }
171
+ }
172
+ return schema;
173
+ }
174
+ export function zodToProviderJsonSchema(zodSchema, options = {}) {
175
+ const raw = zodToJsonSchema(zodSchema, {
176
+ $refStrategy: 'none',
177
+ target: 'jsonSchema7',
178
+ });
179
+ const state = {
180
+ promptName: options.promptName,
181
+ optionalParameterCount: 0,
182
+ unionParameterCount: 0,
183
+ };
184
+ const normalized = normalizeSchemaNode(raw, '#', state);
185
+ if (!isRecord(normalized)) {
186
+ fail('top-level schema must be an object', state);
187
+ }
188
+ if (state.optionalParameterCount > 24) {
189
+ fail(`structured-output schema has ${state.optionalParameterCount} optional parameters; Anthropic limit is 24`, state);
190
+ }
191
+ if (state.unionParameterCount > 16) {
192
+ fail(`structured-output schema has ${state.unionParameterCount} union parameters; Anthropic limit is 16`, state);
193
+ }
194
+ return {
195
+ schema: normalized,
196
+ optionalParameterCount: state.optionalParameterCount,
197
+ unionParameterCount: state.unionParameterCount,
198
+ };
199
+ }
200
+ //# sourceMappingURL=zod-to-provider-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-to-provider-schema.js","sourceRoot":"","sources":["../../src/ai/zod-to-provider-schema.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { checkLegacyArtifacts, checkNodeVersion, checkPlumbusUi, checkPostgreSQL, checkRedis, checkTypeScript, runDoctorChecks, runFullDoctorChecks, } from '../commands/doctor.js';
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { afterEach, describe, expect, it, vi } from 'vitest';
5
+ import { checkAgentWiring, checkLegacyArtifacts, checkNodeVersion, checkPlumbusUi, checkPostgreSQL, checkRedis, checkTypeScript, runDoctorChecks, runFullDoctorChecks, } from '../commands/doctor.js';
6
+ import { generateAgentsMd, generateCopilotInstructions, generateCursorCapabilityRule, generateCursorRule, } from '../commands/init.js';
7
+ afterEach(() => {
8
+ vi.restoreAllMocks();
9
+ });
3
10
  describe('plumbus doctor', () => {
4
11
  it('checks Node.js version', () => {
5
12
  const check = checkNodeVersion();
@@ -17,6 +24,7 @@ describe('plumbus doctor', () => {
17
24
  expect(names).toContain('package.json');
18
25
  expect(names).toContain('config');
19
26
  expect(names).toContain('app-structure');
27
+ expect(names).toContain('agent-wiring');
20
28
  expect(names).toContain('legacy-artifacts');
21
29
  });
22
30
  it('detects TypeScript availability', () => {
@@ -66,5 +74,99 @@ describe('plumbus doctor', () => {
66
74
  expect(['ok', 'warn', 'fail']).toContain(check.status);
67
75
  expect(check.message).toBeTruthy();
68
76
  });
77
+ it('checkAgentWiring returns ok when no generated wiring exists', () => {
78
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
79
+ try {
80
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
81
+ const check = checkAgentWiring();
82
+ expect(check.name).toBe('agent-wiring');
83
+ expect(check.status).toBe('ok');
84
+ expect(check.message).toContain('No generated agent wiring detected');
85
+ }
86
+ finally {
87
+ rmSync(tempDir, { recursive: true, force: true });
88
+ }
89
+ });
90
+ it('checkAgentWiring warns on unversioned generated wiring', () => {
91
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
92
+ try {
93
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
94
+ mkdirSync(path.join(tempDir, '.github'), { recursive: true });
95
+ writeFileSync(path.join(tempDir, '.github', 'copilot-instructions.md'), '# Plumbus Framework — Copilot Instructions\n\nlegacy content', 'utf-8');
96
+ const check = checkAgentWiring();
97
+ expect(check.status).toBe('warn');
98
+ expect(check.message).toContain('unversioned');
99
+ expect(check.message).toContain('plumbus init --force');
100
+ }
101
+ finally {
102
+ rmSync(tempDir, { recursive: true, force: true });
103
+ }
104
+ });
105
+ it('checkAgentWiring recommends patch for stale patchable wiring', () => {
106
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
107
+ try {
108
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
109
+ mkdirSync(path.join(tempDir, '.github'), { recursive: true });
110
+ writeFileSync(path.join(tempDir, '.github', 'copilot-instructions.md'), [
111
+ '<!-- plumbus:agent-wiring version=1 format=copilot mode=reference layout=flat -->',
112
+ '# Plumbus Framework — Copilot Instructions',
113
+ '',
114
+ '<!-- /plumbus:agent-wiring -->',
115
+ ].join('\n'), 'utf-8');
116
+ const check = checkAgentWiring();
117
+ expect(check.status).toBe('warn');
118
+ expect(check.message).toContain('version 1');
119
+ expect(check.message).toContain('plumbus init --patch');
120
+ }
121
+ finally {
122
+ rmSync(tempDir, { recursive: true, force: true });
123
+ }
124
+ });
125
+ it('checkAgentWiring accepts current generated wiring', () => {
126
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
127
+ try {
128
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
129
+ mkdirSync(path.join(tempDir, '.github'), { recursive: true });
130
+ mkdirSync(path.join(tempDir, '.cursor', 'rules'), { recursive: true });
131
+ writeFileSync(path.join(tempDir, '.github', 'copilot-instructions.md'), generateCopilotInstructions(false), 'utf-8');
132
+ writeFileSync(path.join(tempDir, '.cursor', 'rules', 'plumbus.mdc'), generateCursorRule(false), 'utf-8');
133
+ writeFileSync(path.join(tempDir, '.cursor', 'rules', 'plumbus-capabilities.mdc'), generateCursorCapabilityRule(), 'utf-8');
134
+ writeFileSync(path.join(tempDir, 'AGENTS.md'), generateAgentsMd(false), 'utf-8');
135
+ const check = checkAgentWiring();
136
+ expect(check.status).toBe('ok');
137
+ expect(check.message).toContain('template version 2');
138
+ }
139
+ finally {
140
+ rmSync(tempDir, { recursive: true, force: true });
141
+ }
142
+ });
143
+ it('checkAgentWiring recommends patch when cursor wiring is incomplete', () => {
144
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
145
+ try {
146
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
147
+ mkdirSync(path.join(tempDir, '.cursor', 'rules'), { recursive: true });
148
+ writeFileSync(path.join(tempDir, '.cursor', 'rules', 'plumbus.mdc'), generateCursorRule(false), 'utf-8');
149
+ const check = checkAgentWiring();
150
+ expect(check.status).toBe('warn');
151
+ expect(check.message).toContain('Cursor wiring is incomplete');
152
+ expect(check.message).toContain('plumbus init --patch');
153
+ }
154
+ finally {
155
+ rmSync(tempDir, { recursive: true, force: true });
156
+ }
157
+ });
158
+ it('checkAgentWiring ignores non-generated AGENTS.md files', () => {
159
+ const tempDir = mkdtempSync(path.join(tmpdir(), 'plumbus-doctor-agent-wiring-'));
160
+ try {
161
+ vi.spyOn(process, 'cwd').mockReturnValue(tempDir);
162
+ writeFileSync(path.join(tempDir, 'AGENTS.md'), '# Framework Development Notes\n\nThis is not generated by plumbus init.', 'utf-8');
163
+ const check = checkAgentWiring();
164
+ expect(check.status).toBe('ok');
165
+ expect(check.message).toContain('No generated agent wiring detected');
166
+ }
167
+ finally {
168
+ rmSync(tempDir, { recursive: true, force: true });
169
+ }
170
+ });
69
171
  });
70
172
  //# sourceMappingURL=doctor.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/doctor.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/doctor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,yCAAyC;QACzC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,0CAA0C;QAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,8DAA8D,EAC9D,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD;gBACE,mFAAmF;gBACnF,4CAA4C;gBAC5C,EAAE;gBACF,gCAAgC;aACjC,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACxD,2BAA2B,CAAC,KAAK,CAAC,EAClC,OAAO,CACR,CAAC;YACF,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,kBAAkB,CAAC,KAAK,CAAC,EACzB,OAAO,CACR,CAAC;YACF,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,CAAC,EAClE,4BAA4B,EAAE,EAC9B,OAAO,CACR,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YAEjF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,EACrD,kBAAkB,CAAC,KAAK,CAAC,EACzB,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAClD,aAAa,CACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAC/B,yEAAyE,EACzE,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}