@gaunt-sloth/core 2.0.0-alpha.24 → 2.0.0-alpha.26
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/README.md +1 -1
- package/dist/config/colour.d.ts +38 -0
- package/dist/config/colour.js +36 -0
- package/dist/config/colour.js.map +1 -0
- package/dist/config/defaults.d.ts +1 -0
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +13 -6
- package/dist/config/loader.js +171 -28
- package/dist/config/loader.js.map +1 -1
- package/dist/config/mouse.d.ts +50 -0
- package/dist/config/mouse.js +44 -0
- package/dist/config/mouse.js.map +1 -0
- package/dist/config/schema.d.ts +2372 -114
- package/dist/config/schema.js +845 -16
- package/dist/config/schema.js.map +1 -1
- package/dist/config/shell-policy.d.ts +466 -116
- package/dist/config/shell-policy.js +273 -62
- package/dist/config/shell-policy.js.map +1 -1
- package/dist/config/tool-descriptions.d.ts +165 -0
- package/dist/config/tool-descriptions.js +229 -0
- package/dist/config/tool-descriptions.js.map +1 -0
- package/dist/config/types.d.ts +36 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/core/GthAbstractAgent.d.ts +59 -1
- package/dist/core/GthAbstractAgent.js +72 -0
- package/dist/core/GthAbstractAgent.js.map +1 -1
- package/dist/core/GthAgentRunner.d.ts +341 -58
- package/dist/core/GthAgentRunner.js +817 -149
- package/dist/core/GthAgentRunner.js.map +1 -1
- package/dist/core/GthLangChainAgent.d.ts +16 -0
- package/dist/core/GthLangChainAgent.js +72 -2
- package/dist/core/GthLangChainAgent.js.map +1 -1
- package/dist/core/approvals/annotations.d.ts +122 -0
- package/dist/core/approvals/annotations.js +137 -0
- package/dist/core/approvals/annotations.js.map +1 -0
- package/dist/core/approvals/grants.d.ts +216 -0
- package/dist/core/approvals/grants.js +469 -0
- package/dist/core/approvals/grants.js.map +1 -0
- package/dist/core/approvals/matcher.d.ts +202 -0
- package/dist/core/approvals/matcher.js +267 -0
- package/dist/core/approvals/matcher.js.map +1 -0
- package/dist/core/approvals/mcpSubjects.d.ts +40 -0
- package/dist/core/approvals/mcpSubjects.js +99 -0
- package/dist/core/approvals/mcpSubjects.js.map +1 -0
- package/dist/core/approvals/toolAnnotationSources.d.ts +105 -0
- package/dist/core/approvals/toolAnnotationSources.js +277 -0
- package/dist/core/approvals/toolAnnotationSources.js.map +1 -0
- package/dist/core/approvals/toolHost.d.ts +46 -0
- package/dist/core/approvals/toolHost.js +108 -0
- package/dist/core/approvals/toolHost.js.map +1 -0
- package/dist/core/launchBanner.d.ts +120 -0
- package/dist/core/launchBanner.js +399 -0
- package/dist/core/launchBanner.js.map +1 -0
- package/dist/core/plainToolIndication.js +13 -7
- package/dist/core/plainToolIndication.js.map +1 -1
- package/dist/core/shell/approvalStop.d.ts +75 -0
- package/dist/core/shell/approvalStop.js +108 -0
- package/dist/core/shell/approvalStop.js.map +1 -0
- package/dist/core/shell/arity.d.ts +6 -0
- package/dist/core/shell/arity.js +20 -6
- package/dist/core/shell/arity.js.map +1 -1
- package/dist/core/shell/denylist.d.ts +11 -0
- package/dist/core/shell/denylist.js +37 -0
- package/dist/core/shell/denylist.js.map +1 -0
- package/dist/core/shell/normalize.d.ts +41 -1
- package/dist/core/shell/normalize.js +58 -4
- package/dist/core/shell/normalize.js.map +1 -1
- package/dist/core/shell/openWorld.d.ts +138 -0
- package/dist/core/shell/openWorld.js +523 -0
- package/dist/core/shell/openWorld.js.map +1 -0
- package/dist/core/shell/rater.d.ts +560 -0
- package/dist/core/shell/rater.js +895 -0
- package/dist/core/shell/rater.js.map +1 -0
- package/dist/core/shell/raterModel.d.ts +41 -0
- package/dist/core/shell/raterModel.js +51 -0
- package/dist/core/shell/raterModel.js.map +1 -0
- package/dist/core/shell/rejection.d.ts +66 -0
- package/dist/core/shell/rejection.js +38 -0
- package/dist/core/shell/rejection.js.map +1 -0
- package/dist/core/types.d.ts +71 -9
- package/dist/core/types.js.map +1 -1
- package/dist/runtime/askStructured.d.ts +8 -7
- package/dist/runtime/askStructured.js +8 -7
- package/dist/runtime/askStructured.js.map +1 -1
- package/dist/runtime/conversation.js +89 -76
- package/dist/runtime/conversation.js.map +1 -1
- package/dist/runtime/singleShot.js +71 -60
- package/dist/runtime/singleShot.js.map +1 -1
- package/dist/utils/ProgressIndicator.d.ts +21 -0
- package/dist/utils/ProgressIndicator.js +30 -3
- package/dist/utils/ProgressIndicator.js.map +1 -1
- package/dist/utils/consoleUtils.d.ts +30 -0
- package/dist/utils/consoleUtils.js +27 -2
- package/dist/utils/consoleUtils.js.map +1 -1
- package/dist/utils/systemUtils.d.ts +17 -0
- package/dist/utils/systemUtils.js +17 -0
- package/dist/utils/systemUtils.js.map +1 -1
- package/package.json +5 -2
- package/schema/gsloth-config.schema.json +1216 -417
- package/dist/core/shell/allowlist.d.ts +0 -75
- package/dist/core/shell/allowlist.js +0 -187
- package/dist/core/shell/allowlist.js.map +0 -1
- package/dist/core/shell/judge.d.ts +0 -161
- package/dist/core/shell/judge.js +0 -261
- package/dist/core/shell/judge.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rater.js","sourceRoot":"","sources":["../../../src/core/shell/rater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/shell/raterModel
|
|
3
|
+
*
|
|
4
|
+
* CFG-26 — resolve the model the AI rater rates with when `approvals.rater.profile` names an
|
|
5
|
+
* identity profile. Without this the profile is validated and then IGNORED: the config parses,
|
|
6
|
+
* `gth config validate` passes, CFG-24's first-run dialog promises "set a stronger model as the
|
|
7
|
+
* rater later via approvals.rater.profile" — and the runtime quietly rates with the main model.
|
|
8
|
+
*
|
|
9
|
+
* Why it matters concretely (QA-5 rater baseline, 2026-07-26): rating quality varies enormously by
|
|
10
|
+
* model. A local `gemma4:12b` scored 61.7% tier accuracy; `llama3.2:1b` scored 25.5% and rated
|
|
11
|
+
* EVERY safe command `danger`. Pointing the rater at a competent model is the difference between
|
|
12
|
+
* `auto` being useful and being `ask` with a bill attached — so the knob has to actually work.
|
|
13
|
+
*
|
|
14
|
+
* Kept in its own module (rather than inline in {@link GthAgentRunner}) for two reasons: the
|
|
15
|
+
* runner's specs can mock THIS seam instead of the whole `#src/config.js` barrel, and the
|
|
16
|
+
* global-state discipline below lives in exactly one place.
|
|
17
|
+
*/
|
|
18
|
+
import type { BaseChatModel } from '@langchain/core/language_models/chat_models';
|
|
19
|
+
/**
|
|
20
|
+
* Load the identity profile named by `approvals.rater.profile` and return ITS model.
|
|
21
|
+
*
|
|
22
|
+
* Strict, per [[GS2-62]]: a profile that cannot be loaded, or that resolves to a config with no
|
|
23
|
+
* usable model, is an ERROR — never a silent fallback to the session's main model. A silent
|
|
24
|
+
* fallback is precisely the failure this function exists to remove (the user asked for a stronger
|
|
25
|
+
* rater and would have been given the weak one, with nothing said). The profile's EXISTENCE is
|
|
26
|
+
* already validated at config-load time by the loader (and by `gth config validate`); this is the
|
|
27
|
+
* later, separate question of whether it yields a usable model.
|
|
28
|
+
*
|
|
29
|
+
* **Global-state discipline.** `initConfig` re-runs project discovery and calls
|
|
30
|
+
* `setProjectDir(discovered?.dir)` as a side effect. That is correct for the SESSION's config load
|
|
31
|
+
* but wrong for this subsidiary one: a rater sub-config must never re-root the session. Because
|
|
32
|
+
* this call passes no `customConfigPath`, discovery re-walks from cwd and can legitimately land on
|
|
33
|
+
* a different dir than the session did (e.g. a session started with `-c <path>`), which would then
|
|
34
|
+
* silently repoint every `getProjectDir()` consumer — prompt files, output paths, the shell
|
|
35
|
+
* allow-list file, debug dumps. So the project dir is snapshotted and restored in a `finally`.
|
|
36
|
+
*
|
|
37
|
+
* @param profile The identity profile name from `approvals.rater.profile`.
|
|
38
|
+
* @returns The profile's chat model, ready to be handed to `rateShellCommand`'s `model` option.
|
|
39
|
+
* @throws When the profile's config cannot be loaded or carries no usable model.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveRaterModel(profile: string): Promise<BaseChatModel>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { initConfig } from '#src/config/loader.js';
|
|
2
|
+
import { peekProjectDir, setProjectDir } from '#src/utils/systemUtils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Load the identity profile named by `approvals.rater.profile` and return ITS model.
|
|
5
|
+
*
|
|
6
|
+
* Strict, per [[GS2-62]]: a profile that cannot be loaded, or that resolves to a config with no
|
|
7
|
+
* usable model, is an ERROR — never a silent fallback to the session's main model. A silent
|
|
8
|
+
* fallback is precisely the failure this function exists to remove (the user asked for a stronger
|
|
9
|
+
* rater and would have been given the weak one, with nothing said). The profile's EXISTENCE is
|
|
10
|
+
* already validated at config-load time by the loader (and by `gth config validate`); this is the
|
|
11
|
+
* later, separate question of whether it yields a usable model.
|
|
12
|
+
*
|
|
13
|
+
* **Global-state discipline.** `initConfig` re-runs project discovery and calls
|
|
14
|
+
* `setProjectDir(discovered?.dir)` as a side effect. That is correct for the SESSION's config load
|
|
15
|
+
* but wrong for this subsidiary one: a rater sub-config must never re-root the session. Because
|
|
16
|
+
* this call passes no `customConfigPath`, discovery re-walks from cwd and can legitimately land on
|
|
17
|
+
* a different dir than the session did (e.g. a session started with `-c <path>`), which would then
|
|
18
|
+
* silently repoint every `getProjectDir()` consumer — prompt files, output paths, the shell
|
|
19
|
+
* allow-list file, debug dumps. So the project dir is snapshotted and restored in a `finally`.
|
|
20
|
+
*
|
|
21
|
+
* @param profile The identity profile name from `approvals.rater.profile`.
|
|
22
|
+
* @returns The profile's chat model, ready to be handed to `rateShellCommand`'s `model` option.
|
|
23
|
+
* @throws When the profile's config cannot be loaded or carries no usable model.
|
|
24
|
+
*/
|
|
25
|
+
export async function resolveRaterModel(profile) {
|
|
26
|
+
// Snapshot BEFORE initConfig's discovery mutates it (see the note above). `peekProjectDir`
|
|
27
|
+
// rather than `getProjectDir` so an UNSET dir is restored as unset, not pinned to today's cwd.
|
|
28
|
+
const projectDirBefore = peekProjectDir();
|
|
29
|
+
let raterConfig;
|
|
30
|
+
try {
|
|
31
|
+
raterConfig = await initConfig({ identityProfile: profile });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(`Could not load the AI rater profile "${profile}" named by approvals.rater.profile: ` +
|
|
35
|
+
`${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? { cause: error } : undefined);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
setProjectDir(projectDirBefore);
|
|
39
|
+
}
|
|
40
|
+
const model = raterConfig?.llm;
|
|
41
|
+
// Guard explicitly rather than returning `undefined`: `rateShellCommand` falls back to
|
|
42
|
+
// `config.llm` when its `model` option is undefined, so handing it undefined here would
|
|
43
|
+
// reintroduce the very silent fallback this module removes.
|
|
44
|
+
if (!model || typeof model.withStructuredOutput !== 'function') {
|
|
45
|
+
throw new Error(`The AI rater profile "${profile}" resolved to a config with no usable model. ` +
|
|
46
|
+
'Give that profile a valid `llm`, or remove approvals.rater.profile to rate with the ' +
|
|
47
|
+
'session model.');
|
|
48
|
+
}
|
|
49
|
+
return model;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=raterModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raterModel.js","sourceRoot":"","sources":["../../../src/core/shell/raterModel.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,2FAA2F;IAC3F,+FAA+F;IAC/F,MAAM,gBAAgB,GAAG,cAAc,EAAE,CAAC;IAC1C,IAAI,WAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,UAAU,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wCAAwC,OAAO,sCAAsC;YACnF,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC7D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CACtD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,EAAE,GAAG,CAAC;IAC/B,uFAAuF;IACvF,wFAAwF;IACxF,4DAA4D;IAC5D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,yBAAyB,OAAO,+CAA+C;YAC7E,sFAAsF;YACtF,gBAAgB,CACnB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/shell/rejection
|
|
3
|
+
*
|
|
4
|
+
* EXT-58 (spec §7) — **what the model is told when a gated tool call is refused.**
|
|
5
|
+
*
|
|
6
|
+
* A rejection returned to the model MUST name the moves available to it, not merely the refusal.
|
|
7
|
+
* The pre-EXT-58 message was the bare string *"User rejected the shell command."*, which tells the
|
|
8
|
+
* model it failed and nothing about what to do instead — so it either re-runs the identical call or
|
|
9
|
+
* abandons a legitimate task silently. §7 fixes both ends: state the refusal, carry the explanation
|
|
10
|
+
* when one exists, and name the three moves (re-call with a justification, call a different
|
|
11
|
+
* command, ask the user).
|
|
12
|
+
*
|
|
13
|
+
* When the rater named an already-granted alternative (§4.4), the message MUST carry it **and** say
|
|
14
|
+
* that the alternative needs no approval. That last clause is the sentence that actually redirects
|
|
15
|
+
* behaviour: without it the model reads a tool name and still has no reason to believe calling it
|
|
16
|
+
* is cheaper than arguing about the command it already chose.
|
|
17
|
+
*
|
|
18
|
+
* What this module deliberately does NOT do:
|
|
19
|
+
*
|
|
20
|
+
* - It does not decide anything. It renders a refusal that has already been decided elsewhere; a
|
|
21
|
+
* suggestion it carries is never an approval and changes no outcome (§4.4).
|
|
22
|
+
* - It does not serve a **halt** (§4.2). A halt is not a rejection and offers the model no moves,
|
|
23
|
+
* so it is an error (`AttackHaltError`) rather than a message — see `approvalStop.ts`.
|
|
24
|
+
* - It does not serve a **deny-list** refusal. A deny entry is the user's own hardline, and
|
|
25
|
+
* "re-call the same command with a justification" is not a move the model has there; that message
|
|
26
|
+
* stays as it is, in `GthAgentRunner.decideToolApproval`.
|
|
27
|
+
*/
|
|
28
|
+
import type { ShellSafetyVerdict } from '#src/core/shell/rater.js';
|
|
29
|
+
/** Who refused the call — the opening sentence differs, the moves do not. */
|
|
30
|
+
export type RejectionSource =
|
|
31
|
+
/** The human answered "no" at the escalation prompt (§6). */
|
|
32
|
+
'user'
|
|
33
|
+
/** The auto-rater refused during a negotiation (§5 / [[EXT-29]]). */
|
|
34
|
+
| 'rater';
|
|
35
|
+
/** The three moves §7 requires every rejection to name. */
|
|
36
|
+
export declare const REJECTION_MOVES: string;
|
|
37
|
+
/**
|
|
38
|
+
* §7 — the clause that makes a suggestion actionable. Verbatim in substance from the spec:
|
|
39
|
+
* *"`gth_edit_file` does this and is already approved at this level, so it will not interrupt the
|
|
40
|
+
* user."*
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildGrantedAlternativeClause(toolName: string): string;
|
|
43
|
+
/** Inputs to {@link buildRejectionMessage}. */
|
|
44
|
+
export interface RejectionMessageOptions {
|
|
45
|
+
/** Who refused. */
|
|
46
|
+
source: RejectionSource;
|
|
47
|
+
/** The tool that was refused; defaults to a generic phrasing when absent. */
|
|
48
|
+
toolName?: string;
|
|
49
|
+
/**
|
|
50
|
+
* The rating that accompanied the escalation, when one exists. Carries both the explanation the
|
|
51
|
+
* model is owed and — when the rater named one — the granted alternative (§4.4). Absent at the
|
|
52
|
+
* unrated rungs (`read-only`, `write`), where there is no rating at all and the descriptions of
|
|
53
|
+
* §4.5 are the only mechanism in play.
|
|
54
|
+
*/
|
|
55
|
+
verdict?: ShellSafetyVerdict;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build the §7 rejection message handed back to the model as the refused call's tool result.
|
|
59
|
+
*
|
|
60
|
+
* Shape (each part omitted when it does not apply):
|
|
61
|
+
* 1. who refused what;
|
|
62
|
+
* 2. the rater's explanation, when a rating exists;
|
|
63
|
+
* 3. the three moves — always;
|
|
64
|
+
* 4. the granted alternative plus the no-approval-needed clause, when the rater named one.
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildRejectionMessage(options: RejectionMessageOptions): string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** The three moves §7 requires every rejection to name. */
|
|
2
|
+
export const REJECTION_MOVES = 'You may call the same command with a justification, call a different command, or ask the user ' +
|
|
3
|
+
'if there is no way around it.';
|
|
4
|
+
/**
|
|
5
|
+
* §7 — the clause that makes a suggestion actionable. Verbatim in substance from the spec:
|
|
6
|
+
* *"`gth_edit_file` does this and is already approved at this level, so it will not interrupt the
|
|
7
|
+
* user."*
|
|
8
|
+
*/
|
|
9
|
+
export function buildGrantedAlternativeClause(toolName) {
|
|
10
|
+
return `\`${toolName}\` does this and is already approved at this level, so it will not interrupt the user.`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Build the §7 rejection message handed back to the model as the refused call's tool result.
|
|
14
|
+
*
|
|
15
|
+
* Shape (each part omitted when it does not apply):
|
|
16
|
+
* 1. who refused what;
|
|
17
|
+
* 2. the rater's explanation, when a rating exists;
|
|
18
|
+
* 3. the three moves — always;
|
|
19
|
+
* 4. the granted alternative plus the no-approval-needed clause, when the rater named one.
|
|
20
|
+
*/
|
|
21
|
+
export function buildRejectionMessage(options) {
|
|
22
|
+
const target = options.toolName ? `your call to ${options.toolName}` : 'your command';
|
|
23
|
+
const opener = options.source === 'rater'
|
|
24
|
+
? `The auto-rater rejected ${target}.`
|
|
25
|
+
: `The user rejected ${target}.`;
|
|
26
|
+
const parts = [opener];
|
|
27
|
+
const reason = options.verdict?.reason?.trim();
|
|
28
|
+
if (reason) {
|
|
29
|
+
parts.push(`Explanation: ${reason}`);
|
|
30
|
+
}
|
|
31
|
+
parts.push(REJECTION_MOVES);
|
|
32
|
+
const suggested = options.verdict?.suggestedTool?.trim();
|
|
33
|
+
if (suggested) {
|
|
34
|
+
parts.push(buildGrantedAlternativeClause(suggested));
|
|
35
|
+
}
|
|
36
|
+
return parts.join(' ');
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=rejection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejection.js","sourceRoot":"","sources":["../../../src/core/shell/rejection.ts"],"names":[],"mappings":"AAoCA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAC1B,gGAAgG;IAChG,+BAA+B,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAgB;IAC5D,OAAO,KAAK,QAAQ,wFAAwF,CAAC;AAC/G,CAAC;AAiBD;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgC;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IACtF,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,KAAK,OAAO;QACxB,CAAC,CAAC,2BAA2B,MAAM,GAAG;QACtC,CAAC,CAAC,qBAAqB,MAAM,GAAG,CAAC;IAErC,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACzD,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { GthConfig } from '#src/config.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { DeclaredToolAnnotations } from '#src/core/approvals/annotations.js';
|
|
3
|
+
import type { ShellSafetyVerdict } from '#src/core/shell/rater.js';
|
|
3
4
|
import type { BaseMessage } from '@langchain/core/messages';
|
|
4
5
|
import type { RunnableConfig } from '@langchain/core/runnables';
|
|
5
6
|
import type { StructuredToolInterface } from '@langchain/core/tools';
|
|
@@ -158,19 +159,60 @@ export interface PendingToolInterrupt {
|
|
|
158
159
|
name: string;
|
|
159
160
|
args: Record<string, unknown>;
|
|
160
161
|
/**
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* can show
|
|
164
|
-
*
|
|
162
|
+
* CFG-26 — when the AI rater escalated this `run_shell_command` to the human (rather than
|
|
163
|
+
* approving it or bouncing it back to the model), the rater's verdict is attached here so the
|
|
164
|
+
* approval surface can show an "AI rater (<tier>): <reason>" notice. Absent when the rater is
|
|
165
|
+
* off, or when the command reached the human without being rated.
|
|
165
166
|
*/
|
|
166
167
|
safetyVerdict?: ShellSafetyVerdict;
|
|
168
|
+
/**
|
|
169
|
+
* EXT-71 §3.2 — when this call reached the human because a declared `approvals.escalate` entry
|
|
170
|
+
* matched it, the entry that fired, rendered for display. It is the provenance the prompt shows:
|
|
171
|
+
* an escalation the user cannot trace to the line they wrote reads as the gate malfunctioning.
|
|
172
|
+
* Absent whenever the escalation came from the rung or the rater instead.
|
|
173
|
+
*/
|
|
174
|
+
escalatedBy?: string;
|
|
175
|
+
/**
|
|
176
|
+
* EXT-71 §6 — **what a sticky choice will store**, rendered in the object form the user would
|
|
177
|
+
* write in a config file, e.g. `{ "type": "shell", "matcher": "exact", "pattern": "npm test" }`.
|
|
178
|
+
* The menu MUST show this at the moment of the choice, on every surface: the user is shown the
|
|
179
|
+
* thing they are agreeing to rather than a generalization of it, which is what makes the display
|
|
180
|
+
* honest and cheap at once.
|
|
181
|
+
*
|
|
182
|
+
* **For a tool call the stored thing is the tool, not the arguments** (§4.7.4), so this reads
|
|
183
|
+
* e.g. `{ "type": "mcpTool", "server": "fetcher", "matcher": "exact", "pattern": "fetch_url",
|
|
184
|
+
* "host": "docs.internal.example" }`. That is the one place a grant is deliberately broader than
|
|
185
|
+
* what the human was shown, which is why the display carries the most weight there.
|
|
186
|
+
*
|
|
187
|
+
* Absent exactly where no sticky grant is on offer — a `catastrophic` outcome (§4.2 withdraws
|
|
188
|
+
* the persistent grants), a rung that remembers nothing, a command that does not statically
|
|
189
|
+
* resolve, or a tool call naming more than one host (which has no honest single-host entry) — so
|
|
190
|
+
* a prompt never advertises a control that has already been withdrawn.
|
|
191
|
+
*/
|
|
192
|
+
grantPreview?: string;
|
|
193
|
+
/**
|
|
194
|
+
* §6 — **the same grant in the words a menu control is written in**: `npm test` for a shell
|
|
195
|
+
* command, `tool gth_web_fetch (host docs.internal.example)` or `mcpTool jira/create_issue` for a
|
|
196
|
+
* tool call. It is what the *always approve* control names, so the control reads as
|
|
197
|
+
* *always approve this tool for this host* rather than as a bare key.
|
|
198
|
+
*
|
|
199
|
+
* It is rendered by `describeApprovalEntry` — the one-liner every other provenance message uses,
|
|
200
|
+
* including the §4.7.4 notice that later withdraws the grant. Sharing the renderer is the point:
|
|
201
|
+
* a menu that describes a grant differently from the notice that withdraws it is how a user stops
|
|
202
|
+
* trusting either.
|
|
203
|
+
*
|
|
204
|
+
* Present exactly when {@link grantPreview} is, since both are rendered from the one entry
|
|
205
|
+
* `recordApproval` would write.
|
|
206
|
+
*/
|
|
207
|
+
grantSummary?: string;
|
|
167
208
|
}
|
|
168
209
|
/**
|
|
169
|
-
* Persistence scope for an `approve` decision (
|
|
210
|
+
* Persistence scope for an `approve` decision (spec §6):
|
|
170
211
|
* - `once` — run this single invocation only; remember nothing (the default).
|
|
171
|
-
* - `session` — remember
|
|
172
|
-
* instance, so
|
|
173
|
-
*
|
|
212
|
+
* - `session` — remember **this command**, as an `exact` entry (§3.1), for the life of this runner
|
|
213
|
+
* instance, so the same command stops re-prompting. A longer variant of it still asks: the menu
|
|
214
|
+
* never widens, and breadth is something a human writes in a config file.
|
|
215
|
+
* - `always` — additionally persist that entry to the project store
|
|
174
216
|
* (`.gsloth/.gsloth-settings/shell-allowlist.json`) so it survives across runs.
|
|
175
217
|
*/
|
|
176
218
|
export type ToolApprovalScope = 'once' | 'session' | 'always';
|
|
@@ -222,6 +264,26 @@ export interface GthAgentInterface {
|
|
|
222
264
|
* approve/reject confirmation loop.
|
|
223
265
|
*/
|
|
224
266
|
getPendingToolInterrupts?(runConfig: RunnableConfig): Promise<PendingToolInterrupt[]>;
|
|
267
|
+
/**
|
|
268
|
+
* EXT-58 (spec §4.4) — the names of the tools registered with the graph at `init`. The runner
|
|
269
|
+
* intersects them with the built-in summaries table to tell the rater which already-granted
|
|
270
|
+
* built-ins it may offer as an alternative, so a suggestion can never name a tool the model does
|
|
271
|
+
* not have. Optional: an agent that does not track its tools simply omits it, and the rater then
|
|
272
|
+
* receives no granted list (and so suggests nothing).
|
|
273
|
+
*/
|
|
274
|
+
getRegisteredToolNames?(): string[];
|
|
275
|
+
/**
|
|
276
|
+
* EXT-70 (spec §4.7.1) — what the connected MCP servers declared about their own tools in their
|
|
277
|
+
* `tools/list` responses, keyed by the REGISTERED tool name (`mcp__<server>__<tool>`). The runner
|
|
278
|
+
* reads it as the `mcp` half of a declared-annotation lookup when it computes a call's effective
|
|
279
|
+
* annotation set.
|
|
280
|
+
*
|
|
281
|
+
* These are **claims, not credentials**: nothing here has been trusted, and an entry only becomes
|
|
282
|
+
* load-bearing where the user's `approvals.mcp` block believes that hint from that server.
|
|
283
|
+
* Optional — an agent that tracks no tools omits it, and every tool is then fail-closed, which is
|
|
284
|
+
* exactly what a fully distrustful configuration computes anyway.
|
|
285
|
+
*/
|
|
286
|
+
getDeclaredMcpToolAnnotations?(): ReadonlyMap<string, DeclaredToolAnnotations>;
|
|
225
287
|
/**
|
|
226
288
|
* GS2-16 — reset the per-run analytics accumulator so the NEXT turn's token/tool totals start
|
|
227
289
|
* from zero. Called by {@link GthAgentRunner} at each turn boundary (the runner is reused across
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,MAAM,CAAN,IAAY,WAQX;AARD,WAAY,WAAW;IACrB,+CAAS,CAAA;IACT,6CAAQ,CAAA;IACR,mDAAW,CAAA;IACX,mDAAW,CAAA;IACX,mDAAW,CAAA;IACX,+CAAS,CAAA;IACT,iDAAU,CAAA;AACZ,CAAC,EARW,WAAW,KAAX,WAAW,QAQtB"}
|
|
@@ -3,23 +3,24 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A reusable, non-agentic "ask the LLM and get a schema-validated object back" primitive — the
|
|
5
5
|
* structured-output half the (later) `gth workflow` host calls. Deliberately mirrors the
|
|
6
|
-
* *mechanism* of the
|
|
7
|
-
* `judge.ts
|
|
6
|
+
* *mechanism* of the structured-evaluation calls ({@link judgeEvalCase} — the EVAL GRADER in
|
|
7
|
+
* `@gaunt-sloth/batch`'s `judge.ts` — and its in-core sibling {@link rateShellCommand}, the
|
|
8
|
+
* approvals AI rater in `core/shell/rater.ts`):
|
|
8
9
|
* `model.withStructuredOutput(schema)` for a single structured call, `.invoke([SystemMessage,
|
|
9
10
|
* HumanMessage])` raced against a wall-clock timeout via `Promise.race`, a defensive `safeParse`
|
|
10
11
|
* re-validation, `clearTimeout` in `finally`, and — crucially — it **never throws**, returning a
|
|
11
12
|
* failure object instead.
|
|
12
13
|
*
|
|
13
|
-
* Differences from
|
|
14
|
-
* system/user strings from the caller (
|
|
15
|
-
* prompt), and it reads the model from `config.llm` (like `runSingleShot`/`
|
|
14
|
+
* Differences from those two: this one is **generic** over the Zod schema and takes the
|
|
15
|
+
* system/user strings from the caller (they hard-code a schema and build a rubric/safety
|
|
16
|
+
* prompt), and it reads the model from `config.llm` (like `runSingleShot`/`rateShellCommand`),
|
|
16
17
|
* so the workflow host can hand it the resolved {@link GthConfig} directly. `judgeEvalCase` could
|
|
17
18
|
* later be refactored to delegate to this primitive — out of scope here.
|
|
18
19
|
*/
|
|
19
20
|
import * as z from 'zod';
|
|
20
21
|
import type { GthConfig } from '#src/config.js';
|
|
21
22
|
/**
|
|
22
|
-
* Default wall-clock budget (ms) for the structured LLM call — same value as
|
|
23
|
+
* Default wall-clock budget (ms) for the structured LLM call — same value as their
|
|
23
24
|
* `EVAL_JUDGE_DEFAULT_TIMEOUT_MS` / `JUDGE_DEFAULT_TIMEOUT_MS`, kept as this module's own constant
|
|
24
25
|
* since the primitive is conceptually independent of them.
|
|
25
26
|
*/
|
|
@@ -47,7 +48,7 @@ export type AskStructuredResult<T> = {
|
|
|
47
48
|
};
|
|
48
49
|
/**
|
|
49
50
|
* Ask the configured model for a single schema-validated object — a non-agentic structured-output
|
|
50
|
-
* call that mirrors
|
|
51
|
+
* call that mirrors their mechanism (see the module doc) and never throws.
|
|
51
52
|
*
|
|
52
53
|
* - No usable model (`config.llm` missing or lacking `withStructuredOutput`) →
|
|
53
54
|
* `{ ok: false, error: 'No usable model configured.' }`.
|
|
@@ -3,29 +3,30 @@
|
|
|
3
3
|
*
|
|
4
4
|
* A reusable, non-agentic "ask the LLM and get a schema-validated object back" primitive — the
|
|
5
5
|
* structured-output half the (later) `gth workflow` host calls. Deliberately mirrors the
|
|
6
|
-
* *mechanism* of the
|
|
7
|
-
* `judge.ts
|
|
6
|
+
* *mechanism* of the structured-evaluation calls ({@link judgeEvalCase} — the EVAL GRADER in
|
|
7
|
+
* `@gaunt-sloth/batch`'s `judge.ts` — and its in-core sibling {@link rateShellCommand}, the
|
|
8
|
+
* approvals AI rater in `core/shell/rater.ts`):
|
|
8
9
|
* `model.withStructuredOutput(schema)` for a single structured call, `.invoke([SystemMessage,
|
|
9
10
|
* HumanMessage])` raced against a wall-clock timeout via `Promise.race`, a defensive `safeParse`
|
|
10
11
|
* re-validation, `clearTimeout` in `finally`, and — crucially — it **never throws**, returning a
|
|
11
12
|
* failure object instead.
|
|
12
13
|
*
|
|
13
|
-
* Differences from
|
|
14
|
-
* system/user strings from the caller (
|
|
15
|
-
* prompt), and it reads the model from `config.llm` (like `runSingleShot`/`
|
|
14
|
+
* Differences from those two: this one is **generic** over the Zod schema and takes the
|
|
15
|
+
* system/user strings from the caller (they hard-code a schema and build a rubric/safety
|
|
16
|
+
* prompt), and it reads the model from `config.llm` (like `runSingleShot`/`rateShellCommand`),
|
|
16
17
|
* so the workflow host can hand it the resolved {@link GthConfig} directly. `judgeEvalCase` could
|
|
17
18
|
* later be refactored to delegate to this primitive — out of scope here.
|
|
18
19
|
*/
|
|
19
20
|
import { HumanMessage, SystemMessage } from '@langchain/core/messages';
|
|
20
21
|
/**
|
|
21
|
-
* Default wall-clock budget (ms) for the structured LLM call — same value as
|
|
22
|
+
* Default wall-clock budget (ms) for the structured LLM call — same value as their
|
|
22
23
|
* `EVAL_JUDGE_DEFAULT_TIMEOUT_MS` / `JUDGE_DEFAULT_TIMEOUT_MS`, kept as this module's own constant
|
|
23
24
|
* since the primitive is conceptually independent of them.
|
|
24
25
|
*/
|
|
25
26
|
export const ASK_STRUCTURED_DEFAULT_TIMEOUT_MS = 30_000;
|
|
26
27
|
/**
|
|
27
28
|
* Ask the configured model for a single schema-validated object — a non-agentic structured-output
|
|
28
|
-
* call that mirrors
|
|
29
|
+
* call that mirrors their mechanism (see the module doc) and never throws.
|
|
29
30
|
*
|
|
30
31
|
* - No usable model (`config.llm` missing or lacking `withStructuredOutput`) →
|
|
31
32
|
* `{ ok: false, error: 'No usable model configured.' }`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"askStructured.js","sourceRoot":"","sources":["../../src/runtime/askStructured.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"askStructured.js","sourceRoot":"","sources":["../../src/runtime/askStructured.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKvE;;;;GAIG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,MAAM,CAAC;AAmBxD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAoB,EACpB,IAA0B;IAE1B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,iCAAiC,CAAC;IAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,UAAU,EAAE,CAAC;QAC/D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,gGAAgG;QAChG,4FAA4F;QAC5F,+FAA+F;QAC/F,MAAM,UAAU,GAAG,KAAK,CAAC,oBAAoB,CAAC,MAA4C,CAAC,CAAC;QAC5F,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE7F,MAAM,OAAO,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;YAC7D,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;QAClE,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,SAAS,KAAK,EAAE,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACtF,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|
|
@@ -48,90 +48,103 @@ import { getProjectDir } from '#src/utils/systemUtils.js';
|
|
|
48
48
|
*/
|
|
49
49
|
export async function runConversation(source, _preamble, userMessages, config, resolvers, command = 'ask', agentFactory) {
|
|
50
50
|
const progressIndicator = config.streamOutput ? undefined : new ProgressIndicator('Thinking.');
|
|
51
|
-
// Resolve output path and initialize session logging if enabled (same discipline as runSingleShot;
|
|
52
|
-
// a no-op when `writeOutputToFile` is off, as `gth eval` forces it — getCommandOutputFilePath null).
|
|
53
|
-
const filePath = getCommandOutputFilePath(config, source);
|
|
54
|
-
if (filePath) {
|
|
55
|
-
initSessionLogging(filePath, config.streamSessionInferenceLog);
|
|
56
|
-
}
|
|
57
|
-
// Build the agent + resolve tools ONCE for the whole conversation (the MCP connection / any OAuth /
|
|
58
|
-
// the toolset must persist across turns so cross-turn memory is real). Cleaned up once, in finally.
|
|
59
|
-
const runner = new GthAgentRunner(defaultStatusCallback, resolvers, agentFactory);
|
|
60
|
-
const results = [];
|
|
61
|
-
// The accumulated conversation: [user1, ai1, user2, ai2, …]. Each turn replays the whole array
|
|
62
|
-
// against a freshly-rotated thread (see the doc block). BATCH-13: NO leading SystemMessage — the
|
|
63
|
-
// agent composes the system prompt via `createAgent({ systemPrompt })` (same as runSingleShot);
|
|
64
|
-
// seeding a preamble SystemMessage here too made two system messages, which Anthropic rejects.
|
|
65
|
-
const messages = [];
|
|
66
51
|
try {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
52
|
+
// Resolve output path and initialize session logging if enabled (same discipline as
|
|
53
|
+
// runSingleShot; a no-op when `writeOutputToFile` is off, as `gth eval` forces it —
|
|
54
|
+
// getCommandOutputFilePath null).
|
|
55
|
+
const filePath = getCommandOutputFilePath(config, source);
|
|
56
|
+
if (filePath) {
|
|
57
|
+
initSessionLogging(filePath, config.streamSessionInferenceLog);
|
|
58
|
+
}
|
|
59
|
+
// Build the agent + resolve tools ONCE for the whole conversation (the MCP connection / any
|
|
60
|
+
// OAuth / the toolset must persist across turns so cross-turn memory is real). Cleaned up once,
|
|
61
|
+
// in finally.
|
|
62
|
+
const runner = new GthAgentRunner(defaultStatusCallback, resolvers, agentFactory);
|
|
63
|
+
const results = [];
|
|
64
|
+
// The accumulated conversation: [user1, ai1, user2, ai2, …]. Each turn replays the whole array
|
|
65
|
+
// against a freshly-rotated thread (see the doc block). BATCH-13: NO leading SystemMessage — the
|
|
66
|
+
// agent composes the system prompt via `createAgent({ systemPrompt })` (same as runSingleShot);
|
|
67
|
+
// seeding a preamble SystemMessage here too made two system messages, which Anthropic rejects.
|
|
68
|
+
const messages = [];
|
|
69
|
+
try {
|
|
70
|
+
await runner.init(command, config, new MemorySaver());
|
|
71
|
+
for (const userMessage of userMessages) {
|
|
72
|
+
// Rotate to a fresh (empty) checkpointer thread so this turn's replay of the full `messages`
|
|
73
|
+
// array is the sole history the agent sees — no double-append from a prior checkpoint.
|
|
74
|
+
runner.resetThread();
|
|
75
|
+
messages.push(new HumanMessage(userMessage));
|
|
76
|
+
const startedAt = Date.now();
|
|
77
|
+
let answer = '';
|
|
78
|
+
let ok = true;
|
|
79
|
+
let error;
|
|
80
|
+
try {
|
|
81
|
+
answer = await runner.processMessages(messages);
|
|
82
|
+
// Append this turn's answer so the NEXT turn's replay includes it (cross-turn memory).
|
|
83
|
+
messages.push(new AIMessage(answer));
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
ok = false;
|
|
87
|
+
error = err instanceof Error ? err.message : String(err);
|
|
88
|
+
displayError(`Failed to get answer: ${error}`);
|
|
89
|
+
}
|
|
90
|
+
// GS2-16: read this turn's token/tool delta from the live agent (before cleanup). Fail-soft
|
|
91
|
+
// — analytics must never affect the run. `processMessages` reset the tally at its top, so
|
|
92
|
+
// this is THIS turn's usage, not the conversation's cumulative total.
|
|
93
|
+
let runStats = { tools: [] };
|
|
94
|
+
try {
|
|
95
|
+
const s = runner.getRunStats?.();
|
|
96
|
+
if (s)
|
|
97
|
+
runStats = s;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
/* fail-soft */
|
|
101
|
+
}
|
|
102
|
+
// GS2-7 (B20): opt-in, fail-soft per-turn session history. A no-op unless `history.enabled`.
|
|
103
|
+
recordSessionSafe(config, {
|
|
104
|
+
command,
|
|
105
|
+
project: getProjectDir(),
|
|
106
|
+
model: config.modelDisplayName,
|
|
107
|
+
prompt: userMessage,
|
|
108
|
+
response: answer,
|
|
109
|
+
tokensInput: runStats.tokensInput,
|
|
110
|
+
tokensOutput: runStats.tokensOutput,
|
|
111
|
+
tools: runStats.tools.length > 0 ? runStats.tools : undefined,
|
|
112
|
+
durationMs: Date.now() - startedAt,
|
|
113
|
+
});
|
|
114
|
+
results.push({ ok, answer, error, ...runStats });
|
|
115
|
+
// A failed turn breaks the conversation's context — stop rather than run later turns on it.
|
|
116
|
+
if (!ok)
|
|
117
|
+
break;
|
|
86
118
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await runner.cleanup();
|
|
122
|
+
}
|
|
123
|
+
progressIndicator?.stop();
|
|
124
|
+
if (config.writeOutputToFile === false) {
|
|
125
|
+
display('\n'); // something going on in some terminals, they swallow last line of output
|
|
126
|
+
}
|
|
127
|
+
if (filePath) {
|
|
91
128
|
try {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
129
|
+
flushSessionLog();
|
|
130
|
+
stopSessionLogging();
|
|
131
|
+
displaySuccess(`\n\nThis report can be found in ${filePath}`);
|
|
95
132
|
}
|
|
96
|
-
catch {
|
|
97
|
-
|
|
133
|
+
catch (err) {
|
|
134
|
+
displayError(`Failed to write answer to file: ${filePath}`);
|
|
135
|
+
displayError(err instanceof Error ? err.message : String(err));
|
|
98
136
|
}
|
|
99
|
-
// GS2-7 (B20): opt-in, fail-soft per-turn session history. A no-op unless `history.enabled`.
|
|
100
|
-
recordSessionSafe(config, {
|
|
101
|
-
command,
|
|
102
|
-
project: getProjectDir(),
|
|
103
|
-
model: config.modelDisplayName,
|
|
104
|
-
prompt: userMessage,
|
|
105
|
-
response: answer,
|
|
106
|
-
tokensInput: runStats.tokensInput,
|
|
107
|
-
tokensOutput: runStats.tokensOutput,
|
|
108
|
-
tools: runStats.tools.length > 0 ? runStats.tools : undefined,
|
|
109
|
-
durationMs: Date.now() - startedAt,
|
|
110
|
-
});
|
|
111
|
-
results.push({ ok, answer, error, ...runStats });
|
|
112
|
-
// A failed turn breaks the conversation's context — stop rather than run later turns on it.
|
|
113
|
-
if (!ok)
|
|
114
|
-
break;
|
|
115
137
|
}
|
|
138
|
+
return results;
|
|
116
139
|
}
|
|
117
140
|
finally {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
flushSessionLog();
|
|
127
|
-
stopSessionLogging();
|
|
128
|
-
displaySuccess(`\n\nThis report can be found in ${filePath}`);
|
|
129
|
-
}
|
|
130
|
-
catch (err) {
|
|
131
|
-
displayError(`Failed to write answer to file: ${filePath}`);
|
|
132
|
-
displayError(err instanceof Error ? err.message : String(err));
|
|
133
|
-
}
|
|
141
|
+
// EXT-53: the indicator owns a 1s setInterval — an active libuv handle that keeps Node's event
|
|
142
|
+
// loop from ever draining, so leaking it hangs the CLI forever after the work is done. The
|
|
143
|
+
// `stop()` above sits where it does for output ordering (before the trailing newline / the
|
|
144
|
+
// "report can be found in …" line); this `finally` guarantees the handle is also released when
|
|
145
|
+
// anything above throws — notably `runner.init()`, which has no catch, and `runner.cleanup()`.
|
|
146
|
+
// `stop()` is idempotent, so the normal path's second call is a no-op.
|
|
147
|
+
progressIndicator?.stop();
|
|
134
148
|
}
|
|
135
|
-
return results;
|
|
136
149
|
}
|
|
137
150
|
//# sourceMappingURL=conversation.js.map
|