cowork-os 0.3.21 → 0.3.25

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 (252) hide show
  1. package/README.md +372 -10
  2. package/connectors/README.md +20 -0
  3. package/connectors/asana-mcp/README.md +24 -0
  4. package/connectors/asana-mcp/dist/index.js +427 -0
  5. package/connectors/asana-mcp/package.json +15 -0
  6. package/connectors/asana-mcp/src/index.ts +553 -0
  7. package/connectors/asana-mcp/tsconfig.json +13 -0
  8. package/connectors/hubspot-mcp/README.md +35 -0
  9. package/connectors/hubspot-mcp/dist/index.js +454 -0
  10. package/connectors/hubspot-mcp/package.json +15 -0
  11. package/connectors/hubspot-mcp/src/index.ts +562 -0
  12. package/connectors/hubspot-mcp/tsconfig.json +13 -0
  13. package/connectors/jira-mcp/README.md +49 -0
  14. package/connectors/jira-mcp/dist/index.js +588 -0
  15. package/connectors/jira-mcp/package.json +15 -0
  16. package/connectors/jira-mcp/src/index.ts +711 -0
  17. package/connectors/jira-mcp/tsconfig.json +13 -0
  18. package/connectors/linear-mcp/README.md +22 -0
  19. package/connectors/linear-mcp/dist/index.js +402 -0
  20. package/connectors/linear-mcp/package.json +15 -0
  21. package/connectors/linear-mcp/src/index.ts +522 -0
  22. package/connectors/linear-mcp/tsconfig.json +13 -0
  23. package/connectors/okta-mcp/README.md +24 -0
  24. package/connectors/okta-mcp/dist/index.js +411 -0
  25. package/connectors/okta-mcp/package.json +15 -0
  26. package/connectors/okta-mcp/src/index.ts +520 -0
  27. package/connectors/okta-mcp/tsconfig.json +13 -0
  28. package/connectors/salesforce-mcp/README.md +47 -0
  29. package/connectors/salesforce-mcp/dist/index.js +584 -0
  30. package/connectors/salesforce-mcp/package.json +15 -0
  31. package/connectors/salesforce-mcp/src/index.ts +722 -0
  32. package/connectors/salesforce-mcp/tsconfig.json +13 -0
  33. package/connectors/servicenow-mcp/README.md +26 -0
  34. package/connectors/servicenow-mcp/dist/index.js +400 -0
  35. package/connectors/servicenow-mcp/package.json +15 -0
  36. package/connectors/servicenow-mcp/src/index.ts +500 -0
  37. package/connectors/servicenow-mcp/tsconfig.json +13 -0
  38. package/connectors/templates/mcp-connector/README.md +31 -0
  39. package/connectors/templates/mcp-connector/package.json +15 -0
  40. package/connectors/templates/mcp-connector/src/index.ts +330 -0
  41. package/connectors/templates/mcp-connector/tsconfig.json +13 -0
  42. package/connectors/zendesk-mcp/README.md +40 -0
  43. package/connectors/zendesk-mcp/dist/index.js +431 -0
  44. package/connectors/zendesk-mcp/package.json +15 -0
  45. package/connectors/zendesk-mcp/src/index.ts +543 -0
  46. package/connectors/zendesk-mcp/tsconfig.json +13 -0
  47. package/dist/electron/electron/agent/custom-skill-loader.js +31 -1
  48. package/dist/electron/electron/agent/daemon.js +189 -13
  49. package/dist/electron/electron/agent/executor.js +895 -78
  50. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  51. package/dist/electron/electron/agent/llm/azure-openai-provider.js +328 -0
  52. package/dist/electron/electron/agent/llm/bedrock-provider.js +49 -9
  53. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  54. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  55. package/dist/electron/electron/agent/llm/index.js +13 -1
  56. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  57. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  58. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  59. package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
  60. package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
  61. package/dist/electron/electron/agent/llm/provider-factory.js +350 -4
  62. package/dist/electron/electron/agent/llm/types.js +66 -1
  63. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  64. package/dist/electron/electron/agent/search/provider-factory.js +38 -2
  65. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  66. package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
  67. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  68. package/dist/electron/electron/agent/tools/file-tools.js +66 -3
  69. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  70. package/dist/electron/electron/agent/tools/grep-tools.js +90 -10
  71. package/dist/electron/electron/agent/tools/image-tools.js +11 -1
  72. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  73. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  74. package/dist/electron/electron/agent/tools/registry.js +548 -10
  75. package/dist/electron/electron/agent/tools/search-tools.js +28 -10
  76. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  77. package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
  78. package/dist/electron/electron/agent/tools/x-tools.js +1 -1
  79. package/dist/electron/electron/agents/agent-dispatch.js +63 -0
  80. package/dist/electron/electron/database/repositories.js +19 -5
  81. package/dist/electron/electron/database/schema.js +8 -0
  82. package/dist/electron/electron/gateway/channels/whatsapp.js +55 -0
  83. package/dist/electron/electron/gateway/index.js +75 -1
  84. package/dist/electron/electron/gateway/router.js +209 -154
  85. package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
  86. package/dist/electron/electron/ipc/handlers.js +763 -267
  87. package/dist/electron/electron/main.js +63 -0
  88. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  89. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
  90. package/dist/electron/electron/memory/MemoryService.js +2 -1
  91. package/dist/electron/electron/preload.js +78 -1
  92. package/dist/electron/electron/settings/appearance-manager.js +18 -1
  93. package/dist/electron/electron/settings/box-manager.js +54 -0
  94. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  95. package/dist/electron/electron/settings/google-drive-manager.js +54 -0
  96. package/dist/electron/electron/settings/notion-manager.js +56 -0
  97. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  98. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  99. package/dist/electron/electron/utils/box-api.js +153 -0
  100. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  101. package/dist/electron/electron/utils/env-migration.js +19 -0
  102. package/dist/electron/electron/utils/google-drive-api.js +152 -0
  103. package/dist/electron/electron/utils/notion-api.js +103 -0
  104. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  105. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  106. package/dist/electron/electron/utils/validation.js +98 -3
  107. package/dist/electron/electron/utils/x-cli.js +1 -1
  108. package/dist/electron/shared/channelMessages.js +284 -3
  109. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  110. package/dist/electron/shared/types.js +90 -1
  111. package/package.json +14 -3
  112. package/resources/skills/nano-banana-pro.json +4 -4
  113. package/resources/skills/openai-image-gen.json +3 -3
  114. package/resources/skills/scripts/gen.py +163 -0
  115. package/resources/skills/scripts/generate_image.py +91 -0
  116. package/src/electron/agent/custom-skill-loader.ts +34 -1
  117. package/src/electron/agent/daemon.ts +210 -14
  118. package/src/electron/agent/executor.ts +1124 -85
  119. package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
  120. package/src/electron/agent/llm/azure-openai-provider.ts +388 -0
  121. package/src/electron/agent/llm/bedrock-provider.ts +62 -9
  122. package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
  123. package/src/electron/agent/llm/groq-provider.ts +39 -0
  124. package/src/electron/agent/llm/index.ts +6 -0
  125. package/src/electron/agent/llm/kimi-provider.ts +39 -0
  126. package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
  127. package/src/electron/agent/llm/openai-compatible.ts +133 -0
  128. package/src/electron/agent/llm/openai-oauth.ts +2 -1
  129. package/src/electron/agent/llm/openrouter-provider.ts +2 -1
  130. package/src/electron/agent/llm/provider-factory.ts +459 -6
  131. package/src/electron/agent/llm/types.ts +95 -1
  132. package/src/electron/agent/llm/xai-provider.ts +39 -0
  133. package/src/electron/agent/search/provider-factory.ts +43 -2
  134. package/src/electron/agent/tools/box-tools.ts +239 -0
  135. package/src/electron/agent/tools/builtin-settings.ts +36 -0
  136. package/src/electron/agent/tools/dropbox-tools.ts +237 -0
  137. package/src/electron/agent/tools/file-tools.ts +66 -3
  138. package/src/electron/agent/tools/gmail-tools.ts +240 -0
  139. package/src/electron/agent/tools/google-calendar-tools.ts +258 -0
  140. package/src/electron/agent/tools/google-drive-tools.ts +228 -0
  141. package/src/electron/agent/tools/grep-tools.ts +97 -12
  142. package/src/electron/agent/tools/image-tools.ts +11 -1
  143. package/src/electron/agent/tools/notion-tools.ts +330 -0
  144. package/src/electron/agent/tools/onedrive-tools.ts +217 -0
  145. package/src/electron/agent/tools/registry.ts +794 -10
  146. package/src/electron/agent/tools/search-tools.ts +29 -11
  147. package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
  148. package/src/electron/agent/tools/shell-tools.ts +11 -3
  149. package/src/electron/agent/tools/x-tools.ts +1 -1
  150. package/src/electron/agents/agent-dispatch.ts +79 -0
  151. package/src/electron/database/SecureSettingsRepository.ts +7 -1
  152. package/src/electron/database/repositories.ts +58 -6
  153. package/src/electron/database/schema.ts +8 -0
  154. package/src/electron/gateway/channels/discord.ts +4 -0
  155. package/src/electron/gateway/channels/google-chat.ts +3 -0
  156. package/src/electron/gateway/channels/line.ts +3 -0
  157. package/src/electron/gateway/channels/matrix-client.ts +15 -0
  158. package/src/electron/gateway/channels/matrix.ts +31 -0
  159. package/src/electron/gateway/channels/mattermost.ts +3 -0
  160. package/src/electron/gateway/channels/signal.ts +3 -0
  161. package/src/electron/gateway/channels/slack.ts +9 -4
  162. package/src/electron/gateway/channels/teams.ts +4 -0
  163. package/src/electron/gateway/channels/telegram.ts +2 -0
  164. package/src/electron/gateway/channels/twitch.ts +2 -0
  165. package/src/electron/gateway/channels/types.ts +8 -0
  166. package/src/electron/gateway/channels/whatsapp.ts +66 -0
  167. package/src/electron/gateway/index.ts +95 -2
  168. package/src/electron/gateway/router.ts +231 -161
  169. package/src/electron/gateway/security.ts +21 -9
  170. package/src/electron/ipc/canvas-handlers.ts +10 -0
  171. package/src/electron/ipc/handlers.ts +848 -292
  172. package/src/electron/main.ts +35 -0
  173. package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
  174. package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
  175. package/src/electron/memory/MemoryService.ts +7 -1
  176. package/src/electron/preload.ts +200 -5
  177. package/src/electron/settings/appearance-manager.ts +20 -2
  178. package/src/electron/settings/box-manager.ts +58 -0
  179. package/src/electron/settings/dropbox-manager.ts +58 -0
  180. package/src/electron/settings/google-workspace-manager.ts +59 -0
  181. package/src/electron/settings/notion-manager.ts +60 -0
  182. package/src/electron/settings/onedrive-manager.ts +58 -0
  183. package/src/electron/settings/sharepoint-manager.ts +58 -0
  184. package/src/electron/utils/box-api.ts +184 -0
  185. package/src/electron/utils/dropbox-api.ts +171 -0
  186. package/src/electron/utils/env-migration.ts +22 -0
  187. package/src/electron/utils/gmail-api.ts +121 -0
  188. package/src/electron/utils/google-calendar-api.ts +115 -0
  189. package/src/electron/utils/google-workspace-api.ts +228 -0
  190. package/src/electron/utils/google-workspace-auth.ts +109 -0
  191. package/src/electron/utils/google-workspace-oauth.ts +232 -0
  192. package/src/electron/utils/notion-api.ts +126 -0
  193. package/src/electron/utils/onedrive-api.ts +137 -0
  194. package/src/electron/utils/sharepoint-api.ts +132 -0
  195. package/src/electron/utils/validation.ts +128 -1
  196. package/src/electron/utils/x-cli.ts +1 -1
  197. package/src/renderer/App.tsx +119 -8
  198. package/src/renderer/components/ActivityFeedItem.tsx +34 -17
  199. package/src/renderer/components/AgentWorkingStatePanel.tsx +7 -5
  200. package/src/renderer/components/AppearanceSettings.tsx +37 -2
  201. package/src/renderer/components/BlueBubblesSettings.tsx +18 -7
  202. package/src/renderer/components/BoxSettings.tsx +203 -0
  203. package/src/renderer/components/BrowserView.tsx +101 -0
  204. package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
  205. package/src/renderer/components/CanvasPreview.tsx +68 -1
  206. package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
  207. package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
  208. package/src/renderer/components/ConnectorsSettings.tsx +397 -0
  209. package/src/renderer/components/ControlPlaneSettings.tsx +2 -0
  210. package/src/renderer/components/DiscordSettings.tsx +18 -7
  211. package/src/renderer/components/DropboxSettings.tsx +202 -0
  212. package/src/renderer/components/EmailSettings.tsx +18 -7
  213. package/src/renderer/components/FileViewer.tsx +21 -13
  214. package/src/renderer/components/GoogleChatSettings.tsx +17 -7
  215. package/src/renderer/components/GoogleWorkspaceSettings.tsx +332 -0
  216. package/src/renderer/components/ImessageSettings.tsx +22 -11
  217. package/src/renderer/components/LineIcons.tsx +376 -0
  218. package/src/renderer/components/LineSettings.tsx +18 -7
  219. package/src/renderer/components/MCPSettings.tsx +56 -0
  220. package/src/renderer/components/MainContent.tsx +740 -76
  221. package/src/renderer/components/MatrixSettings.tsx +18 -7
  222. package/src/renderer/components/MattermostSettings.tsx +18 -7
  223. package/src/renderer/components/NodesSettings.tsx +58 -99
  224. package/src/renderer/components/NotificationPanel.tsx +25 -11
  225. package/src/renderer/components/NotionSettings.tsx +231 -0
  226. package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
  227. package/src/renderer/components/OnboardingModal.tsx +70 -1
  228. package/src/renderer/components/OneDriveSettings.tsx +212 -0
  229. package/src/renderer/components/RightPanel.tsx +141 -28
  230. package/src/renderer/components/ScheduledTasksSettings.tsx +10 -62
  231. package/src/renderer/components/SearchSettings.tsx +118 -114
  232. package/src/renderer/components/Settings.tsx +1425 -651
  233. package/src/renderer/components/SharePointSettings.tsx +224 -0
  234. package/src/renderer/components/Sidebar.tsx +94 -19
  235. package/src/renderer/components/SignalSettings.tsx +18 -7
  236. package/src/renderer/components/SkillHubBrowser.tsx +144 -185
  237. package/src/renderer/components/SlackSettings.tsx +18 -7
  238. package/src/renderer/components/TaskQuickActions.tsx +11 -6
  239. package/src/renderer/components/TaskTimeline.tsx +58 -26
  240. package/src/renderer/components/TeamsSettings.tsx +18 -7
  241. package/src/renderer/components/TelegramSettings.tsx +18 -7
  242. package/src/renderer/components/ThemeIcon.tsx +16 -0
  243. package/src/renderer/components/TwitchSettings.tsx +18 -7
  244. package/src/renderer/components/VoiceSettings.tsx +30 -74
  245. package/src/renderer/components/WhatsAppSettings.tsx +48 -37
  246. package/src/renderer/components/WorkingStateHistory.tsx +7 -5
  247. package/src/renderer/components/WorkspaceSelector.tsx +42 -13
  248. package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
  249. package/src/renderer/styles/index.css +2333 -209
  250. package/src/shared/channelMessages.ts +367 -4
  251. package/src/shared/llm-provider-catalog.ts +217 -0
  252. package/src/shared/types.ts +251 -2
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitHubCopilotProvider = void 0;
4
+ const openai_compatible_provider_1 = require("./openai-compatible-provider");
5
+ const COPILOT_TOKEN_URL = 'https://api.github.com/copilot_internal/v2/token';
6
+ const DEFAULT_COPILOT_BASE_URL = 'https://api.individual.githubcopilot.com';
7
+ function isTokenValid(cache, now = Date.now()) {
8
+ return cache.expiresAt - now > 5 * 60 * 1000;
9
+ }
10
+ function parseCopilotTokenResponse(payload) {
11
+ if (!payload || typeof payload !== 'object') {
12
+ throw new Error('Unexpected response from Copilot token endpoint');
13
+ }
14
+ const token = payload.token;
15
+ const expiresAt = payload.expires_at;
16
+ if (typeof token !== 'string' || !token.trim()) {
17
+ throw new Error('Copilot token response missing token');
18
+ }
19
+ if (typeof expiresAt === 'number' && Number.isFinite(expiresAt)) {
20
+ return { token, expiresAt: expiresAt > 10000000000 ? expiresAt : expiresAt * 1000 };
21
+ }
22
+ if (typeof expiresAt === 'string' && expiresAt.trim()) {
23
+ const parsed = Number.parseInt(expiresAt, 10);
24
+ if (!Number.isFinite(parsed)) {
25
+ throw new Error('Copilot token response has invalid expires_at');
26
+ }
27
+ return { token, expiresAt: parsed > 10000000000 ? parsed : parsed * 1000 };
28
+ }
29
+ throw new Error('Copilot token response missing expires_at');
30
+ }
31
+ function deriveCopilotBaseUrl(token) {
32
+ const match = token.match(/(?:^|;)\s*proxy-ep=([^;\s]+)/i);
33
+ const proxyEp = match?.[1]?.trim();
34
+ if (!proxyEp)
35
+ return DEFAULT_COPILOT_BASE_URL;
36
+ const host = proxyEp.replace(/^https?:\/\//, '').replace(/^proxy\./i, 'api.');
37
+ return host ? `https://${host}` : DEFAULT_COPILOT_BASE_URL;
38
+ }
39
+ class GitHubCopilotProvider {
40
+ constructor(config) {
41
+ this.type = 'github-copilot';
42
+ const token = config.providerApiKey;
43
+ if (!token) {
44
+ throw new Error('GitHub token is required for Copilot. Configure it in Settings.');
45
+ }
46
+ this.githubToken = token;
47
+ this.model = config.model || 'gpt-4o';
48
+ }
49
+ async createMessage(request) {
50
+ const client = await this.getClient(request.model || this.model);
51
+ return client.createMessage(request);
52
+ }
53
+ async testConnection() {
54
+ try {
55
+ const client = await this.getClient(this.model);
56
+ return await client.testConnection();
57
+ }
58
+ catch (error) {
59
+ return { success: false, error: error.message || 'Failed to connect to Copilot' };
60
+ }
61
+ }
62
+ async getClient(model) {
63
+ const auth = await this.getCopilotAuth();
64
+ return new openai_compatible_provider_1.OpenAICompatibleProvider({
65
+ type: 'github-copilot',
66
+ providerName: 'GitHub Copilot',
67
+ apiKey: auth.token,
68
+ baseUrl: auth.baseUrl,
69
+ defaultModel: model,
70
+ });
71
+ }
72
+ async getCopilotAuth() {
73
+ if (GitHubCopilotProvider.cache && isTokenValid(GitHubCopilotProvider.cache)) {
74
+ return GitHubCopilotProvider.cache;
75
+ }
76
+ const response = await fetch(COPILOT_TOKEN_URL, {
77
+ method: 'GET',
78
+ headers: {
79
+ Accept: 'application/json',
80
+ Authorization: `Bearer ${this.githubToken}`,
81
+ },
82
+ });
83
+ if (!response.ok) {
84
+ throw new Error(`Copilot token exchange failed: HTTP ${response.status}`);
85
+ }
86
+ const json = await response.json();
87
+ const parsed = parseCopilotTokenResponse(json);
88
+ const cache = {
89
+ token: parsed.token,
90
+ expiresAt: parsed.expiresAt,
91
+ baseUrl: deriveCopilotBaseUrl(parsed.token),
92
+ };
93
+ GitHubCopilotProvider.cache = cache;
94
+ return cache;
95
+ }
96
+ }
97
+ exports.GitHubCopilotProvider = GitHubCopilotProvider;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GroqProvider = void 0;
4
+ const openai_compatible_provider_1 = require("./openai-compatible-provider");
5
+ const GROQ_BASE_URL = 'https://api.groq.com/openai/v1';
6
+ const DEFAULT_GROQ_MODEL = 'llama-3.1-8b-instant';
7
+ class GroqProvider {
8
+ constructor(config) {
9
+ this.type = 'groq';
10
+ const apiKey = config.groqApiKey;
11
+ if (!apiKey) {
12
+ throw new Error('Groq API key is required. Configure it in Settings.');
13
+ }
14
+ const baseUrl = config.groqBaseUrl || GROQ_BASE_URL;
15
+ this.client = new openai_compatible_provider_1.OpenAICompatibleProvider({
16
+ type: 'groq',
17
+ providerName: 'Groq',
18
+ apiKey,
19
+ baseUrl,
20
+ defaultModel: config.model || DEFAULT_GROQ_MODEL,
21
+ });
22
+ }
23
+ createMessage(request) {
24
+ return this.client.createMessage(request);
25
+ }
26
+ testConnection() {
27
+ return this.client.testConnection();
28
+ }
29
+ getAvailableModels() {
30
+ return this.client.getAvailableModels();
31
+ }
32
+ }
33
+ exports.GroqProvider = GroqProvider;
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.LLMProviderFactory = exports.OpenAIOAuth = exports.OpenAIProvider = exports.OpenRouterProvider = exports.GeminiProvider = exports.OllamaProvider = exports.BedrockProvider = exports.AnthropicProvider = void 0;
17
+ exports.LLMProviderFactory = exports.OpenAIOAuth = exports.GitHubCopilotProvider = exports.AnthropicCompatibleProvider = exports.KimiProvider = exports.XAIProvider = exports.GroqProvider = exports.AzureOpenAIProvider = exports.OpenAIProvider = exports.OpenRouterProvider = exports.GeminiProvider = exports.OllamaProvider = exports.BedrockProvider = exports.AnthropicProvider = void 0;
18
18
  __exportStar(require("./types"), exports);
19
19
  var anthropic_provider_1 = require("./anthropic-provider");
20
20
  Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_provider_1.AnthropicProvider; } });
@@ -28,6 +28,18 @@ var openrouter_provider_1 = require("./openrouter-provider");
28
28
  Object.defineProperty(exports, "OpenRouterProvider", { enumerable: true, get: function () { return openrouter_provider_1.OpenRouterProvider; } });
29
29
  var openai_provider_1 = require("./openai-provider");
30
30
  Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_provider_1.OpenAIProvider; } });
31
+ var azure_openai_provider_1 = require("./azure-openai-provider");
32
+ Object.defineProperty(exports, "AzureOpenAIProvider", { enumerable: true, get: function () { return azure_openai_provider_1.AzureOpenAIProvider; } });
33
+ var groq_provider_1 = require("./groq-provider");
34
+ Object.defineProperty(exports, "GroqProvider", { enumerable: true, get: function () { return groq_provider_1.GroqProvider; } });
35
+ var xai_provider_1 = require("./xai-provider");
36
+ Object.defineProperty(exports, "XAIProvider", { enumerable: true, get: function () { return xai_provider_1.XAIProvider; } });
37
+ var kimi_provider_1 = require("./kimi-provider");
38
+ Object.defineProperty(exports, "KimiProvider", { enumerable: true, get: function () { return kimi_provider_1.KimiProvider; } });
39
+ var anthropic_compatible_provider_1 = require("./anthropic-compatible-provider");
40
+ Object.defineProperty(exports, "AnthropicCompatibleProvider", { enumerable: true, get: function () { return anthropic_compatible_provider_1.AnthropicCompatibleProvider; } });
41
+ var github_copilot_provider_1 = require("./github-copilot-provider");
42
+ Object.defineProperty(exports, "GitHubCopilotProvider", { enumerable: true, get: function () { return github_copilot_provider_1.GitHubCopilotProvider; } });
31
43
  var openai_oauth_1 = require("./openai-oauth");
32
44
  Object.defineProperty(exports, "OpenAIOAuth", { enumerable: true, get: function () { return openai_oauth_1.OpenAIOAuth; } });
33
45
  var provider_factory_1 = require("./provider-factory");
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KimiProvider = void 0;
4
+ const openai_compatible_provider_1 = require("./openai-compatible-provider");
5
+ const KIMI_BASE_URL = 'https://api.moonshot.ai/v1';
6
+ const DEFAULT_KIMI_MODEL = 'kimi-k2.5';
7
+ class KimiProvider {
8
+ constructor(config) {
9
+ this.type = 'kimi';
10
+ const apiKey = config.kimiApiKey;
11
+ if (!apiKey) {
12
+ throw new Error('Kimi API key is required. Configure it in Settings.');
13
+ }
14
+ const baseUrl = config.kimiBaseUrl || KIMI_BASE_URL;
15
+ this.client = new openai_compatible_provider_1.OpenAICompatibleProvider({
16
+ type: 'kimi',
17
+ providerName: 'Kimi',
18
+ apiKey,
19
+ baseUrl,
20
+ defaultModel: config.model || DEFAULT_KIMI_MODEL,
21
+ });
22
+ }
23
+ createMessage(request) {
24
+ return this.client.createMessage(request);
25
+ }
26
+ testConnection() {
27
+ return this.client.testConnection();
28
+ }
29
+ getAvailableModels() {
30
+ return this.client.getAvailableModels();
31
+ }
32
+ }
33
+ exports.KimiProvider = KimiProvider;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenAICompatibleProvider = void 0;
4
+ const openai_compatible_1 = require("./openai-compatible");
5
+ class OpenAICompatibleProvider {
6
+ constructor(options) {
7
+ this.type = options.type;
8
+ this.apiKey = options.apiKey;
9
+ this.baseUrl = options.baseUrl;
10
+ this.defaultModel = options.defaultModel;
11
+ this.providerName = options.providerName;
12
+ this.extraHeaders = options.extraHeaders;
13
+ }
14
+ async createMessage(request) {
15
+ const messages = (0, openai_compatible_1.toOpenAICompatibleMessages)(request.messages, request.system);
16
+ const tools = request.tools ? (0, openai_compatible_1.toOpenAICompatibleTools)(request.tools) : undefined;
17
+ try {
18
+ const model = request.model || this.defaultModel;
19
+ console.log(`[${this.providerName}] Calling API with model: ${model}`);
20
+ const headers = {
21
+ 'Content-Type': 'application/json',
22
+ ...(this.extraHeaders || {}),
23
+ };
24
+ if (this.apiKey) {
25
+ headers.Authorization = `Bearer ${this.apiKey}`;
26
+ }
27
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
28
+ method: 'POST',
29
+ headers,
30
+ body: JSON.stringify({
31
+ model,
32
+ messages,
33
+ max_tokens: request.maxTokens,
34
+ ...(tools && { tools, tool_choice: 'auto' }),
35
+ }),
36
+ signal: request.signal,
37
+ });
38
+ if (!response.ok) {
39
+ const errorData = await response.json().catch(() => ({}));
40
+ throw new Error(`${this.providerName} API error: ${response.status} ${response.statusText}` +
41
+ (errorData.error?.message ? ` - ${errorData.error.message}` : ''));
42
+ }
43
+ const data = await response.json();
44
+ return (0, openai_compatible_1.fromOpenAICompatibleResponse)(data);
45
+ }
46
+ catch (error) {
47
+ if (error.name === 'AbortError' || error.message?.includes('aborted')) {
48
+ console.log(`[${this.providerName}] Request aborted`);
49
+ throw new Error('Request cancelled');
50
+ }
51
+ console.error(`[${this.providerName}] API error:`, {
52
+ message: error.message,
53
+ status: error.status,
54
+ });
55
+ throw error;
56
+ }
57
+ }
58
+ async testConnection() {
59
+ try {
60
+ const headers = {
61
+ 'Content-Type': 'application/json',
62
+ ...(this.extraHeaders || {}),
63
+ };
64
+ if (this.apiKey) {
65
+ headers.Authorization = `Bearer ${this.apiKey}`;
66
+ }
67
+ const response = await fetch(`${this.baseUrl}/chat/completions`, {
68
+ method: 'POST',
69
+ headers,
70
+ body: JSON.stringify({
71
+ model: this.defaultModel,
72
+ messages: [{ role: 'user', content: 'Hi' }],
73
+ max_tokens: 10,
74
+ }),
75
+ });
76
+ if (!response.ok) {
77
+ const errorData = await response.json().catch(() => ({}));
78
+ return {
79
+ success: false,
80
+ error: errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`,
81
+ };
82
+ }
83
+ return { success: true };
84
+ }
85
+ catch (error) {
86
+ return {
87
+ success: false,
88
+ error: error.message || `Failed to connect to ${this.providerName} API`,
89
+ };
90
+ }
91
+ }
92
+ async getAvailableModels() {
93
+ try {
94
+ const headers = {};
95
+ if (this.apiKey) {
96
+ headers.Authorization = `Bearer ${this.apiKey}`;
97
+ }
98
+ const response = await fetch(`${this.baseUrl}/models`, {
99
+ headers,
100
+ });
101
+ if (!response.ok) {
102
+ return [];
103
+ }
104
+ const data = await response.json();
105
+ return (data.data || []).map((model) => ({
106
+ id: model.id,
107
+ name: model.id,
108
+ }));
109
+ }
110
+ catch (error) {
111
+ console.error(`[${this.providerName}] Failed to fetch models:`, error);
112
+ return [];
113
+ }
114
+ }
115
+ }
116
+ exports.OpenAICompatibleProvider = OpenAICompatibleProvider;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toOpenAICompatibleMessages = toOpenAICompatibleMessages;
4
+ exports.toOpenAICompatibleTools = toOpenAICompatibleTools;
5
+ exports.fromOpenAICompatibleResponse = fromOpenAICompatibleResponse;
6
+ exports.mapStopReason = mapStopReason;
7
+ function toOpenAICompatibleMessages(messages, system) {
8
+ const result = [];
9
+ if (system) {
10
+ result.push({ role: 'system', content: system });
11
+ }
12
+ for (const msg of messages) {
13
+ if (typeof msg.content === 'string') {
14
+ result.push({ role: msg.role, content: msg.content });
15
+ continue;
16
+ }
17
+ for (const item of msg.content) {
18
+ if (item.type === 'tool_result') {
19
+ result.push({
20
+ role: 'tool',
21
+ content: item.content,
22
+ tool_call_id: item.tool_use_id,
23
+ });
24
+ }
25
+ else if (item.type === 'tool_use') {
26
+ result.push({
27
+ role: 'assistant',
28
+ content: null,
29
+ tool_calls: [{
30
+ id: item.id,
31
+ type: 'function',
32
+ function: {
33
+ name: item.name,
34
+ arguments: JSON.stringify(item.input),
35
+ },
36
+ }],
37
+ });
38
+ }
39
+ else if (item.type === 'text') {
40
+ result.push({ role: msg.role, content: item.text });
41
+ }
42
+ }
43
+ }
44
+ return result;
45
+ }
46
+ function toOpenAICompatibleTools(tools) {
47
+ return tools.map((tool) => ({
48
+ type: 'function',
49
+ function: {
50
+ name: tool.name,
51
+ description: tool.description,
52
+ parameters: tool.input_schema,
53
+ },
54
+ }));
55
+ }
56
+ function fromOpenAICompatibleResponse(response) {
57
+ const content = [];
58
+ const choice = response.choices?.[0];
59
+ if (!choice) {
60
+ return {
61
+ content: [{ type: 'text', text: '' }],
62
+ stopReason: 'end_turn',
63
+ };
64
+ }
65
+ const message = choice.message;
66
+ if (message?.content) {
67
+ content.push({
68
+ type: 'text',
69
+ text: message.content,
70
+ });
71
+ }
72
+ if (message?.tool_calls) {
73
+ for (const toolCall of message.tool_calls) {
74
+ if (toolCall.type === 'function') {
75
+ content.push({
76
+ type: 'tool_use',
77
+ id: toolCall.id,
78
+ name: toolCall.function.name,
79
+ input: JSON.parse(toolCall.function.arguments || '{}'),
80
+ });
81
+ }
82
+ }
83
+ }
84
+ if (content.length === 0) {
85
+ content.push({ type: 'text', text: '' });
86
+ }
87
+ return {
88
+ content,
89
+ stopReason: mapStopReason(choice.finish_reason),
90
+ usage: response.usage
91
+ ? {
92
+ inputTokens: response.usage.prompt_tokens || 0,
93
+ outputTokens: response.usage.completion_tokens || 0,
94
+ }
95
+ : undefined,
96
+ };
97
+ }
98
+ function mapStopReason(finishReason) {
99
+ switch (finishReason) {
100
+ case 'stop':
101
+ return 'end_turn';
102
+ case 'length':
103
+ return 'max_tokens';
104
+ case 'tool_calls':
105
+ return 'tool_use';
106
+ case 'content_filter':
107
+ return 'stop_sequence';
108
+ default:
109
+ return 'end_turn';
110
+ }
111
+ }
@@ -8,11 +8,12 @@ const pi_ai_1 = require("@mariozechner/pi-ai");
8
8
  * Convert pi-ai OAuthCredentials to our token format
9
9
  */
10
10
  function credentialsToTokens(credentials) {
11
+ const email = typeof credentials.email === 'string' ? credentials.email : undefined;
11
12
  return {
12
13
  access_token: credentials.access,
13
14
  refresh_token: credentials.refresh,
14
15
  expires_at: credentials.expires,
15
- email: credentials.email,
16
+ email,
16
17
  };
17
18
  }
18
19
  /**
@@ -8,12 +8,12 @@ exports.OpenRouterProvider = void 0;
8
8
  class OpenRouterProvider {
9
9
  constructor(config) {
10
10
  this.type = 'openrouter';
11
- this.baseUrl = 'https://openrouter.ai/api/v1';
12
11
  const apiKey = config.openrouterApiKey;
13
12
  if (!apiKey) {
14
13
  throw new Error('OpenRouter API key is required. Configure it in Settings or get one from https://openrouter.ai/keys');
15
14
  }
16
15
  this.apiKey = apiKey;
16
+ this.baseUrl = config.openrouterBaseUrl || 'https://openrouter.ai/api/v1';
17
17
  this.defaultModel = config.model || 'anthropic/claude-3.5-sonnet';
18
18
  }
19
19
  async createMessage(request) {