@oisheek_c/codeforge 1.0.2 → 1.0.4
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/README.md +1117 -3
- package/package.json +1 -1
- package/packages/agent/executor.js +73 -14
- package/packages/config/defaults.js +3 -3
package/README.md
CHANGED
|
@@ -1,7 +1,1121 @@
|
|
|
1
1
|
# CodeForge AI
|
|
2
2
|
|
|
3
|
-
Terminal-native AI
|
|
3
|
+
> Terminal-native AI software engineering agent
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
CodeForge AI is an AI-powered software engineering agent that runs directly in your terminal and works against the repository you are currently working in.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
It combines repository indexing, retrieval-augmented context, model selection, reasoning, tool execution, verification, and fallback routing into a single terminal-native development workflow.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- Terminal-native AI software engineering agent
|
|
14
|
+
- Repository-aware code understanding
|
|
15
|
+
- Repository indexing and retrieval
|
|
16
|
+
- Retrieval-Augmented Generation (RAG)
|
|
17
|
+
- Automatic model-role selection
|
|
18
|
+
- OpenRouter integration
|
|
19
|
+
- Model fallback handling
|
|
20
|
+
- Multi-step tool execution
|
|
21
|
+
- File reading and searching
|
|
22
|
+
- File editing and writing
|
|
23
|
+
- Shell command execution
|
|
24
|
+
- Command approval workflow
|
|
25
|
+
- Git repository awareness
|
|
26
|
+
- Engineering verification workflow
|
|
27
|
+
- Live terminal activity dashboard
|
|
28
|
+
- Context usage reporting
|
|
29
|
+
- Model usage reporting
|
|
30
|
+
- Reasoning configuration
|
|
31
|
+
- Tree-sitter-powered source-code parsing
|
|
32
|
+
- Multi-language source-code support
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Requirements
|
|
37
|
+
|
|
38
|
+
### Node.js
|
|
39
|
+
|
|
40
|
+
CodeForge requires:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
Node.js >= 22.13.0
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Check your Node.js version:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
node --version
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### OpenRouter API Key
|
|
53
|
+
|
|
54
|
+
CodeForge currently uses OpenRouter for AI model access.
|
|
55
|
+
|
|
56
|
+
You need an OpenRouter API key.
|
|
57
|
+
|
|
58
|
+
**Windows CMD**
|
|
59
|
+
```cmd
|
|
60
|
+
set OPENROUTER_API_KEY=your_api_key_here
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Windows PowerShell**
|
|
64
|
+
```powershell
|
|
65
|
+
$env:OPENROUTER_API_KEY="your_api_key_here"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**macOS / Linux**
|
|
69
|
+
```bash
|
|
70
|
+
export OPENROUTER_API_KEY="your_api_key_here"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
You can also configure the key through an environment file when running CodeForge locally.
|
|
74
|
+
|
|
75
|
+
> Never commit your API key to GitHub or publish it to npm.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Installation
|
|
80
|
+
|
|
81
|
+
### Install with npm
|
|
82
|
+
|
|
83
|
+
Install CodeForge globally:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm install -g @oisheek_c/codeforge
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Verify the installation:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
codeforge --version
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Expected output:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
CodeForge AI v1.0.2
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Once installed, the `codeforge` command is available globally.
|
|
102
|
+
|
|
103
|
+
### Run with npx
|
|
104
|
+
|
|
105
|
+
CodeForge can also be run without a global installation:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx @oisheek_c/codeforge
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Check the version:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
npx @oisheek_c/codeforge --version
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Getting Started
|
|
120
|
+
|
|
121
|
+
Navigate to the project you want CodeForge to work with:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
cd path/to/your/project
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Then start CodeForge:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
codeforge
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
CodeForge initializes against the current directory and builds a repository index.
|
|
134
|
+
|
|
135
|
+
You will then see an interactive terminal prompt:
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Enter your request using natural language.
|
|
142
|
+
|
|
143
|
+
For example:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
> explain this repository
|
|
147
|
+
> explain how authentication works
|
|
148
|
+
> find the implementation of the routing system
|
|
149
|
+
> find the bug in the login flow and fix it
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Basic Commands
|
|
155
|
+
|
|
156
|
+
### Start CodeForge
|
|
157
|
+
```bash
|
|
158
|
+
codeforge
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Show help
|
|
162
|
+
```bash
|
|
163
|
+
codeforge --help
|
|
164
|
+
```
|
|
165
|
+
or:
|
|
166
|
+
```bash
|
|
167
|
+
codeforge -h
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Show version
|
|
171
|
+
```bash
|
|
172
|
+
codeforge --version
|
|
173
|
+
```
|
|
174
|
+
or:
|
|
175
|
+
```bash
|
|
176
|
+
codeforge -v
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## How CodeForge Works
|
|
182
|
+
|
|
183
|
+
A typical CodeForge request follows this pipeline:
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
User Request
|
|
187
|
+
|
|
|
188
|
+
v
|
|
189
|
+
Intent Detection
|
|
190
|
+
|
|
|
191
|
+
v
|
|
192
|
+
Planning
|
|
193
|
+
|
|
|
194
|
+
+-------------------+
|
|
195
|
+
| |
|
|
196
|
+
v v
|
|
197
|
+
RAG Selection Model Selection
|
|
198
|
+
| |
|
|
199
|
+
v v
|
|
200
|
+
Repository Provider / Model
|
|
201
|
+
Retrieval |
|
|
202
|
+
| |
|
|
203
|
+
+---------+---------+
|
|
204
|
+
|
|
|
205
|
+
v
|
|
206
|
+
Context Builder
|
|
207
|
+
|
|
|
208
|
+
v
|
|
209
|
+
Reasoning
|
|
210
|
+
|
|
|
211
|
+
v
|
|
212
|
+
Model Generation
|
|
213
|
+
|
|
|
214
|
+
v
|
|
215
|
+
Tool Execution
|
|
216
|
+
|
|
|
217
|
+
v
|
|
218
|
+
Verification
|
|
219
|
+
|
|
|
220
|
+
+------+------+
|
|
221
|
+
| |
|
|
222
|
+
v v
|
|
223
|
+
Success Repair /
|
|
224
|
+
| Fallback
|
|
225
|
+
v |
|
|
226
|
+
Final Result <-----+
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
The goal is to make the model operate as an engineering agent rather than simply as a conversational chatbot.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Repository Understanding
|
|
234
|
+
|
|
235
|
+
When CodeForge is started inside a project, it builds a repository index.
|
|
236
|
+
|
|
237
|
+
Repository-aware requests can use that index to locate relevant source files and provide repository evidence to the model.
|
|
238
|
+
|
|
239
|
+
Examples:
|
|
240
|
+
|
|
241
|
+
```text
|
|
242
|
+
> explain this repository
|
|
243
|
+
> explain the architecture of this project
|
|
244
|
+
> where is model fallback implemented?
|
|
245
|
+
> find all files involved in repository retrieval
|
|
246
|
+
> explain how routing and model selection work together
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
CodeForge retrieves relevant repository information, ranks the evidence, and constructs context for the selected model.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Retrieval-Augmented Generation
|
|
254
|
+
|
|
255
|
+
CodeForge includes a repository retrieval system designed to provide the model with relevant project context.
|
|
256
|
+
|
|
257
|
+
The retrieval system can use information such as:
|
|
258
|
+
|
|
259
|
+
- Repository structure
|
|
260
|
+
- Source files
|
|
261
|
+
- Symbols
|
|
262
|
+
- Imports
|
|
263
|
+
- Exports
|
|
264
|
+
- Function calls
|
|
265
|
+
- Comments
|
|
266
|
+
- TODOs
|
|
267
|
+
- Diagnostics
|
|
268
|
+
- File metadata
|
|
269
|
+
- Lexical retrieval
|
|
270
|
+
- Ranking
|
|
271
|
+
- Context budgeting
|
|
272
|
+
|
|
273
|
+
This allows repository-specific requests to be grounded in the actual project instead of relying exclusively on the model's general knowledge.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## Repository Parsing
|
|
278
|
+
|
|
279
|
+
CodeForge uses Tree-sitter for source-code parsing.
|
|
280
|
+
|
|
281
|
+
The current package includes language grammars for:
|
|
282
|
+
|
|
283
|
+
- C
|
|
284
|
+
- C++
|
|
285
|
+
- C#
|
|
286
|
+
- Go
|
|
287
|
+
- Java
|
|
288
|
+
- JavaScript
|
|
289
|
+
- PHP
|
|
290
|
+
- Python
|
|
291
|
+
- Ruby
|
|
292
|
+
- Rust
|
|
293
|
+
- Swift
|
|
294
|
+
- TypeScript
|
|
295
|
+
|
|
296
|
+
The parser extracts structural information that can be used by repository retrieval and analysis.
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## AI Model Routing
|
|
301
|
+
|
|
302
|
+
CodeForge includes model-role selection.
|
|
303
|
+
|
|
304
|
+
Depending on the request, the system can select an appropriate model role for the task.
|
|
305
|
+
|
|
306
|
+
Configured roles can include:
|
|
307
|
+
|
|
308
|
+
- General conversation
|
|
309
|
+
- Planning
|
|
310
|
+
- Coding
|
|
311
|
+
- Reviewing
|
|
312
|
+
- Reasoning
|
|
313
|
+
- Model selection
|
|
314
|
+
|
|
315
|
+
The terminal reports the selected provider and model after execution.
|
|
316
|
+
|
|
317
|
+
Example:
|
|
318
|
+
|
|
319
|
+
```text
|
|
320
|
+
Model Usage
|
|
321
|
+
Route openrouter · nvidia/nemotron-3-super-120b-a12b:free
|
|
322
|
+
Attempts 1
|
|
323
|
+
Prompt ...
|
|
324
|
+
Completion ...
|
|
325
|
+
Reasoning ...
|
|
326
|
+
Total ...
|
|
327
|
+
Cost $0
|
|
328
|
+
Finish stop
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## Model Fallback
|
|
334
|
+
|
|
335
|
+
CodeForge supports fallback behavior when a model/provider request encounters a retryable failure.
|
|
336
|
+
|
|
337
|
+
The agent can select a configured fallback model and retry the request rather than immediately terminating the workflow.
|
|
338
|
+
|
|
339
|
+
This helps keep engineering workflows resilient when a particular model route is temporarily unavailable.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Tool System
|
|
344
|
+
|
|
345
|
+
CodeForge provides tools that allow the agent to interact with the repository and local development environment.
|
|
346
|
+
|
|
347
|
+
Current tool capabilities include:
|
|
348
|
+
|
|
349
|
+
- Read files
|
|
350
|
+
- Search files
|
|
351
|
+
- Edit files
|
|
352
|
+
- Write files
|
|
353
|
+
- Execute shell commands
|
|
354
|
+
|
|
355
|
+
The model can request tools when the task requires direct interaction with the project.
|
|
356
|
+
|
|
357
|
+
For example:
|
|
358
|
+
|
|
359
|
+
```text
|
|
360
|
+
> explain src/auth.js
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
may result in a direct file read.
|
|
364
|
+
|
|
365
|
+
A coding request such as:
|
|
366
|
+
|
|
367
|
+
```text
|
|
368
|
+
> fix the bug in src/auth.js and run the tests
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
can involve:
|
|
372
|
+
|
|
373
|
+
```text
|
|
374
|
+
Read
|
|
375
|
+
|
|
|
376
|
+
v
|
|
377
|
+
Analyze
|
|
378
|
+
|
|
|
379
|
+
v
|
|
380
|
+
Edit
|
|
381
|
+
|
|
|
382
|
+
v
|
|
383
|
+
Execute tests
|
|
384
|
+
|
|
|
385
|
+
v
|
|
386
|
+
Inspect result
|
|
387
|
+
|
|
|
388
|
+
v
|
|
389
|
+
Repair if necessary
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## Command Approval
|
|
395
|
+
|
|
396
|
+
CodeForge includes an approval boundary around command execution.
|
|
397
|
+
|
|
398
|
+
When a command requires approval, CodeForge can ask the user before executing it.
|
|
399
|
+
|
|
400
|
+
Example:
|
|
401
|
+
|
|
402
|
+
```text
|
|
403
|
+
Approval required: execute_command
|
|
404
|
+
|
|
405
|
+
Command:
|
|
406
|
+
npm test
|
|
407
|
+
|
|
408
|
+
Approve this operation? [y/N]
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
The user can explicitly approve or deny the operation.
|
|
412
|
+
|
|
413
|
+
This provides an additional safety boundary around potentially destructive operations.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## Code Modification
|
|
418
|
+
|
|
419
|
+
CodeForge is designed to perform engineering tasks, not only answer questions.
|
|
420
|
+
|
|
421
|
+
Examples:
|
|
422
|
+
|
|
423
|
+
```text
|
|
424
|
+
> add input validation to the login function
|
|
425
|
+
> refactor this function without changing its behavior
|
|
426
|
+
> fix the failing tests
|
|
427
|
+
> add error handling to the API client
|
|
428
|
+
> update the authentication flow and run the relevant tests
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
The agent can combine repository context, file tools, command execution, and verification during these workflows.
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
## Verification
|
|
436
|
+
|
|
437
|
+
CodeForge does not treat a successful file modification as automatically completing an engineering task.
|
|
438
|
+
|
|
439
|
+
For implementation and debugging workflows, the system can track whether the change has been verified.
|
|
440
|
+
|
|
441
|
+
A typical workflow is:
|
|
442
|
+
|
|
443
|
+
```text
|
|
444
|
+
Understand
|
|
445
|
+
|
|
|
446
|
+
v
|
|
447
|
+
Plan
|
|
448
|
+
|
|
|
449
|
+
v
|
|
450
|
+
Retrieve Context
|
|
451
|
+
|
|
|
452
|
+
v
|
|
453
|
+
Modify Code
|
|
454
|
+
|
|
|
455
|
+
v
|
|
456
|
+
Run Verification
|
|
457
|
+
|
|
|
458
|
+
v
|
|
459
|
+
Inspect Result
|
|
460
|
+
|
|
|
461
|
+
v
|
|
462
|
+
Repair if Necessary
|
|
463
|
+
|
|
|
464
|
+
v
|
|
465
|
+
Complete
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
The project test suite currently covers retrieval, routing, model selection, fallback behavior, tool execution, approval handling, verification, and configuration.
|
|
469
|
+
|
|
470
|
+
Current test status:
|
|
471
|
+
|
|
472
|
+
```text
|
|
473
|
+
112 tests
|
|
474
|
+
112 passed
|
|
475
|
+
0 failed
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
## Git Awareness
|
|
481
|
+
|
|
482
|
+
CodeForge can operate inside Git repositories and inspect repository state.
|
|
483
|
+
|
|
484
|
+
This allows repository-aware tasks to take Git context into account, including:
|
|
485
|
+
|
|
486
|
+
- Current branch
|
|
487
|
+
- Working-tree state
|
|
488
|
+
- Repository status
|
|
489
|
+
- Git-related project information
|
|
490
|
+
|
|
491
|
+
Example:
|
|
492
|
+
|
|
493
|
+
```text
|
|
494
|
+
> inspect the current git changes and explain what they do
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## Terminal Dashboard
|
|
500
|
+
|
|
501
|
+
CodeForge provides live terminal activity during execution.
|
|
502
|
+
|
|
503
|
+
A typical request can display:
|
|
504
|
+
|
|
505
|
+
```text
|
|
506
|
+
✓ Understood request
|
|
507
|
+
✓ Planned approach
|
|
508
|
+
✓ Searched repository
|
|
509
|
+
✓ Built context
|
|
510
|
+
✓ Selected model
|
|
511
|
+
✓ Reasoning configured
|
|
512
|
+
✓ Generated response
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
Tool-enabled workflows can additionally show:
|
|
516
|
+
|
|
517
|
+
```text
|
|
518
|
+
✓ Completed tool
|
|
519
|
+
✓ Completed tool round
|
|
520
|
+
✓ Verification completed
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
This makes the agent's execution pipeline visible without exposing private model chain-of-thought.
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## Context Usage
|
|
528
|
+
|
|
529
|
+
After execution, CodeForge reports estimated context usage.
|
|
530
|
+
|
|
531
|
+
Example:
|
|
532
|
+
|
|
533
|
+
```text
|
|
534
|
+
Context Usage
|
|
535
|
+
Round 0
|
|
536
|
+
System ~1,934 tokens
|
|
537
|
+
User/RAG ~1,067 tokens
|
|
538
|
+
Assistant ~0 tokens
|
|
539
|
+
Tool Results ~0 tokens
|
|
540
|
+
Tool Schemas ~677 tokens
|
|
541
|
+
Estimated ~3,676 tokens
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
This helps users understand how much repository and tool context was supplied to the model.
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## Model Usage
|
|
549
|
+
|
|
550
|
+
CodeForge also reports model usage information.
|
|
551
|
+
|
|
552
|
+
Example:
|
|
553
|
+
|
|
554
|
+
```text
|
|
555
|
+
Model Usage
|
|
556
|
+
Route openrouter · nvidia/nemotron-3-super-120b-a12b:free
|
|
557
|
+
Attempts 1
|
|
558
|
+
Prompt 3,941 tokens
|
|
559
|
+
Completion 550 tokens
|
|
560
|
+
Reasoning 355 tokens
|
|
561
|
+
Total 4,491 tokens
|
|
562
|
+
Cost $0
|
|
563
|
+
Finish stop
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
The exact values depend on the request and selected model.
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Example Session
|
|
571
|
+
|
|
572
|
+
A normal CodeForge session looks like:
|
|
573
|
+
|
|
574
|
+
```text
|
|
575
|
+
$ codeforge
|
|
576
|
+
|
|
577
|
+
CodeForge AI v1.0.2
|
|
578
|
+
Terminal-Native AI Software Engineering Agent
|
|
579
|
+
────────────────────────────────────────────────────────────
|
|
580
|
+
|
|
581
|
+
✔ Configuration loaded.
|
|
582
|
+
✔ Project: my-project
|
|
583
|
+
ℹ Building repository index...
|
|
584
|
+
✔ Repository indexed.
|
|
585
|
+
✔ OpenRouter provider initialized.
|
|
586
|
+
✔ Tool registry initialized.
|
|
587
|
+
✔ CodeForge initialized.
|
|
588
|
+
✔ Loaded project: my-project
|
|
589
|
+
|
|
590
|
+
> hello
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
The agent can respond to normal conversational requests:
|
|
594
|
+
|
|
595
|
+
```text
|
|
596
|
+
> hello
|
|
597
|
+
|
|
598
|
+
Hello! How can I assist you today?
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
Repository-aware requests activate retrieval when appropriate:
|
|
602
|
+
|
|
603
|
+
```text
|
|
604
|
+
> explain this repository
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
Coding requests can activate tools:
|
|
608
|
+
|
|
609
|
+
```text
|
|
610
|
+
> explain src/math.js
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
or:
|
|
614
|
+
|
|
615
|
+
```text
|
|
616
|
+
> fix the bug in src/math.js and run the tests
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
---
|
|
620
|
+
|
|
621
|
+
## Example Requests
|
|
622
|
+
|
|
623
|
+
**General Conversation**
|
|
624
|
+
```text
|
|
625
|
+
> hello
|
|
626
|
+
> what can you do?
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
**Repository Explanation**
|
|
630
|
+
```text
|
|
631
|
+
> explain this repository
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
**Architecture**
|
|
635
|
+
```text
|
|
636
|
+
> explain how the routing system works
|
|
637
|
+
> explain how model selection and fallback interact
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
**File Explanation**
|
|
641
|
+
```text
|
|
642
|
+
> explain src/math.js
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
**Search**
|
|
646
|
+
```text
|
|
647
|
+
> find where authentication is implemented
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
**Debugging**
|
|
651
|
+
```text
|
|
652
|
+
> find why the tests are failing
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
**Code Modification**
|
|
656
|
+
```text
|
|
657
|
+
> fix the failing test and verify the fix
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**Refactoring**
|
|
661
|
+
```text
|
|
662
|
+
> refactor this module while preserving its current behavior
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
---
|
|
666
|
+
|
|
667
|
+
## Configuration
|
|
668
|
+
|
|
669
|
+
CodeForge currently uses OpenRouter for model access.
|
|
670
|
+
|
|
671
|
+
The primary environment variable is:
|
|
672
|
+
|
|
673
|
+
```text
|
|
674
|
+
OPENROUTER_API_KEY
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
Example:
|
|
678
|
+
|
|
679
|
+
```bash
|
|
680
|
+
export OPENROUTER_API_KEY="sk-or-..."
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
Windows CMD:
|
|
684
|
+
|
|
685
|
+
```cmd
|
|
686
|
+
set OPENROUTER_API_KEY=sk-or-...
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
The configuration system also supports configured model roles and environment-variable overrides where supported.
|
|
690
|
+
|
|
691
|
+
---
|
|
692
|
+
|
|
693
|
+
## Security
|
|
694
|
+
|
|
695
|
+
CodeForge is an engineering agent with access to local project files and, when approved, command execution.
|
|
696
|
+
|
|
697
|
+
Use it only in environments where you understand the operations it may perform.
|
|
698
|
+
|
|
699
|
+
### API Keys
|
|
700
|
+
|
|
701
|
+
Never commit:
|
|
702
|
+
|
|
703
|
+
```text
|
|
704
|
+
OPENROUTER_API_KEY
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
or other secrets to source control.
|
|
708
|
+
|
|
709
|
+
Add environment files to `.gitignore`:
|
|
710
|
+
|
|
711
|
+
```text
|
|
712
|
+
.env
|
|
713
|
+
.env.local
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
### Command Execution
|
|
717
|
+
|
|
718
|
+
Review command-approval prompts carefully.
|
|
719
|
+
|
|
720
|
+
Do not approve commands you do not understand.
|
|
721
|
+
|
|
722
|
+
---
|
|
723
|
+
|
|
724
|
+
## Installation on Another Machine
|
|
725
|
+
|
|
726
|
+
CodeForge is distributed through npm, so another developer does not need the project's `.tgz` file.
|
|
727
|
+
|
|
728
|
+
On another machine with Node.js 22.13+:
|
|
729
|
+
|
|
730
|
+
```bash
|
|
731
|
+
npm install -g @oisheek_c/codeforge
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
Then verify:
|
|
735
|
+
|
|
736
|
+
```bash
|
|
737
|
+
codeforge --version
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
Configure the API key:
|
|
741
|
+
|
|
742
|
+
```bash
|
|
743
|
+
export OPENROUTER_API_KEY="your_api_key_here"
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
Navigate into a project:
|
|
747
|
+
|
|
748
|
+
```bash
|
|
749
|
+
cd your-project
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
Then start CodeForge:
|
|
753
|
+
|
|
754
|
+
```bash
|
|
755
|
+
codeforge
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
CodeForge can therefore be installed and used directly from the npm registry.
|
|
759
|
+
|
|
760
|
+
---
|
|
761
|
+
|
|
762
|
+
## Development
|
|
763
|
+
|
|
764
|
+
Clone the repository:
|
|
765
|
+
|
|
766
|
+
```bash
|
|
767
|
+
git clone <repository-url>
|
|
768
|
+
```
|
|
769
|
+
|
|
770
|
+
Enter the repository:
|
|
771
|
+
|
|
772
|
+
```bash
|
|
773
|
+
cd codeforge
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
Install dependencies:
|
|
777
|
+
|
|
778
|
+
```bash
|
|
779
|
+
pnpm install
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
Run CodeForge locally:
|
|
783
|
+
|
|
784
|
+
```bash
|
|
785
|
+
pnpm start
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
Run the test suite:
|
|
789
|
+
|
|
790
|
+
```bash
|
|
791
|
+
node --test
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
or:
|
|
795
|
+
|
|
796
|
+
```bash
|
|
797
|
+
pnpm test
|
|
798
|
+
```
|
|
799
|
+
|
|
800
|
+
---
|
|
801
|
+
|
|
802
|
+
## Testing
|
|
803
|
+
|
|
804
|
+
The project contains automated tests covering major parts of the agent architecture.
|
|
805
|
+
|
|
806
|
+
Current verified result:
|
|
807
|
+
|
|
808
|
+
```text
|
|
809
|
+
ℹ tests 112
|
|
810
|
+
ℹ pass 112
|
|
811
|
+
ℹ fail 0
|
|
812
|
+
ℹ cancelled 0
|
|
813
|
+
ℹ skipped 0
|
|
814
|
+
ℹ todo 0
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
Run the tests with:
|
|
818
|
+
|
|
819
|
+
```bash
|
|
820
|
+
node --test
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
---
|
|
824
|
+
|
|
825
|
+
## Package Information
|
|
826
|
+
|
|
827
|
+
- **Current npm package:** `@oisheek_c/codeforge`
|
|
828
|
+
- **Current release:** `1.0.2`
|
|
829
|
+
- **CLI command:** `codeforge`
|
|
830
|
+
- **Required Node.js version:** `>= 22.13.0`
|
|
831
|
+
|
|
832
|
+
Install:
|
|
833
|
+
|
|
834
|
+
```bash
|
|
835
|
+
npm install -g @oisheek_c/codeforge
|
|
836
|
+
```
|
|
837
|
+
|
|
838
|
+
---
|
|
839
|
+
|
|
840
|
+
## Project Structure
|
|
841
|
+
|
|
842
|
+
The project is organized into several major subsystems:
|
|
843
|
+
|
|
844
|
+
```text
|
|
845
|
+
apps/
|
|
846
|
+
└── cli/
|
|
847
|
+
└── src/
|
|
848
|
+
├── bootstrap.js
|
|
849
|
+
├── cli.js
|
|
850
|
+
├── index.js
|
|
851
|
+
└── dev/
|
|
852
|
+
|
|
853
|
+
packages/
|
|
854
|
+
├── agent/
|
|
855
|
+
├── config/
|
|
856
|
+
├── core/
|
|
857
|
+
├── git/
|
|
858
|
+
├── memory/
|
|
859
|
+
├── prompts/
|
|
860
|
+
├── providers/
|
|
861
|
+
├── reasoning/
|
|
862
|
+
├── retrieval/
|
|
863
|
+
├── scanner/
|
|
864
|
+
├── terminal/
|
|
865
|
+
├── tools/
|
|
866
|
+
└── utils/
|
|
867
|
+
|
|
868
|
+
bin/
|
|
869
|
+
└── codeforge.js
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
The main architectural areas are:
|
|
873
|
+
|
|
874
|
+
| Package | Responsibility |
|
|
875
|
+
|---|---|
|
|
876
|
+
| agent | Agent orchestration, planning, routing, and execution |
|
|
877
|
+
| config | Configuration and model settings |
|
|
878
|
+
| core | Core types and engineering abstractions |
|
|
879
|
+
| git | Git integration |
|
|
880
|
+
| memory | Project and session memory |
|
|
881
|
+
| prompts | Prompt construction |
|
|
882
|
+
| providers | AI provider integration |
|
|
883
|
+
| reasoning | Reasoning workflows |
|
|
884
|
+
| retrieval | Repository parsing, indexing, ranking, and RAG |
|
|
885
|
+
| scanner | Repository scanning |
|
|
886
|
+
| terminal | CLI dashboard and terminal rendering |
|
|
887
|
+
| tools | File and command tools |
|
|
888
|
+
| utils | Shared utilities |
|
|
889
|
+
|
|
890
|
+
---
|
|
891
|
+
|
|
892
|
+
## Architecture
|
|
893
|
+
|
|
894
|
+
At a high level:
|
|
895
|
+
|
|
896
|
+
```text
|
|
897
|
+
┌─────────────────────┐
|
|
898
|
+
│ User / CLI │
|
|
899
|
+
└──────────┬──────────┘
|
|
900
|
+
│
|
|
901
|
+
▼
|
|
902
|
+
┌─────────────────────┐
|
|
903
|
+
│ Intent / Planner │
|
|
904
|
+
└──────────┬──────────┘
|
|
905
|
+
│
|
|
906
|
+
┌────────────┴────────────┐
|
|
907
|
+
▼ ▼
|
|
908
|
+
┌─────────────────┐ ┌─────────────────┐
|
|
909
|
+
│ RAG Selector │ │ Model Selector │
|
|
910
|
+
└────────┬────────┘ └────────┬────────┘
|
|
911
|
+
│ │
|
|
912
|
+
▼ ▼
|
|
913
|
+
┌─────────────────┐ ┌─────────────────┐
|
|
914
|
+
│ Retrieval │ │ Provider │
|
|
915
|
+
│ / Repository │ │ / OpenRouter │
|
|
916
|
+
└────────┬────────┘ └────────┬────────┘
|
|
917
|
+
│ │
|
|
918
|
+
└────────────┬────────────┘
|
|
919
|
+
▼
|
|
920
|
+
┌─────────────────────┐
|
|
921
|
+
│ Context Builder │
|
|
922
|
+
└──────────┬──────────┘
|
|
923
|
+
│
|
|
924
|
+
▼
|
|
925
|
+
┌─────────────────────┐
|
|
926
|
+
│ Reasoning │
|
|
927
|
+
└──────────┬──────────┘
|
|
928
|
+
│
|
|
929
|
+
▼
|
|
930
|
+
┌─────────────────────┐
|
|
931
|
+
│ Model Generation │
|
|
932
|
+
└──────────┬──────────┘
|
|
933
|
+
│
|
|
934
|
+
▼
|
|
935
|
+
┌─────────────────────┐
|
|
936
|
+
│ Tool Execution │
|
|
937
|
+
└──────────┬──────────┘
|
|
938
|
+
│
|
|
939
|
+
▼
|
|
940
|
+
┌─────────────────────┐
|
|
941
|
+
│ Verification │
|
|
942
|
+
└──────────┬──────────┘
|
|
943
|
+
│
|
|
944
|
+
┌──────────┴──────────┐
|
|
945
|
+
▼ ▼
|
|
946
|
+
Success Repair /
|
|
947
|
+
│ Fallback
|
|
948
|
+
▼ │
|
|
949
|
+
Final Result ◄─────────────┘
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
---
|
|
953
|
+
|
|
954
|
+
## Current Release
|
|
955
|
+
|
|
956
|
+
**v1.0.2**
|
|
957
|
+
|
|
958
|
+
The current release includes:
|
|
959
|
+
|
|
960
|
+
- Terminal-native interactive agent
|
|
961
|
+
- OpenRouter integration
|
|
962
|
+
- Model-role selection
|
|
963
|
+
- Model fallback routing
|
|
964
|
+
- Repository indexing
|
|
965
|
+
- Repository retrieval
|
|
966
|
+
- RAG selection
|
|
967
|
+
- Tree-sitter source parsing
|
|
968
|
+
- Multi-language parsing
|
|
969
|
+
- File reading
|
|
970
|
+
- File searching
|
|
971
|
+
- File editing
|
|
972
|
+
- File writing
|
|
973
|
+
- Shell command execution
|
|
974
|
+
- Command approval
|
|
975
|
+
- Git awareness
|
|
976
|
+
- Engineering verification workflow
|
|
977
|
+
- Terminal activity dashboard
|
|
978
|
+
- Context telemetry
|
|
979
|
+
- Model usage telemetry
|
|
980
|
+
|
|
981
|
+
---
|
|
982
|
+
|
|
983
|
+
## Project Status
|
|
984
|
+
|
|
985
|
+
CodeForge is an actively developed project.
|
|
986
|
+
|
|
987
|
+
The core agent workflow is functional and distributed through npm.
|
|
988
|
+
|
|
989
|
+
Current development focus includes:
|
|
990
|
+
|
|
991
|
+
- Repository safety
|
|
992
|
+
- Retrieval quality
|
|
993
|
+
- Parser compatibility
|
|
994
|
+
- Developer experience
|
|
995
|
+
- Documentation
|
|
996
|
+
- CLI reliability
|
|
997
|
+
- Package quality
|
|
998
|
+
|
|
999
|
+
---
|
|
1000
|
+
|
|
1001
|
+
## Roadmap
|
|
1002
|
+
|
|
1003
|
+
Planned improvements include:
|
|
1004
|
+
|
|
1005
|
+
- Further retrieval-quality improvements
|
|
1006
|
+
- Better repository-level architectural understanding
|
|
1007
|
+
- Improved parser compatibility
|
|
1008
|
+
- Reduction of Tree-sitter dependency warnings
|
|
1009
|
+
- Safer behavior when launched outside a project directory
|
|
1010
|
+
- Additional engineering workflows
|
|
1011
|
+
- Expanded documentation
|
|
1012
|
+
- Continued CLI UX improvements
|
|
1013
|
+
- Additional provider and model flexibility
|
|
1014
|
+
|
|
1015
|
+
---
|
|
1016
|
+
|
|
1017
|
+
## Contributing
|
|
1018
|
+
|
|
1019
|
+
Contributions, bug reports, feature requests, and improvements are welcome.
|
|
1020
|
+
|
|
1021
|
+
Before submitting changes:
|
|
1022
|
+
|
|
1023
|
+
1. Make the change.
|
|
1024
|
+
2. Run the test suite.
|
|
1025
|
+
3. Verify the CLI manually where appropriate.
|
|
1026
|
+
4. Review the Git diff.
|
|
1027
|
+
5. Submit the change with a clear description.
|
|
1028
|
+
|
|
1029
|
+
Run:
|
|
1030
|
+
|
|
1031
|
+
```bash
|
|
1032
|
+
node --test
|
|
1033
|
+
```
|
|
1034
|
+
|
|
1035
|
+
before opening a pull request.
|
|
1036
|
+
|
|
1037
|
+
---
|
|
1038
|
+
|
|
1039
|
+
## Troubleshooting
|
|
1040
|
+
|
|
1041
|
+
### `codeforge` command not found
|
|
1042
|
+
|
|
1043
|
+
Check whether the package is installed globally:
|
|
1044
|
+
|
|
1045
|
+
```bash
|
|
1046
|
+
npm list -g --depth=0
|
|
1047
|
+
```
|
|
1048
|
+
|
|
1049
|
+
You should see:
|
|
1050
|
+
|
|
1051
|
+
```text
|
|
1052
|
+
@oisheek_c/codeforge@1.0.2
|
|
1053
|
+
```
|
|
1054
|
+
|
|
1055
|
+
Check the npm global prefix:
|
|
1056
|
+
|
|
1057
|
+
```bash
|
|
1058
|
+
npm prefix -g
|
|
1059
|
+
```
|
|
1060
|
+
|
|
1061
|
+
Make sure the corresponding global bin directory is available in your PATH.
|
|
1062
|
+
|
|
1063
|
+
### Check the installed version
|
|
1064
|
+
|
|
1065
|
+
```bash
|
|
1066
|
+
codeforge --version
|
|
1067
|
+
```
|
|
1068
|
+
|
|
1069
|
+
Expected:
|
|
1070
|
+
|
|
1071
|
+
```text
|
|
1072
|
+
CodeForge AI v1.0.2
|
|
1073
|
+
```
|
|
1074
|
+
|
|
1075
|
+
### OpenRouter authentication failure
|
|
1076
|
+
|
|
1077
|
+
Check that the environment variable exists.
|
|
1078
|
+
|
|
1079
|
+
**macOS / Linux**
|
|
1080
|
+
```bash
|
|
1081
|
+
echo "$OPENROUTER_API_KEY"
|
|
1082
|
+
```
|
|
1083
|
+
|
|
1084
|
+
**Windows CMD**
|
|
1085
|
+
```cmd
|
|
1086
|
+
echo %OPENROUTER_API_KEY%
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
If necessary, set it again and restart the terminal.
|
|
1090
|
+
|
|
1091
|
+
### Repository indexing permission errors
|
|
1092
|
+
|
|
1093
|
+
Run CodeForge from the root of the project you want it to work with:
|
|
1094
|
+
|
|
1095
|
+
```bash
|
|
1096
|
+
cd path/to/project
|
|
1097
|
+
codeforge
|
|
1098
|
+
```
|
|
1099
|
+
|
|
1100
|
+
Avoid starting CodeForge from directories containing unrelated system data or directories for which the current user does not have read permission.
|
|
1101
|
+
|
|
1102
|
+
---
|
|
1103
|
+
|
|
1104
|
+
## License
|
|
1105
|
+
|
|
1106
|
+
MIT License.
|
|
1107
|
+
|
|
1108
|
+
## Author
|
|
1109
|
+
|
|
1110
|
+
**Oisheek**
|
|
1111
|
+
|
|
1112
|
+
CodeForge AI is developed as a terminal-native AI software engineering project.
|
|
1113
|
+
|
|
1114
|
+
## Links
|
|
1115
|
+
|
|
1116
|
+
- [npm Package](https://www.npmjs.com/package/@oisheek_c/codeforge)
|
|
1117
|
+
- [GitHub](https://github.com/Oisheek/codeforge)
|
|
1118
|
+
|
|
1119
|
+
---
|
|
1120
|
+
|
|
1121
|
+
*CodeForge AI — AI software engineering directly in your terminal.*
|
package/package.json
CHANGED
|
@@ -318,6 +318,52 @@ function createToolCallFingerprint(
|
|
|
318
318
|
)}`;
|
|
319
319
|
}
|
|
320
320
|
|
|
321
|
+
function invalidateReadToolHistory(
|
|
322
|
+
toolCallHistory,
|
|
323
|
+
changedPath
|
|
324
|
+
) {
|
|
325
|
+
if (
|
|
326
|
+
!(toolCallHistory instanceof Map) ||
|
|
327
|
+
typeof changedPath !== "string"
|
|
328
|
+
) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const normalizedPath =
|
|
333
|
+
changedPath.replaceAll("\\", "/");
|
|
334
|
+
|
|
335
|
+
for (
|
|
336
|
+
const [
|
|
337
|
+
fingerprint,
|
|
338
|
+
entry,
|
|
339
|
+
] of toolCallHistory
|
|
340
|
+
) {
|
|
341
|
+
if (
|
|
342
|
+
entry?.name !== "read_file"
|
|
343
|
+
) {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const readPath =
|
|
348
|
+
entry.arguments?.path;
|
|
349
|
+
|
|
350
|
+
if (
|
|
351
|
+
typeof readPath !== "string"
|
|
352
|
+
) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (
|
|
357
|
+
readPath.replaceAll("\\", "/") ===
|
|
358
|
+
normalizedPath
|
|
359
|
+
) {
|
|
360
|
+
toolCallHistory.delete(
|
|
361
|
+
fingerprint
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
321
367
|
function createDuplicateToolResult({
|
|
322
368
|
call,
|
|
323
369
|
previous,
|
|
@@ -685,20 +731,33 @@ approvedTools.add(approvalKey);
|
|
|
685
731
|
arguments: call.arguments,
|
|
686
732
|
result,
|
|
687
733
|
});
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
734
|
+
if (
|
|
735
|
+
call.name === "edit_file" ||
|
|
736
|
+
call.name === "write_file"
|
|
737
|
+
) {
|
|
738
|
+
const changedPath =
|
|
739
|
+
call.arguments?.path;
|
|
740
|
+
|
|
741
|
+
invalidateReadToolHistory(
|
|
742
|
+
toolCallHistory,
|
|
743
|
+
changedPath
|
|
744
|
+
);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (
|
|
748
|
+
canDeduplicate &&
|
|
749
|
+
result.success
|
|
750
|
+
) {
|
|
751
|
+
toolCallHistory.set(
|
|
752
|
+
fingerprint,
|
|
753
|
+
{
|
|
754
|
+
id: call.id,
|
|
755
|
+
name: call.name,
|
|
756
|
+
arguments:
|
|
757
|
+
call.arguments,
|
|
701
758
|
}
|
|
759
|
+
);
|
|
760
|
+
}
|
|
702
761
|
emit({
|
|
703
762
|
type: result.success
|
|
704
763
|
? "stage:success"
|
|
@@ -1269,7 +1328,7 @@ export async function execute({
|
|
|
1269
1328
|
Array.isArray(response?.toolCalls)
|
|
1270
1329
|
? response.toolCalls
|
|
1271
1330
|
: [];
|
|
1272
|
-
|
|
1331
|
+
|
|
1273
1332
|
// Model produced a normal final response.
|
|
1274
1333
|
// Model produced a normal final response.
|
|
1275
1334
|
if (responseToolCalls.length === 0) {
|
|
@@ -10,10 +10,10 @@ export const defaultConfig = {
|
|
|
10
10
|
"nvidia/nemotron-3-super-120b-a12b:free",
|
|
11
11
|
|
|
12
12
|
coding:
|
|
13
|
-
"
|
|
13
|
+
"poolside/laguna-s-2.1:free",
|
|
14
14
|
|
|
15
15
|
heavyCoding:
|
|
16
|
-
"
|
|
16
|
+
"z-ai/glm-5.2:free",
|
|
17
17
|
|
|
18
18
|
planner:
|
|
19
19
|
"nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
@@ -34,7 +34,7 @@ export const defaultConfig = {
|
|
|
34
34
|
"nvidia/llama-nemotron-rerank-vl-1b-v2:free",
|
|
35
35
|
|
|
36
36
|
fallback:
|
|
37
|
-
"
|
|
37
|
+
"nvidia/nemotron-3-ultra-550b-a55b:free",
|
|
38
38
|
|
|
39
39
|
emergency:
|
|
40
40
|
"openrouter/free",
|