cowork-os 0.3.21 → 0.3.23

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 (170) hide show
  1. package/README.md +293 -6
  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/daemon.js +25 -0
  48. package/dist/electron/electron/agent/executor.js +181 -26
  49. package/dist/electron/electron/agent/llm/anthropic-compatible-provider.js +177 -0
  50. package/dist/electron/electron/agent/llm/github-copilot-provider.js +97 -0
  51. package/dist/electron/electron/agent/llm/groq-provider.js +33 -0
  52. package/dist/electron/electron/agent/llm/index.js +11 -1
  53. package/dist/electron/electron/agent/llm/kimi-provider.js +33 -0
  54. package/dist/electron/electron/agent/llm/openai-compatible-provider.js +116 -0
  55. package/dist/electron/electron/agent/llm/openai-compatible.js +111 -0
  56. package/dist/electron/electron/agent/llm/openai-oauth.js +2 -1
  57. package/dist/electron/electron/agent/llm/openrouter-provider.js +1 -1
  58. package/dist/electron/electron/agent/llm/provider-factory.js +318 -4
  59. package/dist/electron/electron/agent/llm/types.js +66 -1
  60. package/dist/electron/electron/agent/llm/xai-provider.js +33 -0
  61. package/dist/electron/electron/agent/tools/box-tools.js +231 -0
  62. package/dist/electron/electron/agent/tools/builtin-settings.js +28 -0
  63. package/dist/electron/electron/agent/tools/dropbox-tools.js +237 -0
  64. package/dist/electron/electron/agent/tools/google-drive-tools.js +227 -0
  65. package/dist/electron/electron/agent/tools/notion-tools.js +312 -0
  66. package/dist/electron/electron/agent/tools/onedrive-tools.js +217 -0
  67. package/dist/electron/electron/agent/tools/registry.js +541 -0
  68. package/dist/electron/electron/agent/tools/sharepoint-tools.js +243 -0
  69. package/dist/electron/electron/agent/tools/shell-tools.js +12 -3
  70. package/dist/electron/electron/agent/tools/x-tools.js +1 -1
  71. package/dist/electron/electron/gateway/index.js +1 -0
  72. package/dist/electron/electron/gateway/router.js +123 -143
  73. package/dist/electron/electron/ipc/canvas-handlers.js +5 -0
  74. package/dist/electron/electron/ipc/handlers.js +627 -158
  75. package/dist/electron/electron/main.js +63 -0
  76. package/dist/electron/electron/mcp/oauth/connector-oauth.js +333 -0
  77. package/dist/electron/electron/mcp/registry/MCPRegistryManager.js +503 -154
  78. package/dist/electron/electron/memory/MemoryService.js +1 -1
  79. package/dist/electron/electron/preload.js +74 -1
  80. package/dist/electron/electron/settings/box-manager.js +54 -0
  81. package/dist/electron/electron/settings/dropbox-manager.js +54 -0
  82. package/dist/electron/electron/settings/google-drive-manager.js +54 -0
  83. package/dist/electron/electron/settings/notion-manager.js +56 -0
  84. package/dist/electron/electron/settings/onedrive-manager.js +54 -0
  85. package/dist/electron/electron/settings/sharepoint-manager.js +54 -0
  86. package/dist/electron/electron/utils/box-api.js +153 -0
  87. package/dist/electron/electron/utils/dropbox-api.js +144 -0
  88. package/dist/electron/electron/utils/env-migration.js +19 -0
  89. package/dist/electron/electron/utils/google-drive-api.js +152 -0
  90. package/dist/electron/electron/utils/notion-api.js +103 -0
  91. package/dist/electron/electron/utils/onedrive-api.js +113 -0
  92. package/dist/electron/electron/utils/sharepoint-api.js +109 -0
  93. package/dist/electron/electron/utils/validation.js +82 -3
  94. package/dist/electron/electron/utils/x-cli.js +1 -1
  95. package/dist/electron/shared/channelMessages.js +284 -3
  96. package/dist/electron/shared/llm-provider-catalog.js +198 -0
  97. package/dist/electron/shared/types.js +88 -1
  98. package/package.json +12 -2
  99. package/src/electron/agent/executor.ts +205 -28
  100. package/src/electron/agent/llm/anthropic-compatible-provider.ts +214 -0
  101. package/src/electron/agent/llm/github-copilot-provider.ts +117 -0
  102. package/src/electron/agent/llm/groq-provider.ts +39 -0
  103. package/src/electron/agent/llm/index.ts +5 -0
  104. package/src/electron/agent/llm/kimi-provider.ts +39 -0
  105. package/src/electron/agent/llm/openai-compatible-provider.ts +153 -0
  106. package/src/electron/agent/llm/openai-compatible.ts +133 -0
  107. package/src/electron/agent/llm/openai-oauth.ts +2 -1
  108. package/src/electron/agent/llm/openrouter-provider.ts +2 -1
  109. package/src/electron/agent/llm/provider-factory.ts +414 -6
  110. package/src/electron/agent/llm/types.ts +90 -1
  111. package/src/electron/agent/llm/xai-provider.ts +39 -0
  112. package/src/electron/agent/tools/box-tools.ts +239 -0
  113. package/src/electron/agent/tools/builtin-settings.ts +34 -0
  114. package/src/electron/agent/tools/dropbox-tools.ts +237 -0
  115. package/src/electron/agent/tools/google-drive-tools.ts +228 -0
  116. package/src/electron/agent/tools/notion-tools.ts +330 -0
  117. package/src/electron/agent/tools/onedrive-tools.ts +217 -0
  118. package/src/electron/agent/tools/registry.ts +565 -0
  119. package/src/electron/agent/tools/sharepoint-tools.ts +247 -0
  120. package/src/electron/agent/tools/shell-tools.ts +11 -3
  121. package/src/electron/agent/tools/x-tools.ts +1 -1
  122. package/src/electron/database/SecureSettingsRepository.ts +7 -1
  123. package/src/electron/gateway/index.ts +1 -0
  124. package/src/electron/gateway/router.ts +134 -149
  125. package/src/electron/ipc/canvas-handlers.ts +10 -0
  126. package/src/electron/ipc/handlers.ts +673 -153
  127. package/src/electron/main.ts +35 -0
  128. package/src/electron/mcp/oauth/connector-oauth.ts +448 -0
  129. package/src/electron/mcp/registry/MCPRegistryManager.ts +343 -12
  130. package/src/electron/memory/MemoryService.ts +5 -1
  131. package/src/electron/preload.ts +167 -4
  132. package/src/electron/settings/box-manager.ts +58 -0
  133. package/src/electron/settings/dropbox-manager.ts +58 -0
  134. package/src/electron/settings/google-drive-manager.ts +58 -0
  135. package/src/electron/settings/notion-manager.ts +60 -0
  136. package/src/electron/settings/onedrive-manager.ts +58 -0
  137. package/src/electron/settings/sharepoint-manager.ts +58 -0
  138. package/src/electron/utils/box-api.ts +184 -0
  139. package/src/electron/utils/dropbox-api.ts +171 -0
  140. package/src/electron/utils/env-migration.ts +22 -0
  141. package/src/electron/utils/google-drive-api.ts +183 -0
  142. package/src/electron/utils/notion-api.ts +126 -0
  143. package/src/electron/utils/onedrive-api.ts +137 -0
  144. package/src/electron/utils/sharepoint-api.ts +132 -0
  145. package/src/electron/utils/validation.ts +102 -1
  146. package/src/electron/utils/x-cli.ts +1 -1
  147. package/src/renderer/App.tsx +20 -2
  148. package/src/renderer/components/BoxSettings.tsx +203 -0
  149. package/src/renderer/components/BrowserView.tsx +101 -0
  150. package/src/renderer/components/BuiltinToolsSettings.tsx +105 -0
  151. package/src/renderer/components/CanvasPreview.tsx +68 -1
  152. package/src/renderer/components/ConnectorEnvModal.tsx +116 -0
  153. package/src/renderer/components/ConnectorSetupModal.tsx +566 -0
  154. package/src/renderer/components/ConnectorsSettings.tsx +397 -0
  155. package/src/renderer/components/DropboxSettings.tsx +202 -0
  156. package/src/renderer/components/GoogleDriveSettings.tsx +201 -0
  157. package/src/renderer/components/MCPSettings.tsx +56 -0
  158. package/src/renderer/components/MainContent.tsx +270 -34
  159. package/src/renderer/components/NotionSettings.tsx +231 -0
  160. package/src/renderer/components/Onboarding/Onboarding.tsx +13 -1
  161. package/src/renderer/components/OnboardingModal.tsx +70 -1
  162. package/src/renderer/components/OneDriveSettings.tsx +212 -0
  163. package/src/renderer/components/Settings.tsx +611 -8
  164. package/src/renderer/components/SharePointSettings.tsx +224 -0
  165. package/src/renderer/components/Sidebar.tsx +25 -9
  166. package/src/renderer/hooks/useOnboardingFlow.ts +21 -0
  167. package/src/renderer/styles/index.css +438 -25
  168. package/src/shared/channelMessages.ts +367 -4
  169. package/src/shared/llm-provider-catalog.ts +217 -0
  170. package/src/shared/types.ts +226 -1
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OneDriveTools = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const onedrive_manager_1 = require("../../settings/onedrive-manager");
40
+ const onedrive_api_1 = require("../../utils/onedrive-api");
41
+ class OneDriveTools {
42
+ constructor(workspace, daemon, taskId) {
43
+ this.workspace = workspace;
44
+ this.daemon = daemon;
45
+ this.taskId = taskId;
46
+ }
47
+ setWorkspace(workspace) {
48
+ this.workspace = workspace;
49
+ }
50
+ static isEnabled() {
51
+ return onedrive_manager_1.OneDriveSettingsManager.loadSettings().enabled;
52
+ }
53
+ async requireApproval(summary, details) {
54
+ const approved = await this.daemon.requestApproval(this.taskId, 'external_service', summary, details);
55
+ if (!approved) {
56
+ throw new Error('User denied OneDrive action');
57
+ }
58
+ }
59
+ resolveFilePath(inputPath) {
60
+ if (!this.workspace.permissions.read) {
61
+ throw new Error('Read permission not granted for uploads');
62
+ }
63
+ const workspaceRoot = path.resolve(this.workspace.path);
64
+ const allowedPaths = this.workspace.permissions.allowedPaths || [];
65
+ const canReadOutside = this.workspace.isTemp || this.workspace.permissions.unrestrictedFileAccess;
66
+ const isPathAllowed = (absolutePath) => {
67
+ if (allowedPaths.length === 0)
68
+ return false;
69
+ const normalizedPath = path.normalize(absolutePath);
70
+ return allowedPaths.some((allowed) => {
71
+ const normalizedAllowed = path.normalize(allowed);
72
+ return normalizedPath === normalizedAllowed || normalizedPath.startsWith(normalizedAllowed + path.sep);
73
+ });
74
+ };
75
+ const candidate = path.isAbsolute(inputPath)
76
+ ? path.normalize(inputPath)
77
+ : path.resolve(workspaceRoot, inputPath);
78
+ const relative = path.relative(workspaceRoot, candidate);
79
+ const isInsideWorkspace = !(relative.startsWith('..') || path.isAbsolute(relative));
80
+ if (!isInsideWorkspace && !canReadOutside && !isPathAllowed(candidate)) {
81
+ throw new Error('File path must be inside the workspace or in Allowed Paths');
82
+ }
83
+ if (!fs.existsSync(candidate)) {
84
+ throw new Error(`File not found: ${inputPath}`);
85
+ }
86
+ const stats = fs.statSync(candidate);
87
+ if (!stats.isFile()) {
88
+ throw new Error(`Path is not a file: ${inputPath}`);
89
+ }
90
+ return candidate;
91
+ }
92
+ getDrivePrefix(inputDriveId) {
93
+ const settingsDriveId = onedrive_manager_1.OneDriveSettingsManager.loadSettings().driveId;
94
+ const driveId = inputDriveId || settingsDriveId;
95
+ return driveId ? `/drives/${driveId}` : '/me/drive';
96
+ }
97
+ async executeAction(input) {
98
+ const settings = onedrive_manager_1.OneDriveSettingsManager.loadSettings();
99
+ if (!settings.enabled) {
100
+ throw new Error('OneDrive integration is disabled. Enable it in Settings > Integrations > OneDrive.');
101
+ }
102
+ const action = input.action;
103
+ if (!action) {
104
+ throw new Error('Missing required "action" parameter');
105
+ }
106
+ let result;
107
+ const drivePrefix = this.getDrivePrefix(input.drive_id);
108
+ switch (action) {
109
+ case 'get_drive': {
110
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, { method: 'GET', path: drivePrefix });
111
+ break;
112
+ }
113
+ case 'search': {
114
+ if (!input.query)
115
+ throw new Error('Missing query for search');
116
+ const escaped = input.query.replace(/'/g, "''");
117
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, { method: 'GET', path: `${drivePrefix}/root/search(q='${escaped}')` });
118
+ break;
119
+ }
120
+ case 'list_children': {
121
+ const pathSuffix = input.item_id
122
+ ? `/items/${input.item_id}/children`
123
+ : '/root/children';
124
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, { method: 'GET', path: `${drivePrefix}${pathSuffix}` });
125
+ break;
126
+ }
127
+ case 'get_item': {
128
+ if (!input.item_id)
129
+ throw new Error('Missing item_id for get_item');
130
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, { method: 'GET', path: `${drivePrefix}/items/${input.item_id}` });
131
+ break;
132
+ }
133
+ case 'create_folder': {
134
+ if (!input.name)
135
+ throw new Error('Missing name for create_folder');
136
+ const parentPath = input.parent_id
137
+ ? `/items/${input.parent_id}/children`
138
+ : '/root/children';
139
+ await this.requireApproval('Create a OneDrive folder', {
140
+ action: 'create_folder',
141
+ parent_id: input.parent_id || 'root',
142
+ name: input.name,
143
+ });
144
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, {
145
+ method: 'POST',
146
+ path: `${drivePrefix}${parentPath}`,
147
+ body: {
148
+ name: input.name,
149
+ folder: {},
150
+ '@microsoft.graph.conflictBehavior': input.conflict_behavior || 'rename',
151
+ },
152
+ });
153
+ break;
154
+ }
155
+ case 'upload_file': {
156
+ if (!input.file_path)
157
+ throw new Error('Missing file_path for upload_file');
158
+ const resolved = this.resolveFilePath(input.file_path);
159
+ const data = fs.readFileSync(resolved);
160
+ const fileName = input.name || path.basename(resolved);
161
+ let uploadPath;
162
+ if (input.remote_path) {
163
+ const cleaned = input.remote_path.replace(/^\/+/, '');
164
+ const encoded = cleaned
165
+ .split('/')
166
+ .map(segment => encodeURIComponent(segment))
167
+ .join('/');
168
+ uploadPath = `${drivePrefix}/root:/${encoded}:/content`;
169
+ }
170
+ else if (input.parent_id) {
171
+ uploadPath = `${drivePrefix}/items/${input.parent_id}:/${encodeURIComponent(fileName)}:/content`;
172
+ }
173
+ else {
174
+ uploadPath = `${drivePrefix}/root:/${encodeURIComponent(fileName)}:/content`;
175
+ }
176
+ await this.requireApproval(`Upload file to OneDrive: ${fileName}`, {
177
+ action: 'upload_file',
178
+ destination: input.remote_path || input.parent_id || 'root',
179
+ file: fileName,
180
+ });
181
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, {
182
+ method: 'PUT',
183
+ path: uploadPath,
184
+ body: data,
185
+ headers: { 'Content-Type': 'application/octet-stream' },
186
+ });
187
+ break;
188
+ }
189
+ case 'delete_item': {
190
+ if (!input.item_id)
191
+ throw new Error('Missing item_id for delete_item');
192
+ await this.requireApproval('Delete a OneDrive item', {
193
+ action: 'delete_item',
194
+ item_id: input.item_id,
195
+ });
196
+ result = await (0, onedrive_api_1.onedriveRequest)(settings, { method: 'DELETE', path: `${drivePrefix}/items/${input.item_id}` });
197
+ break;
198
+ }
199
+ default:
200
+ throw new Error(`Unsupported action: ${action}`);
201
+ }
202
+ this.daemon.logEvent(this.taskId, 'tool_result', {
203
+ tool: 'onedrive_action',
204
+ action,
205
+ status: result?.status,
206
+ hasData: result?.data ? true : false,
207
+ });
208
+ return {
209
+ success: true,
210
+ action,
211
+ status: result?.status,
212
+ data: result?.data,
213
+ raw: result?.raw,
214
+ };
215
+ }
216
+ }
217
+ exports.OneDriveTools = OneDriveTools;