@machina.ai/cell-cli-core 1.16.0-rc2 → 1.19.4-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +6 -4
- package/dist/src/agents/codebase-investigator.js +1 -1
- package/dist/src/agents/executor.js +12 -21
- package/dist/src/agents/executor.js.map +1 -1
- package/dist/src/agents/executor.test.js +53 -57
- package/dist/src/agents/executor.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +4 -0
- package/dist/src/agents/registry.js +23 -0
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +30 -16
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.d.ts +34 -0
- package/dist/src/availability/modelAvailabilityService.js +84 -0
- package/dist/src/availability/modelAvailabilityService.js.map +1 -0
- package/dist/src/availability/modelAvailabilityService.test.d.ts +6 -0
- package/dist/src/availability/modelAvailabilityService.test.js +140 -0
- package/dist/src/availability/modelAvailabilityService.test.js.map +1 -0
- package/dist/src/availability/modelPolicy.d.ts +42 -0
- package/dist/src/availability/modelPolicy.js +7 -0
- package/dist/src/availability/modelPolicy.js.map +1 -0
- package/dist/src/availability/policyCatalog.d.ts +20 -0
- package/dist/src/availability/policyCatalog.js +83 -0
- package/dist/src/availability/policyCatalog.js.map +1 -0
- package/dist/src/availability/policyCatalog.test.d.ts +6 -0
- package/dist/src/availability/policyCatalog.test.js +70 -0
- package/dist/src/availability/policyCatalog.test.js.map +1 -0
- package/dist/src/code_assist/codeAssist.js +1 -1
- package/dist/src/code_assist/codeAssist.test.js +3 -3
- package/dist/src/code_assist/oauth-credential-storage.test.js +1 -0
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +106 -53
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +25 -12
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/config/config.d.ts +18 -5
- package/dist/src/config/config.js +51 -19
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +14 -79
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +56 -4
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +6 -0
- package/dist/src/confirmation-bus/message-bus.js +63 -2
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +25 -2
- package/dist/src/confirmation-bus/types.js +3 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/core/AuthenticatedContentGenerator.d.ts +20 -0
- package/dist/src/core/AuthenticatedContentGenerator.js +115 -0
- package/dist/src/core/AuthenticatedContentGenerator.js.map +1 -0
- package/dist/src/core/baseLlmClient.d.ts +27 -1
- package/dist/src/core/baseLlmClient.js +66 -45
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +94 -6
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +1 -2
- package/dist/src/core/client.js +89 -29
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +82 -41
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/clientHookTriggers.d.ts +36 -0
- package/dist/src/core/clientHookTriggers.js +76 -0
- package/dist/src/core/clientHookTriggers.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +2 -1
- package/dist/src/core/contentGenerator.js +12 -5
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +119 -1
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +0 -2
- package/dist/src/core/coreToolScheduler.js +1 -3
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +3 -18
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +10 -5
- package/dist/src/core/geminiChat.js +57 -22
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +188 -55
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/logger.test.js +12 -11
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +6 -2
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +10 -2
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +21 -6
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +79 -93
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +14 -3
- package/dist/src/core/turn.js +13 -7
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +73 -139
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/fallback/handler.js +10 -5
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +79 -17
- package/dist/src/fallback/handler.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/hooks/hookEventHandler.d.ts +109 -0
- package/dist/src/hooks/hookEventHandler.js +486 -0
- package/dist/src/hooks/hookEventHandler.js.map +1 -0
- package/dist/src/hooks/hookEventHandler.test.d.ts +6 -0
- package/dist/src/hooks/hookEventHandler.test.js +384 -0
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -0
- package/dist/src/hooks/hookSystem.d.ts +48 -0
- package/dist/src/hooks/hookSystem.js +83 -0
- package/dist/src/hooks/hookSystem.js.map +1 -0
- package/dist/src/hooks/hookSystem.test.d.ts +6 -0
- package/dist/src/hooks/hookSystem.test.js +213 -0
- package/dist/src/hooks/hookSystem.test.js.map +1 -0
- package/dist/src/hooks/index.d.ts +15 -0
- package/dist/src/hooks/index.js +15 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +1 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/policy/policy-engine.d.ts +17 -1
- package/dist/src/policy/policy-engine.js +90 -1
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +222 -0
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +51 -1
- package/dist/src/policy/types.js +21 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/mcp-prompts.test.js +0 -1
- package/dist/src/prompts/mcp-prompts.test.js.map +1 -1
- package/dist/src/prompts/prompt-registry.test.js +0 -15
- package/dist/src/prompts/prompt-registry.test.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +1 -1
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +4 -3
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/services/chatCompressionService.d.ts +2 -1
- package/dist/src/services/chatCompressionService.js +23 -7
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +27 -32
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +1 -1
- package/dist/src/services/gitService.js +3 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +10 -0
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/modelConfig.integration.test.js +34 -0
- package/dist/src/services/modelConfig.integration.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +3 -0
- package/dist/src/services/modelConfigService.js +12 -3
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +133 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +35 -6
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +78 -1
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases.golden.json +57 -4
- package/dist/src/telemetry/activity-monitor.test.js +4 -1
- package/dist/src/telemetry/activity-monitor.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +97 -51
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +24 -16
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +5 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +14 -3
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +2 -5
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +26 -8
- package/dist/src/telemetry/metrics.js +37 -11
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +61 -39
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sanitize.d.ts +25 -0
- package/dist/src/telemetry/sanitize.js +48 -0
- package/dist/src/telemetry/sanitize.js.map +1 -0
- package/dist/src/telemetry/sanitize.test.d.ts +6 -0
- package/dist/src/telemetry/sanitize.test.js +279 -0
- package/dist/src/telemetry/sanitize.test.js.map +1 -0
- package/dist/src/telemetry/semantic.js +1 -1
- package/dist/src/telemetry/semantic.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +19 -0
- package/dist/src/telemetry/types.js +65 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/config.d.ts +1 -1
- package/dist/src/test-utils/config.js +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +60 -0
- package/dist/src/test-utils/mock-message-bus.js +131 -0
- package/dist/src/test-utils/mock-message-bus.js.map +1 -0
- package/dist/src/test-utils/mock-tool.js +1 -1
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/edit.test.js +203 -200
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +4 -2
- package/dist/src/tools/mcp-client.js +226 -114
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +128 -54
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +186 -273
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +1 -1
- package/dist/src/tools/modifiable-tool.js +2 -2
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +12 -11
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +84 -126
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +93 -112
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +59 -90
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +121 -179
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/write-file.test.js +105 -116
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +1 -1
- package/dist/src/tools/write-todos.js +1 -1
- package/dist/src/utils/customHeaderUtils.d.ts +9 -0
- package/dist/src/utils/customHeaderUtils.js +34 -0
- package/dist/src/utils/customHeaderUtils.js.map +1 -0
- package/dist/src/utils/customHeaderUtils.test.d.ts +6 -0
- package/dist/src/utils/customHeaderUtils.test.js +77 -0
- package/dist/src/utils/customHeaderUtils.test.js.map +1 -0
- package/dist/src/utils/debugLogger.test.js +27 -25
- package/dist/src/utils/debugLogger.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +1 -1
- package/dist/src/utils/editor.js +3 -2
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +7 -46
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/events.d.ts +33 -3
- package/dist/src/utils/events.js +35 -15
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +86 -5
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js +1 -1
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/installationManager.test.js +2 -1
- package/dist/src/utils/installationManager.test.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.test.js +2 -1
- package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +3 -2
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +1 -1
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +8 -14
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.test.js +3 -1
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
- package/dist/src/utils/package.d.ts +14 -0
- package/dist/src/utils/package.js +15 -2
- package/dist/src/utils/package.js.map +1 -1
- package/dist/src/utils/schemaValidator.d.ts +1 -1
- package/dist/src/utils/schemaValidator.js +1 -1
- package/dist/src/utils/shell-utils.js +1 -1
- package/dist/src/utils/stdio.d.ts +32 -0
- package/dist/src/utils/stdio.js +85 -0
- package/dist/src/utils/stdio.js.map +1 -0
- package/dist/src/utils/stdio.test.d.ts +6 -0
- package/dist/src/utils/stdio.test.js +47 -0
- package/dist/src/utils/stdio.test.js.map +1 -0
- package/dist/src/utils/systemEncoding.test.js +2 -1
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/terminal.d.ts +14 -0
- package/dist/src/utils/terminal.js +38 -0
- package/dist/src/utils/terminal.js.map +1 -0
- package/dist/src/utils/userAccountManager.test.js +7 -6
- package/dist/src/utils/userAccountManager.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.test.js +5 -4
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { ModelAvailabilityService } from './modelAvailabilityService.js';
|
|
8
|
+
describe('ModelAvailabilityService', () => {
|
|
9
|
+
let service;
|
|
10
|
+
const model = 'test-model';
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
service = new ModelAvailabilityService();
|
|
13
|
+
vi.useRealTimers();
|
|
14
|
+
});
|
|
15
|
+
it('returns available snapshot when no state recorded', () => {
|
|
16
|
+
expect(service.snapshot(model)).toEqual({ available: true });
|
|
17
|
+
});
|
|
18
|
+
it('tracks retry-once-per-turn failures', () => {
|
|
19
|
+
service.markRetryOncePerTurn(model);
|
|
20
|
+
expect(service.snapshot(model)).toEqual({ available: true });
|
|
21
|
+
service.consumeStickyAttempt(model);
|
|
22
|
+
expect(service.snapshot(model)).toEqual({
|
|
23
|
+
available: false,
|
|
24
|
+
reason: 'retry_once_per_turn',
|
|
25
|
+
});
|
|
26
|
+
service.resetTurn();
|
|
27
|
+
expect(service.snapshot(model)).toEqual({ available: true });
|
|
28
|
+
});
|
|
29
|
+
it('tracks terminal failures', () => {
|
|
30
|
+
service.markTerminal(model, 'quota');
|
|
31
|
+
expect(service.snapshot(model)).toEqual({
|
|
32
|
+
available: false,
|
|
33
|
+
reason: 'quota',
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('does not override terminal failure with sticky failure', () => {
|
|
37
|
+
service.markTerminal(model, 'quota');
|
|
38
|
+
service.markRetryOncePerTurn(model);
|
|
39
|
+
expect(service.snapshot(model)).toEqual({
|
|
40
|
+
available: false,
|
|
41
|
+
reason: 'quota',
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('selects models respecting terminal and sticky states', () => {
|
|
45
|
+
const stickyModel = 'stick-model';
|
|
46
|
+
const healthyModel = 'healthy-model';
|
|
47
|
+
service.markTerminal(model, 'capacity');
|
|
48
|
+
service.markRetryOncePerTurn(stickyModel);
|
|
49
|
+
const first = service.selectFirstAvailable([
|
|
50
|
+
model,
|
|
51
|
+
stickyModel,
|
|
52
|
+
healthyModel,
|
|
53
|
+
]);
|
|
54
|
+
expect(first).toEqual({
|
|
55
|
+
selected: stickyModel,
|
|
56
|
+
attempts: 1,
|
|
57
|
+
skipped: [
|
|
58
|
+
{
|
|
59
|
+
model,
|
|
60
|
+
reason: 'capacity',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
service.consumeStickyAttempt(stickyModel);
|
|
65
|
+
const second = service.selectFirstAvailable([
|
|
66
|
+
model,
|
|
67
|
+
stickyModel,
|
|
68
|
+
healthyModel,
|
|
69
|
+
]);
|
|
70
|
+
expect(second).toEqual({
|
|
71
|
+
selected: healthyModel,
|
|
72
|
+
skipped: [
|
|
73
|
+
{
|
|
74
|
+
model,
|
|
75
|
+
reason: 'capacity',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
model: stickyModel,
|
|
79
|
+
reason: 'retry_once_per_turn',
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
service.resetTurn();
|
|
84
|
+
const third = service.selectFirstAvailable([
|
|
85
|
+
model,
|
|
86
|
+
stickyModel,
|
|
87
|
+
healthyModel,
|
|
88
|
+
]);
|
|
89
|
+
expect(third).toEqual({
|
|
90
|
+
selected: stickyModel,
|
|
91
|
+
attempts: 1,
|
|
92
|
+
skipped: [
|
|
93
|
+
{
|
|
94
|
+
model,
|
|
95
|
+
reason: 'capacity',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
it('preserves consumed state when marking retry-once-per-turn again', () => {
|
|
101
|
+
service.markRetryOncePerTurn(model);
|
|
102
|
+
service.consumeStickyAttempt(model);
|
|
103
|
+
// It is currently consumed
|
|
104
|
+
expect(service.snapshot(model).available).toBe(false);
|
|
105
|
+
// Marking it again should not reset the consumed flag
|
|
106
|
+
service.markRetryOncePerTurn(model);
|
|
107
|
+
expect(service.snapshot(model).available).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it('clears consumed state when marked healthy', () => {
|
|
110
|
+
service.markRetryOncePerTurn(model);
|
|
111
|
+
service.consumeStickyAttempt(model);
|
|
112
|
+
expect(service.snapshot(model).available).toBe(false);
|
|
113
|
+
service.markHealthy(model);
|
|
114
|
+
expect(service.snapshot(model).available).toBe(true);
|
|
115
|
+
// If we mark it sticky again, it should be fresh (not consumed)
|
|
116
|
+
service.markRetryOncePerTurn(model);
|
|
117
|
+
expect(service.snapshot(model).available).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it('resetTurn resets consumed state for multiple sticky models', () => {
|
|
120
|
+
const model2 = 'model-2';
|
|
121
|
+
service.markRetryOncePerTurn(model);
|
|
122
|
+
service.markRetryOncePerTurn(model2);
|
|
123
|
+
service.consumeStickyAttempt(model);
|
|
124
|
+
service.consumeStickyAttempt(model2);
|
|
125
|
+
expect(service.snapshot(model).available).toBe(false);
|
|
126
|
+
expect(service.snapshot(model2).available).toBe(false);
|
|
127
|
+
service.resetTurn();
|
|
128
|
+
expect(service.snapshot(model).available).toBe(true);
|
|
129
|
+
expect(service.snapshot(model2).available).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it('resetTurn does not affect terminal models', () => {
|
|
132
|
+
service.markTerminal(model, 'quota');
|
|
133
|
+
service.resetTurn();
|
|
134
|
+
expect(service.snapshot(model)).toEqual({
|
|
135
|
+
available: false,
|
|
136
|
+
reason: 'quota',
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=modelAvailabilityService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelAvailabilityService.test.js","sourceRoot":"","sources":["../../../src/availability/modelAvailabilityService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { ModelHealthStatus, ModelId } from './modelAvailabilityService.js';
|
|
7
|
+
/**
|
|
8
|
+
* Whether to prompt the user or fallback silently on a model API failure.
|
|
9
|
+
*/
|
|
10
|
+
export type FallbackAction = 'silent' | 'prompt';
|
|
11
|
+
/**
|
|
12
|
+
* Type of possible errors from model API failures.
|
|
13
|
+
*/
|
|
14
|
+
export type FailureKind = 'terminal' | 'transient' | 'not_found' | 'unknown';
|
|
15
|
+
/**
|
|
16
|
+
* Map from model API failure reason to user interaction.
|
|
17
|
+
*/
|
|
18
|
+
export type ModelPolicyActionMap = Partial<Record<FailureKind, FallbackAction>>;
|
|
19
|
+
/**
|
|
20
|
+
* What state (e.g. Terminal, Sticky Retry) to set a model after failed API call.
|
|
21
|
+
*/
|
|
22
|
+
export type ModelPolicyStateMap = Partial<Record<FailureKind, ModelHealthStatus>>;
|
|
23
|
+
/**
|
|
24
|
+
* Defines the policy for a single model in the availability chain.
|
|
25
|
+
*
|
|
26
|
+
* This includes:
|
|
27
|
+
* - Which model this policy applies to.
|
|
28
|
+
* - What actions to take (prompt vs silent fallback) for different failure kinds.
|
|
29
|
+
* - How the model's health status should transition upon failure.
|
|
30
|
+
* - Whether this model is considered a "last resort" (i.e. use if all models are unavailable).
|
|
31
|
+
*/
|
|
32
|
+
export interface ModelPolicy {
|
|
33
|
+
model: ModelId;
|
|
34
|
+
actions: ModelPolicyActionMap;
|
|
35
|
+
stateTransitions: ModelPolicyStateMap;
|
|
36
|
+
isLastResort?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A chain of model policies defining the priority and fallback behavior.
|
|
40
|
+
* The first model in the chain is the primary model.
|
|
41
|
+
*/
|
|
42
|
+
export type ModelPolicyChain = ModelPolicy[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelPolicy.js","sourceRoot":"","sources":["../../../src/availability/modelPolicy.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { ModelPolicy, ModelPolicyChain } from './modelPolicy.js';
|
|
7
|
+
import type { UserTierId } from '../code_assist/types.js';
|
|
8
|
+
export interface ModelPolicyOptions {
|
|
9
|
+
previewEnabled: boolean;
|
|
10
|
+
userTier?: UserTierId;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns the default ordered model policy chain for the user.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getModelPolicyChain(options: ModelPolicyOptions): ModelPolicyChain;
|
|
16
|
+
/**
|
|
17
|
+
* Provides a default policy scaffold for models not present in the catalog.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createDefaultPolicy(model: string): ModelPolicy;
|
|
20
|
+
export declare function validateModelPolicyChain(chain: ModelPolicyChain): void;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { DEFAULT_GEMINI_FLASH_MODEL, DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_MODEL, } from '../config/models.js';
|
|
7
|
+
const DEFAULT_ACTIONS = {
|
|
8
|
+
terminal: 'prompt',
|
|
9
|
+
transient: 'prompt',
|
|
10
|
+
not_found: 'prompt',
|
|
11
|
+
unknown: 'prompt',
|
|
12
|
+
};
|
|
13
|
+
const DEFAULT_STATE = {
|
|
14
|
+
terminal: 'terminal',
|
|
15
|
+
transient: 'terminal',
|
|
16
|
+
not_found: 'terminal',
|
|
17
|
+
unknown: 'terminal',
|
|
18
|
+
};
|
|
19
|
+
const DEFAULT_CHAIN = [
|
|
20
|
+
definePolicy({ model: DEFAULT_GEMINI_MODEL }),
|
|
21
|
+
definePolicy({ model: DEFAULT_GEMINI_FLASH_MODEL, isLastResort: true }),
|
|
22
|
+
];
|
|
23
|
+
const PREVIEW_CHAIN = [
|
|
24
|
+
definePolicy({
|
|
25
|
+
model: PREVIEW_GEMINI_MODEL,
|
|
26
|
+
stateTransitions: { transient: 'sticky_retry' },
|
|
27
|
+
}),
|
|
28
|
+
definePolicy({ model: DEFAULT_GEMINI_MODEL }),
|
|
29
|
+
definePolicy({ model: DEFAULT_GEMINI_FLASH_MODEL, isLastResort: true }),
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Returns the default ordered model policy chain for the user.
|
|
33
|
+
*/
|
|
34
|
+
export function getModelPolicyChain(options) {
|
|
35
|
+
if (options.previewEnabled) {
|
|
36
|
+
return cloneChain(PREVIEW_CHAIN);
|
|
37
|
+
}
|
|
38
|
+
return cloneChain(DEFAULT_CHAIN);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Provides a default policy scaffold for models not present in the catalog.
|
|
42
|
+
*/
|
|
43
|
+
export function createDefaultPolicy(model) {
|
|
44
|
+
return definePolicy({ model });
|
|
45
|
+
}
|
|
46
|
+
export function validateModelPolicyChain(chain) {
|
|
47
|
+
if (chain.length === 0) {
|
|
48
|
+
throw new Error('Model policy chain must include at least one model.');
|
|
49
|
+
}
|
|
50
|
+
const lastResortCount = chain.filter((policy) => policy.isLastResort).length;
|
|
51
|
+
if (lastResortCount === 0) {
|
|
52
|
+
throw new Error('Model policy chain must include an `isLastResort` model.');
|
|
53
|
+
}
|
|
54
|
+
if (lastResortCount > 1) {
|
|
55
|
+
throw new Error('Model policy chain must only have one `isLastResort`.');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Helper to define a ModelPolicy with default actions and state transitions.
|
|
60
|
+
* Ensures every policy is a fresh instance to avoid shared state.
|
|
61
|
+
*/
|
|
62
|
+
function definePolicy(config) {
|
|
63
|
+
return {
|
|
64
|
+
model: config.model,
|
|
65
|
+
isLastResort: config.isLastResort,
|
|
66
|
+
actions: { ...DEFAULT_ACTIONS, ...(config.actions ?? {}) },
|
|
67
|
+
stateTransitions: {
|
|
68
|
+
...DEFAULT_STATE,
|
|
69
|
+
...(config.stateTransitions ?? {}),
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function clonePolicy(policy) {
|
|
74
|
+
return {
|
|
75
|
+
...policy,
|
|
76
|
+
actions: { ...policy.actions },
|
|
77
|
+
stateTransitions: { ...policy.stateTransitions },
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function cloneChain(chain) {
|
|
81
|
+
return chain.map(clonePolicy);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=policyCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyCatalog.js","sourceRoot":"","sources":["../../../src/availability/policyCatalog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAc7B,MAAM,eAAe,GAAyB;IAC5C,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAM,aAAa,GAAwB;IACzC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,UAAU;IACrB,SAAS,EAAE,UAAU;IACrB,OAAO,EAAE,UAAU;CACpB,CAAC;AAEF,MAAM,aAAa,GAAqB;IACtC,YAAY,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC7C,YAAY,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CACxE,CAAC;AAEF,MAAM,aAAa,GAAqB;IACtC,YAAY,CAAC;QACX,KAAK,EAAE,oBAAoB;QAC3B,gBAAgB,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;KAChD,CAAC;IACF,YAAY,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC7C,YAAY,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;CACxE,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA2B;IAE3B,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;IAC7E,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,MAAoB;IACxC,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,EAAE,GAAG,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;QAC1D,gBAAgB,EAAE;YAChB,GAAG,aAAa;YAChB,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;SACnC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB;IACtC,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE;QAC9B,gBAAgB,EAAE,EAAE,GAAG,MAAM,CAAC,gBAAgB,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAuB;IACzC,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { createDefaultPolicy, getModelPolicyChain, validateModelPolicyChain, } from './policyCatalog.js';
|
|
8
|
+
import { DEFAULT_GEMINI_MODEL, PREVIEW_GEMINI_MODEL, } from '../config/models.js';
|
|
9
|
+
describe('policyCatalog', () => {
|
|
10
|
+
it('returns preview chain when preview enabled', () => {
|
|
11
|
+
const chain = getModelPolicyChain({ previewEnabled: true });
|
|
12
|
+
expect(chain[0]?.model).toBe(PREVIEW_GEMINI_MODEL);
|
|
13
|
+
expect(chain).toHaveLength(3);
|
|
14
|
+
});
|
|
15
|
+
it('returns default chain when preview disabled', () => {
|
|
16
|
+
const chain = getModelPolicyChain({ previewEnabled: false });
|
|
17
|
+
expect(chain[0]?.model).toBe(DEFAULT_GEMINI_MODEL);
|
|
18
|
+
expect(chain).toHaveLength(2);
|
|
19
|
+
});
|
|
20
|
+
it('marks preview transients as sticky retries', () => {
|
|
21
|
+
const [previewPolicy] = getModelPolicyChain({ previewEnabled: true });
|
|
22
|
+
expect(previewPolicy.model).toBe(PREVIEW_GEMINI_MODEL);
|
|
23
|
+
expect(previewPolicy.stateTransitions.transient).toBe('sticky_retry');
|
|
24
|
+
});
|
|
25
|
+
it('applies default actions and state transitions for unspecified kinds', () => {
|
|
26
|
+
const [previewPolicy] = getModelPolicyChain({ previewEnabled: true });
|
|
27
|
+
expect(previewPolicy.stateTransitions.not_found).toBe('terminal');
|
|
28
|
+
expect(previewPolicy.stateTransitions.unknown).toBe('terminal');
|
|
29
|
+
expect(previewPolicy.actions.unknown).toBe('prompt');
|
|
30
|
+
});
|
|
31
|
+
it('clones policy maps so edits do not leak between calls', () => {
|
|
32
|
+
const firstCall = getModelPolicyChain({ previewEnabled: false });
|
|
33
|
+
firstCall[0].actions.terminal = 'silent';
|
|
34
|
+
const secondCall = getModelPolicyChain({ previewEnabled: false });
|
|
35
|
+
expect(secondCall[0].actions.terminal).toBe('prompt');
|
|
36
|
+
});
|
|
37
|
+
it('passes when there is exactly one last-resort policy', () => {
|
|
38
|
+
const validChain = [
|
|
39
|
+
createDefaultPolicy('test-model'),
|
|
40
|
+
{ ...createDefaultPolicy('last-resort'), isLastResort: true },
|
|
41
|
+
];
|
|
42
|
+
expect(() => validateModelPolicyChain(validChain)).not.toThrow();
|
|
43
|
+
});
|
|
44
|
+
it('fails when no policies are marked last-resort', () => {
|
|
45
|
+
const chain = [
|
|
46
|
+
createDefaultPolicy('model-a'),
|
|
47
|
+
createDefaultPolicy('model-b'),
|
|
48
|
+
];
|
|
49
|
+
expect(() => validateModelPolicyChain(chain)).toThrow('must include an `isLastResort`');
|
|
50
|
+
});
|
|
51
|
+
it('fails when a single-model chain is not last-resort', () => {
|
|
52
|
+
const chain = [createDefaultPolicy('lonely-model')];
|
|
53
|
+
expect(() => validateModelPolicyChain(chain)).toThrow('must include an `isLastResort`');
|
|
54
|
+
});
|
|
55
|
+
it('fails when multiple policies are marked last-resort', () => {
|
|
56
|
+
const chain = [
|
|
57
|
+
{ ...createDefaultPolicy('model-a'), isLastResort: true },
|
|
58
|
+
{ ...createDefaultPolicy('model-b'), isLastResort: true },
|
|
59
|
+
];
|
|
60
|
+
expect(() => validateModelPolicyChain(chain)).toThrow('must only have one `isLastResort`');
|
|
61
|
+
});
|
|
62
|
+
it('createDefaultPolicy seeds default actions and states', () => {
|
|
63
|
+
const policy = createDefaultPolicy('custom');
|
|
64
|
+
expect(policy.actions.terminal).toBe('prompt');
|
|
65
|
+
expect(policy.actions.unknown).toBe('prompt');
|
|
66
|
+
expect(policy.stateTransitions.terminal).toBe('terminal');
|
|
67
|
+
expect(policy.stateTransitions.unknown).toBe('terminal');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=policyCatalog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyCatalog.test.js","sourceRoot":"","sources":["../../../src/availability/policyCatalog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { CodeAssistServer } from './server.js';
|
|
|
10
10
|
import { LoggingContentGenerator } from '../core/loggingContentGenerator.js';
|
|
11
11
|
export async function createCodeAssistContentGenerator(httpOptions, authType, config, sessionId) {
|
|
12
12
|
if (authType === AuthType.LOGIN_WITH_GOOGLE ||
|
|
13
|
-
authType === AuthType.
|
|
13
|
+
authType === AuthType.COMPUTE_ADC) {
|
|
14
14
|
const authClient = await getOauthClient(authType, config);
|
|
15
15
|
const userData = await setupUser(authClient);
|
|
16
16
|
return new CodeAssistServer(authClient, userData.projectId, httpOptions, sessionId, userData.userTier);
|
|
@@ -41,11 +41,11 @@ describe('codeAssist', () => {
|
|
|
41
41
|
expect(MockedCodeAssistServer).toHaveBeenCalledWith(mockAuthClient, 'test-project', httpOptions, 'session-123', 'free-tier');
|
|
42
42
|
expect(generator).toBeInstanceOf(MockedCodeAssistServer);
|
|
43
43
|
});
|
|
44
|
-
it('should create a server for
|
|
44
|
+
it('should create a server for COMPUTE_ADC', async () => {
|
|
45
45
|
mockedGetOauthClient.mockResolvedValue(mockAuthClient);
|
|
46
46
|
mockedSetupUser.mockResolvedValue(mockUserData);
|
|
47
|
-
const generator = await createCodeAssistContentGenerator(httpOptions, AuthType.
|
|
48
|
-
expect(getOauthClient).toHaveBeenCalledWith(AuthType.
|
|
47
|
+
const generator = await createCodeAssistContentGenerator(httpOptions, AuthType.COMPUTE_ADC, mockConfig);
|
|
48
|
+
expect(getOauthClient).toHaveBeenCalledWith(AuthType.COMPUTE_ADC, mockConfig);
|
|
49
49
|
expect(setupUser).toHaveBeenCalledWith(mockAuthClient);
|
|
50
50
|
expect(MockedCodeAssistServer).toHaveBeenCalledWith(mockAuthClient, 'test-project', httpOptions, undefined, // No session ID
|
|
51
51
|
'free-tier');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-credential-storage.test.js","sourceRoot":"","sources":["../../../src/code_assist/oauth-credential-storage.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoB,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,6BAA6B;AAC7B,MAAM,sBAAsB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;IACvB,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC3B,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC;CACxD,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;QACjB,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;KACZ;CACF,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnB,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACrB,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE;QACV,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"oauth-credential-storage.test.js","sourceRoot":"","sources":["../../../src/code_assist/oauth-credential-storage.test.ts"],"names":[],"mappings":"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"}
|