@thejeetsingh/kalcode 2.1.0 → 2.2.1
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 +89 -89
- package/dist/bin/kalcode.d.ts +2 -0
- package/dist/bin/kalcode.js +12 -0
- package/dist/bin/kalcode.js.map +1 -0
- package/dist/src/agent/context.d.ts +6 -0
- package/dist/src/agent/context.js +60 -0
- package/dist/src/agent/context.js.map +1 -0
- package/dist/src/agent/history.d.ts +8 -0
- package/dist/src/agent/history.js +59 -0
- package/dist/src/agent/history.js.map +1 -0
- package/dist/src/agent/loop.d.ts +6 -0
- package/dist/src/agent/loop.js +235 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/memory.d.ts +2 -0
- package/dist/src/agent/memory.js +27 -0
- package/dist/src/agent/memory.js.map +1 -0
- package/dist/src/agent/permissions.d.ts +5 -0
- package/dist/src/agent/permissions.js +66 -0
- package/dist/src/agent/permissions.js.map +1 -0
- package/dist/src/agent/text-tool-parser.d.ts +2 -0
- package/dist/src/agent/text-tool-parser.js +68 -0
- package/dist/src/agent/text-tool-parser.js.map +1 -0
- package/dist/src/api/client.d.ts +2 -0
- package/dist/src/api/client.js +86 -0
- package/dist/src/api/client.js.map +1 -0
- package/dist/src/api/stream-parser.d.ts +2 -0
- package/dist/src/api/stream-parser.js +97 -0
- package/dist/src/api/stream-parser.js.map +1 -0
- package/dist/src/config.d.ts +7 -0
- package/dist/src/config.js +52 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/constants.d.ts +25 -0
- package/{src/constants.ts → dist/src/constants.js} +15 -20
- package/dist/src/constants.js.map +1 -0
- package/dist/src/git/git.d.ts +15 -0
- package/dist/src/git/git.js +73 -0
- package/dist/src/git/git.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +415 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/proxy/server.d.ts +1 -0
- package/dist/src/proxy/server.js +92 -0
- package/dist/src/proxy/server.js.map +1 -0
- package/dist/src/tools/edit-file.d.ts +2 -0
- package/dist/src/tools/edit-file.js +88 -0
- package/dist/src/tools/edit-file.js.map +1 -0
- package/dist/src/tools/glob-tool.d.ts +2 -0
- package/dist/src/tools/glob-tool.js +52 -0
- package/dist/src/tools/glob-tool.js.map +1 -0
- package/dist/src/tools/grep.d.ts +2 -0
- package/dist/src/tools/grep.js +93 -0
- package/dist/src/tools/grep.js.map +1 -0
- package/dist/src/tools/list-directory.d.ts +2 -0
- package/dist/src/tools/list-directory.js +90 -0
- package/dist/src/tools/list-directory.js.map +1 -0
- package/dist/src/tools/read-file.d.ts +2 -0
- package/dist/src/tools/read-file.js +64 -0
- package/dist/src/tools/read-file.js.map +1 -0
- package/dist/src/tools/registry.d.ts +4 -0
- package/dist/src/tools/registry.js +32 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/run-command.d.ts +2 -0
- package/dist/src/tools/run-command.js +98 -0
- package/dist/src/tools/run-command.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +2 -0
- package/dist/src/tools/write-file.js +39 -0
- package/dist/src/tools/write-file.js.map +1 -0
- package/dist/src/types.d.ts +61 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/ui/input.d.ts +5 -0
- package/dist/src/ui/input.js +52 -0
- package/dist/src/ui/input.js.map +1 -0
- package/dist/src/ui/model-picker.d.ts +7 -0
- package/dist/src/ui/model-picker.js +70 -0
- package/dist/src/ui/model-picker.js.map +1 -0
- package/dist/src/ui/skills-picker.d.ts +2 -0
- package/dist/src/ui/skills-picker.js +95 -0
- package/dist/src/ui/skills-picker.js.map +1 -0
- package/dist/src/ui/skills.d.ts +14 -0
- package/dist/src/ui/skills.js +137 -0
- package/dist/src/ui/skills.js.map +1 -0
- package/dist/src/ui/spinner.d.ts +5 -0
- package/dist/src/ui/spinner.js +49 -0
- package/dist/src/ui/spinner.js.map +1 -0
- package/dist/src/ui/stream-renderer.d.ts +2 -0
- package/dist/src/ui/stream-renderer.js +66 -0
- package/dist/src/ui/stream-renderer.js.map +1 -0
- package/dist/src/ui/terminal.d.ts +24 -0
- package/dist/src/ui/terminal.js +272 -0
- package/dist/src/ui/terminal.js.map +1 -0
- package/package.json +16 -16
- package/api/health.ts +0 -8
- package/api/v1/chat/completions.ts +0 -43
- package/bin/kalcode.ts +0 -14
- package/src/agent/context.ts +0 -62
- package/src/agent/history.ts +0 -70
- package/src/agent/loop.ts +0 -282
- package/src/agent/memory.ts +0 -26
- package/src/agent/permissions.ts +0 -84
- package/src/agent/text-tool-parser.ts +0 -71
- package/src/api/client.ts +0 -105
- package/src/api/stream-parser.ts +0 -109
- package/src/config.ts +0 -61
- package/src/git/git.ts +0 -86
- package/src/index.ts +0 -403
- package/src/proxy/server.ts +0 -110
- package/src/tools/edit-file.ts +0 -97
- package/src/tools/glob-tool.ts +0 -59
- package/src/tools/grep.ts +0 -96
- package/src/tools/list-directory.ts +0 -101
- package/src/tools/read-file.ts +0 -71
- package/src/tools/registry.ts +0 -41
- package/src/tools/run-command.ts +0 -99
- package/src/tools/write-file.ts +0 -42
- package/src/types.ts +0 -68
- package/src/ui/input.ts +0 -60
- package/src/ui/model-picker.ts +0 -92
- package/src/ui/skills-picker.ts +0 -113
- package/src/ui/skills.ts +0 -152
- package/src/ui/spinner.ts +0 -56
- package/src/ui/stream-renderer.ts +0 -69
- package/src/ui/terminal.ts +0 -337
- package/tsconfig.json +0 -16
- package/vercel.json +0 -13
package/README.md
CHANGED
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Kalcode
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Kalcode is a terminal-native coding assistant powered by NVIDIA NIM.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
It supports both Node.js and Bun runtimes, includes a Claude-style TUI, and can run with:
|
|
6
|
+
- your own NVIDIA API key, or
|
|
7
|
+
- the hosted proxy endpoint (`https://kalcode.vercel.app`) with zero client setup.
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
## Installation
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
npm i -g @thejeetsingh/kalcode
|
|
11
|
-
```
|
|
11
|
+
### npm (recommended)
|
|
12
12
|
|
|
13
|
-
Run
|
|
13
|
+
Run directly:
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npx @thejeetsingh/kalcode
|
|
16
|
+
npx @thejeetsingh/kalcode
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Install globally:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
|
|
22
|
+
npm install -g @thejeetsingh/kalcode
|
|
23
|
+
kalcode
|
|
23
24
|
```
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
1. Login:
|
|
26
|
+
### Bun
|
|
28
27
|
|
|
29
28
|
```bash
|
|
30
|
-
|
|
29
|
+
bunx @thejeetsingh/kalcode
|
|
31
30
|
```
|
|
32
31
|
|
|
33
|
-
|
|
32
|
+
## Quick Start
|
|
34
33
|
|
|
35
34
|
```bash
|
|
36
|
-
|
|
35
|
+
kalcode "review the repository and suggest improvements"
|
|
37
36
|
```
|
|
38
37
|
|
|
39
|
-
|
|
38
|
+
By default, Kalcode can use the hosted proxy.
|
|
39
|
+
If you want to use your own provider key locally:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
|
|
42
|
+
kalcode --set-key
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
## Configuration
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
npm view @thejeetsingh/kalcode version
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Deployment and Secrets
|
|
47
|
+
### Environment Variables
|
|
52
48
|
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
- TLS verification is on by default. Do not disable it in production.
|
|
57
|
-
- `KALCODE_INSECURE_TLS=1` is available only as a local debugging escape hatch.
|
|
49
|
+
- `NVIDIA_NIM_KEY`: NVIDIA NIM API key (server-side for proxy deployments, optional on clients if proxy is used)
|
|
50
|
+
- `KALCODE_PROXY_URL`: Optional override for custom proxy URL
|
|
51
|
+
- `KALCODE_INSECURE_TLS=1`: Local debugging only; never use in production
|
|
58
52
|
|
|
59
|
-
##
|
|
53
|
+
## Deployment (Vercel Serverless Proxy)
|
|
60
54
|
|
|
61
|
-
|
|
55
|
+
This repository provides:
|
|
56
|
+
- `POST /v1/chat/completions` -> `/api/v1/chat/completions`
|
|
57
|
+
- `GET /health` -> `/api/health`
|
|
62
58
|
|
|
63
|
-
|
|
64
|
-
export NVIDIA_NIM_KEY="your-real-provider-key"
|
|
65
|
-
export PORT=8787
|
|
66
|
-
bun run proxy
|
|
67
|
-
```
|
|
59
|
+
### Steps
|
|
68
60
|
|
|
69
|
-
|
|
61
|
+
1. Import the `kalcode` directory as a Vercel project.
|
|
62
|
+
2. Ensure project settings match:
|
|
63
|
+
- Framework Preset: `Other`
|
|
64
|
+
- Build Command: `npm run build`
|
|
65
|
+
- Output Directory: `dist`
|
|
66
|
+
3. Add environment variable:
|
|
67
|
+
- `NVIDIA_NIM_KEY=your_real_key`
|
|
68
|
+
4. Deploy and verify:
|
|
70
69
|
|
|
71
70
|
```bash
|
|
72
|
-
|
|
73
|
-
kalcode
|
|
71
|
+
curl https://kalcode.vercel.app/health
|
|
74
72
|
```
|
|
75
73
|
|
|
76
|
-
|
|
74
|
+
Expected response:
|
|
77
75
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
```json
|
|
77
|
+
{"ok":true}
|
|
78
|
+
```
|
|
81
79
|
|
|
82
|
-
|
|
80
|
+
## CLI Options
|
|
81
|
+
|
|
82
|
+
- `-h, --help` Show help
|
|
83
|
+
- `-v, --version` Show version
|
|
84
|
+
- `-m, --model <id>` Use a specific model
|
|
85
|
+
- `--set-key` Save NVIDIA NIM API key to local config
|
|
86
|
+
- `--compact` Toggle compact output
|
|
87
|
+
- `--auto-accept` Skip permission prompts
|
|
88
|
+
- `--ask` Read-only mode
|
|
89
|
+
|
|
90
|
+
## REPL Slash Commands
|
|
91
|
+
|
|
92
|
+
- `/` Show command menu
|
|
93
|
+
- `/help` Show help
|
|
94
|
+
- `/model` Show or switch model
|
|
95
|
+
- `/clear` Clear conversation and context
|
|
96
|
+
- `/retry` Retry last message
|
|
97
|
+
- `/compact` Toggle compact output
|
|
98
|
+
- `/ask` Toggle read-only mode
|
|
99
|
+
- `/auto` Toggle auto-accept permissions
|
|
100
|
+
- `/skills` List available skills
|
|
101
|
+
- `/add <file>` Add file to context
|
|
102
|
+
- `/drop <file>` Remove file from context
|
|
103
|
+
- `/files` List context files
|
|
104
|
+
- `/diff` Show uncommitted changes
|
|
105
|
+
- `/status` Show git status
|
|
106
|
+
- `/log` Show recent commits
|
|
107
|
+
- `/undo` Undo last commit
|
|
108
|
+
- `/commit [message]` Commit all changes
|
|
109
|
+
- `/init` Create `KALCODE.md`
|
|
110
|
+
- `/exit`, `/quit`, `/q` Quit
|
|
111
|
+
|
|
112
|
+
## Development
|
|
113
|
+
|
|
114
|
+
Install dependencies:
|
|
83
115
|
|
|
84
116
|
```bash
|
|
85
|
-
|
|
117
|
+
npm install
|
|
86
118
|
```
|
|
87
119
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
This repo now includes Vercel serverless endpoints:
|
|
91
|
-
|
|
92
|
-
- `POST /v1/chat/completions` (rewritten to `/api/v1/chat/completions`)
|
|
93
|
-
- `GET /health` (rewritten to `/api/health`)
|
|
94
|
-
|
|
95
|
-
### 1) Deploy
|
|
96
|
-
|
|
97
|
-
- Import the `kalcode` folder as a Vercel project.
|
|
98
|
-
- Framework preset: **Other**.
|
|
99
|
-
- Build command: leave default/empty.
|
|
100
|
-
|
|
101
|
-
### 2) Set Vercel environment variables
|
|
102
|
-
|
|
103
|
-
- `NVIDIA_NIM_KEY` = your provider key (server-only)
|
|
104
|
-
|
|
105
|
-
### 3) Configure clients
|
|
120
|
+
Build:
|
|
106
121
|
|
|
107
122
|
```bash
|
|
108
|
-
|
|
109
|
-
kalcode
|
|
123
|
+
npm run build
|
|
110
124
|
```
|
|
111
125
|
|
|
112
|
-
|
|
126
|
+
Run locally:
|
|
113
127
|
|
|
114
128
|
```bash
|
|
115
|
-
|
|
129
|
+
npm run start
|
|
116
130
|
```
|
|
117
131
|
|
|
118
|
-
##
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
- `--auto-accept` - Skip permission prompts
|
|
126
|
-
- `--ask` - Read-only mode
|
|
127
|
-
|
|
128
|
-
## REPL Commands
|
|
129
|
-
|
|
130
|
-
- `/help` - Show help
|
|
131
|
-
- `/model` - Show or switch model
|
|
132
|
-
- `/clear` - Clear conversation
|
|
133
|
-
- `/retry` - Retry last message
|
|
134
|
-
- `/compact` - Toggle compact output
|
|
135
|
-
- `/ask` - Toggle read-only mode
|
|
136
|
-
- `/skills` - List skills
|
|
137
|
-
- `/` - Show slash commands
|
|
138
|
-
- `/exit` - Quit
|
|
132
|
+
## Publishing
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npm login
|
|
136
|
+
npm run build
|
|
137
|
+
npm publish --access public
|
|
138
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Optional local-dev escape hatch for TLS issues. Never enable in production.
|
|
3
|
+
if (process.env.KALCODE_INSECURE_TLS === "1") {
|
|
4
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
|
|
5
|
+
console.warn("Warning: insecure TLS mode enabled (KALCODE_INSECURE_TLS=1).");
|
|
6
|
+
}
|
|
7
|
+
import { main } from "../src/index.js";
|
|
8
|
+
main().catch((err) => {
|
|
9
|
+
console.error("Fatal error:", err);
|
|
10
|
+
process.exit(1);
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=kalcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kalcode.js","sourceRoot":"","sources":["../../bin/kalcode.ts"],"names":[],"mappings":";AACA,8EAA8E;AAC9E,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,EAAE,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;AAC/E,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function addFileToContext(filePath: string): string;
|
|
2
|
+
export declare function dropFileFromContext(filePath: string): string;
|
|
3
|
+
export declare function getContextFiles(): Map<string, string>;
|
|
4
|
+
export declare function listContextFiles(): string[];
|
|
5
|
+
export declare function clearContextFiles(): void;
|
|
6
|
+
export declare function buildContextBlock(): string;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { readFileSync, existsSync, statSync } from "fs";
|
|
2
|
+
import { resolve, relative } from "path";
|
|
3
|
+
import { MAX_FILE_SIZE } from "../constants.js";
|
|
4
|
+
const addedFiles = new Map();
|
|
5
|
+
export function addFileToContext(filePath) {
|
|
6
|
+
const abs = resolve(filePath);
|
|
7
|
+
if (!existsSync(abs))
|
|
8
|
+
return `File not found: ${filePath}`;
|
|
9
|
+
const stat = statSync(abs);
|
|
10
|
+
if (stat.isDirectory())
|
|
11
|
+
return `Cannot add directory: ${filePath}`;
|
|
12
|
+
if (stat.size > MAX_FILE_SIZE)
|
|
13
|
+
return `File too large: ${filePath}`;
|
|
14
|
+
try {
|
|
15
|
+
const content = readFileSync(abs, "utf-8");
|
|
16
|
+
const rel = relative(process.cwd(), abs);
|
|
17
|
+
addedFiles.set(rel, content);
|
|
18
|
+
return `Added ${rel} (${content.split("\n").length} lines)`;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return `Error reading ${filePath}: ${err}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function dropFileFromContext(filePath) {
|
|
25
|
+
const abs = resolve(filePath);
|
|
26
|
+
const rel = relative(process.cwd(), abs);
|
|
27
|
+
if (addedFiles.has(rel)) {
|
|
28
|
+
addedFiles.delete(rel);
|
|
29
|
+
return `Dropped ${rel}`;
|
|
30
|
+
}
|
|
31
|
+
// Try matching by the raw input too
|
|
32
|
+
if (addedFiles.has(filePath)) {
|
|
33
|
+
addedFiles.delete(filePath);
|
|
34
|
+
return `Dropped ${filePath}`;
|
|
35
|
+
}
|
|
36
|
+
return `Not in context: ${filePath}`;
|
|
37
|
+
}
|
|
38
|
+
export function getContextFiles() {
|
|
39
|
+
return addedFiles;
|
|
40
|
+
}
|
|
41
|
+
export function listContextFiles() {
|
|
42
|
+
return Array.from(addedFiles.keys());
|
|
43
|
+
}
|
|
44
|
+
export function clearContextFiles() {
|
|
45
|
+
addedFiles.clear();
|
|
46
|
+
}
|
|
47
|
+
export function buildContextBlock() {
|
|
48
|
+
if (addedFiles.size === 0)
|
|
49
|
+
return "";
|
|
50
|
+
let block = "\n\nFiles in context (provided by user for reference):\n";
|
|
51
|
+
for (const [path, content] of addedFiles) {
|
|
52
|
+
const lines = content.split("\n");
|
|
53
|
+
const preview = lines.length > 200
|
|
54
|
+
? lines.slice(0, 200).join("\n") + `\n... (${lines.length - 200} more lines)`
|
|
55
|
+
: content;
|
|
56
|
+
block += `\n--- ${path} ---\n${preview}\n`;
|
|
57
|
+
}
|
|
58
|
+
return block;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/agent/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Message } from "../types.js";
|
|
2
|
+
export declare function initHistory(): Promise<void>;
|
|
3
|
+
export declare function addMessage(msg: Message): void;
|
|
4
|
+
export declare function getMessages(): Message[];
|
|
5
|
+
export declare function getLastUserMessage(): string | null;
|
|
6
|
+
export declare function removeLastExchange(): void;
|
|
7
|
+
export declare function clearHistory(): void;
|
|
8
|
+
export declare function getMessageCount(): number;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { buildSystemPrompt } from "../constants.js";
|
|
2
|
+
import { loadProjectMemory } from "./memory.js";
|
|
3
|
+
import { buildContextBlock } from "./context.js";
|
|
4
|
+
import { isGitRepo, gitCurrentBranch } from "../git/git.js";
|
|
5
|
+
let messages = [];
|
|
6
|
+
export async function initHistory() {
|
|
7
|
+
let systemContent = buildSystemPrompt(process.cwd());
|
|
8
|
+
// Load project memory
|
|
9
|
+
const memory = loadProjectMemory(process.cwd());
|
|
10
|
+
if (memory) {
|
|
11
|
+
systemContent += `\n\nProject conventions (from KALCODE.md):\n${memory}`;
|
|
12
|
+
}
|
|
13
|
+
// Git context
|
|
14
|
+
if (isGitRepo()) {
|
|
15
|
+
const branch = await gitCurrentBranch();
|
|
16
|
+
systemContent += `\n\nGit: on branch "${branch}"`;
|
|
17
|
+
}
|
|
18
|
+
messages = [{ role: "system", content: systemContent }];
|
|
19
|
+
}
|
|
20
|
+
export function addMessage(msg) {
|
|
21
|
+
messages.push(msg);
|
|
22
|
+
}
|
|
23
|
+
export function getMessages() {
|
|
24
|
+
// Inject context files into the last user message if present
|
|
25
|
+
const contextBlock = buildContextBlock();
|
|
26
|
+
if (!contextBlock)
|
|
27
|
+
return messages;
|
|
28
|
+
// Clone and append context to the system message
|
|
29
|
+
const result = [...messages];
|
|
30
|
+
if (result.length > 0 && result[0].role === "system") {
|
|
31
|
+
result[0] = { ...result[0], content: result[0].content + contextBlock };
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
export function getLastUserMessage() {
|
|
36
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
37
|
+
if (messages[i].role === "user") {
|
|
38
|
+
return messages[i].content;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
export function removeLastExchange() {
|
|
44
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
45
|
+
if (messages[i].role === "user") {
|
|
46
|
+
messages = messages.slice(0, i);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function clearHistory() {
|
|
52
|
+
// Re-init is async now, but we can just reset messages
|
|
53
|
+
const systemMsg = messages.length > 0 ? messages[0] : { role: "system", content: "" };
|
|
54
|
+
messages = [systemMsg];
|
|
55
|
+
}
|
|
56
|
+
export function getMessageCount() {
|
|
57
|
+
return messages.filter(m => m.role !== "system").length;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/agent/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function setCompact(val: boolean): void;
|
|
2
|
+
export declare function getCompact(): boolean;
|
|
3
|
+
export declare function setAskMode(val: boolean): void;
|
|
4
|
+
export declare function getAskMode(): boolean;
|
|
5
|
+
export declare function interruptAgent(): void;
|
|
6
|
+
export declare function runAgentLoop(apiKey: string, model: string, userMessage: string): Promise<void>;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { streamChat } from "../api/client.js";
|
|
2
|
+
import { getAllDefinitions, executeToolCall } from "../tools/registry.js";
|
|
3
|
+
import { addMessage, getMessages } from "./history.js";
|
|
4
|
+
import { MAX_LOOP_ITERATIONS } from "../constants.js";
|
|
5
|
+
import { startSpinner, stopSpinner, updateSpinner, succeedSpinner, failSpinner, } from "../ui/spinner.js";
|
|
6
|
+
import { renderToolCall, renderToolResult, renderError, renderUsage, renderRetryWait, } from "../ui/terminal.js";
|
|
7
|
+
import { writeStreamToken, finishStream } from "../ui/stream-renderer.js";
|
|
8
|
+
import { parseTextToolCalls } from "./text-tool-parser.js";
|
|
9
|
+
import { needsPermission, requestPermission } from "./permissions.js";
|
|
10
|
+
let compactMode = false;
|
|
11
|
+
let interrupted = false;
|
|
12
|
+
let askMode = false;
|
|
13
|
+
export function setCompact(val) { compactMode = val; }
|
|
14
|
+
export function getCompact() { return compactMode; }
|
|
15
|
+
export function setAskMode(val) { askMode = val; }
|
|
16
|
+
export function getAskMode() { return askMode; }
|
|
17
|
+
export function interruptAgent() { interrupted = true; }
|
|
18
|
+
export async function runAgentLoop(apiKey, model, userMessage) {
|
|
19
|
+
addMessage({ role: "user", content: userMessage });
|
|
20
|
+
interrupted = false;
|
|
21
|
+
// In ask mode, only use read-only tools
|
|
22
|
+
const allDefs = getAllDefinitions();
|
|
23
|
+
const toolDefs = askMode
|
|
24
|
+
? allDefs.filter(t => !["writeFile", "editFile", "runCommand"].includes(t.function.name))
|
|
25
|
+
: allDefs;
|
|
26
|
+
let totalUsage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
|
|
27
|
+
for (let iteration = 0; iteration < MAX_LOOP_ITERATIONS; iteration++) {
|
|
28
|
+
if (interrupted)
|
|
29
|
+
break;
|
|
30
|
+
startSpinner("thinking");
|
|
31
|
+
let textContent = "";
|
|
32
|
+
const toolCallAccumulators = new Map();
|
|
33
|
+
let hasError = false;
|
|
34
|
+
let turnUsage = null;
|
|
35
|
+
try {
|
|
36
|
+
let firstToken = true;
|
|
37
|
+
const stream = streamChat(apiKey, model, getMessages(), toolDefs, (attempt, waitSec) => {
|
|
38
|
+
renderRetryWait(attempt, waitSec);
|
|
39
|
+
});
|
|
40
|
+
for await (const delta of stream) {
|
|
41
|
+
if (interrupted)
|
|
42
|
+
break;
|
|
43
|
+
if (delta.type === "content" && delta.content) {
|
|
44
|
+
if (firstToken) {
|
|
45
|
+
stopSpinner();
|
|
46
|
+
firstToken = false;
|
|
47
|
+
}
|
|
48
|
+
textContent += delta.content;
|
|
49
|
+
// Only stream text if we haven't seen tool calls yet
|
|
50
|
+
if (toolCallAccumulators.size === 0) {
|
|
51
|
+
writeStreamToken(delta.content);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (delta.type === "tool_call" && delta.toolCall) {
|
|
55
|
+
// If we were streaming text and now got tool calls, clear the text
|
|
56
|
+
if (toolCallAccumulators.size === 0 && textContent.trim()) {
|
|
57
|
+
if (!firstToken) {
|
|
58
|
+
clearStreamedText(textContent);
|
|
59
|
+
finishStream();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (firstToken) {
|
|
63
|
+
firstToken = false;
|
|
64
|
+
}
|
|
65
|
+
const tc = delta.toolCall;
|
|
66
|
+
if (!toolCallAccumulators.has(tc.index)) {
|
|
67
|
+
toolCallAccumulators.set(tc.index, {
|
|
68
|
+
id: tc.id || "",
|
|
69
|
+
function: { name: "", arguments: "" },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const acc = toolCallAccumulators.get(tc.index);
|
|
73
|
+
if (tc.id)
|
|
74
|
+
acc.id = tc.id;
|
|
75
|
+
if (tc.function?.name)
|
|
76
|
+
acc.function.name += tc.function.name;
|
|
77
|
+
if (tc.function?.arguments)
|
|
78
|
+
acc.function.arguments += tc.function.arguments;
|
|
79
|
+
// Show what tool is being prepared
|
|
80
|
+
const toolName = acc.function.name || "tool call";
|
|
81
|
+
updateSpinner(`preparing ${toolName}`);
|
|
82
|
+
}
|
|
83
|
+
else if (delta.type === "error") {
|
|
84
|
+
stopSpinner();
|
|
85
|
+
renderError(delta.error || "Unknown API error");
|
|
86
|
+
hasError = true;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
if (delta.usage)
|
|
90
|
+
turnUsage = delta.usage;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
stopSpinner();
|
|
95
|
+
renderError(`Stream error: ${err instanceof Error ? err.message : String(err)}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (interrupted) {
|
|
99
|
+
stopSpinner();
|
|
100
|
+
finishStream();
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
// Parse text-based tool calls
|
|
104
|
+
if (toolCallAccumulators.size === 0 && textContent.trim()) {
|
|
105
|
+
const parsed = parseTextToolCalls(textContent);
|
|
106
|
+
if (parsed && parsed.length > 0) {
|
|
107
|
+
clearStreamedText(textContent);
|
|
108
|
+
for (const tc of parsed) {
|
|
109
|
+
toolCallAccumulators.set(toolCallAccumulators.size, tc);
|
|
110
|
+
}
|
|
111
|
+
textContent = "";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Stop spinner after stream ends (was still running during tool_call accumulation)
|
|
115
|
+
stopSpinner();
|
|
116
|
+
if (toolCallAccumulators.size > 0 && textContent.trim()) {
|
|
117
|
+
clearStreamedText(textContent);
|
|
118
|
+
}
|
|
119
|
+
finishStream();
|
|
120
|
+
if (hasError)
|
|
121
|
+
return;
|
|
122
|
+
if (turnUsage) {
|
|
123
|
+
totalUsage.prompt_tokens += turnUsage.prompt_tokens;
|
|
124
|
+
totalUsage.completion_tokens += turnUsage.completion_tokens;
|
|
125
|
+
totalUsage.total_tokens += turnUsage.total_tokens;
|
|
126
|
+
}
|
|
127
|
+
const assistantMsg = {
|
|
128
|
+
role: "assistant",
|
|
129
|
+
content: toolCallAccumulators.size > 0 ? null : (textContent || null),
|
|
130
|
+
};
|
|
131
|
+
if (toolCallAccumulators.size > 0) {
|
|
132
|
+
assistantMsg.tool_calls = Array.from(toolCallAccumulators.values()).map((acc) => ({
|
|
133
|
+
id: acc.id,
|
|
134
|
+
type: "function",
|
|
135
|
+
function: {
|
|
136
|
+
name: acc.function.name,
|
|
137
|
+
arguments: acc.function.arguments,
|
|
138
|
+
},
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
addMessage(assistantMsg);
|
|
142
|
+
if (!assistantMsg.tool_calls || assistantMsg.tool_calls.length === 0) {
|
|
143
|
+
renderUsage(totalUsage.total_tokens > 0 ? totalUsage : null);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Execute tool calls
|
|
147
|
+
for (const tc of assistantMsg.tool_calls) {
|
|
148
|
+
if (interrupted)
|
|
149
|
+
break;
|
|
150
|
+
let parsedArgs;
|
|
151
|
+
try {
|
|
152
|
+
parsedArgs = JSON.parse(tc.function.arguments || "{}");
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
parsedArgs = {};
|
|
156
|
+
}
|
|
157
|
+
const toolName = tc.function.name;
|
|
158
|
+
const summary = formatPermissionSummary(toolName, parsedArgs);
|
|
159
|
+
// Permission check for write operations
|
|
160
|
+
if (needsPermission(toolName)) {
|
|
161
|
+
const allowed = await requestPermission(toolName, summary);
|
|
162
|
+
if (!allowed) {
|
|
163
|
+
renderToolCall(toolName, parsedArgs);
|
|
164
|
+
console.log(` ${chalk.dim("⎿")} ${chalk.yellow("Denied by user")}`);
|
|
165
|
+
addMessage({
|
|
166
|
+
role: "tool",
|
|
167
|
+
tool_call_id: tc.id,
|
|
168
|
+
content: "Permission denied by user. Do not retry this operation.",
|
|
169
|
+
});
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
renderToolCall(toolName, parsedArgs);
|
|
174
|
+
startSpinner(toolName);
|
|
175
|
+
try {
|
|
176
|
+
const result = await executeToolCall(toolName, parsedArgs);
|
|
177
|
+
succeedSpinner(toolName);
|
|
178
|
+
renderToolResult(toolName, result, compactMode);
|
|
179
|
+
addMessage({
|
|
180
|
+
role: "tool",
|
|
181
|
+
tool_call_id: tc.id,
|
|
182
|
+
content: result,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
failSpinner(`${toolName} failed`);
|
|
187
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
188
|
+
renderError(errorMsg);
|
|
189
|
+
addMessage({
|
|
190
|
+
role: "tool",
|
|
191
|
+
tool_call_id: tc.id,
|
|
192
|
+
content: `Error: ${errorMsg}`,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (interrupted) {
|
|
198
|
+
console.log("");
|
|
199
|
+
}
|
|
200
|
+
else if (!interrupted) {
|
|
201
|
+
renderError("Agent loop reached maximum iterations");
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function clearStreamedText(text) {
|
|
205
|
+
const cols = Math.max(20, process.stdout.columns || 80);
|
|
206
|
+
const lines = text.split("\n");
|
|
207
|
+
let rowsToClear = 0;
|
|
208
|
+
for (const line of lines) {
|
|
209
|
+
// Account for soft-wrapped rows to avoid leaving visual artifacts.
|
|
210
|
+
const len = Math.max(1, line.length);
|
|
211
|
+
rowsToClear += Math.ceil(len / cols);
|
|
212
|
+
}
|
|
213
|
+
for (let i = 0; i < rowsToClear; i++) {
|
|
214
|
+
process.stdout.write("\x1b[2K");
|
|
215
|
+
if (i < rowsToClear - 1) {
|
|
216
|
+
process.stdout.write("\x1b[A");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
process.stdout.write("\r");
|
|
220
|
+
}
|
|
221
|
+
function formatPermissionSummary(name, args) {
|
|
222
|
+
switch (name) {
|
|
223
|
+
case "writeFile":
|
|
224
|
+
return String(args.filePath || "");
|
|
225
|
+
case "editFile":
|
|
226
|
+
return String(args.filePath || "");
|
|
227
|
+
case "runCommand":
|
|
228
|
+
return `$ ${String(args.command || "").slice(0, 60)}`;
|
|
229
|
+
default:
|
|
230
|
+
return "";
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Need chalk for the denied message
|
|
234
|
+
import chalk from "chalk";
|
|
235
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../../src/agent/loop.ts"],"names":[],"mappings":"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"}
|