@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.
Files changed (125) hide show
  1. package/README.md +89 -89
  2. package/dist/bin/kalcode.d.ts +2 -0
  3. package/dist/bin/kalcode.js +12 -0
  4. package/dist/bin/kalcode.js.map +1 -0
  5. package/dist/src/agent/context.d.ts +6 -0
  6. package/dist/src/agent/context.js +60 -0
  7. package/dist/src/agent/context.js.map +1 -0
  8. package/dist/src/agent/history.d.ts +8 -0
  9. package/dist/src/agent/history.js +59 -0
  10. package/dist/src/agent/history.js.map +1 -0
  11. package/dist/src/agent/loop.d.ts +6 -0
  12. package/dist/src/agent/loop.js +235 -0
  13. package/dist/src/agent/loop.js.map +1 -0
  14. package/dist/src/agent/memory.d.ts +2 -0
  15. package/dist/src/agent/memory.js +27 -0
  16. package/dist/src/agent/memory.js.map +1 -0
  17. package/dist/src/agent/permissions.d.ts +5 -0
  18. package/dist/src/agent/permissions.js +66 -0
  19. package/dist/src/agent/permissions.js.map +1 -0
  20. package/dist/src/agent/text-tool-parser.d.ts +2 -0
  21. package/dist/src/agent/text-tool-parser.js +68 -0
  22. package/dist/src/agent/text-tool-parser.js.map +1 -0
  23. package/dist/src/api/client.d.ts +2 -0
  24. package/dist/src/api/client.js +86 -0
  25. package/dist/src/api/client.js.map +1 -0
  26. package/dist/src/api/stream-parser.d.ts +2 -0
  27. package/dist/src/api/stream-parser.js +97 -0
  28. package/dist/src/api/stream-parser.js.map +1 -0
  29. package/dist/src/config.d.ts +7 -0
  30. package/dist/src/config.js +52 -0
  31. package/dist/src/config.js.map +1 -0
  32. package/dist/src/constants.d.ts +25 -0
  33. package/{src/constants.ts → dist/src/constants.js} +15 -20
  34. package/dist/src/constants.js.map +1 -0
  35. package/dist/src/git/git.d.ts +15 -0
  36. package/dist/src/git/git.js +73 -0
  37. package/dist/src/git/git.js.map +1 -0
  38. package/dist/src/index.d.ts +1 -0
  39. package/dist/src/index.js +415 -0
  40. package/dist/src/index.js.map +1 -0
  41. package/dist/src/proxy/server.d.ts +1 -0
  42. package/dist/src/proxy/server.js +92 -0
  43. package/dist/src/proxy/server.js.map +1 -0
  44. package/dist/src/tools/edit-file.d.ts +2 -0
  45. package/dist/src/tools/edit-file.js +88 -0
  46. package/dist/src/tools/edit-file.js.map +1 -0
  47. package/dist/src/tools/glob-tool.d.ts +2 -0
  48. package/dist/src/tools/glob-tool.js +52 -0
  49. package/dist/src/tools/glob-tool.js.map +1 -0
  50. package/dist/src/tools/grep.d.ts +2 -0
  51. package/dist/src/tools/grep.js +93 -0
  52. package/dist/src/tools/grep.js.map +1 -0
  53. package/dist/src/tools/list-directory.d.ts +2 -0
  54. package/dist/src/tools/list-directory.js +90 -0
  55. package/dist/src/tools/list-directory.js.map +1 -0
  56. package/dist/src/tools/read-file.d.ts +2 -0
  57. package/dist/src/tools/read-file.js +64 -0
  58. package/dist/src/tools/read-file.js.map +1 -0
  59. package/dist/src/tools/registry.d.ts +4 -0
  60. package/dist/src/tools/registry.js +32 -0
  61. package/dist/src/tools/registry.js.map +1 -0
  62. package/dist/src/tools/run-command.d.ts +2 -0
  63. package/dist/src/tools/run-command.js +98 -0
  64. package/dist/src/tools/run-command.js.map +1 -0
  65. package/dist/src/tools/write-file.d.ts +2 -0
  66. package/dist/src/tools/write-file.js +39 -0
  67. package/dist/src/tools/write-file.js.map +1 -0
  68. package/dist/src/types.d.ts +61 -0
  69. package/dist/src/types.js +2 -0
  70. package/dist/src/types.js.map +1 -0
  71. package/dist/src/ui/input.d.ts +5 -0
  72. package/dist/src/ui/input.js +52 -0
  73. package/dist/src/ui/input.js.map +1 -0
  74. package/dist/src/ui/model-picker.d.ts +7 -0
  75. package/dist/src/ui/model-picker.js +70 -0
  76. package/dist/src/ui/model-picker.js.map +1 -0
  77. package/dist/src/ui/skills-picker.d.ts +2 -0
  78. package/dist/src/ui/skills-picker.js +95 -0
  79. package/dist/src/ui/skills-picker.js.map +1 -0
  80. package/dist/src/ui/skills.d.ts +14 -0
  81. package/dist/src/ui/skills.js +137 -0
  82. package/dist/src/ui/skills.js.map +1 -0
  83. package/dist/src/ui/spinner.d.ts +5 -0
  84. package/dist/src/ui/spinner.js +49 -0
  85. package/dist/src/ui/spinner.js.map +1 -0
  86. package/dist/src/ui/stream-renderer.d.ts +2 -0
  87. package/dist/src/ui/stream-renderer.js +66 -0
  88. package/dist/src/ui/stream-renderer.js.map +1 -0
  89. package/dist/src/ui/terminal.d.ts +24 -0
  90. package/dist/src/ui/terminal.js +272 -0
  91. package/dist/src/ui/terminal.js.map +1 -0
  92. package/package.json +16 -16
  93. package/api/health.ts +0 -8
  94. package/api/v1/chat/completions.ts +0 -43
  95. package/bin/kalcode.ts +0 -14
  96. package/src/agent/context.ts +0 -62
  97. package/src/agent/history.ts +0 -70
  98. package/src/agent/loop.ts +0 -282
  99. package/src/agent/memory.ts +0 -26
  100. package/src/agent/permissions.ts +0 -84
  101. package/src/agent/text-tool-parser.ts +0 -71
  102. package/src/api/client.ts +0 -105
  103. package/src/api/stream-parser.ts +0 -109
  104. package/src/config.ts +0 -61
  105. package/src/git/git.ts +0 -86
  106. package/src/index.ts +0 -403
  107. package/src/proxy/server.ts +0 -110
  108. package/src/tools/edit-file.ts +0 -97
  109. package/src/tools/glob-tool.ts +0 -59
  110. package/src/tools/grep.ts +0 -96
  111. package/src/tools/list-directory.ts +0 -101
  112. package/src/tools/read-file.ts +0 -71
  113. package/src/tools/registry.ts +0 -41
  114. package/src/tools/run-command.ts +0 -99
  115. package/src/tools/write-file.ts +0 -42
  116. package/src/types.ts +0 -68
  117. package/src/ui/input.ts +0 -60
  118. package/src/ui/model-picker.ts +0 -92
  119. package/src/ui/skills-picker.ts +0 -113
  120. package/src/ui/skills.ts +0 -152
  121. package/src/ui/spinner.ts +0 -56
  122. package/src/ui/stream-renderer.ts +0 -69
  123. package/src/ui/terminal.ts +0 -337
  124. package/tsconfig.json +0 -16
  125. package/vercel.json +0 -13
package/README.md CHANGED
@@ -1,138 +1,138 @@
1
- # kalcode
1
+ # Kalcode
2
2
 
3
- CLI coding agent powered by NVIDIA NIM.
3
+ Kalcode is a terminal-native coding assistant powered by NVIDIA NIM.
4
4
 
5
- ## Install
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
- Global install:
9
+ ## Installation
8
10
 
9
- ```bash
10
- npm i -g @thejeetsingh/kalcode
11
- ```
11
+ ### npm (recommended)
12
12
 
13
- Run without global install:
13
+ Run directly:
14
14
 
15
15
  ```bash
16
- npx @thejeetsingh/kalcode --version
16
+ npx @thejeetsingh/kalcode
17
17
  ```
18
18
 
19
- ## Usage
19
+ Install globally:
20
20
 
21
21
  ```bash
22
- kalcode "your prompt here"
22
+ npm install -g @thejeetsingh/kalcode
23
+ kalcode
23
24
  ```
24
25
 
25
- ## Publish to npm
26
-
27
- 1. Login:
26
+ ### Bun
28
27
 
29
28
  ```bash
30
- npm login
29
+ bunx @thejeetsingh/kalcode
31
30
  ```
32
31
 
33
- 2. Check what will be published:
32
+ ## Quick Start
34
33
 
35
34
  ```bash
36
- npm pack --dry-run
35
+ kalcode "review the repository and suggest improvements"
37
36
  ```
38
37
 
39
- 3. Publish:
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
- npm publish --access public
42
+ kalcode --set-key
43
43
  ```
44
44
 
45
- 4. Verify:
45
+ ## Configuration
46
46
 
47
- ```bash
48
- npm view @thejeetsingh/kalcode version
49
- ```
50
-
51
- ## Deployment and Secrets
47
+ ### Environment Variables
52
48
 
53
- - Do not hardcode API keys in source files.
54
- - Set `NVIDIA_NIM_KEY` in your shell or deployment environment.
55
- - Use `kalcode --set-key` to store the key in `~/.kalcode/config.json` for local development.
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
- ## Secure Proxy Mode (share access without sharing your NVIDIA key)
53
+ ## Deployment (Vercel Serverless Proxy)
60
54
 
61
- Run the backend proxy with your NVIDIA key on a server you control:
55
+ This repository provides:
56
+ - `POST /v1/chat/completions` -> `/api/v1/chat/completions`
57
+ - `GET /health` -> `/api/health`
62
58
 
63
- ```bash
64
- export NVIDIA_NIM_KEY="your-real-provider-key"
65
- export PORT=8787
66
- bun run proxy
67
- ```
59
+ ### Steps
68
60
 
69
- Client users run `kalcode` with proxy settings (no NVIDIA key needed on client):
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
- export KALCODE_PROXY_URL="https://your-proxy-domain"
73
- kalcode
71
+ curl https://kalcode.vercel.app/health
74
72
  ```
75
73
 
76
- Optional server hardening vars:
74
+ Expected response:
77
75
 
78
- - `KALCODE_PROXY_RATE_LIMIT_PER_MIN` - per-client request cap (default `120`)
79
- - `HOST` - bind host (default `0.0.0.0`)
80
- - `PORT` - bind port (default `8787`)
76
+ ```json
77
+ {"ok":true}
78
+ ```
81
79
 
82
- Health check endpoint:
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
- curl https://your-proxy-domain/health
117
+ npm install
86
118
  ```
87
119
 
88
- ## Vercel Deployment (serverless)
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
- export KALCODE_PROXY_URL="https://<your-vercel-project>.vercel.app"
109
- kalcode
123
+ npm run build
110
124
  ```
111
125
 
112
- ### 4) Verify
126
+ Run locally:
113
127
 
114
128
  ```bash
115
- curl https://<your-vercel-project>.vercel.app/health
129
+ npm run start
116
130
  ```
117
131
 
118
- ## Options
119
-
120
- - `-h, --help` - Show help
121
- - `-v, --version` - Show version
122
- - `-m, --model <id>` - Use a specific model
123
- - `--set-key` - Set NVIDIA NIM API key
124
- - `--compact` - Compact output
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,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":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE5D,IAAI,QAAQ,GAAc,EAAE,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,sBAAsB;IACtB,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,EAAE,CAAC;QACX,aAAa,IAAI,+CAA+C,MAAM,EAAE,CAAC;IAC3E,CAAC;IAED,cAAc;IACd,IAAI,SAAS,EAAE,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACxC,aAAa,IAAI,uBAAuB,MAAM,GAAG,CAAC;IACpD,CAAC;IAED,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,6DAA6D;IAC7D,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC;IACzC,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC;IAEnC,iDAAiD;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtD,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAiB,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,uDAAuD;IACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAChG,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC"}
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,MAAM,UAAU,UAAU,CAAC,GAAY,IAAU,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;AACrE,MAAM,UAAU,UAAU,KAAc,OAAO,WAAW,CAAC,CAAC,CAAC;AAC7D,MAAM,UAAU,UAAU,CAAC,GAAY,IAAU,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;AACjE,MAAM,UAAU,UAAU,KAAc,OAAO,OAAO,CAAC,CAAC,CAAC;AACzD,MAAM,UAAU,cAAc,KAAW,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC;AAE9D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,KAAa,EACb,WAAmB;IAEnB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,WAAW,GAAG,KAAK,CAAC;IAEpB,wCAAwC;IACxC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO;QACtB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzF,CAAC,CAAC,OAAO,CAAC;IAEZ,IAAI,UAAU,GAAe,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAEzF,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,mBAAmB,EAAE,SAAS,EAAE,EAAE,CAAC;QACrE,IAAI,WAAW;YAAE,MAAM;QAEvB,YAAY,CAAC,UAAU,CAAC,CAAC;QAEzB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,MAAM,oBAAoB,GAAqC,IAAI,GAAG,EAAE,CAAC;QACzE,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,SAAS,GAAsB,IAAI,CAAC;QAExC,IAAI,CAAC;YACH,IAAI,UAAU,GAAG,IAAI,CAAC;YACtB,MAAM,MAAM,GAAG,UAAU,CACvB,MAAM,EACN,KAAK,EACL,WAAW,EAAE,EACb,QAAQ,EACR,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;gBACnB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpC,CAAC,CACF,CAAC;YAEF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACjC,IAAI,WAAW;oBAAE,MAAM;gBAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAC9C,IAAI,UAAU,EAAE,CAAC;wBACf,WAAW,EAAE,CAAC;wBACd,UAAU,GAAG,KAAK,CAAC;oBACrB,CAAC;oBACD,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC;oBAC7B,qDAAqD;oBACrD,IAAI,oBAAoB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACpC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACxD,mEAAmE;oBACnE,IAAI,oBAAoB,CAAC,IAAI,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;4BAChB,iBAAiB,CAAC,WAAW,CAAC,CAAC;4BAC/B,YAAY,EAAE,CAAC;wBACjB,CAAC;oBACH,CAAC;oBACD,IAAI,UAAU,EAAE,CAAC;wBACf,UAAU,GAAG,KAAK,CAAC;oBACrB,CAAC;oBACD,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC;oBAC1B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;wBACxC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE;4BACjC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE;4BACf,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;yBACtC,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAE,CAAC;oBAChD,IAAI,EAAE,CAAC,EAAE;wBAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;oBAC1B,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI;wBAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC7D,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS;wBAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAC5E,mCAAmC;oBACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC;oBAClD,aAAa,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAClC,WAAW,EAAE,CAAC;oBACd,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC;oBAChD,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM;gBACR,CAAC;gBAED,IAAI,KAAK,CAAC,KAAK;oBAAE,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,WAAW,EAAE,CAAC;YACd,WAAW,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QAED,8BAA8B;QAC9B,IAAI,oBAAoB,CAAC,IAAI,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC/C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBAC/B,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;oBACxB,oBAAoB,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,WAAW,GAAG,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,mFAAmF;QACnF,WAAW,EAAE,CAAC;QAEd,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,YAAY,EAAE,CAAC;QAEf,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC;YACpD,UAAU,CAAC,iBAAiB,IAAI,SAAS,CAAC,iBAAiB,CAAC;YAC5D,UAAU,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC;QACpD,CAAC;QAED,MAAM,YAAY,GAAY;YAC5B,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,oBAAoB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC;SACtE,CAAC;QAEF,IAAI,oBAAoB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAClC,YAAY,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CACrE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACR,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,UAAmB;gBACzB,QAAQ,EAAE;oBACR,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;oBACvB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS;iBAClC;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,YAAY,CAAC,CAAC;QAEzB,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,WAAW,CAAC,UAAU,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,WAAW;gBAAE,MAAM;YAEvB,IAAI,UAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAE9D,wCAAwC;YACxC,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;oBACtE,UAAU,CAAC;wBACT,IAAI,EAAE,MAAM;wBACZ,YAAY,EAAE,EAAE,CAAC,EAAE;wBACnB,OAAO,EAAE,yDAAyD;qBACnE,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;YACH,CAAC;YAED,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACrC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAEvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC3D,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACzB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAEhD,UAAU,CAAC;oBACT,IAAI,EAAE,MAAM;oBACZ,YAAY,EAAE,EAAE,CAAC,EAAE;oBACnB,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,WAAW,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC;gBAClC,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAClE,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAEtB,UAAU,CAAC;oBACT,IAAI,EAAE,MAAM;oBACZ,YAAY,EAAE,EAAE,CAAC,EAAE;oBACnB,OAAO,EAAE,UAAU,QAAQ,EAAE;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;SAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxB,WAAW,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mEAAmE;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY,EAAE,IAA6B;IAC1E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrC,KAAK,UAAU;YACb,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrC,KAAK,YAAY;YACf,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACxD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function loadProjectMemory(cwd: string): string | null;
2
+ export declare function getMemoryFileName(cwd: string): string | null;