pi-advisor-flow 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -17
- package/README.md +10 -8
- package/dist/index.js +2852 -868
- package/extensions/index.ts +2 -1
- package/package.json +55 -40
- package/src/attachments.ts +11 -10
- package/src/commands/activation-preparation.ts +1 -0
- package/src/commands/activation.ts +2 -0
- package/src/commands/lifecycle.ts +1 -0
- package/src/commands/manual-command.ts +7 -1
- package/src/commands/manual-consultation.ts +103 -79
- package/src/commands/manual-progress.ts +7 -5
- package/src/commands/model-commands.ts +1 -1
- package/src/commands/model-options.ts +14 -3
- package/src/commands/model-picker.ts +1 -0
- package/src/commands/registration.ts +1 -0
- package/src/commands/renderers.ts +67 -55
- package/src/commands/runtime.ts +16 -14
- package/src/commands/settings-commands.ts +10 -4
- package/src/commands/settings-persistence.ts +64 -2
- package/src/commands/types.ts +2 -0
- package/src/commands.ts +0 -1
- package/src/config/args.ts +1 -1
- package/src/config/defaults.ts +83 -1
- package/src/config/schema.ts +152 -15
- package/src/config/state.ts +80 -2
- package/src/config/storage.ts +38 -22
- package/src/config/types.ts +45 -3
- package/src/config/validation.ts +33 -21
- package/src/config.ts +3 -0
- package/src/content-utils.ts +24 -4
- package/src/conversation.ts +16 -15
- package/src/git.ts +10 -3
- package/src/herdr-block.ts +83 -0
- package/src/herdr-shared.ts +108 -0
- package/src/herdr.ts +30 -192
- package/src/jev/client.ts +338 -0
- package/src/jev/failure.ts +19 -0
- package/src/jev/key-store.ts +267 -0
- package/src/jev/ledger.ts +228 -0
- package/src/jev/questions.ts +122 -0
- package/src/jev/state.ts +50 -0
- package/src/jev/transport.ts +63 -0
- package/src/model-stream.ts +35 -37
- package/src/outcomes.ts +20 -12
- package/src/pi-settings.ts +4 -9
- package/src/preferences.ts +4 -2
- package/src/redaction.ts +10 -12
- package/src/scout-context.ts +59 -60
- package/src/scout-curation.ts +4 -13
- package/src/scout-groups.ts +178 -175
- package/src/scout-protocol.ts +74 -70
- package/src/scout-reconstruct.ts +1 -1
- package/src/scout.ts +115 -73
- package/src/session-state.ts +148 -39
- package/src/tool-result-cap.ts +18 -17
- package/src/tools/consult-context.ts +7 -15
- package/src/tools/consultation.ts +14 -4
- package/src/tools/gate-policy.ts +1 -0
- package/src/tools/gate-protocol.ts +36 -23
- package/src/tools/jev-filter.ts +204 -0
- package/src/tools/jev-turn-gate.ts +203 -0
- package/src/tools/loop-gate.ts +32 -20
- package/src/tools/model-access.ts +46 -0
- package/src/tools/outage-notifier.ts +30 -0
- package/src/tools/prompts.ts +20 -25
- package/src/tools/register-ask-advisor.ts +73 -17
- package/src/tools/register-lifecycle.ts +22 -0
- package/src/tools/register-outcome.ts +2 -0
- package/src/tools/register-renderers.ts +149 -73
- package/src/tools/registration.ts +15 -0
- package/src/tools/render-advisor-result.ts +77 -35
- package/src/tools/render-common.ts +16 -19
- package/src/tools/scout-status.ts +42 -27
- package/src/tools/types.ts +11 -0
- package/src/tools.ts +0 -1
- package/src/ui/jev-setup-submenu.ts +350 -0
- package/src/ui/manual-dialog-render.ts +1 -0
- package/src/ui/manual-dialog.ts +39 -43
- package/src/ui/masked-input.ts +62 -0
- package/src/ui/model-multi-selector.ts +9 -0
- package/src/ui/model-selector-adapter.ts +31 -0
- package/src/ui/model-selector.ts +14 -161
- package/src/ui/searchable-model-list.ts +230 -0
- package/src/ui/settings-formatting.ts +24 -14
- package/src/ui/settings-items.ts +200 -2
- package/src/ui/settings-list-adapter.ts +15 -12
- package/src/ui/settings-mutations.ts +169 -47
- package/src/ui/settings-selector.ts +18 -9
- package/src/ui/text-setting-submenu.ts +3 -6
- package/src/ui/types.ts +25 -0
- package/src/ui.ts +0 -1
- package/src/usage.ts +29 -20
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { getMarkdownTheme } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type {
|
|
3
|
+
EntryRenderer,
|
|
4
|
+
MessageRenderer,
|
|
5
|
+
} from "@earendil-works/pi-coding-agent";
|
|
2
6
|
import { Box, Markdown, Text } from "@earendil-works/pi-tui";
|
|
7
|
+
|
|
3
8
|
import { getAdvisorSettings } from "../config/state.ts";
|
|
9
|
+
import { isString } from "../content-utils.ts";
|
|
4
10
|
import {
|
|
5
11
|
adviceForDisplay,
|
|
6
12
|
hasSoundVerdict,
|
|
@@ -11,66 +17,72 @@ import { formatAdvisorUsage } from "../usage.ts";
|
|
|
11
17
|
import { ManualAdvisorProgressComponent } from "./manual-progress.ts";
|
|
12
18
|
import type { CommandRuntime } from "./types.ts";
|
|
13
19
|
|
|
20
|
+
interface ManualCallEntryDetails {
|
|
21
|
+
progressId?: string;
|
|
22
|
+
question?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface ManualResultDetails {
|
|
26
|
+
advisor?: string;
|
|
27
|
+
text?: string;
|
|
28
|
+
usage?: unknown;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const manualCallRenderer =
|
|
32
|
+
(runtime: CommandRuntime): EntryRenderer<ManualCallEntryDetails> =>
|
|
33
|
+
(entry, { expanded }, theme) => {
|
|
34
|
+
const { progressId, question } = entry.data ?? {};
|
|
35
|
+
const progress = progressId
|
|
36
|
+
? runtime.manualProgress.get(progressId)
|
|
37
|
+
: undefined;
|
|
38
|
+
return progress
|
|
39
|
+
? new ManualAdvisorProgressComponent(
|
|
40
|
+
question,
|
|
41
|
+
progress,
|
|
42
|
+
Boolean(expanded),
|
|
43
|
+
theme
|
|
44
|
+
)
|
|
45
|
+
: renderAdvisorCallBox(question, theme);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const manualResultRenderer: MessageRenderer<ManualResultDetails> = (
|
|
49
|
+
message,
|
|
50
|
+
{ expanded },
|
|
51
|
+
theme
|
|
52
|
+
) => {
|
|
53
|
+
const { details } = message;
|
|
54
|
+
const box = new Box(1, 1, (text) => theme.bg("customMessageBg", text));
|
|
55
|
+
const advice =
|
|
56
|
+
details?.text ??
|
|
57
|
+
(isString(message.content)
|
|
58
|
+
? message.content
|
|
59
|
+
: "(Advisor returned no advice.)");
|
|
60
|
+
// Manual consultations must render exactly like an Executor ask_advisor call.
|
|
61
|
+
box.addChild(
|
|
62
|
+
new Text(renderAdvisorResponseHeader(hasSoundVerdict(advice), theme), 0, 0)
|
|
63
|
+
);
|
|
64
|
+
if (details?.advisor) {
|
|
65
|
+
box.addChild(new Text(theme.fg("dim", ` ${details.advisor}`), 0, 0));
|
|
66
|
+
}
|
|
67
|
+
if (getAdvisorSettings().showUsageDetails) {
|
|
68
|
+
const usage = formatAdvisorUsage(details?.usage);
|
|
69
|
+
if (usage) {
|
|
70
|
+
box.addChild(new Text(theme.fg("dim", ` Usage: ${usage}`), 0, 0));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
box.addChild(
|
|
74
|
+
new Markdown(adviceForDisplay(advice, expanded), 0, 0, getMarkdownTheme())
|
|
75
|
+
);
|
|
76
|
+
return box;
|
|
77
|
+
};
|
|
78
|
+
|
|
14
79
|
export const registerCommandRenderers = (runtime: CommandRuntime) => {
|
|
15
80
|
runtime.pi.registerEntryRenderer?.(
|
|
16
81
|
"advisor-manual-call",
|
|
17
|
-
(
|
|
18
|
-
const { progressId, question } = (entry.data ?? {}) as {
|
|
19
|
-
progressId?: string;
|
|
20
|
-
question?: string;
|
|
21
|
-
};
|
|
22
|
-
const progress = progressId
|
|
23
|
-
? runtime.manualProgress.get(progressId)
|
|
24
|
-
: undefined;
|
|
25
|
-
return progress
|
|
26
|
-
? new ManualAdvisorProgressComponent(
|
|
27
|
-
question,
|
|
28
|
-
progress,
|
|
29
|
-
Boolean(expanded),
|
|
30
|
-
theme
|
|
31
|
-
)
|
|
32
|
-
: renderAdvisorCallBox(question, theme);
|
|
33
|
-
}
|
|
82
|
+
manualCallRenderer(runtime)
|
|
34
83
|
);
|
|
35
|
-
|
|
36
84
|
runtime.pi.registerMessageRenderer?.(
|
|
37
85
|
"advisor-manual-result",
|
|
38
|
-
|
|
39
|
-
const details = message.details as
|
|
40
|
-
| { advisor?: string; text?: string; usage?: unknown }
|
|
41
|
-
| undefined;
|
|
42
|
-
const box = new Box(1, 1, (text) => theme.bg("customMessageBg", text));
|
|
43
|
-
const advice =
|
|
44
|
-
details?.text ??
|
|
45
|
-
(typeof message.content === "string"
|
|
46
|
-
? message.content
|
|
47
|
-
: "(Advisor returned no advice.)");
|
|
48
|
-
// Manual consultations must render exactly like an Executor ask_advisor call.
|
|
49
|
-
box.addChild(
|
|
50
|
-
new Text(
|
|
51
|
-
renderAdvisorResponseHeader(hasSoundVerdict(advice), theme),
|
|
52
|
-
0,
|
|
53
|
-
0
|
|
54
|
-
)
|
|
55
|
-
);
|
|
56
|
-
if (details?.advisor) {
|
|
57
|
-
box.addChild(new Text(theme.fg("dim", ` ${details.advisor}`), 0, 0));
|
|
58
|
-
}
|
|
59
|
-
if (getAdvisorSettings().showUsageDetails) {
|
|
60
|
-
const usage = formatAdvisorUsage(details?.usage);
|
|
61
|
-
if (usage) {
|
|
62
|
-
box.addChild(new Text(theme.fg("dim", ` Usage: ${usage}`), 0, 0));
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
box.addChild(
|
|
66
|
-
new Markdown(
|
|
67
|
-
adviceForDisplay(advice, expanded),
|
|
68
|
-
0,
|
|
69
|
-
0,
|
|
70
|
-
getMarkdownTheme()
|
|
71
|
-
)
|
|
72
|
-
);
|
|
73
|
-
return box;
|
|
74
|
-
}
|
|
86
|
+
manualResultRenderer
|
|
75
87
|
);
|
|
76
88
|
};
|
package/src/commands/runtime.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
ExtensionAPI,
|
|
3
3
|
ExtensionContext,
|
|
4
4
|
} from "@earendil-works/pi-coding-agent";
|
|
5
|
+
|
|
5
6
|
import { getAdvisorSettings } from "../config/state.ts";
|
|
6
7
|
import { notifyHerdrAdvisorFailure } from "../herdr.ts";
|
|
7
8
|
import type { AdvisorSessionState } from "../session-state.ts";
|
|
@@ -25,6 +26,18 @@ export const notify = (
|
|
|
25
26
|
}
|
|
26
27
|
};
|
|
27
28
|
|
|
29
|
+
const reportManualBudgetExhausted = (ctx: ExtensionContext) => {
|
|
30
|
+
const message = "Advisor call budget exhausted for this session.";
|
|
31
|
+
notify(ctx, message, "warning");
|
|
32
|
+
notifyHerdrAdvisorFailure("Advisor budget exhausted", message);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const requestManualRender = (ctx: ExtensionContext) => {
|
|
36
|
+
if (ctx.hasUI) {
|
|
37
|
+
ctx.ui.setStatus("advisor-manual", undefined);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
28
41
|
class CommandRuntime implements CommandRuntimeContract {
|
|
29
42
|
readonly advisorSessionState: AdvisorSessionState;
|
|
30
43
|
readonly manualConsultations = new Map<AbortController, symbol>();
|
|
@@ -34,7 +47,9 @@ class CommandRuntime implements CommandRuntimeContract {
|
|
|
34
47
|
ReturnType<typeof setInterval>
|
|
35
48
|
>();
|
|
36
49
|
readonly pi: ExtensionAPI;
|
|
50
|
+
readonly reportManualBudgetExhausted = reportManualBudgetExhausted;
|
|
37
51
|
readonly requestAdvisor: ManualConsult;
|
|
52
|
+
readonly requestManualRender = requestManualRender;
|
|
38
53
|
readonly scoutStatus: ScoutStatusManager;
|
|
39
54
|
manualProgressSequence = 0;
|
|
40
55
|
pendingExecutorModelRef: string | undefined;
|
|
@@ -59,8 +74,7 @@ class CommandRuntime implements CommandRuntimeContract {
|
|
|
59
74
|
undefined,
|
|
60
75
|
undefined,
|
|
61
76
|
undefined,
|
|
62
|
-
onScout
|
|
63
|
-
undefined
|
|
77
|
+
onScout
|
|
64
78
|
));
|
|
65
79
|
}
|
|
66
80
|
|
|
@@ -94,18 +108,6 @@ class CommandRuntime implements CommandRuntimeContract {
|
|
|
94
108
|
);
|
|
95
109
|
}
|
|
96
110
|
}
|
|
97
|
-
|
|
98
|
-
reportManualBudgetExhausted(ctx: ExtensionContext) {
|
|
99
|
-
const message = "Advisor call budget exhausted for this session.";
|
|
100
|
-
notify(ctx, message, "warning");
|
|
101
|
-
notifyHerdrAdvisorFailure("Advisor budget exhausted", message);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
requestManualRender(ctx: ExtensionContext) {
|
|
105
|
-
if (ctx.hasUI) {
|
|
106
|
-
ctx.ui.setStatus("advisor-manual", undefined);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
export const createCommandRuntime = (
|
|
@@ -7,7 +7,11 @@ import {
|
|
|
7
7
|
import { saveConfig } from "../config/storage.ts";
|
|
8
8
|
import { AdvisorSettingsSelector } from "../ui/settings-selector.ts";
|
|
9
9
|
import { loadCommandConfig } from "./activation-preparation.ts";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
CONTEXT_PRESETS,
|
|
12
|
+
EFFORT_LEVELS,
|
|
13
|
+
getConfiguredModelRefs,
|
|
14
|
+
} from "./model-options.ts";
|
|
11
15
|
import { notify } from "./runtime.ts";
|
|
12
16
|
import { saveAdvisorSettings } from "./settings-persistence.ts";
|
|
13
17
|
import type { CommandRuntime } from "./types.ts";
|
|
@@ -21,12 +25,14 @@ export const registerSettingsCommands = (runtime: CommandRuntime) => {
|
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
const initial = getAdvisorSettings();
|
|
24
|
-
await ctx.ui.custom<
|
|
25
|
-
(tui, theme,
|
|
28
|
+
await ctx.ui.custom<undefined>(
|
|
29
|
+
(tui, theme, keybindings, done) =>
|
|
26
30
|
new AdvisorSettingsSelector({
|
|
27
31
|
effortLevels: EFFORT_LEVELS,
|
|
28
32
|
initial,
|
|
29
|
-
|
|
33
|
+
keybindings,
|
|
34
|
+
modelRefs: getConfiguredModelRefs(ctx),
|
|
35
|
+
onCancel: () => done(undefined),
|
|
30
36
|
onChange: (settings) => {
|
|
31
37
|
try {
|
|
32
38
|
saveAdvisorSettings(ctx, settings);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
2
3
|
import {
|
|
3
4
|
getPersistedModelRefs,
|
|
4
5
|
setAdvisorAutoLoopGateRef,
|
|
@@ -12,8 +13,20 @@ import {
|
|
|
12
13
|
setAdvisorGitContextMaxCharsRef,
|
|
13
14
|
setAdvisorGitContextRef,
|
|
14
15
|
setAdvisorHerdrIntegrationRef,
|
|
16
|
+
setAdvisorJevDigestMaxCharsRef,
|
|
17
|
+
setAdvisorJevFilterEnabledRef,
|
|
18
|
+
setAdvisorJevFilterNoulMarginRef,
|
|
19
|
+
setAdvisorJevFilterOverrideWindowRef,
|
|
20
|
+
setAdvisorJevFilterSkipConfidenceRef,
|
|
21
|
+
setAdvisorJevModelRef,
|
|
22
|
+
setAdvisorJevPricePerMtokRef,
|
|
23
|
+
setAdvisorJevTimeoutMsRef,
|
|
24
|
+
setAdvisorJevTransportRef,
|
|
25
|
+
setAdvisorJevTurnGateEveryTurnsRef,
|
|
26
|
+
setAdvisorJevTurnGateNoulThresholdRef,
|
|
15
27
|
setAdvisorLoopThresholdRef,
|
|
16
28
|
setAdvisorMaxCallsPerSessionRef,
|
|
29
|
+
setAdvisorModelWhitelistRef,
|
|
17
30
|
setAdvisorOutcomeLoggingRef,
|
|
18
31
|
setAdvisorPlanGateRef,
|
|
19
32
|
setAdvisorRedactSecretsRef,
|
|
@@ -31,10 +44,21 @@ import {
|
|
|
31
44
|
setSimpleModeRef,
|
|
32
45
|
} from "../config/state.ts";
|
|
33
46
|
import { saveConfig, saveGlobalOutcomeLogging } from "../config/storage.ts";
|
|
47
|
+
import {
|
|
48
|
+
DEFAULT_JEV_DIGEST_MAX_CHARS,
|
|
49
|
+
DEFAULT_JEV_FILTER_NOUL_MARGIN,
|
|
50
|
+
DEFAULT_JEV_FILTER_OVERRIDE_WINDOW,
|
|
51
|
+
DEFAULT_JEV_FILTER_SKIP_CONFIDENCE,
|
|
52
|
+
DEFAULT_JEV_MODEL,
|
|
53
|
+
DEFAULT_JEV_PRICE_PER_MTOK,
|
|
54
|
+
DEFAULT_JEV_TIMEOUT_MS,
|
|
55
|
+
DEFAULT_JEV_TRANSPORT,
|
|
56
|
+
DEFAULT_JEV_TURN_GATE_EVERY_TURNS,
|
|
57
|
+
DEFAULT_JEV_TURN_GATE_NOUL_THRESHOLD,
|
|
58
|
+
} from "../config/types.ts";
|
|
34
59
|
import type { AdvisorSettings } from "../ui/types.ts";
|
|
35
60
|
|
|
36
|
-
|
|
37
|
-
const applyAdvisorSettings = (settings: AdvisorSettings) => {
|
|
61
|
+
const applySessionSettings = (settings: AdvisorSettings) => {
|
|
38
62
|
setAdvisorEffortRef(
|
|
39
63
|
settings.effort === "Default (Model Default)" ? undefined : settings.effort
|
|
40
64
|
);
|
|
@@ -48,6 +72,7 @@ const applyAdvisorSettings = (settings: AdvisorSettings) => {
|
|
|
48
72
|
setAdvisorAutoLoopGateRef(settings.autoLoopGate ?? true);
|
|
49
73
|
setAdvisorLoopThresholdRef(settings.loopThreshold ?? 3);
|
|
50
74
|
setAdvisorMaxCallsPerSessionRef(settings.maxCallsPerSession);
|
|
75
|
+
setAdvisorModelWhitelistRef(settings.modelWhitelist ?? []);
|
|
51
76
|
setAdvisorSessionSummaryRef(settings.sessionSummary ?? false);
|
|
52
77
|
setAdvisorScoutEnabledRef(settings.scoutEnabled ?? false);
|
|
53
78
|
setShowUsageDetailsRef(settings.showUsageDetails ?? true);
|
|
@@ -56,6 +81,37 @@ const applyAdvisorSettings = (settings: AdvisorSettings) => {
|
|
|
56
81
|
setAlwaysOnRef(settings.alwaysOn ?? false);
|
|
57
82
|
setAdvisorFailureModeRef(settings.failureMode ?? "block-session");
|
|
58
83
|
setAdvisorHerdrIntegrationRef(settings.herdrIntegration ?? true);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const applyJevSettings = (settings: AdvisorSettings) => {
|
|
87
|
+
setAdvisorJevFilterEnabledRef(settings.jevFilterEnabled ?? false);
|
|
88
|
+
setAdvisorJevFilterSkipConfidenceRef(
|
|
89
|
+
settings.jevFilterSkipConfidence ?? DEFAULT_JEV_FILTER_SKIP_CONFIDENCE
|
|
90
|
+
);
|
|
91
|
+
setAdvisorJevFilterNoulMarginRef(
|
|
92
|
+
settings.jevFilterNoulMargin ?? DEFAULT_JEV_FILTER_NOUL_MARGIN
|
|
93
|
+
);
|
|
94
|
+
setAdvisorJevFilterOverrideWindowRef(
|
|
95
|
+
settings.jevFilterOverrideWindow ?? DEFAULT_JEV_FILTER_OVERRIDE_WINDOW
|
|
96
|
+
);
|
|
97
|
+
setAdvisorJevModelRef(settings.jevModel ?? DEFAULT_JEV_MODEL);
|
|
98
|
+
setAdvisorJevTimeoutMsRef(settings.jevTimeoutMs ?? DEFAULT_JEV_TIMEOUT_MS);
|
|
99
|
+
setAdvisorJevDigestMaxCharsRef(
|
|
100
|
+
settings.jevDigestMaxChars ?? DEFAULT_JEV_DIGEST_MAX_CHARS
|
|
101
|
+
);
|
|
102
|
+
setAdvisorJevPricePerMtokRef(
|
|
103
|
+
settings.jevPricePerMtok ?? DEFAULT_JEV_PRICE_PER_MTOK
|
|
104
|
+
);
|
|
105
|
+
setAdvisorJevTransportRef(settings.jevTransport ?? DEFAULT_JEV_TRANSPORT);
|
|
106
|
+
setAdvisorJevTurnGateEveryTurnsRef(
|
|
107
|
+
settings.jevTurnGateEveryTurns ?? DEFAULT_JEV_TURN_GATE_EVERY_TURNS
|
|
108
|
+
);
|
|
109
|
+
setAdvisorJevTurnGateNoulThresholdRef(
|
|
110
|
+
settings.jevTurnGateNoulThreshold ?? DEFAULT_JEV_TURN_GATE_NOUL_THRESHOLD
|
|
111
|
+
);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const applyDisclosureSettings = (settings: AdvisorSettings) => {
|
|
59
115
|
setAdvisorToolResultMaxLinesRef(settings.toolResultMaxLines ?? 2000);
|
|
60
116
|
setAdvisorToolResultMaxBytesRef(settings.toolResultMaxBytes ?? 50 * 1024);
|
|
61
117
|
setAdvisorRedactSecretsRef(settings.redactSecrets ?? false);
|
|
@@ -67,6 +123,12 @@ const applyAdvisorSettings = (settings: AdvisorSettings) => {
|
|
|
67
123
|
setAdvisorOutcomeLoggingRef(settings.outcomeLogging ?? false);
|
|
68
124
|
};
|
|
69
125
|
|
|
126
|
+
const applyAdvisorSettings = (settings: AdvisorSettings) => {
|
|
127
|
+
applySessionSettings(settings);
|
|
128
|
+
applyJevSettings(settings);
|
|
129
|
+
applyDisclosureSettings(settings);
|
|
130
|
+
};
|
|
131
|
+
|
|
70
132
|
export const saveAdvisorSettings = (
|
|
71
133
|
ctx: ExtensionContext,
|
|
72
134
|
settings: AdvisorSettings
|
package/src/commands/types.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
ExtensionAPI,
|
|
3
3
|
ExtensionContext,
|
|
4
4
|
} from "@earendil-works/pi-coding-agent";
|
|
5
|
+
|
|
5
6
|
import type { GitContextLevel } from "../git.ts";
|
|
6
7
|
import type { ScoutLifecycleEvent } from "../scout.ts";
|
|
7
8
|
import type { AdvisorSessionState } from "../session-state.ts";
|
|
@@ -16,6 +17,7 @@ export type ManualConsult = (
|
|
|
16
17
|
onScout?: (event: ScoutLifecycleEvent) => void,
|
|
17
18
|
gitContext?: GitContextLevel
|
|
18
19
|
) => Promise<{
|
|
20
|
+
adviceId?: string;
|
|
19
21
|
markdown: string;
|
|
20
22
|
thinkingText: string;
|
|
21
23
|
draftBytes?: number;
|
package/src/commands.ts
CHANGED
package/src/config/args.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import { MAX_CONTEXT_MAX_CHARS } from "./types.ts";
|
|
10
10
|
import { isValidContextMaxChars } from "./validation.ts";
|
|
11
11
|
|
|
12
|
-
const ARGUMENT_WHITESPACE = /\s
|
|
12
|
+
const ARGUMENT_WHITESPACE = /\s+/u;
|
|
13
13
|
|
|
14
14
|
export const parseArgs = (args: string): string | undefined => {
|
|
15
15
|
let nextExecutor = executorRef;
|
package/src/config/defaults.ts
CHANGED
|
@@ -10,8 +10,20 @@ import {
|
|
|
10
10
|
setAdvisorGitContextMaxCharsRef,
|
|
11
11
|
setAdvisorGitContextRef,
|
|
12
12
|
setAdvisorHerdrIntegrationRef,
|
|
13
|
+
setAdvisorJevDigestMaxCharsRef,
|
|
14
|
+
setAdvisorJevFilterEnabledRef,
|
|
15
|
+
setAdvisorJevFilterNoulMarginRef,
|
|
16
|
+
setAdvisorJevFilterOverrideWindowRef,
|
|
17
|
+
setAdvisorJevFilterSkipConfidenceRef,
|
|
18
|
+
setAdvisorJevModelRef,
|
|
19
|
+
setAdvisorJevPricePerMtokRef,
|
|
20
|
+
setAdvisorJevTimeoutMsRef,
|
|
21
|
+
setAdvisorJevTransportRef,
|
|
22
|
+
setAdvisorJevTurnGateEveryTurnsRef,
|
|
23
|
+
setAdvisorJevTurnGateNoulThresholdRef,
|
|
13
24
|
setAdvisorLoopThresholdRef,
|
|
14
25
|
setAdvisorMaxCallsPerSessionRef,
|
|
26
|
+
setAdvisorModelWhitelistRef,
|
|
15
27
|
setAdvisorOutcomeLoggingRef,
|
|
16
28
|
setAdvisorPlanGateRef,
|
|
17
29
|
setAdvisorRedactSecretsRef,
|
|
@@ -38,6 +50,16 @@ import {
|
|
|
38
50
|
DEFAULT_ADVISOR_TOOL_RESULT_MAX_BYTES,
|
|
39
51
|
DEFAULT_ADVISOR_TOOL_RESULT_MAX_LINES,
|
|
40
52
|
DEFAULT_CONTEXT_MAX_CHARS,
|
|
53
|
+
DEFAULT_JEV_DIGEST_MAX_CHARS,
|
|
54
|
+
DEFAULT_JEV_FILTER_NOUL_MARGIN,
|
|
55
|
+
DEFAULT_JEV_FILTER_OVERRIDE_WINDOW,
|
|
56
|
+
DEFAULT_JEV_FILTER_SKIP_CONFIDENCE,
|
|
57
|
+
DEFAULT_JEV_MODEL,
|
|
58
|
+
DEFAULT_JEV_PRICE_PER_MTOK,
|
|
59
|
+
DEFAULT_JEV_TIMEOUT_MS,
|
|
60
|
+
DEFAULT_JEV_TRANSPORT,
|
|
61
|
+
DEFAULT_JEV_TURN_GATE_EVERY_TURNS,
|
|
62
|
+
DEFAULT_JEV_TURN_GATE_NOUL_THRESHOLD,
|
|
41
63
|
} from "./types.ts";
|
|
42
64
|
|
|
43
65
|
export const resetDefaults = () => {
|
|
@@ -56,11 +78,23 @@ export const resetDefaults = () => {
|
|
|
56
78
|
setAdvisorAutoLoopGateRef(true);
|
|
57
79
|
setAdvisorLoopThresholdRef(3);
|
|
58
80
|
setAdvisorMaxCallsPerSessionRef(undefined);
|
|
81
|
+
setAdvisorModelWhitelistRef([]);
|
|
59
82
|
setAdvisorSessionSummaryRef(false);
|
|
60
83
|
setSimpleModeRef(false);
|
|
61
84
|
setAlwaysOnRef(false);
|
|
62
85
|
setAdvisorFailureModeRef("block-session");
|
|
63
86
|
setAdvisorHerdrIntegrationRef(true);
|
|
87
|
+
setAdvisorJevModelRef(DEFAULT_JEV_MODEL);
|
|
88
|
+
setAdvisorJevFilterEnabledRef(false);
|
|
89
|
+
setAdvisorJevFilterSkipConfidenceRef(DEFAULT_JEV_FILTER_SKIP_CONFIDENCE);
|
|
90
|
+
setAdvisorJevFilterNoulMarginRef(DEFAULT_JEV_FILTER_NOUL_MARGIN);
|
|
91
|
+
setAdvisorJevFilterOverrideWindowRef(DEFAULT_JEV_FILTER_OVERRIDE_WINDOW);
|
|
92
|
+
setAdvisorJevTimeoutMsRef(DEFAULT_JEV_TIMEOUT_MS);
|
|
93
|
+
setAdvisorJevDigestMaxCharsRef(DEFAULT_JEV_DIGEST_MAX_CHARS);
|
|
94
|
+
setAdvisorJevPricePerMtokRef(DEFAULT_JEV_PRICE_PER_MTOK);
|
|
95
|
+
setAdvisorJevTransportRef(DEFAULT_JEV_TRANSPORT);
|
|
96
|
+
setAdvisorJevTurnGateEveryTurnsRef(DEFAULT_JEV_TURN_GATE_EVERY_TURNS);
|
|
97
|
+
setAdvisorJevTurnGateNoulThresholdRef(DEFAULT_JEV_TURN_GATE_NOUL_THRESHOLD);
|
|
64
98
|
setAdvisorToolResultMaxLinesRef(DEFAULT_ADVISOR_TOOL_RESULT_MAX_LINES);
|
|
65
99
|
setAdvisorToolResultMaxBytesRef(DEFAULT_ADVISOR_TOOL_RESULT_MAX_BYTES);
|
|
66
100
|
setAdvisorRedactSecretsRef(false);
|
|
@@ -82,7 +116,7 @@ const applyOptionalConfig = <Key extends keyof AdvisorConfig>(
|
|
|
82
116
|
) => {
|
|
83
117
|
const value = config[key];
|
|
84
118
|
if (value !== undefined) {
|
|
85
|
-
apply(value
|
|
119
|
+
apply(value);
|
|
86
120
|
}
|
|
87
121
|
};
|
|
88
122
|
|
|
@@ -134,6 +168,11 @@ export const applyConfig = (config: AdvisorConfig) => {
|
|
|
134
168
|
"advisorMaxCallsPerSession",
|
|
135
169
|
setAdvisorMaxCallsPerSessionRef
|
|
136
170
|
);
|
|
171
|
+
applyOptionalConfig(
|
|
172
|
+
config,
|
|
173
|
+
"advisorModelWhitelist",
|
|
174
|
+
setAdvisorModelWhitelistRef
|
|
175
|
+
);
|
|
137
176
|
applyOptionalConfig(
|
|
138
177
|
config,
|
|
139
178
|
"advisorSessionSummary",
|
|
@@ -150,6 +189,49 @@ export const applyConfig = (config: AdvisorConfig) => {
|
|
|
150
189
|
"advisorHerdrIntegration",
|
|
151
190
|
setAdvisorHerdrIntegrationRef
|
|
152
191
|
);
|
|
192
|
+
applyOptionalConfig(
|
|
193
|
+
config,
|
|
194
|
+
"advisorJevFilterEnabled",
|
|
195
|
+
setAdvisorJevFilterEnabledRef
|
|
196
|
+
);
|
|
197
|
+
applyOptionalConfig(
|
|
198
|
+
config,
|
|
199
|
+
"advisorJevFilterSkipConfidence",
|
|
200
|
+
setAdvisorJevFilterSkipConfidenceRef
|
|
201
|
+
);
|
|
202
|
+
applyOptionalConfig(
|
|
203
|
+
config,
|
|
204
|
+
"advisorJevFilterNoulMargin",
|
|
205
|
+
setAdvisorJevFilterNoulMarginRef
|
|
206
|
+
);
|
|
207
|
+
applyOptionalConfig(
|
|
208
|
+
config,
|
|
209
|
+
"advisorJevFilterOverrideWindow",
|
|
210
|
+
setAdvisorJevFilterOverrideWindowRef
|
|
211
|
+
);
|
|
212
|
+
applyNonEmptyStringConfig(config.advisorJevModel, setAdvisorJevModelRef);
|
|
213
|
+
applyOptionalConfig(config, "advisorJevTimeoutMs", setAdvisorJevTimeoutMsRef);
|
|
214
|
+
applyOptionalConfig(
|
|
215
|
+
config,
|
|
216
|
+
"advisorJevDigestMaxChars",
|
|
217
|
+
setAdvisorJevDigestMaxCharsRef
|
|
218
|
+
);
|
|
219
|
+
applyOptionalConfig(
|
|
220
|
+
config,
|
|
221
|
+
"advisorJevPricePerMtok",
|
|
222
|
+
setAdvisorJevPricePerMtokRef
|
|
223
|
+
);
|
|
224
|
+
applyOptionalConfig(config, "advisorJevTransport", setAdvisorJevTransportRef);
|
|
225
|
+
applyOptionalConfig(
|
|
226
|
+
config,
|
|
227
|
+
"advisorJevTurnGateEveryTurns",
|
|
228
|
+
setAdvisorJevTurnGateEveryTurnsRef
|
|
229
|
+
);
|
|
230
|
+
applyOptionalConfig(
|
|
231
|
+
config,
|
|
232
|
+
"advisorJevTurnGateNoulThreshold",
|
|
233
|
+
setAdvisorJevTurnGateNoulThresholdRef
|
|
234
|
+
);
|
|
153
235
|
applyOptionalConfig(
|
|
154
236
|
config,
|
|
155
237
|
"advisorToolResultMaxLines",
|