amai 0.0.6 → 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 +249 -305
- package/dist/cli.js +244 -300
- package/dist/lib/daemon-entry.cjs +221 -277
- package/dist/lib/daemon-entry.js +217 -273
- package/dist/server.cjs +195 -248
- package/dist/server.js +192 -245
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var pc5 = require('picocolors');
|
|
5
|
-
var
|
|
5
|
+
var WebSocket = require('ws');
|
|
6
6
|
var zod = require('zod');
|
|
7
7
|
var promises = require('fs/promises');
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
8
|
+
var path11 = require('path');
|
|
9
|
+
var fs4 = require('fs');
|
|
10
|
+
var os3 = require('os');
|
|
11
11
|
var crypto = require('crypto');
|
|
12
12
|
var child_process = require('child_process');
|
|
13
13
|
var util = require('util');
|
|
@@ -21,20 +21,20 @@ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentS
|
|
|
21
21
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
22
|
|
|
23
23
|
var pc5__default = /*#__PURE__*/_interopDefault(pc5);
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
var
|
|
27
|
-
var
|
|
24
|
+
var WebSocket__default = /*#__PURE__*/_interopDefault(WebSocket);
|
|
25
|
+
var path11__default = /*#__PURE__*/_interopDefault(path11);
|
|
26
|
+
var fs4__default = /*#__PURE__*/_interopDefault(fs4);
|
|
27
|
+
var os3__default = /*#__PURE__*/_interopDefault(os3);
|
|
28
28
|
var readline__default = /*#__PURE__*/_interopDefault(readline);
|
|
29
29
|
|
|
30
30
|
var DEFAULT_SERVER_URL = "wss://ama-production-a628.up.railway.app";
|
|
31
31
|
var CLIENT_ID = "client_01K4Y8A67H544Z6J8A47E5GJ9A";
|
|
32
|
-
var AMA_DIR =
|
|
33
|
-
var CODE_DIR =
|
|
34
|
-
var STORAGE_DIR =
|
|
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");
|
|
35
35
|
|
|
36
36
|
// src/lib/project-registry.ts
|
|
37
|
-
var REGISTRY_FILE =
|
|
37
|
+
var REGISTRY_FILE = path11__default.default.join(AMA_DIR, "projects.json");
|
|
38
38
|
var ProjectRegistry = class {
|
|
39
39
|
projects = /* @__PURE__ */ new Map();
|
|
40
40
|
constructor() {
|
|
@@ -42,14 +42,14 @@ var ProjectRegistry = class {
|
|
|
42
42
|
}
|
|
43
43
|
load() {
|
|
44
44
|
try {
|
|
45
|
-
if (
|
|
46
|
-
const data =
|
|
45
|
+
if (fs4__default.default.existsSync(REGISTRY_FILE)) {
|
|
46
|
+
const data = fs4__default.default.readFileSync(REGISTRY_FILE, "utf8");
|
|
47
47
|
const parsed = JSON.parse(data);
|
|
48
48
|
if (!Array.isArray(parsed)) {
|
|
49
49
|
console.error("Invalid project registry format: expected array, got", typeof parsed);
|
|
50
50
|
const backupFile = REGISTRY_FILE + ".backup." + Date.now();
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
|
|
52
|
+
fs4__default.default.unlinkSync(REGISTRY_FILE);
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
55
|
const projects = parsed;
|
|
@@ -62,11 +62,11 @@ var ProjectRegistry = class {
|
|
|
62
62
|
}
|
|
63
63
|
} catch (error) {
|
|
64
64
|
console.error("Failed to load project registry:", error);
|
|
65
|
-
if (
|
|
65
|
+
if (fs4__default.default.existsSync(REGISTRY_FILE)) {
|
|
66
66
|
try {
|
|
67
67
|
const backupFile = REGISTRY_FILE + ".backup." + Date.now();
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
fs4__default.default.copyFileSync(REGISTRY_FILE, backupFile);
|
|
69
|
+
fs4__default.default.unlinkSync(REGISTRY_FILE);
|
|
70
70
|
console.log("Corrupted registry file backed up and removed. Starting fresh.");
|
|
71
71
|
} catch (backupError) {
|
|
72
72
|
}
|
|
@@ -75,21 +75,21 @@ var ProjectRegistry = class {
|
|
|
75
75
|
}
|
|
76
76
|
save() {
|
|
77
77
|
try {
|
|
78
|
-
if (!
|
|
79
|
-
|
|
78
|
+
if (!fs4__default.default.existsSync(AMA_DIR)) {
|
|
79
|
+
fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
|
|
80
80
|
}
|
|
81
81
|
const projects = Array.from(this.projects.values());
|
|
82
|
-
|
|
82
|
+
fs4__default.default.writeFileSync(REGISTRY_FILE, JSON.stringify(projects, null, 2), "utf8");
|
|
83
83
|
} catch (error) {
|
|
84
84
|
console.error("Failed to save project registry:", error);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
register(projectId, cwd, name) {
|
|
88
|
-
const normalizedCwd =
|
|
88
|
+
const normalizedCwd = path11__default.default.normalize(path11__default.default.resolve(cwd));
|
|
89
89
|
this.projects.set(projectId, {
|
|
90
90
|
id: projectId,
|
|
91
91
|
cwd: normalizedCwd,
|
|
92
|
-
name: name ||
|
|
92
|
+
name: name || path11__default.default.basename(normalizedCwd),
|
|
93
93
|
active: true
|
|
94
94
|
});
|
|
95
95
|
this.save();
|
|
@@ -119,9 +119,9 @@ var ProjectRegistry = class {
|
|
|
119
119
|
var projectRegistry = new ProjectRegistry();
|
|
120
120
|
function isPathWithinProject(filePath, projectCwd) {
|
|
121
121
|
try {
|
|
122
|
-
const resolved =
|
|
123
|
-
const normalized =
|
|
124
|
-
const normalizedCwd =
|
|
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);
|
|
125
125
|
return normalized.startsWith(normalizedCwd);
|
|
126
126
|
} catch {
|
|
127
127
|
return false;
|
|
@@ -137,7 +137,7 @@ function validatePath(filePath, projectCwd) {
|
|
|
137
137
|
};
|
|
138
138
|
}
|
|
139
139
|
try {
|
|
140
|
-
const resolvedPath =
|
|
140
|
+
const resolvedPath = path11__default.default.resolve(projectCwd, filePath);
|
|
141
141
|
if (!isPathWithinProject(filePath, projectCwd)) {
|
|
142
142
|
return {
|
|
143
143
|
valid: false,
|
|
@@ -156,7 +156,7 @@ function validatePath(filePath, projectCwd) {
|
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
158
|
function resolveProjectPath(filePath, projectCwd) {
|
|
159
|
-
return
|
|
159
|
+
return path11__default.default.resolve(projectCwd, filePath);
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
// src/tools/read-file.ts
|
|
@@ -278,7 +278,7 @@ var read_file = async function(input, projectCwd) {
|
|
|
278
278
|
};
|
|
279
279
|
}
|
|
280
280
|
} else {
|
|
281
|
-
const absolute_file_path =
|
|
281
|
+
const absolute_file_path = path11__default.default.resolve(relative_file_path);
|
|
282
282
|
try {
|
|
283
283
|
const fileStats = await promises.stat(absolute_file_path);
|
|
284
284
|
if (!fileStats.isFile()) {
|
|
@@ -872,20 +872,20 @@ var editFiles = async function(input, projectCwd) {
|
|
|
872
872
|
}
|
|
873
873
|
const basePath = projectCwd || process.cwd();
|
|
874
874
|
const filePath = resolveProjectPath(target_file, basePath);
|
|
875
|
-
const dirPath =
|
|
875
|
+
const dirPath = path11__default.default.dirname(filePath);
|
|
876
876
|
await promises.mkdir(dirPath, { recursive: true });
|
|
877
877
|
let isNewFile = providedNewFile;
|
|
878
878
|
let existingContent = "";
|
|
879
879
|
if (isNewFile === void 0) {
|
|
880
880
|
try {
|
|
881
|
-
existingContent = await
|
|
881
|
+
existingContent = await fs4__default.default.promises.readFile(filePath, "utf-8");
|
|
882
882
|
isNewFile = false;
|
|
883
883
|
} catch (error) {
|
|
884
884
|
isNewFile = true;
|
|
885
885
|
}
|
|
886
886
|
} else if (!isNewFile) {
|
|
887
887
|
try {
|
|
888
|
-
existingContent = await
|
|
888
|
+
existingContent = await fs4__default.default.promises.readFile(filePath, "utf-8");
|
|
889
889
|
} catch (error) {
|
|
890
890
|
isNewFile = true;
|
|
891
891
|
}
|
|
@@ -898,7 +898,7 @@ var editFiles = async function(input, projectCwd) {
|
|
|
898
898
|
content
|
|
899
899
|
);
|
|
900
900
|
try {
|
|
901
|
-
await
|
|
901
|
+
await fs4__default.default.promises.writeFile(filePath, content);
|
|
902
902
|
} catch (writeError) {
|
|
903
903
|
checkpointStore.removeCheckpoint(checkpointId);
|
|
904
904
|
throw writeError;
|
|
@@ -1022,7 +1022,7 @@ var grepTool = async function(input, projectCwd) {
|
|
|
1022
1022
|
try {
|
|
1023
1023
|
const { includePattern, excludePattern: excludePattern2, caseSensitive } = options || {};
|
|
1024
1024
|
const searchDir = projectCwd || process.cwd();
|
|
1025
|
-
if (projectCwd && !
|
|
1025
|
+
if (projectCwd && !path11__default.default.isAbsolute(projectCwd)) {
|
|
1026
1026
|
return {
|
|
1027
1027
|
success: false,
|
|
1028
1028
|
message: "Invalid project directory",
|
|
@@ -1214,8 +1214,8 @@ var list = async function(input, projectCwd) {
|
|
|
1214
1214
|
const walk = async (currentDir, depth) => {
|
|
1215
1215
|
const entries = await promises.readdir(currentDir, { withFileTypes: true });
|
|
1216
1216
|
for (const entry of entries) {
|
|
1217
|
-
const entryAbsolutePath =
|
|
1218
|
-
const entryRelativePath =
|
|
1217
|
+
const entryAbsolutePath = path11__default.default.join(currentDir, entry.name);
|
|
1218
|
+
const entryRelativePath = path11__default.default.relative(absolutePath, entryAbsolutePath) || ".";
|
|
1219
1219
|
if (entry.isDirectory()) {
|
|
1220
1220
|
const isExcluded = entry.name.match(excludePattern);
|
|
1221
1221
|
if (includeDirectoriesNormalized && matchPattern(entry.name) && !isExcluded) {
|
|
@@ -1265,203 +1265,9 @@ var list = async function(input, projectCwd) {
|
|
|
1265
1265
|
};
|
|
1266
1266
|
}
|
|
1267
1267
|
};
|
|
1268
|
-
var
|
|
1269
|
-
var getContext = (dir, base = dir, allFiles = []) => {
|
|
1270
|
-
const filePath = fs3.readdirSync(dir, { withFileTypes: true });
|
|
1271
|
-
for (const file of filePath) {
|
|
1272
|
-
if (ignoreFiles.includes(file.name)) continue;
|
|
1273
|
-
const fullPath = path9__default.default.join(dir, file.name);
|
|
1274
|
-
if (file.isDirectory()) {
|
|
1275
|
-
getContext(fullPath, base, allFiles);
|
|
1276
|
-
} else {
|
|
1277
|
-
allFiles.push(path9__default.default.relative(base, fullPath));
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
return allFiles;
|
|
1281
|
-
};
|
|
1282
|
-
var HOME = os2__default.default.homedir();
|
|
1283
|
-
var IDE_PROJECTS_PATHS = {
|
|
1284
|
-
vscode: path9__default.default.join(HOME, ".vscode", "projects"),
|
|
1285
|
-
cursor: path9__default.default.join(HOME, ".cursor", "projects"),
|
|
1286
|
-
claude: path9__default.default.join(HOME, ".claude", "projects")
|
|
1287
|
-
};
|
|
1288
|
-
function getWorkspaceStoragePath(ide) {
|
|
1289
|
-
const platform = os2__default.default.platform();
|
|
1290
|
-
const appName = "Cursor" ;
|
|
1291
|
-
if (platform === "darwin") {
|
|
1292
|
-
return path9__default.default.join(HOME, "Library", "Application Support", appName, "User", "workspaceStorage");
|
|
1293
|
-
} else if (platform === "win32") {
|
|
1294
|
-
return path9__default.default.join(process.env.APPDATA || "", appName, "User", "workspaceStorage");
|
|
1295
|
-
} else {
|
|
1296
|
-
return path9__default.default.join(HOME, ".config", appName, "User", "workspaceStorage");
|
|
1297
|
-
}
|
|
1298
|
-
}
|
|
1299
|
-
function scanWorkspaceStorage(ide) {
|
|
1300
|
-
const projects = [];
|
|
1301
|
-
const storagePath = getWorkspaceStoragePath();
|
|
1302
|
-
if (!fs3__default.default.existsSync(storagePath)) {
|
|
1303
|
-
return projects;
|
|
1304
|
-
}
|
|
1305
|
-
try {
|
|
1306
|
-
const workspaces = fs3__default.default.readdirSync(storagePath);
|
|
1307
|
-
for (const workspace of workspaces) {
|
|
1308
|
-
const workspaceJsonPath = path9__default.default.join(storagePath, workspace, "workspace.json");
|
|
1309
|
-
if (fs3__default.default.existsSync(workspaceJsonPath)) {
|
|
1310
|
-
try {
|
|
1311
|
-
const content = fs3__default.default.readFileSync(workspaceJsonPath, "utf-8");
|
|
1312
|
-
const data = JSON.parse(content);
|
|
1313
|
-
if (data.folder && typeof data.folder === "string") {
|
|
1314
|
-
let projectPath = data.folder;
|
|
1315
|
-
if (projectPath.startsWith("file://")) {
|
|
1316
|
-
projectPath = projectPath.replace("file://", "");
|
|
1317
|
-
projectPath = decodeURIComponent(projectPath);
|
|
1318
|
-
}
|
|
1319
|
-
if (fs3__default.default.existsSync(projectPath) && fs3__default.default.statSync(projectPath).isDirectory()) {
|
|
1320
|
-
projects.push({
|
|
1321
|
-
name: path9__default.default.basename(projectPath),
|
|
1322
|
-
path: projectPath,
|
|
1323
|
-
type: ide
|
|
1324
|
-
});
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
} catch (err) {
|
|
1328
|
-
console.debug(`Error reading workspace.json at ${workspaceJsonPath}: ${err}`);
|
|
1329
|
-
}
|
|
1330
|
-
}
|
|
1331
|
-
}
|
|
1332
|
-
} catch (err) {
|
|
1333
|
-
console.debug(`Error scanning workspaceStorage for ${ide}: ${err}`);
|
|
1334
|
-
}
|
|
1335
|
-
return projects;
|
|
1336
|
-
}
|
|
1337
|
-
var scanIdeProjects = async () => {
|
|
1338
|
-
try {
|
|
1339
|
-
const allProjects = [];
|
|
1340
|
-
const seenPaths = /* @__PURE__ */ new Set();
|
|
1341
|
-
const addProject = (projectPath, ide) => {
|
|
1342
|
-
try {
|
|
1343
|
-
const resolvedPath = fs3__default.default.realpathSync(projectPath);
|
|
1344
|
-
if (fs3__default.default.existsSync(resolvedPath) && fs3__default.default.statSync(resolvedPath).isDirectory() && !seenPaths.has(resolvedPath)) {
|
|
1345
|
-
const isIdeProjectsDir = Object.values(IDE_PROJECTS_PATHS).some((ideDir) => {
|
|
1346
|
-
try {
|
|
1347
|
-
return fs3__default.default.realpathSync(ideDir) === resolvedPath;
|
|
1348
|
-
} catch {
|
|
1349
|
-
return false;
|
|
1350
|
-
}
|
|
1351
|
-
});
|
|
1352
|
-
if (!isIdeProjectsDir) {
|
|
1353
|
-
seenPaths.add(resolvedPath);
|
|
1354
|
-
allProjects.push({
|
|
1355
|
-
name: path9__default.default.basename(resolvedPath),
|
|
1356
|
-
path: resolvedPath,
|
|
1357
|
-
type: ide
|
|
1358
|
-
});
|
|
1359
|
-
}
|
|
1360
|
-
}
|
|
1361
|
-
} catch {
|
|
1362
|
-
}
|
|
1363
|
-
};
|
|
1364
|
-
const cursorProjects = scanWorkspaceStorage("cursor");
|
|
1365
|
-
for (const project of cursorProjects) {
|
|
1366
|
-
addProject(project.path, "cursor");
|
|
1367
|
-
}
|
|
1368
|
-
for (const [ide, dirPath] of Object.entries(IDE_PROJECTS_PATHS)) {
|
|
1369
|
-
if (ide === "cursor") continue;
|
|
1370
|
-
if (fs3__default.default.existsSync(dirPath)) {
|
|
1371
|
-
const projects = fs3__default.default.readdirSync(dirPath);
|
|
1372
|
-
projects.forEach((project) => {
|
|
1373
|
-
const projectPath = path9__default.default.join(dirPath, project);
|
|
1374
|
-
try {
|
|
1375
|
-
const stats = fs3__default.default.lstatSync(projectPath);
|
|
1376
|
-
let actualPath = null;
|
|
1377
|
-
if (stats.isSymbolicLink()) {
|
|
1378
|
-
actualPath = fs3__default.default.realpathSync(projectPath);
|
|
1379
|
-
} else if (stats.isFile()) {
|
|
1380
|
-
try {
|
|
1381
|
-
let content = fs3__default.default.readFileSync(projectPath, "utf-8").trim();
|
|
1382
|
-
if (content.startsWith("~/") || content === "~") {
|
|
1383
|
-
content = content.replace(/^~/, HOME);
|
|
1384
|
-
}
|
|
1385
|
-
const resolvedContent = path9__default.default.isAbsolute(content) ? content : path9__default.default.resolve(path9__default.default.dirname(projectPath), content);
|
|
1386
|
-
if (fs3__default.default.existsSync(resolvedContent) && fs3__default.default.statSync(resolvedContent).isDirectory()) {
|
|
1387
|
-
actualPath = fs3__default.default.realpathSync(resolvedContent);
|
|
1388
|
-
}
|
|
1389
|
-
} catch {
|
|
1390
|
-
return;
|
|
1391
|
-
}
|
|
1392
|
-
} else if (stats.isDirectory()) {
|
|
1393
|
-
actualPath = fs3__default.default.realpathSync(projectPath);
|
|
1394
|
-
}
|
|
1395
|
-
if (actualPath) {
|
|
1396
|
-
addProject(actualPath, ide);
|
|
1397
|
-
}
|
|
1398
|
-
} catch {
|
|
1399
|
-
}
|
|
1400
|
-
});
|
|
1401
|
-
}
|
|
1402
|
-
}
|
|
1403
|
-
return allProjects;
|
|
1404
|
-
} catch (error) {
|
|
1405
|
-
console.debug(`Error scanning IDE projects: ${error}`);
|
|
1406
|
-
return [];
|
|
1407
|
-
}
|
|
1408
|
-
};
|
|
1409
|
-
var wsConnection = null;
|
|
1410
|
-
var startHttpServer = (connection) => {
|
|
1411
|
-
if (connection) {
|
|
1412
|
-
wsConnection = connection;
|
|
1413
|
-
}
|
|
1268
|
+
var startHttpServer = () => {
|
|
1414
1269
|
const app = new hono.Hono();
|
|
1415
1270
|
app.use(cors.cors());
|
|
1416
|
-
app.post("/daemon/status", (c) => {
|
|
1417
|
-
const status = wsConnection ? getConnectionStatus(wsConnection) : "closed";
|
|
1418
|
-
return c.json({ connected: status === "open" });
|
|
1419
|
-
});
|
|
1420
|
-
app.get("/daemon/status/stream", (c) => {
|
|
1421
|
-
const encoder = new TextEncoder();
|
|
1422
|
-
const stream = new ReadableStream({
|
|
1423
|
-
start(controller) {
|
|
1424
|
-
const initialStatus = wsConnection ? getConnectionStatus(wsConnection) : "closed";
|
|
1425
|
-
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ connected: initialStatus === "open" })}
|
|
1426
|
-
|
|
1427
|
-
`));
|
|
1428
|
-
const heartbeatInterval = setInterval(() => {
|
|
1429
|
-
try {
|
|
1430
|
-
const currentStatus = wsConnection ? getConnectionStatus(wsConnection) : "closed";
|
|
1431
|
-
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ connected: currentStatus === "open" })}
|
|
1432
|
-
|
|
1433
|
-
`));
|
|
1434
|
-
} catch {
|
|
1435
|
-
}
|
|
1436
|
-
}, 15e3);
|
|
1437
|
-
c.req.raw.signal.addEventListener("abort", () => {
|
|
1438
|
-
clearInterval(heartbeatInterval);
|
|
1439
|
-
});
|
|
1440
|
-
}
|
|
1441
|
-
});
|
|
1442
|
-
return new Response(stream, {
|
|
1443
|
-
headers: {
|
|
1444
|
-
"Content-Type": "text/event-stream",
|
|
1445
|
-
"Cache-Control": "no-cache",
|
|
1446
|
-
"Connection": "keep-alive"
|
|
1447
|
-
}
|
|
1448
|
-
});
|
|
1449
|
-
});
|
|
1450
|
-
app.get("context", async (c) => {
|
|
1451
|
-
const context = getContext(process.cwd());
|
|
1452
|
-
return c.body(JSON.stringify(context));
|
|
1453
|
-
});
|
|
1454
|
-
app.get("/ide-projects", async (c) => {
|
|
1455
|
-
try {
|
|
1456
|
-
const projects = await scanIdeProjects();
|
|
1457
|
-
if (!projects) {
|
|
1458
|
-
return c.json({ error: "No projects found" }, 500);
|
|
1459
|
-
}
|
|
1460
|
-
return c.json({ projects });
|
|
1461
|
-
} catch (error) {
|
|
1462
|
-
return c.json({ error: "Failed to scan IDE projects" }, 500);
|
|
1463
|
-
}
|
|
1464
|
-
});
|
|
1465
1271
|
app.post("/projects/register", async (c) => {
|
|
1466
1272
|
try {
|
|
1467
1273
|
const { projectId, cwd, name } = await c.req.json();
|
|
@@ -1490,14 +1296,14 @@ var startHttpServer = (connection) => {
|
|
|
1490
1296
|
}
|
|
1491
1297
|
let resolved;
|
|
1492
1298
|
if (projectCwd) {
|
|
1493
|
-
resolved =
|
|
1494
|
-
const normalizedResolved =
|
|
1495
|
-
const normalizedCwd =
|
|
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);
|
|
1496
1302
|
if (!normalizedResolved.startsWith(normalizedCwd)) {
|
|
1497
1303
|
return c.json({ error: "Path is outside project directory" }, 403);
|
|
1498
1304
|
}
|
|
1499
1305
|
} else {
|
|
1500
|
-
resolved =
|
|
1306
|
+
resolved = path11__default.default.isAbsolute(filePath) ? filePath : path11__default.default.join(process.cwd(), filePath);
|
|
1501
1307
|
}
|
|
1502
1308
|
let currentContent;
|
|
1503
1309
|
try {
|
|
@@ -1584,9 +1390,9 @@ var startHttpServer = (connection) => {
|
|
|
1584
1390
|
}
|
|
1585
1391
|
let resolved;
|
|
1586
1392
|
if (projectCwd) {
|
|
1587
|
-
resolved =
|
|
1588
|
-
const normalizedResolved =
|
|
1589
|
-
const normalizedCwd =
|
|
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);
|
|
1590
1396
|
if (!normalizedResolved.startsWith(normalizedCwd)) {
|
|
1591
1397
|
return c.json({ error: "Path is outside project directory" }, 403);
|
|
1592
1398
|
}
|
|
@@ -1649,14 +1455,14 @@ var startHttpServer = (connection) => {
|
|
|
1649
1455
|
nodeServer.serve({ fetch: app.fetch, port: 3456 });
|
|
1650
1456
|
};
|
|
1651
1457
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
1652
|
-
var CREDENTIALS_DIR =
|
|
1653
|
-
var CREDENTIALS_PATH =
|
|
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");
|
|
1654
1460
|
function isAuthenticated() {
|
|
1655
1461
|
try {
|
|
1656
|
-
if (!
|
|
1462
|
+
if (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1657
1463
|
return false;
|
|
1658
1464
|
}
|
|
1659
|
-
const raw =
|
|
1465
|
+
const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1660
1466
|
const data = JSON.parse(raw);
|
|
1661
1467
|
return Boolean(data && data.access_token);
|
|
1662
1468
|
} catch {
|
|
@@ -1665,10 +1471,10 @@ function isAuthenticated() {
|
|
|
1665
1471
|
}
|
|
1666
1472
|
function saveTokens(tokens) {
|
|
1667
1473
|
try {
|
|
1668
|
-
if (!
|
|
1669
|
-
|
|
1474
|
+
if (!fs4__default.default.existsSync(CREDENTIALS_DIR)) {
|
|
1475
|
+
fs4__default.default.mkdirSync(CREDENTIALS_DIR, { recursive: true });
|
|
1670
1476
|
}
|
|
1671
|
-
|
|
1477
|
+
fs4__default.default.writeFileSync(
|
|
1672
1478
|
CREDENTIALS_PATH,
|
|
1673
1479
|
JSON.stringify(tokens, null, 2),
|
|
1674
1480
|
"utf8"
|
|
@@ -1679,18 +1485,18 @@ function saveTokens(tokens) {
|
|
|
1679
1485
|
}
|
|
1680
1486
|
function logout() {
|
|
1681
1487
|
try {
|
|
1682
|
-
if (
|
|
1683
|
-
|
|
1488
|
+
if (fs4__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1489
|
+
fs4__default.default.unlinkSync(CREDENTIALS_PATH);
|
|
1684
1490
|
}
|
|
1685
1491
|
} catch (error) {
|
|
1686
1492
|
console.error(pc5__default.default.red("Failed to logout"), error);
|
|
1687
1493
|
}
|
|
1688
1494
|
}
|
|
1689
1495
|
function getTokens() {
|
|
1690
|
-
if (!
|
|
1496
|
+
if (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1691
1497
|
return null;
|
|
1692
1498
|
}
|
|
1693
|
-
const raw =
|
|
1499
|
+
const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1694
1500
|
const data = JSON.parse(raw);
|
|
1695
1501
|
return data;
|
|
1696
1502
|
}
|
|
@@ -1800,10 +1606,10 @@ async function login() {
|
|
|
1800
1606
|
}
|
|
1801
1607
|
var getUserId = () => {
|
|
1802
1608
|
try {
|
|
1803
|
-
if (!
|
|
1609
|
+
if (!fs4__default.default.existsSync(CREDENTIALS_PATH)) {
|
|
1804
1610
|
return;
|
|
1805
1611
|
}
|
|
1806
|
-
const raw =
|
|
1612
|
+
const raw = fs4__default.default.readFileSync(CREDENTIALS_PATH, "utf8");
|
|
1807
1613
|
const data = JSON.parse(raw);
|
|
1808
1614
|
return {
|
|
1809
1615
|
userId: data.user.id
|
|
@@ -1899,6 +1705,147 @@ var runTerminalCommand = async (input, projectCwd) => {
|
|
|
1899
1705
|
};
|
|
1900
1706
|
}
|
|
1901
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
|
+
};
|
|
1902
1849
|
|
|
1903
1850
|
// src/lib/rpc-handlers.ts
|
|
1904
1851
|
var rpcHandlers = {
|
|
@@ -2008,7 +1955,7 @@ var connectToUserStreams = async (serverUrl) => {
|
|
|
2008
1955
|
throw new Error("No tokens found");
|
|
2009
1956
|
}
|
|
2010
1957
|
const wsUrl = `${serverUrl}/api/v1/user-streams?${params.toString()}`;
|
|
2011
|
-
const ws = new
|
|
1958
|
+
const ws = new WebSocket__default.default(wsUrl, {
|
|
2012
1959
|
headers: {
|
|
2013
1960
|
Authorization: `Bearer ${tokens.access_token}`
|
|
2014
1961
|
}
|
|
@@ -2105,16 +2052,13 @@ var toolExecutors = {
|
|
|
2105
2052
|
stringReplace: apply_patch,
|
|
2106
2053
|
runTerminalCommand
|
|
2107
2054
|
};
|
|
2108
|
-
function
|
|
2109
|
-
return ws.readyState === WebSocket2__default.default.CONNECTING ? "connecting" : ws.readyState === WebSocket2__default.default.OPEN ? "open" : ws.readyState === WebSocket2__default.default.CLOSING ? "closing" : "closed";
|
|
2110
|
-
}
|
|
2111
|
-
function connectToServer2(serverUrl = DEFAULT_SERVER_URL) {
|
|
2055
|
+
function connectToServer(serverUrl = DEFAULT_SERVER_URL) {
|
|
2112
2056
|
const tokens = getTokens();
|
|
2113
2057
|
if (!tokens) {
|
|
2114
2058
|
throw new Error("No tokens found");
|
|
2115
2059
|
}
|
|
2116
2060
|
const wsUrl = `${serverUrl}/agent-streams`;
|
|
2117
|
-
const ws = new
|
|
2061
|
+
const ws = new WebSocket__default.default(wsUrl, {
|
|
2118
2062
|
headers: {
|
|
2119
2063
|
"Authorization": `Bearer ${tokens.access_token}`
|
|
2120
2064
|
}
|
|
@@ -2150,7 +2094,7 @@ function connectToServer2(serverUrl = DEFAULT_SERVER_URL) {
|
|
|
2150
2094
|
});
|
|
2151
2095
|
ws.on("close", () => {
|
|
2152
2096
|
console.log(pc5__default.default.red("Disconnected from server. Reconnecting in 5s..."));
|
|
2153
|
-
setTimeout(() =>
|
|
2097
|
+
setTimeout(() => connectToServer(serverUrl), 5e3);
|
|
2154
2098
|
});
|
|
2155
2099
|
ws.on("error", (error) => {
|
|
2156
2100
|
console.error(pc5__default.default.red(`WebSocket error: ${error.message}`));
|
|
@@ -2161,9 +2105,9 @@ async function main() {
|
|
|
2161
2105
|
const serverUrl = DEFAULT_SERVER_URL;
|
|
2162
2106
|
console.log(pc5__default.default.green("Starting local amai..."));
|
|
2163
2107
|
console.log(pc5__default.default.gray(`Connecting to server at ${serverUrl}`));
|
|
2164
|
-
|
|
2108
|
+
connectToServer(serverUrl);
|
|
2165
2109
|
await connectToUserStreams(serverUrl);
|
|
2166
|
-
startHttpServer(
|
|
2110
|
+
startHttpServer();
|
|
2167
2111
|
}
|
|
2168
2112
|
var execAsync2 = util.promisify(child_process.exec);
|
|
2169
2113
|
var CODE_SERVER_VERSION = "4.96.4";
|
|
@@ -2192,27 +2136,27 @@ function getDownloadUrl() {
|
|
|
2192
2136
|
}
|
|
2193
2137
|
function getCodeServerDir() {
|
|
2194
2138
|
const { platform, arch } = getPlatformInfo();
|
|
2195
|
-
return
|
|
2139
|
+
return path11__default.default.join(CODE_DIR, `code-server-${CODE_SERVER_VERSION}-${platform}-${arch}`);
|
|
2196
2140
|
}
|
|
2197
2141
|
function getCodeServerBin() {
|
|
2198
|
-
return
|
|
2142
|
+
return path11__default.default.join(getCodeServerDir(), "bin", "code-server");
|
|
2199
2143
|
}
|
|
2200
2144
|
function isCodeServerInstalled() {
|
|
2201
2145
|
const binPath = getCodeServerBin();
|
|
2202
|
-
return
|
|
2146
|
+
return fs4__default.default.existsSync(binPath);
|
|
2203
2147
|
}
|
|
2204
2148
|
async function installCodeServer() {
|
|
2205
2149
|
const { ext } = getPlatformInfo();
|
|
2206
2150
|
const downloadUrl = getDownloadUrl();
|
|
2207
|
-
const tarballPath =
|
|
2208
|
-
if (!
|
|
2209
|
-
|
|
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 });
|
|
2210
2154
|
}
|
|
2211
|
-
if (!
|
|
2212
|
-
|
|
2155
|
+
if (!fs4__default.default.existsSync(CODE_DIR)) {
|
|
2156
|
+
fs4__default.default.mkdirSync(CODE_DIR, { recursive: true });
|
|
2213
2157
|
}
|
|
2214
|
-
if (!
|
|
2215
|
-
|
|
2158
|
+
if (!fs4__default.default.existsSync(STORAGE_DIR)) {
|
|
2159
|
+
fs4__default.default.mkdirSync(STORAGE_DIR, { recursive: true });
|
|
2216
2160
|
}
|
|
2217
2161
|
console.log(pc5__default.default.cyan(`Downloading code-server v${CODE_SERVER_VERSION}...`));
|
|
2218
2162
|
console.log(pc5__default.default.gray(downloadUrl));
|
|
@@ -2221,13 +2165,13 @@ async function installCodeServer() {
|
|
|
2221
2165
|
throw new Error(`Failed to download code-server: ${response.statusText}`);
|
|
2222
2166
|
}
|
|
2223
2167
|
const buffer = await response.arrayBuffer();
|
|
2224
|
-
await
|
|
2168
|
+
await fs4__default.default.promises.writeFile(tarballPath, Buffer.from(buffer));
|
|
2225
2169
|
console.log(pc5__default.default.cyan("Extracting code-server..."));
|
|
2226
2170
|
await execAsync2(`tar -xzf ${tarballPath} -C ${CODE_DIR}`);
|
|
2227
|
-
await
|
|
2171
|
+
await fs4__default.default.promises.unlink(tarballPath);
|
|
2228
2172
|
const binPath = getCodeServerBin();
|
|
2229
|
-
if (
|
|
2230
|
-
await
|
|
2173
|
+
if (fs4__default.default.existsSync(binPath)) {
|
|
2174
|
+
await fs4__default.default.promises.chmod(binPath, 493);
|
|
2231
2175
|
}
|
|
2232
2176
|
console.log(pc5__default.default.green("\u2713 code-server installed successfully"));
|
|
2233
2177
|
}
|
|
@@ -2252,19 +2196,19 @@ async function killExistingCodeServer() {
|
|
|
2252
2196
|
async function startCodeServer(cwd) {
|
|
2253
2197
|
const binPath = getCodeServerBin();
|
|
2254
2198
|
const workDir = cwd || process.cwd();
|
|
2255
|
-
if (!
|
|
2199
|
+
if (!fs4__default.default.existsSync(binPath)) {
|
|
2256
2200
|
throw new Error("code-server is not installed. Run installCodeServer() first.");
|
|
2257
2201
|
}
|
|
2258
2202
|
await killExistingCodeServer();
|
|
2259
|
-
const workspaceStoragePath =
|
|
2260
|
-
|
|
2203
|
+
const workspaceStoragePath = path11__default.default.join(STORAGE_DIR, "User", "workspaceStorage");
|
|
2204
|
+
path11__default.default.join(STORAGE_DIR, "User", "globalStorage");
|
|
2261
2205
|
try {
|
|
2262
|
-
if (
|
|
2263
|
-
await
|
|
2206
|
+
if (fs4__default.default.existsSync(workspaceStoragePath)) {
|
|
2207
|
+
await fs4__default.default.promises.rm(workspaceStoragePath, { recursive: true, force: true });
|
|
2264
2208
|
}
|
|
2265
|
-
const stateDbPath =
|
|
2266
|
-
if (
|
|
2267
|
-
await
|
|
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);
|
|
2268
2212
|
}
|
|
2269
2213
|
} catch {
|
|
2270
2214
|
}
|
|
@@ -2291,15 +2235,15 @@ async function startCodeServer(cwd) {
|
|
|
2291
2235
|
return codeServer;
|
|
2292
2236
|
}
|
|
2293
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)));
|
|
2294
|
-
var __dirname$1 =
|
|
2295
|
-
var DAEMON_PID_FILE =
|
|
2296
|
-
var DAEMON_LOG_FILE =
|
|
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");
|
|
2297
2241
|
function isDaemonRunning() {
|
|
2298
|
-
if (!
|
|
2242
|
+
if (!fs4__default.default.existsSync(DAEMON_PID_FILE)) {
|
|
2299
2243
|
return false;
|
|
2300
2244
|
}
|
|
2301
2245
|
try {
|
|
2302
|
-
const pid = Number(
|
|
2246
|
+
const pid = Number(fs4__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
|
|
2303
2247
|
process.kill(pid, 0);
|
|
2304
2248
|
return true;
|
|
2305
2249
|
} catch {
|
|
@@ -2307,30 +2251,30 @@ function isDaemonRunning() {
|
|
|
2307
2251
|
}
|
|
2308
2252
|
}
|
|
2309
2253
|
function stopDaemon() {
|
|
2310
|
-
if (!
|
|
2254
|
+
if (!fs4__default.default.existsSync(DAEMON_PID_FILE)) {
|
|
2311
2255
|
return false;
|
|
2312
2256
|
}
|
|
2313
2257
|
try {
|
|
2314
|
-
const pid = Number(
|
|
2258
|
+
const pid = Number(fs4__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
|
|
2315
2259
|
process.kill(pid, "SIGTERM");
|
|
2316
|
-
|
|
2260
|
+
fs4__default.default.unlinkSync(DAEMON_PID_FILE);
|
|
2317
2261
|
return true;
|
|
2318
2262
|
} catch (error) {
|
|
2319
2263
|
return false;
|
|
2320
2264
|
}
|
|
2321
2265
|
}
|
|
2322
2266
|
function startDaemon() {
|
|
2323
|
-
if (!
|
|
2324
|
-
|
|
2267
|
+
if (!fs4__default.default.existsSync(AMA_DIR)) {
|
|
2268
|
+
fs4__default.default.mkdirSync(AMA_DIR, { recursive: true });
|
|
2325
2269
|
}
|
|
2326
2270
|
if (isDaemonRunning()) {
|
|
2327
2271
|
stopDaemon();
|
|
2328
2272
|
}
|
|
2329
|
-
const daemonScript =
|
|
2330
|
-
if (!
|
|
2273
|
+
const daemonScript = path11__default.default.join(__dirname$1, "lib", "daemon-entry.js");
|
|
2274
|
+
if (!fs4__default.default.existsSync(daemonScript)) {
|
|
2331
2275
|
throw new Error(`Daemon entry script not found at: ${daemonScript}. Please rebuild the project.`);
|
|
2332
2276
|
}
|
|
2333
|
-
const logFd =
|
|
2277
|
+
const logFd = fs4__default.default.openSync(DAEMON_LOG_FILE, "a");
|
|
2334
2278
|
const daemon = child_process.spawn(process.execPath, [daemonScript], {
|
|
2335
2279
|
detached: true,
|
|
2336
2280
|
stdio: ["ignore", logFd, logFd],
|
|
@@ -2338,20 +2282,20 @@ function startDaemon() {
|
|
|
2338
2282
|
cwd: process.cwd()
|
|
2339
2283
|
});
|
|
2340
2284
|
daemon.unref();
|
|
2341
|
-
|
|
2342
|
-
|
|
2285
|
+
fs4__default.default.writeFileSync(DAEMON_PID_FILE, String(daemon.pid));
|
|
2286
|
+
fs4__default.default.closeSync(logFd);
|
|
2343
2287
|
}
|
|
2344
2288
|
function getDaemonPid() {
|
|
2345
|
-
if (!
|
|
2289
|
+
if (!fs4__default.default.existsSync(DAEMON_PID_FILE)) {
|
|
2346
2290
|
return null;
|
|
2347
2291
|
}
|
|
2348
2292
|
try {
|
|
2349
|
-
return Number(
|
|
2293
|
+
return Number(fs4__default.default.readFileSync(DAEMON_PID_FILE, "utf8"));
|
|
2350
2294
|
} catch {
|
|
2351
2295
|
return null;
|
|
2352
2296
|
}
|
|
2353
2297
|
}
|
|
2354
|
-
var VERSION = "0.0.
|
|
2298
|
+
var VERSION = "0.0.7";
|
|
2355
2299
|
var PROJECT_DIR = process.cwd();
|
|
2356
2300
|
function promptUser(question) {
|
|
2357
2301
|
const rl = readline__default.default.createInterface({
|
|
@@ -2462,16 +2406,16 @@ if (args[0] === "project") {
|
|
|
2462
2406
|
console.log("Usage: amai project add <path>");
|
|
2463
2407
|
process.exit(1);
|
|
2464
2408
|
}
|
|
2465
|
-
const resolvedPath =
|
|
2466
|
-
if (!
|
|
2409
|
+
const resolvedPath = path11__default.default.resolve(projectPath);
|
|
2410
|
+
if (!fs4__default.default.existsSync(resolvedPath)) {
|
|
2467
2411
|
console.error(pc5__default.default.red(`Path does not exist: ${resolvedPath}`));
|
|
2468
2412
|
process.exit(1);
|
|
2469
2413
|
}
|
|
2470
|
-
if (!
|
|
2414
|
+
if (!fs4__default.default.statSync(resolvedPath).isDirectory()) {
|
|
2471
2415
|
console.error(pc5__default.default.red(`Path is not a directory: ${resolvedPath}`));
|
|
2472
2416
|
process.exit(1);
|
|
2473
2417
|
}
|
|
2474
|
-
const projectId =
|
|
2418
|
+
const projectId = path11__default.default.basename(resolvedPath);
|
|
2475
2419
|
projectRegistry.register(projectId, resolvedPath);
|
|
2476
2420
|
console.log(pc5__default.default.green(`Project registered: ${projectId} -> ${resolvedPath}`));
|
|
2477
2421
|
process.exit(0);
|