crewly 1.6.0 → 1.6.2

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 (448) hide show
  1. package/config/roles/orchestrator/fragments/role-boundary.md +4 -1
  2. package/config/roles/orchestrator/prompt.md +53 -0
  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/execute.sh +0 -19
  6. package/config/skills/agent/core/get-my-active-work/SKILL.md +101 -0
  7. package/config/skills/agent/core/get-my-active-work/execute.sh +122 -0
  8. package/config/skills/agent/core/list-my-followups/execute.sh +0 -19
  9. package/config/skills/agent/core/record-learning/SKILL.md +29 -0
  10. package/config/skills/agent/core/reply-channel/SKILL.md +41 -0
  11. package/config/skills/agent/core/reply-channel/execute.sh +165 -0
  12. package/config/skills/agent/core/reply-channel/execute.test.sh +148 -0
  13. package/config/skills/agent/core/schedule-followup/execute.sh +0 -19
  14. package/config/skills/agent/core/watch-for-event/execute.sh +0 -19
  15. package/config/skills/agent/remote-browser/execute.sh +296 -14
  16. package/config/skills/agent/remote-browser/execute.test.sh +482 -0
  17. package/config/skills/orchestrator/credential-manager/execute.test.sh +88 -0
  18. package/config/skills/orchestrator/send-message/SKILL.md +30 -7
  19. package/config/skills/orchestrator/team-health-scan/SKILL.md +98 -0
  20. package/config/skills/orchestrator/team-health-scan/execute.sh +44 -0
  21. package/config/skills/registry.json +62 -1
  22. package/config/sops/developer/git-workflow.md +38 -3
  23. package/dist/backend/backend/src/config/oauth.config.d.ts +33 -0
  24. package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -0
  25. package/dist/backend/backend/src/config/oauth.config.js +45 -0
  26. package/dist/backend/backend/src/config/oauth.config.js.map +1 -0
  27. package/dist/backend/backend/src/constants.d.ts +69 -1
  28. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  29. package/dist/backend/backend/src/constants.js +69 -2
  30. package/dist/backend/backend/src/constants.js.map +1 -1
  31. package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts +53 -0
  32. package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts.map +1 -0
  33. package/dist/backend/backend/src/controllers/active-work/active-work.controller.js +92 -0
  34. package/dist/backend/backend/src/controllers/active-work/active-work.controller.js.map +1 -0
  35. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +18 -1
  37. package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +68 -0
  39. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  40. package/dist/backend/backend/src/controllers/browser/browser.controller.js +233 -5
  41. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  42. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/browser/browser.routes.js +10 -1
  44. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/chat/chat.controller.js +8 -3
  47. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  48. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +132 -0
  49. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -0
  50. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +401 -0
  51. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -0
  52. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +29 -0
  53. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -0
  54. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +39 -0
  55. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -0
  56. package/dist/backend/backend/src/controllers/chat-v2/index.d.ts +8 -0
  57. package/dist/backend/backend/src/controllers/chat-v2/index.d.ts.map +1 -0
  58. package/dist/backend/backend/src/controllers/chat-v2/index.js +8 -0
  59. package/dist/backend/backend/src/controllers/chat-v2/index.js.map +1 -0
  60. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +0 -26
  61. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -1
  62. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +47 -184
  63. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -1
  64. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -1
  65. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +2 -1
  66. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -1
  67. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts +40 -0
  68. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -0
  69. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +162 -0
  70. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -0
  71. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts +13 -13
  72. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts.map +1 -1
  73. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js +74 -234
  74. package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js.map +1 -1
  75. package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
  76. package/dist/backend/backend/src/controllers/request/request.controller.js +4 -6
  77. package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
  78. package/dist/backend/backend/src/controllers/skill/skill.controller.d.ts.map +1 -1
  79. package/dist/backend/backend/src/controllers/skill/skill.controller.js +1 -0
  80. package/dist/backend/backend/src/controllers/skill/skill.controller.js.map +1 -1
  81. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +43 -0
  82. package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
  83. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +200 -72
  84. package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
  85. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  86. package/dist/backend/backend/src/controllers/team/team.controller.js +46 -0
  87. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  88. package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts +59 -0
  89. package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts.map +1 -0
  90. package/dist/backend/backend/src/controllers/team-health/team-health.controller.js +127 -0
  91. package/dist/backend/backend/src/controllers/team-health/team-health.controller.js.map +1 -0
  92. package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts +13 -0
  93. package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts.map +1 -0
  94. package/dist/backend/backend/src/controllers/team-health/team-health.routes.js +20 -0
  95. package/dist/backend/backend/src/controllers/team-health/team-health.routes.js.map +1 -0
  96. package/dist/backend/backend/src/index.d.ts +9 -0
  97. package/dist/backend/backend/src/index.d.ts.map +1 -1
  98. package/dist/backend/backend/src/index.js +256 -4
  99. package/dist/backend/backend/src/index.js.map +1 -1
  100. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  101. package/dist/backend/backend/src/routes/api.routes.js +43 -6
  102. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  103. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +498 -0
  104. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
  105. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +759 -0
  106. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
  107. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +25 -0
  108. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/agent/agent-registration.service.js +193 -57
  110. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  111. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +9 -2
  112. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +35 -2
  114. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
  115. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +8 -2
  116. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  117. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +1 -0
  118. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  119. package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/agent/tmux-command.service.js +2 -1
  121. package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
  122. package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
  124. package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
  125. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +148 -3
  126. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +241 -2
  128. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -0
  131. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  132. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
  133. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +30 -2
  134. package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
  135. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  136. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +17 -0
  137. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  138. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
  139. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
  140. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
  141. package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
  142. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +161 -0
  143. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  144. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +382 -2
  145. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  146. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +105 -0
  147. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  148. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +232 -13
  149. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  150. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +178 -0
  151. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
  152. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +254 -0
  153. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
  154. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
  155. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
  156. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
  157. package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
  158. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts +25 -0
  159. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts.map +1 -0
  160. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js +23 -0
  161. package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js.map +1 -0
  162. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +254 -0
  163. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
  164. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +467 -0
  165. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
  166. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
  167. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
  168. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
  169. package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
  170. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts +43 -0
  171. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts.map +1 -0
  172. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js +54 -0
  173. package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js.map +1 -0
  174. package/dist/backend/backend/src/services/chat-v2/config.d.ts +100 -0
  175. package/dist/backend/backend/src/services/chat-v2/config.d.ts.map +1 -0
  176. package/dist/backend/backend/src/services/chat-v2/config.js +174 -0
  177. package/dist/backend/backend/src/services/chat-v2/config.js.map +1 -0
  178. package/dist/backend/backend/src/services/chat-v2/index.d.ts +11 -0
  179. package/dist/backend/backend/src/services/chat-v2/index.d.ts.map +1 -0
  180. package/dist/backend/backend/src/services/chat-v2/index.js +12 -0
  181. package/dist/backend/backend/src/services/chat-v2/index.js.map +1 -0
  182. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +114 -0
  183. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
  184. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +194 -0
  185. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
  186. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +100 -0
  187. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
  188. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +351 -0
  189. package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
  190. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +132 -0
  191. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
  192. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +281 -0
  193. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
  194. package/dist/backend/backend/src/services/chat-v2/types.d.ts +295 -0
  195. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -0
  196. package/dist/backend/backend/src/services/chat-v2/types.js +61 -0
  197. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -0
  198. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts +113 -0
  199. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts.map +1 -0
  200. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js +179 -0
  201. package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js.map +1 -0
  202. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts +131 -0
  203. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts.map +1 -0
  204. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js +227 -0
  205. package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js.map +1 -0
  206. package/dist/backend/backend/src/services/core/config.service.js +3 -3
  207. package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
  208. package/dist/backend/backend/src/services/core/storage.service.d.ts +7 -0
  209. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  210. package/dist/backend/backend/src/services/core/storage.service.js +15 -0
  211. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  212. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +4 -16
  213. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  214. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +7 -28
  215. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  216. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +69 -1
  217. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  218. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +118 -0
  219. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  220. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +275 -0
  221. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -0
  222. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +736 -0
  223. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -0
  224. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
  225. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +18 -2
  226. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
  227. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
  228. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  229. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +123 -29
  230. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  231. package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
  232. package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
  233. package/dist/backend/backend/src/services/knowledge/learnings-index.service.js +304 -0
  234. package/dist/backend/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
  235. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  236. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +24 -4
  237. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  238. package/dist/backend/backend/src/services/mcp-server.d.ts +46 -2
  239. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -1
  240. package/dist/backend/backend/src/services/mcp-server.js +216 -211
  241. package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
  242. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +254 -0
  243. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts.map +1 -0
  244. package/dist/backend/backend/src/services/mcp-tool-definitions.js +285 -0
  245. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -0
  246. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +174 -0
  247. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -0
  248. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +375 -0
  249. package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -0
  250. package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts +97 -0
  251. package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts.map +1 -0
  252. package/dist/backend/backend/src/services/memory/learning-format.validator.js +209 -0
  253. package/dist/backend/backend/src/services/memory/learning-format.validator.js.map +1 -0
  254. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +1 -1
  255. package/dist/backend/backend/src/services/memory/vector-store.service.js +19 -4
  256. package/dist/backend/backend/src/services/memory/vector-store.service.js.map +1 -1
  257. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts +16 -5
  258. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts.map +1 -1
  259. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js +32 -5
  260. package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js.map +1 -1
  261. package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts +157 -0
  262. package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts.map +1 -0
  263. package/dist/backend/backend/src/services/onboarding/onboarding.service.js +229 -0
  264. package/dist/backend/backend/src/services/onboarding/onboarding.service.js.map +1 -0
  265. package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts +141 -0
  266. package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts.map +1 -0
  267. package/dist/backend/backend/src/services/onboarding/onboarding.types.js +18 -0
  268. package/dist/backend/backend/src/services/onboarding/onboarding.types.js.map +1 -0
  269. package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -1
  270. package/dist/backend/backend/src/services/pr-review/pr-review.service.js +1 -1
  271. package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -1
  272. package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
  273. package/dist/backend/backend/src/services/project/task.service.js +5 -0
  274. package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
  275. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts +41 -0
  276. package/dist/backend/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  277. package/dist/backend/backend/src/services/skill/skill-executor.service.js +136 -7
  278. package/dist/backend/backend/src/services/skill/skill-executor.service.js.map +1 -1
  279. package/dist/backend/backend/src/services/skill/skill.service.d.ts.map +1 -1
  280. package/dist/backend/backend/src/services/skill/skill.service.js +1 -0
  281. package/dist/backend/backend/src/services/skill/skill.service.js.map +1 -1
  282. package/dist/backend/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -1
  283. package/dist/backend/backend/src/services/slack/cross-machine-message.service.js +17 -1
  284. package/dist/backend/backend/src/services/slack/cross-machine-message.service.js.map +1 -1
  285. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +39 -1
  286. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  287. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +158 -26
  288. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  289. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +248 -6
  290. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  291. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +531 -51
  292. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  293. package/dist/backend/backend/src/services/team-health/index.d.ts +16 -0
  294. package/dist/backend/backend/src/services/team-health/index.d.ts.map +1 -0
  295. package/dist/backend/backend/src/services/team-health/index.js +16 -0
  296. package/dist/backend/backend/src/services/team-health/index.js.map +1 -0
  297. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts +52 -0
  298. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -0
  299. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +161 -0
  300. package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -0
  301. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts +53 -0
  302. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts.map +1 -0
  303. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js +88 -0
  304. package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js.map +1 -0
  305. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts +44 -0
  306. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts.map +1 -0
  307. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js +83 -0
  308. package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js.map +1 -0
  309. package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts +92 -0
  310. package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts.map +1 -0
  311. package/dist/backend/backend/src/services/team-health/team-health-alert-router.js +328 -0
  312. package/dist/backend/backend/src/services/team-health/team-health-alert-router.js.map +1 -0
  313. package/dist/backend/backend/src/services/team-health/team-health-config.d.ts +41 -0
  314. package/dist/backend/backend/src/services/team-health/team-health-config.d.ts.map +1 -0
  315. package/dist/backend/backend/src/services/team-health/team-health-config.js +213 -0
  316. package/dist/backend/backend/src/services/team-health/team-health-config.js.map +1 -0
  317. package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts +46 -0
  318. package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts.map +1 -0
  319. package/dist/backend/backend/src/services/team-health/team-health-detector.js +347 -0
  320. package/dist/backend/backend/src/services/team-health/team-health-detector.js.map +1 -0
  321. package/dist/backend/backend/src/services/team-health/team-health-types.d.ts +154 -0
  322. package/dist/backend/backend/src/services/team-health/team-health-types.d.ts.map +1 -0
  323. package/dist/backend/backend/src/services/team-health/team-health-types.js +94 -0
  324. package/dist/backend/backend/src/services/team-health/team-health-types.js.map +1 -0
  325. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts +111 -0
  326. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts.map +1 -0
  327. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js +226 -0
  328. package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js.map +1 -0
  329. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +148 -0
  330. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -0
  331. package/dist/backend/backend/src/services/v3/mission-reminder.service.js +545 -0
  332. package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -0
  333. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +499 -0
  334. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
  335. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +1105 -0
  336. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
  337. package/dist/backend/backend/src/services/v3/request.service.d.ts +22 -0
  338. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  339. package/dist/backend/backend/src/services/v3/request.service.js +71 -0
  340. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  341. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +1 -0
  342. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  343. package/dist/backend/backend/src/services/v3/v3-data.service.js +22 -6
  344. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  345. package/dist/backend/backend/src/types/event-bus.types.d.ts +19 -1
  346. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  347. package/dist/backend/backend/src/types/event-bus.types.js +43 -0
  348. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  349. package/dist/backend/backend/src/types/index.d.ts +22 -1
  350. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  351. package/dist/backend/backend/src/types/index.js.map +1 -1
  352. package/dist/backend/backend/src/types/review-reason.types.d.ts +63 -0
  353. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -0
  354. package/dist/backend/backend/src/types/review-reason.types.js +50 -0
  355. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -0
  356. package/dist/backend/backend/src/types/skill.types.d.ts +9 -0
  357. package/dist/backend/backend/src/types/skill.types.d.ts.map +1 -1
  358. package/dist/backend/backend/src/types/skill.types.js.map +1 -1
  359. package/dist/backend/backend/src/types/slack.types.d.ts +4 -1
  360. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  361. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  362. package/dist/backend/backend/src/types/v2/mission.types.d.ts +18 -0
  363. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  364. package/dist/backend/backend/src/types/v2/mission.types.js +1 -0
  365. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  366. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  367. package/dist/backend/backend/src/types/v2/work-item.types.js +25 -1
  368. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  369. package/dist/backend/backend/src/utils/google-userinfo.utils.d.ts +41 -0
  370. package/dist/backend/backend/src/utils/google-userinfo.utils.d.ts.map +1 -0
  371. package/dist/backend/backend/src/utils/google-userinfo.utils.js +44 -0
  372. package/dist/backend/backend/src/utils/google-userinfo.utils.js.map +1 -0
  373. package/dist/backend/backend/src/utils/team.utils.d.ts +38 -0
  374. package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -0
  375. package/dist/backend/backend/src/utils/team.utils.js +45 -0
  376. package/dist/backend/backend/src/utils/team.utils.js.map +1 -0
  377. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +195 -0
  378. package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -0
  379. package/dist/backend/backend/src/websocket/chat-v2.gateway.js +401 -0
  380. package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -0
  381. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +37 -2
  382. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  383. package/dist/backend/backend/src/websocket/terminal.gateway.js +106 -5
  384. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  385. package/dist/cli/backend/src/config/oauth.config.d.ts +33 -0
  386. package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -0
  387. package/dist/cli/backend/src/config/oauth.config.js +45 -0
  388. package/dist/cli/backend/src/config/oauth.config.js.map +1 -0
  389. package/dist/cli/backend/src/constants.d.ts +69 -1
  390. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  391. package/dist/cli/backend/src/constants.js +69 -2
  392. package/dist/cli/backend/src/constants.js.map +1 -1
  393. package/dist/cli/backend/src/services/core/config.service.js +3 -3
  394. package/dist/cli/backend/src/services/core/config.service.js.map +1 -1
  395. package/dist/cli/backend/src/services/core/storage.service.d.ts +7 -0
  396. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  397. package/dist/cli/backend/src/services/core/storage.service.js +15 -0
  398. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  399. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +4 -16
  400. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  401. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +7 -28
  402. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  403. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
  404. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +18 -2
  405. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
  406. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
  407. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
  408. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +123 -29
  409. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
  410. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
  411. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +24 -4
  412. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
  413. package/dist/cli/backend/src/services/mcp-server.d.ts +46 -2
  414. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -1
  415. package/dist/cli/backend/src/services/mcp-server.js +216 -211
  416. package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
  417. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +254 -0
  418. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts.map +1 -0
  419. package/dist/cli/backend/src/services/mcp-tool-definitions.js +285 -0
  420. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -0
  421. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +18 -0
  422. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -1
  423. package/dist/cli/backend/src/services/skill/skill-executor.service.js +7 -9
  424. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -1
  425. package/dist/cli/backend/src/types/index.d.ts +22 -1
  426. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  427. package/dist/cli/backend/src/types/index.js.map +1 -1
  428. package/dist/cli/backend/src/types/skill.types.d.ts +9 -0
  429. package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -1
  430. package/dist/cli/backend/src/types/skill.types.js.map +1 -1
  431. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  432. package/dist/cli/backend/src/types/v2/work-item.types.js +25 -1
  433. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  434. package/dist/cli/backend/src/utils/google-userinfo.utils.d.ts +41 -0
  435. package/dist/cli/backend/src/utils/google-userinfo.utils.d.ts.map +1 -0
  436. package/dist/cli/backend/src/utils/google-userinfo.utils.js +44 -0
  437. package/dist/cli/backend/src/utils/google-userinfo.utils.js.map +1 -0
  438. package/frontend/dist/assets/{index-9e6d97d1.js → index-7a4e7df5.js} +328 -326
  439. package/frontend/dist/assets/index-b7e59b2b.css +33 -0
  440. package/frontend/dist/index.html +2 -2
  441. package/package.json +2 -1
  442. package/config/skills/orchestrator/recall/SKILL.md +0 -47
  443. package/config/skills/orchestrator/recall/execute.sh +0 -13
  444. package/config/skills/orchestrator/record-learning/SKILL.md +0 -47
  445. package/config/skills/orchestrator/record-learning/execute.sh +0 -13
  446. package/config/skills/orchestrator/remember/SKILL.md +0 -55
  447. package/config/skills/orchestrator/remember/execute.sh +0 -15
  448. package/frontend/dist/assets/index-6aaa0630.css +0 -33
@@ -12,10 +12,22 @@
12
12
  */
13
13
  import { getCredentialStoreService, } from '../../services/credential/credential-store.service.js';
14
14
  import { GeminiCliWorkspaceHelper } from '../../services/credential/helpers/gemini-cli-workspace.helper.js';
15
- import { CredentialNotFoundError, } from '../../types/credential.types.js';
15
+ import { CredentialNotFoundError } from '../../types/credential.types.js';
16
16
  import { LoggerService } from '../../services/core/logger.service.js';
17
17
  const logger = LoggerService.getInstance().createComponentLogger('CredentialsController');
18
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
+ // ============================================================================
19
31
  // Helper singleton (lazy)
20
32
  // ============================================================================
21
33
  let geminiHelper = null;
@@ -68,20 +80,22 @@ export async function getCredentialById(req, res, next) {
68
80
  */
69
81
  export async function addApiKey(req, res, next) {
70
82
  try {
71
- const { name, provider, value } = (req.body ?? {});
72
- if (!name || !provider || !value) {
83
+ const body = (req.body ?? {});
84
+ if (!isNonEmptyString(body.name) ||
85
+ !isNonEmptyString(body.provider) ||
86
+ !isNonEmptyString(body.value)) {
73
87
  res.status(400).json({
74
88
  success: false,
75
- error: 'Missing required fields: name, provider, value',
89
+ error: 'Missing or invalid required fields: name (string), provider (string), value (string)',
76
90
  });
77
91
  return;
78
92
  }
79
93
  const cred = await getCredentialStoreService().addApiKey({
80
- name,
81
- provider,
82
- value,
94
+ name: body.name,
95
+ provider: body.provider,
96
+ value: body.value,
83
97
  });
84
- logger.info('Added api-key credential', { id: cred.id, provider });
98
+ logger.info('Added api-key credential', { id: cred.id, provider: body.provider });
85
99
  res.status(201).json({ success: true, data: cred });
86
100
  }
87
101
  catch (err) {
@@ -95,12 +109,29 @@ export async function addApiKey(req, res, next) {
95
109
  */
96
110
  export async function updateCredentialHandler(req, res, next) {
97
111
  try {
98
- const { name, status } = (req.body ?? {});
112
+ const body = (req.body ?? {});
99
113
  const patch = {};
100
- if (name !== undefined)
101
- patch.name = name;
102
- if (status !== undefined)
103
- patch.status = status;
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
+ }
104
135
  if (Object.keys(patch).length === 0) {
105
136
  res.status(400).json({
106
137
  success: false,
@@ -191,175 +222,7 @@ export async function clearGeminiCliExtensionFile(_req, res, next) {
191
222
  next(err);
192
223
  }
193
224
  }
194
- // ============================================================================
195
- // Headless OAuth flow for remote users (orchestrator over Slack, etc.)
196
- // ============================================================================
197
- /**
198
- * OAuth client + endpoint details lifted from the Gemini CLI Workspace
199
- * extension's `workspace-server/src/utils/config.ts`. Using the same
200
- * client_id + redirect_uri lets us piggyback on their published OAuth app
201
- * (so grants don't hit the 7-day testing-mode expiry).
202
- */
203
- const GOOGLE_OAUTH_CLIENT_ID = '338689075775-o75k922vn5fdl18qergr96rp8g63e4d7.apps.googleusercontent.com';
204
- const GOOGLE_OAUTH_REDIRECT_URI = 'https://google-workspace-extension.geminicli.com';
205
- const GOOGLE_OAUTH_AUTH_BASE = 'https://accounts.google.com/o/oauth2/v2/auth';
206
- /**
207
- * Default scopes — a broad Workspace set covering common needs. Agents
208
- * can override at start time via the request body.
209
- */
210
- const DEFAULT_GOOGLE_SCOPES = [
211
- 'openid',
212
- 'https://www.googleapis.com/auth/userinfo.email',
213
- 'https://www.googleapis.com/auth/userinfo.profile',
214
- 'https://www.googleapis.com/auth/gmail.readonly',
215
- 'https://www.googleapis.com/auth/gmail.send',
216
- 'https://www.googleapis.com/auth/drive.readonly',
217
- 'https://www.googleapis.com/auth/drive.file',
218
- 'https://www.googleapis.com/auth/documents.readonly',
219
- 'https://www.googleapis.com/auth/calendar.readonly',
220
- 'https://www.googleapis.com/auth/calendar.events',
221
- 'https://www.googleapis.com/auth/photoslibrary.readonly',
222
- ];
223
- /**
224
- * POST /api/credentials/oauth/google/start
225
- *
226
- * Build a Google OAuth URL that the caller can send to a remote user (via
227
- * Slack, email, etc.). The URL opens on the user's device, they sign in,
228
- * and the gemini-cli cloud function returns a page showing the credentials
229
- * JSON for the user to copy back.
230
- *
231
- * Body: { scopes?: string[] } (optional override)
232
- * Returns: { success, data: { authUrl } }
233
- */
234
- export async function startGoogleOAuth(req, res, _next) {
235
- try {
236
- const scopesOverride = req.body?.scopes ?? undefined;
237
- const scopes = scopesOverride && scopesOverride.length > 0
238
- ? scopesOverride
239
- : DEFAULT_GOOGLE_SCOPES;
240
- // State payload tells the cloud function to render the manual/copy-paste page
241
- // (instead of redirecting to a localhost URI, which this flow doesn't use).
242
- const statePayload = { manual: true };
243
- const state = Buffer.from(JSON.stringify(statePayload)).toString('base64');
244
- const params = new URLSearchParams({
245
- client_id: GOOGLE_OAUTH_CLIENT_ID,
246
- redirect_uri: GOOGLE_OAUTH_REDIRECT_URI,
247
- response_type: 'code',
248
- scope: scopes.join(' '),
249
- state,
250
- access_type: 'offline',
251
- prompt: 'consent',
252
- });
253
- const authUrl = `${GOOGLE_OAUTH_AUTH_BASE}?${params.toString()}`;
254
- res.json({ success: true, data: { authUrl } });
255
- }
256
- catch (err) {
257
- logger.error('startGoogleOAuth failed', { err });
258
- res.status(500).json({
259
- success: false,
260
- error: err instanceof Error ? err.message : 'Failed to build OAuth URL',
261
- });
262
- }
263
- }
264
- /**
265
- * POST /api/credentials/oauth/google/complete
266
- *
267
- * Accept the credentials JSON that the user copied from the OAuth success
268
- * page, verify it, fetch the account email, and save as a new Crewly
269
- * credential.
270
- *
271
- * Body: {
272
- * name: string,
273
- * credentialsJson: string | object (the JSON blob the user pasted)
274
- * }
275
- * Returns: { success, data: CredentialRegistryEntry }
276
- */
277
- export async function completeGoogleOAuth(req, res, _next) {
278
- try {
279
- const { name, credentialsJson } = (req.body ?? {});
280
- if (!name || !credentialsJson) {
281
- res.status(400).json({
282
- success: false,
283
- error: 'Missing required fields: name, credentialsJson',
284
- });
285
- return;
286
- }
287
- // Accept either a parsed object or a raw JSON string
288
- let parsed;
289
- if (typeof credentialsJson === 'string') {
290
- try {
291
- parsed = JSON.parse(credentialsJson);
292
- }
293
- catch {
294
- res.status(400).json({
295
- success: false,
296
- error: 'credentialsJson is not valid JSON. Paste the JSON block from the "Success! Credentials Ready" page exactly as shown.',
297
- });
298
- return;
299
- }
300
- }
301
- else if (typeof credentialsJson === 'object' && credentialsJson !== null) {
302
- parsed = credentialsJson;
303
- }
304
- else {
305
- res.status(400).json({
306
- success: false,
307
- error: 'credentialsJson must be a JSON string or object',
308
- });
309
- return;
310
- }
311
- const accessToken = parsed.access_token;
312
- const refreshToken = parsed.refresh_token;
313
- const scope = parsed.scope;
314
- const tokenType = parsed.token_type ?? 'Bearer';
315
- const expiryDate = parsed.expiry_date;
316
- if (!accessToken || !refreshToken) {
317
- res.status(400).json({
318
- success: false,
319
- error: 'credentialsJson is missing access_token or refresh_token. Make sure you copied the entire JSON block.',
320
- });
321
- return;
322
- }
323
- // Fetch account email from Google userinfo (best-effort)
324
- let accountEmail;
325
- try {
326
- const response = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', { headers: { Authorization: `Bearer ${accessToken}` } });
327
- if (response.ok) {
328
- const info = (await response.json());
329
- accountEmail = info.email;
330
- }
331
- }
332
- catch {
333
- // best-effort only — credential is still valid without accountEmail
334
- }
335
- const scopes = typeof scope === 'string' ? scope.split(' ').filter(Boolean) : [];
336
- const cred = await getCredentialStoreService().addOAuth({
337
- name,
338
- provider: 'google',
339
- helper: 'gemini-cli-workspace',
340
- payload: {
341
- type: 'google-oauth',
342
- accessToken,
343
- refreshToken,
344
- tokenType: tokenType,
345
- expiresAt: expiryDate ?? Date.now() + 3600_000,
346
- scopes,
347
- accountEmail,
348
- clientId: GOOGLE_OAUTH_CLIENT_ID,
349
- },
350
- });
351
- logger.info('Completed headless Google OAuth', {
352
- id: cred.id,
353
- accountEmail,
354
- });
355
- res.status(201).json({ success: true, data: cred });
356
- }
357
- catch (err) {
358
- logger.error('completeGoogleOAuth failed', { err });
359
- res.status(500).json({
360
- success: false,
361
- error: err instanceof Error ? err.message : 'Failed to save credential',
362
- });
363
- }
364
- }
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`.
365
228
  //# sourceMappingURL=credentials.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/credentials.controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/credentials/credentials.controller.ts"],"names":[],"mappings":"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"}
@@ -1 +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;AAajC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAiBhD"}
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"}
@@ -6,7 +6,8 @@
6
6
  * @module controllers/credentials/credentials.routes
7
7
  */
8
8
  import { Router } from 'express';
9
- import { listCredentials, getCredentialById, addApiKey, updateCredentialHandler, deleteCredentialHandler, importOAuthFromGeminiCli, clearGeminiCliExtensionFile, startGoogleOAuth, completeGoogleOAuth, } from './credentials.controller.js';
9
+ import { listCredentials, getCredentialById, addApiKey, updateCredentialHandler, deleteCredentialHandler, importOAuthFromGeminiCli, clearGeminiCliExtensionFile, } from './credentials.controller.js';
10
+ import { startGoogleOAuth, completeGoogleOAuth, } from './google-oauth.controller.js';
10
11
  /**
11
12
  * Create the credentials router.
12
13
  *
@@ -1 +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,EAC3B,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;;;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"}
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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"}
@@ -3,22 +3,22 @@
3
3
  *
4
4
  * Provides session lifecycle management for KR3 sub-5-minute onboarding:
5
5
  * POST /api/onboarding/sessions — Create a new session
6
- * GET /api/onboarding/sessions — List all sessions
7
- * GET /api/onboarding/sessions/:id — Get session by ID
8
- * PUT /api/onboarding/sessions/:id — Update session (website URL, answers)
9
- * POST /api/onboarding/sessions/:id/prefill — Store AI-extracted prefill data
10
- * POST /api/onboarding/sessions/:id/approve — Approve reviewed profile
11
- * POST /api/onboarding/sessions/:id/complete Complete onboarding (generate guide)
12
- * GET /api/onboarding/questions — Get all questionnaire questions
13
- * POST /api/onboarding/provision — Provision a team from onboarding discovery
6
+ * GET /api/onboarding/sessions — List the caller's sessions
7
+ * GET /api/onboarding/sessions/:id — Get session by ID (owner-scoped)
8
+ * PUT /api/onboarding/sessions/:id — Update session (owner-scoped)
9
+ * POST /api/onboarding/sessions/:id/prefill — Store prefill data (owner-scoped)
10
+ * POST /api/onboarding/sessions/:id/approve — Approve profile (owner-scoped)
11
+ * POST /api/onboarding/provision Provision final team (owner-scoped)
12
+ *
13
+ * Every endpoint runs behind `requireAuth` so each request carries
14
+ * `req.user.userId` (the authenticated principal). The principal is
15
+ * forwarded to {@link OnboardingService} as the owner scope for every
16
+ * read and mutation, which closes the cross-tenant leak originally
17
+ * introduced in `b29de620` and surfaced by Arch's review of PR #347
18
+ * (item N1, Phase E pre-beta).
14
19
  *
15
20
  * @module controllers/onboarding/onboarding.routes
16
21
  */
17
22
  import { Router } from 'express';
18
- /**
19
- * Create the onboarding router with all session management endpoints.
20
- *
21
- * @returns Express Router for /api/onboarding
22
- */
23
23
  export declare function createOnboardingRouter(): Router;
24
24
  //# sourceMappingURL=onboarding.routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/onboarding/onboarding.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAM9D;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAuW/C"}
1
+ {"version":3,"file":"onboarding.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/onboarding/onboarding.routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAoB9D,wBAAgB,sBAAsB,IAAI,MAAM,CA+J/C"}