crewly 1.5.22 → 1.6.1

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 (180) hide show
  1. package/config/roles/orchestrator/fragments/role-boundary.md +4 -1
  2. package/config/roles/orchestrator/prompt.md +219 -25
  3. package/config/roles/orchestrator/soul.md +47 -10
  4. package/config/skills/_common/lib.sh +28 -0
  5. package/config/skills/agent/core/cancel-followup/SKILL.md +38 -0
  6. package/config/skills/agent/core/cancel-followup/execute.sh +92 -0
  7. package/config/skills/agent/core/cancel-followup/execute.test.sh +42 -0
  8. package/config/skills/agent/core/list-my-followups/SKILL.md +36 -0
  9. package/config/skills/agent/core/list-my-followups/execute.sh +74 -0
  10. package/config/skills/agent/core/list-my-followups/execute.test.sh +41 -0
  11. package/config/skills/agent/core/schedule-followup/SKILL.md +53 -0
  12. package/config/skills/agent/core/schedule-followup/execute.sh +176 -0
  13. package/config/skills/agent/core/schedule-followup/execute.test.sh +48 -0
  14. package/config/skills/agent/core/watch-for-event/SKILL.md +60 -0
  15. package/config/skills/agent/core/watch-for-event/execute.sh +158 -0
  16. package/config/skills/agent/core/watch-for-event/execute.test.sh +43 -0
  17. package/config/skills/orchestrator/credential-manager/SKILL.md +218 -0
  18. package/config/skills/orchestrator/credential-manager/execute.sh +166 -0
  19. package/config/skills/orchestrator/credential-manager/execute.test.sh +88 -0
  20. package/dist/backend/backend/src/config/oauth.config.d.ts +33 -0
  21. package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -0
  22. package/dist/backend/backend/src/config/oauth.config.js +45 -0
  23. package/dist/backend/backend/src/config/oauth.config.js.map +1 -0
  24. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +54 -0
  25. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -0
  26. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +228 -0
  27. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -0
  28. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts +26 -0
  29. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -0
  30. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +41 -0
  31. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -0
  32. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts +40 -0
  33. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -0
  34. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +162 -0
  35. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -0
  36. package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -1
  37. package/dist/backend/backend/src/controllers/skill/skill.controller.js +1 -0
  38. package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -1
  39. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +23 -14
  40. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  41. package/dist/backend/backend/src/index.d.ts.map +1 -1
  42. package/dist/backend/backend/src/index.js +23 -4
  43. package/dist/backend/backend/src/index.js.map +1 -1
  44. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  45. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  46. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  47. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts +3 -1
  48. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts.map +1 -1
  49. package/dist/backend/backend/src/scripts/backfill-mission-priority.js +16 -4
  50. package/dist/backend/backend/src/scripts/backfill-mission-priority.js.map +1 -1
  51. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +4 -1
  53. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
  54. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +17 -0
  56. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  57. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +1 -1
  58. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  59. package/dist/backend/backend/src/services/credential/credential-store.service.d.ts +161 -0
  60. package/dist/backend/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
  61. package/dist/backend/backend/src/services/credential/credential-store.service.js +298 -0
  62. package/dist/backend/backend/src/services/credential/credential-store.service.js.map +1 -0
  63. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +105 -0
  64. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
  65. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +272 -0
  66. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
  67. package/dist/backend/backend/src/services/mcp-server.d.ts +46 -2
  68. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/mcp-server.js +216 -211
  70. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  71. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +254 -0
  72. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/mcp-tool-definitions.js +285 -0
  74. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -0
  75. package/dist/backend/backend/src/services/project/task.service.d.ts +18 -2
  76. package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/project/task.service.js +74 -53
  78. package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts +41 -0
  80. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/skill/skill-executor.service.js +136 -7
  82. package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
  83. package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/skill/skill.service.js +1 -0
  85. package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
  86. package/dist/backend/backend/src/services/v3/contract-matcher.d.ts +20 -0
  87. package/dist/backend/backend/src/services/v3/contract-matcher.d.ts.map +1 -0
  88. package/dist/backend/backend/src/services/v3/contract-matcher.js +33 -0
  89. package/dist/backend/backend/src/services/v3/contract-matcher.js.map +1 -0
  90. package/dist/backend/backend/src/services/v3/escalation.service.d.ts +20 -1
  91. package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/v3/escalation.service.js +97 -28
  93. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  94. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts +6 -4
  95. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js +18 -28
  97. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js.map +1 -1
  98. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +14 -9
  100. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -1
  101. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +34 -1
  102. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  103. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +115 -5
  104. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  105. package/dist/backend/backend/src/types/credential.types.d.ts +185 -0
  106. package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -0
  107. package/dist/backend/backend/src/types/credential.types.js +76 -0
  108. package/dist/backend/backend/src/types/credential.types.js.map +1 -0
  109. package/dist/backend/backend/src/types/skill.types.d.ts +9 -0
  110. package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
  111. package/dist/backend/backend/src/types/skill.types.js.map +1 -1
  112. package/dist/backend/backend/src/utils/encryption.utils.d.ts +57 -0
  113. package/dist/backend/backend/src/utils/encryption.utils.d.ts.map +1 -0
  114. package/dist/backend/backend/src/utils/encryption.utils.js +162 -0
  115. package/dist/backend/backend/src/utils/encryption.utils.js.map +1 -0
  116. package/dist/backend/backend/src/utils/google-userinfo.utils.d.ts +41 -0
  117. package/dist/backend/backend/src/utils/google-userinfo.utils.d.ts.map +1 -0
  118. package/dist/backend/backend/src/utils/google-userinfo.utils.js +44 -0
  119. package/dist/backend/backend/src/utils/google-userinfo.utils.js.map +1 -0
  120. package/dist/cli/backend/src/config/oauth.config.d.ts +33 -0
  121. package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -0
  122. package/dist/cli/backend/src/config/oauth.config.js +45 -0
  123. package/dist/cli/backend/src/config/oauth.config.js.map +1 -0
  124. package/dist/cli/backend/src/services/credential/credential-store.service.d.ts +161 -0
  125. package/dist/cli/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
  126. package/dist/cli/backend/src/services/credential/credential-store.service.js +298 -0
  127. package/dist/cli/backend/src/services/credential/credential-store.service.js.map +1 -0
  128. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +105 -0
  129. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
  130. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +272 -0
  131. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
  132. package/dist/cli/backend/src/services/mcp-server.d.ts +46 -2
  133. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -1
  134. package/dist/cli/backend/src/services/mcp-server.js +216 -211
  135. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  136. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +254 -0
  137. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -0
  138. package/dist/cli/backend/src/services/mcp-tool-definitions.js +285 -0
  139. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -0
  140. package/dist/cli/backend/src/services/settings/settings.service.d.ts +168 -0
  141. package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -0
  142. package/dist/cli/backend/src/services/settings/settings.service.js +312 -0
  143. package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -0
  144. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +177 -0
  145. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -0
  146. package/dist/cli/backend/src/services/skill/skill-executor.service.js +624 -0
  147. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -0
  148. package/dist/cli/backend/src/services/skill/skill.service.d.ts +273 -0
  149. package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -0
  150. package/dist/cli/backend/src/services/skill/skill.service.js +655 -0
  151. package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -0
  152. package/dist/cli/backend/src/types/credential.types.d.ts +185 -0
  153. package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -0
  154. package/dist/cli/backend/src/types/credential.types.js +76 -0
  155. package/dist/cli/backend/src/types/credential.types.js.map +1 -0
  156. package/dist/cli/backend/src/types/skill.types.d.ts +9 -0
  157. package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
  158. package/dist/cli/backend/src/types/skill.types.js.map +1 -1
  159. package/dist/cli/backend/src/utils/encryption.utils.d.ts +57 -0
  160. package/dist/cli/backend/src/utils/encryption.utils.d.ts.map +1 -0
  161. package/dist/cli/backend/src/utils/encryption.utils.js +162 -0
  162. package/dist/cli/backend/src/utils/encryption.utils.js.map +1 -0
  163. package/dist/cli/backend/src/utils/google-userinfo.utils.d.ts +41 -0
  164. package/dist/cli/backend/src/utils/google-userinfo.utils.d.ts.map +1 -0
  165. package/dist/cli/backend/src/utils/google-userinfo.utils.js +44 -0
  166. package/dist/cli/backend/src/utils/google-userinfo.utils.js.map +1 -0
  167. package/dist/cli/backend/src/utils/skill-md-parser.d.ts +38 -0
  168. package/dist/cli/backend/src/utils/skill-md-parser.d.ts.map +1 -0
  169. package/dist/cli/backend/src/utils/skill-md-parser.js +47 -0
  170. package/dist/cli/backend/src/utils/skill-md-parser.js.map +1 -0
  171. package/frontend/dist/assets/{index-dc92ab64.css → index-6aaa0630.css} +1 -1
  172. package/frontend/dist/assets/{index-76d76633.js → index-70356616.js} +334 -328
  173. package/frontend/dist/index.html +2 -2
  174. package/package.json +1 -1
  175. package/config/experts/empathetic-resolver/expert.json +0 -11
  176. package/config/experts/empathetic-resolver.md +0 -32
  177. package/config/experts/pragmatic-architect/expert.json +0 -11
  178. package/config/experts/pragmatic-architect.md +0 -32
  179. package/config/experts/viral-alchemist/expert.json +0 -11
  180. package/config/experts/viral-alchemist.md +0 -32
@@ -0,0 +1,624 @@
1
+ /**
2
+ * Skill Executor Service
3
+ *
4
+ * Responsible for executing skills including script execution with
5
+ * environment variable injection, browser automation coordination,
6
+ * and MCP tool invocation.
7
+ *
8
+ * @module services/skill/skill-executor.service
9
+ */
10
+ import { spawn } from 'child_process';
11
+ import { promises as fs } from 'fs';
12
+ import * as path from 'path';
13
+ import { SKILL_CONSTANTS, } from '../../types/skill.types.js';
14
+ import { getSkillService } from './skill.service.js';
15
+ import { getSettingsService } from '../settings/settings.service.js';
16
+ import { LoggerService } from '../core/logger.service.js';
17
+ import { getCredentialStoreService } from '../credential/credential-store.service.js';
18
+ import { GeminiCliWorkspaceHelper } from '../credential/helpers/gemini-cli-workspace.helper.js';
19
+ import { MissingCredentialError, InsufficientScopeError, } from '../../types/credential.types.js';
20
+ /**
21
+ * Replace all occurrences of any live secret value in `text` with a
22
+ * `<redacted:{label}>` placeholder.
23
+ *
24
+ * @internal Exported for unit tests; not part of the public service API.
25
+ */
26
+ export function redactSecrets(text, secrets) {
27
+ if (!text || secrets.length === 0)
28
+ return text;
29
+ let out = text;
30
+ for (const { value, label } of secrets) {
31
+ if (value && out.includes(value)) {
32
+ // String.prototype.split+join is safe for all characters (no regex escaping).
33
+ out = out.split(value).join(`<redacted:${label}>`);
34
+ }
35
+ }
36
+ return out;
37
+ }
38
+ /**
39
+ * Service for executing skills
40
+ *
41
+ * Handles:
42
+ * - Script execution with environment variable injection
43
+ * - Browser automation via Claude's Chrome MCP
44
+ * - MCP tool invocation
45
+ * - Composite skill orchestration
46
+ */
47
+ export class SkillExecutorService {
48
+ defaultTimeoutMs = SKILL_CONSTANTS.DEFAULTS.SCRIPT_TIMEOUT_MS;
49
+ logger = LoggerService.getInstance().createComponentLogger('SkillExecutorService');
50
+ /** Lazy-instantiated helpers for credential refresh. */
51
+ geminiCliHelper = null;
52
+ getGeminiCliHelper() {
53
+ if (!this.geminiCliHelper) {
54
+ this.geminiCliHelper = new GeminiCliWorkspaceHelper(getCredentialStoreService());
55
+ }
56
+ return this.geminiCliHelper;
57
+ }
58
+ /**
59
+ * Execute a skill by ID
60
+ *
61
+ * @param skillId - ID of the skill to execute
62
+ * @param context - Execution context with agent and task information
63
+ * @returns Execution result with success status and output
64
+ */
65
+ async executeSkill(skillId, context) {
66
+ const startTime = Date.now();
67
+ try {
68
+ const skillService = getSkillService();
69
+ const skill = await skillService.getSkill(skillId);
70
+ if (!skill) {
71
+ return {
72
+ success: false,
73
+ error: `Skill not found: ${skillId}`,
74
+ durationMs: Date.now() - startTime,
75
+ };
76
+ }
77
+ if (!skill.isEnabled) {
78
+ return {
79
+ success: false,
80
+ error: `Skill is disabled: ${skill.name}`,
81
+ durationMs: Date.now() - startTime,
82
+ };
83
+ }
84
+ return await this.executeSkillInternal(skill, context);
85
+ }
86
+ catch (error) {
87
+ return {
88
+ success: false,
89
+ error: error instanceof Error ? error.message : 'Unknown error',
90
+ durationMs: Date.now() - startTime,
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Execute a skill with the full skill object
96
+ *
97
+ * @param skill - Full skill object with prompt content
98
+ * @param context - Execution context
99
+ * @returns Execution result
100
+ */
101
+ async executeSkillInternal(skill, context) {
102
+ const startTime = Date.now();
103
+ // Check if skill is enabled
104
+ if (!skill.isEnabled) {
105
+ return {
106
+ success: false,
107
+ error: `Skill is disabled: ${skill.name}`,
108
+ durationMs: Date.now() - startTime,
109
+ };
110
+ }
111
+ // Check settings for execution type restrictions
112
+ try {
113
+ const settings = await getSettingsService().getSettings();
114
+ if (!settings.skills.enableScriptExecution && skill.execution?.type === 'script') {
115
+ return {
116
+ success: false,
117
+ error: 'Script execution is disabled in settings',
118
+ durationMs: Date.now() - startTime,
119
+ };
120
+ }
121
+ if (!settings.skills.enableBrowserAutomation && skill.execution?.type === 'browser') {
122
+ return {
123
+ success: false,
124
+ error: 'Browser automation is disabled in settings',
125
+ durationMs: Date.now() - startTime,
126
+ };
127
+ }
128
+ }
129
+ catch (error) {
130
+ // If settings can't be loaded, continue with defaults (allow execution)
131
+ this.logger.warn('Failed to load settings, continuing with defaults', { error: error instanceof Error ? error.message : String(error) });
132
+ }
133
+ const executionType = skill.execution?.type ?? 'prompt-only';
134
+ switch (executionType) {
135
+ case 'script':
136
+ return this.executeScript(skill, context);
137
+ case 'browser':
138
+ return this.executeBrowserAutomation(skill, context);
139
+ case 'mcp-tool':
140
+ return this.executeMcpTool(skill, context);
141
+ case 'composite':
142
+ return this.executeComposite(skill, context);
143
+ case 'prompt-only':
144
+ return {
145
+ success: true,
146
+ output: skill.promptContent,
147
+ durationMs: Date.now() - startTime,
148
+ data: { type: 'prompt-only' },
149
+ };
150
+ default:
151
+ return {
152
+ success: false,
153
+ error: `Unknown execution type: ${executionType}`,
154
+ durationMs: Date.now() - startTime,
155
+ };
156
+ }
157
+ }
158
+ /**
159
+ * Execute a script-based skill
160
+ *
161
+ * @param skill - Skill with script configuration
162
+ * @param context - Execution context
163
+ * @returns Execution result
164
+ */
165
+ async executeScript(skill, context) {
166
+ const startTime = Date.now();
167
+ const scriptConfig = skill.execution?.script;
168
+ if (!scriptConfig) {
169
+ return {
170
+ success: false,
171
+ error: 'Script configuration missing',
172
+ durationMs: Date.now() - startTime,
173
+ };
174
+ }
175
+ try {
176
+ // Load environment variables + any live secrets for output redaction
177
+ const { env, liveSecrets } = await this.buildEnvironmentWithSecrets(skill, context);
178
+ // Determine script path
179
+ const skillDir = path.dirname(skill.promptFile);
180
+ const scriptPath = path.isAbsolute(scriptConfig.file)
181
+ ? scriptConfig.file
182
+ : path.join(skillDir, scriptConfig.file);
183
+ // Verify script exists
184
+ await fs.access(scriptPath);
185
+ // Build command based on interpreter
186
+ const { command, args } = this.getInterpreterCommand(scriptConfig.interpreter, scriptPath);
187
+ // Execute script (spawnProcess applies redaction to stdout/stderr using liveSecrets)
188
+ const result = await this.spawnProcess(command, args, {
189
+ cwd: scriptConfig.workingDir || skillDir,
190
+ env,
191
+ timeout: scriptConfig.timeoutMs || this.defaultTimeoutMs,
192
+ liveSecrets,
193
+ });
194
+ return {
195
+ success: result.exitCode === 0,
196
+ output: result.stdout,
197
+ error: result.exitCode !== 0 ? result.stderr : undefined,
198
+ durationMs: Date.now() - startTime,
199
+ data: {
200
+ exitCode: result.exitCode,
201
+ stderr: result.stderr,
202
+ },
203
+ };
204
+ }
205
+ catch (error) {
206
+ return {
207
+ success: false,
208
+ error: error instanceof Error ? error.message : 'Script execution failed',
209
+ durationMs: Date.now() - startTime,
210
+ };
211
+ }
212
+ }
213
+ /**
214
+ * Execute browser automation skill
215
+ *
216
+ * This returns instructions for Claude to use with the Chrome MCP.
217
+ * The actual browser automation is performed by Claude using the
218
+ * mcp__claude-in-chrome__* tools.
219
+ *
220
+ * @param skill - Skill with browser configuration
221
+ * @param context - Execution context
222
+ * @returns Execution result with browser automation prompt
223
+ */
224
+ async executeBrowserAutomation(skill, context) {
225
+ const startTime = Date.now();
226
+ const browserConfig = skill.execution?.browser;
227
+ if (!browserConfig) {
228
+ return {
229
+ success: false,
230
+ error: 'Browser configuration missing',
231
+ durationMs: Date.now() - startTime,
232
+ };
233
+ }
234
+ // Build browser automation prompt for Claude
235
+ const browserPrompt = this.buildBrowserAutomationPrompt(browserConfig, context);
236
+ return {
237
+ success: true,
238
+ output: browserPrompt,
239
+ durationMs: Date.now() - startTime,
240
+ data: {
241
+ type: 'browser-automation',
242
+ url: browserConfig.url,
243
+ requiresChromeMcp: true,
244
+ },
245
+ };
246
+ }
247
+ /**
248
+ * Execute MCP tool skill
249
+ *
250
+ * Returns instructions for invoking the specified MCP tool.
251
+ *
252
+ * @param skill - Skill with MCP tool configuration
253
+ * @param context - Execution context
254
+ * @returns Execution result with MCP tool invocation prompt
255
+ */
256
+ async executeMcpTool(skill, context) {
257
+ const startTime = Date.now();
258
+ const mcpConfig = skill.execution?.mcpTool;
259
+ if (!mcpConfig) {
260
+ return {
261
+ success: false,
262
+ error: 'MCP tool configuration missing',
263
+ durationMs: Date.now() - startTime,
264
+ };
265
+ }
266
+ // Build MCP tool invocation instructions
267
+ const mcpPrompt = this.buildMcpToolPrompt(mcpConfig, context);
268
+ return {
269
+ success: true,
270
+ output: mcpPrompt,
271
+ durationMs: Date.now() - startTime,
272
+ data: {
273
+ type: 'mcp-tool',
274
+ toolName: mcpConfig.toolName,
275
+ defaultParams: mcpConfig.defaultParams,
276
+ },
277
+ };
278
+ }
279
+ /**
280
+ * Execute composite skill (sequence of other skills)
281
+ *
282
+ * @param skill - Skill with composite configuration
283
+ * @param context - Execution context
284
+ * @returns Combined execution result
285
+ */
286
+ async executeComposite(skill, context) {
287
+ const startTime = Date.now();
288
+ const compositeConfig = skill.execution?.composite;
289
+ if (!compositeConfig || !compositeConfig.skillSequence.length) {
290
+ return {
291
+ success: false,
292
+ error: 'Composite configuration missing or empty',
293
+ durationMs: Date.now() - startTime,
294
+ };
295
+ }
296
+ const results = [];
297
+ const outputs = [];
298
+ for (const skillId of compositeConfig.skillSequence) {
299
+ const result = await this.executeSkill(skillId, context);
300
+ results.push(result);
301
+ if (result.output) {
302
+ outputs.push(result.output);
303
+ }
304
+ if (!result.success && !compositeConfig.continueOnError) {
305
+ return {
306
+ success: false,
307
+ error: `Skill ${skillId} failed: ${result.error}`,
308
+ output: outputs.join('\n\n---\n\n'),
309
+ durationMs: Date.now() - startTime,
310
+ data: { results },
311
+ };
312
+ }
313
+ }
314
+ const allSucceeded = results.every((r) => r.success);
315
+ return {
316
+ success: allSucceeded,
317
+ output: outputs.join('\n\n---\n\n'),
318
+ durationMs: Date.now() - startTime,
319
+ data: { results },
320
+ };
321
+ }
322
+ /**
323
+ * Build environment variables for script execution
324
+ *
325
+ * @param skill - Skill with environment configuration
326
+ * @param context - Execution context
327
+ * @returns Environment variables object
328
+ */
329
+ async buildEnvironment(skill, context) {
330
+ // Preserved for callers (tests etc.) that don't need the liveSecrets list.
331
+ const { env } = await this.buildEnvironmentWithSecrets(skill, context);
332
+ return env;
333
+ }
334
+ /**
335
+ * Build environment variables and collect the list of live secret values
336
+ * that need to be redacted from the child process's output. Used by
337
+ * `executeScript` to wire up per-execution output redaction.
338
+ */
339
+ async buildEnvironmentWithSecrets(skill, context) {
340
+ const env = { ...process.env };
341
+ const liveSecrets = [];
342
+ // Add context variables
343
+ env.CREWLY_AGENT_ID = context.agentId;
344
+ env.CREWLY_ROLE_ID = context.roleId;
345
+ if (context.projectId)
346
+ env.CREWLY_PROJECT_ID = context.projectId;
347
+ if (context.taskId)
348
+ env.CREWLY_TASK_ID = context.taskId;
349
+ if (context.userInput)
350
+ env.CREWLY_USER_INPUT = context.userInput;
351
+ // Resolve credential slots declared in the skill frontmatter.
352
+ // Runs BEFORE .env-file loading so that a credential-injected var can
353
+ // be overridden by an explicit .env entry if desired.
354
+ if (skill.credentials && skill.credentials.length > 0) {
355
+ await this.resolveAndInjectCredentials(skill.credentials, context, env, liveSecrets);
356
+ }
357
+ const envConfig = skill.environment;
358
+ if (!envConfig)
359
+ return { env, liveSecrets };
360
+ // Load from .env file if specified
361
+ if (envConfig.file) {
362
+ const skillDir = path.dirname(skill.promptFile);
363
+ const envFilePath = path.join(skillDir, envConfig.file);
364
+ try {
365
+ const envContent = await fs.readFile(envFilePath, 'utf-8');
366
+ const parsed = this.parseEnvFile(envContent);
367
+ Object.assign(env, parsed);
368
+ }
369
+ catch (error) {
370
+ this.logger.warn('Failed to load env file', { envFilePath });
371
+ }
372
+ }
373
+ // Add inline variables (override file values)
374
+ if (envConfig.variables) {
375
+ Object.assign(env, envConfig.variables);
376
+ }
377
+ // Check required variables
378
+ if (envConfig.required) {
379
+ for (const varName of envConfig.required) {
380
+ if (!env[varName]) {
381
+ throw new Error(`Required environment variable missing: ${varName}`);
382
+ }
383
+ }
384
+ }
385
+ return { env, liveSecrets };
386
+ }
387
+ /**
388
+ * For each credential requirement declared on the skill:
389
+ * - Resolve it to a credential UUID (agent binding → skill default)
390
+ * - Look up the credential, decrypt the payload
391
+ * - Verify scopes (OAuth)
392
+ * - Refresh tokens if near expiry
393
+ * - Inject values into env vars named `CREWLY_CRED_<SLOT>_*`
394
+ * - Register secret values for output redaction
395
+ */
396
+ async resolveAndInjectCredentials(requirements, context, env, liveSecrets) {
397
+ const store = getCredentialStoreService();
398
+ for (const req of requirements) {
399
+ const bindingId = context.credentialBindings?.[req.slot] ?? req.default;
400
+ if (!bindingId) {
401
+ if (req.required) {
402
+ throw new MissingCredentialError(req.slot, req.provider);
403
+ }
404
+ continue;
405
+ }
406
+ const entry = await store.getCredential(bindingId);
407
+ if (entry.status === 'revoked') {
408
+ throw new Error(`Credential '${entry.name}' (slot '${req.slot}') is revoked. Re-authorize before using this skill.`);
409
+ }
410
+ const payload = await store.getPayload(bindingId);
411
+ // Verify scopes for OAuth
412
+ if (req.requiredScopes && req.requiredScopes.length > 0) {
413
+ if (payload.type !== 'google-oauth') {
414
+ throw new Error(`Slot '${req.slot}' declared requiredScopes but credential is type '${payload.type}'.`);
415
+ }
416
+ const granted = new Set(payload.scopes);
417
+ const missing = req.requiredScopes.filter((s) => !granted.has(s));
418
+ if (missing.length > 0) {
419
+ throw new InsufficientScopeError(req.slot, req.requiredScopes, payload.scopes);
420
+ }
421
+ }
422
+ const slotEnv = this.credentialEnvPrefix(req.slot);
423
+ if (payload.type === 'google-oauth') {
424
+ // Refresh if near expiry. getAccessToken throws
425
+ // CredentialRevokedError (with remediation) when the grant is dead;
426
+ // we let it propagate so the caller surfaces the message verbatim.
427
+ let finalPayload = payload;
428
+ if (entry.helper === 'gemini-cli-workspace') {
429
+ finalPayload = await this.getGeminiCliHelper().getAccessToken(entry, payload);
430
+ }
431
+ env[`${slotEnv}_ACCESS_TOKEN`] = finalPayload.accessToken;
432
+ env[`${slotEnv}_REFRESH_TOKEN`] = finalPayload.refreshToken;
433
+ env[`${slotEnv}_TOKEN_TYPE`] = finalPayload.tokenType;
434
+ env[`${slotEnv}_EXPIRES_AT`] = String(finalPayload.expiresAt);
435
+ env[`${slotEnv}_SCOPES`] = finalPayload.scopes.join(' ');
436
+ if (finalPayload.accountEmail) {
437
+ env[`${slotEnv}_EMAIL`] = finalPayload.accountEmail;
438
+ }
439
+ // Redact both tokens from output
440
+ liveSecrets.push({ value: finalPayload.accessToken, label: `${req.slot}:access_token` });
441
+ liveSecrets.push({ value: finalPayload.refreshToken, label: `${req.slot}:refresh_token` });
442
+ }
443
+ else {
444
+ // api-key
445
+ const apiPayload = payload;
446
+ env[slotEnv] = apiPayload.value;
447
+ liveSecrets.push({ value: apiPayload.value, label: req.slot });
448
+ }
449
+ // Record usage (best-effort — don't block execution if this fails)
450
+ try {
451
+ await store.updateCredential(bindingId, {
452
+ lastUsedAt: new Date().toISOString(),
453
+ });
454
+ }
455
+ catch (err) {
456
+ this.logger.warn('Failed to update lastUsedAt for credential', {
457
+ credentialId: bindingId,
458
+ });
459
+ }
460
+ }
461
+ }
462
+ /**
463
+ * Slot name to env var prefix. `gmail-drive` → `CREWLY_CRED_GMAIL_DRIVE`.
464
+ */
465
+ credentialEnvPrefix(slot) {
466
+ return `CREWLY_CRED_${slot.toUpperCase().replace(/-/g, '_')}`;
467
+ }
468
+ /**
469
+ * Parse .env file content into key-value pairs
470
+ *
471
+ * @param content - Content of .env file
472
+ * @returns Parsed environment variables
473
+ */
474
+ parseEnvFile(content) {
475
+ const result = {};
476
+ const lines = content.split('\n');
477
+ for (const line of lines) {
478
+ const trimmed = line.trim();
479
+ if (!trimmed || trimmed.startsWith('#'))
480
+ continue;
481
+ const match = trimmed.match(/^([^=]+)=(.*)$/);
482
+ if (match) {
483
+ const key = match[1].trim();
484
+ let value = match[2].trim();
485
+ // Remove quotes
486
+ if ((value.startsWith('"') && value.endsWith('"')) ||
487
+ (value.startsWith("'") && value.endsWith("'"))) {
488
+ value = value.slice(1, -1);
489
+ }
490
+ result[key] = value;
491
+ }
492
+ }
493
+ return result;
494
+ }
495
+ /**
496
+ * Get interpreter command and arguments for script execution
497
+ *
498
+ * @param interpreter - Script interpreter type
499
+ * @param scriptPath - Path to the script file
500
+ * @returns Command and arguments
501
+ */
502
+ getInterpreterCommand(interpreter, scriptPath) {
503
+ switch (interpreter) {
504
+ case 'bash':
505
+ return { command: 'bash', args: [scriptPath] };
506
+ case 'python':
507
+ return { command: 'python3', args: [scriptPath] };
508
+ case 'node':
509
+ return { command: 'node', args: [scriptPath] };
510
+ default:
511
+ return { command: interpreter, args: [scriptPath] };
512
+ }
513
+ }
514
+ /**
515
+ * Spawn a process and capture output
516
+ *
517
+ * @param command - Command to execute
518
+ * @param args - Command arguments
519
+ * @param options - Execution options
520
+ * @returns Process result with stdout, stderr, and exit code
521
+ */
522
+ spawnProcess(command, args, options) {
523
+ return new Promise((resolve, reject) => {
524
+ const child = spawn(command, args, {
525
+ cwd: options.cwd,
526
+ env: options.env,
527
+ shell: false,
528
+ });
529
+ let stdout = '';
530
+ let stderr = '';
531
+ child.stdout.on('data', (data) => {
532
+ stdout += data.toString();
533
+ });
534
+ child.stderr.on('data', (data) => {
535
+ stderr += data.toString();
536
+ });
537
+ const timeoutMs = options.timeout || this.defaultTimeoutMs;
538
+ const timeoutId = setTimeout(() => {
539
+ child.kill('SIGTERM');
540
+ reject(new Error(`Process timed out after ${timeoutMs}ms`));
541
+ }, timeoutMs);
542
+ child.on('close', (exitCode) => {
543
+ clearTimeout(timeoutId);
544
+ const secrets = options.liveSecrets ?? [];
545
+ resolve({
546
+ stdout: redactSecrets(stdout, secrets),
547
+ stderr: redactSecrets(stderr, secrets),
548
+ exitCode: exitCode ?? 1,
549
+ });
550
+ });
551
+ child.on('error', (error) => {
552
+ clearTimeout(timeoutId);
553
+ reject(error);
554
+ });
555
+ });
556
+ }
557
+ /**
558
+ * Build browser automation prompt for Claude
559
+ *
560
+ * @param config - Browser configuration
561
+ * @param context - Execution context
562
+ * @returns Formatted prompt for browser automation
563
+ */
564
+ buildBrowserAutomationPrompt(config, context) {
565
+ let prompt = `## Browser Automation Task\n\n`;
566
+ prompt += `Navigate to: ${config.url}\n\n`;
567
+ prompt += `### Instructions\n${config.instructions}\n\n`;
568
+ if (config.actions?.length) {
569
+ prompt += `### Specific Actions\n`;
570
+ config.actions.forEach((action, i) => {
571
+ prompt += `${i + 1}. ${action}\n`;
572
+ });
573
+ prompt += '\n';
574
+ }
575
+ if (context.userInput) {
576
+ prompt += `### User Context\n${context.userInput}\n\n`;
577
+ }
578
+ prompt += `*Use the Claude Chrome MCP tools (mcp__claude-in-chrome__*) to complete this task.*`;
579
+ return prompt;
580
+ }
581
+ /**
582
+ * Build MCP tool invocation prompt
583
+ *
584
+ * @param config - MCP tool configuration
585
+ * @param context - Execution context
586
+ * @returns Formatted prompt for MCP tool invocation
587
+ */
588
+ buildMcpToolPrompt(config, context) {
589
+ let prompt = `## MCP Tool Invocation\n\n`;
590
+ prompt += `Tool: ${config.toolName}\n\n`;
591
+ if (config.defaultParams) {
592
+ prompt += `### Default Parameters\n`;
593
+ prompt += '```json\n';
594
+ prompt += JSON.stringify(config.defaultParams, null, 2);
595
+ prompt += '\n```\n\n';
596
+ }
597
+ if (context.userInput) {
598
+ prompt += `### User Context\n${context.userInput}\n`;
599
+ }
600
+ return prompt;
601
+ }
602
+ }
603
+ // =============================================================================
604
+ // Singleton Instance
605
+ // =============================================================================
606
+ let executorInstance = null;
607
+ /**
608
+ * Get the singleton SkillExecutorService instance
609
+ *
610
+ * @returns The SkillExecutorService instance
611
+ */
612
+ export function getSkillExecutorService() {
613
+ if (!executorInstance) {
614
+ executorInstance = new SkillExecutorService();
615
+ }
616
+ return executorInstance;
617
+ }
618
+ /**
619
+ * Reset the singleton instance (for testing)
620
+ */
621
+ export function resetSkillExecutorService() {
622
+ executorInstance = null;
623
+ }
624
+ //# sourceMappingURL=skill-executor.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-executor.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/skill/skill-executor.service.ts"],"names":[],"mappings":"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"}