@thejeetsingh/kalcode 2.1.0 → 2.2.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 (124) hide show
  1. package/dist/bin/kalcode.d.ts +2 -0
  2. package/dist/bin/kalcode.js +12 -0
  3. package/dist/bin/kalcode.js.map +1 -0
  4. package/dist/src/agent/context.d.ts +6 -0
  5. package/dist/src/agent/context.js +60 -0
  6. package/dist/src/agent/context.js.map +1 -0
  7. package/dist/src/agent/history.d.ts +8 -0
  8. package/dist/src/agent/history.js +59 -0
  9. package/dist/src/agent/history.js.map +1 -0
  10. package/dist/src/agent/loop.d.ts +6 -0
  11. package/dist/src/agent/loop.js +235 -0
  12. package/dist/src/agent/loop.js.map +1 -0
  13. package/dist/src/agent/memory.d.ts +2 -0
  14. package/dist/src/agent/memory.js +27 -0
  15. package/dist/src/agent/memory.js.map +1 -0
  16. package/dist/src/agent/permissions.d.ts +5 -0
  17. package/dist/src/agent/permissions.js +66 -0
  18. package/dist/src/agent/permissions.js.map +1 -0
  19. package/dist/src/agent/text-tool-parser.d.ts +2 -0
  20. package/dist/src/agent/text-tool-parser.js +68 -0
  21. package/dist/src/agent/text-tool-parser.js.map +1 -0
  22. package/dist/src/api/client.d.ts +2 -0
  23. package/dist/src/api/client.js +86 -0
  24. package/dist/src/api/client.js.map +1 -0
  25. package/dist/src/api/stream-parser.d.ts +2 -0
  26. package/dist/src/api/stream-parser.js +97 -0
  27. package/dist/src/api/stream-parser.js.map +1 -0
  28. package/dist/src/config.d.ts +7 -0
  29. package/dist/src/config.js +52 -0
  30. package/dist/src/config.js.map +1 -0
  31. package/dist/src/constants.d.ts +25 -0
  32. package/{src/constants.ts → dist/src/constants.js} +15 -20
  33. package/dist/src/constants.js.map +1 -0
  34. package/dist/src/git/git.d.ts +15 -0
  35. package/dist/src/git/git.js +73 -0
  36. package/dist/src/git/git.js.map +1 -0
  37. package/dist/src/index.d.ts +1 -0
  38. package/dist/src/index.js +415 -0
  39. package/dist/src/index.js.map +1 -0
  40. package/dist/src/proxy/server.d.ts +1 -0
  41. package/dist/src/proxy/server.js +92 -0
  42. package/dist/src/proxy/server.js.map +1 -0
  43. package/dist/src/tools/edit-file.d.ts +2 -0
  44. package/dist/src/tools/edit-file.js +88 -0
  45. package/dist/src/tools/edit-file.js.map +1 -0
  46. package/dist/src/tools/glob-tool.d.ts +2 -0
  47. package/dist/src/tools/glob-tool.js +52 -0
  48. package/dist/src/tools/glob-tool.js.map +1 -0
  49. package/dist/src/tools/grep.d.ts +2 -0
  50. package/dist/src/tools/grep.js +93 -0
  51. package/dist/src/tools/grep.js.map +1 -0
  52. package/dist/src/tools/list-directory.d.ts +2 -0
  53. package/dist/src/tools/list-directory.js +90 -0
  54. package/dist/src/tools/list-directory.js.map +1 -0
  55. package/dist/src/tools/read-file.d.ts +2 -0
  56. package/dist/src/tools/read-file.js +64 -0
  57. package/dist/src/tools/read-file.js.map +1 -0
  58. package/dist/src/tools/registry.d.ts +4 -0
  59. package/dist/src/tools/registry.js +32 -0
  60. package/dist/src/tools/registry.js.map +1 -0
  61. package/dist/src/tools/run-command.d.ts +2 -0
  62. package/dist/src/tools/run-command.js +98 -0
  63. package/dist/src/tools/run-command.js.map +1 -0
  64. package/dist/src/tools/write-file.d.ts +2 -0
  65. package/dist/src/tools/write-file.js +39 -0
  66. package/dist/src/tools/write-file.js.map +1 -0
  67. package/dist/src/types.d.ts +61 -0
  68. package/dist/src/types.js +2 -0
  69. package/dist/src/types.js.map +1 -0
  70. package/dist/src/ui/input.d.ts +5 -0
  71. package/dist/src/ui/input.js +52 -0
  72. package/dist/src/ui/input.js.map +1 -0
  73. package/dist/src/ui/model-picker.d.ts +7 -0
  74. package/dist/src/ui/model-picker.js +70 -0
  75. package/dist/src/ui/model-picker.js.map +1 -0
  76. package/dist/src/ui/skills-picker.d.ts +2 -0
  77. package/dist/src/ui/skills-picker.js +95 -0
  78. package/dist/src/ui/skills-picker.js.map +1 -0
  79. package/dist/src/ui/skills.d.ts +14 -0
  80. package/dist/src/ui/skills.js +137 -0
  81. package/dist/src/ui/skills.js.map +1 -0
  82. package/dist/src/ui/spinner.d.ts +5 -0
  83. package/dist/src/ui/spinner.js +49 -0
  84. package/dist/src/ui/spinner.js.map +1 -0
  85. package/dist/src/ui/stream-renderer.d.ts +2 -0
  86. package/dist/src/ui/stream-renderer.js +66 -0
  87. package/dist/src/ui/stream-renderer.js.map +1 -0
  88. package/dist/src/ui/terminal.d.ts +24 -0
  89. package/dist/src/ui/terminal.js +272 -0
  90. package/dist/src/ui/terminal.js.map +1 -0
  91. package/package.json +16 -16
  92. package/api/health.ts +0 -8
  93. package/api/v1/chat/completions.ts +0 -43
  94. package/bin/kalcode.ts +0 -14
  95. package/src/agent/context.ts +0 -62
  96. package/src/agent/history.ts +0 -70
  97. package/src/agent/loop.ts +0 -282
  98. package/src/agent/memory.ts +0 -26
  99. package/src/agent/permissions.ts +0 -84
  100. package/src/agent/text-tool-parser.ts +0 -71
  101. package/src/api/client.ts +0 -105
  102. package/src/api/stream-parser.ts +0 -109
  103. package/src/config.ts +0 -61
  104. package/src/git/git.ts +0 -86
  105. package/src/index.ts +0 -403
  106. package/src/proxy/server.ts +0 -110
  107. package/src/tools/edit-file.ts +0 -97
  108. package/src/tools/glob-tool.ts +0 -59
  109. package/src/tools/grep.ts +0 -96
  110. package/src/tools/list-directory.ts +0 -101
  111. package/src/tools/read-file.ts +0 -71
  112. package/src/tools/registry.ts +0 -41
  113. package/src/tools/run-command.ts +0 -99
  114. package/src/tools/write-file.ts +0 -42
  115. package/src/types.ts +0 -68
  116. package/src/ui/input.ts +0 -60
  117. package/src/ui/model-picker.ts +0 -92
  118. package/src/ui/skills-picker.ts +0 -113
  119. package/src/ui/skills.ts +0 -152
  120. package/src/ui/spinner.ts +0 -56
  121. package/src/ui/stream-renderer.ts +0 -69
  122. package/src/ui/terminal.ts +0 -337
  123. package/tsconfig.json +0 -16
  124. package/vercel.json +0 -13
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export declare function loadProjectMemory(cwd: string): string | null;
2
+ export declare function getMemoryFileName(cwd: string): string | null;
@@ -0,0 +1,27 @@
1
+ import { existsSync, readFileSync } from "fs";
2
+ import { join } from "path";
3
+ const MEMORY_FILES = ["KALCODE.md", "CONVENTIONS.md", ".kalcode.md"];
4
+ export function loadProjectMemory(cwd) {
5
+ for (const name of MEMORY_FILES) {
6
+ const path = join(cwd, name);
7
+ if (existsSync(path)) {
8
+ try {
9
+ const content = readFileSync(path, "utf-8").trim();
10
+ if (content)
11
+ return content;
12
+ }
13
+ catch {
14
+ // ignore
15
+ }
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ export function getMemoryFileName(cwd) {
21
+ for (const name of MEMORY_FILES) {
22
+ if (existsSync(join(cwd, name)))
23
+ return name;
24
+ }
25
+ return null;
26
+ }
27
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/agent/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAErE,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,OAAO;oBAAE,OAAO,OAAO,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type PermissionLevel = "ask" | "auto" | "deny-writes";
2
+ export declare function setPermissionLevel(level: PermissionLevel): void;
3
+ export declare function getPermissionLevel(): PermissionLevel;
4
+ export declare function needsPermission(toolName: string): boolean;
5
+ export declare function requestPermission(toolName: string, summary: string): Promise<boolean>;
@@ -0,0 +1,66 @@
1
+ import chalk from "chalk";
2
+ let permissionLevel = "ask";
3
+ const sessionApprovals = new Set();
4
+ export function setPermissionLevel(level) {
5
+ permissionLevel = level;
6
+ }
7
+ export function getPermissionLevel() {
8
+ return permissionLevel;
9
+ }
10
+ // Tools that modify state
11
+ const WRITE_TOOLS = new Set(["writeFile", "editFile", "runCommand"]);
12
+ export function needsPermission(toolName) {
13
+ if (permissionLevel === "auto")
14
+ return false;
15
+ if (permissionLevel === "deny-writes" && WRITE_TOOLS.has(toolName))
16
+ return false;
17
+ return WRITE_TOOLS.has(toolName);
18
+ }
19
+ export async function requestPermission(toolName, summary) {
20
+ const key = `${toolName}:${summary}`;
21
+ if (sessionApprovals.has(key))
22
+ return true;
23
+ // Claude Code style: ? marker with clean options
24
+ const promptText = ` ${chalk.yellow("?")} Allow ${chalk.bold.white(toolName)}` +
25
+ (summary ? ` ${chalk.dim(summary)}` : "") +
26
+ ` ${chalk.dim("(y)es / (n)o / (a)lways")} `;
27
+ process.stdout.write(promptText);
28
+ const answer = await readSingleKey();
29
+ const writeDecision = (decision, color) => {
30
+ // Redraw the line to eliminate any echoed keypress artifacts (e.g. "yyes").
31
+ process.stdout.write(`\r\x1b[2K${promptText}${color(decision)}\n`);
32
+ };
33
+ if (answer === "a") {
34
+ writeDecision("always", chalk.green);
35
+ setPermissionLevel("auto");
36
+ return true;
37
+ }
38
+ if (answer === "y" || answer === "\r" || answer === "\n") {
39
+ writeDecision("yes", chalk.green);
40
+ sessionApprovals.add(key);
41
+ return true;
42
+ }
43
+ writeDecision("no", chalk.red);
44
+ return false;
45
+ }
46
+ function readSingleKey() {
47
+ return new Promise((resolve) => {
48
+ const stdin = process.stdin;
49
+ const wasRaw = stdin.isRaw;
50
+ stdin.setRawMode(true);
51
+ stdin.resume();
52
+ function onData(data) {
53
+ stdin.removeListener("data", onData);
54
+ stdin.setRawMode(wasRaw ?? false);
55
+ const key = data.toString();
56
+ // Ctrl+C
57
+ if (key === "\x03") {
58
+ resolve("n");
59
+ return;
60
+ }
61
+ resolve(key.toLowerCase());
62
+ }
63
+ stdin.on("data", onData);
64
+ });
65
+ }
66
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/agent/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolCallAccumulator } from "../types.js";
2
+ export declare function parseTextToolCalls(text: string): ToolCallAccumulator[] | null;
@@ -0,0 +1,68 @@
1
+ // Parse tool calls from model text output when the model doesn't use
2
+ // the proper tool_call API. Handles formats like:
3
+ // ```tool_code
4
+ // [toolName(arg1='val1', arg2='val2')]
5
+ // ```
6
+ // or JSON-like: {"name": "toolName", "arguments": {"arg": "val"}}
7
+ export function parseTextToolCalls(text) {
8
+ const results = [];
9
+ // Pattern 1: ```tool_code blocks (gemma style)
10
+ const toolCodeRegex = /```tool_code\s*\n([\s\S]*?)```/g;
11
+ let match;
12
+ while ((match = toolCodeRegex.exec(text)) !== null) {
13
+ const block = match[1].trim();
14
+ const calls = parseToolCodeBlock(block);
15
+ results.push(...calls);
16
+ }
17
+ if (results.length > 0)
18
+ return results;
19
+ // Pattern 2: [toolName(args)] without code blocks
20
+ const bracketRegex = /\[(\w+)\(([^)]*)\)\]/g;
21
+ while ((match = bracketRegex.exec(text)) !== null) {
22
+ const name = match[1];
23
+ const argsStr = match[2];
24
+ const args = parseKeyValueArgs(argsStr);
25
+ results.push({
26
+ id: `text-${Date.now()}-${results.length}`,
27
+ function: { name, arguments: JSON.stringify(args) },
28
+ });
29
+ }
30
+ return results.length > 0 ? results : null;
31
+ }
32
+ function parseToolCodeBlock(block) {
33
+ const results = [];
34
+ // Match [toolName(key='value', key2='value2')] or [toolName(key="value")]
35
+ const callRegex = /\[?(\w+)\(([^)]*)\)\]?/g;
36
+ let match;
37
+ while ((match = callRegex.exec(block)) !== null) {
38
+ const name = match[1];
39
+ const argsStr = match[2];
40
+ const args = parseKeyValueArgs(argsStr);
41
+ results.push({
42
+ id: `text-${Date.now()}-${results.length}`,
43
+ function: { name, arguments: JSON.stringify(args) },
44
+ });
45
+ }
46
+ return results;
47
+ }
48
+ function parseKeyValueArgs(argsStr) {
49
+ const args = {};
50
+ // Match key='value' or key="value" or key=value or key=true/false/number
51
+ const argRegex = /(\w+)\s*=\s*(?:'([^']*)'|"([^"]*)"|(\S+))/g;
52
+ let match;
53
+ while ((match = argRegex.exec(argsStr)) !== null) {
54
+ const key = match[1];
55
+ const value = match[2] ?? match[3] ?? match[4];
56
+ // Try to parse as boolean/number
57
+ if (value === "true")
58
+ args[key] = true;
59
+ else if (value === "false")
60
+ args[key] = false;
61
+ else if (!isNaN(Number(value)) && value !== "")
62
+ args[key] = Number(value);
63
+ else
64
+ args[key] = value;
65
+ }
66
+ return args;
67
+ }
68
+ //# sourceMappingURL=text-tool-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-tool-parser.js","sourceRoot":"","sources":["../../../src/agent/text-tool-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Message, StreamDelta, ToolDefinition } from "../types.js";
2
+ export declare function streamChat(apiKey: string, model: string, messages: Message[], tools?: ToolDefinition[], onRetry?: (attempt: number, waitSec: number) => void): AsyncGenerator<StreamDelta>;