@cortexkit/aft-opencode 0.9.1 → 0.11.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.
- package/dist/bridge.d.ts.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25413 -182
- package/dist/notifications.d.ts +48 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/onnx-runtime.d.ts +35 -0
- package/dist/onnx-runtime.d.ts.map +1 -0
- package/dist/pool.d.ts +2 -0
- package/dist/pool.d.ts.map +1 -1
- package/dist/resolver.d.ts.map +1 -1
- package/dist/shared/opencode-config-dir.d.ts +16 -0
- package/dist/shared/opencode-config-dir.d.ts.map +1 -0
- package/dist/shared/rpc-client.d.ts +16 -0
- package/dist/shared/rpc-client.d.ts.map +1 -0
- package/dist/shared/rpc-server.d.ts +17 -0
- package/dist/shared/rpc-server.d.ts.map +1 -0
- package/dist/shared/rpc-utils.d.ts +11 -0
- package/dist/shared/rpc-utils.d.ts.map +1 -0
- package/dist/shared/runtime.d.ts +10 -0
- package/dist/shared/runtime.d.ts.map +1 -0
- package/dist/shared/status.d.ts +37 -0
- package/dist/shared/status.d.ts.map +1 -0
- package/dist/shared/tui-config.d.ts +2 -0
- package/dist/shared/tui-config.d.ts.map +1 -0
- package/dist/shared/url-fetch.d.ts +11 -0
- package/dist/shared/url-fetch.d.ts.map +1 -0
- package/dist/tools/reading.d.ts.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/semantic.d.ts +4 -0
- package/dist/tools/semantic.d.ts.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +29 -9
- package/src/shared/opencode-config-dir.ts +46 -0
- package/src/shared/rpc-client.ts +123 -0
- package/src/shared/rpc-server.ts +135 -0
- package/src/shared/rpc-utils.ts +21 -0
- package/src/shared/runtime.ts +26 -0
- package/src/shared/status.ts +206 -0
- package/src/shared/tui-config.ts +58 -0
- package/src/shared/url-fetch.ts +237 -0
- package/src/tui/index.tsx +209 -0
- package/src/tui/types/opencode-plugin-tui.d.ts +232 -0
- package/dist/bridge.js +0 -311
- package/dist/bridge.js.map +0 -1
- package/dist/config.js +0 -302
- package/dist/config.js.map +0 -1
- package/dist/downloader.js +0 -198
- package/dist/downloader.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger.js +0 -78
- package/dist/logger.js.map +0 -1
- package/dist/lsp.js +0 -79
- package/dist/lsp.js.map +0 -1
- package/dist/metadata-store.js +0 -53
- package/dist/metadata-store.js.map +0 -1
- package/dist/normalize-schemas.js +0 -45
- package/dist/normalize-schemas.js.map +0 -1
- package/dist/patch-parser.js +0 -247
- package/dist/patch-parser.js.map +0 -1
- package/dist/platform.js +0 -31
- package/dist/platform.js.map +0 -1
- package/dist/pool.js +0 -111
- package/dist/pool.js.map +0 -1
- package/dist/resolver.js +0 -168
- package/dist/resolver.js.map +0 -1
- package/dist/tools/ast.js +0 -200
- package/dist/tools/ast.js.map +0 -1
- package/dist/tools/conflicts.js +0 -20
- package/dist/tools/conflicts.js.map +0 -1
- package/dist/tools/hoisted.js +0 -870
- package/dist/tools/hoisted.js.map +0 -1
- package/dist/tools/imports.js +0 -90
- package/dist/tools/imports.js.map +0 -1
- package/dist/tools/lsp.js +0 -58
- package/dist/tools/lsp.js.map +0 -1
- package/dist/tools/navigation.js +0 -58
- package/dist/tools/navigation.js.map +0 -1
- package/dist/tools/permissions.js +0 -50
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/reading.js +0 -229
- package/dist/tools/reading.js.map +0 -1
- package/dist/tools/refactoring.js +0 -129
- package/dist/tools/refactoring.js.map +0 -1
- package/dist/tools/safety.js +0 -83
- package/dist/tools/safety.js.map +0 -1
- package/dist/tools/search.js +0 -88
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/structure.js +0 -157
- package/dist/tools/structure.js.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
package/dist/bridge.js
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import { error, getLogFilePath, log, warn } from "./logger.js";
|
|
3
|
-
// ## Note on TypeScript `as` type assertions
|
|
4
|
-
//
|
|
5
|
-
// Bridge responses use `as string`, `as string[]` etc. in several places.
|
|
6
|
-
// This is intentional: all 16 tool handlers already guard against error
|
|
7
|
-
// responses with `if (response.success === false) throw ...` before accessing
|
|
8
|
-
// typed fields. The remaining `as` casts are on fields from known-success
|
|
9
|
-
// Rust responses where the shape is guaranteed by the protocol contract.
|
|
10
|
-
// Adding Zod runtime validation for every bridge response would add ~2ms
|
|
11
|
-
// per call with no practical safety benefit given the error guards.
|
|
12
|
-
/**
|
|
13
|
-
* Compare two semver version strings (major.minor.patch).
|
|
14
|
-
* Returns: negative if a < b, 0 if equal, positive if a > b.
|
|
15
|
-
*/
|
|
16
|
-
function compareSemver(a, b) {
|
|
17
|
-
const pa = a.split(".").map(Number);
|
|
18
|
-
const pb = b.split(".").map(Number);
|
|
19
|
-
for (let i = 0; i < 3; i++) {
|
|
20
|
-
const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
21
|
-
if (diff !== 0)
|
|
22
|
-
return diff;
|
|
23
|
-
}
|
|
24
|
-
return 0;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Manages a persistent `aft` child process, communicating via NDJSON over
|
|
28
|
-
* stdin/stdout. Lazy-spawns on first `send()` call. Handles crash detection
|
|
29
|
-
* with exponential backoff auto-restart.
|
|
30
|
-
*/
|
|
31
|
-
export class BinaryBridge {
|
|
32
|
-
static RESTART_RESET_MS = 5 * 60 * 1000;
|
|
33
|
-
binaryPath;
|
|
34
|
-
cwd;
|
|
35
|
-
process = null;
|
|
36
|
-
pending = new Map();
|
|
37
|
-
nextId = 1;
|
|
38
|
-
stdoutBuffer = "";
|
|
39
|
-
_restartCount = 0;
|
|
40
|
-
_shuttingDown = false;
|
|
41
|
-
timeoutMs;
|
|
42
|
-
maxRestarts;
|
|
43
|
-
configured = false;
|
|
44
|
-
_configurePromise = null;
|
|
45
|
-
configOverrides;
|
|
46
|
-
minVersion;
|
|
47
|
-
onVersionMismatch;
|
|
48
|
-
restartResetTimer = null;
|
|
49
|
-
constructor(binaryPath, cwd, options, configOverrides) {
|
|
50
|
-
this.binaryPath = binaryPath;
|
|
51
|
-
this.cwd = cwd;
|
|
52
|
-
this.timeoutMs = options?.timeoutMs ?? 30_000;
|
|
53
|
-
this.maxRestarts = options?.maxRestarts ?? 3;
|
|
54
|
-
this.configOverrides = configOverrides ?? {};
|
|
55
|
-
this.minVersion = options?.minVersion;
|
|
56
|
-
this.onVersionMismatch = options?.onVersionMismatch;
|
|
57
|
-
}
|
|
58
|
-
/** Number of times the binary has been restarted after a crash. */
|
|
59
|
-
get restartCount() {
|
|
60
|
-
return this._restartCount;
|
|
61
|
-
}
|
|
62
|
-
/** Whether the child process is currently alive. */
|
|
63
|
-
isAlive() {
|
|
64
|
-
return this.process !== null && this.process.exitCode === null && !this.process.killed;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Send a command to the binary and return the parsed response.
|
|
68
|
-
* Lazy-spawns the binary on first call.
|
|
69
|
-
*/
|
|
70
|
-
async send(command, params = {}) {
|
|
71
|
-
if (this._shuttingDown) {
|
|
72
|
-
throw new Error(`[aft-plugin] Bridge is shutting down, cannot send "${command}"`);
|
|
73
|
-
}
|
|
74
|
-
this.ensureSpawned();
|
|
75
|
-
// Auto-configure project root + plugin config on first command, then check version.
|
|
76
|
-
// configured is set AFTER success to prevent skipping configuration on failure (#18).
|
|
77
|
-
// When multiple parallel calls arrive before configure completes, they all await
|
|
78
|
-
// the same promise instead of each independently trying to configure.
|
|
79
|
-
if (!this.configured) {
|
|
80
|
-
if (command !== "configure" && command !== "version") {
|
|
81
|
-
if (!this._configurePromise) {
|
|
82
|
-
// First caller — create the configure promise.
|
|
83
|
-
// All parallel callers await this same promise.
|
|
84
|
-
this._configurePromise = (async () => {
|
|
85
|
-
try {
|
|
86
|
-
const configResult = await this.send("configure", {
|
|
87
|
-
project_root: this.cwd,
|
|
88
|
-
...this.configOverrides,
|
|
89
|
-
});
|
|
90
|
-
if (configResult.success === false) {
|
|
91
|
-
throw new Error(`[aft-plugin] Configure failed: ${configResult.message ?? "unknown error"}`);
|
|
92
|
-
}
|
|
93
|
-
await this.checkVersion();
|
|
94
|
-
// Re-check liveness after version check — checkVersion() swallows
|
|
95
|
-
// errors as best-effort, so the bridge may have died without throwing.
|
|
96
|
-
if (!this.isAlive()) {
|
|
97
|
-
throw new Error(`[aft-plugin] Bridge died during version check. Check logs: ${getLogFilePath()}`);
|
|
98
|
-
}
|
|
99
|
-
this.configured = true;
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
// Configure failed — leave configured=false so next call retries
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
finally {
|
|
106
|
-
this._configurePromise = null;
|
|
107
|
-
}
|
|
108
|
-
})();
|
|
109
|
-
}
|
|
110
|
-
// All callers (including the first) await the shared promise
|
|
111
|
-
await this._configurePromise;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
const id = String(this.nextId++);
|
|
115
|
-
const request = { id, command, ...params };
|
|
116
|
-
const line = `${JSON.stringify(request)}\n`;
|
|
117
|
-
return new Promise((resolve, reject) => {
|
|
118
|
-
const timer = setTimeout(() => {
|
|
119
|
-
this.pending.delete(id);
|
|
120
|
-
warn(`Request "${command}" (id=${id}) timed out after ${this.timeoutMs}ms — restarting bridge`);
|
|
121
|
-
reject(new Error(`[aft-plugin] Request "${command}" (id=${id}) timed out after ${this.timeoutMs}ms`));
|
|
122
|
-
// Kill the hung process so the next request gets a fresh bridge
|
|
123
|
-
this.handleTimeout();
|
|
124
|
-
}, this.timeoutMs);
|
|
125
|
-
this.pending.set(id, { resolve, reject, timer });
|
|
126
|
-
if (!this.process?.stdin?.writable) {
|
|
127
|
-
this.pending.delete(id);
|
|
128
|
-
clearTimeout(timer);
|
|
129
|
-
reject(new Error(`[aft-plugin] stdin not writable for command "${command}"`));
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
this.process.stdin.write(line, (err) => {
|
|
133
|
-
if (err) {
|
|
134
|
-
const entry = this.pending.get(id);
|
|
135
|
-
if (entry) {
|
|
136
|
-
this.pending.delete(id);
|
|
137
|
-
clearTimeout(entry.timer);
|
|
138
|
-
entry.reject(new Error(`[aft-plugin] Failed to write to stdin: ${err.message}`));
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
/** Kill the child process and reject all pending requests. */
|
|
145
|
-
async shutdown() {
|
|
146
|
-
this._shuttingDown = true;
|
|
147
|
-
this.clearRestartResetTimer();
|
|
148
|
-
this.rejectAllPending(new Error("[aft-plugin] Bridge shutting down"));
|
|
149
|
-
if (this.process) {
|
|
150
|
-
const proc = this.process;
|
|
151
|
-
this.process = null;
|
|
152
|
-
return new Promise((resolve) => {
|
|
153
|
-
const forceKillTimer = setTimeout(() => {
|
|
154
|
-
proc.kill("SIGKILL");
|
|
155
|
-
resolve();
|
|
156
|
-
}, 5_000);
|
|
157
|
-
proc.once("exit", () => {
|
|
158
|
-
clearTimeout(forceKillTimer);
|
|
159
|
-
log("Process exited during shutdown");
|
|
160
|
-
resolve();
|
|
161
|
-
});
|
|
162
|
-
proc.kill("SIGTERM");
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
// ---- Internal ----
|
|
167
|
-
/** Query binary version and compare against minVersion. Calls onVersionMismatch if outdated. */
|
|
168
|
-
async checkVersion() {
|
|
169
|
-
if (!this.minVersion)
|
|
170
|
-
return;
|
|
171
|
-
try {
|
|
172
|
-
const resp = await this.send("version");
|
|
173
|
-
const binaryVersion = resp.version;
|
|
174
|
-
if (!binaryVersion) {
|
|
175
|
-
log("Binary did not report a version — skipping version check");
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
log(`Binary version: ${binaryVersion}`);
|
|
179
|
-
if (compareSemver(binaryVersion, this.minVersion) < 0) {
|
|
180
|
-
warn(`Binary version ${binaryVersion} is older than required ${this.minVersion}`);
|
|
181
|
-
this.onVersionMismatch?.(binaryVersion, this.minVersion);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
// Version check is best-effort — don't block tool usage if it fails
|
|
186
|
-
warn(`Version check failed: ${err.message}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
ensureSpawned() {
|
|
190
|
-
if (this.isAlive())
|
|
191
|
-
return;
|
|
192
|
-
this.spawnProcess();
|
|
193
|
-
}
|
|
194
|
-
spawnProcess() {
|
|
195
|
-
log(`Spawning binary: ${this.binaryPath} (cwd: ${this.cwd})`);
|
|
196
|
-
const child = spawn(this.binaryPath, [], {
|
|
197
|
-
cwd: this.cwd,
|
|
198
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
199
|
-
});
|
|
200
|
-
child.stdout?.on("data", (chunk) => {
|
|
201
|
-
this.onStdoutData(chunk.toString("utf-8"));
|
|
202
|
-
});
|
|
203
|
-
child.stderr?.on("data", (chunk) => {
|
|
204
|
-
const lines = chunk.toString("utf-8").trimEnd().split("\n");
|
|
205
|
-
for (const line of lines) {
|
|
206
|
-
// Strip Rust env_logger prefix and re-tag under [aft]
|
|
207
|
-
const stripped = line.replace(/^\[aft\]\s*/, "");
|
|
208
|
-
log(`[aft] ${stripped}`);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
child.on("error", (err) => {
|
|
212
|
-
error(`Process error: ${err.message}`);
|
|
213
|
-
this.handleCrash();
|
|
214
|
-
});
|
|
215
|
-
child.on("exit", (code, signal) => {
|
|
216
|
-
if (this._shuttingDown)
|
|
217
|
-
return;
|
|
218
|
-
log(`Process exited: code=${code}, signal=${signal}`);
|
|
219
|
-
this.handleCrash();
|
|
220
|
-
});
|
|
221
|
-
this.process = child;
|
|
222
|
-
this.stdoutBuffer = "";
|
|
223
|
-
}
|
|
224
|
-
onStdoutData(data) {
|
|
225
|
-
this.stdoutBuffer += data;
|
|
226
|
-
// Process complete lines
|
|
227
|
-
let newlineIdx;
|
|
228
|
-
while ((newlineIdx = this.stdoutBuffer.indexOf("\n")) !== -1) {
|
|
229
|
-
const line = this.stdoutBuffer.slice(0, newlineIdx).trim();
|
|
230
|
-
this.stdoutBuffer = this.stdoutBuffer.slice(newlineIdx + 1);
|
|
231
|
-
if (!line)
|
|
232
|
-
continue;
|
|
233
|
-
try {
|
|
234
|
-
const response = JSON.parse(line);
|
|
235
|
-
const id = response.id;
|
|
236
|
-
if (id && this.pending.has(id)) {
|
|
237
|
-
const entry = this.pending.get(id);
|
|
238
|
-
if (!entry)
|
|
239
|
-
continue;
|
|
240
|
-
this.pending.delete(id);
|
|
241
|
-
clearTimeout(entry.timer);
|
|
242
|
-
this.scheduleRestartCountReset();
|
|
243
|
-
entry.resolve(response);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch (_err) {
|
|
247
|
-
warn(`Failed to parse stdout line: ${line}`);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
handleTimeout() {
|
|
252
|
-
// Kill the hung process and reject remaining pending requests.
|
|
253
|
-
// Unlike handleCrash, this does NOT auto-restart — the next send() call
|
|
254
|
-
// will lazy-spawn a fresh process via ensureSpawned().
|
|
255
|
-
if (this.process) {
|
|
256
|
-
this.process.kill("SIGKILL");
|
|
257
|
-
this.process = null;
|
|
258
|
-
}
|
|
259
|
-
this.clearRestartResetTimer();
|
|
260
|
-
this.configured = false;
|
|
261
|
-
// Reject any other pending requests (the timed-out one was already rejected)
|
|
262
|
-
this.rejectAllPending(new Error("[aft-plugin] Bridge restarted after timeout"));
|
|
263
|
-
}
|
|
264
|
-
handleCrash() {
|
|
265
|
-
this.process = null;
|
|
266
|
-
this.clearRestartResetTimer();
|
|
267
|
-
this.configured = false; // Force reconfigure on next command after restart
|
|
268
|
-
// Reject all pending requests
|
|
269
|
-
this.rejectAllPending(new Error(`[aft-plugin] Binary crashed (restarts: ${this._restartCount})`));
|
|
270
|
-
// Auto-restart with exponential backoff
|
|
271
|
-
if (this._restartCount < this.maxRestarts) {
|
|
272
|
-
const delay = 100 * 2 ** this._restartCount; // 100ms, 200ms, 400ms
|
|
273
|
-
this._restartCount++;
|
|
274
|
-
log(`Auto-restart #${this._restartCount} in ${delay}ms`);
|
|
275
|
-
setTimeout(() => {
|
|
276
|
-
if (!this._shuttingDown && !this.isAlive()) {
|
|
277
|
-
try {
|
|
278
|
-
this.spawnProcess();
|
|
279
|
-
}
|
|
280
|
-
catch (err) {
|
|
281
|
-
error(`Failed to restart: ${err.message}`);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}, delay);
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
error(`Max restarts (${this.maxRestarts}) reached, giving up. Logs: ${getLogFilePath()}`);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
rejectAllPending(error) {
|
|
291
|
-
for (const [_id, entry] of this.pending) {
|
|
292
|
-
clearTimeout(entry.timer);
|
|
293
|
-
entry.reject(error);
|
|
294
|
-
}
|
|
295
|
-
this.pending.clear();
|
|
296
|
-
}
|
|
297
|
-
scheduleRestartCountReset() {
|
|
298
|
-
this.clearRestartResetTimer();
|
|
299
|
-
this.restartResetTimer = setTimeout(() => {
|
|
300
|
-
this._restartCount = 0;
|
|
301
|
-
this.restartResetTimer = null;
|
|
302
|
-
}, BinaryBridge.RESTART_RESET_MS);
|
|
303
|
-
}
|
|
304
|
-
clearRestartResetTimer() {
|
|
305
|
-
if (this.restartResetTimer) {
|
|
306
|
-
clearTimeout(this.restartResetTimer);
|
|
307
|
-
this.restartResetTimer = null;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
//# sourceMappingURL=bridge.js.map
|
package/dist/bridge.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
DELETED
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
import { error, log, warn } from "./logger.js";
|
|
5
|
-
// ---------------------------------------------------------------------------
|
|
6
|
-
// Zod schema
|
|
7
|
-
// ---------------------------------------------------------------------------
|
|
8
|
-
const FormatterEnum = z.enum([
|
|
9
|
-
"biome",
|
|
10
|
-
"prettier",
|
|
11
|
-
"deno",
|
|
12
|
-
"ruff",
|
|
13
|
-
"black",
|
|
14
|
-
"rustfmt",
|
|
15
|
-
"goimports",
|
|
16
|
-
"gofmt",
|
|
17
|
-
"none",
|
|
18
|
-
]);
|
|
19
|
-
const CheckerEnum = z.enum([
|
|
20
|
-
"tsc",
|
|
21
|
-
"biome",
|
|
22
|
-
"pyright",
|
|
23
|
-
"ruff",
|
|
24
|
-
"cargo",
|
|
25
|
-
"go",
|
|
26
|
-
"staticcheck",
|
|
27
|
-
"none",
|
|
28
|
-
]);
|
|
29
|
-
export const AftConfigSchema = z.object({
|
|
30
|
-
/** Whether to auto-format files after edits. Default: true. */
|
|
31
|
-
format_on_edit: z.boolean().optional(),
|
|
32
|
-
/** Auto-validate after edits: "syntax" (tree-sitter) or "full" (runs type checker). */
|
|
33
|
-
validate_on_edit: z.enum(["syntax", "full"]).optional(),
|
|
34
|
-
/** Per-language formatter overrides. Keys: "typescript", "python", "rust", "go". */
|
|
35
|
-
formatter: z.record(z.string(), FormatterEnum).optional(),
|
|
36
|
-
/** Per-language type checker overrides. Keys: "typescript", "python", "rust", "go". */
|
|
37
|
-
checker: z.record(z.string(), CheckerEnum).optional(),
|
|
38
|
-
/**
|
|
39
|
-
* Replace opencode's built-in read/write/edit/apply_patch tools with AFT's
|
|
40
|
-
* faster Rust implementations. Adds backup tracking, auto-formatting,
|
|
41
|
-
* inline diagnostics, and permission checks. Default: true.
|
|
42
|
-
*/
|
|
43
|
-
hoist_builtin_tools: z.boolean().optional(),
|
|
44
|
-
/**
|
|
45
|
-
* Tool surface level. Controls which tools are registered:
|
|
46
|
-
* - "minimal": aft_outline, aft_zoom, aft_safety (no hoisting)
|
|
47
|
-
* - "recommended": minimal + hoisted read/write/edit/apply_patch + lsp_diagnostics
|
|
48
|
-
* + ast_grep_search/replace + aft_import (default)
|
|
49
|
-
* - "all": recommended + aft_navigate, aft_delete, aft_move, aft_transform, aft_refactor
|
|
50
|
-
*/
|
|
51
|
-
tool_surface: z.enum(["minimal", "recommended", "all"]).optional(),
|
|
52
|
-
/**
|
|
53
|
-
* List of tool names to disable. Disabled tools are not registered with
|
|
54
|
-
* OpenCode and will be invisible to agents. Use exact tool names, e.g.
|
|
55
|
-
* ["aft_navigate", "aft_refactor"]. Hoisted names ("read", "edit") and
|
|
56
|
-
* aft-prefixed names both work. Applied after tool_surface filtering.
|
|
57
|
-
*/
|
|
58
|
-
disabled_tools: z.array(z.string()).optional(),
|
|
59
|
-
/**
|
|
60
|
-
* Restrict file operations to within the project root directory.
|
|
61
|
-
* When true, write-capable commands reject paths outside project_root.
|
|
62
|
-
* Default: false (matches OpenCode's built-in behavior).
|
|
63
|
-
*/
|
|
64
|
-
restrict_to_project_root: z.boolean().optional(),
|
|
65
|
-
/** Enable experimental indexed search for grep and glob hoisting. Default: false. */
|
|
66
|
-
experimental_search_index: z.boolean().optional(),
|
|
67
|
-
});
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// JSONC parsing — self-contained, no external dependency
|
|
70
|
-
//
|
|
71
|
-
// jsonc-parser's UMD bundle breaks under both ESM named imports (Node) and
|
|
72
|
-
// createRequire (Bun/OpenCode hybrid runtime). Strip comments + trailing
|
|
73
|
-
// commas ourselves and use JSON.parse.
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
function stripJsoncComments(text) {
|
|
76
|
-
let result = "";
|
|
77
|
-
let i = 0;
|
|
78
|
-
let inString = false;
|
|
79
|
-
let escaped = false;
|
|
80
|
-
while (i < text.length) {
|
|
81
|
-
const ch = text[i];
|
|
82
|
-
if (inString) {
|
|
83
|
-
result += ch;
|
|
84
|
-
if (escaped) {
|
|
85
|
-
escaped = false;
|
|
86
|
-
}
|
|
87
|
-
else if (ch === "\\") {
|
|
88
|
-
escaped = true;
|
|
89
|
-
}
|
|
90
|
-
else if (ch === '"') {
|
|
91
|
-
inString = false;
|
|
92
|
-
}
|
|
93
|
-
i++;
|
|
94
|
-
continue;
|
|
95
|
-
}
|
|
96
|
-
// Start of string
|
|
97
|
-
if (ch === '"') {
|
|
98
|
-
inString = true;
|
|
99
|
-
result += ch;
|
|
100
|
-
i++;
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
// Line comment
|
|
104
|
-
if (ch === "/" && text[i + 1] === "/") {
|
|
105
|
-
// Skip until end of line
|
|
106
|
-
i += 2;
|
|
107
|
-
while (i < text.length && text[i] !== "\n")
|
|
108
|
-
i++;
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
// Block comment
|
|
112
|
-
if (ch === "/" && text[i + 1] === "*") {
|
|
113
|
-
i += 2;
|
|
114
|
-
while (i < text.length && !(text[i] === "*" && text[i + 1] === "/"))
|
|
115
|
-
i++;
|
|
116
|
-
i += 2; // skip closing */
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
result += ch;
|
|
120
|
-
i++;
|
|
121
|
-
}
|
|
122
|
-
return result;
|
|
123
|
-
}
|
|
124
|
-
function stripTrailingCommas(text) {
|
|
125
|
-
let result = "";
|
|
126
|
-
let i = 0;
|
|
127
|
-
let inString = false;
|
|
128
|
-
let escaped = false;
|
|
129
|
-
while (i < text.length) {
|
|
130
|
-
const ch = text[i];
|
|
131
|
-
if (inString) {
|
|
132
|
-
result += ch;
|
|
133
|
-
if (escaped) {
|
|
134
|
-
escaped = false;
|
|
135
|
-
}
|
|
136
|
-
else if (ch === "\\") {
|
|
137
|
-
escaped = true;
|
|
138
|
-
}
|
|
139
|
-
else if (ch === '"') {
|
|
140
|
-
inString = false;
|
|
141
|
-
}
|
|
142
|
-
i++;
|
|
143
|
-
continue;
|
|
144
|
-
}
|
|
145
|
-
if (ch === '"') {
|
|
146
|
-
inString = true;
|
|
147
|
-
result += ch;
|
|
148
|
-
i++;
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (ch === ",") {
|
|
152
|
-
let j = i + 1;
|
|
153
|
-
while (j < text.length && /\s/.test(text[j]))
|
|
154
|
-
j++;
|
|
155
|
-
if (text[j] === "}" || text[j] === "]") {
|
|
156
|
-
i++;
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
result += ch;
|
|
161
|
-
i++;
|
|
162
|
-
}
|
|
163
|
-
return result;
|
|
164
|
-
}
|
|
165
|
-
function parseJsonc(content) {
|
|
166
|
-
const stripped = stripTrailingCommas(stripJsoncComments(content));
|
|
167
|
-
try {
|
|
168
|
-
return JSON.parse(stripped);
|
|
169
|
-
}
|
|
170
|
-
catch (err) {
|
|
171
|
-
throw new SyntaxError(`JSONC parse error: ${err.message}`);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
|
-
// Config file detection (.jsonc preferred over .json)
|
|
176
|
-
// ---------------------------------------------------------------------------
|
|
177
|
-
function detectConfigFile(basePath) {
|
|
178
|
-
const jsoncPath = `${basePath}.jsonc`;
|
|
179
|
-
const jsonPath = `${basePath}.json`;
|
|
180
|
-
if (existsSync(jsoncPath)) {
|
|
181
|
-
return { format: "jsonc", path: jsoncPath };
|
|
182
|
-
}
|
|
183
|
-
if (existsSync(jsonPath)) {
|
|
184
|
-
return { format: "json", path: jsonPath };
|
|
185
|
-
}
|
|
186
|
-
return { format: "none", path: jsonPath };
|
|
187
|
-
}
|
|
188
|
-
// ---------------------------------------------------------------------------
|
|
189
|
-
// Partial parse (valid sections survive, invalid sections are skipped)
|
|
190
|
-
// ---------------------------------------------------------------------------
|
|
191
|
-
function parseConfigPartially(rawConfig) {
|
|
192
|
-
const fullResult = AftConfigSchema.safeParse(rawConfig);
|
|
193
|
-
if (fullResult.success) {
|
|
194
|
-
return fullResult.data;
|
|
195
|
-
}
|
|
196
|
-
const partialConfig = {};
|
|
197
|
-
const invalidSections = [];
|
|
198
|
-
for (const key of Object.keys(rawConfig)) {
|
|
199
|
-
const sectionResult = AftConfigSchema.safeParse({ [key]: rawConfig[key] });
|
|
200
|
-
if (sectionResult.success) {
|
|
201
|
-
const parsed = sectionResult.data;
|
|
202
|
-
if (parsed[key] !== undefined) {
|
|
203
|
-
partialConfig[key] = parsed[key];
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
const sectionErrors = sectionResult.error.issues
|
|
208
|
-
.filter((i) => i.path[0] === key)
|
|
209
|
-
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
210
|
-
.join(", ");
|
|
211
|
-
if (sectionErrors) {
|
|
212
|
-
invalidSections.push(`${key}: ${sectionErrors}`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
if (invalidSections.length > 0) {
|
|
217
|
-
warn(`Partial config loaded — invalid sections skipped: ${invalidSections.join("; ")}`);
|
|
218
|
-
}
|
|
219
|
-
return partialConfig;
|
|
220
|
-
}
|
|
221
|
-
// ---------------------------------------------------------------------------
|
|
222
|
-
// Load config from a single file path
|
|
223
|
-
// ---------------------------------------------------------------------------
|
|
224
|
-
function loadConfigFromPath(configPath) {
|
|
225
|
-
try {
|
|
226
|
-
if (!existsSync(configPath)) {
|
|
227
|
-
return null;
|
|
228
|
-
}
|
|
229
|
-
const content = readFileSync(configPath, "utf-8");
|
|
230
|
-
const rawConfig = parseJsonc(content);
|
|
231
|
-
const result = AftConfigSchema.safeParse(rawConfig);
|
|
232
|
-
if (result.success) {
|
|
233
|
-
log(`Config loaded from ${configPath}`);
|
|
234
|
-
return result.data;
|
|
235
|
-
}
|
|
236
|
-
const errorMsg = result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join(", ");
|
|
237
|
-
warn(`Config validation error in ${configPath}: ${errorMsg}`);
|
|
238
|
-
return parseConfigPartially(rawConfig);
|
|
239
|
-
}
|
|
240
|
-
catch (err) {
|
|
241
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
242
|
-
error(`Error loading config from ${configPath}: ${errorMsg}`);
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
// ---------------------------------------------------------------------------
|
|
247
|
-
// Merge configs (project overrides user, simple shallow merge for flat schema)
|
|
248
|
-
// ---------------------------------------------------------------------------
|
|
249
|
-
function mergeConfigs(base, override) {
|
|
250
|
-
// Union disabled_tools from both levels (user + project)
|
|
251
|
-
const disabledTools = [...(base.disabled_tools ?? []), ...(override.disabled_tools ?? [])];
|
|
252
|
-
return {
|
|
253
|
-
...base,
|
|
254
|
-
...override,
|
|
255
|
-
// Deep-merge language-scoped maps instead of replacing
|
|
256
|
-
formatter: { ...base.formatter, ...override.formatter },
|
|
257
|
-
checker: { ...base.checker, ...override.checker },
|
|
258
|
-
// Union — both levels contribute to the disabled set
|
|
259
|
-
...(disabledTools.length > 0 ? { disabled_tools: [...new Set(disabledTools)] } : {}),
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
// ---------------------------------------------------------------------------
|
|
263
|
-
// OpenCode config directory detection (same logic as oh-my-opencode)
|
|
264
|
-
// ---------------------------------------------------------------------------
|
|
265
|
-
function getOpenCodeConfigDir() {
|
|
266
|
-
// XDG_CONFIG_HOME or ~/.config, then /opencode
|
|
267
|
-
const xdgConfig = process.env.XDG_CONFIG_HOME || join(process.env.HOME || "~", ".config");
|
|
268
|
-
return join(xdgConfig, "opencode");
|
|
269
|
-
}
|
|
270
|
-
// ---------------------------------------------------------------------------
|
|
271
|
-
// Public API: loadAftConfig
|
|
272
|
-
// ---------------------------------------------------------------------------
|
|
273
|
-
/**
|
|
274
|
-
* Load AFT config using the same two-level pattern as oh-my-opencode:
|
|
275
|
-
*
|
|
276
|
-
* 1. User-level: ~/.config/opencode/aft.jsonc (or .json)
|
|
277
|
-
* 2. Project-level: <project>/.opencode/aft.jsonc (or .json)
|
|
278
|
-
*
|
|
279
|
-
* Project config merges on top of user config.
|
|
280
|
-
* Both support JSONC (comments allowed).
|
|
281
|
-
* Invalid sections are skipped, valid sections still load.
|
|
282
|
-
*/
|
|
283
|
-
export function loadAftConfig(projectDirectory) {
|
|
284
|
-
// User-level config
|
|
285
|
-
const configDir = getOpenCodeConfigDir();
|
|
286
|
-
const userBasePath = join(configDir, "aft");
|
|
287
|
-
const userDetected = detectConfigFile(userBasePath);
|
|
288
|
-
const userConfigPath = userDetected.format !== "none" ? userDetected.path : `${userBasePath}.json`;
|
|
289
|
-
// Project-level config
|
|
290
|
-
const projectBasePath = join(projectDirectory, ".opencode", "aft");
|
|
291
|
-
const projectDetected = detectConfigFile(projectBasePath);
|
|
292
|
-
const projectConfigPath = projectDetected.format !== "none" ? projectDetected.path : `${projectBasePath}.json`;
|
|
293
|
-
// Load user config first (base)
|
|
294
|
-
let config = loadConfigFromPath(userConfigPath) ?? {};
|
|
295
|
-
// Override with project config
|
|
296
|
-
const projectConfig = loadConfigFromPath(projectConfigPath);
|
|
297
|
-
if (projectConfig) {
|
|
298
|
-
config = mergeConfigs(config, projectConfig);
|
|
299
|
-
}
|
|
300
|
-
return config;
|
|
301
|
-
}
|
|
302
|
-
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|