@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.
Files changed (294) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +9 -5
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agent.lite-mode.test.d.ts +2 -0
  6. package/dist/agent.lite-mode.test.d.ts.map +1 -0
  7. package/dist/agent.lite-mode.test.js +39 -0
  8. package/dist/agent.lite-mode.test.js.map +1 -0
  9. package/dist/app.d.ts.map +1 -1
  10. package/dist/app.js +3 -1
  11. package/dist/app.js.map +1 -1
  12. package/dist/components/ApprovalPrompt.d.ts.map +1 -1
  13. package/dist/components/ApprovalPrompt.js +26 -6
  14. package/dist/components/ApprovalPrompt.js.map +1 -1
  15. package/dist/components/BottomArea.js +1 -1
  16. package/dist/components/BottomArea.js.map +1 -1
  17. package/dist/components/ChatMessage.js +1 -1
  18. package/dist/components/ChatMessage.js.map +1 -1
  19. package/dist/components/CommandMessage.js +7 -7
  20. package/dist/components/CommandMessage.js.map +1 -1
  21. package/dist/components/ErrorBoundary.js +2 -2
  22. package/dist/components/ErrorBoundary.js.map +1 -1
  23. package/dist/components/Input/PopupManager.d.ts +10 -0
  24. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  25. package/dist/components/Input/PopupManager.js +4 -2
  26. package/dist/components/Input/PopupManager.js.map +1 -1
  27. package/dist/components/InputBox.d.ts.map +1 -1
  28. package/dist/components/InputBox.js +102 -18
  29. package/dist/components/InputBox.js.map +1 -1
  30. package/dist/components/LiveResponse.d.ts +1 -1
  31. package/dist/components/LiveResponse.js +1 -1
  32. package/dist/components/MarkdownRenderer.js +13 -14
  33. package/dist/components/MarkdownRenderer.js.map +1 -1
  34. package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
  35. package/dist/components/ModelSelectionMenu.js +11 -11
  36. package/dist/components/ModelSelectionMenu.js.map +1 -1
  37. package/dist/components/PathSelectionMenu.js +3 -3
  38. package/dist/components/PathSelectionMenu.js.map +1 -1
  39. package/dist/components/SettingsSelectionMenu.d.ts +1 -0
  40. package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
  41. package/dist/components/SettingsSelectionMenu.js +127 -14
  42. package/dist/components/SettingsSelectionMenu.js.map +1 -1
  43. package/dist/components/SettingsSelectionMenu.test.d.ts +2 -0
  44. package/dist/components/SettingsSelectionMenu.test.d.ts.map +1 -0
  45. package/dist/components/SettingsSelectionMenu.test.js +40 -0
  46. package/dist/components/SettingsSelectionMenu.test.js.map +1 -0
  47. package/dist/components/SettingsValueSelectionMenu.d.ts +12 -0
  48. package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -0
  49. package/dist/components/SettingsValueSelectionMenu.js +63 -0
  50. package/dist/components/SettingsValueSelectionMenu.js.map +1 -0
  51. package/dist/components/SettingsValueSelectionMenu.test.d.ts +2 -0
  52. package/dist/components/SettingsValueSelectionMenu.test.d.ts.map +1 -0
  53. package/dist/components/SettingsValueSelectionMenu.test.js +38 -0
  54. package/dist/components/SettingsValueSelectionMenu.test.js.map +1 -0
  55. package/dist/components/SlashCommandMenu.js +2 -2
  56. package/dist/components/SlashCommandMenu.js.map +1 -1
  57. package/dist/components/TextInput.d.ts.map +1 -1
  58. package/dist/components/TextInput.js +2 -1
  59. package/dist/components/TextInput.js.map +1 -1
  60. package/dist/components/TextInput.test.js.map +1 -1
  61. package/dist/context/InputContext.d.ts +1 -1
  62. package/dist/context/InputContext.d.ts.map +1 -1
  63. package/dist/context/InputContext.js.map +1 -1
  64. package/dist/debug_ask_mentor.d.ts +2 -0
  65. package/dist/debug_ask_mentor.d.ts.map +1 -0
  66. package/dist/debug_ask_mentor.js +73 -0
  67. package/dist/debug_ask_mentor.js.map +1 -0
  68. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  69. package/dist/hooks/use-model-selection.js +7 -3
  70. package/dist/hooks/use-model-selection.js.map +1 -1
  71. package/dist/hooks/use-settings-completion.d.ts +1 -1
  72. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  73. package/dist/hooks/use-settings-completion.js +70 -10
  74. package/dist/hooks/use-settings-completion.js.map +1 -1
  75. package/dist/hooks/use-settings-completion.test.js +17 -10
  76. package/dist/hooks/use-settings-completion.test.js.map +1 -1
  77. package/dist/hooks/use-settings-value-completion.d.ts +23 -0
  78. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -0
  79. package/dist/hooks/use-settings-value-completion.js +214 -0
  80. package/dist/hooks/use-settings-value-completion.js.map +1 -0
  81. package/dist/hooks/use-settings-value-completion.test.d.ts +2 -0
  82. package/dist/hooks/use-settings-value-completion.test.d.ts.map +1 -0
  83. package/dist/hooks/use-settings-value-completion.test.js +65 -0
  84. package/dist/hooks/use-settings-value-completion.test.js.map +1 -0
  85. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  86. package/dist/lib/openai-agent-client.flex-tier.test.d.ts +2 -0
  87. package/dist/lib/openai-agent-client.flex-tier.test.d.ts.map +1 -0
  88. package/dist/lib/openai-agent-client.flex-tier.test.js +70 -0
  89. package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -0
  90. package/dist/lib/openai-agent-client.js +71 -36
  91. package/dist/lib/openai-agent-client.js.map +1 -1
  92. package/dist/lib/tool-invoke.test.js +1 -1
  93. package/dist/lib/tool-invoke.test.js.map +1 -1
  94. package/dist/modes/companion/command-index.d.ts +26 -0
  95. package/dist/modes/companion/command-index.d.ts.map +1 -0
  96. package/dist/modes/companion/command-index.js +50 -0
  97. package/dist/modes/companion/command-index.js.map +1 -0
  98. package/dist/modes/companion/command-index.test.d.ts +2 -0
  99. package/dist/modes/companion/command-index.test.d.ts.map +1 -0
  100. package/dist/modes/companion/command-index.test.js +86 -0
  101. package/dist/modes/companion/command-index.test.js.map +1 -0
  102. package/dist/modes/companion/companion-app.d.ts +12 -0
  103. package/dist/modes/companion/companion-app.d.ts.map +1 -0
  104. package/dist/modes/companion/companion-app.js +297 -0
  105. package/dist/modes/companion/companion-app.js.map +1 -0
  106. package/dist/modes/companion/companion-session.d.ts +63 -0
  107. package/dist/modes/companion/companion-session.d.ts.map +1 -0
  108. package/dist/modes/companion/companion-session.js +146 -0
  109. package/dist/modes/companion/companion-session.js.map +1 -0
  110. package/dist/modes/companion/companion-session.test.d.ts +2 -0
  111. package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
  112. package/dist/modes/companion/companion-session.test.js +28 -0
  113. package/dist/modes/companion/companion-session.test.js.map +1 -0
  114. package/dist/modes/companion/components/status-bar.d.ts +13 -0
  115. package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
  116. package/dist/modes/companion/components/status-bar.js +26 -0
  117. package/dist/modes/companion/components/status-bar.js.map +1 -0
  118. package/dist/modes/companion/context-buffer.d.ts +65 -0
  119. package/dist/modes/companion/context-buffer.d.ts.map +1 -0
  120. package/dist/modes/companion/context-buffer.js +156 -0
  121. package/dist/modes/companion/context-buffer.js.map +1 -0
  122. package/dist/modes/companion/context-buffer.test.d.ts +2 -0
  123. package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
  124. package/dist/modes/companion/context-buffer.test.js +154 -0
  125. package/dist/modes/companion/context-buffer.test.js.map +1 -0
  126. package/dist/modes/companion/event-detector.d.ts +46 -0
  127. package/dist/modes/companion/event-detector.d.ts.map +1 -0
  128. package/dist/modes/companion/event-detector.js +169 -0
  129. package/dist/modes/companion/event-detector.js.map +1 -0
  130. package/dist/modes/companion/event-detector.test.d.ts +2 -0
  131. package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
  132. package/dist/modes/companion/event-detector.test.js +121 -0
  133. package/dist/modes/companion/event-detector.test.js.map +1 -0
  134. package/dist/modes/companion/index.d.ts +33 -0
  135. package/dist/modes/companion/index.d.ts.map +1 -0
  136. package/dist/modes/companion/index.js +21 -0
  137. package/dist/modes/companion/index.js.map +1 -0
  138. package/dist/modes/companion/input-key-mapper.d.ts +3 -0
  139. package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
  140. package/dist/modes/companion/input-key-mapper.js +31 -0
  141. package/dist/modes/companion/input-key-mapper.js.map +1 -0
  142. package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
  143. package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
  144. package/dist/modes/companion/input-key-mapper.test.js +26 -0
  145. package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
  146. package/dist/modes/companion/input-parser.d.ts +53 -0
  147. package/dist/modes/companion/input-parser.d.ts.map +1 -0
  148. package/dist/modes/companion/input-parser.js +114 -0
  149. package/dist/modes/companion/input-parser.js.map +1 -0
  150. package/dist/modes/companion/input-parser.test.d.ts +2 -0
  151. package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
  152. package/dist/modes/companion/input-parser.test.js +123 -0
  153. package/dist/modes/companion/input-parser.test.js.map +1 -0
  154. package/dist/modes/companion/mode-manager.d.ts +41 -0
  155. package/dist/modes/companion/mode-manager.d.ts.map +1 -0
  156. package/dist/modes/companion/mode-manager.js +56 -0
  157. package/dist/modes/companion/mode-manager.js.map +1 -0
  158. package/dist/modes/companion/mode-manager.test.d.ts +2 -0
  159. package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
  160. package/dist/modes/companion/mode-manager.test.js +65 -0
  161. package/dist/modes/companion/mode-manager.test.js.map +1 -0
  162. package/dist/modes/companion/output-classifier.d.ts +15 -0
  163. package/dist/modes/companion/output-classifier.d.ts.map +1 -0
  164. package/dist/modes/companion/output-classifier.js +77 -0
  165. package/dist/modes/companion/output-classifier.js.map +1 -0
  166. package/dist/modes/companion/output-classifier.test.d.ts +2 -0
  167. package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
  168. package/dist/modes/companion/output-classifier.test.js +133 -0
  169. package/dist/modes/companion/output-classifier.test.js.map +1 -0
  170. package/dist/modes/companion/pty-wrapper.d.ts +46 -0
  171. package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
  172. package/dist/modes/companion/pty-wrapper.js +143 -0
  173. package/dist/modes/companion/pty-wrapper.js.map +1 -0
  174. package/dist/modes/companion/safety-classifier.d.ts +31 -0
  175. package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
  176. package/dist/modes/companion/safety-classifier.js +140 -0
  177. package/dist/modes/companion/safety-classifier.js.map +1 -0
  178. package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
  179. package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
  180. package/dist/modes/companion/safety-classifier.test.js +151 -0
  181. package/dist/modes/companion/safety-classifier.test.js.map +1 -0
  182. package/dist/modes/companion/summarizer.d.ts +24 -0
  183. package/dist/modes/companion/summarizer.d.ts.map +1 -0
  184. package/dist/modes/companion/summarizer.js +132 -0
  185. package/dist/modes/companion/summarizer.js.map +1 -0
  186. package/dist/modes/companion/terminal-history.d.ts +27 -0
  187. package/dist/modes/companion/terminal-history.d.ts.map +1 -0
  188. package/dist/modes/companion/terminal-history.js +142 -0
  189. package/dist/modes/companion/terminal-history.js.map +1 -0
  190. package/dist/prompts/simple-mentor.md +8 -0
  191. package/dist/providers/openai-compatible/model.d.ts.map +1 -1
  192. package/dist/providers/openai-compatible/model.js +13 -2
  193. package/dist/providers/openai-compatible/model.js.map +1 -1
  194. package/dist/providers/openai-compatible/reasoning-content.test.js +2 -2
  195. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  196. package/dist/providers/openrouter/reasoning-content.test.js +2 -2
  197. package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
  198. package/dist/providers/openrouter.test.js +30 -21
  199. package/dist/providers/openrouter.test.js.map +1 -1
  200. package/dist/services/check_mock.d.ts +2 -0
  201. package/dist/services/check_mock.d.ts.map +1 -0
  202. package/dist/services/check_mock.js +22 -0
  203. package/dist/services/check_mock.js.map +1 -0
  204. package/dist/services/conversation-service.test.d.ts +2 -0
  205. package/dist/services/conversation-service.test.d.ts.map +1 -0
  206. package/dist/services/conversation-service.test.js +149 -183
  207. package/dist/services/conversation-service.test.js.map +1 -0
  208. package/dist/services/conversation-store.test.js +12 -11
  209. package/dist/services/conversation-store.test.js.map +1 -1
  210. package/dist/services/settings-service.d.ts +8 -2
  211. package/dist/services/settings-service.d.ts.map +1 -1
  212. package/dist/services/settings-service.js +24 -0
  213. package/dist/services/settings-service.js.map +1 -1
  214. package/dist/tools/ask-mentor.d.ts +1 -1
  215. package/dist/tools/ask-mentor.d.ts.map +1 -1
  216. package/dist/tools/ask-mentor.js +1 -0
  217. package/dist/tools/ask-mentor.js.map +1 -1
  218. package/dist/tools/find-files.d.ts +2 -2
  219. package/dist/tools/find-files.js +2 -2
  220. package/dist/tools/find-files.js.map +1 -1
  221. package/dist/tools/find-files.test.js +15 -0
  222. package/dist/tools/find-files.test.js.map +1 -1
  223. package/dist/tools/grep.d.ts +1 -1
  224. package/dist/tools/grep.js +1 -1
  225. package/dist/tools/grep.js.map +1 -1
  226. package/dist/tools/read-file.d.ts +2 -2
  227. package/dist/tools/read-file.d.ts.map +1 -1
  228. package/dist/tools/read-file.js +14 -11
  229. package/dist/tools/read-file.js.map +1 -1
  230. package/dist/tools/read-file.test.js +37 -19
  231. package/dist/tools/read-file.test.js.map +1 -1
  232. package/dist/tools/search-replace.d.ts +1 -1
  233. package/dist/tools/search-replace.d.ts.map +1 -1
  234. package/dist/tools/search-replace.js +129 -1
  235. package/dist/tools/search-replace.js.map +1 -1
  236. package/dist/tools/search-replace.test.js +18 -0
  237. package/dist/tools/search-replace.test.js.map +1 -1
  238. package/dist/tools/search.d.ts +4 -4
  239. package/dist/tools/search.d.ts.map +1 -1
  240. package/dist/tools/search.js +4 -0
  241. package/dist/tools/search.js.map +1 -1
  242. package/dist/tools/shell.d.ts +2 -2
  243. package/dist/tools/shell.js +2 -2
  244. package/dist/tools/shell.js.map +1 -1
  245. package/dist/tools/types.d.ts +2 -2
  246. package/dist/tools/types.d.ts.map +1 -1
  247. package/dist/utils/command-safety.d.ts.map +1 -1
  248. package/dist/utils/command-safety.devnull.test.d.ts +2 -0
  249. package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
  250. package/dist/utils/command-safety.devnull.test.js +13 -0
  251. package/dist/utils/command-safety.devnull.test.js.map +1 -0
  252. package/dist/utils/command-safety.js +10 -364
  253. package/dist/utils/command-safety.js.map +1 -1
  254. package/dist/utils/extract-command-messages.test.d.ts +2 -0
  255. package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
  256. package/dist/utils/extract-command-messages.test.js +58 -51
  257. package/dist/utils/extract-command-messages.test.js.map +1 -0
  258. package/dist/utils/settings-command.d.ts.map +1 -1
  259. package/dist/utils/settings-command.js +18 -4
  260. package/dist/utils/settings-command.js.map +1 -1
  261. package/package.json +2 -2
  262. package/dist/app.model-command-feedback.test.d.ts +0 -2
  263. package/dist/app.model-command-feedback.test.d.ts.map +0 -1
  264. package/dist/app.model-command-feedback.test.js +0 -19
  265. package/dist/app.model-command-feedback.test.js.map +0 -1
  266. package/dist/components/MentorMode.test.d.ts +0 -2
  267. package/dist/components/MentorMode.test.d.ts.map +0 -1
  268. package/dist/components/MentorMode.test.js.map +0 -1
  269. package/dist/debug-schema.d.ts +0 -2
  270. package/dist/debug-schema.d.ts.map +0 -1
  271. package/dist/debug-schema.js +0 -22
  272. package/dist/debug-schema.js.map +0 -1
  273. package/dist/hooks/use-model-selection.test.d.ts +0 -2
  274. package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
  275. package/dist/hooks/use-model-selection.test.js +0 -28
  276. package/dist/hooks/use-model-selection.test.js.map +0 -1
  277. package/dist/hooks/use-path-completion.test.d.ts +0 -2
  278. package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
  279. package/dist/hooks/use-path-completion.test.js +0 -29
  280. package/dist/hooks/use-path-completion.test.js.map +0 -1
  281. package/dist/prompts/default.md.bak +0 -77
  282. package/dist/providers/openrouter.history.test.d.ts +0 -2
  283. package/dist/providers/openrouter.history.test.d.ts.map +0 -1
  284. package/dist/providers/openrouter.history.test.js +0 -533
  285. package/dist/providers/openrouter.history.test.js.map +0 -1
  286. package/dist/test-search-tool.d.ts +0 -2
  287. package/dist/test-search-tool.d.ts.map +0 -1
  288. package/dist/test-search-tool.js +0 -36
  289. package/dist/test-search-tool.js.map +0 -1
  290. package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
  291. package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
  292. package/dist/utils/extract-command-messages.repro.test.js +0 -31
  293. package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
  294. /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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=use-settings-value-completion.test.d.ts.map
@@ -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;AAO5E,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIpE;;;GAGG;AACH,qBAAa,iBAAiB;;gBA0Bd,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;IAI5C;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb,kBAAkB,IAAI,IAAI;IAcpB,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;IAqDT,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;IAoIT,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;CAkarB"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openai-agent-client.flex-tier.test.d.ts.map
@@ -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(this.#provider);
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
- #runAgent(agent, input, options) {
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 (this.#provider !== 'openai') {
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 (!this.#runner && this.#provider !== 'openai') {
244
- const providerDef = getProvider(this.#provider);
245
- const providerLabel = providerDef?.label || this.#provider;
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 (this.#runner) {
253
- return this.#runner.run(agent, input, effectiveOptions);
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 instructions = `${baseInstructions}\n\nEnvironment: ${this.#getEnvInfo()}${this.#getAgentsInstructions()}`;
431
- // Initialize mentor agent and conversation store if needed
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 = this.#provider !== 'openai'
482
+ const input = mentorProvider !== 'openai'
458
483
  ? this.#mentorStore.getHistory()
459
484
  : question;
460
- const result = await this.#runAgent(this.#mentorAgent, input, {
485
+ const result = await this.#runAgentWithProvider(mentorProvider, this.#mentorRunner, this.#mentorAgent, input, {
461
486
  stream: false,
462
487
  maxTurns: 1,
463
- ...(this.#provider === 'openai' && this.#mentorPreviousResponseId
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,