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.
Files changed (93) hide show
  1. package/CHANGELOG.md +34 -17
  2. package/README.md +10 -8
  3. package/dist/index.js +2852 -868
  4. package/extensions/index.ts +2 -1
  5. package/package.json +55 -40
  6. package/src/attachments.ts +11 -10
  7. package/src/commands/activation-preparation.ts +1 -0
  8. package/src/commands/activation.ts +2 -0
  9. package/src/commands/lifecycle.ts +1 -0
  10. package/src/commands/manual-command.ts +7 -1
  11. package/src/commands/manual-consultation.ts +103 -79
  12. package/src/commands/manual-progress.ts +7 -5
  13. package/src/commands/model-commands.ts +1 -1
  14. package/src/commands/model-options.ts +14 -3
  15. package/src/commands/model-picker.ts +1 -0
  16. package/src/commands/registration.ts +1 -0
  17. package/src/commands/renderers.ts +67 -55
  18. package/src/commands/runtime.ts +16 -14
  19. package/src/commands/settings-commands.ts +10 -4
  20. package/src/commands/settings-persistence.ts +64 -2
  21. package/src/commands/types.ts +2 -0
  22. package/src/commands.ts +0 -1
  23. package/src/config/args.ts +1 -1
  24. package/src/config/defaults.ts +83 -1
  25. package/src/config/schema.ts +152 -15
  26. package/src/config/state.ts +80 -2
  27. package/src/config/storage.ts +38 -22
  28. package/src/config/types.ts +45 -3
  29. package/src/config/validation.ts +33 -21
  30. package/src/config.ts +3 -0
  31. package/src/content-utils.ts +24 -4
  32. package/src/conversation.ts +16 -15
  33. package/src/git.ts +10 -3
  34. package/src/herdr-block.ts +83 -0
  35. package/src/herdr-shared.ts +108 -0
  36. package/src/herdr.ts +30 -192
  37. package/src/jev/client.ts +338 -0
  38. package/src/jev/failure.ts +19 -0
  39. package/src/jev/key-store.ts +267 -0
  40. package/src/jev/ledger.ts +228 -0
  41. package/src/jev/questions.ts +122 -0
  42. package/src/jev/state.ts +50 -0
  43. package/src/jev/transport.ts +63 -0
  44. package/src/model-stream.ts +35 -37
  45. package/src/outcomes.ts +20 -12
  46. package/src/pi-settings.ts +4 -9
  47. package/src/preferences.ts +4 -2
  48. package/src/redaction.ts +10 -12
  49. package/src/scout-context.ts +59 -60
  50. package/src/scout-curation.ts +4 -13
  51. package/src/scout-groups.ts +178 -175
  52. package/src/scout-protocol.ts +74 -70
  53. package/src/scout-reconstruct.ts +1 -1
  54. package/src/scout.ts +115 -73
  55. package/src/session-state.ts +148 -39
  56. package/src/tool-result-cap.ts +18 -17
  57. package/src/tools/consult-context.ts +7 -15
  58. package/src/tools/consultation.ts +14 -4
  59. package/src/tools/gate-policy.ts +1 -0
  60. package/src/tools/gate-protocol.ts +36 -23
  61. package/src/tools/jev-filter.ts +204 -0
  62. package/src/tools/jev-turn-gate.ts +203 -0
  63. package/src/tools/loop-gate.ts +32 -20
  64. package/src/tools/model-access.ts +46 -0
  65. package/src/tools/outage-notifier.ts +30 -0
  66. package/src/tools/prompts.ts +20 -25
  67. package/src/tools/register-ask-advisor.ts +73 -17
  68. package/src/tools/register-lifecycle.ts +22 -0
  69. package/src/tools/register-outcome.ts +2 -0
  70. package/src/tools/register-renderers.ts +149 -73
  71. package/src/tools/registration.ts +15 -0
  72. package/src/tools/render-advisor-result.ts +77 -35
  73. package/src/tools/render-common.ts +16 -19
  74. package/src/tools/scout-status.ts +42 -27
  75. package/src/tools/types.ts +11 -0
  76. package/src/tools.ts +0 -1
  77. package/src/ui/jev-setup-submenu.ts +350 -0
  78. package/src/ui/manual-dialog-render.ts +1 -0
  79. package/src/ui/manual-dialog.ts +39 -43
  80. package/src/ui/masked-input.ts +62 -0
  81. package/src/ui/model-multi-selector.ts +9 -0
  82. package/src/ui/model-selector-adapter.ts +31 -0
  83. package/src/ui/model-selector.ts +14 -161
  84. package/src/ui/searchable-model-list.ts +230 -0
  85. package/src/ui/settings-formatting.ts +24 -14
  86. package/src/ui/settings-items.ts +200 -2
  87. package/src/ui/settings-list-adapter.ts +15 -12
  88. package/src/ui/settings-mutations.ts +169 -47
  89. package/src/ui/settings-selector.ts +18 -9
  90. package/src/ui/text-setting-submenu.ts +3 -6
  91. package/src/ui/types.ts +25 -0
  92. package/src/ui.ts +0 -1
  93. 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
- (entry, { expanded }, theme) => {
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
- (message, { expanded }, theme) => {
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
  };
@@ -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 { CONTEXT_PRESETS, EFFORT_LEVELS } from "./model-options.ts";
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<void>(
25
- (tui, theme, _keybindings, done) =>
28
+ await ctx.ui.custom<undefined>(
29
+ (tui, theme, keybindings, done) =>
26
30
  new AdvisorSettingsSelector({
27
31
  effortLevels: EFFORT_LEVELS,
28
32
  initial,
29
- onCancel: () => done(),
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
- // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: one settings form maps every persisted control.
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
@@ -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
@@ -1,4 +1,3 @@
1
- // biome-ignore lint/performance/noBarrelFile: this facade intentionally preserves the public command module contract.
2
1
  export { registerCommands } from "./commands/registration.ts";
3
2
  export type {
4
3
  CommandDependencies,
@@ -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;
@@ -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 as NonNullable<AdvisorConfig[Key]>);
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",