thatgfsj-code 0.3.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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/ROADMAP.md +61 -0
  4. package/dist/app/agent.d.ts +31 -0
  5. package/dist/app/agent.d.ts.map +1 -0
  6. package/dist/app/agent.js +106 -0
  7. package/dist/app/agent.js.map +1 -0
  8. package/dist/app/index.d.ts +39 -0
  9. package/dist/app/index.d.ts.map +1 -0
  10. package/dist/app/index.js +80 -0
  11. package/dist/app/index.js.map +1 -0
  12. package/dist/cmd/index.d.ts +12 -0
  13. package/dist/cmd/index.d.ts.map +1 -0
  14. package/dist/cmd/index.js +85 -0
  15. package/dist/cmd/index.js.map +1 -0
  16. package/dist/config/index.d.ts +39 -0
  17. package/dist/config/index.d.ts.map +1 -0
  18. package/dist/config/index.js +110 -0
  19. package/dist/config/index.js.map +1 -0
  20. package/dist/config/providers.d.ts +23 -0
  21. package/dist/config/providers.d.ts.map +1 -0
  22. package/dist/config/providers.js +152 -0
  23. package/dist/config/providers.js.map +1 -0
  24. package/dist/config/types.d.ts +33 -0
  25. package/dist/config/types.d.ts.map +1 -0
  26. package/dist/config/types.js +5 -0
  27. package/dist/config/types.js.map +1 -0
  28. package/dist/hooks/index.d.ts +31 -0
  29. package/dist/hooks/index.d.ts.map +1 -0
  30. package/dist/hooks/index.js +71 -0
  31. package/dist/hooks/index.js.map +1 -0
  32. package/dist/llm/anthropic.d.ts +17 -0
  33. package/dist/llm/anthropic.d.ts.map +1 -0
  34. package/dist/llm/anthropic.js +126 -0
  35. package/dist/llm/anthropic.js.map +1 -0
  36. package/dist/llm/gemini.d.ts +16 -0
  37. package/dist/llm/gemini.d.ts.map +1 -0
  38. package/dist/llm/gemini.js +107 -0
  39. package/dist/llm/gemini.js.map +1 -0
  40. package/dist/llm/index.d.ts +48 -0
  41. package/dist/llm/index.d.ts.map +1 -0
  42. package/dist/llm/index.js +174 -0
  43. package/dist/llm/index.js.map +1 -0
  44. package/dist/llm/openai.d.ts +17 -0
  45. package/dist/llm/openai.d.ts.map +1 -0
  46. package/dist/llm/openai.js +113 -0
  47. package/dist/llm/openai.js.map +1 -0
  48. package/dist/llm/provider.d.ts +33 -0
  49. package/dist/llm/provider.d.ts.map +1 -0
  50. package/dist/llm/provider.js +6 -0
  51. package/dist/llm/provider.js.map +1 -0
  52. package/dist/mcp/client.d.ts +83 -0
  53. package/dist/mcp/client.d.ts.map +1 -0
  54. package/dist/mcp/client.js +267 -0
  55. package/dist/mcp/client.js.map +1 -0
  56. package/dist/prompts/index.d.ts +27 -0
  57. package/dist/prompts/index.d.ts.map +1 -0
  58. package/dist/prompts/index.js +102 -0
  59. package/dist/prompts/index.js.map +1 -0
  60. package/dist/session/compactor.d.ts +48 -0
  61. package/dist/session/compactor.d.ts.map +1 -0
  62. package/dist/session/compactor.js +77 -0
  63. package/dist/session/compactor.js.map +1 -0
  64. package/dist/session/index.d.ts +48 -0
  65. package/dist/session/index.d.ts.map +1 -0
  66. package/dist/session/index.js +69 -0
  67. package/dist/session/index.js.map +1 -0
  68. package/dist/session/message.d.ts +26 -0
  69. package/dist/session/message.d.ts.map +1 -0
  70. package/dist/session/message.js +34 -0
  71. package/dist/session/message.js.map +1 -0
  72. package/dist/tools/file.d.ts +46 -0
  73. package/dist/tools/file.d.ts.map +1 -0
  74. package/dist/tools/file.js +100 -0
  75. package/dist/tools/file.js.map +1 -0
  76. package/dist/tools/git.d.ts +52 -0
  77. package/dist/tools/git.d.ts.map +1 -0
  78. package/dist/tools/git.js +112 -0
  79. package/dist/tools/git.js.map +1 -0
  80. package/dist/tools/index.d.ts +42 -0
  81. package/dist/tools/index.d.ts.map +1 -0
  82. package/dist/tools/index.js +92 -0
  83. package/dist/tools/index.js.map +1 -0
  84. package/dist/tools/search.d.ts +36 -0
  85. package/dist/tools/search.d.ts.map +1 -0
  86. package/dist/tools/search.js +223 -0
  87. package/dist/tools/search.js.map +1 -0
  88. package/dist/tools/shell.d.ts +50 -0
  89. package/dist/tools/shell.d.ts.map +1 -0
  90. package/dist/tools/shell.js +117 -0
  91. package/dist/tools/shell.js.map +1 -0
  92. package/dist/tools/types.d.ts +68 -0
  93. package/dist/tools/types.d.ts.map +1 -0
  94. package/dist/tools/types.js +57 -0
  95. package/dist/tools/types.js.map +1 -0
  96. package/dist/tui/index.d.ts +8 -0
  97. package/dist/tui/index.d.ts.map +1 -0
  98. package/dist/tui/index.js +8 -0
  99. package/dist/tui/index.js.map +1 -0
  100. package/dist/tui/input.d.ts +14 -0
  101. package/dist/tui/input.d.ts.map +1 -0
  102. package/dist/tui/input.js +50 -0
  103. package/dist/tui/input.js.map +1 -0
  104. package/dist/tui/output.d.ts +20 -0
  105. package/dist/tui/output.d.ts.map +1 -0
  106. package/dist/tui/output.js +70 -0
  107. package/dist/tui/output.js.map +1 -0
  108. package/dist/tui/repl.d.ts +25 -0
  109. package/dist/tui/repl.d.ts.map +1 -0
  110. package/dist/tui/repl.js +114 -0
  111. package/dist/tui/repl.js.map +1 -0
  112. package/dist/tui/welcome.d.ts +15 -0
  113. package/dist/tui/welcome.d.ts.map +1 -0
  114. package/dist/tui/welcome.js +86 -0
  115. package/dist/tui/welcome.js.map +1 -0
  116. package/dist/types.d.ts +38 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/dist/types.js +6 -0
  119. package/dist/types.js.map +1 -0
  120. package/dist/utils/diff.d.ts +22 -0
  121. package/dist/utils/diff.d.ts.map +1 -0
  122. package/dist/utils/diff.js +60 -0
  123. package/dist/utils/diff.js.map +1 -0
  124. package/dist/utils/project.d.ts +32 -0
  125. package/dist/utils/project.d.ts.map +1 -0
  126. package/dist/utils/project.js +89 -0
  127. package/dist/utils/project.js.map +1 -0
  128. package/docs/API_KEY_GUIDE.md +236 -0
  129. package/docs/FAQ.md +182 -0
  130. package/install.bat +63 -0
  131. package/install.ps1 +238 -0
  132. package/install.sh +113 -0
  133. package/package.json +36 -0
  134. package/src/app/agent.ts +140 -0
  135. package/src/app/index.ts +101 -0
  136. package/src/cmd/index.ts +96 -0
  137. package/src/config/index.ts +130 -0
  138. package/src/config/providers.ts +160 -0
  139. package/src/config/types.ts +46 -0
  140. package/src/hooks/index.ts +111 -0
  141. package/src/llm/anthropic.ts +146 -0
  142. package/src/llm/gemini.ts +127 -0
  143. package/src/llm/index.ts +209 -0
  144. package/src/llm/openai.ts +132 -0
  145. package/src/llm/provider.ts +38 -0
  146. package/src/mcp/client.ts +330 -0
  147. package/src/prompts/index.ts +123 -0
  148. package/src/session/compactor.ts +103 -0
  149. package/src/session/index.ts +81 -0
  150. package/src/session/message.ts +42 -0
  151. package/src/tools/file.ts +117 -0
  152. package/src/tools/git.ts +132 -0
  153. package/src/tools/index.ts +108 -0
  154. package/src/tools/search.ts +263 -0
  155. package/src/tools/shell.ts +136 -0
  156. package/src/tools/types.ts +122 -0
  157. package/src/tui/index.ts +8 -0
  158. package/src/tui/input.ts +56 -0
  159. package/src/tui/output.ts +83 -0
  160. package/src/tui/repl.ts +131 -0
  161. package/src/tui/welcome.ts +101 -0
  162. package/src/types.ts +42 -0
  163. package/src/utils/diff.ts +71 -0
  164. package/src/utils/project.ts +99 -0
  165. package/tsconfig.json +19 -0
@@ -0,0 +1,267 @@
1
+ /**
2
+ * S07: MCP Client (Model Context Protocol)
3
+ * Connect to MCP servers and expose their tools as agent tools
4
+ *
5
+ * MCP turns the agent from a closed system into an open platform.
6
+ * Any server can expose tools via the MCP JSON-RPC 2.0 protocol.
7
+ */
8
+ import { spawn } from 'child_process';
9
+ // ==================== MCP Client ====================
10
+ export class MCPClient {
11
+ process = null;
12
+ tools = new Map();
13
+ requestId = 0;
14
+ pendingRequests = new Map();
15
+ name;
16
+ connected = false;
17
+ constructor(name) {
18
+ this.name = name;
19
+ }
20
+ /**
21
+ * S07: Connect to an MCP server
22
+ * @param command Command to run (e.g., 'npx', 'node')
23
+ * @param args Arguments (e.g., ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/dir'])
24
+ */
25
+ async connect(command, args) {
26
+ return new Promise((resolve, reject) => {
27
+ this.process = spawn(command, args, {
28
+ stdio: ['pipe', 'pipe', 'pipe']
29
+ });
30
+ let buffer = '';
31
+ this.process.stdout?.on('data', (data) => {
32
+ buffer += data.toString();
33
+ const lines = buffer.split('\n');
34
+ buffer = lines.pop() || '';
35
+ for (const line of lines) {
36
+ if (line.trim()) {
37
+ this.handleMessage(line);
38
+ }
39
+ }
40
+ });
41
+ this.process.stderr?.on('data', (data) => {
42
+ console.error(`[MCP ${this.name}] stderr:`, data.toString().trim());
43
+ });
44
+ this.process.on('error', (err) => {
45
+ reject(err);
46
+ });
47
+ this.process.on('close', (code) => {
48
+ this.connected = false;
49
+ console.log(`[MCP ${this.name}] exited with code ${code}`);
50
+ });
51
+ // Initialize MCP connection
52
+ this.sendRequest('initialize', {
53
+ protocolVersion: '2024-11-05',
54
+ capabilities: { tools: {} },
55
+ clientInfo: { name: 'thatgfsj-code', version: '1.0.0' }
56
+ }).then(() => {
57
+ this.connected = true;
58
+ // Send initialized notification
59
+ this.sendNotification('initialized', {});
60
+ // List available tools
61
+ return this.listTools();
62
+ }).then(() => {
63
+ resolve();
64
+ }).catch(reject);
65
+ // Timeout
66
+ setTimeout(() => reject(new Error('MCP connection timeout')), 30000);
67
+ });
68
+ }
69
+ /**
70
+ * S07: Handle incoming JSON-RPC message
71
+ */
72
+ handleMessage(raw) {
73
+ try {
74
+ const msg = JSON.parse(raw);
75
+ // Handle response
76
+ const pending = this.pendingRequests.get(msg.id);
77
+ if (pending) {
78
+ this.pendingRequests.delete(msg.id);
79
+ if (msg.error) {
80
+ pending.reject(new Error(msg.error.message));
81
+ }
82
+ else {
83
+ pending.resolve(msg.result);
84
+ }
85
+ return;
86
+ }
87
+ }
88
+ catch {
89
+ // Not JSON, ignore
90
+ }
91
+ }
92
+ /**
93
+ * S07: Send a JSON-RPC request
94
+ */
95
+ sendRequest(method, params) {
96
+ return new Promise((resolve, reject) => {
97
+ if (!this.process?.connected) {
98
+ reject(new Error('MCP process not connected'));
99
+ return;
100
+ }
101
+ const id = ++this.requestId;
102
+ this.pendingRequests.set(id, { resolve, reject });
103
+ const request = {
104
+ jsonrpc: '2.0',
105
+ id,
106
+ method,
107
+ params
108
+ };
109
+ this.process.stdin?.write(JSON.stringify(request) + '\n');
110
+ // Timeout
111
+ setTimeout(() => {
112
+ if (this.pendingRequests.has(id)) {
113
+ this.pendingRequests.delete(id);
114
+ reject(new Error('MCP request timeout: ' + method));
115
+ }
116
+ }, 30000);
117
+ });
118
+ }
119
+ /**
120
+ * S07: Send a notification (no response expected)
121
+ */
122
+ sendNotification(method, params) {
123
+ if (!this.process?.connected)
124
+ return;
125
+ const notification = {
126
+ jsonrpc: '2.0',
127
+ method,
128
+ params
129
+ };
130
+ this.process.stdin?.write(JSON.stringify(notification) + '\n');
131
+ }
132
+ /**
133
+ * S07: Call an MCP tool
134
+ */
135
+ async callTool(name, arguments_) {
136
+ try {
137
+ const result = await this.sendRequest('tools/call', {
138
+ name,
139
+ arguments: arguments_
140
+ });
141
+ return {
142
+ success: true,
143
+ output: typeof result === 'string' ? result : JSON.stringify(result)
144
+ };
145
+ }
146
+ catch (error) {
147
+ return {
148
+ success: false,
149
+ error: error.message
150
+ };
151
+ }
152
+ }
153
+ /**
154
+ * S07: List tools from MCP server
155
+ */
156
+ async listTools() {
157
+ try {
158
+ const result = await this.sendRequest('tools/list', {});
159
+ const tools = result.tools || [];
160
+ this.tools.clear();
161
+ for (const tool of tools) {
162
+ this.tools.set(tool.name, tool);
163
+ }
164
+ console.log(`[MCP ${this.name}] Loaded ${tools.length} tools:`, [...this.tools.keys()].join(', '));
165
+ }
166
+ catch (error) {
167
+ console.error(`[MCP ${this.name}] Failed to list tools:`, error.message);
168
+ }
169
+ }
170
+ /**
171
+ * S07: Get registered tools as agent Tool[]
172
+ */
173
+ getTools() {
174
+ return [...this.tools.values()].map(mcpTool => ({
175
+ name: this.name + ':' + mcpTool.name,
176
+ description: mcpTool.description,
177
+ parameters: Object.entries(mcpTool.inputSchema.properties || {}).map(([name, schema]) => ({
178
+ name,
179
+ type: schema.type || 'string',
180
+ description: schema.description || '',
181
+ required: (mcpTool.inputSchema.required || []).includes(name)
182
+ })),
183
+ execute: async (params) => {
184
+ return this.callTool(mcpTool.name, params);
185
+ }
186
+ }));
187
+ }
188
+ /**
189
+ * S07: Get tool names
190
+ */
191
+ getToolNames() {
192
+ return [...this.tools.keys()];
193
+ }
194
+ /**
195
+ * S07: Check if connected
196
+ */
197
+ isConnected() {
198
+ return this.connected;
199
+ }
200
+ /**
201
+ * S07: Disconnect from MCP server
202
+ */
203
+ disconnect() {
204
+ if (this.process) {
205
+ this.process.kill();
206
+ this.process = null;
207
+ }
208
+ this.connected = false;
209
+ this.tools.clear();
210
+ this.pendingRequests.clear();
211
+ }
212
+ }
213
+ // ==================== MCP Server Manager ====================
214
+ export class MCPServerManager {
215
+ clients = new Map();
216
+ /**
217
+ * S07: Add and connect an MCP server
218
+ */
219
+ async addServer(name, command, args) {
220
+ const client = new MCPClient(name);
221
+ await client.connect(command, args);
222
+ this.clients.set(name, client);
223
+ }
224
+ /**
225
+ * S07: Get all tools from all servers
226
+ */
227
+ getAllTools() {
228
+ const allTools = [];
229
+ for (const client of this.clients.values()) {
230
+ allTools.push(...client.getTools());
231
+ }
232
+ return allTools;
233
+ }
234
+ /**
235
+ * S07: Get tool names from all servers
236
+ */
237
+ getAllToolNames() {
238
+ const names = [];
239
+ for (const [serverName, client] of this.clients) {
240
+ for (const toolName of client.getToolNames()) {
241
+ names.push(serverName + ':' + toolName);
242
+ }
243
+ }
244
+ return names;
245
+ }
246
+ /**
247
+ * S07: Disconnect a server
248
+ */
249
+ removeServer(name) {
250
+ const client = this.clients.get(name);
251
+ if (client) {
252
+ client.disconnect();
253
+ this.clients.delete(name);
254
+ }
255
+ }
256
+ /**
257
+ * S07: Get server status
258
+ */
259
+ getStatus() {
260
+ const status = {};
261
+ for (const [name, client] of this.clients) {
262
+ status[name] = client.isConnected();
263
+ }
264
+ return status;
265
+ }
266
+ }
267
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * System Prompt Builder - Dynamic prompt construction
3
+ * Migrated from old src/core/system-prompt.ts
4
+ */
5
+ import type { Tool } from '../tools/types.js';
6
+ export interface SystemPromptConfig {
7
+ cwd?: string;
8
+ tools?: Tool[];
9
+ includeProjectMd?: boolean;
10
+ permissionMode?: 'accept' | 'deny' | 'ask';
11
+ date?: Date;
12
+ }
13
+ export declare class SystemPromptBuilder {
14
+ private config;
15
+ constructor(config?: SystemPromptConfig);
16
+ build(): string;
17
+ private buildIdentity;
18
+ private buildToolInstructions;
19
+ private buildEnvironment;
20
+ private buildPermissionMode;
21
+ private buildProjectInstructions;
22
+ private buildDateInfo;
23
+ setTools(tools: Tool[]): this;
24
+ setCwd(cwd: string): this;
25
+ setPermissionMode(mode: 'accept' | 'deny' | 'ask'): this;
26
+ }
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAC3C,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,GAAE,kBAAuB;IAU3C,KAAK,IAAI,MAAM;IAYf,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,aAAa;IAMrB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACzB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;CACzD"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * System Prompt Builder - Dynamic prompt construction
3
+ * Migrated from old src/core/system-prompt.ts
4
+ */
5
+ import { readFileSync, existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ export class SystemPromptBuilder {
8
+ config;
9
+ constructor(config = {}) {
10
+ this.config = {
11
+ cwd: config.cwd ?? process.cwd(),
12
+ tools: config.tools ?? [],
13
+ includeProjectMd: config.includeProjectMd ?? true,
14
+ permissionMode: config.permissionMode ?? 'ask',
15
+ date: config.date ?? new Date(),
16
+ };
17
+ }
18
+ build() {
19
+ const fragments = [
20
+ this.buildIdentity(),
21
+ this.buildToolInstructions(),
22
+ this.buildEnvironment(),
23
+ this.buildPermissionMode(),
24
+ this.buildProjectInstructions(),
25
+ this.buildDateInfo(),
26
+ ];
27
+ return fragments.filter(Boolean).join('\n\n');
28
+ }
29
+ buildIdentity() {
30
+ return [
31
+ 'You are Thatgfsj Code, an interactive coding agent running in the user\'s terminal.',
32
+ '',
33
+ 'You have access to tools (file operations, shell commands, git, search) that let you',
34
+ 'read, write, and modify files and run commands to help with coding tasks.',
35
+ '',
36
+ 'When working on a task:',
37
+ '1. First understand what files are involved',
38
+ '2. Read necessary files to understand the codebase',
39
+ '3. Make changes using appropriate tools',
40
+ '4. Verify the changes work',
41
+ '',
42
+ 'Be concise but thorough. Show your reasoning.',
43
+ '',
44
+ 'When using tools:',
45
+ '- Prefer small, targeted operations over large batch changes',
46
+ '- Confirm destructive operations (rm, git push --force, etc.)',
47
+ '- Explain what you are going to do before doing it',
48
+ ].join('\n');
49
+ }
50
+ buildToolInstructions() {
51
+ const tools = this.config.tools;
52
+ if (tools.length === 0) {
53
+ return '## Tools\n\nNo tools are currently registered.';
54
+ }
55
+ const toolDescs = tools.map(t => {
56
+ const params = t.parameters
57
+ .map(p => ` - ${p.name} (${p.type}${p.required ? ', required' : ''}): ${p.description}`)
58
+ .join('\n');
59
+ return `### ${t.name}\n${t.description}\n\nParameters:\n${params}`;
60
+ }).join('\n\n');
61
+ return `## Tools\n\nYou have access to the following tools:\n\n${toolDescs}\n\nTo use a tool, respond with a tool call. Each tool call must include the tool name and parameters as a JSON object.`;
62
+ }
63
+ buildEnvironment() {
64
+ return `## Environment\n\nWorking directory: ${this.config.cwd}`;
65
+ }
66
+ buildPermissionMode() {
67
+ const mode = this.config.permissionMode;
68
+ const explanations = {
69
+ accept: 'All tool calls are automatically allowed without confirmation.',
70
+ deny: 'All tool calls are blocked. You may only read and discuss.',
71
+ ask: 'Dangerous or destructive commands require user confirmation before execution.',
72
+ };
73
+ return `## Permission Mode\n\nCurrent mode: ${mode}\n\n${explanations[mode] || ''}`;
74
+ }
75
+ buildProjectInstructions() {
76
+ if (!this.config.includeProjectMd)
77
+ return '';
78
+ const cwd = this.config.cwd;
79
+ const paths = [join(cwd, 'CLAUDE.md'), join(cwd, '.claude.md'), join(cwd, 'AGENTS.md')];
80
+ for (const path of paths) {
81
+ if (existsSync(path)) {
82
+ try {
83
+ const content = readFileSync(path, 'utf-8');
84
+ return `## Project Instructions (from ${path.split(/[/\\]/).pop()})\n\n${content}`;
85
+ }
86
+ catch {
87
+ // Ignore
88
+ }
89
+ }
90
+ }
91
+ return '';
92
+ }
93
+ buildDateInfo() {
94
+ const now = this.config.date;
95
+ const iso = now.toISOString().replace('T', ' ').split('.')[0];
96
+ return `## Current Time\n\n${iso}`;
97
+ }
98
+ setTools(tools) { this.config.tools = tools; return this; }
99
+ setCwd(cwd) { this.config.cwd = cwd; return this; }
100
+ setPermissionMode(mode) { this.config.permissionMode = mode; return this; }
101
+ }
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Context Compactor - Progressive compression for conversation history
3
+ * Migrated from old src/core/context-compactor.ts
4
+ *
5
+ * Strategy:
6
+ * 1. Within limit: no compression
7
+ * 2. Beyond limit: keep system + recent N turns + summarize middle
8
+ */
9
+ import type { ChatMessage } from '../types.js';
10
+ export interface CompactorConfig {
11
+ /** Max messages before compression kicks in */
12
+ maxMessages?: number;
13
+ /** How many recent turns to always preserve */
14
+ preserveRecent?: number;
15
+ }
16
+ export interface CompressionResult {
17
+ originalCount: number;
18
+ compactedCount: number;
19
+ removedCount: number;
20
+ }
21
+ export declare class ContextCompactor {
22
+ private maxMessages;
23
+ private preserveRecent;
24
+ constructor(config?: CompactorConfig);
25
+ /**
26
+ * Compact messages if needed
27
+ */
28
+ compact(messages: ChatMessage[]): {
29
+ compacted: ChatMessage[];
30
+ result: CompressionResult;
31
+ };
32
+ /**
33
+ * Auto-compact if messages exceed limit
34
+ */
35
+ autoCompact(messages: ChatMessage[]): {
36
+ compacted: ChatMessage[];
37
+ result: CompressionResult;
38
+ };
39
+ /**
40
+ * Estimate token count (rough: ~4 chars per token)
41
+ */
42
+ estimateTokens(messages: ChatMessage[]): number;
43
+ /**
44
+ * Extract topic summary from messages
45
+ */
46
+ private extractTopics;
47
+ }
48
+ //# sourceMappingURL=compactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/session/compactor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,GAAE,eAAoB;IAKxC;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE;IA0CzF;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE;IAI7F;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM;IAI/C;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Context Compactor - Progressive compression for conversation history
3
+ * Migrated from old src/core/context-compactor.ts
4
+ *
5
+ * Strategy:
6
+ * 1. Within limit: no compression
7
+ * 2. Beyond limit: keep system + recent N turns + summarize middle
8
+ */
9
+ export class ContextCompactor {
10
+ maxMessages;
11
+ preserveRecent;
12
+ constructor(config = {}) {
13
+ this.maxMessages = config.maxMessages ?? 50;
14
+ this.preserveRecent = config.preserveRecent ?? 10;
15
+ }
16
+ /**
17
+ * Compact messages if needed
18
+ */
19
+ compact(messages) {
20
+ if (messages.length <= this.maxMessages) {
21
+ return {
22
+ compacted: messages,
23
+ result: { originalCount: messages.length, compactedCount: messages.length, removedCount: 0 },
24
+ };
25
+ }
26
+ const systemMsg = messages.find(m => m.role === 'system');
27
+ const others = messages.filter(m => m.role !== 'system');
28
+ if (others.length <= this.preserveRecent) {
29
+ return {
30
+ compacted: messages,
31
+ result: { originalCount: messages.length, compactedCount: messages.length, removedCount: 0 },
32
+ };
33
+ }
34
+ // Keep recent N turns
35
+ const recent = others.slice(-this.preserveRecent);
36
+ // Summarize the middle portion
37
+ const middle = others.slice(0, -this.preserveRecent);
38
+ const summary = {
39
+ role: 'system',
40
+ content: `[Earlier conversation summary: ${middle.length} messages covering ${this.extractTopics(middle)}]`,
41
+ };
42
+ const compacted = systemMsg
43
+ ? [systemMsg, summary, ...recent]
44
+ : [summary, ...recent];
45
+ return {
46
+ compacted,
47
+ result: {
48
+ originalCount: messages.length,
49
+ compactedCount: compacted.length,
50
+ removedCount: messages.length - compacted.length,
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Auto-compact if messages exceed limit
56
+ */
57
+ autoCompact(messages) {
58
+ return this.compact(messages);
59
+ }
60
+ /**
61
+ * Estimate token count (rough: ~4 chars per token)
62
+ */
63
+ estimateTokens(messages) {
64
+ return messages.reduce((sum, m) => sum + Math.ceil(m.content.length / 4) + 10, 0);
65
+ }
66
+ /**
67
+ * Extract topic summary from messages
68
+ */
69
+ extractTopics(msgs) {
70
+ const topics = msgs
71
+ .filter(m => m.role === 'user')
72
+ .map(m => m.content.slice(0, 30))
73
+ .slice(0, 3);
74
+ return topics.join(', ') || 'various topics';
75
+ }
76
+ }
77
+ //# sourceMappingURL=compactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/session/compactor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Session Manager - Manages conversation history
3
+ * Migrated from old src/core/session.ts
4
+ */
5
+ import type { ChatMessage } from '../types.js';
6
+ export declare class SessionManager {
7
+ private messages;
8
+ private sessionId;
9
+ private createdAt;
10
+ private compactor;
11
+ constructor(maxMessages?: number);
12
+ /**
13
+ * Add a message to the session
14
+ */
15
+ addMessage(role: ChatMessage['role'], content: string, extras?: Partial<ChatMessage>): void;
16
+ /**
17
+ * Get all messages (copy)
18
+ */
19
+ getMessages(): ChatMessage[];
20
+ /**
21
+ * Get message count
22
+ */
23
+ getMessageCount(): number;
24
+ /**
25
+ * Clear session history
26
+ */
27
+ clear(): void;
28
+ /**
29
+ * Truncate messages to fit context window
30
+ */
31
+ truncate(maxMessages?: number): void;
32
+ /**
33
+ * Get session ID
34
+ */
35
+ getId(): string;
36
+ /**
37
+ * Get session info
38
+ */
39
+ getInfo(): {
40
+ id: string;
41
+ messageCount: number;
42
+ createdAt: Date;
43
+ };
44
+ }
45
+ export { ContextCompactor } from './compactor.js';
46
+ export type { CompactorConfig, CompressionResult } from './compactor.js';
47
+ export * from './message.js';
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,SAAS,CAAmB;gBAExB,WAAW,SAAK;IAM5B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAI3F;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAI5B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,OAAO,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE;CAOjE;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzE,cAAc,cAAc,CAAC"}