gaunt-sloth-assistant 0.6.0 → 0.6.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.
Files changed (160) hide show
  1. package/.gsloth.backstory.md +0 -0
  2. package/.gsloth.chat.md +0 -0
  3. package/.gsloth.code.md +0 -0
  4. package/.gsloth.guidelines.md +0 -0
  5. package/.gsloth.review.md +0 -0
  6. package/.gsloth.system.md +0 -0
  7. package/.prettierrc.json +0 -0
  8. package/LICENSE +0 -0
  9. package/README.md +0 -0
  10. package/assets/gaunt-sloth-logo.png +0 -0
  11. package/assets/release-notes/v0_4_0.md +0 -0
  12. package/assets/release-notes/v0_5_0.md +0 -0
  13. package/assets/release-notes/v0_5_1.md +0 -0
  14. package/assets/release-notes/v0_5_2.md +0 -0
  15. package/assets/release-notes/v0_5_3.md +0 -0
  16. package/assets/release-notes/v0_6_0.md +0 -0
  17. package/assets/release-notes/v0_6_2.md +4 -0
  18. package/dist/commands/askCommand.d.ts +0 -0
  19. package/dist/commands/askCommand.js +0 -0
  20. package/dist/commands/askCommand.js.map +0 -0
  21. package/dist/commands/chatCommand.d.ts +0 -0
  22. package/dist/commands/chatCommand.js +10 -79
  23. package/dist/commands/chatCommand.js.map +1 -1
  24. package/dist/commands/codeCommand.d.ts +0 -4
  25. package/dist/commands/codeCommand.js +10 -83
  26. package/dist/commands/codeCommand.js.map +1 -1
  27. package/dist/commands/commandUtils.d.ts +0 -0
  28. package/dist/commands/commandUtils.js +0 -0
  29. package/dist/commands/commandUtils.js.map +0 -0
  30. package/dist/commands/initCommand.d.ts +0 -0
  31. package/dist/commands/initCommand.js +0 -0
  32. package/dist/commands/initCommand.js.map +0 -0
  33. package/dist/commands/prCommand.d.ts +0 -0
  34. package/dist/commands/prCommand.js +0 -0
  35. package/dist/commands/prCommand.js.map +0 -0
  36. package/dist/commands/reviewCommand.d.ts +0 -0
  37. package/dist/commands/reviewCommand.js +0 -0
  38. package/dist/commands/reviewCommand.js.map +0 -0
  39. package/dist/config.d.ts +0 -0
  40. package/dist/config.js +0 -0
  41. package/dist/config.js.map +0 -0
  42. package/dist/configs/anthropic.d.ts +0 -0
  43. package/dist/configs/anthropic.js +0 -0
  44. package/dist/configs/anthropic.js.map +0 -0
  45. package/dist/configs/fake.d.ts +0 -0
  46. package/dist/configs/fake.js +0 -0
  47. package/dist/configs/fake.js.map +0 -0
  48. package/dist/configs/groq.d.ts +0 -0
  49. package/dist/configs/groq.js +0 -0
  50. package/dist/configs/groq.js.map +0 -0
  51. package/dist/configs/vertexai.d.ts +0 -0
  52. package/dist/configs/vertexai.js +0 -0
  53. package/dist/configs/vertexai.js.map +0 -0
  54. package/dist/consoleUtils.d.ts +2 -0
  55. package/dist/consoleUtils.js +26 -0
  56. package/dist/consoleUtils.js.map +1 -1
  57. package/dist/constants.d.ts +0 -0
  58. package/dist/constants.js +0 -0
  59. package/dist/constants.js.map +0 -0
  60. package/dist/core/Invocation.d.ts +22 -0
  61. package/dist/core/Invocation.js +155 -0
  62. package/dist/core/Invocation.js.map +1 -0
  63. package/dist/core/types.d.ts +1 -0
  64. package/dist/core/types.js +2 -0
  65. package/dist/core/types.js.map +1 -0
  66. package/dist/filePathUtils.d.ts +0 -0
  67. package/dist/filePathUtils.js +0 -0
  68. package/dist/filePathUtils.js.map +0 -0
  69. package/dist/index.d.ts +0 -0
  70. package/dist/index.js.map +0 -0
  71. package/dist/llmUtils.d.ts +0 -0
  72. package/dist/llmUtils.js +28 -124
  73. package/dist/llmUtils.js.map +1 -1
  74. package/dist/modules/interactiveSessionModule.d.ts +8 -0
  75. package/dist/modules/interactiveSessionModule.js +82 -0
  76. package/dist/modules/interactiveSessionModule.js.map +1 -0
  77. package/dist/modules/questionAnsweringModule.d.ts +0 -0
  78. package/dist/modules/questionAnsweringModule.js +0 -0
  79. package/dist/modules/questionAnsweringModule.js.map +0 -0
  80. package/dist/modules/reviewModule.d.ts +0 -0
  81. package/dist/modules/reviewModule.js +0 -0
  82. package/dist/modules/reviewModule.js.map +0 -0
  83. package/dist/modules/types.d.ts +0 -0
  84. package/dist/modules/types.js +0 -0
  85. package/dist/modules/types.js.map +0 -0
  86. package/dist/prompt.d.ts +0 -0
  87. package/dist/prompt.js +0 -0
  88. package/dist/prompt.js.map +0 -0
  89. package/dist/providers/file.d.ts +0 -0
  90. package/dist/providers/file.js +0 -0
  91. package/dist/providers/file.js.map +0 -0
  92. package/dist/providers/ghIssueProvider.d.ts +0 -0
  93. package/dist/providers/ghIssueProvider.js +0 -0
  94. package/dist/providers/ghIssueProvider.js.map +0 -0
  95. package/dist/providers/ghPrDiffProvider.d.ts +0 -0
  96. package/dist/providers/ghPrDiffProvider.js +0 -0
  97. package/dist/providers/ghPrDiffProvider.js.map +0 -0
  98. package/dist/providers/jiraIssueLegacyProvider.d.ts +0 -0
  99. package/dist/providers/jiraIssueLegacyProvider.js +0 -0
  100. package/dist/providers/jiraIssueLegacyProvider.js.map +0 -0
  101. package/dist/providers/jiraIssueProvider.d.ts +0 -0
  102. package/dist/providers/jiraIssueProvider.js +0 -0
  103. package/dist/providers/jiraIssueProvider.js.map +0 -0
  104. package/dist/providers/text.d.ts +0 -0
  105. package/dist/providers/text.js +0 -0
  106. package/dist/providers/text.js.map +0 -0
  107. package/dist/providers/types.d.ts +0 -0
  108. package/dist/providers/types.js +0 -0
  109. package/dist/providers/types.js.map +0 -0
  110. package/dist/systemUtils.d.ts +0 -0
  111. package/dist/systemUtils.js +0 -0
  112. package/dist/systemUtils.js.map +0 -0
  113. package/dist/utils.d.ts +0 -0
  114. package/dist/utils.js +0 -0
  115. package/dist/utils.js.map +0 -0
  116. package/docs/COMMANDS.md +0 -0
  117. package/docs/CONFIGURATION.md +0 -0
  118. package/docs/DEVELOPMENT.md +0 -0
  119. package/docs/RELEASE-HOWTO.md +0 -0
  120. package/eslint.config.js +0 -0
  121. package/maintenance/doc-maintenance.md +0 -0
  122. package/package.json +2 -2
  123. package/req/70-refactor-to-facilitate-imports.md +46 -0
  124. package/req/70a-extract-invocation.md +26 -0
  125. package/src/commands/askCommand.ts +0 -0
  126. package/src/commands/chatCommand.ts +11 -90
  127. package/src/commands/codeCommand.ts +12 -94
  128. package/src/commands/commandUtils.ts +0 -0
  129. package/src/commands/initCommand.ts +0 -0
  130. package/src/commands/prCommand.ts +0 -0
  131. package/src/commands/reviewCommand.ts +0 -0
  132. package/src/config.ts +0 -0
  133. package/src/configs/anthropic.ts +0 -0
  134. package/src/configs/fake.ts +0 -0
  135. package/src/configs/groq.ts +0 -0
  136. package/src/configs/vertexai.ts +0 -0
  137. package/src/consoleUtils.ts +32 -0
  138. package/src/constants.ts +0 -0
  139. package/src/core/Invocation.ts +198 -0
  140. package/src/core/types.ts +1 -0
  141. package/src/filePathUtils.ts +0 -0
  142. package/src/index.ts +0 -0
  143. package/src/llmUtils.ts +29 -142
  144. package/src/modules/interactiveSessionModule.ts +104 -0
  145. package/src/modules/questionAnsweringModule.ts +0 -0
  146. package/src/modules/reviewModule.ts +0 -0
  147. package/src/modules/types.ts +0 -0
  148. package/src/prompt.ts +0 -0
  149. package/src/providers/file.ts +0 -0
  150. package/src/providers/ghIssueProvider.ts +0 -0
  151. package/src/providers/ghPrDiffProvider.ts +0 -0
  152. package/src/providers/jiraIssueLegacyProvider.ts +0 -0
  153. package/src/providers/jiraIssueProvider.ts +0 -0
  154. package/src/providers/text.ts +0 -0
  155. package/src/providers/types.ts +0 -0
  156. package/src/systemUtils.ts +0 -0
  157. package/src/utils.ts +0 -0
  158. package/tsconfig.json +0 -0
  159. package/vitest-it.config.ts +2 -4
  160. package/vitest.config.ts +0 -0
File without changes
package/.gsloth.chat.md CHANGED
File without changes
package/.gsloth.code.md CHANGED
File without changes
File without changes
package/.gsloth.review.md CHANGED
File without changes
package/.gsloth.system.md CHANGED
File without changes
package/.prettierrc.json CHANGED
File without changes
package/LICENSE CHANGED
File without changes
package/README.md CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,4 @@
1
+ # v0.6.2
2
+
3
+ - Improvements for chat and code commands, making sure the MCP client is not disconnected after each question.
4
+ - Extracted LLM invocation into `core/Invocation.ts` which can now be imported by dependants.
File without changes
File without changes
File without changes
File without changes
@@ -1,88 +1,19 @@
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
- import { readBackstory, readGuidelines, readSystemPrompt, readChatPrompt } from '#src/prompt.js';
1
+ import { createInteractiveSession } from '#src/modules/interactiveSessionModule.js';
2
+ import { readChatPrompt } from '#src/prompt.js';
12
3
  export function chatCommand(program) {
13
4
  program
14
5
  .command('chat')
15
6
  .description('Start an interactive chat session with Gaunt Sloth')
16
7
  .argument('[message]', 'Initial message to start the chat')
17
8
  .action(async (message) => {
18
- try {
19
- // Force streaming Off for chat, it does not play nicely with the input interface
20
- const config = { ...(await initConfig()), streamOutput: false };
21
- const checkpointSaver = new MemorySaver();
22
- const rl = createInterface({ input, output });
23
- let isFirstMessage = true;
24
- let shouldExit = false;
25
- const thread_id = uuidv4();
26
- const chatLogFileName = getGslothFilePath(generateStandardFileName('CHAT'));
27
- display(chalk.gray(`Chat session will be logged to ${chatLogFileName}\n`));
28
- const processMessage = async (userInput) => {
29
- const messages = [];
30
- if (isFirstMessage) {
31
- const systemPromptParts = [readBackstory(), readGuidelines(config.projectGuidelines)];
32
- const chatPrompt = readChatPrompt();
33
- if (chatPrompt) {
34
- systemPromptParts.push(chatPrompt);
35
- }
36
- const systemPrompt = readSystemPrompt();
37
- if (systemPrompt) {
38
- systemPromptParts.push(systemPrompt);
39
- }
40
- messages.push(new SystemMessage(systemPromptParts.join('\n')));
41
- }
42
- messages.push(new HumanMessage(userInput));
43
- const runConfig = {
44
- configurable: { thread_id },
45
- };
46
- const aiResponse = await invoke('chat', messages, config, runConfig, checkpointSaver);
47
- const logEntry = `## User\n\n${userInput}\n\n## Assistant\n\n${aiResponse}\n\n`;
48
- appendToFile(chatLogFileName, logEntry);
49
- isFirstMessage = false;
50
- };
51
- const askQuestion = () => {
52
- rl.question(chalk.magenta(' > '), async (userInput) => {
53
- if (userInput.toLowerCase() === 'exit') {
54
- rl.close();
55
- shouldExit = true;
56
- return;
57
- }
58
- if (isFirstMessage && !userInput.trim()) {
59
- rl.close();
60
- return;
61
- }
62
- if (!userInput.trim()) {
63
- rl.close();
64
- return;
65
- }
66
- await processMessage(userInput);
67
- display(chalk.gray("Type 'exit' or hit Ctrl+C to exit chat\n"));
68
- if (!shouldExit)
69
- askQuestion();
70
- });
71
- };
72
- if (message) {
73
- await processMessage(message);
74
- }
75
- else {
76
- display('\nGaunt Sloth is ready to chat. Type your prompt.');
77
- display(chalk.gray("Type 'exit' or hit Ctrl+C to exit chat\n"));
78
- }
79
- if (!shouldExit)
80
- askQuestion();
81
- }
82
- catch (err) {
83
- error(`Error in chat command: ${err}`);
84
- exit(1);
85
- }
9
+ const sessionConfig = {
10
+ mode: 'chat',
11
+ readModePrompt: readChatPrompt,
12
+ description: 'Start an interactive chat session with Gaunt Sloth',
13
+ readyMessage: '\nGaunt Sloth is ready to chat. Type your prompt.',
14
+ exitMessage: "Type 'exit' or hit Ctrl+C to exit chat\n",
15
+ };
16
+ await createInteractiveSession(sessionConfig, message);
86
17
  });
87
18
  }
88
19
  //# sourceMappingURL=chatCommand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatCommand.js","sourceRoot":"","sources":["../../src/commands/chatCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatCommand.js","sourceRoot":"","sources":["../../src/commands/chatCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAiB,MAAM,0CAA0C,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oDAAoD,CAAC;SACjE,QAAQ,CAAC,WAAW,EAAE,mCAAmC,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,aAAa,GAAkB;YACnC,IAAI,EAAE,MAAM;YACZ,cAAc,EAAE,cAAc;YAC9B,WAAW,EAAE,oDAAoD;YACjE,YAAY,EAAE,mDAAmD;YACjE,WAAW,EAAE,0CAA0C;SACxD,CAAC;QAEF,MAAM,wBAAwB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,6 +1,2 @@
1
1
  import { Command } from 'commander';
2
- /**
3
- * Adds the code command to the program
4
- * @param program - The commander program
5
- */
6
2
  export declare function codeCommand(program: Command): void;
@@ -1,92 +1,19 @@
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
- import { readBackstory, readGuidelines, readSystemPrompt, readCodePrompt } from '#src/prompt.js';
12
- /**
13
- * Adds the code command to the program
14
- * @param program - The commander program
15
- */
1
+ import { createInteractiveSession } from '../modules/interactiveSessionModule.js';
2
+ import { readCodePrompt } from '#src/prompt.js';
16
3
  export function codeCommand(program) {
17
4
  program
18
5
  .command('code')
19
6
  .description('Interactively write code with sloth (has full file system access within your project)')
20
7
  .argument('[message]', 'Initial message to start the code session')
21
8
  .action(async (message) => {
22
- try {
23
- // Force streaming Off for code, it does not play nicely with the input interface
24
- const config = { ...(await initConfig()), streamOutput: false };
25
- const checkpointSaver = new MemorySaver();
26
- const rl = createInterface({ input, output });
27
- let isFirstMessage = true;
28
- let shouldExit = false;
29
- const thread_id = uuidv4();
30
- const codeLogFileName = getGslothFilePath(generateStandardFileName('CODE'));
31
- display(chalk.gray(`Code session will be logged to ${codeLogFileName}\n`));
32
- const processMessage = async (userInput) => {
33
- const messages = [];
34
- if (isFirstMessage) {
35
- const systemPromptParts = [readBackstory(), readGuidelines(config.projectGuidelines)];
36
- const codePrompt = readCodePrompt();
37
- if (codePrompt) {
38
- systemPromptParts.push(codePrompt);
39
- }
40
- const systemPrompt = readSystemPrompt();
41
- if (systemPrompt) {
42
- systemPromptParts.push(systemPrompt);
43
- }
44
- messages.push(new SystemMessage(systemPromptParts.join('\n')));
45
- }
46
- messages.push(new HumanMessage(userInput));
47
- const runConfig = {
48
- configurable: { thread_id },
49
- };
50
- const aiResponse = await invoke('code', messages, config, runConfig, checkpointSaver);
51
- const logEntry = `## User\n\n${userInput}\n\n## Assistant\n\n${aiResponse}\n\n`;
52
- appendToFile(codeLogFileName, logEntry);
53
- isFirstMessage = false;
54
- };
55
- const askQuestion = () => {
56
- rl.question(chalk.magenta(' > '), async (userInput) => {
57
- if (userInput.toLowerCase() === 'exit') {
58
- rl.close();
59
- shouldExit = true;
60
- return;
61
- }
62
- if (isFirstMessage && !userInput.trim()) {
63
- rl.close();
64
- return;
65
- }
66
- if (!userInput.trim()) {
67
- rl.close();
68
- return;
69
- }
70
- await processMessage(userInput);
71
- display(chalk.gray("Type 'exit' or hit Ctrl+C to exit code session\n"));
72
- if (!shouldExit)
73
- askQuestion();
74
- });
75
- };
76
- if (message) {
77
- await processMessage(message);
78
- }
79
- else {
80
- display('\nGaunt Sloth is ready to code. Type your prompt.');
81
- display(chalk.gray("Type 'exit' or hit Ctrl+C to exit code session\n"));
82
- }
83
- if (!shouldExit)
84
- askQuestion();
85
- }
86
- catch (err) {
87
- error(`Error in code command: ${err}`);
88
- exit(1);
89
- }
9
+ const sessionConfig = {
10
+ mode: 'code',
11
+ readModePrompt: readCodePrompt,
12
+ description: 'Interactively write code with sloth (has full file system access within your project)',
13
+ readyMessage: '\nGaunt Sloth is ready to code. Type your prompt.',
14
+ exitMessage: "Type 'exit' or hit Ctrl+C to exit code session\n",
15
+ };
16
+ await createInteractiveSession(sessionConfig, message);
90
17
  });
91
18
  }
92
19
  //# sourceMappingURL=codeCommand.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeCommand.js","sourceRoot":"","sources":["../../src/commands/codeCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeCommand.js","sourceRoot":"","sources":["../../src/commands/codeCommand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAiB,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,uFAAuF,CACxF;SACA,QAAQ,CAAC,WAAW,EAAE,2CAA2C,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,aAAa,GAAkB;YACnC,IAAI,EAAE,MAAM;YACZ,cAAc,EAAE,cAAc;YAC9B,WAAW,EACT,uFAAuF;YACzF,YAAY,EAAE,mDAAmD;YACjE,WAAW,EAAE,kDAAkD;SAChE,CAAC;QAEF,MAAM,wBAAwB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/dist/config.d.ts CHANGED
File without changes
package/dist/config.js CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,6 +1,8 @@
1
+ import { StatusUpdateCallback } from '#src/core/Invocation.js';
1
2
  export declare function displayError(message: string): void;
2
3
  export declare function displayWarning(message: string): void;
3
4
  export declare function displaySuccess(message: string): void;
4
5
  export declare function displayInfo(message: string): void;
5
6
  export declare function display(message: string): void;
6
7
  export declare function displayDebug(message: string | Error | undefined): void;
8
+ export declare const defaultStatusCallbacks: StatusUpdateCallback;
@@ -25,4 +25,30 @@ export function displayDebug(message) {
25
25
  systemDebug(message);
26
26
  }
27
27
  }
28
+ // Create status update callback
29
+ export const defaultStatusCallbacks = (level, message) => {
30
+ switch (level) {
31
+ case 'info':
32
+ displayInfo(message);
33
+ break;
34
+ case 'warning':
35
+ displayWarning(message);
36
+ break;
37
+ case 'error':
38
+ displayError(message);
39
+ break;
40
+ case 'success':
41
+ displaySuccess(message);
42
+ break;
43
+ case 'debug':
44
+ displayDebug(message);
45
+ break;
46
+ case 'display':
47
+ display(message);
48
+ break;
49
+ case 'stream':
50
+ process.stdout.write(message);
51
+ break;
52
+ }
53
+ };
28
54
  //# sourceMappingURL=consoleUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"consoleUtils.js","sourceRoot":"","sources":["../src/consoleUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAEtF,kGAAkG;AAElG,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,GAAG,CAAC,OAAO,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAmC;IAC9D,oCAAoC;IACpC,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;QAC7B,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"consoleUtils.js","sourceRoot":"","sources":["../src/consoleUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAItF,kGAAkG;AAElG,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,GAAG,CAAC,OAAO,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAmC;IAC9D,oCAAoC;IACpC,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;QAC7B,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,sBAAsB,GAAyB,CAC1D,KAAkB,EAClB,OAAe,EACf,EAAE;IACF,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,SAAS;YACZ,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,OAAO;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,SAAS;YACZ,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,MAAM;QACR,KAAK,OAAO;YACV,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,SAAS;YACZ,OAAO,CAAC,OAAO,CAAC,CAAC;YACjB,MAAM;QACR,KAAK,QAAQ;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC9B,MAAM;IACV,CAAC;AACH,CAAC,CAAC"}
File without changes
package/dist/constants.js CHANGED
File without changes
File without changes
@@ -0,0 +1,22 @@
1
+ import type { Message } from '#src/modules/types.js';
2
+ import { SlothConfig } from '#src/config.js';
3
+ import { MultiServerMCPClient } from '@langchain/mcp-adapters';
4
+ import { BaseCheckpointSaver } from '@langchain/langgraph';
5
+ import type { StructuredToolInterface } from '@langchain/core/tools';
6
+ import { type RunnableConfig } from '@langchain/core/runnables';
7
+ import { StatusLevel } from '#src/core/types.js';
8
+ export type StatusUpdateCallback = (level: StatusLevel, message: string) => void;
9
+ export declare class Invocation {
10
+ private statusUpdate;
11
+ private verbose;
12
+ private mcpClient;
13
+ private agent;
14
+ private config;
15
+ constructor(statusUpdate: StatusUpdateCallback);
16
+ setVerbose(verbose: boolean): void;
17
+ init(command: 'ask' | 'pr' | 'review' | 'chat' | 'code' | undefined, config: SlothConfig, checkpointSaver?: BaseCheckpointSaver | undefined): Promise<void>;
18
+ invoke(messages: Message[], runConfig?: RunnableConfig): Promise<string>;
19
+ cleanup(): Promise<void>;
20
+ protected filterTools(tools: StructuredToolInterface[], filesystemConfig: string[] | 'all' | 'none'): StructuredToolInterface<import("@langchain/core/tools").ToolSchemaBase, any, any>[];
21
+ protected getMcpClient(config: SlothConfig): MultiServerMCPClient | null;
22
+ }
@@ -0,0 +1,155 @@
1
+ import { isAIMessage } from '@langchain/core/messages';
2
+ import { MultiServerMCPClient } from '@langchain/mcp-adapters';
3
+ import { createReactAgent } from '@langchain/langgraph/prebuilt';
4
+ import { getCurrentDir } from '#src/systemUtils.js';
5
+ import { ProgressIndicator } from '#src/utils.js';
6
+ export class Invocation {
7
+ statusUpdate;
8
+ verbose = false;
9
+ mcpClient = null;
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ agent = null;
12
+ config = null;
13
+ constructor(statusUpdate) {
14
+ this.statusUpdate = statusUpdate;
15
+ }
16
+ setVerbose(verbose) {
17
+ this.verbose = verbose;
18
+ }
19
+ async init(command, config, checkpointSaver) {
20
+ try {
21
+ if (config.streamOutput && config.llm._llmType() === 'anthropic') {
22
+ this.statusUpdate('warning', 'To avoid known bug with Anthropic forcing streamOutput to false');
23
+ config.streamOutput = false;
24
+ }
25
+ }
26
+ catch { }
27
+ if (this.verbose) {
28
+ config.llm.verbose = true;
29
+ }
30
+ // Merge command-specific filesystem config if provided
31
+ let effectiveConfig = config;
32
+ if (command && config.commands?.[command]?.filesystem !== undefined) {
33
+ effectiveConfig = {
34
+ ...config,
35
+ filesystem: config.commands[command].filesystem,
36
+ };
37
+ }
38
+ this.config = effectiveConfig;
39
+ this.mcpClient = this.getMcpClient(effectiveConfig);
40
+ const allTools = (await this.mcpClient?.getTools()) ?? [];
41
+ const tools = this.filterTools(allTools, effectiveConfig.filesystem || 'none');
42
+ if (allTools.length > 0) {
43
+ this.statusUpdate('info', `Loaded ${tools.length} tools.`);
44
+ }
45
+ // Create the React agent
46
+ this.agent = createReactAgent({
47
+ llm: config.llm,
48
+ tools,
49
+ checkpointSaver,
50
+ });
51
+ }
52
+ async invoke(messages, runConfig) {
53
+ if (!this.agent || !this.config) {
54
+ throw new Error('Invocation not initialized. Call init() first.');
55
+ }
56
+ // Run the agent
57
+ try {
58
+ this.statusUpdate('stream', `Thinking`);
59
+ const output = { aiMessage: '' };
60
+ if (!this.config.streamOutput) {
61
+ const progress = new ProgressIndicator('.');
62
+ try {
63
+ const response = await this.agent.invoke({ messages }, runConfig);
64
+ output.aiMessage = response.messages[response.messages.length - 1].content;
65
+ const toolNames = response.messages
66
+ .filter((msg) => msg.tool_calls && msg.tool_calls.length > 0)
67
+ .flatMap((msg) => msg.tool_calls?.map((tc) => tc.name)) ?? [];
68
+ if (toolNames.length > 0) {
69
+ this.statusUpdate('info', `\nUsed tools: ${toolNames.join(', ')}`);
70
+ }
71
+ }
72
+ catch (e) {
73
+ this.statusUpdate('warning', `Something went wrong ${e.message}`);
74
+ }
75
+ finally {
76
+ progress.stop();
77
+ }
78
+ this.statusUpdate('display', output.aiMessage);
79
+ }
80
+ else {
81
+ const stream = await this.agent.stream({ messages }, { ...runConfig, streamMode: 'messages' });
82
+ for await (const [chunk, _metadata] of stream) {
83
+ if (isAIMessage(chunk)) {
84
+ this.statusUpdate('stream', chunk.content);
85
+ output.aiMessage += chunk.content;
86
+ let toolCalls = chunk.tool_calls;
87
+ if (toolCalls && toolCalls.length > 0) {
88
+ const suffix = toolCalls.length > 1 ? 's' : '';
89
+ const toolCallsString = toolCalls.map((t) => t?.name).join(', ');
90
+ this.statusUpdate('info', `Using tool${suffix} ${toolCallsString}`);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ return output.aiMessage;
96
+ }
97
+ catch (error) {
98
+ if (error instanceof Error) {
99
+ if (error?.name === 'ToolException') {
100
+ this.statusUpdate('error', `Tool execution failed: ${error.message}`);
101
+ }
102
+ }
103
+ throw error;
104
+ }
105
+ }
106
+ async cleanup() {
107
+ if (this.mcpClient) {
108
+ await this.mcpClient.close();
109
+ this.mcpClient = null;
110
+ }
111
+ this.agent = null;
112
+ this.config = null;
113
+ }
114
+ filterTools(tools, filesystemConfig) {
115
+ if (filesystemConfig === 'all' || !Array.isArray(filesystemConfig)) {
116
+ return tools;
117
+ }
118
+ // Create set of allowed tool names with mcp__filesystem__ prefix
119
+ const allowedToolNames = new Set(filesystemConfig.map((shortName) => `mcp__filesystem__${shortName}`));
120
+ return tools.filter((tool) => {
121
+ // Allow non-filesystem tools and only allowed filesystem tools
122
+ return !tool.name.startsWith('mcp__filesystem__') || allowedToolNames.has(tool.name);
123
+ });
124
+ }
125
+ getMcpClient(config) {
126
+ const defaultServers = {};
127
+ // Add filesystem server if configured
128
+ if (config.filesystem && config.filesystem !== 'none') {
129
+ const filesystemConfig = {
130
+ transport: 'stdio',
131
+ command: 'npx',
132
+ args: ['-y', '@modelcontextprotocol/server-filesystem', getCurrentDir()],
133
+ };
134
+ defaultServers.filesystem = filesystemConfig;
135
+ }
136
+ // Merge with user's mcpServers
137
+ const mcpServers = { ...defaultServers, ...(config.mcpServers || {}) };
138
+ // If user provided their own filesystem config, it overrides default
139
+ if (config.mcpServers?.filesystem) {
140
+ mcpServers.filesystem = config.mcpServers.filesystem;
141
+ }
142
+ if (Object.keys(mcpServers).length > 0) {
143
+ return new MultiServerMCPClient({
144
+ throwOnLoadError: true,
145
+ prefixToolNameWithServerName: true,
146
+ additionalToolNamePrefix: 'mcp',
147
+ mcpServers,
148
+ });
149
+ }
150
+ else {
151
+ return null;
152
+ }
153
+ }
154
+ }
155
+ //# sourceMappingURL=Invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Invocation.js","sourceRoot":"","sources":["../../src/core/Invocation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export type StatusLevel = 'info' | 'warning' | 'error' | 'success' | 'debug' | 'display' | 'stream';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
File without changes
File without changes
File without changes