@yuandc/aica 0.1.0 → 0.1.2

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 (48) hide show
  1. package/dist/acp/agent.js +1 -54
  2. package/dist/acp/client/acp-client.js +1 -102
  3. package/dist/acp/client/acp-content.js +1 -13
  4. package/dist/acp/client/acp-events.js +1 -106
  5. package/dist/acp/client/acp-process.js +1 -34
  6. package/dist/acp/client/acp-runtime-pool.js +1 -248
  7. package/dist/acp/client/context-usage.js +1 -29
  8. package/dist/acp/client/json-rpc.js +4 -128
  9. package/dist/acp/provider-types.js +0 -1
  10. package/dist/acp/providers/codex/codex-process.js +1 -51
  11. package/dist/acp/providers/codex/events.js +28 -1473
  12. package/dist/acp/providers/codex/permissions.js +1 -49
  13. package/dist/acp/providers/codex/provider.js +1 -376
  14. package/dist/acp/providers/codex-acp/adapter.js +5 -947
  15. package/dist/acp/providers/codex-acp/context-maintenance.js +5 -148
  16. package/dist/acp/providers/codex-acp/launch.js +1 -35
  17. package/dist/acp/providers/codex-acp/provider.js +1 -486
  18. package/dist/acp/providers/mimo/provider.js +5 -448
  19. package/dist/acp/providers/opencode/provider.js +4 -489
  20. package/dist/acp/providers/registry.js +1 -23
  21. package/dist/acp/standard-events.js +1 -167
  22. package/dist/commands/start.js +1 -137
  23. package/dist/commands/worker-auth.js +4 -100
  24. package/dist/commands/worker-project.js +1 -57
  25. package/dist/core/aca-config.js +1 -74
  26. package/dist/core/aca-server-client.js +1 -57
  27. package/dist/core/acp-event-coalescer.js +1 -108
  28. package/dist/core/acp-event-upload-filter.js +1 -16
  29. package/dist/core/acp-orphan-cleanup.js +1 -91
  30. package/dist/core/affected-files.js +2 -268
  31. package/dist/core/auth.js +1 -36
  32. package/dist/core/file-transfer-worker.js +1 -169
  33. package/dist/core/fs.js +2 -28
  34. package/dist/core/heartbeat.js +3 -578
  35. package/dist/core/job-permission-policy.js +1 -42
  36. package/dist/core/job-worker.js +6 -749
  37. package/dist/core/logger.js +3 -42
  38. package/dist/core/long-poll-worker.js +1 -26
  39. package/dist/core/machine-filesystem-worker.js +3 -352
  40. package/dist/core/paths.js +1 -26
  41. package/dist/core/process-identity.js +1 -34
  42. package/dist/core/process.js +2 -33
  43. package/dist/core/provider-health.js +1 -54
  44. package/dist/core/runtime-options.js +1 -38
  45. package/dist/core/worktree.js +1 -95
  46. package/dist/worker-cli.js +1 -26
  47. package/dist/worker-single-cli.js +1 -16
  48. package/package.json +1 -1
@@ -1,148 +1,5 @@
1
- import fs from "node:fs";
2
- const MB = 1024 * 1024;
3
- export function readCodexContextMaintenancePolicy(env = process.env) {
4
- return {
5
- compactTokenThreshold: positiveInteger(env.ACA_CODEX_COMPACT_TOKEN_THRESHOLD, 120_000),
6
- compactContextRatio: ratio(env.ACA_CODEX_COMPACT_CONTEXT_RATIO, 0.45),
7
- rolloverTokenThreshold: positiveInteger(env.ACA_CODEX_ROLLOVER_TOKEN_THRESHOLD, 180_000),
8
- rolloverContextRatio: ratio(env.ACA_CODEX_ROLLOVER_CONTEXT_RATIO, 0.60),
9
- rolloutMaxBytes: positiveInteger(env.ACA_CODEX_ROLLOUT_MAX_BYTES, 50 * MB),
10
- threadMaxTurns: positiveInteger(env.ACA_CODEX_THREAD_MAX_TURNS, 40),
11
- compactTimeoutMs: positiveInteger(env.ACA_CODEX_COMPACT_TIMEOUT_MS, 10 * 60 * 1000),
12
- slowEventThresholdMs: positiveInteger(env.ACA_CODEX_SLOW_EVENT_THRESHOLD_MS, 5 * 60 * 1000)
13
- };
14
- }
15
- export function codexTokenUsageFromNotification(params, nowMs = Date.now()) {
16
- const record = objectOrEmpty(params);
17
- const tokenUsage = objectOrEmpty(record.tokenUsage);
18
- const last = objectOrEmpty(tokenUsage.last);
19
- const inputTokens = nonNegativeNumber(last.inputTokens);
20
- const totalTokens = nonNegativeNumber(last.totalTokens);
21
- const contextWindow = nonNegativeNumber(tokenUsage.modelContextWindow);
22
- if (inputTokens === 0 && totalTokens === 0 && contextWindow === 0)
23
- return null;
24
- return {
25
- inputTokens,
26
- totalTokens,
27
- contextWindow,
28
- contextRatio: contextWindow > 0 ? inputTokens / contextWindow : 0,
29
- observedAtMs: nowMs
30
- };
31
- }
32
- export function decideCodexContextMaintenance(state, policy, input = {}) {
33
- const compactReasons = [];
34
- const rolloverReasons = [];
35
- if (state.usage && state.usage.inputTokens >= policy.compactTokenThreshold)
36
- compactReasons.push("token-threshold");
37
- if (state.usage && state.usage.contextRatio >= policy.compactContextRatio)
38
- compactReasons.push("context-ratio");
39
- if (state.rolloutBytes >= policy.rolloutMaxBytes)
40
- compactReasons.push("rollout-size");
41
- if (state.turnCount >= policy.threadMaxTurns)
42
- compactReasons.push("turn-count");
43
- if (input.compactAttempted) {
44
- if (input.compactFailed)
45
- rolloverReasons.push("compact-failed");
46
- if (state.usage && state.usage.inputTokens >= policy.rolloverTokenThreshold)
47
- rolloverReasons.push("token-still-high");
48
- if (state.usage && state.usage.contextRatio >= policy.rolloverContextRatio)
49
- rolloverReasons.push("context-ratio-still-high");
50
- if (state.rolloutBytes >= policy.rolloutMaxBytes)
51
- rolloverReasons.push("rollout-size");
52
- if (state.turnCount >= policy.threadMaxTurns)
53
- rolloverReasons.push("turn-count");
54
- }
55
- return {
56
- compact: compactReasons.length > 0,
57
- rollover: rolloverReasons.length > 0,
58
- reasons: [...new Set([...compactReasons, ...rolloverReasons])]
59
- };
60
- }
61
- export function rolloutFileSize(filePath) {
62
- if (!filePath)
63
- return 0;
64
- try {
65
- const stat = fs.statSync(filePath);
66
- return stat.isFile() ? stat.size : 0;
67
- }
68
- catch {
69
- return 0;
70
- }
71
- }
72
- export function buildCodexContinuityInstructions(input) {
73
- const files = [...new Set(input.affectedFiles.map((item) => item.trim()).filter(Boolean))].slice(0, 30);
74
- return [
75
- "ACA automatically rotated a long Codex thread to keep future turns responsive.",
76
- "Treat the following as continuity context, not as a new user request.",
77
- "Repository files on disk are authoritative; inspect them before making further edits.",
78
- "",
79
- `Previous thread: ${input.previousThreadId}`,
80
- `Working directory: ${input.cwd}`,
81
- "",
82
- "Latest user request:",
83
- truncateText(input.userRequest, 3_000) || "(not available)",
84
- "",
85
- "Latest completed assistant result:",
86
- truncateText(input.assistantResponse, 7_000) || "(not available)",
87
- "",
88
- "Recently affected files:",
89
- files.length > 0 ? files.map((item) => `- ${item}`).join("\n") : "- (not recorded)"
90
- ].join("\n");
91
- }
92
- export class CodexPromptPerformanceTracker {
93
- startedAtMs;
94
- firstEventAtMs = null;
95
- lastEventAtMs = null;
96
- eventCount = 0;
97
- lastSlowReportAtMs = 0;
98
- constructor(startedAtMs = Date.now()) {
99
- this.startedAtMs = startedAtMs;
100
- }
101
- recordEvent(atMs = Date.now()) {
102
- if (this.firstEventAtMs === null)
103
- this.firstEventAtMs = atMs;
104
- this.lastEventAtMs = atMs;
105
- this.eventCount += 1;
106
- }
107
- shouldReportSlow(nowMs, thresholdMs) {
108
- const lastActivityAt = this.lastEventAtMs ?? this.startedAtMs;
109
- if (nowMs - lastActivityAt < thresholdMs)
110
- return false;
111
- if (this.lastSlowReportAtMs > 0 && nowMs - this.lastSlowReportAtMs < thresholdMs)
112
- return false;
113
- this.lastSlowReportAtMs = nowMs;
114
- return true;
115
- }
116
- snapshot(nowMs = Date.now()) {
117
- const lastActivityAt = this.lastEventAtMs ?? this.startedAtMs;
118
- return {
119
- startedAtMs: this.startedAtMs,
120
- firstEventAtMs: this.firstEventAtMs,
121
- lastEventAtMs: this.lastEventAtMs,
122
- eventCount: this.eventCount,
123
- firstEventLatencyMs: this.firstEventAtMs === null ? null : this.firstEventAtMs - this.startedAtMs,
124
- silentForMs: Math.max(0, nowMs - lastActivityAt),
125
- durationMs: Math.max(0, nowMs - this.startedAtMs)
126
- };
127
- }
128
- }
129
- function positiveInteger(value, fallback) {
130
- const parsed = Number.parseInt(value ?? "", 10);
131
- return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
132
- }
133
- function ratio(value, fallback) {
134
- const parsed = Number.parseFloat(value ?? "");
135
- return Number.isFinite(parsed) && parsed > 0 && parsed <= 1 ? parsed : fallback;
136
- }
137
- function nonNegativeNumber(value) {
138
- return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : 0;
139
- }
140
- function truncateText(value, maxLength) {
141
- const normalized = value.replace(/\r\n/g, "\n").trim();
142
- if (normalized.length <= maxLength)
143
- return normalized;
144
- return `${normalized.slice(0, maxLength - 16).trimEnd()}\n...[truncated]`;
145
- }
146
- function objectOrEmpty(value) {
147
- return value && typeof value === "object" && !Array.isArray(value) ? value : {};
148
- }
1
+ import d from"node:fs";const f=1024*1024;function p(t=process.env){return{compactTokenThreshold:r(t.ACA_CODEX_COMPACT_TOKEN_THRESHOLD,12e4),compactContextRatio:h(t.ACA_CODEX_COMPACT_CONTEXT_RATIO,.45),rolloverTokenThreshold:r(t.ACA_CODEX_ROLLOVER_TOKEN_THRESHOLD,18e4),rolloverContextRatio:h(t.ACA_CODEX_ROLLOVER_CONTEXT_RATIO,.6),rolloutMaxBytes:r(t.ACA_CODEX_ROLLOUT_MAX_BYTES,50*f),threadMaxTurns:r(t.ACA_CODEX_THREAD_MAX_TURNS,40),compactTimeoutMs:r(t.ACA_CODEX_COMPACT_TIMEOUT_MS,600*1e3),slowEventThresholdMs:r(t.ACA_CODEX_SLOW_EVENT_THRESHOLD_MS,300*1e3)}}function T(t,e=Date.now()){const o=l(t),s=l(o.tokenUsage),n=l(s.last),a=u(n.inputTokens),c=u(n.totalTokens),i=u(s.modelContextWindow);return a===0&&c===0&&i===0?null:{inputTokens:a,totalTokens:c,contextWindow:i,contextRatio:i>0?a/i:0,observedAtMs:e}}function C(t,e,o={}){const s=[],n=[];return t.usage&&t.usage.inputTokens>=e.compactTokenThreshold&&s.push("token-threshold"),t.usage&&t.usage.contextRatio>=e.compactContextRatio&&s.push("context-ratio"),t.rolloutBytes>=e.rolloutMaxBytes&&s.push("rollout-size"),t.turnCount>=e.threadMaxTurns&&s.push("turn-count"),o.compactAttempted&&(o.compactFailed&&n.push("compact-failed"),t.usage&&t.usage.inputTokens>=e.rolloverTokenThreshold&&n.push("token-still-high"),t.usage&&t.usage.contextRatio>=e.rolloverContextRatio&&n.push("context-ratio-still-high"),t.rolloutBytes>=e.rolloutMaxBytes&&n.push("rollout-size"),t.turnCount>=e.threadMaxTurns&&n.push("turn-count")),{compact:s.length>0,rollover:n.length>0,reasons:[...new Set([...s,...n])]}}function E(t){if(!t)return 0;try{const e=d.statSync(t);return e.isFile()?e.size:0}catch{return 0}}function m(t){const e=[...new Set(t.affectedFiles.map(o=>o.trim()).filter(Boolean))].slice(0,30);return["ACA automatically rotated a long Codex thread to keep future turns responsive.","Treat the following as continuity context, not as a new user request.","Repository files on disk are authoritative; inspect them before making further edits.","",`Previous thread: ${t.previousThreadId}`,`Working directory: ${t.cwd}`,"","Latest user request:",A(t.userRequest,3e3)||"(not available)","","Latest completed assistant result:",A(t.assistantResponse,7e3)||"(not available)","","Recently affected files:",e.length>0?e.map(o=>`- ${o}`).join(`
2
+ `):"- (not recorded)"].join(`
3
+ `)}class _{startedAtMs;firstEventAtMs=null;lastEventAtMs=null;eventCount=0;lastSlowReportAtMs=0;constructor(e=Date.now()){this.startedAtMs=e}recordEvent(e=Date.now()){this.firstEventAtMs===null&&(this.firstEventAtMs=e),this.lastEventAtMs=e,this.eventCount+=1}shouldReportSlow(e,o){const s=this.lastEventAtMs??this.startedAtMs;return e-s<o||this.lastSlowReportAtMs>0&&e-this.lastSlowReportAtMs<o?!1:(this.lastSlowReportAtMs=e,!0)}snapshot(e=Date.now()){const o=this.lastEventAtMs??this.startedAtMs;return{startedAtMs:this.startedAtMs,firstEventAtMs:this.firstEventAtMs,lastEventAtMs:this.lastEventAtMs,eventCount:this.eventCount,firstEventLatencyMs:this.firstEventAtMs===null?null:this.firstEventAtMs-this.startedAtMs,silentForMs:Math.max(0,e-o),durationMs:Math.max(0,e-this.startedAtMs)}}}function r(t,e){const o=Number.parseInt(t??"",10);return Number.isInteger(o)&&o>0?o:e}function h(t,e){const o=Number.parseFloat(t??"");return Number.isFinite(o)&&o>0&&o<=1?o:e}function u(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0}function A(t,e){const o=t.replace(/\r\n/g,`
4
+ `).trim();return o.length<=e?o:`${o.slice(0,e-16).trimEnd()}
5
+ ...[truncated]`}function l(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}export{_ as CodexPromptPerformanceTracker,m as buildCodexContinuityInstructions,T as codexTokenUsageFromNotification,C as decideCodexContextMaintenance,p as readCodexContextMaintenancePolicy,E as rolloutFileSize};
@@ -1,35 +1 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { createRequire } from "node:module";
4
- import { fileURLToPath } from "node:url";
5
- export function resolveCodexAcpLaunch() {
6
- if (process.isSea || process.env.ACA_SINGLE_FILE_WORKER === "1") {
7
- return {
8
- command: process.execPath,
9
- args: ["--internal-acp-adapter"]
10
- };
11
- }
12
- const adapterTs = fileURLToPath(new URL("./adapter.ts", import.meta.url));
13
- const adapterJs = fileURLToPath(new URL("./adapter.js", import.meta.url));
14
- const distAdapterJs = adapterTs.replace(`${path.sep}src${path.sep}`, `${path.sep}dist${path.sep}`).replace(/\.ts$/, ".js");
15
- if (fs.existsSync(distAdapterJs)) {
16
- return {
17
- command: process.execPath,
18
- args: [distAdapterJs]
19
- };
20
- }
21
- if (fs.existsSync(adapterJs)) {
22
- return {
23
- command: process.execPath,
24
- args: [adapterJs]
25
- };
26
- }
27
- const require = createRequire(import.meta.url);
28
- return {
29
- command: process.execPath,
30
- args: ["--import", require.resolve("tsx"), adapterTs]
31
- };
32
- }
33
- export function resolveCodexAcpDisplayCommand(launch) {
34
- return `${path.basename(launch.command)} ${launch.args.join(" ")}`;
35
- }
1
+ import a from"node:fs";import r from"node:path";import{createRequire as c}from"node:module";import{fileURLToPath as o}from"node:url";function u(){if(process.isSea||process.env.ACA_SINGLE_FILE_WORKER==="1")return{command:process.execPath,args:["--internal-acp-adapter"]};const e=o(new URL("./adapter.ts",import.meta.url)),s=o(new URL("./adapter.js",import.meta.url)),t=e.replace(`${r.sep}src${r.sep}`,`${r.sep}dist${r.sep}`).replace(/\.ts$/,".js");if(a.existsSync(t))return{command:process.execPath,args:[t]};if(a.existsSync(s))return{command:process.execPath,args:[s]};const p=c(import.meta.url);return{command:process.execPath,args:["--import",p.resolve("tsx"),e]}}function f(e){return`${r.basename(e.command)} ${e.args.join(" ")}`}export{f as resolveCodexAcpDisplayCommand,u as resolveCodexAcpLaunch};