@untools/devflow 0.2.10 → 0.2.12

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 (106) hide show
  1. package/dist/agent/client.d.ts +50 -0
  2. package/dist/agent/client.d.ts.map +1 -0
  3. package/dist/agent/client.js +52 -0
  4. package/dist/agent/client.js.map +1 -0
  5. package/dist/auth/github-token.d.ts +16 -0
  6. package/dist/auth/github-token.d.ts.map +1 -0
  7. package/dist/auth/github-token.js +69 -0
  8. package/dist/auth/github-token.js.map +1 -0
  9. package/dist/auth/oauth.d.ts +16 -0
  10. package/dist/auth/oauth.d.ts.map +1 -0
  11. package/dist/auth/oauth.js +146 -0
  12. package/dist/auth/oauth.js.map +1 -0
  13. package/dist/cli.d.ts +2 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +363 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/config.d.ts +35 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +78 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/copilot/client.d.ts +75 -0
  22. package/dist/copilot/client.d.ts.map +1 -0
  23. package/dist/copilot/client.js +226 -0
  24. package/dist/copilot/client.js.map +1 -0
  25. package/dist/copilot/flows/base.d.ts +47 -0
  26. package/dist/copilot/flows/base.d.ts.map +1 -0
  27. package/dist/copilot/flows/base.js +235 -0
  28. package/dist/copilot/flows/base.js.map +1 -0
  29. package/dist/copilot/flows/explain.d.ts +5 -0
  30. package/dist/copilot/flows/explain.d.ts.map +1 -0
  31. package/dist/copilot/flows/explain.js +76 -0
  32. package/dist/copilot/flows/explain.js.map +1 -0
  33. package/dist/copilot/flows/feature.d.ts +5 -0
  34. package/dist/copilot/flows/feature.d.ts.map +1 -0
  35. package/dist/copilot/flows/feature.js +83 -0
  36. package/dist/copilot/flows/feature.js.map +1 -0
  37. package/dist/copilot/flows/fix-bug.d.ts +5 -0
  38. package/dist/copilot/flows/fix-bug.d.ts.map +1 -0
  39. package/dist/copilot/flows/fix-bug.js +56 -0
  40. package/dist/copilot/flows/fix-bug.js.map +1 -0
  41. package/dist/copilot/flows/index.d.ts +17 -0
  42. package/dist/copilot/flows/index.d.ts.map +1 -0
  43. package/dist/copilot/flows/index.js +41 -0
  44. package/dist/copilot/flows/index.js.map +1 -0
  45. package/dist/copilot/flows/review-pr.d.ts +5 -0
  46. package/dist/copilot/flows/review-pr.d.ts.map +1 -0
  47. package/dist/copilot/flows/review-pr.js +84 -0
  48. package/dist/copilot/flows/review-pr.js.map +1 -0
  49. package/dist/copilot/session-registry.d.ts +12 -0
  50. package/dist/copilot/session-registry.d.ts.map +1 -0
  51. package/dist/copilot/session-registry.js +39 -0
  52. package/dist/copilot/session-registry.js.map +1 -0
  53. package/dist/copilot/tools/files.d.ts +53 -0
  54. package/dist/copilot/tools/files.d.ts.map +1 -0
  55. package/dist/copilot/tools/files.js +250 -0
  56. package/dist/copilot/tools/files.js.map +1 -0
  57. package/dist/copilot/tools/git.d.ts +37 -0
  58. package/dist/copilot/tools/git.d.ts.map +1 -0
  59. package/dist/copilot/tools/git.js +246 -0
  60. package/dist/copilot/tools/git.js.map +1 -0
  61. package/dist/copilot/tools/github.d.ts +36 -0
  62. package/dist/copilot/tools/github.d.ts.map +1 -0
  63. package/dist/copilot/tools/github.js +216 -0
  64. package/dist/copilot/tools/github.js.map +1 -0
  65. package/dist/copilot/tools/index.d.ts +26 -0
  66. package/dist/copilot/tools/index.d.ts.map +1 -0
  67. package/dist/copilot/tools/index.js +25 -0
  68. package/dist/copilot/tools/index.js.map +1 -0
  69. package/dist/copilot/tools/progress.d.ts +19 -0
  70. package/dist/copilot/tools/progress.d.ts.map +1 -0
  71. package/dist/copilot/tools/progress.js +87 -0
  72. package/dist/copilot/tools/progress.js.map +1 -0
  73. package/dist/copilot/tools/tests.d.ts +29 -0
  74. package/dist/copilot/tools/tests.d.ts.map +1 -0
  75. package/dist/copilot/tools/tests.js +136 -0
  76. package/dist/copilot/tools/tests.js.map +1 -0
  77. package/dist/copilot/tools/utils.d.ts +14 -0
  78. package/dist/copilot/tools/utils.d.ts.map +1 -0
  79. package/dist/copilot/tools/utils.js +89 -0
  80. package/dist/copilot/tools/utils.js.map +1 -0
  81. package/dist/credentials.d.ts +21 -0
  82. package/dist/credentials.d.ts.map +1 -0
  83. package/dist/credentials.js +62 -0
  84. package/dist/credentials.js.map +1 -0
  85. package/dist/devflow/client.d.ts +16 -0
  86. package/dist/devflow/client.d.ts.map +1 -0
  87. package/dist/devflow/client.js +61 -0
  88. package/dist/devflow/client.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +7 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/pinga/client.d.ts +16 -0
  94. package/dist/pinga/client.d.ts.map +1 -0
  95. package/dist/pinga/client.js +61 -0
  96. package/dist/pinga/client.js.map +1 -0
  97. package/dist/types.d.ts +58 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/verify-full-flow.d.ts +2 -0
  102. package/dist/verify-full-flow.d.ts.map +1 -0
  103. package/dist/verify-full-flow.js +81 -0
  104. package/dist/verify-full-flow.js.map +1 -0
  105. package/package.json +8 -1
  106. package/.versionrc.json +0 -53
package/dist/cli.js ADDED
@@ -0,0 +1,363 @@
1
+ import yargs from "yargs";
2
+ import { hideBin } from "yargs/helpers";
3
+ import { randomBytes } from "crypto";
4
+ import { createDefaultConfig, saveConfig, validateConfig, loadConfig, } from "./config.js";
5
+ import { initiateOAuthFlow } from "./auth/oauth.js";
6
+ import { PlatformClient } from "./agent/client.js";
7
+ import { WorkflowFactory } from "./copilot/flows/index.js";
8
+ import axios from "axios";
9
+ async function initCommand(options) {
10
+ console.log("\n🚀 DevFlow Agent Initialization\n");
11
+ const platformUrl = options.platformUrl ||
12
+ process.env.PLATFORM_URL ||
13
+ "https://devflow.aevr.space";
14
+ console.log("📍 Platform URL:", platformUrl);
15
+ console.log("⏳ Starting authentication flow...\n");
16
+ try {
17
+ // Initiate OAuth
18
+ const token = await initiateOAuthFlow({
19
+ platformUrl,
20
+ clientId: process.env.GITHUB_CLIENT_ID || "devflow-agent-cli",
21
+ redirectUri: process.env.OAUTH_REDIRECT_URI || "http://localhost:3333/callback",
22
+ });
23
+ console.log("✓ Authentication successful!");
24
+ // Token has agent_id not agentId
25
+ const agentId = token.agent_id || token.agentId;
26
+ console.log(`✓ Agent ID: ${agentId}`);
27
+ // Generate default agent name
28
+ const agentName = options.name || `agent-${randomBytes(4).toString("hex")}`;
29
+ // Register agent with platform to get JWT token
30
+ console.log("\n🔐 Registering agent with platform...");
31
+ let jwtToken;
32
+ try {
33
+ const registerResponse = await axios.post(`${platformUrl}/api/agents`, {
34
+ agentId,
35
+ name: agentName,
36
+ version: "0.1.0",
37
+ platform: process.platform,
38
+ capabilities: ["git", "copilot"],
39
+ }, {
40
+ headers: {
41
+ Authorization: `Bearer ${token.access_token}`, // GitHub token for initial auth
42
+ "Content-Type": "application/json",
43
+ },
44
+ timeout: 10000,
45
+ });
46
+ if (!registerResponse.data?.token) {
47
+ throw new Error("No JWT token received from platform");
48
+ }
49
+ jwtToken = registerResponse.data.token;
50
+ console.log("✓ Agent registered successfully");
51
+ }
52
+ catch (error) {
53
+ if (axios.isAxiosError(error)) {
54
+ console.error(`❌ Agent registration failed: ${error.response?.status} ${error.response?.data?.error || error.message}`);
55
+ }
56
+ else {
57
+ console.error(`❌ Agent registration failed: ${error}`);
58
+ }
59
+ process.exit(1);
60
+ }
61
+ // Fetch GitHub token from platform (managed SaaS mode)
62
+ let githubToken;
63
+ try {
64
+ console.log("\n🔍 Fetching GitHub credentials from platform...");
65
+ const credentialsResponse = await axios.get(`${platformUrl}/api/auth/agent/credentials`, {
66
+ headers: {
67
+ Authorization: `Bearer ${jwtToken}`, // Use JWT token, not OAuth token
68
+ },
69
+ timeout: 10000,
70
+ });
71
+ if (credentialsResponse.data?.credentials?.github_token) {
72
+ githubToken = credentialsResponse.data.credentials.github_token;
73
+ console.log("✓ GitHub credentials synced from platform");
74
+ // Validate the token
75
+ const { validateGitHubToken } = await import("./auth/github-token.js");
76
+ const validation = await validateGitHubToken(githubToken);
77
+ if (validation.valid) {
78
+ console.log(`✓ Token validated for user: ${validation.username}`);
79
+ }
80
+ else {
81
+ console.warn(`⚠️ Token validation failed: ${validation.error}`);
82
+ console.warn("You may need to update your GitHub credentials on the platform.");
83
+ githubToken = undefined;
84
+ }
85
+ }
86
+ else {
87
+ console.log("⚠️ No GitHub credentials found on platform.");
88
+ console.log(" Add your GitHub token at: " + platformUrl + "/settings");
89
+ }
90
+ }
91
+ catch (error) {
92
+ console.warn("\n⚠️ Could not fetch credentials from platform:");
93
+ if (axios.isAxiosError(error)) {
94
+ console.warn(` ${error.response?.status}: ${error.response?.data?.error || error.message}`);
95
+ }
96
+ else {
97
+ console.warn(` ${error}`);
98
+ }
99
+ console.log("\n You can add GitHub credentials later via the platform UI.");
100
+ }
101
+ // Fallback: Manual token prompt (if platform doesn't have credentials)
102
+ if (!githubToken) {
103
+ console.log("\n📝 Alternatively, you can provide a GitHub token now:");
104
+ console.log(" (or skip and configure it later in the platform)");
105
+ try {
106
+ const { promptForGitHubToken, validateGitHubToken } = await import("./auth/github-token.js");
107
+ const manualToken = await promptForGitHubToken();
108
+ if (manualToken) {
109
+ const validation = await validateGitHubToken(manualToken);
110
+ if (validation.valid) {
111
+ githubToken = manualToken;
112
+ console.log(`✓ Token validated for user: ${validation.username}`);
113
+ }
114
+ else {
115
+ console.error(`❌ Token validation failed: ${validation.error}`);
116
+ }
117
+ }
118
+ }
119
+ catch (error) {
120
+ console.error("\n⚠️ Token prompt error:", error);
121
+ }
122
+ }
123
+ // Create and save config
124
+ const config = createDefaultConfig(platformUrl, jwtToken, // Use JWT token from agent registration, not OAuth token
125
+ agentId, agentName, options.agentHostUrl || process.env.AGENT_HOST_URL);
126
+ // Add GitHub token if provided
127
+ if (githubToken) {
128
+ config.credentials = {
129
+ github_token: githubToken,
130
+ };
131
+ }
132
+ const validation = validateConfig(config);
133
+ if (!validation.valid) {
134
+ console.error("❌ Configuration validation failed:");
135
+ validation.errors.forEach((err) => console.error(` - ${err}`));
136
+ process.exit(1);
137
+ }
138
+ saveConfig(config);
139
+ console.log("\n✅ Configuration complete!\n");
140
+ console.log("📋 Configuration Summary:");
141
+ console.log(` Agent: ${agentName}`);
142
+ console.log(` Platform: ${platformUrl}`);
143
+ if (githubToken) {
144
+ console.log(` GitHub: Configured ✓`);
145
+ }
146
+ console.log(` Config Location: ~/.devflow/config.json\n`);
147
+ console.log("🚀 Next Step:");
148
+ console.log(` devflow start\n`);
149
+ }
150
+ catch (error) {
151
+ console.error(`\n❌ Initialization failed: ${error instanceof Error ? error.message : String(error)}`);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ async function startCommand(options) {
156
+ console.log("\n🚀 DevFlow Agent Starting\n");
157
+ const config = loadConfig();
158
+ if (!config) {
159
+ console.log("❌ No agent configured. Run 'devflow init' first.");
160
+ process.exit(1);
161
+ }
162
+ const validation = validateConfig(config);
163
+ if (!validation.valid) {
164
+ console.error("❌ Configuration invalid:");
165
+ validation.errors.forEach((err) => console.error(` - ${err}`));
166
+ process.exit(1);
167
+ }
168
+ if (options.debug) {
169
+ console.log("📋 Debug Configuration:");
170
+ console.log(` Agent: ${config.agent.name}`);
171
+ console.log(` Platform: ${config.platform.url}`);
172
+ console.log(` Poll Interval: ${options.pollInterval}ms\n`);
173
+ }
174
+ // Initialize platform client
175
+ const client = new PlatformClient(config.platform.url, config.agent.id, config.platform.api_key);
176
+ // Graceful shutdown
177
+ let running = true;
178
+ process.on("SIGINT", () => {
179
+ console.log("\n\n✓ Agent shutdown requested");
180
+ running = false;
181
+ setTimeout(() => process.exit(0), 1000);
182
+ });
183
+ // Send initial heartbeat to mark agent as online
184
+ try {
185
+ console.log("� Connecting to platform...");
186
+ await client.heartbeat();
187
+ console.log(`✓ Agent online: ${config.agent.id}`);
188
+ console.log(`✓ Listening for commands...\n`);
189
+ }
190
+ catch (error) {
191
+ console.error(`❌ Connection failed: ${error instanceof Error ? error.message : String(error)}`);
192
+ console.error(` Check that the agent is registered and platform is accessible.`);
193
+ process.exit(1);
194
+ }
195
+ // Main polling loop
196
+ let lastHeartbeat = 0;
197
+ const pollInterval = parseInt(process.env.POLL_INTERVAL_MS || String(options.pollInterval), 10);
198
+ const heartbeatInterval = parseInt(process.env.HEARTBEAT_INTERVAL_MS || "30000", 10);
199
+ while (running) {
200
+ try {
201
+ // Heartbeat at configured interval
202
+ if (Date.now() - lastHeartbeat > heartbeatInterval) {
203
+ if (options.debug) {
204
+ console.log("💓 Sending heartbeat...");
205
+ }
206
+ const heartbeatResponse = await client.heartbeat();
207
+ // Check if agent was disconnected remotely
208
+ if (heartbeatResponse.status === "disconnected") {
209
+ console.log("\n\n🔌 Agent was disconnected remotely.");
210
+ console.log(" Run 'devflow start' to reconnect.\n");
211
+ process.exit(0);
212
+ }
213
+ lastHeartbeat = Date.now();
214
+ if (options.debug) {
215
+ console.log("💓 Heartbeat acknowledged");
216
+ }
217
+ }
218
+ // Poll for commands
219
+ if (options.debug) {
220
+ // console.log("🔍 Polling for commands..."); // Too noisy if every 5s, maybe keep commented or use a higher verbosity level
221
+ process.stdout.write("."); // Use a dot to show activity without spamming newlines
222
+ }
223
+ const commands = await client.getCommands();
224
+ if (commands.length > 0) {
225
+ if (options.debug) {
226
+ console.log(`📨 Received ${commands.length} command(s)`);
227
+ }
228
+ commands.forEach((cmd) => {
229
+ console.log(`\n⚡ Executing: ${cmd.intent}`);
230
+ console.log(` Task ID: ${cmd.taskId}`);
231
+ // Send progress update
232
+ client.reportProgress(cmd.taskId, {
233
+ taskId: cmd.taskId,
234
+ status: "in_progress",
235
+ step: cmd.intent,
236
+ progress: 0.25,
237
+ });
238
+ // Execute task LOCALLY using embedded Workflow Engine
239
+ (async () => {
240
+ try {
241
+ console.log(`⚡ Executing task locally...`);
242
+ // Build context
243
+ const context = {
244
+ taskId: cmd.taskId,
245
+ intent: cmd.intent,
246
+ repo: cmd.repo || "",
247
+ localPath: process.cwd(),
248
+ branch: cmd.branch,
249
+ naturalLanguage: cmd.description || "",
250
+ source: {
251
+ channel: "cli",
252
+ chatId: "local",
253
+ messageId: cmd.taskId,
254
+ },
255
+ sessionId: undefined, // Session ID not available in CommandRequest
256
+ // Use local GitHub token from config (more secure than platform credentials)
257
+ localGitHubToken: config.credentials?.github_token,
258
+ };
259
+ // Set GitHub Token for Copilot SDK if available - REMOVED (Handled in WorkflowExecutor)
260
+ // if (cmd.credentials?.github) {
261
+ // process.env.GITHUB_TOKEN = cmd.credentials.github;
262
+ // }
263
+ // Execute workflow directly
264
+ // This uses the local file system and reports back to Platform via provided URL/Token
265
+ await WorkflowFactory.executeWorkflow(context, config.platform.url, config.platform.api_key);
266
+ // Usage of agent-host URL is DEPRECATED/REMOVED in favor of local execution
267
+ console.log(`✓ Workflow finished: ${cmd.taskId}`);
268
+ }
269
+ catch (error) {
270
+ const errorMsg = error instanceof Error ? error.message : String(error);
271
+ // Report failure via progress update (failTask method doesn't exist)
272
+ await client.reportProgress(cmd.taskId, {
273
+ taskId: cmd.taskId,
274
+ status: "failed",
275
+ step: "Workflow execution failed",
276
+ progress: 1.0,
277
+ details: errorMsg,
278
+ });
279
+ console.error(`✗ Task failed: ${cmd.taskId} - ${errorMsg}`);
280
+ if (options.debug) {
281
+ console.error("Full Error Details:", error);
282
+ }
283
+ }
284
+ })();
285
+ });
286
+ }
287
+ // Wait before next poll
288
+ await new Promise((resolve) => setTimeout(resolve, options.pollInterval));
289
+ }
290
+ catch (error) {
291
+ console.error(`⚠ Poll error: ${error instanceof Error ? error.message : String(error)}`);
292
+ await new Promise((resolve) => setTimeout(resolve, options.pollInterval * 2));
293
+ }
294
+ }
295
+ }
296
+ // ===== CLI ROUTER =====
297
+ export async function runCLI() {
298
+ await yargs(hideBin(process.argv))
299
+ .command("init", "Initialize DevFlow Agent (requires authentication)", (y) => y
300
+ .option("name", {
301
+ alias: "n",
302
+ describe: "Agent name",
303
+ type: "string",
304
+ })
305
+ .option("platform-url", {
306
+ alias: "p",
307
+ describe: "Platform URL",
308
+ type: "string",
309
+ default: "https://devflow.aevr.space",
310
+ })
311
+ .option("agent-host-url", {
312
+ describe: "Agent Host URL (e.g. https://your-render-app.onrender.com)",
313
+ type: "string",
314
+ }), (argv) => initCommand({
315
+ name: argv.name,
316
+ platformUrl: argv["platform-url"],
317
+ agentHostUrl: argv["agent-host-url"],
318
+ }))
319
+ .command("start", "Start DevFlow Agent (polls for commands)", (y) => y
320
+ .option("poll-interval", {
321
+ alias: "i",
322
+ describe: "Polling interval in milliseconds",
323
+ type: "number",
324
+ default: 5000,
325
+ })
326
+ .option("debug", {
327
+ alias: "d",
328
+ describe: "Enable debug logging",
329
+ type: "boolean",
330
+ default: false,
331
+ }), (argv) => startCommand({
332
+ pollInterval: argv["poll-interval"],
333
+ debug: argv.debug,
334
+ }))
335
+ .command("status", "Show agent status", async () => {
336
+ const config = loadConfig();
337
+ if (!config) {
338
+ console.log("❌ No agent configured. Run 'devflow init' first.");
339
+ process.exit(1);
340
+ }
341
+ console.log("\n✓ DevFlow Agent Status\n");
342
+ console.log(` Agent: ${config.agent.name}`);
343
+ console.log(` ID: ${config.agent.id}`);
344
+ console.log(` Platform: ${config.platform.url}`);
345
+ console.log(` Config: ~/.devflow/config.json\n`);
346
+ })
347
+ .option("help", {
348
+ alias: "h",
349
+ describe: "Show help",
350
+ type: "boolean",
351
+ })
352
+ .epilogue(`
353
+ Examples:
354
+ devflow init
355
+ devflow start
356
+ devflow status
357
+ devflow start --debug
358
+ `)
359
+ .demandCommand(1, "Please specify a command")
360
+ .strict()
361
+ .parse();
362
+ }
363
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAKrC,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAsB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAuB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,KAAK,UAAU,WAAW,CAAC,OAAoB;IAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;QACnB,OAAO,CAAC,GAAG,CAAC,YAAY;QACxB,4BAA4B,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC;YACpC,WAAW;YACX,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,mBAAmB;YAC7D,WAAW,EACT,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,gCAAgC;SACrE,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,iCAAiC;QACjC,MAAM,OAAO,GAAI,KAAa,CAAC,QAAQ,IAAK,KAAa,CAAC,OAAO,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QAEtC,8BAA8B;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAE5E,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,IAAI,QAAgB,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,IAAI,CACvC,GAAG,WAAW,aAAa,EAC3B;gBACE,OAAO;gBACP,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;aACjC,EACD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,CAAC,YAAY,EAAE,EAAE,gCAAgC;oBAC/E,cAAc,EAAE,kBAAkB;iBACnC;gBACD,OAAO,EAAE,KAAK;aACf,CACF,CAAC;YAEF,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YAED,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CACX,gCAAgC,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CACzG,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,uDAAuD;QACvD,IAAI,WAA+B,CAAC;QAEpC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,MAAM,mBAAmB,GAAG,MAAM,KAAK,CAAC,GAAG,CACzC,GAAG,WAAW,6BAA6B,EAC3C;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE,iCAAiC;iBACvE;gBACD,OAAO,EAAE,KAAK;aACf,CACF,CAAC;YAEF,IAAI,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;gBACxD,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;gBAEzD,qBAAqB;gBACrB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;gBACvE,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,WAAqB,CAAC,CAAC;gBAEpE,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,gCAAgC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;oBACjE,OAAO,CAAC,IAAI,CACV,iEAAiE,CAClE,CAAC;oBACF,WAAW,GAAG,SAAS,CAAC;gBAC1B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CACT,+BAA+B,GAAG,WAAW,GAAG,WAAW,CAC5D,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YACjE,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CACV,MAAM,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAChF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,GAAG,CACT,gEAAgE,CACjE,CAAC;QACJ,CAAC;QAED,uEAAuE;QACvE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YAEnE,IAAI,CAAC;gBACH,MAAM,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,GACjD,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;gBAEzC,MAAM,WAAW,GAAG,MAAM,oBAAoB,EAAE,CAAC;gBAEjD,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;oBAC1D,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;wBACrB,WAAW,GAAG,WAAW,CAAC;wBAC1B,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACpE,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,8BAA8B,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,mBAAmB,CAChC,WAAW,EACX,QAAQ,EAAE,yDAAyD;QACnE,OAAO,EACP,SAAS,EACT,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CACnD,CAAC;QAEF,+BAA+B;QAC/B,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,WAAW,GAAG;gBACnB,YAAY,EAAE,WAAW;aAC1B,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACpD,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;QAC3C,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AASD,KAAK,UAAU,YAAY,CAAC,OAAqB;IAC/C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,YAAY,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAI,cAAc,CAC/B,MAAM,CAAC,QAAQ,CAAC,GAAG,EACnB,MAAM,CAAC,KAAK,CAAC,EAAE,EACf,MAAM,CAAC,QAAQ,CAAC,OAAO,CACxB,CAAC;IAEF,oBAAoB;IACpB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,GAAG,KAAK,CAAC;QAChB,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAEzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjF,CAAC;QACF,OAAO,CAAC,KAAK,CACX,mEAAmE,CACpE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,YAAY,GAAG,QAAQ,CAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5D,EAAE,CACH,CAAC;IACF,MAAM,iBAAiB,GAAG,QAAQ,CAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,EAC5C,EAAE,CACH,CAAC;IAEF,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,CAAC;YACH,mCAAmC;YACnC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,iBAAiB,EAAE,CAAC;gBACnD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gBACzC,CAAC;gBACD,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;gBAEnD,2CAA2C;gBAC3C,IAAI,iBAAiB,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;oBAChD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;oBACvD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;oBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC3B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,4HAA4H;gBAC5H,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,uDAAuD;YACpF,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAE5C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;gBAC3D,CAAC;gBAED,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAmB,EAAE,EAAE;oBACvC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAEzC,uBAAuB;oBACvB,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE;wBAChC,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,MAAM,EAAE,aAAa;wBACrB,IAAI,EAAE,GAAG,CAAC,MAAM;wBAChB,QAAQ,EAAE,IAAI;qBACf,CAAC,CAAC;oBAEH,sDAAsD;oBACtD,CAAC,KAAK,IAAI,EAAE;wBACV,IAAI,CAAC;4BACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;4BAE3C,gBAAgB;4BAChB,MAAM,OAAO,GAAG;gCACd,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;gCACpB,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE;gCACxB,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,eAAe,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;gCACtC,MAAM,EAAE;oCACN,OAAO,EAAE,KAAc;oCACvB,MAAM,EAAE,OAAO;oCACf,SAAS,EAAE,GAAG,CAAC,MAAM;iCACtB;gCACD,SAAS,EAAE,SAAS,EAAE,6CAA6C;gCACnE,6EAA6E;gCAC7E,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY;6BACnD,CAAC;4BAEF,wFAAwF;4BACxF,iCAAiC;4BACjC,uDAAuD;4BACvD,IAAI;4BAEJ,4BAA4B;4BAC5B,sFAAsF;4BACtF,MAAM,eAAe,CAAC,eAAe,CACnC,OAAO,EACP,MAAM,CAAC,QAAQ,CAAC,GAAG,EACnB,MAAM,CAAC,QAAQ,CAAC,OAAO,CACxB,CAAC;4BAEF,4EAA4E;4BAC5E,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;wBACpD,CAAC;wBAAC,OAAO,KAAU,EAAE,CAAC;4BACpB,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BAEzD,qEAAqE;4BACrE,MAAM,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE;gCACtC,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,MAAM,EAAE,QAAQ;gCAChB,IAAI,EAAE,2BAA2B;gCACjC,QAAQ,EAAE,GAAG;gCACb,OAAO,EAAE,QAAQ;6BAClB,CAAC,CAAC;4BACH,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,MAAM,QAAQ,EAAE,CAAC,CAAC;4BAC5D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gCAClB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;4BAC9C,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,CAAC,CAAC,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,iBAAiB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1E,CAAC;YACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAC9C,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,yBAAyB;AAEzB,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/B,OAAO,CACN,MAAM,EACN,oDAAoD,EACpD,CAAC,CAAO,EAAE,EAAE,CACV,CAAC;SACE,MAAM,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,YAAY;QACtB,IAAI,EAAE,QAAQ;KACf,CAAC;SACD,MAAM,CAAC,cAAc,EAAE;QACtB,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,cAAc;QACxB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,4BAA4B;KACtC,CAAC;SACD,MAAM,CAAC,gBAAgB,EAAE;QACxB,QAAQ,EACN,4DAA4D;QAC9D,IAAI,EAAE,QAAQ;KACf,CAAC,EACN,CAAC,IAAS,EAAE,EAAE,CACZ,WAAW,CAAC;QACV,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QACjC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC;KACrC,CAAC,CACL;SACA,OAAO,CACN,OAAO,EACP,0CAA0C,EAC1C,CAAC,CAAO,EAAE,EAAE,CACV,CAAC;SACE,MAAM,CAAC,eAAe,EAAE;QACvB,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,kCAAkC;QAC5C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;KACd,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,sBAAsB;QAChC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC,EACN,CAAC,IAAS,EAAE,EAAE,CACZ,YAAY,CAAC;QACX,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;QACnC,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CACL;SACA,OAAO,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC,CAAC;SAED,MAAM,CAAC,MAAM,EAAE;QACd,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,SAAS;KAChB,CAAC;SACD,QAAQ,CACP;;;;;;CAML,CACI;SACA,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAC5C,MAAM,EAAE;SACR,KAAK,EAAE,CAAC;AACb,CAAC"}
@@ -0,0 +1,35 @@
1
+ export interface DevFlowConfig {
2
+ version: "1.0";
3
+ platform: {
4
+ url: string;
5
+ api_key: string;
6
+ };
7
+ agent: {
8
+ id: string;
9
+ name: string;
10
+ version: string;
11
+ };
12
+ agentHostUrl?: string;
13
+ credentials?: {
14
+ github_token?: string;
15
+ };
16
+ logging: {
17
+ level: "debug" | "info" | "warn" | "error";
18
+ format: "json" | "text";
19
+ };
20
+ execution: {
21
+ max_concurrent_tasks: number;
22
+ timeout_seconds: number;
23
+ cache_dir: string;
24
+ };
25
+ }
26
+ export declare function ensureConfigDir(): void;
27
+ export declare function loadConfig(): DevFlowConfig | null;
28
+ export declare function saveConfig(config: DevFlowConfig): void;
29
+ export declare function getConfigPath(): string;
30
+ export declare function createDefaultConfig(platformUrl: string, apiKey: string, agentId: string, agentName: string, agentHostUrl?: string): DevFlowConfig;
31
+ export declare function validateConfig(config: DevFlowConfig): {
32
+ valid: boolean;
33
+ errors: string[];
34
+ };
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,QAAQ,EAAE;QACR,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE;QACZ,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAC3C,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE;QACT,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAKD,wBAAgB,eAAe,IAAI,IAAI,CAKtC;AAED,wBAAgB,UAAU,IAAI,aAAa,GAAG,IAAI,CAYjD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAMtD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GACpB,aAAa,CAuBf;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG;IACrD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAoBA"}
package/dist/config.js ADDED
@@ -0,0 +1,78 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { homedir } from "os";
4
+ const CONFIG_DIR = path.join(homedir(), ".devflow");
5
+ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
6
+ export function ensureConfigDir() {
7
+ if (!fs.existsSync(CONFIG_DIR)) {
8
+ fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
9
+ console.log(`✓ Created ~/.devflow directory`);
10
+ }
11
+ }
12
+ export function loadConfig() {
13
+ if (!fs.existsSync(CONFIG_FILE)) {
14
+ return null;
15
+ }
16
+ try {
17
+ const content = fs.readFileSync(CONFIG_FILE, "utf-8");
18
+ return JSON.parse(content);
19
+ }
20
+ catch (error) {
21
+ console.error("Error loading config:", error);
22
+ return null;
23
+ }
24
+ }
25
+ export function saveConfig(config) {
26
+ ensureConfigDir();
27
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), {
28
+ mode: 0o600, // Only readable by owner
29
+ });
30
+ console.log(`✓ Saved configuration to ~/.devflow/config.json`);
31
+ }
32
+ export function getConfigPath() {
33
+ return CONFIG_FILE;
34
+ }
35
+ export function createDefaultConfig(platformUrl, apiKey, agentId, agentName, agentHostUrl) {
36
+ return {
37
+ version: "1.0",
38
+ platform: {
39
+ url: platformUrl,
40
+ api_key: apiKey,
41
+ },
42
+ agent: {
43
+ id: agentId,
44
+ name: agentName,
45
+ version: "0.1.0",
46
+ },
47
+ agentHostUrl: agentHostUrl,
48
+ logging: {
49
+ level: "info",
50
+ format: "json",
51
+ },
52
+ execution: {
53
+ max_concurrent_tasks: 1,
54
+ timeout_seconds: 3600,
55
+ cache_dir: path.join(homedir(), ".devflow", "cache"),
56
+ },
57
+ };
58
+ }
59
+ export function validateConfig(config) {
60
+ const errors = [];
61
+ if (!config.platform?.url) {
62
+ errors.push("Missing platform.url");
63
+ }
64
+ if (!config.platform?.api_key) {
65
+ errors.push("Missing platform.api_key");
66
+ }
67
+ if (!config.agent?.id) {
68
+ errors.push("Missing agent.id");
69
+ }
70
+ if (!config.agent?.name) {
71
+ errors.push("Missing agent.name");
72
+ }
73
+ return {
74
+ valid: errors.length === 0,
75
+ errors,
76
+ };
77
+ }
78
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ export interface CopilotClientOptions {
2
+ model?: string;
3
+ streaming?: boolean;
4
+ tools?: any[];
5
+ mcpServers?: Record<string, any>;
6
+ githubToken?: string;
7
+ }
8
+ export interface SessionEvent {
9
+ type: "assistant.message_delta" | "assistant.turn_start" | "assistant.turn_end" | "session.usage_info" | "session.idle" | "tool.start" | "tool.end" | "tool.execution_start" | "tool.execution_complete" | "error";
10
+ data?: {
11
+ deltaContent?: string;
12
+ messageId?: string;
13
+ turnId?: string;
14
+ toolName?: string;
15
+ toolCallId?: string;
16
+ arguments?: any;
17
+ result?: any;
18
+ success?: boolean;
19
+ message?: string;
20
+ tokenLimit?: number;
21
+ currentTokens?: number;
22
+ messagesLength?: number;
23
+ [key: string]: any;
24
+ };
25
+ }
26
+ export interface Session {
27
+ sendAndWait(request: {
28
+ prompt: string;
29
+ }): Promise<any>;
30
+ on(callback: (event: SessionEvent) => void): void;
31
+ }
32
+ /**
33
+ * CopilotClient - Wrapper for GitHub Copilot SDK
34
+ *
35
+ * This uses the real @github/copilot-sdk package installed from npm.
36
+ *
37
+ * Requirements:
38
+ * - GitHub Copilot CLI installed and authenticated (copilot --version)
39
+ * - @github/copilot-sdk package installed (npm install @github/copilot-sdk)
40
+ */
41
+ export declare class CopilotClient {
42
+ private model;
43
+ private client;
44
+ private eventListeners;
45
+ constructor();
46
+ createSession(options: CopilotClientOptions): Promise<Session>;
47
+ stop(): Promise<void>;
48
+ }
49
+ export declare function getCopilotClient(): CopilotClient;
50
+ /**
51
+ * Tool Definition Helper
52
+ * Creates Copilot SDK-compatible tool definitions
53
+ *
54
+ * Example:
55
+ * const gitTool = defineTool("git_ops", {
56
+ * description: "Execute git operations",
57
+ * parameters: {
58
+ * type: "object",
59
+ * properties: { ... },
60
+ * required: [...]
61
+ * },
62
+ * handler: async (args) => ({ ... })
63
+ * });
64
+ */
65
+ export declare function defineTool(name: string, definition: {
66
+ description: string;
67
+ parameters?: any;
68
+ handler?: (args: any) => Promise<any>;
69
+ }): {
70
+ description: string;
71
+ parameters?: any;
72
+ handler?: (args: any) => Promise<any>;
73
+ name: string;
74
+ };
75
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/copilot/client.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EACA,yBAAyB,GACzB,sBAAsB,GACtB,oBAAoB,GACpB,oBAAoB,GACpB,cAAc,GACd,YAAY,GACZ,UAAU,GACV,sBAAsB,GACtB,yBAAyB,GACzB,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,GAAG,CAAC;QAChB,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACvD,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;CACnD;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,cAAc,CAA4C;;IAyB5D,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAiM9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAI5B;AAID,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE;IACV,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACvC;iBAHc,MAAM;iBACN,GAAG;cACN,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;;EAOxC"}