@mainwp/control 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 (204) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +583 -0
  3. package/bin/_exit.js +12 -0
  4. package/bin/dev.js +7 -0
  5. package/bin/run.js +7 -0
  6. package/dist/chat/chat-engine.d.ts +213 -0
  7. package/dist/chat/chat-engine.d.ts.map +1 -0
  8. package/dist/chat/chat-engine.js +636 -0
  9. package/dist/chat/chat-engine.js.map +1 -0
  10. package/dist/chat/index.d.ts +10 -0
  11. package/dist/chat/index.d.ts.map +1 -0
  12. package/dist/chat/index.js +14 -0
  13. package/dist/chat/index.js.map +1 -0
  14. package/dist/chat/providers/anthropic.d.ts +52 -0
  15. package/dist/chat/providers/anthropic.d.ts.map +1 -0
  16. package/dist/chat/providers/anthropic.js +292 -0
  17. package/dist/chat/providers/anthropic.js.map +1 -0
  18. package/dist/chat/providers/gemini.d.ts +52 -0
  19. package/dist/chat/providers/gemini.d.ts.map +1 -0
  20. package/dist/chat/providers/gemini.js +284 -0
  21. package/dist/chat/providers/gemini.js.map +1 -0
  22. package/dist/chat/providers/index.d.ts +19 -0
  23. package/dist/chat/providers/index.d.ts.map +1 -0
  24. package/dist/chat/providers/index.js +23 -0
  25. package/dist/chat/providers/index.js.map +1 -0
  26. package/dist/chat/providers/local.d.ts +37 -0
  27. package/dist/chat/providers/local.d.ts.map +1 -0
  28. package/dist/chat/providers/local.js +130 -0
  29. package/dist/chat/providers/local.js.map +1 -0
  30. package/dist/chat/providers/openai-compatible.d.ts +155 -0
  31. package/dist/chat/providers/openai-compatible.d.ts.map +1 -0
  32. package/dist/chat/providers/openai-compatible.js +264 -0
  33. package/dist/chat/providers/openai-compatible.js.map +1 -0
  34. package/dist/chat/providers/openai.d.ts +24 -0
  35. package/dist/chat/providers/openai.d.ts.map +1 -0
  36. package/dist/chat/providers/openai.js +62 -0
  37. package/dist/chat/providers/openai.js.map +1 -0
  38. package/dist/chat/providers/openrouter.d.ts +26 -0
  39. package/dist/chat/providers/openrouter.d.ts.map +1 -0
  40. package/dist/chat/providers/openrouter.js +65 -0
  41. package/dist/chat/providers/openrouter.js.map +1 -0
  42. package/dist/chat/providers/provider-fetch.d.ts +15 -0
  43. package/dist/chat/providers/provider-fetch.d.ts.map +1 -0
  44. package/dist/chat/providers/provider-fetch.js +35 -0
  45. package/dist/chat/providers/provider-fetch.js.map +1 -0
  46. package/dist/chat/providers/provider.d.ts +214 -0
  47. package/dist/chat/providers/provider.d.ts.map +1 -0
  48. package/dist/chat/providers/provider.js +166 -0
  49. package/dist/chat/providers/provider.js.map +1 -0
  50. package/dist/chat/providers/sse-reader.d.ts +21 -0
  51. package/dist/chat/providers/sse-reader.d.ts.map +1 -0
  52. package/dist/chat/providers/sse-reader.js +48 -0
  53. package/dist/chat/providers/sse-reader.js.map +1 -0
  54. package/dist/chat/system-prompt.d.ts +33 -0
  55. package/dist/chat/system-prompt.d.ts.map +1 -0
  56. package/dist/chat/system-prompt.js +166 -0
  57. package/dist/chat/system-prompt.js.map +1 -0
  58. package/dist/chat/tool-envelope.d.ts +72 -0
  59. package/dist/chat/tool-envelope.d.ts.map +1 -0
  60. package/dist/chat/tool-envelope.js +263 -0
  61. package/dist/chat/tool-envelope.js.map +1 -0
  62. package/dist/commands/abilities/info.d.ts +21 -0
  63. package/dist/commands/abilities/info.d.ts.map +1 -0
  64. package/dist/commands/abilities/info.js +80 -0
  65. package/dist/commands/abilities/info.js.map +1 -0
  66. package/dist/commands/abilities/list.d.ts +19 -0
  67. package/dist/commands/abilities/list.d.ts.map +1 -0
  68. package/dist/commands/abilities/list.js +98 -0
  69. package/dist/commands/abilities/list.js.map +1 -0
  70. package/dist/commands/abilities/run.d.ts +75 -0
  71. package/dist/commands/abilities/run.d.ts.map +1 -0
  72. package/dist/commands/abilities/run.js +468 -0
  73. package/dist/commands/abilities/run.js.map +1 -0
  74. package/dist/commands/chat.d.ts +54 -0
  75. package/dist/commands/chat.d.ts.map +1 -0
  76. package/dist/commands/chat.js +384 -0
  77. package/dist/commands/chat.js.map +1 -0
  78. package/dist/commands/config/show.d.ts +54 -0
  79. package/dist/commands/config/show.d.ts.map +1 -0
  80. package/dist/commands/config/show.js +324 -0
  81. package/dist/commands/config/show.js.map +1 -0
  82. package/dist/commands/doctor.d.ts +77 -0
  83. package/dist/commands/doctor.d.ts.map +1 -0
  84. package/dist/commands/doctor.js +412 -0
  85. package/dist/commands/doctor.js.map +1 -0
  86. package/dist/commands/jobs/watch.d.ts +50 -0
  87. package/dist/commands/jobs/watch.d.ts.map +1 -0
  88. package/dist/commands/jobs/watch.js +269 -0
  89. package/dist/commands/jobs/watch.js.map +1 -0
  90. package/dist/commands/login.d.ts +25 -0
  91. package/dist/commands/login.d.ts.map +1 -0
  92. package/dist/commands/login.js +165 -0
  93. package/dist/commands/login.js.map +1 -0
  94. package/dist/commands/profile/delete.d.ts +22 -0
  95. package/dist/commands/profile/delete.d.ts.map +1 -0
  96. package/dist/commands/profile/delete.js +57 -0
  97. package/dist/commands/profile/delete.js.map +1 -0
  98. package/dist/commands/profile/list.d.ts +19 -0
  99. package/dist/commands/profile/list.d.ts.map +1 -0
  100. package/dist/commands/profile/list.js +53 -0
  101. package/dist/commands/profile/list.js.map +1 -0
  102. package/dist/commands/profile/use.d.ts +22 -0
  103. package/dist/commands/profile/use.d.ts.map +1 -0
  104. package/dist/commands/profile/use.js +46 -0
  105. package/dist/commands/profile/use.js.map +1 -0
  106. package/dist/config/fs-utils.d.ts +14 -0
  107. package/dist/config/fs-utils.d.ts.map +1 -0
  108. package/dist/config/fs-utils.js +31 -0
  109. package/dist/config/fs-utils.js.map +1 -0
  110. package/dist/config/keychain.d.ts +53 -0
  111. package/dist/config/keychain.d.ts.map +1 -0
  112. package/dist/config/keychain.js +175 -0
  113. package/dist/config/keychain.js.map +1 -0
  114. package/dist/config/profile-store.d.ts +85 -0
  115. package/dist/config/profile-store.d.ts.map +1 -0
  116. package/dist/config/profile-store.js +228 -0
  117. package/dist/config/profile-store.js.map +1 -0
  118. package/dist/config/settings.d.ts +71 -0
  119. package/dist/config/settings.d.ts.map +1 -0
  120. package/dist/config/settings.js +151 -0
  121. package/dist/config/settings.js.map +1 -0
  122. package/dist/core/abilities-executor.d.ts +126 -0
  123. package/dist/core/abilities-executor.d.ts.map +1 -0
  124. package/dist/core/abilities-executor.js +264 -0
  125. package/dist/core/abilities-executor.js.map +1 -0
  126. package/dist/core/batch-manager.d.ts +113 -0
  127. package/dist/core/batch-manager.d.ts.map +1 -0
  128. package/dist/core/batch-manager.js +244 -0
  129. package/dist/core/batch-manager.js.map +1 -0
  130. package/dist/core/http-client.d.ts +111 -0
  131. package/dist/core/http-client.d.ts.map +1 -0
  132. package/dist/core/http-client.js +329 -0
  133. package/dist/core/http-client.js.map +1 -0
  134. package/dist/core/safety-controller.d.ts +114 -0
  135. package/dist/core/safety-controller.d.ts.map +1 -0
  136. package/dist/core/safety-controller.js +229 -0
  137. package/dist/core/safety-controller.js.map +1 -0
  138. package/dist/hooks/command-not-found.d.ts +12 -0
  139. package/dist/hooks/command-not-found.d.ts.map +1 -0
  140. package/dist/hooks/command-not-found.js +58 -0
  141. package/dist/hooks/command-not-found.js.map +1 -0
  142. package/dist/index.d.ts +7 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +7 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/lib/base-command.d.ts +123 -0
  147. package/dist/lib/base-command.d.ts.map +1 -0
  148. package/dist/lib/base-command.js +285 -0
  149. package/dist/lib/base-command.js.map +1 -0
  150. package/dist/output/formatter.d.ts +48 -0
  151. package/dist/output/formatter.d.ts.map +1 -0
  152. package/dist/output/formatter.js +138 -0
  153. package/dist/output/formatter.js.map +1 -0
  154. package/dist/output/json-envelope.d.ts +43 -0
  155. package/dist/output/json-envelope.d.ts.map +1 -0
  156. package/dist/output/json-envelope.js +73 -0
  157. package/dist/output/json-envelope.js.map +1 -0
  158. package/dist/utils/audit-logger.d.ts +97 -0
  159. package/dist/utils/audit-logger.d.ts.map +1 -0
  160. package/dist/utils/audit-logger.js +169 -0
  161. package/dist/utils/audit-logger.js.map +1 -0
  162. package/dist/utils/colors.d.ts +29 -0
  163. package/dist/utils/colors.d.ts.map +1 -0
  164. package/dist/utils/colors.js +36 -0
  165. package/dist/utils/colors.js.map +1 -0
  166. package/dist/utils/errors.d.ts +107 -0
  167. package/dist/utils/errors.d.ts.map +1 -0
  168. package/dist/utils/errors.js +149 -0
  169. package/dist/utils/errors.js.map +1 -0
  170. package/dist/utils/exit-codes.d.ts +21 -0
  171. package/dist/utils/exit-codes.d.ts.map +1 -0
  172. package/dist/utils/exit-codes.js +20 -0
  173. package/dist/utils/exit-codes.js.map +1 -0
  174. package/dist/utils/format.d.ts +64 -0
  175. package/dist/utils/format.d.ts.map +1 -0
  176. package/dist/utils/format.js +69 -0
  177. package/dist/utils/format.js.map +1 -0
  178. package/dist/utils/prompt.d.ts +34 -0
  179. package/dist/utils/prompt.d.ts.map +1 -0
  180. package/dist/utils/prompt.js +132 -0
  181. package/dist/utils/prompt.js.map +1 -0
  182. package/dist/utils/retry.d.ts +59 -0
  183. package/dist/utils/retry.d.ts.map +1 -0
  184. package/dist/utils/retry.js +96 -0
  185. package/dist/utils/retry.js.map +1 -0
  186. package/dist/utils/terminal-sanitizer.d.ts +60 -0
  187. package/dist/utils/terminal-sanitizer.d.ts.map +1 -0
  188. package/dist/utils/terminal-sanitizer.js +166 -0
  189. package/dist/utils/terminal-sanitizer.js.map +1 -0
  190. package/dist/validation/input-sanitizer.d.ts +76 -0
  191. package/dist/validation/input-sanitizer.d.ts.map +1 -0
  192. package/dist/validation/input-sanitizer.js +199 -0
  193. package/dist/validation/input-sanitizer.js.map +1 -0
  194. package/dist/validation/schema-validator.d.ts +75 -0
  195. package/dist/validation/schema-validator.d.ts.map +1 -0
  196. package/dist/validation/schema-validator.js +147 -0
  197. package/dist/validation/schema-validator.js.map +1 -0
  198. package/oclif.manifest.json +857 -0
  199. package/package.json +101 -0
  200. package/scripts/completions/README.md +221 -0
  201. package/scripts/completions/mainwpcontrol.bash +193 -0
  202. package/scripts/completions/mainwpcontrol.zsh +267 -0
  203. package/scripts/completions/profile-completer.sh +35 -0
  204. package/scripts/completions/regenerate.sh +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/profile/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,MAAM,CAAC,WAAW,GAAG,+BAA+B,CAAC;IAErD,MAAM,CAAC,QAAQ,GAAG;QAChB,gCAAgC;QAChC,uCAAuC;KACxC,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW;KACf,CAAC;IAEF,gCAAgC;IACtB,YAAY;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,aAAa,EAAE,CAAC;QAEtD,IAAI,CAAC,MAAM,CACT;YACE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,GAAG,EAAE,CAAC,CAAC,YAAY;gBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,UAAU;aAC9B,CAAC,CAAC;YACH,aAAa,EAAE,UAAU;SAC1B,EACD,GAAG,EAAE;YACH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,+DAA+D,CAAC;YACzE,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;YAE9C,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC/B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;aACjC,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAEvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;IACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Profile use command for mainwpcontrol
3
+ *
4
+ * Switches the active Dashboard profile.
5
+ */
6
+ import { BaseCommand } from '../../lib/base-command.js';
7
+ export default class ProfileUse extends BaseCommand {
8
+ static description: string;
9
+ static examples: string[];
10
+ static flags: {
11
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ profile: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ };
16
+ static args: {
17
+ name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
18
+ };
19
+ protected needsProfile(): boolean;
20
+ run(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../../src/commands/profile/use.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAe,MAAM,2BAA2B,CAAC;AAKrE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,WAAW,SAAqC;IAEvD,MAAM,CAAC,QAAQ,WAGb;IAEF,MAAM,CAAC,KAAK;;;;;MAEV;IAEF,MAAM,CAAC,IAAI;;MAKT;IAGF,SAAS,CAAC,YAAY,IAAI,OAAO;IAI3B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB3B"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Profile use command for mainwpcontrol
3
+ *
4
+ * Switches the active Dashboard profile.
5
+ */
6
+ import { Args } from '@oclif/core';
7
+ import { BaseCommand, commonFlags } from '../../lib/base-command.js';
8
+ import { getProfileStore } from '../../config/profile-store.js';
9
+ import { formatSuccess } from '../../output/formatter.js';
10
+ import { ConfigError } from '../../utils/errors.js';
11
+ export default class ProfileUse extends BaseCommand {
12
+ static description = 'Switch active Dashboard profile';
13
+ static examples = [
14
+ '<%= config.bin %> profile use production',
15
+ '<%= config.bin %> profile use staging --json',
16
+ ];
17
+ static flags = {
18
+ ...commonFlags,
19
+ };
20
+ static args = {
21
+ name: Args.string({
22
+ description: 'Profile name to activate',
23
+ required: true,
24
+ }),
25
+ };
26
+ // Doesn't need a profile loaded initially
27
+ needsProfile() {
28
+ return false;
29
+ }
30
+ async run() {
31
+ const { args, flags } = await this.parse(ProfileUse);
32
+ await this.initCommon(flags);
33
+ const profileStore = getProfileStore();
34
+ const profile = await profileStore.get(args.name);
35
+ if (!profile) {
36
+ throw new ConfigError(`Profile not found: ${args.name}. Run \`mainwpcontrol profile list\` to see available profiles.`);
37
+ }
38
+ await profileStore.setActive(args.name);
39
+ this.output({
40
+ profile: args.name,
41
+ url: profile.dashboardUrl,
42
+ username: profile.username,
43
+ }, () => formatSuccess(`Switched to profile: ${args.name}`));
44
+ }
45
+ }
46
+ //# sourceMappingURL=use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.js","sourceRoot":"","sources":["../../../src/commands/profile/use.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;IACjD,MAAM,CAAC,WAAW,GAAG,iCAAiC,CAAC;IAEvD,MAAM,CAAC,QAAQ,GAAG;QAChB,0CAA0C;QAC1C,8CAA8C;KAC/C,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,WAAW;KACf,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,0CAA0C;IAChC,YAAY;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CACnB,sBAAsB,IAAI,CAAC,IAAI,iEAAiE,CACjG,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CACT;YACE,OAAO,EAAE,IAAI,CAAC,IAAI;YAClB,GAAG,EAAE,OAAO,CAAC,YAAY;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,EACD,GAAG,EAAE,CAAC,aAAa,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CACzD,CAAC;IACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Filesystem utilities for secure config file operations
3
+ *
4
+ * Provides atomic write with restricted permissions for config files.
5
+ */
6
+ /**
7
+ * Write content to a file atomically with restricted permissions.
8
+ *
9
+ * Creates the parent directory (mode 0o700) if needed, writes to a
10
+ * temporary file (mode 0o600), then renames. Cleans up the temp file
11
+ * on rename failure.
12
+ */
13
+ export declare function atomicWriteFile(filePath: string, content: string): Promise<void>;
14
+ //# sourceMappingURL=fs-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/config/fs-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtF"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Filesystem utilities for secure config file operations
3
+ *
4
+ * Provides atomic write with restricted permissions for config files.
5
+ */
6
+ import { promises as fs } from 'node:fs';
7
+ import { dirname } from 'node:path';
8
+ /**
9
+ * Write content to a file atomically with restricted permissions.
10
+ *
11
+ * Creates the parent directory (mode 0o700) if needed, writes to a
12
+ * temporary file (mode 0o600), then renames. Cleans up the temp file
13
+ * on rename failure.
14
+ */
15
+ export async function atomicWriteFile(filePath, content) {
16
+ const dir = dirname(filePath);
17
+ const tmpPath = `${filePath}.tmp`;
18
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
19
+ await fs.writeFile(tmpPath, content, {
20
+ encoding: 'utf-8',
21
+ mode: 0o600,
22
+ });
23
+ try {
24
+ await fs.rename(tmpPath, filePath);
25
+ }
26
+ catch (error) {
27
+ await fs.unlink(tmpPath).catch(() => { });
28
+ throw error;
29
+ }
30
+ }
31
+ //# sourceMappingURL=fs-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/config/fs-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe;IACrE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,CAAC;IAElC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE;QACnC,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Keychain integration for mainwpcontrol
3
+ *
4
+ * Secure credential storage with environment variable fallback.
5
+ *
6
+ * Fallback chain:
7
+ * 1. OS keychain (via keytar)
8
+ * 2. Environment variable: MAINWP_APP_PASSWORD
9
+ * 3. Error if neither available
10
+ */
11
+ /**
12
+ * Result of a credential storage operation
13
+ */
14
+ export interface KeychainSetResult {
15
+ /** Whether credentials were successfully stored */
16
+ stored: boolean;
17
+ /** Where credentials were stored (or 'none' if storage failed) */
18
+ location: 'keychain' | 'none';
19
+ /** Error message if storage failed */
20
+ error?: string;
21
+ }
22
+ /**
23
+ * Keychain class
24
+ */
25
+ export declare class Keychain {
26
+ /**
27
+ * Check if keychain is available
28
+ */
29
+ isAvailable(): Promise<boolean>;
30
+ /**
31
+ * Store a credential
32
+ *
33
+ * @returns Result indicating whether storage succeeded and where credentials are stored
34
+ */
35
+ set(profileName: string, password: string): Promise<KeychainSetResult>;
36
+ /**
37
+ * Retrieve a credential
38
+ */
39
+ get(profileName: string): Promise<string | undefined>;
40
+ /**
41
+ * Delete a credential
42
+ */
43
+ delete(profileName: string): Promise<void>;
44
+ /**
45
+ * Get credential or throw
46
+ */
47
+ getOrThrow(profileName: string): Promise<string>;
48
+ }
49
+ /**
50
+ * Get the keychain instance
51
+ */
52
+ export declare function getKeychain(): Keychain;
53
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/config/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgFH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAKrC;;;;OAIG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwB5E;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAwB3D;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAchD;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAavD;AAOD;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAKtC"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Keychain integration for mainwpcontrol
3
+ *
4
+ * Secure credential storage with environment variable fallback.
5
+ *
6
+ * Fallback chain:
7
+ * 1. OS keychain (via keytar)
8
+ * 2. Environment variable: MAINWP_APP_PASSWORD
9
+ * 3. Error if neither available
10
+ */
11
+ import { AuthError } from '../utils/errors.js';
12
+ /**
13
+ * Service name for keychain entries
14
+ */
15
+ const SERVICE_NAME = 'mainwpcontrol';
16
+ /**
17
+ * Environment variable for fallback
18
+ */
19
+ const ENV_VAR = 'MAINWP_APP_PASSWORD';
20
+ /**
21
+ * Timeout for keytar operations (ms). If macOS shows a blocking keychain
22
+ * dialog, this prevents the CLI from hanging indefinitely.
23
+ */
24
+ const KEYTAR_TIMEOUT_MS = 5_000;
25
+ function withTimeout(promise, ms) {
26
+ return new Promise((resolve, reject) => {
27
+ const timer = setTimeout(() => reject(new Error('Keychain access timed out — the system keychain may be locked or unavailable')), ms);
28
+ timer.unref();
29
+ promise.then((val) => { clearTimeout(timer); resolve(val); }, (err) => { clearTimeout(timer); reject(err); });
30
+ });
31
+ }
32
+ /**
33
+ * Keytar module (lazy loaded)
34
+ */
35
+ let keytar = null;
36
+ let keytarAvailable = null;
37
+ /**
38
+ * Try to load keytar
39
+ */
40
+ async function loadKeytar() {
41
+ if (keytar !== null) {
42
+ return keytar;
43
+ }
44
+ if (keytarAvailable === false) {
45
+ return null;
46
+ }
47
+ // Allow explicit opt-out for CI/containers where native keychain is unavailable
48
+ if (process.env['MAINWPCONTROL_NO_KEYTAR'] === '1') {
49
+ keytarAvailable = false;
50
+ return null;
51
+ }
52
+ try {
53
+ const mod = await import('keytar');
54
+ // CJS/ESM interop: on newer Node versions, CJS exports are nested under .default.
55
+ // Check for the expected API on mod first; only unwrap .default if needed.
56
+ keytar = typeof mod.setPassword === 'function'
57
+ ? mod
58
+ : typeof mod.default?.setPassword === 'function'
59
+ ? mod.default
60
+ : undefined;
61
+ if (!keytar) {
62
+ keytarAvailable = false;
63
+ return null;
64
+ }
65
+ keytarAvailable = true;
66
+ return keytar;
67
+ }
68
+ catch {
69
+ keytarAvailable = false;
70
+ return null;
71
+ }
72
+ }
73
+ /**
74
+ * Keychain class
75
+ */
76
+ export class Keychain {
77
+ /**
78
+ * Check if keychain is available
79
+ */
80
+ async isAvailable() {
81
+ const kt = await loadKeytar();
82
+ return kt !== null;
83
+ }
84
+ /**
85
+ * Store a credential
86
+ *
87
+ * @returns Result indicating whether storage succeeded and where credentials are stored
88
+ */
89
+ async set(profileName, password) {
90
+ const kt = await loadKeytar();
91
+ if (kt) {
92
+ try {
93
+ await withTimeout(kt.setPassword(SERVICE_NAME, profileName, password), KEYTAR_TIMEOUT_MS);
94
+ return { stored: true, location: 'keychain' };
95
+ }
96
+ catch (error) {
97
+ const errorMessage = error.message;
98
+ return {
99
+ stored: false,
100
+ location: 'none',
101
+ error: errorMessage,
102
+ };
103
+ }
104
+ }
105
+ return {
106
+ stored: false,
107
+ location: 'none',
108
+ error: 'Keychain (keytar) is not available',
109
+ };
110
+ }
111
+ /**
112
+ * Retrieve a credential
113
+ */
114
+ async get(profileName) {
115
+ // First try keytar
116
+ const kt = await loadKeytar();
117
+ if (kt) {
118
+ try {
119
+ const password = await withTimeout(kt.getPassword(SERVICE_NAME, profileName), KEYTAR_TIMEOUT_MS);
120
+ if (password) {
121
+ return password;
122
+ }
123
+ }
124
+ catch {
125
+ // Keytar failed, fall through to env var
126
+ }
127
+ }
128
+ // Fallback to environment variable
129
+ const envPassword = process.env[ENV_VAR];
130
+ if (envPassword) {
131
+ return envPassword;
132
+ }
133
+ return undefined;
134
+ }
135
+ /**
136
+ * Delete a credential
137
+ */
138
+ async delete(profileName) {
139
+ const kt = await loadKeytar();
140
+ if (kt) {
141
+ try {
142
+ await withTimeout(kt.deletePassword(SERVICE_NAME, profileName), KEYTAR_TIMEOUT_MS);
143
+ }
144
+ catch (error) {
145
+ if (process.stderr.isTTY) {
146
+ console.error(`Warning: Failed to remove credentials from keychain: ${error.message}`);
147
+ }
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Get credential or throw
153
+ */
154
+ async getOrThrow(profileName) {
155
+ const password = await this.get(profileName);
156
+ if (!password) {
157
+ throw new AuthError(`No credentials found for profile "${profileName}".`, undefined, `Run \`mainwpcontrol login\` or set ${ENV_VAR} environment variable`);
158
+ }
159
+ return password;
160
+ }
161
+ }
162
+ /**
163
+ * Singleton instance
164
+ */
165
+ let keychainInstance = null;
166
+ /**
167
+ * Get the keychain instance
168
+ */
169
+ export function getKeychain() {
170
+ if (!keychainInstance) {
171
+ keychainInstance = new Keychain();
172
+ }
173
+ return keychainInstance;
174
+ }
175
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/config/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,YAAY,GAAG,eAAe,CAAC;AAErC;;GAEG;AACH,MAAM,OAAO,GAAG,qBAAqB,CAAC;AAEtC;;;GAGG;AACH,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,SAAS,WAAW,CAAI,OAAmB,EAAE,EAAU;IACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC,EACvG,EAAE,CACH,CAAC;QACF,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CACV,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAC/C,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC/C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,IAAI,MAAM,GAAmC,IAAI,CAAC;AAClD,IAAI,eAAe,GAAmB,IAAI,CAAC;AAE3C;;GAEG;AACH,KAAK,UAAU,UAAU;IACvB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IAChF,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,KAAK,GAAG,EAAE,CAAC;QACnD,eAAe,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,kFAAkF;QAClF,2EAA2E;QAC3E,MAAM,GAAG,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU;YAC5C,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,OAAQ,GAAW,CAAC,OAAO,EAAE,WAAW,KAAK,UAAU;gBACvD,CAAC,CAAE,GAAW,CAAC,OAAO;gBACtB,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,eAAe,GAAG,KAAK,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,eAAe,GAAG,IAAI,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,GAAG,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAcD;;GAEG;AACH,MAAM,OAAO,QAAQ;IACnB;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,IAAI,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,QAAgB;QAC7C,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAE9B,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBAC1F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;gBAC9C,OAAO;oBACL,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,YAAY;iBACpB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,oCAAoC;SAC5C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB;QAC3B,mBAAmB;QACnB,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAE9B,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;gBACjG,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yCAAyC;YAC3C,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QAE9B,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,WAAW,CAAC,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACrF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACzB,OAAO,CAAC,KAAK,CAAC,wDAAyD,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CACjB,qCAAqC,WAAW,IAAI,EACpD,SAAS,EACT,sCAAsC,OAAO,uBAAuB,CACrE,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED;;GAEG;AACH,IAAI,gBAAgB,GAAoB,IAAI,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,QAAQ,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Profile store for mainwpcontrol
3
+ *
4
+ * Manages multiple Dashboard connection profiles.
5
+ */
6
+ /**
7
+ * Profile data (credentials stored separately in keychain)
8
+ */
9
+ export interface Profile {
10
+ /** Profile name (unique identifier) */
11
+ name: string;
12
+ /** Dashboard URL */
13
+ dashboardUrl: string;
14
+ /** WordPress admin username */
15
+ username: string;
16
+ /** Skip SSL verification for this profile */
17
+ skipSSLVerification?: boolean;
18
+ /** Created timestamp */
19
+ createdAt: string;
20
+ /** Last used timestamp */
21
+ lastUsedAt?: string;
22
+ }
23
+ /**
24
+ * Profile store class
25
+ */
26
+ export declare class ProfileStore {
27
+ private data;
28
+ /**
29
+ * Validate a URL format and protocol
30
+ */
31
+ private validateUrl;
32
+ /**
33
+ * Validate a profile's required fields and URL format
34
+ */
35
+ private validateProfile;
36
+ /**
37
+ * Validate entire profiles file structure
38
+ */
39
+ private validateProfilesFile;
40
+ /**
41
+ * Ensure data is loaded
42
+ */
43
+ private ensureLoaded;
44
+ /**
45
+ * List all profiles
46
+ */
47
+ list(): Promise<Profile[]>;
48
+ /**
49
+ * Get the active profile
50
+ */
51
+ getActive(): Promise<Profile | undefined>;
52
+ /**
53
+ * Get the active profile name
54
+ */
55
+ getActiveName(): Promise<string | undefined>;
56
+ /**
57
+ * Set the active profile
58
+ */
59
+ setActive(name: string): Promise<void>;
60
+ /**
61
+ * Get a profile by name
62
+ */
63
+ get(name: string): Promise<Profile | undefined>;
64
+ /**
65
+ * Save a profile (create or update)
66
+ */
67
+ save(profile: Profile): Promise<void>;
68
+ /**
69
+ * Remove a profile
70
+ */
71
+ remove(name: string): Promise<void>;
72
+ /**
73
+ * Check if a profile exists
74
+ */
75
+ exists(name: string): Promise<boolean>;
76
+ /**
77
+ * Reload profiles from disk
78
+ */
79
+ reload(): Promise<void>;
80
+ }
81
+ /**
82
+ * Get the profile store instance
83
+ */
84
+ export declare function getProfileStore(): ProfileStore;
85
+ //# sourceMappingURL=profile-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-store.d.ts","sourceRoot":"","sources":["../../src/config/profile-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IAEb,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IAEjB,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAElB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgDD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA6B;IAEzC;;OAEG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;OAEG;YACW,YAAY;IAS1B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAKhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAW/C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKlD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5C;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAKrD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B;AAOD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}