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,376 @@
1
+ import React from 'react';
2
+
3
+ export type IconProps = React.SVGProps<SVGSVGElement> & {
4
+ size?: number;
5
+ strokeWidth?: number;
6
+ };
7
+
8
+ type BaseIconProps = IconProps & { children: React.ReactNode };
9
+
10
+ function BaseIcon({ size = 20, strokeWidth = 1.8, children, ...props }: BaseIconProps) {
11
+ return (
12
+ <svg
13
+ width={size}
14
+ height={size}
15
+ viewBox="0 0 24 24"
16
+ fill="none"
17
+ stroke="currentColor"
18
+ strokeWidth={strokeWidth}
19
+ strokeLinecap="round"
20
+ strokeLinejoin="round"
21
+ aria-hidden="true"
22
+ {...props}
23
+ >
24
+ {children}
25
+ </svg>
26
+ );
27
+ }
28
+
29
+ export function FolderIcon(props: IconProps) {
30
+ return (
31
+ <BaseIcon {...props}>
32
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />
33
+ </BaseIcon>
34
+ );
35
+ }
36
+
37
+ export function EditIcon(props: IconProps) {
38
+ return (
39
+ <BaseIcon {...props}>
40
+ <path d="M12 20h9" />
41
+ <path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z" />
42
+ </BaseIcon>
43
+ );
44
+ }
45
+
46
+ export function ChartIcon(props: IconProps) {
47
+ return (
48
+ <BaseIcon {...props}>
49
+ <path d="M3 3v18h18" />
50
+ <rect x="7" y="12" width="3" height="6" rx="1" />
51
+ <rect x="12" y="9" width="3" height="9" rx="1" />
52
+ <rect x="17" y="6" width="3" height="12" rx="1" />
53
+ </BaseIcon>
54
+ );
55
+ }
56
+
57
+ export function BookIcon(props: IconProps) {
58
+ return (
59
+ <BaseIcon {...props}>
60
+ <path d="M3 5a2 2 0 0 1 2-2h11a2 2 0 0 1 2 2v16" />
61
+ <path d="M3 5v14a2 2 0 0 0 2 2h13" />
62
+ <path d="M7 3v18" />
63
+ </BaseIcon>
64
+ );
65
+ }
66
+
67
+ export function SearchIcon(props: IconProps) {
68
+ return (
69
+ <BaseIcon {...props}>
70
+ <circle cx="11" cy="11" r="7" />
71
+ <path d="M21 21l-4.35-4.35" />
72
+ </BaseIcon>
73
+ );
74
+ }
75
+
76
+ export function ClipboardIcon(props: IconProps) {
77
+ return (
78
+ <BaseIcon {...props}>
79
+ <rect x="6" y="4" width="12" height="18" rx="2" />
80
+ <rect x="8" y="2" width="8" height="4" rx="1" />
81
+ <path d="M10 10h4" />
82
+ <path d="M10 14h4" />
83
+ </BaseIcon>
84
+ );
85
+ }
86
+
87
+ export function ColumnsIcon(props: IconProps) {
88
+ return (
89
+ <BaseIcon {...props}>
90
+ <rect x="3" y="4" width="5" height="16" rx="1" />
91
+ <rect x="9.5" y="4" width="5" height="16" rx="1" />
92
+ <rect x="16" y="4" width="5" height="16" rx="1" />
93
+ </BaseIcon>
94
+ );
95
+ }
96
+
97
+ export function FlagIcon(props: IconProps) {
98
+ return (
99
+ <BaseIcon {...props}>
100
+ <path d="M4 4v16" />
101
+ <path d="M4 4h12l-2 4 2 4H4" />
102
+ </BaseIcon>
103
+ );
104
+ }
105
+
106
+ export function TagIcon(props: IconProps) {
107
+ return (
108
+ <BaseIcon {...props}>
109
+ <path d="M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82z" />
110
+ <circle cx="7.5" cy="7.5" r="1.5" />
111
+ </BaseIcon>
112
+ );
113
+ }
114
+
115
+ export function BotIcon(props: IconProps) {
116
+ return (
117
+ <BaseIcon {...props}>
118
+ <path d="M12 4v2" />
119
+ <rect x="4" y="8" width="16" height="10" rx="2" />
120
+ <circle cx="9" cy="13" r="1" />
121
+ <circle cx="15" cy="13" r="1" />
122
+ </BaseIcon>
123
+ );
124
+ }
125
+
126
+ export function CalendarIcon(props: IconProps) {
127
+ return (
128
+ <BaseIcon {...props}>
129
+ <rect x="3" y="4" width="18" height="18" rx="2" />
130
+ <path d="M16 2v4" />
131
+ <path d="M8 2v4" />
132
+ <path d="M3 10h18" />
133
+ </BaseIcon>
134
+ );
135
+ }
136
+
137
+ export function ClockIcon(props: IconProps) {
138
+ return (
139
+ <BaseIcon {...props}>
140
+ <circle cx="12" cy="12" r="9" />
141
+ <path d="M12 7v5l3 2" />
142
+ </BaseIcon>
143
+ );
144
+ }
145
+
146
+ export function TargetIcon(props: IconProps) {
147
+ return (
148
+ <BaseIcon {...props}>
149
+ <circle cx="12" cy="12" r="8" />
150
+ <circle cx="12" cy="12" r="2.5" />
151
+ </BaseIcon>
152
+ );
153
+ }
154
+
155
+ export function CheckIcon(props: IconProps) {
156
+ return (
157
+ <BaseIcon {...props}>
158
+ <polyline points="20 6 9 17 4 12" />
159
+ </BaseIcon>
160
+ );
161
+ }
162
+
163
+ export function XIcon(props: IconProps) {
164
+ return (
165
+ <BaseIcon {...props}>
166
+ <line x1="18" y1="6" x2="6" y2="18" />
167
+ <line x1="6" y1="6" x2="18" y2="18" />
168
+ </BaseIcon>
169
+ );
170
+ }
171
+
172
+ export function PlayIcon(props: IconProps) {
173
+ return (
174
+ <BaseIcon {...props}>
175
+ <polygon points="6 4 20 12 6 20 6 4" />
176
+ </BaseIcon>
177
+ );
178
+ }
179
+
180
+ export function PauseIcon(props: IconProps) {
181
+ return (
182
+ <BaseIcon {...props}>
183
+ <line x1="8" y1="5" x2="8" y2="19" />
184
+ <line x1="16" y1="5" x2="16" y2="19" />
185
+ </BaseIcon>
186
+ );
187
+ }
188
+
189
+ export function SlidersIcon(props: IconProps) {
190
+ return (
191
+ <BaseIcon {...props}>
192
+ <line x1="4" y1="6" x2="21" y2="6" />
193
+ <line x1="4" y1="12" x2="21" y2="12" />
194
+ <line x1="4" y1="18" x2="21" y2="18" />
195
+ <circle cx="9" cy="6" r="2" />
196
+ <circle cx="15" cy="12" r="2" />
197
+ <circle cx="7" cy="18" r="2" />
198
+ </BaseIcon>
199
+ );
200
+ }
201
+
202
+ export function PackageIcon(props: IconProps) {
203
+ return (
204
+ <BaseIcon {...props}>
205
+ <path d="M21 8l-9 5-9-5 9-5 9 5z" />
206
+ <path d="M3 8v8l9 5 9-5V8" />
207
+ <path d="M12 13v8" />
208
+ </BaseIcon>
209
+ );
210
+ }
211
+
212
+ export function FileIcon(props: IconProps) {
213
+ return (
214
+ <BaseIcon {...props}>
215
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
216
+ <polyline points="14 2 14 8 20 8" />
217
+ </BaseIcon>
218
+ );
219
+ }
220
+
221
+ export function FileTextIcon(props: IconProps) {
222
+ return (
223
+ <BaseIcon {...props}>
224
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
225
+ <polyline points="14 2 14 8 20 8" />
226
+ <path d="M8 12h8" />
227
+ <path d="M8 16h6" />
228
+ </BaseIcon>
229
+ );
230
+ }
231
+
232
+ export function CodeIcon(props: IconProps) {
233
+ return (
234
+ <BaseIcon {...props}>
235
+ <polyline points="16 18 22 12 16 6" />
236
+ <polyline points="8 6 2 12 8 18" />
237
+ </BaseIcon>
238
+ );
239
+ }
240
+
241
+ export function ImageIcon(props: IconProps) {
242
+ return (
243
+ <BaseIcon {...props}>
244
+ <rect x="3" y="5" width="18" height="14" rx="2" />
245
+ <circle cx="9" cy="10" r="2" />
246
+ <path d="M21 16l-5-5-4 4-2-2-5 5" />
247
+ </BaseIcon>
248
+ );
249
+ }
250
+
251
+ export function PresentationIcon(props: IconProps) {
252
+ return (
253
+ <BaseIcon {...props}>
254
+ <rect x="4" y="3" width="16" height="11" rx="2" />
255
+ <path d="M8 21l4-4 4 4" />
256
+ <path d="M12 14v3" />
257
+ </BaseIcon>
258
+ );
259
+ }
260
+
261
+ export function GlobeIcon(props: IconProps) {
262
+ return (
263
+ <BaseIcon {...props}>
264
+ <circle cx="12" cy="12" r="9" />
265
+ <path d="M3 12h18" />
266
+ <path d="M12 3a15 15 0 0 1 0 18" />
267
+ <path d="M12 3a15 15 0 0 0 0 18" />
268
+ </BaseIcon>
269
+ );
270
+ }
271
+
272
+ export function TrashIcon(props: IconProps) {
273
+ return (
274
+ <BaseIcon {...props}>
275
+ <polyline points="3 6 5 6 21 6" />
276
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
277
+ </BaseIcon>
278
+ );
279
+ }
280
+
281
+ export function StopIcon(props: IconProps) {
282
+ return (
283
+ <BaseIcon {...props}>
284
+ <rect x="6" y="6" width="12" height="12" rx="2" />
285
+ </BaseIcon>
286
+ );
287
+ }
288
+
289
+ export function AlertTriangleIcon(props: IconProps) {
290
+ return (
291
+ <BaseIcon {...props}>
292
+ <path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
293
+ <line x1="12" y1="9" x2="12" y2="13" />
294
+ <line x1="12" y1="17" x2="12.01" y2="17" />
295
+ </BaseIcon>
296
+ );
297
+ }
298
+
299
+ export function BanIcon(props: IconProps) {
300
+ return (
301
+ <BaseIcon {...props}>
302
+ <circle cx="12" cy="12" r="9" />
303
+ <line x1="5" y1="5" x2="19" y2="19" />
304
+ </BaseIcon>
305
+ );
306
+ }
307
+
308
+ export function ZapIcon(props: IconProps) {
309
+ return (
310
+ <BaseIcon {...props}>
311
+ <path d="M13 2 3 14h7l-1 8 10-12h-7z" />
312
+ </BaseIcon>
313
+ );
314
+ }
315
+
316
+ export function ShieldIcon(props: IconProps) {
317
+ return (
318
+ <BaseIcon {...props}>
319
+ <path d="M12 2l7 4v6c0 5-3.5 9-7 10-3.5-1-7-5-7-10V6l7-4z" />
320
+ </BaseIcon>
321
+ );
322
+ }
323
+
324
+ export function InfoIcon(props: IconProps) {
325
+ return (
326
+ <BaseIcon {...props}>
327
+ <circle cx="12" cy="12" r="9" />
328
+ <path d="M12 10v6" />
329
+ <path d="M12 7h.01" />
330
+ </BaseIcon>
331
+ );
332
+ }
333
+
334
+ export function MessageIcon(props: IconProps) {
335
+ return (
336
+ <BaseIcon {...props}>
337
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
338
+ </BaseIcon>
339
+ );
340
+ }
341
+
342
+ export function UsersIcon(props: IconProps) {
343
+ return (
344
+ <BaseIcon {...props}>
345
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" />
346
+ <circle cx="9" cy="7" r="4" />
347
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87" />
348
+ <path d="M16 3.13a4 4 0 0 1 0 7.75" />
349
+ </BaseIcon>
350
+ );
351
+ }
352
+
353
+ export function AtIcon(props: IconProps) {
354
+ return (
355
+ <BaseIcon {...props}>
356
+ <path d="M12 8a4 4 0 1 0 4 4" />
357
+ <path d="M16 12v1a3 3 0 0 1-6 0v-1a6 6 0 1 1 6 6" />
358
+ </BaseIcon>
359
+ );
360
+ }
361
+
362
+ export function DotIcon({ size = 8, ...props }: IconProps) {
363
+ return (
364
+ <svg
365
+ width={size}
366
+ height={size}
367
+ viewBox="0 0 8 8"
368
+ fill="currentColor"
369
+ stroke="none"
370
+ aria-hidden="true"
371
+ {...props}
372
+ >
373
+ <circle cx="4" cy="4" r="3" />
374
+ </svg>
375
+ );
376
+ }
@@ -1,4 +1,4 @@
1
- import { useState, useEffect } from 'react';
1
+ import { useState, useEffect, useCallback } from 'react';
2
2
  import { ChannelData, ChannelUserData, SecurityMode, ContextType, ContextPolicy } from '../../shared/types';
3
3
  import { PairingCodeDisplay } from './PairingCodeDisplay';
4
4
  import { ContextPolicySettings } from './ContextPolicySettings';
@@ -31,11 +31,7 @@ export function LineSettings({ onStatusChange }: LineSettingsProps) {
31
31
  const [contextPolicies, setContextPolicies] = useState<Record<ContextType, ContextPolicy>>({} as Record<ContextType, ContextPolicy>);
32
32
  const [savingPolicy, setSavingPolicy] = useState(false);
33
33
 
34
- useEffect(() => {
35
- loadChannel();
36
- }, []);
37
-
38
- const loadChannel = async () => {
34
+ const loadChannel = useCallback(async () => {
39
35
  try {
40
36
  setLoading(true);
41
37
  const channels = await window.electronAPI.getGatewayChannels();
@@ -71,7 +67,22 @@ export function LineSettings({ onStatusChange }: LineSettingsProps) {
71
67
  } finally {
72
68
  setLoading(false);
73
69
  }
74
- };
70
+ }, [onStatusChange]);
71
+
72
+ useEffect(() => {
73
+ loadChannel();
74
+ }, [loadChannel]);
75
+
76
+ useEffect(() => {
77
+ const unsubscribe = window.electronAPI?.onGatewayUsersUpdated?.((data) => {
78
+ if (data?.channelType !== 'line') return;
79
+ if (channel && data?.channelId && data.channelId !== channel.id) return;
80
+ loadChannel();
81
+ });
82
+ return () => {
83
+ if (unsubscribe) unsubscribe();
84
+ };
85
+ }, [channel?.id, loadChannel]);
75
86
 
76
87
  const handleAddChannel = async () => {
77
88
  if (!channelAccessToken.trim() || !channelSecret.trim()) {
@@ -1,5 +1,6 @@
1
1
  import { useState, useEffect } from 'react';
2
2
  import { MCPRegistryBrowser } from './MCPRegistryBrowser';
3
+ import { ConnectorSetupModal, ConnectorProvider } from './ConnectorSetupModal';
3
4
  import { useAgentContext } from '../hooks/useAgentContext';
4
5
 
5
6
  // Types (matching preload types)
@@ -93,6 +94,14 @@ export function MCPSettings() {
93
94
  const [checkingUpdates, setCheckingUpdates] = useState(false);
94
95
  const [updatingServer, setUpdatingServer] = useState<string | null>(null);
95
96
 
97
+ // Connector setup modal state
98
+ const [connectorSetup, setConnectorSetup] = useState<{
99
+ provider: ConnectorProvider;
100
+ serverId: string;
101
+ serverName: string;
102
+ env?: Record<string, string>;
103
+ } | null>(null);
104
+
96
105
  // Edit server modal state
97
106
  const [editingServer, setEditingServer] = useState<string | null>(null);
98
107
  const [editServerArgs, setEditServerArgs] = useState('');
@@ -379,6 +388,25 @@ export function MCPSettings() {
379
388
  }
380
389
  };
381
390
 
391
+ const getConnectorProvider = (name?: string): ConnectorProvider | null => {
392
+ if (!name) return null;
393
+ const normalized = name.toLowerCase();
394
+ if (normalized.includes('salesforce')) return 'salesforce';
395
+ if (normalized.includes('jira')) return 'jira';
396
+ if (normalized.includes('hubspot')) return 'hubspot';
397
+ if (normalized.includes('zendesk')) return 'zendesk';
398
+ return null;
399
+ };
400
+
401
+ const handleOpenConnectorSetup = (
402
+ provider: ConnectorProvider,
403
+ serverId: string,
404
+ serverName: string,
405
+ env?: Record<string, string>
406
+ ) => {
407
+ setConnectorSetup({ provider, serverId, serverName, env });
408
+ };
409
+
382
410
  const handleCheckUpdates = async () => {
383
411
  try {
384
412
  setCheckingUpdates(true);
@@ -563,6 +591,7 @@ export function MCPSettings() {
563
591
  const isTesting = testingServer === serverStatus.id;
564
592
  const updateInfo = getUpdateInfo(serverStatus.id);
565
593
  const isUpdating = updatingServer === serverStatus.id;
594
+ const connectorProvider = getConnectorProvider(serverStatus.name);
566
595
 
567
596
  return (
568
597
  <div key={serverStatus.id} className="mcp-server-card">
@@ -643,6 +672,22 @@ export function MCPSettings() {
643
672
  </button>
644
673
  )}
645
674
 
675
+ {connectorProvider && (
676
+ <button
677
+ className="button-small button-primary"
678
+ onClick={() =>
679
+ handleOpenConnectorSetup(
680
+ connectorProvider,
681
+ serverStatus.id,
682
+ serverStatus.name,
683
+ config?.env
684
+ )
685
+ }
686
+ >
687
+ Setup
688
+ </button>
689
+ )}
690
+
646
691
  <button
647
692
  className="button-small button-secondary"
648
693
  onClick={() => handleViewTools(serverStatus.id)}
@@ -938,6 +983,17 @@ export function MCPSettings() {
938
983
  </div>
939
984
  </div>
940
985
  )}
986
+
987
+ {connectorSetup && (
988
+ <ConnectorSetupModal
989
+ provider={connectorSetup.provider}
990
+ serverId={connectorSetup.serverId}
991
+ serverName={connectorSetup.serverName}
992
+ initialEnv={connectorSetup.env}
993
+ onClose={() => setConnectorSetup(null)}
994
+ onSaved={loadData}
995
+ />
996
+ )}
941
997
  </div>
942
998
  );
943
999
  }