popeye-cli 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 (209) hide show
  1. package/.env.example +25 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +320 -0
  4. package/dist/adapters/claude.d.ts +82 -0
  5. package/dist/adapters/claude.d.ts.map +1 -0
  6. package/dist/adapters/claude.js +230 -0
  7. package/dist/adapters/claude.js.map +1 -0
  8. package/dist/adapters/openai.d.ts +48 -0
  9. package/dist/adapters/openai.d.ts.map +1 -0
  10. package/dist/adapters/openai.js +257 -0
  11. package/dist/adapters/openai.js.map +1 -0
  12. package/dist/auth/claude.d.ts +44 -0
  13. package/dist/auth/claude.d.ts.map +1 -0
  14. package/dist/auth/claude.js +139 -0
  15. package/dist/auth/claude.js.map +1 -0
  16. package/dist/auth/index.d.ts +61 -0
  17. package/dist/auth/index.d.ts.map +1 -0
  18. package/dist/auth/index.js +141 -0
  19. package/dist/auth/index.js.map +1 -0
  20. package/dist/auth/keychain.d.ts +66 -0
  21. package/dist/auth/keychain.d.ts.map +1 -0
  22. package/dist/auth/keychain.js +125 -0
  23. package/dist/auth/keychain.js.map +1 -0
  24. package/dist/auth/openai-entry.d.ts +9 -0
  25. package/dist/auth/openai-entry.d.ts.map +1 -0
  26. package/dist/auth/openai-entry.js +410 -0
  27. package/dist/auth/openai-entry.js.map +1 -0
  28. package/dist/auth/openai.d.ts +71 -0
  29. package/dist/auth/openai.d.ts.map +1 -0
  30. package/dist/auth/openai.js +212 -0
  31. package/dist/auth/openai.js.map +1 -0
  32. package/dist/auth/server.d.ts +32 -0
  33. package/dist/auth/server.d.ts.map +1 -0
  34. package/dist/auth/server.js +213 -0
  35. package/dist/auth/server.js.map +1 -0
  36. package/dist/cli/commands/auth.d.ts +10 -0
  37. package/dist/cli/commands/auth.d.ts.map +1 -0
  38. package/dist/cli/commands/auth.js +162 -0
  39. package/dist/cli/commands/auth.js.map +1 -0
  40. package/dist/cli/commands/config.d.ts +10 -0
  41. package/dist/cli/commands/config.d.ts.map +1 -0
  42. package/dist/cli/commands/config.js +215 -0
  43. package/dist/cli/commands/config.js.map +1 -0
  44. package/dist/cli/commands/create.d.ts +10 -0
  45. package/dist/cli/commands/create.d.ts.map +1 -0
  46. package/dist/cli/commands/create.js +240 -0
  47. package/dist/cli/commands/create.js.map +1 -0
  48. package/dist/cli/commands/index.d.ts +10 -0
  49. package/dist/cli/commands/index.d.ts.map +1 -0
  50. package/dist/cli/commands/index.js +10 -0
  51. package/dist/cli/commands/index.js.map +1 -0
  52. package/dist/cli/commands/resume.d.ts +18 -0
  53. package/dist/cli/commands/resume.d.ts.map +1 -0
  54. package/dist/cli/commands/resume.js +241 -0
  55. package/dist/cli/commands/resume.js.map +1 -0
  56. package/dist/cli/commands/status.d.ts +18 -0
  57. package/dist/cli/commands/status.d.ts.map +1 -0
  58. package/dist/cli/commands/status.js +154 -0
  59. package/dist/cli/commands/status.js.map +1 -0
  60. package/dist/cli/index.d.ts +17 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +71 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/interactive.d.ts +9 -0
  65. package/dist/cli/interactive.d.ts.map +1 -0
  66. package/dist/cli/interactive.js +330 -0
  67. package/dist/cli/interactive.js.map +1 -0
  68. package/dist/cli/output.d.ts +182 -0
  69. package/dist/cli/output.d.ts.map +1 -0
  70. package/dist/cli/output.js +355 -0
  71. package/dist/cli/output.js.map +1 -0
  72. package/dist/config/defaults.d.ts +57 -0
  73. package/dist/config/defaults.d.ts.map +1 -0
  74. package/dist/config/defaults.js +103 -0
  75. package/dist/config/defaults.js.map +1 -0
  76. package/dist/config/index.d.ts +138 -0
  77. package/dist/config/index.d.ts.map +1 -0
  78. package/dist/config/index.js +244 -0
  79. package/dist/config/index.js.map +1 -0
  80. package/dist/config/schema.d.ts +220 -0
  81. package/dist/config/schema.d.ts.map +1 -0
  82. package/dist/config/schema.js +141 -0
  83. package/dist/config/schema.js.map +1 -0
  84. package/dist/generators/index.d.ts +101 -0
  85. package/dist/generators/index.d.ts.map +1 -0
  86. package/dist/generators/index.js +200 -0
  87. package/dist/generators/index.js.map +1 -0
  88. package/dist/generators/python.d.ts +48 -0
  89. package/dist/generators/python.d.ts.map +1 -0
  90. package/dist/generators/python.js +262 -0
  91. package/dist/generators/python.js.map +1 -0
  92. package/dist/generators/templates/index.d.ts +6 -0
  93. package/dist/generators/templates/index.d.ts.map +1 -0
  94. package/dist/generators/templates/index.js +6 -0
  95. package/dist/generators/templates/index.js.map +1 -0
  96. package/dist/generators/templates/python.d.ts +53 -0
  97. package/dist/generators/templates/python.d.ts.map +1 -0
  98. package/dist/generators/templates/python.js +454 -0
  99. package/dist/generators/templates/python.js.map +1 -0
  100. package/dist/generators/templates/typescript.d.ts +53 -0
  101. package/dist/generators/templates/typescript.d.ts.map +1 -0
  102. package/dist/generators/templates/typescript.js +394 -0
  103. package/dist/generators/templates/typescript.js.map +1 -0
  104. package/dist/generators/typescript.d.ts +64 -0
  105. package/dist/generators/typescript.d.ts.map +1 -0
  106. package/dist/generators/typescript.js +271 -0
  107. package/dist/generators/typescript.js.map +1 -0
  108. package/dist/index.d.ts +7 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +12 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/state/index.d.ts +168 -0
  113. package/dist/state/index.d.ts.map +1 -0
  114. package/dist/state/index.js +338 -0
  115. package/dist/state/index.js.map +1 -0
  116. package/dist/state/persistence.d.ts +91 -0
  117. package/dist/state/persistence.d.ts.map +1 -0
  118. package/dist/state/persistence.js +201 -0
  119. package/dist/state/persistence.js.map +1 -0
  120. package/dist/types/cli.d.ts +132 -0
  121. package/dist/types/cli.d.ts.map +1 -0
  122. package/dist/types/cli.js +17 -0
  123. package/dist/types/cli.js.map +1 -0
  124. package/dist/types/consensus.d.ts +111 -0
  125. package/dist/types/consensus.d.ts.map +1 -0
  126. package/dist/types/consensus.js +29 -0
  127. package/dist/types/consensus.js.map +1 -0
  128. package/dist/types/index.d.ts +9 -0
  129. package/dist/types/index.d.ts.map +1 -0
  130. package/dist/types/index.js +13 -0
  131. package/dist/types/index.js.map +1 -0
  132. package/dist/types/project.d.ts +73 -0
  133. package/dist/types/project.d.ts.map +1 -0
  134. package/dist/types/project.js +55 -0
  135. package/dist/types/project.js.map +1 -0
  136. package/dist/types/workflow.d.ts +236 -0
  137. package/dist/types/workflow.d.ts.map +1 -0
  138. package/dist/types/workflow.js +74 -0
  139. package/dist/types/workflow.js.map +1 -0
  140. package/dist/workflow/consensus.d.ts +89 -0
  141. package/dist/workflow/consensus.d.ts.map +1 -0
  142. package/dist/workflow/consensus.js +220 -0
  143. package/dist/workflow/consensus.js.map +1 -0
  144. package/dist/workflow/execution-mode.d.ts +82 -0
  145. package/dist/workflow/execution-mode.d.ts.map +1 -0
  146. package/dist/workflow/execution-mode.js +346 -0
  147. package/dist/workflow/execution-mode.js.map +1 -0
  148. package/dist/workflow/index.d.ts +110 -0
  149. package/dist/workflow/index.d.ts.map +1 -0
  150. package/dist/workflow/index.js +283 -0
  151. package/dist/workflow/index.js.map +1 -0
  152. package/dist/workflow/plan-mode.d.ts +83 -0
  153. package/dist/workflow/plan-mode.d.ts.map +1 -0
  154. package/dist/workflow/plan-mode.js +241 -0
  155. package/dist/workflow/plan-mode.js.map +1 -0
  156. package/dist/workflow/test-runner.d.ts +87 -0
  157. package/dist/workflow/test-runner.d.ts.map +1 -0
  158. package/dist/workflow/test-runner.js +273 -0
  159. package/dist/workflow/test-runner.js.map +1 -0
  160. package/eslint.config.js +25 -0
  161. package/package.json +66 -0
  162. package/src/adapters/claude.ts +298 -0
  163. package/src/adapters/openai.ts +300 -0
  164. package/src/auth/claude.ts +166 -0
  165. package/src/auth/index.ts +171 -0
  166. package/src/auth/keychain.ts +138 -0
  167. package/src/auth/openai-entry.ts +410 -0
  168. package/src/auth/openai.ts +260 -0
  169. package/src/auth/server.ts +252 -0
  170. package/src/cli/commands/auth.ts +194 -0
  171. package/src/cli/commands/config.ts +241 -0
  172. package/src/cli/commands/create.ts +308 -0
  173. package/src/cli/commands/index.ts +10 -0
  174. package/src/cli/commands/resume.ts +304 -0
  175. package/src/cli/commands/status.ts +189 -0
  176. package/src/cli/index.ts +90 -0
  177. package/src/cli/interactive.ts +418 -0
  178. package/src/cli/output.ts +410 -0
  179. package/src/config/defaults.ts +114 -0
  180. package/src/config/index.ts +315 -0
  181. package/src/config/schema.ts +164 -0
  182. package/src/generators/index.ts +251 -0
  183. package/src/generators/python.ts +318 -0
  184. package/src/generators/templates/index.ts +6 -0
  185. package/src/generators/templates/python.ts +465 -0
  186. package/src/generators/templates/typescript.ts +417 -0
  187. package/src/generators/typescript.ts +340 -0
  188. package/src/index.ts +13 -0
  189. package/src/state/index.ts +454 -0
  190. package/src/state/persistence.ts +230 -0
  191. package/src/types/cli.ts +146 -0
  192. package/src/types/consensus.ts +116 -0
  193. package/src/types/index.ts +64 -0
  194. package/src/types/project.ts +85 -0
  195. package/src/types/workflow.ts +149 -0
  196. package/src/workflow/consensus.ts +299 -0
  197. package/src/workflow/execution-mode.ts +517 -0
  198. package/src/workflow/index.ts +396 -0
  199. package/src/workflow/plan-mode.ts +356 -0
  200. package/src/workflow/test-runner.ts +345 -0
  201. package/tests/adapters/openai.test.ts +145 -0
  202. package/tests/config/config.test.ts +208 -0
  203. package/tests/generators/generators.test.ts +185 -0
  204. package/tests/types/consensus.test.ts +152 -0
  205. package/tests/types/project.test.ts +134 -0
  206. package/tests/workflow/consensus.test.ts +221 -0
  207. package/tests/workflow/test-runner.test.ts +214 -0
  208. package/tsconfig.json +25 -0
  209. package/vitest.config.ts +22 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Default configuration values
3
+ * Matches popeye-cli-spec.md section 9.1 exactly
4
+ */
5
+ /**
6
+ * Default configuration object
7
+ */
8
+ export const DEFAULT_CONFIG = {
9
+ consensus: {
10
+ threshold: 95,
11
+ max_disagreements: 5,
12
+ escalation_action: 'pause',
13
+ },
14
+ apis: {
15
+ openai: {
16
+ model: 'gpt-4o',
17
+ temperature: 0.3,
18
+ max_tokens: 4096,
19
+ available_models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1-preview', 'o1-mini'],
20
+ },
21
+ claude: {
22
+ model: 'claude-sonnet-4-20250514',
23
+ },
24
+ },
25
+ project: {
26
+ default_language: 'python',
27
+ python: {
28
+ package_manager: 'pip',
29
+ test_framework: 'pytest',
30
+ min_version: '3.10',
31
+ },
32
+ typescript: {
33
+ package_manager: 'npm',
34
+ test_framework: 'jest',
35
+ min_version: '18',
36
+ },
37
+ },
38
+ directories: {
39
+ docs: 'docs',
40
+ tests: 'docs/tests',
41
+ plans: 'docs/plans',
42
+ },
43
+ output: {
44
+ format: 'markdown',
45
+ verbose: false,
46
+ timestamps: true,
47
+ show_consensus_dialog: true,
48
+ },
49
+ };
50
+ /**
51
+ * Configuration file names to search for
52
+ */
53
+ export const CONFIG_FILE_NAMES = [
54
+ 'popeye.config.yaml',
55
+ 'popeye.config.yml',
56
+ '.popeyerc.yaml',
57
+ '.popeyerc.yml',
58
+ '.popeyerc',
59
+ ];
60
+ /**
61
+ * Global config directory path
62
+ */
63
+ export const GLOBAL_CONFIG_DIR = '.popeye';
64
+ /**
65
+ * State file name
66
+ */
67
+ export const STATE_FILE_NAME = 'state.json';
68
+ /**
69
+ * Config file name in .popeye directory
70
+ */
71
+ export const CONFIG_FILE_NAME = 'config.yaml';
72
+ /**
73
+ * Service name for keychain
74
+ */
75
+ export const SERVICE_NAME = 'popeye-cli';
76
+ /**
77
+ * Keychain account names
78
+ */
79
+ export const KEYCHAIN_ACCOUNTS = {
80
+ CLAUDE: 'claude-cli',
81
+ OPENAI: 'openai-api',
82
+ };
83
+ /**
84
+ * Environment variable names
85
+ */
86
+ export const ENV_VARS = {
87
+ OPENAI_KEY: 'POPEYE_OPENAI_KEY',
88
+ ANTHROPIC_KEY: 'POPEYE_ANTHROPIC_KEY',
89
+ DEFAULT_LANGUAGE: 'POPEYE_DEFAULT_LANGUAGE',
90
+ OPENAI_MODEL: 'POPEYE_OPENAI_MODEL',
91
+ CONSENSUS_THRESHOLD: 'POPEYE_CONSENSUS_THRESHOLD',
92
+ MAX_DISAGREEMENTS: 'POPEYE_MAX_DISAGREEMENTS',
93
+ LOG_LEVEL: 'POPEYE_LOG_LEVEL',
94
+ };
95
+ /**
96
+ * CLI version
97
+ */
98
+ export const CLI_VERSION = '1.0.0';
99
+ /**
100
+ * State file version
101
+ */
102
+ export const STATE_VERSION = '1.0.0';
103
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,SAAS,EAAE;QACT,SAAS,EAAE,EAAE;QACb,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,OAAO;KAC3B;IACD,IAAI,EAAE;QACJ,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,GAAG;YAChB,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC;SACpF;QACD,MAAM,EAAE;YACN,KAAK,EAAE,0BAA0B;SAClC;KACF;IACD,OAAO,EAAE;QACP,gBAAgB,EAAE,QAAQ;QAC1B,MAAM,EAAE;YACN,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,QAAQ;YACxB,WAAW,EAAE,MAAM;SACpB;QACD,UAAU,EAAE;YACV,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,MAAM;YACtB,WAAW,EAAE,IAAI;SAClB;KACF;IACD,WAAW,EAAE;QACX,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;KACpB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,IAAI;QAChB,qBAAqB,EAAE,IAAI;KAC5B;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,oBAAoB;IACpB,mBAAmB;IACnB,gBAAgB;IAChB,eAAe;IACf,WAAW;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,YAAY;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,UAAU,EAAE,mBAAmB;IAC/B,aAAa,EAAE,sBAAsB;IACrC,gBAAgB,EAAE,yBAAyB;IAC3C,YAAY,EAAE,qBAAqB;IACnC,mBAAmB,EAAE,4BAA4B;IACjD,iBAAiB,EAAE,0BAA0B;IAC7C,SAAS,EAAE,kBAAkB;CACrB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Configuration management module
3
+ * Handles loading, merging, and validating configuration from multiple sources
4
+ */
5
+ import { type Config } from './schema.js';
6
+ export * from './schema.js';
7
+ export * from './defaults.js';
8
+ /**
9
+ * Deep merge configuration objects
10
+ */
11
+ export declare function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T;
12
+ /**
13
+ * Load and merge configuration from all sources
14
+ * Priority: env vars > project config > global config > defaults
15
+ */
16
+ export declare function loadConfig(cwd?: string): Promise<Config>;
17
+ /**
18
+ * Save configuration to file
19
+ */
20
+ export declare function saveConfig(config: Partial<Config>, global?: boolean): Promise<void>;
21
+ /**
22
+ * Get a specific config value by path
23
+ */
24
+ export declare function getConfigValue<T>(config: Config, keyPath: string): T | undefined;
25
+ /**
26
+ * Set a config value by path
27
+ */
28
+ export declare function setConfigValue(config: Config, keyPath: string, value: unknown): Config;
29
+ /**
30
+ * Get the path to the currently loaded config file (or null if using defaults)
31
+ */
32
+ export declare function getConfigPath(): string | null;
33
+ /**
34
+ * Search for and cache the config path
35
+ */
36
+ export declare function findConfigPath(cwd?: string): Promise<string | null>;
37
+ /**
38
+ * Popeye config type alias for CLI compatibility
39
+ */
40
+ export interface PopeyeConfig extends Config {
41
+ consensus: Config['consensus'] & {
42
+ threshold: number;
43
+ maxIterations: number;
44
+ temperature: number;
45
+ maxTokens: number;
46
+ };
47
+ apis: Config['apis'] & {
48
+ openai: Config['apis']['openai'] & {
49
+ model: string;
50
+ timeout: number;
51
+ };
52
+ };
53
+ project: Config['project'] & {
54
+ defaultLanguage: 'python' | 'typescript';
55
+ defaultName: string;
56
+ };
57
+ directories: Config['directories'] & {
58
+ output: string;
59
+ state: string;
60
+ };
61
+ output: Config['output'] & {
62
+ colors: boolean;
63
+ progress: boolean;
64
+ };
65
+ }
66
+ /**
67
+ * Schema for the Popeye config type used by CLI
68
+ */
69
+ export declare const PopeyeConfigSchema: import("zod").ZodObject<{
70
+ consensus: import("zod").ZodDefault<import("zod").ZodObject<{
71
+ threshold: import("zod").ZodDefault<import("zod").ZodNumber>;
72
+ max_disagreements: import("zod").ZodDefault<import("zod").ZodNumber>;
73
+ escalation_action: import("zod").ZodDefault<import("zod").ZodEnum<{
74
+ abort: "abort";
75
+ pause: "pause";
76
+ continue: "continue";
77
+ }>>;
78
+ }, import("zod/v4/core").$strip>>;
79
+ apis: import("zod").ZodDefault<import("zod").ZodObject<{
80
+ openai: import("zod").ZodDefault<import("zod").ZodObject<{
81
+ model: import("zod").ZodDefault<import("zod").ZodEnum<{
82
+ "gpt-4o": "gpt-4o";
83
+ "gpt-4o-mini": "gpt-4o-mini";
84
+ "gpt-4-turbo": "gpt-4-turbo";
85
+ "o1-preview": "o1-preview";
86
+ "o1-mini": "o1-mini";
87
+ }>>;
88
+ temperature: import("zod").ZodDefault<import("zod").ZodNumber>;
89
+ max_tokens: import("zod").ZodDefault<import("zod").ZodNumber>;
90
+ available_models: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
91
+ }, import("zod/v4/core").$strip>>;
92
+ claude: import("zod").ZodDefault<import("zod").ZodObject<{
93
+ model: import("zod").ZodDefault<import("zod").ZodString>;
94
+ }, import("zod/v4/core").$strip>>;
95
+ }, import("zod/v4/core").$strip>>;
96
+ project: import("zod").ZodDefault<import("zod").ZodObject<{
97
+ default_language: import("zod").ZodDefault<import("zod").ZodEnum<{
98
+ python: "python";
99
+ typescript: "typescript";
100
+ }>>;
101
+ python: import("zod").ZodDefault<import("zod").ZodObject<{
102
+ package_manager: import("zod").ZodDefault<import("zod").ZodEnum<{
103
+ pip: "pip";
104
+ poetry: "poetry";
105
+ pipenv: "pipenv";
106
+ }>>;
107
+ test_framework: import("zod").ZodDefault<import("zod").ZodString>;
108
+ min_version: import("zod").ZodDefault<import("zod").ZodString>;
109
+ }, import("zod/v4/core").$strip>>;
110
+ typescript: import("zod").ZodDefault<import("zod").ZodObject<{
111
+ package_manager: import("zod").ZodDefault<import("zod").ZodEnum<{
112
+ npm: "npm";
113
+ pnpm: "pnpm";
114
+ yarn: "yarn";
115
+ }>>;
116
+ test_framework: import("zod").ZodDefault<import("zod").ZodEnum<{
117
+ jest: "jest";
118
+ vitest: "vitest";
119
+ }>>;
120
+ min_version: import("zod").ZodDefault<import("zod").ZodString>;
121
+ }, import("zod/v4/core").$strip>>;
122
+ }, import("zod/v4/core").$strip>>;
123
+ directories: import("zod").ZodDefault<import("zod").ZodObject<{
124
+ docs: import("zod").ZodDefault<import("zod").ZodString>;
125
+ tests: import("zod").ZodDefault<import("zod").ZodString>;
126
+ plans: import("zod").ZodDefault<import("zod").ZodString>;
127
+ }, import("zod/v4/core").$strip>>;
128
+ output: import("zod").ZodDefault<import("zod").ZodObject<{
129
+ format: import("zod").ZodDefault<import("zod").ZodEnum<{
130
+ markdown: "markdown";
131
+ json: "json";
132
+ }>>;
133
+ verbose: import("zod").ZodDefault<import("zod").ZodBoolean>;
134
+ timestamps: import("zod").ZodDefault<import("zod").ZodBoolean>;
135
+ show_consensus_dialog: import("zod").ZodDefault<import("zod").ZodBoolean>;
136
+ }, import("zod/v4/core").$strip>>;
137
+ }, import("zod/v4/core").$strip>;
138
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AASxD,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAsH9B;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAyB7F;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAYhF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAiBtF;AAOD;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYzE;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM;IAC1C,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG;YACjC,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG;QAC3B,eAAe,EAAE,QAAQ,GAAG,YAAY,CAAC;QACzC,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG;QACnC,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;QACzB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAAe,CAAC"}
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Configuration management module
3
+ * Handles loading, merging, and validating configuration from multiple sources
4
+ */
5
+ import { cosmiconfig } from 'cosmiconfig';
6
+ import { parse as parseYaml } from 'yaml';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { homedir } from 'os';
10
+ import { ConfigSchema } from './schema.js';
11
+ import { DEFAULT_CONFIG, GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME, ENV_VARS, } from './defaults.js';
12
+ // Re-export schema types
13
+ export * from './schema.js';
14
+ export * from './defaults.js';
15
+ /**
16
+ * Configuration loader using cosmiconfig
17
+ */
18
+ const explorer = cosmiconfig('popeye', {
19
+ searchPlaces: [
20
+ 'popeye.config.yaml',
21
+ 'popeye.config.yml',
22
+ '.popeyerc.yaml',
23
+ '.popeyerc.yml',
24
+ '.popeyerc',
25
+ '.popeye/config.yaml',
26
+ '.popeye/config.yml',
27
+ ],
28
+ loaders: {
29
+ '.yaml': (_filepath, content) => parseYaml(content),
30
+ '.yml': (_filepath, content) => parseYaml(content),
31
+ noExt: (_filepath, content) => parseYaml(content),
32
+ },
33
+ });
34
+ /**
35
+ * Load global configuration from ~/.popeye/config.yaml
36
+ */
37
+ async function loadGlobalConfig() {
38
+ const globalConfigPath = path.join(homedir(), GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME);
39
+ try {
40
+ const content = await fs.readFile(globalConfigPath, 'utf-8');
41
+ const parsed = parseYaml(content);
42
+ return parsed || {};
43
+ }
44
+ catch {
45
+ // Global config doesn't exist, return empty
46
+ return {};
47
+ }
48
+ }
49
+ /**
50
+ * Load project-specific configuration
51
+ */
52
+ async function loadProjectConfig(cwd) {
53
+ try {
54
+ const result = await explorer.search(cwd);
55
+ if (result && !result.isEmpty) {
56
+ return result.config;
57
+ }
58
+ }
59
+ catch {
60
+ // Project config doesn't exist or is invalid
61
+ }
62
+ return {};
63
+ }
64
+ /**
65
+ * Load configuration from environment variables
66
+ */
67
+ function loadEnvConfig() {
68
+ const config = {};
69
+ // OpenAI model
70
+ const openaiModel = process.env[ENV_VARS.OPENAI_MODEL];
71
+ if (openaiModel) {
72
+ config.apis = {
73
+ openai: {
74
+ ...DEFAULT_CONFIG.apis.openai,
75
+ model: openaiModel,
76
+ },
77
+ claude: DEFAULT_CONFIG.apis.claude,
78
+ };
79
+ }
80
+ // Default language
81
+ const defaultLanguage = process.env[ENV_VARS.DEFAULT_LANGUAGE];
82
+ if (defaultLanguage && (defaultLanguage === 'python' || defaultLanguage === 'typescript')) {
83
+ config.project = {
84
+ ...DEFAULT_CONFIG.project,
85
+ default_language: defaultLanguage,
86
+ };
87
+ }
88
+ // Consensus threshold
89
+ const threshold = process.env[ENV_VARS.CONSENSUS_THRESHOLD];
90
+ if (threshold) {
91
+ const parsed = parseInt(threshold, 10);
92
+ if (!isNaN(parsed) && parsed >= 0 && parsed <= 100) {
93
+ config.consensus = {
94
+ ...DEFAULT_CONFIG.consensus,
95
+ ...(config.consensus || {}),
96
+ threshold: parsed,
97
+ };
98
+ }
99
+ }
100
+ // Max disagreements
101
+ const maxDisagreements = process.env[ENV_VARS.MAX_DISAGREEMENTS];
102
+ if (maxDisagreements) {
103
+ const parsed = parseInt(maxDisagreements, 10);
104
+ if (!isNaN(parsed) && parsed >= 1 && parsed <= 10) {
105
+ config.consensus = {
106
+ ...DEFAULT_CONFIG.consensus,
107
+ ...(config.consensus || {}),
108
+ max_disagreements: parsed,
109
+ };
110
+ }
111
+ }
112
+ // Verbose/log level
113
+ const logLevel = process.env[ENV_VARS.LOG_LEVEL];
114
+ if (logLevel === 'debug') {
115
+ config.output = {
116
+ ...DEFAULT_CONFIG.output,
117
+ verbose: true,
118
+ };
119
+ }
120
+ return config;
121
+ }
122
+ /**
123
+ * Deep merge configuration objects
124
+ */
125
+ export function deepMerge(target, source) {
126
+ const result = { ...target };
127
+ for (const key in source) {
128
+ const sourceValue = source[key];
129
+ const targetValue = result[key];
130
+ if (sourceValue !== undefined &&
131
+ sourceValue !== null &&
132
+ typeof sourceValue === 'object' &&
133
+ !Array.isArray(sourceValue) &&
134
+ typeof targetValue === 'object' &&
135
+ !Array.isArray(targetValue)) {
136
+ result[key] = deepMerge(targetValue, sourceValue);
137
+ }
138
+ else if (sourceValue !== undefined) {
139
+ result[key] = sourceValue;
140
+ }
141
+ }
142
+ return result;
143
+ }
144
+ /**
145
+ * Load and merge configuration from all sources
146
+ * Priority: env vars > project config > global config > defaults
147
+ */
148
+ export async function loadConfig(cwd) {
149
+ // Load from all sources
150
+ const globalConfig = await loadGlobalConfig();
151
+ const projectConfig = await loadProjectConfig(cwd);
152
+ const envConfig = loadEnvConfig();
153
+ // Merge in priority order
154
+ let merged = deepMerge(DEFAULT_CONFIG, globalConfig);
155
+ merged = deepMerge(merged, projectConfig);
156
+ merged = deepMerge(merged, envConfig);
157
+ // Validate final config
158
+ const result = ConfigSchema.safeParse(merged);
159
+ if (!result.success) {
160
+ console.warn('Configuration validation warnings:', result.error.format());
161
+ // Return defaults if validation fails
162
+ return DEFAULT_CONFIG;
163
+ }
164
+ return result.data;
165
+ }
166
+ /**
167
+ * Save configuration to file
168
+ */
169
+ export async function saveConfig(config, global = false) {
170
+ const { stringify: stringifyYaml } = await import('yaml');
171
+ const configPath = global
172
+ ? path.join(homedir(), GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME)
173
+ : path.join(process.cwd(), '.popeye', CONFIG_FILE_NAME);
174
+ // Ensure directory exists
175
+ const dir = path.dirname(configPath);
176
+ await fs.mkdir(dir, { recursive: true });
177
+ // Write config
178
+ const content = stringifyYaml(config);
179
+ await fs.writeFile(configPath, content, 'utf-8');
180
+ }
181
+ /**
182
+ * Get a specific config value by path
183
+ */
184
+ export function getConfigValue(config, keyPath) {
185
+ const keys = keyPath.split('.');
186
+ let current = config;
187
+ for (const key of keys) {
188
+ if (current === null || current === undefined || typeof current !== 'object') {
189
+ return undefined;
190
+ }
191
+ current = current[key];
192
+ }
193
+ return current;
194
+ }
195
+ /**
196
+ * Set a config value by path
197
+ */
198
+ export function setConfigValue(config, keyPath, value) {
199
+ const keys = keyPath.split('.');
200
+ const result = JSON.parse(JSON.stringify(config));
201
+ let current = result;
202
+ for (let i = 0; i < keys.length - 1; i++) {
203
+ const key = keys[i];
204
+ if (!(key in current) || typeof current[key] !== 'object') {
205
+ current[key] = {};
206
+ }
207
+ current = current[key];
208
+ }
209
+ const lastKey = keys[keys.length - 1];
210
+ current[lastKey] = value;
211
+ return result;
212
+ }
213
+ /**
214
+ * Cached config path from last search
215
+ */
216
+ let cachedConfigPath = null;
217
+ /**
218
+ * Get the path to the currently loaded config file (or null if using defaults)
219
+ */
220
+ export function getConfigPath() {
221
+ return cachedConfigPath;
222
+ }
223
+ /**
224
+ * Search for and cache the config path
225
+ */
226
+ export async function findConfigPath(cwd) {
227
+ try {
228
+ const result = await explorer.search(cwd);
229
+ if (result && result.filepath) {
230
+ cachedConfigPath = result.filepath;
231
+ return result.filepath;
232
+ }
233
+ }
234
+ catch {
235
+ // Ignore errors
236
+ }
237
+ cachedConfigPath = null;
238
+ return null;
239
+ }
240
+ /**
241
+ * Schema for the Popeye config type used by CLI
242
+ */
243
+ export const PopeyeConfigSchema = ConfigSchema;
244
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,GACT,MAAM,eAAe,CAAC;AAEvB,yBAAyB;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAE9B;;GAEG;AACH,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE;QACZ,oBAAoB;QACpB,mBAAmB;QACnB,gBAAgB;QAChB,eAAe;QACf,WAAW;QACX,qBAAqB;QACrB,oBAAoB;KACrB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;QACnE,MAAM,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;QAClE,KAAK,EAAE,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;KAClE;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,KAAK,UAAU,gBAAgB;IAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;IAEnF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,eAAe;IACf,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,GAAG;YACZ,MAAM,EAAE;gBACN,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM;gBAC7B,KAAK,EAAE,WAAgD;aACxD;YACD,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM;SACnC,CAAC;IACJ,CAAC;IAED,mBAAmB;IACnB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC/D,IAAI,eAAe,IAAI,CAAC,eAAe,KAAK,QAAQ,IAAI,eAAe,KAAK,YAAY,CAAC,EAAE,CAAC;QAC1F,MAAM,CAAC,OAAO,GAAG;YACf,GAAG,cAAc,CAAC,OAAO;YACzB,gBAAgB,EAAE,eAAe;SAClC,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC5D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YACnD,MAAM,CAAC,SAAS,GAAG;gBACjB,GAAG,cAAc,CAAC,SAAS;gBAC3B,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC3B,SAAS,EAAE,MAAM;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACjE,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,CAAC,SAAS,GAAG;gBACjB,GAAG,cAAc,CAAC,SAAS;gBAC3B,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC3B,iBAAiB,EAAE,MAAM;aAC1B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,GAAG;YACd,GAAG,cAAc,CAAC,MAAM;YACxB,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAoC,MAAS,EAAE,MAAkB;IACxF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhC,IACE,WAAW,KAAK,SAAS;YACzB,WAAW,KAAK,IAAI;YACpB,OAAO,WAAW,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,OAAO,WAAW,KAAK,QAAQ;YAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,WAAsC,EACtC,WAAsC,CACR,CAAC;QACnC,CAAC;aAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,GAAG,WAA0C,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAY;IAC3C,wBAAwB;IACxB,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,0BAA0B;IAC1B,IAAI,MAAM,GAAG,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACrD,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEtC,wBAAwB;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1E,sCAAsC;QACtC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAuB,EAAE,MAAM,GAAG,KAAK;IACtE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,MAAM;QACvB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAE1D,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,eAAe;IACf,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAI,MAAc,EAAE,OAAe;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,OAAO,GAAY,MAAM,CAAC;IAE9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC7E,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,OAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe,EAAE,KAAc;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAW,CAAC;IAC5D,IAAI,OAAO,GAA4B,MAAM,CAAC;IAE9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;IAEzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,IAAI,gBAAgB,GAAkB,IAAI,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAY;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC9B,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;YACnC,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IACD,gBAAgB,GAAG,IAAI,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAgCD;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC"}