@gaunt-sloth/core 2.0.0-alpha.0 → 2.0.0-alpha.10
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/.gsloth.code.md +10 -0
- package/LICENSE +7 -0
- package/README.md +3 -4
- package/dist/config/defaults.d.ts +85 -0
- package/dist/config/defaults.js +101 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/jsonc.d.ts +12 -0
- package/dist/config/jsonc.js +41 -0
- package/dist/config/jsonc.js.map +1 -0
- package/dist/config/loader.d.ts +109 -0
- package/dist/config/loader.js +663 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +509 -0
- package/dist/config/schema.js +349 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/shell-policy.d.ts +212 -0
- package/dist/config/shell-policy.js +142 -0
- package/dist/config/shell-policy.js.map +1 -0
- package/dist/config/types.d.ts +490 -0
- package/dist/config/types.js +12 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config.d.ts +18 -647
- package/dist/config.js +15 -516
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +24 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/GthAbstractAgent.d.ts +57 -1
- package/dist/core/GthAbstractAgent.js +171 -4
- package/dist/core/GthAbstractAgent.js.map +1 -1
- package/dist/core/GthAgentRunner.d.ts +168 -1
- package/dist/core/GthAgentRunner.js +380 -4
- package/dist/core/GthAgentRunner.js.map +1 -1
- package/dist/core/GthLangChainAgent.js +94 -5
- package/dist/core/GthLangChainAgent.js.map +1 -1
- package/dist/core/debugCapture.d.ts +59 -0
- package/dist/core/debugCapture.js +101 -0
- package/dist/core/debugCapture.js.map +1 -0
- package/dist/core/gthLeanAgentFactory.d.ts +9 -0
- package/dist/core/gthLeanAgentFactory.js +10 -0
- package/dist/core/gthLeanAgentFactory.js.map +1 -0
- package/dist/core/runStats.d.ts +41 -0
- package/dist/core/runStats.js +73 -0
- package/dist/core/runStats.js.map +1 -0
- package/dist/core/shell/ShellCommandFailedError.d.ts +54 -0
- package/dist/core/shell/ShellCommandFailedError.js +68 -0
- package/dist/core/shell/ShellCommandFailedError.js.map +1 -0
- package/dist/core/shell/allowlist.d.ts +75 -0
- package/dist/core/shell/allowlist.js +187 -0
- package/dist/core/shell/allowlist.js.map +1 -0
- package/dist/core/shell/arity.d.ts +75 -0
- package/dist/core/shell/arity.js +313 -0
- package/dist/core/shell/arity.js.map +1 -0
- package/dist/core/shell/judge.d.ts +161 -0
- package/dist/core/shell/judge.js +261 -0
- package/dist/core/shell/judge.js.map +1 -0
- package/dist/core/shell/normalize.d.ts +27 -0
- package/dist/core/shell/normalize.js +53 -0
- package/dist/core/shell/normalize.js.map +1 -0
- package/dist/core/types.d.ts +104 -0
- package/dist/core/types.js.map +1 -1
- package/dist/history/historyFormat.d.ts +19 -0
- package/dist/history/historyFormat.js +85 -0
- package/dist/history/historyFormat.js.map +1 -0
- package/dist/history/historyStore.d.ts +121 -0
- package/dist/history/historyStore.js +315 -0
- package/dist/history/historyStore.js.map +1 -0
- package/dist/history/recordSession.d.ts +28 -0
- package/dist/history/recordSession.js +29 -0
- package/dist/history/recordSession.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.js +5 -10
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/deepseek.d.ts +1 -1
- package/dist/providers/deepseek.js +5 -10
- package/dist/providers/deepseek.js.map +1 -1
- package/dist/providers/google-genai.d.ts +1 -1
- package/dist/providers/google-genai.js +5 -10
- package/dist/providers/google-genai.js.map +1 -1
- package/dist/providers/groq.d.ts +1 -1
- package/dist/providers/groq.js +5 -10
- package/dist/providers/groq.js.map +1 -1
- package/dist/providers/modelDiscovery.d.ts +54 -1
- package/dist/providers/modelDiscovery.js +106 -8
- package/dist/providers/modelDiscovery.js.map +1 -1
- package/dist/providers/ollama.d.ts +1 -1
- package/dist/providers/ollama.js +5 -15
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +5 -10
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +7 -12
- package/dist/providers/openrouter.js.map +1 -1
- package/dist/providers/vertexai.d.ts +1 -1
- package/dist/providers/vertexai.js +5 -10
- package/dist/providers/vertexai.js.map +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.js +5 -10
- package/dist/providers/xai.js.map +1 -1
- package/dist/runtime/singleShot.d.ts +5 -2
- package/dist/runtime/singleShot.js +36 -3
- package/dist/runtime/singleShot.js.map +1 -1
- package/dist/utils/fileUtils.d.ts +24 -2
- package/dist/utils/fileUtils.js +54 -12
- package/dist/utils/fileUtils.js.map +1 -1
- package/dist/utils/systemUtils.d.ts +31 -0
- package/dist/utils/systemUtils.js +38 -0
- package/dist/utils/systemUtils.js.map +1 -1
- package/package.json +16 -11
- package/schema/gsloth-config.schema.json +1579 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { displayWarning } from '#src/utils/consoleUtils.js';
|
|
2
2
|
import { env } from '#src/utils/systemUtils.js';
|
|
3
|
-
import {
|
|
3
|
+
import { writeConfigFileWithMessages } from '#src/utils/fileUtils.js';
|
|
4
|
+
import { buildInitConfigContent, getCuratedFallbackModel } from '#src/providers/modelDiscovery.js';
|
|
4
5
|
// Function to process JSON config and create OpenRouter LLM instance
|
|
5
6
|
// noinspection JSUnusedGlobalSymbols
|
|
6
7
|
export async function processJsonConfig(llmConfig) {
|
|
@@ -13,13 +14,13 @@ export async function processJsonConfig(llmConfig) {
|
|
|
13
14
|
const configFields = {
|
|
14
15
|
...llmConfig,
|
|
15
16
|
apiKey: openRouterApiKey,
|
|
16
|
-
model: llmConfig.model || '
|
|
17
|
+
model: llmConfig.model || getCuratedFallbackModel('openrouter'),
|
|
17
18
|
configuration: {
|
|
18
19
|
baseURL: 'https://openrouter.ai/api/v1',
|
|
19
20
|
...(llmConfig.configuration || {}),
|
|
20
21
|
defaultHeaders: {
|
|
21
|
-
'HTTP-Referer': 'https://
|
|
22
|
-
'X-Title': 'Gaunt Sloth
|
|
22
|
+
'HTTP-Referer': 'https://gauntsloth.app/',
|
|
23
|
+
'X-Title': 'Gaunt Sloth',
|
|
23
24
|
},
|
|
24
25
|
},
|
|
25
26
|
};
|
|
@@ -39,18 +40,12 @@ function getApiKey(llmConfig) {
|
|
|
39
40
|
return llmConfig.apiKey || env.OPEN_ROUTER_API_KEY || env.OPENROUTER_API_KEY;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
"llm": {
|
|
44
|
-
"type": "openrouter",
|
|
45
|
-
"model": "qwen/qwen3-coder"
|
|
46
|
-
}
|
|
47
|
-
}`;
|
|
48
|
-
export function init(configFileName) {
|
|
43
|
+
export function init(configFileName, force = false, model) {
|
|
49
44
|
// Determine which content to use based on file extension
|
|
50
45
|
if (!configFileName.endsWith('.json')) {
|
|
51
46
|
throw new Error('Only JSON config is supported.');
|
|
52
47
|
}
|
|
53
|
-
|
|
48
|
+
writeConfigFileWithMessages(configFileName, buildInitConfigContent('openrouter', model), force);
|
|
54
49
|
displayWarning(`You need to edit your ${configFileName} to configure model, ` +
|
|
55
50
|
'or define OPEN_ROUTER_API_KEY environment variable.');
|
|
56
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAQhD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAQhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEnG,qEAAqE;AACrE,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmE;IAEnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACzD,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG;QACnB,GAAG,SAAS;QACZ,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,uBAAuB,CAAC,YAAY,CAAC;QAC/D,aAAa,EAAE;YACb,OAAO,EAAE,8BAA8B;YACvC,GAAG,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE,CAAC;YAClC,cAAc,EAAE;gBACd,cAAc,EAAE,yBAAyB;gBACzC,SAAS,EAAE,aAAa;aACzB;SACF;KACF,CAAC;IACF,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,IAAI,CAAC;IAClC,8DAA8D;IAC9D,OAAQ,YAAoB,CAAC,yBAAyB,CAAC;IACvD,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,SAAS,CAAC,SAAmE;IACpF,8DAA8D;IAC9D,MAAM,IAAI,GAAG,SAA0C,CAAC;IACxD,IAAI,IAAI,CAAC,yBAAyB,IAAI,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,EAAE,CAAC;QAC1E,OAAO,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,OAAO,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,kBAAkB,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK,EAAE,KAAc;IACxE,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B,CAAC,cAAc,EAAE,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAChG,cAAc,CACZ,yBAAyB,cAAc,uBAAuB;QAC5D,qDAAqD,CACxD,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
2
2
|
import type { ChatGoogleParams } from '@langchain/google/node';
|
|
3
|
-
export declare function init(configFileName: string): void;
|
|
3
|
+
export declare function init(configFileName: string, force?: boolean, model?: string): void;
|
|
4
4
|
export declare function processJsonConfig(llmConfig: ChatGoogleParams & {
|
|
5
5
|
type?: string;
|
|
6
6
|
apiKeyEnvironmentVariable?: string;
|
|
@@ -11,19 +11,14 @@
|
|
|
11
11
|
* Hopefully this issue will go away when LangChain switches to the new GenAI dependency.
|
|
12
12
|
*/
|
|
13
13
|
import { displayWarning } from '#src/utils/consoleUtils.js';
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"type": "vertexai",
|
|
18
|
-
"model": "gemini-3.5-flash"
|
|
19
|
-
}
|
|
20
|
-
}`;
|
|
21
|
-
export function init(configFileName) {
|
|
14
|
+
import { writeConfigFileWithMessages } from '#src/utils/fileUtils.js';
|
|
15
|
+
import { buildInitConfigContent, getCuratedFallbackModel } from '#src/providers/modelDiscovery.js';
|
|
16
|
+
export function init(configFileName, force = false, model) {
|
|
22
17
|
// Determine which content to use based on file extension
|
|
23
18
|
if (!configFileName.endsWith('.json')) {
|
|
24
19
|
throw new Error('Only JSON config is supported.');
|
|
25
20
|
}
|
|
26
|
-
|
|
21
|
+
writeConfigFileWithMessages(configFileName, buildInitConfigContent('vertexai', model), force);
|
|
27
22
|
displayWarning('For Google VertexAI you likely to need to do `gcloud auth login` and `gcloud auth application-default login`.');
|
|
28
23
|
}
|
|
29
24
|
// Function to process JSON config and create VertexAI LLM instance
|
|
@@ -31,7 +26,7 @@ export async function processJsonConfig(llmConfig) {
|
|
|
31
26
|
const { ChatGoogle } = await import('@langchain/google/node');
|
|
32
27
|
const configFields = {
|
|
33
28
|
...llmConfig,
|
|
34
|
-
model: llmConfig.model || '
|
|
29
|
+
model: llmConfig.model || getCuratedFallbackModel('vertexai'),
|
|
35
30
|
vertexai: true,
|
|
36
31
|
};
|
|
37
32
|
delete configFields.type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertexai.js","sourceRoot":"","sources":["../../src/providers/vertexai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"vertexai.js","sourceRoot":"","sources":["../../src/providers/vertexai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAI5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEnG,MAAM,UAAU,IAAI,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK,EAAE,KAAc;IACxE,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B,CAAC,cAAc,EAAE,sBAAsB,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9F,cAAc,CACZ,+GAA+G,CAChH,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmF;IAEnF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG;QACnB,GAAG,SAAS;QACZ,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,uBAAuB,CAAC,UAAU,CAAC;QAC7D,QAAQ,EAAE,IAAI;KACf,CAAC;IACF,OAAO,YAAY,CAAC,IAAI,CAAC;IACzB,OAAO,YAAY,CAAC,yBAAyB,CAAC;IAC9C,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/providers/xai.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { BaseChatModel, BaseChatModelParams } from '@langchain/core/language_models/chat_models';
|
|
2
2
|
import type { ChatXAIInput } from '@langchain/xai';
|
|
3
3
|
export declare function processJsonConfig(llmConfig: ChatXAIInput & BaseChatModelParams): Promise<BaseChatModel>;
|
|
4
|
-
export declare function init(configFileName: string): void;
|
|
4
|
+
export declare function init(configFileName: string, force?: boolean, model?: string): void;
|
package/dist/providers/xai.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { displayWarning } from '#src/utils/consoleUtils.js';
|
|
2
2
|
import { env } from '#src/utils/systemUtils.js';
|
|
3
|
-
import {
|
|
3
|
+
import { writeConfigFileWithMessages } from '#src/utils/fileUtils.js';
|
|
4
|
+
import { buildInitConfigContent, getCuratedFallbackModel } from '#src/providers/modelDiscovery.js';
|
|
4
5
|
// Function to process JSON config and create XAI LLM instance
|
|
5
6
|
export async function processJsonConfig(llmConfig) {
|
|
6
7
|
const { ChatXAI } = await import('@langchain/xai');
|
|
@@ -9,21 +10,15 @@ export async function processJsonConfig(llmConfig) {
|
|
|
9
10
|
return new ChatXAI({
|
|
10
11
|
...llmConfig,
|
|
11
12
|
apiKey,
|
|
12
|
-
model: llmConfig.model || '
|
|
13
|
+
model: llmConfig.model || getCuratedFallbackModel('xai'),
|
|
13
14
|
});
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
-
"llm": {
|
|
17
|
-
"type": "xai",
|
|
18
|
-
"model": "grok-4.3"
|
|
19
|
-
}
|
|
20
|
-
}`;
|
|
21
|
-
export function init(configFileName) {
|
|
16
|
+
export function init(configFileName, force = false, model) {
|
|
22
17
|
// Determine which content to use based on file extension
|
|
23
18
|
if (!configFileName.endsWith('.json')) {
|
|
24
19
|
throw new Error('Only JSON config is supported.');
|
|
25
20
|
}
|
|
26
|
-
|
|
21
|
+
writeConfigFileWithMessages(configFileName, buildInitConfigContent('xai', model), force);
|
|
27
22
|
displayWarning(`You need to update your ${configFileName} to add your xAI API key, ` +
|
|
28
23
|
'or define XAI_API_KEY environment variable.');
|
|
29
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../src/providers/xai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAOhD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../src/providers/xai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAOhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAEnG,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAA6C;IAE7C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnD,wEAAwE;IACxE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC;IACnD,OAAO,IAAI,OAAO,CAAC;QACjB,GAAG,SAAS;QACZ,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,uBAAuB,CAAC,KAAK,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,cAAsB,EAAE,KAAK,GAAG,KAAK,EAAE,KAAc;IACxE,yDAAyD;IACzD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B,CAAC,cAAc,EAAE,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACzF,cAAc,CACZ,2BAA2B,cAAc,4BAA4B;QACnE,6CAA6C,CAChD,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { GthConfig } from '#src/config.js';
|
|
2
|
-
import type { AgentResolvers, GthCommand } from '#src/core/types.js';
|
|
2
|
+
import type { AgentResolvers, GthAgentFactory, GthCommand } from '#src/core/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Ask a question and get an answer from the LLM.
|
|
5
5
|
*
|
|
@@ -13,7 +13,10 @@ import type { AgentResolvers, GthCommand } from '#src/core/types.js';
|
|
|
13
13
|
* @param config - The resolved config
|
|
14
14
|
* @param resolvers - Optional agent resolvers (tools/middleware)
|
|
15
15
|
* @param command - The originating command (defaults to `ask`); selects the agent mode prompt
|
|
16
|
+
* @param agentFactory - Optional backend factory (B5). When omitted the runner uses its built-in
|
|
17
|
+
* lean {@link GthLangChainAgent} default (unchanged behavior for existing callers). The app
|
|
18
|
+
* layer passes `resolveAgentFactory(config, 'lean')` so an explicit `agent.backend` is honored.
|
|
16
19
|
* @returns `true` when the run completed without error, `false` when it failed (so callers
|
|
17
20
|
* such as `exec` can set a non-zero exit code).
|
|
18
21
|
*/
|
|
19
|
-
export declare function runSingleShot(source: string, preamble: string, content: string, config: GthConfig, resolvers?: AgentResolvers, command?: GthCommand): Promise<boolean>;
|
|
22
|
+
export declare function runSingleShot(source: string, preamble: string, content: string, config: GthConfig, resolvers?: AgentResolvers, command?: GthCommand, agentFactory?: GthAgentFactory): Promise<boolean>;
|
|
@@ -4,6 +4,8 @@ import { GthAgentRunner } from '#src/core/GthAgentRunner.js';
|
|
|
4
4
|
import { MemorySaver } from '@langchain/langgraph';
|
|
5
5
|
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
6
6
|
import { ProgressIndicator } from '#src/utils/ProgressIndicator.js';
|
|
7
|
+
import { recordSessionSafe } from '#src/history/recordSession.js';
|
|
8
|
+
import { getProjectDir } from '#src/utils/systemUtils.js';
|
|
7
9
|
/**
|
|
8
10
|
* Ask a question and get an answer from the LLM.
|
|
9
11
|
*
|
|
@@ -17,10 +19,13 @@ import { ProgressIndicator } from '#src/utils/ProgressIndicator.js';
|
|
|
17
19
|
* @param config - The resolved config
|
|
18
20
|
* @param resolvers - Optional agent resolvers (tools/middleware)
|
|
19
21
|
* @param command - The originating command (defaults to `ask`); selects the agent mode prompt
|
|
22
|
+
* @param agentFactory - Optional backend factory (B5). When omitted the runner uses its built-in
|
|
23
|
+
* lean {@link GthLangChainAgent} default (unchanged behavior for existing callers). The app
|
|
24
|
+
* layer passes `resolveAgentFactory(config, 'lean')` so an explicit `agent.backend` is honored.
|
|
20
25
|
* @returns `true` when the run completed without error, `false` when it failed (so callers
|
|
21
26
|
* such as `exec` can set a non-zero exit code).
|
|
22
27
|
*/
|
|
23
|
-
export async function runSingleShot(source, preamble, content, config, resolvers, command = 'ask') {
|
|
28
|
+
export async function runSingleShot(source, preamble, content, config, resolvers, command = 'ask', agentFactory) {
|
|
24
29
|
const progressIndicator = config.streamOutput ? undefined : new ProgressIndicator('Thinking.');
|
|
25
30
|
const messages = [new SystemMessage(preamble), new HumanMessage(content)];
|
|
26
31
|
// Resolve output path and initialize session logging if enabled
|
|
@@ -29,11 +34,13 @@ export async function runSingleShot(source, preamble, content, config, resolvers
|
|
|
29
34
|
initSessionLogging(filePath, config.streamSessionInferenceLog);
|
|
30
35
|
}
|
|
31
36
|
// Run via Agent Runner (consistent with interactive session)
|
|
32
|
-
const runner = new GthAgentRunner(defaultStatusCallback, resolvers);
|
|
37
|
+
const runner = new GthAgentRunner(defaultStatusCallback, resolvers, agentFactory);
|
|
33
38
|
let succeeded = true;
|
|
39
|
+
let responseText = '';
|
|
40
|
+
const startedAt = Date.now();
|
|
34
41
|
try {
|
|
35
42
|
await runner.init(command, config, new MemorySaver());
|
|
36
|
-
await runner.processMessages(messages);
|
|
43
|
+
responseText = await runner.processMessages(messages);
|
|
37
44
|
}
|
|
38
45
|
catch (err) {
|
|
39
46
|
succeeded = false;
|
|
@@ -42,6 +49,32 @@ export async function runSingleShot(source, preamble, content, config, resolvers
|
|
|
42
49
|
finally {
|
|
43
50
|
await runner.cleanup();
|
|
44
51
|
}
|
|
52
|
+
// GS2-16: live token usage + invoked tool names for this run (fail-soft; empty when the
|
|
53
|
+
// provider reported no usage / the runner has no stats). Read post-cleanup — the runner
|
|
54
|
+
// snapshots stats at cleanup() so this still reflects the finished run.
|
|
55
|
+
let runStats = { tools: [] };
|
|
56
|
+
try {
|
|
57
|
+
const s = runner.getRunStats?.();
|
|
58
|
+
if (s)
|
|
59
|
+
runStats = s;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* fail-soft: analytics must never affect this run */
|
|
63
|
+
}
|
|
64
|
+
// GS2-7 (B20): opt-in, fail-soft session history. A no-op unless `history.enabled`; never throws
|
|
65
|
+
// (recordSessionSafe is fully guarded) so a DB problem can't abort or alter this run.
|
|
66
|
+
// GS2-16 threads token/tool analytics; costUsd is intentionally left unset (no reliable price).
|
|
67
|
+
recordSessionSafe(config, {
|
|
68
|
+
command,
|
|
69
|
+
project: getProjectDir(),
|
|
70
|
+
model: config.modelDisplayName,
|
|
71
|
+
prompt: content,
|
|
72
|
+
response: responseText,
|
|
73
|
+
tokensInput: runStats.tokensInput,
|
|
74
|
+
tokensOutput: runStats.tokensOutput,
|
|
75
|
+
tools: runStats.tools.length > 0 ? runStats.tools : undefined,
|
|
76
|
+
durationMs: Date.now() - startedAt,
|
|
77
|
+
});
|
|
45
78
|
progressIndicator?.stop();
|
|
46
79
|
if (config.writeOutputToFile === false) {
|
|
47
80
|
display('\n'); // something going on in some terminals, they swallow last line of output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleShot.js","sourceRoot":"","sources":["../../src/runtime/singleShot.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,OAAO,EACP,YAAY,EACZ,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"singleShot.js","sourceRoot":"","sources":["../../src/runtime/singleShot.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,11 +60,33 @@ export declare function readMultipleFilesFromProjectDir(fileNames: string | stri
|
|
|
60
60
|
* package dir.
|
|
61
61
|
*/
|
|
62
62
|
export declare function readFileFromInstallDir(filePath: string, packageDir?: string): string;
|
|
63
|
-
|
|
63
|
+
/**
|
|
64
|
+
* No-clobber write: writes `content` only when `filePath` does not already exist.
|
|
65
|
+
* @returns `true` when the file was written, `false` when it was skipped because it
|
|
66
|
+
* already existed. Callers use the return value to avoid claiming success on a skip.
|
|
67
|
+
*/
|
|
68
|
+
export declare function writeFileIfNotExistsWithMessages(filePath: string, content: string): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Unconditional write: writes (or overwrites) `content` at `filePath`, creating parent
|
|
71
|
+
* directories as needed. Use this only for the config-overwrite path (an explicit user /
|
|
72
|
+
* `--force` decision); the no-clobber {@link writeFileIfNotExistsWithMessages} still guards
|
|
73
|
+
* user-editable preamble files (guidelines / review).
|
|
74
|
+
*/
|
|
75
|
+
export declare function writeFileWithMessages(filePath: string, content: string): void;
|
|
76
|
+
/**
|
|
77
|
+
* Config-file write that honours an overwrite flag.
|
|
78
|
+
* - `force === true` → always (over)writes.
|
|
79
|
+
* - `force === false` → no-clobber (skips + warns when the file already exists).
|
|
80
|
+
* @returns `true` when a write happened, `false` when it was skipped.
|
|
81
|
+
*/
|
|
82
|
+
export declare function writeConfigFileWithMessages(filePath: string, content: string, force?: boolean): boolean;
|
|
64
83
|
export declare function appendToFile(filePath: string, content: string): void;
|
|
65
84
|
export declare function readFileSyncWithMessages(filePath: string, errorMessageIn?: string, noFileMessage?: string): string;
|
|
66
85
|
/**
|
|
67
|
-
* Dynamically imports a module from a file path from the outside of the installation dir
|
|
86
|
+
* Dynamically imports a module from a file path from the outside of the installation dir.
|
|
87
|
+
* `.ts` modules are loaded through jiti (Node's native dynamic `import()` cannot load
|
|
88
|
+
* TypeScript), so `.gsloth.config.ts` honours the same async `configure()` contract as
|
|
89
|
+
* `.js`/`.mjs`. All other extensions use native dynamic import.
|
|
68
90
|
* @returns A promise that resolves to the imported module
|
|
69
91
|
*/
|
|
70
92
|
export declare function importExternalFile(filePath: string): Promise<Record<string, any>>;
|
package/dist/utils/fileUtils.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, resolve } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import {
|
|
4
|
+
import { getProjectDir } from '#src/utils/systemUtils.js';
|
|
5
5
|
import { GSLOTH_DIR, GSLOTH_SETTINGS_DIR } from '#src/constants.js';
|
|
6
6
|
import { displayError, displayInfo, displaySuccess, displayWarning, } from '#src/utils/consoleUtils.js';
|
|
7
7
|
import { wrapContent } from '#src/utils/llmUtils.js';
|
|
8
8
|
import url from 'node:url';
|
|
9
|
+
import { createJiti } from 'jiti';
|
|
9
10
|
/**
|
|
10
11
|
* Checks if .gsloth directory exists in the project root
|
|
11
12
|
* @returns Boolean indicating whether .gsloth directory exists
|
|
12
13
|
*/
|
|
13
14
|
export function gslothDirExists() {
|
|
14
|
-
const currentDir =
|
|
15
|
+
const currentDir = getProjectDir();
|
|
15
16
|
const gslothDirPath = resolve(currentDir, GSLOTH_DIR);
|
|
16
17
|
return existsSync(gslothDirPath);
|
|
17
18
|
}
|
|
@@ -21,7 +22,7 @@ export function gslothDirExists() {
|
|
|
21
22
|
* @returns The resolved path where the file should be written
|
|
22
23
|
*/
|
|
23
24
|
export function getGslothFilePath(filename) {
|
|
24
|
-
const currentDir =
|
|
25
|
+
const currentDir = getProjectDir();
|
|
25
26
|
if (gslothDirExists()) {
|
|
26
27
|
const gslothDirPath = resolve(currentDir, GSLOTH_DIR);
|
|
27
28
|
return resolve(gslothDirPath, filename);
|
|
@@ -40,7 +41,7 @@ export function getGslothFilePath(filename) {
|
|
|
40
41
|
* @returns The resolved path where the configuration file should be written
|
|
41
42
|
*/
|
|
42
43
|
export function getGslothConfigWritePath(filename) {
|
|
43
|
-
const currentDir =
|
|
44
|
+
const currentDir = getProjectDir();
|
|
44
45
|
if (gslothDirExists()) {
|
|
45
46
|
const gslothDirPath = resolve(currentDir, GSLOTH_DIR);
|
|
46
47
|
const gslothSettingsPath = resolve(gslothDirPath, GSLOTH_SETTINGS_DIR);
|
|
@@ -59,10 +60,10 @@ export function getGslothConfigWritePath(filename) {
|
|
|
59
60
|
* @returns The resolved path where the configuration file should be found
|
|
60
61
|
*/
|
|
61
62
|
export function getGslothConfigReadPath(filename, identityProfileRaw) {
|
|
62
|
-
const
|
|
63
|
+
const baseDir = getProjectDir();
|
|
63
64
|
const identityProfile = identityProfileRaw?.trim();
|
|
64
65
|
if (gslothDirExists()) {
|
|
65
|
-
const gslothDirPath = resolve(
|
|
66
|
+
const gslothDirPath = resolve(baseDir, GSLOTH_DIR);
|
|
66
67
|
const gslothSettingsPath = resolve(gslothDirPath, GSLOTH_SETTINGS_DIR);
|
|
67
68
|
const configPath = identityProfile
|
|
68
69
|
? resolve(gslothSettingsPath, identityProfile, filename)
|
|
@@ -71,7 +72,7 @@ export function getGslothConfigReadPath(filename, identityProfileRaw) {
|
|
|
71
72
|
return configPath;
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
return resolve(
|
|
75
|
+
return resolve(baseDir, filename);
|
|
75
76
|
}
|
|
76
77
|
/**
|
|
77
78
|
* Resolve an explicit output path string to an absolute file path.
|
|
@@ -80,7 +81,7 @@ export function getGslothConfigReadPath(filename, identityProfileRaw) {
|
|
|
80
81
|
* - If it's a bare filename, place it under .gsloth/ when present, otherwise project root.
|
|
81
82
|
*/
|
|
82
83
|
export function resolveOutputPath(writeOutputToFile) {
|
|
83
|
-
const currentDir =
|
|
84
|
+
const currentDir = getProjectDir();
|
|
84
85
|
const provided = String(writeOutputToFile).trim();
|
|
85
86
|
// Detect if provided path contains path separators (cross-platform)
|
|
86
87
|
const hasSeparator = provided.includes('/') || provided.includes('\\');
|
|
@@ -125,7 +126,7 @@ export function generateStandardFileName(command) {
|
|
|
125
126
|
return `gth_${dateTimeStr}_${commandStr}.md`;
|
|
126
127
|
}
|
|
127
128
|
export function readFileFromProjectDir(fileName) {
|
|
128
|
-
const currentDir =
|
|
129
|
+
const currentDir = getProjectDir();
|
|
129
130
|
const filePath = resolve(currentDir, fileName);
|
|
130
131
|
displayInfo(`Reading file ${filePath}...`);
|
|
131
132
|
return readFileSyncWithMessages(filePath);
|
|
@@ -162,6 +163,11 @@ export function readFileFromInstallDir(filePath, packageDir = corePackageDir) {
|
|
|
162
163
|
throw readFromInstallDirError;
|
|
163
164
|
}
|
|
164
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* No-clobber write: writes `content` only when `filePath` does not already exist.
|
|
168
|
+
* @returns `true` when the file was written, `false` when it was skipped because it
|
|
169
|
+
* already existed. Callers use the return value to avoid claiming success on a skip.
|
|
170
|
+
*/
|
|
165
171
|
export function writeFileIfNotExistsWithMessages(filePath, content) {
|
|
166
172
|
displayInfo(`checking ${filePath} existence`);
|
|
167
173
|
if (!existsSync(filePath)) {
|
|
@@ -172,10 +178,38 @@ export function writeFileIfNotExistsWithMessages(filePath, content) {
|
|
|
172
178
|
}
|
|
173
179
|
writeFileSync(filePath, content);
|
|
174
180
|
displaySuccess(`Created ${filePath}`);
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
displayWarning(`${filePath} already exists`);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Unconditional write: writes (or overwrites) `content` at `filePath`, creating parent
|
|
188
|
+
* directories as needed. Use this only for the config-overwrite path (an explicit user /
|
|
189
|
+
* `--force` decision); the no-clobber {@link writeFileIfNotExistsWithMessages} still guards
|
|
190
|
+
* user-editable preamble files (guidelines / review).
|
|
191
|
+
*/
|
|
192
|
+
export function writeFileWithMessages(filePath, content) {
|
|
193
|
+
const parentDir = dirname(filePath);
|
|
194
|
+
if (!existsSync(parentDir)) {
|
|
195
|
+
mkdirSync(parentDir, { recursive: true });
|
|
175
196
|
}
|
|
176
|
-
|
|
177
|
-
|
|
197
|
+
const existed = existsSync(filePath);
|
|
198
|
+
writeFileSync(filePath, content);
|
|
199
|
+
displaySuccess(existed ? `Overwrote ${filePath}` : `Created ${filePath}`);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Config-file write that honours an overwrite flag.
|
|
203
|
+
* - `force === true` → always (over)writes.
|
|
204
|
+
* - `force === false` → no-clobber (skips + warns when the file already exists).
|
|
205
|
+
* @returns `true` when a write happened, `false` when it was skipped.
|
|
206
|
+
*/
|
|
207
|
+
export function writeConfigFileWithMessages(filePath, content, force = false) {
|
|
208
|
+
if (force) {
|
|
209
|
+
writeFileWithMessages(filePath, content);
|
|
210
|
+
return true;
|
|
178
211
|
}
|
|
212
|
+
return writeFileIfNotExistsWithMessages(filePath, content);
|
|
179
213
|
}
|
|
180
214
|
export function appendToFile(filePath, content) {
|
|
181
215
|
try {
|
|
@@ -206,11 +240,19 @@ export function readFileSyncWithMessages(filePath, errorMessageIn, noFileMessage
|
|
|
206
240
|
}
|
|
207
241
|
}
|
|
208
242
|
/**
|
|
209
|
-
* Dynamically imports a module from a file path from the outside of the installation dir
|
|
243
|
+
* Dynamically imports a module from a file path from the outside of the installation dir.
|
|
244
|
+
* `.ts` modules are loaded through jiti (Node's native dynamic `import()` cannot load
|
|
245
|
+
* TypeScript), so `.gsloth.config.ts` honours the same async `configure()` contract as
|
|
246
|
+
* `.js`/`.mjs`. All other extensions use native dynamic import.
|
|
210
247
|
* @returns A promise that resolves to the imported module
|
|
211
248
|
*/
|
|
212
249
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
213
250
|
export function importExternalFile(filePath) {
|
|
251
|
+
if (filePath.endsWith('.ts')) {
|
|
252
|
+
const jiti = createJiti(import.meta.url);
|
|
253
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
254
|
+
return jiti.import(filePath);
|
|
255
|
+
}
|
|
214
256
|
const configFileUrl = url.pathToFileURL(filePath).toString();
|
|
215
257
|
return import(configFileUrl);
|
|
216
258
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../src/utils/fileUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../src/utils/fileUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,21 @@ export interface ProgramLike {
|
|
|
10
10
|
export declare const waitForEscape: (callback: () => void, enabled: boolean) => void;
|
|
11
11
|
export declare const stopWaitingForEscape: () => void;
|
|
12
12
|
export declare const setRawMode: (rawMode: boolean) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Ref stdin so it keeps the event loop alive, WITHOUT changing raw mode.
|
|
15
|
+
*
|
|
16
|
+
* EXT-18: the ref/unref of stdin used to be coupled to raw mode (only setRawMode(true)
|
|
17
|
+
* re-ref'd, see above), but some interactive prompts run in COOKED mode after a stream
|
|
18
|
+
* end. When an agent run suspends on a tool-approval interrupt, the stream's finally
|
|
19
|
+
* calls stopWaitingForEscape(), which unref's stdin. The readline approval prompt then
|
|
20
|
+
* does setRawMode(false) (cooked, so typed input echoes) and awaits rl.question(...) -
|
|
21
|
+
* but with stdin unref'd and nothing else holding the loop open the process exits to the
|
|
22
|
+
* shell before the user can answer. Refing stdin (decoupled from raw mode) before such a
|
|
23
|
+
* prompt keeps the loop alive so rl.question() can wait for input. This is intentionally
|
|
24
|
+
* NOT folded into setRawMode(false): the cooked-path unref is load-bearing for one-shot
|
|
25
|
+
* commands (e.g. `gth pr`) to exit, so only the interactive-prompt sites opt back in.
|
|
26
|
+
*/
|
|
27
|
+
export declare const refStdin: () => void;
|
|
13
28
|
export declare const initLogStream: (logFileName: string) => void;
|
|
14
29
|
export declare const writeToLogStream: (message: string) => void;
|
|
15
30
|
export declare const closeLogStream: () => void;
|
|
@@ -30,6 +45,22 @@ export declare const getCurrentWorkDir: () => string;
|
|
|
30
45
|
* real workspace from the protocol should use this instead.
|
|
31
46
|
*/
|
|
32
47
|
export declare const getProcessCwd: () => string;
|
|
48
|
+
/**
|
|
49
|
+
* The directory of the DISCOVERED project config (the up-tree match, or the `--config`
|
|
50
|
+
* override). It governs ONLY post-config, project-relative artifact resolution (project
|
|
51
|
+
* guidelines, prompts, `.gsloth-settings`, outputs). When unset (a global-only config, no
|
|
52
|
+
* config at all, or before discovery has run) callers fall back to cwd via {@link getProjectDir}.
|
|
53
|
+
*
|
|
54
|
+
* This is NOT the global-config dir (`~/.gsloth`): the global config stays cwd-anchored by
|
|
55
|
+
* design, so it must never be routed through this value.
|
|
56
|
+
*/
|
|
57
|
+
export declare const setProjectDir: (dir: string | undefined) => void;
|
|
58
|
+
/**
|
|
59
|
+
* The discovered project root for project-relative artifact resolution, falling back to
|
|
60
|
+
* {@link getCurrentWorkDir} when no project config has been discovered (see {@link setProjectDir}).
|
|
61
|
+
* Config DISCOVERY and DETECTION must NOT use this; they stay cwd-bound.
|
|
62
|
+
*/
|
|
63
|
+
export declare const getProjectDir: () => string;
|
|
33
64
|
export declare const getInstallDir: () => string;
|
|
34
65
|
/**
|
|
35
66
|
* Cached string from stdin. Should only be called after readStdin completes execution.
|
|
@@ -7,6 +7,7 @@ import { createWriteStream, readFileSync } from 'node:fs';
|
|
|
7
7
|
import { ProgressIndicator } from '#src/utils/ProgressIndicator.js';
|
|
8
8
|
const innerState = {
|
|
9
9
|
installDir: undefined,
|
|
10
|
+
projectDir: undefined,
|
|
10
11
|
stringFromStdin: '',
|
|
11
12
|
useColour: false,
|
|
12
13
|
waitForEscapeCallback: undefined,
|
|
@@ -82,6 +83,25 @@ export const setRawMode = (rawMode) => {
|
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* Ref stdin so it keeps the event loop alive, WITHOUT changing raw mode.
|
|
88
|
+
*
|
|
89
|
+
* EXT-18: the ref/unref of stdin used to be coupled to raw mode (only setRawMode(true)
|
|
90
|
+
* re-ref'd, see above), but some interactive prompts run in COOKED mode after a stream
|
|
91
|
+
* end. When an agent run suspends on a tool-approval interrupt, the stream's finally
|
|
92
|
+
* calls stopWaitingForEscape(), which unref's stdin. The readline approval prompt then
|
|
93
|
+
* does setRawMode(false) (cooked, so typed input echoes) and awaits rl.question(...) -
|
|
94
|
+
* but with stdin unref'd and nothing else holding the loop open the process exits to the
|
|
95
|
+
* shell before the user can answer. Refing stdin (decoupled from raw mode) before such a
|
|
96
|
+
* prompt keeps the loop alive so rl.question() can wait for input. This is intentionally
|
|
97
|
+
* NOT folded into setRawMode(false): the cooked-path unref is load-bearing for one-shot
|
|
98
|
+
* commands (e.g. `gth pr`) to exit, so only the interactive-prompt sites opt back in.
|
|
99
|
+
*/
|
|
100
|
+
export const refStdin = () => {
|
|
101
|
+
if (process.stdin.isTTY) {
|
|
102
|
+
process.stdin.ref?.();
|
|
103
|
+
}
|
|
104
|
+
};
|
|
85
105
|
export const initLogStream = (logFileName) => {
|
|
86
106
|
try {
|
|
87
107
|
// Close existing stream if present
|
|
@@ -149,6 +169,24 @@ export const getCurrentWorkDir = () => process.env?.INIT_CWD ?? process.cwd();
|
|
|
149
169
|
* real workspace from the protocol should use this instead.
|
|
150
170
|
*/
|
|
151
171
|
export const getProcessCwd = () => process.cwd();
|
|
172
|
+
/**
|
|
173
|
+
* The directory of the DISCOVERED project config (the up-tree match, or the `--config`
|
|
174
|
+
* override). It governs ONLY post-config, project-relative artifact resolution (project
|
|
175
|
+
* guidelines, prompts, `.gsloth-settings`, outputs). When unset (a global-only config, no
|
|
176
|
+
* config at all, or before discovery has run) callers fall back to cwd via {@link getProjectDir}.
|
|
177
|
+
*
|
|
178
|
+
* This is NOT the global-config dir (`~/.gsloth`): the global config stays cwd-anchored by
|
|
179
|
+
* design, so it must never be routed through this value.
|
|
180
|
+
*/
|
|
181
|
+
export const setProjectDir = (dir) => {
|
|
182
|
+
innerState.projectDir = dir ? resolve(dir) : undefined;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* The discovered project root for project-relative artifact resolution, falling back to
|
|
186
|
+
* {@link getCurrentWorkDir} when no project config has been discovered (see {@link setProjectDir}).
|
|
187
|
+
* Config DISCOVERY and DETECTION must NOT use this; they stay cwd-bound.
|
|
188
|
+
*/
|
|
189
|
+
export const getProjectDir = () => innerState.projectDir ?? getCurrentWorkDir();
|
|
152
190
|
export const getInstallDir = () => {
|
|
153
191
|
if (innerState.installDir) {
|
|
154
192
|
return innerState.installDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemUtils.js","sourceRoot":"","sources":["../../src/utils/systemUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAuC,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"systemUtils.js","sourceRoot":"","sources":["../../src/utils/systemUtils.ts"],"names":[],"mappings":"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"}
|