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,243 @@
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.SharePointTools = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const sharepoint_manager_1 = require("../../settings/sharepoint-manager");
40
+ const sharepoint_api_1 = require("../../utils/sharepoint-api");
41
+ class SharePointTools {
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 sharepoint_manager_1.SharePointSettingsManager.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 SharePoint 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
+ getSiteId(inputSiteId) {
93
+ const settings = sharepoint_manager_1.SharePointSettingsManager.loadSettings();
94
+ const siteId = inputSiteId || settings.siteId;
95
+ if (!siteId) {
96
+ throw new Error('Missing site_id. Provide it in settings or the tool input.');
97
+ }
98
+ return siteId;
99
+ }
100
+ getDriveId(inputDriveId) {
101
+ const settings = sharepoint_manager_1.SharePointSettingsManager.loadSettings();
102
+ const driveId = inputDriveId || settings.driveId;
103
+ if (!driveId) {
104
+ throw new Error('Missing drive_id. Provide it in settings or the tool input.');
105
+ }
106
+ return driveId;
107
+ }
108
+ async executeAction(input) {
109
+ const settings = sharepoint_manager_1.SharePointSettingsManager.loadSettings();
110
+ if (!settings.enabled) {
111
+ throw new Error('SharePoint integration is disabled. Enable it in Settings > Integrations > SharePoint.');
112
+ }
113
+ const action = input.action;
114
+ if (!action) {
115
+ throw new Error('Missing required "action" parameter');
116
+ }
117
+ let result;
118
+ switch (action) {
119
+ case 'get_current_user': {
120
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, { method: 'GET', path: '/me' });
121
+ break;
122
+ }
123
+ case 'search_sites': {
124
+ if (!input.query)
125
+ throw new Error('Missing query for search_sites');
126
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, {
127
+ method: 'GET',
128
+ path: '/sites',
129
+ query: { search: input.query },
130
+ });
131
+ break;
132
+ }
133
+ case 'get_site': {
134
+ const siteId = this.getSiteId(input.site_id);
135
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, { method: 'GET', path: `/sites/${siteId}` });
136
+ break;
137
+ }
138
+ case 'list_site_drives': {
139
+ const siteId = this.getSiteId(input.site_id);
140
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, { method: 'GET', path: `/sites/${siteId}/drives` });
141
+ break;
142
+ }
143
+ case 'list_drive_items': {
144
+ const driveId = this.getDriveId(input.drive_id);
145
+ const pathSuffix = input.item_id ? `/items/${input.item_id}/children` : '/root/children';
146
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, { method: 'GET', path: `/drives/${driveId}${pathSuffix}` });
147
+ break;
148
+ }
149
+ case 'get_item': {
150
+ if (!input.item_id)
151
+ throw new Error('Missing item_id for get_item');
152
+ const driveId = this.getDriveId(input.drive_id);
153
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, { method: 'GET', path: `/drives/${driveId}/items/${input.item_id}` });
154
+ break;
155
+ }
156
+ case 'create_folder': {
157
+ if (!input.name)
158
+ throw new Error('Missing name for create_folder');
159
+ const driveId = this.getDriveId(input.drive_id);
160
+ const parentPath = input.parent_id
161
+ ? `/items/${input.parent_id}/children`
162
+ : '/root/children';
163
+ await this.requireApproval('Create a SharePoint folder', {
164
+ action: 'create_folder',
165
+ parent_id: input.parent_id || 'root',
166
+ name: input.name,
167
+ });
168
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, {
169
+ method: 'POST',
170
+ path: `/drives/${driveId}${parentPath}`,
171
+ body: {
172
+ name: input.name,
173
+ folder: {},
174
+ '@microsoft.graph.conflictBehavior': input.conflict_behavior || 'rename',
175
+ },
176
+ });
177
+ break;
178
+ }
179
+ case 'upload_file': {
180
+ if (!input.file_path)
181
+ throw new Error('Missing file_path for upload_file');
182
+ const driveId = this.getDriveId(input.drive_id);
183
+ const resolved = this.resolveFilePath(input.file_path);
184
+ const data = fs.readFileSync(resolved);
185
+ const fileName = input.name || path.basename(resolved);
186
+ let uploadPath;
187
+ if (input.remote_path) {
188
+ const cleaned = input.remote_path.replace(/^\/+/, '');
189
+ const encoded = cleaned
190
+ .split('/')
191
+ .map(segment => encodeURIComponent(segment))
192
+ .join('/');
193
+ uploadPath = `/drives/${driveId}/root:/${encoded}:/content`;
194
+ }
195
+ else if (input.parent_id) {
196
+ uploadPath = `/drives/${driveId}/items/${input.parent_id}:/${encodeURIComponent(fileName)}:/content`;
197
+ }
198
+ else {
199
+ uploadPath = `/drives/${driveId}/root:/${encodeURIComponent(fileName)}:/content`;
200
+ }
201
+ await this.requireApproval(`Upload file to SharePoint: ${fileName}`, {
202
+ action: 'upload_file',
203
+ destination: input.remote_path || input.parent_id || 'root',
204
+ file: fileName,
205
+ });
206
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, {
207
+ method: 'PUT',
208
+ path: uploadPath,
209
+ body: data,
210
+ headers: { 'Content-Type': 'application/octet-stream' },
211
+ });
212
+ break;
213
+ }
214
+ case 'delete_item': {
215
+ if (!input.item_id)
216
+ throw new Error('Missing item_id for delete_item');
217
+ const driveId = this.getDriveId(input.drive_id);
218
+ await this.requireApproval('Delete a SharePoint item', {
219
+ action: 'delete_item',
220
+ item_id: input.item_id,
221
+ });
222
+ result = await (0, sharepoint_api_1.sharepointRequest)(settings, { method: 'DELETE', path: `/drives/${driveId}/items/${input.item_id}` });
223
+ break;
224
+ }
225
+ default:
226
+ throw new Error(`Unsupported action: ${action}`);
227
+ }
228
+ this.daemon.logEvent(this.taskId, 'tool_result', {
229
+ tool: 'sharepoint_action',
230
+ action,
231
+ status: result?.status,
232
+ hasData: result?.data ? true : false,
233
+ });
234
+ return {
235
+ success: true,
236
+ action,
237
+ status: result?.status,
238
+ data: result?.data,
239
+ raw: result?.raw,
240
+ };
241
+ }
242
+ }
243
+ exports.SharePointTools = SharePointTools;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports._testUtils = exports.ShellTools = void 0;
4
4
  const child_process_1 = require("child_process");
5
5
  const guardrail_manager_1 = require("../../guardrails/guardrail-manager");
6
+ const builtin_settings_1 = require("./builtin-settings");
6
7
  // Limits to prevent runaway commands
7
8
  const MAX_TIMEOUT = 5 * 60 * 1000; // 5 minutes max
8
9
  const DEFAULT_TIMEOUT = 60 * 1000; // 1 minute default
@@ -321,9 +322,9 @@ class ShellTools {
321
322
  }
322
323
  }
323
324
  /**
324
- * Execute a shell command (requires user approval)
325
+ * Execute a shell command (requires user approval unless auto-approve is enabled)
325
326
  * Note: We don't check workspace.permissions.shell here because
326
- * shell commands always require explicit user approval via requestApproval()
327
+ * shell commands are gated by approval flow (or auto-approve/trust settings)
327
328
  */
328
329
  async runCommand(command, options) {
329
330
  // Check if command is blocked by guardrails BEFORE anything else
@@ -335,8 +336,16 @@ class ShellTools {
335
336
  }
336
337
  // Check if command is trusted (auto-approve without user confirmation)
337
338
  const trustCheck = guardrail_manager_1.GuardrailManager.isCommandTrusted(command);
339
+ const autoApproveEnabled = builtin_settings_1.BuiltinToolsSettingsManager.getToolAutoApprove('run_command');
338
340
  let approved = false;
339
- if (trustCheck.trusted) {
341
+ if (autoApproveEnabled && this.isAutoApprovalSafe(command)) {
342
+ approved = true;
343
+ this.daemon.logEvent(this.taskId, 'log', {
344
+ message: 'Auto-approved command (user setting enabled)',
345
+ command,
346
+ });
347
+ }
348
+ else if (trustCheck.trusted) {
340
349
  // Auto-approve trusted commands
341
350
  approved = true;
342
351
  this.daemon.logEvent(this.taskId, 'log', {
@@ -111,7 +111,7 @@ class XTools {
111
111
  async executeAction(input) {
112
112
  const settings = x_manager_1.XSettingsManager.loadSettings();
113
113
  if (!settings.enabled) {
114
- throw new Error('X integration is disabled. Enable it in Settings > More Channels > X.');
114
+ throw new Error('X integration is disabled. Enable it in Settings > X (Twitter).');
115
115
  }
116
116
  const action = input.action;
117
117
  if (!action) {
@@ -77,6 +77,7 @@ class ChannelGateway {
77
77
  agentName: settings.agentName || 'CoWork',
78
78
  userName: settings.relationship?.userName,
79
79
  personality: settings.activePersonality || 'professional',
80
+ persona: settings.activePersona,
80
81
  emojiUsage: settings.responseStyle?.emojiUsage || 'minimal',
81
82
  quirks: settings.quirks || types_1.DEFAULT_QUIRKS,
82
83
  };