amai 0.0.8 → 0.0.10
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.
- package/dist/cli.cjs +361 -206
- package/dist/cli.js +359 -204
- package/dist/lib/daemon-entry.cjs +169 -90
- package/dist/lib/daemon-entry.js +166 -87
- package/dist/server.cjs +52 -24
- package/dist/server.js +51 -23
- package/package.json +2 -2
|
@@ -5,11 +5,11 @@ var WebSocket = require('ws');
|
|
|
5
5
|
var zod = require('zod');
|
|
6
6
|
var fs5 = require('fs/promises');
|
|
7
7
|
var path10 = require('path');
|
|
8
|
-
var
|
|
8
|
+
var fs6 = require('fs');
|
|
9
9
|
var os3 = require('os');
|
|
10
10
|
var child_process = require('child_process');
|
|
11
11
|
var util = require('util');
|
|
12
|
-
var
|
|
12
|
+
var pc4 = require('picocolors');
|
|
13
13
|
var hono = require('hono');
|
|
14
14
|
var nodeServer = require('@hono/node-server');
|
|
15
15
|
var cors = require('hono/cors');
|
|
@@ -19,9 +19,9 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
19
19
|
var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
|
|
20
20
|
var fs5__default = /*#__PURE__*/_interopDefault(fs5);
|
|
21
21
|
var path10__default = /*#__PURE__*/_interopDefault(path10);
|
|
22
|
-
var
|
|
22
|
+
var fs6__default = /*#__PURE__*/_interopDefault(fs6);
|
|
23
23
|
var os3__default = /*#__PURE__*/_interopDefault(os3);
|
|
24
|
-
var
|
|
24
|
+
var pc4__default = /*#__PURE__*/_interopDefault(pc4);
|
|
25
25
|
|
|
26
26
|
var DEFAULT_SERVER_URL = "wss://ama-production-a628.up.railway.app";
|
|
27
27
|
var AMA_DIR = path10__default.default.join(os3__default.default.homedir(), ".amai");
|
|
@@ -37,14 +37,14 @@ var ProjectRegistry = class {
|
|
|
37
37
|
}
|
|
38
38
|
load() {
|
|
39
39
|
try {
|
|
40
|
-
if (
|
|
41
|
-
const data =
|
|
40
|
+
if (fs6__default.default.existsSync(REGISTRY_FILE)) {
|
|
41
|
+
const data = fs6__default.default.readFileSync(REGISTRY_FILE, "utf8");
|
|
42
42
|
const parsed = JSON.parse(data);
|
|
43
43
|
if (!Array.isArray(parsed)) {
|
|
44
44
|
console.error("Invalid project registry format: expected array, got", typeof parsed);
|
|
45
45
|
const backupFile = REGISTRY_FILE + ".backup." + Date.now();
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
fs6__default.default.copyFileSync(REGISTRY_FILE, backupFile);
|
|
47
|
+
fs6__default.default.unlinkSync(REGISTRY_FILE);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
const projects = parsed;
|
|
@@ -57,11 +57,11 @@ var ProjectRegistry = class {
|
|
|
57
57
|
}
|
|
58
58
|
} catch (error) {
|
|
59
59
|
console.error("Failed to load project registry:", error);
|
|
60
|
-
if (
|
|
60
|
+
if (fs6__default.default.existsSync(REGISTRY_FILE)) {
|
|
61
61
|
try {
|
|
62
62
|
const backupFile = REGISTRY_FILE + ".backup." + Date.now();
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
fs6__default.default.copyFileSync(REGISTRY_FILE, backupFile);
|
|
64
|
+
fs6__default.default.unlinkSync(REGISTRY_FILE);
|
|
65
65
|
console.log("Corrupted registry file backed up and removed. Starting fresh.");
|
|
66
66
|
} catch (backupError) {
|
|
67
67
|
}
|
|
@@ -70,11 +70,11 @@ var ProjectRegistry = class {
|
|
|
70
70
|
}
|
|
71
71
|
save() {
|
|
72
72
|
try {
|
|
73
|
-
if (!
|
|
74
|
-
|
|
73
|
+
if (!fs6__default.default.existsSync(AMA_DIR)) {
|
|
74
|
+
fs6__default.default.mkdirSync(AMA_DIR, { recursive: true });
|
|
75
75
|
}
|
|
76
76
|
const projects = Array.from(this.projects.values());
|
|
77
|
-
|
|
77
|
+
fs6__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
|
|
78
78
|
} catch (error) {
|
|
79
79
|
console.error("Failed to save project registry:", error);
|
|
80
80
|
}
|
|
@@ -742,20 +742,20 @@ var editFiles = async function(input, projectCwd) {
|
|
|
742
742
|
let existingContent = "";
|
|
743
743
|
if (isNewFile === void 0) {
|
|
744
744
|
try {
|
|
745
|
-
existingContent = await
|
|
745
|
+
existingContent = await fs6__default.default.promises.readFile(filePath, "utf-8");
|
|
746
746
|
isNewFile = false;
|
|
747
747
|
} catch (error) {
|
|
748
748
|
isNewFile = true;
|
|
749
749
|
}
|
|
750
750
|
} else if (!isNewFile) {
|
|
751
751
|
try {
|
|
752
|
-
existingContent = await
|
|
752
|
+
existingContent = await fs6__default.default.promises.readFile(filePath, "utf-8");
|
|
753
753
|
} catch (error) {
|
|
754
754
|
isNewFile = true;
|
|
755
755
|
}
|
|
756
756
|
}
|
|
757
757
|
try {
|
|
758
|
-
await
|
|
758
|
+
await fs6__default.default.promises.writeFile(filePath, content);
|
|
759
759
|
} catch (writeError) {
|
|
760
760
|
throw writeError;
|
|
761
761
|
}
|
|
@@ -1134,24 +1134,27 @@ var list = async function(input, projectCwd) {
|
|
|
1134
1134
|
var startHttpServer = () => {
|
|
1135
1135
|
const app = new hono.Hono();
|
|
1136
1136
|
app.use(cors.cors());
|
|
1137
|
+
app.get("/", (c) => {
|
|
1138
|
+
return c.text("Hello World");
|
|
1139
|
+
});
|
|
1137
1140
|
nodeServer.serve({ fetch: app.fetch, port: 3456 });
|
|
1138
1141
|
};
|
|
1139
1142
|
var CREDENTIALS_DIR = path10__default.default.join(os3__default.default.homedir(), ".amai");
|
|
1140
1143
|
var CREDENTIALS_PATH = path10__default.default.join(CREDENTIALS_DIR, "credentials.json");
|
|
1141
1144
|
function getTokens() {
|
|
1142
|
-
if (!
|
|
1145
|
+
if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1143
1146
|
return null;
|
|
1144
1147
|
}
|
|
1145
|
-
const raw =
|
|
1148
|
+
const raw = fs6__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1146
1149
|
const data = JSON.parse(raw);
|
|
1147
1150
|
return data;
|
|
1148
1151
|
}
|
|
1149
1152
|
var getUserId = () => {
|
|
1150
1153
|
try {
|
|
1151
|
-
if (!
|
|
1154
|
+
if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1152
1155
|
return;
|
|
1153
1156
|
}
|
|
1154
|
-
const raw =
|
|
1157
|
+
const raw = fs6__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1155
1158
|
const data = JSON.parse(raw);
|
|
1156
1159
|
return {
|
|
1157
1160
|
userId: data.user.id
|
|
@@ -1298,7 +1301,7 @@ var runTerminalCommand = async (input, projectCwd) => {
|
|
|
1298
1301
|
};
|
|
1299
1302
|
var ignoreFiles = ["node_modules", ".git", ".next", ".env", ".env.local", ".env.development.local", ".env.test.local", ".env.production.local"];
|
|
1300
1303
|
var getContext = (dir, base = dir, allFiles = []) => {
|
|
1301
|
-
const filePath =
|
|
1304
|
+
const filePath = fs6.readdirSync(dir, { withFileTypes: true });
|
|
1302
1305
|
for (const file of filePath) {
|
|
1303
1306
|
if (ignoreFiles.includes(file.name)) continue;
|
|
1304
1307
|
const fullPath = path10__default.default.join(dir, file.name);
|
|
@@ -1330,16 +1333,16 @@ function getWorkspaceStoragePath(ide) {
|
|
|
1330
1333
|
function scanWorkspaceStorage(ide) {
|
|
1331
1334
|
const projects = [];
|
|
1332
1335
|
const storagePath = getWorkspaceStoragePath();
|
|
1333
|
-
if (!
|
|
1336
|
+
if (!fs6__default.default.existsSync(storagePath)) {
|
|
1334
1337
|
return projects;
|
|
1335
1338
|
}
|
|
1336
1339
|
try {
|
|
1337
|
-
const workspaces =
|
|
1340
|
+
const workspaces = fs6__default.default.readdirSync(storagePath);
|
|
1338
1341
|
for (const workspace of workspaces) {
|
|
1339
1342
|
const workspaceJsonPath = path10__default.default.join(storagePath, workspace, "workspace.json");
|
|
1340
|
-
if (
|
|
1343
|
+
if (fs6__default.default.existsSync(workspaceJsonPath)) {
|
|
1341
1344
|
try {
|
|
1342
|
-
const content =
|
|
1345
|
+
const content = fs6__default.default.readFileSync(workspaceJsonPath, "utf-8");
|
|
1343
1346
|
const data = JSON.parse(content);
|
|
1344
1347
|
if (data.folder && typeof data.folder === "string") {
|
|
1345
1348
|
let projectPath = data.folder;
|
|
@@ -1347,7 +1350,7 @@ function scanWorkspaceStorage(ide) {
|
|
|
1347
1350
|
projectPath = projectPath.replace("file://", "");
|
|
1348
1351
|
projectPath = decodeURIComponent(projectPath);
|
|
1349
1352
|
}
|
|
1350
|
-
if (
|
|
1353
|
+
if (fs6__default.default.existsSync(projectPath) && fs6__default.default.statSync(projectPath).isDirectory()) {
|
|
1351
1354
|
projects.push({
|
|
1352
1355
|
name: path10__default.default.basename(projectPath),
|
|
1353
1356
|
path: projectPath,
|
|
@@ -1371,11 +1374,11 @@ var scanIdeProjects = async () => {
|
|
|
1371
1374
|
const seenPaths = /* @__PURE__ */ new Set();
|
|
1372
1375
|
const addProject = (projectPath, ide) => {
|
|
1373
1376
|
try {
|
|
1374
|
-
const resolvedPath =
|
|
1375
|
-
if (
|
|
1377
|
+
const resolvedPath = fs6__default.default.realpathSync(projectPath);
|
|
1378
|
+
if (fs6__default.default.existsSync(resolvedPath) && fs6__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
|
|
1376
1379
|
const isIdeProjectsDir = Object.values(IDE_PROJECTS_PATHS).some((ideDir) => {
|
|
1377
1380
|
try {
|
|
1378
|
-
return
|
|
1381
|
+
return fs6__default.default.realpathSync(ideDir) === resolvedPath;
|
|
1379
1382
|
} catch {
|
|
1380
1383
|
return false;
|
|
1381
1384
|
}
|
|
@@ -1398,30 +1401,30 @@ var scanIdeProjects = async () => {
|
|
|
1398
1401
|
}
|
|
1399
1402
|
for (const [ide, dirPath] of Object.entries(IDE_PROJECTS_PATHS)) {
|
|
1400
1403
|
if (ide === "cursor") continue;
|
|
1401
|
-
if (
|
|
1402
|
-
const projects =
|
|
1404
|
+
if (fs6__default.default.existsSync(dirPath)) {
|
|
1405
|
+
const projects = fs6__default.default.readdirSync(dirPath);
|
|
1403
1406
|
projects.forEach((project) => {
|
|
1404
1407
|
const projectPath = path10__default.default.join(dirPath, project);
|
|
1405
1408
|
try {
|
|
1406
|
-
const stats =
|
|
1409
|
+
const stats = fs6__default.default.lstatSync(projectPath);
|
|
1407
1410
|
let actualPath = null;
|
|
1408
1411
|
if (stats.isSymbolicLink()) {
|
|
1409
|
-
actualPath =
|
|
1412
|
+
actualPath = fs6__default.default.realpathSync(projectPath);
|
|
1410
1413
|
} else if (stats.isFile()) {
|
|
1411
1414
|
try {
|
|
1412
|
-
let content =
|
|
1415
|
+
let content = fs6__default.default.readFileSync(projectPath, "utf-8").trim();
|
|
1413
1416
|
if (content.startsWith("~/") || content === "~") {
|
|
1414
1417
|
content = content.replace(/^~/, HOME);
|
|
1415
1418
|
}
|
|
1416
1419
|
const resolvedContent = path10__default.default.isAbsolute(content) ? content : path10__default.default.resolve(path10__default.default.dirname(projectPath), content);
|
|
1417
|
-
if (
|
|
1418
|
-
actualPath =
|
|
1420
|
+
if (fs6__default.default.existsSync(resolvedContent) && fs6__default.default.statSync(resolvedContent).isDirectory()) {
|
|
1421
|
+
actualPath = fs6__default.default.realpathSync(resolvedContent);
|
|
1419
1422
|
}
|
|
1420
1423
|
} catch {
|
|
1421
1424
|
return;
|
|
1422
1425
|
}
|
|
1423
1426
|
} else if (stats.isDirectory()) {
|
|
1424
|
-
actualPath =
|
|
1427
|
+
actualPath = fs6__default.default.realpathSync(projectPath);
|
|
1425
1428
|
}
|
|
1426
1429
|
if (actualPath) {
|
|
1427
1430
|
addProject(actualPath, ide);
|
|
@@ -1836,7 +1839,19 @@ var rpcHandlers = {
|
|
|
1836
1839
|
return { success: true, diff };
|
|
1837
1840
|
}
|
|
1838
1841
|
};
|
|
1842
|
+
var INITIAL_RECONNECT_DELAY = 1e3;
|
|
1843
|
+
var MAX_RECONNECT_DELAY = 6e4;
|
|
1844
|
+
var BACKOFF_MULTIPLIER = 2;
|
|
1839
1845
|
var reconnectTimeout = null;
|
|
1846
|
+
var reconnectAttempts = 0;
|
|
1847
|
+
function getReconnectDelay() {
|
|
1848
|
+
const delay = Math.min(
|
|
1849
|
+
INITIAL_RECONNECT_DELAY * Math.pow(BACKOFF_MULTIPLIER, reconnectAttempts),
|
|
1850
|
+
MAX_RECONNECT_DELAY
|
|
1851
|
+
);
|
|
1852
|
+
const jitter = delay * 0.25 * (Math.random() * 2 - 1);
|
|
1853
|
+
return Math.floor(delay + jitter);
|
|
1854
|
+
}
|
|
1840
1855
|
var connectToUserStreams = async (serverUrl) => {
|
|
1841
1856
|
const userId = getUserId();
|
|
1842
1857
|
if (!userId?.userId) {
|
|
@@ -1857,7 +1872,8 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
1857
1872
|
}
|
|
1858
1873
|
});
|
|
1859
1874
|
ws.on("open", () => {
|
|
1860
|
-
|
|
1875
|
+
reconnectAttempts = 0;
|
|
1876
|
+
console.log(pc4__default.default.cyan("connected to user streams"));
|
|
1861
1877
|
if (reconnectTimeout) {
|
|
1862
1878
|
clearTimeout(reconnectTimeout);
|
|
1863
1879
|
reconnectTimeout = null;
|
|
@@ -1868,7 +1884,7 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
1868
1884
|
const message = JSON.parse(event.toString());
|
|
1869
1885
|
if (message._tag === "rpc_call") {
|
|
1870
1886
|
const { requestId, method, input } = message;
|
|
1871
|
-
console.log(
|
|
1887
|
+
console.log(pc4__default.default.gray(`> ${method}`));
|
|
1872
1888
|
const handler = rpcHandlers[method];
|
|
1873
1889
|
if (!handler) {
|
|
1874
1890
|
ws.send(JSON.stringify({
|
|
@@ -1879,7 +1895,6 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
1879
1895
|
message: `Unknown RPC method: ${method}`
|
|
1880
1896
|
}
|
|
1881
1897
|
}));
|
|
1882
|
-
console.log(pc2__default.default.yellow(`Unknown RPC method: ${method}`));
|
|
1883
1898
|
return;
|
|
1884
1899
|
}
|
|
1885
1900
|
try {
|
|
@@ -1889,7 +1904,6 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
1889
1904
|
requestId,
|
|
1890
1905
|
data: result
|
|
1891
1906
|
}));
|
|
1892
|
-
console.log(pc2__default.default.green(`RPC completed: ${method}`));
|
|
1893
1907
|
} catch (error) {
|
|
1894
1908
|
const rpcError = error._tag ? error : {
|
|
1895
1909
|
_tag: "RpcError",
|
|
@@ -1900,7 +1914,7 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
1900
1914
|
requestId,
|
|
1901
1915
|
data: rpcError
|
|
1902
1916
|
}));
|
|
1903
|
-
console.log(
|
|
1917
|
+
console.log(pc4__default.default.red(` ${method} failed`));
|
|
1904
1918
|
}
|
|
1905
1919
|
return;
|
|
1906
1920
|
}
|
|
@@ -1919,25 +1933,38 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
1919
1933
|
}
|
|
1920
1934
|
}
|
|
1921
1935
|
} catch (parseError) {
|
|
1922
|
-
console.error(
|
|
1936
|
+
console.error(pc4__default.default.red(`parse error`));
|
|
1923
1937
|
}
|
|
1924
1938
|
});
|
|
1925
1939
|
ws.on("close", (code, reason) => {
|
|
1926
|
-
|
|
1927
|
-
|
|
1940
|
+
const delay = getReconnectDelay();
|
|
1941
|
+
reconnectAttempts++;
|
|
1942
|
+
console.log(pc4__default.default.gray(`user streams disconnected, reconnecting in ${Math.round(delay / 1e3)}s...`));
|
|
1928
1943
|
reconnectTimeout = setTimeout(() => {
|
|
1929
1944
|
connectToUserStreams(serverUrl).catch((err) => {
|
|
1930
|
-
console.error(
|
|
1945
|
+
console.error(pc4__default.default.red(`reconnection failed`));
|
|
1931
1946
|
});
|
|
1932
|
-
},
|
|
1947
|
+
}, delay);
|
|
1933
1948
|
});
|
|
1934
1949
|
ws.on("error", (error) => {
|
|
1935
|
-
console.error(
|
|
1950
|
+
console.error(pc4__default.default.red(`stream error: ${error.message}`));
|
|
1936
1951
|
});
|
|
1937
1952
|
return ws;
|
|
1938
1953
|
};
|
|
1939
1954
|
|
|
1940
1955
|
// src/server.ts
|
|
1956
|
+
var INITIAL_RECONNECT_DELAY2 = 1e3;
|
|
1957
|
+
var MAX_RECONNECT_DELAY2 = 6e4;
|
|
1958
|
+
var BACKOFF_MULTIPLIER2 = 2;
|
|
1959
|
+
var reconnectAttempts2 = 0;
|
|
1960
|
+
function getReconnectDelay2() {
|
|
1961
|
+
const delay = Math.min(
|
|
1962
|
+
INITIAL_RECONNECT_DELAY2 * Math.pow(BACKOFF_MULTIPLIER2, reconnectAttempts2),
|
|
1963
|
+
MAX_RECONNECT_DELAY2
|
|
1964
|
+
);
|
|
1965
|
+
const jitter = delay * 0.25 * (Math.random() * 2 - 1);
|
|
1966
|
+
return Math.floor(delay + jitter);
|
|
1967
|
+
}
|
|
1941
1968
|
var toolExecutors = {
|
|
1942
1969
|
editFile: editFiles,
|
|
1943
1970
|
deleteFile,
|
|
@@ -1960,12 +1987,13 @@ function connectToServer(serverUrl = DEFAULT_SERVER_URL) {
|
|
|
1960
1987
|
}
|
|
1961
1988
|
});
|
|
1962
1989
|
ws.on("open", () => {
|
|
1963
|
-
|
|
1990
|
+
reconnectAttempts2 = 0;
|
|
1991
|
+
console.log(pc4__default.default.cyan("connected to server"));
|
|
1964
1992
|
});
|
|
1965
1993
|
ws.on("message", async (data) => {
|
|
1966
1994
|
const message = JSON.parse(data.toString());
|
|
1967
1995
|
if (message.type === "tool_call") {
|
|
1968
|
-
console.log(
|
|
1996
|
+
console.log(pc4__default.default.gray(`> ${message.tool}`));
|
|
1969
1997
|
try {
|
|
1970
1998
|
const executor = toolExecutors[message.tool];
|
|
1971
1999
|
if (!executor) {
|
|
@@ -1977,17 +2005,16 @@ function connectToServer(serverUrl = DEFAULT_SERVER_URL) {
|
|
|
1977
2005
|
id: message.id,
|
|
1978
2006
|
result
|
|
1979
2007
|
}));
|
|
1980
|
-
console.log(pc2__default.default.green(`tool call completed: ${message.tool}`));
|
|
1981
2008
|
} catch (error) {
|
|
1982
2009
|
ws.send(JSON.stringify({
|
|
1983
2010
|
type: "tool_result",
|
|
1984
2011
|
id: message.id,
|
|
1985
2012
|
error: error.message
|
|
1986
2013
|
}));
|
|
1987
|
-
console.error(
|
|
2014
|
+
console.error(pc4__default.default.red(` ${message.tool} failed: ${error.message}`));
|
|
1988
2015
|
}
|
|
1989
2016
|
} else if (message.type === "rpc_call") {
|
|
1990
|
-
console.log(
|
|
2017
|
+
console.log(pc4__default.default.gray(`> rpc: ${message.method}`));
|
|
1991
2018
|
try {
|
|
1992
2019
|
const handler = rpcHandlers[message.method];
|
|
1993
2020
|
if (!handler) {
|
|
@@ -1999,29 +2026,30 @@ function connectToServer(serverUrl = DEFAULT_SERVER_URL) {
|
|
|
1999
2026
|
id: message.id,
|
|
2000
2027
|
result
|
|
2001
2028
|
}));
|
|
2002
|
-
console.log(pc2__default.default.green(`rpc call completed: ${message.method}`));
|
|
2003
2029
|
} catch (error) {
|
|
2004
2030
|
ws.send(JSON.stringify({
|
|
2005
2031
|
type: "tool_result",
|
|
2006
2032
|
id: message.id,
|
|
2007
2033
|
error: error.message
|
|
2008
2034
|
}));
|
|
2009
|
-
console.error(
|
|
2035
|
+
console.error(pc4__default.default.red(` rpc failed: ${message.method}`));
|
|
2010
2036
|
}
|
|
2011
2037
|
}
|
|
2012
2038
|
});
|
|
2013
2039
|
ws.on("close", () => {
|
|
2014
|
-
|
|
2015
|
-
|
|
2040
|
+
const delay = getReconnectDelay2();
|
|
2041
|
+
reconnectAttempts2++;
|
|
2042
|
+
console.log(pc4__default.default.gray(`disconnected, reconnecting in ${Math.round(delay / 1e3)}s...`));
|
|
2043
|
+
setTimeout(() => connectToServer(serverUrl), delay);
|
|
2016
2044
|
});
|
|
2017
2045
|
ws.on("error", (error) => {
|
|
2018
|
-
console.error(
|
|
2046
|
+
console.error(pc4__default.default.red(`connection error: ${error.message}`));
|
|
2019
2047
|
});
|
|
2020
2048
|
return ws;
|
|
2021
2049
|
}
|
|
2022
2050
|
async function main() {
|
|
2023
2051
|
const serverUrl = DEFAULT_SERVER_URL;
|
|
2024
|
-
console.log(
|
|
2052
|
+
console.log(pc4__default.default.gray("starting ama..."));
|
|
2025
2053
|
connectToServer(serverUrl);
|
|
2026
2054
|
await connectToUserStreams(serverUrl);
|
|
2027
2055
|
startHttpServer();
|
|
@@ -2060,37 +2088,37 @@ function getCodeServerBin() {
|
|
|
2060
2088
|
}
|
|
2061
2089
|
function isCodeServerInstalled() {
|
|
2062
2090
|
const binPath = getCodeServerBin();
|
|
2063
|
-
return
|
|
2091
|
+
return fs6__default.default.existsSync(binPath);
|
|
2064
2092
|
}
|
|
2065
2093
|
async function installCodeServer() {
|
|
2066
2094
|
const { ext } = getPlatformInfo();
|
|
2067
2095
|
const downloadUrl = getDownloadUrl();
|
|
2068
2096
|
const tarballPath = path10__default.default.join(AMA_DIR, `code-server.${ext}`);
|
|
2069
|
-
if (!
|
|
2070
|
-
|
|
2097
|
+
if (!fs6__default.default.existsSync(AMA_DIR)) {
|
|
2098
|
+
fs6__default.default.mkdirSync(AMA_DIR, { recursive: true });
|
|
2071
2099
|
}
|
|
2072
|
-
if (!
|
|
2073
|
-
|
|
2100
|
+
if (!fs6__default.default.existsSync(CODE_DIR)) {
|
|
2101
|
+
fs6__default.default.mkdirSync(CODE_DIR, { recursive: true });
|
|
2074
2102
|
}
|
|
2075
|
-
if (!
|
|
2076
|
-
|
|
2103
|
+
if (!fs6__default.default.existsSync(STORAGE_DIR)) {
|
|
2104
|
+
fs6__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
|
|
2077
2105
|
}
|
|
2078
|
-
console.log(
|
|
2079
|
-
console.log(
|
|
2106
|
+
console.log(pc4__default.default.cyan(`Downloading code-server v${CODE_SERVER_VERSION}...`));
|
|
2107
|
+
console.log(pc4__default.default.gray(downloadUrl));
|
|
2080
2108
|
const response = await fetch(downloadUrl);
|
|
2081
2109
|
if (!response.ok) {
|
|
2082
2110
|
throw new Error(`Failed to download code-server: ${response.statusText}`);
|
|
2083
2111
|
}
|
|
2084
2112
|
const buffer = await response.arrayBuffer();
|
|
2085
|
-
await
|
|
2086
|
-
console.log(
|
|
2113
|
+
await fs6__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
|
|
2114
|
+
console.log(pc4__default.default.cyan("Extracting code-server..."));
|
|
2087
2115
|
await execAsync3(`tar -xzf ${tarballPath} -C ${CODE_DIR}`);
|
|
2088
|
-
await
|
|
2116
|
+
await fs6__default.default.promises.unlink(tarballPath);
|
|
2089
2117
|
const binPath = getCodeServerBin();
|
|
2090
|
-
if (
|
|
2091
|
-
await
|
|
2118
|
+
if (fs6__default.default.existsSync(binPath)) {
|
|
2119
|
+
await fs6__default.default.promises.chmod(binPath, 493);
|
|
2092
2120
|
}
|
|
2093
|
-
console.log(
|
|
2121
|
+
console.log(pc4__default.default.green("\u2713 code-server installed successfully"));
|
|
2094
2122
|
}
|
|
2095
2123
|
async function killExistingCodeServer() {
|
|
2096
2124
|
try {
|
|
@@ -2110,26 +2138,77 @@ async function killExistingCodeServer() {
|
|
|
2110
2138
|
} catch {
|
|
2111
2139
|
}
|
|
2112
2140
|
}
|
|
2141
|
+
async function setupDefaultSettings() {
|
|
2142
|
+
const userDir = path10__default.default.join(STORAGE_DIR, "User");
|
|
2143
|
+
const settingsPath = path10__default.default.join(userDir, "settings.json");
|
|
2144
|
+
if (!fs6__default.default.existsSync(userDir)) {
|
|
2145
|
+
fs6__default.default.mkdirSync(userDir, { recursive: true });
|
|
2146
|
+
}
|
|
2147
|
+
const defaultSettings = {
|
|
2148
|
+
// Disable signature verification for Open VSX extensions
|
|
2149
|
+
"extensions.verifySignature": false,
|
|
2150
|
+
// Theme settings
|
|
2151
|
+
"workbench.colorTheme": "Min Dark",
|
|
2152
|
+
"workbench.startupEditor": "none",
|
|
2153
|
+
// Editor settings
|
|
2154
|
+
"editor.fontSize": 14,
|
|
2155
|
+
"editor.fontFamily": "'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace",
|
|
2156
|
+
"editor.minimap.enabled": false,
|
|
2157
|
+
"editor.wordWrap": "on",
|
|
2158
|
+
// UI settings
|
|
2159
|
+
"window.menuBarVisibility": "compact",
|
|
2160
|
+
"workbench.activityBar.location": "top"
|
|
2161
|
+
};
|
|
2162
|
+
let existingSettings = {};
|
|
2163
|
+
if (fs6__default.default.existsSync(settingsPath)) {
|
|
2164
|
+
try {
|
|
2165
|
+
const content = await fs6__default.default.promises.readFile(settingsPath, "utf-8");
|
|
2166
|
+
existingSettings = JSON.parse(content);
|
|
2167
|
+
} catch {
|
|
2168
|
+
}
|
|
2169
|
+
}
|
|
2170
|
+
const mergedSettings = { ...defaultSettings, ...existingSettings };
|
|
2171
|
+
mergedSettings["workbench.colorTheme"] = "Min Dark";
|
|
2172
|
+
mergedSettings["extensions.verifySignature"] = false;
|
|
2173
|
+
await fs6__default.default.promises.writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2));
|
|
2174
|
+
console.log(pc4__default.default.green("ama code-server settings configured"));
|
|
2175
|
+
}
|
|
2176
|
+
async function installExtensions() {
|
|
2177
|
+
const binPath = getCodeServerBin();
|
|
2178
|
+
const extensions = [
|
|
2179
|
+
"castrogusttavo.min-theme"
|
|
2180
|
+
];
|
|
2181
|
+
for (const ext of extensions) {
|
|
2182
|
+
try {
|
|
2183
|
+
console.log(pc4__default.default.cyan(`ama installing extension: ${ext}...`));
|
|
2184
|
+
await execAsync3(`"${binPath}" --user-data-dir "${STORAGE_DIR}" --install-extension ${ext}`);
|
|
2185
|
+
console.log(pc4__default.default.green(`ama extension ${ext} installed`));
|
|
2186
|
+
} catch (error) {
|
|
2187
|
+
console.log(pc4__default.default.yellow(`ama failed to install extension ${ext}`), error);
|
|
2188
|
+
}
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2113
2191
|
async function startCodeServer(cwd) {
|
|
2114
2192
|
const binPath = getCodeServerBin();
|
|
2115
2193
|
const workDir = cwd || process.cwd();
|
|
2116
|
-
if (!
|
|
2117
|
-
throw new Error("code-server is not installed. Run installCodeServer() first.");
|
|
2194
|
+
if (!fs6__default.default.existsSync(binPath)) {
|
|
2195
|
+
throw new Error("ama code-server is not installed. Run installCodeServer() first.");
|
|
2118
2196
|
}
|
|
2119
2197
|
await killExistingCodeServer();
|
|
2198
|
+
await setupDefaultSettings();
|
|
2199
|
+
await installExtensions();
|
|
2120
2200
|
const workspaceStoragePath = path10__default.default.join(STORAGE_DIR, "User", "workspaceStorage");
|
|
2121
|
-
path10__default.default.join(STORAGE_DIR, "User", "globalStorage");
|
|
2122
2201
|
try {
|
|
2123
|
-
if (
|
|
2124
|
-
await
|
|
2202
|
+
if (fs6__default.default.existsSync(workspaceStoragePath)) {
|
|
2203
|
+
await fs6__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
|
|
2125
2204
|
}
|
|
2126
2205
|
const stateDbPath = path10__default.default.join(STORAGE_DIR, "User", "globalStorage", "state.vscdb");
|
|
2127
|
-
if (
|
|
2128
|
-
await
|
|
2206
|
+
if (fs6__default.default.existsSync(stateDbPath)) {
|
|
2207
|
+
await fs6__default.default.promises.unlink(stateDbPath);
|
|
2129
2208
|
}
|
|
2130
2209
|
} catch {
|
|
2131
2210
|
}
|
|
2132
|
-
console.log(
|
|
2211
|
+
console.log(pc4__default.default.cyan(`ama starting code-server`));
|
|
2133
2212
|
const codeServer = child_process.spawn(
|
|
2134
2213
|
binPath,
|
|
2135
2214
|
[
|
|
@@ -2148,19 +2227,19 @@ async function startCodeServer(cwd) {
|
|
|
2148
2227
|
stdio: ["ignore", "pipe", "pipe"]
|
|
2149
2228
|
}
|
|
2150
2229
|
);
|
|
2151
|
-
console.log(
|
|
2230
|
+
console.log(pc4__default.default.green(`ama code-server running at http://localhost:8081/?folder=${encodeURIComponent(workDir)}`));
|
|
2152
2231
|
return codeServer;
|
|
2153
2232
|
}
|
|
2154
2233
|
if (process.env.AMA_DAEMON === "1") {
|
|
2155
2234
|
(async () => {
|
|
2156
2235
|
try {
|
|
2157
2236
|
if (!isCodeServerInstalled()) {
|
|
2158
|
-
console.log(
|
|
2237
|
+
console.log(pc4__default.default.gray("setting up code-server..."));
|
|
2159
2238
|
try {
|
|
2160
2239
|
await installCodeServer();
|
|
2161
2240
|
} catch (error) {
|
|
2162
|
-
console.error(
|
|
2163
|
-
console.log(
|
|
2241
|
+
console.error(pc4__default.default.red(`code-server install failed: ${error.message}`));
|
|
2242
|
+
console.log(pc4__default.default.gray("continuing without code-server..."));
|
|
2164
2243
|
}
|
|
2165
2244
|
}
|
|
2166
2245
|
if (isCodeServerInstalled()) {
|
|
@@ -2168,16 +2247,16 @@ if (process.env.AMA_DAEMON === "1") {
|
|
|
2168
2247
|
const projectDir = process.cwd() || os3__default.default.homedir();
|
|
2169
2248
|
await startCodeServer(projectDir);
|
|
2170
2249
|
} catch (error) {
|
|
2171
|
-
console.error(
|
|
2250
|
+
console.error(pc4__default.default.red(`code-server start failed: ${error.message}`));
|
|
2172
2251
|
}
|
|
2173
2252
|
}
|
|
2174
2253
|
await main();
|
|
2175
2254
|
} catch (error) {
|
|
2176
|
-
console.error("
|
|
2255
|
+
console.error(pc4__default.default.red("daemon error"));
|
|
2177
2256
|
process.exit(1);
|
|
2178
2257
|
}
|
|
2179
2258
|
})();
|
|
2180
2259
|
} else {
|
|
2181
|
-
console.error("
|
|
2260
|
+
console.error(pc4__default.default.red("this script should only be run as a daemon"));
|
|
2182
2261
|
process.exit(1);
|
|
2183
2262
|
}
|