gaunt-sloth-assistant 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/release-notes/v0_5_2.md +23 -0
- package/dist/commands/chatCommand.d.ts +2 -0
- package/dist/commands/chatCommand.js +78 -0
- package/dist/commands/chatCommand.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/llmUtils.d.ts +4 -2
- package/dist/llmUtils.js +8 -8
- package/dist/llmUtils.js.map +1 -1
- package/dist/modules/questionAnsweringModule.js +4 -2
- package/dist/modules/questionAnsweringModule.js.map +1 -1
- package/dist/modules/reviewModule.js +4 -2
- package/dist/modules/reviewModule.js.map +1 -1
- package/dist/systemUtils.d.ts +3 -0
- package/dist/systemUtils.js +2 -0
- package/dist/systemUtils.js.map +1 -1
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +13 -1
- package/dist/utils.js.map +1 -1
- package/index.js +1 -1
- package/package.json +1 -1
- package/src/commands/chatCommand.ts +90 -0
- package/src/config.ts +3 -0
- package/src/index.ts +2 -1
- package/src/llmUtils.ts +17 -14
- package/src/modules/questionAnsweringModule.ts +4 -2
- package/src/modules/reviewModule.ts +4 -2
- package/src/systemUtils.ts +3 -0
- package/src/utils.ts +13 -1
- package/.claude/settings.local.json +0 -15
- package/CLAUDE.md +0 -1
- package/ROADMAP.md +0 -36
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# v0.5.2 Interactive Chat Command
|
|
2
|
+
|
|
3
|
+
## New Features
|
|
4
|
+
|
|
5
|
+
### Interactive Chat Command
|
|
6
|
+
- Added new `chat` command for interactive conversations with Gaunt Sloth
|
|
7
|
+
- Features:
|
|
8
|
+
- Interactive chat sessions with context memory
|
|
9
|
+
- Chat history saved to `.gsloth/CHAT_<timestamp>.md` files
|
|
10
|
+
- Support for initial message argument or interactive start
|
|
11
|
+
- Clean exit with 'exit' command or Ctrl+C
|
|
12
|
+
- Automatic streaming disabled for better chat experience
|
|
13
|
+
|
|
14
|
+
## Bug Fixes
|
|
15
|
+
|
|
16
|
+
### Module Updates
|
|
17
|
+
- Fixed tests for question answering module
|
|
18
|
+
- Fixed review module tests
|
|
19
|
+
- Resolved chat history handling issues
|
|
20
|
+
|
|
21
|
+
## Other Changes
|
|
22
|
+
|
|
23
|
+
- Removed ROADMAP.md in favor of GitHub issues, milestones, and discussions
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { initConfig } from '#src/config.js';
|
|
2
|
+
import { display } from '#src/consoleUtils.js';
|
|
3
|
+
import { invoke } from '#src/llmUtils.js';
|
|
4
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { MemorySaver } from '@langchain/langgraph';
|
|
7
|
+
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
8
|
+
import { createInterface, error, exit, stdin as input, stdout as output, } from '#src/systemUtils.js';
|
|
9
|
+
import { getGslothFilePath } from '#src/filePathUtils.js';
|
|
10
|
+
import { generateStandardFileName, appendToFile } from '#src/utils.js';
|
|
11
|
+
export function chatCommand(program) {
|
|
12
|
+
program
|
|
13
|
+
.command('chat')
|
|
14
|
+
.description('Start an interactive chat session with Gaunt Sloth')
|
|
15
|
+
.argument('[message]', 'Initial message to start the chat')
|
|
16
|
+
.action(async (message) => {
|
|
17
|
+
try {
|
|
18
|
+
// Force streaming Off for chat, it does not play nicely with the input interface
|
|
19
|
+
const config = { ...(await initConfig()), streamOutput: false };
|
|
20
|
+
const checkpointSaver = new MemorySaver();
|
|
21
|
+
const rl = createInterface({ input, output });
|
|
22
|
+
let isFirstMessage = true;
|
|
23
|
+
let shouldExit = false;
|
|
24
|
+
const thread_id = uuidv4();
|
|
25
|
+
const chatLogFileName = getGslothFilePath(generateStandardFileName('CHAT'));
|
|
26
|
+
display(chalk.gray(`Chat session will be logged to ${chatLogFileName}\n`));
|
|
27
|
+
const processMessage = async (userInput) => {
|
|
28
|
+
const messages = [];
|
|
29
|
+
if (isFirstMessage) {
|
|
30
|
+
messages.push(new SystemMessage('You are a helpful AI assistant.'));
|
|
31
|
+
}
|
|
32
|
+
messages.push(new HumanMessage(userInput));
|
|
33
|
+
const runConfig = {
|
|
34
|
+
configurable: { thread_id },
|
|
35
|
+
};
|
|
36
|
+
const aiResponse = await invoke('chat', messages, config, runConfig, checkpointSaver);
|
|
37
|
+
const logEntry = `## User\n\n${userInput}\n\n## Assistant\n\n${aiResponse}\n\n`;
|
|
38
|
+
appendToFile(chatLogFileName, logEntry);
|
|
39
|
+
isFirstMessage = false;
|
|
40
|
+
};
|
|
41
|
+
const askQuestion = () => {
|
|
42
|
+
rl.question(chalk.magenta(' > '), async (userInput) => {
|
|
43
|
+
if (userInput.toLowerCase() === 'exit') {
|
|
44
|
+
rl.close();
|
|
45
|
+
shouldExit = true;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (isFirstMessage && !userInput.trim()) {
|
|
49
|
+
rl.close();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!userInput.trim()) {
|
|
53
|
+
rl.close();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
await processMessage(userInput);
|
|
57
|
+
display(chalk.gray("Type 'exit' or hit Ctrl+C to exit chat\n"));
|
|
58
|
+
if (!shouldExit)
|
|
59
|
+
askQuestion();
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
if (message) {
|
|
63
|
+
await processMessage(message);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
display("\nHello! I'm Gaunt Sloth, your AI assistant. How can I help you today?");
|
|
67
|
+
display(chalk.gray("Type 'exit' or hit Ctrl+C to exit chat\n"));
|
|
68
|
+
}
|
|
69
|
+
if (!shouldExit)
|
|
70
|
+
askQuestion();
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
error(`Error in chat command: ${err}`);
|
|
74
|
+
exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=chatCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatCommand.js","sourceRoot":"","sources":["../../src/commands/chatCommand.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -40,6 +40,9 @@ interface BaseSlothConfig {
|
|
|
40
40
|
ask?: {
|
|
41
41
|
filesystem?: string[] | 'all' | 'none';
|
|
42
42
|
};
|
|
43
|
+
chat?: {
|
|
44
|
+
filesystem?: string[] | 'all' | 'none';
|
|
45
|
+
};
|
|
43
46
|
};
|
|
44
47
|
requirementsProviderConfig?: Record<string, unknown>;
|
|
45
48
|
contentProviderConfig?: Record<string, unknown>;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { askCommand } from '#src/commands/askCommand.js';
|
|
|
3
3
|
import { initCommand } from '#src/commands/initCommand.js';
|
|
4
4
|
import { reviewCommand } from '#src/commands/reviewCommand.js';
|
|
5
5
|
import { prCommand } from '#src/commands/prCommand.js';
|
|
6
|
+
import { chatCommand } from '#src/commands/chatCommand.js';
|
|
6
7
|
import { getSlothVersion } from '#src/utils.js';
|
|
7
8
|
import { argv, readStdin } from '#src/systemUtils.js';
|
|
8
9
|
import { setVerbose } from '#src/llmUtils.js';
|
|
@@ -23,6 +24,6 @@ initCommand(program);
|
|
|
23
24
|
reviewCommand(program);
|
|
24
25
|
prCommand(program);
|
|
25
26
|
askCommand(program);
|
|
26
|
-
|
|
27
|
+
chatCommand(program);
|
|
27
28
|
await readStdin(program);
|
|
28
29
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,eAAe,EAAE,CAAC;KAC1B,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC,CAAC;AAE3D,mDAAmD;AACnD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IACtC,0BAA0B;IAC1B,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,sEAAsE;AACtE,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,0CAA0C,CAAC;KACvD,OAAO,CAAC,eAAe,EAAE,CAAC;KAC1B,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC,CAAC;AAE3D,mDAAmD;AACnD,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IACtC,0BAA0B;IAC1B,UAAU,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,sEAAsE;AACtE,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,SAAS,CAAC,OAAO,CAAC,CAAC;AACnB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,WAAW,CAAC,OAAO,CAAC,CAAC;AAErB,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC"}
|
package/dist/llmUtils.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Message } from '#src/modules/types.js';
|
|
2
2
|
import { SlothConfig } from '#src/config.js';
|
|
3
|
-
|
|
3
|
+
import { type RunnableConfig } from '@langchain/core/runnables';
|
|
4
|
+
import { BaseCheckpointSaver } from '@langchain/langgraph';
|
|
5
|
+
export declare function invoke(command: 'ask' | 'pr' | 'review' | 'chat' | undefined, messages: Message[], config: SlothConfig, runConfig?: RunnableConfig, checkpointSaver?: BaseCheckpointSaver | undefined): Promise<string>;
|
|
4
6
|
export declare function setVerbose(debug: boolean): void;
|
package/dist/llmUtils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isAIMessage } from '@langchain/core/messages';
|
|
2
2
|
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
|
|
3
3
|
import { display, displayError, displayInfo, displayWarning } from '#src/consoleUtils.js';
|
|
4
4
|
import { createReactAgent } from '@langchain/langgraph/prebuilt';
|
|
@@ -7,7 +7,7 @@ import { ProgressIndicator } from '#src/utils.js';
|
|
|
7
7
|
const llmGlobalSettings = {
|
|
8
8
|
verbose: false,
|
|
9
9
|
};
|
|
10
|
-
export async function invoke(
|
|
10
|
+
export async function invoke(command, messages, config, runConfig, checkpointSaver) {
|
|
11
11
|
try {
|
|
12
12
|
if (config.streamOutput && config.llm._llmType() === 'anthropic') {
|
|
13
13
|
displayWarning('To avoid known bug with Anthropic forcing streamOutput to false');
|
|
@@ -16,7 +16,7 @@ export async function invoke(llm, systemMessage, prompt, config, command) {
|
|
|
16
16
|
}
|
|
17
17
|
catch { }
|
|
18
18
|
if (llmGlobalSettings.verbose) {
|
|
19
|
-
llm.verbose = true;
|
|
19
|
+
config.llm.verbose = true;
|
|
20
20
|
}
|
|
21
21
|
// Merge command-specific filesystem config if provided
|
|
22
22
|
let effectiveConfig = config;
|
|
@@ -34,22 +34,22 @@ export async function invoke(llm, systemMessage, prompt, config, command) {
|
|
|
34
34
|
}
|
|
35
35
|
// Create the React agent
|
|
36
36
|
const agent = createReactAgent({
|
|
37
|
-
llm,
|
|
37
|
+
llm: config.llm,
|
|
38
38
|
tools,
|
|
39
|
+
checkpointSaver,
|
|
39
40
|
});
|
|
40
41
|
// Run the agent
|
|
41
42
|
try {
|
|
42
|
-
const messages = [new SystemMessage(systemMessage), new HumanMessage(prompt)];
|
|
43
43
|
display(`Connecting to LLM...`);
|
|
44
44
|
const output = { aiMessage: '' };
|
|
45
45
|
if (!config.streamOutput) {
|
|
46
46
|
const progress = new ProgressIndicator('Thinking.');
|
|
47
47
|
try {
|
|
48
|
-
const response = await agent.invoke({ messages });
|
|
48
|
+
const response = await agent.invoke({ messages }, runConfig);
|
|
49
49
|
output.aiMessage = response.messages[response.messages.length - 1].content;
|
|
50
50
|
const toolNames = response.messages
|
|
51
51
|
.filter((msg) => msg.tool_calls && msg.tool_calls.length > 0)
|
|
52
|
-
.flatMap((msg) => msg.tool_calls
|
|
52
|
+
.flatMap((msg) => msg.tool_calls?.map((tc) => tc.name)) ?? [];
|
|
53
53
|
if (toolNames.length > 0) {
|
|
54
54
|
displayInfo(`\nUsed tools: ${toolNames.join(', ')}`);
|
|
55
55
|
}
|
|
@@ -63,7 +63,7 @@ export async function invoke(llm, systemMessage, prompt, config, command) {
|
|
|
63
63
|
display(output.aiMessage);
|
|
64
64
|
}
|
|
65
65
|
else {
|
|
66
|
-
const stream = await agent.stream({ messages }, { streamMode: 'messages' });
|
|
66
|
+
const stream = await agent.stream({ messages }, { ...runConfig, streamMode: 'messages' });
|
|
67
67
|
for await (const [chunk, _metadata] of stream) {
|
|
68
68
|
if (isAIMessage(chunk)) {
|
|
69
69
|
stdout.write(chunk.content, 'utf-8');
|
package/dist/llmUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llmUtils.js","sourceRoot":"","sources":["../src/llmUtils.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"llmUtils.js","sourceRoot":"","sources":["../src/llmUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { getGslothFilePath } from '#src/filePathUtils.js';
|
|
|
3
3
|
import { generateStandardFileName, ProgressIndicator } from '#src/utils.js';
|
|
4
4
|
import { writeFileSync } from 'node:fs';
|
|
5
5
|
import { invoke } from '#src/llmUtils.js';
|
|
6
|
+
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
6
7
|
/**
|
|
7
8
|
* Ask a question and get an answer from the LLM
|
|
8
9
|
* @param source - The source of the question (used for file naming)
|
|
@@ -11,7 +12,8 @@ import { invoke } from '#src/llmUtils.js';
|
|
|
11
12
|
*/
|
|
12
13
|
export async function askQuestion(source, preamble, content, config) {
|
|
13
14
|
const progressIndicator = config.streamOutput ? undefined : new ProgressIndicator('Thinking.');
|
|
14
|
-
const
|
|
15
|
+
const messages = [new SystemMessage(preamble), new HumanMessage(content)];
|
|
16
|
+
const outputContent = await invoke('ask', messages, config);
|
|
15
17
|
progressIndicator?.stop();
|
|
16
18
|
const filename = generateStandardFileName(source);
|
|
17
19
|
const filePath = getGslothFilePath(filename);
|
|
@@ -20,7 +22,7 @@ export async function askQuestion(source, preamble, content, config) {
|
|
|
20
22
|
}
|
|
21
23
|
try {
|
|
22
24
|
writeFileSync(filePath, outputContent);
|
|
23
|
-
displaySuccess(
|
|
25
|
+
displaySuccess(`\nThis report can be found in ${filePath}`);
|
|
24
26
|
}
|
|
25
27
|
catch (error) {
|
|
26
28
|
displayError(`Failed to write answer to file: ${filePath}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questionAnsweringModule.js","sourceRoot":"","sources":["../../src/modules/questionAnsweringModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"questionAnsweringModule.js","sourceRoot":"","sources":["../../src/modules/questionAnsweringModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,QAAgB,EAChB,OAAe,EACf,MAAmB;IAEnB,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACvC,cAAc,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QAC5D,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,yDAAyD;QACzD,WAAW;IACb,CAAC;AACH,CAAC"}
|
|
@@ -3,9 +3,11 @@ import { generateStandardFileName, ProgressIndicator } from '#src/utils.js';
|
|
|
3
3
|
import { writeFileSync } from 'node:fs';
|
|
4
4
|
import { invoke } from '#src/llmUtils.js';
|
|
5
5
|
import { getGslothFilePath } from '#src/filePathUtils.js';
|
|
6
|
+
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
6
7
|
export async function review(source, preamble, diff, config, command = 'review') {
|
|
7
8
|
const progressIndicator = config.streamOutput ? undefined : new ProgressIndicator('Reviewing.');
|
|
8
|
-
const
|
|
9
|
+
const messages = [new SystemMessage(preamble), new HumanMessage(diff)];
|
|
10
|
+
const outputContent = await invoke(command, messages, config);
|
|
9
11
|
progressIndicator?.stop();
|
|
10
12
|
const filename = generateStandardFileName(source);
|
|
11
13
|
const filePath = getGslothFilePath(filename);
|
|
@@ -14,7 +16,7 @@ export async function review(source, preamble, diff, config, command = 'review')
|
|
|
14
16
|
}
|
|
15
17
|
try {
|
|
16
18
|
writeFileSync(filePath, outputContent);
|
|
17
|
-
displaySuccess(
|
|
19
|
+
displaySuccess(`\nThis report can be found in ${filePath}`);
|
|
18
20
|
}
|
|
19
21
|
catch (error) {
|
|
20
22
|
displayDebug(error instanceof Error ? error : String(error));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviewModule.js","sourceRoot":"","sources":["../../src/modules/reviewModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"reviewModule.js","sourceRoot":"","sources":["../../src/modules/reviewModule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAAc,EACd,QAAgB,EAChB,IAAY,EACZ,MAAmB,EACnB,UAA2B,QAAQ;IAEnC,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9D,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,CAAC;QACH,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACvC,cAAc,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,YAAY,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QAC5D,qDAAqD;QACrD,WAAW;IACb,CAAC;AACH,CAAC"}
|
package/dist/systemUtils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { createInterface, type Interface as ReadLineInterface } from 'node:readline';
|
|
2
3
|
export declare const getCurrentDir: () => string;
|
|
3
4
|
export declare const getInstallDir: () => string;
|
|
4
5
|
/**
|
|
@@ -14,6 +15,8 @@ export declare const stdout: NodeJS.WriteStream & {
|
|
|
14
15
|
};
|
|
15
16
|
export declare const argv: string[];
|
|
16
17
|
export declare const env: NodeJS.ProcessEnv;
|
|
18
|
+
export { createInterface };
|
|
19
|
+
export type { ReadLineInterface };
|
|
17
20
|
/**
|
|
18
21
|
* Provide the path to the entry point of the application.
|
|
19
22
|
* This is used to set the install directory.
|
package/dist/systemUtils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { dirname, resolve } from 'node:path';
|
|
2
2
|
import { fileURLToPath } from 'url';
|
|
3
3
|
import { ProgressIndicator } from '#src/utils.js';
|
|
4
|
+
import { createInterface } from 'node:readline';
|
|
4
5
|
const innerState = {
|
|
5
6
|
installDir: undefined,
|
|
6
7
|
stringFromStdin: '',
|
|
@@ -24,6 +25,7 @@ export const stdin = process.stdin;
|
|
|
24
25
|
export const stdout = process.stdout;
|
|
25
26
|
export const argv = process.argv;
|
|
26
27
|
export const env = process.env;
|
|
28
|
+
export { createInterface };
|
|
27
29
|
// noinspection JSUnusedGlobalSymbols
|
|
28
30
|
/**
|
|
29
31
|
* Provide the path to the entry point of the application.
|
package/dist/systemUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemUtils.js","sourceRoot":"","sources":["../src/systemUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"systemUtils.js","sourceRoot":"","sources":["../src/systemUtils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare function generateStandardFileName(command: string): string;
|
|
|
14
14
|
export declare function readFileFromCurrentDir(fileName: string): string;
|
|
15
15
|
export declare function readFileFromCurrentOrInstallDir(filePath: string, silentCurrent?: boolean): string;
|
|
16
16
|
export declare function writeFileIfNotExistsWithMessages(filePath: string, content: string): void;
|
|
17
|
+
export declare function appendToFile(filePath: string, content: string): void;
|
|
17
18
|
export declare function readFileSyncWithMessages(filePath: string, errorMessageIn?: string, noFileMessage?: string): string;
|
|
18
19
|
export declare function spawnCommand(command: string, args: string[], progressMessage: string, successMessage: string): Promise<string>;
|
|
19
20
|
export declare function getSlothVersion(): string;
|
package/dist/utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { display, displayError, displaySuccess, displayWarning } from '#src/consoleUtils.js';
|
|
2
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs';
|
|
3
3
|
import { resolve, dirname } from 'node:path';
|
|
4
4
|
import { spawn } from 'node:child_process';
|
|
5
5
|
import { getCurrentDir, getInstallDir, stdout } from '#src/systemUtils.js';
|
|
@@ -77,6 +77,18 @@ export function writeFileIfNotExistsWithMessages(filePath, content) {
|
|
|
77
77
|
displayWarning(`${filePath} already exists`);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
+
export function appendToFile(filePath, content) {
|
|
81
|
+
try {
|
|
82
|
+
const parentDir = dirname(filePath);
|
|
83
|
+
if (!existsSync(parentDir)) {
|
|
84
|
+
mkdirSync(parentDir, { recursive: true });
|
|
85
|
+
}
|
|
86
|
+
appendFileSync(filePath, content);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
displayError(`Failed to append to file ${filePath}: ${e.message}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
80
92
|
export function readFileSyncWithMessages(filePath, errorMessageIn, noFileMessage) {
|
|
81
93
|
const errorMessage = errorMessageIn ?? 'Error reading file at: ';
|
|
82
94
|
try {
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { initConfig } from '#src/config.js';
|
|
2
|
+
import { display } from '#src/consoleUtils.js';
|
|
3
|
+
import { invoke } from '#src/llmUtils.js';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { MemorySaver } from '@langchain/langgraph';
|
|
8
|
+
import { HumanMessage, SystemMessage, type BaseMessage } from '@langchain/core/messages';
|
|
9
|
+
import {
|
|
10
|
+
createInterface,
|
|
11
|
+
error,
|
|
12
|
+
exit,
|
|
13
|
+
stdin as input,
|
|
14
|
+
stdout as output,
|
|
15
|
+
} from '#src/systemUtils.js';
|
|
16
|
+
import { RunnableConfig } from '@langchain/core/runnables';
|
|
17
|
+
import { getGslothFilePath } from '#src/filePathUtils.js';
|
|
18
|
+
import { generateStandardFileName, appendToFile } from '#src/utils.js';
|
|
19
|
+
|
|
20
|
+
export function chatCommand(program: Command) {
|
|
21
|
+
program
|
|
22
|
+
.command('chat')
|
|
23
|
+
.description('Start an interactive chat session with Gaunt Sloth')
|
|
24
|
+
.argument('[message]', 'Initial message to start the chat')
|
|
25
|
+
.action(async (message: string) => {
|
|
26
|
+
try {
|
|
27
|
+
// Force streaming Off for chat, it does not play nicely with the input interface
|
|
28
|
+
const config = { ...(await initConfig()), streamOutput: false };
|
|
29
|
+
const checkpointSaver = new MemorySaver();
|
|
30
|
+
const rl = createInterface({ input, output });
|
|
31
|
+
let isFirstMessage = true;
|
|
32
|
+
let shouldExit = false;
|
|
33
|
+
const thread_id = uuidv4();
|
|
34
|
+
const chatLogFileName = getGslothFilePath(generateStandardFileName('CHAT'));
|
|
35
|
+
|
|
36
|
+
display(chalk.gray(`Chat session will be logged to ${chatLogFileName}\n`));
|
|
37
|
+
|
|
38
|
+
const processMessage = async (userInput: string) => {
|
|
39
|
+
const messages: BaseMessage[] = [];
|
|
40
|
+
if (isFirstMessage) {
|
|
41
|
+
messages.push(new SystemMessage('You are a helpful AI assistant.'));
|
|
42
|
+
}
|
|
43
|
+
messages.push(new HumanMessage(userInput));
|
|
44
|
+
|
|
45
|
+
const runConfig = {
|
|
46
|
+
configurable: { thread_id },
|
|
47
|
+
} as RunnableConfig;
|
|
48
|
+
|
|
49
|
+
const aiResponse = await invoke('chat', messages, config, runConfig, checkpointSaver);
|
|
50
|
+
|
|
51
|
+
const logEntry = `## User\n\n${userInput}\n\n## Assistant\n\n${aiResponse}\n\n`;
|
|
52
|
+
appendToFile(chatLogFileName, logEntry);
|
|
53
|
+
|
|
54
|
+
isFirstMessage = false;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const askQuestion = () => {
|
|
58
|
+
rl.question(chalk.magenta(' > '), async (userInput) => {
|
|
59
|
+
if (userInput.toLowerCase() === 'exit') {
|
|
60
|
+
rl.close();
|
|
61
|
+
shouldExit = true;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (isFirstMessage && !userInput.trim()) {
|
|
65
|
+
rl.close();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (!userInput.trim()) {
|
|
69
|
+
rl.close();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
await processMessage(userInput);
|
|
73
|
+
display(chalk.gray("Type 'exit' or hit Ctrl+C to exit chat\n"));
|
|
74
|
+
if (!shouldExit) askQuestion();
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
if (message) {
|
|
79
|
+
await processMessage(message);
|
|
80
|
+
} else {
|
|
81
|
+
display("\nHello! I'm Gaunt Sloth, your AI assistant. How can I help you today?");
|
|
82
|
+
display(chalk.gray("Type 'exit' or hit Ctrl+C to exit chat\n"));
|
|
83
|
+
}
|
|
84
|
+
if (!shouldExit) askQuestion();
|
|
85
|
+
} catch (err) {
|
|
86
|
+
error(`Error in chat command: ${err}`);
|
|
87
|
+
exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
package/src/config.ts
CHANGED
|
@@ -55,6 +55,9 @@ interface BaseSlothConfig {
|
|
|
55
55
|
ask?: {
|
|
56
56
|
filesystem?: string[] | 'all' | 'none';
|
|
57
57
|
};
|
|
58
|
+
chat?: {
|
|
59
|
+
filesystem?: string[] | 'all' | 'none';
|
|
60
|
+
};
|
|
58
61
|
};
|
|
59
62
|
requirementsProviderConfig?: Record<string, unknown>;
|
|
60
63
|
contentProviderConfig?: Record<string, unknown>;
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { askCommand } from '#src/commands/askCommand.js';
|
|
|
3
3
|
import { initCommand } from '#src/commands/initCommand.js';
|
|
4
4
|
import { reviewCommand } from '#src/commands/reviewCommand.js';
|
|
5
5
|
import { prCommand } from '#src/commands/prCommand.js';
|
|
6
|
+
import { chatCommand } from '#src/commands/chatCommand.js';
|
|
6
7
|
import { getSlothVersion } from '#src/utils.js';
|
|
7
8
|
import { argv, readStdin } from '#src/systemUtils.js';
|
|
8
9
|
import { setVerbose } from '#src/llmUtils.js';
|
|
@@ -27,6 +28,6 @@ initCommand(program);
|
|
|
27
28
|
reviewCommand(program);
|
|
28
29
|
prCommand(program);
|
|
29
30
|
askCommand(program);
|
|
30
|
-
|
|
31
|
+
chatCommand(program);
|
|
31
32
|
|
|
32
33
|
await readStdin(program);
|
package/src/llmUtils.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Message } from '#src/modules/types.js';
|
|
2
|
-
import {
|
|
3
|
-
import { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
|
+
import { AIMessage, isAIMessage } from '@langchain/core/messages';
|
|
4
3
|
import { SlothConfig } from '#src/config.js';
|
|
5
4
|
import type { Connection } from '@langchain/mcp-adapters';
|
|
6
5
|
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
|
|
@@ -9,17 +8,20 @@ import { createReactAgent } from '@langchain/langgraph/prebuilt';
|
|
|
9
8
|
import { getCurrentDir, stdout } from '#src/systemUtils.js';
|
|
10
9
|
import type { StructuredToolInterface } from '@langchain/core/tools';
|
|
11
10
|
import { ProgressIndicator } from '#src/utils.js';
|
|
11
|
+
import { type RunnableConfig } from '@langchain/core/runnables';
|
|
12
|
+
import { ToolCall } from '@langchain/core/messages/tool';
|
|
13
|
+
import { BaseCheckpointSaver } from '@langchain/langgraph';
|
|
12
14
|
|
|
13
15
|
const llmGlobalSettings = {
|
|
14
16
|
verbose: false,
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
export async function invoke(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
prompt: string,
|
|
20
|
+
command: 'ask' | 'pr' | 'review' | 'chat' | undefined,
|
|
21
|
+
messages: Message[],
|
|
21
22
|
config: SlothConfig,
|
|
22
|
-
|
|
23
|
+
runConfig?: RunnableConfig,
|
|
24
|
+
checkpointSaver?: BaseCheckpointSaver | undefined
|
|
23
25
|
): Promise<string> {
|
|
24
26
|
try {
|
|
25
27
|
if (config.streamOutput && config.llm._llmType() === 'anthropic') {
|
|
@@ -28,7 +30,7 @@ export async function invoke(
|
|
|
28
30
|
}
|
|
29
31
|
} catch {}
|
|
30
32
|
if (llmGlobalSettings.verbose) {
|
|
31
|
-
llm.verbose = true;
|
|
33
|
+
config.llm.verbose = true;
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
// Merge command-specific filesystem config if provided
|
|
@@ -51,23 +53,24 @@ export async function invoke(
|
|
|
51
53
|
|
|
52
54
|
// Create the React agent
|
|
53
55
|
const agent = createReactAgent({
|
|
54
|
-
llm,
|
|
56
|
+
llm: config.llm,
|
|
55
57
|
tools,
|
|
58
|
+
checkpointSaver,
|
|
56
59
|
});
|
|
57
60
|
|
|
58
61
|
// Run the agent
|
|
59
62
|
try {
|
|
60
|
-
const messages: Message[] = [new SystemMessage(systemMessage), new HumanMessage(prompt)];
|
|
61
63
|
display(`Connecting to LLM...`);
|
|
62
64
|
const output = { aiMessage: '' };
|
|
63
65
|
if (!config.streamOutput) {
|
|
64
66
|
const progress = new ProgressIndicator('Thinking.');
|
|
65
67
|
try {
|
|
66
|
-
const response = await agent.invoke({ messages });
|
|
68
|
+
const response = await agent.invoke({ messages }, runConfig);
|
|
67
69
|
output.aiMessage = response.messages[response.messages.length - 1].content as string;
|
|
68
|
-
const toolNames =
|
|
69
|
-
.
|
|
70
|
-
|
|
70
|
+
const toolNames =
|
|
71
|
+
response.messages
|
|
72
|
+
.filter((msg: AIMessage) => msg.tool_calls && msg.tool_calls.length > 0)
|
|
73
|
+
.flatMap((msg: AIMessage) => msg.tool_calls?.map((tc: ToolCall) => tc.name)) ?? [];
|
|
71
74
|
if (toolNames.length > 0) {
|
|
72
75
|
displayInfo(`\nUsed tools: ${toolNames.join(', ')}`);
|
|
73
76
|
}
|
|
@@ -78,7 +81,7 @@ export async function invoke(
|
|
|
78
81
|
}
|
|
79
82
|
display(output.aiMessage);
|
|
80
83
|
} else {
|
|
81
|
-
const stream = await agent.stream({ messages }, { streamMode: 'messages' });
|
|
84
|
+
const stream = await agent.stream({ messages }, { ...runConfig, streamMode: 'messages' });
|
|
82
85
|
|
|
83
86
|
for await (const [chunk, _metadata] of stream) {
|
|
84
87
|
if (isAIMessage(chunk)) {
|
|
@@ -4,6 +4,7 @@ import { getGslothFilePath } from '#src/filePathUtils.js';
|
|
|
4
4
|
import { generateStandardFileName, ProgressIndicator } from '#src/utils.js';
|
|
5
5
|
import { writeFileSync } from 'node:fs';
|
|
6
6
|
import { invoke } from '#src/llmUtils.js';
|
|
7
|
+
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Ask a question and get an answer from the LLM
|
|
@@ -18,7 +19,8 @@ export async function askQuestion(
|
|
|
18
19
|
config: SlothConfig
|
|
19
20
|
): Promise<void> {
|
|
20
21
|
const progressIndicator = config.streamOutput ? undefined : new ProgressIndicator('Thinking.');
|
|
21
|
-
const
|
|
22
|
+
const messages = [new SystemMessage(preamble), new HumanMessage(content)];
|
|
23
|
+
const outputContent = await invoke('ask', messages, config);
|
|
22
24
|
progressIndicator?.stop();
|
|
23
25
|
const filename = generateStandardFileName(source);
|
|
24
26
|
const filePath = getGslothFilePath(filename);
|
|
@@ -27,7 +29,7 @@ export async function askQuestion(
|
|
|
27
29
|
}
|
|
28
30
|
try {
|
|
29
31
|
writeFileSync(filePath, outputContent);
|
|
30
|
-
displaySuccess(
|
|
32
|
+
displaySuccess(`\nThis report can be found in ${filePath}`);
|
|
31
33
|
} catch (error) {
|
|
32
34
|
displayError(`Failed to write answer to file: ${filePath}`);
|
|
33
35
|
displayError(error instanceof Error ? error.message : String(error));
|
|
@@ -4,6 +4,7 @@ import { generateStandardFileName, ProgressIndicator } from '#src/utils.js';
|
|
|
4
4
|
import { writeFileSync } from 'node:fs';
|
|
5
5
|
import { invoke } from '#src/llmUtils.js';
|
|
6
6
|
import { getGslothFilePath } from '#src/filePathUtils.js';
|
|
7
|
+
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
7
8
|
|
|
8
9
|
export async function review(
|
|
9
10
|
source: string,
|
|
@@ -13,7 +14,8 @@ export async function review(
|
|
|
13
14
|
command: 'pr' | 'review' = 'review'
|
|
14
15
|
): Promise<void> {
|
|
15
16
|
const progressIndicator = config.streamOutput ? undefined : new ProgressIndicator('Reviewing.');
|
|
16
|
-
const
|
|
17
|
+
const messages = [new SystemMessage(preamble), new HumanMessage(diff)];
|
|
18
|
+
const outputContent = await invoke(command, messages, config);
|
|
17
19
|
progressIndicator?.stop();
|
|
18
20
|
const filename = generateStandardFileName(source);
|
|
19
21
|
const filePath = getGslothFilePath(filename);
|
|
@@ -22,7 +24,7 @@ export async function review(
|
|
|
22
24
|
}
|
|
23
25
|
try {
|
|
24
26
|
writeFileSync(filePath, outputContent);
|
|
25
|
-
displaySuccess(
|
|
27
|
+
displaySuccess(`\nThis report can be found in ${filePath}`);
|
|
26
28
|
} catch (error) {
|
|
27
29
|
displayDebug(error instanceof Error ? error : String(error));
|
|
28
30
|
displayError(`Failed to write review to file: ${filePath}`);
|
package/src/systemUtils.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { dirname, resolve } from 'node:path';
|
|
|
2
2
|
import { fileURLToPath } from 'url';
|
|
3
3
|
import { Command } from 'commander';
|
|
4
4
|
import { ProgressIndicator } from '#src/utils.js';
|
|
5
|
+
import { createInterface, type Interface as ReadLineInterface } from 'node:readline';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* This file contains all system functions and objects that are globally available
|
|
@@ -41,6 +42,8 @@ export const stdin = process.stdin;
|
|
|
41
42
|
export const stdout = process.stdout;
|
|
42
43
|
export const argv = process.argv;
|
|
43
44
|
export const env = process.env;
|
|
45
|
+
export { createInterface };
|
|
46
|
+
export type { ReadLineInterface };
|
|
44
47
|
|
|
45
48
|
// noinspection JSUnusedGlobalSymbols
|
|
46
49
|
/**
|
package/src/utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { display, displayError, displaySuccess, displayWarning } from '#src/consoleUtils.js';
|
|
2
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'node:fs';
|
|
3
3
|
import { SlothConfig } from '#src/config.js';
|
|
4
4
|
import { resolve, dirname } from 'node:path';
|
|
5
5
|
import { spawn } from 'node:child_process';
|
|
@@ -86,6 +86,18 @@ export function writeFileIfNotExistsWithMessages(filePath: string, content: stri
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
+
export function appendToFile(filePath: string, content: string): void {
|
|
90
|
+
try {
|
|
91
|
+
const parentDir = dirname(filePath);
|
|
92
|
+
if (!existsSync(parentDir)) {
|
|
93
|
+
mkdirSync(parentDir, { recursive: true });
|
|
94
|
+
}
|
|
95
|
+
appendFileSync(filePath, content);
|
|
96
|
+
} catch (e) {
|
|
97
|
+
displayError(`Failed to append to file ${filePath}: ${(e as Error).message}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
89
101
|
export function readFileSyncWithMessages(
|
|
90
102
|
filePath: string,
|
|
91
103
|
errorMessageIn?: string,
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(npm test:*)",
|
|
5
|
-
"Bash(npm run test:*)",
|
|
6
|
-
"Bash(grep:*)",
|
|
7
|
-
"Bash(npm run lint)",
|
|
8
|
-
"Bash(npm run lint:*)",
|
|
9
|
-
"Bash(npm run build:*)",
|
|
10
|
-
"Bash(npx vitest run:*)",
|
|
11
|
-
"Bash(node:*)"
|
|
12
|
-
],
|
|
13
|
-
"deny": []
|
|
14
|
-
}
|
|
15
|
-
}
|
package/CLAUDE.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Refer to .gsloth.guidelines.md for project guidelines.
|
package/ROADMAP.md
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Gaunt Sloth Assistant roadmap
|
|
2
|
-
|
|
3
|
-
## 1.0.0
|
|
4
|
-
Doing the following below and making it work stably should be sufficient to call it version 1.
|
|
5
|
-
|
|
6
|
-
### Checklist
|
|
7
|
-
|
|
8
|
-
- [x] Add tests and gain reasonable coverage
|
|
9
|
-
- [x] Configure eslint for code quality checks
|
|
10
|
-
- [ ] Automate release process
|
|
11
|
-
- [x] Add project init command
|
|
12
|
-
Add a command to init certain model in certain project, for example `gsloth init gemini`
|
|
13
|
-
or `gsloth init` and select one of the provided options.
|
|
14
|
-
-[x] VertexAI
|
|
15
|
-
-[x] Anthropic
|
|
16
|
-
-[x] Groq
|
|
17
|
-
-[ ] Local LLm
|
|
18
|
-
- [ ] Allow global configuration
|
|
19
|
-
- [ ] Streamline and stabilize configuration
|
|
20
|
-
- [x] Add JIRA legacy token integration plugin
|
|
21
|
-
- [ ] Teach assistant to identify important files and include their contents into prompt
|
|
22
|
-
The idea is to ask smaller model like flash to find important files from diff then pick them up and include into prompt.
|
|
23
|
-
- [ ] Teach assistant to access provided public web links
|
|
24
|
-
- [ ] Consider adding an option to always include certain source code files into prompt
|
|
25
|
-
- [ ] Add general chat command
|
|
26
|
-
|
|
27
|
-
## Extra stuff for later
|
|
28
|
-
|
|
29
|
-
### Modify local files within project (gsloth code)
|
|
30
|
-
Expected guardrails:
|
|
31
|
-
- Make sure it does not go outside project directory
|
|
32
|
-
- Make sure project has git (or later other vcs)
|
|
33
|
-
- Make sure that local changes are stashed if any present
|
|
34
|
-
|
|
35
|
-
### Index project into Vector DB
|
|
36
|
-
|