@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.
Files changed (293) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +73 -0
  3. package/dist/budget-guard.d.ts +75 -0
  4. package/dist/budget-guard.d.ts.map +1 -0
  5. package/dist/budget-guard.js +142 -0
  6. package/dist/budget-guard.js.map +1 -0
  7. package/dist/compaction/compaction.d.ts +99 -0
  8. package/dist/compaction/compaction.d.ts.map +1 -0
  9. package/dist/compaction/compaction.js +302 -0
  10. package/dist/compaction/compaction.js.map +1 -0
  11. package/dist/compaction/failsafe.d.ts +57 -0
  12. package/dist/compaction/failsafe.d.ts.map +1 -0
  13. package/dist/compaction/failsafe.js +135 -0
  14. package/dist/compaction/failsafe.js.map +1 -0
  15. package/dist/compaction/index.d.ts +381 -0
  16. package/dist/compaction/index.d.ts.map +1 -0
  17. package/dist/compaction/index.js +979 -0
  18. package/dist/compaction/index.js.map +1 -0
  19. package/dist/compaction/microcompaction.d.ts +219 -0
  20. package/dist/compaction/microcompaction.d.ts.map +1 -0
  21. package/dist/compaction/microcompaction.js +536 -0
  22. package/dist/compaction/microcompaction.js.map +1 -0
  23. package/dist/compaction/observational/buffering.d.ts +225 -0
  24. package/dist/compaction/observational/buffering.d.ts.map +1 -0
  25. package/dist/compaction/observational/buffering.js +354 -0
  26. package/dist/compaction/observational/buffering.js.map +1 -0
  27. package/dist/compaction/observational/constants.d.ts +70 -0
  28. package/dist/compaction/observational/constants.d.ts.map +1 -0
  29. package/dist/compaction/observational/constants.js +507 -0
  30. package/dist/compaction/observational/constants.js.map +1 -0
  31. package/dist/compaction/observational/index.d.ts +219 -0
  32. package/dist/compaction/observational/index.d.ts.map +1 -0
  33. package/dist/compaction/observational/index.js +641 -0
  34. package/dist/compaction/observational/index.js.map +1 -0
  35. package/dist/compaction/observational/observer.d.ts +97 -0
  36. package/dist/compaction/observational/observer.d.ts.map +1 -0
  37. package/dist/compaction/observational/observer.js +424 -0
  38. package/dist/compaction/observational/observer.js.map +1 -0
  39. package/dist/compaction/observational/recall-tool.d.ts +27 -0
  40. package/dist/compaction/observational/recall-tool.d.ts.map +1 -0
  41. package/dist/compaction/observational/recall-tool.js +93 -0
  42. package/dist/compaction/observational/recall-tool.js.map +1 -0
  43. package/dist/compaction/observational/reflector.d.ts +94 -0
  44. package/dist/compaction/observational/reflector.d.ts.map +1 -0
  45. package/dist/compaction/observational/reflector.js +167 -0
  46. package/dist/compaction/observational/reflector.js.map +1 -0
  47. package/dist/compaction/observational/types.d.ts +271 -0
  48. package/dist/compaction/observational/types.d.ts.map +1 -0
  49. package/dist/compaction/observational/types.js +15 -0
  50. package/dist/compaction/observational/types.js.map +1 -0
  51. package/dist/context-manager.d.ts +134 -0
  52. package/dist/context-manager.d.ts.map +1 -0
  53. package/dist/context-manager.js +170 -0
  54. package/dist/context-manager.js.map +1 -0
  55. package/dist/cortex-agent.d.ts +1020 -0
  56. package/dist/cortex-agent.d.ts.map +1 -0
  57. package/dist/cortex-agent.js +3589 -0
  58. package/dist/cortex-agent.js.map +1 -0
  59. package/dist/error-classifier.d.ts +48 -0
  60. package/dist/error-classifier.d.ts.map +1 -0
  61. package/dist/error-classifier.js +152 -0
  62. package/dist/error-classifier.js.map +1 -0
  63. package/dist/event-bridge.d.ts +166 -0
  64. package/dist/event-bridge.d.ts.map +1 -0
  65. package/dist/event-bridge.js +381 -0
  66. package/dist/event-bridge.js.map +1 -0
  67. package/dist/index.d.ts +55 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +57 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/mcp-client.d.ts +119 -0
  72. package/dist/mcp-client.d.ts.map +1 -0
  73. package/dist/mcp-client.js +474 -0
  74. package/dist/mcp-client.js.map +1 -0
  75. package/dist/model-wrapper.d.ts +58 -0
  76. package/dist/model-wrapper.d.ts.map +1 -0
  77. package/dist/model-wrapper.js +86 -0
  78. package/dist/model-wrapper.js.map +1 -0
  79. package/dist/noop-logger.d.ts +4 -0
  80. package/dist/noop-logger.d.ts.map +1 -0
  81. package/dist/noop-logger.js +8 -0
  82. package/dist/noop-logger.js.map +1 -0
  83. package/dist/prompt-diagnostics.d.ts +47 -0
  84. package/dist/prompt-diagnostics.d.ts.map +1 -0
  85. package/dist/prompt-diagnostics.js +230 -0
  86. package/dist/prompt-diagnostics.js.map +1 -0
  87. package/dist/provider-manager.d.ts +224 -0
  88. package/dist/provider-manager.d.ts.map +1 -0
  89. package/dist/provider-manager.js +563 -0
  90. package/dist/provider-manager.js.map +1 -0
  91. package/dist/provider-registry.d.ts +115 -0
  92. package/dist/provider-registry.d.ts.map +1 -0
  93. package/dist/provider-registry.js +305 -0
  94. package/dist/provider-registry.js.map +1 -0
  95. package/dist/schema-converter.d.ts +20 -0
  96. package/dist/schema-converter.d.ts.map +1 -0
  97. package/dist/schema-converter.js +48 -0
  98. package/dist/schema-converter.js.map +1 -0
  99. package/dist/skill-preprocessor.d.ts +46 -0
  100. package/dist/skill-preprocessor.d.ts.map +1 -0
  101. package/dist/skill-preprocessor.js +237 -0
  102. package/dist/skill-preprocessor.js.map +1 -0
  103. package/dist/skill-registry.d.ts +107 -0
  104. package/dist/skill-registry.d.ts.map +1 -0
  105. package/dist/skill-registry.js +330 -0
  106. package/dist/skill-registry.js.map +1 -0
  107. package/dist/skill-tool.d.ts +54 -0
  108. package/dist/skill-tool.d.ts.map +1 -0
  109. package/dist/skill-tool.js +88 -0
  110. package/dist/skill-tool.js.map +1 -0
  111. package/dist/sub-agent-manager.d.ts +90 -0
  112. package/dist/sub-agent-manager.d.ts.map +1 -0
  113. package/dist/sub-agent-manager.js +192 -0
  114. package/dist/sub-agent-manager.js.map +1 -0
  115. package/dist/token-estimator.d.ts +23 -0
  116. package/dist/token-estimator.d.ts.map +1 -0
  117. package/dist/token-estimator.js +27 -0
  118. package/dist/token-estimator.js.map +1 -0
  119. package/dist/tool-contract.d.ts +68 -0
  120. package/dist/tool-contract.d.ts.map +1 -0
  121. package/dist/tool-contract.js +35 -0
  122. package/dist/tool-contract.js.map +1 -0
  123. package/dist/tool-result-persistence.d.ts +89 -0
  124. package/dist/tool-result-persistence.d.ts.map +1 -0
  125. package/dist/tool-result-persistence.js +152 -0
  126. package/dist/tool-result-persistence.js.map +1 -0
  127. package/dist/tools/bash/index.d.ts +71 -0
  128. package/dist/tools/bash/index.d.ts.map +1 -0
  129. package/dist/tools/bash/index.js +485 -0
  130. package/dist/tools/bash/index.js.map +1 -0
  131. package/dist/tools/bash/interactive.d.ts +47 -0
  132. package/dist/tools/bash/interactive.d.ts.map +1 -0
  133. package/dist/tools/bash/interactive.js +262 -0
  134. package/dist/tools/bash/interactive.js.map +1 -0
  135. package/dist/tools/bash/safety.d.ts +149 -0
  136. package/dist/tools/bash/safety.d.ts.map +1 -0
  137. package/dist/tools/bash/safety.js +1116 -0
  138. package/dist/tools/bash/safety.js.map +1 -0
  139. package/dist/tools/edit.d.ts +57 -0
  140. package/dist/tools/edit.d.ts.map +1 -0
  141. package/dist/tools/edit.js +310 -0
  142. package/dist/tools/edit.js.map +1 -0
  143. package/dist/tools/glob.d.ts +34 -0
  144. package/dist/tools/glob.d.ts.map +1 -0
  145. package/dist/tools/glob.js +268 -0
  146. package/dist/tools/glob.js.map +1 -0
  147. package/dist/tools/grep.d.ts +53 -0
  148. package/dist/tools/grep.d.ts.map +1 -0
  149. package/dist/tools/grep.js +673 -0
  150. package/dist/tools/grep.js.map +1 -0
  151. package/dist/tools/index.d.ts +62 -0
  152. package/dist/tools/index.d.ts.map +1 -0
  153. package/dist/tools/index.js +52 -0
  154. package/dist/tools/index.js.map +1 -0
  155. package/dist/tools/read.d.ts +43 -0
  156. package/dist/tools/read.d.ts.map +1 -0
  157. package/dist/tools/read.js +459 -0
  158. package/dist/tools/read.js.map +1 -0
  159. package/dist/tools/runtime.d.ts +62 -0
  160. package/dist/tools/runtime.d.ts.map +1 -0
  161. package/dist/tools/runtime.js +116 -0
  162. package/dist/tools/runtime.js.map +1 -0
  163. package/dist/tools/shared/cwd-tracker.d.ts +32 -0
  164. package/dist/tools/shared/cwd-tracker.d.ts.map +1 -0
  165. package/dist/tools/shared/cwd-tracker.js +44 -0
  166. package/dist/tools/shared/cwd-tracker.js.map +1 -0
  167. package/dist/tools/shared/edit-history.d.ts +55 -0
  168. package/dist/tools/shared/edit-history.d.ts.map +1 -0
  169. package/dist/tools/shared/edit-history.js +72 -0
  170. package/dist/tools/shared/edit-history.js.map +1 -0
  171. package/dist/tools/shared/edit-matcher.d.ts +83 -0
  172. package/dist/tools/shared/edit-matcher.d.ts.map +1 -0
  173. package/dist/tools/shared/edit-matcher.js +359 -0
  174. package/dist/tools/shared/edit-matcher.js.map +1 -0
  175. package/dist/tools/shared/file-mutation-lock.d.ts +22 -0
  176. package/dist/tools/shared/file-mutation-lock.d.ts.map +1 -0
  177. package/dist/tools/shared/file-mutation-lock.js +35 -0
  178. package/dist/tools/shared/file-mutation-lock.js.map +1 -0
  179. package/dist/tools/shared/gitignore.d.ts +17 -0
  180. package/dist/tools/shared/gitignore.d.ts.map +1 -0
  181. package/dist/tools/shared/gitignore.js +59 -0
  182. package/dist/tools/shared/gitignore.js.map +1 -0
  183. package/dist/tools/shared/pdf-extractor.d.ts +96 -0
  184. package/dist/tools/shared/pdf-extractor.d.ts.map +1 -0
  185. package/dist/tools/shared/pdf-extractor.js +196 -0
  186. package/dist/tools/shared/pdf-extractor.js.map +1 -0
  187. package/dist/tools/shared/read-registry.d.ts +66 -0
  188. package/dist/tools/shared/read-registry.d.ts.map +1 -0
  189. package/dist/tools/shared/read-registry.js +65 -0
  190. package/dist/tools/shared/read-registry.js.map +1 -0
  191. package/dist/tools/shared/safe-env.d.ts +18 -0
  192. package/dist/tools/shared/safe-env.d.ts.map +1 -0
  193. package/dist/tools/shared/safe-env.js +70 -0
  194. package/dist/tools/shared/safe-env.js.map +1 -0
  195. package/dist/tools/sub-agent.d.ts +91 -0
  196. package/dist/tools/sub-agent.d.ts.map +1 -0
  197. package/dist/tools/sub-agent.js +89 -0
  198. package/dist/tools/sub-agent.js.map +1 -0
  199. package/dist/tools/task-output.d.ts +38 -0
  200. package/dist/tools/task-output.d.ts.map +1 -0
  201. package/dist/tools/task-output.js +186 -0
  202. package/dist/tools/task-output.js.map +1 -0
  203. package/dist/tools/tool-search/index.d.ts +40 -0
  204. package/dist/tools/tool-search/index.d.ts.map +1 -0
  205. package/dist/tools/tool-search/index.js +110 -0
  206. package/dist/tools/tool-search/index.js.map +1 -0
  207. package/dist/tools/tool-search/registry.d.ts +82 -0
  208. package/dist/tools/tool-search/registry.d.ts.map +1 -0
  209. package/dist/tools/tool-search/registry.js +238 -0
  210. package/dist/tools/tool-search/registry.js.map +1 -0
  211. package/dist/tools/undo-edit.d.ts +51 -0
  212. package/dist/tools/undo-edit.d.ts.map +1 -0
  213. package/dist/tools/undo-edit.js +231 -0
  214. package/dist/tools/undo-edit.js.map +1 -0
  215. package/dist/tools/web-fetch/cache.d.ts +49 -0
  216. package/dist/tools/web-fetch/cache.d.ts.map +1 -0
  217. package/dist/tools/web-fetch/cache.js +89 -0
  218. package/dist/tools/web-fetch/cache.js.map +1 -0
  219. package/dist/tools/web-fetch/index.d.ts +53 -0
  220. package/dist/tools/web-fetch/index.d.ts.map +1 -0
  221. package/dist/tools/web-fetch/index.js +513 -0
  222. package/dist/tools/web-fetch/index.js.map +1 -0
  223. package/dist/tools/write.d.ts +59 -0
  224. package/dist/tools/write.d.ts.map +1 -0
  225. package/dist/tools/write.js +316 -0
  226. package/dist/tools/write.js.map +1 -0
  227. package/dist/types.d.ts +881 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +16 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/working-tags.d.ts +44 -0
  232. package/dist/working-tags.d.ts.map +1 -0
  233. package/dist/working-tags.js +103 -0
  234. package/dist/working-tags.js.map +1 -0
  235. package/package.json +87 -0
  236. package/src/budget-guard.ts +170 -0
  237. package/src/compaction/compaction.ts +386 -0
  238. package/src/compaction/failsafe.ts +185 -0
  239. package/src/compaction/index.ts +1199 -0
  240. package/src/compaction/microcompaction.ts +709 -0
  241. package/src/compaction/observational/buffering.ts +430 -0
  242. package/src/compaction/observational/constants.ts +532 -0
  243. package/src/compaction/observational/index.ts +837 -0
  244. package/src/compaction/observational/observer.ts +510 -0
  245. package/src/compaction/observational/recall-tool.ts +130 -0
  246. package/src/compaction/observational/reflector.ts +221 -0
  247. package/src/compaction/observational/types.ts +343 -0
  248. package/src/context-manager.ts +237 -0
  249. package/src/cortex-agent.ts +4297 -0
  250. package/src/error-classifier.ts +199 -0
  251. package/src/event-bridge.ts +508 -0
  252. package/src/index.ts +292 -0
  253. package/src/mcp-client.ts +582 -0
  254. package/src/model-wrapper.ts +128 -0
  255. package/src/noop-logger.ts +9 -0
  256. package/src/prompt-diagnostics.ts +296 -0
  257. package/src/provider-manager.ts +823 -0
  258. package/src/provider-registry.ts +386 -0
  259. package/src/schema-converter.ts +51 -0
  260. package/src/skill-preprocessor.ts +314 -0
  261. package/src/skill-registry.ts +378 -0
  262. package/src/skill-tool.ts +130 -0
  263. package/src/sub-agent-manager.ts +236 -0
  264. package/src/token-estimator.ts +26 -0
  265. package/src/tool-contract.ts +113 -0
  266. package/src/tool-result-persistence.ts +197 -0
  267. package/src/tools/bash/index.ts +633 -0
  268. package/src/tools/bash/interactive.ts +302 -0
  269. package/src/tools/bash/safety.ts +1297 -0
  270. package/src/tools/edit.ts +422 -0
  271. package/src/tools/glob.ts +330 -0
  272. package/src/tools/grep.ts +819 -0
  273. package/src/tools/index.ts +110 -0
  274. package/src/tools/read.ts +580 -0
  275. package/src/tools/runtime.ts +173 -0
  276. package/src/tools/shared/cwd-tracker.ts +50 -0
  277. package/src/tools/shared/edit-history.ts +96 -0
  278. package/src/tools/shared/edit-matcher.ts +457 -0
  279. package/src/tools/shared/file-mutation-lock.ts +40 -0
  280. package/src/tools/shared/gitignore.ts +61 -0
  281. package/src/tools/shared/pdf-extractor.ts +290 -0
  282. package/src/tools/shared/read-registry.ts +93 -0
  283. package/src/tools/shared/safe-env.ts +82 -0
  284. package/src/tools/sub-agent.ts +171 -0
  285. package/src/tools/task-output.ts +236 -0
  286. package/src/tools/tool-search/index.ts +167 -0
  287. package/src/tools/tool-search/registry.ts +278 -0
  288. package/src/tools/undo-edit.ts +314 -0
  289. package/src/tools/web-fetch/cache.ts +112 -0
  290. package/src/tools/web-fetch/index.ts +604 -0
  291. package/src/tools/write.ts +385 -0
  292. package/src/types.ts +1057 -0
  293. 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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"}