@qduc/term2 0.1.2 → 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.d.ts.map +1 -1
- package/dist/app.js +3 -1
- package/dist/app.js.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +20 -0
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/ChatMessage.js +1 -1
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +3 -8
- 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/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/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.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +7 -3
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +5 -0
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +6 -0
- package/dist/hooks/use-settings-completion.test.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.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +35 -15
- package/dist/lib/openai-agent-client.js.map +1 -1
- 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/lib/tool-invoke.test.js +1 -1
- package/dist/lib/tool-invoke.test.js.map +1 -1
- 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/model.d.ts.map +1 -1
- package/dist/providers/openai-compatible/model.js +13 -2
- package/dist/providers/openai-compatible/model.js.map +1 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +2 -2
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/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 +2 -2
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter.test.js +30 -21
- package/dist/providers/openrouter.test.js.map +1 -1
- package/dist/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-store.test.js +12 -11
- package/dist/services/conversation-store.test.js.map +1 -1
- package/dist/services/settings-service.d.ts +12 -3
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +26 -0
- package/dist/services/settings-service.js.map +1 -1
- package/dist/tools/ask-mentor.d.ts +1 -1
- package/dist/tools/ask-mentor.d.ts.map +1 -1
- package/dist/tools/ask-mentor.js +1 -0
- package/dist/tools/ask-mentor.js.map +1 -1
- package/dist/tools/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/find-files.d.ts +2 -2
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +2 -0
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +1 -0
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +10 -9
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +24 -19
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts +3 -1
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +331 -19
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +241 -2
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/search.d.ts +4 -4
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +4 -0
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +2 -2
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +2 -0
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/types.d.ts +2 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/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.find.test.js +19 -21
- package/dist/utils/command-safety.find.test.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/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/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +13 -4
- package/dist/utils/settings-command.js.map +1 -1
- package/package.json +10 -4
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { CopilotClient } from '@github/copilot-sdk';
|
|
5
|
+
// Load simple.md system prompt (same as other providers)
|
|
6
|
+
const SIMPLE_PROMPT_PATH = path.join(import.meta.dirname, '../../prompts/simple.md');
|
|
7
|
+
const SIMPLE_PROMPT = fs.readFileSync(SIMPLE_PROMPT_PATH, 'utf-8').trim();
|
|
8
|
+
import { buildMessagesFromRequest, extractFunctionToolsFromRequest, normalizeUsage, } from './converters.js';
|
|
9
|
+
// Global map to store pending tool resolutions: SessionID -> CallID -> ResolveFunction
|
|
10
|
+
// This allows us to "detach" the tool execution from the SDK's internal loop
|
|
11
|
+
// and hand it over to the Agent Runner, then resume it later.
|
|
12
|
+
const pendingResolutions = new Map();
|
|
13
|
+
// Singleton client - SDK manages CLI process lifecycle
|
|
14
|
+
export let sharedClient = null;
|
|
15
|
+
export async function getClient() {
|
|
16
|
+
if (!sharedClient) {
|
|
17
|
+
sharedClient = new CopilotClient();
|
|
18
|
+
await sharedClient.start();
|
|
19
|
+
}
|
|
20
|
+
return sharedClient;
|
|
21
|
+
}
|
|
22
|
+
export function extractCopilotTextDelta(accumulated, incoming) {
|
|
23
|
+
if (!incoming)
|
|
24
|
+
return '';
|
|
25
|
+
if (!accumulated)
|
|
26
|
+
return incoming;
|
|
27
|
+
// 1. If incoming starts with accumulated, it's definitely an accumulation
|
|
28
|
+
if (incoming.startsWith(accumulated)) {
|
|
29
|
+
return incoming.slice(accumulated.length);
|
|
30
|
+
}
|
|
31
|
+
// 2. Check for overlap: find the longest suffix of 'accumulated' that is a prefix of 'incoming'
|
|
32
|
+
// We only check up to a reasonable length to avoid O(N^2) on very long outputs,
|
|
33
|
+
// though usually deltas are small.
|
|
34
|
+
const maxOverlap = Math.min(accumulated.length, incoming.length);
|
|
35
|
+
for (let len = maxOverlap; len > 0; len--) {
|
|
36
|
+
const suffix = accumulated.slice(-len);
|
|
37
|
+
const prefix = incoming.slice(0, len);
|
|
38
|
+
if (suffix === prefix) {
|
|
39
|
+
return incoming.slice(len);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// 3. No overlap found, treat as a pure delta
|
|
43
|
+
return incoming;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Force stop the shared client (for cleanup/error recovery)
|
|
47
|
+
*/
|
|
48
|
+
export async function forceStopClient() {
|
|
49
|
+
if (sharedClient) {
|
|
50
|
+
try {
|
|
51
|
+
await sharedClient.forceStop();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Ignore errors during cleanup
|
|
55
|
+
}
|
|
56
|
+
sharedClient = null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class GitHubCopilotModel {
|
|
60
|
+
name;
|
|
61
|
+
#modelId;
|
|
62
|
+
#settingsService;
|
|
63
|
+
#loggingService;
|
|
64
|
+
#sessionMap;
|
|
65
|
+
#activeSessions;
|
|
66
|
+
constructor(deps) {
|
|
67
|
+
this.name = 'GitHubCopilot';
|
|
68
|
+
this.#settingsService = deps.settingsService;
|
|
69
|
+
this.#loggingService = deps.loggingService;
|
|
70
|
+
this.#sessionMap = deps.sessionMap || new Map();
|
|
71
|
+
this.#activeSessions = deps.activeSessions || new Map();
|
|
72
|
+
this.#modelId =
|
|
73
|
+
deps.modelId ||
|
|
74
|
+
this.#settingsService.get('agent.github-copilot.model') ||
|
|
75
|
+
this.#settingsService.get('agent.model') ||
|
|
76
|
+
'gpt-4o';
|
|
77
|
+
}
|
|
78
|
+
async getResponse(request) {
|
|
79
|
+
// For non-streaming requests, collect all events and build response
|
|
80
|
+
const events = [];
|
|
81
|
+
for await (const event of this.getStreamedResponse(request)) {
|
|
82
|
+
events.push(event);
|
|
83
|
+
}
|
|
84
|
+
// Find the response_done event
|
|
85
|
+
const doneEvent = events.find((e) => e.type === 'response_done');
|
|
86
|
+
if (doneEvent?.response) {
|
|
87
|
+
return {
|
|
88
|
+
responseId: doneEvent.response.id || randomUUID(),
|
|
89
|
+
output: doneEvent.response.output || [],
|
|
90
|
+
usage: normalizeUsage(doneEvent.response.usage),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Fallback: build response from accumulated events
|
|
94
|
+
const textDeltas = events
|
|
95
|
+
.filter((e) => e.type === 'output_text_delta')
|
|
96
|
+
.map((e) => e.delta)
|
|
97
|
+
.join('');
|
|
98
|
+
return {
|
|
99
|
+
responseId: randomUUID(),
|
|
100
|
+
output: textDeltas ? [{
|
|
101
|
+
type: 'message',
|
|
102
|
+
role: 'assistant',
|
|
103
|
+
status: 'completed',
|
|
104
|
+
content: [{ type: 'output_text', text: textDeltas }],
|
|
105
|
+
}] : [],
|
|
106
|
+
usage: normalizeUsage({}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async *getStreamedResponse(request) {
|
|
110
|
+
const client = await getClient();
|
|
111
|
+
const resolvedModelId = this.#resolveModelFromRequest(request) || this.#modelId;
|
|
112
|
+
const messages = buildMessagesFromRequest(request, resolvedModelId, this.#loggingService);
|
|
113
|
+
this.#loggingService.debug('GitHubCopilot stream start', {
|
|
114
|
+
messageCount: messages.length,
|
|
115
|
+
modelId: resolvedModelId,
|
|
116
|
+
previousResponseId: request.previousResponseId || request.providerData?.previousResponseId,
|
|
117
|
+
});
|
|
118
|
+
const tools = extractFunctionToolsFromRequest(request);
|
|
119
|
+
// Wrap tools with the "Trap" handler that suspends execution
|
|
120
|
+
const copilotTools = tools.map((t) => ({
|
|
121
|
+
name: t.function.name,
|
|
122
|
+
description: t.function.description,
|
|
123
|
+
parameters: t.function.parameters,
|
|
124
|
+
handler: async (_args, invocation) => {
|
|
125
|
+
this.#loggingService.debug('Copilot tool trap activated', {
|
|
126
|
+
tool: invocation.toolName,
|
|
127
|
+
callId: invocation.toolCallId,
|
|
128
|
+
});
|
|
129
|
+
return new Promise((resolve) => {
|
|
130
|
+
if (!pendingResolutions.has(invocation.sessionId)) {
|
|
131
|
+
pendingResolutions.set(invocation.sessionId, new Map());
|
|
132
|
+
}
|
|
133
|
+
pendingResolutions.get(invocation.sessionId).set(invocation.toolCallId, resolve);
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
}));
|
|
137
|
+
let session;
|
|
138
|
+
let hasPendingToolResolutions = false;
|
|
139
|
+
try {
|
|
140
|
+
// Check both the standard request field and our custom providerData fallback
|
|
141
|
+
const prevResponseId = request.previousResponseId || request.providerData?.previousResponseId;
|
|
142
|
+
const prevSessionId = prevResponseId
|
|
143
|
+
? this.#sessionMap.get(prevResponseId)
|
|
144
|
+
: undefined;
|
|
145
|
+
// Check if there are pending tool resolutions for this session BEFORE we decide on re-registration
|
|
146
|
+
// This is critical: if we're resuming a suspended tool, we MUST NOT re-register handlers
|
|
147
|
+
// because the SDK is waiting on the original handler's promise
|
|
148
|
+
if (prevSessionId) {
|
|
149
|
+
const existingResolutions = pendingResolutions.get(prevSessionId);
|
|
150
|
+
hasPendingToolResolutions = existingResolutions ? existingResolutions.size > 0 : false;
|
|
151
|
+
this.#loggingService.debug('Checking pending tool resolutions before session setup', {
|
|
152
|
+
prevSessionId,
|
|
153
|
+
hasPendingToolResolutions,
|
|
154
|
+
pendingCallIds: existingResolutions ? Array.from(existingResolutions.keys()) : [],
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// First, try to get a cached session object
|
|
158
|
+
const cachedSession = prevSessionId
|
|
159
|
+
? this.#activeSessions.get(prevSessionId)
|
|
160
|
+
: undefined;
|
|
161
|
+
if (cachedSession) {
|
|
162
|
+
// Reuse the cached session
|
|
163
|
+
this.#loggingService.debug('Reusing cached GitHubCopilot session', {
|
|
164
|
+
sessionId: prevSessionId,
|
|
165
|
+
hasPendingToolResolutions,
|
|
166
|
+
});
|
|
167
|
+
session = cachedSession;
|
|
168
|
+
// CRITICAL: Only re-register tools if there are NO pending resolutions
|
|
169
|
+
// If there ARE pending resolutions, the SDK is waiting on the original handlers' promises
|
|
170
|
+
// Re-registering would create new handlers and break the promise chain
|
|
171
|
+
if (!hasPendingToolResolutions) {
|
|
172
|
+
this.#loggingService.debug('Re-registering tools for new turn (no pending resolutions)');
|
|
173
|
+
session.registerTools(copilotTools);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.#loggingService.debug('Skipping tool re-registration (pending resolutions exist)');
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (prevSessionId) {
|
|
180
|
+
// Session ID exists but no cached object - need to resume from server
|
|
181
|
+
// IMPORTANT: If there are pending resolutions but no cached session,
|
|
182
|
+
// those promises are orphaned (the original session object is gone).
|
|
183
|
+
// We must clear them and proceed fresh.
|
|
184
|
+
if (hasPendingToolResolutions) {
|
|
185
|
+
this.#loggingService.warn('Orphaned pending resolutions detected (cached session gone)', {
|
|
186
|
+
sessionId: prevSessionId,
|
|
187
|
+
pendingCallIds: Array.from(pendingResolutions.get(prevSessionId)?.keys() || []),
|
|
188
|
+
});
|
|
189
|
+
pendingResolutions.delete(prevSessionId);
|
|
190
|
+
hasPendingToolResolutions = false;
|
|
191
|
+
}
|
|
192
|
+
this.#loggingService.debug('Resuming GitHubCopilot session from server', {
|
|
193
|
+
sessionId: prevSessionId,
|
|
194
|
+
});
|
|
195
|
+
session = await client.resumeSession(prevSessionId, {
|
|
196
|
+
streaming: true,
|
|
197
|
+
tools: copilotTools,
|
|
198
|
+
});
|
|
199
|
+
// Cache the resumed session for future turns
|
|
200
|
+
this.#activeSessions.set(session.sessionId, session);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// No previous session - create a new one
|
|
204
|
+
this.#loggingService.debug('Creating new GitHubCopilot session');
|
|
205
|
+
session = await client.createSession({
|
|
206
|
+
model: resolvedModelId,
|
|
207
|
+
streaming: true,
|
|
208
|
+
tools: copilotTools,
|
|
209
|
+
availableTools: copilotTools.map((t) => t.name),
|
|
210
|
+
systemMessage: {
|
|
211
|
+
mode: 'replace',
|
|
212
|
+
content: SIMPLE_PROMPT,
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
// Cache the new session for future turns
|
|
216
|
+
this.#activeSessions.set(session.sessionId, session);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
this.#loggingService.error('GitHubCopilot session creation/resumption failed', {
|
|
221
|
+
error: err.message,
|
|
222
|
+
});
|
|
223
|
+
// Emit error as a model event since ResponseStreamEvent doesn't have error type
|
|
224
|
+
yield {
|
|
225
|
+
type: 'model',
|
|
226
|
+
event: { type: 'error', message: `Failed to create/resume Copilot session: ${err.message}` },
|
|
227
|
+
};
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const state = {
|
|
231
|
+
accumulated: '',
|
|
232
|
+
accumulatedReasoningText: '',
|
|
233
|
+
accumulatedToolCalls: [],
|
|
234
|
+
responseId: randomUUID(),
|
|
235
|
+
usageData: null,
|
|
236
|
+
};
|
|
237
|
+
// Track new sessionId for future resumption
|
|
238
|
+
this.#sessionMap.set(state.responseId, session.sessionId);
|
|
239
|
+
// Set up event handlers and collect events via async iteration
|
|
240
|
+
const eventQueue = [];
|
|
241
|
+
let resolveNext = null;
|
|
242
|
+
let done = false;
|
|
243
|
+
let error = null;
|
|
244
|
+
const pushEvent = (event) => {
|
|
245
|
+
if (resolveNext) {
|
|
246
|
+
resolveNext({ value: event, done: false });
|
|
247
|
+
resolveNext = null;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
eventQueue.push(event);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
// Track unsubscribe function for cleanup
|
|
254
|
+
let unsubscribeEvents = null;
|
|
255
|
+
const finish = (err) => {
|
|
256
|
+
done = true;
|
|
257
|
+
error = err || null;
|
|
258
|
+
// Unsubscribe from events to prevent handler accumulation
|
|
259
|
+
if (unsubscribeEvents) {
|
|
260
|
+
unsubscribeEvents();
|
|
261
|
+
unsubscribeEvents = null;
|
|
262
|
+
}
|
|
263
|
+
// If there was an error, remove session from cache so a fresh one is created next time
|
|
264
|
+
if (err && session) {
|
|
265
|
+
this.#activeSessions.delete(session.sessionId);
|
|
266
|
+
}
|
|
267
|
+
if (resolveNext) {
|
|
268
|
+
if (err) {
|
|
269
|
+
resolveNext = null;
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
resolveNext({ value: undefined, done: true });
|
|
273
|
+
resolveNext = null;
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
// Register event handlers on the session (returns unsubscribe function)
|
|
277
|
+
unsubscribeEvents = session.on(async (event) => {
|
|
278
|
+
try {
|
|
279
|
+
switch (event.type) {
|
|
280
|
+
case 'assistant.message_delta':
|
|
281
|
+
// Streaming text chunk
|
|
282
|
+
if (event.data?.deltaContent) {
|
|
283
|
+
const delta = extractCopilotTextDelta(state.accumulated, event.data.deltaContent);
|
|
284
|
+
if (delta) {
|
|
285
|
+
state.accumulated += delta;
|
|
286
|
+
pushEvent({
|
|
287
|
+
type: 'output_text_delta',
|
|
288
|
+
delta,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
case 'assistant.reasoning_delta':
|
|
294
|
+
// Streaming reasoning (O1/O3 models)
|
|
295
|
+
if (event.data?.deltaContent) {
|
|
296
|
+
state.accumulatedReasoningText += event.data.deltaContent;
|
|
297
|
+
// Emit as model event for reasoning channel
|
|
298
|
+
pushEvent({
|
|
299
|
+
type: 'model',
|
|
300
|
+
event: {
|
|
301
|
+
type: 'reasoning_delta',
|
|
302
|
+
content: event.data.deltaContent,
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
break;
|
|
307
|
+
case 'tool.execution_start':
|
|
308
|
+
// Tool call requested
|
|
309
|
+
if (event.data) {
|
|
310
|
+
this.#loggingService.debug('GitHubCopilot tool.execution_start', {
|
|
311
|
+
data: event.data,
|
|
312
|
+
});
|
|
313
|
+
const toolName = event.data.toolName;
|
|
314
|
+
if (!toolName) {
|
|
315
|
+
this.#loggingService.error('GitHubCopilot tool execution missing name', { data: event.data });
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
const rawArgs = event.data.arguments || event.data.args || {};
|
|
319
|
+
const argsString = typeof rawArgs === 'string'
|
|
320
|
+
? rawArgs
|
|
321
|
+
: JSON.stringify(rawArgs);
|
|
322
|
+
const toolCall = {
|
|
323
|
+
type: 'function_call',
|
|
324
|
+
callId: event.data.toolCallId || event.data.callId || randomUUID(),
|
|
325
|
+
name: toolName,
|
|
326
|
+
arguments: argsString,
|
|
327
|
+
};
|
|
328
|
+
state.accumulatedToolCalls.push(toolCall);
|
|
329
|
+
// Check if this is a user tool that requires external handling
|
|
330
|
+
// We look it up in our 'copilotTools' list
|
|
331
|
+
const isUserTool = copilotTools.some((t) => t.name === toolName);
|
|
332
|
+
if (isUserTool) {
|
|
333
|
+
this.#loggingService.debug('Detaching stream for user tool execution', {
|
|
334
|
+
tool: toolName,
|
|
335
|
+
callId: toolCall.callId,
|
|
336
|
+
});
|
|
337
|
+
// Yield the function call event to the Runner (streaming)
|
|
338
|
+
pushEvent({
|
|
339
|
+
type: 'model',
|
|
340
|
+
event: {
|
|
341
|
+
type: 'function_call',
|
|
342
|
+
callId: toolCall.callId,
|
|
343
|
+
name: toolCall.name,
|
|
344
|
+
arguments: toolCall.arguments,
|
|
345
|
+
}
|
|
346
|
+
});
|
|
347
|
+
// WAIT FOR TRAP: Ensure the SDK handler has actually run and registered the promise
|
|
348
|
+
// This prevents a race condition where the next turn starts before the trap is set.
|
|
349
|
+
// We poll for up to 1 second.
|
|
350
|
+
let attempts = 0;
|
|
351
|
+
const maxAttempts = 20;
|
|
352
|
+
while (attempts < maxAttempts) {
|
|
353
|
+
const sessionPending = pendingResolutions.get(session.sessionId);
|
|
354
|
+
if (sessionPending && sessionPending.has(toolCall.callId)) {
|
|
355
|
+
this.#loggingService.debug('Trap confirmed: pending resolution registered', {
|
|
356
|
+
callId: toolCall.callId,
|
|
357
|
+
attempts
|
|
358
|
+
});
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
await new Promise(r => setTimeout(r, 50));
|
|
362
|
+
attempts++;
|
|
363
|
+
}
|
|
364
|
+
if (attempts >= maxAttempts) {
|
|
365
|
+
this.#loggingService.error('Trap timeout: Handler did not register promise in time', {
|
|
366
|
+
callId: toolCall.callId
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
// IMPORTANT: Emit response_done so the Runner captures the responseId.
|
|
370
|
+
// This allows the next turn to pass 'previousResponseId' correctly,
|
|
371
|
+
// which we need to look up the session and resume the suspended tool.
|
|
372
|
+
const output = this.#buildStreamOutput(state);
|
|
373
|
+
pushEvent({
|
|
374
|
+
type: 'response_done',
|
|
375
|
+
response: {
|
|
376
|
+
id: state.responseId,
|
|
377
|
+
usage: normalizeUsage(state.usageData),
|
|
378
|
+
output,
|
|
379
|
+
},
|
|
380
|
+
});
|
|
381
|
+
// SIGNAL COMPLETION OF THIS STREAM SEGMENT
|
|
382
|
+
finish();
|
|
383
|
+
return; // Stop processing further events in this loop
|
|
384
|
+
}
|
|
385
|
+
// If it's an internal tool (like report_intent), we just let it run
|
|
386
|
+
// The SDK will call the internal handler, get the result, and continue streaming
|
|
387
|
+
// We don't emit anything to the Runner yet.
|
|
388
|
+
}
|
|
389
|
+
break;
|
|
390
|
+
case 'session.usage':
|
|
391
|
+
// Usage data
|
|
392
|
+
if (event.data) {
|
|
393
|
+
state.usageData = event.data;
|
|
394
|
+
}
|
|
395
|
+
break;
|
|
396
|
+
case 'session.idle':
|
|
397
|
+
// Session complete - emit response_done
|
|
398
|
+
this.#loggingService.debug('GitHubCopilot stream done', {
|
|
399
|
+
text: state.accumulated,
|
|
400
|
+
toolCalls: state.accumulatedToolCalls.length,
|
|
401
|
+
});
|
|
402
|
+
const output = this.#buildStreamOutput(state);
|
|
403
|
+
pushEvent({
|
|
404
|
+
type: 'response_done',
|
|
405
|
+
response: {
|
|
406
|
+
id: state.responseId,
|
|
407
|
+
usage: normalizeUsage(state.usageData),
|
|
408
|
+
output,
|
|
409
|
+
},
|
|
410
|
+
});
|
|
411
|
+
finish();
|
|
412
|
+
break;
|
|
413
|
+
case 'session.error':
|
|
414
|
+
// Handle errors
|
|
415
|
+
this.#loggingService.error('GitHubCopilot session error', {
|
|
416
|
+
error: event.data?.message,
|
|
417
|
+
});
|
|
418
|
+
// Emit error as a model event since ResponseStreamEvent doesn't have error type
|
|
419
|
+
pushEvent({
|
|
420
|
+
type: 'model',
|
|
421
|
+
event: { type: 'error', message: event.data?.message || 'Unknown error' },
|
|
422
|
+
});
|
|
423
|
+
finish(new Error(event.data?.message || 'Session error'));
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
this.#loggingService.error('GitHubCopilot event processing error', {
|
|
429
|
+
error: err.message,
|
|
430
|
+
eventType: event.type,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
// Send the messages to start the conversation
|
|
435
|
+
// Check if we are in "Resume/Tool Output" mode
|
|
436
|
+
const sessionResolutions = pendingResolutions.get(session.sessionId);
|
|
437
|
+
let isResumingTool = false;
|
|
438
|
+
if (sessionResolutions && sessionResolutions.size > 0) {
|
|
439
|
+
this.#loggingService.debug('Attempting to resolve suspended tool calls', {
|
|
440
|
+
sessionId: session.sessionId,
|
|
441
|
+
pendingCallIds: Array.from(sessionResolutions.keys()),
|
|
442
|
+
inputItemCount: Array.isArray(request.input) ? request.input.length : 0,
|
|
443
|
+
});
|
|
444
|
+
// Look for tool outputs in the request input that match pending traps
|
|
445
|
+
// The Runner appends the output to the history
|
|
446
|
+
if (request.input && Array.isArray(request.input)) {
|
|
447
|
+
for (const item of request.input) {
|
|
448
|
+
// Check for function_call_output type (mapped from SDK)
|
|
449
|
+
if (item.type === 'function_call_output') {
|
|
450
|
+
const callId = item.callId;
|
|
451
|
+
const hasPending = callId && sessionResolutions.has(callId);
|
|
452
|
+
this.#loggingService.debug('Checking input item for tool resolution', {
|
|
453
|
+
type: item.type,
|
|
454
|
+
callId,
|
|
455
|
+
hasPending,
|
|
456
|
+
});
|
|
457
|
+
if (hasPending) {
|
|
458
|
+
const output = item.output;
|
|
459
|
+
this.#loggingService.debug('Resolving suspended tool call', {
|
|
460
|
+
callId,
|
|
461
|
+
outputLength: output?.length,
|
|
462
|
+
outputPreview: typeof output === 'string' ? output.slice(0, 50) : 'obj',
|
|
463
|
+
});
|
|
464
|
+
const resolve = sessionResolutions.get(callId);
|
|
465
|
+
resolve(output); // UNBLOCK the SDK handler!
|
|
466
|
+
sessionResolutions.delete(callId);
|
|
467
|
+
isResumingTool = true;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
this.#loggingService.debug('No pending tool resolutions for this session', {
|
|
475
|
+
sessionId: session.sessionId,
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
// Only send a new prompt if we are NOT resuming a tool call
|
|
479
|
+
if (!isResumingTool) {
|
|
480
|
+
try {
|
|
481
|
+
// Build the prompt from the last user message
|
|
482
|
+
const lastUserMessage = messages.filter(m => m.role === 'user').pop();
|
|
483
|
+
const prompt = lastUserMessage?.content || '';
|
|
484
|
+
if (prompt) {
|
|
485
|
+
await session.send({
|
|
486
|
+
prompt,
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
// If no prompt and no tool resume, we might assume it's just a continue?
|
|
491
|
+
// Or maybe we should send an empty space to trigger generation?
|
|
492
|
+
// For now, assume if prompt is empty it might be an issue, but let's try sending it.
|
|
493
|
+
// Actually Copilot SDK might error on empty prompt.
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
catch (err) {
|
|
497
|
+
this.#loggingService.error('GitHubCopilot send failed', {
|
|
498
|
+
error: err.message,
|
|
499
|
+
});
|
|
500
|
+
yield {
|
|
501
|
+
type: 'model',
|
|
502
|
+
event: { type: 'error', message: `Failed to send message: ${err.message}` },
|
|
503
|
+
};
|
|
504
|
+
try {
|
|
505
|
+
await session.abort();
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
// Ignore abort errors
|
|
509
|
+
}
|
|
510
|
+
// Clean up event handler before returning
|
|
511
|
+
if (unsubscribeEvents) {
|
|
512
|
+
unsubscribeEvents();
|
|
513
|
+
unsubscribeEvents = null;
|
|
514
|
+
}
|
|
515
|
+
// Remove session from cache on error
|
|
516
|
+
this.#activeSessions.delete(session.sessionId);
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// If isResumingTool is true, we simply let the event loop below capture the continuation events!
|
|
521
|
+
// Yield events as they come in
|
|
522
|
+
while (!done || eventQueue.length > 0) {
|
|
523
|
+
if (eventQueue.length > 0) {
|
|
524
|
+
yield eventQueue.shift();
|
|
525
|
+
}
|
|
526
|
+
else if (!done) {
|
|
527
|
+
// Wait for next event
|
|
528
|
+
yield await new Promise((resolve) => {
|
|
529
|
+
resolveNext = (result) => {
|
|
530
|
+
if (result.done) {
|
|
531
|
+
// Signal completion
|
|
532
|
+
resolve({ type: 'model', event: '[DONE]' });
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
resolve(result.value);
|
|
536
|
+
}
|
|
537
|
+
};
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
if (error) {
|
|
542
|
+
throw error;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
#buildStreamOutput(state) {
|
|
546
|
+
const output = [];
|
|
547
|
+
// Add assistant message if there's text content
|
|
548
|
+
if (state.accumulated) {
|
|
549
|
+
output.push({
|
|
550
|
+
type: 'message',
|
|
551
|
+
role: 'assistant',
|
|
552
|
+
status: 'completed',
|
|
553
|
+
content: [{ type: 'output_text', text: state.accumulated }],
|
|
554
|
+
...(state.accumulatedReasoningText
|
|
555
|
+
? { reasoning: state.accumulatedReasoningText }
|
|
556
|
+
: {}),
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
// Add tool calls as separate output items
|
|
560
|
+
for (const toolCall of state.accumulatedToolCalls) {
|
|
561
|
+
output.push({
|
|
562
|
+
type: 'function_call',
|
|
563
|
+
callId: toolCall.callId,
|
|
564
|
+
name: toolCall.name,
|
|
565
|
+
arguments: toolCall.arguments,
|
|
566
|
+
status: 'completed',
|
|
567
|
+
...(state.accumulatedReasoningText
|
|
568
|
+
? { reasoning: state.accumulatedReasoningText }
|
|
569
|
+
: {}),
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
return output;
|
|
573
|
+
}
|
|
574
|
+
#resolveModelFromRequest(req) {
|
|
575
|
+
if (req?.providerData?.model) {
|
|
576
|
+
return req.providerData.model;
|
|
577
|
+
}
|
|
578
|
+
return undefined;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../source/providers/github-copilot/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ModelProvider, type Model } from '@openai/agents-core';
|
|
2
|
+
import type { ILoggingService, ISettingsService } from '../../services/service-interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* GitHubCopilotProvider - Uses the Direct model that lets Copilot SDK
|
|
5
|
+
* control tool execution flow without trying to integrate with
|
|
6
|
+
* OpenAI Agents SDK's approval pattern.
|
|
7
|
+
*/
|
|
8
|
+
export declare class GitHubCopilotProvider implements ModelProvider {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(deps: {
|
|
11
|
+
settingsService: ISettingsService;
|
|
12
|
+
loggingService: ILoggingService;
|
|
13
|
+
});
|
|
14
|
+
getModel(modelName?: string): Promise<Model> | Model;
|
|
15
|
+
}
|
|
16
|
+
export declare function createGitHubCopilotProvider(deps: {
|
|
17
|
+
settingsService: ISettingsService;
|
|
18
|
+
loggingService: ILoggingService;
|
|
19
|
+
}): GitHubCopilotProvider;
|
|
20
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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;;;;GAIG;AACH,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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { GitHubCopilotDirectModel } from './model-direct.js';
|
|
2
|
+
/**
|
|
3
|
+
* GitHubCopilotProvider - Uses the Direct model that lets Copilot SDK
|
|
4
|
+
* control tool execution flow without trying to integrate with
|
|
5
|
+
* OpenAI Agents SDK's approval pattern.
|
|
6
|
+
*/
|
|
7
|
+
export class GitHubCopilotProvider {
|
|
8
|
+
#settingsService;
|
|
9
|
+
#loggingService;
|
|
10
|
+
#sessionMap = new Map(); // Mapping of responseId -> sessionId
|
|
11
|
+
#activeSessions = new Map(); // Cache of sessionId -> actual session object
|
|
12
|
+
constructor(deps) {
|
|
13
|
+
this.#settingsService = deps.settingsService;
|
|
14
|
+
this.#loggingService = deps.loggingService;
|
|
15
|
+
}
|
|
16
|
+
getModel(modelName) {
|
|
17
|
+
return new GitHubCopilotDirectModel({
|
|
18
|
+
settingsService: this.#settingsService,
|
|
19
|
+
loggingService: this.#loggingService,
|
|
20
|
+
modelId: modelName,
|
|
21
|
+
sessionMap: this.#sessionMap,
|
|
22
|
+
activeSessions: this.#activeSessions,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Export factory function for dependency injection
|
|
27
|
+
export function createGitHubCopilotProvider(deps) {
|
|
28
|
+
return new GitHubCopilotProvider(deps);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=provider.js.map
|