sylas-ai 0.2.21
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.
Potentially problematic release.
This version of sylas-ai might be problematic. Click here for more details.
- package/README.md +52 -0
- package/dist/Application.d.ts +75 -0
- package/dist/Application.d.ts.map +1 -0
- package/dist/Application.js +289 -0
- package/dist/Application.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +93 -0
- package/dist/app.js.map +1 -0
- package/dist/commands/AuthCommand.d.ts +8 -0
- package/dist/commands/AuthCommand.d.ts.map +1 -0
- package/dist/commands/AuthCommand.js +70 -0
- package/dist/commands/AuthCommand.js.map +1 -0
- package/dist/commands/CheckTokensCommand.d.ts +8 -0
- package/dist/commands/CheckTokensCommand.d.ts.map +1 -0
- package/dist/commands/CheckTokensCommand.js +53 -0
- package/dist/commands/CheckTokensCommand.js.map +1 -0
- package/dist/commands/ICommand.d.ts +38 -0
- package/dist/commands/ICommand.d.ts.map +1 -0
- package/dist/commands/ICommand.js +37 -0
- package/dist/commands/ICommand.js.map +1 -0
- package/dist/commands/RefreshTokenCommand.d.ts +8 -0
- package/dist/commands/RefreshTokenCommand.d.ts.map +1 -0
- package/dist/commands/RefreshTokenCommand.js +152 -0
- package/dist/commands/RefreshTokenCommand.js.map +1 -0
- package/dist/commands/SelfAddRepoCommand.d.ts +17 -0
- package/dist/commands/SelfAddRepoCommand.d.ts.map +1 -0
- package/dist/commands/SelfAddRepoCommand.js +164 -0
- package/dist/commands/SelfAddRepoCommand.js.map +1 -0
- package/dist/commands/SelfAuthCommand.d.ts +16 -0
- package/dist/commands/SelfAuthCommand.d.ts.map +1 -0
- package/dist/commands/SelfAuthCommand.js +213 -0
- package/dist/commands/SelfAuthCommand.js.map +1 -0
- package/dist/commands/StartCommand.d.ts +8 -0
- package/dist/commands/StartCommand.d.ts.map +1 -0
- package/dist/commands/StartCommand.js +76 -0
- package/dist/commands/StartCommand.js.map +1 -0
- package/dist/config/constants.d.ts +12 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +19 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/types.d.ts +21 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/services/ConfigService.d.ts +37 -0
- package/dist/services/ConfigService.d.ts.map +1 -0
- package/dist/services/ConfigService.js +121 -0
- package/dist/services/ConfigService.js.map +1 -0
- package/dist/services/Logger.d.ts +77 -0
- package/dist/services/Logger.d.ts.map +1 -0
- package/dist/services/Logger.js +100 -0
- package/dist/services/Logger.js.map +1 -0
- package/dist/services/WorkerService.d.ts +59 -0
- package/dist/services/WorkerService.d.ts.map +1 -0
- package/dist/services/WorkerService.js +220 -0
- package/dist/services/WorkerService.js.map +1 -0
- package/dist/src/Application.d.ts +75 -0
- package/dist/src/Application.d.ts.map +1 -0
- package/dist/src/Application.js +289 -0
- package/dist/src/Application.js.map +1 -0
- package/dist/src/app.d.ts +3 -0
- package/dist/src/app.d.ts.map +1 -0
- package/dist/src/app.js +93 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/commands/AuthCommand.d.ts +8 -0
- package/dist/src/commands/AuthCommand.d.ts.map +1 -0
- package/dist/src/commands/AuthCommand.js +70 -0
- package/dist/src/commands/AuthCommand.js.map +1 -0
- package/dist/src/commands/CheckTokensCommand.d.ts +8 -0
- package/dist/src/commands/CheckTokensCommand.d.ts.map +1 -0
- package/dist/src/commands/CheckTokensCommand.js +53 -0
- package/dist/src/commands/CheckTokensCommand.js.map +1 -0
- package/dist/src/commands/ICommand.d.ts +38 -0
- package/dist/src/commands/ICommand.d.ts.map +1 -0
- package/dist/src/commands/ICommand.js +37 -0
- package/dist/src/commands/ICommand.js.map +1 -0
- package/dist/src/commands/RefreshTokenCommand.d.ts +8 -0
- package/dist/src/commands/RefreshTokenCommand.d.ts.map +1 -0
- package/dist/src/commands/RefreshTokenCommand.js +152 -0
- package/dist/src/commands/RefreshTokenCommand.js.map +1 -0
- package/dist/src/commands/SelfAddRepoCommand.d.ts +17 -0
- package/dist/src/commands/SelfAddRepoCommand.d.ts.map +1 -0
- package/dist/src/commands/SelfAddRepoCommand.js +164 -0
- package/dist/src/commands/SelfAddRepoCommand.js.map +1 -0
- package/dist/src/commands/SelfAuthCommand.d.ts +16 -0
- package/dist/src/commands/SelfAuthCommand.d.ts.map +1 -0
- package/dist/src/commands/SelfAuthCommand.js +213 -0
- package/dist/src/commands/SelfAuthCommand.js.map +1 -0
- package/dist/src/commands/StartCommand.d.ts +8 -0
- package/dist/src/commands/StartCommand.d.ts.map +1 -0
- package/dist/src/commands/StartCommand.js +76 -0
- package/dist/src/commands/StartCommand.js.map +1 -0
- package/dist/src/config/constants.d.ts +12 -0
- package/dist/src/config/constants.d.ts.map +1 -0
- package/dist/src/config/constants.js +19 -0
- package/dist/src/config/constants.js.map +1 -0
- package/dist/src/config/types.d.ts +21 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +2 -0
- package/dist/src/config/types.js.map +1 -0
- package/dist/src/services/ConfigService.d.ts +37 -0
- package/dist/src/services/ConfigService.d.ts.map +1 -0
- package/dist/src/services/ConfigService.js +121 -0
- package/dist/src/services/ConfigService.js.map +1 -0
- package/dist/src/services/Logger.d.ts +77 -0
- package/dist/src/services/Logger.d.ts.map +1 -0
- package/dist/src/services/Logger.js +100 -0
- package/dist/src/services/Logger.js.map +1 -0
- package/dist/src/services/WorkerService.d.ts +59 -0
- package/dist/src/services/WorkerService.d.ts.map +1 -0
- package/dist/src/services/WorkerService.js +220 -0
- package/dist/src/services/WorkerService.js.map +1 -0
- package/dist/src/ui/CLIPrompts.d.ts +18 -0
- package/dist/src/ui/CLIPrompts.d.ts.map +1 -0
- package/dist/src/ui/CLIPrompts.js +53 -0
- package/dist/src/ui/CLIPrompts.js.map +1 -0
- package/dist/ui/CLIPrompts.d.ts +18 -0
- package/dist/ui/CLIPrompts.d.ts.map +1 -0
- package/dist/ui/CLIPrompts.js +53 -0
- package/dist/ui/CLIPrompts.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICommand.js","sourceRoot":"","sources":["../../../src/commands/ICommand.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,OAAgB,WAAW;IAGV;IAFZ,MAAM,CAAS;IAEzB,YAAsB,GAAgB;QAAhB,QAAG,GAAH,GAAG,CAAa;QACrC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,CAAC;IAID;;OAEG;IACO,aAAa,CAAC,OAAe,EAAE,IAAI,GAAG,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACO,UAAU,CAAC,OAAe;QACnC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACO,QAAQ,CAAC,OAAe;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACO,UAAU;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;CACD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseCommand } from "./ICommand.js";
|
|
2
|
+
/**
|
|
3
|
+
* Refresh token command - refresh a specific Linear token
|
|
4
|
+
*/
|
|
5
|
+
export declare class RefreshTokenCommand extends BaseCommand {
|
|
6
|
+
execute(_args: string[]): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=RefreshTokenCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshTokenCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/RefreshTokenCommand.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmC5C;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,WAAW;IAC7C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAwJ7C"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import open from "open";
|
|
3
|
+
import { CLIPrompts } from "../ui/CLIPrompts.js";
|
|
4
|
+
import { BaseCommand } from "./ICommand.js";
|
|
5
|
+
/**
|
|
6
|
+
* Helper function to check Linear token status
|
|
7
|
+
*/
|
|
8
|
+
async function checkLinearToken(token) {
|
|
9
|
+
try {
|
|
10
|
+
const response = await fetch("https://api.linear.app/graphql", {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
"Content-Type": "application/json",
|
|
14
|
+
Authorization: token,
|
|
15
|
+
},
|
|
16
|
+
body: JSON.stringify({
|
|
17
|
+
query: "{ viewer { id email name } }",
|
|
18
|
+
}),
|
|
19
|
+
});
|
|
20
|
+
const data = (await response.json());
|
|
21
|
+
if (data.errors) {
|
|
22
|
+
return {
|
|
23
|
+
valid: false,
|
|
24
|
+
error: data.errors[0]?.message || "Unknown error",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { valid: true };
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return { valid: false, error: error.message };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Refresh token command - refresh a specific Linear token
|
|
35
|
+
*/
|
|
36
|
+
export class RefreshTokenCommand extends BaseCommand {
|
|
37
|
+
async execute(_args) {
|
|
38
|
+
if (!this.app.config.exists()) {
|
|
39
|
+
this.logError("No edge configuration found. Please run setup first.");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const config = this.app.config.load();
|
|
43
|
+
// Show repositories with their token status
|
|
44
|
+
console.log("Checking current token status...\n");
|
|
45
|
+
const tokenStatuses = [];
|
|
46
|
+
for (const repo of config.repositories) {
|
|
47
|
+
const result = await checkLinearToken(repo.linearToken);
|
|
48
|
+
tokenStatuses.push({ repo, valid: result.valid });
|
|
49
|
+
console.log(`${tokenStatuses.length}. ${repo.name} (${repo.linearWorkspaceName}): ${result.valid ? "✅ Valid" : "❌ Invalid"}`);
|
|
50
|
+
}
|
|
51
|
+
// Ask which token to refresh
|
|
52
|
+
const answer = await CLIPrompts.ask('\nWhich repository token would you like to refresh? (Enter number or "all"): ');
|
|
53
|
+
const indicesToRefresh = [];
|
|
54
|
+
if (answer.toLowerCase() === "all") {
|
|
55
|
+
indicesToRefresh.push(...Array.from({ length: tokenStatuses.length }, (_, i) => i));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const index = parseInt(answer, 10) - 1;
|
|
59
|
+
if (Number.isNaN(index) || index < 0 || index >= tokenStatuses.length) {
|
|
60
|
+
this.logError("Invalid selection");
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
indicesToRefresh.push(index);
|
|
64
|
+
}
|
|
65
|
+
// Refresh tokens
|
|
66
|
+
for (const index of indicesToRefresh) {
|
|
67
|
+
const tokenStatus = tokenStatuses[index];
|
|
68
|
+
if (!tokenStatus)
|
|
69
|
+
continue;
|
|
70
|
+
const { repo } = tokenStatus;
|
|
71
|
+
console.log(`\nRefreshing token for ${repo.name} (${repo.linearWorkspaceName || repo.linearWorkspaceId})...`);
|
|
72
|
+
console.log("Opening Linear OAuth flow in your browser...");
|
|
73
|
+
// Use the proxy's OAuth flow with a callback to localhost
|
|
74
|
+
const serverPort = process.env.SYLAS_SERVER_PORT
|
|
75
|
+
? parseInt(process.env.SYLAS_SERVER_PORT, 10)
|
|
76
|
+
: 3456;
|
|
77
|
+
const callbackUrl = `http://localhost:${serverPort}/callback`;
|
|
78
|
+
const proxyUrl = this.app.getProxyUrl();
|
|
79
|
+
const oauthUrl = `${proxyUrl}/oauth/authorize?callback=${encodeURIComponent(callbackUrl)}`;
|
|
80
|
+
console.log(`\nPlease complete the OAuth flow in your browser.`);
|
|
81
|
+
console.log(`If the browser doesn't open automatically, visit:\n${oauthUrl}\n`);
|
|
82
|
+
// Start a temporary server to receive the OAuth callback
|
|
83
|
+
let tokenReceived = null;
|
|
84
|
+
const server = await new Promise((resolve) => {
|
|
85
|
+
const s = http.createServer((req, res) => {
|
|
86
|
+
if (req.url?.startsWith("/callback")) {
|
|
87
|
+
const url = new URL(req.url, `http://localhost:${serverPort}`);
|
|
88
|
+
tokenReceived = url.searchParams.get("token");
|
|
89
|
+
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
90
|
+
res.end(`
|
|
91
|
+
<html>
|
|
92
|
+
<head>
|
|
93
|
+
<meta charset="UTF-8">
|
|
94
|
+
</head>
|
|
95
|
+
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
96
|
+
<h2>✅ Authorization successful!</h2>
|
|
97
|
+
<p>You can close this window and return to your terminal.</p>
|
|
98
|
+
<script>setTimeout(() => window.close(), 2000);</script>
|
|
99
|
+
</body>
|
|
100
|
+
</html>
|
|
101
|
+
`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
res.writeHead(404);
|
|
105
|
+
res.end("Not found");
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
s.listen(serverPort, () => {
|
|
109
|
+
console.log("Waiting for OAuth callback...");
|
|
110
|
+
resolve(s);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
await open(oauthUrl);
|
|
114
|
+
// Wait for the token with timeout
|
|
115
|
+
const startTime = Date.now();
|
|
116
|
+
while (!tokenReceived && Date.now() - startTime < 120000) {
|
|
117
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
118
|
+
}
|
|
119
|
+
server.close();
|
|
120
|
+
const newToken = tokenReceived;
|
|
121
|
+
if (!newToken || !newToken.startsWith("lin_oauth_")) {
|
|
122
|
+
this.logError("Invalid token received from OAuth flow");
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Verify the new token
|
|
126
|
+
const verifyResult = await checkLinearToken(newToken);
|
|
127
|
+
if (!verifyResult.valid) {
|
|
128
|
+
this.logError(`New token is invalid: ${verifyResult.error}`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Update the config - update ALL repositories that had the same old token
|
|
132
|
+
const oldToken = repo.linearToken;
|
|
133
|
+
let updatedCount = 0;
|
|
134
|
+
this.app.config.update((cfg) => {
|
|
135
|
+
for (let i = 0; i < cfg.repositories.length; i++) {
|
|
136
|
+
const currentRepo = cfg.repositories[i];
|
|
137
|
+
if (currentRepo && currentRepo.linearToken === oldToken) {
|
|
138
|
+
currentRepo.linearToken = newToken;
|
|
139
|
+
updatedCount++;
|
|
140
|
+
this.logSuccess(`Updated token for ${currentRepo.name}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return cfg;
|
|
144
|
+
});
|
|
145
|
+
if (updatedCount > 1) {
|
|
146
|
+
console.log(`\n📝 Updated ${updatedCount} repositories that shared the same token`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.logSuccess("Configuration saved");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=RefreshTokenCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefreshTokenCommand.js","sourceRoot":"","sources":["../../../src/commands/RefreshTokenCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseCommand } from "./ICommand.js";
|
|
2
|
+
/**
|
|
3
|
+
* Self-add-repo command - clones a repo and adds it to config.json
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* sylas self-add-repo # prompts for everything
|
|
7
|
+
* sylas self-add-repo <url> # prompts for workspace if multiple
|
|
8
|
+
* sylas self-add-repo <url> <workspace> # no prompts
|
|
9
|
+
*/
|
|
10
|
+
export declare class SelfAddRepoCommand extends BaseCommand {
|
|
11
|
+
private rl;
|
|
12
|
+
private getReadline;
|
|
13
|
+
private prompt;
|
|
14
|
+
private cleanup;
|
|
15
|
+
execute(args: string[]): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SelfAddRepoCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfAddRepoCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/SelfAddRepoCommand.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAY5C;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,WAAW;IAClD,OAAO,CAAC,EAAE,CAAmC;IAE7C,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,OAAO;IAOT,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAkJ5C"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import * as readline from "node:readline";
|
|
6
|
+
import { DEFAULT_BASE_BRANCH, DEFAULT_CONFIG_FILENAME, DEFAULT_WORKTREES_DIR, } from "sylas-core";
|
|
7
|
+
import { BaseCommand } from "./ICommand.js";
|
|
8
|
+
/**
|
|
9
|
+
* Self-add-repo command - clones a repo and adds it to config.json
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* sylas self-add-repo # prompts for everything
|
|
13
|
+
* sylas self-add-repo <url> # prompts for workspace if multiple
|
|
14
|
+
* sylas self-add-repo <url> <workspace> # no prompts
|
|
15
|
+
*/
|
|
16
|
+
export class SelfAddRepoCommand extends BaseCommand {
|
|
17
|
+
rl = null;
|
|
18
|
+
getReadline() {
|
|
19
|
+
if (!this.rl) {
|
|
20
|
+
this.rl = readline.createInterface({
|
|
21
|
+
input: process.stdin,
|
|
22
|
+
output: process.stdout,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return this.rl;
|
|
26
|
+
}
|
|
27
|
+
prompt(question) {
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
this.getReadline().question(question, (answer) => resolve(answer.trim()));
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
cleanup() {
|
|
33
|
+
if (this.rl) {
|
|
34
|
+
this.rl.close();
|
|
35
|
+
this.rl = null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async execute(args) {
|
|
39
|
+
let url = args[0];
|
|
40
|
+
const workspaceName = args[1];
|
|
41
|
+
try {
|
|
42
|
+
// Load config
|
|
43
|
+
const configPath = resolve(this.app.sylasHome, DEFAULT_CONFIG_FILENAME);
|
|
44
|
+
let config;
|
|
45
|
+
try {
|
|
46
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
this.logError(`Config file not found: ${configPath}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
if (!config.repositories) {
|
|
53
|
+
config.repositories = [];
|
|
54
|
+
}
|
|
55
|
+
// Get URL if not provided
|
|
56
|
+
if (!url) {
|
|
57
|
+
url = await this.prompt("Repository URL: ");
|
|
58
|
+
if (!url) {
|
|
59
|
+
this.logError("URL is required");
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Extract repo name from URL
|
|
64
|
+
const repoName = url
|
|
65
|
+
.split("/")
|
|
66
|
+
.pop()
|
|
67
|
+
?.replace(/\.git$/, "");
|
|
68
|
+
if (!repoName) {
|
|
69
|
+
this.logError("Could not extract repo name from URL");
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
// Check for duplicate
|
|
73
|
+
if (config.repositories.some((r) => r.name === repoName)) {
|
|
74
|
+
this.logError(`Repository '${repoName}' already exists in config`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
// Find workspaces with Linear credentials
|
|
78
|
+
const workspaces = new Map();
|
|
79
|
+
for (const repo of config.repositories) {
|
|
80
|
+
if (repo.linearWorkspaceId &&
|
|
81
|
+
repo.linearToken &&
|
|
82
|
+
!workspaces.has(repo.linearWorkspaceId)) {
|
|
83
|
+
workspaces.set(repo.linearWorkspaceId, {
|
|
84
|
+
id: repo.linearWorkspaceId,
|
|
85
|
+
name: repo.linearWorkspaceName || repo.linearWorkspaceId,
|
|
86
|
+
token: repo.linearToken,
|
|
87
|
+
refreshToken: repo.linearRefreshToken,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (workspaces.size === 0) {
|
|
92
|
+
this.logError("No Linear credentials found. Run 'sylas self-auth' first.");
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
// Get workspace
|
|
96
|
+
let selectedWorkspace;
|
|
97
|
+
const workspaceList = Array.from(workspaces.values());
|
|
98
|
+
if (workspaceList.length === 1) {
|
|
99
|
+
// Safe: we checked length === 1 above
|
|
100
|
+
selectedWorkspace = workspaceList[0];
|
|
101
|
+
}
|
|
102
|
+
else if (workspaceName) {
|
|
103
|
+
const foundWorkspace = workspaceList.find((w) => w.name === workspaceName);
|
|
104
|
+
if (!foundWorkspace) {
|
|
105
|
+
this.logError(`Workspace '${workspaceName}' not found`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
selectedWorkspace = foundWorkspace;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log("\nAvailable workspaces:");
|
|
112
|
+
workspaceList.forEach((w, i) => {
|
|
113
|
+
console.log(` ${i + 1}. ${w.name}`);
|
|
114
|
+
});
|
|
115
|
+
const choice = await this.prompt(`Select workspace [1-${workspaceList.length}]: `);
|
|
116
|
+
const idx = parseInt(choice, 10) - 1;
|
|
117
|
+
if (idx < 0 || idx >= workspaceList.length) {
|
|
118
|
+
this.logError("Invalid selection");
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// Safe: we validated idx is within bounds above
|
|
122
|
+
selectedWorkspace = workspaceList[idx];
|
|
123
|
+
}
|
|
124
|
+
// Clone the repo
|
|
125
|
+
const repositoryPath = resolve(this.app.sylasHome, "repos", repoName);
|
|
126
|
+
if (existsSync(repositoryPath)) {
|
|
127
|
+
console.log(`Repository already exists at ${repositoryPath}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log(`Cloning ${url}...`);
|
|
131
|
+
try {
|
|
132
|
+
execSync(`git clone ${url} ${repositoryPath}`, { stdio: "inherit" });
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
this.logError("Failed to clone repository");
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Generate UUID and add to config
|
|
140
|
+
const id = randomUUID();
|
|
141
|
+
config.repositories.push({
|
|
142
|
+
id,
|
|
143
|
+
name: repoName,
|
|
144
|
+
repositoryPath,
|
|
145
|
+
baseBranch: DEFAULT_BASE_BRANCH,
|
|
146
|
+
workspaceBaseDir: resolve(this.app.sylasHome, DEFAULT_WORKTREES_DIR),
|
|
147
|
+
linearWorkspaceId: selectedWorkspace.id,
|
|
148
|
+
linearWorkspaceName: selectedWorkspace.name,
|
|
149
|
+
linearToken: selectedWorkspace.token,
|
|
150
|
+
linearRefreshToken: selectedWorkspace.refreshToken,
|
|
151
|
+
isActive: true,
|
|
152
|
+
});
|
|
153
|
+
writeFileSync(configPath, JSON.stringify(config, null, "\t"), "utf-8");
|
|
154
|
+
console.log(`\nAdded: ${repoName}`);
|
|
155
|
+
console.log(` ID: ${id}`);
|
|
156
|
+
console.log(` Workspace: ${selectedWorkspace.name}`);
|
|
157
|
+
process.exit(0);
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
this.cleanup();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=SelfAddRepoCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfAddRepoCommand.js","sourceRoot":"","sources":["../../../src/commands/SelfAddRepoCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseCommand } from "./ICommand.js";
|
|
2
|
+
/**
|
|
3
|
+
* Self-auth command - authenticate with Linear OAuth directly from CLI
|
|
4
|
+
* Handles the complete OAuth flow without requiring EdgeWorker
|
|
5
|
+
*/
|
|
6
|
+
export declare class SelfAuthCommand extends BaseCommand {
|
|
7
|
+
private server;
|
|
8
|
+
private callbackPort;
|
|
9
|
+
execute(_args: string[]): Promise<void>;
|
|
10
|
+
private waitForCallback;
|
|
11
|
+
private exchangeCodeForTokens;
|
|
12
|
+
private fetchWorkspaceInfo;
|
|
13
|
+
private overwriteRepoConfigTokens;
|
|
14
|
+
private cleanup;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=SelfAuthCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfAuthCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/SelfAuthCommand.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC/C,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,YAAY,CAAyD;IAEvE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAmF/B,eAAe;YAiFf,qBAAqB;YA2CrB,kBAAkB;IAchC,OAAO,CAAC,yBAAyB;YAuBnB,OAAO;CAMrB"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { LinearClient } from "@linear/sdk";
|
|
4
|
+
import Fastify from "fastify";
|
|
5
|
+
import open from "open";
|
|
6
|
+
import { DEFAULT_CONFIG_FILENAME } from "sylas-core";
|
|
7
|
+
import { BaseCommand } from "./ICommand.js";
|
|
8
|
+
/**
|
|
9
|
+
* Self-auth command - authenticate with Linear OAuth directly from CLI
|
|
10
|
+
* Handles the complete OAuth flow without requiring EdgeWorker
|
|
11
|
+
*/
|
|
12
|
+
export class SelfAuthCommand extends BaseCommand {
|
|
13
|
+
server = null;
|
|
14
|
+
callbackPort = parseInt(process.env.SYLAS_SERVER_PORT || "3456", 10);
|
|
15
|
+
async execute(_args) {
|
|
16
|
+
console.log("\nSylas Linear Self-Authentication");
|
|
17
|
+
this.logDivider();
|
|
18
|
+
// Check required environment variables
|
|
19
|
+
const clientId = process.env.LINEAR_CLIENT_ID;
|
|
20
|
+
const clientSecret = process.env.LINEAR_CLIENT_SECRET;
|
|
21
|
+
const baseUrl = process.env.SYLAS_BASE_URL;
|
|
22
|
+
if (!clientId || !clientSecret || !baseUrl) {
|
|
23
|
+
this.logError("Missing required environment variables:");
|
|
24
|
+
if (!clientId)
|
|
25
|
+
console.log(" - LINEAR_CLIENT_ID");
|
|
26
|
+
if (!clientSecret)
|
|
27
|
+
console.log(" - LINEAR_CLIENT_SECRET");
|
|
28
|
+
if (!baseUrl)
|
|
29
|
+
console.log(" - SYLAS_BASE_URL");
|
|
30
|
+
console.log("\nSet these in your shell profile (.zshrc):");
|
|
31
|
+
console.log(" export LINEAR_CLIENT_ID='your-client-id'");
|
|
32
|
+
console.log(" export LINEAR_CLIENT_SECRET='your-client-secret'");
|
|
33
|
+
console.log(" export SYLAS_BASE_URL='https://your-tunnel-domain.com'");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// Check config file exists
|
|
37
|
+
const configPath = resolve(this.app.sylasHome, DEFAULT_CONFIG_FILENAME);
|
|
38
|
+
let config;
|
|
39
|
+
try {
|
|
40
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
this.logError(`Config file not found: ${configPath}`);
|
|
44
|
+
console.log("Run 'sylas' first to create initial configuration.");
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
console.log("Configuration:");
|
|
48
|
+
console.log(` Client ID: ${clientId.substring(0, 20)}...`);
|
|
49
|
+
console.log(` Base URL: ${baseUrl}`);
|
|
50
|
+
console.log(` Config: ${configPath}`);
|
|
51
|
+
console.log(` Callback port: ${this.callbackPort}`);
|
|
52
|
+
console.log();
|
|
53
|
+
try {
|
|
54
|
+
// Start temporary server to receive OAuth callback
|
|
55
|
+
const authCode = await this.waitForCallback(clientId);
|
|
56
|
+
// Exchange code for tokens
|
|
57
|
+
console.log("Exchanging code for tokens...");
|
|
58
|
+
const tokens = await this.exchangeCodeForTokens(authCode, clientId, clientSecret);
|
|
59
|
+
this.logSuccess(`Got access token: ${tokens.accessToken.substring(0, 30)}...`);
|
|
60
|
+
// Fetch workspace info
|
|
61
|
+
console.log("Fetching workspace info...");
|
|
62
|
+
const workspace = await this.fetchWorkspaceInfo(tokens.accessToken);
|
|
63
|
+
this.logSuccess(`Workspace: ${workspace.name} (${workspace.id})`);
|
|
64
|
+
// Update config.json
|
|
65
|
+
console.log("Saving tokens to config.json...");
|
|
66
|
+
this.overwriteRepoConfigTokens(config, configPath, tokens, workspace);
|
|
67
|
+
const updatedCount = config.repositories.filter((r) => r.linearWorkspaceId === workspace.id).length;
|
|
68
|
+
this.logSuccess(`Updated ${updatedCount} repository/repositories`);
|
|
69
|
+
console.log();
|
|
70
|
+
this.logSuccess("Authentication complete! Restart sylas to use the new tokens.");
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.logError(`Authentication failed: ${error.message}`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
// One of the key guarantees of finally — it runs regardless of how the try block exits (return, throw, or normal completion).
|
|
79
|
+
await this.cleanup();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async waitForCallback(clientId) {
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const baseUrl = process.env.SYLAS_BASE_URL;
|
|
85
|
+
if (!baseUrl) {
|
|
86
|
+
reject(new Error("SYLAS_BASE_URL environment variable is required"));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const redirectUri = `${baseUrl}/callback`;
|
|
90
|
+
// https://linear.app/developers/oauth-2-0-authentication
|
|
91
|
+
// https://linear.app/developers/oauth-actor-authorization
|
|
92
|
+
const oauthUrl = `https://linear.app/oauth/authorize?client_id=${clientId}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code&scope=write,app:assignable,app:mentionable&actor=app`;
|
|
93
|
+
this.server = Fastify({ logger: false });
|
|
94
|
+
this.server.get("/callback", async (request, reply) => {
|
|
95
|
+
const query = request.query;
|
|
96
|
+
const code = query.code;
|
|
97
|
+
const error = query.error;
|
|
98
|
+
if (error) {
|
|
99
|
+
reply
|
|
100
|
+
.type("text/html; charset=utf-8")
|
|
101
|
+
.code(400)
|
|
102
|
+
.send(`<!DOCTYPE html>
|
|
103
|
+
<html><head><meta charset="utf-8"></head>
|
|
104
|
+
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
105
|
+
<h2>Authorization failed</h2>
|
|
106
|
+
<p>${error}</p>
|
|
107
|
+
</body></html>`);
|
|
108
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (code) {
|
|
112
|
+
reply
|
|
113
|
+
.type("text/html; charset=utf-8")
|
|
114
|
+
.code(200)
|
|
115
|
+
.send(`<!DOCTYPE html>
|
|
116
|
+
<html><head><meta charset="utf-8"></head>
|
|
117
|
+
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
118
|
+
<h2>Sylas authorized successfully</h2>
|
|
119
|
+
<p>You can close this window and return to the terminal.</p>
|
|
120
|
+
</body></html>`);
|
|
121
|
+
resolve(code);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
reply
|
|
125
|
+
.type("text/html; charset=utf-8")
|
|
126
|
+
.code(400)
|
|
127
|
+
.send(`<!DOCTYPE html>
|
|
128
|
+
<html><head><meta charset="utf-8"></head>
|
|
129
|
+
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
130
|
+
<h2>Missing authorization code</h2>
|
|
131
|
+
</body></html>`);
|
|
132
|
+
reject(new Error("Missing authorization code"));
|
|
133
|
+
});
|
|
134
|
+
this.server
|
|
135
|
+
.listen({ port: this.callbackPort, host: "0.0.0.0" })
|
|
136
|
+
.then(() => {
|
|
137
|
+
console.log(`Waiting for authorization on port ${this.callbackPort}...`);
|
|
138
|
+
console.log();
|
|
139
|
+
console.log("Opening browser for Linear authorization...");
|
|
140
|
+
console.log();
|
|
141
|
+
console.log("If browser doesn't open, visit:");
|
|
142
|
+
console.log(oauthUrl);
|
|
143
|
+
console.log();
|
|
144
|
+
open(oauthUrl).catch(() => {
|
|
145
|
+
console.log("Could not open browser automatically.");
|
|
146
|
+
});
|
|
147
|
+
})
|
|
148
|
+
.catch((err) => {
|
|
149
|
+
reject(new Error(`Server error: ${err.message}`));
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async exchangeCodeForTokens(code, clientId, clientSecret) {
|
|
154
|
+
const baseUrl = process.env.SYLAS_BASE_URL;
|
|
155
|
+
const redirectUri = `${baseUrl}/callback`;
|
|
156
|
+
// https://linear.app/developers/oauth-2-0-authentication
|
|
157
|
+
const response = await fetch("https://api.linear.app/oauth/token", {
|
|
158
|
+
method: "POST",
|
|
159
|
+
headers: {
|
|
160
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
161
|
+
},
|
|
162
|
+
body: new URLSearchParams({
|
|
163
|
+
code,
|
|
164
|
+
redirect_uri: redirectUri,
|
|
165
|
+
client_id: clientId,
|
|
166
|
+
client_secret: clientSecret,
|
|
167
|
+
grant_type: "authorization_code",
|
|
168
|
+
}).toString(),
|
|
169
|
+
});
|
|
170
|
+
if (!response.ok) {
|
|
171
|
+
const errorText = await response.text();
|
|
172
|
+
throw new Error(`Token exchange failed: ${errorText}`);
|
|
173
|
+
}
|
|
174
|
+
const data = (await response.json());
|
|
175
|
+
if (!data.access_token || !data.access_token.startsWith("lin_oauth_")) {
|
|
176
|
+
throw new Error("Invalid access token received");
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
accessToken: data.access_token,
|
|
180
|
+
refreshToken: data.refresh_token,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async fetchWorkspaceInfo(accessToken) {
|
|
184
|
+
const linearClient = new LinearClient({ accessToken });
|
|
185
|
+
const viewer = await linearClient.viewer;
|
|
186
|
+
const organization = await viewer.organization;
|
|
187
|
+
if (!organization?.id) {
|
|
188
|
+
throw new Error("Failed to get workspace info from Linear");
|
|
189
|
+
}
|
|
190
|
+
return { id: organization.id, name: organization.name || organization.id };
|
|
191
|
+
}
|
|
192
|
+
overwriteRepoConfigTokens(config, configPath, tokens, workspace) {
|
|
193
|
+
// Update all repositories matching this workspace (or unset workspace)
|
|
194
|
+
for (const repo of config.repositories) {
|
|
195
|
+
if (repo.linearWorkspaceId === workspace.id ||
|
|
196
|
+
!repo.linearWorkspaceId ||
|
|
197
|
+
repo.linearWorkspaceId === "") {
|
|
198
|
+
repo.linearToken = tokens.accessToken;
|
|
199
|
+
repo.linearRefreshToken = tokens.refreshToken;
|
|
200
|
+
repo.linearWorkspaceId = workspace.id;
|
|
201
|
+
repo.linearWorkspaceName = workspace.name;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
writeFileSync(configPath, JSON.stringify(config, null, "\t"), "utf-8");
|
|
205
|
+
}
|
|
206
|
+
async cleanup() {
|
|
207
|
+
if (this.server) {
|
|
208
|
+
await this.server.close();
|
|
209
|
+
this.server = null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=SelfAuthCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfAuthCommand.js","sourceRoot":"","sources":["../../../src/commands/SelfAuthCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseCommand } from "./ICommand.js";
|
|
2
|
+
/**
|
|
3
|
+
* Start command - main entry point for starting the edge worker
|
|
4
|
+
*/
|
|
5
|
+
export declare class StartCommand extends BaseCommand {
|
|
6
|
+
execute(_args: string[]): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=StartCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StartCommand.d.ts","sourceRoot":"","sources":["../../../src/commands/StartCommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAW;IACtC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAsF7C"}
|