oc-pilot 0.0.0-stage → 0.5.1

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 (123) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/CONTRIBUTING.md +43 -0
  3. package/Dockerfile +32 -0
  4. package/LICENSE +21 -0
  5. package/README.md +665 -2
  6. package/README.ru.md +523 -0
  7. package/SECURITY.md +42 -0
  8. package/action.yml +68 -0
  9. package/dist/cli.js +120 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/cli.test.js +559 -0
  12. package/dist/cli.test.js.map +1 -0
  13. package/dist/commands/custom.js +87 -0
  14. package/dist/commands/custom.js.map +1 -0
  15. package/dist/commands/docgen.js +256 -0
  16. package/dist/commands/docgen.js.map +1 -0
  17. package/dist/commands/doctor.js +334 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/fix.js +282 -0
  20. package/dist/commands/fix.js.map +1 -0
  21. package/dist/commands/init.js +59 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/review.js +77 -0
  24. package/dist/commands/review.js.map +1 -0
  25. package/dist/commands/scan.js +102 -0
  26. package/dist/commands/scan.js.map +1 -0
  27. package/dist/commands/setup.js +443 -0
  28. package/dist/commands/setup.js.map +1 -0
  29. package/dist/commands/test-fix.js +181 -0
  30. package/dist/commands/test-fix.js.map +1 -0
  31. package/dist/core/command.js +69 -0
  32. package/dist/core/command.js.map +1 -0
  33. package/dist/core/config.js +277 -0
  34. package/dist/core/config.js.map +1 -0
  35. package/dist/core/config.test.js +145 -0
  36. package/dist/core/config.test.js.map +1 -0
  37. package/dist/core/diff-source.js +98 -0
  38. package/dist/core/diff-source.js.map +1 -0
  39. package/dist/core/diff.js +168 -0
  40. package/dist/core/diff.js.map +1 -0
  41. package/dist/core/diff.test.js +94 -0
  42. package/dist/core/diff.test.js.map +1 -0
  43. package/dist/core/engine.js +179 -0
  44. package/dist/core/engine.js.map +1 -0
  45. package/dist/core/engine.test.js +143 -0
  46. package/dist/core/engine.test.js.map +1 -0
  47. package/dist/core/errors.js +21 -0
  48. package/dist/core/errors.js.map +1 -0
  49. package/dist/core/file-context.js +58 -0
  50. package/dist/core/file-context.js.map +1 -0
  51. package/dist/core/file-context.test.js +58 -0
  52. package/dist/core/file-context.test.js.map +1 -0
  53. package/dist/core/findings.js +110 -0
  54. package/dist/core/findings.js.map +1 -0
  55. package/dist/core/findings.test.js +62 -0
  56. package/dist/core/findings.test.js.map +1 -0
  57. package/dist/core/format.js +31 -0
  58. package/dist/core/format.js.map +1 -0
  59. package/dist/core/format.test.js +26 -0
  60. package/dist/core/format.test.js.map +1 -0
  61. package/dist/core/git.js +137 -0
  62. package/dist/core/git.js.map +1 -0
  63. package/dist/core/io.js +57 -0
  64. package/dist/core/io.js.map +1 -0
  65. package/dist/core/lang.js +17 -0
  66. package/dist/core/lang.js.map +1 -0
  67. package/dist/core/log.js +40 -0
  68. package/dist/core/log.js.map +1 -0
  69. package/dist/core/opencode.js +345 -0
  70. package/dist/core/opencode.js.map +1 -0
  71. package/dist/core/opencode.test.js +59 -0
  72. package/dist/core/opencode.test.js.map +1 -0
  73. package/dist/core/options.js +142 -0
  74. package/dist/core/options.js.map +1 -0
  75. package/dist/core/parse.js +54 -0
  76. package/dist/core/parse.js.map +1 -0
  77. package/dist/core/patch.js +155 -0
  78. package/dist/core/patch.js.map +1 -0
  79. package/dist/core/patch.test.js +70 -0
  80. package/dist/core/patch.test.js.map +1 -0
  81. package/dist/core/process.js +27 -0
  82. package/dist/core/process.js.map +1 -0
  83. package/dist/core/project.js +191 -0
  84. package/dist/core/project.js.map +1 -0
  85. package/dist/core/project.test.js +75 -0
  86. package/dist/core/project.test.js.map +1 -0
  87. package/dist/core/prompt.js +255 -0
  88. package/dist/core/prompt.js.map +1 -0
  89. package/dist/core/prompt.test.js +106 -0
  90. package/dist/core/prompt.test.js.map +1 -0
  91. package/dist/core/rules.js +64 -0
  92. package/dist/core/rules.js.map +1 -0
  93. package/dist/core/rules.test.js +72 -0
  94. package/dist/core/rules.test.js.map +1 -0
  95. package/dist/core/run.js +255 -0
  96. package/dist/core/run.js.map +1 -0
  97. package/dist/core/secrets.js +331 -0
  98. package/dist/core/secrets.js.map +1 -0
  99. package/dist/core/secrets.test.js +121 -0
  100. package/dist/core/secrets.test.js.map +1 -0
  101. package/dist/core/snippets.js +130 -0
  102. package/dist/core/snippets.js.map +1 -0
  103. package/dist/core/snippets.test.js +55 -0
  104. package/dist/core/snippets.test.js.map +1 -0
  105. package/dist/mcp-http.test.js +146 -0
  106. package/dist/mcp-http.test.js.map +1 -0
  107. package/dist/mcp.js +913 -0
  108. package/dist/mcp.js.map +1 -0
  109. package/dist/mcp.test.js +128 -0
  110. package/dist/mcp.test.js.map +1 -0
  111. package/dist/setup.test.js +215 -0
  112. package/dist/setup.test.js.map +1 -0
  113. package/dist/types.js +2 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/version.js +2 -0
  116. package/dist/version.js.map +1 -0
  117. package/docker-compose.yml +18 -0
  118. package/docs/integrations.md +467 -0
  119. package/package.json +76 -4
  120. package/prompts/oc-pilot.en.md +104 -0
  121. package/prompts/oc-pilot.ru.md +106 -0
  122. package/server.json +21 -0
  123. package/skills/oc-pilot/SKILL.md +47 -0
@@ -0,0 +1,334 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { spawnSync } from "node:child_process";
5
+ import { asBoolean } from "../core/parse.js";
6
+ import { DEFAULT_API_KEY_ENV, isLoopbackUrl, normalizeBaseUrl, } from "../core/engine.js";
7
+ import { detectTestCommand } from "../core/project.js";
8
+ import { parseCommandArgs, resolveContext, withCommon } from "../core/options.js";
9
+ import { VERSION } from "../version.js";
10
+ const OPTIONS = withCommon({});
11
+ const HELP = `Usage:
12
+ oc-pilot doctor [options]
13
+
14
+ Checks the local setup without calling a model: Node.js, git, the selected
15
+ engine, credentials, test discovery, and MCP client configuration.
16
+
17
+ Options:
18
+ -C, --cwd <dir> Project directory (default: current)
19
+ --config <path> Path to .oc-pilot.json
20
+ --engine <name> Check this engine: opencode or openai
21
+ --base-url <url> OpenAI-compatible base URL
22
+ --api-key-env <n> Environment variable that stores the API key
23
+ -m, --model <id> Model to verify in the selected engine
24
+ --strict Exit 1 on warnings as well as errors
25
+ --json Machine-readable report
26
+ -h, --help Show this help
27
+
28
+ Examples:
29
+ oc-pilot doctor
30
+ oc-pilot doctor --engine openai --model deepseek-chat
31
+ oc-pilot doctor --json
32
+ `;
33
+ function major(version) {
34
+ return Number(version.replace(/^v/, "").split(".")[0]);
35
+ }
36
+ function findExecutable(name) {
37
+ const path = process.env.PATH;
38
+ if (!path)
39
+ return undefined;
40
+ const extensions = process.platform === "win32" ? [".cmd", ".exe", ".bat", ""] : [""];
41
+ for (const directory of path.split(process.platform === "win32" ? ";" : ":")) {
42
+ if (!directory)
43
+ continue;
44
+ for (const extension of extensions) {
45
+ const candidate = join(directory, `${name}${extension}`);
46
+ if (existsSync(candidate))
47
+ return candidate;
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ function runVersion(command) {
53
+ try {
54
+ const result = spawnSync(command, ["--version"], {
55
+ encoding: "utf8",
56
+ timeout: 10_000,
57
+ shell: process.platform === "win32" && /\.(cmd|bat)$/i.test(command),
58
+ windowsHide: true,
59
+ });
60
+ if (result.status !== 0)
61
+ return undefined;
62
+ return (result.stdout || result.stderr).trim().split(/\r?\n/)[0]?.trim() || undefined;
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ }
68
+ function readJson(path) {
69
+ try {
70
+ const value = JSON.parse(readFileSync(path, "utf8"));
71
+ return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
72
+ }
73
+ catch {
74
+ return undefined;
75
+ }
76
+ }
77
+ function objectAt(root, key) {
78
+ const value = root?.[key];
79
+ return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
80
+ }
81
+ function mcpClients(cwd) {
82
+ const clients = [];
83
+ const home = homedir();
84
+ const projectChecks = [
85
+ ["Claude Code", join(cwd, ".mcp.json"), ["mcpServers"]],
86
+ ["Cursor", join(cwd, ".cursor", "mcp.json"), ["mcpServers"]],
87
+ ["Gemini CLI", join(cwd, ".gemini", "settings.json"), ["mcpServers"]],
88
+ ["VS Code", join(cwd, ".vscode", "mcp.json"), ["servers"]],
89
+ ["Generic .agents", join(cwd, ".agents", "mcp.json"), ["mcpServers"]],
90
+ ];
91
+ for (const [name, path, keys] of projectChecks) {
92
+ const root = existsSync(path) ? readJson(path) : undefined;
93
+ if (keys.some((key) => Boolean(objectAt(root, key)?.["oc-pilot"])))
94
+ clients.push(name);
95
+ }
96
+ const openCodeProject = [join(cwd, "opencode.json"), join(cwd, ".opencode", "opencode.json")];
97
+ for (const path of openCodeProject) {
98
+ const root = existsSync(path) ? readJson(path) : undefined;
99
+ if (objectAt(objectAt(root, "mcp"), "servers")?.["oc-pilot"]) {
100
+ clients.push("OpenCode");
101
+ break;
102
+ }
103
+ }
104
+ const zcodeProject = join(cwd, ".zcode", "config.json");
105
+ const zcodeRoot = existsSync(zcodeProject) ? readJson(zcodeProject) : undefined;
106
+ if (objectAt(objectAt(zcodeRoot, "mcp"), "servers")?.["oc-pilot"])
107
+ clients.push("ZCode");
108
+ if (!clients.includes("ZCode")) {
109
+ const zcodeGlobal = join(home, ".zcode", "cli", "config.json");
110
+ const zcodeGlobalRoot = existsSync(zcodeGlobal) ? readJson(zcodeGlobal) : undefined;
111
+ if (objectAt(objectAt(zcodeGlobalRoot, "mcp"), "servers")?.["oc-pilot"])
112
+ clients.push("ZCode");
113
+ }
114
+ const globalChecks = [
115
+ ["Claude Code", join(home, ".claude.json"), ["mcpServers"]],
116
+ ["Gemini CLI", join(home, ".gemini", "settings.json"), ["mcpServers"]],
117
+ ["Windsurf", join(home, ".codeium", "windsurf", "mcp_config.json"), ["mcpServers"]],
118
+ ["Generic .agents", join(home, ".agents", "mcp.json"), ["mcpServers"]],
119
+ ];
120
+ for (const [name, path, keys] of globalChecks) {
121
+ if (clients.includes(name))
122
+ continue;
123
+ const root = existsSync(path) ? readJson(path) : undefined;
124
+ if (keys.some((key) => Boolean(objectAt(root, key)?.["oc-pilot"])))
125
+ clients.push(name);
126
+ }
127
+ const codex = join(home, ".codex", "config.toml");
128
+ if (existsSync(codex)) {
129
+ try {
130
+ if (/\[mcp_servers\.oc[_-]pilot\]/.test(readFileSync(codex, "utf8")))
131
+ clients.push("Codex");
132
+ }
133
+ catch {
134
+ // Ignore an unreadable config.
135
+ }
136
+ }
137
+ return [...new Set(clients)];
138
+ }
139
+ function checkEngine(ctx) {
140
+ const checks = [];
141
+ const engine = ctx.config.engine;
142
+ if (engine === "opencode") {
143
+ const executable = findExecutable("opencode");
144
+ if (!executable) {
145
+ checks.push({
146
+ id: "engine",
147
+ status: "error",
148
+ title: "OpenCode CLI not found",
149
+ detail: "The default engine runs reviews through OpenCode.",
150
+ fix: "npm install -g opencode-ai && opencode auth list",
151
+ });
152
+ }
153
+ else {
154
+ const version = runVersion(executable);
155
+ checks.push({
156
+ id: "engine",
157
+ status: version ? "ok" : "warn",
158
+ title: version ? `OpenCode ${version}` : "OpenCode found but --version failed",
159
+ detail: executable,
160
+ fix: version ? undefined : "Run `opencode --version` manually and check the installation.",
161
+ });
162
+ }
163
+ if (!ctx.config.model) {
164
+ checks.push({
165
+ id: "model",
166
+ status: "info",
167
+ title: "No explicit model",
168
+ detail: "OpenCode will use its configured default model. Set --model or model in .oc-pilot.json for reproducibility.",
169
+ });
170
+ }
171
+ else {
172
+ checks.push({ id: "model", status: "ok", title: `Model: ${ctx.config.model}` });
173
+ }
174
+ return checks;
175
+ }
176
+ const baseUrl = normalizeBaseUrl(ctx.config.baseUrl);
177
+ if (!ctx.config.model) {
178
+ checks.push({
179
+ id: "model",
180
+ status: "error",
181
+ title: "No model for engine=openai",
182
+ detail: "The OpenAI-compatible engine needs a concrete model name.",
183
+ fix: "oc-pilot doctor --model deepseek-chat, or set model in .oc-pilot.json",
184
+ });
185
+ }
186
+ else {
187
+ checks.push({ id: "model", status: "ok", title: `Model: ${ctx.config.model}` });
188
+ }
189
+ const envName = ctx.config.apiKeyEnv?.trim() || DEFAULT_API_KEY_ENV;
190
+ let key = process.env[envName]?.trim();
191
+ if (!key && envName === DEFAULT_API_KEY_ENV)
192
+ key = process.env.OPENAI_API_KEY?.trim();
193
+ if (!key && !isLoopbackUrl(baseUrl)) {
194
+ checks.push({
195
+ id: "credentials",
196
+ status: "error",
197
+ title: `API key is not set (${envName})`,
198
+ detail: "Remote OpenAI-compatible endpoints require a bearer token.",
199
+ fix: `export ${envName}=... (PowerShell: $env:${envName}="...")`,
200
+ });
201
+ }
202
+ else {
203
+ checks.push({
204
+ id: "credentials",
205
+ status: "ok",
206
+ title: key ? `API key is set (${envName})` : "Local endpoint without an API key",
207
+ detail: baseUrl,
208
+ });
209
+ }
210
+ if (baseUrl.startsWith("http://") && !isLoopbackUrl(baseUrl)) {
211
+ checks.push({
212
+ id: "transport",
213
+ status: "warn",
214
+ title: "Plain HTTP endpoint",
215
+ detail: "The API key and source code travel unencrypted. Use HTTPS or a trusted tunnel.",
216
+ });
217
+ }
218
+ else {
219
+ checks.push({ id: "transport", status: "ok", title: `Endpoint: ${baseUrl}` });
220
+ }
221
+ return checks;
222
+ }
223
+ function checkGit(cwd) {
224
+ const version = runVersion("git");
225
+ if (!version) {
226
+ return [
227
+ {
228
+ id: "git",
229
+ status: "error",
230
+ title: "git not found",
231
+ detail: "Diff collection and fix/test workflows need git.",
232
+ fix: "Install git and reopen the terminal.",
233
+ },
234
+ ];
235
+ }
236
+ const inside = spawnSync("git", ["rev-parse", "--is-inside-work-tree"], {
237
+ cwd,
238
+ encoding: "utf8",
239
+ timeout: 10_000,
240
+ windowsHide: true,
241
+ });
242
+ return [
243
+ { id: "git", status: "ok", title: version },
244
+ {
245
+ id: "repository",
246
+ status: inside.status === 0 && inside.stdout.trim() === "true" ? "ok" : "warn",
247
+ title: inside.stdout.trim() === "true" ? "Inside a git repository" : "Not a git repository",
248
+ detail: "review and fix can still work with --diff, but normal diff collection needs git.",
249
+ fix: inside.stdout.trim() === "true" ? undefined : "git init",
250
+ },
251
+ ];
252
+ }
253
+ export async function runDoctor(argv) {
254
+ const { values } = parseCommandArgs(argv, OPTIONS);
255
+ if (asBoolean(values, "help")) {
256
+ process.stdout.write(HELP);
257
+ return 0;
258
+ }
259
+ const ctx = resolveContext(values);
260
+ const checks = [];
261
+ const nodeMajor = major(process.versions.node);
262
+ checks.push({
263
+ id: "node",
264
+ status: nodeMajor >= 22 ? "ok" : "error",
265
+ title: `Node.js v${process.versions.node}`,
266
+ detail: nodeMajor >= 22 ? undefined : "Node.js 22 or newer is required.",
267
+ fix: nodeMajor >= 22 ? undefined : "Install Node.js 22+ from https://nodejs.org",
268
+ });
269
+ checks.push({
270
+ id: "config",
271
+ status: "ok",
272
+ title: ctx.configPath ? `Config: ${ctx.configPath}` : "Config: built-in defaults",
273
+ detail: ctx.configPath ? undefined : "Run `oc-pilot init` to create .oc-pilot.json.",
274
+ });
275
+ checks.push(...checkEngine(ctx));
276
+ checks.push(...checkGit(ctx.cwd));
277
+ const detected = detectTestCommand(ctx.cwd);
278
+ checks.push({
279
+ id: "tests",
280
+ status: detected ? "ok" : "info",
281
+ title: detected ? `Test command: ${detected.command}` : "Test command not detected",
282
+ detail: detected ? detected.source : "test-fix and fix --apply may need --command.",
283
+ });
284
+ const clients = mcpClients(ctx.cwd);
285
+ checks.push({
286
+ id: "mcp",
287
+ status: clients.length > 0 ? "ok" : "warn",
288
+ title: clients.length > 0 ? `MCP configured: ${clients.join(", ")}` : "MCP is not configured for a detected client",
289
+ detail: clients.length > 0 ? undefined : "Optional, but this is how other agents call oc-pilot.",
290
+ fix: clients.length > 0 ? undefined : "oc-pilot setup --all",
291
+ });
292
+ const rules = join(ctx.cwd, ".oc-pilot", "rules.md");
293
+ checks.push({
294
+ id: "rules",
295
+ status: existsSync(rules) ? "ok" : "info",
296
+ title: existsSync(rules) ? "Project rules found" : "No project rules (optional)",
297
+ detail: existsSync(rules) ? rules : "Add .oc-pilot/rules.md to teach the reviewer your conventions.",
298
+ });
299
+ const summary = {
300
+ ok: checks.filter((check) => check.status === "ok").length,
301
+ warn: checks.filter((check) => check.status === "warn").length,
302
+ error: checks.filter((check) => check.status === "error").length,
303
+ info: checks.filter((check) => check.status === "info").length,
304
+ };
305
+ const report = {
306
+ version: VERSION,
307
+ cwd: ctx.cwd,
308
+ configPath: ctx.configPath ?? null,
309
+ engine: ctx.config.engine,
310
+ checks,
311
+ summary,
312
+ };
313
+ if (ctx.flags.json) {
314
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
315
+ }
316
+ else {
317
+ process.stdout.write(`oc-pilot doctor ${VERSION}\n\n`);
318
+ for (const check of checks) {
319
+ const icon = check.status === "ok" ? "✅" : check.status === "warn" ? "⚠️" : check.status === "error" ? "❌" : "ℹ️";
320
+ process.stdout.write(`${icon} ${check.title}\n`);
321
+ if (check.detail)
322
+ process.stdout.write(` ${check.detail}\n`);
323
+ if (check.fix)
324
+ process.stdout.write(` fix: ${check.fix}\n`);
325
+ }
326
+ process.stdout.write(`\nSummary: ${summary.ok} ok, ${summary.warn} warning(s), ${summary.error} error(s), ${summary.info} note(s).\n`);
327
+ }
328
+ if (summary.error > 0)
329
+ return 1;
330
+ if (ctx.flags.strict && summary.warn > 0)
331
+ return 1;
332
+ return 0;
333
+ }
334
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,GAAe,UAAU,CAAC,EAAE,CAAC,CAAC;AAE3C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBZ,CAAC;AAqBF,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;YACzD,IAAI,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;YAC/C,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,MAAM;YACf,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;YACpE,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAyC,EAAE,GAAW;IACtE,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,aAAa,GAAsC;QACvD,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACvD,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC5D,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACrE,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;KACtE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEzF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,YAAY,GAAsC;QACtD,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QAC3D,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACtE,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;QACnF,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;KACvE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,IAAI,8BAA8B,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,GAAsC;IACzD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;IACjC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,mDAAmD;gBAC3D,GAAG,EAAE,kDAAkD;aACxD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;gBAC/B,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,qCAAqC;gBAC9E,MAAM,EAAE,UAAU;gBAClB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,+DAA+D;aAC3F,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,MAAM,EAAE,6GAA6G;aACtH,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,4BAA4B;YACnC,MAAM,EAAE,2DAA2D;YACnE,GAAG,EAAE,uEAAuE;SAC7E,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC;IACpE,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,GAAG,IAAI,OAAO,KAAK,mBAAmB;QAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IACtF,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,uBAAuB,OAAO,GAAG;YACxC,MAAM,EAAE,4DAA4D;YACpE,GAAG,EAAE,UAAU,OAAO,2BAA2B,OAAO,SAAS;SAClE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB,OAAO,GAAG,CAAC,CAAC,CAAC,mCAAmC;YAChF,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,WAAW;YACf,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,gFAAgF;SACzF,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,OAAO,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL;gBACE,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,eAAe;gBACtB,MAAM,EAAE,kDAAkD;gBAC1D,GAAG,EAAE,sCAAsC;aAC5C;SACF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE;QACtE,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;QAC3C;YACE,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,sBAAsB;YAC3F,MAAM,EAAE,kFAAkF;YAC1F,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;SAC9D;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,MAAM;QACV,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QACxC,KAAK,EAAE,YAAY,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QAC1C,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kCAAkC;QACxE,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6CAA6C;KACjF,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,2BAA2B;QACjF,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,+CAA+C;KACrF,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAChC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,2BAA2B;QACnF,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,8CAA8C;KACpF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC1C,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,6CAA6C;QACnH,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uDAAuD;QAChG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB;KAC7D,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC;QACV,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QACzC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,6BAA6B;QAChF,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gEAAgE;KACrG,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG;QACd,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,MAAM;QAC1D,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM;QAC9D,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM;QAChE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM;KAC/D,CAAC;IACF,MAAM,MAAM,GAAiB;QAC3B,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI;QAClC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QACzB,MAAM;QACN,OAAO;KACR,CAAC;IAEF,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,MAAM,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAClH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YAC/D,IAAI,KAAK,CAAC,GAAG;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,cAAc,OAAO,CAAC,EAAE,QAAQ,OAAO,CAAC,IAAI,gBAAgB,OAAO,CAAC,KAAK,cAAc,OAAO,CAAC,IAAI,aAAa,CACjH,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,282 @@
1
+ import { writeOutput } from "../core/io.js";
2
+ import { log } from "../core/log.js";
3
+ import { COMMON_HELP, parseCommandArgs, resolveContext, withCommon } from "../core/options.js";
4
+ import { asBoolean, asString, parsePositiveInt } from "../core/parse.js";
5
+ import { applyPatch, checkPatch, extractPatch, patchTargets, revertPatch } from "../core/patch.js";
6
+ import { runShellCommand } from "../core/command.js";
7
+ import { describeDiffSource, loadDiff } from "../core/diff-source.js";
8
+ import { detectProjectType, detectTestCommand } from "../core/project.js";
9
+ import { parseFindings } from "../core/findings.js";
10
+ import { executeRecipeDetailed, githubAnnotations } from "../core/run.js";
11
+ import { scanDiff } from "../core/secrets.js";
12
+ const OPTIONS = withCommon({
13
+ staged: { type: "boolean" },
14
+ unstaged: { type: "boolean" },
15
+ base: { type: "string" },
16
+ diff: { type: "string" },
17
+ stdin: { type: "boolean" },
18
+ "include-untracked": { type: "boolean" },
19
+ context: { type: "string" },
20
+ command: { type: "string" },
21
+ apply: { type: "boolean" },
22
+ "no-tests": { type: "boolean" },
23
+ "keep-on-test-failure": { type: "boolean" },
24
+ rounds: { type: "string" },
25
+ "no-secret-scan": { type: "boolean" },
26
+ });
27
+ const HELP = `Использование:
28
+ oc-pilot fix [пути...] [опции]
29
+
30
+ Просит модель предложить минимальный unified diff, проверяет его через
31
+ git apply --check и по желанию применяет. С --apply и тестами выполняет
32
+ цикл: применить → прогнать тесты → откатить при падении → попробовать снова.
33
+
34
+ Опции:
35
+ --apply применить патч к рабочему дереву
36
+ --command <cmd> команда тестов (по умолчанию автоопределение)
37
+ --no-tests не запускать тесты после применения
38
+ --keep-on-test-failure оставить патч, даже если тесты упали
39
+ --rounds <n> попыток исправления, 1..5 (по умолчанию 2)
40
+ --staged только staged-изменения
41
+ --unstaged только unstaged-изменения
42
+ --base <ref> diff <ref>...HEAD
43
+ --diff <file|-> готовый diff
44
+ --stdin читать diff из stdin
45
+ --include-untracked включить новые файлы
46
+ --context <text|@file> дополнительный контекст
47
+ --no-secret-scan не искать секреты в diff и патче
48
+ ${COMMON_HELP}
49
+
50
+ Примеры:
51
+ oc-pilot fix
52
+ oc-pilot fix --apply
53
+ oc-pilot fix --apply --command "npm test" --rounds 3
54
+ oc-pilot fix src/wallet.go --apply
55
+ `;
56
+ function failureContext(patch, test) {
57
+ return [
58
+ "PREVIOUS_FIX_ATTEMPT failed.",
59
+ "PATCH:",
60
+ "```diff",
61
+ patch,
62
+ "```",
63
+ `TEST_COMMAND: ${test.command}`,
64
+ `TEST_EXIT_CODE: ${test.exitCode}`,
65
+ "TEST_OUTPUT (tail):",
66
+ test.output.slice(-20_000),
67
+ ].join("\n");
68
+ }
69
+ export async function runFix(argv) {
70
+ const { values, positionals } = parseCommandArgs(argv, OPTIONS);
71
+ if (asBoolean(values, "help")) {
72
+ process.stdout.write(HELP);
73
+ return 0;
74
+ }
75
+ const ctx = resolveContext(values);
76
+ const data = await loadDiff(values, ctx, positionals);
77
+ if (!data.diff.trim()) {
78
+ log.info("Изменений нет — исправлять нечего.");
79
+ return 0;
80
+ }
81
+ const apply = asBoolean(values, "apply");
82
+ const noTests = asBoolean(values, "no-tests");
83
+ const roundsRaw = asString(values, "rounds");
84
+ const rounds = roundsRaw ? parsePositiveInt(roundsRaw, "rounds", 5) : 2;
85
+ const detectedTest = detectTestCommand(ctx.cwd);
86
+ const testCommand = asString(values, "command") ?? detectedTest?.command;
87
+ const userContext = asString(values, "context");
88
+ const baseParts = [
89
+ "FIX_MODE: propose the smallest safe unified diff that fixes the most important problems in GIT_DIFF.",
90
+ "Return the normal output schema. Put exactly one ```diff fenced patch under `#### Solution`.",
91
+ "Only modify files that appear in GIT_DIFF. Do not add secrets, dependencies or generated files.",
92
+ `DIFF_SOURCE: ${describeDiffSource(data.source)}`,
93
+ `DIFF_STATS: ${data.stats.files} файл(ов), +${data.stats.additions} / -${data.stats.deletions}`,
94
+ ];
95
+ if (data.untracked.length > 0) {
96
+ baseParts.push(`UNTRACKED_FILES (в diff):\n${data.untracked.map((file) => `- ${file}`).join("\n")}`);
97
+ }
98
+ if (userContext?.trim())
99
+ baseParts.push(`USER_CONTEXT:\n${userContext.trim()}`);
100
+ const captureCtx = {
101
+ ...ctx,
102
+ flags: { ...ctx.flags, json: false, output: undefined },
103
+ };
104
+ let lastTest;
105
+ let lastPatch;
106
+ let lastAnalysis;
107
+ for (let round = 1; round <= rounds; round += 1) {
108
+ const context = lastPatch && lastTest
109
+ ? [...baseParts, `ROUND: ${round}`, failureContext(lastPatch, lastTest)].join("\n\n")
110
+ : [...baseParts, `ROUND: ${round}`].join("\n\n");
111
+ const execution = await executeRecipeDetailed({
112
+ recipe: "custom",
113
+ projectType: detectProjectType(ctx.cwd, data.changedFiles),
114
+ additionalContext: context,
115
+ diff: data.payloadDiff,
116
+ secretFindings: data.findings,
117
+ changedFiles: data.changedFiles,
118
+ noSecretScan: asBoolean(values, "no-secret-scan"),
119
+ meta: { source: data.source, fixRound: round },
120
+ }, captureCtx, { capture: true });
121
+ if (ctx.flags.dryRun)
122
+ return execution.exitCode;
123
+ if (!execution.analysis) {
124
+ log.warn("Модель не вернула анализ.");
125
+ return 1;
126
+ }
127
+ lastAnalysis = execution.analysis;
128
+ if (ctx.flags.github) {
129
+ for (const annotation of githubAnnotations(parseFindings(execution.analysis), ctx.cwd)) {
130
+ process.stderr.write(`${annotation}\n`);
131
+ }
132
+ }
133
+ const patch = extractPatch(execution.analysis);
134
+ if (!patch) {
135
+ log.warn("В ответе нет unified diff. Нужен блок ```diff или diff --git.");
136
+ return 1;
137
+ }
138
+ lastPatch = patch;
139
+ const allowed = new Set(data.changedFiles);
140
+ const outside = patchTargets(patch).filter((file) => !allowed.has(file));
141
+ if (outside.length > 0) {
142
+ log.warn(`Патч затрагивает файлы вне diff: ${outside.join(", ")}. Применение остановлено.`);
143
+ return 1;
144
+ }
145
+ if (!asBoolean(values, "no-secret-scan")) {
146
+ const secretScan = scanDiff(patch);
147
+ if (secretScan.findings.some((finding) => finding.severity === "critical")) {
148
+ log.warn("Патч содержит потенциальный секрет. Применение остановлено.");
149
+ return 1;
150
+ }
151
+ }
152
+ const check = await checkPatch(ctx.cwd, patch);
153
+ if (check.exitCode !== 0) {
154
+ log.warn(`Патч не применяется: ${check.stderr.trim() || check.stdout.trim() || "git apply --check failed"}`);
155
+ if (!apply)
156
+ return 1;
157
+ lastTest = {
158
+ command: "git apply --check",
159
+ exitCode: check.exitCode,
160
+ timedOut: false,
161
+ durationMs: 0,
162
+ output: check.stderr || check.stdout,
163
+ };
164
+ continue;
165
+ }
166
+ if (!apply) {
167
+ if (ctx.flags.json) {
168
+ const payload = {
169
+ applied: false,
170
+ patch,
171
+ check: "ok",
172
+ analysis: execution.analysis,
173
+ meta: execution.meta,
174
+ };
175
+ const path = writeOutput(JSON.stringify(payload, null, 2), ctx.flags.output);
176
+ if (path)
177
+ log.success(`Результат записан: ${path}`);
178
+ }
179
+ else {
180
+ process.stdout.write(`${execution.analysis.trim()}\n\n### Patch (not applied)\n\n\`\`\`diff\n${patch}\n\`\`\`\n`);
181
+ }
182
+ return 0;
183
+ }
184
+ const applied = await applyPatch(ctx.cwd, patch);
185
+ if (applied.exitCode !== 0) {
186
+ log.warn(`Не удалось применить патч: ${applied.stderr.trim() || applied.stdout.trim()}`);
187
+ return 1;
188
+ }
189
+ log.success(`Патч применён (раунд ${round}).`);
190
+ if (noTests || !testCommand) {
191
+ if (!noTests)
192
+ log.warn("Команда тестов не найдена; патч оставлен без проверки.");
193
+ const payload = {
194
+ applied: true,
195
+ patch,
196
+ tests: null,
197
+ analysis: execution.analysis,
198
+ meta: execution.meta,
199
+ };
200
+ if (ctx.flags.json) {
201
+ const path = writeOutput(JSON.stringify(payload, null, 2), ctx.flags.output);
202
+ if (path)
203
+ log.success(`Результат записан: ${path}`);
204
+ }
205
+ else {
206
+ process.stdout.write(`${execution.analysis.trim()}\n\n### Patch (applied)\n\n\`\`\`diff\n${patch}\n\`\`\`\n`);
207
+ }
208
+ return 0;
209
+ }
210
+ log.step(`Тесты: ${testCommand}`);
211
+ const test = await runShellCommand(testCommand, ctx.cwd, {
212
+ timeoutMs: ctx.config.timeoutSeconds * 1000,
213
+ verbose: ctx.flags.verbose,
214
+ });
215
+ lastTest = { command: testCommand, ...test };
216
+ if (test.exitCode === 0 && !test.timedOut) {
217
+ log.success(`Тесты прошли (${Math.round(test.durationMs / 1000)} с). Патч оставлен.`);
218
+ const payload = {
219
+ applied: true,
220
+ patch,
221
+ tests: lastTest,
222
+ analysis: execution.analysis,
223
+ meta: execution.meta,
224
+ };
225
+ if (ctx.flags.json) {
226
+ const path = writeOutput(JSON.stringify(payload, null, 2), ctx.flags.output);
227
+ if (path)
228
+ log.success(`Результат записан: ${path}`);
229
+ }
230
+ else {
231
+ process.stdout.write(`${execution.analysis.trim()}\n\n### Patch (applied, tests passed)\n\n\`\`\`diff\n${patch}\n\`\`\`\n`);
232
+ }
233
+ return 0;
234
+ }
235
+ if (asBoolean(values, "keep-on-test-failure")) {
236
+ log.warn(`Тесты упали (exit ${test.exitCode}${test.timedOut ? ", timeout" : ""}). Патч оставлен (--keep-on-test-failure).`);
237
+ const payload = {
238
+ applied: true,
239
+ patch,
240
+ tests: lastTest,
241
+ analysis: execution.analysis,
242
+ meta: execution.meta,
243
+ error: "tests failed; patch kept by request",
244
+ };
245
+ if (ctx.flags.json) {
246
+ const path = writeOutput(JSON.stringify(payload, null, 2), ctx.flags.output);
247
+ if (path)
248
+ log.success(`Результат записан: ${path}`);
249
+ }
250
+ else {
251
+ process.stdout.write(`${execution.analysis.trim()}\n\n### Patch (applied, tests failed, kept)\n\n\`\`\`diff\n${patch}\n\`\`\`\n`);
252
+ }
253
+ return 1;
254
+ }
255
+ log.warn(`Тесты упали (exit ${test.exitCode}${test.timedOut ? ", timeout" : ""}). Откатываю патч.`);
256
+ const reverted = await revertPatch(ctx.cwd, patch);
257
+ if (reverted.exitCode !== 0) {
258
+ log.error(`Не удалось откатить патч: ${reverted.stderr.trim() || reverted.stdout.trim()}`);
259
+ return 1;
260
+ }
261
+ if (round === rounds)
262
+ break;
263
+ log.step(`Повторная попытка ${round + 1}/${rounds} с выводом тестов.`);
264
+ }
265
+ if (ctx.flags.json) {
266
+ const payload = {
267
+ applied: false,
268
+ patch: lastPatch ?? null,
269
+ tests: lastTest ?? null,
270
+ analysis: lastAnalysis ?? null,
271
+ error: "fix attempts exhausted; working tree restored",
272
+ };
273
+ const path = writeOutput(JSON.stringify(payload, null, 2), ctx.flags.output);
274
+ if (path)
275
+ log.success(`Результат записан: ${path}`);
276
+ }
277
+ else {
278
+ log.error(`Не удалось получить зелёные тесты за ${rounds} попыт(и). Рабочее дерево восстановлено.`);
279
+ }
280
+ return 1;
281
+ }
282
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/commands/fix.ts"],"names":[],"mappings":"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"}