@qduc/term2 0.1.1 → 0.1.3
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/dist/agent.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +9 -5
- package/dist/agent.js.map +1 -1
- package/dist/agent.lite-mode.test.d.ts +2 -0
- package/dist/agent.lite-mode.test.d.ts.map +1 -0
- package/dist/agent.lite-mode.test.js +39 -0
- package/dist/agent.lite-mode.test.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +3 -1
- package/dist/app.js.map +1 -1
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +26 -6
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/BottomArea.js +1 -1
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/ChatMessage.js +1 -1
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/CommandMessage.js +7 -7
- package/dist/components/CommandMessage.js.map +1 -1
- package/dist/components/ErrorBoundary.js +2 -2
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts +10 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +4 -2
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +102 -18
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/LiveResponse.d.ts +1 -1
- package/dist/components/LiveResponse.js +1 -1
- package/dist/components/MarkdownRenderer.js +13 -14
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.js +11 -11
- package/dist/components/ModelSelectionMenu.js.map +1 -1
- package/dist/components/PathSelectionMenu.js +3 -3
- package/dist/components/PathSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.d.ts +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsSelectionMenu.js +127 -14
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.test.d.ts +2 -0
- package/dist/components/SettingsSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/SettingsSelectionMenu.test.js +40 -0
- package/dist/components/SettingsSelectionMenu.test.js.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.d.ts +12 -0
- package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.js +63 -0
- package/dist/components/SettingsValueSelectionMenu.js.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.test.d.ts +2 -0
- package/dist/components/SettingsValueSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.test.js +38 -0
- package/dist/components/SettingsValueSelectionMenu.test.js.map +1 -0
- package/dist/components/SlashCommandMenu.js +2 -2
- package/dist/components/SlashCommandMenu.js.map +1 -1
- package/dist/components/TextInput.d.ts.map +1 -1
- package/dist/components/TextInput.js +2 -1
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TextInput.test.js.map +1 -1
- package/dist/context/InputContext.d.ts +1 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js.map +1 -1
- package/dist/debug_ask_mentor.d.ts +2 -0
- package/dist/debug_ask_mentor.d.ts.map +1 -0
- package/dist/debug_ask_mentor.js +73 -0
- package/dist/debug_ask_mentor.js.map +1 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +7 -3
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +70 -10
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +17 -10
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts +23 -0
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -0
- package/dist/hooks/use-settings-value-completion.js +214 -0
- package/dist/hooks/use-settings-value-completion.js.map +1 -0
- package/dist/hooks/use-settings-value-completion.test.d.ts +2 -0
- package/dist/hooks/use-settings-value-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-settings-value-completion.test.js +65 -0
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.flex-tier.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.flex-tier.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.flex-tier.test.js +70 -0
- package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -0
- package/dist/lib/openai-agent-client.js +71 -36
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +1 -1
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/modes/companion/command-index.d.ts +26 -0
- package/dist/modes/companion/command-index.d.ts.map +1 -0
- package/dist/modes/companion/command-index.js +50 -0
- package/dist/modes/companion/command-index.js.map +1 -0
- package/dist/modes/companion/command-index.test.d.ts +2 -0
- package/dist/modes/companion/command-index.test.d.ts.map +1 -0
- package/dist/modes/companion/command-index.test.js +86 -0
- package/dist/modes/companion/command-index.test.js.map +1 -0
- package/dist/modes/companion/companion-app.d.ts +12 -0
- package/dist/modes/companion/companion-app.d.ts.map +1 -0
- package/dist/modes/companion/companion-app.js +297 -0
- package/dist/modes/companion/companion-app.js.map +1 -0
- package/dist/modes/companion/companion-session.d.ts +63 -0
- package/dist/modes/companion/companion-session.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.js +146 -0
- package/dist/modes/companion/companion-session.js.map +1 -0
- package/dist/modes/companion/companion-session.test.d.ts +2 -0
- package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.test.js +28 -0
- package/dist/modes/companion/companion-session.test.js.map +1 -0
- package/dist/modes/companion/components/status-bar.d.ts +13 -0
- package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
- package/dist/modes/companion/components/status-bar.js +26 -0
- package/dist/modes/companion/components/status-bar.js.map +1 -0
- package/dist/modes/companion/context-buffer.d.ts +65 -0
- package/dist/modes/companion/context-buffer.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.js +156 -0
- package/dist/modes/companion/context-buffer.js.map +1 -0
- package/dist/modes/companion/context-buffer.test.d.ts +2 -0
- package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.test.js +154 -0
- package/dist/modes/companion/context-buffer.test.js.map +1 -0
- package/dist/modes/companion/event-detector.d.ts +46 -0
- package/dist/modes/companion/event-detector.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.js +169 -0
- package/dist/modes/companion/event-detector.js.map +1 -0
- package/dist/modes/companion/event-detector.test.d.ts +2 -0
- package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.test.js +121 -0
- package/dist/modes/companion/event-detector.test.js.map +1 -0
- package/dist/modes/companion/index.d.ts +33 -0
- package/dist/modes/companion/index.d.ts.map +1 -0
- package/dist/modes/companion/index.js +21 -0
- package/dist/modes/companion/index.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.d.ts +3 -0
- package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.js +31 -0
- package/dist/modes/companion/input-key-mapper.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.js +26 -0
- package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
- package/dist/modes/companion/input-parser.d.ts +53 -0
- package/dist/modes/companion/input-parser.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.js +114 -0
- package/dist/modes/companion/input-parser.js.map +1 -0
- package/dist/modes/companion/input-parser.test.d.ts +2 -0
- package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.test.js +123 -0
- package/dist/modes/companion/input-parser.test.js.map +1 -0
- package/dist/modes/companion/mode-manager.d.ts +41 -0
- package/dist/modes/companion/mode-manager.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.js +56 -0
- package/dist/modes/companion/mode-manager.js.map +1 -0
- package/dist/modes/companion/mode-manager.test.d.ts +2 -0
- package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.test.js +65 -0
- package/dist/modes/companion/mode-manager.test.js.map +1 -0
- package/dist/modes/companion/output-classifier.d.ts +15 -0
- package/dist/modes/companion/output-classifier.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.js +77 -0
- package/dist/modes/companion/output-classifier.js.map +1 -0
- package/dist/modes/companion/output-classifier.test.d.ts +2 -0
- package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.test.js +133 -0
- package/dist/modes/companion/output-classifier.test.js.map +1 -0
- package/dist/modes/companion/pty-wrapper.d.ts +46 -0
- package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
- package/dist/modes/companion/pty-wrapper.js +143 -0
- package/dist/modes/companion/pty-wrapper.js.map +1 -0
- package/dist/modes/companion/safety-classifier.d.ts +31 -0
- package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.js +140 -0
- package/dist/modes/companion/safety-classifier.js.map +1 -0
- package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
- package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.test.js +151 -0
- package/dist/modes/companion/safety-classifier.test.js.map +1 -0
- package/dist/modes/companion/summarizer.d.ts +24 -0
- package/dist/modes/companion/summarizer.d.ts.map +1 -0
- package/dist/modes/companion/summarizer.js +132 -0
- package/dist/modes/companion/summarizer.js.map +1 -0
- package/dist/modes/companion/terminal-history.d.ts +27 -0
- package/dist/modes/companion/terminal-history.d.ts.map +1 -0
- package/dist/modes/companion/terminal-history.js +142 -0
- package/dist/modes/companion/terminal-history.js.map +1 -0
- package/dist/prompts/simple-mentor.md +8 -0
- package/dist/providers/openai-compatible/model.d.ts.map +1 -1
- package/dist/providers/openai-compatible/model.js +13 -2
- package/dist/providers/openai-compatible/model.js.map +1 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +2 -2
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/reasoning-content.test.js +2 -2
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter.test.js +30 -21
- package/dist/providers/openrouter.test.js.map +1 -1
- package/dist/services/check_mock.d.ts +2 -0
- package/dist/services/check_mock.d.ts.map +1 -0
- package/dist/services/check_mock.js +22 -0
- package/dist/services/check_mock.js.map +1 -0
- package/dist/services/conversation-service.test.d.ts +2 -0
- package/dist/services/conversation-service.test.d.ts.map +1 -0
- package/dist/services/conversation-service.test.js +149 -183
- package/dist/services/conversation-service.test.js.map +1 -0
- package/dist/services/conversation-store.test.js +12 -11
- package/dist/services/conversation-store.test.js.map +1 -1
- package/dist/services/settings-service.d.ts +8 -2
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +24 -0
- package/dist/services/settings-service.js.map +1 -1
- package/dist/tools/ask-mentor.d.ts +1 -1
- package/dist/tools/ask-mentor.d.ts.map +1 -1
- package/dist/tools/ask-mentor.js +1 -0
- package/dist/tools/ask-mentor.js.map +1 -1
- package/dist/tools/find-files.d.ts +2 -2
- package/dist/tools/find-files.js +2 -2
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +15 -0
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.js +1 -1
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/read-file.d.ts +2 -2
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +14 -11
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +37 -19
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts +1 -1
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +129 -1
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +18 -0
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/search.d.ts +4 -4
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +4 -0
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +2 -2
- package/dist/tools/shell.js +2 -2
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/types.d.ts +2 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/command-safety.d.ts.map +1 -1
- package/dist/utils/command-safety.devnull.test.d.ts +2 -0
- package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.js +13 -0
- package/dist/utils/command-safety.devnull.test.js.map +1 -0
- package/dist/utils/command-safety.js +10 -364
- package/dist/utils/command-safety.js.map +1 -1
- package/dist/utils/extract-command-messages.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.test.js +58 -51
- package/dist/utils/extract-command-messages.test.js.map +1 -0
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +18 -4
- package/dist/utils/settings-command.js.map +1 -1
- package/package.json +2 -2
- package/dist/app.model-command-feedback.test.d.ts +0 -2
- package/dist/app.model-command-feedback.test.d.ts.map +0 -1
- package/dist/app.model-command-feedback.test.js +0 -19
- package/dist/app.model-command-feedback.test.js.map +0 -1
- package/dist/components/MentorMode.test.d.ts +0 -2
- package/dist/components/MentorMode.test.d.ts.map +0 -1
- package/dist/components/MentorMode.test.js.map +0 -1
- package/dist/debug-schema.d.ts +0 -2
- package/dist/debug-schema.d.ts.map +0 -1
- package/dist/debug-schema.js +0 -22
- package/dist/debug-schema.js.map +0 -1
- package/dist/hooks/use-model-selection.test.d.ts +0 -2
- package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
- package/dist/hooks/use-model-selection.test.js +0 -28
- package/dist/hooks/use-model-selection.test.js.map +0 -1
- package/dist/hooks/use-path-completion.test.d.ts +0 -2
- package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
- package/dist/hooks/use-path-completion.test.js +0 -29
- package/dist/hooks/use-path-completion.test.js.map +0 -1
- package/dist/prompts/default.md.bak +0 -77
- package/dist/providers/openrouter.history.test.d.ts +0 -2
- package/dist/providers/openrouter.history.test.d.ts.map +0 -1
- package/dist/providers/openrouter.history.test.js +0 -533
- package/dist/providers/openrouter.history.test.js.map +0 -1
- package/dist/test-search-tool.d.ts +0 -2
- package/dist/test-search-tool.d.ts.map +0 -1
- package/dist/test-search-tool.js +0 -36
- package/dist/test-search-tool.js.map +0 -1
- package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.repro.test.js +0 -31
- package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
- /package/{README.md → readme.md} +0 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import Fuse from 'fuse.js';
|
|
3
|
+
import { useInputContext } from '../context/InputContext.js';
|
|
4
|
+
const MAX_RESULTS = 10;
|
|
5
|
+
const NUMBER_SETTING_KEYS = new Set([
|
|
6
|
+
'agent.temperature',
|
|
7
|
+
'agent.maxTurns',
|
|
8
|
+
'agent.retryAttempts',
|
|
9
|
+
'shell.timeout',
|
|
10
|
+
'shell.maxOutputLines',
|
|
11
|
+
'shell.maxOutputChars',
|
|
12
|
+
'ui.historySize',
|
|
13
|
+
'ssh.port',
|
|
14
|
+
]);
|
|
15
|
+
// A small, curated set of value suggestions for common settings.
|
|
16
|
+
// This is intentionally conservative: it's better to suggest a few helpful values
|
|
17
|
+
// than to pretend we can enumerate every possible value.
|
|
18
|
+
const VALUE_SUGGESTIONS_BY_KEY = {
|
|
19
|
+
'agent.reasoningEffort': [
|
|
20
|
+
{ value: 'none', description: 'No reasoning (fastest)' },
|
|
21
|
+
{ value: 'minimal', description: 'Very low reasoning' },
|
|
22
|
+
{ value: 'low', description: 'Low reasoning' },
|
|
23
|
+
{ value: 'medium', description: 'Balanced' },
|
|
24
|
+
{ value: 'high', description: 'Highest reasoning' },
|
|
25
|
+
{ value: 'default', description: 'Model default' },
|
|
26
|
+
],
|
|
27
|
+
'agent.mentorReasoningEffort': [
|
|
28
|
+
{ value: 'none', description: 'No reasoning (fastest)' },
|
|
29
|
+
{ value: 'minimal', description: 'Very low reasoning' },
|
|
30
|
+
{ value: 'low', description: 'Low reasoning' },
|
|
31
|
+
{ value: 'medium', description: 'Balanced' },
|
|
32
|
+
{ value: 'high', description: 'Highest reasoning' },
|
|
33
|
+
{ value: 'default', description: 'Model default' },
|
|
34
|
+
],
|
|
35
|
+
'logging.logLevel': [
|
|
36
|
+
{ value: 'debug' },
|
|
37
|
+
{ value: 'info' },
|
|
38
|
+
{ value: 'warn' },
|
|
39
|
+
{ value: 'error' },
|
|
40
|
+
],
|
|
41
|
+
'logging.suppressConsoleOutput': [{ value: 'true' }, { value: 'false' }],
|
|
42
|
+
'agent.useFlexServiceTier': [
|
|
43
|
+
{ value: 'true', description: 'Enable Flex Service Tier (lower cost)' },
|
|
44
|
+
{ value: 'false', description: 'Use standard service tier' },
|
|
45
|
+
],
|
|
46
|
+
'agent.temperature': [
|
|
47
|
+
{ value: '0', description: 'Deterministic' },
|
|
48
|
+
{ value: '0.2' },
|
|
49
|
+
{ value: '0.7' },
|
|
50
|
+
{ value: '1' },
|
|
51
|
+
{ value: '1.2' },
|
|
52
|
+
{ value: '2', description: 'Most random' },
|
|
53
|
+
],
|
|
54
|
+
'shell.timeout': [
|
|
55
|
+
{ value: '60000', description: '60s' },
|
|
56
|
+
{ value: '120000', description: '120s' },
|
|
57
|
+
{ value: '300000', description: '5m' },
|
|
58
|
+
],
|
|
59
|
+
'shell.maxOutputLines': [
|
|
60
|
+
{ value: '200' },
|
|
61
|
+
{ value: '500' },
|
|
62
|
+
{ value: '1000' },
|
|
63
|
+
],
|
|
64
|
+
'shell.maxOutputChars': [
|
|
65
|
+
{ value: '20000' },
|
|
66
|
+
{ value: '50000' },
|
|
67
|
+
{ value: '100000' },
|
|
68
|
+
],
|
|
69
|
+
'ui.historySize': [
|
|
70
|
+
{ value: '50' },
|
|
71
|
+
{ value: '100' },
|
|
72
|
+
{ value: '200' },
|
|
73
|
+
],
|
|
74
|
+
'agent.maxTurns': [
|
|
75
|
+
{ value: '10' },
|
|
76
|
+
{ value: '20' },
|
|
77
|
+
{ value: '50' },
|
|
78
|
+
],
|
|
79
|
+
'agent.retryAttempts': [
|
|
80
|
+
{ value: '1' },
|
|
81
|
+
{ value: '2' },
|
|
82
|
+
{ value: '3' },
|
|
83
|
+
],
|
|
84
|
+
'ssh.port': [
|
|
85
|
+
{ value: '22', description: 'Default SSH port' },
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
// Pure functions exported for testing
|
|
89
|
+
export function buildSettingValueSuggestions(key) {
|
|
90
|
+
// If we don't know the key, return empty and let users type freely.
|
|
91
|
+
return VALUE_SUGGESTIONS_BY_KEY[key] ?? [];
|
|
92
|
+
}
|
|
93
|
+
export function filterSettingValueSuggestionsByQuery(suggestions, query, fuse, maxResults = MAX_RESULTS, key) {
|
|
94
|
+
if (!query.trim()) {
|
|
95
|
+
return suggestions.slice(0, maxResults);
|
|
96
|
+
}
|
|
97
|
+
const results = fuse.search(query.trim()).map(r => r.item);
|
|
98
|
+
// For number settings, if the query itself is a valid number and not already
|
|
99
|
+
// in the results as an exact match, add it as a "Custom value" option.
|
|
100
|
+
if (key &&
|
|
101
|
+
NUMBER_SETTING_KEYS.has(key) &&
|
|
102
|
+
query.trim() &&
|
|
103
|
+
!results.some(r => r.value === query.trim())) {
|
|
104
|
+
const numValue = Number(query.trim());
|
|
105
|
+
if (!isNaN(numValue)) {
|
|
106
|
+
// Add to the START of results so it's the default choice
|
|
107
|
+
// when typing a custom value.
|
|
108
|
+
results.unshift({
|
|
109
|
+
value: query.trim(),
|
|
110
|
+
description: 'Custom value',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return results.slice(0, maxResults);
|
|
115
|
+
}
|
|
116
|
+
export const useSettingsValueCompletion = (settingsService) => {
|
|
117
|
+
const { mode, setMode, input, cursorOffset, triggerIndex, setTriggerIndex } = useInputContext();
|
|
118
|
+
const isOpen = mode === 'settings_value_completion';
|
|
119
|
+
const [settingKey, setSettingKey] = useState(null);
|
|
120
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
121
|
+
const [settingsVersion, setSettingsVersion] = useState(0);
|
|
122
|
+
// Recompute current setting value suggestions when settings change.
|
|
123
|
+
// (Useful if we later want to add "current" or dynamic suggestions.)
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
const unsubscribe = settingsService.onChange(() => {
|
|
126
|
+
setSettingsVersion(v => v + 1);
|
|
127
|
+
});
|
|
128
|
+
return unsubscribe;
|
|
129
|
+
}, [settingsService]);
|
|
130
|
+
const query = useMemo(() => {
|
|
131
|
+
if (!isOpen || triggerIndex === null)
|
|
132
|
+
return '';
|
|
133
|
+
const end = Math.min(cursorOffset, input.length);
|
|
134
|
+
return input.slice(triggerIndex, end);
|
|
135
|
+
}, [isOpen, triggerIndex, input, cursorOffset]);
|
|
136
|
+
const allSuggestions = useMemo(() => {
|
|
137
|
+
if (!settingKey)
|
|
138
|
+
return [];
|
|
139
|
+
// settingsVersion is used to allow refresh when values change.
|
|
140
|
+
void settingsVersion;
|
|
141
|
+
return buildSettingValueSuggestions(settingKey);
|
|
142
|
+
}, [settingKey, settingsVersion]);
|
|
143
|
+
const fuse = useMemo(() => {
|
|
144
|
+
return new Fuse(allSuggestions, {
|
|
145
|
+
keys: ['value', 'description'],
|
|
146
|
+
threshold: 0.4,
|
|
147
|
+
});
|
|
148
|
+
}, [allSuggestions]);
|
|
149
|
+
const filteredEntries = useMemo(() => {
|
|
150
|
+
return filterSettingValueSuggestionsByQuery(allSuggestions, query, fuse, MAX_RESULTS, settingKey ?? undefined);
|
|
151
|
+
}, [allSuggestions, query, fuse, settingKey]);
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
setSelectedIndex(prev => {
|
|
154
|
+
if (filteredEntries.length === 0)
|
|
155
|
+
return 0;
|
|
156
|
+
return Math.min(prev, filteredEntries.length - 1);
|
|
157
|
+
});
|
|
158
|
+
}, [filteredEntries.length]);
|
|
159
|
+
const open = useCallback((key, valueStartIndex) => {
|
|
160
|
+
if (mode === 'settings_value_completion' && settingKey === key) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
setSettingKey(key);
|
|
164
|
+
setMode('settings_value_completion');
|
|
165
|
+
setTriggerIndex(valueStartIndex);
|
|
166
|
+
setSelectedIndex(0);
|
|
167
|
+
}, [mode, setMode, setTriggerIndex, settingKey]);
|
|
168
|
+
const close = useCallback(() => {
|
|
169
|
+
if (mode === 'settings_value_completion') {
|
|
170
|
+
setMode('text');
|
|
171
|
+
setTriggerIndex(null);
|
|
172
|
+
setSelectedIndex(0);
|
|
173
|
+
setSettingKey(null);
|
|
174
|
+
}
|
|
175
|
+
}, [mode, setMode, setTriggerIndex]);
|
|
176
|
+
const moveUp = useCallback(() => {
|
|
177
|
+
setSelectedIndex(prev => {
|
|
178
|
+
if (filteredEntries.length === 0)
|
|
179
|
+
return 0;
|
|
180
|
+
return prev > 0 ? prev - 1 : filteredEntries.length - 1;
|
|
181
|
+
});
|
|
182
|
+
}, [filteredEntries.length]);
|
|
183
|
+
const moveDown = useCallback(() => {
|
|
184
|
+
setSelectedIndex(prev => {
|
|
185
|
+
if (filteredEntries.length === 0)
|
|
186
|
+
return 0;
|
|
187
|
+
return prev < filteredEntries.length - 1 ? prev + 1 : 0;
|
|
188
|
+
});
|
|
189
|
+
}, [filteredEntries.length]);
|
|
190
|
+
const getSelectedItem = useCallback(() => {
|
|
191
|
+
if (filteredEntries.length === 0)
|
|
192
|
+
return undefined;
|
|
193
|
+
const safeIndex = Math.min(selectedIndex, filteredEntries.length - 1);
|
|
194
|
+
return filteredEntries[safeIndex];
|
|
195
|
+
}, [filteredEntries, selectedIndex]);
|
|
196
|
+
const isNumericSettings = useMemo(() => {
|
|
197
|
+
return settingKey ? NUMBER_SETTING_KEYS.has(settingKey) : false;
|
|
198
|
+
}, [settingKey]);
|
|
199
|
+
return {
|
|
200
|
+
isOpen,
|
|
201
|
+
triggerIndex,
|
|
202
|
+
settingKey,
|
|
203
|
+
query,
|
|
204
|
+
filteredEntries,
|
|
205
|
+
selectedIndex,
|
|
206
|
+
open,
|
|
207
|
+
close,
|
|
208
|
+
moveUp,
|
|
209
|
+
moveDown,
|
|
210
|
+
getSelectedItem,
|
|
211
|
+
isNumericSettings,
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=use-settings-value-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-settings-value-completion.js","sourceRoot":"","sources":["../../source/hooks/use-settings-value-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAChE,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAQ3D,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAChC,mBAAmB;IACnB,gBAAgB;IAChB,qBAAqB;IACrB,eAAe;IACf,sBAAsB;IACtB,sBAAsB;IACtB,gBAAgB;IAChB,UAAU;CACb,CAAC,CAAC;AAEH,iEAAiE;AACjE,kFAAkF;AAClF,yDAAyD;AACzD,MAAM,wBAAwB,GAA6C;IACvE,uBAAuB,EAAE;QACrB,EAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAC;QACtD,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAC;QACrD,EAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAC;QAC5C,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAC;QAC1C,EAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAC;QACjD,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAC;KACnD;IACD,6BAA6B,EAAE;QAC3B,EAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAC;QACtD,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAC;QACrD,EAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAC;QAC5C,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAC;QAC1C,EAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAC;QACjD,EAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAC;KACnD;IACD,kBAAkB,EAAE;QAChB,EAAC,KAAK,EAAE,OAAO,EAAC;QAChB,EAAC,KAAK,EAAE,MAAM,EAAC;QACf,EAAC,KAAK,EAAE,MAAM,EAAC;QACf,EAAC,KAAK,EAAE,OAAO,EAAC;KACnB;IACD,+BAA+B,EAAE,CAAC,EAAC,KAAK,EAAE,MAAM,EAAC,EAAE,EAAC,KAAK,EAAE,OAAO,EAAC,CAAC;IACpE,0BAA0B,EAAE;QACxB,EAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,uCAAuC,EAAC;QACrE,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,2BAA2B,EAAC;KAC7D;IACD,mBAAmB,EAAE;QACjB,EAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,eAAe,EAAC;QAC1C,EAAC,KAAK,EAAE,KAAK,EAAC;QACd,EAAC,KAAK,EAAE,KAAK,EAAC;QACd,EAAC,KAAK,EAAE,GAAG,EAAC;QACZ,EAAC,KAAK,EAAE,KAAK,EAAC;QACd,EAAC,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAC;KAC3C;IACD,eAAe,EAAE;QACb,EAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAC;QACpC,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAC;QACtC,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAC;KACvC;IACD,sBAAsB,EAAE;QACpB,EAAC,KAAK,EAAE,KAAK,EAAC;QACd,EAAC,KAAK,EAAE,KAAK,EAAC;QACd,EAAC,KAAK,EAAE,MAAM,EAAC;KAClB;IACD,sBAAsB,EAAE;QACpB,EAAC,KAAK,EAAE,OAAO,EAAC;QAChB,EAAC,KAAK,EAAE,OAAO,EAAC;QAChB,EAAC,KAAK,EAAE,QAAQ,EAAC;KACpB;IACD,gBAAgB,EAAE;QACd,EAAC,KAAK,EAAE,IAAI,EAAC;QACb,EAAC,KAAK,EAAE,KAAK,EAAC;QACd,EAAC,KAAK,EAAE,KAAK,EAAC;KACjB;IACD,gBAAgB,EAAE;QACd,EAAC,KAAK,EAAE,IAAI,EAAC;QACb,EAAC,KAAK,EAAE,IAAI,EAAC;QACb,EAAC,KAAK,EAAE,IAAI,EAAC;KAChB;IACD,qBAAqB,EAAE;QACnB,EAAC,KAAK,EAAE,GAAG,EAAC;QACZ,EAAC,KAAK,EAAE,GAAG,EAAC;QACZ,EAAC,KAAK,EAAE,GAAG,EAAC;KACf;IACD,UAAU,EAAE;QACR,EAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAC;KACjD;CACJ,CAAC;AAEF,sCAAsC;AACtC,MAAM,UAAU,4BAA4B,CACxC,GAAW;IAEX,oEAAoE;IACpE,OAAO,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,oCAAoC,CAChD,WAAqC,EACrC,KAAa,EACb,IAAkC,EAClC,aAAqB,WAAW,EAChC,GAAY;IAEZ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE3D,6EAA6E;IAC7E,uEAAuE;IACvE,IACI,GAAG;QACH,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC;QAC5B,KAAK,CAAC,IAAI,EAAE;QACZ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,EAC9C,CAAC;QACC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnB,yDAAyD;YACzD,8BAA8B;YAC9B,OAAO,CAAC,OAAO,CAAC;gBACZ,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;gBACnB,WAAW,EAAE,cAAc;aAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,eAAgC,EAAE,EAAE;IAC3E,MAAM,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAC,GACrE,eAAe,EAAE,CAAC;IAEtB,MAAM,MAAM,GAAG,IAAI,KAAK,2BAA2B,CAAC;IAEpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE1D,oEAAoE;IACpE,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC9C,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACvB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACvB,IAAI,CAAC,MAAM,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAC3B,+DAA+D;QAC/D,KAAK,eAAe,CAAC;QACrB,OAAO,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;QACtB,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE;YAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;YAC9B,SAAS,EAAE,GAAG;SACjB,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,OAAO,oCAAoC,CACvC,cAAc,EACd,KAAK,EACL,IAAI,EACJ,WAAW,EACX,UAAU,IAAI,SAAS,CAC1B,CAAC;IACN,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACX,gBAAgB,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7B,MAAM,IAAI,GAAG,WAAW,CACpB,CAAC,GAAW,EAAE,eAAuB,EAAE,EAAE;QACrC,IAAI,IAAI,KAAK,2BAA2B,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YAC7D,OAAO;QACX,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACrC,eAAe,CAAC,eAAe,CAAC,CAAC;QACjC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,EACD,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,CAC/C,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3B,IAAI,IAAI,KAAK,2BAA2B,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChB,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,gBAAgB,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC3C,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,gBAAgB,CAAC,IAAI,CAAC,EAAE;YACpB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC3C,OAAO,IAAI,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7B,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC;IAErC,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,EAAE;QACnC,OAAO,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO;QACH,MAAM;QACN,YAAY;QACZ,UAAU;QACV,KAAK;QACL,eAAe;QACf,aAAa;QACb,IAAI;QACJ,KAAK;QACL,MAAM;QACN,QAAQ;QACR,eAAe;QACf,iBAAiB;KACpB,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-settings-value-completion.test.d.ts","sourceRoot":"","sources":["../../source/hooks/use-settings-value-completion.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import Fuse from 'fuse.js';
|
|
3
|
+
import { buildSettingValueSuggestions, filterSettingValueSuggestionsByQuery, } from './use-settings-value-completion.js';
|
|
4
|
+
test('buildSettingValueSuggestions returns enum suggestions for reasoningEffort', t => {
|
|
5
|
+
const result = buildSettingValueSuggestions('agent.reasoningEffort');
|
|
6
|
+
const values = result.map(r => r.value);
|
|
7
|
+
t.true(values.includes('low'));
|
|
8
|
+
t.true(values.includes('medium'));
|
|
9
|
+
t.true(values.includes('high'));
|
|
10
|
+
t.true(values.includes('default'));
|
|
11
|
+
});
|
|
12
|
+
test('buildSettingValueSuggestions returns boolean suggestions for boolean settings', t => {
|
|
13
|
+
const result = buildSettingValueSuggestions('logging.suppressConsoleOutput');
|
|
14
|
+
t.deepEqual(result.map(r => r.value).sort(), ['false', 'true']);
|
|
15
|
+
});
|
|
16
|
+
test('filterSettingValueSuggestionsByQuery filters by partial match', t => {
|
|
17
|
+
const suggestions = [
|
|
18
|
+
{ value: 'debug' },
|
|
19
|
+
{ value: 'info' },
|
|
20
|
+
{ value: 'warn' },
|
|
21
|
+
{ value: 'error' },
|
|
22
|
+
];
|
|
23
|
+
const fuse = new Fuse(suggestions, {
|
|
24
|
+
keys: ['value', 'description'],
|
|
25
|
+
threshold: 0.4,
|
|
26
|
+
});
|
|
27
|
+
const result = filterSettingValueSuggestionsByQuery(suggestions, 'err', fuse, 10);
|
|
28
|
+
t.true(result.some(r => r.value === 'error'));
|
|
29
|
+
});
|
|
30
|
+
test('filterSettingValueSuggestionsByQuery includes custom number value for number settings', t => {
|
|
31
|
+
const suggestions = [
|
|
32
|
+
{ value: '100' },
|
|
33
|
+
{ value: '200' },
|
|
34
|
+
];
|
|
35
|
+
const fuse = new Fuse(suggestions, {
|
|
36
|
+
keys: ['value', 'description'],
|
|
37
|
+
threshold: 0.4,
|
|
38
|
+
});
|
|
39
|
+
const result = filterSettingValueSuggestionsByQuery(suggestions, '150', fuse, 10, 'ui.historySize');
|
|
40
|
+
t.true(result.length >= 1);
|
|
41
|
+
t.is(result[0]?.value, '150');
|
|
42
|
+
t.is(result[0]?.description, 'Custom value');
|
|
43
|
+
});
|
|
44
|
+
test('filterSettingValueSuggestionsByQuery does not include custom number if already present', t => {
|
|
45
|
+
const suggestions = [
|
|
46
|
+
{ value: '100' },
|
|
47
|
+
{ value: '200' },
|
|
48
|
+
];
|
|
49
|
+
const fuse = new Fuse(suggestions, {
|
|
50
|
+
keys: ['value', 'description'],
|
|
51
|
+
threshold: 0.4,
|
|
52
|
+
});
|
|
53
|
+
const result = filterSettingValueSuggestionsByQuery(suggestions, '100', fuse, 10, 'ui.historySize');
|
|
54
|
+
t.true(result.length >= 1);
|
|
55
|
+
t.is(result[0]?.value, '100');
|
|
56
|
+
t.not(result[0]?.description, 'Custom value');
|
|
57
|
+
t.false(result.some(r => r.description === 'Custom value'));
|
|
58
|
+
});
|
|
59
|
+
test('filterSettingValueSuggestionsByQuery does not include non-number custom values even for number settings', t => {
|
|
60
|
+
const suggestions = [];
|
|
61
|
+
const fuse = new Fuse(suggestions, {});
|
|
62
|
+
const result = filterSettingValueSuggestionsByQuery(suggestions, 'abc', fuse, 10, 'ui.historySize');
|
|
63
|
+
t.is(result.length, 0);
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=use-settings-value-completion.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-settings-value-completion.test.js","sourceRoot":"","sources":["../../source/hooks/use-settings-value-completion.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-agent-client.d.ts","sourceRoot":"","sources":["../../source/lib/openai-agent-client.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAC,KAAK,4BAA4B,EAAC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-agent-client.d.ts","sourceRoot":"","sources":["../../source/lib/openai-agent-client.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAC,KAAK,4BAA4B,EAAC,MAAM,2BAA2B,CAAC;AAI5E,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIpE;;;GAGG;AACH,qBAAa,iBAAiB;;gBA4Bd,EACR,KAAK,EACL,eAAe,EACf,QAAQ,EACR,aAAa,EACb,IAAI,GACP,EAAE;QACC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;QAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,IAAI,EAAE;YACF,MAAM,EAAE,eAAe,CAAC;YACxB,QAAQ,EAAE,gBAAgB,CAAC;YAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;SACvC,CAAC;KACL;IA4BD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO7B,kBAAkB,CACd,MAAM,CAAC,EAAE,4BAA4B,GAAG,SAAS,GAClD,IAAI;IAQP,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAS1C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUnC,WAAW,IAAI,MAAM;IAIrB,kBAAkB,CACd,WAAW,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,GAAG,EACX,UAAU,CAAC,EAAE,MAAM,KAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAC5B,MAAM,IAAI;IAgDb,gBAAgB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAc5C;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb,kBAAkB,IAAI,IAAI;IAqBpB,WAAW,CACb,SAAS,EAAE,MAAM,GAAG,GAAG,EAAE,EACzB,EAAC,kBAAkB,EAAC,GAAE;QAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAM,GAChE,OAAO,CAAC,GAAG,CAAC;IAgET,WAAW,CACb,KAAK,EAAE,GAAG,EACV,EAAC,kBAAkB,EAAC,GAAE;QAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAM,GAChE,OAAO,CAAC,GAAG,CAAC;IAmBT,iBAAiB,CACnB,KAAK,EAAE,GAAG,EACV,EAAC,kBAAkB,EAAC,GAAE;QAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAM,GAChE,OAAO,CAAC,GAAG,CAAC;IAoJT,IAAI,CACN,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,4BAA4B,GAAG,SAAS,CAAC;QAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;KACpB,GACP,OAAO,CAAC,MAAM,CAAC;CAkbrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-agent-client.flex-tier.test.d.ts","sourceRoot":"","sources":["../../source/lib/openai-agent-client.flex-tier.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { SettingsService } from '../services/settings-service.js';
|
|
5
|
+
import { SETTING_KEYS } from '../services/settings-service.js';
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const TEST_BASE_DIR = path.join(__dirname, '../../test-settings-flex');
|
|
8
|
+
let testCounter = 0;
|
|
9
|
+
const getTestSettingsDir = () => {
|
|
10
|
+
testCounter += 1;
|
|
11
|
+
return path.join(TEST_BASE_DIR, `test-${testCounter}`);
|
|
12
|
+
};
|
|
13
|
+
test('OpenAI Flex Service Tier setting can be enabled', t => {
|
|
14
|
+
const settings = new SettingsService({
|
|
15
|
+
settingsDir: getTestSettingsDir(),
|
|
16
|
+
disableFilePersistence: true,
|
|
17
|
+
disableLogging: true,
|
|
18
|
+
});
|
|
19
|
+
// Enable Flex Service Tier
|
|
20
|
+
settings.set(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER, true);
|
|
21
|
+
// Verify the setting is stored correctly
|
|
22
|
+
const value = settings.get(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER);
|
|
23
|
+
t.is(value, true);
|
|
24
|
+
});
|
|
25
|
+
test('OpenAI Flex Service Tier setting is disabled by default', t => {
|
|
26
|
+
const settings = new SettingsService({
|
|
27
|
+
settingsDir: getTestSettingsDir(),
|
|
28
|
+
disableFilePersistence: true,
|
|
29
|
+
disableLogging: true,
|
|
30
|
+
});
|
|
31
|
+
// Verify the default value is false
|
|
32
|
+
const value = settings.get(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER);
|
|
33
|
+
t.is(value, false);
|
|
34
|
+
});
|
|
35
|
+
test('OpenAI Flex Service Tier setting can be disabled', t => {
|
|
36
|
+
const settings = new SettingsService({
|
|
37
|
+
settingsDir: getTestSettingsDir(),
|
|
38
|
+
disableFilePersistence: true,
|
|
39
|
+
disableLogging: true,
|
|
40
|
+
});
|
|
41
|
+
// Enable then disable
|
|
42
|
+
settings.set(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER, true);
|
|
43
|
+
settings.set(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER, false);
|
|
44
|
+
// Verify the setting is false
|
|
45
|
+
const value = settings.get(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER);
|
|
46
|
+
t.is(value, false);
|
|
47
|
+
});
|
|
48
|
+
test('OpenAI Flex Service Tier setting is runtime modifiable', t => {
|
|
49
|
+
const settings = new SettingsService({
|
|
50
|
+
settingsDir: getTestSettingsDir(),
|
|
51
|
+
disableFilePersistence: true,
|
|
52
|
+
disableLogging: true,
|
|
53
|
+
});
|
|
54
|
+
// Verify the setting is runtime modifiable
|
|
55
|
+
t.true(settings.isRuntimeModifiable(SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER));
|
|
56
|
+
});
|
|
57
|
+
test('OpenAI Flex Service Tier setting is included in getAll()', t => {
|
|
58
|
+
const settings = new SettingsService({
|
|
59
|
+
settingsDir: getTestSettingsDir(),
|
|
60
|
+
disableFilePersistence: true,
|
|
61
|
+
disableLogging: true,
|
|
62
|
+
});
|
|
63
|
+
const allSettings = settings.getAll();
|
|
64
|
+
// Verify the setting is present in the returned object
|
|
65
|
+
t.truthy(allSettings.agent.useFlexServiceTier);
|
|
66
|
+
t.is(allSettings.agent.useFlexServiceTier.value, false);
|
|
67
|
+
// Source can be 'default' or 'config' depending on whether a settings file exists
|
|
68
|
+
t.true(['default', 'config'].includes(allSettings.agent.useFlexServiceTier.source));
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=openai-agent-client.flex-tier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-agent-client.flex-tier.test.js","sourceRoot":"","sources":["../../source/lib/openai-agent-client.flex-tier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,7 @@ import { OpenRouterError } from '../providers/openrouter.js';
|
|
|
4
4
|
import { OpenAICompatibleError } from '../providers/openai-compatible/api.js';
|
|
5
5
|
import { getProvider } from '../providers/index.js';
|
|
6
6
|
import { randomUUID } from 'node:crypto';
|
|
7
|
-
import { getAgentDefinition } from '../agent.js';
|
|
8
|
-
import fs from 'fs';
|
|
9
|
-
import path from 'path';
|
|
10
|
-
import os from 'os';
|
|
7
|
+
import { getAgentDefinition, getEnvInfo, getAgentsInstructions } from '../agent.js';
|
|
11
8
|
import { normalizeToolInput, wrapToolInvoke } from './tool-invoke.js';
|
|
12
9
|
import { createEditorImpl } from './editor-impl.js';
|
|
13
10
|
import { ConversationStore } from '../services/conversation-store.js';
|
|
@@ -22,6 +19,8 @@ export class OpenAIAgentClient {
|
|
|
22
19
|
#reasoningEffort;
|
|
23
20
|
#temperature;
|
|
24
21
|
#provider;
|
|
22
|
+
#mentorProvider = null;
|
|
23
|
+
#mentorRunner = null;
|
|
25
24
|
#maxTurns;
|
|
26
25
|
#retryAttempts;
|
|
27
26
|
#currentAbortController = null;
|
|
@@ -52,7 +51,7 @@ export class OpenAIAgentClient {
|
|
|
52
51
|
this.#maxTurns = maxTurns ?? 20;
|
|
53
52
|
this.#retryAttempts = retryAttempts ?? 2;
|
|
54
53
|
this.#agent = this.#createAgent({ model, reasoningEffort });
|
|
55
|
-
this.#runner = this.#createRunner();
|
|
54
|
+
this.#runner = this.#createRunner(this.#provider);
|
|
56
55
|
this.#logger.info('OpenAI Agent Client initialized', {
|
|
57
56
|
model: model || this.#settings.get('agent.model'),
|
|
58
57
|
reasoningEffort: reasoningEffort ?? 'default',
|
|
@@ -89,7 +88,7 @@ export class OpenAIAgentClient {
|
|
|
89
88
|
model: this.#model,
|
|
90
89
|
reasoningEffort: this.#reasoningEffort,
|
|
91
90
|
});
|
|
92
|
-
this.#runner = this.#createRunner();
|
|
91
|
+
this.#runner = this.#createRunner(this.#provider);
|
|
93
92
|
}
|
|
94
93
|
getProvider() {
|
|
95
94
|
return this.#provider;
|
|
@@ -120,8 +119,8 @@ export class OpenAIAgentClient {
|
|
|
120
119
|
}
|
|
121
120
|
return null;
|
|
122
121
|
}
|
|
123
|
-
#createRunner() {
|
|
124
|
-
const providerDef = getProvider(
|
|
122
|
+
#createRunner(providerId) {
|
|
123
|
+
const providerDef = getProvider(providerId);
|
|
125
124
|
if (!providerDef?.createRunner) {
|
|
126
125
|
return null;
|
|
127
126
|
}
|
|
@@ -133,6 +132,15 @@ export class OpenAIAgentClient {
|
|
|
133
132
|
setRetryCallback(callback) {
|
|
134
133
|
this.#retryCallback = callback;
|
|
135
134
|
}
|
|
135
|
+
#refreshAgent() {
|
|
136
|
+
this.#agent = this.#createAgent({
|
|
137
|
+
model: this.#model,
|
|
138
|
+
reasoningEffort: this.#reasoningEffort,
|
|
139
|
+
temperature: this.#temperature,
|
|
140
|
+
});
|
|
141
|
+
// Null out mentor agent so it also gets fresh instructions on next use
|
|
142
|
+
this.#mentorAgent = null;
|
|
143
|
+
}
|
|
136
144
|
/**
|
|
137
145
|
* Abort the current running stream/operation
|
|
138
146
|
*/
|
|
@@ -152,17 +160,29 @@ export class OpenAIAgentClient {
|
|
|
152
160
|
if (providerDef?.clearConversations) {
|
|
153
161
|
providerDef.clearConversations();
|
|
154
162
|
}
|
|
163
|
+
this.#refreshAgent();
|
|
155
164
|
// Also clear mentor conversation
|
|
156
165
|
if (this.#mentorStore) {
|
|
157
166
|
this.#mentorStore.clear();
|
|
158
167
|
}
|
|
159
168
|
this.#mentorPreviousResponseId = null;
|
|
160
|
-
this.#mentorAgent = null;
|
|
161
169
|
this.#mentorStore = null;
|
|
170
|
+
this.#mentorRunner = null;
|
|
171
|
+
this.#mentorProvider = null;
|
|
172
|
+
this.#mentorAgent = null;
|
|
173
|
+
this.#logger.info('Conversation and agent refreshed');
|
|
162
174
|
}
|
|
163
175
|
async startStream(userInput, { previousResponseId } = {}) {
|
|
164
176
|
// Abort any previous operation
|
|
165
177
|
this.abort();
|
|
178
|
+
// Refresh agent instructions for the first message of a session to ensure
|
|
179
|
+
// directory structure and AGENTS.md content are up to date.
|
|
180
|
+
const isFirstMessage = !previousResponseId &&
|
|
181
|
+
(!Array.isArray(userInput) ||
|
|
182
|
+
(userInput.length > 0 && userInput.length <= 1));
|
|
183
|
+
if (isFirstMessage) {
|
|
184
|
+
this.#refreshAgent();
|
|
185
|
+
}
|
|
166
186
|
// Create correlation ID for this stream
|
|
167
187
|
this.#currentCorrelationId = randomUUID();
|
|
168
188
|
this.#logger.setCorrelationId(this.#currentCorrelationId);
|
|
@@ -231,29 +251,32 @@ export class OpenAIAgentClient {
|
|
|
231
251
|
}
|
|
232
252
|
return this.#executeWithRetry(() => this.#runAgent(this.#agent, state, options));
|
|
233
253
|
}
|
|
234
|
-
#
|
|
254
|
+
#runAgentWithProvider(providerId, runner, agent, input, options) {
|
|
235
255
|
// The Agents SDK enables tracing by default and exports spans to OpenAI.
|
|
236
256
|
// When using non-OpenAI providers (e.g., OpenRouter), this export can fail noisily
|
|
237
257
|
// (e.g., 503 errors). Disable tracing per-run for any non-OpenAI provider.
|
|
238
258
|
const effectiveOptions = options ? { ...options } : {};
|
|
239
|
-
if (
|
|
259
|
+
if (providerId !== 'openai') {
|
|
240
260
|
effectiveOptions.tracingDisabled = true;
|
|
241
261
|
}
|
|
242
262
|
// Check if provider is configured but runner failed to initialize
|
|
243
|
-
if (!
|
|
244
|
-
const providerDef = getProvider(
|
|
245
|
-
const providerLabel = providerDef?.label ||
|
|
263
|
+
if (!runner && providerId !== 'openai') {
|
|
264
|
+
const providerDef = getProvider(providerId);
|
|
265
|
+
const providerLabel = providerDef?.label || providerId;
|
|
246
266
|
throw new Error(`${providerLabel} is configured but could not be initialized. ` +
|
|
247
267
|
`Please check that all required credentials are set. ` +
|
|
248
268
|
`For OpenRouter, set OPENROUTER_API_KEY environment variable. ` +
|
|
249
269
|
`Get your API key from: https://openrouter.ai/keys`);
|
|
250
270
|
}
|
|
251
271
|
// Use runner if available (custom provider), otherwise use run() directly (OpenAI)
|
|
252
|
-
if (
|
|
253
|
-
return
|
|
272
|
+
if (runner) {
|
|
273
|
+
return runner.run(agent, input, effectiveOptions);
|
|
254
274
|
}
|
|
255
275
|
return run(agent, input, effectiveOptions);
|
|
256
276
|
}
|
|
277
|
+
#runAgent(agent, input, options) {
|
|
278
|
+
return this.#runAgentWithProvider(this.#provider, this.#runner, agent, input, options);
|
|
279
|
+
}
|
|
257
280
|
async #executeWithRetry(operation, retries = this.#retryAttempts) {
|
|
258
281
|
try {
|
|
259
282
|
return await operation();
|
|
@@ -394,26 +417,12 @@ export class OpenAIAgentClient {
|
|
|
394
417
|
throw error; // Propagate error
|
|
395
418
|
}
|
|
396
419
|
}
|
|
397
|
-
#getAgentsInstructions() {
|
|
398
|
-
const agentsPath = path.join(process.cwd(), 'AGENTS.md');
|
|
399
|
-
if (!fs.existsSync(agentsPath))
|
|
400
|
-
return '';
|
|
401
|
-
try {
|
|
402
|
-
const contents = fs.readFileSync(agentsPath, 'utf-8').trim();
|
|
403
|
-
return `\n\nAGENTS.md contents:\n${contents}`;
|
|
404
|
-
}
|
|
405
|
-
catch (e) {
|
|
406
|
-
return `\n\nFailed to read AGENTS.md: ${e.message}`;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
#getEnvInfo() {
|
|
410
|
-
return `OS: ${os.type()} ${os.release()} (${os.platform()}); shell: ${this.#settings.get('app.shellPath') || 'unknown'}; cwd: ${process.cwd()}`;
|
|
411
|
-
}
|
|
412
420
|
#createMentor = async (question) => {
|
|
413
421
|
const mentorModel = this.#settings.get('agent.mentorModel');
|
|
414
422
|
if (!mentorModel) {
|
|
415
423
|
throw new Error('Mentor model is not configured');
|
|
416
424
|
}
|
|
425
|
+
const mentorProvider = this.#settings.get('agent.mentorProvider') ?? this.#provider;
|
|
417
426
|
const mentorMode = this.#settings.get('app.mentorMode');
|
|
418
427
|
// Different instructions based on mode
|
|
419
428
|
let baseInstructions = mentorMode
|
|
@@ -427,8 +436,24 @@ export class OpenAIAgentClient {
|
|
|
427
436
|
'Be concise. Push back hard, but don\'t block unnecessarily.'
|
|
428
437
|
: 'You are a helpful mentor assistant. Provide advice and guidance on technical problems. Be concise and actionable.';
|
|
429
438
|
// Add environment info and AGENTS.md context
|
|
430
|
-
const
|
|
431
|
-
|
|
439
|
+
const envInfo = getEnvInfo(this.#settings, this.#executionContext);
|
|
440
|
+
const cwd = this.#executionContext?.getCwd() ?? process.cwd();
|
|
441
|
+
const agentsInstructions = this.#executionContext?.isRemote()
|
|
442
|
+
? ''
|
|
443
|
+
: getAgentsInstructions(cwd);
|
|
444
|
+
const instructions = `${baseInstructions}\n\nEnvironment: ${envInfo}${agentsInstructions}`;
|
|
445
|
+
// If mentor provider changed, reset mentor state to avoid mixing stores/prev ids across providers
|
|
446
|
+
if (this.#mentorProvider !== mentorProvider) {
|
|
447
|
+
this.#mentorAgent = null;
|
|
448
|
+
this.#mentorStore = null;
|
|
449
|
+
this.#mentorPreviousResponseId = null;
|
|
450
|
+
this.#mentorRunner = null;
|
|
451
|
+
this.#mentorProvider = mentorProvider;
|
|
452
|
+
}
|
|
453
|
+
// Initialize mentor runner/agent and conversation store if needed
|
|
454
|
+
if (!this.#mentorRunner && mentorProvider !== 'openai') {
|
|
455
|
+
this.#mentorRunner = this.#createRunner(mentorProvider);
|
|
456
|
+
}
|
|
432
457
|
if (!this.#mentorAgent) {
|
|
433
458
|
const reasoningEffort = this.#settings.get('agent.mentorReasoningEffort');
|
|
434
459
|
const modelSettings = {};
|
|
@@ -454,13 +479,13 @@ export class OpenAIAgentClient {
|
|
|
454
479
|
// Determine input based on provider
|
|
455
480
|
// OpenAI uses previousResponseId for server-side history
|
|
456
481
|
// Others need full conversation history from store
|
|
457
|
-
const input =
|
|
482
|
+
const input = mentorProvider !== 'openai'
|
|
458
483
|
? this.#mentorStore.getHistory()
|
|
459
484
|
: question;
|
|
460
|
-
const result = await this.#
|
|
485
|
+
const result = await this.#runAgentWithProvider(mentorProvider, this.#mentorRunner, this.#mentorAgent, input, {
|
|
461
486
|
stream: false,
|
|
462
487
|
maxTurns: 1,
|
|
463
|
-
...(
|
|
488
|
+
...(mentorProvider === 'openai' && this.#mentorPreviousResponseId
|
|
464
489
|
? { previousResponseId: this.#mentorPreviousResponseId }
|
|
465
490
|
: {}),
|
|
466
491
|
});
|
|
@@ -630,6 +655,16 @@ export class OpenAIAgentClient {
|
|
|
630
655
|
Number.isFinite(resolvedTemperature)) {
|
|
631
656
|
modelSettings.temperature = resolvedTemperature;
|
|
632
657
|
}
|
|
658
|
+
// OpenAI Flex Service Tier: only pass when enabled and using OpenAI provider
|
|
659
|
+
// This reduces costs by using the flex service tier for lower priority requests
|
|
660
|
+
// See: https://platform.openai.com/docs/guides/service-tier
|
|
661
|
+
const useFlexServiceTier = this.#settings.get('agent.useFlexServiceTier');
|
|
662
|
+
if (useFlexServiceTier && this.#provider === 'openai') {
|
|
663
|
+
modelSettings.providerData = {
|
|
664
|
+
...(modelSettings.providerData || {}),
|
|
665
|
+
service_tier: 'flex',
|
|
666
|
+
};
|
|
667
|
+
}
|
|
633
668
|
const agent = new Agent({
|
|
634
669
|
name,
|
|
635
670
|
model: resolvedModel,
|