@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
@@ -0,0 +1,50 @@
1
+ export interface CommandRequest {
2
+ commandId: string;
3
+ taskId: string;
4
+ intent: string;
5
+ description?: string;
6
+ repo?: string;
7
+ branch?: string;
8
+ }
9
+ export interface ProgressUpdate {
10
+ taskId: string;
11
+ status: "in_progress" | "completed" | "failed";
12
+ step: string;
13
+ progress: number;
14
+ details?: string;
15
+ }
16
+ export interface TaskCompletion {
17
+ success: boolean;
18
+ output?: string;
19
+ prUrl?: string;
20
+ error?: string;
21
+ }
22
+ export declare class PlatformClient {
23
+ private client;
24
+ private agentId;
25
+ constructor(platformUrl: string, agentId: string, apiKey: string);
26
+ setToken(token: string): void;
27
+ register(): Promise<{
28
+ success: boolean;
29
+ agent: {
30
+ id: string;
31
+ name: string;
32
+ status: string;
33
+ };
34
+ token?: string;
35
+ expiresAt?: string;
36
+ }>;
37
+ getCommands(): Promise<CommandRequest[]>;
38
+ heartbeat(): Promise<{
39
+ success: boolean;
40
+ lastHeartbeat: string;
41
+ status?: string;
42
+ }>;
43
+ reportProgress(taskId: string, update: ProgressUpdate): Promise<{
44
+ success: boolean;
45
+ }>;
46
+ completeTask(taskId: string, completion: TaskCompletion): Promise<{
47
+ success: boolean;
48
+ }>;
49
+ }
50
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/agent/client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAYhE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIvB,QAAQ,IAAI,OAAO,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACpD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAaI,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAOxC,SAAS,IAAI,OAAO,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IAOI,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAQ1B,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAOjC"}
@@ -0,0 +1,52 @@
1
+ import axios from "axios";
2
+ export class PlatformClient {
3
+ constructor(platformUrl, agentId, apiKey) {
4
+ this.agentId = agentId;
5
+ this.client = axios.create({
6
+ baseURL: platformUrl,
7
+ headers: {
8
+ Authorization: `Bearer ${apiKey}`,
9
+ "Content-Type": "application/json",
10
+ },
11
+ timeout: 10000,
12
+ });
13
+ }
14
+ setToken(token) {
15
+ this.client.defaults.headers.Authorization = `Bearer ${token}`;
16
+ }
17
+ async register() {
18
+ const response = await this.client.post("/api/agents", {
19
+ agentId: this.agentId,
20
+ userId: "", // Will be set by platform from token
21
+ name: "agent", // Will be updated by platform
22
+ version: "0.1.0",
23
+ platform: process.platform,
24
+ workingDirectory: process.cwd(),
25
+ capabilities: ["fix-bug", "feature", "explain", "review-pr"],
26
+ });
27
+ return response.data;
28
+ }
29
+ async getCommands() {
30
+ const response = await this.client.get(`/api/agents/${this.agentId}/commands`);
31
+ return response.data.commands || [];
32
+ }
33
+ async heartbeat() {
34
+ const response = await this.client.post(`/api/agents/${this.agentId}/heartbeat`);
35
+ return response.data;
36
+ }
37
+ async reportProgress(taskId, update) {
38
+ const response = await this.client.post(`/api/tasks/${taskId}/progress`, {
39
+ ...update,
40
+ reported_at: new Date().toISOString(),
41
+ });
42
+ return response.data;
43
+ }
44
+ async completeTask(taskId, completion) {
45
+ const response = await this.client.post(`/api/tasks/${taskId}/complete`, {
46
+ ...completion,
47
+ completed_at: new Date().toISOString(),
48
+ });
49
+ return response.data;
50
+ }
51
+ }
52
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/agent/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AA0B7C,MAAM,OAAO,cAAc;IAIzB,YAAY,WAAmB,EAAE,OAAe,EAAE,MAAc;QAC9D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,QAAQ;QAMZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE;YACrD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,EAAE,EAAE,qCAAqC;YACjD,IAAI,EAAE,OAAO,EAAE,8BAA8B;YAC7C,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE;YAC/B,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC;SAC7D,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,eAAe,IAAI,CAAC,OAAO,WAAW,CACvC,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,SAAS;QAKb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,eAAe,IAAI,CAAC,OAAO,YAAY,CACxC,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,MAAc,EACd,MAAsB;QAEtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,WAAW,EAAE;YACvE,GAAG,MAAM;YACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,UAA0B;QAE1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,WAAW,EAAE;YACvE,GAAG,UAAU;YACb,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Validates a GitHub Personal Access Token by making a test request to the GitHub API
3
+ * @param token GitHub PAT to validate
4
+ * @returns true if valid, false otherwise
5
+ */
6
+ export declare function validateGitHubToken(token: string): Promise<{
7
+ valid: boolean;
8
+ username?: string;
9
+ error?: string;
10
+ }>;
11
+ /**
12
+ * Prompts the user for their GitHub Personal Access Token
13
+ * @returns The token entered by the user
14
+ */
15
+ export declare function promptForGitHubToken(): Promise<string>;
16
+ //# sourceMappingURL=github-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-token.d.ts","sourceRoot":"","sources":["../../src/auth/github-token.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAuCD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAsB5D"}
@@ -0,0 +1,69 @@
1
+ import axios from "axios";
2
+ /**
3
+ * Validates a GitHub Personal Access Token by making a test request to the GitHub API
4
+ * @param token GitHub PAT to validate
5
+ * @returns true if valid, false otherwise
6
+ */
7
+ export async function validateGitHubToken(token) {
8
+ try {
9
+ const response = await axios.get("https://api.github.com/user", {
10
+ headers: {
11
+ Authorization: `token ${token}`,
12
+ Accept: "application/vnd.github+json",
13
+ },
14
+ timeout: 10000,
15
+ });
16
+ if (response.status === 200) {
17
+ return {
18
+ valid: true,
19
+ username: response.data.login,
20
+ };
21
+ }
22
+ return {
23
+ valid: false,
24
+ error: "Invalid response from GitHub API",
25
+ };
26
+ }
27
+ catch (error) {
28
+ if (axios.isAxiosError(error)) {
29
+ if (error.response?.status === 401) {
30
+ return {
31
+ valid: false,
32
+ error: "Invalid or expired token",
33
+ };
34
+ }
35
+ return {
36
+ valid: false,
37
+ error: error.message,
38
+ };
39
+ }
40
+ return {
41
+ valid: false,
42
+ error: String(error),
43
+ };
44
+ }
45
+ }
46
+ /**
47
+ * Prompts the user for their GitHub Personal Access Token
48
+ * @returns The token entered by the user
49
+ */
50
+ export async function promptForGitHubToken() {
51
+ const readline = await import("readline");
52
+ const rl = readline.createInterface({
53
+ input: process.stdin,
54
+ output: process.stdout,
55
+ });
56
+ return new Promise((resolve) => {
57
+ console.log("\nšŸ“ GitHub Personal Access Token Required\n");
58
+ console.log("The agent needs a GitHub PAT to authenticate with Copilot SDK.");
59
+ console.log("Create one at: https://github.com/settings/tokens\n");
60
+ console.log("Required scopes:");
61
+ console.log(" - copilot (for Copilot API access)");
62
+ console.log(" - repo (for repository operations)\n");
63
+ rl.question("Enter your GitHub Personal Access Token: ", (answer) => {
64
+ rl.close();
65
+ resolve(answer.trim());
66
+ });
67
+ });
68
+ }
69
+ //# sourceMappingURL=github-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-token.js","sourceRoot":"","sources":["../../src/auth/github-token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAa;IAKrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,6BAA6B,EAAE;YAC9D,OAAO,EAAE;gBACP,aAAa,EAAE,SAAS,KAAK,EAAE;gBAC/B,MAAM,EAAE,6BAA6B;aACtC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;aAC9B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,kCAAkC;SAC1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,0BAA0B;iBAClC,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,KAAK,CAAC,OAAO;aACrB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;SACrB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CACT,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,EAAE,CAAC,QAAQ,CAAC,2CAA2C,EAAE,CAAC,MAAM,EAAE,EAAE;YAClE,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ interface OAuthConfig {
2
+ platformUrl: string;
3
+ clientId: string;
4
+ redirectUri: string;
5
+ }
6
+ interface OAuthToken {
7
+ access_token: string;
8
+ token_type: string;
9
+ expires_in: number;
10
+ agent_id: string;
11
+ }
12
+ export declare function initiateOAuthFlow(config: OAuthConfig): Promise<OAuthToken>;
13
+ export declare function isTokenExpired(token: OAuthToken, expiresAt: number): boolean;
14
+ export declare function getTokenExpiration(expiresIn: number): number;
15
+ export {};
16
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,UAAU;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CA8KrB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,146 @@
1
+ import open from "open";
2
+ import http from "http";
3
+ import { randomBytes } from "crypto";
4
+ export async function initiateOAuthFlow(config) {
5
+ return new Promise((resolve, reject) => {
6
+ const state = randomBytes(32).toString("hex");
7
+ let server = null;
8
+ let isHandlingCallback = false;
9
+ // Start local server to catch redirect
10
+ server = http.createServer(async (req, res) => {
11
+ console.log(`[CLI] HTTP ${req.method} ${req.url}`);
12
+ // Ignore favicon requests
13
+ if (req.url?.includes("favicon")) {
14
+ res.writeHead(404);
15
+ res.end();
16
+ return;
17
+ }
18
+ // Only handle the first callback, ignore subsequent requests
19
+ if (isHandlingCallback) {
20
+ console.log("[CLI] Already handling callback, ignoring this request");
21
+ res.writeHead(400);
22
+ res.end("Callback already processed");
23
+ return;
24
+ }
25
+ try {
26
+ const url = new URL(req.url || "", `http://localhost:3333`);
27
+ // Log the request for debugging
28
+ console.log(`[CLI] Incoming request: ${req.method} ${url.pathname}${url.search}`);
29
+ // Ignore favicon and other assets explicitly
30
+ if (url.pathname === "/favicon.ico" || !url.searchParams.has("state")) {
31
+ res.writeHead(404);
32
+ res.end();
33
+ return;
34
+ }
35
+ const code = url.searchParams.get("code");
36
+ const returnedState = url.searchParams.get("state");
37
+ console.log("[CLI] Received callback candidate");
38
+ // Validate state
39
+ if (returnedState !== state) {
40
+ console.warn(`[CLI] State mismatch (Expected: ${state.substring(0, 8)}..., Got: ${returnedState?.substring(0, 8)}...)`);
41
+ res.writeHead(400);
42
+ res.end("State mismatch - authorization denied");
43
+ return; // Do not reject the promise, just ignore this request
44
+ }
45
+ console.log("[CLI] State verified successfully");
46
+ if (!code) {
47
+ console.warn("[CLI] No authorization code received");
48
+ res.writeHead(400);
49
+ res.end("No authorization code received");
50
+ return;
51
+ }
52
+ isHandlingCallback = true;
53
+ // Send success response
54
+ res.writeHead(200, { "Content-Type": "text/html" });
55
+ res.end(`
56
+ <html>
57
+ <body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; padding: 40px; text-align: center;">
58
+ <h1>āœ“ Authorization Successful!</h1>
59
+ <p>You can now close this window and return to the terminal.</p>
60
+ <p>Your DevFlow Agent is configured and ready to use.</p>
61
+ </body>
62
+ </html>
63
+ `);
64
+ // Wait a moment for the response to be sent, then close server
65
+ console.log("[CLI] Response sent, closing server in 100ms");
66
+ setTimeout(async () => {
67
+ if (server) {
68
+ console.log("[CLI] Closing local callback server");
69
+ server.close(() => {
70
+ console.log("[CLI] Server closed successfully");
71
+ });
72
+ }
73
+ // Exchange code for token
74
+ try {
75
+ console.log("[CLI] Exchanging code for token...");
76
+ const tokenResponse = await fetch(`${config.platformUrl}/api/auth/callback`, {
77
+ method: "POST",
78
+ headers: {
79
+ "Content-Type": "application/json",
80
+ },
81
+ body: JSON.stringify({
82
+ code,
83
+ client_id: config.clientId,
84
+ redirect_uri: config.redirectUri,
85
+ }),
86
+ });
87
+ if (!tokenResponse.ok) {
88
+ // Only reject if the Token Exchange ITSELF fails after a valid code
89
+ throw new Error(`Token exchange failed: ${tokenResponse.status} ${tokenResponse.statusText}`);
90
+ }
91
+ const token = (await tokenResponse.json());
92
+ console.log("[CLI] Token exchange successful, agent ID:", token.agent_id);
93
+ resolve(token);
94
+ }
95
+ catch (error) {
96
+ reject(error);
97
+ }
98
+ }, 100);
99
+ }
100
+ catch (error) {
101
+ console.error(`[CLI] Request handling error:`, error);
102
+ res.writeHead(500);
103
+ res.end("Internal Server Error");
104
+ // Do not reject the main promise on transient request handling errors
105
+ }
106
+ });
107
+ // Start listening
108
+ server.listen(3333, async () => {
109
+ console.log("[CLI] Local callback server listening on port 3333");
110
+ const authUrl = new URL(`${config.platformUrl}/auth/agent`);
111
+ authUrl.searchParams.set("client_id", config.clientId);
112
+ authUrl.searchParams.set("redirect_uri", config.redirectUri);
113
+ authUrl.searchParams.set("state", state);
114
+ console.log("\n🌐 Opening browser for authentication...");
115
+ console.log(`šŸ“ URL: ${authUrl.toString()}\n`);
116
+ try {
117
+ await open(authUrl.toString());
118
+ }
119
+ catch (error) {
120
+ console.log(`\nšŸ“Œ Could not open browser. Please visit:\n${authUrl.toString()}\n`);
121
+ }
122
+ });
123
+ // Timeout after 5 minutes
124
+ const timeoutHandle = setTimeout(() => {
125
+ if (server) {
126
+ console.log("[CLI] OAuth timeout, closing server");
127
+ server.close();
128
+ }
129
+ reject(new Error("OAuth authorization timeout"));
130
+ }, 5 * 60 * 1000);
131
+ // Ensure timeout doesn't block process exit if it's the only thing left (though we clear it anyway)
132
+ timeoutHandle.unref();
133
+ // ... inside server handler ...
134
+ // When resolving, we don't strictly need to clear if unref'd, but it's cleaner.
135
+ // However, since we define it at the bottom, we need to access it inside the callback.
136
+ // Let's rely on unref() or move the definition up.
137
+ // Actually, simpler to just unref it immediately.
138
+ });
139
+ }
140
+ export function isTokenExpired(token, expiresAt) {
141
+ return Date.now() > expiresAt;
142
+ }
143
+ export function getTokenExpiration(expiresIn) {
144
+ return Date.now() + expiresIn * 1000;
145
+ }
146
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function runCLI(): Promise<void>;
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAwZA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAmF5C"}