@animus-labs/cortex 0.2.0
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/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/budget-guard.d.ts +75 -0
- package/dist/budget-guard.d.ts.map +1 -0
- package/dist/budget-guard.js +142 -0
- package/dist/budget-guard.js.map +1 -0
- package/dist/compaction/compaction.d.ts +99 -0
- package/dist/compaction/compaction.d.ts.map +1 -0
- package/dist/compaction/compaction.js +302 -0
- package/dist/compaction/compaction.js.map +1 -0
- package/dist/compaction/failsafe.d.ts +57 -0
- package/dist/compaction/failsafe.d.ts.map +1 -0
- package/dist/compaction/failsafe.js +135 -0
- package/dist/compaction/failsafe.js.map +1 -0
- package/dist/compaction/index.d.ts +381 -0
- package/dist/compaction/index.d.ts.map +1 -0
- package/dist/compaction/index.js +979 -0
- package/dist/compaction/index.js.map +1 -0
- package/dist/compaction/microcompaction.d.ts +219 -0
- package/dist/compaction/microcompaction.d.ts.map +1 -0
- package/dist/compaction/microcompaction.js +536 -0
- package/dist/compaction/microcompaction.js.map +1 -0
- package/dist/compaction/observational/buffering.d.ts +225 -0
- package/dist/compaction/observational/buffering.d.ts.map +1 -0
- package/dist/compaction/observational/buffering.js +354 -0
- package/dist/compaction/observational/buffering.js.map +1 -0
- package/dist/compaction/observational/constants.d.ts +70 -0
- package/dist/compaction/observational/constants.d.ts.map +1 -0
- package/dist/compaction/observational/constants.js +507 -0
- package/dist/compaction/observational/constants.js.map +1 -0
- package/dist/compaction/observational/index.d.ts +219 -0
- package/dist/compaction/observational/index.d.ts.map +1 -0
- package/dist/compaction/observational/index.js +641 -0
- package/dist/compaction/observational/index.js.map +1 -0
- package/dist/compaction/observational/observer.d.ts +97 -0
- package/dist/compaction/observational/observer.d.ts.map +1 -0
- package/dist/compaction/observational/observer.js +424 -0
- package/dist/compaction/observational/observer.js.map +1 -0
- package/dist/compaction/observational/recall-tool.d.ts +27 -0
- package/dist/compaction/observational/recall-tool.d.ts.map +1 -0
- package/dist/compaction/observational/recall-tool.js +93 -0
- package/dist/compaction/observational/recall-tool.js.map +1 -0
- package/dist/compaction/observational/reflector.d.ts +94 -0
- package/dist/compaction/observational/reflector.d.ts.map +1 -0
- package/dist/compaction/observational/reflector.js +167 -0
- package/dist/compaction/observational/reflector.js.map +1 -0
- package/dist/compaction/observational/types.d.ts +271 -0
- package/dist/compaction/observational/types.d.ts.map +1 -0
- package/dist/compaction/observational/types.js +15 -0
- package/dist/compaction/observational/types.js.map +1 -0
- package/dist/context-manager.d.ts +134 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +170 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/cortex-agent.d.ts +1020 -0
- package/dist/cortex-agent.d.ts.map +1 -0
- package/dist/cortex-agent.js +3589 -0
- package/dist/cortex-agent.js.map +1 -0
- package/dist/error-classifier.d.ts +48 -0
- package/dist/error-classifier.d.ts.map +1 -0
- package/dist/error-classifier.js +152 -0
- package/dist/error-classifier.js.map +1 -0
- package/dist/event-bridge.d.ts +166 -0
- package/dist/event-bridge.d.ts.map +1 -0
- package/dist/event-bridge.js +381 -0
- package/dist/event-bridge.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-client.d.ts +119 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +474 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/model-wrapper.d.ts +58 -0
- package/dist/model-wrapper.d.ts.map +1 -0
- package/dist/model-wrapper.js +86 -0
- package/dist/model-wrapper.js.map +1 -0
- package/dist/noop-logger.d.ts +4 -0
- package/dist/noop-logger.d.ts.map +1 -0
- package/dist/noop-logger.js +8 -0
- package/dist/noop-logger.js.map +1 -0
- package/dist/prompt-diagnostics.d.ts +47 -0
- package/dist/prompt-diagnostics.d.ts.map +1 -0
- package/dist/prompt-diagnostics.js +230 -0
- package/dist/prompt-diagnostics.js.map +1 -0
- package/dist/provider-manager.d.ts +224 -0
- package/dist/provider-manager.d.ts.map +1 -0
- package/dist/provider-manager.js +563 -0
- package/dist/provider-manager.js.map +1 -0
- package/dist/provider-registry.d.ts +115 -0
- package/dist/provider-registry.d.ts.map +1 -0
- package/dist/provider-registry.js +305 -0
- package/dist/provider-registry.js.map +1 -0
- package/dist/schema-converter.d.ts +20 -0
- package/dist/schema-converter.d.ts.map +1 -0
- package/dist/schema-converter.js +48 -0
- package/dist/schema-converter.js.map +1 -0
- package/dist/skill-preprocessor.d.ts +46 -0
- package/dist/skill-preprocessor.d.ts.map +1 -0
- package/dist/skill-preprocessor.js +237 -0
- package/dist/skill-preprocessor.js.map +1 -0
- package/dist/skill-registry.d.ts +107 -0
- package/dist/skill-registry.d.ts.map +1 -0
- package/dist/skill-registry.js +330 -0
- package/dist/skill-registry.js.map +1 -0
- package/dist/skill-tool.d.ts +54 -0
- package/dist/skill-tool.d.ts.map +1 -0
- package/dist/skill-tool.js +88 -0
- package/dist/skill-tool.js.map +1 -0
- package/dist/sub-agent-manager.d.ts +90 -0
- package/dist/sub-agent-manager.d.ts.map +1 -0
- package/dist/sub-agent-manager.js +192 -0
- package/dist/sub-agent-manager.js.map +1 -0
- package/dist/token-estimator.d.ts +23 -0
- package/dist/token-estimator.d.ts.map +1 -0
- package/dist/token-estimator.js +27 -0
- package/dist/token-estimator.js.map +1 -0
- package/dist/tool-contract.d.ts +68 -0
- package/dist/tool-contract.d.ts.map +1 -0
- package/dist/tool-contract.js +35 -0
- package/dist/tool-contract.js.map +1 -0
- package/dist/tool-result-persistence.d.ts +89 -0
- package/dist/tool-result-persistence.d.ts.map +1 -0
- package/dist/tool-result-persistence.js +152 -0
- package/dist/tool-result-persistence.js.map +1 -0
- package/dist/tools/bash/index.d.ts +71 -0
- package/dist/tools/bash/index.d.ts.map +1 -0
- package/dist/tools/bash/index.js +485 -0
- package/dist/tools/bash/index.js.map +1 -0
- package/dist/tools/bash/interactive.d.ts +47 -0
- package/dist/tools/bash/interactive.d.ts.map +1 -0
- package/dist/tools/bash/interactive.js +262 -0
- package/dist/tools/bash/interactive.js.map +1 -0
- package/dist/tools/bash/safety.d.ts +149 -0
- package/dist/tools/bash/safety.d.ts.map +1 -0
- package/dist/tools/bash/safety.js +1116 -0
- package/dist/tools/bash/safety.js.map +1 -0
- package/dist/tools/edit.d.ts +57 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +310 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +34 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +268 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +53 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +673 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +62 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/read.d.ts +43 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +459 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/runtime.d.ts +62 -0
- package/dist/tools/runtime.d.ts.map +1 -0
- package/dist/tools/runtime.js +116 -0
- package/dist/tools/runtime.js.map +1 -0
- package/dist/tools/shared/cwd-tracker.d.ts +32 -0
- package/dist/tools/shared/cwd-tracker.d.ts.map +1 -0
- package/dist/tools/shared/cwd-tracker.js +44 -0
- package/dist/tools/shared/cwd-tracker.js.map +1 -0
- package/dist/tools/shared/edit-history.d.ts +55 -0
- package/dist/tools/shared/edit-history.d.ts.map +1 -0
- package/dist/tools/shared/edit-history.js +72 -0
- package/dist/tools/shared/edit-history.js.map +1 -0
- package/dist/tools/shared/edit-matcher.d.ts +83 -0
- package/dist/tools/shared/edit-matcher.d.ts.map +1 -0
- package/dist/tools/shared/edit-matcher.js +359 -0
- package/dist/tools/shared/edit-matcher.js.map +1 -0
- package/dist/tools/shared/file-mutation-lock.d.ts +22 -0
- package/dist/tools/shared/file-mutation-lock.d.ts.map +1 -0
- package/dist/tools/shared/file-mutation-lock.js +35 -0
- package/dist/tools/shared/file-mutation-lock.js.map +1 -0
- package/dist/tools/shared/gitignore.d.ts +17 -0
- package/dist/tools/shared/gitignore.d.ts.map +1 -0
- package/dist/tools/shared/gitignore.js +59 -0
- package/dist/tools/shared/gitignore.js.map +1 -0
- package/dist/tools/shared/pdf-extractor.d.ts +96 -0
- package/dist/tools/shared/pdf-extractor.d.ts.map +1 -0
- package/dist/tools/shared/pdf-extractor.js +196 -0
- package/dist/tools/shared/pdf-extractor.js.map +1 -0
- package/dist/tools/shared/read-registry.d.ts +66 -0
- package/dist/tools/shared/read-registry.d.ts.map +1 -0
- package/dist/tools/shared/read-registry.js +65 -0
- package/dist/tools/shared/read-registry.js.map +1 -0
- package/dist/tools/shared/safe-env.d.ts +18 -0
- package/dist/tools/shared/safe-env.d.ts.map +1 -0
- package/dist/tools/shared/safe-env.js +70 -0
- package/dist/tools/shared/safe-env.js.map +1 -0
- package/dist/tools/sub-agent.d.ts +91 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +89 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/task-output.d.ts +38 -0
- package/dist/tools/task-output.d.ts.map +1 -0
- package/dist/tools/task-output.js +186 -0
- package/dist/tools/task-output.js.map +1 -0
- package/dist/tools/tool-search/index.d.ts +40 -0
- package/dist/tools/tool-search/index.d.ts.map +1 -0
- package/dist/tools/tool-search/index.js +110 -0
- package/dist/tools/tool-search/index.js.map +1 -0
- package/dist/tools/tool-search/registry.d.ts +82 -0
- package/dist/tools/tool-search/registry.d.ts.map +1 -0
- package/dist/tools/tool-search/registry.js +238 -0
- package/dist/tools/tool-search/registry.js.map +1 -0
- package/dist/tools/undo-edit.d.ts +51 -0
- package/dist/tools/undo-edit.d.ts.map +1 -0
- package/dist/tools/undo-edit.js +231 -0
- package/dist/tools/undo-edit.js.map +1 -0
- package/dist/tools/web-fetch/cache.d.ts +49 -0
- package/dist/tools/web-fetch/cache.d.ts.map +1 -0
- package/dist/tools/web-fetch/cache.js +89 -0
- package/dist/tools/web-fetch/cache.js.map +1 -0
- package/dist/tools/web-fetch/index.d.ts +53 -0
- package/dist/tools/web-fetch/index.d.ts.map +1 -0
- package/dist/tools/web-fetch/index.js +513 -0
- package/dist/tools/web-fetch/index.js.map +1 -0
- package/dist/tools/write.d.ts +59 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +316 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +881 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/working-tags.d.ts +44 -0
- package/dist/working-tags.d.ts.map +1 -0
- package/dist/working-tags.js +103 -0
- package/dist/working-tags.js.map +1 -0
- package/package.json +87 -0
- package/src/budget-guard.ts +170 -0
- package/src/compaction/compaction.ts +386 -0
- package/src/compaction/failsafe.ts +185 -0
- package/src/compaction/index.ts +1199 -0
- package/src/compaction/microcompaction.ts +709 -0
- package/src/compaction/observational/buffering.ts +430 -0
- package/src/compaction/observational/constants.ts +532 -0
- package/src/compaction/observational/index.ts +837 -0
- package/src/compaction/observational/observer.ts +510 -0
- package/src/compaction/observational/recall-tool.ts +130 -0
- package/src/compaction/observational/reflector.ts +221 -0
- package/src/compaction/observational/types.ts +343 -0
- package/src/context-manager.ts +237 -0
- package/src/cortex-agent.ts +4297 -0
- package/src/error-classifier.ts +199 -0
- package/src/event-bridge.ts +508 -0
- package/src/index.ts +292 -0
- package/src/mcp-client.ts +582 -0
- package/src/model-wrapper.ts +128 -0
- package/src/noop-logger.ts +9 -0
- package/src/prompt-diagnostics.ts +296 -0
- package/src/provider-manager.ts +823 -0
- package/src/provider-registry.ts +386 -0
- package/src/schema-converter.ts +51 -0
- package/src/skill-preprocessor.ts +314 -0
- package/src/skill-registry.ts +378 -0
- package/src/skill-tool.ts +130 -0
- package/src/sub-agent-manager.ts +236 -0
- package/src/token-estimator.ts +26 -0
- package/src/tool-contract.ts +113 -0
- package/src/tool-result-persistence.ts +197 -0
- package/src/tools/bash/index.ts +633 -0
- package/src/tools/bash/interactive.ts +302 -0
- package/src/tools/bash/safety.ts +1297 -0
- package/src/tools/edit.ts +422 -0
- package/src/tools/glob.ts +330 -0
- package/src/tools/grep.ts +819 -0
- package/src/tools/index.ts +110 -0
- package/src/tools/read.ts +580 -0
- package/src/tools/runtime.ts +173 -0
- package/src/tools/shared/cwd-tracker.ts +50 -0
- package/src/tools/shared/edit-history.ts +96 -0
- package/src/tools/shared/edit-matcher.ts +457 -0
- package/src/tools/shared/file-mutation-lock.ts +40 -0
- package/src/tools/shared/gitignore.ts +61 -0
- package/src/tools/shared/pdf-extractor.ts +290 -0
- package/src/tools/shared/read-registry.ts +93 -0
- package/src/tools/shared/safe-env.ts +82 -0
- package/src/tools/sub-agent.ts +171 -0
- package/src/tools/task-output.ts +236 -0
- package/src/tools/tool-search/index.ts +167 -0
- package/src/tools/tool-search/registry.ts +278 -0
- package/src/tools/undo-edit.ts +314 -0
- package/src/tools/web-fetch/cache.ts +112 -0
- package/src/tools/web-fetch/index.ts +604 -0
- package/src/tools/write.ts +385 -0
- package/src/types.ts +1057 -0
- package/src/working-tags.ts +118 -0
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProviderManager: standalone class wrapping pi-ai for provider discovery,
|
|
3
|
+
* OAuth login/refresh, API key validation, model resolution, and custom
|
|
4
|
+
* endpoint creation.
|
|
5
|
+
*
|
|
6
|
+
* ProviderManager and CortexAgent are fully independent. Neither knows
|
|
7
|
+
* about the other. The consumer creates both, uses ProviderManager for
|
|
8
|
+
* auth/discovery, and provides a getApiKey callback to CortexAgent.
|
|
9
|
+
*
|
|
10
|
+
* Pi-ai is loaded dynamically so consumers never import it directly.
|
|
11
|
+
* If the dependency is missing or unavailable, methods that require it
|
|
12
|
+
* throw clear errors.
|
|
13
|
+
*
|
|
14
|
+
* Reference: provider-manager.md
|
|
15
|
+
*/
|
|
16
|
+
import { PROVIDER_REGISTRY, OAUTH_PROVIDER_IDS, UTILITY_MODEL_DEFAULTS, } from './provider-registry.js';
|
|
17
|
+
import { wrapModel } from './model-wrapper.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Pi-ai dynamic import helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Lazily load the pi-ai main module.
|
|
23
|
+
* Throws a clear error if pi-ai is not installed.
|
|
24
|
+
*/
|
|
25
|
+
async function loadPiAi() {
|
|
26
|
+
try {
|
|
27
|
+
// Dynamic import with string literal to avoid bundler resolution
|
|
28
|
+
const modulePath = '@earendil-works/pi-ai';
|
|
29
|
+
return await import(/* @vite-ignore */ modulePath);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new Error('pi-ai is not installed. Install @earendil-works/pi-ai to use ProviderManager.');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Lazily load the pi-ai OAuth module.
|
|
37
|
+
* Throws a clear error if pi-ai is not installed.
|
|
38
|
+
*/
|
|
39
|
+
async function loadPiAiOAuth() {
|
|
40
|
+
try {
|
|
41
|
+
const modulePath = '@earendil-works/pi-ai/oauth';
|
|
42
|
+
return await import(/* @vite-ignore */ modulePath);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Error('pi-ai is not installed. Install @earendil-works/pi-ai to use OAuth features.');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Display name extraction
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
/**
|
|
52
|
+
* Extract the best available display name from OAuth credentials.
|
|
53
|
+
* Different providers include different identity information.
|
|
54
|
+
*/
|
|
55
|
+
function extractDisplayName(credentials) {
|
|
56
|
+
// Try common fields across providers
|
|
57
|
+
const email = credentials['email'];
|
|
58
|
+
if (typeof email === 'string')
|
|
59
|
+
return email;
|
|
60
|
+
const accountId = credentials['accountId'];
|
|
61
|
+
if (typeof accountId === 'string')
|
|
62
|
+
return accountId;
|
|
63
|
+
const idToken = credentials['idToken'];
|
|
64
|
+
if (typeof idToken === 'string') {
|
|
65
|
+
// JWT id_token may contain email in payload
|
|
66
|
+
try {
|
|
67
|
+
const parts = idToken.split('.');
|
|
68
|
+
if (parts.length >= 2) {
|
|
69
|
+
const payload = JSON.parse(atob(parts[1]));
|
|
70
|
+
const payloadEmail = payload['email'];
|
|
71
|
+
if (typeof payloadEmail === 'string')
|
|
72
|
+
return payloadEmail;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Ignore malformed tokens
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Build OAuthMeta from raw credential data.
|
|
83
|
+
*/
|
|
84
|
+
function buildOAuthMeta(provider, rawCredentials) {
|
|
85
|
+
const displayName = extractDisplayName(rawCredentials);
|
|
86
|
+
const expiresAtRaw = rawCredentials['expiresAt'] ?? rawCredentials['expires'];
|
|
87
|
+
const expiresAt = typeof expiresAtRaw === 'number' ? expiresAtRaw : undefined;
|
|
88
|
+
const meta = {
|
|
89
|
+
provider,
|
|
90
|
+
refreshable: !!(rawCredentials['refreshToken'] ?? rawCredentials['refresh']),
|
|
91
|
+
};
|
|
92
|
+
if (displayName !== undefined) {
|
|
93
|
+
meta.displayName = displayName;
|
|
94
|
+
}
|
|
95
|
+
if (expiresAt !== undefined) {
|
|
96
|
+
meta.expiresAt = expiresAt;
|
|
97
|
+
}
|
|
98
|
+
return meta;
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Legacy model filtering
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
/**
|
|
104
|
+
* Model ID prefixes considered legacy/deprecated per provider.
|
|
105
|
+
* Pi-ai doesn't flag deprecation, so we maintain this list to keep
|
|
106
|
+
* the model picker clean and prevent users from selecting models that
|
|
107
|
+
* produce poor results with modern tool-use patterns.
|
|
108
|
+
*/
|
|
109
|
+
const LEGACY_MODEL_PREFIXES = {
|
|
110
|
+
anthropic: [
|
|
111
|
+
'claude-3-', // Claude 3.x family (Haiku/Sonnet/Opus from 2024)
|
|
112
|
+
'claude-3.', // Alternate naming
|
|
113
|
+
],
|
|
114
|
+
openai: [
|
|
115
|
+
'gpt-3.5-', // GPT-3.5 family
|
|
116
|
+
'gpt-4-', // GPT-4 original (not 4o/4.1)
|
|
117
|
+
],
|
|
118
|
+
google: [
|
|
119
|
+
'gemini-1.', // Gemini 1.x family
|
|
120
|
+
'gemini-pro', // Original Gemini Pro
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Model mapping helper
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
const CORTEX_THINKING_LEVELS = [
|
|
127
|
+
'off',
|
|
128
|
+
'minimal',
|
|
129
|
+
'low',
|
|
130
|
+
'medium',
|
|
131
|
+
'high',
|
|
132
|
+
'max',
|
|
133
|
+
];
|
|
134
|
+
function mapPiThinkingLevel(level) {
|
|
135
|
+
const mapped = level === 'xhigh' ? 'max' : level;
|
|
136
|
+
return CORTEX_THINKING_LEVELS.includes(mapped)
|
|
137
|
+
? mapped
|
|
138
|
+
: null;
|
|
139
|
+
}
|
|
140
|
+
function mapPiThinkingLevels(levels) {
|
|
141
|
+
const mapped = [];
|
|
142
|
+
for (const level of levels) {
|
|
143
|
+
const cortexLevel = mapPiThinkingLevel(level);
|
|
144
|
+
if (cortexLevel && !mapped.includes(cortexLevel)) {
|
|
145
|
+
mapped.push(cortexLevel);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return mapped;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Map a raw pi-ai model object to our ModelInfo type.
|
|
152
|
+
*/
|
|
153
|
+
function mapRawToModelInfo(raw, getSupportedThinkingLevels) {
|
|
154
|
+
// pi-ai models have 'id' (API identifier like "claude-sonnet-4-6") and
|
|
155
|
+
// 'name' (display name like "Claude Sonnet 4.6"). Use 'id' as our id.
|
|
156
|
+
const rawId = raw['id'];
|
|
157
|
+
const id = typeof rawId === 'string' ? rawId : String(rawId ?? raw['name'] ?? 'unknown');
|
|
158
|
+
const rawDisplayName = raw['displayName'];
|
|
159
|
+
const rawName = raw['name'];
|
|
160
|
+
const name = typeof rawDisplayName === 'string'
|
|
161
|
+
? rawDisplayName
|
|
162
|
+
: typeof rawName === 'string'
|
|
163
|
+
? rawName
|
|
164
|
+
: id;
|
|
165
|
+
const rawContextWindow = raw['contextWindow'];
|
|
166
|
+
const contextWindow = typeof rawContextWindow === 'number' ? rawContextWindow : 200_000;
|
|
167
|
+
let supportedThinkingLevels = [];
|
|
168
|
+
if (getSupportedThinkingLevels) {
|
|
169
|
+
try {
|
|
170
|
+
supportedThinkingLevels = mapPiThinkingLevels(getSupportedThinkingLevels(raw));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
supportedThinkingLevels = [];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (supportedThinkingLevels.length === 0 && raw['reasoning'] === true) {
|
|
177
|
+
supportedThinkingLevels = ['minimal', 'low', 'medium', 'high'];
|
|
178
|
+
}
|
|
179
|
+
const info = {
|
|
180
|
+
id,
|
|
181
|
+
name,
|
|
182
|
+
contextWindow,
|
|
183
|
+
supportsThinking: supportedThinkingLevels.some(level => level !== 'off')
|
|
184
|
+
|| !!(raw['supportsThinking'] || raw['reasoning']),
|
|
185
|
+
supportedThinkingLevels,
|
|
186
|
+
supportsImages: !!raw['supportsImages'],
|
|
187
|
+
};
|
|
188
|
+
const rawPricing = raw['pricing'];
|
|
189
|
+
if (rawPricing && typeof rawPricing === 'object') {
|
|
190
|
+
const pricing = rawPricing;
|
|
191
|
+
const inputPrice = pricing['input'];
|
|
192
|
+
const outputPrice = pricing['output'];
|
|
193
|
+
info.pricing = {
|
|
194
|
+
input: typeof inputPrice === 'number' ? inputPrice : 0,
|
|
195
|
+
output: typeof outputPrice === 'number' ? outputPrice : 0,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return info;
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// ProviderManager implementation
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
export class ProviderManager {
|
|
204
|
+
/** Active OAuth AbortController, if any. */
|
|
205
|
+
activeOAuthAbort = null;
|
|
206
|
+
// -----------------------------------------------------------------------
|
|
207
|
+
// Discovery
|
|
208
|
+
// -----------------------------------------------------------------------
|
|
209
|
+
/**
|
|
210
|
+
* List all known providers with their metadata.
|
|
211
|
+
*/
|
|
212
|
+
listProviders() {
|
|
213
|
+
return PROVIDER_REGISTRY;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* List provider IDs that support OAuth authentication.
|
|
217
|
+
*/
|
|
218
|
+
listOAuthProviders() {
|
|
219
|
+
return OAUTH_PROVIDER_IDS;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* List models available from a provider.
|
|
223
|
+
* Delegates to pi-ai's getModels().
|
|
224
|
+
*
|
|
225
|
+
* @param provider - Provider identifier
|
|
226
|
+
* @returns Array of ModelInfo
|
|
227
|
+
* @throws Error if pi-ai is not installed
|
|
228
|
+
*/
|
|
229
|
+
async listModels(provider) {
|
|
230
|
+
const piAi = await loadPiAi();
|
|
231
|
+
const rawModels = piAi.getModels(provider);
|
|
232
|
+
const models = rawModels.map(raw => mapRawToModelInfo(raw, piAi.getSupportedThinkingLevels));
|
|
233
|
+
// Filter pipeline:
|
|
234
|
+
// 1. Remove legacy/deprecated generation models
|
|
235
|
+
// 2. Remove "-latest" alias duplicates
|
|
236
|
+
// 3. Remove duplicate display names
|
|
237
|
+
const legacyPrefixes = LEGACY_MODEL_PREFIXES[provider];
|
|
238
|
+
const filtered = legacyPrefixes
|
|
239
|
+
? models.filter(m => !legacyPrefixes.some(prefix => m.id.startsWith(prefix)))
|
|
240
|
+
: models;
|
|
241
|
+
const seen = new Set();
|
|
242
|
+
return filtered.filter(m => {
|
|
243
|
+
// Strip "-latest" suffix to check for duplicate base names
|
|
244
|
+
const baseName = m.id.replace(/-latest$/, '');
|
|
245
|
+
if (m.id.endsWith('-latest')) {
|
|
246
|
+
// Only include the "-latest" alias if no pinned version exists
|
|
247
|
+
return !filtered.some(other => other.id === baseName);
|
|
248
|
+
}
|
|
249
|
+
// Skip duplicates with identical names (different IDs but same display name)
|
|
250
|
+
if (seen.has(m.name))
|
|
251
|
+
return false;
|
|
252
|
+
seen.add(m.name);
|
|
253
|
+
return true;
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// -----------------------------------------------------------------------
|
|
257
|
+
// OAuth
|
|
258
|
+
// -----------------------------------------------------------------------
|
|
259
|
+
/**
|
|
260
|
+
* Initiate an OAuth login flow for a provider.
|
|
261
|
+
*
|
|
262
|
+
* @param provider - OAuth provider identifier
|
|
263
|
+
* @param callbacks - UI callbacks for auth URL, prompts, and progress
|
|
264
|
+
* @returns The OAuth credentials and display metadata
|
|
265
|
+
* @throws Error if the provider does not support OAuth or pi-ai is not installed
|
|
266
|
+
*/
|
|
267
|
+
async initiateOAuth(provider, callbacks) {
|
|
268
|
+
const oauthModule = await loadPiAiOAuth();
|
|
269
|
+
const oauthProvider = oauthModule.getOAuthProvider?.(provider);
|
|
270
|
+
if (!oauthProvider) {
|
|
271
|
+
throw new Error(`Provider "${provider}" does not support OAuth`);
|
|
272
|
+
}
|
|
273
|
+
this.activeOAuthAbort = new AbortController();
|
|
274
|
+
try {
|
|
275
|
+
const rawCredentials = await oauthProvider.login({
|
|
276
|
+
onAuth: callbacks.onAuth,
|
|
277
|
+
onPrompt: callbacks.onPrompt,
|
|
278
|
+
onProgress: callbacks.onProgress,
|
|
279
|
+
onManualCodeInput: callbacks.onManualCodeInput,
|
|
280
|
+
onSelect: callbacks.onSelect,
|
|
281
|
+
signal: this.activeOAuthAbort.signal,
|
|
282
|
+
});
|
|
283
|
+
this.activeOAuthAbort = null;
|
|
284
|
+
const credentials = JSON.stringify(rawCredentials);
|
|
285
|
+
const meta = buildOAuthMeta(provider, rawCredentials);
|
|
286
|
+
return { credentials, meta };
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
this.activeOAuthAbort = null;
|
|
290
|
+
throw err;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Cancel any in-progress OAuth flow.
|
|
295
|
+
*/
|
|
296
|
+
cancelOAuth() {
|
|
297
|
+
if (this.activeOAuthAbort) {
|
|
298
|
+
this.activeOAuthAbort.abort();
|
|
299
|
+
this.activeOAuthAbort = null;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Resolve an API key from stored OAuth credentials, refreshing if needed.
|
|
304
|
+
*
|
|
305
|
+
* @param provider - The OAuth provider
|
|
306
|
+
* @param credentials - Serialized credential blob from initiateOAuth()
|
|
307
|
+
* @returns The API key and potentially updated credentials
|
|
308
|
+
* @throws Error if pi-ai is not installed or resolution fails
|
|
309
|
+
*/
|
|
310
|
+
async resolveOAuthApiKey(provider, credentials) {
|
|
311
|
+
const oauthModule = await loadPiAiOAuth();
|
|
312
|
+
const getOAuthApiKeyFn = oauthModule.getOAuthApiKey;
|
|
313
|
+
if (typeof getOAuthApiKeyFn !== 'function') {
|
|
314
|
+
throw new Error('getOAuthApiKey not found in pi-ai/oauth');
|
|
315
|
+
}
|
|
316
|
+
const rawCredentials = JSON.parse(credentials);
|
|
317
|
+
// Security: spread rawCredentials first so Cortex-owned 'type' cannot be overridden
|
|
318
|
+
const credMap = { [provider]: { ...rawCredentials, type: 'oauth' } };
|
|
319
|
+
const result = await getOAuthApiKeyFn(provider, credMap);
|
|
320
|
+
if (!result) {
|
|
321
|
+
throw new Error(`OAuth resolution failed for provider "${provider}"`);
|
|
322
|
+
}
|
|
323
|
+
const originalSerialized = credentials;
|
|
324
|
+
const newSerialized = JSON.stringify(result.newCredentials);
|
|
325
|
+
const changed = newSerialized !== originalSerialized;
|
|
326
|
+
const meta = buildOAuthMeta(provider, result.newCredentials);
|
|
327
|
+
return {
|
|
328
|
+
apiKey: result.apiKey,
|
|
329
|
+
credentials: changed ? newSerialized : credentials,
|
|
330
|
+
meta,
|
|
331
|
+
changed,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// -----------------------------------------------------------------------
|
|
335
|
+
// API Key
|
|
336
|
+
// -----------------------------------------------------------------------
|
|
337
|
+
/**
|
|
338
|
+
* Validate an API key by making a minimal LLM call (maxTokens: 1).
|
|
339
|
+
*
|
|
340
|
+
* @param provider - The provider to validate against
|
|
341
|
+
* @param apiKey - The API key to validate
|
|
342
|
+
* @returns True if the key is valid, false otherwise
|
|
343
|
+
* @throws Error if pi-ai is not installed
|
|
344
|
+
*/
|
|
345
|
+
async validateApiKey(provider, apiKey) {
|
|
346
|
+
const piAi = await loadPiAi();
|
|
347
|
+
// Find the cheapest model for this provider to minimize validation cost
|
|
348
|
+
const cheapestModelId = this.getSmallestModelId(provider);
|
|
349
|
+
if (!cheapestModelId) {
|
|
350
|
+
// No known model, try a generic test with the provider's first model
|
|
351
|
+
const models = piAi.getModels(provider);
|
|
352
|
+
if (models.length === 0) {
|
|
353
|
+
return {
|
|
354
|
+
provider,
|
|
355
|
+
modelId: null,
|
|
356
|
+
valid: false,
|
|
357
|
+
retryable: false,
|
|
358
|
+
status: 'resolution_error',
|
|
359
|
+
message: `No models found for provider "${provider}"`,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
const firstRawId = models[0]['id'];
|
|
363
|
+
const firstRawName = models[0]['name'];
|
|
364
|
+
const firstModelId = typeof firstRawId === 'string'
|
|
365
|
+
? firstRawId
|
|
366
|
+
: typeof firstRawName === 'string'
|
|
367
|
+
? firstRawName
|
|
368
|
+
: String(firstRawId ?? firstRawName);
|
|
369
|
+
return this.tryValidation(piAi, provider, firstModelId, apiKey);
|
|
370
|
+
}
|
|
371
|
+
return this.tryValidation(piAi, provider, cheapestModelId, apiKey);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Check whether a provider's API key is available in environment variables.
|
|
375
|
+
*
|
|
376
|
+
* @param provider - The provider to check
|
|
377
|
+
* @returns The API key if found, null otherwise
|
|
378
|
+
*/
|
|
379
|
+
checkEnvApiKey(provider) {
|
|
380
|
+
const entry = PROVIDER_REGISTRY.find(p => p.id === provider);
|
|
381
|
+
if (entry?.envVar) {
|
|
382
|
+
const value = process.env[entry.envVar];
|
|
383
|
+
if (value && value.length > 0)
|
|
384
|
+
return value;
|
|
385
|
+
}
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
// -----------------------------------------------------------------------
|
|
389
|
+
// Model Resolution
|
|
390
|
+
// -----------------------------------------------------------------------
|
|
391
|
+
/**
|
|
392
|
+
* Resolve a provider + model ID into a CortexModel.
|
|
393
|
+
*
|
|
394
|
+
* @param provider - The provider identifier
|
|
395
|
+
* @param modelId - The model identifier
|
|
396
|
+
* @returns A CortexModel handle
|
|
397
|
+
* @throws Error if pi-ai is not installed or the model is not found
|
|
398
|
+
*/
|
|
399
|
+
async resolveModel(provider, modelId) {
|
|
400
|
+
const piAi = await loadPiAi();
|
|
401
|
+
const piModel = piAi.getModel(provider, modelId);
|
|
402
|
+
let contextWindow;
|
|
403
|
+
if (piModel && typeof piModel === 'object') {
|
|
404
|
+
const raw = piModel;
|
|
405
|
+
const cw = raw['contextWindow'];
|
|
406
|
+
if (typeof cw === 'number') {
|
|
407
|
+
contextWindow = cw;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return wrapModel(piModel, provider, modelId, contextWindow);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Create a custom model for an OpenAI-compatible endpoint.
|
|
414
|
+
*
|
|
415
|
+
* @param config - Custom model configuration
|
|
416
|
+
* @returns A CortexModel handle
|
|
417
|
+
* @throws Error if pi-ai is not installed
|
|
418
|
+
*/
|
|
419
|
+
async createCustomModel(config) {
|
|
420
|
+
const piAi = await loadPiAi();
|
|
421
|
+
// Clone an OpenAI model as a base for streaming/format compatibility,
|
|
422
|
+
// then override to use the Chat Completions API. The base model
|
|
423
|
+
// (openai/gpt-4.1) uses the newer Responses API which most
|
|
424
|
+
// OpenAI-compatible endpoints (Ollama, vLLM, etc.) do not support.
|
|
425
|
+
const baseModel = piAi.getModel('openai', 'gpt-4.1');
|
|
426
|
+
const piModel = {
|
|
427
|
+
...baseModel,
|
|
428
|
+
id: config.modelId,
|
|
429
|
+
name: config.modelId,
|
|
430
|
+
api: 'openai-completions',
|
|
431
|
+
baseUrl: config.baseUrl,
|
|
432
|
+
provider: 'custom',
|
|
433
|
+
contextWindow: config.contextWindow ?? 128_000,
|
|
434
|
+
// Conservative compat for OpenAI-compatible endpoints: disable
|
|
435
|
+
// features that are OpenAI-specific or may not be supported.
|
|
436
|
+
// Consumer-provided compat overrides are merged on top.
|
|
437
|
+
compat: {
|
|
438
|
+
supportsStore: false,
|
|
439
|
+
supportsDeveloperRole: false,
|
|
440
|
+
supportsStrictMode: false,
|
|
441
|
+
maxTokensField: 'max_tokens',
|
|
442
|
+
...config.compat,
|
|
443
|
+
},
|
|
444
|
+
};
|
|
445
|
+
// Set API key, using a placeholder for keyless endpoints (e.g., Ollama).
|
|
446
|
+
// The OpenAI SDK client requires a non-empty apiKey value.
|
|
447
|
+
piModel['apiKey'] = config.apiKey ?? 'sk-no-key-required';
|
|
448
|
+
return wrapModel(piModel, 'custom', config.modelId, config.contextWindow ?? 128_000);
|
|
449
|
+
}
|
|
450
|
+
// -----------------------------------------------------------------------
|
|
451
|
+
// Private helpers
|
|
452
|
+
// -----------------------------------------------------------------------
|
|
453
|
+
/**
|
|
454
|
+
* Get the cheapest known model ID for a provider.
|
|
455
|
+
* Uses the UTILITY_MODEL_DEFAULTS as a proxy for "smallest model."
|
|
456
|
+
*/
|
|
457
|
+
getSmallestModelId(provider) {
|
|
458
|
+
return UTILITY_MODEL_DEFAULTS[provider] ?? null;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Attempt to validate an API key by making a minimal LLM call.
|
|
462
|
+
*/
|
|
463
|
+
async tryValidation(piAi, provider, modelId, apiKey) {
|
|
464
|
+
try {
|
|
465
|
+
const model = piAi.getModel(provider, modelId);
|
|
466
|
+
// Try completeSimple first, then complete
|
|
467
|
+
const completeFn = piAi.completeSimple ?? piAi.complete;
|
|
468
|
+
if (typeof completeFn !== 'function') {
|
|
469
|
+
// Cannot validate without a complete function; assume valid
|
|
470
|
+
// (the consumer will discover failures at first real call)
|
|
471
|
+
return {
|
|
472
|
+
provider,
|
|
473
|
+
modelId,
|
|
474
|
+
valid: true,
|
|
475
|
+
retryable: false,
|
|
476
|
+
status: 'valid',
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
const result = await completeFn(model, { messages: [{ role: 'user', content: 'hi' }] }, { apiKey, maxTokens: 1 });
|
|
480
|
+
const silentError = this.extractSilentValidationError(result);
|
|
481
|
+
if (silentError) {
|
|
482
|
+
throw new Error(silentError);
|
|
483
|
+
}
|
|
484
|
+
return {
|
|
485
|
+
provider,
|
|
486
|
+
modelId,
|
|
487
|
+
valid: true,
|
|
488
|
+
retryable: false,
|
|
489
|
+
status: 'valid',
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
catch (err) {
|
|
493
|
+
return this.classifyValidationError(provider, modelId, err);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
classifyValidationError(provider, modelId, err) {
|
|
497
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
498
|
+
const normalized = message.toLowerCase();
|
|
499
|
+
if (/\b401\b/.test(normalized) ||
|
|
500
|
+
/\b403\b/.test(normalized) ||
|
|
501
|
+
normalized.includes('invalid api key') ||
|
|
502
|
+
normalized.includes('incorrect api key') ||
|
|
503
|
+
normalized.includes('authentication failed') ||
|
|
504
|
+
normalized.includes('invalid_auth') ||
|
|
505
|
+
normalized.includes('unauthorized') ||
|
|
506
|
+
normalized.includes('forbidden') ||
|
|
507
|
+
normalized.includes('invalid credential')) {
|
|
508
|
+
return {
|
|
509
|
+
provider,
|
|
510
|
+
modelId,
|
|
511
|
+
valid: false,
|
|
512
|
+
retryable: false,
|
|
513
|
+
status: 'invalid_credentials',
|
|
514
|
+
message,
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
if (/\b429\b/.test(normalized) ||
|
|
518
|
+
/\b500\b/.test(normalized) ||
|
|
519
|
+
/\b502\b/.test(normalized) ||
|
|
520
|
+
/\b503\b/.test(normalized) ||
|
|
521
|
+
/\b504\b/.test(normalized) ||
|
|
522
|
+
normalized.includes('rate limit') ||
|
|
523
|
+
normalized.includes('timeout') ||
|
|
524
|
+
normalized.includes('timed out') ||
|
|
525
|
+
normalized.includes('temporar') ||
|
|
526
|
+
normalized.includes('overloaded') ||
|
|
527
|
+
normalized.includes('unavailable') ||
|
|
528
|
+
normalized.includes('server error') ||
|
|
529
|
+
normalized.includes('network') ||
|
|
530
|
+
normalized.includes('econn') ||
|
|
531
|
+
normalized.includes('enotfound') ||
|
|
532
|
+
normalized.includes('eai_again')) {
|
|
533
|
+
return {
|
|
534
|
+
provider,
|
|
535
|
+
modelId,
|
|
536
|
+
valid: false,
|
|
537
|
+
retryable: true,
|
|
538
|
+
status: 'transient_error',
|
|
539
|
+
message,
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
return {
|
|
543
|
+
provider,
|
|
544
|
+
modelId,
|
|
545
|
+
valid: false,
|
|
546
|
+
retryable: false,
|
|
547
|
+
status: 'resolution_error',
|
|
548
|
+
message,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
extractSilentValidationError(result) {
|
|
552
|
+
if (!result || typeof result !== 'object')
|
|
553
|
+
return null;
|
|
554
|
+
const msg = result;
|
|
555
|
+
if (msg['stopReason'] !== 'error')
|
|
556
|
+
return null;
|
|
557
|
+
const errorMessage = msg['errorMessage'];
|
|
558
|
+
return typeof errorMessage === 'string'
|
|
559
|
+
? errorMessage
|
|
560
|
+
: 'Provider validation failed';
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=provider-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-manager.js","sourceRoot":"","sources":["../src/provider-manager.ts"],"names":[],"mappings":"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"}
|