@theia/ai-copilot 1.76.0-next.4 → 1.76.0-next.42
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/README.md +87 -14
- package/lib/browser/copilot-auth-dialog.d.ts.map +1 -1
- package/lib/browser/copilot-auth-dialog.js +19 -11
- package/lib/browser/copilot-auth-dialog.js.map +1 -1
- package/lib/browser/copilot-frontend-application-contribution.d.ts +21 -1
- package/lib/browser/copilot-frontend-application-contribution.d.ts.map +1 -1
- package/lib/browser/copilot-frontend-application-contribution.js +129 -26
- package/lib/browser/copilot-frontend-application-contribution.js.map +1 -1
- package/lib/common/copilot-auth-service.d.ts +27 -24
- package/lib/common/copilot-auth-service.d.ts.map +1 -1
- package/lib/common/copilot-language-models-manager.d.ts +6 -22
- package/lib/common/copilot-language-models-manager.d.ts.map +1 -1
- package/lib/common/copilot-language-models-manager.js +1 -13
- package/lib/common/copilot-language-models-manager.js.map +1 -1
- package/lib/common/copilot-preferences.d.ts +1 -0
- package/lib/common/copilot-preferences.d.ts.map +1 -1
- package/lib/common/copilot-preferences.js +24 -6
- package/lib/common/copilot-preferences.js.map +1 -1
- package/lib/common/index.d.ts +0 -1
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +0 -1
- package/lib/common/index.js.map +1 -1
- package/lib/node/copilot-auth-service-impl.d.ts +25 -16
- package/lib/node/copilot-auth-service-impl.d.ts.map +1 -1
- package/lib/node/copilot-auth-service-impl.js +67 -183
- package/lib/node/copilot-auth-service-impl.js.map +1 -1
- package/lib/node/copilot-auth-service-impl.spec.js +104 -168
- package/lib/node/copilot-auth-service-impl.spec.js.map +1 -1
- package/lib/node/copilot-backend-module.d.ts.map +1 -1
- package/lib/node/copilot-backend-module.js +10 -2
- package/lib/node/copilot-backend-module.js.map +1 -1
- package/lib/node/copilot-cli-auth-provider.d.ts +146 -0
- package/lib/node/copilot-cli-auth-provider.d.ts.map +1 -0
- package/lib/node/copilot-cli-auth-provider.js +430 -0
- package/lib/node/copilot-cli-auth-provider.js.map +1 -0
- package/lib/node/copilot-cli-auth-provider.spec.d.ts +2 -0
- package/lib/node/copilot-cli-auth-provider.spec.d.ts.map +1 -0
- package/lib/node/copilot-cli-auth-provider.spec.js +249 -0
- package/lib/node/copilot-cli-auth-provider.spec.js.map +1 -0
- package/lib/node/copilot-cli-locator.d.ts +120 -0
- package/lib/node/copilot-cli-locator.d.ts.map +1 -0
- package/lib/node/copilot-cli-locator.js +348 -0
- package/lib/node/copilot-cli-locator.js.map +1 -0
- package/lib/node/copilot-cli-locator.spec.d.ts +2 -0
- package/lib/node/copilot-cli-locator.spec.d.ts.map +1 -0
- package/lib/node/copilot-cli-locator.spec.js +327 -0
- package/lib/node/copilot-cli-locator.spec.js.map +1 -0
- package/lib/node/copilot-credential-store.d.ts +45 -0
- package/lib/node/copilot-credential-store.d.ts.map +1 -0
- package/lib/node/copilot-credential-store.js +96 -0
- package/lib/node/copilot-credential-store.js.map +1 -0
- package/lib/node/copilot-credential-store.spec.d.ts +2 -0
- package/lib/node/copilot-credential-store.spec.d.ts.map +1 -0
- package/lib/node/copilot-credential-store.spec.js +93 -0
- package/lib/node/copilot-credential-store.spec.js.map +1 -0
- package/lib/node/copilot-language-models-manager-impl.d.ts +44 -20
- package/lib/node/copilot-language-models-manager-impl.d.ts.map +1 -1
- package/lib/node/copilot-language-models-manager-impl.js +112 -65
- package/lib/node/copilot-language-models-manager-impl.js.map +1 -1
- package/lib/node/copilot-language-models-manager-impl.spec.d.ts +2 -0
- package/lib/node/copilot-language-models-manager-impl.spec.d.ts.map +1 -0
- package/lib/node/copilot-language-models-manager-impl.spec.js +162 -0
- package/lib/node/copilot-language-models-manager-impl.spec.js.map +1 -0
- package/lib/node/copilot-runtime-env.d.ts +20 -0
- package/lib/node/copilot-runtime-env.d.ts.map +1 -0
- package/lib/node/copilot-runtime-env.js +49 -0
- package/lib/node/copilot-runtime-env.js.map +1 -0
- package/lib/node/copilot-sdk-client-provider.d.ts +103 -0
- package/lib/node/copilot-sdk-client-provider.d.ts.map +1 -0
- package/lib/node/copilot-sdk-client-provider.js +247 -0
- package/lib/node/copilot-sdk-client-provider.js.map +1 -0
- package/lib/node/copilot-sdk-client-provider.spec.d.ts +2 -0
- package/lib/node/copilot-sdk-client-provider.spec.d.ts.map +1 -0
- package/lib/node/copilot-sdk-client-provider.spec.js +215 -0
- package/lib/node/copilot-sdk-client-provider.spec.js.map +1 -0
- package/lib/node/copilot-sdk-language-model.d.ts +85 -0
- package/lib/node/copilot-sdk-language-model.d.ts.map +1 -0
- package/lib/node/copilot-sdk-language-model.js +301 -0
- package/lib/node/copilot-sdk-language-model.js.map +1 -0
- package/lib/node/copilot-sdk-language-model.spec.d.ts +2 -0
- package/lib/node/copilot-sdk-language-model.spec.d.ts.map +1 -0
- package/lib/node/copilot-sdk-language-model.spec.js +315 -0
- package/lib/node/copilot-sdk-language-model.spec.js.map +1 -0
- package/lib/node/copilot-sdk-loader.d.ts +57 -0
- package/lib/node/copilot-sdk-loader.d.ts.map +1 -0
- package/lib/node/copilot-sdk-loader.js +133 -0
- package/lib/node/copilot-sdk-loader.js.map +1 -0
- package/lib/node/copilot-sdk-loader.spec.d.ts +2 -0
- package/lib/node/copilot-sdk-loader.spec.d.ts.map +1 -0
- package/lib/node/copilot-sdk-loader.spec.js +113 -0
- package/lib/node/copilot-sdk-loader.spec.js.map +1 -0
- package/lib/node/copilot-sdk-mappers.d.ts +54 -0
- package/lib/node/copilot-sdk-mappers.d.ts.map +1 -0
- package/lib/node/copilot-sdk-mappers.js +158 -0
- package/lib/node/copilot-sdk-mappers.js.map +1 -0
- package/lib/node/copilot-sdk-mappers.spec.d.ts +2 -0
- package/lib/node/copilot-sdk-mappers.spec.d.ts.map +1 -0
- package/lib/node/copilot-sdk-mappers.spec.js +168 -0
- package/lib/node/copilot-sdk-mappers.spec.js.map +1 -0
- package/lib/node/copilot-sdk-types.d.ts +208 -0
- package/lib/node/copilot-sdk-types.d.ts.map +1 -0
- package/lib/{common/copilot-oauth-config.js → node/copilot-sdk-types.js} +2 -13
- package/lib/node/copilot-sdk-types.js.map +1 -0
- package/lib/node/index.d.ts +9 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +9 -1
- package/lib/node/index.js.map +1 -1
- package/package.json +4 -6
- package/src/browser/copilot-auth-dialog.tsx +20 -16
- package/src/browser/copilot-frontend-application-contribution.ts +144 -31
- package/src/common/copilot-auth-service.ts +28 -24
- package/src/common/copilot-language-models-manager.ts +6 -29
- package/src/common/copilot-preferences.ts +24 -5
- package/src/common/index.ts +0 -1
- package/src/node/copilot-auth-service-impl.spec.ts +122 -207
- package/src/node/copilot-auth-service-impl.ts +63 -218
- package/src/node/copilot-backend-module.ts +11 -2
- package/src/node/copilot-cli-auth-provider.spec.ts +315 -0
- package/src/node/copilot-cli-auth-provider.ts +444 -0
- package/src/node/copilot-cli-locator.spec.ts +386 -0
- package/src/node/copilot-cli-locator.ts +363 -0
- package/src/node/copilot-credential-store.spec.ts +106 -0
- package/src/node/copilot-credential-store.ts +99 -0
- package/src/node/copilot-language-models-manager-impl.spec.ts +188 -0
- package/src/node/copilot-language-models-manager-impl.ts +131 -84
- package/src/node/copilot-runtime-env.ts +46 -0
- package/src/node/copilot-sdk-client-provider.spec.ts +253 -0
- package/src/node/copilot-sdk-client-provider.ts +241 -0
- package/src/node/copilot-sdk-language-model.spec.ts +377 -0
- package/src/node/copilot-sdk-language-model.ts +330 -0
- package/src/node/copilot-sdk-loader.spec.ts +126 -0
- package/src/node/copilot-sdk-loader.ts +142 -0
- package/src/node/copilot-sdk-mappers.spec.ts +190 -0
- package/src/node/copilot-sdk-mappers.ts +172 -0
- package/src/node/copilot-sdk-types.ts +290 -0
- package/src/node/index.ts +9 -1
- package/lib/common/copilot-oauth-config.d.ts +0 -33
- package/lib/common/copilot-oauth-config.d.ts.map +0 -1
- package/lib/common/copilot-oauth-config.js.map +0 -1
- package/lib/node/copilot-language-model.d.ts +0 -34
- package/lib/node/copilot-language-model.d.ts.map +0 -1
- package/lib/node/copilot-language-model.js +0 -236
- package/lib/node/copilot-language-model.js.map +0 -1
- package/lib/node/copilot-language-model.spec.d.ts +0 -2
- package/lib/node/copilot-language-model.spec.d.ts.map +0 -1
- package/lib/node/copilot-language-model.spec.js +0 -89
- package/lib/node/copilot-language-model.spec.js.map +0 -1
- package/src/common/copilot-oauth-config.ts +0 -55
- package/src/node/copilot-language-model.spec.ts +0 -106
- package/src/node/copilot-language-model.ts +0 -273
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const chai_1 = require("chai");
|
|
19
|
+
const path_1 = require("path");
|
|
20
|
+
const mock_logger_1 = require("@theia/core/lib/common/test/mock-logger");
|
|
21
|
+
const copilot_sdk_loader_1 = require("./copilot-sdk-loader");
|
|
22
|
+
/** What the loader checks for before accepting a module as the SDK. */
|
|
23
|
+
const usableSdk = {
|
|
24
|
+
CopilotClient: function CopilotClient() { },
|
|
25
|
+
RuntimeConnection: { forStdio: () => ({ kind: 'stdio' }) }
|
|
26
|
+
};
|
|
27
|
+
class TestableCopilotSdkLoader extends copilot_sdk_loader_1.CopilotSdkLoader {
|
|
28
|
+
constructor(clis) {
|
|
29
|
+
super();
|
|
30
|
+
this.clis = clis;
|
|
31
|
+
this.importedFromCli = [];
|
|
32
|
+
let call = 0;
|
|
33
|
+
Object.assign(this, {
|
|
34
|
+
logger: new mock_logger_1.MockLogger(),
|
|
35
|
+
cliLocator: { resolve: async () => this.clis[Math.min(call++, this.clis.length - 1)] }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async importShipped(entry) {
|
|
39
|
+
this.importedFromCli.push(entry);
|
|
40
|
+
return this.shipped;
|
|
41
|
+
}
|
|
42
|
+
importInstalled() {
|
|
43
|
+
if (this.installedFailure) {
|
|
44
|
+
throw this.installedFailure;
|
|
45
|
+
}
|
|
46
|
+
return this.installed;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
describe('CopilotSdkLoader', () => {
|
|
50
|
+
const cli = (0, path_1.join)('/opt', 'copilot', 'copilot');
|
|
51
|
+
it('should load the SDK that ships with the CLI', async () => {
|
|
52
|
+
const loader = new TestableCopilotSdkLoader([cli]);
|
|
53
|
+
loader.shipped = usableSdk;
|
|
54
|
+
(0, chai_1.expect)(await loader.load()).to.equal(usableSdk);
|
|
55
|
+
(0, chai_1.expect)(loader.importedFromCli).to.deep.equal([(0, path_1.join)('/opt', 'copilot', 'copilot-sdk', 'index.js')]);
|
|
56
|
+
});
|
|
57
|
+
it('should fall back to an installed SDK when the CLI does not carry one', async () => {
|
|
58
|
+
const loader = new TestableCopilotSdkLoader([cli]);
|
|
59
|
+
loader.installed = usableSdk;
|
|
60
|
+
(0, chai_1.expect)(await loader.load()).to.equal(usableSdk);
|
|
61
|
+
});
|
|
62
|
+
it('should report the CLI when neither it nor an installation provides the SDK', async () => {
|
|
63
|
+
const loader = new TestableCopilotSdkLoader([cli]);
|
|
64
|
+
loader.installedFailure = new Error("Cannot find module '@github/copilot-sdk'");
|
|
65
|
+
try {
|
|
66
|
+
await loader.load();
|
|
67
|
+
chai_1.expect.fail('should have rejected');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// The module resolution failure is of no use to the user, the CLI to update is.
|
|
71
|
+
(0, chai_1.expect)(String(error)).to.contain(cli);
|
|
72
|
+
(0, chai_1.expect)(String(error)).to.not.contain('Cannot find module');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
it('should reject an SDK that does not provide what is used', async () => {
|
|
76
|
+
const loader = new TestableCopilotSdkLoader([cli]);
|
|
77
|
+
loader.shipped = { CopilotClient: function () { } };
|
|
78
|
+
try {
|
|
79
|
+
await loader.load();
|
|
80
|
+
chai_1.expect.fail('should have rejected');
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
(0, chai_1.expect)(String(error)).to.contain(cli);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
it('should load once for as long as the CLI stays the same', async () => {
|
|
87
|
+
const loader = new TestableCopilotSdkLoader([cli]);
|
|
88
|
+
loader.shipped = usableSdk;
|
|
89
|
+
await loader.load();
|
|
90
|
+
await loader.load();
|
|
91
|
+
(0, chai_1.expect)(loader.importedFromCli).to.have.lengthOf(1);
|
|
92
|
+
});
|
|
93
|
+
it('should load again when a different CLI serves the requests', async () => {
|
|
94
|
+
const other = (0, path_1.join)('/usr', 'local', 'copilot');
|
|
95
|
+
const loader = new TestableCopilotSdkLoader([cli, other]);
|
|
96
|
+
loader.shipped = usableSdk;
|
|
97
|
+
await loader.load();
|
|
98
|
+
await loader.load();
|
|
99
|
+
(0, chai_1.expect)(loader.importedFromCli).to.deep.equal([
|
|
100
|
+
(0, path_1.join)('/opt', 'copilot', 'copilot-sdk', 'index.js'),
|
|
101
|
+
(0, path_1.join)('/usr', 'local', 'copilot-sdk', 'index.js')
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
it('should not remember a failed load, since the CLI can be replaced while running', async () => {
|
|
105
|
+
const loader = new TestableCopilotSdkLoader([cli]);
|
|
106
|
+
loader.shipped = {};
|
|
107
|
+
await loader.load().catch(() => { });
|
|
108
|
+
loader.shipped = usableSdk;
|
|
109
|
+
(0, chai_1.expect)(await loader.load()).to.equal(usableSdk);
|
|
110
|
+
(0, chai_1.expect)(loader.importedFromCli).to.have.lengthOf(2);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=copilot-sdk-loader.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-sdk-loader.spec.js","sourceRoot":"","sources":["../../src/node/copilot-sdk-loader.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { LanguageModelMessage } from '@theia/ai-core';
|
|
2
|
+
import type { BlobMessageAttachment, ModelInfo, SystemMessageConfig } from './copilot-sdk-types';
|
|
3
|
+
/**
|
|
4
|
+
* Selects the model IDs that should be surfaced to Theia from the list returned
|
|
5
|
+
* by `CopilotClient.listModels()`.
|
|
6
|
+
*
|
|
7
|
+
* Models whose policy is explicitly `disabled` are filtered out; `enabled` and
|
|
8
|
+
* `unconfigured` models are kept. Order is preserved and duplicates are removed.
|
|
9
|
+
*
|
|
10
|
+
* The list can name the same model both by its family and by its dated releases, and both are kept:
|
|
11
|
+
* the family is what the model pickers offer, while a dated release stays selectable for anyone who
|
|
12
|
+
* wants to pin one. This mirrors the other providers, where discovery reports every release and only
|
|
13
|
+
* the undated ids are featured.
|
|
14
|
+
*/
|
|
15
|
+
export declare function selectSdkModelIds(models: ModelInfo[]): string[];
|
|
16
|
+
/**
|
|
17
|
+
* The result of flattening a Theia message history into a single prompt for the
|
|
18
|
+
* agentic Copilot SDK session.
|
|
19
|
+
*/
|
|
20
|
+
export interface SdkPrompt {
|
|
21
|
+
/** Concatenated content of all system messages (may be empty). */
|
|
22
|
+
systemText: string;
|
|
23
|
+
/** The user-facing prompt body derived from the non-system messages. */
|
|
24
|
+
prompt: string;
|
|
25
|
+
/** Base64-encoded images pulled out of the user's messages, sent alongside the prompt. */
|
|
26
|
+
attachments?: BlobMessageAttachment[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Flattens a Theia message history into an {@link SdkPrompt}.
|
|
30
|
+
*
|
|
31
|
+
* The Copilot SDK session is a stateful agent that accepts a single prompt
|
|
32
|
+
* string per `send()` call, so the full Theia history is collapsed here. System
|
|
33
|
+
* messages are extracted separately and become the system message of the session,
|
|
34
|
+
* see {@link buildSdkSystemMessage}. A lone user turn is forwarded verbatim;
|
|
35
|
+
* richer histories are rendered as a role-labelled transcript.
|
|
36
|
+
*
|
|
37
|
+
* Base64 user images are pulled out of the history and sent as blob attachments instead of
|
|
38
|
+
* being flattened into the prompt text, see {@link isAttachableImageMessage}. This is otherwise
|
|
39
|
+
* a lossy mapping by design, see the limitations documented in the package README, and is
|
|
40
|
+
* intended for single-turn requests.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildSdkPrompt(messages: LanguageModelMessage[]): SdkPrompt;
|
|
43
|
+
/**
|
|
44
|
+
* Builds the system message configuration of a session from the system text of a request.
|
|
45
|
+
*
|
|
46
|
+
* The CLI is an agent with a system prompt of its own, while a Theia agent brings a complete one.
|
|
47
|
+
* The sections that describe who the agent is and how it should work are therefore removed, so that
|
|
48
|
+
* they cannot contradict the prompt of the Theia agent, and the prompt is added in their place. The
|
|
49
|
+
* sections that make tool calling work and the ones that carry the safety rules of the CLI are kept:
|
|
50
|
+
* this integration declares Theia's tools to the CLI, so the model still has to be told how to call
|
|
51
|
+
* them. Replacing the message as a whole would drop those as well.
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildSdkSystemMessage(systemText: string): SystemMessageConfig | undefined;
|
|
54
|
+
//# sourceMappingURL=copilot-sdk-mappers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-sdk-mappers.d.ts","sourceRoot":"","sources":["../../src/node/copilot-sdk-mappers.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAkD,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEjG;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAc/D;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACzC;AA4CD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,SAAS,CA6B1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAczF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.selectSdkModelIds = selectSdkModelIds;
|
|
19
|
+
exports.buildSdkPrompt = buildSdkPrompt;
|
|
20
|
+
exports.buildSdkSystemMessage = buildSdkSystemMessage;
|
|
21
|
+
const ai_core_1 = require("@theia/ai-core");
|
|
22
|
+
/**
|
|
23
|
+
* Selects the model IDs that should be surfaced to Theia from the list returned
|
|
24
|
+
* by `CopilotClient.listModels()`.
|
|
25
|
+
*
|
|
26
|
+
* Models whose policy is explicitly `disabled` are filtered out; `enabled` and
|
|
27
|
+
* `unconfigured` models are kept. Order is preserved and duplicates are removed.
|
|
28
|
+
*
|
|
29
|
+
* The list can name the same model both by its family and by its dated releases, and both are kept:
|
|
30
|
+
* the family is what the model pickers offer, while a dated release stays selectable for anyone who
|
|
31
|
+
* wants to pin one. This mirrors the other providers, where discovery reports every release and only
|
|
32
|
+
* the undated ids are featured.
|
|
33
|
+
*/
|
|
34
|
+
function selectSdkModelIds(models) {
|
|
35
|
+
const result = [];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const model of models) {
|
|
38
|
+
if (!model.id || seen.has(model.id)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (model.policy && model.policy.state === 'disabled') {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
seen.add(model.id);
|
|
45
|
+
result.push(model.id);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
function roleLabel(message) {
|
|
50
|
+
switch (message.actor) {
|
|
51
|
+
case 'ai':
|
|
52
|
+
return 'Assistant';
|
|
53
|
+
case 'system':
|
|
54
|
+
return 'System';
|
|
55
|
+
default:
|
|
56
|
+
return 'User';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Whether a message is a user image the SDK can be sent as a blob attachment.
|
|
61
|
+
*
|
|
62
|
+
* URL images are not covered: the SDK's attachments carry inline data, not a remote reference,
|
|
63
|
+
* and fetching the URL on the backend to inline it would add a server-side-request-forgery
|
|
64
|
+
* surface for what is, today, not a use case Theia exercises.
|
|
65
|
+
*/
|
|
66
|
+
function isAttachableImageMessage(message) {
|
|
67
|
+
return ai_core_1.LanguageModelMessage.isImageMessage(message) && message.actor === 'user' && ai_core_1.ImageContent.isBase64(message.image);
|
|
68
|
+
}
|
|
69
|
+
function messageToText(message) {
|
|
70
|
+
if (ai_core_1.LanguageModelMessage.isTextMessage(message)) {
|
|
71
|
+
return message.text;
|
|
72
|
+
}
|
|
73
|
+
if (ai_core_1.LanguageModelMessage.isToolUseMessage(message)) {
|
|
74
|
+
return `[tool call: ${message.name} ${JSON.stringify(message.input)}]`;
|
|
75
|
+
}
|
|
76
|
+
if (ai_core_1.LanguageModelMessage.isToolResultMessage(message)) {
|
|
77
|
+
const content = message.content === undefined
|
|
78
|
+
? ''
|
|
79
|
+
: (typeof message.content === 'string' ? message.content : JSON.stringify(message.content));
|
|
80
|
+
return `[tool result: ${content}]`;
|
|
81
|
+
}
|
|
82
|
+
if (ai_core_1.LanguageModelMessage.isImageMessage(message)) {
|
|
83
|
+
// Reached for URL images and non-user image messages; base64 user images are attachments instead, see buildSdkPrompt.
|
|
84
|
+
return '[image omitted]';
|
|
85
|
+
}
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Flattens a Theia message history into an {@link SdkPrompt}.
|
|
90
|
+
*
|
|
91
|
+
* The Copilot SDK session is a stateful agent that accepts a single prompt
|
|
92
|
+
* string per `send()` call, so the full Theia history is collapsed here. System
|
|
93
|
+
* messages are extracted separately and become the system message of the session,
|
|
94
|
+
* see {@link buildSdkSystemMessage}. A lone user turn is forwarded verbatim;
|
|
95
|
+
* richer histories are rendered as a role-labelled transcript.
|
|
96
|
+
*
|
|
97
|
+
* Base64 user images are pulled out of the history and sent as blob attachments instead of
|
|
98
|
+
* being flattened into the prompt text, see {@link isAttachableImageMessage}. This is otherwise
|
|
99
|
+
* a lossy mapping by design, see the limitations documented in the package README, and is
|
|
100
|
+
* intended for single-turn requests.
|
|
101
|
+
*/
|
|
102
|
+
function buildSdkPrompt(messages) {
|
|
103
|
+
const systemParts = [];
|
|
104
|
+
const conversation = [];
|
|
105
|
+
const attachments = [];
|
|
106
|
+
for (const message of messages) {
|
|
107
|
+
if (message.actor === 'system' && ai_core_1.LanguageModelMessage.isTextMessage(message)) {
|
|
108
|
+
systemParts.push(message.text);
|
|
109
|
+
}
|
|
110
|
+
else if (message.type === 'thinking') {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
else if (isAttachableImageMessage(message)) {
|
|
114
|
+
attachments.push({ type: 'blob', data: message.image.base64data, mimeType: message.image.mimeType });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
conversation.push(message);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const systemText = systemParts.join('\n\n').trim();
|
|
121
|
+
let prompt;
|
|
122
|
+
if (conversation.length === 1 && ai_core_1.LanguageModelMessage.isTextMessage(conversation[0]) && conversation[0].actor === 'user') {
|
|
123
|
+
prompt = conversation[0].text;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
prompt = conversation
|
|
127
|
+
.map(message => `${roleLabel(message)}: ${messageToText(message)}`)
|
|
128
|
+
.join('\n\n')
|
|
129
|
+
.trim();
|
|
130
|
+
}
|
|
131
|
+
return { systemText, prompt, attachments: attachments.length > 0 ? attachments : undefined };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Builds the system message configuration of a session from the system text of a request.
|
|
135
|
+
*
|
|
136
|
+
* The CLI is an agent with a system prompt of its own, while a Theia agent brings a complete one.
|
|
137
|
+
* The sections that describe who the agent is and how it should work are therefore removed, so that
|
|
138
|
+
* they cannot contradict the prompt of the Theia agent, and the prompt is added in their place. The
|
|
139
|
+
* sections that make tool calling work and the ones that carry the safety rules of the CLI are kept:
|
|
140
|
+
* this integration declares Theia's tools to the CLI, so the model still has to be told how to call
|
|
141
|
+
* them. Replacing the message as a whole would drop those as well.
|
|
142
|
+
*/
|
|
143
|
+
function buildSdkSystemMessage(systemText) {
|
|
144
|
+
if (!systemText) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
mode: 'customize',
|
|
149
|
+
sections: {
|
|
150
|
+
identity: { action: 'remove' },
|
|
151
|
+
tone: { action: 'remove' },
|
|
152
|
+
guidelines: { action: 'remove' },
|
|
153
|
+
code_change_rules: { action: 'remove' }
|
|
154
|
+
},
|
|
155
|
+
content: systemText
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=copilot-sdk-mappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-sdk-mappers.js","sourceRoot":"","sources":["../../src/node/copilot-sdk-mappers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-sdk-mappers.spec.d.ts","sourceRoot":"","sources":["../../src/node/copilot-sdk-mappers.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const chai_1 = require("chai");
|
|
19
|
+
const copilot_sdk_mappers_1 = require("./copilot-sdk-mappers");
|
|
20
|
+
// Minimal ModelInfo factory: selectSdkModelIds only reads `id` and `policy.state`.
|
|
21
|
+
function model(id, state) {
|
|
22
|
+
return { id, policy: state ? { state } : undefined };
|
|
23
|
+
}
|
|
24
|
+
describe('copilot-sdk-mappers - selectSdkModelIds', () => {
|
|
25
|
+
it('keeps enabled and unconfigured models and drops disabled ones', () => {
|
|
26
|
+
const result = (0, copilot_sdk_mappers_1.selectSdkModelIds)([
|
|
27
|
+
model('gpt-4o', 'enabled'),
|
|
28
|
+
model('o1', 'disabled'),
|
|
29
|
+
model('claude', 'unconfigured'),
|
|
30
|
+
model('gpt-5')
|
|
31
|
+
]);
|
|
32
|
+
(0, chai_1.expect)(result).to.deep.equal(['gpt-4o', 'claude', 'gpt-5']);
|
|
33
|
+
});
|
|
34
|
+
it('preserves order and removes duplicates', () => {
|
|
35
|
+
const result = (0, copilot_sdk_mappers_1.selectSdkModelIds)([
|
|
36
|
+
model('a', 'enabled'),
|
|
37
|
+
model('b', 'enabled'),
|
|
38
|
+
model('a', 'enabled')
|
|
39
|
+
]);
|
|
40
|
+
(0, chai_1.expect)(result).to.deep.equal(['a', 'b']);
|
|
41
|
+
});
|
|
42
|
+
it('keeps a dated release alongside its family, so a release can be pinned', () => {
|
|
43
|
+
const result = (0, copilot_sdk_mappers_1.selectSdkModelIds)([
|
|
44
|
+
model('gpt-5'),
|
|
45
|
+
model('gpt-5-2026-04-17'),
|
|
46
|
+
model('claude-sonnet-5'),
|
|
47
|
+
model('claude-sonnet-5-20260514')
|
|
48
|
+
]);
|
|
49
|
+
// Which of them the model pickers offer is decided by the favorite models service, which
|
|
50
|
+
// features the families; the releases stay selectable for whoever wants one.
|
|
51
|
+
(0, chai_1.expect)(result).to.deep.equal(['gpt-5', 'gpt-5-2026-04-17', 'claude-sonnet-5', 'claude-sonnet-5-20260514']);
|
|
52
|
+
});
|
|
53
|
+
it('keeps a dated release that is the only way to select that model', () => {
|
|
54
|
+
const result = (0, copilot_sdk_mappers_1.selectSdkModelIds)([model('gpt-5'), model('o5-preview-2026-03-01')]);
|
|
55
|
+
(0, chai_1.expect)(result).to.deep.equal(['gpt-5', 'o5-preview-2026-03-01']);
|
|
56
|
+
});
|
|
57
|
+
it('keeps a dated release whose family is disabled by policy', () => {
|
|
58
|
+
const result = (0, copilot_sdk_mappers_1.selectSdkModelIds)([model('gpt-5', 'disabled'), model('gpt-5-2026-04-17')]);
|
|
59
|
+
(0, chai_1.expect)(result).to.deep.equal(['gpt-5-2026-04-17']);
|
|
60
|
+
});
|
|
61
|
+
it('returns an empty list when given no models', () => {
|
|
62
|
+
(0, chai_1.expect)((0, copilot_sdk_mappers_1.selectSdkModelIds)([])).to.deep.equal([]);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('copilot-sdk-mappers - buildSdkPrompt', () => {
|
|
66
|
+
it('forwards a lone user turn verbatim with no system text', () => {
|
|
67
|
+
const messages = [
|
|
68
|
+
{ actor: 'user', type: 'text', text: 'hello world' }
|
|
69
|
+
];
|
|
70
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
71
|
+
(0, chai_1.expect)(result.systemText).to.equal('');
|
|
72
|
+
(0, chai_1.expect)(result.prompt).to.equal('hello world');
|
|
73
|
+
});
|
|
74
|
+
it('extracts and concatenates system messages', () => {
|
|
75
|
+
const messages = [
|
|
76
|
+
{ actor: 'system', type: 'text', text: 'You are helpful.' },
|
|
77
|
+
{ actor: 'system', type: 'text', text: 'Be concise.' },
|
|
78
|
+
{ actor: 'user', type: 'text', text: 'hi' }
|
|
79
|
+
];
|
|
80
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
81
|
+
(0, chai_1.expect)(result.systemText).to.equal('You are helpful.\n\nBe concise.');
|
|
82
|
+
(0, chai_1.expect)(result.prompt).to.equal('hi');
|
|
83
|
+
});
|
|
84
|
+
it('renders a multi-message history as a role-labelled transcript', () => {
|
|
85
|
+
const messages = [
|
|
86
|
+
{ actor: 'user', type: 'text', text: 'first' },
|
|
87
|
+
{ actor: 'ai', type: 'text', text: 'reply' },
|
|
88
|
+
{ actor: 'user', type: 'text', text: 'second' }
|
|
89
|
+
];
|
|
90
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
91
|
+
(0, chai_1.expect)(result.prompt).to.equal('User: first\n\nAssistant: reply\n\nUser: second');
|
|
92
|
+
});
|
|
93
|
+
it('drops thinking messages from the conversation body', () => {
|
|
94
|
+
const messages = [
|
|
95
|
+
{ actor: 'ai', type: 'thinking', thinking: 'internal', signature: 's' },
|
|
96
|
+
{ actor: 'user', type: 'text', text: 'only user' }
|
|
97
|
+
];
|
|
98
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
99
|
+
(0, chai_1.expect)(result.prompt).to.equal('only user');
|
|
100
|
+
});
|
|
101
|
+
it('summarises tool use and tool result messages in the transcript', () => {
|
|
102
|
+
const messages = [
|
|
103
|
+
{ actor: 'user', type: 'text', text: 'run it' },
|
|
104
|
+
{ actor: 'ai', type: 'tool_use', id: 'call_1', name: 'foo', input: { x: 1 } },
|
|
105
|
+
{ actor: 'user', type: 'tool_result', tool_use_id: 'call_1', name: 'foo', content: 'done' }
|
|
106
|
+
];
|
|
107
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
108
|
+
(0, chai_1.expect)(result.prompt).to.equal('User: run it\n\nAssistant: [tool call: foo {"x":1}]\n\nUser: [tool result: done]');
|
|
109
|
+
});
|
|
110
|
+
it('turns a base64 user image into a blob attachment and drops it from the prompt text', () => {
|
|
111
|
+
const messages = [
|
|
112
|
+
{ actor: 'user', type: 'text', text: 'what is this?' },
|
|
113
|
+
{ actor: 'user', type: 'image', image: { base64data: 'aGk=', mimeType: 'image/png' } }
|
|
114
|
+
];
|
|
115
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
116
|
+
(0, chai_1.expect)(result.prompt).to.equal('what is this?');
|
|
117
|
+
(0, chai_1.expect)(result.attachments).to.deep.equal([{ type: 'blob', data: 'aGk=', mimeType: 'image/png' }]);
|
|
118
|
+
});
|
|
119
|
+
it('collects multiple base64 images in message order', () => {
|
|
120
|
+
const messages = [
|
|
121
|
+
{ actor: 'user', type: 'image', image: { base64data: 'AAA=', mimeType: 'image/png' } },
|
|
122
|
+
{ actor: 'user', type: 'image', image: { base64data: 'BBB=', mimeType: 'image/jpeg' } }
|
|
123
|
+
];
|
|
124
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
125
|
+
(0, chai_1.expect)(result.attachments).to.deep.equal([
|
|
126
|
+
{ type: 'blob', data: 'AAA=', mimeType: 'image/png' },
|
|
127
|
+
{ type: 'blob', data: 'BBB=', mimeType: 'image/jpeg' }
|
|
128
|
+
]);
|
|
129
|
+
});
|
|
130
|
+
it('leaves attachments undefined when there are no images', () => {
|
|
131
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)([{ actor: 'user', type: 'text', text: 'hi' }]);
|
|
132
|
+
(0, chai_1.expect)(result.attachments).to.be.undefined;
|
|
133
|
+
});
|
|
134
|
+
it('does not attach a URL image and renders it as an omitted placeholder instead', () => {
|
|
135
|
+
const messages = [
|
|
136
|
+
{ actor: 'user', type: 'text', text: 'look' },
|
|
137
|
+
{ actor: 'user', type: 'image', image: { url: 'https://example.com/a.png' } }
|
|
138
|
+
];
|
|
139
|
+
const result = (0, copilot_sdk_mappers_1.buildSdkPrompt)(messages);
|
|
140
|
+
(0, chai_1.expect)(result.attachments).to.be.undefined;
|
|
141
|
+
(0, chai_1.expect)(result.prompt).to.equal('User: look\n\nUser: [image omitted]');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('copilot-sdk-mappers - buildSdkSystemMessage', () => {
|
|
145
|
+
it('carries the system text as the content of the system message', () => {
|
|
146
|
+
const systemMessage = (0, copilot_sdk_mappers_1.buildSdkSystemMessage)('be helpful');
|
|
147
|
+
(0, chai_1.expect)(systemMessage?.mode).to.equal('customize');
|
|
148
|
+
(0, chai_1.expect)(systemMessage?.content).to.equal('be helpful');
|
|
149
|
+
});
|
|
150
|
+
it('removes the agent instructions of the CLI that the Theia prompt replaces', () => {
|
|
151
|
+
const systemMessage = (0, copilot_sdk_mappers_1.buildSdkSystemMessage)('be helpful');
|
|
152
|
+
const sections = systemMessage?.mode === 'customize' ? systemMessage.sections : undefined;
|
|
153
|
+
(0, chai_1.expect)(Object.keys(sections ?? {})).to.have.members(['identity', 'tone', 'guidelines', 'code_change_rules']);
|
|
154
|
+
for (const section of Object.values(sections ?? {})) {
|
|
155
|
+
(0, chai_1.expect)(section?.action).to.equal('remove');
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
it('keeps the tool instructions of the CLI, which tool calling relies on', () => {
|
|
159
|
+
const systemMessage = (0, copilot_sdk_mappers_1.buildSdkSystemMessage)('be helpful');
|
|
160
|
+
const sections = systemMessage?.mode === 'customize' ? systemMessage.sections : undefined;
|
|
161
|
+
(0, chai_1.expect)(sections).to.not.have.property('tool_instructions');
|
|
162
|
+
(0, chai_1.expect)(sections).to.not.have.property('safety');
|
|
163
|
+
});
|
|
164
|
+
it('configures nothing when the request has no system text', () => {
|
|
165
|
+
(0, chai_1.expect)((0, copilot_sdk_mappers_1.buildSdkSystemMessage)('')).to.be.undefined;
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=copilot-sdk-mappers.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-sdk-mappers.spec.js","sourceRoot":"","sources":["../../src/node/copilot-sdk-mappers.spec.ts"],"names":[],"mappings":"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"}
|