@bouncesecurity/aghast 0.4.4 → 0.6.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 (109) hide show
  1. package/README.md +8 -3
  2. package/config/pricing.json +42 -0
  3. package/config/prompts/false-positive-validation.md +1 -0
  4. package/config/prompts/general-vuln-discovery.md +8 -3
  5. package/config/prompts/generic-instructions.md +3 -2
  6. package/dist/budget.d.ts +62 -0
  7. package/dist/budget.d.ts.map +1 -0
  8. package/dist/budget.js +137 -0
  9. package/dist/budget.js.map +1 -0
  10. package/dist/build-config.d.ts +15 -0
  11. package/dist/build-config.d.ts.map +1 -0
  12. package/dist/build-config.js +568 -0
  13. package/dist/build-config.js.map +1 -0
  14. package/dist/check-library.d.ts +1 -0
  15. package/dist/check-library.d.ts.map +1 -1
  16. package/dist/check-library.js +26 -7
  17. package/dist/check-library.js.map +1 -1
  18. package/dist/check-types.d.ts +1 -1
  19. package/dist/check-types.d.ts.map +1 -1
  20. package/dist/claude-code-provider.d.ts +6 -6
  21. package/dist/claude-code-provider.d.ts.map +1 -1
  22. package/dist/claude-code-provider.js +151 -66
  23. package/dist/claude-code-provider.js.map +1 -1
  24. package/dist/cli.js +19 -3
  25. package/dist/cli.js.map +1 -1
  26. package/dist/colors.js +4 -4
  27. package/dist/colors.js.map +1 -1
  28. package/dist/cost-calculator.d.ts +80 -0
  29. package/dist/cost-calculator.d.ts.map +1 -0
  30. package/dist/cost-calculator.js +226 -0
  31. package/dist/cost-calculator.js.map +1 -0
  32. package/dist/defaults.d.ts +21 -0
  33. package/dist/defaults.d.ts.map +1 -0
  34. package/dist/defaults.js +21 -0
  35. package/dist/defaults.js.map +1 -0
  36. package/dist/discoveries/openant-discovery.d.ts.map +1 -1
  37. package/dist/discoveries/openant-discovery.js +3 -2
  38. package/dist/discoveries/openant-discovery.js.map +1 -1
  39. package/dist/discoveries/sarif-discovery.d.ts.map +1 -1
  40. package/dist/discoveries/sarif-discovery.js +2 -1
  41. package/dist/discoveries/sarif-discovery.js.map +1 -1
  42. package/dist/discoveries/semgrep-discovery.d.ts.map +1 -1
  43. package/dist/discoveries/semgrep-discovery.js +11 -2
  44. package/dist/discoveries/semgrep-discovery.js.map +1 -1
  45. package/dist/discovery.d.ts +8 -2
  46. package/dist/discovery.d.ts.map +1 -1
  47. package/dist/discovery.js +8 -0
  48. package/dist/discovery.js.map +1 -1
  49. package/dist/error-codes.d.ts +3 -1
  50. package/dist/error-codes.d.ts.map +1 -1
  51. package/dist/error-codes.js +10 -3
  52. package/dist/error-codes.js.map +1 -1
  53. package/dist/formatters/types.d.ts +1 -1
  54. package/dist/formatters/types.js +1 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +257 -82
  57. package/dist/index.js.map +1 -1
  58. package/dist/logging.d.ts +1 -1
  59. package/dist/logging.d.ts.map +1 -1
  60. package/dist/logging.js +50 -31
  61. package/dist/logging.js.map +1 -1
  62. package/dist/{mock-ai-provider.d.ts → mock-agent-provider.d.ts} +10 -7
  63. package/dist/mock-agent-provider.d.ts.map +1 -0
  64. package/dist/{mock-ai-provider.js → mock-agent-provider.js} +15 -8
  65. package/dist/mock-agent-provider.js.map +1 -0
  66. package/dist/new-check.js +2 -2
  67. package/dist/new-check.js.map +1 -1
  68. package/dist/opencode-provider.d.ts +63 -0
  69. package/dist/opencode-provider.d.ts.map +1 -0
  70. package/dist/opencode-provider.js +614 -0
  71. package/dist/opencode-provider.js.map +1 -0
  72. package/dist/prompt-template.d.ts.map +1 -1
  73. package/dist/prompt-template.js +2 -1
  74. package/dist/prompt-template.js.map +1 -1
  75. package/dist/provider-registry.d.ts +6 -6
  76. package/dist/provider-registry.d.ts.map +1 -1
  77. package/dist/provider-registry.js +6 -4
  78. package/dist/provider-registry.js.map +1 -1
  79. package/dist/provider-utils.d.ts +52 -0
  80. package/dist/provider-utils.d.ts.map +1 -0
  81. package/dist/provider-utils.js +40 -0
  82. package/dist/provider-utils.js.map +1 -0
  83. package/dist/response-parser.d.ts +8 -6
  84. package/dist/response-parser.d.ts.map +1 -1
  85. package/dist/response-parser.js +8 -6
  86. package/dist/response-parser.js.map +1 -1
  87. package/dist/runtime-config.d.ts +4 -4
  88. package/dist/runtime-config.d.ts.map +1 -1
  89. package/dist/runtime-config.js +107 -8
  90. package/dist/runtime-config.js.map +1 -1
  91. package/dist/scan-history.d.ts +82 -0
  92. package/dist/scan-history.d.ts.map +1 -0
  93. package/dist/scan-history.js +127 -0
  94. package/dist/scan-history.js.map +1 -0
  95. package/dist/scan-runner.d.ts +67 -4
  96. package/dist/scan-runner.d.ts.map +1 -1
  97. package/dist/scan-runner.js +267 -51
  98. package/dist/scan-runner.js.map +1 -1
  99. package/dist/stats.d.ts +11 -0
  100. package/dist/stats.d.ts.map +1 -0
  101. package/dist/stats.js +197 -0
  102. package/dist/stats.js.map +1 -0
  103. package/dist/types.d.ts +74 -8
  104. package/dist/types.d.ts.map +1 -1
  105. package/dist/types.js +3 -3
  106. package/dist/types.js.map +1 -1
  107. package/package.json +6 -4
  108. package/dist/mock-ai-provider.d.ts.map +0 -1
  109. package/dist/mock-ai-provider.js.map +0 -1
@@ -0,0 +1,614 @@
1
+ /**
2
+ * OpenCode agent provider implementation.
3
+ * Uses @opencode-ai/sdk v2 API to delegate to any LLM provider supported by OpenCode.
4
+ *
5
+ * Progress logging: at trace level, a 1-second poller fetches session messages to
6
+ * log tool calls and text parts in real-time while session.prompt() blocks.
7
+ */
8
+ import { exec } from 'node:child_process';
9
+ import { existsSync, rmSync } from 'node:fs';
10
+ import { rm as rmAsync } from 'node:fs/promises';
11
+ import { join } from 'node:path';
12
+ import { promisify } from 'node:util';
13
+ import { FatalProviderError } from './types.js';
14
+ import { parseAgentResponse } from './response-parser.js';
15
+ import { OUTPUT_SCHEMA } from './provider-utils.js';
16
+ import { logProgress, logDebug, logDebugFull, createTimer, getLogLevel } from './logging.js';
17
+ const execAsync = promisify(exec);
18
+ const TAG = 'opencode-provider';
19
+ const DEFAULT_OPENCODE_MODEL = 'opencode/hy3-preview-free';
20
+ // Tools the agent is permitted to use — everything else is denied.
21
+ const ALLOWED_TOOL_PERMISSIONS = new Set(['read', 'glob', 'grep', 'list']);
22
+ const HEARTBEAT_INTERVAL_MS = 15000;
23
+ const TRACE_POLL_MS = 1000;
24
+ const CLOSE_TIMEOUT_MS = 5000;
25
+ /**
26
+ * Parse a "providerID/modelID" string into its components.
27
+ * Falls back to the default if not provided.
28
+ */
29
+ function parseModelString(model) {
30
+ const raw = model ?? DEFAULT_OPENCODE_MODEL;
31
+ const slashIdx = raw.indexOf('/');
32
+ if (slashIdx === -1) {
33
+ throw new Error(`Invalid model format "${raw}" for opencode provider. Expected "providerID/modelID" (e.g. "anthropic/claude-sonnet-4-20250514").`);
34
+ }
35
+ return { providerID: raw.slice(0, slashIdx), modelID: raw.slice(slashIdx + 1) };
36
+ }
37
+ /** Verify that the opencode binary is installed and runnable. */
38
+ function verifyOpenCodeInstalled() {
39
+ // Use `exec` (single command string, always uses shell) instead of `execFile` with
40
+ // shell:true + args array. The latter triggers DEP0190 on Node 22+; the former does not.
41
+ // Shell is required on Windows to invoke opencode's .cmd wrapper — spawning .cmd
42
+ // directly is blocked by the CVE-2024-27980 mitigation. No user input is interpolated
43
+ // into the command, so there is no injection surface.
44
+ return new Promise((resolve, reject) => {
45
+ exec('opencode --version', (error, stdout, stderr) => {
46
+ if (error) {
47
+ // `exec` routes both "spawn failed" (binary not on PATH) and "ran but exited
48
+ // non-zero" (e.g. corrupt config, permission issue) through the same error
49
+ // callback. We can't tell the two apart reliably cross-platform, so the
50
+ // message has to cover both possibilities — otherwise a user with a broken
51
+ // install is sent on a wild goose chase reinstalling an already-present binary.
52
+ const detail = (stderr || stdout || error.message).toString().trim();
53
+ const suffix = detail ? ` Details: ${detail}` : '';
54
+ reject(new Error(`OpenCode is required for the 'opencode' agent provider but \`opencode --version\` failed. ` +
55
+ `Either OpenCode is not installed (get it from https://opencode.ai) or the installed binary returned an error.${suffix}`));
56
+ return;
57
+ }
58
+ resolve();
59
+ });
60
+ });
61
+ }
62
+ export class OpenCodeProvider {
63
+ providerID = '';
64
+ modelID = '';
65
+ _client;
66
+ _server;
67
+ cleanedUp = false;
68
+ signalHandler;
69
+ /** Refcount of project markers we created, keyed by absolute repositoryPath.
70
+ * An entry exists ONLY when we created the marker — we never track pre-existing `.git`. */
71
+ createdMarkers = new Map();
72
+ /** FIFO async mutex serializing mutations to createdMarkers. Guards against races
73
+ * between the N parallel executeCheck calls that share one repositoryPath. */
74
+ markerMutex = Promise.resolve();
75
+ /** Skip project-marker logic when a mock client was injected (tests use fake paths). */
76
+ skipProjectMarker;
77
+ constructor(options) {
78
+ if (options?._client) {
79
+ this._client = options._client;
80
+ }
81
+ this.skipProjectMarker = !!options?._client;
82
+ }
83
+ checkPrerequisites() {
84
+ // OpenCode manages its own credentials — no env var prerequisites to check.
85
+ }
86
+ async initialize(config) {
87
+ const parsed = parseModelString(config.model);
88
+ this.providerID = parsed.providerID;
89
+ this.modelID = parsed.modelID;
90
+ // Skip server startup if a mock client was injected via constructor
91
+ if (this._client) {
92
+ logDebug(TAG, 'Using injected client (test mode)');
93
+ await this.validateModel();
94
+ logDebug(TAG, `Provider initialized with model ${this.providerID}/${this.modelID}`);
95
+ return;
96
+ }
97
+ // Verify opencode binary is installed
98
+ await verifyOpenCodeInstalled();
99
+ const { createOpencode } = await import('@opencode-ai/sdk/v2');
100
+ logProgress(TAG, 'Starting OpenCode server...');
101
+ const opencode = await createOpencode({
102
+ port: 0,
103
+ });
104
+ this._client = opencode.client;
105
+ this._server = opencode.server;
106
+ logProgress(TAG, `OpenCode server started at ${this._server.url}`);
107
+ // Register signal handlers for cleanup on unexpected exit.
108
+ // SIGHUP catches terminal-window-close (sent as SIGHUP on Unix; Node maps
109
+ // Windows CTRL_CLOSE_EVENT to the same event) — critical for cleaning up the
110
+ // transient .git marker when a user closes their terminal mid-scan.
111
+ this.signalHandler = () => {
112
+ this.cleanupSync();
113
+ process.exit(1);
114
+ };
115
+ process.on('SIGINT', this.signalHandler);
116
+ process.on('SIGTERM', this.signalHandler);
117
+ process.on('SIGHUP', this.signalHandler);
118
+ if (process.platform === 'win32') {
119
+ process.on('SIGBREAK', this.signalHandler);
120
+ }
121
+ try {
122
+ await this.validateModel();
123
+ }
124
+ catch (err) {
125
+ this.cleanupSync();
126
+ throw err;
127
+ }
128
+ logDebug(TAG, `Provider initialized with model ${this.providerID}/${this.modelID}`);
129
+ }
130
+ async validateModel() {
131
+ const client = this._client;
132
+ const result = await client.config.providers();
133
+ const data = result.data;
134
+ const providers = data?.providers ?? [];
135
+ const provider = providers.find(p => p.id === this.providerID);
136
+ if (!provider) {
137
+ const available = providers.map(p => p.id).join(', ') || '(none)';
138
+ throw new FatalProviderError(`OpenCode provider "${this.providerID}" not found. Available providers: ${available}. Run 'opencode' and use /connect to configure providers.`);
139
+ }
140
+ const models = provider.models ? Object.keys(provider.models) : [];
141
+ if (models.length > 0 && !models.includes(this.modelID)) {
142
+ const availableModels = models.map(m => `${this.providerID}/${m}`).join(', ');
143
+ const availableProviders = providers.map(p => p.id).join(', ') || '(none)';
144
+ throw new FatalProviderError(`Model "${this.modelID}" not found for provider "${this.providerID}". Available models: ${availableModels}. Available providers: ${availableProviders}.`);
145
+ }
146
+ }
147
+ async listModels() {
148
+ if (!this._client) {
149
+ throw new Error('OpenCode provider not initialized — call initialize() first');
150
+ }
151
+ const result = await this._client.config.providers();
152
+ const data = result.data;
153
+ const providers = data?.providers ?? [];
154
+ const out = [];
155
+ for (const provider of providers) {
156
+ const models = provider.models ?? {};
157
+ for (const [modelID, model] of Object.entries(models)) {
158
+ out.push({
159
+ id: `${provider.id}/${modelID}`,
160
+ label: model.name ?? modelID,
161
+ description: provider.name,
162
+ });
163
+ }
164
+ }
165
+ return out;
166
+ }
167
+ getModelName() {
168
+ return `${this.providerID}/${this.modelID}`;
169
+ }
170
+ setModel(model) {
171
+ const parsed = parseModelString(model);
172
+ this.providerID = parsed.providerID;
173
+ this.modelID = parsed.modelID;
174
+ }
175
+ /** Run `fn` under an async FIFO mutex so refcount mutations and fs ops don't race. */
176
+ async withMarkerLock(fn) {
177
+ const prev = this.markerMutex;
178
+ let release;
179
+ this.markerMutex = new Promise((r) => { release = r; });
180
+ await prev;
181
+ try {
182
+ return await fn();
183
+ }
184
+ finally {
185
+ release();
186
+ }
187
+ }
188
+ /** Ensure `.git` exists at repositoryPath so OpenCode treats it as the project root.
189
+ * No-op if a `.git` already exists (whether directory or file) — we never touch
190
+ * pre-existing markers. If we create it, track it via refcount so concurrent
191
+ * targets with the same path coordinate correctly. Non-fatal on failure:
192
+ * falls through to whatever OpenCode does by default (walk up to parent repo),
193
+ * which is what the user saw before this fix. */
194
+ async ensureProjectMarker(repositoryPath) {
195
+ if (this.skipProjectMarker)
196
+ return;
197
+ await this.withMarkerLock(async () => {
198
+ const existing = this.createdMarkers.get(repositoryPath);
199
+ if (existing !== undefined) {
200
+ this.createdMarkers.set(repositoryPath, existing + 1);
201
+ return;
202
+ }
203
+ if (existsSync(join(repositoryPath, '.git'))) {
204
+ // Pre-existing — not ours, no refcount. OpenCode will use this naturally.
205
+ return;
206
+ }
207
+ const gitPath = join(repositoryPath, '.git');
208
+ // Record BEFORE running git init. If SIGINT/SIGHUP fires while git init is
209
+ // running — or in the race window between init completing and the set() call
210
+ // — the sync cleanup handler iterates createdMarkers and rmSync's whatever's
211
+ // at gitPath. rmSync with { force: true } is lenient on ENOENT, so recording
212
+ // before a would-be-nonexistent path is safe.
213
+ this.createdMarkers.set(repositoryPath, 1);
214
+ try {
215
+ await execAsync('git init -q', { cwd: repositoryPath });
216
+ // Info-level: we are touching the user's filesystem. They should see it without --debug.
217
+ logProgress(TAG, `Created transient ${gitPath} so OpenCode treats this directory as its project root. ` +
218
+ `Will be removed when the scan finishes.`);
219
+ }
220
+ catch (err) {
221
+ // Init failed — remove the phantom refcount so release doesn't try to rm a
222
+ // non-existent .git (harmless but produces a confusing warning log).
223
+ this.createdMarkers.delete(repositoryPath);
224
+ logProgress(TAG, `Warning: could not create project marker at ${gitPath}: ${err instanceof Error ? err.message : String(err)}. ` +
225
+ `File reads may resolve against the nearest ancestor .git instead, which can cause ENOENT errors.`);
226
+ }
227
+ });
228
+ }
229
+ /** Release one reference to a project marker. When refcount hits zero, remove it.
230
+ * Pre-existing (non-ours) markers are ignored. */
231
+ async releaseProjectMarker(repositoryPath) {
232
+ if (this.skipProjectMarker)
233
+ return;
234
+ await this.withMarkerLock(async () => {
235
+ const count = this.createdMarkers.get(repositoryPath);
236
+ if (count === undefined)
237
+ return;
238
+ if (count > 1) {
239
+ this.createdMarkers.set(repositoryPath, count - 1);
240
+ return;
241
+ }
242
+ this.createdMarkers.delete(repositoryPath);
243
+ const gitPath = join(repositoryPath, '.git');
244
+ try {
245
+ await rmAsync(gitPath, { recursive: true, force: true });
246
+ // Removal is the symmetric cleanup — debug is fine, users don't need to see it at info.
247
+ logDebug(TAG, `Removed transient project marker at ${gitPath}`);
248
+ }
249
+ catch (err) {
250
+ // Failure to remove leaves state on the filesystem — surface at info.
251
+ logProgress(TAG, `Warning: could not remove transient project marker at ${gitPath}: ${err instanceof Error ? err.message : String(err)}. ` +
252
+ `You may need to remove it manually.`);
253
+ }
254
+ });
255
+ }
256
+ /** Synchronously wipe all markers we created. Used by signal handlers where
257
+ * async cleanup is unsafe. Does NOT acquire the mutex — signal handlers run
258
+ * between event loop ticks, so we observe a consistent map snapshot. */
259
+ cleanupMarkersSync() {
260
+ for (const [path] of this.createdMarkers) {
261
+ try {
262
+ rmSync(join(path, '.git'), { recursive: true, force: true });
263
+ }
264
+ catch {
265
+ // Best-effort in signal handler — process is about to exit anyway.
266
+ }
267
+ }
268
+ this.createdMarkers.clear();
269
+ }
270
+ async executeCheck(instructions, repositoryPath, logPrefix, _options) {
271
+ if (!this._client) {
272
+ throw new Error('OpenCode provider not initialized — call initialize() first');
273
+ }
274
+ // Ensure OpenCode treats repositoryPath as its project root. Without this, when
275
+ // repositoryPath is a subdirectory of some other git repo, OpenCode walks up to
276
+ // the ancestor .git and resolves all Read-tool paths relative to THAT directory,
277
+ // causing ENOENT for every target file. This creates a transient `.git` marker
278
+ // we remove when the scan finishes (refcounted across parallel targets).
279
+ await this.ensureProjectMarker(repositoryPath);
280
+ try {
281
+ return await this.executeCheckInner(instructions, repositoryPath, logPrefix);
282
+ }
283
+ finally {
284
+ await this.releaseProjectMarker(repositoryPath);
285
+ }
286
+ }
287
+ async executeCheckInner(instructions, repositoryPath, logPrefix) {
288
+ const client = this._client;
289
+ const timer = createTimer();
290
+ const prefix = logPrefix ? `${logPrefix} ` : '';
291
+ // Build a virtual allowlist: fetch all available tool IDs and deny everything
292
+ // not in ALLOWED_TOOL_PERMISSIONS. This adapts automatically to new or MCP tools
293
+ // rather than relying on a static blocklist that could miss future additions.
294
+ const permission = [];
295
+ try {
296
+ const toolIdsResult = await client.tool.ids({ directory: repositoryPath });
297
+ const allToolIds = toolIdsResult.data ?? [];
298
+ for (const id of allToolIds) {
299
+ if (!ALLOWED_TOOL_PERMISSIONS.has(id.toLowerCase())) {
300
+ permission.push({ permission: id, pattern: '*', action: 'deny' });
301
+ }
302
+ }
303
+ logDebug(TAG, `${prefix}Permission ruleset: allowing ${[...ALLOWED_TOOL_PERMISSIONS].join(', ')}; denying ${permission.length} other tools`);
304
+ }
305
+ catch (err) {
306
+ logDebug(TAG, `${prefix}Could not fetch tool IDs, skipping permission ruleset: ${err instanceof Error ? err.message : String(err)}`);
307
+ }
308
+ // Create an isolated session for this check
309
+ logDebug(TAG, `${prefix}Creating session for check (cwd=${repositoryPath})`);
310
+ const sessionResult = await client.session.create({
311
+ title: 'aghast security check',
312
+ directory: repositoryPath,
313
+ ...(permission.length > 0 ? { permission } : {}),
314
+ });
315
+ const sessionId = sessionResult.data?.id;
316
+ if (!sessionId) {
317
+ throw new Error('Failed to create OpenCode session — no session ID returned');
318
+ }
319
+ logDebug(TAG, `${prefix}Session created: ${sessionId}`);
320
+ logDebug(TAG, `${prefix}Starting query: model=${this.providerID}/${this.modelID}, promptLen=${instructions.length}`);
321
+ logDebugFull(TAG, `${prefix}Full prompt sent to AI`, instructions);
322
+ // At trace level, poll session messages every second for real-time progress.
323
+ // session.prompt() blocks, but setInterval callbacks run during the await.
324
+ let toolCallCount = 0;
325
+ let lastLoggedPartCount = 0;
326
+ let lastActivityTime = Date.now();
327
+ const logLevel = getLogLevel();
328
+ const isDebugOrTrace = logLevel === 'debug' || logLevel === 'trace';
329
+ const trace = logLevel === 'trace';
330
+ const progressInterval = isDebugOrTrace ? setInterval(async () => {
331
+ try {
332
+ const messagesResult = await client.session.messages({
333
+ sessionID: sessionId,
334
+ directory: repositoryPath,
335
+ });
336
+ const messages = messagesResult.data ?? [];
337
+ const assistantMsg = [...messages].reverse().find((m) => m.info.role === 'assistant');
338
+ if (!assistantMsg)
339
+ return;
340
+ const parts = assistantMsg.parts;
341
+ if (parts.length <= lastLoggedPartCount)
342
+ return;
343
+ for (let i = lastLoggedPartCount; i < parts.length; i++) {
344
+ const part = parts[i];
345
+ lastActivityTime = Date.now();
346
+ if (part.type === 'tool') {
347
+ const state = part.state;
348
+ const toolName = part.tool ?? 'unknown';
349
+ const inputPreview = previewJSON(state?.input, 200);
350
+ if (state?.status === 'running') {
351
+ toolCallCount++;
352
+ logDebug(TAG, `${prefix}Tool[${toolCallCount}]: ${toolName} ${inputPreview} (${timer.elapsedStr()})`);
353
+ if (trace && JSON.stringify(state?.input).length > 200) {
354
+ logDebugFull(TAG, `${prefix}Full tool call input`, JSON.stringify(state?.input));
355
+ }
356
+ }
357
+ else if (state?.status === 'completed') {
358
+ logDebug(TAG, `${prefix}Tool done: ${toolName} (${timer.elapsedStr()})`);
359
+ const toolOutput = state?.output ?? '';
360
+ if (trace && toolOutput.length > 200)
361
+ logDebugFull(TAG, `${prefix}Full tool output (${toolOutput.length} chars)`, toolOutput);
362
+ }
363
+ else if (state?.status === 'error') {
364
+ // Tools can transition running → error between polls, so the "running" log
365
+ // line may never fire for this tool. Always include the input so the user
366
+ // can see what was being attempted, plus the error message from the SDK.
367
+ const errorMsg = state.error ?? '(no error message)';
368
+ const errorPreview = errorMsg.length > 300 ? errorMsg.slice(0, 300) + '...' : errorMsg;
369
+ logDebug(TAG, `${prefix}Tool error: ${toolName} ${inputPreview} → ${errorPreview} (${timer.elapsedStr()})`);
370
+ }
371
+ }
372
+ else if (part.type === 'text' && part.text) {
373
+ const preview = part.text.length > 150 ? part.text.slice(0, 150) + '...' : part.text;
374
+ logDebug(TAG, `${prefix}Text: ${preview}`);
375
+ if (trace && part.text.length > 150)
376
+ logDebugFull(TAG, `${prefix}Full assistant text`, part.text);
377
+ }
378
+ }
379
+ lastLoggedPartCount = parts.length;
380
+ }
381
+ catch {
382
+ // Polling failure is non-fatal
383
+ }
384
+ }, TRACE_POLL_MS) : undefined;
385
+ // Heartbeat timer (all log levels)
386
+ const heartbeatInterval = setInterval(() => {
387
+ const silentSeconds = Math.round((Date.now() - lastActivityTime) / 1000);
388
+ if (silentSeconds >= HEARTBEAT_INTERVAL_MS / 1000) {
389
+ logDebug(TAG, `${prefix}Still waiting... (${timer.elapsedStr()})`);
390
+ }
391
+ }, HEARTBEAT_INTERVAL_MS);
392
+ let promptResult;
393
+ try {
394
+ promptResult = await client.session.prompt({
395
+ sessionID: sessionId,
396
+ model: { providerID: this.providerID, modelID: this.modelID },
397
+ parts: [{ type: 'text', text: instructions }],
398
+ format: {
399
+ type: 'json_schema',
400
+ schema: OUTPUT_SCHEMA,
401
+ },
402
+ directory: repositoryPath,
403
+ });
404
+ }
405
+ finally {
406
+ if (progressInterval)
407
+ clearInterval(progressInterval);
408
+ clearInterval(heartbeatInterval);
409
+ }
410
+ let info = promptResult.data?.info;
411
+ let parts = promptResult.data?.parts;
412
+ // Some providers (e.g. OpenRouter routing) reject requests when tool_choice is set,
413
+ // which is how OpenCode enforces the permission denylist. Detect this and retry once
414
+ // without restrictions so the scan can still complete (security mitigation won't apply).
415
+ if (permission.length > 0 &&
416
+ info?.error?.name === 'APIError') {
417
+ const rawErrMsg = 'data' in info.error && info.error.data && typeof info.error.data === 'object' && 'message' in info.error.data
418
+ ? String(info.error.data.message)
419
+ : info.error.name;
420
+ if (/tool.?choice/i.test(rawErrMsg)) {
421
+ logProgress(TAG, `${prefix}Warning: provider does not support tool restrictions (tool_choice unsupported) — retrying without permission ruleset. The prompt injection security mitigation will not apply for this check.`);
422
+ const retrySession = await client.session.create({
423
+ title: 'aghast security check',
424
+ directory: repositoryPath,
425
+ });
426
+ const retrySessionId = retrySession.data?.id;
427
+ if (!retrySessionId) {
428
+ throw new Error('Failed to create OpenCode retry session — no session ID returned');
429
+ }
430
+ // Omit json_schema format — OpenCode also uses tool_choice to enforce structured
431
+ // output, which would trigger the same error. Text parsing handles the response instead.
432
+ const retryResult = await client.session.prompt({
433
+ sessionID: retrySessionId,
434
+ model: { providerID: this.providerID, modelID: this.modelID },
435
+ parts: [{ type: 'text', text: instructions }],
436
+ directory: repositoryPath,
437
+ });
438
+ info = retryResult.data?.info;
439
+ parts = retryResult.data?.parts;
440
+ }
441
+ }
442
+ // Check for errors on the assistant message
443
+ if (info?.error) {
444
+ const err = info.error;
445
+ const errName = err.name;
446
+ const errMsg = 'data' in err && err.data && typeof err.data === 'object' && 'message' in err.data
447
+ ? String(err.data.message)
448
+ : errName;
449
+ // StructuredOutputError: model doesn't support JSON schema output.
450
+ // Fall through to text-based parsing instead of failing.
451
+ if (errName === 'StructuredOutputError') {
452
+ logDebug(TAG, `${prefix}Model does not support structured output — falling back to text parsing`);
453
+ }
454
+ else {
455
+ if (errName === 'ProviderAuthError') {
456
+ throw new FatalProviderError(`OpenCode authentication failed: ${errMsg}. Run 'opencode' and use /connect to configure credentials.`);
457
+ }
458
+ if (errName === 'APIError' && /rate.?limit|429/i.test(errMsg)) {
459
+ throw new FatalProviderError(`OpenCode rate limit reached: ${errMsg}`);
460
+ }
461
+ throw new Error(`OpenCode AI error (${errName}): ${errMsg}`);
462
+ }
463
+ }
464
+ // Extract token usage
465
+ let tokenUsage;
466
+ if (!info?.tokens) {
467
+ logDebug(TAG, `${prefix}Token usage not reported by provider`);
468
+ }
469
+ else {
470
+ const tokens = info.tokens;
471
+ const inputTokens = tokens.input ?? 0;
472
+ const outputTokens = tokens.output ?? 0;
473
+ const reasoningTokens = tokens.reasoning !== undefined && tokens.reasoning > 0
474
+ ? tokens.reasoning
475
+ : undefined;
476
+ const cacheReadInputTokens = tokens.cache?.read !== undefined && tokens.cache.read > 0
477
+ ? tokens.cache.read
478
+ : undefined;
479
+ const cacheCreationInputTokens = tokens.cache?.write !== undefined && tokens.cache.write > 0
480
+ ? tokens.cache.write
481
+ : undefined;
482
+ const reportedCost = typeof info.cost === 'number'
483
+ ? { amountUsd: info.cost, source: 'opencode' }
484
+ : undefined;
485
+ tokenUsage = {
486
+ inputTokens,
487
+ outputTokens,
488
+ ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),
489
+ ...(cacheReadInputTokens !== undefined ? { cacheReadInputTokens } : {}),
490
+ ...(cacheCreationInputTokens !== undefined ? { cacheCreationInputTokens } : {}),
491
+ totalTokens: inputTokens + outputTokens,
492
+ ...(reportedCost !== undefined ? { reportedCost } : {}),
493
+ };
494
+ logDebug(TAG, `${prefix}Token usage: ${inputTokens} in, ${outputTokens} out${reasoningTokens !== undefined ? `, ${reasoningTokens} reasoning` : ''}${cacheReadInputTokens !== undefined ? `, ${cacheReadInputTokens} cache-read` : ''}${cacheCreationInputTokens !== undefined ? `, ${cacheCreationInputTokens} cache-write` : ''}${reportedCost !== undefined ? `, $${reportedCost.amountUsd} reported` : ''}`);
495
+ }
496
+ // Try structured output first (v2 API: info.structured)
497
+ if (info?.structured) {
498
+ const structuredOutput = info.structured;
499
+ logDebug(TAG, `${prefix}Structured output: ${structuredOutput.issues?.length ?? 0} issues`);
500
+ logDebugFull(TAG, `${prefix}Full AI response (structured)`, JSON.stringify(structuredOutput, null, 2));
501
+ logProgress(TAG, `${prefix}Completed in ${timer.elapsedStr()} (${toolCallCount} tool calls)`);
502
+ const rawText = extractTextFromParts(parts);
503
+ return { raw: rawText, parsed: structuredOutput, tokenUsage };
504
+ }
505
+ // Fallback: extract text from response parts and parse with response-parser
506
+ const rawText = extractTextFromParts(parts);
507
+ logDebug(TAG, `${prefix}No structured output — falling back to text parsing (${rawText.length} chars)`);
508
+ logDebugFull(TAG, `${prefix}Full AI response`, rawText);
509
+ if (!rawText) {
510
+ throw new Error('OpenCode AI returned no text response');
511
+ }
512
+ const parsed = parseAgentResponse(rawText);
513
+ if (parsed) {
514
+ logDebug(TAG, `${prefix}Parsed ${parsed.issues.length} issues from text response`);
515
+ }
516
+ logProgress(TAG, `${prefix}Completed in ${timer.elapsedStr()} (${toolCallCount} tool calls)`);
517
+ return { raw: rawText, parsed: parsed ?? undefined, tokenUsage };
518
+ }
519
+ async validateConfig() {
520
+ return !!this._client;
521
+ }
522
+ /** Synchronous cleanup for signal handlers (best-effort). */
523
+ cleanupSync() {
524
+ if (this.cleanedUp)
525
+ return;
526
+ this.cleanedUp = true;
527
+ // Remove signal handlers so cleanup() (called later via build-config's finally,
528
+ // or by a caller after initialize() throws) doesn't no-op and leave them installed.
529
+ if (this.signalHandler) {
530
+ process.removeListener('SIGINT', this.signalHandler);
531
+ process.removeListener('SIGTERM', this.signalHandler);
532
+ process.removeListener('SIGHUP', this.signalHandler);
533
+ if (process.platform === 'win32') {
534
+ process.removeListener('SIGBREAK', this.signalHandler);
535
+ }
536
+ this.signalHandler = undefined;
537
+ }
538
+ // Wipe any transient .git markers we created before exiting.
539
+ this.cleanupMarkersSync();
540
+ if (this._server) {
541
+ try {
542
+ this._server.close();
543
+ }
544
+ catch {
545
+ // Best-effort in signal handler
546
+ }
547
+ }
548
+ }
549
+ async cleanup() {
550
+ if (this.cleanedUp)
551
+ return;
552
+ this.cleanedUp = true;
553
+ // Remove signal handlers
554
+ if (this.signalHandler) {
555
+ process.removeListener('SIGINT', this.signalHandler);
556
+ process.removeListener('SIGTERM', this.signalHandler);
557
+ process.removeListener('SIGHUP', this.signalHandler);
558
+ if (process.platform === 'win32') {
559
+ process.removeListener('SIGBREAK', this.signalHandler);
560
+ }
561
+ this.signalHandler = undefined;
562
+ }
563
+ // Force-remove any markers still tracked (normally refcount already brought them
564
+ // to zero via releaseProjectMarker; this covers the case where executeCheck threw
565
+ // before reaching its finally block).
566
+ for (const [path] of this.createdMarkers) {
567
+ try {
568
+ await rmAsync(join(path, '.git'), { recursive: true, force: true });
569
+ }
570
+ catch (err) {
571
+ logDebug(TAG, `Failed to remove marker at ${path} during cleanup: ${err instanceof Error ? err.message : String(err)}`);
572
+ }
573
+ }
574
+ this.createdMarkers.clear();
575
+ if (this._server) {
576
+ logProgress(TAG, 'Stopping OpenCode server...');
577
+ try {
578
+ await Promise.race([
579
+ Promise.resolve(this._server.close()),
580
+ new Promise((resolve) => setTimeout(() => {
581
+ logDebug(TAG, `Server close timed out after ${CLOSE_TIMEOUT_MS}ms`);
582
+ resolve();
583
+ }, CLOSE_TIMEOUT_MS)),
584
+ ]);
585
+ }
586
+ catch (err) {
587
+ logDebug(TAG, `Error stopping OpenCode server: ${err}`);
588
+ }
589
+ this._server = undefined;
590
+ this._client = undefined;
591
+ }
592
+ }
593
+ }
594
+ /**
595
+ * Extract text content from an array of response parts.
596
+ */
597
+ /** JSON-stringify a value and truncate to `maxLen` characters for log output. */
598
+ function previewJSON(value, maxLen) {
599
+ if (value === undefined)
600
+ return '';
601
+ const str = JSON.stringify(value);
602
+ if (str === undefined)
603
+ return '';
604
+ return str.length > maxLen ? str.slice(0, maxLen) + '...' : str;
605
+ }
606
+ function extractTextFromParts(parts) {
607
+ if (!parts)
608
+ return '';
609
+ return parts
610
+ .filter((p) => p.type === 'text' && typeof p.text === 'string')
611
+ .map((p) => p.text)
612
+ .join('\n');
613
+ }
614
+ //# sourceMappingURL=opencode-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-provider.js","sourceRoot":"","sources":["../src/opencode-provider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-template.d.ts","sourceRoot":"","sources":["../src/prompt-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxH"}
1
+ {"version":3,"file":"prompt-template.d.ts","sourceRoot":"","sources":["../src/prompt-template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxH"}