amai 0.0.5 → 0.0.7

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 CHANGED
@@ -1,14 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var pc4 = require('picocolors');
4
+ var pc5 = require('picocolors');
5
5
  var WebSocket = require('ws');
6
- var events = require('events');
7
6
  var zod = require('zod');
8
7
  var promises = require('fs/promises');
9
- var path9 = require('path');
10
- var fs3 = require('fs');
11
- var os2 = require('os');
8
+ var path11 = require('path');
9
+ var fs4 = require('fs');
10
+ var os3 = require('os');
12
11
  var crypto = require('crypto');
13
12
  var child_process = require('child_process');
14
13
  var util = require('util');
@@ -21,21 +20,21 @@ var readline = require('readline');
21
20
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
22
21
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
23
22
 
24
- var pc4__default = /*#__PURE__*/_interopDefault(pc4);
23
+ var pc5__default = /*#__PURE__*/_interopDefault(pc5);
25
24
  var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
26
- var path9__default = /*#__PURE__*/_interopDefault(path9);
27
- var fs3__default = /*#__PURE__*/_interopDefault(fs3);
28
- var os2__default = /*#__PURE__*/_interopDefault(os2);
25
+ var path11__default = /*#__PURE__*/_interopDefault(path11);
26
+ var fs4__default = /*#__PURE__*/_interopDefault(fs4);
27
+ var os3__default = /*#__PURE__*/_interopDefault(os3);
29
28
  var readline__default = /*#__PURE__*/_interopDefault(readline);
30
29
 
31
30
  var DEFAULT_SERVER_URL = "wss://ama-production-a628.up.railway.app";
32
31
  var CLIENT_ID = "client_01K4Y8A67H544Z6J8A47E5GJ9A";
33
- var AMA_DIR = path9__default.default.join(os2__default.default.homedir(), ".amai");
34
- var CODE_DIR = path9__default.default.join(AMA_DIR, "code");
35
- var STORAGE_DIR = path9__default.default.join(AMA_DIR, "storage");
32
+ var AMA_DIR = path11__default.default.join(os3__default.default.homedir(), ".amai");
33
+ var CODE_DIR = path11__default.default.join(AMA_DIR, "code");
34
+ var STORAGE_DIR = path11__default.default.join(AMA_DIR, "storage");
36
35
 
37
36
  // src/lib/project-registry.ts
38
- var REGISTRY_FILE = path9__default.default.join(AMA_DIR, "projects.json");
37
+ var REGISTRY_FILE = path11__default.default.join(AMA_DIR, "projects.json");
39
38
  var ProjectRegistry = class {
40
39
  projects = /* @__PURE__ */ new Map();
41
40
  constructor() {
@@ -43,14 +42,14 @@ var ProjectRegistry = class {
43
42
  }
44
43
  load() {
45
44
  try {
46
- if (fs3__default.default.existsSync(REGISTRY_FILE)) {
47
- const data = fs3__default.default.readFileSync(REGISTRY_FILE, "utf8");
45
+ if (fs4__default.default.existsSync(REGISTRY_FILE)) {
46
+ const data = fs4__default.default.readFileSync(REGISTRY_FILE, "utf8");
48
47
  const parsed = JSON.parse(data);
49
48
  if (!Array.isArray(parsed)) {
50
49
  console.error("Invalid project registry format: expected array, got", typeof parsed);
51
50
  const backupFile = REGISTRY_FILE + ".backup." + Date.now();
52
- fs3__default.default.copyFileSync(REGISTRY_FILE, backupFile);
53
- fs3__default.default.unlinkSync(REGISTRY_FILE);
51
+ fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
52
+ fs4__default.default.unlinkSync(REGISTRY_FILE);
54
53
  return;
55
54
  }
56
55
  const projects = parsed;
@@ -63,11 +62,11 @@ var ProjectRegistry = class {
63
62
  }
64
63
  } catch (error) {
65
64
  console.error("Failed to load project registry:", error);
66
- if (fs3__default.default.existsSync(REGISTRY_FILE)) {
65
+ if (fs4__default.default.existsSync(REGISTRY_FILE)) {
67
66
  try {
68
67
  const backupFile = REGISTRY_FILE + ".backup." + Date.now();
69
- fs3__default.default.copyFileSync(REGISTRY_FILE, backupFile);
70
- fs3__default.default.unlinkSync(REGISTRY_FILE);
68
+ fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
69
+ fs4__default.default.unlinkSync(REGISTRY_FILE);
71
70
  console.log("Corrupted registry file backed up and removed. Starting fresh.");
72
71
  } catch (backupError) {
73
72
  }
@@ -76,21 +75,21 @@ var ProjectRegistry = class {
76
75
  }
77
76
  save() {
78
77
  try {
79
- if (!fs3__default.default.existsSync(AMA_DIR)) {
80
- fs3__default.default.mkdirSync(AMA_DIR, { recursive: true });
78
+ if (!fs4__default.default.existsSync(AMA_DIR)) {
79
+ fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
81
80
  }
82
81
  const projects = Array.from(this.projects.values());
83
- fs3__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
82
+ fs4__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
84
83
  } catch (error) {
85
84
  console.error("Failed to save project registry:", error);
86
85
  }
87
86
  }
88
87
  register(projectId, cwd, name) {
89
- const normalizedCwd = path9__default.default.normalize(path9__default.default.resolve(cwd));
88
+ const normalizedCwd = path11__default.default.normalize(path11__default.default.resolve(cwd));
90
89
  this.projects.set(projectId, {
91
90
  id: projectId,
92
91
  cwd: normalizedCwd,
93
- name: name || path9__default.default.basename(normalizedCwd),
92
+ name: name || path11__default.default.basename(normalizedCwd),
94
93
  active: true
95
94
  });
96
95
  this.save();
@@ -120,9 +119,9 @@ var ProjectRegistry = class {
120
119
  var projectRegistry = new ProjectRegistry();
121
120
  function isPathWithinProject(filePath, projectCwd) {
122
121
  try {
123
- const resolved = path9__default.default.resolve(projectCwd, filePath);
124
- const normalized = path9__default.default.normalize(resolved);
125
- const normalizedCwd = path9__default.default.normalize(projectCwd);
122
+ const resolved = path11__default.default.resolve(projectCwd, filePath);
123
+ const normalized = path11__default.default.normalize(resolved);
124
+ const normalizedCwd = path11__default.default.normalize(projectCwd);
126
125
  return normalized.startsWith(normalizedCwd);
127
126
  } catch {
128
127
  return false;
@@ -138,7 +137,7 @@ function validatePath(filePath, projectCwd) {
138
137
  };
139
138
  }
140
139
  try {
141
- const resolvedPath = path9__default.default.resolve(projectCwd, filePath);
140
+ const resolvedPath = path11__default.default.resolve(projectCwd, filePath);
142
141
  if (!isPathWithinProject(filePath, projectCwd)) {
143
142
  return {
144
143
  valid: false,
@@ -157,7 +156,7 @@ function validatePath(filePath, projectCwd) {
157
156
  }
158
157
  }
159
158
  function resolveProjectPath(filePath, projectCwd) {
160
- return path9__default.default.resolve(projectCwd, filePath);
159
+ return path11__default.default.resolve(projectCwd, filePath);
161
160
  }
162
161
 
163
162
  // src/tools/read-file.ts
@@ -279,7 +278,7 @@ var read_file = async function(input, projectCwd) {
279
278
  };
280
279
  }
281
280
  } else {
282
- const absolute_file_path = path9__default.default.resolve(relative_file_path);
281
+ const absolute_file_path = path11__default.default.resolve(relative_file_path);
283
282
  try {
284
283
  const fileStats = await promises.stat(absolute_file_path);
285
284
  if (!fileStats.isFile()) {
@@ -873,20 +872,20 @@ var editFiles = async function(input, projectCwd) {
873
872
  }
874
873
  const basePath = projectCwd || process.cwd();
875
874
  const filePath = resolveProjectPath(target_file, basePath);
876
- const dirPath = path9__default.default.dirname(filePath);
875
+ const dirPath = path11__default.default.dirname(filePath);
877
876
  await promises.mkdir(dirPath, { recursive: true });
878
877
  let isNewFile = providedNewFile;
879
878
  let existingContent = "";
880
879
  if (isNewFile === void 0) {
881
880
  try {
882
- existingContent = await fs3__default.default.promises.readFile(filePath, "utf-8");
881
+ existingContent = await fs4__default.default.promises.readFile(filePath, "utf-8");
883
882
  isNewFile = false;
884
883
  } catch (error) {
885
884
  isNewFile = true;
886
885
  }
887
886
  } else if (!isNewFile) {
888
887
  try {
889
- existingContent = await fs3__default.default.promises.readFile(filePath, "utf-8");
888
+ existingContent = await fs4__default.default.promises.readFile(filePath, "utf-8");
890
889
  } catch (error) {
891
890
  isNewFile = true;
892
891
  }
@@ -899,7 +898,7 @@ var editFiles = async function(input, projectCwd) {
899
898
  content
900
899
  );
901
900
  try {
902
- await fs3__default.default.promises.writeFile(filePath, content);
901
+ await fs4__default.default.promises.writeFile(filePath, content);
903
902
  } catch (writeError) {
904
903
  checkpointStore.removeCheckpoint(checkpointId);
905
904
  throw writeError;
@@ -1023,7 +1022,7 @@ var grepTool = async function(input, projectCwd) {
1023
1022
  try {
1024
1023
  const { includePattern, excludePattern: excludePattern2, caseSensitive } = options || {};
1025
1024
  const searchDir = projectCwd || process.cwd();
1026
- if (projectCwd && !path9__default.default.isAbsolute(projectCwd)) {
1025
+ if (projectCwd && !path11__default.default.isAbsolute(projectCwd)) {
1027
1026
  return {
1028
1027
  success: false,
1029
1028
  message: "Invalid project directory",
@@ -1215,8 +1214,8 @@ var list = async function(input, projectCwd) {
1215
1214
  const walk = async (currentDir, depth) => {
1216
1215
  const entries = await promises.readdir(currentDir, { withFileTypes: true });
1217
1216
  for (const entry of entries) {
1218
- const entryAbsolutePath = path9__default.default.join(currentDir, entry.name);
1219
- const entryRelativePath = path9__default.default.relative(absolutePath, entryAbsolutePath) || ".";
1217
+ const entryAbsolutePath = path11__default.default.join(currentDir, entry.name);
1218
+ const entryRelativePath = path11__default.default.relative(absolutePath, entryAbsolutePath) || ".";
1220
1219
  if (entry.isDirectory()) {
1221
1220
  const isExcluded = entry.name.match(excludePattern);
1222
1221
  if (includeDirectoriesNormalized && matchPattern(entry.name) && !isExcluded) {
@@ -1266,213 +1265,9 @@ var list = async function(input, projectCwd) {
1266
1265
  };
1267
1266
  }
1268
1267
  };
1269
- var ignoreFiles = ["node_modules", ".git", ".next", ".env", ".env.local", ".env.development.local", ".env.test.local", ".env.production.local"];
1270
- var getContext = (dir, base = dir, allFiles = []) => {
1271
- const filePath = fs3.readdirSync(dir, { withFileTypes: true });
1272
- for (const file of filePath) {
1273
- if (ignoreFiles.includes(file.name)) continue;
1274
- const fullPath = path9__default.default.join(dir, file.name);
1275
- if (file.isDirectory()) {
1276
- getContext(fullPath, base, allFiles);
1277
- } else {
1278
- allFiles.push(path9__default.default.relative(base, fullPath));
1279
- }
1280
- }
1281
- return allFiles;
1282
- };
1283
- var HOME = os2__default.default.homedir();
1284
- var IDE_PROJECTS_PATHS = {
1285
- vscode: path9__default.default.join(HOME, ".vscode", "projects"),
1286
- cursor: path9__default.default.join(HOME, ".cursor", "projects"),
1287
- claude: path9__default.default.join(HOME, ".claude", "projects")
1288
- };
1289
- function getWorkspaceStoragePath(ide) {
1290
- const platform = os2__default.default.platform();
1291
- const appName = "Cursor" ;
1292
- if (platform === "darwin") {
1293
- return path9__default.default.join(HOME, "Library", "Application Support", appName, "User", "workspaceStorage");
1294
- } else if (platform === "win32") {
1295
- return path9__default.default.join(process.env.APPDATA || "", appName, "User", "workspaceStorage");
1296
- } else {
1297
- return path9__default.default.join(HOME, ".config", appName, "User", "workspaceStorage");
1298
- }
1299
- }
1300
- function scanWorkspaceStorage(ide) {
1301
- const projects = [];
1302
- const storagePath = getWorkspaceStoragePath();
1303
- if (!fs3__default.default.existsSync(storagePath)) {
1304
- return projects;
1305
- }
1306
- try {
1307
- const workspaces = fs3__default.default.readdirSync(storagePath);
1308
- for (const workspace of workspaces) {
1309
- const workspaceJsonPath = path9__default.default.join(storagePath, workspace, "workspace.json");
1310
- if (fs3__default.default.existsSync(workspaceJsonPath)) {
1311
- try {
1312
- const content = fs3__default.default.readFileSync(workspaceJsonPath, "utf-8");
1313
- const data = JSON.parse(content);
1314
- if (data.folder && typeof data.folder === "string") {
1315
- let projectPath = data.folder;
1316
- if (projectPath.startsWith("file://")) {
1317
- projectPath = projectPath.replace("file://", "");
1318
- projectPath = decodeURIComponent(projectPath);
1319
- }
1320
- if (fs3__default.default.existsSync(projectPath) && fs3__default.default.statSync(projectPath).isDirectory()) {
1321
- projects.push({
1322
- name: path9__default.default.basename(projectPath),
1323
- path: projectPath,
1324
- type: ide
1325
- });
1326
- }
1327
- }
1328
- } catch (err) {
1329
- console.debug(`Error reading workspace.json at ${workspaceJsonPath}: ${err}`);
1330
- }
1331
- }
1332
- }
1333
- } catch (err) {
1334
- console.debug(`Error scanning workspaceStorage for ${ide}: ${err}`);
1335
- }
1336
- return projects;
1337
- }
1338
- var scanIdeProjects = async () => {
1339
- try {
1340
- const allProjects = [];
1341
- const seenPaths = /* @__PURE__ */ new Set();
1342
- const addProject = (projectPath, ide) => {
1343
- try {
1344
- const resolvedPath = fs3__default.default.realpathSync(projectPath);
1345
- if (fs3__default.default.existsSync(resolvedPath) && fs3__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
1346
- const isIdeProjectsDir = Object.values(IDE_PROJECTS_PATHS).some((ideDir) => {
1347
- try {
1348
- return fs3__default.default.realpathSync(ideDir) === resolvedPath;
1349
- } catch {
1350
- return false;
1351
- }
1352
- });
1353
- if (!isIdeProjectsDir) {
1354
- seenPaths.add(resolvedPath);
1355
- allProjects.push({
1356
- name: path9__default.default.basename(resolvedPath),
1357
- path: resolvedPath,
1358
- type: ide
1359
- });
1360
- }
1361
- }
1362
- } catch {
1363
- }
1364
- };
1365
- const cursorProjects = scanWorkspaceStorage("cursor");
1366
- for (const project of cursorProjects) {
1367
- addProject(project.path, "cursor");
1368
- }
1369
- for (const [ide, dirPath] of Object.entries(IDE_PROJECTS_PATHS)) {
1370
- if (ide === "cursor") continue;
1371
- if (fs3__default.default.existsSync(dirPath)) {
1372
- const projects = fs3__default.default.readdirSync(dirPath);
1373
- projects.forEach((project) => {
1374
- const projectPath = path9__default.default.join(dirPath, project);
1375
- try {
1376
- const stats = fs3__default.default.lstatSync(projectPath);
1377
- let actualPath = null;
1378
- if (stats.isSymbolicLink()) {
1379
- actualPath = fs3__default.default.realpathSync(projectPath);
1380
- } else if (stats.isFile()) {
1381
- try {
1382
- let content = fs3__default.default.readFileSync(projectPath, "utf-8").trim();
1383
- if (content.startsWith("~/") || content === "~") {
1384
- content = content.replace(/^~/, HOME);
1385
- }
1386
- const resolvedContent = path9__default.default.isAbsolute(content) ? content : path9__default.default.resolve(path9__default.default.dirname(projectPath), content);
1387
- if (fs3__default.default.existsSync(resolvedContent) && fs3__default.default.statSync(resolvedContent).isDirectory()) {
1388
- actualPath = fs3__default.default.realpathSync(resolvedContent);
1389
- }
1390
- } catch {
1391
- return;
1392
- }
1393
- } else if (stats.isDirectory()) {
1394
- actualPath = fs3__default.default.realpathSync(projectPath);
1395
- }
1396
- if (actualPath) {
1397
- addProject(actualPath, ide);
1398
- }
1399
- } catch {
1400
- }
1401
- });
1402
- }
1403
- }
1404
- return allProjects;
1405
- } catch (error) {
1406
- console.debug(`Error scanning IDE projects: ${error}`);
1407
- return [];
1408
- }
1409
- };
1410
- var wsConnection = null;
1411
- var startHttpServer = (connection) => {
1412
- if (connection) {
1413
- wsConnection = connection;
1414
- }
1268
+ var startHttpServer = () => {
1415
1269
  const app = new hono.Hono();
1416
1270
  app.use(cors.cors());
1417
- app.post("/daemon/status", (c) => {
1418
- const status = wsConnection ? getConnectionStatus(wsConnection) : "closed";
1419
- return c.json({ connected: status === "open" });
1420
- });
1421
- app.get("/daemon/status/stream", (c) => {
1422
- const encoder = new TextEncoder();
1423
- const stream = new ReadableStream({
1424
- start(controller) {
1425
- const initialStatus = wsConnection ? getConnectionStatus(wsConnection) : "closed";
1426
- controller.enqueue(encoder.encode(`data: ${JSON.stringify({ connected: initialStatus === "open" })}
1427
-
1428
- `));
1429
- const statusHandler = (data) => {
1430
- try {
1431
- controller.enqueue(encoder.encode(`data: ${JSON.stringify(data)}
1432
-
1433
- `));
1434
- } catch {
1435
- }
1436
- };
1437
- statusEmitter.on("status", statusHandler);
1438
- const heartbeatInterval = setInterval(() => {
1439
- try {
1440
- const currentStatus = wsConnection ? getConnectionStatus(wsConnection) : "closed";
1441
- controller.enqueue(encoder.encode(`data: ${JSON.stringify({ connected: currentStatus === "open" })}
1442
-
1443
- `));
1444
- } catch {
1445
- }
1446
- }, 15e3);
1447
- c.req.raw.signal.addEventListener("abort", () => {
1448
- statusEmitter.off("status", statusHandler);
1449
- clearInterval(heartbeatInterval);
1450
- });
1451
- }
1452
- });
1453
- return new Response(stream, {
1454
- headers: {
1455
- "Content-Type": "text/event-stream",
1456
- "Cache-Control": "no-cache",
1457
- "Connection": "keep-alive"
1458
- }
1459
- });
1460
- });
1461
- app.get("context", async (c) => {
1462
- const context = getContext(process.cwd());
1463
- return c.body(JSON.stringify(context));
1464
- });
1465
- app.get("/ide-projects", async (c) => {
1466
- try {
1467
- const projects = await scanIdeProjects();
1468
- if (!projects) {
1469
- return c.json({ error: "No projects found" }, 500);
1470
- }
1471
- return c.json({ projects });
1472
- } catch (error) {
1473
- return c.json({ error: "Failed to scan IDE projects" }, 500);
1474
- }
1475
- });
1476
1271
  app.post("/projects/register", async (c) => {
1477
1272
  try {
1478
1273
  const { projectId, cwd, name } = await c.req.json();
@@ -1501,14 +1296,14 @@ var startHttpServer = (connection) => {
1501
1296
  }
1502
1297
  let resolved;
1503
1298
  if (projectCwd) {
1504
- resolved = path9__default.default.isAbsolute(filePath) ? filePath : path9__default.default.resolve(projectCwd, filePath);
1505
- const normalizedResolved = path9__default.default.normalize(resolved);
1506
- const normalizedCwd = path9__default.default.normalize(projectCwd);
1299
+ resolved = path11__default.default.isAbsolute(filePath) ? filePath : path11__default.default.resolve(projectCwd, filePath);
1300
+ const normalizedResolved = path11__default.default.normalize(resolved);
1301
+ const normalizedCwd = path11__default.default.normalize(projectCwd);
1507
1302
  if (!normalizedResolved.startsWith(normalizedCwd)) {
1508
1303
  return c.json({ error: "Path is outside project directory" }, 403);
1509
1304
  }
1510
1305
  } else {
1511
- resolved = path9__default.default.isAbsolute(filePath) ? filePath : path9__default.default.join(process.cwd(), filePath);
1306
+ resolved = path11__default.default.isAbsolute(filePath) ? filePath : path11__default.default.join(process.cwd(), filePath);
1512
1307
  }
1513
1308
  let currentContent;
1514
1309
  try {
@@ -1595,9 +1390,9 @@ var startHttpServer = (connection) => {
1595
1390
  }
1596
1391
  let resolved;
1597
1392
  if (projectCwd) {
1598
- resolved = path9__default.default.isAbsolute(filePath || checkpoint.filePath) ? filePath || checkpoint.filePath : path9__default.default.resolve(projectCwd, filePath || checkpoint.filePath);
1599
- const normalizedResolved = path9__default.default.normalize(resolved);
1600
- const normalizedCwd = path9__default.default.normalize(projectCwd);
1393
+ resolved = path11__default.default.isAbsolute(filePath || checkpoint.filePath) ? filePath || checkpoint.filePath : path11__default.default.resolve(projectCwd, filePath || checkpoint.filePath);
1394
+ const normalizedResolved = path11__default.default.normalize(resolved);
1395
+ const normalizedCwd = path11__default.default.normalize(projectCwd);
1601
1396
  if (!normalizedResolved.startsWith(normalizedCwd)) {
1602
1397
  return c.json({ error: "Path is outside project directory" }, 403);
1603
1398
  }
@@ -1660,14 +1455,14 @@ var startHttpServer = (connection) => {
1660
1455
  nodeServer.serve({ fetch: app.fetch, port: 3456 });
1661
1456
  };
1662
1457
  var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
1663
- var CREDENTIALS_DIR = path9__default.default.join(os2__default.default.homedir(), ".amai");
1664
- var CREDENTIALS_PATH = path9__default.default.join(CREDENTIALS_DIR, "credentials.json");
1458
+ var CREDENTIALS_DIR = path11__default.default.join(os3__default.default.homedir(), ".amai");
1459
+ var CREDENTIALS_PATH = path11__default.default.join(CREDENTIALS_DIR, "credentials.json");
1665
1460
  function isAuthenticated() {
1666
1461
  try {
1667
- if (!fs3__default.default.existsSync(CREDENTIALS_PATH)) {
1462
+ if (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1668
1463
  return false;
1669
1464
  }
1670
- const raw = fs3__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
1465
+ const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
1671
1466
  const data = JSON.parse(raw);
1672
1467
  return Boolean(data && data.access_token);
1673
1468
  } catch {
@@ -1676,32 +1471,32 @@ function isAuthenticated() {
1676
1471
  }
1677
1472
  function saveTokens(tokens) {
1678
1473
  try {
1679
- if (!fs3__default.default.existsSync(CREDENTIALS_DIR)) {
1680
- fs3__default.default.mkdirSync(CREDENTIALS_DIR, { recursive: true });
1474
+ if (!fs4__default.default.existsSync(CREDENTIALS_DIR)) {
1475
+ fs4__default.default.mkdirSync(CREDENTIALS_DIR, { recursive: true });
1681
1476
  }
1682
- fs3__default.default.writeFileSync(
1477
+ fs4__default.default.writeFileSync(
1683
1478
  CREDENTIALS_PATH,
1684
1479
  JSON.stringify(tokens, null, 2),
1685
1480
  "utf8"
1686
1481
  );
1687
1482
  } catch (error) {
1688
- console.error(pc4__default.default.red("Failed to save credentials"), error);
1483
+ console.error(pc5__default.default.red("Failed to save credentials"), error);
1689
1484
  }
1690
1485
  }
1691
1486
  function logout() {
1692
1487
  try {
1693
- if (fs3__default.default.existsSync(CREDENTIALS_PATH)) {
1694
- fs3__default.default.unlinkSync(CREDENTIALS_PATH);
1488
+ if (fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1489
+ fs4__default.default.unlinkSync(CREDENTIALS_PATH);
1695
1490
  }
1696
1491
  } catch (error) {
1697
- console.error(pc4__default.default.red("Failed to logout"), error);
1492
+ console.error(pc5__default.default.red("Failed to logout"), error);
1698
1493
  }
1699
1494
  }
1700
1495
  function getTokens() {
1701
- if (!fs3__default.default.existsSync(CREDENTIALS_PATH)) {
1496
+ if (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1702
1497
  return null;
1703
1498
  }
1704
- const raw = fs3__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
1499
+ const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
1705
1500
  const data = JSON.parse(raw);
1706
1501
  return data;
1707
1502
  }
@@ -1769,27 +1564,27 @@ async function pollForTokens({
1769
1564
  async function login() {
1770
1565
  try {
1771
1566
  const device = await authorizeDevice();
1772
- console.log(pc4__default.default.bold("To sign in, follow these steps:"));
1567
+ console.log(pc5__default.default.bold("To sign in, follow these steps:"));
1773
1568
  if (device.verification_uri_complete) {
1774
1569
  console.log(
1775
- ` 1. Open this URL in your browser: ${pc4__default.default.cyan(
1570
+ ` 1. Open this URL in your browser: ${pc5__default.default.cyan(
1776
1571
  device.verification_uri_complete
1777
1572
  )}`
1778
1573
  );
1779
1574
  } else {
1780
1575
  console.log(
1781
- ` 1. Open this URL in your browser: ${pc4__default.default.cyan(
1576
+ ` 1. Open this URL in your browser: ${pc5__default.default.cyan(
1782
1577
  device.verification_uri
1783
1578
  )}`
1784
1579
  );
1785
1580
  console.log(
1786
- ` 2. Enter this code when prompted: ${pc4__default.default.bold(device.user_code)}`
1581
+ ` 2. Enter this code when prompted: ${pc5__default.default.bold(device.user_code)}`
1787
1582
  );
1788
1583
  }
1789
1584
  console.log(" 3. Come back here; we will detect when you finish logging in.");
1790
1585
  console.log();
1791
1586
  console.log(
1792
- pc4__default.default.gray(
1587
+ pc5__default.default.gray(
1793
1588
  `Waiting for authorization (expires in ~${Math.round(
1794
1589
  device.expires_in / 60
1795
1590
  )} minutes)...`
@@ -1801,14 +1596,28 @@ async function login() {
1801
1596
  expiresIn: device.expires_in,
1802
1597
  interval: device.interval
1803
1598
  });
1804
- console.log(pc4__default.default.green("Successfully authenticated!"));
1599
+ console.log(pc5__default.default.green("Successfully authenticated!"));
1805
1600
  saveTokens(tokens);
1806
1601
  return tokens;
1807
1602
  } catch (error) {
1808
- console.error(pc4__default.default.red(error.message || "Login failed"));
1603
+ console.error(pc5__default.default.red(error.message || "Login failed"));
1809
1604
  throw error;
1810
1605
  }
1811
1606
  }
1607
+ var getUserId = () => {
1608
+ try {
1609
+ if (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
1610
+ return;
1611
+ }
1612
+ const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
1613
+ const data = JSON.parse(raw);
1614
+ return {
1615
+ userId: data.user.id
1616
+ };
1617
+ } catch {
1618
+ throw new Error("Error while getting userId");
1619
+ }
1620
+ };
1812
1621
  var ExplanationSchema = zod.z.object({
1813
1622
  explanation: zod.z.string().describe("One sentence explanation as to why this tool is being used")
1814
1623
  });
@@ -1896,9 +1705,343 @@ var runTerminalCommand = async (input, projectCwd) => {
1896
1705
  };
1897
1706
  }
1898
1707
  };
1708
+ var ignoreFiles = ["node_modules", ".git", ".next", ".env", ".env.local", ".env.development.local", ".env.test.local", ".env.production.local"];
1709
+ var getContext = (dir, base = dir, allFiles = []) => {
1710
+ const filePath = fs4.readdirSync(dir, { withFileTypes: true });
1711
+ for (const file of filePath) {
1712
+ if (ignoreFiles.includes(file.name)) continue;
1713
+ const fullPath = path11__default.default.join(dir, file.name);
1714
+ if (file.isDirectory()) {
1715
+ getContext(fullPath, base, allFiles);
1716
+ } else {
1717
+ allFiles.push(path11__default.default.relative(base, fullPath));
1718
+ }
1719
+ }
1720
+ return allFiles;
1721
+ };
1722
+ var HOME = os3__default.default.homedir();
1723
+ var IDE_PROJECTS_PATHS = {
1724
+ vscode: path11__default.default.join(HOME, ".vscode", "projects"),
1725
+ cursor: path11__default.default.join(HOME, ".cursor", "projects"),
1726
+ claude: path11__default.default.join(HOME, ".claude", "projects")
1727
+ };
1728
+ function getWorkspaceStoragePath(ide) {
1729
+ const platform = os3__default.default.platform();
1730
+ const appName = "Cursor" ;
1731
+ if (platform === "darwin") {
1732
+ return path11__default.default.join(HOME, "Library", "Application Support", appName, "User", "workspaceStorage");
1733
+ } else if (platform === "win32") {
1734
+ return path11__default.default.join(process.env.APPDATA || "", appName, "User", "workspaceStorage");
1735
+ } else {
1736
+ return path11__default.default.join(HOME, ".config", appName, "User", "workspaceStorage");
1737
+ }
1738
+ }
1739
+ function scanWorkspaceStorage(ide) {
1740
+ const projects = [];
1741
+ const storagePath = getWorkspaceStoragePath();
1742
+ if (!fs4__default.default.existsSync(storagePath)) {
1743
+ return projects;
1744
+ }
1745
+ try {
1746
+ const workspaces = fs4__default.default.readdirSync(storagePath);
1747
+ for (const workspace of workspaces) {
1748
+ const workspaceJsonPath = path11__default.default.join(storagePath, workspace, "workspace.json");
1749
+ if (fs4__default.default.existsSync(workspaceJsonPath)) {
1750
+ try {
1751
+ const content = fs4__default.default.readFileSync(workspaceJsonPath, "utf-8");
1752
+ const data = JSON.parse(content);
1753
+ if (data.folder && typeof data.folder === "string") {
1754
+ let projectPath = data.folder;
1755
+ if (projectPath.startsWith("file://")) {
1756
+ projectPath = projectPath.replace("file://", "");
1757
+ projectPath = decodeURIComponent(projectPath);
1758
+ }
1759
+ if (fs4__default.default.existsSync(projectPath) && fs4__default.default.statSync(projectPath).isDirectory()) {
1760
+ projects.push({
1761
+ name: path11__default.default.basename(projectPath),
1762
+ path: projectPath,
1763
+ type: ide
1764
+ });
1765
+ }
1766
+ }
1767
+ } catch (err) {
1768
+ console.debug(`Error reading workspace.json at ${workspaceJsonPath}: ${err}`);
1769
+ }
1770
+ }
1771
+ }
1772
+ } catch (err) {
1773
+ console.debug(`Error scanning workspaceStorage for ${ide}: ${err}`);
1774
+ }
1775
+ return projects;
1776
+ }
1777
+ var scanIdeProjects = async () => {
1778
+ try {
1779
+ const allProjects = [];
1780
+ const seenPaths = /* @__PURE__ */ new Set();
1781
+ const addProject = (projectPath, ide) => {
1782
+ try {
1783
+ const resolvedPath = fs4__default.default.realpathSync(projectPath);
1784
+ if (fs4__default.default.existsSync(resolvedPath) && fs4__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
1785
+ const isIdeProjectsDir = Object.values(IDE_PROJECTS_PATHS).some((ideDir) => {
1786
+ try {
1787
+ return fs4__default.default.realpathSync(ideDir) === resolvedPath;
1788
+ } catch {
1789
+ return false;
1790
+ }
1791
+ });
1792
+ if (!isIdeProjectsDir) {
1793
+ seenPaths.add(resolvedPath);
1794
+ allProjects.push({
1795
+ name: path11__default.default.basename(resolvedPath),
1796
+ path: resolvedPath,
1797
+ type: ide
1798
+ });
1799
+ }
1800
+ }
1801
+ } catch {
1802
+ }
1803
+ };
1804
+ const cursorProjects = scanWorkspaceStorage("cursor");
1805
+ for (const project of cursorProjects) {
1806
+ addProject(project.path, "cursor");
1807
+ }
1808
+ for (const [ide, dirPath] of Object.entries(IDE_PROJECTS_PATHS)) {
1809
+ if (ide === "cursor") continue;
1810
+ if (fs4__default.default.existsSync(dirPath)) {
1811
+ const projects = fs4__default.default.readdirSync(dirPath);
1812
+ projects.forEach((project) => {
1813
+ const projectPath = path11__default.default.join(dirPath, project);
1814
+ try {
1815
+ const stats = fs4__default.default.lstatSync(projectPath);
1816
+ let actualPath = null;
1817
+ if (stats.isSymbolicLink()) {
1818
+ actualPath = fs4__default.default.realpathSync(projectPath);
1819
+ } else if (stats.isFile()) {
1820
+ try {
1821
+ let content = fs4__default.default.readFileSync(projectPath, "utf-8").trim();
1822
+ if (content.startsWith("~/") || content === "~") {
1823
+ content = content.replace(/^~/, HOME);
1824
+ }
1825
+ const resolvedContent = path11__default.default.isAbsolute(content) ? content : path11__default.default.resolve(path11__default.default.dirname(projectPath), content);
1826
+ if (fs4__default.default.existsSync(resolvedContent) && fs4__default.default.statSync(resolvedContent).isDirectory()) {
1827
+ actualPath = fs4__default.default.realpathSync(resolvedContent);
1828
+ }
1829
+ } catch {
1830
+ return;
1831
+ }
1832
+ } else if (stats.isDirectory()) {
1833
+ actualPath = fs4__default.default.realpathSync(projectPath);
1834
+ }
1835
+ if (actualPath) {
1836
+ addProject(actualPath, ide);
1837
+ }
1838
+ } catch {
1839
+ }
1840
+ });
1841
+ }
1842
+ }
1843
+ return allProjects;
1844
+ } catch (error) {
1845
+ console.debug(`Error scanning IDE projects: ${error}`);
1846
+ return [];
1847
+ }
1848
+ };
1849
+
1850
+ // src/lib/rpc-handlers.ts
1851
+ var rpcHandlers = {
1852
+ "daemon:get_workspace_folders": async () => {
1853
+ const projects = projectRegistry.list();
1854
+ return {
1855
+ folders: projects.map((p) => ({
1856
+ id: p.id,
1857
+ cwd: p.cwd,
1858
+ name: p.name,
1859
+ active: p.active
1860
+ }))
1861
+ };
1862
+ },
1863
+ "daemon:get_environment": async ({ gitRepositoryUrl }) => {
1864
+ const projects = projectRegistry.list();
1865
+ if (projects.length === 0) {
1866
+ const error = {
1867
+ _tag: "ProjectUnlinkedError",
1868
+ message: `Getting a local project by git repository URL "${gitRepositoryUrl}" returned an unlinked project. Please link it by running \`amai link <project name> <path to project directory>\``
1869
+ };
1870
+ throw error;
1871
+ }
1872
+ return {
1873
+ project: projects[0],
1874
+ env: {
1875
+ platform: process.platform,
1876
+ arch: process.arch,
1877
+ nodeVersion: process.version
1878
+ }
1879
+ };
1880
+ },
1881
+ "daemon:get_context": async ({ cwd }) => {
1882
+ try {
1883
+ const files = getContext(cwd);
1884
+ return { files, cwd };
1885
+ } catch (error) {
1886
+ const rpcError = {
1887
+ _tag: "ContextError",
1888
+ message: error.message || "Failed to get context"
1889
+ };
1890
+ throw rpcError;
1891
+ }
1892
+ },
1893
+ "daemon:get_ide_projects": async () => {
1894
+ const projects = await scanIdeProjects();
1895
+ return { projects };
1896
+ },
1897
+ "daemon:register_project": async ({ projectId, cwd, name }) => {
1898
+ if (!projectId || !cwd) {
1899
+ const error = {
1900
+ _tag: "ValidationError",
1901
+ message: "projectId and cwd are required"
1902
+ };
1903
+ throw error;
1904
+ }
1905
+ projectRegistry.register(projectId, cwd, name);
1906
+ return { success: true, projectId, cwd };
1907
+ },
1908
+ "daemon:unregister_project": async ({ projectId }) => {
1909
+ if (!projectId) {
1910
+ const error = {
1911
+ _tag: "ValidationError",
1912
+ message: "projectId is required"
1913
+ };
1914
+ throw error;
1915
+ }
1916
+ projectRegistry.unregister(projectId);
1917
+ return { success: true, projectId };
1918
+ },
1919
+ "daemon:get_project": async ({ projectId }) => {
1920
+ const project = projectRegistry.getProject(projectId);
1921
+ if (!project) {
1922
+ const error = {
1923
+ _tag: "ProjectNotFoundError",
1924
+ message: `Project not found: ${projectId}`
1925
+ };
1926
+ throw error;
1927
+ }
1928
+ return { project };
1929
+ },
1930
+ "daemon:list_projects": async () => {
1931
+ const projects = projectRegistry.list();
1932
+ return { projects };
1933
+ },
1934
+ "daemon:status": async () => {
1935
+ return {
1936
+ connected: true,
1937
+ timestamp: Date.now(),
1938
+ platform: process.platform,
1939
+ arch: process.arch
1940
+ };
1941
+ }
1942
+ };
1943
+ var reconnectTimeout = null;
1944
+ var connectToUserStreams = async (serverUrl) => {
1945
+ const userId = getUserId();
1946
+ if (!userId?.userId) {
1947
+ throw new Error("User ID not found");
1948
+ }
1949
+ const params = new URLSearchParams({
1950
+ userId: userId.userId,
1951
+ type: "cli"
1952
+ });
1953
+ const tokens = getTokens();
1954
+ if (!tokens) {
1955
+ throw new Error("No tokens found");
1956
+ }
1957
+ const wsUrl = `${serverUrl}/api/v1/user-streams?${params.toString()}`;
1958
+ const ws = new WebSocket__default.default(wsUrl, {
1959
+ headers: {
1960
+ Authorization: `Bearer ${tokens.access_token}`
1961
+ }
1962
+ });
1963
+ ws.on("open", () => {
1964
+ console.log(pc5__default.default.green("CLI connected to user-streams"));
1965
+ if (reconnectTimeout) {
1966
+ clearTimeout(reconnectTimeout);
1967
+ reconnectTimeout = null;
1968
+ }
1969
+ });
1970
+ ws.on("message", async (event) => {
1971
+ try {
1972
+ const message = JSON.parse(event.toString());
1973
+ if (message._tag === "rpc_call") {
1974
+ const { requestId, method, input } = message;
1975
+ console.log(pc5__default.default.gray(`RPC call: ${method}`));
1976
+ const handler = rpcHandlers[method];
1977
+ if (!handler) {
1978
+ ws.send(JSON.stringify({
1979
+ _tag: "rpc_result",
1980
+ requestId,
1981
+ data: {
1982
+ _tag: "UnknownMethodError",
1983
+ message: `Unknown RPC method: ${method}`
1984
+ }
1985
+ }));
1986
+ console.log(pc5__default.default.yellow(`Unknown RPC method: ${method}`));
1987
+ return;
1988
+ }
1989
+ try {
1990
+ const result = await handler(input || {});
1991
+ ws.send(JSON.stringify({
1992
+ _tag: "rpc_result",
1993
+ requestId,
1994
+ data: result
1995
+ }));
1996
+ console.log(pc5__default.default.green(`RPC completed: ${method}`));
1997
+ } catch (error) {
1998
+ const rpcError = error._tag ? error : {
1999
+ _tag: "RpcError",
2000
+ message: error.message || String(error)
2001
+ };
2002
+ ws.send(JSON.stringify({
2003
+ _tag: "rpc_result",
2004
+ requestId,
2005
+ data: rpcError
2006
+ }));
2007
+ console.log(pc5__default.default.red(`RPC failed: ${method} - ${rpcError.message}`));
2008
+ }
2009
+ return;
2010
+ }
2011
+ if (message.type === "presence_request") {
2012
+ if (message.status === "connected") {
2013
+ ws.send(JSON.stringify({
2014
+ type: "presence_request",
2015
+ status: "connected"
2016
+ }));
2017
+ }
2018
+ if (message.status === "disconnected") {
2019
+ ws.send(JSON.stringify({
2020
+ type: "presence_request",
2021
+ status: "disconnected"
2022
+ }));
2023
+ }
2024
+ }
2025
+ } catch (parseError) {
2026
+ console.error(pc5__default.default.red(`Failed to parse message: ${parseError}`));
2027
+ }
2028
+ });
2029
+ ws.on("close", (code, reason) => {
2030
+ console.log(pc5__default.default.yellow(`CLI disconnected from user-streams (code: ${code})`));
2031
+ console.log(pc5__default.default.gray("Reconnecting in 5 seconds..."));
2032
+ reconnectTimeout = setTimeout(() => {
2033
+ connectToUserStreams(serverUrl).catch((err) => {
2034
+ console.error(pc5__default.default.red(`Reconnection failed: ${err.message}`));
2035
+ });
2036
+ }, 5e3);
2037
+ });
2038
+ ws.on("error", (error) => {
2039
+ console.error(pc5__default.default.red(`User streams WebSocket error: ${error.message}`));
2040
+ });
2041
+ return ws;
2042
+ };
1899
2043
 
1900
2044
  // src/server.ts
1901
- var statusEmitter = new events.EventEmitter();
1902
2045
  var toolExecutors = {
1903
2046
  editFile: editFiles,
1904
2047
  deleteFile,
@@ -1909,10 +2052,7 @@ var toolExecutors = {
1909
2052
  stringReplace: apply_patch,
1910
2053
  runTerminalCommand
1911
2054
  };
1912
- function getConnectionStatus(ws) {
1913
- return ws.readyState === WebSocket__default.default.CONNECTING ? "connecting" : ws.readyState === WebSocket__default.default.OPEN ? "open" : ws.readyState === WebSocket__default.default.CLOSING ? "closing" : "closed";
1914
- }
1915
- function connectToServer2(serverUrl = DEFAULT_SERVER_URL) {
2055
+ function connectToServer(serverUrl = DEFAULT_SERVER_URL) {
1916
2056
  const tokens = getTokens();
1917
2057
  if (!tokens) {
1918
2058
  throw new Error("No tokens found");
@@ -1924,8 +2064,7 @@ function connectToServer2(serverUrl = DEFAULT_SERVER_URL) {
1924
2064
  }
1925
2065
  });
1926
2066
  ws.on("open", () => {
1927
- console.log(pc4__default.default.green("Connected to server agent streams"));
1928
- statusEmitter.emit("status", { connected: true });
2067
+ console.log(pc5__default.default.green("Connected to server agent streams"));
1929
2068
  });
1930
2069
  ws.on("message", async (data) => {
1931
2070
  const message = JSON.parse(data.toString());
@@ -1942,34 +2081,33 @@ function connectToServer2(serverUrl = DEFAULT_SERVER_URL) {
1942
2081
  id: message.id,
1943
2082
  result
1944
2083
  }));
1945
- console.log(pc4__default.default.green(`Tool completed: ${message.tool}`));
2084
+ console.log(pc5__default.default.green(`Tool completed: ${message.tool}`));
1946
2085
  } catch (error) {
1947
2086
  ws.send(JSON.stringify({
1948
2087
  type: "tool_result",
1949
2088
  id: message.id,
1950
2089
  error: error.message
1951
2090
  }));
1952
- console.error(pc4__default.default.red(`Tool failed: ${message.tool} ${error.message}`));
2091
+ console.error(pc5__default.default.red(`Tool failed: ${message.tool} ${error.message}`));
1953
2092
  }
1954
2093
  }
1955
2094
  });
1956
2095
  ws.on("close", () => {
1957
- console.log(pc4__default.default.red("Disconnected from server. Reconnecting in 5s..."));
1958
- statusEmitter.emit("status", { connected: false });
1959
- setTimeout(() => connectToServer2(serverUrl), 5e3);
2096
+ console.log(pc5__default.default.red("Disconnected from server. Reconnecting in 5s..."));
2097
+ setTimeout(() => connectToServer(serverUrl), 5e3);
1960
2098
  });
1961
2099
  ws.on("error", (error) => {
1962
- console.error(pc4__default.default.red(`WebSocket error: ${error.message}`));
1963
- statusEmitter.emit("status", { connected: false });
2100
+ console.error(pc5__default.default.red(`WebSocket error: ${error.message}`));
1964
2101
  });
1965
2102
  return ws;
1966
2103
  }
1967
2104
  async function main() {
1968
2105
  const serverUrl = DEFAULT_SERVER_URL;
1969
- console.log(pc4__default.default.green("Starting local amai..."));
1970
- console.log(pc4__default.default.gray(`Connecting to server at ${serverUrl}`));
1971
- const connection = connectToServer2(serverUrl);
1972
- startHttpServer(connection);
2106
+ console.log(pc5__default.default.green("Starting local amai..."));
2107
+ console.log(pc5__default.default.gray(`Connecting to server at ${serverUrl}`));
2108
+ connectToServer(serverUrl);
2109
+ await connectToUserStreams(serverUrl);
2110
+ startHttpServer();
1973
2111
  }
1974
2112
  var execAsync2 = util.promisify(child_process.exec);
1975
2113
  var CODE_SERVER_VERSION = "4.96.4";
@@ -1998,44 +2136,44 @@ function getDownloadUrl() {
1998
2136
  }
1999
2137
  function getCodeServerDir() {
2000
2138
  const { platform, arch } = getPlatformInfo();
2001
- return path9__default.default.join(CODE_DIR, `code-server-${CODE_SERVER_VERSION}-${platform}-${arch}`);
2139
+ return path11__default.default.join(CODE_DIR, `code-server-${CODE_SERVER_VERSION}-${platform}-${arch}`);
2002
2140
  }
2003
2141
  function getCodeServerBin() {
2004
- return path9__default.default.join(getCodeServerDir(), "bin", "code-server");
2142
+ return path11__default.default.join(getCodeServerDir(), "bin", "code-server");
2005
2143
  }
2006
2144
  function isCodeServerInstalled() {
2007
2145
  const binPath = getCodeServerBin();
2008
- return fs3__default.default.existsSync(binPath);
2146
+ return fs4__default.default.existsSync(binPath);
2009
2147
  }
2010
2148
  async function installCodeServer() {
2011
2149
  const { ext } = getPlatformInfo();
2012
2150
  const downloadUrl = getDownloadUrl();
2013
- const tarballPath = path9__default.default.join(AMA_DIR, `code-server.${ext}`);
2014
- if (!fs3__default.default.existsSync(AMA_DIR)) {
2015
- fs3__default.default.mkdirSync(AMA_DIR, { recursive: true });
2151
+ const tarballPath = path11__default.default.join(AMA_DIR, `code-server.${ext}`);
2152
+ if (!fs4__default.default.existsSync(AMA_DIR)) {
2153
+ fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
2016
2154
  }
2017
- if (!fs3__default.default.existsSync(CODE_DIR)) {
2018
- fs3__default.default.mkdirSync(CODE_DIR, { recursive: true });
2155
+ if (!fs4__default.default.existsSync(CODE_DIR)) {
2156
+ fs4__default.default.mkdirSync(CODE_DIR, { recursive: true });
2019
2157
  }
2020
- if (!fs3__default.default.existsSync(STORAGE_DIR)) {
2021
- fs3__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
2158
+ if (!fs4__default.default.existsSync(STORAGE_DIR)) {
2159
+ fs4__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
2022
2160
  }
2023
- console.log(pc4__default.default.cyan(`Downloading code-server v${CODE_SERVER_VERSION}...`));
2024
- console.log(pc4__default.default.gray(downloadUrl));
2161
+ console.log(pc5__default.default.cyan(`Downloading code-server v${CODE_SERVER_VERSION}...`));
2162
+ console.log(pc5__default.default.gray(downloadUrl));
2025
2163
  const response = await fetch(downloadUrl);
2026
2164
  if (!response.ok) {
2027
2165
  throw new Error(`Failed to download code-server: ${response.statusText}`);
2028
2166
  }
2029
2167
  const buffer = await response.arrayBuffer();
2030
- await fs3__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
2031
- console.log(pc4__default.default.cyan("Extracting code-server..."));
2168
+ await fs4__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
2169
+ console.log(pc5__default.default.cyan("Extracting code-server..."));
2032
2170
  await execAsync2(`tar -xzf ${tarballPath} -C ${CODE_DIR}`);
2033
- await fs3__default.default.promises.unlink(tarballPath);
2171
+ await fs4__default.default.promises.unlink(tarballPath);
2034
2172
  const binPath = getCodeServerBin();
2035
- if (fs3__default.default.existsSync(binPath)) {
2036
- await fs3__default.default.promises.chmod(binPath, 493);
2173
+ if (fs4__default.default.existsSync(binPath)) {
2174
+ await fs4__default.default.promises.chmod(binPath, 493);
2037
2175
  }
2038
- console.log(pc4__default.default.green("\u2713 code-server installed successfully"));
2176
+ console.log(pc5__default.default.green("\u2713 code-server installed successfully"));
2039
2177
  }
2040
2178
  async function killExistingCodeServer() {
2041
2179
  try {
@@ -2058,23 +2196,23 @@ async function killExistingCodeServer() {
2058
2196
  async function startCodeServer(cwd) {
2059
2197
  const binPath = getCodeServerBin();
2060
2198
  const workDir = cwd || process.cwd();
2061
- if (!fs3__default.default.existsSync(binPath)) {
2199
+ if (!fs4__default.default.existsSync(binPath)) {
2062
2200
  throw new Error("code-server is not installed. Run installCodeServer() first.");
2063
2201
  }
2064
2202
  await killExistingCodeServer();
2065
- const workspaceStoragePath = path9__default.default.join(STORAGE_DIR, "User", "workspaceStorage");
2066
- path9__default.default.join(STORAGE_DIR, "User", "globalStorage");
2203
+ const workspaceStoragePath = path11__default.default.join(STORAGE_DIR, "User", "workspaceStorage");
2204
+ path11__default.default.join(STORAGE_DIR, "User", "globalStorage");
2067
2205
  try {
2068
- if (fs3__default.default.existsSync(workspaceStoragePath)) {
2069
- await fs3__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
2206
+ if (fs4__default.default.existsSync(workspaceStoragePath)) {
2207
+ await fs4__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
2070
2208
  }
2071
- const stateDbPath = path9__default.default.join(STORAGE_DIR, "User", "globalStorage", "state.vscdb");
2072
- if (fs3__default.default.existsSync(stateDbPath)) {
2073
- await fs3__default.default.promises.unlink(stateDbPath);
2209
+ const stateDbPath = path11__default.default.join(STORAGE_DIR, "User", "globalStorage", "state.vscdb");
2210
+ if (fs4__default.default.existsSync(stateDbPath)) {
2211
+ await fs4__default.default.promises.unlink(stateDbPath);
2074
2212
  }
2075
2213
  } catch {
2076
2214
  }
2077
- console.log(pc4__default.default.cyan(`Starting code-server in ${workDir}...`));
2215
+ console.log(pc5__default.default.cyan(`Starting code-server in ${workDir}...`));
2078
2216
  const codeServer = child_process.spawn(
2079
2217
  binPath,
2080
2218
  [
@@ -2093,19 +2231,19 @@ async function startCodeServer(cwd) {
2093
2231
  stdio: ["ignore", "pipe", "pipe"]
2094
2232
  }
2095
2233
  );
2096
- console.log(pc4__default.default.green(`\u2713 code-server running at http://localhost:8081/?folder=${encodeURIComponent(workDir)}`));
2234
+ console.log(pc5__default.default.green(`\u2713 code-server running at http://localhost:8081/?folder=${encodeURIComponent(workDir)}`));
2097
2235
  return codeServer;
2098
2236
  }
2099
2237
  var __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli.cjs', document.baseURI).href)));
2100
- var __dirname$1 = path9.dirname(__filename$1);
2101
- var DAEMON_PID_FILE = path9__default.default.join(AMA_DIR, "daemon.pid");
2102
- var DAEMON_LOG_FILE = path9__default.default.join(AMA_DIR, "daemon.log");
2238
+ var __dirname$1 = path11.dirname(__filename$1);
2239
+ var DAEMON_PID_FILE = path11__default.default.join(AMA_DIR, "daemon.pid");
2240
+ var DAEMON_LOG_FILE = path11__default.default.join(AMA_DIR, "daemon.log");
2103
2241
  function isDaemonRunning() {
2104
- if (!fs3__default.default.existsSync(DAEMON_PID_FILE)) {
2242
+ if (!fs4__default.default.existsSync(DAEMON_PID_FILE)) {
2105
2243
  return false;
2106
2244
  }
2107
2245
  try {
2108
- const pid = Number(fs3__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
2246
+ const pid = Number(fs4__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
2109
2247
  process.kill(pid, 0);
2110
2248
  return true;
2111
2249
  } catch {
@@ -2113,30 +2251,30 @@ function isDaemonRunning() {
2113
2251
  }
2114
2252
  }
2115
2253
  function stopDaemon() {
2116
- if (!fs3__default.default.existsSync(DAEMON_PID_FILE)) {
2254
+ if (!fs4__default.default.existsSync(DAEMON_PID_FILE)) {
2117
2255
  return false;
2118
2256
  }
2119
2257
  try {
2120
- const pid = Number(fs3__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
2258
+ const pid = Number(fs4__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
2121
2259
  process.kill(pid, "SIGTERM");
2122
- fs3__default.default.unlinkSync(DAEMON_PID_FILE);
2260
+ fs4__default.default.unlinkSync(DAEMON_PID_FILE);
2123
2261
  return true;
2124
2262
  } catch (error) {
2125
2263
  return false;
2126
2264
  }
2127
2265
  }
2128
2266
  function startDaemon() {
2129
- if (!fs3__default.default.existsSync(AMA_DIR)) {
2130
- fs3__default.default.mkdirSync(AMA_DIR, { recursive: true });
2267
+ if (!fs4__default.default.existsSync(AMA_DIR)) {
2268
+ fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
2131
2269
  }
2132
2270
  if (isDaemonRunning()) {
2133
2271
  stopDaemon();
2134
2272
  }
2135
- const daemonScript = path9__default.default.join(__dirname$1, "lib", "daemon-entry.js");
2136
- if (!fs3__default.default.existsSync(daemonScript)) {
2273
+ const daemonScript = path11__default.default.join(__dirname$1, "lib", "daemon-entry.js");
2274
+ if (!fs4__default.default.existsSync(daemonScript)) {
2137
2275
  throw new Error(`Daemon entry script not found at: ${daemonScript}. Please rebuild the project.`);
2138
2276
  }
2139
- const logFd = fs3__default.default.openSync(DAEMON_LOG_FILE, "a");
2277
+ const logFd = fs4__default.default.openSync(DAEMON_LOG_FILE, "a");
2140
2278
  const daemon = child_process.spawn(process.execPath, [daemonScript], {
2141
2279
  detached: true,
2142
2280
  stdio: ["ignore", logFd, logFd],
@@ -2144,20 +2282,20 @@ function startDaemon() {
2144
2282
  cwd: process.cwd()
2145
2283
  });
2146
2284
  daemon.unref();
2147
- fs3__default.default.writeFileSync(DAEMON_PID_FILE, String(daemon.pid));
2148
- fs3__default.default.closeSync(logFd);
2285
+ fs4__default.default.writeFileSync(DAEMON_PID_FILE, String(daemon.pid));
2286
+ fs4__default.default.closeSync(logFd);
2149
2287
  }
2150
2288
  function getDaemonPid() {
2151
- if (!fs3__default.default.existsSync(DAEMON_PID_FILE)) {
2289
+ if (!fs4__default.default.existsSync(DAEMON_PID_FILE)) {
2152
2290
  return null;
2153
2291
  }
2154
2292
  try {
2155
- return Number(fs3__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
2293
+ return Number(fs4__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
2156
2294
  } catch {
2157
2295
  return null;
2158
2296
  }
2159
2297
  }
2160
- var VERSION = "0.0.5";
2298
+ var VERSION = "0.0.7";
2161
2299
  var PROJECT_DIR = process.cwd();
2162
2300
  function promptUser(question) {
2163
2301
  const rl = readline__default.default.createInterface({
@@ -2173,19 +2311,19 @@ function promptUser(question) {
2173
2311
  }
2174
2312
  async function startWithCodeServer() {
2175
2313
  if (!isCodeServerInstalled()) {
2176
- console.log(pc4__default.default.cyan("First run detected. Setting up code-server..."));
2314
+ console.log(pc5__default.default.cyan("First run detected. Setting up code-server..."));
2177
2315
  try {
2178
2316
  await installCodeServer();
2179
2317
  } catch (error) {
2180
- console.error(pc4__default.default.red(`Failed to install code-server: ${error.message}`));
2181
- console.log(pc4__default.default.yellow("Continuing without code-server..."));
2318
+ console.error(pc5__default.default.red(`Failed to install code-server: ${error.message}`));
2319
+ console.log(pc5__default.default.yellow("Continuing without code-server..."));
2182
2320
  }
2183
2321
  }
2184
2322
  if (isCodeServerInstalled()) {
2185
2323
  try {
2186
2324
  await startCodeServer(PROJECT_DIR);
2187
2325
  } catch (error) {
2188
- console.error(pc4__default.default.red(`Failed to start code-server: ${error.message}`));
2326
+ console.error(pc5__default.default.red(`Failed to start code-server: ${error.message}`));
2189
2327
  }
2190
2328
  }
2191
2329
  main();
@@ -2193,7 +2331,7 @@ async function startWithCodeServer() {
2193
2331
  var args = process.argv.slice(2);
2194
2332
  if (args[0] === "--help" || args[0] === "-h") {
2195
2333
  console.log(`
2196
- ${pc4__default.default.bold("amai cli")} ${pc4__default.default.gray(VERSION)}
2334
+ ${pc5__default.default.bold("amai cli")} ${pc5__default.default.gray(VERSION)}
2197
2335
 
2198
2336
  Usage: amai [command] [options]
2199
2337
 
@@ -2221,32 +2359,32 @@ Example:
2221
2359
  }
2222
2360
  if (args[0] === "start") {
2223
2361
  if (isDaemonRunning()) {
2224
- console.log(pc4__default.default.yellow("Daemon is already running"));
2362
+ console.log(pc5__default.default.yellow("Daemon is already running"));
2225
2363
  process.exit(0);
2226
2364
  }
2227
2365
  if (!isAuthenticated()) {
2228
- console.log(pc4__default.default.yellow("Not authenticated. Please log in first."));
2366
+ console.log(pc5__default.default.yellow("Not authenticated. Please log in first."));
2229
2367
  login().then(() => {
2230
- console.log(pc4__default.default.green("Starting daemon..."));
2368
+ console.log(pc5__default.default.green("Starting daemon..."));
2231
2369
  startDaemon();
2232
- console.log(pc4__default.default.green("Daemon started successfully"));
2370
+ console.log(pc5__default.default.green("Daemon started successfully"));
2233
2371
  process.exit(0);
2234
2372
  }).catch(() => {
2235
- console.error(pc4__default.default.red("Login failed. Cannot start daemon."));
2373
+ console.error(pc5__default.default.red("Login failed. Cannot start daemon."));
2236
2374
  process.exit(1);
2237
2375
  });
2238
2376
  } else {
2239
2377
  startDaemon();
2240
- console.log(pc4__default.default.green(pc4__default.default.bold("amai started in background mode")));
2241
- console.log(pc4__default.default.gray(`Tip: You can check status any time with ${pc4__default.default.bold("amai status")}`));
2378
+ console.log(pc5__default.default.green(pc5__default.default.bold("amai started in background mode")));
2379
+ console.log(pc5__default.default.gray(`Tip: You can check status any time with ${pc5__default.default.bold("amai status")}`));
2242
2380
  process.exit(0);
2243
2381
  }
2244
2382
  }
2245
2383
  if (args[0] === "stop") {
2246
2384
  if (stopDaemon()) {
2247
- console.log(pc4__default.default.green("Daemon stopped successfully"));
2385
+ console.log(pc5__default.default.green("Daemon stopped successfully"));
2248
2386
  } else {
2249
- console.log(pc4__default.default.yellow("Daemon was not running"));
2387
+ console.log(pc5__default.default.yellow("Daemon was not running"));
2250
2388
  }
2251
2389
  process.exit(0);
2252
2390
  }
@@ -2254,9 +2392,9 @@ if (args[0] === "status") {
2254
2392
  const running = isDaemonRunning();
2255
2393
  const pid = getDaemonPid();
2256
2394
  if (running && pid) {
2257
- console.log(pc4__default.default.green(`Daemon is running (PID: ${pid})`));
2395
+ console.log(pc5__default.default.green(`Daemon is running (PID: ${pid})`));
2258
2396
  } else {
2259
- console.log(pc4__default.default.yellow("Daemon is not running"));
2397
+ console.log(pc5__default.default.yellow("Daemon is not running"));
2260
2398
  }
2261
2399
  process.exit(0);
2262
2400
  }
@@ -2264,36 +2402,36 @@ if (args[0] === "project") {
2264
2402
  if (args[1] === "add") {
2265
2403
  const projectPath = args[2];
2266
2404
  if (!projectPath) {
2267
- console.error(pc4__default.default.red("Please provide a project path"));
2405
+ console.error(pc5__default.default.red("Please provide a project path"));
2268
2406
  console.log("Usage: amai project add <path>");
2269
2407
  process.exit(1);
2270
2408
  }
2271
- const resolvedPath = path9__default.default.resolve(projectPath);
2272
- if (!fs3__default.default.existsSync(resolvedPath)) {
2273
- console.error(pc4__default.default.red(`Path does not exist: ${resolvedPath}`));
2409
+ const resolvedPath = path11__default.default.resolve(projectPath);
2410
+ if (!fs4__default.default.existsSync(resolvedPath)) {
2411
+ console.error(pc5__default.default.red(`Path does not exist: ${resolvedPath}`));
2274
2412
  process.exit(1);
2275
2413
  }
2276
- if (!fs3__default.default.statSync(resolvedPath).isDirectory()) {
2277
- console.error(pc4__default.default.red(`Path is not a directory: ${resolvedPath}`));
2414
+ if (!fs4__default.default.statSync(resolvedPath).isDirectory()) {
2415
+ console.error(pc5__default.default.red(`Path is not a directory: ${resolvedPath}`));
2278
2416
  process.exit(1);
2279
2417
  }
2280
- const projectId = path9__default.default.basename(resolvedPath);
2418
+ const projectId = path11__default.default.basename(resolvedPath);
2281
2419
  projectRegistry.register(projectId, resolvedPath);
2282
- console.log(pc4__default.default.green(`Project registered: ${projectId} -> ${resolvedPath}`));
2420
+ console.log(pc5__default.default.green(`Project registered: ${projectId} -> ${resolvedPath}`));
2283
2421
  process.exit(0);
2284
2422
  } else if (args[1] === "list") {
2285
2423
  const projects = projectRegistry.list();
2286
2424
  if (projects.length === 0) {
2287
- console.log(pc4__default.default.yellow("No projects registered"));
2425
+ console.log(pc5__default.default.yellow("No projects registered"));
2288
2426
  } else {
2289
- console.log(pc4__default.default.bold("Registered projects:"));
2427
+ console.log(pc5__default.default.bold("Registered projects:"));
2290
2428
  projects.forEach((project) => {
2291
- console.log(` ${pc4__default.default.cyan(project.id)}: ${project.cwd} ${project.active ? pc4__default.default.green("(active)") : ""}`);
2429
+ console.log(` ${pc5__default.default.cyan(project.id)}: ${project.cwd} ${project.active ? pc5__default.default.green("(active)") : ""}`);
2292
2430
  });
2293
2431
  }
2294
2432
  process.exit(0);
2295
2433
  } else {
2296
- console.error(pc4__default.default.red(`Unknown project command: ${args[1]}`));
2434
+ console.error(pc5__default.default.red(`Unknown project command: ${args[1]}`));
2297
2435
  console.log('Use "amai project add <path>" or "amai project list"');
2298
2436
  process.exit(1);
2299
2437
  }
@@ -2302,39 +2440,39 @@ if (args[0] === "login" || args[0] === "--login") {
2302
2440
  login().then(() => process.exit(0)).catch(() => process.exit(1));
2303
2441
  } else if (args[0] === "logout" || args[0] === "--logout") {
2304
2442
  logout();
2305
- console.log(pc4__default.default.green("Logged out successfully"));
2443
+ console.log(pc5__default.default.green("Logged out successfully"));
2306
2444
  process.exit(0);
2307
2445
  } else {
2308
2446
  (async () => {
2309
2447
  if (!isAuthenticated()) {
2310
- console.log(pc4__default.default.yellow("Not authenticated. Please log in first."));
2448
+ console.log(pc5__default.default.yellow("Not authenticated. Please log in first."));
2311
2449
  try {
2312
2450
  await login();
2313
2451
  } catch {
2314
- console.error(pc4__default.default.red("Login failed. Cannot start server."));
2452
+ console.error(pc5__default.default.red("Login failed. Cannot start server."));
2315
2453
  process.exit(1);
2316
2454
  }
2317
2455
  }
2318
2456
  if (isDaemonRunning()) {
2319
- console.log(pc4__default.default.yellow('Daemon is already running. Use "amai status" to check its status.'));
2457
+ console.log(pc5__default.default.yellow('Daemon is already running. Use "amai status" to check its status.'));
2320
2458
  process.exit(0);
2321
2459
  }
2322
2460
  console.log("");
2323
- console.log(pc4__default.default.bold("How would you like to run amai?"));
2324
- console.log(pc4__default.default.gray("Background mode is highly recommended for better performance and stability."));
2461
+ console.log(pc5__default.default.bold("How would you like to run amai?"));
2462
+ console.log(pc5__default.default.gray("Background mode is highly recommended for better performance and stability."));
2325
2463
  const answer = await promptUser(
2326
- pc4__default.default.cyan("Run in background? (Y/n): ")
2464
+ pc5__default.default.cyan("Run in background? (Y/n): ")
2327
2465
  );
2328
2466
  const runInBackground = answer === "" || answer.toLowerCase() === "y" || answer.toLowerCase() === "yes";
2329
2467
  if (runInBackground) {
2330
- console.log(pc4__default.default.green("Starting daemon in background..."));
2468
+ console.log(pc5__default.default.green("Starting daemon in background..."));
2331
2469
  startDaemon();
2332
- console.log(pc4__default.default.green("Daemon started successfully!"));
2333
- console.log(pc4__default.default.gray('Use "amai status" to check daemon status.'));
2334
- console.log(pc4__default.default.gray('Use "amai stop" to stop the daemon.'));
2470
+ console.log(pc5__default.default.green("Daemon started successfully!"));
2471
+ console.log(pc5__default.default.gray('Use "amai status" to check daemon status.'));
2472
+ console.log(pc5__default.default.gray('Use "amai stop" to stop the daemon.'));
2335
2473
  process.exit(0);
2336
2474
  } else {
2337
- console.log(pc4__default.default.yellow("Starting in foreground mode..."));
2475
+ console.log(pc5__default.default.yellow("Starting in foreground mode..."));
2338
2476
  startWithCodeServer();
2339
2477
  }
2340
2478
  })();