@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,386 @@
1
+ /**
2
+ * Static provider registry for known LLM providers.
3
+ *
4
+ * This module contains:
5
+ * 1. PROVIDER_REGISTRY: metadata for all known providers (auth methods, env vars, key prefixes)
6
+ * 2. OAUTH_PROVIDER_IDS: the subset of providers that support OAuth
7
+ * 3. UTILITY_MODEL_DEFAULTS: per-provider cheapest-capable model for utility operations
8
+ *
9
+ * OAuth flows are resolved through pi-ai's OAuth provider registry at runtime.
10
+ *
11
+ * Reference: provider-manager.md
12
+ */
13
+
14
+ // ---------------------------------------------------------------------------
15
+ // Types
16
+ // ---------------------------------------------------------------------------
17
+
18
+ /** Authentication method supported by a provider. */
19
+ export type AuthMethod = 'oauth' | 'api_key';
20
+
21
+ /** Static metadata for a known LLM provider. */
22
+ export interface ProviderInfo {
23
+ /** Provider identifier (e.g., 'anthropic', 'openai', 'google'). */
24
+ id: string;
25
+ /** Human-readable name (e.g., 'Anthropic', 'OpenAI'). */
26
+ name: string;
27
+ /** Supported authentication methods. */
28
+ authMethods: AuthMethod[];
29
+ /** Environment variable name for API key (e.g., 'ANTHROPIC_API_KEY'). */
30
+ envVar?: string | undefined;
31
+ /** API key prefix for client-side type inference (e.g., 'sk-ant-'). */
32
+ keyPrefix?: string | undefined;
33
+ /** URL where users obtain API keys. */
34
+ keyUrl?: string | undefined;
35
+ }
36
+
37
+ /** Metadata about a model available from a provider. */
38
+ export interface ModelInfo {
39
+ /** Model identifier (e.g., 'claude-sonnet-4-20250514'). */
40
+ id: string;
41
+ /** Human-readable name (e.g., 'Claude Sonnet 4'). */
42
+ name: string;
43
+ /** Context window size in tokens. */
44
+ contextWindow: number;
45
+ /** Whether the model supports extended thinking. */
46
+ supportsThinking: boolean;
47
+ /** Thinking levels supported by this model, in Cortex's public naming. */
48
+ supportedThinkingLevels: Array<'off' | 'minimal' | 'low' | 'medium' | 'high' | 'max'>;
49
+ /** Whether the model supports image input. */
50
+ supportsImages: boolean;
51
+ /** Pricing per million tokens (if available). */
52
+ pricing?: { input: number; output: number } | undefined;
53
+ }
54
+
55
+ // ---------------------------------------------------------------------------
56
+ // Provider Registry
57
+ // ---------------------------------------------------------------------------
58
+
59
+ /**
60
+ * All known providers with their authentication methods and UX metadata.
61
+ *
62
+ * This registry is maintained manually. When pi-ai adds a new provider,
63
+ * a corresponding entry is added here. Providers not in the registry can
64
+ * still be used via resolveModel() and createCustomModel() with direct
65
+ * API keys; they just won't appear in the discovery UI.
66
+ */
67
+ export const PROVIDER_REGISTRY: ProviderInfo[] = [
68
+ {
69
+ id: 'anthropic',
70
+ name: 'Anthropic',
71
+ authMethods: ['oauth', 'api_key'],
72
+ envVar: 'ANTHROPIC_API_KEY',
73
+ keyPrefix: 'sk-ant-',
74
+ keyUrl: 'console.anthropic.com/settings/keys',
75
+ },
76
+ {
77
+ id: 'openai',
78
+ name: 'OpenAI',
79
+ authMethods: ['api_key'],
80
+ envVar: 'OPENAI_API_KEY',
81
+ keyPrefix: 'sk-proj-',
82
+ keyUrl: 'platform.openai.com/api-keys',
83
+ },
84
+ {
85
+ id: 'azure-openai-responses',
86
+ name: 'Azure OpenAI',
87
+ authMethods: ['api_key'],
88
+ envVar: 'AZURE_OPENAI_API_KEY',
89
+ },
90
+ {
91
+ id: 'openai-codex',
92
+ name: 'OpenAI Codex',
93
+ authMethods: ['oauth'],
94
+ },
95
+ {
96
+ id: 'google',
97
+ name: 'Google',
98
+ authMethods: ['api_key'],
99
+ envVar: 'GEMINI_API_KEY',
100
+ keyUrl: 'aistudio.google.com/apikey',
101
+ },
102
+ {
103
+ id: 'google-vertex',
104
+ name: 'Google Vertex AI',
105
+ authMethods: ['api_key'],
106
+ envVar: 'GOOGLE_CLOUD_API_KEY',
107
+ },
108
+ {
109
+ id: 'github-copilot',
110
+ name: 'GitHub Copilot',
111
+ authMethods: ['oauth'],
112
+ },
113
+ {
114
+ id: 'deepseek',
115
+ name: 'DeepSeek',
116
+ authMethods: ['api_key'],
117
+ envVar: 'DEEPSEEK_API_KEY',
118
+ keyUrl: 'platform.deepseek.com/api_keys',
119
+ },
120
+ {
121
+ id: 'mistral',
122
+ name: 'Mistral',
123
+ authMethods: ['api_key'],
124
+ envVar: 'MISTRAL_API_KEY',
125
+ keyUrl: 'console.mistral.ai/api-keys',
126
+ },
127
+ {
128
+ id: 'groq',
129
+ name: 'Groq',
130
+ authMethods: ['api_key'],
131
+ envVar: 'GROQ_API_KEY',
132
+ keyUrl: 'console.groq.com/keys',
133
+ },
134
+ {
135
+ id: 'cerebras',
136
+ name: 'Cerebras',
137
+ authMethods: ['api_key'],
138
+ envVar: 'CEREBRAS_API_KEY',
139
+ keyUrl: 'cloud.cerebras.ai',
140
+ },
141
+ {
142
+ id: 'xai',
143
+ name: 'xAI',
144
+ authMethods: ['api_key'],
145
+ envVar: 'XAI_API_KEY',
146
+ keyUrl: 'console.x.ai',
147
+ },
148
+ {
149
+ id: 'openrouter',
150
+ name: 'OpenRouter',
151
+ authMethods: ['api_key'],
152
+ envVar: 'OPENROUTER_API_KEY',
153
+ keyUrl: 'openrouter.ai/keys',
154
+ },
155
+ {
156
+ id: 'vercel-ai-gateway',
157
+ name: 'Vercel AI Gateway',
158
+ authMethods: ['api_key'],
159
+ envVar: 'AI_GATEWAY_API_KEY',
160
+ },
161
+ {
162
+ id: 'zai',
163
+ name: 'z.ai',
164
+ authMethods: ['api_key'],
165
+ envVar: 'ZAI_API_KEY',
166
+ },
167
+ {
168
+ id: 'minimax',
169
+ name: 'MiniMax',
170
+ authMethods: ['api_key'],
171
+ envVar: 'MINIMAX_API_KEY',
172
+ },
173
+ {
174
+ id: 'minimax-cn',
175
+ name: 'MiniMax China',
176
+ authMethods: ['api_key'],
177
+ envVar: 'MINIMAX_CN_API_KEY',
178
+ },
179
+ {
180
+ id: 'moonshotai',
181
+ name: 'Moonshot AI',
182
+ authMethods: ['api_key'],
183
+ envVar: 'MOONSHOT_API_KEY',
184
+ },
185
+ {
186
+ id: 'moonshotai-cn',
187
+ name: 'Moonshot AI China',
188
+ authMethods: ['api_key'],
189
+ envVar: 'MOONSHOT_API_KEY',
190
+ },
191
+ {
192
+ id: 'huggingface',
193
+ name: 'Hugging Face',
194
+ authMethods: ['api_key'],
195
+ envVar: 'HF_TOKEN',
196
+ },
197
+ {
198
+ id: 'fireworks',
199
+ name: 'Fireworks AI',
200
+ authMethods: ['api_key'],
201
+ envVar: 'FIREWORKS_API_KEY',
202
+ },
203
+ {
204
+ id: 'opencode',
205
+ name: 'OpenCode',
206
+ authMethods: ['api_key'],
207
+ envVar: 'OPENCODE_API_KEY',
208
+ },
209
+ {
210
+ id: 'opencode-go',
211
+ name: 'OpenCode Go',
212
+ authMethods: ['api_key'],
213
+ envVar: 'OPENCODE_API_KEY',
214
+ },
215
+ {
216
+ id: 'kimi-coding',
217
+ name: 'Kimi Coding',
218
+ authMethods: ['api_key'],
219
+ envVar: 'KIMI_API_KEY',
220
+ },
221
+ {
222
+ id: 'cloudflare-workers-ai',
223
+ name: 'Cloudflare Workers AI',
224
+ authMethods: ['api_key'],
225
+ envVar: 'CLOUDFLARE_API_KEY',
226
+ },
227
+ {
228
+ id: 'cloudflare-ai-gateway',
229
+ name: 'Cloudflare AI Gateway',
230
+ authMethods: ['api_key'],
231
+ envVar: 'CLOUDFLARE_API_KEY',
232
+ },
233
+ {
234
+ id: 'xiaomi',
235
+ name: 'Xiaomi',
236
+ authMethods: ['api_key'],
237
+ envVar: 'XIAOMI_API_KEY',
238
+ },
239
+ {
240
+ id: 'xiaomi-token-plan-cn',
241
+ name: 'Xiaomi Token Plan China',
242
+ authMethods: ['api_key'],
243
+ envVar: 'XIAOMI_TOKEN_PLAN_CN_API_KEY',
244
+ },
245
+ {
246
+ id: 'xiaomi-token-plan-ams',
247
+ name: 'Xiaomi Token Plan Amsterdam',
248
+ authMethods: ['api_key'],
249
+ envVar: 'XIAOMI_TOKEN_PLAN_AMS_API_KEY',
250
+ },
251
+ {
252
+ id: 'xiaomi-token-plan-sgp',
253
+ name: 'Xiaomi Token Plan Singapore',
254
+ authMethods: ['api_key'],
255
+ envVar: 'XIAOMI_TOKEN_PLAN_SGP_API_KEY',
256
+ },
257
+ ];
258
+
259
+ // ---------------------------------------------------------------------------
260
+ // OAuth Providers
261
+ // ---------------------------------------------------------------------------
262
+
263
+ /**
264
+ * Provider IDs that support OAuth login flows.
265
+ */
266
+ export const OAUTH_PROVIDER_IDS: string[] = [
267
+ 'anthropic',
268
+ 'openai-codex',
269
+ 'github-copilot',
270
+ ];
271
+
272
+ // ---------------------------------------------------------------------------
273
+ // Utility Model Defaults
274
+ // ---------------------------------------------------------------------------
275
+
276
+ /**
277
+ * Default utility model IDs per provider.
278
+ * Used when utilityModel is 'default' or undefined.
279
+ *
280
+ * These are the cheapest capable models for each provider,
281
+ * suitable for internal operations like WebFetch summarization
282
+ * and safety classification.
283
+ */
284
+ /**
285
+ * Default primary model IDs per provider.
286
+ * Used when a user first connects a provider and no model is explicitly selected.
287
+ * These are the best general-purpose models for each provider.
288
+ */
289
+ export const PRIMARY_MODEL_DEFAULTS: Record<string, string> = {
290
+ anthropic: 'claude-sonnet-4-6',
291
+ openai: 'gpt-5.4',
292
+ google: 'gemini-3.1-pro-preview',
293
+ groq: 'openai/gpt-oss-120b',
294
+ cerebras: 'gpt-oss-120b',
295
+ mistral: 'mistral-large-2512',
296
+ };
297
+
298
+ export const UTILITY_MODEL_DEFAULTS: Record<string, string> = {
299
+ anthropic: 'claude-haiku-4-5-20251001', // $1.00/$5.00 per 1M tokens
300
+ openai: 'gpt-4.1-nano', // $0.10/$0.40 per 1M tokens
301
+ 'openai-codex': 'gpt-5.1-codex-mini', // Smallest Codex model
302
+ google: 'gemini-2.5-flash-lite', // $0.10/$0.40 per 1M tokens
303
+ groq: 'llama-3.1-8b-instant', // ~$0.05/$0.08 per 1M tokens
304
+ cerebras: 'llama3.1-8b', // ~$0.10/$0.10 per 1M tokens
305
+ mistral: 'mistral-small-2506', // $0.06/$0.18 per 1M tokens
306
+ };
307
+
308
+ // ---------------------------------------------------------------------------
309
+ // Cache Retention
310
+ // ---------------------------------------------------------------------------
311
+
312
+ export type CacheRetention = 'none' | 'short' | 'long';
313
+
314
+ /** Per-provider prompt caching characteristics as implemented in pi-ai. */
315
+ export interface ProviderCacheConfig {
316
+ /** Whether pi-ai implements cacheRetention for this provider. */
317
+ supported: boolean;
318
+ /** Short-term cache TTL in ms (0 if unsupported). */
319
+ shortTtlMs: number;
320
+ /** Long-term cache TTL in ms (0 if unsupported). */
321
+ longTtlMs: number;
322
+ /** Write cost multiplier vs base input price for short cache (1.0 = free). */
323
+ shortWritePremium: number;
324
+ /** Write cost multiplier vs base input price for long cache. */
325
+ longWritePremium: number;
326
+ /** Read cost multiplier vs base input price (0.1 = 90% discount). */
327
+ readDiscount: number;
328
+ /** Whether the TTL resets on each cache hit. */
329
+ ttlResetsOnHit: boolean;
330
+ /** True if "long" has no cost penalty over "short" (e.g. OpenAI). */
331
+ preferLong: boolean;
332
+ }
333
+
334
+ /**
335
+ * Cache configuration for all known providers.
336
+ *
337
+ * Only Anthropic, Bedrock (Claude), and OpenAI Responses actually implement
338
+ * cacheRetention in pi-ai. All other providers ignore it (no-op).
339
+ */
340
+ export const PROVIDER_CACHE_CONFIG: Record<string, ProviderCacheConfig> = {
341
+ anthropic: { supported: true, shortTtlMs: 300_000, longTtlMs: 3_600_000, shortWritePremium: 1.25, longWritePremium: 2.0, readDiscount: 0.1, ttlResetsOnHit: true, preferLong: false },
342
+ bedrock: { supported: true, shortTtlMs: 300_000, longTtlMs: 3_600_000, shortWritePremium: 1.25, longWritePremium: 2.0, readDiscount: 0.1, ttlResetsOnHit: true, preferLong: false },
343
+ openai: { supported: true, shortTtlMs: 600_000, longTtlMs: 86_400_000, shortWritePremium: 1.0, longWritePremium: 1.0, readDiscount: 0.5, ttlResetsOnHit: true, preferLong: true },
344
+ google: { supported: false, shortTtlMs: 0, longTtlMs: 0, shortWritePremium: 1.0, longWritePremium: 1.0, readDiscount: 1.0, ttlResetsOnHit: false, preferLong: false },
345
+ mistral: { supported: false, shortTtlMs: 0, longTtlMs: 0, shortWritePremium: 1.0, longWritePremium: 1.0, readDiscount: 1.0, ttlResetsOnHit: false, preferLong: false },
346
+ azure: { supported: false, shortTtlMs: 0, longTtlMs: 0, shortWritePremium: 1.0, longWritePremium: 1.0, readDiscount: 1.0, ttlResetsOnHit: false, preferLong: false },
347
+ };
348
+
349
+ /**
350
+ * Resolve the optimal cache retention setting for a provider and tick interval.
351
+ *
352
+ * Decision logic:
353
+ * - Providers with preferLong (e.g. OpenAI, free writes): always "long"
354
+ * - Anthropic/Bedrock with interval ≤ 4.5 min: "short" (cheaper writes, TTL resets on hit)
355
+ * - Anthropic/Bedrock with interval > 4.5 min: "long" (need 1-hour window for sleep ticks)
356
+ * - Unsupported providers: "none"
357
+ */
358
+ export function resolveCacheRetention(provider: string, tickIntervalMs: number): CacheRetention {
359
+ const config = PROVIDER_CACHE_CONFIG[provider];
360
+
361
+ // Unknown or unsupported provider
362
+ if (!config || !config.supported) {
363
+ return 'none';
364
+ }
365
+
366
+ // Providers where long cache is free (e.g. OpenAI): always use long
367
+ if (config.preferLong) {
368
+ return 'long';
369
+ }
370
+
371
+ // Providers with a write cost premium (e.g. Anthropic):
372
+ // use short when the interval fits within the short TTL (with safety margin)
373
+ const SHORT_TTL_SAFETY_MARGIN = 0.9; // 90% of TTL as threshold
374
+ const shortThreshold = config.shortTtlMs * SHORT_TTL_SAFETY_MARGIN;
375
+
376
+ if (tickIntervalMs <= shortThreshold) {
377
+ return 'short';
378
+ }
379
+
380
+ // Interval exceeds short TTL: use long if available
381
+ if (config.longTtlMs > 0) {
382
+ return 'long';
383
+ }
384
+
385
+ return 'none';
386
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Schema conversion utility: Zod -> JSON Schema -> TypeBox.
3
+ *
4
+ * Pi-agent-core uses TypeBox tool parameter schemas.
5
+ * Consumer code continues using Zod. This module bridges the gap
6
+ * at the tool registration boundary.
7
+ *
8
+ * Handles BOTH Zod v3 schemas (used by @animus-labs/shared tools)
9
+ * and Zod v4 schemas. Zod v3 schemas use `zod-to-json-schema`,
10
+ * Zod v4 schemas use the native `toJSONSchema()`.
11
+ */
12
+
13
+ import { Type, type TSchema } from 'typebox';
14
+
15
+ /**
16
+ * Check if a schema is a Zod v3 schema (has _def property).
17
+ */
18
+ function isZodV3(schema: unknown): boolean {
19
+ if (schema == null || typeof schema !== 'object') return false;
20
+ // Zod v3 schemas have _def but NOT _zod (which is a v4 marker)
21
+ const obj = schema as Record<string, unknown>;
22
+ return '_def' in obj && typeof obj['_def'] === 'object' && !('_zod' in obj);
23
+ }
24
+
25
+ /**
26
+ * Convert a Zod schema (v3 or v4) to a TypeBox TSchema via JSON Schema.
27
+ *
28
+ * @param zodSchema - Any Zod schema (z.object, z.string, etc.)
29
+ * @returns A TypeBox TSchema suitable for pi-agent-core AgentTool definitions
30
+ */
31
+ export async function zodToTypebox(zodSchema: unknown): Promise<TSchema> {
32
+ if (!zodSchema || typeof zodSchema !== 'object') {
33
+ throw new Error(`zodToTypebox: received invalid schema: ${typeof zodSchema}`);
34
+ }
35
+
36
+ let jsonSchema: unknown;
37
+
38
+ if (isZodV3(zodSchema)) {
39
+ // Zod v3: use zod-to-json-schema (works with v3's _def structure)
40
+ const { zodToJsonSchema } = await import('zod-to-json-schema');
41
+ jsonSchema = zodToJsonSchema(zodSchema as Parameters<typeof zodToJsonSchema>[0]);
42
+ } else {
43
+ // Zod v4: use native toJSONSchema
44
+ const { toJSONSchema } = await import('zod');
45
+ jsonSchema = toJSONSchema(zodSchema as Parameters<typeof toJSONSchema>[0]);
46
+ }
47
+
48
+ // Type.Unsafe wraps a raw JSON Schema object as a TSchema
49
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
+ return Type.Unsafe(jsonSchema as any);
51
+ }