@yuandc/aica 0.1.0

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.
Files changed (49) hide show
  1. package/README.md +9 -0
  2. package/dist/acp/agent.js +54 -0
  3. package/dist/acp/client/acp-client.js +102 -0
  4. package/dist/acp/client/acp-content.js +13 -0
  5. package/dist/acp/client/acp-events.js +106 -0
  6. package/dist/acp/client/acp-process.js +34 -0
  7. package/dist/acp/client/acp-runtime-pool.js +248 -0
  8. package/dist/acp/client/context-usage.js +29 -0
  9. package/dist/acp/client/json-rpc.js +128 -0
  10. package/dist/acp/provider-types.js +1 -0
  11. package/dist/acp/providers/codex/codex-process.js +51 -0
  12. package/dist/acp/providers/codex/events.js +1473 -0
  13. package/dist/acp/providers/codex/permissions.js +49 -0
  14. package/dist/acp/providers/codex/provider.js +376 -0
  15. package/dist/acp/providers/codex-acp/adapter.js +947 -0
  16. package/dist/acp/providers/codex-acp/context-maintenance.js +148 -0
  17. package/dist/acp/providers/codex-acp/launch.js +35 -0
  18. package/dist/acp/providers/codex-acp/provider.js +486 -0
  19. package/dist/acp/providers/mimo/provider.js +448 -0
  20. package/dist/acp/providers/opencode/provider.js +489 -0
  21. package/dist/acp/providers/registry.js +23 -0
  22. package/dist/acp/standard-events.js +167 -0
  23. package/dist/commands/start.js +137 -0
  24. package/dist/commands/worker-auth.js +100 -0
  25. package/dist/commands/worker-project.js +57 -0
  26. package/dist/core/aca-config.js +74 -0
  27. package/dist/core/aca-server-client.js +57 -0
  28. package/dist/core/acp-event-coalescer.js +108 -0
  29. package/dist/core/acp-event-upload-filter.js +16 -0
  30. package/dist/core/acp-orphan-cleanup.js +91 -0
  31. package/dist/core/affected-files.js +268 -0
  32. package/dist/core/auth.js +36 -0
  33. package/dist/core/file-transfer-worker.js +169 -0
  34. package/dist/core/fs.js +28 -0
  35. package/dist/core/heartbeat.js +578 -0
  36. package/dist/core/job-permission-policy.js +42 -0
  37. package/dist/core/job-worker.js +749 -0
  38. package/dist/core/logger.js +42 -0
  39. package/dist/core/long-poll-worker.js +26 -0
  40. package/dist/core/machine-filesystem-worker.js +352 -0
  41. package/dist/core/paths.js +26 -0
  42. package/dist/core/process-identity.js +34 -0
  43. package/dist/core/process.js +33 -0
  44. package/dist/core/provider-health.js +54 -0
  45. package/dist/core/runtime-options.js +38 -0
  46. package/dist/core/worktree.js +95 -0
  47. package/dist/worker-cli.js +27 -0
  48. package/dist/worker-single-cli.js +17 -0
  49. package/package.json +35 -0
@@ -0,0 +1,95 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import crypto from "node:crypto";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { getAcaHome } from "./paths.js";
6
+ export function prepareLocalWorktree(input) {
7
+ const worktreeId = input.worktree.worktree_id;
8
+ if (!worktreeId) {
9
+ return { cwd: input.projectRoot, usedWorktree: false };
10
+ }
11
+ const existingPath = input.worktree.worktree_path ? path.resolve(input.worktree.worktree_path) : null;
12
+ if (input.worktree.worktree_status === "active" && existingPath && fs.existsSync(existingPath)) {
13
+ return {
14
+ cwd: existingPath,
15
+ usedWorktree: true,
16
+ worktreeId,
17
+ status: "active",
18
+ baseCommit: input.worktree.worktree_base_commit ?? null,
19
+ branchName: input.worktree.worktree_branch_name ?? null,
20
+ baseBranch: input.worktree.worktree_base_branch ?? null
21
+ };
22
+ }
23
+ const projectRoot = path.resolve(input.projectRoot);
24
+ const safeProject = sanitizePathSegment(input.projectId ?? "project");
25
+ const safeSession = sanitizePathSegment(input.sessionId);
26
+ const localPath = path.join(getAcaHome(), "worktrees", safeProject, safeSession);
27
+ const baseBranch = input.worktree.worktree_base_branch || "HEAD";
28
+ const branchName = input.worktree.worktree_branch_name || `aca/session-${safeSession}`;
29
+ const baseCommit = currentGitCommit(projectRoot);
30
+ fs.mkdirSync(path.dirname(localPath), { recursive: true });
31
+ if (fs.existsSync(localPath)) {
32
+ return {
33
+ cwd: localPath,
34
+ usedWorktree: true,
35
+ worktreeId,
36
+ status: "active",
37
+ baseCommit,
38
+ branchName,
39
+ baseBranch,
40
+ raw: { source: "aca-client", reusedExistingPath: true, projectRoot }
41
+ };
42
+ }
43
+ if (baseCommit) {
44
+ execFileSync("git", ["worktree", "add", "-B", branchName, localPath, baseBranch], {
45
+ cwd: projectRoot,
46
+ stdio: "pipe"
47
+ });
48
+ return {
49
+ cwd: localPath,
50
+ usedWorktree: true,
51
+ worktreeId,
52
+ status: "active",
53
+ baseCommit,
54
+ branchName,
55
+ baseBranch,
56
+ raw: { source: "aca-client", mode: "git-worktree", projectRoot }
57
+ };
58
+ }
59
+ fs.mkdirSync(localPath, { recursive: true });
60
+ copyProjectSnapshot(projectRoot, localPath);
61
+ return {
62
+ cwd: localPath,
63
+ usedWorktree: true,
64
+ worktreeId,
65
+ status: "fallback-directory",
66
+ baseCommit: null,
67
+ branchName,
68
+ baseBranch,
69
+ raw: { source: "aca-client", mode: "fallback-directory", projectRoot, fallbackReason: "git repository has no commits" }
70
+ };
71
+ }
72
+ function currentGitCommit(cwd) {
73
+ try {
74
+ return execFileSync("git", ["rev-parse", "HEAD"], { cwd, encoding: "utf8", stdio: "pipe" }).trim() || null;
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ function copyProjectSnapshot(source, target) {
81
+ fs.cpSync(source, target, {
82
+ recursive: true,
83
+ filter: (src) => {
84
+ const relative = path.relative(source, src);
85
+ if (!relative)
86
+ return true;
87
+ const first = relative.split(path.sep)[0];
88
+ return ![".git", "node_modules", "dist", ".aca", ".aica"].includes(first);
89
+ }
90
+ });
91
+ }
92
+ function sanitizePathSegment(value) {
93
+ const sanitized = value.replace(/[^a-zA-Z0-9._-]+/g, "-").slice(0, 80);
94
+ return sanitized || crypto.randomUUID();
95
+ }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { createStartCommand } from "./commands/start.js";
4
+ import { createWorkerAuthCommand } from "./commands/worker-auth.js";
5
+ import { createWorkerProjectCommand } from "./commands/worker-project.js";
6
+ import { DEFAULT_ACA_SERVER_URL } from "./core/aca-config.js";
7
+ process.env.ACA_DEFAULT_SERVER_URL ||= DEFAULT_ACA_SERVER_URL;
8
+ export async function runWorkerCli(argv = process.argv) {
9
+ const program = new Command();
10
+ program
11
+ .name("aica")
12
+ .description("AICA remote Agent worker")
13
+ .version("0.1.0")
14
+ .enablePositionalOptions();
15
+ program.addCommand(createStartCommand());
16
+ program.addCommand(createWorkerAuthCommand());
17
+ program.addCommand(createWorkerProjectCommand());
18
+ await program.parseAsync(argv);
19
+ }
20
+ const entry = process.argv[1] || "";
21
+ if (/(?:^|[\\/])worker-cli\.(?:js|ts)$/.test(entry)) {
22
+ void runWorkerCli().catch((error) => {
23
+ const message = error instanceof Error ? error.message : String(error);
24
+ console.error(message);
25
+ process.exitCode = 1;
26
+ });
27
+ }
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { runCodexAcpAdapter } from "./acp/providers/codex-acp/adapter.js";
3
+ import { runWorkerCli } from "./worker-cli.js";
4
+ // 打包成 SEA 后 import.meta.url 不再对应源码文件;让 Codex ACP 启动器直接复用当前可执行文件。
5
+ process.env.ACA_SINGLE_FILE_WORKER = "1";
6
+ async function main() {
7
+ if (process.argv.includes("--internal-acp-adapter")) {
8
+ runCodexAcpAdapter();
9
+ return;
10
+ }
11
+ await runWorkerCli();
12
+ }
13
+ void main().catch((error) => {
14
+ const message = error instanceof Error ? error.message : String(error);
15
+ console.error(message);
16
+ process.exitCode = 1;
17
+ });
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@yuandc/aica",
3
+ "version": "0.1.0",
4
+ "description": "AICA remote Agent worker",
5
+ "author": "yuandc",
6
+ "type": "module",
7
+ "bin": {
8
+ "aica": "dist/worker-cli.js",
9
+ "aca": "dist/worker-cli.js"
10
+ },
11
+ "scripts": {
12
+ "start": "node dist/worker-cli.js start",
13
+ "help": "node dist/worker-cli.js --help"
14
+ },
15
+ "engines": {
16
+ "node": ">=22.0.0"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "keywords": [
22
+ "aica",
23
+ "aca",
24
+ "agent",
25
+ "acp",
26
+ "worker"
27
+ ],
28
+ "dependencies": {
29
+ "chalk": "^5.4.1",
30
+ "commander": "^12.1.0",
31
+ "diff": "^9.0.0",
32
+ "undici": "^7.28.0",
33
+ "zod": "^3.25.76"
34
+ }
35
+ }