@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.
Files changed (94) hide show
  1. package/dist/bridge.d.ts.map +1 -1
  2. package/dist/config.d.ts +1 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +25413 -182
  6. package/dist/notifications.d.ts +48 -0
  7. package/dist/notifications.d.ts.map +1 -0
  8. package/dist/onnx-runtime.d.ts +35 -0
  9. package/dist/onnx-runtime.d.ts.map +1 -0
  10. package/dist/pool.d.ts +2 -0
  11. package/dist/pool.d.ts.map +1 -1
  12. package/dist/resolver.d.ts.map +1 -1
  13. package/dist/shared/opencode-config-dir.d.ts +16 -0
  14. package/dist/shared/opencode-config-dir.d.ts.map +1 -0
  15. package/dist/shared/rpc-client.d.ts +16 -0
  16. package/dist/shared/rpc-client.d.ts.map +1 -0
  17. package/dist/shared/rpc-server.d.ts +17 -0
  18. package/dist/shared/rpc-server.d.ts.map +1 -0
  19. package/dist/shared/rpc-utils.d.ts +11 -0
  20. package/dist/shared/rpc-utils.d.ts.map +1 -0
  21. package/dist/shared/runtime.d.ts +10 -0
  22. package/dist/shared/runtime.d.ts.map +1 -0
  23. package/dist/shared/status.d.ts +37 -0
  24. package/dist/shared/status.d.ts.map +1 -0
  25. package/dist/shared/tui-config.d.ts +2 -0
  26. package/dist/shared/tui-config.d.ts.map +1 -0
  27. package/dist/shared/url-fetch.d.ts +11 -0
  28. package/dist/shared/url-fetch.d.ts.map +1 -0
  29. package/dist/tools/reading.d.ts.map +1 -1
  30. package/dist/tools/search.d.ts.map +1 -1
  31. package/dist/tools/semantic.d.ts +4 -0
  32. package/dist/tools/semantic.d.ts.map +1 -0
  33. package/dist/types.d.ts +2 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/package.json +29 -9
  36. package/src/shared/opencode-config-dir.ts +46 -0
  37. package/src/shared/rpc-client.ts +123 -0
  38. package/src/shared/rpc-server.ts +135 -0
  39. package/src/shared/rpc-utils.ts +21 -0
  40. package/src/shared/runtime.ts +26 -0
  41. package/src/shared/status.ts +206 -0
  42. package/src/shared/tui-config.ts +58 -0
  43. package/src/shared/url-fetch.ts +237 -0
  44. package/src/tui/index.tsx +209 -0
  45. package/src/tui/types/opencode-plugin-tui.d.ts +232 -0
  46. package/dist/bridge.js +0 -311
  47. package/dist/bridge.js.map +0 -1
  48. package/dist/config.js +0 -302
  49. package/dist/config.js.map +0 -1
  50. package/dist/downloader.js +0 -198
  51. package/dist/downloader.js.map +0 -1
  52. package/dist/index.js.map +0 -1
  53. package/dist/logger.js +0 -78
  54. package/dist/logger.js.map +0 -1
  55. package/dist/lsp.js +0 -79
  56. package/dist/lsp.js.map +0 -1
  57. package/dist/metadata-store.js +0 -53
  58. package/dist/metadata-store.js.map +0 -1
  59. package/dist/normalize-schemas.js +0 -45
  60. package/dist/normalize-schemas.js.map +0 -1
  61. package/dist/patch-parser.js +0 -247
  62. package/dist/patch-parser.js.map +0 -1
  63. package/dist/platform.js +0 -31
  64. package/dist/platform.js.map +0 -1
  65. package/dist/pool.js +0 -111
  66. package/dist/pool.js.map +0 -1
  67. package/dist/resolver.js +0 -168
  68. package/dist/resolver.js.map +0 -1
  69. package/dist/tools/ast.js +0 -200
  70. package/dist/tools/ast.js.map +0 -1
  71. package/dist/tools/conflicts.js +0 -20
  72. package/dist/tools/conflicts.js.map +0 -1
  73. package/dist/tools/hoisted.js +0 -870
  74. package/dist/tools/hoisted.js.map +0 -1
  75. package/dist/tools/imports.js +0 -90
  76. package/dist/tools/imports.js.map +0 -1
  77. package/dist/tools/lsp.js +0 -58
  78. package/dist/tools/lsp.js.map +0 -1
  79. package/dist/tools/navigation.js +0 -58
  80. package/dist/tools/navigation.js.map +0 -1
  81. package/dist/tools/permissions.js +0 -50
  82. package/dist/tools/permissions.js.map +0 -1
  83. package/dist/tools/reading.js +0 -229
  84. package/dist/tools/reading.js.map +0 -1
  85. package/dist/tools/refactoring.js +0 -129
  86. package/dist/tools/refactoring.js.map +0 -1
  87. package/dist/tools/safety.js +0 -83
  88. package/dist/tools/safety.js.map +0 -1
  89. package/dist/tools/search.js +0 -88
  90. package/dist/tools/search.js.map +0 -1
  91. package/dist/tools/structure.js +0 -157
  92. package/dist/tools/structure.js.map +0 -1
  93. package/dist/types.js +0 -2
  94. 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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}