@qduc/term2 0.3.0 → 0.3.1
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/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +32 -11
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-model-selection.test.js +107 -10
- package/dist/hooks/use-model-selection.test.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.d.ts +8 -0
- package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.js +70 -0
- package/dist/providers/ai-sdk-message-normalizer.js.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.test.d.ts +2 -0
- package/dist/providers/ai-sdk-message-normalizer.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.test.js +195 -0
- package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js +2 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.d.ts +16 -0
- package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.js +22 -0
- package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.d.ts +2 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js +70 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -0
- package/dist/providers/openrouter.provider.js +4 -3
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/scripts/eval-auto-approval/dataset.d.ts +1 -1
- package/dist/services/stream-event-parsing.js +1 -1
- package/dist/services/stream-event-parsing.js.map +1 -1
- package/dist/services/stream-event-parsing.test.js +13 -0
- package/dist/services/stream-event-parsing.test.js.map +1 -1
- package/package.json +2 -1
- package/readme.md +29 -24
- 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/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
- package/dist/components/TextInput.d.ts +0 -42
- package/dist/components/TextInput.d.ts.map +0 -1
- package/dist/components/TextInput.js +0 -398
- package/dist/components/TextInput.js.map +0 -1
- package/dist/components/TextInput.test.d.ts +0 -2
- package/dist/components/TextInput.test.d.ts.map +0 -1
- package/dist/components/TextInput.test.js +0 -75
- package/dist/components/TextInput.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/lib/shell.d.ts +0 -7
- package/dist/lib/shell.d.ts.map +0 -1
- package/dist/lib/shell.js +0 -56
- package/dist/lib/shell.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/prompts/simple-mentor.md +0 -215
- package/dist/providers/github-copilot/converters.d.ts +0 -45
- package/dist/providers/github-copilot/converters.d.ts.map +0 -1
- package/dist/providers/github-copilot/converters.js +0 -118
- package/dist/providers/github-copilot/converters.js.map +0 -1
- package/dist/providers/github-copilot/converters.test.d.ts +0 -2
- package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/converters.test.js +0 -162
- package/dist/providers/github-copilot/converters.test.js.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
- package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
- package/dist/providers/github-copilot/index.d.ts +0 -4
- package/dist/providers/github-copilot/index.d.ts.map +0 -1
- package/dist/providers/github-copilot/index.js +0 -4
- package/dist/providers/github-copilot/index.js.map +0 -1
- package/dist/providers/github-copilot/model.d.ts +0 -24
- package/dist/providers/github-copilot/model.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.delta.test.js +0 -15
- package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
- package/dist/providers/github-copilot/model.js +0 -498
- package/dist/providers/github-copilot/model.js.map +0 -1
- package/dist/providers/github-copilot/model.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.test.js +0 -63
- package/dist/providers/github-copilot/model.test.js.map +0 -1
- package/dist/providers/github-copilot/provider.d.ts +0 -15
- package/dist/providers/github-copilot/provider.d.ts.map +0 -1
- package/dist/providers/github-copilot/provider.js +0 -25
- package/dist/providers/github-copilot/provider.js.map +0 -1
- package/dist/providers/github-copilot/provider.test.d.ts +0 -2
- package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/provider.test.js +0 -52
- package/dist/providers/github-copilot/provider.test.js.map +0 -1
- package/dist/providers/github-copilot/utils.d.ts +0 -20
- package/dist/providers/github-copilot/utils.d.ts.map +0 -1
- package/dist/providers/github-copilot/utils.js +0 -142
- package/dist/providers/github-copilot/utils.js.map +0 -1
- package/dist/providers/github-copilot/utils.test.d.ts +0 -2
- package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/utils.test.js +0 -21
- package/dist/providers/github-copilot/utils.test.js.map +0 -1
- package/dist/safety-checker.js +0 -57
- 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 +0 -156
- package/dist/services/conversation-service.test.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -10
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -55
- package/dist/tools/bash.js.map +0 -1
- package/dist/utils/command-safety.d.ts +0 -21
- package/dist/utils/command-safety.d.ts.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/command-safety.js +0 -348
- package/dist/utils/command-safety.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 +0 -64
- package/dist/utils/extract-command-messages.test.js.map +0 -1
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts +0 -2
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +0 -1
- package/dist/utils/provider-traffic-extractor.repro.test.js.map +0 -1
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { extractCopilotTextDelta } from './model.js';
|
|
3
|
-
test('extractCopilotTextDelta - pure deltas', t => {
|
|
4
|
-
let accumulated = '';
|
|
5
|
-
let delta = extractCopilotTextDelta(accumulated, 'Hello');
|
|
6
|
-
t.is(delta, 'Hello');
|
|
7
|
-
accumulated += delta;
|
|
8
|
-
delta = extractCopilotTextDelta(accumulated, ' World');
|
|
9
|
-
t.is(delta, ' World');
|
|
10
|
-
accumulated += delta;
|
|
11
|
-
t.is(accumulated, 'Hello World');
|
|
12
|
-
});
|
|
13
|
-
test('extractCopilotTextDelta - accumulated chunks', t => {
|
|
14
|
-
let accumulated = '';
|
|
15
|
-
let delta = extractCopilotTextDelta(accumulated, 'Hello');
|
|
16
|
-
t.is(delta, 'Hello');
|
|
17
|
-
accumulated += delta;
|
|
18
|
-
delta = extractCopilotTextDelta(accumulated, 'Hello World');
|
|
19
|
-
t.is(delta, ' World');
|
|
20
|
-
accumulated += delta;
|
|
21
|
-
t.is(accumulated, 'Hello World');
|
|
22
|
-
});
|
|
23
|
-
test('extractCopilotTextDelta - duplicate chunks', t => {
|
|
24
|
-
let accumulated = '';
|
|
25
|
-
let delta = extractCopilotTextDelta(accumulated, 'Hello');
|
|
26
|
-
t.is(delta, 'Hello');
|
|
27
|
-
accumulated += delta;
|
|
28
|
-
delta = extractCopilotTextDelta(accumulated, 'Hello');
|
|
29
|
-
t.is(delta, '');
|
|
30
|
-
accumulated += delta;
|
|
31
|
-
t.is(accumulated, 'Hello');
|
|
32
|
-
});
|
|
33
|
-
test('extractCopilotTextDelta - empty chunks', t => {
|
|
34
|
-
let accumulated = '';
|
|
35
|
-
let delta = extractCopilotTextDelta(accumulated, 'Hello');
|
|
36
|
-
t.is(delta, 'Hello');
|
|
37
|
-
accumulated += delta;
|
|
38
|
-
delta = extractCopilotTextDelta(accumulated, '');
|
|
39
|
-
t.is(delta, '');
|
|
40
|
-
accumulated += delta;
|
|
41
|
-
t.is(accumulated, 'Hello');
|
|
42
|
-
});
|
|
43
|
-
test('extractCopilotTextDelta - tricky overlap', t => {
|
|
44
|
-
// If it's pure deltas but one delta happens to be a suffix that looks like accumulated?
|
|
45
|
-
// This shouldn't happen in reality but let's check.
|
|
46
|
-
let accumulated = 'Hello';
|
|
47
|
-
let incoming = 'Hello'; // This is a NEW delta "Hello"
|
|
48
|
-
let delta = extractCopilotTextDelta(accumulated, incoming);
|
|
49
|
-
t.is(delta, ''); // With overlap detection, "Hello" overlaps completely with "Hello"
|
|
50
|
-
});
|
|
51
|
-
test('extractCopilotTextDelta - partial overlap', t => {
|
|
52
|
-
let accumulated = 'Hello';
|
|
53
|
-
let incoming = 'lo World'; // Delta that overlaps by 'lo'
|
|
54
|
-
let delta = extractCopilotTextDelta(accumulated, incoming);
|
|
55
|
-
t.is(delta, ' World');
|
|
56
|
-
});
|
|
57
|
-
test('extractCopilotTextDelta - real world repeat', t => {
|
|
58
|
-
let accumulated = 'I can help you with that.';
|
|
59
|
-
let incoming = 'that. Let me see...'; // Overlaps by 'that.'
|
|
60
|
-
let delta = extractCopilotTextDelta(accumulated, incoming);
|
|
61
|
-
t.is(delta, ' Let me see...');
|
|
62
|
-
});
|
|
63
|
-
//# sourceMappingURL=model.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model.test.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/model.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type ModelProvider, type Model } from '@openai/agents-core';
|
|
2
|
-
import type { ILoggingService, ISettingsService } from '../../services/service-interfaces.js';
|
|
3
|
-
export declare class GitHubCopilotProvider implements ModelProvider {
|
|
4
|
-
#private;
|
|
5
|
-
constructor(deps: {
|
|
6
|
-
settingsService: ISettingsService;
|
|
7
|
-
loggingService: ILoggingService;
|
|
8
|
-
});
|
|
9
|
-
getModel(modelName?: string): Promise<Model> | Model;
|
|
10
|
-
}
|
|
11
|
-
export declare function createGitHubCopilotProvider(deps: {
|
|
12
|
-
settingsService: ISettingsService;
|
|
13
|
-
loggingService: ILoggingService;
|
|
14
|
-
}): GitHubCopilotProvider;
|
|
15
|
-
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,sCAAsC,CAAC;AAG9C,qBAAa,qBAAsB,YAAW,aAAa;;gBAM3C,IAAI,EAAE;QACd,eAAe,EAAE,gBAAgB,CAAC;QAClC,cAAc,EAAE,eAAe,CAAC;KACnC;IAKD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CASvD;AAGD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAC9C,eAAe,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,eAAe,CAAC;CACnC,GAAG,qBAAqB,CAExB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { GitHubCopilotModel } from './model.js';
|
|
2
|
-
export class GitHubCopilotProvider {
|
|
3
|
-
#settingsService;
|
|
4
|
-
#loggingService;
|
|
5
|
-
#sessionMap = new Map(); // Mapping of responseId -> sessionId
|
|
6
|
-
#activeSessions = new Map(); // Cache of sessionId -> actual session object
|
|
7
|
-
constructor(deps) {
|
|
8
|
-
this.#settingsService = deps.settingsService;
|
|
9
|
-
this.#loggingService = deps.loggingService;
|
|
10
|
-
}
|
|
11
|
-
getModel(modelName) {
|
|
12
|
-
return new GitHubCopilotModel({
|
|
13
|
-
settingsService: this.#settingsService,
|
|
14
|
-
loggingService: this.#loggingService,
|
|
15
|
-
modelId: modelName,
|
|
16
|
-
sessionMap: this.#sessionMap,
|
|
17
|
-
activeSessions: this.#activeSessions,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
// Export factory function for dependency injection
|
|
22
|
-
export function createGitHubCopilotProvider(deps) {
|
|
23
|
-
return new GitHubCopilotProvider(deps);
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,OAAO,qBAAqB;IAC9B,gBAAgB,CAAmB;IACnC,eAAe,CAAkB;IACjC,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,qCAAqC;IAC9E,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC,CAAC,8CAA8C;IAEnG,YAAY,IAGX;QACG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC;IAC/C,CAAC;IAED,QAAQ,CAAC,SAAkB;QACvB,OAAO,IAAI,kBAAkB,CAAC;YAC1B,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,cAAc,EAAE,IAAI,CAAC,eAAe;SACvC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,mDAAmD;AACnD,MAAM,UAAU,2BAA2B,CAAC,IAG3C;IACG,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.test.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { GitHubCopilotProvider, createGitHubCopilotProvider } from './provider.js';
|
|
3
|
-
// Mock services
|
|
4
|
-
const mockSettingsService = {
|
|
5
|
-
get: (key) => {
|
|
6
|
-
if (key === 'agent.model')
|
|
7
|
-
return 'gpt-4o';
|
|
8
|
-
if (key === 'agent.github-copilot.model')
|
|
9
|
-
return 'gpt-4o';
|
|
10
|
-
return undefined;
|
|
11
|
-
},
|
|
12
|
-
set: () => { },
|
|
13
|
-
};
|
|
14
|
-
const mockLoggingService = {
|
|
15
|
-
info: () => { },
|
|
16
|
-
warn: () => { },
|
|
17
|
-
error: () => { },
|
|
18
|
-
debug: () => { },
|
|
19
|
-
security: () => { },
|
|
20
|
-
setCorrelationId: () => { },
|
|
21
|
-
getCorrelationId: () => undefined,
|
|
22
|
-
clearCorrelationId: () => { },
|
|
23
|
-
};
|
|
24
|
-
test('GitHubCopilotProvider - getModel returns GitHubCopilotModel', async (t) => {
|
|
25
|
-
const provider = new GitHubCopilotProvider({
|
|
26
|
-
settingsService: mockSettingsService,
|
|
27
|
-
loggingService: mockLoggingService,
|
|
28
|
-
});
|
|
29
|
-
const model = await provider.getModel();
|
|
30
|
-
t.truthy(model);
|
|
31
|
-
// Check that it's our model by verifying the name property we add
|
|
32
|
-
t.is(model.name, 'GitHubCopilot');
|
|
33
|
-
});
|
|
34
|
-
test('GitHubCopilotProvider - getModel accepts model override', async (t) => {
|
|
35
|
-
const provider = new GitHubCopilotProvider({
|
|
36
|
-
settingsService: mockSettingsService,
|
|
37
|
-
loggingService: mockLoggingService,
|
|
38
|
-
});
|
|
39
|
-
const model = await provider.getModel('claude-3.5-sonnet');
|
|
40
|
-
t.truthy(model);
|
|
41
|
-
// Check that it's our model by verifying the name property we add
|
|
42
|
-
t.is(model.name, 'GitHubCopilot');
|
|
43
|
-
});
|
|
44
|
-
test('createGitHubCopilotProvider - factory function works', (t) => {
|
|
45
|
-
const provider = createGitHubCopilotProvider({
|
|
46
|
-
settingsService: mockSettingsService,
|
|
47
|
-
loggingService: mockLoggingService,
|
|
48
|
-
});
|
|
49
|
-
t.truthy(provider);
|
|
50
|
-
t.true(provider instanceof GitHubCopilotProvider);
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=provider.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider.test.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAGnF,gBAAgB;AAChB,MAAM,mBAAmB,GAAqB;IAC1C,GAAG,EAAE,CAAI,GAAW,EAAK,EAAE;QACvB,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO,QAAa,CAAC;QAChD,IAAI,GAAG,KAAK,4BAA4B;YAAE,OAAO,QAAa,CAAC;QAC/D,OAAO,SAAc,CAAC;IAC1B,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAC;AAEF,MAAM,kBAAkB,GAAoB;IACxC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;IAC1B,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;IACjC,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;CAC/B,CAAC;AAEF,IAAI,CAAC,6DAA6D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC5E,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CAAC;QACvC,eAAe,EAAE,mBAAmB;QACpC,cAAc,EAAE,kBAAkB;KACrC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAExC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,kEAAkE;IAClE,CAAC,CAAC,EAAE,CAAE,KAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxE,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CAAC;QACvC,eAAe,EAAE,mBAAmB;QACpC,cAAc,EAAE,kBAAkB;KACrC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAE3D,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,kEAAkE;IAClE,CAAC,CAAC,EAAE,CAAE,KAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,2BAA2B,CAAC;QACzC,eAAe,EAAE,mBAAmB;QACpC,cAAc,EAAE,kBAAkB;KACrC,CAAC,CAAC;IAEH,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnB,CAAC,CAAC,IAAI,CAAC,QAAQ,YAAY,qBAAqB,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Check if the GitHub Copilot CLI is available.
|
|
3
|
-
* Supports both standalone `copilot` command and `gh copilot` extension.
|
|
4
|
-
* This is the synchronous version, which may block the Event Loop.
|
|
5
|
-
*/
|
|
6
|
-
export declare function isCopilotCliAvailable(): boolean;
|
|
7
|
-
/**
|
|
8
|
-
* Async version of isCopilotCliAvailable.
|
|
9
|
-
*/
|
|
10
|
-
export declare function isCopilotCliAvailableAsync(): Promise<boolean>;
|
|
11
|
-
/**
|
|
12
|
-
* Verify that the CLI is authenticated.
|
|
13
|
-
* This is the synchronous version, which may block the Event Loop.
|
|
14
|
-
*/
|
|
15
|
-
export declare function isGhAuthenticated(): boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Async version of isGhAuthenticated.
|
|
18
|
-
*/
|
|
19
|
-
export declare function isGhAuthenticatedAsync(): Promise<boolean>;
|
|
20
|
-
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/utils.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA4C/C;AAED;;GAEG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BnE;AAOD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgC3C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAsB/D"}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { spawnSync, spawn } from 'node:child_process';
|
|
2
|
-
/**
|
|
3
|
-
* Check if the GitHub Copilot CLI is available.
|
|
4
|
-
* Supports both standalone `copilot` command and `gh copilot` extension.
|
|
5
|
-
*/
|
|
6
|
-
let copilotAvailableCache = null;
|
|
7
|
-
/**
|
|
8
|
-
* Check if the GitHub Copilot CLI is available.
|
|
9
|
-
* Supports both standalone `copilot` command and `gh copilot` extension.
|
|
10
|
-
* This is the synchronous version, which may block the Event Loop.
|
|
11
|
-
*/
|
|
12
|
-
export function isCopilotCliAvailable() {
|
|
13
|
-
if (copilotAvailableCache !== null) {
|
|
14
|
-
return copilotAvailableCache;
|
|
15
|
-
}
|
|
16
|
-
try {
|
|
17
|
-
// Check for standalone copilot command first
|
|
18
|
-
const copilotResult = spawnSync('copilot', ['--version'], {
|
|
19
|
-
encoding: 'utf-8',
|
|
20
|
-
timeout: 5000,
|
|
21
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
22
|
-
});
|
|
23
|
-
if (copilotResult.status === 0) {
|
|
24
|
-
copilotAvailableCache = true;
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
// Fallback: Check if gh CLI is installed
|
|
28
|
-
const ghResult = spawnSync('gh', ['--version'], {
|
|
29
|
-
encoding: 'utf-8',
|
|
30
|
-
timeout: 5000,
|
|
31
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
32
|
-
});
|
|
33
|
-
if (ghResult.status !== 0) {
|
|
34
|
-
copilotAvailableCache = false;
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
// Check if copilot extension is installed
|
|
38
|
-
const ghCopilotResult = spawnSync('gh', ['copilot', '--help'], {
|
|
39
|
-
encoding: 'utf-8',
|
|
40
|
-
timeout: 5000,
|
|
41
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
42
|
-
});
|
|
43
|
-
const result = ghCopilotResult.status === 0;
|
|
44
|
-
copilotAvailableCache = result;
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
copilotAvailableCache = false;
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Async version of isCopilotCliAvailable.
|
|
54
|
-
*/
|
|
55
|
-
export async function isCopilotCliAvailableAsync() {
|
|
56
|
-
if (copilotAvailableCache !== null) {
|
|
57
|
-
return copilotAvailableCache;
|
|
58
|
-
}
|
|
59
|
-
const checkCommand = (command, args) => {
|
|
60
|
-
return new Promise((resolve) => {
|
|
61
|
-
const child = spawn(command, args, { stdio: 'ignore' });
|
|
62
|
-
child.on('error', () => resolve(false));
|
|
63
|
-
child.on('close', (code) => resolve(code === 0));
|
|
64
|
-
});
|
|
65
|
-
};
|
|
66
|
-
// Check for standalone copilot command first
|
|
67
|
-
if (await checkCommand('copilot', ['--version'])) {
|
|
68
|
-
copilotAvailableCache = true;
|
|
69
|
-
return true;
|
|
70
|
-
}
|
|
71
|
-
// Fallback: Check if gh CLI is installed
|
|
72
|
-
if (!(await checkCommand('gh', ['--version']))) {
|
|
73
|
-
copilotAvailableCache = false;
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
// Check if copilot extension is installed
|
|
77
|
-
const result = await checkCommand('gh', ['copilot', '--help']);
|
|
78
|
-
copilotAvailableCache = result;
|
|
79
|
-
return result;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Verify that the CLI is authenticated.
|
|
83
|
-
*/
|
|
84
|
-
let ghAuthenticatedCache = null;
|
|
85
|
-
/**
|
|
86
|
-
* Verify that the CLI is authenticated.
|
|
87
|
-
* This is the synchronous version, which may block the Event Loop.
|
|
88
|
-
*/
|
|
89
|
-
export function isGhAuthenticated() {
|
|
90
|
-
if (ghAuthenticatedCache !== null) {
|
|
91
|
-
return ghAuthenticatedCache;
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
// If we have standalone copilot, we consider it authenticated if it exists
|
|
95
|
-
// as there's no standardized 'auth status' for the standalone version yet.
|
|
96
|
-
const copilotResult = spawnSync('copilot', ['--version'], {
|
|
97
|
-
encoding: 'utf-8',
|
|
98
|
-
timeout: 5000,
|
|
99
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
100
|
-
});
|
|
101
|
-
if (copilotResult.status === 0) {
|
|
102
|
-
ghAuthenticatedCache = true;
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
const result = spawnSync('gh', ['auth', 'status'], {
|
|
106
|
-
encoding: 'utf-8',
|
|
107
|
-
timeout: 5000,
|
|
108
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
109
|
-
});
|
|
110
|
-
const status = result.status === 0;
|
|
111
|
-
ghAuthenticatedCache = status;
|
|
112
|
-
return status;
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
ghAuthenticatedCache = false;
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Async version of isGhAuthenticated.
|
|
121
|
-
*/
|
|
122
|
-
export async function isGhAuthenticatedAsync() {
|
|
123
|
-
if (ghAuthenticatedCache !== null) {
|
|
124
|
-
return ghAuthenticatedCache;
|
|
125
|
-
}
|
|
126
|
-
const checkCommand = (command, args) => {
|
|
127
|
-
return new Promise((resolve) => {
|
|
128
|
-
const child = spawn(command, args, { stdio: 'ignore' });
|
|
129
|
-
child.on('error', () => resolve(false));
|
|
130
|
-
child.on('close', (code) => resolve(code === 0));
|
|
131
|
-
});
|
|
132
|
-
};
|
|
133
|
-
// If we have standalone copilot, we consider it authenticated if it exists
|
|
134
|
-
if (await checkCommand('copilot', ['--version'])) {
|
|
135
|
-
ghAuthenticatedCache = true;
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
const result = await checkCommand('gh', ['auth', 'status']);
|
|
139
|
-
ghAuthenticatedCache = result;
|
|
140
|
-
return result;
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,IAAI,qBAAqB,GAAmB,IAAI,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACjC,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAED,IAAI,CAAC;QACD,6CAA6C;QAC7C,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE;YACtD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,qBAAqB,GAAG,IAAI,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE;YAC5C,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,qBAAqB,GAAG,KAAK,CAAC;YAC9B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,0CAA0C;QAC1C,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE;YAC3D,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5C,qBAAqB,GAAG,MAAM,CAAC;QAC/B,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACL,qBAAqB,GAAG,KAAK,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC5C,IAAI,qBAAqB,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,qBAAqB,CAAC;IACjC,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,IAAc,EAAoB,EAAE;QACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,6CAA6C;IAC7C,IAAI,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/C,qBAAqB,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,qBAAqB,GAAG,KAAK,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,qBAAqB,GAAG,MAAM,CAAC;IAC/B,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,IAAI,oBAAoB,GAAmB,IAAI,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC7B,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,oBAAoB,CAAC;IAChC,CAAC;IAED,IAAI,CAAC;QACD,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE;YACtD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,oBAAoB,GAAG,IAAI,CAAC;YAC5B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;YAC/C,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACnC,oBAAoB,GAAG,MAAM,CAAC;QAC9B,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACL,oBAAoB,GAAG,KAAK,CAAC;QAC7B,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IACxC,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,oBAAoB,CAAC;IAChC,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,IAAc,EAAoB,EAAE;QACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,2EAA2E;IAC3E,IAAI,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/C,oBAAoB,GAAG,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5D,oBAAoB,GAAG,MAAM,CAAC;IAC9B,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../source/providers/github-copilot/utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { isCopilotCliAvailable, isGhAuthenticated, isCopilotCliAvailableAsync, isGhAuthenticatedAsync, } from './utils.js';
|
|
3
|
-
// Note: These tests verify the function signatures work correctly.
|
|
4
|
-
// The actual behavior depends on the system state (whether gh CLI is installed).
|
|
5
|
-
test('isCopilotCliAvailable - returns boolean', (t) => {
|
|
6
|
-
const result = isCopilotCliAvailable();
|
|
7
|
-
t.is(typeof result, 'boolean');
|
|
8
|
-
});
|
|
9
|
-
test('isGhAuthenticated - returns boolean', (t) => {
|
|
10
|
-
const result = isGhAuthenticated();
|
|
11
|
-
t.is(typeof result, 'boolean');
|
|
12
|
-
});
|
|
13
|
-
test('isCopilotCliAvailableAsync - returns Promise<boolean>', async (t) => {
|
|
14
|
-
const result = await isCopilotCliAvailableAsync();
|
|
15
|
-
t.is(typeof result, 'boolean');
|
|
16
|
-
});
|
|
17
|
-
test('isGhAuthenticatedAsync - returns Promise<boolean>', async (t) => {
|
|
18
|
-
const result = await isGhAuthenticatedAsync();
|
|
19
|
-
t.is(typeof result, 'boolean');
|
|
20
|
-
});
|
|
21
|
-
//# sourceMappingURL=utils.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EACH,qBAAqB,EACrB,iBAAiB,EACjB,0BAA0B,EAC1B,sBAAsB,GACzB,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,iFAAiF;AAEjF,IAAI,CAAC,yCAAyC,EAAE,CAAC,CAAC,EAAE,EAAE;IAClD,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qCAAqC,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtE,MAAM,MAAM,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAClD,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,MAAM,MAAM,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC9C,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC"}
|
package/dist/safety-checker.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { OpenAI } from 'openai';
|
|
2
|
-
const client = new OpenAI();
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Evaluates if a bash command is safe to execute automatically
|
|
6
|
-
* @param {string} command - The bash command to evaluate
|
|
7
|
-
* @returns {Promise<{safe: boolean, reason: string}>}
|
|
8
|
-
*/
|
|
9
|
-
export async function isSafeCommand(command) {
|
|
10
|
-
try {
|
|
11
|
-
const response = await client.chat.completions.create({
|
|
12
|
-
model: 'gpt-4.1-mini',
|
|
13
|
-
messages: [{
|
|
14
|
-
role: 'system',
|
|
15
|
-
content: `You are a security expert evaluating bash commands for safety.
|
|
16
|
-
Analyze if the command is safe to execute automatically without user approval.
|
|
17
|
-
|
|
18
|
-
Consider DANGEROUS:
|
|
19
|
-
- Commands that delete, remove, or modify files/directories (rm, rmdir, mv to overwrite, >)
|
|
20
|
-
- Commands that change system configuration (chmod, chown, systemctl, etc.)
|
|
21
|
-
- Commands that install/uninstall software (apt, yum, npm install -g, pip install, etc.)
|
|
22
|
-
- Commands that modify user accounts or permissions
|
|
23
|
-
- Commands that interact with network in destructive ways (curl with -X DELETE, wget with -O to system files)
|
|
24
|
-
- Commands that execute arbitrary code from network sources
|
|
25
|
-
- Commands with sudo or elevated privileges
|
|
26
|
-
- Commands that shut down or reboot the system
|
|
27
|
-
- Commands that modify environment permanently (.bashrc, .profile, etc.)
|
|
28
|
-
- Commands that access sensitive files (/etc/passwd, ~/.ssh/, etc.)
|
|
29
|
-
|
|
30
|
-
Consider SAFE:
|
|
31
|
-
- Read-only commands (ls, cat, head, tail, grep, find without -exec, pwd, echo, etc.)
|
|
32
|
-
- Non-destructive information gathering (ps, top, df, du, whoami, uname, date, etc.)
|
|
33
|
-
- Simple calculations or text processing (wc, sort, uniq, awk for display, sed for display)
|
|
34
|
-
- Git read operations (git status, git log, git diff, git branch without creation)
|
|
35
|
-
- Package queries without installation (npm list, pip list, apt list)
|
|
36
|
-
- Commands that create new files in user directories (touch, echo >, mkdir in ~/)
|
|
37
|
-
|
|
38
|
-
Respond with ONLY a JSON object: {"safe": true/false, "reason": "brief explanation"}`
|
|
39
|
-
}, {
|
|
40
|
-
role: 'user',
|
|
41
|
-
content: `Evaluate this command: ${command}`
|
|
42
|
-
}],
|
|
43
|
-
temperature: 0,
|
|
44
|
-
response_format: {
|
|
45
|
-
type: 'json_object'
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
const result = JSON.parse(response.choices[0].message.content);
|
|
49
|
-
return result;
|
|
50
|
-
} catch (error) {
|
|
51
|
-
// If safety check fails, default to requiring approval (safe fallback)
|
|
52
|
-
return {
|
|
53
|
-
safe: false,
|
|
54
|
-
reason: `Safety check failed: ${error.message}`
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check_mock.d.ts","sourceRoot":"","sources":["../../source/services/check_mock.ts"],"names":[],"mappings":""}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { createMockSettingsService } from './settings-service.mock.js';
|
|
2
|
-
console.log('--- Tesing MockSettingsService ---');
|
|
3
|
-
try {
|
|
4
|
-
// Test 1: Check if overrides work with nested object (expected to work)
|
|
5
|
-
const service1 = createMockSettingsService({
|
|
6
|
-
agent: { model: 'nested-model' }
|
|
7
|
-
});
|
|
8
|
-
console.log(`Nested override 'agent.model': ${service1.get('agent.model')}`);
|
|
9
|
-
// Test 2: Check if overrides work with dot notation (likely to fail based on my analysis)
|
|
10
|
-
const service2 = createMockSettingsService({
|
|
11
|
-
'agent.model': 'flat-model'
|
|
12
|
-
});
|
|
13
|
-
console.log(`Dot-notation override 'agent.model': ${service2.get('agent.model')}`);
|
|
14
|
-
// Test 3: Check directory creation
|
|
15
|
-
// We need to inspect the settingsDir of the service.
|
|
16
|
-
// We can't access private 'settingsDir', but we can check the known path if we know tmpdir
|
|
17
|
-
// actually, let's just see if we can infer anything or just rely on code analysis for that part.
|
|
18
|
-
}
|
|
19
|
-
catch (err) {
|
|
20
|
-
console.error(err);
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=check_mock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check_mock.js","sourceRoot":"","sources":["../../source/services/check_mock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAIvE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AAElD,IAAI,CAAC;IACH,wEAAwE;IACxE,MAAM,QAAQ,GAAG,yBAAyB,CAAC;QACvC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;KACnC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE7E,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,yBAAyB,CAAC;QACvC,aAAa,EAAE,YAAY;KAC9B,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,wCAAwC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEnF,mCAAmC;IACnC,qDAAqD;IACrD,2FAA2F;IAC3F,iGAAiG;AAEnG,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-service.test.d.ts","sourceRoot":"","sources":["../../source/services/conversation-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { ConversationService } from './conversation-service.js';
|
|
3
|
-
class MockStream {
|
|
4
|
-
constructor(events) {
|
|
5
|
-
this.events = events;
|
|
6
|
-
this.completed = Promise.resolve();
|
|
7
|
-
this.lastResponseId = 'resp_test';
|
|
8
|
-
this.interruptions = [];
|
|
9
|
-
this.state = {};
|
|
10
|
-
this.newItems = [];
|
|
11
|
-
this.history = [];
|
|
12
|
-
this.finalOutput = '';
|
|
13
|
-
}
|
|
14
|
-
async *[Symbol.asyncIterator]() {
|
|
15
|
-
for (const event of this.events) {
|
|
16
|
-
yield event;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
test('emits live text chunks for response.output_text.delta events', async (t) => {
|
|
21
|
-
t.plan(3);
|
|
22
|
-
const events = [
|
|
23
|
-
{ type: 'response.output_text.delta', delta: 'Hello' },
|
|
24
|
-
{ type: 'response.output_text.delta', delta: ' world' },
|
|
25
|
-
];
|
|
26
|
-
const mockClient = {
|
|
27
|
-
async startStream() {
|
|
28
|
-
return new MockStream(events);
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
const chunks = [];
|
|
32
|
-
const service = new ConversationService({ agentClient: mockClient });
|
|
33
|
-
const result = await service.sendMessage('hi', {
|
|
34
|
-
onTextChunk(full, chunk) {
|
|
35
|
-
chunks.push({ full, chunk });
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
t.deepEqual(chunks, [
|
|
39
|
-
{ full: 'Hello', chunk: 'Hello' },
|
|
40
|
-
{ full: 'Hello world', chunk: ' world' },
|
|
41
|
-
]);
|
|
42
|
-
t.is(result.type, 'response');
|
|
43
|
-
t.is(result.finalText, 'Hello world');
|
|
44
|
-
});
|
|
45
|
-
test('passes previous response ids into subsequent runs', async (t) => {
|
|
46
|
-
const streams = [new MockStream([]), new MockStream([])];
|
|
47
|
-
streams[0].lastResponseId = 'resp-1';
|
|
48
|
-
streams[0].finalOutput = 'First run done.';
|
|
49
|
-
streams[1].lastResponseId = 'resp-2';
|
|
50
|
-
streams[1].finalOutput = 'Second run done.';
|
|
51
|
-
const startCalls = [];
|
|
52
|
-
const mockClient = {
|
|
53
|
-
async startStream(text, options) {
|
|
54
|
-
const index = startCalls.length;
|
|
55
|
-
startCalls.push({ text, options });
|
|
56
|
-
return streams[index];
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
const service = new ConversationService({ agentClient: mockClient });
|
|
60
|
-
await service.sendMessage('first');
|
|
61
|
-
const secondResult = await service.sendMessage('second');
|
|
62
|
-
t.deepEqual(startCalls, [
|
|
63
|
-
{ text: 'first', options: { previousResponseId: null } },
|
|
64
|
-
{ text: 'second', options: { previousResponseId: 'resp-1' } },
|
|
65
|
-
]);
|
|
66
|
-
t.is(secondResult.type, 'response');
|
|
67
|
-
t.is(secondResult.finalText, 'Second run done.');
|
|
68
|
-
});
|
|
69
|
-
test('emits approval interruptions and resumes after approval', async (t) => {
|
|
70
|
-
const interruption = {
|
|
71
|
-
name: 'bash',
|
|
72
|
-
agent: { name: 'CLI Agent' },
|
|
73
|
-
arguments: JSON.stringify({ command: 'echo hi' }),
|
|
74
|
-
};
|
|
75
|
-
const initialStream = new MockStream([]);
|
|
76
|
-
initialStream.interruptions = [interruption];
|
|
77
|
-
initialStream.state = {
|
|
78
|
-
approveCalls: [],
|
|
79
|
-
rejectCalls: [],
|
|
80
|
-
approve(arg) {
|
|
81
|
-
this.approveCalls.push(arg);
|
|
82
|
-
},
|
|
83
|
-
reject(arg) {
|
|
84
|
-
this.rejectCalls.push(arg);
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
const continuationStream = new MockStream([
|
|
88
|
-
{ type: 'response.output_text.delta', delta: 'Approved run' },
|
|
89
|
-
]);
|
|
90
|
-
continuationStream.finalOutput = 'Approved run';
|
|
91
|
-
const mockClient = {
|
|
92
|
-
async startStream() {
|
|
93
|
-
return initialStream;
|
|
94
|
-
},
|
|
95
|
-
async continueRunStream(state) {
|
|
96
|
-
t.is(state, initialStream.state);
|
|
97
|
-
return continuationStream;
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
const service = new ConversationService({ agentClient: mockClient });
|
|
101
|
-
const approvalResult = await service.sendMessage('run command');
|
|
102
|
-
t.is(approvalResult.type, 'approval_required');
|
|
103
|
-
t.is(approvalResult.approval.toolName, 'bash');
|
|
104
|
-
t.is(approvalResult.approval.argumentsText, 'echo hi');
|
|
105
|
-
const finalResult = await service.handleApprovalDecision('y');
|
|
106
|
-
t.truthy(finalResult);
|
|
107
|
-
t.is(finalResult.type, 'response');
|
|
108
|
-
t.is(finalResult.finalText, 'Approved run');
|
|
109
|
-
t.deepEqual(initialStream.state.approveCalls, [interruption]);
|
|
110
|
-
t.deepEqual(initialStream.state.rejectCalls, []);
|
|
111
|
-
});
|
|
112
|
-
test('dedupes command messages emitted live from run events', async (t) => {
|
|
113
|
-
const commandPayload = JSON.stringify({
|
|
114
|
-
command: 'ls',
|
|
115
|
-
stdout: 'file.txt',
|
|
116
|
-
success: true,
|
|
117
|
-
});
|
|
118
|
-
const rawItem = {
|
|
119
|
-
id: 'call-123',
|
|
120
|
-
type: 'function_call_result',
|
|
121
|
-
name: 'bash',
|
|
122
|
-
arguments: JSON.stringify({ command: 'ls' }),
|
|
123
|
-
};
|
|
124
|
-
const commandItem = {
|
|
125
|
-
type: 'tool_call_output_item',
|
|
126
|
-
name: 'bash',
|
|
127
|
-
output: commandPayload,
|
|
128
|
-
rawItem,
|
|
129
|
-
};
|
|
130
|
-
const events = [{ type: 'run_item_stream_event', item: commandItem }];
|
|
131
|
-
const stream = new MockStream(events);
|
|
132
|
-
stream.newItems = [commandItem];
|
|
133
|
-
const emitted = [];
|
|
134
|
-
const mockClient = {
|
|
135
|
-
async startStream() {
|
|
136
|
-
return stream;
|
|
137
|
-
},
|
|
138
|
-
};
|
|
139
|
-
const service = new ConversationService({ agentClient: mockClient });
|
|
140
|
-
const result = await service.sendMessage('run bash', {
|
|
141
|
-
onCommandMessage(message) {
|
|
142
|
-
emitted.push(message);
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
t.deepEqual(emitted, [
|
|
146
|
-
{
|
|
147
|
-
id: 'call-123',
|
|
148
|
-
sender: 'command',
|
|
149
|
-
command: 'ls',
|
|
150
|
-
output: 'file.txt',
|
|
151
|
-
success: true,
|
|
152
|
-
},
|
|
153
|
-
]);
|
|
154
|
-
t.deepEqual(result.commandMessages, []);
|
|
155
|
-
});
|
|
156
|
-
//# sourceMappingURL=conversation-service.test.js.map
|