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,228 @@
1
+ /**
2
+ * Credentials REST Controller
3
+ *
4
+ * Exposes workspace credential management over REST so the frontend (and
5
+ * Cloud portal) can list, add, rename, delete, and OAuth-import credentials.
6
+ *
7
+ * All endpoints return `{ success, data?, error? }` matching the rest of
8
+ * the Crewly API surface. Secret values (token payloads, API keys) are
9
+ * never returned — only registry metadata.
10
+ *
11
+ * @module controllers/credentials/credentials.controller
12
+ */
13
+ import { getCredentialStoreService, } from '../../services/credential/credential-store.service.js';
14
+ import { GeminiCliWorkspaceHelper } from '../../services/credential/helpers/gemini-cli-workspace.helper.js';
15
+ import { CredentialNotFoundError } from '../../types/credential.types.js';
16
+ import { LoggerService } from '../../services/core/logger.service.js';
17
+ const logger = LoggerService.getInstance().createComponentLogger('CredentialsController');
18
+ // ============================================================================
19
+ // Module constants
20
+ // ============================================================================
21
+ /** Lifecycle statuses a client may assign via PATCH. */
22
+ const ALLOWED_STATUSES = new Set(['active', 'revoked']);
23
+ // ============================================================================
24
+ // Validation helpers
25
+ // ============================================================================
26
+ /** Type guard for non-empty strings — cheap defensive check on request bodies. */
27
+ function isNonEmptyString(value) {
28
+ return typeof value === 'string' && value.length > 0;
29
+ }
30
+ // ============================================================================
31
+ // Helper singleton (lazy)
32
+ // ============================================================================
33
+ let geminiHelper = null;
34
+ function getGeminiHelper() {
35
+ if (!geminiHelper) {
36
+ geminiHelper = new GeminiCliWorkspaceHelper(getCredentialStoreService());
37
+ }
38
+ return geminiHelper;
39
+ }
40
+ /** Reset the helper singleton — for tests only. */
41
+ export function _resetGeminiHelperForTesting() {
42
+ geminiHelper = null;
43
+ }
44
+ // ============================================================================
45
+ // Handlers
46
+ // ============================================================================
47
+ /**
48
+ * GET /api/credentials — list all credential metadata (never values).
49
+ */
50
+ export async function listCredentials(_req, res, next) {
51
+ try {
52
+ const creds = await getCredentialStoreService().listCredentials();
53
+ res.json({ success: true, data: creds });
54
+ }
55
+ catch (err) {
56
+ logger.error('listCredentials failed', { err });
57
+ next(err);
58
+ }
59
+ }
60
+ /**
61
+ * GET /api/credentials/:id — metadata for a single credential.
62
+ */
63
+ export async function getCredentialById(req, res, next) {
64
+ try {
65
+ const cred = await getCredentialStoreService().getCredential(req.params.id);
66
+ res.json({ success: true, data: cred });
67
+ }
68
+ catch (err) {
69
+ if (err instanceof CredentialNotFoundError) {
70
+ res.status(404).json({ success: false, error: err.message });
71
+ return;
72
+ }
73
+ logger.error('getCredentialById failed', { err });
74
+ next(err);
75
+ }
76
+ }
77
+ /**
78
+ * POST /api/credentials/api-key — add an API key credential.
79
+ * Body: { name, provider, value }
80
+ */
81
+ export async function addApiKey(req, res, next) {
82
+ try {
83
+ const body = (req.body ?? {});
84
+ if (!isNonEmptyString(body.name) ||
85
+ !isNonEmptyString(body.provider) ||
86
+ !isNonEmptyString(body.value)) {
87
+ res.status(400).json({
88
+ success: false,
89
+ error: 'Missing or invalid required fields: name (string), provider (string), value (string)',
90
+ });
91
+ return;
92
+ }
93
+ const cred = await getCredentialStoreService().addApiKey({
94
+ name: body.name,
95
+ provider: body.provider,
96
+ value: body.value,
97
+ });
98
+ logger.info('Added api-key credential', { id: cred.id, provider: body.provider });
99
+ res.status(201).json({ success: true, data: cred });
100
+ }
101
+ catch (err) {
102
+ logger.error('addApiKey failed', { err });
103
+ next(err);
104
+ }
105
+ }
106
+ /**
107
+ * PATCH /api/credentials/:id — update metadata (name, status).
108
+ * Body: { name?, status? }
109
+ */
110
+ export async function updateCredentialHandler(req, res, next) {
111
+ try {
112
+ const body = (req.body ?? {});
113
+ const patch = {};
114
+ if (body.name !== undefined) {
115
+ if (!isNonEmptyString(body.name)) {
116
+ res.status(400).json({
117
+ success: false,
118
+ error: 'name must be a non-empty string',
119
+ });
120
+ return;
121
+ }
122
+ patch.name = body.name;
123
+ }
124
+ if (body.status !== undefined) {
125
+ if (typeof body.status !== 'string' ||
126
+ !ALLOWED_STATUSES.has(body.status)) {
127
+ res.status(400).json({
128
+ success: false,
129
+ error: `status must be one of: ${[...ALLOWED_STATUSES].join(', ')}`,
130
+ });
131
+ return;
132
+ }
133
+ patch.status = body.status;
134
+ }
135
+ if (Object.keys(patch).length === 0) {
136
+ res.status(400).json({
137
+ success: false,
138
+ error: 'No valid fields to update (expected: name, status)',
139
+ });
140
+ return;
141
+ }
142
+ const cred = await getCredentialStoreService().updateCredential(req.params.id, patch);
143
+ res.json({ success: true, data: cred });
144
+ }
145
+ catch (err) {
146
+ if (err instanceof CredentialNotFoundError) {
147
+ res.status(404).json({ success: false, error: err.message });
148
+ return;
149
+ }
150
+ logger.error('updateCredential failed', { err });
151
+ next(err);
152
+ }
153
+ }
154
+ /**
155
+ * DELETE /api/credentials/:id — delete credential (registry entry + .enc file).
156
+ */
157
+ export async function deleteCredentialHandler(req, res, next) {
158
+ try {
159
+ await getCredentialStoreService().deleteCredential(req.params.id);
160
+ res.json({ success: true });
161
+ }
162
+ catch (err) {
163
+ if (err instanceof CredentialNotFoundError) {
164
+ res.status(404).json({ success: false, error: err.message });
165
+ return;
166
+ }
167
+ logger.error('deleteCredential failed', { err });
168
+ next(err);
169
+ }
170
+ }
171
+ /**
172
+ * POST /api/credentials/oauth/import-gemini-cli — capture current extension
173
+ * login into a new credential.
174
+ * Body: { name }
175
+ *
176
+ * Precondition: the user has run
177
+ * `GEMINI_CLI_WORKSPACE_FORCE_FILE_STORAGE=true gemini`
178
+ * and signed in via the workspace extension.
179
+ */
180
+ export async function importOAuthFromGeminiCli(req, res, next) {
181
+ try {
182
+ const { name } = (req.body ?? {});
183
+ if (!name) {
184
+ res.status(400).json({
185
+ success: false,
186
+ error: 'Missing required field: name',
187
+ });
188
+ return;
189
+ }
190
+ const payload = await getGeminiHelper().captureFromFile();
191
+ const cred = await getCredentialStoreService().addOAuth({
192
+ name,
193
+ provider: 'google',
194
+ helper: 'gemini-cli-workspace',
195
+ payload,
196
+ });
197
+ logger.info('Imported OAuth credential from gemini-cli', {
198
+ id: cred.id,
199
+ accountEmail: cred.accountEmail,
200
+ });
201
+ res.status(201).json({ success: true, data: cred });
202
+ }
203
+ catch (err) {
204
+ // captureFromFile produces user-friendly Error messages — surface them
205
+ const message = err instanceof Error ? err.message : 'Unknown error during import';
206
+ logger.error('importOAuthFromGeminiCli failed', { err: message });
207
+ res.status(400).json({ success: false, error: message });
208
+ }
209
+ }
210
+ /**
211
+ * POST /api/credentials/oauth/gemini-cli/clear-extension-file —
212
+ * delete the extension's cached token file so the next extension login
213
+ * captures a different account.
214
+ */
215
+ export async function clearGeminiCliExtensionFile(_req, res, next) {
216
+ try {
217
+ await getGeminiHelper().clearExtensionFile();
218
+ res.json({ success: true });
219
+ }
220
+ catch (err) {
221
+ logger.error('clearGeminiCliExtensionFile failed', { err });
222
+ next(err);
223
+ }
224
+ }
225
+ // Headless Google OAuth endpoints (startGoogleOAuth, completeGoogleOAuth)
226
+ // live in `./google-oauth.controller.ts` and are composed into the router in
227
+ // `./credentials.routes.ts`.
228
+ //# sourceMappingURL=credentials.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/credentials.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Credentials REST Routes
3
+ *
4
+ * Wires `/api/credentials/*` endpoints to their controller handlers.
5
+ *
6
+ * @module controllers/credentials/credentials.routes
7
+ */
8
+ import { Router } from 'express';
9
+ /**
10
+ * Create the credentials router.
11
+ *
12
+ * Endpoints:
13
+ * - GET / — list all credentials (metadata only)
14
+ * - GET /:id — get one credential (metadata only)
15
+ * - POST /api-key — add an api-key credential
16
+ * - PATCH /:id — update name/status
17
+ * - DELETE /:id — delete credential
18
+ * - POST /oauth/import-gemini-cli — import from gemini-cli workspace extension
19
+ * - POST /oauth/gemini-cli/clear-extension-file — clear the extension's cached token (to enable next-account login)
20
+ *
21
+ * Mounted at `/api/credentials` in `api.routes.ts`.
22
+ *
23
+ * @returns Express router with all credential endpoints
24
+ */
25
+ export declare function createCredentialsRouter(): Router;
26
+ //# sourceMappingURL=credentials.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/credentials.routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAejC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAiBhD"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Credentials REST Routes
3
+ *
4
+ * Wires `/api/credentials/*` endpoints to their controller handlers.
5
+ *
6
+ * @module controllers/credentials/credentials.routes
7
+ */
8
+ import { Router } from 'express';
9
+ import { listCredentials, getCredentialById, addApiKey, updateCredentialHandler, deleteCredentialHandler, importOAuthFromGeminiCli, clearGeminiCliExtensionFile, } from './credentials.controller.js';
10
+ import { startGoogleOAuth, completeGoogleOAuth, } from './google-oauth.controller.js';
11
+ /**
12
+ * Create the credentials router.
13
+ *
14
+ * Endpoints:
15
+ * - GET / — list all credentials (metadata only)
16
+ * - GET /:id — get one credential (metadata only)
17
+ * - POST /api-key — add an api-key credential
18
+ * - PATCH /:id — update name/status
19
+ * - DELETE /:id — delete credential
20
+ * - POST /oauth/import-gemini-cli — import from gemini-cli workspace extension
21
+ * - POST /oauth/gemini-cli/clear-extension-file — clear the extension's cached token (to enable next-account login)
22
+ *
23
+ * Mounted at `/api/credentials` in `api.routes.ts`.
24
+ *
25
+ * @returns Express router with all credential endpoints
26
+ */
27
+ export function createCredentialsRouter() {
28
+ const router = Router();
29
+ router.get('/', listCredentials);
30
+ // Specific routes before /:id to avoid pattern conflicts
31
+ router.post('/api-key', addApiKey);
32
+ router.post('/oauth/import-gemini-cli', importOAuthFromGeminiCli);
33
+ router.post('/oauth/gemini-cli/clear-extension-file', clearGeminiCliExtensionFile);
34
+ router.post('/oauth/google/start', startGoogleOAuth);
35
+ router.post('/oauth/google/complete', completeGoogleOAuth);
36
+ router.get('/:id', getCredentialById);
37
+ router.patch('/:id', updateCredentialHandler);
38
+ router.delete('/:id', deleteCredentialHandler);
39
+ return router;
40
+ }
41
+ //# sourceMappingURL=credentials.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/credentials.routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAEjC,yDAAyD;IACzD,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,wBAAwB,CAAC,CAAC;IAClE,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,2BAA2B,CAAC,CAAC;IACnF,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,CAAC;IAE3D,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAE/C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Headless Google OAuth Controller
3
+ *
4
+ * Implements the "remote user" Google OAuth flow for callers without a
5
+ * terminal (e.g., Slack agents, email). The agent posts to `/oauth/google/start`
6
+ * to get an `authUrl` that the user clicks on any device; the Gemini CLI
7
+ * Workspace cloud function renders the credentials JSON; the agent posts
8
+ * the pasted JSON back to `/oauth/google/complete` to save it as a Crewly
9
+ * credential.
10
+ *
11
+ * This flow is separate from `/oauth/import-gemini-cli` (which reads from
12
+ * the on-box extension's token file) and lives in its own module so the
13
+ * credentials CRUD controller stays focused.
14
+ *
15
+ * @module controllers/credentials/google-oauth.controller
16
+ */
17
+ import type { Request, Response, NextFunction } from 'express';
18
+ /**
19
+ * POST /api/credentials/oauth/google/start
20
+ *
21
+ * Build a Google OAuth URL that the caller can send to a remote user (via
22
+ * Slack, email, etc.). The URL opens on the user's device, they sign in,
23
+ * and the cloud function returns a page showing the credentials JSON for
24
+ * the user to copy back.
25
+ *
26
+ * Body: `{ scopes?: string[] }` — optional scope override
27
+ * Returns: `{ success, data: { authUrl } }`
28
+ */
29
+ export declare function startGoogleOAuth(req: Request, res: Response, _next: NextFunction): Promise<void>;
30
+ /**
31
+ * POST /api/credentials/oauth/google/complete
32
+ *
33
+ * Accept the credentials JSON the user copied from the OAuth success page,
34
+ * verify it, fetch the account email, and save as a new Crewly credential.
35
+ *
36
+ * Body: `{ name: string, credentialsJson: string | object }`
37
+ * Returns: `{ success, data: CredentialRegistryEntry }`
38
+ */
39
+ export declare function completeGoogleOAuth(req: Request, res: Response, _next: NextFunction): Promise<void>;
40
+ //# sourceMappingURL=google-oauth.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-oauth.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/google-oauth.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAuB/D;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAqEf"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Headless Google OAuth Controller
3
+ *
4
+ * Implements the "remote user" Google OAuth flow for callers without a
5
+ * terminal (e.g., Slack agents, email). The agent posts to `/oauth/google/start`
6
+ * to get an `authUrl` that the user clicks on any device; the Gemini CLI
7
+ * Workspace cloud function renders the credentials JSON; the agent posts
8
+ * the pasted JSON back to `/oauth/google/complete` to save it as a Crewly
9
+ * credential.
10
+ *
11
+ * This flow is separate from `/oauth/import-gemini-cli` (which reads from
12
+ * the on-box extension's token file) and lives in its own module so the
13
+ * credentials CRUD controller stays focused.
14
+ *
15
+ * @module controllers/credentials/google-oauth.controller
16
+ */
17
+ import { getCredentialStoreService } from '../../services/credential/credential-store.service.js';
18
+ import { LoggerService } from '../../services/core/logger.service.js';
19
+ import { GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_REDIRECT_URI, GOOGLE_OAUTH_AUTH_BASE, DEFAULT_GOOGLE_SCOPES, } from '../../config/oauth.config.js';
20
+ import { fetchGoogleAccountEmail } from '../../utils/google-userinfo.utils.js';
21
+ const logger = LoggerService.getInstance().createComponentLogger('GoogleOAuthController');
22
+ /**
23
+ * Default access-token lifetime to assume when Google does not return
24
+ * `expiry_date` on the credentials JSON (1h matches Google's typical
25
+ * access-token TTL).
26
+ */
27
+ const DEFAULT_ACCESS_TOKEN_TTL_MS = 3600_000;
28
+ /**
29
+ * POST /api/credentials/oauth/google/start
30
+ *
31
+ * Build a Google OAuth URL that the caller can send to a remote user (via
32
+ * Slack, email, etc.). The URL opens on the user's device, they sign in,
33
+ * and the cloud function returns a page showing the credentials JSON for
34
+ * the user to copy back.
35
+ *
36
+ * Body: `{ scopes?: string[] }` — optional scope override
37
+ * Returns: `{ success, data: { authUrl } }`
38
+ */
39
+ export async function startGoogleOAuth(req, res, _next) {
40
+ try {
41
+ const scopesOverride = req.body?.scopes ?? undefined;
42
+ const scopes = scopesOverride && scopesOverride.length > 0
43
+ ? scopesOverride
44
+ : DEFAULT_GOOGLE_SCOPES;
45
+ // state payload tells the cloud function to render the manual/copy-paste
46
+ // page (instead of redirecting to a localhost URI, which this flow doesn't
47
+ // use).
48
+ const statePayload = { manual: true };
49
+ const state = Buffer.from(JSON.stringify(statePayload)).toString('base64');
50
+ const params = new URLSearchParams({
51
+ client_id: GOOGLE_OAUTH_CLIENT_ID,
52
+ redirect_uri: GOOGLE_OAUTH_REDIRECT_URI,
53
+ response_type: 'code',
54
+ scope: scopes.join(' '),
55
+ state,
56
+ access_type: 'offline',
57
+ prompt: 'consent',
58
+ });
59
+ const authUrl = `${GOOGLE_OAUTH_AUTH_BASE}?${params.toString()}`;
60
+ res.json({ success: true, data: { authUrl } });
61
+ }
62
+ catch (err) {
63
+ logger.error('startGoogleOAuth failed', { err });
64
+ res.status(500).json({
65
+ success: false,
66
+ error: err instanceof Error ? err.message : 'Failed to build OAuth URL',
67
+ });
68
+ }
69
+ }
70
+ /**
71
+ * POST /api/credentials/oauth/google/complete
72
+ *
73
+ * Accept the credentials JSON the user copied from the OAuth success page,
74
+ * verify it, fetch the account email, and save as a new Crewly credential.
75
+ *
76
+ * Body: `{ name: string, credentialsJson: string | object }`
77
+ * Returns: `{ success, data: CredentialRegistryEntry }`
78
+ */
79
+ export async function completeGoogleOAuth(req, res, _next) {
80
+ try {
81
+ const { name, credentialsJson } = (req.body ?? {});
82
+ if (!name || !credentialsJson) {
83
+ res.status(400).json({
84
+ success: false,
85
+ error: 'Missing required fields: name, credentialsJson',
86
+ });
87
+ return;
88
+ }
89
+ const parsed = parseCredentialsJson(credentialsJson);
90
+ if (!parsed.ok) {
91
+ res.status(400).json({ success: false, error: parsed.error });
92
+ return;
93
+ }
94
+ const accessToken = parsed.value.access_token;
95
+ const refreshToken = parsed.value.refresh_token;
96
+ const scope = parsed.value.scope;
97
+ const tokenType = parsed.value.token_type ?? 'Bearer';
98
+ const expiryDate = parsed.value.expiry_date;
99
+ if (!accessToken || !refreshToken) {
100
+ res.status(400).json({
101
+ success: false,
102
+ error: 'credentialsJson is missing access_token or refresh_token. Make sure you copied the entire JSON block.',
103
+ });
104
+ return;
105
+ }
106
+ const accountEmail = await fetchGoogleAccountEmail(accessToken);
107
+ const scopes = typeof scope === 'string' ? scope.split(' ').filter(Boolean) : [];
108
+ const cred = await getCredentialStoreService().addOAuth({
109
+ name,
110
+ provider: 'google',
111
+ helper: 'gemini-cli-workspace',
112
+ payload: {
113
+ type: 'google-oauth',
114
+ accessToken,
115
+ refreshToken,
116
+ tokenType: tokenType,
117
+ expiresAt: expiryDate ?? Date.now() + DEFAULT_ACCESS_TOKEN_TTL_MS,
118
+ scopes,
119
+ accountEmail,
120
+ clientId: GOOGLE_OAUTH_CLIENT_ID,
121
+ },
122
+ });
123
+ logger.info('Completed headless Google OAuth', {
124
+ id: cred.id,
125
+ accountEmail,
126
+ });
127
+ res.status(201).json({ success: true, data: cred });
128
+ }
129
+ catch (err) {
130
+ logger.error('completeGoogleOAuth failed', { err });
131
+ res.status(500).json({
132
+ success: false,
133
+ error: err instanceof Error ? err.message : 'Failed to save credential',
134
+ });
135
+ }
136
+ }
137
+ /**
138
+ * Normalize `credentialsJson` to a parsed object. Accepts either a JSON
139
+ * string or an already-parsed object. Returns a discriminated result so
140
+ * callers can surface precise 400 messages to the user.
141
+ */
142
+ function parseCredentialsJson(input) {
143
+ if (typeof input === 'string') {
144
+ try {
145
+ return { ok: true, value: JSON.parse(input) };
146
+ }
147
+ catch {
148
+ return {
149
+ ok: false,
150
+ error: 'credentialsJson is not valid JSON. Paste the JSON block from the "Success! Credentials Ready" page exactly as shown.',
151
+ };
152
+ }
153
+ }
154
+ if (typeof input === 'object' && input !== null) {
155
+ return { ok: true, value: input };
156
+ }
157
+ return {
158
+ ok: false,
159
+ error: 'credentialsJson must be a JSON string or object',
160
+ };
161
+ }
162
+ //# sourceMappingURL=google-oauth.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-oauth.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/google-oauth.controller.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skill.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/skill/skill.controller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkEH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAgcxB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"skill.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/skill/skill.controller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkEH,QAAA,MAAM,MAAM,4CAAW,CAAC;AAicxB,eAAe,MAAM,CAAC"}
@@ -375,6 +375,7 @@ router.post('/:id/execute', async (req, res, next) => {
375
375
  taskId: req.body.taskId,
376
376
  userInput: req.body.userInput,
377
377
  metadata: req.body.metadata,
378
+ credentialBindings: req.body.credentialBindings,
378
379
  };
379
380
  const executor = getSkillExecutorService();
380
381
  const result = await executor.executeSkill(req.params.id, context);
@@ -1 +1 @@
1
- {"version":3,"file":"skill.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/skill/skill.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/skill/skill.controller.ts"],"names":[],"mappings":"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"}