dsh-github-copilot 0.4.0-alpha.18

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 (75) hide show
  1. package/AGENTS.md +233 -0
  2. package/CONTRIBUTING.md +46 -0
  3. package/LICENSE +21 -0
  4. package/README.md +365 -0
  5. package/README.zh.md +376 -0
  6. package/SECURITY.md +29 -0
  7. package/cordis.patch.yml +16 -0
  8. package/deployment-baseline.json +752 -0
  9. package/docs/agent-readiness.md +95 -0
  10. package/docs/images/copilot-auth-card-signed-in.png +0 -0
  11. package/docs/images/copilot-device-code-copy.png +0 -0
  12. package/docs/images/copilot-model-freshness.png +0 -0
  13. package/docs/images/copilot-model-refreshing.png +0 -0
  14. package/docs/images/copilot-provider-authorization.png +0 -0
  15. package/docs/images/copilot-provider-entry.png +0 -0
  16. package/docs/images/github-copilot-auth-flow.gif +0 -0
  17. package/docs/model-compatibility-acceptance.md +46 -0
  18. package/docs/npm-distribution.md +134 -0
  19. package/docs/session-search-routing.md +53 -0
  20. package/docs/single-route-migration.md +115 -0
  21. package/lib/client.js +7153 -0
  22. package/lib/client.js.map +1 -0
  23. package/lib/index.js +5384 -0
  24. package/lib/remote.js +162 -0
  25. package/lib/routed-web.js +80 -0
  26. package/lib/search-routing-pFLux0W7.js +763 -0
  27. package/lib/types/account-model-auth.d.ts +15 -0
  28. package/lib/types/account-model-catalog.d.ts +67 -0
  29. package/lib/types/account-model-source.d.ts +85 -0
  30. package/lib/types/authorization-controller.d.ts +100 -0
  31. package/lib/types/client.d.ts +106 -0
  32. package/lib/types/compact-account.d.ts +42 -0
  33. package/lib/types/compatibility.d.ts +17 -0
  34. package/lib/types/config.d.ts +42 -0
  35. package/lib/types/content-file.d.ts +10 -0
  36. package/lib/types/copilot-auth.d.ts +23 -0
  37. package/lib/types/copilot-grant.d.ts +11 -0
  38. package/lib/types/copilot-identity.d.ts +6 -0
  39. package/lib/types/copilot-request.d.ts +11 -0
  40. package/lib/types/current-provider.d.ts +59 -0
  41. package/lib/types/deepseek-search-fallback.d.ts +11 -0
  42. package/lib/types/failure.d.ts +38 -0
  43. package/lib/types/http.d.ts +48 -0
  44. package/lib/types/index.d.ts +39 -0
  45. package/lib/types/migration-status.d.ts +50 -0
  46. package/lib/types/model-protocol.d.ts +31 -0
  47. package/lib/types/pi-provider-bridge.d.ts +22 -0
  48. package/lib/types/plan.d.ts +148 -0
  49. package/lib/types/preview-provider.d.ts +35 -0
  50. package/lib/types/preview-route.d.ts +63 -0
  51. package/lib/types/probe.d.ts +39 -0
  52. package/lib/types/reasoning-presentation.d.ts +55 -0
  53. package/lib/types/remote.d.ts +151 -0
  54. package/lib/types/responses-reasoning-text.d.ts +24 -0
  55. package/lib/types/responses-reasoning.d.ts +7 -0
  56. package/lib/types/route-ownership.d.ts +70 -0
  57. package/lib/types/routed-web.d.ts +38 -0
  58. package/lib/types/search-backend.d.ts +16 -0
  59. package/lib/types/search-routing.d.ts +43 -0
  60. package/lib/types/serialize.d.ts +109 -0
  61. package/lib/types/sse.d.ts +28 -0
  62. package/lib/types/temporary-models.d.ts +25 -0
  63. package/lib/types/tool-schema-compat.d.ts +17 -0
  64. package/lib/types/traditional-search.d.ts +17 -0
  65. package/lib/types/types.d.ts +69 -0
  66. package/lib/types/usage.d.ts +26 -0
  67. package/lib/types/watchdog.d.ts +22 -0
  68. package/lib/types/web-delegate.d.ts +12 -0
  69. package/lib/types/web-search-routing-card.d.ts +10 -0
  70. package/lib/types/web-search-routing-config.d.ts +16 -0
  71. package/lib/types/wire-anthropic.d.ts +37 -0
  72. package/lib/types/wire.d.ts +56 -0
  73. package/lib/web-delegate.js +9 -0
  74. package/package.json +200 -0
  75. package/scripts/check-search-composition.mjs +191 -0
@@ -0,0 +1,752 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "baseline": {
4
+ "id": "cloga.dsh-github-copilot",
5
+ "kind": "standalone-dsh-plugin",
6
+ "source": "https://github.com/cloga/dsh-github-copilot",
7
+ "sourceCommitPolicy": "exact-external-pin"
8
+ },
9
+ "package": {
10
+ "name": "dsh-github-copilot",
11
+ "version": "0.4.0-alpha.18"
12
+ },
13
+ "evidence": {
14
+ "kind": "source-and-synthetic-test-inventory",
15
+ "peerRangeMeaning": "package-admission-not-runtime-validation",
16
+ "doesNotProve": ["live-discovery", "live-model-transport", "all-admitted-core-versions", "published-release", "local-upgrade"]
17
+ },
18
+ "supportedBaselines": {
19
+ "platforms": ["windows", "linux"],
20
+ "node": ">=22.19.0",
21
+ "dsh": {
22
+ "release": "0.1.5-alpha.2",
23
+ "tag": "dsh-v0.1.5-alpha.2",
24
+ "commit": "b2e3b2a0125854567a4a5fcba75782e42fe84901",
25
+ "developmentRelease": "0.1.2-rc.1",
26
+ "peerRange": "0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2",
27
+ "baselines": [
28
+ {
29
+ "release": "0.1.1-rc.2",
30
+ "tag": "dsh-v0.1.1-rc.2",
31
+ "commit": "a772dbbde82780bff2b9394427e9f0a24cafa1d5",
32
+ "basedOnCommit": "b150a551b8d465e31e418e1b2eaf5e79bbb7d28e",
33
+ "source": "https://github.com/cloga/deepseek-harness",
34
+ "branch": "cloga-pi-ai-model-api",
35
+ "modelsUi": "settings-section-fallback",
36
+ "perModelApi": "model-entry",
37
+ "strictModeCompat": "route-switch",
38
+ "evidenceScope": "historical-regression-only",
39
+ "managedProviderValidation": "not-verified"
40
+ },
41
+ {
42
+ "release": "0.1.2-rc.1",
43
+ "tag": "dsh-v0.1.2-rc.1",
44
+ "commit": "a66e4702047846cdaa10c66c9d3df3951f5ea70d",
45
+ "modelsUi": "provider-card",
46
+ "providerHeaders": "fetch-validated-discovery",
47
+ "strictModeCompat": "route-switch",
48
+ "evidenceScope": "published-api-target",
49
+ "managedProviderValidation": "synthetic-published-adapter",
50
+ "managedProviderTests": ["tests/preview-provider.spec.ts", "tests/preview-route.spec.ts", "tests/pi-provider-bridge.spec.ts"]
51
+ },
52
+ {
53
+ "release": "0.1.3-alpha.1",
54
+ "tag": "dsh-v0.1.3-alpha.1",
55
+ "commit": "d347e703908d0406b7a7ef80e3a0e594d86b2215",
56
+ "modelsUi": "provider-card",
57
+ "providerHeaders": "fetch-validated-discovery",
58
+ "strictModeCompat": "route-switch",
59
+ "fileContentHelper": "contentHasFile",
60
+ "evidenceScope": "unchanged-tagged-source-target",
61
+ "standaloneNpmArtifacts": "not-published",
62
+ "managedProviderValidation": "not-verified"
63
+ },
64
+ {
65
+ "release": "0.1.5-alpha.1",
66
+ "tag": "dsh-v0.1.5-alpha.1",
67
+ "commit": "5dda764ed3aa172535a7967b06ff95d9cbfe536a",
68
+ "source": "https://github.com/deepseek-ai/deepseek-harness",
69
+ "modelsUi": "provider-card",
70
+ "providerHeaders": "fetch-validated-discovery",
71
+ "strictModeCompat": "route-switch",
72
+ "fileContentHelper": "contentHasFile",
73
+ "evidenceScope": "unchanged-tagged-source-target",
74
+ "standaloneNpmArtifacts": "not-tested",
75
+ "managedProviderValidation": "synthetic-tagged-source-runtime",
76
+ "runtimeTests": ["tests/preview-route.spec.ts", "tests/published-core.spec.ts", "tests/single-route.spec.ts", "tests/fixtures/session-context-core.fixture.ts", "tests/fixtures/remote-core.fixture.ts"]
77
+ },
78
+ {
79
+ "release": "0.1.5-alpha.2",
80
+ "tag": "dsh-v0.1.5-alpha.2",
81
+ "commit": "b2e3b2a0125854567a4a5fcba75782e42fe84901",
82
+ "source": "https://github.com/deepseek-ai/deepseek-harness",
83
+ "modelsUi": "provider-card",
84
+ "providerHeaders": "fetch-validated-discovery",
85
+ "strictModeCompat": "route-switch",
86
+ "fileContentHelper": "contentHasFile",
87
+ "evidenceScope": "unchanged-tagged-source-target",
88
+ "standaloneNpmArtifacts": "not-tested",
89
+ "managedProviderValidation": "synthetic-tagged-source-runtime",
90
+ "resolvedProfileDiagnostics": "plugin-owned-empty-modelErrors",
91
+ "runtimeTests": ["tests/preview-route.spec.ts", "tests/published-core.spec.ts", "tests/single-route.spec.ts", "tests/fixtures/session-context-core.fixture.ts", "tests/fixtures/remote-core.fixture.ts"]
92
+ },
93
+ {
94
+ "release": "0.1.5-rc.1",
95
+ "tag": "dsh-v0.1.5-rc.1",
96
+ "commit": "183f08e9c6dde7e36cd2318eaee70b0da08fb35e",
97
+ "source": "https://github.com/deepseek-ai/deepseek-harness",
98
+ "modelsUi": "provider-card",
99
+ "providerHeaders": "fetch-validated-discovery",
100
+ "strictModeCompat": "route-switch",
101
+ "fileContentHelper": "contentHasFile",
102
+ "evidenceScope": "unchanged-tagged-source-target",
103
+ "standaloneNpmArtifacts": "not-tested",
104
+ "managedProviderValidation": "synthetic-tagged-source-runtime",
105
+ "resolvedProfileDiagnostics": "plugin-owned-empty-modelErrors",
106
+ "runtimeTests": ["tests/preview-route.spec.ts", "tests/published-core.spec.ts", "tests/single-route.spec.ts", "tests/fixtures/session-context-core.fixture.ts", "tests/fixtures/remote-core.fixture.ts"]
107
+ },
108
+ {
109
+ "release": "0.1.5-rc.2",
110
+ "tag": "dsh-v0.1.5-rc.2",
111
+ "commit": "fb2c4b9e698e30edb738bca4cf0618587db7d203",
112
+ "source": "https://github.com/deepseek-ai/deepseek-harness",
113
+ "modelsUi": "provider-card",
114
+ "providerHeaders": "fetch-validated-discovery",
115
+ "strictModeCompat": "route-switch",
116
+ "fileContentHelper": "contentHasFile",
117
+ "evidenceScope": "unchanged-tagged-source-target",
118
+ "standaloneNpmArtifacts": "not-tested",
119
+ "managedProviderValidation": "synthetic-tagged-source-runtime",
120
+ "resolvedProfileDiagnostics": "plugin-owned-empty-modelErrors",
121
+ "runtimeTests": ["tests/preview-route.spec.ts", "tests/published-core.spec.ts", "tests/single-route.spec.ts", "tests/fixtures/session-context-core.fixture.ts", "tests/fixtures/remote-core.fixture.ts"]
122
+ }
123
+ ],
124
+ "packages": [
125
+ "@deepseek-ai/dsh-agent",
126
+ "@deepseek-ai/dsh-agent-default-model",
127
+ "@deepseek-ai/dsh-api-remotes",
128
+ "@deepseek-ai/dsh-authorization",
129
+ "@deepseek-ai/dsh-client-ui-renderer",
130
+ "@deepseek-ai/dsh-client-ui-settings-models",
131
+ "@deepseek-ai/dsh-client-ui-slots",
132
+ "@deepseek-ai/dsh-credentials",
133
+ "@deepseek-ai/dsh-launch-environment",
134
+ "@deepseek-ai/dsh-llm",
135
+ "@deepseek-ai/dsh-llm-pi-ai",
136
+ "@deepseek-ai/dsh-settings",
137
+ "@deepseek-ai/dsh-typert-protocol",
138
+ "@deepseek-ai/dsh-web",
139
+ "@deepseek-ai/dsh-web-search-deepseek"
140
+ ]
141
+ },
142
+ "piAi": "0.85.1",
143
+ "runtimeDependencies": {
144
+ "@deepseek-ai/dsh-authorization": "0.1.2-rc.1",
145
+ "@deepseek-ai/schemastery": "^3.18.2",
146
+ "@earendil-works/pi-ai": "0.85.1",
147
+ "zod": "^4.4.3"
148
+ }
149
+ },
150
+ "capabilities": [
151
+ {
152
+ "id": "readonly-search-composition-preflight",
153
+ "required": true,
154
+ "evidenceScope": "pre-install-structural-only-not-automatic-cli-enforcement",
155
+ "sourceMarkers": [
156
+ {"file": "scripts/check-search-composition.mjs", "marker": "checkSearchComposition"},
157
+ {"file": "scripts/check-search-composition.mjs", "marker": "PREEXISTING_WEB_ISOLATION"},
158
+ {"file": "README.md", "marker": "does not automatically run this preflight"}
159
+ ],
160
+ "tests": [
161
+ {"file": "tests/scripts/search-composition.test.mjs", "name": "admits a stock top-level official service without mutating or exposing its config"},
162
+ {"file": "tests/scripts/search-composition.test.mjs", "name": "includes home and launcher layers instead of ignoring a late web override"},
163
+ {"file": "tests/scripts/search-composition.test.mjs", "name": "CLI rejects disposable root-only web without initialization, normalization or secret output"},
164
+ {"file": "tests/scripts/search-composition.test.mjs", "name": "real public parsers validate candidate layers and preserve every input file"},
165
+ {"file": "tests/scripts/search-composition.test.mjs", "name": "rejects a web bundle ordered after the Copilot guard"}
166
+ ]
167
+ },
168
+ {
169
+ "id": "session-model-search-routing",
170
+ "required": true,
171
+ "evidenceScope": "development-real-consumer-and-loader-synthetic",
172
+ "sourceMarkers": [
173
+ {"file": "src/routed-web.ts", "marker": "extends WebRuntime"},
174
+ {"file": "src/index.ts", "marker": "ctx.provide('githubCopilotSearchRouter'"},
175
+ {"file": "src/web-search-routing-config.ts", "marker": "WEB_SEARCH_ROUTING_SETTINGS_NAMESPACE"},
176
+ {"file": "src/web-search-routing-card.ts", "marker": "data-dsh-web-search-routing"},
177
+ {"file": "cordis.patch.yml", "marker": "web: github-copilot-original-web"}
178
+ ],
179
+ "tests": [
180
+ {"file": "tests/routed-web.spec.ts", "name": "keeps the configured provider for DeepSeek and all other model routes"},
181
+ {"file": "tests/routed-web.spec.ts", "name": "dispatches a router-selected provider by exact registered id"},
182
+ {"file": "tests/routed-web.spec.ts", "name": "retains pre-execute denial and the surrounding execution middleware"},
183
+ {"file": "tests/inline/apply.spec.ts", "name": "uses an independently configured account model for a non-Copilot chat session"},
184
+ {"file": "tests/inline/apply.spec.ts", "name": "discovers an independent search model absent from the static catalog and keeps proof enabled"},
185
+ {"file": "tests/inline/apply.spec.ts", "name": "rejects independent search when managed proof expires during %s"},
186
+ {"file": "tests/inline/apply.spec.ts", "name": "uses the configured account model in fixed mode even for a different Copilot chat model"},
187
+ {"file": "tests/client-bundle.spec.ts", "name": "registers web-search routing as a separate Models footer card"},
188
+ {"file": "tests/routed-web-loader.spec.ts", "name": "loads the built facade and delegate entries without changing official tools"}
189
+ ]
190
+ },
191
+ {
192
+ "id": "explicit-deepseek-search-fallback",
193
+ "required": true,
194
+ "evidenceScope": "development-synthetic-no-live-search-claim",
195
+ "sourceMarkers": [
196
+ {"file": "src/config.ts", "marker": "searchFallback: z.union(['none', 'deepseek']).default('deepseek')"},
197
+ {"file": "src/deepseek-search-fallback.ts", "marker": "new native.DeepSeekSearchProvider"},
198
+ {"file": "src/search-routing.ts", "marker": "These are not Copilot search results."}
199
+ ],
200
+ "tests": [
201
+ {"file": "tests/search-routing.spec.ts", "name": "does not spend fallback credits unless explicitly enabled"},
202
+ {"file": "tests/search-routing.spec.ts", "name": "does not fallback when the primary reports cancellation"},
203
+ {"file": "tests/routed-web.spec.ts", "name": "preserves fallback provenance in canonical value, rendered content and web-card metadata"},
204
+ {"file": "tests/deepseek-search-fallback.spec.ts", "name": "checks the actual managed proof after native fallback auth: %s"},
205
+ {"file": "tests/deepseek-search-fallback.spec.ts", "name": "checks continuity after native literal-key auth (permitted=%s)"}
206
+ ]
207
+ },
208
+ {
209
+ "id": "account-driven-provider-metadata",
210
+ "required": true,
211
+ "activation": "validated-account-endpoints-and-capabilities",
212
+ "sourceMarkers": [
213
+ {"file": "src/account-model-catalog.ts", "marker": "normalizeAccountModelCatalog"},
214
+ {"file": "src/account-model-catalog.ts", "marker": "supported_endpoints"},
215
+ {"file": "src/account-model-catalog.ts", "marker": "maxInputTokens"},
216
+ {"file": "src/account-model-catalog.ts", "marker": "DUPLICATE_CONFLICT"},
217
+ {"file": "src/preview-provider.ts", "marker": "accountModelFromDescriptor"}
218
+ ],
219
+ "tests": [
220
+ {"file": "tests/account-model-catalog.spec.ts", "name": "routes an unseen identifier using %s rather than its model name"},
221
+ {"file": "tests/account-model-catalog.spec.ts", "name": "uses advertised Responses when an older local catalog says GPT-6 is Completions"},
222
+ {"file": "tests/account-model-catalog.spec.ts", "name": "accepts new Gemini and Sol Fast IDs without adding model-specific rules"},
223
+ {"file": "tests/account-model-catalog.spec.ts", "name": "prefers native API only when the server advertises the matching endpoint"},
224
+ {"file": "tests/account-model-catalog.spec.ts", "name": "uses a caller-proven account ID only for an absent policy and records the evidence source"},
225
+ {"file": "tests/account-model-catalog.spec.ts", "name": "preserves context, input and output limits as different facts"},
226
+ {"file": "tests/account-model-catalog.spec.ts", "name": "deduplicates equal IDs but rejects all versions of a conflicting duplicate"},
227
+ {"file": "tests/account-model-catalog.spec.ts", "name": "keeps only safe endpoint evidence and never extracts supplied URLs, headers, or secrets"},
228
+ {"file": "tests/account-model-catalog.spec.ts", "name": "normalizes only owned data and freezes all nested public output"},
229
+ {"file": "tests/account-model-catalog.spec.ts", "name": "keeps image support when valid document media types accompany image types"},
230
+ {"file": "tests/account-model-catalog.spec.ts", "name": "keeps a text model available without claiming images when only document media types are explicit"}
231
+ ]
232
+ },
233
+ {
234
+ "id": "account-scoped-discovery-snapshot",
235
+ "required": true,
236
+ "activation": "bounded-account-freshness-with-display-only-stale-metadata",
237
+ "sourceMarkers": [
238
+ {"file": "src/account-model-source.ts", "marker": "createAccountModelSource"},
239
+ {"file": "src/account-model-source.ts", "marker": "redirect: 'error'"},
240
+ {"file": "src/account-model-source.ts", "marker": "assertAuthCurrent"},
241
+ {"file": "src/account-model-source.ts", "marker": "ACCOUNT_MODEL_CATALOG_LIMITS.maxBytes"}
242
+ ],
243
+ "tests": [
244
+ {"file": "tests/account-model-source.spec.ts", "name": "is lazy, uses exact trusted root GET with non-forwarding redirects, and freezes only public snapshot data"},
245
+ {"file": "tests/account-model-source.spec.ts", "name": "coalesces force and ordinary callers while one request is in flight"},
246
+ {"file": "tests/account-model-source.spec.ts", "name": "does not let a cancelled waiter abort another waiter"},
247
+ {"file": "tests/account-model-source.spec.ts", "name": "cancels orphaned work when all waiters abort and does not publish a late result"},
248
+ {"file": "tests/account-model-source.spec.ts", "name": "does not fall back to an old cached account after a forced refresh failure"},
249
+ {"file": "tests/account-model-source.spec.ts", "name": "invalidate is network-free and an invalidated HTTP result cannot overwrite a newer load"},
250
+ {"file": "tests/account-model-source.spec.ts", "name": "bounds timeout during %s even if the dependency ignores cancellation"},
251
+ {"file": "tests/account-model-source.spec.ts", "name": "enforces cumulative UTF-8 byte limits rather than trusting content length"},
252
+ {"file": "tests/account-model-source.spec.ts", "name": "rejects malformed UTF-8 and clears the reader without preserving response contents"},
253
+ {"file": "tests/account-model-source.spec.ts", "name": "refuses sensitive header override %s"},
254
+ {"file": "tests/account-model-source.spec.ts", "name": "defaults to a day-long metadata cache and a five-minute passive failure cooldown"},
255
+ {"file": "tests/account-model-source.spec.ts", "name": "force bypasses the cooldown, concurrent callers coalesce, and invalidation resets it"},
256
+ {"file": "tests/account-model-source.spec.ts", "name": "retains same-generation display metadata across TTL expiry, loading, and fetch failure without fresh reuse"}
257
+ ]
258
+ },
259
+ {
260
+ "id": "public-adapter-account-model-route",
261
+ "required": true,
262
+ "activation": "published-adapter-and-native-sdk",
263
+ "sourceMarkers": [
264
+ {"file": "src/preview-route.ts", "marker": "extends PiAiAdapter"},
265
+ {"file": "src/preview-route.ts", "marker": "modelErrors: new Map<string, string>()"},
266
+ {"file": "src/preview-route.ts", "marker": "ctx.llm.registerAdapter"},
267
+ {"file": "src/preview-route.ts", "marker": "createAccountModelSource"},
268
+ {"file": "src/preview-provider.ts", "marker": "native.streamSimple"},
269
+ {"file": "src/pi-provider-bridge.ts", "marker": "PiStreamPublicCompatibility"}
270
+ ],
271
+ "tests": [
272
+ {"file": "tests/preview-provider.spec.ts", "name": "routes an unseen ID through published Core and native %s with Bearer auth"},
273
+ {"file": "tests/preview-provider.spec.ts", "name": "takes protocol and independent input limits from descriptor evidence rather than the local GPT-6 catalog"},
274
+ {"file": "tests/preview-provider.spec.ts", "name": "does not infer controls from a name or unfamiliar advertised effort labels"},
275
+ {"file": "tests/preview-route.spec.ts", "name": "resolves and prepares a validated account model with the actual Core profile diagnostics contract"},
276
+ {"file": "tests/inline/apply.spec.ts", "name": "delegates Anthropic in-band system authority before probing at position %s"},
277
+ {"file": "tests/preview-route.spec.ts", "name": "discovers mixed and unseen account models without model-name routing rules"},
278
+ {"file": "tests/preview-route.spec.ts", "name": "uses unmodified stock LlmRuntime preparation and leaves canonical model registration alone"},
279
+ {"file": "tests/preview-route.spec.ts", "name": "replays opaque reasoning and tool-call identities through the native adapter on a second turn"},
280
+ {"file": "tests/pi-provider-bridge.spec.ts", "name": "preserves the stream object rather than copying or replacing its private queue"},
281
+ {"file": "tests/pi-provider-bridge.spec.ts", "name": "passes the checked simple input through and rejects unsupported advanced entry without I/O"}
282
+ ]
283
+ },
284
+ {
285
+ "id": "managed-model-generation-and-lifetime",
286
+ "required": true,
287
+ "sourceMarkers": [
288
+ {"file": "src/preview-route.ts", "marker": "COPILOT_PREVIEW_METADATA_STALE"},
289
+ {"file": "src/preview-route.ts", "marker": "copilotEntitlementKey"},
290
+ {"file": "src/preview-route.ts", "marker": "credentials/record-updated"},
291
+ {"file": "src/preview-route.ts", "marker": "renewBeforeLease"},
292
+ {"file": "src/account-model-auth.ts", "marker": "minOAuthValidityMs: ACCOUNT_MODEL_AUTH_MIN_VALIDITY_MS"}
293
+ ],
294
+ "tests": [
295
+ {"file": "tests/preview-route.spec.ts", "name": "renews warm metadata before native OAuth refresh invalidates a new %s lease"},
296
+ {"file": "tests/preview-route.spec.ts", "name": "applies the warm renewal boundary with %i milliseconds remaining"},
297
+ {"file": "tests/preview-route.spec.ts", "name": "joins a warm renewal flight across catalog and model callers"},
298
+ {"file": "tests/preview-route.spec.ts", "name": "joins an existing metadata HTTP flight when token validity crosses the renewal threshold"},
299
+ {"file": "tests/preview-route.spec.ts", "name": "bounds a warm renewal %s without model wire or cooldown bypass"},
300
+ {"file": "tests/preview-route.spec.ts", "name": "persists warm-refresh entitlement removal without dispatching the formerly allowed model"},
301
+ {"file": "tests/preview-route.spec.ts", "name": "does not rebind or replay an old prepared lease after it crosses the native refresh window"},
302
+ {"file": "tests/preview-route.spec.ts", "name": "requires rediscovery when an already prepared token rotates without a credential notification"},
303
+ {"file": "tests/preview-route.spec.ts", "name": "rejects silent same-token entitlement removal before dispatch and requires rediscovery"},
304
+ {"file": "tests/preview-route.spec.ts", "name": "does not serve expired catalog facts or prepared model snapshots"},
305
+ {"file": "tests/preview-route.spec.ts", "name": "invalidates prepared model metadata on an explicit force-discovery without changing the selected ID"},
306
+ {"file": "tests/preview-route.spec.ts", "name": "cancels an in-flight SDK request on disposal without deleting the shared grant"},
307
+ {"file": "tests/preview-route.spec.ts", "name": "allows Core retry middleware to re-dispatch the same prepared adapter snapshot"},
308
+ {"file": "tests/preview-route.spec.ts", "name": "does not let a retry cross to another account after its first attempt"},
309
+ {"file": "tests/preview-route.spec.ts", "name": "refuses a duplicate route through the public registry without taking over the existing adapter"},
310
+ {"file": "tests/preview-route.spec.ts", "name": "withdraws only its own route and refuses an already-prepared call after disposal"}
311
+ ]
312
+ },
313
+ {
314
+ "id": "account-discovery-native-oauth",
315
+ "required": true,
316
+ "sourceMarkers": [
317
+ {"file": "src/account-model-auth.ts", "marker": "models.getAuth(GITHUB_COPILOT_PROVIDER_ID"},
318
+ {"file": "src/account-model-auth.ts", "marker": "auth: { oauth: guardedOAuth }"},
319
+ {"file": "src/account-model-auth.ts", "marker": "trustedGitHubCopilotBaseUrl"}
320
+ ],
321
+ "tests": [
322
+ {"file": "tests/account-model-auth.spec.ts", "name": "resolves provider OAuth without a model catalog entry or environment fallback"},
323
+ {"file": "tests/account-model-auth.spec.ts", "name": "refreshes through native Models and persists only the canonical credential"},
324
+ {"file": "tests/account-model-auth.spec.ts", "name": "rejects account replacement during refresh without overwriting the replacement"},
325
+ {"file": "tests/account-model-auth.spec.ts", "name": "validates credential-specific Enterprise endpoints and rejects token-controlled foreign origins"},
326
+ {"file": "tests/account-model-auth.spec.ts", "name": "sanitizes credential backend failures and keeps account identity independent of token rotation"}
327
+ ]
328
+ },
329
+ {
330
+ "id": "responses-public-reasoning-and-safe-replay-delegation",
331
+ "required": true,
332
+ "sourceMarkers": [
333
+ {"file": "src/wire.ts", "marker": "response.reasoning_summary_text.delta"},
334
+ {"file": "src/responses-reasoning.ts", "marker": "request.reasoningEffort ?? profile?.reasoning"},
335
+ {"file": "src/serialize.ts", "marker": "reasoning: { effort: reasoning.effort, summary: reasoning.summary }"},
336
+ {"file": "src/serialize.ts", "marker": "message.source.replayState"},
337
+ {"file": "src/index.ts", "marker": "hasResponsesReplayContext(request.messages)"}
338
+ ],
339
+ "tests": [
340
+ {"file": "tests/inline/apply.spec.ts", "name": "transmits the selected effort and preserves the returned public summary"},
341
+ {"file": "tests/inline/apply.spec.ts", "name": "keeps preview conversations on their registered native adapter before any probe"},
342
+ {"file": "tests/inline/apply.spec.ts", "name": "delegates opaque assistant replay state without serializing its fields"},
343
+ {"file": "tests/inline/serialize.spec.ts", "name": "refuses the actual Core source.replayState location without opening its payload"},
344
+ {"file": "tests/responses-reasoning.spec.ts", "name": "honors request effort before the profile default and asks for a public summary"},
345
+ {"file": "tests/responses-reasoning.spec.ts", "name": "does not force a reasoning mode without a selection"},
346
+ {"file": "tests/responses-reasoning.spec.ts", "name": "preserves the Core off omission rather than claiming to disable server reasoning"},
347
+ {"file": "tests/preview-provider.spec.ts", "name": "does not synthesize none or disabled thinking by default for %s"},
348
+ {"file": "tests/preview-route.spec.ts", "name": "preserves the native enabled reasoning setting %s and summary request"}
349
+ ]
350
+ },
351
+ {
352
+ "id": "replay-safe-copilot-reasoning-presentation",
353
+ "required": true,
354
+ "activation": "optional-guarded-client-seam",
355
+ "sourceMarkers": [
356
+ {"file": "src/client.ts", "marker": "ctx.inject(['uiConversation', 'slots']"},
357
+ {"file": "src/reasoning-presentation.ts", "marker": "projectReasoningPresentation"},
358
+ {"file": "src/reasoning-presentation.ts", "marker": "github-copilot-assistant-origin"}
359
+ ],
360
+ "tests": [
361
+ {"file": "tests/reasoning-presentation.spec.ts", "name": "removes fifteen empty rows without reading or changing encrypted durable replay material"},
362
+ {"file": "tests/reasoning-presentation.spec.ts", "name": "reconstructs cold/prepended history without step/start and never borrows a current route"},
363
+ {"file": "tests/reasoning-presentation.spec.ts", "name": "retires on any third-party override conflict and resumes only when safe"},
364
+ {"file": "tests/client.spec.ts", "name": "does not delay authorization while the optional reasoning presentation waits for Core services"},
365
+ {"file": "tests/fixtures/reasoning-presentation-core.fixture.ts", "name": "renders answers and public summaries without the fifteen empty native Think rows"}
366
+ ]
367
+ },
368
+ {
369
+ "id": "client-module-loader-handoff",
370
+ "required": true,
371
+ "sourceMarkers": [
372
+ {"file": "tsdown.config.ts", "marker": "window.__ModuleLoader__.load"},
373
+ {"file": "tsdown.config.ts", "marker": "return module.exports"}
374
+ ],
375
+ "tests": [
376
+ {"file": "tests/client-bundle.spec.ts", "name": "hands off the built client with the exact plugin id and injected require"},
377
+ {"file": "tests/client-bundle.spec.ts", "name": "materializes the built client apply and inject exports"}
378
+ ]
379
+ },
380
+ {
381
+ "id": "strict-remote-result-codecs",
382
+ "required": true,
383
+ "sourceMarkers": [
384
+ {"file": "src/remote.ts", "marker": "dsh-github-copilot#GitHubCopilotAuthorizationView"},
385
+ {"file": "src/remote.ts", "marker": "mode: 'strict'"},
386
+ {"file": "src/remote.ts", "marker": "accountModels: z.object"}
387
+ ],
388
+ "tests": [
389
+ {"file": "tests/client-bundle.spec.ts", "name": "mounts strict Host result codecs through the published rc.1 client carrier"},
390
+ {"file": "tests/account-model-remote.spec.ts", "name": "registers %s with the same strict safe authorization view codec"},
391
+ {"file": "tests/account-model-remote.spec.ts", "name": "rejects private or unrequested discovery field %s"},
392
+ {"file": "tests/account-model-remote.spec.ts", "name": "rejects secret-bearing model entries and oversized model lists"},
393
+ {"file": "tests/migration-status.spec.ts", "name": "keeps noargs Remote migration evidence separate and ordinary status unchanged"},
394
+ {"file": "tests/migration-status.spec.ts", "name": "uses the real public Session projection registry for pending versus old request headers"},
395
+ {"file": "tests/migration-status.spec.ts", "name": "reads only named public leaves, not private titles history credentials or settings"}
396
+ ]
397
+ },
398
+ {
399
+ "id": "authorization-service-bootstrap",
400
+ "required": true,
401
+ "sourceMarkers": [
402
+ {"file": "src/index.ts", "marker": "ctx.get('authorization', false)"},
403
+ {"file": "src/index.ts", "marker": "ctx.plugin(AuthorizationService)"},
404
+ {"file": "src/index.ts", "marker": "ctx.inject(integrationInject"}
405
+ ],
406
+ "tests": [
407
+ {"file": "tests/loader-composition.spec.ts", "name": "bootstraps authorization in the rc.2 web profile before activating the integration"},
408
+ {"file": "tests/loader-composition.spec.ts", "name": "reuses the rc.1 authorization service without duplicate registration"}
409
+ ]
410
+ },
411
+ {
412
+ "id": "models-provider-card-authorization",
413
+ "required": true,
414
+ "sourceMarkers": [
415
+ {"file": "src/client.ts", "marker": "settings.models.provider-card"},
416
+ {"file": "src/client.ts", "marker": "copyAuthorizationCode"},
417
+ {"file": "src/client.ts", "marker": "data-dsh-github-copilot-device-code"},
418
+ {"file": "src/authorization-controller.ts", "marker": "GitHubCopilotAuthorizationController"}
419
+ ],
420
+ "tests": [
421
+ {"file": "tests/client.spec.ts", "name": "exposes a device code only while authorization is in flight"},
422
+ {"file": "tests/client.spec.ts", "name": "renders the device code prominently with an explicit copy action"},
423
+ {"file": "tests/client.spec.ts", "name": "announces successful and failed copy outcomes accessibly"},
424
+ {"file": "tests/client.spec.ts", "name": "copies the exact one-time code through the supplied clipboard writer"},
425
+ {"file": "tests/client.spec.ts", "name": "mounts its Remote contribution and registers the rc.1 provider-card seat"},
426
+ {"file": "tests/authorization-controller.spec.ts", "name": "signs in through the built-in flow without recreating a canonical profile"},
427
+ {"file": "tests/authorization-controller.spec.ts", "name": "clears the one-time device code immediately when sign-in is cancelled"},
428
+ {"file": "tests/authorization-controller.spec.ts", "name": "clears the one-time device code when authorization fails"}
429
+ ]
430
+ },
431
+ {
432
+ "id": "canonical-owner-preservation",
433
+ "required": true,
434
+ "sourceMarkers": [
435
+ {"file": "src/authorization-controller.ts", "marker": "Existing Core/user profiles keep"},
436
+ {"file": "src/authorization-controller.ts", "marker": "path: ['providers', GITHUB_COPILOT_PROVIDER_ID, 'compat', 'supportsStrictMode']"}
437
+ ],
438
+ "tests": [
439
+ {"file": "tests/authorization-controller.spec.ts", "name": "preserves canonical models and all unrelated profile fields instead of projecting the companion catalog"},
440
+ {"file": "tests/authorization-controller.spec.ts", "name": "keeps a missing canonical profile intentionally absent for new account models"},
441
+ {"file": "tests/authorization-controller.spec.ts", "name": "does not reorder or replace canonical models when account IDs are duplicated or reordered"},
442
+ {"file": "tests/authorization-controller.spec.ts", "name": "does not add or remove canonical models based on a conflicting local GPT-6 entry"},
443
+ {"file": "tests/authorization-controller.spec.ts", "name": "does not judge a user route protocol using another catalog copy"},
444
+ {"file": "tests/authorization-controller.spec.ts", "name": "signs out by deleting only the llm-pi-ai Copilot record and keeps the route profile"}
445
+ ]
446
+ },
447
+ {
448
+ "id": "copilot-optional-tool-arguments",
449
+ "required": true,
450
+ "sourceMarkers": [
451
+ {"file": "src/tool-schema-compat.ts", "marker": "assembly.variables.provider !== GITHUB_COPILOT_PROVIDER_ID"},
452
+ {"file": "src/tool-schema-compat.ts", "marker": "ESCALATION_FIELDS"},
453
+ {"file": "src/tool-schema-compat.ts", "marker": "GOAL_UPDATE_TOOL_NAME"},
454
+ {"file": "scripts/verify-upstream-baseline.mjs", "marker": "baseline.strictModeCompat === 'route-switch'"}
455
+ ],
456
+ "tests": [
457
+ {"file": "tests/tool-schema-compat.spec.ts", "name": "removes escalation properties and required entries only for Copilot"},
458
+ {"file": "tests/tool-schema-compat.spec.ts", "name": "turns update_goal into action-specific schemas only for Copilot"},
459
+ {"file": "tests/tool-schema-compat.spec.ts", "name": "preserves every schema for non-Copilot providers"},
460
+ {"file": "tests/tool-schema-compat.spec.ts", "name": "filters a real Cordis waterfall after model selection supplies the provider"},
461
+ {"file": "tests/authorization-controller.spec.ts", "name": "preserves configured Anthropic and OpenAI models while repairing only strict mode"},
462
+ {"file": "tests/fixtures/controlled-core-per-model-api.fixture.ts", "name": "applies route strict-mode compatibility only to supported model protocols"}
463
+ ]
464
+ },
465
+ {
466
+ "id": "selected-account-route-protocol-facts",
467
+ "required": true,
468
+ "sourceMarkers": [
469
+ {"file": "src/current-provider.ts", "marker": "routeFacts"},
470
+ {"file": "src/preview-route.ts", "marker": "source.readSnapshot()"},
471
+ {"file": "src/preview-provider.ts", "marker": "api: descriptor.api"}
472
+ ],
473
+ "tests": [
474
+ {"file": "tests/current-provider.spec.ts", "name": "uses the owning account snapshot for an arbitrary new model on %s"},
475
+ {"file": "tests/current-provider.spec.ts", "name": "does not fall back to the local GPT-6 catalog when account evidence expires"},
476
+ {"file": "tests/current-provider.spec.ts", "name": "copies only protocol and endpoint leaves without exposing private snapshot fields"},
477
+ {"file": "tests/current-provider.spec.ts", "name": "does not claim an unmounted route belongs to the plugin"}
478
+ ]
479
+ },
480
+ {
481
+ "id": "existing-grant-legacy-profile-repair",
482
+ "required": true,
483
+ "sourceMarkers": [
484
+ {"file": "src/index.ts", "marker": "ensureGitHubCopilotProviderProfile(ctx)"},
485
+ {"file": "src/authorization-controller.ts", "marker": "validateGrant(record)"},
486
+ {"file": "src/authorization-controller.ts", "marker": "providerSupportsStrictMode"}
487
+ ],
488
+ "tests": [
489
+ {"file": "tests/loader-composition.spec.ts", "name": "repairs an existing valid Copilot grant during Host startup"},
490
+ {"file": "tests/authorization-controller.spec.ts", "name": "repairs a pre-existing grant with an empty Copilot route"},
491
+ {"file": "tests/authorization-controller.spec.ts", "name": "is idempotent when the existing resolved Copilot route matches the account catalog"},
492
+ {"file": "tests/authorization-controller.spec.ts", "name": "does not install global protocols or headers for new account models"}
493
+ ]
494
+ },
495
+ {
496
+ "id": "read-only-status-and-explicit-discovery",
497
+ "required": true,
498
+ "sourceMarkers": [
499
+ {"file": "src/authorization-controller.ts", "marker": "accountModelsView"},
500
+ {"file": "src/authorization-controller.ts", "marker": "async discoverModels()"},
501
+ {"file": "src/remote.ts", "marker": "'status', 'reconcile', 'discoverModels', 'ensureModels', 'start', 'cancel', 'signOut'"}
502
+ ],
503
+ "tests": [
504
+ {"file": "tests/authorization-controller.spec.ts", "name": "reads status repeatedly without repairing, authorizing or making network calls"},
505
+ {"file": "tests/authorization-controller.spec.ts", "name": "exposes only owned model presentation leaves and never discovers during status"},
506
+ {"file": "tests/authorization-controller.spec.ts", "name": "discovers account models only on an explicit action without changing selection or settings"},
507
+ {"file": "tests/authorization-controller.spec.ts", "name": "keeps discovery unavailable or failed separate from sign-in and sanitizes failures"},
508
+ {"file": "tests/client.spec.ts", "name": "discovers account models only on a click and deduplicates clicks while busy"},
509
+ {"file": "tests/client.spec.ts", "name": "does not poll or automatically rediscover a loading server snapshot"},
510
+ {"file": "tests/client.spec.ts", "name": "does not let a previous Remote overwrite a newly mounted discovery result"}
511
+ ]
512
+ },
513
+ {
514
+ "id": "credential-bound-lazy-search-proof",
515
+ "required": true,
516
+ "sourceMarkers": [
517
+ {"file": "src/index.ts", "marker": "credentials/record-updated"},
518
+ {"file": "src/index.ts", "marker": "invalidatePlans"},
519
+ {"file": "src/probe.ts", "marker": "signal?: AbortSignal"}
520
+ ],
521
+ "tests": [
522
+ {"file": "tests/inline/apply.spec.ts", "name": "retries a cached missing-grant failure on a same-route credential event"},
523
+ {"file": "tests/inline/apply.spec.ts", "name": "evicts a successful proof for revocation/account changes and coalesces event bursts"},
524
+ {"file": "tests/inline/apply.spec.ts", "name": "ignores unrelated record updates and retains the verified proof"},
525
+ {"file": "tests/inline/apply.spec.ts", "name": "rejects account replacement during search auth after a successful proof"},
526
+ {"file": "tests/inline/apply.spec.ts", "name": "makes no network calls at attach, availability checks, settings or credential events"},
527
+ {"file": "tests/inline/apply.spec.ts", "name": "removes its Fiber listener and makes retained entry points inert on disposal"}
528
+ ]
529
+ },
530
+ {
531
+ "id": "legacy-route-conflict-protection",
532
+ "required": true,
533
+ "activation": "legacy-restoration-only",
534
+ "sourceMarkers": [
535
+ {"file": "src/route-ownership.ts", "marker": "postimage"},
536
+ {"file": "src/route-ownership.ts", "marker": "TEMPORARY_ROUTE_LEGACY_CONFLICT"},
537
+ {"file": "src/route-ownership.ts", "marker": "sourceEpoch"},
538
+ {"file": "src/route-ownership.ts", "marker": "redactSecrets: true"}
539
+ ],
540
+ "tests": [
541
+ {"file": "tests/route-ownership.spec.ts", "name": "compares raw model ownership despite schema-materialized defaults"},
542
+ {"file": "tests/route-ownership.spec.ts", "name": "refuses unsafe preimage extras without copying sensitive data"},
543
+ {"file": "tests/route-ownership.spec.ts", "name": "uses namespace revisions to reject races after ownership backup commits"},
544
+ {"file": "tests/route-ownership.spec.ts", "name": "does not guess ownership for legacy or malformed backups"},
545
+ {"file": "tests/route-ownership.spec.ts", "name": "fails closed on prepared activation retry without registration lifetime evidence"},
546
+ {"file": "tests/route-ownership.spec.ts", "name": "read-only planning reports ready only after reconciliation"}
547
+ ]
548
+ },
549
+ {
550
+ "id": "legacy-global-override-restoration",
551
+ "required": true,
552
+ "activation": "legacy-restoration-only",
553
+ "newGlobalProtocolOverrides": false,
554
+ "sourceMarkers": [
555
+ {"file": "src/authorization-controller.ts", "marker": "target: { ...backup.preimage }"},
556
+ {"file": "src/authorization-controller.ts", "marker": "op: 'unset'"},
557
+ {"file": "src/config.ts", "marker": "temporaryRouteBackup: z.string().hidden()"},
558
+ {"file": "src/route-ownership.ts", "marker": "wholeProfileOwned"}
559
+ ],
560
+ "tests": [
561
+ {"file": "tests/authorization-controller.spec.ts", "name": "restores the owned canonical override without creating another ownership cycle"},
562
+ {"file": "tests/authorization-controller.spec.ts", "name": "refuses a legacy prepared activation without replaying its route write"},
563
+ {"file": "tests/authorization-controller.spec.ts", "name": "retries backup cleanup after route restoration commits first"},
564
+ {"file": "tests/authorization-controller.spec.ts", "name": "rejects malformed temporary route backup leaves before replay"},
565
+ {"file": "tests/route-ownership.spec.ts", "name": "restores a historical bounded journal without copying unrelated sensitive leaves"},
566
+ {"file": "tests/route-ownership.spec.ts", "name": "retains a user-edited formerly owned header during restoration"}
567
+ ]
568
+ },
569
+ {
570
+ "id": "shared-copilot-credential-refresh",
571
+ "required": true,
572
+ "sourceMarkers": [
573
+ {"file": "src/copilot-auth.ts", "marker": "models.getAuth('github-copilot')"},
574
+ {"file": "src/copilot-auth.ts", "marker": "GITHUB_COPILOT_CREDENTIAL_KEY"},
575
+ {"file": "src/index.ts", "marker": "createGitHubCopilotTokenResolver(ctx, async () =>"}
576
+ ],
577
+ "tests": [
578
+ {"file": "tests/copilot-auth.spec.ts", "name": "refreshes the llm-pi-ai grant in-place and returns the Copilot API token"},
579
+ {"file": "tests/copilot-auth.spec.ts", "name": "does not overwrite request-owned headers with local model metadata"},
580
+ {"file": "tests/copilot-auth.spec.ts", "name": "rejects logical provider mismatches before touching shared credential storage"},
581
+ {"file": "tests/copilot-auth.spec.ts", "name": "preserves the canonical grant when a serialized modification declines to change it"},
582
+ {"file": "tests/copilot-auth.spec.ts", "name": "rechecks model availability after refreshing the credential"},
583
+ {"file": "tests/preview-route.spec.ts", "name": "serializes canonical and preview refresh through the same credential key"},
584
+ {"file": "tests/preview-route.spec.ts", "name": "persists token-refresh revocation after preparation but never authorizes it from the earlier live catalog"}
585
+ ]
586
+ },
587
+ {
588
+ "id": "strict-json-oauth-grant-normalization",
589
+ "required": true,
590
+ "sourceMarkers": [
591
+ {"file": "src/copilot-grant.ts", "marker": "normalizeGitHubCopilotOAuthCredential"},
592
+ {"file": "src/copilot-grant.ts", "marker": "Number.isFinite(expires)"}
593
+ ],
594
+ "tests": [
595
+ {"file": "tests/copilot-auth.spec.ts", "name": "normalizes cross-module OAuth grants for a strict JSON credential store"},
596
+ {"file": "tests/copilot-auth.spec.ts", "name": "rejects malformed required OAuth fields without exposing their values"},
597
+ {"file": "tests/copilot-auth.spec.ts", "name": "rejects nonfinite OAuth expiry timestamps"},
598
+ {"file": "tests/copilot-auth.spec.ts", "name": "rejects invalid OAuth model id collections"},
599
+ {"file": "tests/copilot-auth.spec.ts", "name": "requires a non-empty enterprise URL when the OAuth field is present"}
600
+ ]
601
+ },
602
+ {
603
+ "id": "direct-provider-hosted-search",
604
+ "required": true,
605
+ "sourceMarkers": [
606
+ {"file": "src/plan.ts", "marker": "route.provider !== 'github-copilot'"},
607
+ {"file": "src/index.ts", "marker": "route.model !== request.model"},
608
+ {"file": "src/index.ts", "marker": "resolveRequestAuth"},
609
+ {"file": "src/copilot-request.ts", "marker": "Openai-Intent"},
610
+ {"file": "src/probe.ts", "marker": "RESPONSES_PROBE_ROUNDS = 2"}
611
+ ],
612
+ "tests": [
613
+ {"file": "tests/inline/apply.spec.ts", "name": "captures an explicit request model instead of substituting a changed Session selection"},
614
+ {"file": "tests/inline/apply.spec.ts", "name": "routes concurrent hosted tools from real model-selection request headers rather than activation seeds"},
615
+ {"file": "tests/inline/apply.spec.ts", "name": "disposes only A during final %s HTTP %s while B completes without cross-cancellation"},
616
+ {"file": "tests/inline/apply.spec.ts", "name": "ensures cold metadata only on actual search and captures selection before discovery awaits"},
617
+ {"file": "tests/preview-route.spec.ts", "name": "resolves Host-only search auth from the live generic snapshot without exposing it in status"},
618
+ {"file": "tests/copilot-request.spec.ts", "name": "combines installed catalog headers with provider-required request metadata"},
619
+ {"file": "tests/copilot-request.spec.ts", "name": "applies a credential-specific Copilot endpoint before request construction"},
620
+ {"file": "tests/copilot-request.spec.ts", "name": "preserves the Anthropic v1 path on a credential-specific endpoint"},
621
+ {"file": "tests/copilot-request.spec.ts", "name": "adds dynamic headers for business and enterprise Copilot endpoints"},
622
+ {"file": "tests/probe.spec.ts", "name": "confirms support via the standard spelling and reports it"},
623
+ {"file": "tests/probe.spec.ts", "name": "bounds all-transient replies to two complete spelling rounds"},
624
+ {"file": "tests/probe.spec.ts", "name": "shares one whole-probe deadline and signal across retries"},
625
+ {"file": "tests/inline/wire.spec.ts", "name": "skips web_search_call events and streams the answer normally"},
626
+ {"file": "tests/inline/wire.spec.ts", "name": "skips a pass-through function_call named web_search without slotting it"}
627
+ ]
628
+ },
629
+ {
630
+ "id": "hosted-search-file-context-fail-closed",
631
+ "required": true,
632
+ "sourceMarkers": [{"file": "src/index.ts", "marker": "contentHasFileCompat(message.content)"}],
633
+ "tests": [
634
+ {"file": "tests/inline/apply.spec.ts", "name": "preserves a top-level user file when bypassing the custom wire"},
635
+ {"file": "tests/inline/apply.spec.ts", "name": "preserves a file nested in tool-result content when bypassing the custom wire"},
636
+ {"file": "tests/preview-route.spec.ts", "name": "uses native attachment projection and execution-world mapping when available: %s"},
637
+ {"file": "tests/preview-route.spec.ts", "name": "keeps the mapped read-only path when Core offloads an image to fit its request budget"}
638
+ ]
639
+ },
640
+ {
641
+ "id": "traditional-search-bridge",
642
+ "required": true,
643
+ "sourceMarkers": [
644
+ {"file": "src/traditional-search.ts", "marker": "github-copilot-hosted"},
645
+ {"file": "README.md", "marker": "github-copilot.searchFallback"},
646
+ {"file": "README.md", "marker": "Fetch is unchanged."},
647
+ {"file": "README.zh.md", "marker": "github-copilot.searchFallback"},
648
+ {"file": "README.zh.md", "marker": "网页抓取不变"}
649
+ ],
650
+ "tests": [
651
+ {"file": "tests/traditional-search.spec.ts", "name": "normalizes generated content and deduplicated sources"},
652
+ {"file": "tests/traditional-search.spec.ts", "name": "honors caller abort before credential or network access"},
653
+ {"file": "tests/traditional-search.spec.ts", "name": "maps HTTP errors without leaking credentials or provider bodies"}
654
+ ]
655
+ },
656
+ {
657
+ "id": "dsh-supported-baselines-fail-loud-guard",
658
+ "required": true,
659
+ "sourceMarkers": [
660
+ {"file": "src/compatibility.ts", "marker": "peerRange: '0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2'"}
661
+ ],
662
+ "tests": [
663
+ {"file": "tests/compatibility.spec.ts", "name": "retains the original three compatibility baselines"},
664
+ {"file": "tests/compatibility.spec.ts", "name": "adds 0.1.5-rc.1 and 0.1.5-rc.2 without dropping earlier baselines or advancing development dependencies"},
665
+ {"file": "tests/compatibility.spec.ts", "name": "accepts the supported DSH service contract"},
666
+ {"file": "tests/compatibility.spec.ts", "name": "fails before startup when a required API is absent"}
667
+ ]
668
+ },
669
+ {
670
+ "id": "dsh-models-settings-and-managed-discovery-ui",
671
+ "required": true,
672
+ "activation": "provider-row-first-shared-account-with-exclusive-fallback",
673
+ "sourceMarkers": [
674
+ {"file": "src/client.ts", "marker": "GitHubCopilotSettingsSection"},
675
+ {"file": "src/client.ts", "marker": "settings.models.footer"},
676
+ {"file": "src/client.ts", "marker": "settingsSectionActive && !footerActive"}
677
+ ],
678
+ "tests": [
679
+ {"file": "tests/client.spec.ts", "name": "registers a GitHub Copilot settings section on the rc.2 Models surface"},
680
+ {"file": "tests/client.spec.ts", "name": "registers coordinated provider and fallback seats without starting either controller during registration"},
681
+ {"file": "tests/client.spec.ts", "name": "leaves authorization active when the optional footer contract is incompatible or registration fails"},
682
+ {"file": "tests/client.spec.ts", "name": "mounts one compact account lifecycle instead of separate authorization and discovery owners"},
683
+ {"file": "tests/client.spec.ts", "name": "makes explicit account discovery available in the old-Core settings fallback"},
684
+ {"file": "tests/client.spec.ts", "name": "explains the initial model list without inferring a completed discovery from sign-in"},
685
+ {"file": "tests/client.spec.ts", "name": "restores exactly one account fallback when a footer declaration is withdrawn"},
686
+ {"file": "tests/client.spec.ts", "name": "transfers a pending sign-in to an arriving row and back without stale actions or a second poll owner"},
687
+ {"file": "tests/client.spec.ts", "name": "keeps one owner across duplicate row instances and footer/settings competition"}
688
+ ]
689
+ },
690
+ {
691
+ "id": "single-managed-route-native-oauth",
692
+ "required": true,
693
+ "sourceMarkers": [
694
+ {"file": "src/authorization-controller.ts", "marker": "current !== undefined && providerSupportsStrictMode(current) !== false"},
695
+ {"file": "src/preview-route.ts", "marker": "displayName: 'GitHub Copilot'"},
696
+ {"file": "src/client.ts", "marker": "GitHubCopilotAccountSurface"}
697
+ ],
698
+ "tests": [
699
+ {"file": "tests/single-route.spec.ts", "name": "keeps the native login flow while exposing only the account-driven provider"},
700
+ {"file": "tests/single-route.spec.ts", "name": "discovers new IDs and reasoning metadata without a canonical model profile"},
701
+ {"file": "tests/single-route.spec.ts", "name": "honors an explicit legacy-profile removal without deleting OAuth or rebuilding the route"},
702
+ {"file": "tests/authorization-controller.spec.ts", "name": "does not recreate an absent canonical profile during status or startup and auth reconciliation helpers"},
703
+ {"file": "tests/authorization-controller.spec.ts", "name": "keeps absent-profile legacy journal conflicts visible instead of bypassing ownership review"}
704
+ ]
705
+ },
706
+ {
707
+ "id": "compact-account-row-and-auth-disclosure",
708
+ "required": true,
709
+ "sourceMarkers": [
710
+ {"file": "src/client.ts", "marker": "GitHubCopilotCompactAccount"},
711
+ {"file": "src/client.ts", "marker": "data-dsh-github-copilot-auto-authorization"},
712
+ {"file": "src/compact-account.ts", "marker": "createCompactAccount"}
713
+ ],
714
+ "tests": [
715
+ {"file": "tests/compact-account.spec.ts", "name": "renders a neutral checking state then only a compact signed-in row"},
716
+ {"file": "tests/compact-account.spec.ts", "name": "shows signed-out CTA and automatically reveals authorization without opening Manage"},
717
+ {"file": "tests/compact-account.spec.ts", "name": "retains manual management and live actions when toggled during authorization"},
718
+ {"file": "tests/compact-account.spec.ts", "name": "keeps normal refresh inside Manage and visible Retry outside for actual failures"},
719
+ {"file": "tests/compact-account.spec.ts", "name": "cleans timers and ignores late requests after detach or Remote replacement"},
720
+ {"file": "tests/compact-account.spec.ts", "name": "keeps cancellation failures visible without reviving a stale code"},
721
+ {"file": "tests/compact-account.spec.ts", "name": "orders cancellation after pending start so a late Host preflight cannot create an abandoned flow"},
722
+ {"file": "tests/compact-account.spec.ts", "name": "discovers exactly once after immediate confirmed completion and permits later manual refresh"},
723
+ {"file": "tests/compact-account.spec.ts", "name": "waits through repeated authorization polls and discovers only on confirmed completion"},
724
+ {"file": "tests/compact-account.spec.ts", "name": "keeps automatic post-login discovery owned across Manage toggles and shows a retryable error"},
725
+ {"file": "tests/authorization-controller.spec.ts", "name": "keeps completion pending through post-login repair so the Client discovers exactly once afterwards"},
726
+ {"file": "tests/compact-account.spec.ts", "name": "keeps stale count visible during initial metadata refresh without a warning or header refresh button"},
727
+ {"file": "tests/authorization-controller.spec.ts", "name": "ensures account metadata without forcing past the shared cache or cooldown"},
728
+ {"file": "tests/client.spec.ts", "name": "owns a minute-only UI timer through committed mount, timestamp change and unmount"},
729
+ {"file": "tests/compact-account.spec.ts", "name": "keeps the Host cache timestamp outside Manage and live regions through refresh and failure"},
730
+ {"file": "tests/client-bundle.spec.ts", "name": "exports the cache timestamp formatter and isolated clock component in the built Client"}
731
+ ]
732
+ }
733
+ ],
734
+ "requiredExports": {
735
+ ".": [
736
+ "GITHUB_COPILOT_HOSTED_SEARCH_PROVIDER_ID",
737
+ "GITHUB_COPILOT_CREDENTIAL_KEY",
738
+ "GitHubCopilotAuthorizationController",
739
+ "describeGitHubCopilotProviderProfile",
740
+ "ensureGitHubCopilotProviderProfile",
741
+ "LLM_PI_AI_SETTINGS_NAMESPACE",
742
+ "DSH_COMPATIBILITY",
743
+ "assertDshCompatibility"
744
+ ],
745
+ "./client": [],
746
+ "./remote": [],
747
+ "./routed-web": ["default"],
748
+ "./web-delegate": ["name", "inject", "apply"],
749
+ "./deployment-baseline.json": [],
750
+ "./package.json": []
751
+ }
752
+ }