@qduc/term2 0.1.3 → 0.1.4
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.map +1 -1
- package/dist/agent.js +5 -0
- package/dist/agent.js.map +1 -1
- package/dist/app.model-command-feedback.test.d.ts +2 -0
- package/dist/app.model-command-feedback.test.d.ts.map +1 -0
- package/dist/app.model-command-feedback.test.js +19 -0
- package/dist/app.model-command-feedback.test.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/components/ChatMessage.js +1 -1
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/InputBox.js +1 -1
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/MarkdownRenderer.js +1 -1
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/MentorMode.test.d.ts +2 -0
- package/dist/components/MentorMode.test.d.ts.map +1 -0
- package/dist/components/MentorMode.test.js.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
- package/dist/components/SettingsSelectionMenu.js +1 -1
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- 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 +1 -2
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TextInput.test.js.map +1 -1
- package/dist/debug-schema.d.ts +2 -0
- package/dist/debug-schema.d.ts.map +1 -0
- package/dist/debug-schema.js +22 -0
- package/dist/debug-schema.js.map +1 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +53 -508
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-model-selection.test.d.ts +2 -0
- package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.test.js +28 -0
- package/dist/hooks/use-model-selection.test.js.map +1 -0
- package/dist/hooks/use-path-completion.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.test.js +29 -0
- package/dist/hooks/use-path-completion.test.js.map +1 -0
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +2 -0
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +1 -0
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/lib/editor-impl.test.d.ts +2 -0
- package/dist/lib/editor-impl.test.d.ts.map +1 -0
- package/dist/lib/editor-impl.test.js +188 -0
- package/dist/lib/editor-impl.test.js.map +1 -0
- package/dist/lib/openai-agent-client.public-methods.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.public-methods.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.public-methods.test.js +188 -0
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -0
- package/dist/prompts/default.md.bak +77 -0
- package/dist/prompts/simple-mentor.md +0 -8
- package/dist/providers/github-copilot/converters.d.ts +45 -0
- package/dist/providers/github-copilot/converters.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.js +118 -0
- package/dist/providers/github-copilot/converters.js.map +1 -0
- package/dist/providers/github-copilot/converters.test.d.ts +2 -0
- package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.test.js +162 -0
- package/dist/providers/github-copilot/converters.test.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
- package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
- package/dist/providers/github-copilot/index.d.ts +4 -0
- package/dist/providers/github-copilot/index.d.ts.map +1 -0
- package/dist/providers/github-copilot/index.js +4 -0
- package/dist/providers/github-copilot/index.js.map +1 -0
- package/dist/providers/github-copilot/model-direct.d.ts +34 -0
- package/dist/providers/github-copilot/model-direct.d.ts.map +1 -0
- package/dist/providers/github-copilot/model-direct.js +443 -0
- package/dist/providers/github-copilot/model-direct.js.map +1 -0
- package/dist/providers/github-copilot/model.d.ts +24 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.js +15 -0
- package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
- package/dist/providers/github-copilot/model.js +581 -0
- package/dist/providers/github-copilot/model.js.map +1 -0
- package/dist/providers/github-copilot/provider.d.ts +20 -0
- package/dist/providers/github-copilot/provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.js +30 -0
- package/dist/providers/github-copilot/provider.js.map +1 -0
- package/dist/providers/github-copilot/provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.test.js +52 -0
- package/dist/providers/github-copilot/provider.test.js.map +1 -0
- package/dist/providers/github-copilot/utils.d.ts +20 -0
- package/dist/providers/github-copilot/utils.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.js +142 -0
- package/dist/providers/github-copilot/utils.js.map +1 -0
- package/dist/providers/github-copilot/utils.test.d.ts +2 -0
- package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.test.js +21 -0
- package/dist/providers/github-copilot/utils.test.js.map +1 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/converters.d.ts.map +1 -1
- package/dist/providers/openrouter/converters.js +64 -46
- package/dist/providers/openrouter/converters.js.map +1 -1
- package/dist/providers/openrouter/converters.test.js +13 -12
- package/dist/providers/openrouter/converters.test.js.map +1 -1
- package/dist/providers/openrouter/merge-messages.test.d.ts +2 -0
- package/dist/providers/openrouter/merge-messages.test.d.ts.map +1 -0
- package/dist/providers/openrouter/merge-messages.test.js +83 -0
- package/dist/providers/openrouter/merge-messages.test.js.map +1 -0
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter.history.test.d.ts +2 -0
- package/dist/providers/openrouter.history.test.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.js +533 -0
- package/dist/providers/openrouter.history.test.js.map +1 -0
- package/dist/providers/openrouter.test.js.map +1 -1
- package/dist/reproduce_issue.test.d.ts +2 -0
- package/dist/reproduce_issue.test.d.ts.map +1 -0
- package/dist/reproduce_issue.test.js +31 -0
- package/dist/reproduce_issue.test.js.map +1 -0
- package/dist/services/conversation-service.test.js +183 -149
- package/dist/services/settings-service.d.ts +9 -3
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +14 -0
- package/dist/services/settings-service.js.map +1 -1
- package/dist/test-search-tool.d.ts +2 -0
- package/dist/test-search-tool.d.ts.map +1 -0
- package/dist/test-search-tool.js +36 -0
- package/dist/test-search-tool.js.map +1 -0
- package/dist/tools/edit-healing.d.ts +24 -0
- package/dist/tools/edit-healing.d.ts.map +1 -0
- package/dist/tools/edit-healing.js +230 -0
- package/dist/tools/edit-healing.js.map +1 -0
- package/dist/tools/edit-healing.test.d.ts +2 -0
- package/dist/tools/edit-healing.test.d.ts.map +1 -0
- package/dist/tools/edit-healing.test.js +34 -0
- package/dist/tools/edit-healing.test.js.map +1 -0
- package/dist/tools/search-replace.d.ts +2 -0
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +207 -23
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +223 -2
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/web-fetch.d.ts +20 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +300 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-fetch.test.d.ts +2 -0
- package/dist/tools/web-fetch.test.d.ts.map +1 -0
- package/dist/tools/web-fetch.test.js +94 -0
- package/dist/tools/web-fetch.test.js.map +1 -0
- package/dist/utils/command-safety/index.d.ts +2 -2
- package/dist/utils/command-safety/index.d.ts.map +1 -1
- package/dist/utils/command-safety/index.js +7 -6
- package/dist/utils/command-safety/index.js.map +1 -1
- package/dist/utils/command-safety.d.ts.map +1 -1
- package/dist/utils/command-safety.find.test.js +19 -21
- package/dist/utils/command-safety.find.test.js.map +1 -1
- package/dist/utils/command-safety.js +364 -10
- package/dist/utils/command-safety.js.map +1 -1
- package/dist/utils/conversation-event-handler.d.ts +63 -0
- package/dist/utils/conversation-event-handler.d.ts.map +1 -0
- package/dist/utils/conversation-event-handler.js +132 -0
- package/dist/utils/conversation-event-handler.js.map +1 -0
- package/dist/utils/conversation-event-handler.test.d.ts +2 -0
- package/dist/utils/conversation-event-handler.test.d.ts.map +1 -0
- package/dist/utils/conversation-event-handler.test.js +281 -0
- package/dist/utils/conversation-event-handler.test.js.map +1 -0
- package/dist/utils/conversation-utils.d.ts +41 -0
- package/dist/utils/conversation-utils.d.ts.map +1 -0
- package/dist/utils/conversation-utils.js +109 -0
- package/dist/utils/conversation-utils.js.map +1 -0
- package/dist/utils/conversation-utils.test.d.ts +2 -0
- package/dist/utils/conversation-utils.test.d.ts.map +1 -0
- package/dist/utils/conversation-utils.test.js +190 -0
- package/dist/utils/conversation-utils.test.js.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.js +31 -0
- package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
- package/dist/utils/extract-command-messages.test.js +51 -58
- package/dist/utils/ink-render-options.d.ts +9 -0
- package/dist/utils/ink-render-options.d.ts.map +1 -0
- package/dist/utils/ink-render-options.js +8 -0
- package/dist/utils/ink-render-options.js.map +1 -0
- package/dist/utils/message-utils.d.ts +17 -0
- package/dist/utils/message-utils.d.ts.map +1 -0
- package/dist/utils/message-utils.js +52 -0
- package/dist/utils/message-utils.js.map +1 -0
- package/dist/utils/message-utils.test.d.ts +2 -0
- package/dist/utils/message-utils.test.d.ts.map +1 -0
- package/dist/utils/message-utils.test.js +48 -0
- package/dist/utils/message-utils.test.js.map +1 -0
- package/package.json +9 -3
- package/dist/agent.lite-mode.test.d.ts +0 -2
- package/dist/agent.lite-mode.test.d.ts.map +0 -1
- package/dist/agent.lite-mode.test.js +0 -39
- package/dist/agent.lite-mode.test.js.map +0 -1
- package/dist/debug_ask_mentor.d.ts +0 -2
- package/dist/debug_ask_mentor.d.ts.map +0 -1
- package/dist/debug_ask_mentor.js +0 -73
- package/dist/debug_ask_mentor.js.map +0 -1
- package/dist/modes/companion/command-index.d.ts +0 -26
- package/dist/modes/companion/command-index.d.ts.map +0 -1
- package/dist/modes/companion/command-index.js +0 -50
- package/dist/modes/companion/command-index.js.map +0 -1
- package/dist/modes/companion/command-index.test.d.ts +0 -2
- package/dist/modes/companion/command-index.test.d.ts.map +0 -1
- package/dist/modes/companion/command-index.test.js +0 -86
- package/dist/modes/companion/command-index.test.js.map +0 -1
- package/dist/modes/companion/companion-app.d.ts +0 -12
- package/dist/modes/companion/companion-app.d.ts.map +0 -1
- package/dist/modes/companion/companion-app.js +0 -297
- package/dist/modes/companion/companion-app.js.map +0 -1
- package/dist/modes/companion/companion-session.d.ts +0 -63
- package/dist/modes/companion/companion-session.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.js +0 -146
- package/dist/modes/companion/companion-session.js.map +0 -1
- package/dist/modes/companion/companion-session.test.d.ts +0 -2
- package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.test.js +0 -28
- package/dist/modes/companion/companion-session.test.js.map +0 -1
- package/dist/modes/companion/components/status-bar.d.ts +0 -13
- package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
- package/dist/modes/companion/components/status-bar.js +0 -26
- package/dist/modes/companion/components/status-bar.js.map +0 -1
- package/dist/modes/companion/context-buffer.d.ts +0 -65
- package/dist/modes/companion/context-buffer.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.js +0 -156
- package/dist/modes/companion/context-buffer.js.map +0 -1
- package/dist/modes/companion/context-buffer.test.d.ts +0 -2
- package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.test.js +0 -154
- package/dist/modes/companion/context-buffer.test.js.map +0 -1
- package/dist/modes/companion/event-detector.d.ts +0 -46
- package/dist/modes/companion/event-detector.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.js +0 -169
- package/dist/modes/companion/event-detector.js.map +0 -1
- package/dist/modes/companion/event-detector.test.d.ts +0 -2
- package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.test.js +0 -121
- package/dist/modes/companion/event-detector.test.js.map +0 -1
- package/dist/modes/companion/index.d.ts +0 -33
- package/dist/modes/companion/index.d.ts.map +0 -1
- package/dist/modes/companion/index.js +0 -21
- package/dist/modes/companion/index.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.d.ts +0 -3
- package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.js +0 -31
- package/dist/modes/companion/input-key-mapper.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.js +0 -26
- package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
- package/dist/modes/companion/input-parser.d.ts +0 -53
- package/dist/modes/companion/input-parser.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.js +0 -114
- package/dist/modes/companion/input-parser.js.map +0 -1
- package/dist/modes/companion/input-parser.test.d.ts +0 -2
- package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.test.js +0 -123
- package/dist/modes/companion/input-parser.test.js.map +0 -1
- package/dist/modes/companion/mode-manager.d.ts +0 -41
- package/dist/modes/companion/mode-manager.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.js +0 -56
- package/dist/modes/companion/mode-manager.js.map +0 -1
- package/dist/modes/companion/mode-manager.test.d.ts +0 -2
- package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.test.js +0 -65
- package/dist/modes/companion/mode-manager.test.js.map +0 -1
- package/dist/modes/companion/output-classifier.d.ts +0 -15
- package/dist/modes/companion/output-classifier.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.js +0 -77
- package/dist/modes/companion/output-classifier.js.map +0 -1
- package/dist/modes/companion/output-classifier.test.d.ts +0 -2
- package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.test.js +0 -133
- package/dist/modes/companion/output-classifier.test.js.map +0 -1
- package/dist/modes/companion/pty-wrapper.d.ts +0 -46
- package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
- package/dist/modes/companion/pty-wrapper.js +0 -143
- package/dist/modes/companion/pty-wrapper.js.map +0 -1
- package/dist/modes/companion/safety-classifier.d.ts +0 -31
- package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.js +0 -140
- package/dist/modes/companion/safety-classifier.js.map +0 -1
- package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
- package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.test.js +0 -151
- package/dist/modes/companion/safety-classifier.test.js.map +0 -1
- package/dist/modes/companion/summarizer.d.ts +0 -24
- package/dist/modes/companion/summarizer.d.ts.map +0 -1
- package/dist/modes/companion/summarizer.js +0 -132
- package/dist/modes/companion/summarizer.js.map +0 -1
- package/dist/modes/companion/terminal-history.d.ts +0 -27
- package/dist/modes/companion/terminal-history.d.ts.map +0 -1
- package/dist/modes/companion/terminal-history.js +0 -142
- package/dist/modes/companion/terminal-history.js.map +0 -1
- package/dist/services/check_mock.d.ts +0 -2
- package/dist/services/check_mock.d.ts.map +0 -1
- package/dist/services/check_mock.js +0 -22
- package/dist/services/check_mock.js.map +0 -1
- package/dist/services/conversation-service.test.d.ts +0 -2
- package/dist/services/conversation-service.test.d.ts.map +0 -1
- package/dist/services/conversation-service.test.js.map +0 -1
- package/dist/utils/command-safety.devnull.test.d.ts +0 -2
- package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.js +0 -13
- package/dist/utils/command-safety.devnull.test.js.map +0 -1
- package/dist/utils/extract-command-messages.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.test.js.map +0 -1
- /package/{readme.md → README.md} +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { OpenAIAgentClient } from './openai-agent-client.js';
|
|
3
|
+
import { registerProvider } from '../providers/registry.js';
|
|
4
|
+
// ========== Mock Utilities ==========
|
|
5
|
+
function createMockLogger() {
|
|
6
|
+
return {
|
|
7
|
+
debug: () => { },
|
|
8
|
+
info: () => { },
|
|
9
|
+
warn: () => { },
|
|
10
|
+
error: () => { },
|
|
11
|
+
security: () => { },
|
|
12
|
+
setCorrelationId: () => { },
|
|
13
|
+
clearCorrelationId: () => { },
|
|
14
|
+
getCorrelationId: () => undefined,
|
|
15
|
+
log: () => { },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function createMockSettings(values = {}) {
|
|
19
|
+
const store = {
|
|
20
|
+
'agent.provider': 'mock-provider-public-methods',
|
|
21
|
+
'agent.model': 'mock-model',
|
|
22
|
+
...values,
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
get: (key) => store[key],
|
|
26
|
+
set: (key, value) => { store[key] = value; },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// Mock Runner that tracks calls
|
|
30
|
+
let runnerCalls = [];
|
|
31
|
+
class MockRunner {
|
|
32
|
+
async run(_agent, _input, _options) {
|
|
33
|
+
runnerCalls.push({ agent: _agent, input: _input, options: _options });
|
|
34
|
+
return {
|
|
35
|
+
status: 'completed',
|
|
36
|
+
finalOutput: 'mock response',
|
|
37
|
+
messages: [],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Register mock provider once
|
|
42
|
+
let providerRegistered = false;
|
|
43
|
+
function ensureProviderRegistered() {
|
|
44
|
+
if (!providerRegistered) {
|
|
45
|
+
registerProvider({
|
|
46
|
+
id: 'mock-provider-public-methods',
|
|
47
|
+
label: 'Mock Provider',
|
|
48
|
+
createRunner: () => new MockRunner(),
|
|
49
|
+
fetchModels: async () => [{ id: 'mock-model' }],
|
|
50
|
+
clearConversations: () => { },
|
|
51
|
+
});
|
|
52
|
+
providerRegistered = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
test.beforeEach(() => {
|
|
56
|
+
runnerCalls = [];
|
|
57
|
+
ensureProviderRegistered();
|
|
58
|
+
});
|
|
59
|
+
// ========== setModel tests ==========
|
|
60
|
+
test('setModel updates the internal model', async (t) => {
|
|
61
|
+
const settings = createMockSettings();
|
|
62
|
+
const client = new OpenAIAgentClient({
|
|
63
|
+
deps: { logger: createMockLogger(), settings },
|
|
64
|
+
});
|
|
65
|
+
// Set a new model
|
|
66
|
+
client.setModel('gpt-4-turbo');
|
|
67
|
+
// Trigger a chat to see what model is used
|
|
68
|
+
await client.chat('test');
|
|
69
|
+
t.is(runnerCalls.length, 1);
|
|
70
|
+
// The agent should have the updated model
|
|
71
|
+
const agent = runnerCalls[0].agent;
|
|
72
|
+
t.truthy(agent);
|
|
73
|
+
});
|
|
74
|
+
// ========== setProvider / getProvider tests ==========
|
|
75
|
+
test('getProvider returns current provider', t => {
|
|
76
|
+
const settings = createMockSettings({ 'agent.provider': 'mock-provider-public-methods' });
|
|
77
|
+
const client = new OpenAIAgentClient({
|
|
78
|
+
deps: { logger: createMockLogger(), settings },
|
|
79
|
+
});
|
|
80
|
+
t.is(client.getProvider(), 'mock-provider-public-methods');
|
|
81
|
+
});
|
|
82
|
+
test('setProvider updates provider and persists to settings', t => {
|
|
83
|
+
const settings = createMockSettings({ 'agent.provider': 'mock-provider-public-methods' });
|
|
84
|
+
const client = new OpenAIAgentClient({
|
|
85
|
+
deps: { logger: createMockLogger(), settings },
|
|
86
|
+
});
|
|
87
|
+
client.setProvider('openai');
|
|
88
|
+
t.is(client.getProvider(), 'openai');
|
|
89
|
+
t.is(settings.get('agent.provider'), 'openai');
|
|
90
|
+
});
|
|
91
|
+
// ========== addToolInterceptor tests ==========
|
|
92
|
+
test('addToolInterceptor returns removal function', t => {
|
|
93
|
+
const settings = createMockSettings();
|
|
94
|
+
const client = new OpenAIAgentClient({
|
|
95
|
+
deps: { logger: createMockLogger(), settings },
|
|
96
|
+
});
|
|
97
|
+
const remove = client.addToolInterceptor(async () => {
|
|
98
|
+
return null;
|
|
99
|
+
});
|
|
100
|
+
t.is(typeof remove, 'function');
|
|
101
|
+
// Calling remove should work without error
|
|
102
|
+
remove();
|
|
103
|
+
t.pass();
|
|
104
|
+
});
|
|
105
|
+
test('addToolInterceptor can be removed', t => {
|
|
106
|
+
const settings = createMockSettings();
|
|
107
|
+
const client = new OpenAIAgentClient({
|
|
108
|
+
deps: { logger: createMockLogger(), settings },
|
|
109
|
+
});
|
|
110
|
+
const remove = client.addToolInterceptor(async () => {
|
|
111
|
+
return null;
|
|
112
|
+
});
|
|
113
|
+
// Remove it
|
|
114
|
+
remove();
|
|
115
|
+
// After removal, the interceptor should not be called
|
|
116
|
+
// (We can't directly test this without more complex setup)
|
|
117
|
+
t.pass();
|
|
118
|
+
});
|
|
119
|
+
// ========== abort tests ==========
|
|
120
|
+
test('abort does not throw when called without active operation', t => {
|
|
121
|
+
const settings = createMockSettings();
|
|
122
|
+
const client = new OpenAIAgentClient({
|
|
123
|
+
deps: { logger: createMockLogger(), settings },
|
|
124
|
+
});
|
|
125
|
+
// Should not throw
|
|
126
|
+
t.notThrows(() => client.abort());
|
|
127
|
+
});
|
|
128
|
+
test('abort can be called multiple times', t => {
|
|
129
|
+
const settings = createMockSettings();
|
|
130
|
+
const client = new OpenAIAgentClient({
|
|
131
|
+
deps: { logger: createMockLogger(), settings },
|
|
132
|
+
});
|
|
133
|
+
t.notThrows(() => {
|
|
134
|
+
client.abort();
|
|
135
|
+
client.abort();
|
|
136
|
+
client.abort();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
// ========== clearConversations tests ==========
|
|
140
|
+
test('clearConversations does not throw', t => {
|
|
141
|
+
const settings = createMockSettings();
|
|
142
|
+
const client = new OpenAIAgentClient({
|
|
143
|
+
deps: { logger: createMockLogger(), settings },
|
|
144
|
+
});
|
|
145
|
+
t.notThrows(() => client.clearConversations());
|
|
146
|
+
});
|
|
147
|
+
test('clearConversations can be called multiple times', t => {
|
|
148
|
+
const settings = createMockSettings();
|
|
149
|
+
const client = new OpenAIAgentClient({
|
|
150
|
+
deps: { logger: createMockLogger(), settings },
|
|
151
|
+
});
|
|
152
|
+
t.notThrows(() => {
|
|
153
|
+
client.clearConversations();
|
|
154
|
+
client.clearConversations();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
// ========== setReasoningEffort tests ==========
|
|
158
|
+
test('setReasoningEffort accepts valid effort levels', t => {
|
|
159
|
+
const settings = createMockSettings();
|
|
160
|
+
const client = new OpenAIAgentClient({
|
|
161
|
+
deps: { logger: createMockLogger(), settings },
|
|
162
|
+
});
|
|
163
|
+
t.notThrows(() => client.setReasoningEffort('high'));
|
|
164
|
+
t.notThrows(() => client.setReasoningEffort('medium'));
|
|
165
|
+
t.notThrows(() => client.setReasoningEffort('low'));
|
|
166
|
+
t.notThrows(() => client.setReasoningEffort('default'));
|
|
167
|
+
t.notThrows(() => client.setReasoningEffort(undefined));
|
|
168
|
+
});
|
|
169
|
+
// ========== setTemperature tests ==========
|
|
170
|
+
test('setTemperature accepts numeric values', t => {
|
|
171
|
+
const settings = createMockSettings();
|
|
172
|
+
const client = new OpenAIAgentClient({
|
|
173
|
+
deps: { logger: createMockLogger(), settings },
|
|
174
|
+
});
|
|
175
|
+
t.notThrows(() => client.setTemperature(0.5));
|
|
176
|
+
t.notThrows(() => client.setTemperature(1.0));
|
|
177
|
+
t.notThrows(() => client.setTemperature(0));
|
|
178
|
+
t.notThrows(() => client.setTemperature(undefined));
|
|
179
|
+
});
|
|
180
|
+
// ========== setRetryCallback tests ==========
|
|
181
|
+
test('setRetryCallback accepts callback function', t => {
|
|
182
|
+
const settings = createMockSettings();
|
|
183
|
+
const client = new OpenAIAgentClient({
|
|
184
|
+
deps: { logger: createMockLogger(), settings },
|
|
185
|
+
});
|
|
186
|
+
t.notThrows(() => client.setRetryCallback(() => { }));
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=openai-agent-client.public-methods.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-agent-client.public-methods.test.js","sourceRoot":"","sources":["../../source/lib/openai-agent-client.public-methods.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
## Introduction
|
|
2
|
+
|
|
3
|
+
Serve as a technically skilled reasoning partner: precise, objective, and contextually aware. Help solve problems by understanding requirements, thinking systematically when necessary, and delivering reliable results. Prioritize accuracy and usefulness over agreement or reassurance.
|
|
4
|
+
|
|
5
|
+
## Core Behavior
|
|
6
|
+
|
|
7
|
+
Communicate clearly and thoughtfully. Verify claims rather than accepting them at face value, and prioritize accuracy over persuasion. When user intent is unclear, reason carefully rather than making assumptions. When a task requires creativity, ground it in concrete reasoning. Operate within the constraints defined by the user's environment.
|
|
8
|
+
|
|
9
|
+
### Example: Interpreting Ambiguous Intent (DO vs. DON'T)
|
|
10
|
+
|
|
11
|
+
DON'T (overstates certainty, assumes intent):
|
|
12
|
+
User: "Optimize this algorithm; it's too slow."
|
|
13
|
+
Assistant: "I'll parallelize it across threads for a 10× speedup."
|
|
14
|
+
*(No code inspection; claims unsupported.)*
|
|
15
|
+
|
|
16
|
+
DO (investigate, reason, stay grounded):
|
|
17
|
+
Assistant: "Before proposing changes, I need to understand the existing implementation. Please share the current function or describe its inputs and constraints so I can identify actual bottlenecks."
|
|
18
|
+
|
|
19
|
+
## Working With Code and Tools
|
|
20
|
+
|
|
21
|
+
Be rigorous before acting. Review code completely before editing. Modify only what is directly necessary, avoiding unnecessary changes. Maintain safety boundaries around user input, execution environments, and external APIs. Use provided tools in preference to alternatives, and create files only when explicitly required.
|
|
22
|
+
|
|
23
|
+
### Example: Handling a Requested Refactor (DO vs. DON'T)
|
|
24
|
+
|
|
25
|
+
DON'T (changes code without review, adds speculative improvements):
|
|
26
|
+
User: "Fix the logging bug in this file."
|
|
27
|
+
Assistant: "I rewrote the logging module to be more modular and added retries."
|
|
28
|
+
*(Unnecessary changes; introduces new behavior.)*
|
|
29
|
+
|
|
30
|
+
DO (minimal, accurate, context-aware):
|
|
31
|
+
Assistant: "I'll inspect the file to understand the logging implementation and address only the bug you specified without altering unrelated code."
|
|
32
|
+
|
|
33
|
+
## Reasoning Style
|
|
34
|
+
|
|
35
|
+
Explain your thinking when it informs the user's decision, but avoid over-explaining routine steps. Keep reasoning internal when unnecessary, presenting only conclusions unless deeper analysis is needed. When comparing design options, articulate tradeoffs clearly and distinguish between established facts and assumptions.
|
|
36
|
+
|
|
37
|
+
### Example: Complex Tradeoff (DO vs. DON'T)
|
|
38
|
+
|
|
39
|
+
DON'T (selects approach without justification):
|
|
40
|
+
User: "Should we store this state in memory or persist it?"
|
|
41
|
+
Assistant: "In-memory storage is best."
|
|
42
|
+
*(No explanation; failure modes unaddressed.)*
|
|
43
|
+
|
|
44
|
+
DO (articulates meaningful tradeoffs):
|
|
45
|
+
Assistant: "In-memory storage provides faster access but loses state on process restart. Persistence adds overhead but ensures recovery. Your choice depends on whether crash resilience is more important than peak performance."
|
|
46
|
+
|
|
47
|
+
## Handling User Intent and Safety
|
|
48
|
+
|
|
49
|
+
Support user goals while maintaining boundaries around security, privacy, and correctness. Decline unsafe requests directly, offering secure alternatives when applicable. If a user pursues a harmful approach, redirect with transparent reasoning rather than compliance.
|
|
50
|
+
|
|
51
|
+
### Example: Misguided Technical Request (DO vs. DON'T)
|
|
52
|
+
|
|
53
|
+
DON'T:
|
|
54
|
+
User: "Bypass authentication checks for testing in production."
|
|
55
|
+
Assistant: "Here's how to comment out the auth middleware."
|
|
56
|
+
*(Creates security vulnerability.)*
|
|
57
|
+
|
|
58
|
+
DO:
|
|
59
|
+
Assistant: "Disabling authentication in production introduces serious security risks. For testing, use a mock auth layer or a development-only bypass that cannot activate in production builds. I can help implement that approach."
|
|
60
|
+
|
|
61
|
+
## Task Execution
|
|
62
|
+
|
|
63
|
+
Approach tasks with a clear plan when needed. Work systematically, maintaining single-threaded focus. Deliver functional implementations rather than theoretical descriptions, and follow established patterns in the environment. Avoid unnecessary refactoring, speculative enhancements, or unrelated changes.
|
|
64
|
+
|
|
65
|
+
### Example: Complex Implementation Flow (DO vs. DON'T)
|
|
66
|
+
|
|
67
|
+
DON'T:
|
|
68
|
+
User: "Add CSV export to this feature."
|
|
69
|
+
Assistant: "I redesigned the metrics system, added a plugin API, and included CSV, JSON, and XML exports."
|
|
70
|
+
*(Scope expansion; unrelated changes.)*
|
|
71
|
+
|
|
72
|
+
DO:
|
|
73
|
+
Assistant: "I'll add CSV export alongside existing exports, following established patterns. I'll review the serialization module, implement CSV output consistently with current exports, and validate with sample data. Unrelated logic remains unchanged."
|
|
74
|
+
|
|
75
|
+
## Communication Style
|
|
76
|
+
|
|
77
|
+
Communicate professionally and directly. Be concise without sacrificing clarity—maintain the efficiency of technical documentation with sufficient detail for understanding.
|
|
@@ -82,14 +82,6 @@ Search for files by name or glob pattern in the workspace.
|
|
|
82
82
|
- Returns up to 50 results by default (configurable with `max_results`)
|
|
83
83
|
- Prefer this over Shell commands like `ls` or `rg --files`
|
|
84
84
|
|
|
85
|
-
## create_file
|
|
86
|
-
|
|
87
|
-
Create a new file with the specified content.
|
|
88
|
-
|
|
89
|
-
- Use this for explicitly creating new files
|
|
90
|
-
- Fails if the file already exists (use `search_replace` for existing files)
|
|
91
|
-
- Automatically creates parent directories if they don't exist
|
|
92
|
-
|
|
93
85
|
## search_replace
|
|
94
86
|
|
|
95
87
|
Modify files with exact text replacement.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ModelRequest } from '@openai/agents-core';
|
|
2
|
+
import type { ILoggingService } from '../../services/service-interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* Copilot SDK message format
|
|
5
|
+
*/
|
|
6
|
+
export interface CopilotMessage {
|
|
7
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
8
|
+
content: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
tool_call_id?: string;
|
|
11
|
+
tool_calls?: Array<{
|
|
12
|
+
id: string;
|
|
13
|
+
type: 'function';
|
|
14
|
+
function: {
|
|
15
|
+
name: string;
|
|
16
|
+
arguments: string;
|
|
17
|
+
};
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Convert SDK ModelRequest to Copilot SDK message format.
|
|
22
|
+
* Maps the conversation history from the SDK format to what Copilot expects.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildMessagesFromRequest(request: ModelRequest, modelId: string, loggingService: ILoggingService): CopilotMessage[];
|
|
25
|
+
/**
|
|
26
|
+
* Extract function tools from the ModelRequest.
|
|
27
|
+
* Filters out SDK-specific tools and returns only function tools.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractFunctionToolsFromRequest(request: ModelRequest): Array<{
|
|
30
|
+
type: 'function';
|
|
31
|
+
function: {
|
|
32
|
+
name: string;
|
|
33
|
+
description: string;
|
|
34
|
+
parameters: unknown;
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Normalize usage data to SDK format
|
|
39
|
+
*/
|
|
40
|
+
export declare function normalizeUsage(usage: any): {
|
|
41
|
+
inputTokens: number;
|
|
42
|
+
outputTokens: number;
|
|
43
|
+
totalTokens: number;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/converters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAkC5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,KAAK,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,UAAU,CAAC;QACjB,QAAQ,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;SACrB,CAAC;KACL,CAAC,CAAC;CACN;AA8BD;;;GAGG;AACH,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,eAAe,GAChC,cAAc,EAAE,CA+DlB;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC3C,OAAO,EAAE,YAAY,GACtB,KAAK,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC,CAenG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACvB,CAMA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract text from various content item formats
|
|
3
|
+
*/
|
|
4
|
+
function extractTextFromContent(content) {
|
|
5
|
+
if (!content)
|
|
6
|
+
return '';
|
|
7
|
+
if (typeof content === 'string') {
|
|
8
|
+
return content;
|
|
9
|
+
}
|
|
10
|
+
if (Array.isArray(content)) {
|
|
11
|
+
return content
|
|
12
|
+
.map(item => {
|
|
13
|
+
if (item.type === 'input_text' && 'text' in item) {
|
|
14
|
+
return item.text;
|
|
15
|
+
}
|
|
16
|
+
if (item.type === 'output_text' && 'text' in item) {
|
|
17
|
+
return item.text;
|
|
18
|
+
}
|
|
19
|
+
return '';
|
|
20
|
+
})
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
.join('\n');
|
|
23
|
+
}
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert SDK ModelRequest to Copilot SDK message format.
|
|
28
|
+
* Maps the conversation history from the SDK format to what Copilot expects.
|
|
29
|
+
*/
|
|
30
|
+
export function buildMessagesFromRequest(request, modelId, loggingService) {
|
|
31
|
+
const messages = [];
|
|
32
|
+
// Add system instructions if present
|
|
33
|
+
if (request.systemInstructions) {
|
|
34
|
+
messages.push({
|
|
35
|
+
role: 'system',
|
|
36
|
+
content: request.systemInstructions,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Process input items (conversation history)
|
|
40
|
+
if (request.input && Array.isArray(request.input)) {
|
|
41
|
+
for (const item of request.input) {
|
|
42
|
+
const outputItem = item;
|
|
43
|
+
if (outputItem.type === 'message') {
|
|
44
|
+
const role = outputItem.role;
|
|
45
|
+
const content = extractTextFromContent(outputItem.content);
|
|
46
|
+
if (content) {
|
|
47
|
+
messages.push({ role, content });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (outputItem.type === 'function_call') {
|
|
51
|
+
// Tool call made by assistant
|
|
52
|
+
const lastMessage = messages[messages.length - 1];
|
|
53
|
+
const toolCall = {
|
|
54
|
+
id: outputItem.callId || `call_${Date.now()}`,
|
|
55
|
+
type: 'function',
|
|
56
|
+
function: {
|
|
57
|
+
name: outputItem.name || '',
|
|
58
|
+
arguments: outputItem.arguments || '{}',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
if (lastMessage?.role === 'assistant' && lastMessage.tool_calls) {
|
|
62
|
+
lastMessage.tool_calls.push(toolCall);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
messages.push({
|
|
66
|
+
role: 'assistant',
|
|
67
|
+
content: '',
|
|
68
|
+
tool_calls: [toolCall],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (outputItem.type === 'function_call_output') {
|
|
73
|
+
// Tool result
|
|
74
|
+
messages.push({
|
|
75
|
+
role: 'tool',
|
|
76
|
+
content: typeof outputItem.output === 'string'
|
|
77
|
+
? outputItem.output
|
|
78
|
+
: JSON.stringify(outputItem.output),
|
|
79
|
+
tool_call_id: outputItem.callId || '',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
loggingService.debug('GitHubCopilot built messages', {
|
|
85
|
+
messageCount: messages.length,
|
|
86
|
+
modelId,
|
|
87
|
+
});
|
|
88
|
+
return messages;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract function tools from the ModelRequest.
|
|
92
|
+
* Filters out SDK-specific tools and returns only function tools.
|
|
93
|
+
*/
|
|
94
|
+
export function extractFunctionToolsFromRequest(request) {
|
|
95
|
+
if (!request.tools || !Array.isArray(request.tools)) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
return request.tools
|
|
99
|
+
.filter((tool) => tool.type === 'function')
|
|
100
|
+
.map((tool) => ({
|
|
101
|
+
type: 'function',
|
|
102
|
+
function: {
|
|
103
|
+
name: tool.name,
|
|
104
|
+
description: tool.description || '',
|
|
105
|
+
parameters: tool.parameters || { type: 'object', properties: {} },
|
|
106
|
+
},
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Normalize usage data to SDK format
|
|
111
|
+
*/
|
|
112
|
+
export function normalizeUsage(usage) {
|
|
113
|
+
const inputTokens = usage?.input_tokens ?? usage?.prompt_tokens ?? 0;
|
|
114
|
+
const outputTokens = usage?.output_tokens ?? usage?.completion_tokens ?? 0;
|
|
115
|
+
const totalTokens = usage?.total_tokens ?? inputTokens + outputTokens;
|
|
116
|
+
return { inputTokens, outputTokens, totalTokens };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=converters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/converters.ts"],"names":[],"mappings":"AAqDA;;GAEG;AACH,SAAS,sBAAsB,CAAC,OAA2C;IACvE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO;aACT,GAAG,CAAC,IAAI,CAAC,EAAE;YACR,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC/C,OAAQ,IAAoB,CAAC,IAAI,CAAC;YACtC,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAChD,OAAQ,IAAuC,CAAC,IAAI,CAAC;YACzD,CAAC;YACD,OAAO,EAAE,CAAC;QACd,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACpC,OAAqB,EACrB,OAAe,EACf,cAA+B;IAE/B,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,qCAAqC;IACrC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO,CAAC,kBAAkB;SACtC,CAAC,CAAC;IACP,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAkB,CAAC;YAEtC,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,UAAU,CAAC,IAA4B,CAAC;gBACrD,MAAM,OAAO,GAAG,sBAAsB,CAAC,UAAU,CAAC,OAAiC,CAAC,CAAC;gBAErF,IAAI,OAAO,EAAE,CAAC;oBACV,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC7C,8BAA8B;gBAC9B,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG;oBACb,EAAE,EAAE,UAAU,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE;oBAC7C,IAAI,EAAE,UAAmB;oBACzB,QAAQ,EAAE;wBACN,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;wBAC3B,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,IAAI;qBAC1C;iBACJ,CAAC;gBAEF,IAAI,WAAW,EAAE,IAAI,KAAK,WAAW,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC9D,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACJ,QAAQ,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,EAAE;wBACX,UAAU,EAAE,CAAC,QAAQ,CAAC;qBACzB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBACpD,cAAc;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ;wBAC1C,CAAC,CAAC,UAAU,CAAC,MAAM;wBACnB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;oBACvC,YAAY,EAAE,UAAU,CAAC,MAAM,IAAI,EAAE;iBACxC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,cAAc,CAAC,KAAK,CAAC,8BAA8B,EAAE;QACjD,YAAY,EAAE,QAAQ,CAAC,MAAM;QAC7B,OAAO;KACV,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC3C,OAAqB;IAErB,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,OAAO,CAAC,KAAK;SACf,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC;SAC/C,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;QACjB,IAAI,EAAE,UAAmB;QACzB,QAAQ,EAAE;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;SACpE;KACJ,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAU;IAKrC,MAAM,WAAW,GAAG,KAAK,EAAE,YAAY,IAAI,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,KAAK,EAAE,aAAa,IAAI,KAAK,EAAE,iBAAiB,IAAI,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,KAAK,EAAE,YAAY,IAAI,WAAW,GAAG,YAAY,CAAC;IAEtE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.test.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/converters.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { buildMessagesFromRequest, extractFunctionToolsFromRequest, normalizeUsage, } from './converters.js';
|
|
3
|
+
// Mock logging service
|
|
4
|
+
const mockLoggingService = {
|
|
5
|
+
info: () => { },
|
|
6
|
+
warn: () => { },
|
|
7
|
+
error: () => { },
|
|
8
|
+
debug: () => { },
|
|
9
|
+
security: () => { },
|
|
10
|
+
setCorrelationId: () => { },
|
|
11
|
+
getCorrelationId: () => undefined,
|
|
12
|
+
clearCorrelationId: () => { },
|
|
13
|
+
};
|
|
14
|
+
test('buildMessagesFromRequest - includes system instructions', (t) => {
|
|
15
|
+
const request = {
|
|
16
|
+
systemInstructions: 'You are a helpful assistant',
|
|
17
|
+
input: [],
|
|
18
|
+
};
|
|
19
|
+
const messages = buildMessagesFromRequest(request, 'gpt-4o', mockLoggingService);
|
|
20
|
+
t.is(messages.length, 1);
|
|
21
|
+
t.is(messages[0].role, 'system');
|
|
22
|
+
t.is(messages[0].content, 'You are a helpful assistant');
|
|
23
|
+
});
|
|
24
|
+
test('buildMessagesFromRequest - converts user message', (t) => {
|
|
25
|
+
const request = {
|
|
26
|
+
input: [
|
|
27
|
+
{
|
|
28
|
+
type: 'message',
|
|
29
|
+
role: 'user',
|
|
30
|
+
content: [{ type: 'input_text', text: 'Hello' }],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
const messages = buildMessagesFromRequest(request, 'gpt-4o', mockLoggingService);
|
|
35
|
+
t.is(messages.length, 1);
|
|
36
|
+
t.is(messages[0].role, 'user');
|
|
37
|
+
t.is(messages[0].content, 'Hello');
|
|
38
|
+
});
|
|
39
|
+
test('buildMessagesFromRequest - converts assistant message with string content', (t) => {
|
|
40
|
+
const request = {
|
|
41
|
+
input: [
|
|
42
|
+
{
|
|
43
|
+
type: 'message',
|
|
44
|
+
role: 'assistant',
|
|
45
|
+
content: 'Hello back!',
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
const messages = buildMessagesFromRequest(request, 'gpt-4o', mockLoggingService);
|
|
50
|
+
t.is(messages.length, 1);
|
|
51
|
+
t.is(messages[0].role, 'assistant');
|
|
52
|
+
t.is(messages[0].content, 'Hello back!');
|
|
53
|
+
});
|
|
54
|
+
test('buildMessagesFromRequest - converts function call to tool_calls', (t) => {
|
|
55
|
+
const request = {
|
|
56
|
+
input: [
|
|
57
|
+
{
|
|
58
|
+
type: 'function_call',
|
|
59
|
+
callId: 'call_123',
|
|
60
|
+
name: 'shell',
|
|
61
|
+
arguments: '{"command": "ls"}',
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
const messages = buildMessagesFromRequest(request, 'gpt-4o', mockLoggingService);
|
|
66
|
+
t.is(messages.length, 1);
|
|
67
|
+
t.is(messages[0].role, 'assistant');
|
|
68
|
+
t.truthy(messages[0].tool_calls);
|
|
69
|
+
t.is(messages[0].tool_calls.length, 1);
|
|
70
|
+
t.is(messages[0].tool_calls[0].id, 'call_123');
|
|
71
|
+
t.is(messages[0].tool_calls[0].function.name, 'shell');
|
|
72
|
+
t.is(messages[0].tool_calls[0].function.arguments, '{"command": "ls"}');
|
|
73
|
+
});
|
|
74
|
+
test('buildMessagesFromRequest - converts function call output to tool message', (t) => {
|
|
75
|
+
const request = {
|
|
76
|
+
input: [
|
|
77
|
+
{
|
|
78
|
+
type: 'function_call',
|
|
79
|
+
callId: 'call_123',
|
|
80
|
+
name: 'shell',
|
|
81
|
+
arguments: '{}',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: 'function_call_output',
|
|
85
|
+
callId: 'call_123',
|
|
86
|
+
output: 'file1.txt\nfile2.txt',
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
const messages = buildMessagesFromRequest(request, 'gpt-4o', mockLoggingService);
|
|
91
|
+
t.is(messages.length, 2);
|
|
92
|
+
t.is(messages[1].role, 'tool');
|
|
93
|
+
t.is(messages[1].content, 'file1.txt\nfile2.txt');
|
|
94
|
+
t.is(messages[1].tool_call_id, 'call_123');
|
|
95
|
+
});
|
|
96
|
+
test('extractFunctionToolsFromRequest - extracts function tools', (t) => {
|
|
97
|
+
const request = {
|
|
98
|
+
tools: [
|
|
99
|
+
{
|
|
100
|
+
type: 'function',
|
|
101
|
+
name: 'shell',
|
|
102
|
+
description: 'Execute a shell command',
|
|
103
|
+
parameters: { type: 'object', properties: { command: { type: 'string' } } },
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: 'function',
|
|
107
|
+
name: 'grep',
|
|
108
|
+
description: 'Search files',
|
|
109
|
+
parameters: { type: 'object', properties: {} },
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
const tools = extractFunctionToolsFromRequest(request);
|
|
114
|
+
t.is(tools.length, 2);
|
|
115
|
+
t.is(tools[0].function.name, 'shell');
|
|
116
|
+
t.is(tools[0].function.description, 'Execute a shell command');
|
|
117
|
+
t.is(tools[1].function.name, 'grep');
|
|
118
|
+
});
|
|
119
|
+
test('extractFunctionToolsFromRequest - returns empty array when no tools', (t) => {
|
|
120
|
+
const request = {};
|
|
121
|
+
const tools = extractFunctionToolsFromRequest(request);
|
|
122
|
+
t.deepEqual(tools, []);
|
|
123
|
+
});
|
|
124
|
+
test('extractFunctionToolsFromRequest - filters non-function tools', (t) => {
|
|
125
|
+
const request = {
|
|
126
|
+
tools: [
|
|
127
|
+
{ type: 'function', name: 'shell', description: 'test', parameters: {} },
|
|
128
|
+
{ type: 'computer', name: 'browser' }, // Should be filtered out
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
const tools = extractFunctionToolsFromRequest(request);
|
|
132
|
+
t.is(tools.length, 1);
|
|
133
|
+
t.is(tools[0].function.name, 'shell');
|
|
134
|
+
});
|
|
135
|
+
test('normalizeUsage - normalizes SDK format', (t) => {
|
|
136
|
+
const usage = {
|
|
137
|
+
input_tokens: 100,
|
|
138
|
+
output_tokens: 50,
|
|
139
|
+
};
|
|
140
|
+
const normalized = normalizeUsage(usage);
|
|
141
|
+
t.is(normalized.inputTokens, 100);
|
|
142
|
+
t.is(normalized.outputTokens, 50);
|
|
143
|
+
t.is(normalized.totalTokens, 150);
|
|
144
|
+
});
|
|
145
|
+
test('normalizeUsage - normalizes OpenAI format', (t) => {
|
|
146
|
+
const usage = {
|
|
147
|
+
prompt_tokens: 100,
|
|
148
|
+
completion_tokens: 50,
|
|
149
|
+
total_tokens: 150,
|
|
150
|
+
};
|
|
151
|
+
const normalized = normalizeUsage(usage);
|
|
152
|
+
t.is(normalized.inputTokens, 100);
|
|
153
|
+
t.is(normalized.outputTokens, 50);
|
|
154
|
+
t.is(normalized.totalTokens, 150);
|
|
155
|
+
});
|
|
156
|
+
test('normalizeUsage - handles empty usage', (t) => {
|
|
157
|
+
const normalized = normalizeUsage({});
|
|
158
|
+
t.is(normalized.inputTokens, 0);
|
|
159
|
+
t.is(normalized.outputTokens, 0);
|
|
160
|
+
t.is(normalized.totalTokens, 0);
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=converters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.test.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/converters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-copilot.provider.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/github-copilot.provider.ts"],"names":[],"mappings":""}
|