@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.
Files changed (150) hide show
  1. package/README.md +87 -14
  2. package/lib/browser/copilot-auth-dialog.d.ts.map +1 -1
  3. package/lib/browser/copilot-auth-dialog.js +19 -11
  4. package/lib/browser/copilot-auth-dialog.js.map +1 -1
  5. package/lib/browser/copilot-frontend-application-contribution.d.ts +21 -1
  6. package/lib/browser/copilot-frontend-application-contribution.d.ts.map +1 -1
  7. package/lib/browser/copilot-frontend-application-contribution.js +129 -26
  8. package/lib/browser/copilot-frontend-application-contribution.js.map +1 -1
  9. package/lib/common/copilot-auth-service.d.ts +27 -24
  10. package/lib/common/copilot-auth-service.d.ts.map +1 -1
  11. package/lib/common/copilot-language-models-manager.d.ts +6 -22
  12. package/lib/common/copilot-language-models-manager.d.ts.map +1 -1
  13. package/lib/common/copilot-language-models-manager.js +1 -13
  14. package/lib/common/copilot-language-models-manager.js.map +1 -1
  15. package/lib/common/copilot-preferences.d.ts +1 -0
  16. package/lib/common/copilot-preferences.d.ts.map +1 -1
  17. package/lib/common/copilot-preferences.js +24 -6
  18. package/lib/common/copilot-preferences.js.map +1 -1
  19. package/lib/common/index.d.ts +0 -1
  20. package/lib/common/index.d.ts.map +1 -1
  21. package/lib/common/index.js +0 -1
  22. package/lib/common/index.js.map +1 -1
  23. package/lib/node/copilot-auth-service-impl.d.ts +25 -16
  24. package/lib/node/copilot-auth-service-impl.d.ts.map +1 -1
  25. package/lib/node/copilot-auth-service-impl.js +67 -183
  26. package/lib/node/copilot-auth-service-impl.js.map +1 -1
  27. package/lib/node/copilot-auth-service-impl.spec.js +104 -168
  28. package/lib/node/copilot-auth-service-impl.spec.js.map +1 -1
  29. package/lib/node/copilot-backend-module.d.ts.map +1 -1
  30. package/lib/node/copilot-backend-module.js +10 -2
  31. package/lib/node/copilot-backend-module.js.map +1 -1
  32. package/lib/node/copilot-cli-auth-provider.d.ts +146 -0
  33. package/lib/node/copilot-cli-auth-provider.d.ts.map +1 -0
  34. package/lib/node/copilot-cli-auth-provider.js +430 -0
  35. package/lib/node/copilot-cli-auth-provider.js.map +1 -0
  36. package/lib/node/copilot-cli-auth-provider.spec.d.ts +2 -0
  37. package/lib/node/copilot-cli-auth-provider.spec.d.ts.map +1 -0
  38. package/lib/node/copilot-cli-auth-provider.spec.js +249 -0
  39. package/lib/node/copilot-cli-auth-provider.spec.js.map +1 -0
  40. package/lib/node/copilot-cli-locator.d.ts +120 -0
  41. package/lib/node/copilot-cli-locator.d.ts.map +1 -0
  42. package/lib/node/copilot-cli-locator.js +348 -0
  43. package/lib/node/copilot-cli-locator.js.map +1 -0
  44. package/lib/node/copilot-cli-locator.spec.d.ts +2 -0
  45. package/lib/node/copilot-cli-locator.spec.d.ts.map +1 -0
  46. package/lib/node/copilot-cli-locator.spec.js +327 -0
  47. package/lib/node/copilot-cli-locator.spec.js.map +1 -0
  48. package/lib/node/copilot-credential-store.d.ts +45 -0
  49. package/lib/node/copilot-credential-store.d.ts.map +1 -0
  50. package/lib/node/copilot-credential-store.js +96 -0
  51. package/lib/node/copilot-credential-store.js.map +1 -0
  52. package/lib/node/copilot-credential-store.spec.d.ts +2 -0
  53. package/lib/node/copilot-credential-store.spec.d.ts.map +1 -0
  54. package/lib/node/copilot-credential-store.spec.js +93 -0
  55. package/lib/node/copilot-credential-store.spec.js.map +1 -0
  56. package/lib/node/copilot-language-models-manager-impl.d.ts +44 -20
  57. package/lib/node/copilot-language-models-manager-impl.d.ts.map +1 -1
  58. package/lib/node/copilot-language-models-manager-impl.js +112 -65
  59. package/lib/node/copilot-language-models-manager-impl.js.map +1 -1
  60. package/lib/node/copilot-language-models-manager-impl.spec.d.ts +2 -0
  61. package/lib/node/copilot-language-models-manager-impl.spec.d.ts.map +1 -0
  62. package/lib/node/copilot-language-models-manager-impl.spec.js +162 -0
  63. package/lib/node/copilot-language-models-manager-impl.spec.js.map +1 -0
  64. package/lib/node/copilot-runtime-env.d.ts +20 -0
  65. package/lib/node/copilot-runtime-env.d.ts.map +1 -0
  66. package/lib/node/copilot-runtime-env.js +49 -0
  67. package/lib/node/copilot-runtime-env.js.map +1 -0
  68. package/lib/node/copilot-sdk-client-provider.d.ts +103 -0
  69. package/lib/node/copilot-sdk-client-provider.d.ts.map +1 -0
  70. package/lib/node/copilot-sdk-client-provider.js +247 -0
  71. package/lib/node/copilot-sdk-client-provider.js.map +1 -0
  72. package/lib/node/copilot-sdk-client-provider.spec.d.ts +2 -0
  73. package/lib/node/copilot-sdk-client-provider.spec.d.ts.map +1 -0
  74. package/lib/node/copilot-sdk-client-provider.spec.js +215 -0
  75. package/lib/node/copilot-sdk-client-provider.spec.js.map +1 -0
  76. package/lib/node/copilot-sdk-language-model.d.ts +85 -0
  77. package/lib/node/copilot-sdk-language-model.d.ts.map +1 -0
  78. package/lib/node/copilot-sdk-language-model.js +301 -0
  79. package/lib/node/copilot-sdk-language-model.js.map +1 -0
  80. package/lib/node/copilot-sdk-language-model.spec.d.ts +2 -0
  81. package/lib/node/copilot-sdk-language-model.spec.d.ts.map +1 -0
  82. package/lib/node/copilot-sdk-language-model.spec.js +315 -0
  83. package/lib/node/copilot-sdk-language-model.spec.js.map +1 -0
  84. package/lib/node/copilot-sdk-loader.d.ts +57 -0
  85. package/lib/node/copilot-sdk-loader.d.ts.map +1 -0
  86. package/lib/node/copilot-sdk-loader.js +133 -0
  87. package/lib/node/copilot-sdk-loader.js.map +1 -0
  88. package/lib/node/copilot-sdk-loader.spec.d.ts +2 -0
  89. package/lib/node/copilot-sdk-loader.spec.d.ts.map +1 -0
  90. package/lib/node/copilot-sdk-loader.spec.js +113 -0
  91. package/lib/node/copilot-sdk-loader.spec.js.map +1 -0
  92. package/lib/node/copilot-sdk-mappers.d.ts +54 -0
  93. package/lib/node/copilot-sdk-mappers.d.ts.map +1 -0
  94. package/lib/node/copilot-sdk-mappers.js +158 -0
  95. package/lib/node/copilot-sdk-mappers.js.map +1 -0
  96. package/lib/node/copilot-sdk-mappers.spec.d.ts +2 -0
  97. package/lib/node/copilot-sdk-mappers.spec.d.ts.map +1 -0
  98. package/lib/node/copilot-sdk-mappers.spec.js +168 -0
  99. package/lib/node/copilot-sdk-mappers.spec.js.map +1 -0
  100. package/lib/node/copilot-sdk-types.d.ts +208 -0
  101. package/lib/node/copilot-sdk-types.d.ts.map +1 -0
  102. package/lib/{common/copilot-oauth-config.js → node/copilot-sdk-types.js} +2 -13
  103. package/lib/node/copilot-sdk-types.js.map +1 -0
  104. package/lib/node/index.d.ts +9 -1
  105. package/lib/node/index.d.ts.map +1 -1
  106. package/lib/node/index.js +9 -1
  107. package/lib/node/index.js.map +1 -1
  108. package/package.json +4 -6
  109. package/src/browser/copilot-auth-dialog.tsx +20 -16
  110. package/src/browser/copilot-frontend-application-contribution.ts +144 -31
  111. package/src/common/copilot-auth-service.ts +28 -24
  112. package/src/common/copilot-language-models-manager.ts +6 -29
  113. package/src/common/copilot-preferences.ts +24 -5
  114. package/src/common/index.ts +0 -1
  115. package/src/node/copilot-auth-service-impl.spec.ts +122 -207
  116. package/src/node/copilot-auth-service-impl.ts +63 -218
  117. package/src/node/copilot-backend-module.ts +11 -2
  118. package/src/node/copilot-cli-auth-provider.spec.ts +315 -0
  119. package/src/node/copilot-cli-auth-provider.ts +444 -0
  120. package/src/node/copilot-cli-locator.spec.ts +386 -0
  121. package/src/node/copilot-cli-locator.ts +363 -0
  122. package/src/node/copilot-credential-store.spec.ts +106 -0
  123. package/src/node/copilot-credential-store.ts +99 -0
  124. package/src/node/copilot-language-models-manager-impl.spec.ts +188 -0
  125. package/src/node/copilot-language-models-manager-impl.ts +131 -84
  126. package/src/node/copilot-runtime-env.ts +46 -0
  127. package/src/node/copilot-sdk-client-provider.spec.ts +253 -0
  128. package/src/node/copilot-sdk-client-provider.ts +241 -0
  129. package/src/node/copilot-sdk-language-model.spec.ts +377 -0
  130. package/src/node/copilot-sdk-language-model.ts +330 -0
  131. package/src/node/copilot-sdk-loader.spec.ts +126 -0
  132. package/src/node/copilot-sdk-loader.ts +142 -0
  133. package/src/node/copilot-sdk-mappers.spec.ts +190 -0
  134. package/src/node/copilot-sdk-mappers.ts +172 -0
  135. package/src/node/copilot-sdk-types.ts +290 -0
  136. package/src/node/index.ts +9 -1
  137. package/lib/common/copilot-oauth-config.d.ts +0 -33
  138. package/lib/common/copilot-oauth-config.d.ts.map +0 -1
  139. package/lib/common/copilot-oauth-config.js.map +0 -1
  140. package/lib/node/copilot-language-model.d.ts +0 -34
  141. package/lib/node/copilot-language-model.d.ts.map +0 -1
  142. package/lib/node/copilot-language-model.js +0 -236
  143. package/lib/node/copilot-language-model.js.map +0 -1
  144. package/lib/node/copilot-language-model.spec.d.ts +0 -2
  145. package/lib/node/copilot-language-model.spec.d.ts.map +0 -1
  146. package/lib/node/copilot-language-model.spec.js +0 -89
  147. package/lib/node/copilot-language-model.spec.js.map +0 -1
  148. package/src/common/copilot-oauth-config.ts +0 -55
  149. package/src/node/copilot-language-model.spec.ts +0 -106
  150. package/src/node/copilot-language-model.ts +0 -273
@@ -1,39 +1,63 @@
1
- import { LanguageModelRegistry, LanguageModelStatus } from '@theia/ai-core';
2
- import { Disposable, DisposableCollection, ILogger } from '@theia/core';
1
+ import { LanguageModelRegistry, LanguageModelStatus, ModelDiscoveryResult } from '@theia/ai-core';
2
+ import { DisposableCollection, ILogger } from '@theia/core';
3
3
  import { CopilotLanguageModelsManager, CopilotModelDescription } from '../common';
4
- import { CopilotOAuthConfig } from '../common/copilot-oauth-config';
4
+ import { CopilotSdkClientProvider } from './copilot-sdk-client-provider';
5
5
  import { CopilotAuthServiceImpl } from './copilot-auth-service-impl';
6
6
  /**
7
7
  * Backend implementation of the Copilot language models manager.
8
8
  * Manages registration and lifecycle of Copilot language models in the AI language model registry.
9
9
  */
10
- export declare class CopilotLanguageModelsManagerImpl implements CopilotLanguageModelsManager, Disposable {
10
+ export declare class CopilotLanguageModelsManagerImpl implements CopilotLanguageModelsManager {
11
11
  protected readonly languageModelRegistry: LanguageModelRegistry;
12
12
  protected readonly authService: CopilotAuthServiceImpl;
13
- protected readonly oauthConfig: CopilotOAuthConfig;
13
+ protected readonly sdkClientProvider: CopilotSdkClientProvider;
14
14
  protected readonly logger: ILogger;
15
- protected enterpriseUrl: string | undefined;
16
15
  protected readonly toDispose: DisposableCollection;
16
+ /**
17
+ * Why the last model discovery failed, if it did.
18
+ *
19
+ * Being signed in does not imply that requests are accepted: the credentials can lack the Copilot
20
+ * entitlement, be revoked, or belong to a subscription served by a different API host. Reporting
21
+ * the models as ready in those cases claims a working setup that is not there, so the failure is
22
+ * remembered and reflected in the status of the models.
23
+ */
24
+ protected discoveryFailure: string | undefined;
17
25
  protected init(): void;
18
- dispose(): void;
19
- setEnterpriseUrl(url: string | undefined): void;
26
+ /**
27
+ * Detaches from the auth service when the container this manager lives in goes away.
28
+ * Unbinding a container runs `@preDestroy` rather than `dispose`, see the client provider.
29
+ */
30
+ protected stop(): void;
20
31
  protected calculateStatus(): Promise<LanguageModelStatus>;
21
32
  createOrUpdateLanguageModels(...modelDescriptions: CopilotModelDescription[]): Promise<void>;
22
33
  removeLanguageModels(...modelIds: string[]): void;
23
34
  refreshModelsStatus(): Promise<void>;
24
- fetchAvailableModelIds(): Promise<string[]>;
35
+ fetchAvailableModels(): Promise<ModelDiscoveryResult>;
36
+ /**
37
+ * Nominates the models the chat input should show without the user asking, up to
38
+ * {@link NOMINATED_MODEL_COUNT}. Copilot serves models of several vendors under one provider, so
39
+ * ranking them against each other by the numbers in their ids would show several models of
40
+ * whichever vendor counts highest and none of the others. The list is therefore filled vendor by
41
+ * vendor: `auto` first, which lets Copilot itself choose and is the entry most users want, then the
42
+ * newest model of each major vendor, then the next of each in turn until the list is full.
43
+ *
44
+ * Everything else Copilot carries is left to be chosen deliberately: the list is meant to be the
45
+ * handful of models one switches between while chatting, not a survey of the catalogue.
46
+ *
47
+ * Release-pinned ids are left out: the undated id of the same model is nominated, and pinning a
48
+ * release is the deliberate choice the check on its row makes.
49
+ */
50
+ protected selectFeaturedModelIds(modelIds: string[]): Set<string>;
51
+ /**
52
+ * The vendor a Copilot model id belongs to, or `undefined` for a vendor that is not nominated.
53
+ * Matching on the id is all there is — the CLI reports nothing else — and it is deliberately narrow:
54
+ * a model of a vendor this does not name is still registered and still selectable, it is simply not
55
+ * one of the few the chat input starts with.
56
+ */
57
+ protected vendorOf(id: string): string | undefined;
25
58
  /**
26
- * Deduplicates models returned by the Copilot API.
27
- * The API returns both alias IDs (e.g., `gpt-4o`) and versioned IDs
28
- * (e.g., `gpt-4o-2024-11-20`) for the same model family.
29
- * We keep only the family alias when it exists, falling back to
30
- * the versioned ID otherwise.
59
+ * Records the outcome of the last model discovery and reflects it in the status of the models.
31
60
  */
32
- protected deduplicateModels(models: Array<{
33
- id: string;
34
- capabilities?: {
35
- family?: string;
36
- };
37
- }>): string[];
61
+ protected setDiscoveryFailure(failure: string | undefined): Promise<void>;
38
62
  }
39
63
  //# sourceMappingURL=copilot-language-models-manager-impl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot-language-models-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/copilot-language-models-manager-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAA6C,MAAM,WAAW,CAAC;AAC7H,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;GAGG;AACH,qBACa,gCAAiC,YAAW,4BAA4B,EAAE,UAAU;IAG7F,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAGhE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAGvD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAGnD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAG1D,SAAS,CAAC,IAAI,IAAI,IAAI;IAMtB,OAAO,IAAI,IAAI;IAIf,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;cAI/B,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQzD,4BAA4B,CAAC,GAAG,iBAAiB,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoClG,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAI3C,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAapC,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmCjD;;;;;;OAMG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,GAAG,MAAM,EAAE;CAyB3G"}
1
+ {"version":3,"file":"copilot-language-models-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/copilot-language-models-manager-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAoB,qBAAqB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAO,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAuB,MAAM,WAAW,CAAC;AAoBvG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;GAGG;AACH,qBACa,gCAAiC,YAAW,4BAA4B;IAGjF,SAAS,CAAC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAGhE,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAGvD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;IAG/D,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAE1D;;;;;;;OAOG;IACH,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAG/C,SAAS,CAAC,IAAI,IAAI,IAAI;IAQtB;;;OAGG;IAEH,SAAS,CAAC,IAAI,IAAI,IAAI;cAIN,eAAe,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAWzD,4BAA4B,CAAC,GAAG,iBAAiB,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BlG,oBAAoB,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAI3C,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAapC,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAgB3D;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAiCjE;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOlD;;OAEG;cACa,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAOlF"}
@@ -21,8 +21,23 @@ const ai_core_1 = require("@theia/ai-core");
21
21
  const core_1 = require("@theia/core");
22
22
  const inversify_1 = require("@theia/core/shared/inversify");
23
23
  const common_1 = require("../common");
24
- const copilot_oauth_config_1 = require("../common/copilot-oauth-config");
25
- const copilot_language_model_1 = require("./copilot-language-model");
24
+ /** The id under which Copilot offers its own model selection; always worth showing. */
25
+ const COPILOT_AUTO_MODEL_ID = 'auto';
26
+ /** How many models Copilot nominates, matching what the other providers feature. */
27
+ const NOMINATED_MODEL_COUNT = 5;
28
+ /**
29
+ * The vendors one Copilot model each is nominated for, recognised by the prefix of the model id.
30
+ * Deliberately the three whose models the other providers of this application offer directly: those
31
+ * are the ones a user coming to the chat input expects to switch between. Copilot carries more, and
32
+ * they remain registered and selectable — just not preselected.
33
+ */
34
+ const NOMINATED_VENDORS = [
35
+ { vendor: 'anthropic', matches: /^claude/i },
36
+ { vendor: 'openai', matches: /^(gpt|chatgpt|o\d)/i },
37
+ { vendor: 'google', matches: /^gemini/i }
38
+ ];
39
+ const copilot_sdk_language_model_1 = require("./copilot-sdk-language-model");
40
+ const copilot_sdk_client_provider_1 = require("./copilot-sdk-client-provider");
26
41
  const copilot_auth_service_impl_1 = require("./copilot-auth-service-impl");
27
42
  /**
28
43
  * Backend implementation of the Copilot language models manager.
@@ -34,42 +49,46 @@ let CopilotLanguageModelsManagerImpl = class CopilotLanguageModelsManagerImpl {
34
49
  }
35
50
  init() {
36
51
  this.toDispose.push(this.authService.onAuthStateChanged(() => {
37
- this.refreshModelsStatus();
52
+ // The listener cannot be awaited, so the failure is reported here rather than escaping as
53
+ // an unhandled rejection.
54
+ this.refreshModelsStatus().catch(error => this.logger.warn('Copilot: failed to update the status of the models:', error));
38
55
  }));
39
56
  }
40
- dispose() {
57
+ /**
58
+ * Detaches from the auth service when the container this manager lives in goes away.
59
+ * Unbinding a container runs `@preDestroy` rather than `dispose`, see the client provider.
60
+ */
61
+ stop() {
41
62
  this.toDispose.dispose();
42
63
  }
43
- setEnterpriseUrl(url) {
44
- this.enterpriseUrl = url;
45
- }
46
64
  async calculateStatus() {
47
65
  const authState = await this.authService.getAuthState();
48
- if (authState.isAuthenticated) {
49
- return { status: 'ready' };
66
+ if (!authState.isAuthenticated) {
67
+ return { status: 'unavailable', message: core_1.nls.localize('theia/ai/copilot/notSignedIn', 'Not signed in to GitHub Copilot') };
68
+ }
69
+ if (this.discoveryFailure) {
70
+ return { status: 'unavailable', message: this.discoveryFailure };
50
71
  }
51
- return { status: 'unavailable', message: 'Not signed in to GitHub Copilot' };
72
+ return { status: 'ready' };
52
73
  }
53
74
  async createOrUpdateLanguageModels(...modelDescriptions) {
54
75
  const status = await this.calculateStatus();
55
76
  for (const modelDescription of modelDescriptions) {
56
77
  const model = await this.languageModelRegistry.getLanguageModel(modelDescription.id);
57
78
  if (model) {
58
- if (!(model instanceof copilot_language_model_1.CopilotLanguageModel)) {
79
+ if (!(model instanceof copilot_sdk_language_model_1.CopilotSdkLanguageModel)) {
59
80
  this.logger.warn(`Copilot: model ${modelDescription.id} is not a Copilot model`);
60
81
  continue;
61
82
  }
62
83
  await this.languageModelRegistry.patchLanguageModel(modelDescription.id, {
63
84
  model: modelDescription.model,
64
- enableStreaming: modelDescription.enableStreaming,
65
- supportsStructuredOutput: modelDescription.supportsStructuredOutput,
66
85
  status,
67
86
  maxRetries: modelDescription.maxRetries
68
87
  });
69
88
  }
70
89
  else {
71
90
  this.languageModelRegistry.addLanguageModels([
72
- new copilot_language_model_1.CopilotLanguageModel(modelDescription.id, modelDescription.model, status, modelDescription.enableStreaming, modelDescription.supportsStructuredOutput, modelDescription.maxRetries, () => this.authService.getAccessToken(), () => this.enterpriseUrl, () => this.oauthConfig.userAgent)
91
+ new copilot_sdk_language_model_1.CopilotSdkLanguageModel(modelDescription.id, modelDescription.model, status, modelDescription.maxRetries, () => this.sdkClientProvider.getClient(), this.logger)
73
92
  ]);
74
93
  }
75
94
  }
@@ -81,73 +100,95 @@ let CopilotLanguageModelsManagerImpl = class CopilotLanguageModelsManagerImpl {
81
100
  const status = await this.calculateStatus();
82
101
  const allModels = await this.languageModelRegistry.getLanguageModels();
83
102
  for (const model of allModels) {
84
- if (model instanceof copilot_language_model_1.CopilotLanguageModel && model.id.startsWith(`${common_1.COPILOT_PROVIDER_ID}/`)) {
103
+ if (model instanceof copilot_sdk_language_model_1.CopilotSdkLanguageModel && model.id.startsWith(`${common_1.COPILOT_PROVIDER_ID}/`)) {
85
104
  await this.languageModelRegistry.patchLanguageModel(model.id, {
86
105
  status
87
106
  });
88
107
  }
89
108
  }
90
109
  }
91
- async fetchAvailableModelIds() {
92
- const accessToken = await this.authService.getAccessToken();
93
- if (!accessToken) {
94
- return [];
95
- }
96
- const baseURL = (0, common_1.getCopilotApiBaseUrl)(this.enterpriseUrl);
110
+ async fetchAvailableModels() {
97
111
  try {
98
- const response = await fetch(`${baseURL}/models`, {
99
- headers: {
100
- 'Authorization': `Bearer ${accessToken}`,
101
- 'User-Agent': this.oauthConfig.userAgent,
102
- 'Accept': 'application/json'
103
- }
104
- });
105
- if (!response.ok) {
106
- this.logger.warn(`Copilot: failed to fetch available models: ${response.status} ${response.statusText}`);
107
- return [];
108
- }
109
- const data = await response.json();
110
- const models = data.data ?? [];
111
- const modelIds = this.deduplicateModels(models);
112
- this.logger.info(`Copilot: discovered ${modelIds.length} available models: ${modelIds.join(', ')}`);
113
- return modelIds;
112
+ const modelIds = await this.sdkClientProvider.listModelIds();
113
+ this.logger.info(`Copilot: discovered ${modelIds.length} models [${modelIds.join(', ')}]`);
114
+ await this.setDiscoveryFailure(undefined);
115
+ // The CLI reports nothing but the id: no display name, and no release date to order by.
116
+ const featured = this.selectFeaturedModelIds(modelIds);
117
+ return { models: modelIds.map(id => ({ id, featured: featured.has(id) })), fromCache: false };
114
118
  }
115
119
  catch (error) {
116
- this.logger.warn('Copilot: failed to fetch available models:', error);
117
- return [];
120
+ const message = error instanceof Error ? error.message : String(error);
121
+ this.logger.warn('Copilot: failed to fetch available models via the Copilot CLI:', error);
122
+ await this.setDiscoveryFailure(message);
123
+ return { models: [], fromCache: false, error: message };
118
124
  }
119
125
  }
120
126
  /**
121
- * Deduplicates models returned by the Copilot API.
122
- * The API returns both alias IDs (e.g., `gpt-4o`) and versioned IDs
123
- * (e.g., `gpt-4o-2024-11-20`) for the same model family.
124
- * We keep only the family alias when it exists, falling back to
125
- * the versioned ID otherwise.
127
+ * Nominates the models the chat input should show without the user asking, up to
128
+ * {@link NOMINATED_MODEL_COUNT}. Copilot serves models of several vendors under one provider, so
129
+ * ranking them against each other by the numbers in their ids would show several models of
130
+ * whichever vendor counts highest and none of the others. The list is therefore filled vendor by
131
+ * vendor: `auto` first, which lets Copilot itself choose and is the entry most users want, then the
132
+ * newest model of each major vendor, then the next of each in turn until the list is full.
133
+ *
134
+ * Everything else Copilot carries is left to be chosen deliberately: the list is meant to be the
135
+ * handful of models one switches between while chatting, not a survey of the catalogue.
136
+ *
137
+ * Release-pinned ids are left out: the undated id of the same model is nominated, and pinning a
138
+ * release is the deliberate choice the check on its row makes.
126
139
  */
127
- deduplicateModels(models) {
128
- const allIds = new Set(models.map(m => m.id));
129
- const result = [];
130
- const seenFamilies = new Set();
131
- for (const model of models) {
132
- const family = model.capabilities?.family;
133
- if (family && seenFamilies.has(family)) {
140
+ selectFeaturedModelIds(modelIds) {
141
+ const featured = new Set();
142
+ const byVendor = new Map();
143
+ for (const id of modelIds) {
144
+ if (id === COPILOT_AUTO_MODEL_ID) {
145
+ featured.add(id);
146
+ continue;
147
+ }
148
+ if (ai_core_1.DiscoveredModels.undatedId(id) !== undefined) {
134
149
  continue;
135
150
  }
136
- if (family) {
137
- seenFamilies.add(family);
138
- // Prefer the family alias if it exists as a model ID
139
- if (allIds.has(family)) {
140
- result.push(family);
151
+ const vendor = this.vendorOf(id);
152
+ if (!vendor) {
153
+ continue;
154
+ }
155
+ byVendor.set(vendor, [...byVendor.get(vendor) ?? [], id]);
156
+ }
157
+ // Newest first within each vendor, the vendors themselves in the order they are named.
158
+ const ranked = NOMINATED_VENDORS.map(({ vendor }) => [...byVendor.get(vendor) ?? []].sort((left, right) => ai_core_1.DiscoveredModels.compareByVersion(left, right)));
159
+ for (let rank = 0; featured.size < NOMINATED_MODEL_COUNT && ranked.some(ids => ids.length > rank); rank++) {
160
+ for (const ids of ranked) {
161
+ if (featured.size >= NOMINATED_MODEL_COUNT) {
162
+ break;
141
163
  }
142
- else {
143
- result.push(model.id);
164
+ if (ids[rank] !== undefined) {
165
+ featured.add(ids[rank]);
144
166
  }
145
167
  }
146
- else {
147
- result.push(model.id);
148
- }
149
168
  }
150
- return result;
169
+ return featured;
170
+ }
171
+ /**
172
+ * The vendor a Copilot model id belongs to, or `undefined` for a vendor that is not nominated.
173
+ * Matching on the id is all there is — the CLI reports nothing else — and it is deliberately narrow:
174
+ * a model of a vendor this does not name is still registered and still selectable, it is simply not
175
+ * one of the few the chat input starts with.
176
+ */
177
+ vendorOf(id) {
178
+ // Matched against the last segment, so that an id the CLI qualifies with its vendor
179
+ // (`google/gemini-2.5-pro`) is recognised as readily as a bare one.
180
+ const name = id.substring(id.lastIndexOf('/') + 1);
181
+ return NOMINATED_VENDORS.find(candidate => candidate.matches.test(name))?.vendor;
182
+ }
183
+ /**
184
+ * Records the outcome of the last model discovery and reflects it in the status of the models.
185
+ */
186
+ async setDiscoveryFailure(failure) {
187
+ if (this.discoveryFailure === failure) {
188
+ return;
189
+ }
190
+ this.discoveryFailure = failure;
191
+ await this.refreshModelsStatus();
151
192
  }
152
193
  };
153
194
  exports.CopilotLanguageModelsManagerImpl = CopilotLanguageModelsManagerImpl;
@@ -160,9 +201,9 @@ tslib_1.__decorate([
160
201
  tslib_1.__metadata("design:type", copilot_auth_service_impl_1.CopilotAuthServiceImpl)
161
202
  ], CopilotLanguageModelsManagerImpl.prototype, "authService", void 0);
162
203
  tslib_1.__decorate([
163
- (0, inversify_1.inject)(copilot_oauth_config_1.CopilotOAuthConfig),
164
- tslib_1.__metadata("design:type", Object)
165
- ], CopilotLanguageModelsManagerImpl.prototype, "oauthConfig", void 0);
204
+ (0, inversify_1.inject)(copilot_sdk_client_provider_1.CopilotSdkClientProvider),
205
+ tslib_1.__metadata("design:type", copilot_sdk_client_provider_1.CopilotSdkClientProvider)
206
+ ], CopilotLanguageModelsManagerImpl.prototype, "sdkClientProvider", void 0);
166
207
  tslib_1.__decorate([
167
208
  (0, inversify_1.inject)(core_1.ILogger),
168
209
  (0, inversify_1.named)('ai-copilot:CopilotLanguageModelsManagerImpl'),
@@ -174,6 +215,12 @@ tslib_1.__decorate([
174
215
  tslib_1.__metadata("design:paramtypes", []),
175
216
  tslib_1.__metadata("design:returntype", void 0)
176
217
  ], CopilotLanguageModelsManagerImpl.prototype, "init", null);
218
+ tslib_1.__decorate([
219
+ (0, inversify_1.preDestroy)(),
220
+ tslib_1.__metadata("design:type", Function),
221
+ tslib_1.__metadata("design:paramtypes", []),
222
+ tslib_1.__metadata("design:returntype", void 0)
223
+ ], CopilotLanguageModelsManagerImpl.prototype, "stop", null);
177
224
  exports.CopilotLanguageModelsManagerImpl = CopilotLanguageModelsManagerImpl = tslib_1.__decorate([
178
225
  (0, inversify_1.injectable)()
179
226
  ], CopilotLanguageModelsManagerImpl);
@@ -1 +1 @@
1
- {"version":3,"file":"copilot-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/copilot-language-models-manager-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4CAA4E;AAC5E,sCAAwE;AACxE,4DAAwF;AACxF,sCAA6H;AAC7H,yEAAoE;AACpE,qEAAgE;AAChE,2EAAqE;AAErE;;;GAGG;AAEI,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;IAAtC;QAegB,cAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;IAiJ9D,CAAC;IA9Ia,IAAI;QACV,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACzD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,gBAAgB,CAAC,GAAuB;QACpC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;IAC7B,CAAC;IAES,KAAK,CAAC,eAAe;QAC3B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QACxD,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,4BAA4B,CAAC,GAAG,iBAA4C;QAC9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5C,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAErF,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,CAAC,KAAK,YAAY,6CAAoB,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,CAAC;oBACjF,SAAS;gBACb,CAAC;gBACD,MAAM,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAuB,gBAAgB,CAAC,EAAE,EAAE;oBAC3F,KAAK,EAAE,gBAAgB,CAAC,KAAK;oBAC7B,eAAe,EAAE,gBAAgB,CAAC,eAAe;oBACjD,wBAAwB,EAAE,gBAAgB,CAAC,wBAAwB;oBACnE,MAAM;oBACN,UAAU,EAAE,gBAAgB,CAAC,UAAU;iBAC1C,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;oBACzC,IAAI,6CAAoB,CACpB,gBAAgB,CAAC,EAAE,EACnB,gBAAgB,CAAC,KAAK,EACtB,MAAM,EACN,gBAAgB,CAAC,eAAe,EAChC,gBAAgB,CAAC,wBAAwB,EACzC,gBAAgB,CAAC,UAAU,EAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,EACvC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EACxB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CACnC;iBACJ,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,oBAAoB,CAAC,GAAG,QAAkB;QACtC,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,mBAAmB;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,KAAK,YAAY,6CAAoB,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,4BAAmB,GAAG,CAAC,EAAE,CAAC;gBAC1F,MAAM,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAuB,KAAK,CAAC,EAAE,EAAE;oBAChF,MAAM;iBACT,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB;QACxB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;QAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,6BAAoB,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,SAAS,EAAE;gBAC9C,OAAO,EAAE;oBACL,eAAe,EAAE,UAAU,WAAW,EAAE;oBACxC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;oBACxC,QAAQ,EAAE,kBAAkB;iBAC/B;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACzG,OAAO,EAAE,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAE/B,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,MAAM,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpG,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACO,iBAAiB,CAAC,MAAiE;QACzF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAEvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC;YAC1C,IAAI,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,SAAS;YACb,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACT,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACzB,qDAAqD;gBACrD,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ,CAAA;AAhKY,4EAAgC;AAGtB;IADlB,IAAA,kBAAM,EAAC,+BAAqB,CAAC;;+EACkC;AAG7C;IADlB,IAAA,kBAAM,EAAC,kDAAsB,CAAC;sCACC,kDAAsB;qEAAC;AAGpC;IADlB,IAAA,kBAAM,EAAC,yCAAkB,CAAC;;qEACwB;AAGhC;IADlB,IAAA,kBAAM,EAAC,cAAO,CAAC;IAAE,IAAA,iBAAK,EAAC,6CAA6C,CAAC;;gEACnC;AAMzB;IADT,IAAA,yBAAa,GAAE;;;;4DAKf;2CAtBQ,gCAAgC;IAD5C,IAAA,sBAAU,GAAE;GACA,gCAAgC,CAgK5C"}
1
+ {"version":3,"file":"copilot-language-models-manager-impl.js","sourceRoot":"","sources":["../../src/node/copilot-language-models-manager-impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=copilot-language-models-manager-impl.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-language-models-manager-impl.spec.d.ts","sourceRoot":"","sources":["../../src/node/copilot-language-models-manager-impl.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,162 @@
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 mock_logger_1 = require("@theia/core/lib/common/test/mock-logger");
20
+ const copilot_language_models_manager_impl_1 = require("./copilot-language-models-manager-impl");
21
+ /** A registry that records the models and the patches it received. */
22
+ class FakeRegistry {
23
+ constructor() {
24
+ this.models = [];
25
+ this.patches = [];
26
+ }
27
+ async getLanguageModel(id) {
28
+ return this.models.find(model => model.id === id);
29
+ }
30
+ async getLanguageModels() {
31
+ return this.models;
32
+ }
33
+ addLanguageModels(models) {
34
+ this.models.push(...models);
35
+ }
36
+ removeLanguageModels(ids) {
37
+ for (const id of ids) {
38
+ const index = this.models.findIndex(model => model.id === id);
39
+ if (index >= 0) {
40
+ this.models.splice(index, 1);
41
+ }
42
+ }
43
+ }
44
+ async patchLanguageModel(id, patch) {
45
+ this.patches.push({ id, patch });
46
+ Object.assign(this.models.find(model => model.id === id) ?? {}, patch);
47
+ }
48
+ }
49
+ class TestableCopilotLanguageModelsManagerImpl extends copilot_language_models_manager_impl_1.CopilotLanguageModelsManagerImpl {
50
+ callVendorOf(id) {
51
+ return this.vendorOf(id);
52
+ }
53
+ constructor(registry) {
54
+ super();
55
+ this.registry = registry;
56
+ this.authState = { isAuthenticated: true };
57
+ this.modelIds = ['gpt-5'];
58
+ Object.assign(this, {
59
+ logger: new mock_logger_1.MockLogger(),
60
+ languageModelRegistry: registry,
61
+ authService: {
62
+ getAuthState: async () => this.authState,
63
+ onAuthStateChanged: () => ({ dispose: () => { } })
64
+ },
65
+ sdkClientProvider: {
66
+ listModelIds: async () => {
67
+ if (this.listFailure) {
68
+ throw this.listFailure;
69
+ }
70
+ return this.modelIds;
71
+ }
72
+ }
73
+ });
74
+ }
75
+ callCalculateStatus() {
76
+ return this.calculateStatus();
77
+ }
78
+ }
79
+ describe('CopilotLanguageModelsManagerImpl - status', () => {
80
+ let manager;
81
+ beforeEach(() => {
82
+ manager = new TestableCopilotLanguageModelsManagerImpl(new FakeRegistry());
83
+ });
84
+ it('should report a model as ready for a user who is signed in', async () => {
85
+ await manager.createOrUpdateLanguageModels({ id: 'copilot/gpt-5', model: 'gpt-5', maxRetries: 3 });
86
+ (0, chai_1.expect)(manager.registry.models[0].status).to.deep.equal({ status: 'ready' });
87
+ });
88
+ it('should report a model as unavailable while nobody is signed in', async () => {
89
+ manager.authState = { isAuthenticated: false };
90
+ (0, chai_1.expect)(await manager.callCalculateStatus()).to.deep.include({ status: 'unavailable' });
91
+ });
92
+ it('should report models as unavailable when they cannot be listed, rather than as ready', async () => {
93
+ manager.listFailure = new Error('not authorized to use this Copilot feature');
94
+ const result = await manager.fetchAvailableModels();
95
+ (0, chai_1.expect)(result.models).to.be.empty;
96
+ (0, chai_1.expect)(result.error).to.contain('not authorized');
97
+ const status = await manager.callCalculateStatus();
98
+ (0, chai_1.expect)(status.status).to.equal('unavailable');
99
+ (0, chai_1.expect)(status.message).to.contain('not authorized');
100
+ });
101
+ it('should reflect a failed listing in the models that are already registered', async () => {
102
+ await manager.createOrUpdateLanguageModels({ id: 'copilot/gpt-5', model: 'gpt-5', maxRetries: 3 });
103
+ manager.listFailure = new Error('socket hang up');
104
+ await manager.fetchAvailableModels();
105
+ (0, chai_1.expect)(manager.registry.patches.map(patch => patch.id)).to.deep.equal(['copilot/gpt-5']);
106
+ (0, chai_1.expect)(manager.registry.models[0].status).to.deep.include({ status: 'unavailable' });
107
+ });
108
+ it('should report ready again once the models can be listed', async () => {
109
+ await manager.createOrUpdateLanguageModels({ id: 'copilot/gpt-5', model: 'gpt-5', maxRetries: 3 });
110
+ manager.listFailure = new Error('socket hang up');
111
+ await manager.fetchAvailableModels();
112
+ manager.listFailure = undefined;
113
+ (0, chai_1.expect)((await manager.fetchAvailableModels()).models).to.deep.equal([{ id: 'gpt-5', featured: true }]);
114
+ (0, chai_1.expect)(manager.registry.models[0].status).to.deep.equal({ status: 'ready' });
115
+ });
116
+ it('nominates auto and one model of each major vendor before a second of any', async () => {
117
+ manager.modelIds = ['auto', 'gpt-5', 'gpt-4.1', 'claude-sonnet-4.5', 'claude-haiku-4', 'gemini-2.5-pro', 'gpt-5-2026-04-17'];
118
+ const featured = (await manager.fetchAvailableModels()).models.filter(model => model.featured).map(model => model.id);
119
+ // Five in total: auto, the newest of each vendor, then the next of the first vendor with one left.
120
+ (0, chai_1.expect)(featured).to.have.members(['auto', 'gpt-5', 'claude-sonnet-4.5', 'gemini-2.5-pro', 'claude-haiku-4']);
121
+ });
122
+ it('fills the list to five even when the CLI offers no auto', async () => {
123
+ manager.modelIds = ['gpt-5', 'gpt-4.1', 'claude-sonnet-4.5', 'claude-haiku-4', 'gemini-3-pro', 'gemini-2.5-pro'];
124
+ const featured = (await manager.fetchAvailableModels()).models.filter(model => model.featured).map(model => model.id);
125
+ (0, chai_1.expect)(featured).to.have.members(['gpt-5', 'claude-sonnet-4.5', 'gemini-3-pro', 'gpt-4.1', 'claude-haiku-4']);
126
+ });
127
+ it('nominates no more than the five, however much one vendor offers', async () => {
128
+ manager.modelIds = ['gpt-5', 'gpt-5-mini', 'gpt-4.1', 'gpt-4o', 'o5-preview', 'chatgpt-5-latest'];
129
+ const featured = (await manager.fetchAvailableModels()).models.filter(model => model.featured).map(model => model.id);
130
+ (0, chai_1.expect)(featured).to.have.lengthOf(5);
131
+ });
132
+ it('counts the reasoning models as OpenAI, rather than as a vendor of their own', () => {
133
+ (0, chai_1.expect)(manager.callVendorOf('o5-preview')).to.equal('openai');
134
+ (0, chai_1.expect)(manager.callVendorOf('gpt-4.1')).to.equal('openai');
135
+ (0, chai_1.expect)(manager.callVendorOf('claude-sonnet-4.5')).to.equal('anthropic');
136
+ (0, chai_1.expect)(manager.callVendorOf('grok-code-fast-1')).to.equal(undefined);
137
+ });
138
+ it('nominates nothing for the vendors beyond the three, which stay selectable but not preselected', async () => {
139
+ manager.modelIds = ['claude-sonnet-4.5', 'grok-code-fast-1', 'mistral-large', 'llama-4-maverick'];
140
+ const result = await manager.fetchAvailableModels();
141
+ (0, chai_1.expect)(result.models.map(model => model.id)).to.have.lengthOf(4);
142
+ (0, chai_1.expect)(result.models.filter(model => model.featured).map(model => model.id)).to.deep.equal(['claude-sonnet-4.5']);
143
+ });
144
+ it('recognises a vendor-qualified id, in case the CLI reports them that way', async () => {
145
+ manager.modelIds = ['google/gemini-2.5-pro', 'anthropic/claude-sonnet-4.5'];
146
+ const featured = (await manager.fetchAvailableModels()).models.filter(model => model.featured).map(model => model.id);
147
+ (0, chai_1.expect)(featured).to.have.members(['google/gemini-2.5-pro', 'anthropic/claude-sonnet-4.5']);
148
+ });
149
+ it('never nominates a release-pinned id, whose undated form is nominated instead', async () => {
150
+ manager.modelIds = ['gpt-5', 'gpt-5-2026-04-17'];
151
+ const featured = (await manager.fetchAvailableModels()).models.filter(model => model.featured).map(model => model.id);
152
+ (0, chai_1.expect)(featured).to.deep.equal(['gpt-5']);
153
+ });
154
+ it('should update an existing model instead of registering it twice', async () => {
155
+ await manager.createOrUpdateLanguageModels({ id: 'copilot/gpt-5', model: 'gpt-5', maxRetries: 3 });
156
+ await manager.createOrUpdateLanguageModels({ id: 'copilot/gpt-5', model: 'gpt-5', maxRetries: 5 });
157
+ (0, chai_1.expect)(manager.registry.models).to.have.lengthOf(1);
158
+ (0, chai_1.expect)(manager.registry.patches).to.have.lengthOf(1);
159
+ (0, chai_1.expect)(manager.registry.patches[0].patch).to.deep.include({ maxRetries: 5 });
160
+ });
161
+ });
162
+ //# sourceMappingURL=copilot-language-models-manager-impl.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-language-models-manager-impl.spec.js","sourceRoot":"","sources":["../../src/node/copilot-language-models-manager-impl.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The environment of the processes this integration starts, which are the Copilot CLI of a sign-in
3
+ * and the one that serves the requests.
4
+ */
5
+ export declare namespace CopilotRuntimeEnv {
6
+ /**
7
+ * The variables the Copilot CLI accepts a token from. None of them is a sign-in of this
8
+ * application, so a token this application does not own must not reach the CLI through them.
9
+ */
10
+ const TOKEN_VARIABLES: string[];
11
+ /**
12
+ * The given environment without the variables that carry a token.
13
+ *
14
+ * They are dropped by name and regardless of their case, rather than masked with `undefined`.
15
+ * Environment variables are case-insensitive on Windows, so a `Github_Token` of the backend would
16
+ * survive a `GITHUB_TOKEN: undefined` next to it and would still be read by the CLI.
17
+ */
18
+ function withoutTokens(env: NodeJS.ProcessEnv): Record<string, string | undefined>;
19
+ }
20
+ //# sourceMappingURL=copilot-runtime-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-runtime-env.d.ts","sourceRoot":"","sources":["../../src/node/copilot-runtime-env.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,yBAAiB,iBAAiB,CAAC;IAE/B;;;OAGG;IACI,MAAM,eAAe,UAAuD,CAAC;IAEpF;;;;;;OAMG;IACH,SAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CASxF;CACJ"}