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.
@@ -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 fs4 = require('fs');
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 pc2 = require('picocolors');
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 fs4__default = /*#__PURE__*/_interopDefault(fs4);
22
+ var fs6__default = /*#__PURE__*/_interopDefault(fs6);
23
23
  var os3__default = /*#__PURE__*/_interopDefault(os3);
24
- var pc2__default = /*#__PURE__*/_interopDefault(pc2);
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 (fs4__default.default.existsSync(REGISTRY_FILE)) {
41
- const data = fs4__default.default.readFileSync(REGISTRY_FILE, "utf8");
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
- fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
47
- fs4__default.default.unlinkSync(REGISTRY_FILE);
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 (fs4__default.default.existsSync(REGISTRY_FILE)) {
60
+ if (fs6__default.default.existsSync(REGISTRY_FILE)) {
61
61
  try {
62
62
  const backupFile = REGISTRY_FILE + ".backup." + Date.now();
63
- fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
64
- fs4__default.default.unlinkSync(REGISTRY_FILE);
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 (!fs4__default.default.existsSync(AMA_DIR)) {
74
- fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
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
- fs4__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
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 fs4__default.default.promises.readFile(filePath, "utf-8");
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 fs4__default.default.promises.readFile(filePath, "utf-8");
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 fs4__default.default.promises.writeFile(filePath, content);
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 (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1145
+ if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
1143
1146
  return null;
1144
1147
  }
1145
- const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
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 (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1154
+ if (!fs6__default.default.existsSync(CREDENTIALS_PATH)) {
1152
1155
  return;
1153
1156
  }
1154
- const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
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 = fs4.readdirSync(dir, { withFileTypes: true });
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 (!fs4__default.default.existsSync(storagePath)) {
1336
+ if (!fs6__default.default.existsSync(storagePath)) {
1334
1337
  return projects;
1335
1338
  }
1336
1339
  try {
1337
- const workspaces = fs4__default.default.readdirSync(storagePath);
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 (fs4__default.default.existsSync(workspaceJsonPath)) {
1343
+ if (fs6__default.default.existsSync(workspaceJsonPath)) {
1341
1344
  try {
1342
- const content = fs4__default.default.readFileSync(workspaceJsonPath, "utf-8");
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 (fs4__default.default.existsSync(projectPath) && fs4__default.default.statSync(projectPath).isDirectory()) {
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 = fs4__default.default.realpathSync(projectPath);
1375
- if (fs4__default.default.existsSync(resolvedPath) && fs4__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
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 fs4__default.default.realpathSync(ideDir) === resolvedPath;
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 (fs4__default.default.existsSync(dirPath)) {
1402
- const projects = fs4__default.default.readdirSync(dirPath);
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 = fs4__default.default.lstatSync(projectPath);
1409
+ const stats = fs6__default.default.lstatSync(projectPath);
1407
1410
  let actualPath = null;
1408
1411
  if (stats.isSymbolicLink()) {
1409
- actualPath = fs4__default.default.realpathSync(projectPath);
1412
+ actualPath = fs6__default.default.realpathSync(projectPath);
1410
1413
  } else if (stats.isFile()) {
1411
1414
  try {
1412
- let content = fs4__default.default.readFileSync(projectPath, "utf-8").trim();
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 (fs4__default.default.existsSync(resolvedContent) && fs4__default.default.statSync(resolvedContent).isDirectory()) {
1418
- actualPath = fs4__default.default.realpathSync(resolvedContent);
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 = fs4__default.default.realpathSync(projectPath);
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
- console.log(pc2__default.default.green("CLI connected to user-streams"));
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(pc2__default.default.gray(`RPC call: ${method}`));
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(pc2__default.default.red(`RPC failed: ${method} - ${rpcError.message}`));
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(pc2__default.default.red(`Failed to parse message: ${parseError}`));
1936
+ console.error(pc4__default.default.red(`parse error`));
1923
1937
  }
1924
1938
  });
1925
1939
  ws.on("close", (code, reason) => {
1926
- console.log(pc2__default.default.yellow(`CLI disconnected from user-streams (code: ${code})`));
1927
- console.log(pc2__default.default.gray("Reconnecting in 5 seconds..."));
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(pc2__default.default.red(`Reconnection failed: ${err.message}`));
1945
+ console.error(pc4__default.default.red(`reconnection failed`));
1931
1946
  });
1932
- }, 5e3);
1947
+ }, delay);
1933
1948
  });
1934
1949
  ws.on("error", (error) => {
1935
- console.error(pc2__default.default.red(`User streams WebSocket error: ${error.message}`));
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
- console.log(pc2__default.default.green("Connected to server agent streams"));
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(`tool call: ${message.tool}${message.projectCwd ? ` (project: ${message.projectCwd})` : ""}`);
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(pc2__default.default.red(`tool call failed: ${message.tool} ${error.message}`));
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(`rpc call: ${message.method}`);
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(pc2__default.default.red(`rpc call failed: ${message.method} ${error.message}`));
2035
+ console.error(pc4__default.default.red(` rpc failed: ${message.method}`));
2010
2036
  }
2011
2037
  }
2012
2038
  });
2013
2039
  ws.on("close", () => {
2014
- console.log(pc2__default.default.red("disconnected from server. reconnecting in 5s..."));
2015
- setTimeout(() => connectToServer(serverUrl), 5e3);
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(pc2__default.default.red(`web socket error: ${error.message}`));
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(pc2__default.default.green("starting local amai..."));
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 fs4__default.default.existsSync(binPath);
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 (!fs4__default.default.existsSync(AMA_DIR)) {
2070
- fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
2097
+ if (!fs6__default.default.existsSync(AMA_DIR)) {
2098
+ fs6__default.default.mkdirSync(AMA_DIR, { recursive: true });
2071
2099
  }
2072
- if (!fs4__default.default.existsSync(CODE_DIR)) {
2073
- fs4__default.default.mkdirSync(CODE_DIR, { recursive: true });
2100
+ if (!fs6__default.default.existsSync(CODE_DIR)) {
2101
+ fs6__default.default.mkdirSync(CODE_DIR, { recursive: true });
2074
2102
  }
2075
- if (!fs4__default.default.existsSync(STORAGE_DIR)) {
2076
- fs4__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
2103
+ if (!fs6__default.default.existsSync(STORAGE_DIR)) {
2104
+ fs6__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
2077
2105
  }
2078
- console.log(pc2__default.default.cyan(`Downloading code-server v${CODE_SERVER_VERSION}...`));
2079
- console.log(pc2__default.default.gray(downloadUrl));
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 fs4__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
2086
- console.log(pc2__default.default.cyan("Extracting code-server..."));
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 fs4__default.default.promises.unlink(tarballPath);
2116
+ await fs6__default.default.promises.unlink(tarballPath);
2089
2117
  const binPath = getCodeServerBin();
2090
- if (fs4__default.default.existsSync(binPath)) {
2091
- await fs4__default.default.promises.chmod(binPath, 493);
2118
+ if (fs6__default.default.existsSync(binPath)) {
2119
+ await fs6__default.default.promises.chmod(binPath, 493);
2092
2120
  }
2093
- console.log(pc2__default.default.green("\u2713 code-server installed successfully"));
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 (!fs4__default.default.existsSync(binPath)) {
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 (fs4__default.default.existsSync(workspaceStoragePath)) {
2124
- await fs4__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
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 (fs4__default.default.existsSync(stateDbPath)) {
2128
- await fs4__default.default.promises.unlink(stateDbPath);
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(pc2__default.default.cyan(`Starting code-server in ${workDir}...`));
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(pc2__default.default.green(`\u2713 code-server running at http://localhost:8081/?folder=${encodeURIComponent(workDir)}`));
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(pc2__default.default.cyan("First run detected. Setting up code-server..."));
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(pc2__default.default.red(`Failed to install code-server: ${error.message}`));
2163
- console.log(pc2__default.default.yellow("Continuing without code-server..."));
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(pc2__default.default.red(`Failed to start code-server: ${error.message}`));
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("Daemon error:", 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("This script should only be run as a daemon");
2260
+ console.error(pc4__default.default.red("this script should only be run as a daemon"));
2182
2261
  process.exit(1);
2183
2262
  }