crewly 1.0.6 → 1.0.8

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 (321) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +146 -40
  3. package/config/roles/architect/prompt.md +11 -0
  4. package/config/roles/backend-developer/prompt.md +11 -0
  5. package/config/roles/designer/prompt.md +11 -0
  6. package/config/roles/developer/prompt.md +18 -4
  7. package/config/roles/frontend-developer/prompt.md +11 -0
  8. package/config/roles/fullstack-dev/prompt.md +11 -0
  9. package/config/roles/generalist/prompt.md +11 -0
  10. package/config/roles/orchestrator/prompt.md +53 -10
  11. package/config/roles/product-manager/prompt.md +18 -4
  12. package/config/roles/qa/prompt.md +11 -0
  13. package/config/roles/qa-engineer/prompt.md +11 -0
  14. package/config/roles/sales/prompt.md +11 -0
  15. package/config/roles/support/prompt.md +11 -0
  16. package/config/roles/tpm/prompt.md +11 -0
  17. package/config/skills/orchestrator/complete-task/execute.sh +1 -0
  18. package/config/templates/agent-claude-md.md +16 -0
  19. package/config/templates/research-team.json +22 -0
  20. package/config/templates/startup-team.json +22 -0
  21. package/config/templates/web-dev-team.json +22 -0
  22. package/dist/backend/backend/src/constants.d.ts +61 -1
  23. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  24. package/dist/backend/backend/src/constants.js +65 -7
  25. package/dist/backend/backend/src/constants.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/slack/slack.controller.js +7 -0
  28. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  29. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +7 -0
  30. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
  31. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +174 -4
  32. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
  33. package/dist/backend/backend/src/index.d.ts.map +1 -1
  34. package/dist/backend/backend/src/index.js +34 -0
  35. package/dist/backend/backend/src/index.js.map +1 -1
  36. package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -1
  37. package/dist/backend/backend/src/routes/modules/task-management.routes.js +2 -0
  38. package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -1
  39. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +8 -0
  40. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/agent/agent-registration.service.js +75 -17
  42. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  43. package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +222 -0
  44. package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -0
  45. package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +621 -0
  46. package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -0
  47. package/dist/backend/backend/src/services/index.d.ts +3 -0
  48. package/dist/backend/backend/src/services/index.d.ts.map +1 -1
  49. package/dist/backend/backend/src/services/index.js +5 -0
  50. package/dist/backend/backend/src/services/index.js.map +1 -1
  51. package/dist/backend/backend/src/services/mcp-client.d.ts +233 -0
  52. package/dist/backend/backend/src/services/mcp-client.d.ts.map +1 -0
  53. package/dist/backend/backend/src/services/mcp-client.js +297 -0
  54. package/dist/backend/backend/src/services/mcp-client.js.map +1 -0
  55. package/dist/backend/backend/src/services/mcp-server.d.ts +167 -0
  56. package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -0
  57. package/dist/backend/backend/src/services/mcp-server.js +586 -0
  58. package/dist/backend/backend/src/services/mcp-server.js.map +1 -0
  59. package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +2 -0
  60. package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/messaging/message-queue.service.js +6 -1
  62. package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +10 -0
  64. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +94 -38
  66. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  67. package/dist/backend/backend/src/services/quality/index.d.ts +1 -0
  68. package/dist/backend/backend/src/services/quality/index.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/quality/index.js +1 -0
  70. package/dist/backend/backend/src/services/quality/index.js.map +1 -1
  71. package/dist/backend/backend/src/services/quality/task-output-validator.service.d.ts +84 -0
  72. package/dist/backend/backend/src/services/quality/task-output-validator.service.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/quality/task-output-validator.service.js +163 -0
  74. package/dist/backend/backend/src/services/quality/task-output-validator.service.js.map +1 -0
  75. package/dist/backend/backend/src/services/runtime-adapter.d.ts +234 -0
  76. package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -0
  77. package/dist/backend/backend/src/services/runtime-adapter.js +180 -0
  78. package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -0
  79. package/dist/backend/backend/src/services/slack/slack-credentials.service.d.ts +33 -0
  80. package/dist/backend/backend/src/services/slack/slack-credentials.service.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/slack/slack-credentials.service.js +103 -0
  82. package/dist/backend/backend/src/services/slack/slack-credentials.service.js.map +1 -0
  83. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +9 -1
  84. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/slack/slack-initializer.js +31 -2
  86. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  87. package/dist/backend/backend/src/types/event-bus.types.d.ts +2 -2
  88. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  89. package/dist/backend/backend/src/types/event-bus.types.js +2 -0
  90. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  91. package/dist/backend/backend/src/types/index.d.ts +1 -0
  92. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  93. package/dist/backend/backend/src/types/index.js +2 -0
  94. package/dist/backend/backend/src/types/index.js.map +1 -1
  95. package/dist/backend/backend/src/types/messaging.types.d.ts +9 -6
  96. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  97. package/dist/backend/backend/src/types/messaging.types.js +10 -3
  98. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  99. package/dist/backend/backend/src/types/task-output.types.d.ts +78 -0
  100. package/dist/backend/backend/src/types/task-output.types.d.ts.map +1 -0
  101. package/dist/backend/backend/src/types/task-output.types.js +27 -0
  102. package/dist/backend/backend/src/types/task-output.types.js.map +1 -0
  103. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +13 -0
  104. package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
  105. package/dist/backend/backend/src/websocket/terminal.gateway.js +12 -0
  106. package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
  107. package/dist/cli/backend/src/constants.d.ts +751 -0
  108. package/dist/cli/backend/src/constants.d.ts.map +1 -0
  109. package/dist/cli/backend/src/constants.js +550 -0
  110. package/dist/cli/backend/src/constants.js.map +1 -0
  111. package/dist/cli/backend/src/models/Project.d.ts +18 -0
  112. package/dist/cli/backend/src/models/Project.d.ts.map +1 -0
  113. package/dist/cli/backend/src/models/Project.js +70 -0
  114. package/dist/cli/backend/src/models/Project.js.map +1 -0
  115. package/dist/cli/backend/src/models/ScheduledMessage.d.ts +27 -0
  116. package/dist/cli/backend/src/models/ScheduledMessage.d.ts.map +1 -0
  117. package/dist/cli/backend/src/models/ScheduledMessage.js +50 -0
  118. package/dist/cli/backend/src/models/ScheduledMessage.js.map +1 -0
  119. package/dist/cli/backend/src/models/Team.d.ts +20 -0
  120. package/dist/cli/backend/src/models/Team.d.ts.map +1 -0
  121. package/dist/cli/backend/src/models/Team.js +120 -0
  122. package/dist/cli/backend/src/models/Team.js.map +1 -0
  123. package/dist/cli/backend/src/models/Ticket.d.ts +24 -0
  124. package/dist/cli/backend/src/models/Ticket.d.ts.map +1 -0
  125. package/dist/cli/backend/src/models/Ticket.js +102 -0
  126. package/dist/cli/backend/src/models/Ticket.js.map +1 -0
  127. package/dist/cli/backend/src/models/index.d.ts +5 -0
  128. package/dist/cli/backend/src/models/index.d.ts.map +1 -0
  129. package/dist/cli/backend/src/models/index.js +5 -0
  130. package/dist/cli/backend/src/models/index.js.map +1 -0
  131. package/dist/cli/backend/src/services/core/config.service.d.ts +91 -0
  132. package/dist/cli/backend/src/services/core/config.service.d.ts.map +1 -0
  133. package/dist/cli/backend/src/services/core/config.service.js +246 -0
  134. package/dist/cli/backend/src/services/core/config.service.js.map +1 -0
  135. package/dist/cli/backend/src/services/core/logger.service.d.ts +70 -0
  136. package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -0
  137. package/dist/cli/backend/src/services/core/logger.service.js +350 -0
  138. package/dist/cli/backend/src/services/core/logger.service.js.map +1 -0
  139. package/dist/cli/backend/src/services/core/storage.service.d.ts +269 -0
  140. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -0
  141. package/dist/cli/backend/src/services/core/storage.service.js +1406 -0
  142. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -0
  143. package/dist/cli/backend/src/services/core/teams-backup.service.d.ts +92 -0
  144. package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -0
  145. package/dist/cli/backend/src/services/core/teams-backup.service.js +120 -0
  146. package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -0
  147. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +125 -0
  148. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -0
  149. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +247 -0
  150. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -0
  151. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +153 -0
  152. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +1 -0
  153. package/dist/cli/backend/src/services/knowledge/knowledge.service.js +409 -0
  154. package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +1 -0
  155. package/dist/cli/backend/src/services/mcp-server.d.ts +167 -0
  156. package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -0
  157. package/dist/cli/backend/src/services/mcp-server.js +586 -0
  158. package/dist/cli/backend/src/services/mcp-server.js.map +1 -0
  159. package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts +259 -0
  160. package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts.map +1 -0
  161. package/dist/cli/backend/src/services/memory/agent-memory.service.js +539 -0
  162. package/dist/cli/backend/src/services/memory/agent-memory.service.js.map +1 -0
  163. package/dist/cli/backend/src/services/memory/memory.service.d.ts +306 -0
  164. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -0
  165. package/dist/cli/backend/src/services/memory/memory.service.js +517 -0
  166. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -0
  167. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +252 -0
  168. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -0
  169. package/dist/cli/backend/src/services/memory/project-memory.service.js +600 -0
  170. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -0
  171. package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
  172. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
  173. package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
  174. package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
  175. package/dist/cli/backend/src/types/budget.types.d.ts +217 -0
  176. package/dist/cli/backend/src/types/budget.types.d.ts.map +1 -0
  177. package/dist/cli/backend/src/types/budget.types.js +82 -0
  178. package/dist/cli/backend/src/types/budget.types.js.map +1 -0
  179. package/dist/cli/backend/src/types/chat.types.d.ts +550 -0
  180. package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -0
  181. package/dist/cli/backend/src/types/chat.types.js +743 -0
  182. package/dist/cli/backend/src/types/chat.types.js.map +1 -0
  183. package/dist/cli/backend/src/types/continuation.types.d.ts +237 -0
  184. package/dist/cli/backend/src/types/continuation.types.d.ts.map +1 -0
  185. package/dist/cli/backend/src/types/continuation.types.js +10 -0
  186. package/dist/cli/backend/src/types/continuation.types.js.map +1 -0
  187. package/dist/cli/backend/src/types/index.d.ts +164 -0
  188. package/dist/cli/backend/src/types/index.d.ts.map +1 -0
  189. package/dist/cli/backend/src/types/index.js +25 -0
  190. package/dist/cli/backend/src/types/index.js.map +1 -0
  191. package/dist/cli/backend/src/types/knowledge.types.d.ts +195 -0
  192. package/dist/cli/backend/src/types/knowledge.types.d.ts.map +1 -0
  193. package/dist/cli/backend/src/types/knowledge.types.js +38 -0
  194. package/dist/cli/backend/src/types/knowledge.types.js.map +1 -0
  195. package/dist/cli/backend/src/types/memory.types.d.ts +587 -0
  196. package/dist/cli/backend/src/types/memory.types.d.ts.map +1 -0
  197. package/dist/cli/backend/src/types/memory.types.js +47 -0
  198. package/dist/cli/backend/src/types/memory.types.js.map +1 -0
  199. package/dist/cli/backend/src/types/quality-gate.types.d.ts +171 -0
  200. package/dist/cli/backend/src/types/quality-gate.types.d.ts.map +1 -0
  201. package/dist/cli/backend/src/types/quality-gate.types.js +42 -0
  202. package/dist/cli/backend/src/types/quality-gate.types.js.map +1 -0
  203. package/dist/cli/backend/src/types/role.types.d.ts +260 -0
  204. package/dist/cli/backend/src/types/role.types.d.ts.map +1 -0
  205. package/dist/cli/backend/src/types/role.types.js +238 -0
  206. package/dist/cli/backend/src/types/role.types.js.map +1 -0
  207. package/dist/cli/backend/src/types/scheduler.types.d.ts +254 -0
  208. package/dist/cli/backend/src/types/scheduler.types.d.ts.map +1 -0
  209. package/dist/cli/backend/src/types/scheduler.types.js +32 -0
  210. package/dist/cli/backend/src/types/scheduler.types.js.map +1 -0
  211. package/dist/cli/backend/src/types/settings.types.d.ts +178 -0
  212. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -0
  213. package/dist/cli/backend/src/types/settings.types.js +206 -0
  214. package/dist/cli/backend/src/types/settings.types.js.map +1 -0
  215. package/dist/cli/backend/src/types/skill.types.d.ts +515 -0
  216. package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -0
  217. package/dist/cli/backend/src/types/skill.types.js +481 -0
  218. package/dist/cli/backend/src/types/skill.types.js.map +1 -0
  219. package/dist/cli/backend/src/types/sop.types.d.ts +224 -0
  220. package/dist/cli/backend/src/types/sop.types.d.ts.map +1 -0
  221. package/dist/cli/backend/src/types/sop.types.js +85 -0
  222. package/dist/cli/backend/src/types/sop.types.js.map +1 -0
  223. package/dist/cli/backend/src/types/task-output.types.d.ts +78 -0
  224. package/dist/cli/backend/src/types/task-output.types.d.ts.map +1 -0
  225. package/dist/cli/backend/src/types/task-output.types.js +27 -0
  226. package/dist/cli/backend/src/types/task-output.types.js.map +1 -0
  227. package/dist/cli/backend/src/utils/file-io.utils.d.ts +102 -0
  228. package/dist/cli/backend/src/utils/file-io.utils.d.ts.map +1 -0
  229. package/dist/cli/backend/src/utils/file-io.utils.js +214 -0
  230. package/dist/cli/backend/src/utils/file-io.utils.js.map +1 -0
  231. package/dist/cli/backend/src/utils/terminal-output.utils.d.ts +54 -0
  232. package/dist/cli/backend/src/utils/terminal-output.utils.d.ts.map +1 -0
  233. package/dist/cli/backend/src/utils/terminal-output.utils.js +97 -0
  234. package/dist/cli/backend/src/utils/terminal-output.utils.js.map +1 -0
  235. package/dist/cli/cli/src/commands/mcp-server.d.ts +38 -0
  236. package/dist/cli/cli/src/commands/mcp-server.d.ts.map +1 -0
  237. package/dist/cli/cli/src/commands/mcp-server.js +49 -0
  238. package/dist/cli/cli/src/commands/mcp-server.js.map +1 -0
  239. package/dist/cli/cli/src/commands/onboard.d.ts +61 -7
  240. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  241. package/dist/cli/cli/src/commands/onboard.js +192 -19
  242. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  243. package/dist/cli/cli/src/commands/publish.d.ts +27 -0
  244. package/dist/cli/cli/src/commands/publish.d.ts.map +1 -0
  245. package/dist/cli/cli/src/commands/publish.js +69 -0
  246. package/dist/cli/cli/src/commands/publish.js.map +1 -0
  247. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  248. package/dist/cli/cli/src/commands/start.js +12 -2
  249. package/dist/cli/cli/src/commands/start.js.map +1 -1
  250. package/dist/cli/cli/src/index.js +14 -0
  251. package/dist/cli/cli/src/index.js.map +1 -1
  252. package/dist/cli/cli/src/utils/archive-creator.d.ts +82 -0
  253. package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -0
  254. package/dist/cli/cli/src/utils/archive-creator.js +105 -0
  255. package/dist/cli/cli/src/utils/archive-creator.js.map +1 -0
  256. package/dist/cli/cli/src/utils/package-validator.d.ts +62 -0
  257. package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -0
  258. package/dist/cli/cli/src/utils/package-validator.js +122 -0
  259. package/dist/cli/cli/src/utils/package-validator.js.map +1 -0
  260. package/dist/cli/cli/src/utils/process-cleanup.d.ts +15 -0
  261. package/dist/cli/cli/src/utils/process-cleanup.d.ts.map +1 -0
  262. package/dist/cli/cli/src/utils/process-cleanup.js +76 -0
  263. package/dist/cli/cli/src/utils/process-cleanup.js.map +1 -0
  264. package/dist/cli/cli/src/utils/templates.d.ts +71 -0
  265. package/dist/cli/cli/src/utils/templates.d.ts.map +1 -0
  266. package/dist/cli/cli/src/utils/templates.js +91 -0
  267. package/dist/cli/cli/src/utils/templates.js.map +1 -0
  268. package/frontend/dist/assets/{index-523c7fce.js → index-68d1eb5a.js} +71 -71
  269. package/frontend/dist/assets/{index-4c050f52.css → index-c5043a83.css} +1 -1
  270. package/frontend/dist/assets/nunito-cyrillic-400-normal-e44e669f.woff2 +0 -0
  271. package/frontend/dist/assets/nunito-cyrillic-400-normal-ff8e8bdd.woff +0 -0
  272. package/frontend/dist/assets/nunito-cyrillic-500-normal-2159679b.woff +0 -0
  273. package/frontend/dist/assets/nunito-cyrillic-500-normal-61a3b80e.woff2 +0 -0
  274. package/frontend/dist/assets/nunito-cyrillic-600-normal-ac046097.woff +0 -0
  275. package/frontend/dist/assets/nunito-cyrillic-600-normal-e61eb97b.woff2 +0 -0
  276. package/frontend/dist/assets/nunito-cyrillic-700-normal-8fcefcc9.woff2 +0 -0
  277. package/frontend/dist/assets/nunito-cyrillic-700-normal-b9684104.woff +0 -0
  278. package/frontend/dist/assets/nunito-cyrillic-800-normal-40253beb.woff +0 -0
  279. package/frontend/dist/assets/nunito-cyrillic-800-normal-d80292de.woff2 +0 -0
  280. package/frontend/dist/assets/nunito-cyrillic-ext-400-normal-20d73ae7.woff2 +0 -0
  281. package/frontend/dist/assets/nunito-cyrillic-ext-400-normal-d48c37c9.woff +0 -0
  282. package/frontend/dist/assets/nunito-cyrillic-ext-500-normal-16197abd.woff +0 -0
  283. package/frontend/dist/assets/nunito-cyrillic-ext-500-normal-9dcfe9b5.woff2 +0 -0
  284. package/frontend/dist/assets/nunito-cyrillic-ext-600-normal-d53e9851.woff2 +0 -0
  285. package/frontend/dist/assets/nunito-cyrillic-ext-600-normal-e3d0201f.woff +0 -0
  286. package/frontend/dist/assets/nunito-cyrillic-ext-700-normal-5936f6ac.woff2 +0 -0
  287. package/frontend/dist/assets/nunito-cyrillic-ext-700-normal-c8c02775.woff +0 -0
  288. package/frontend/dist/assets/nunito-cyrillic-ext-800-normal-217b8f51.woff +0 -0
  289. package/frontend/dist/assets/nunito-cyrillic-ext-800-normal-796cf7bd.woff2 +0 -0
  290. package/frontend/dist/assets/nunito-latin-400-normal-a5906e15.woff2 +0 -0
  291. package/frontend/dist/assets/nunito-latin-400-normal-b51e7635.woff +0 -0
  292. package/frontend/dist/assets/nunito-latin-500-normal-23ae3083.woff2 +0 -0
  293. package/frontend/dist/assets/nunito-latin-500-normal-be14dbc6.woff +0 -0
  294. package/frontend/dist/assets/nunito-latin-600-normal-06a9c8b3.woff +0 -0
  295. package/frontend/dist/assets/nunito-latin-600-normal-45f437de.woff2 +0 -0
  296. package/frontend/dist/assets/nunito-latin-700-normal-ce9107dc.woff +0 -0
  297. package/frontend/dist/assets/nunito-latin-700-normal-fa89300b.woff2 +0 -0
  298. package/frontend/dist/assets/nunito-latin-800-normal-0ca02785.woff +0 -0
  299. package/frontend/dist/assets/nunito-latin-800-normal-2363d3ed.woff2 +0 -0
  300. package/frontend/dist/assets/nunito-latin-ext-400-normal-67250a41.woff2 +0 -0
  301. package/frontend/dist/assets/nunito-latin-ext-400-normal-d7e2415e.woff +0 -0
  302. package/frontend/dist/assets/nunito-latin-ext-500-normal-06f35d1c.woff +0 -0
  303. package/frontend/dist/assets/nunito-latin-ext-500-normal-343e7adc.woff2 +0 -0
  304. package/frontend/dist/assets/nunito-latin-ext-600-normal-5a8efd17.woff +0 -0
  305. package/frontend/dist/assets/nunito-latin-ext-600-normal-a7ba5f4f.woff2 +0 -0
  306. package/frontend/dist/assets/nunito-latin-ext-700-normal-0a4e4a02.woff2 +0 -0
  307. package/frontend/dist/assets/nunito-latin-ext-700-normal-0c607961.woff +0 -0
  308. package/frontend/dist/assets/nunito-latin-ext-800-normal-39f54b55.woff2 +0 -0
  309. package/frontend/dist/assets/nunito-latin-ext-800-normal-466d0211.woff +0 -0
  310. package/frontend/dist/assets/nunito-vietnamese-400-normal-2a755616.woff2 +0 -0
  311. package/frontend/dist/assets/nunito-vietnamese-400-normal-9c01ea9f.woff +0 -0
  312. package/frontend/dist/assets/nunito-vietnamese-500-normal-452e5e08.woff +0 -0
  313. package/frontend/dist/assets/nunito-vietnamese-500-normal-dc98d965.woff2 +0 -0
  314. package/frontend/dist/assets/nunito-vietnamese-600-normal-2ffbb85f.woff +0 -0
  315. package/frontend/dist/assets/nunito-vietnamese-600-normal-cf95b95d.woff2 +0 -0
  316. package/frontend/dist/assets/nunito-vietnamese-700-normal-0e29c28c.woff2 +0 -0
  317. package/frontend/dist/assets/nunito-vietnamese-700-normal-7793b75e.woff +0 -0
  318. package/frontend/dist/assets/nunito-vietnamese-800-normal-5baf507e.woff +0 -0
  319. package/frontend/dist/assets/nunito-vietnamese-800-normal-fac6740e.woff2 +0 -0
  320. package/frontend/dist/index.html +2 -2
  321. package/package.json +15 -5
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Runtime Adapter Layer
3
+ *
4
+ * Provides a unified, pluggable interface for managing AI runtime sessions.
5
+ * Each adapter encapsulates the full lifecycle of a specific runtime (Claude Code,
6
+ * Gemini CLI, Codex): starting a session, writing input, reading output, and stopping.
7
+ *
8
+ * This replaces the need to coordinate between ISessionBackend, SessionCommandHelper,
9
+ * and RuntimeAgentService manually — the adapter handles it all.
10
+ *
11
+ * @module services/runtime-adapter
12
+ */
13
+ import { type RuntimeType } from '../constants.js';
14
+ import { RuntimeAgentService } from './agent/runtime-agent.service.abstract.js';
15
+ import { type ISessionBackend, type SessionCommandHelper } from './session/index.js';
16
+ /**
17
+ * Configuration for starting a new agent session via a runtime adapter.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const config: RuntimeAdapterConfig = {
22
+ * sessionName: 'dev-agent-1',
23
+ * projectPath: '/home/user/my-project',
24
+ * runtimeFlags: ['--chrome'],
25
+ * promptFilePath: '/tmp/prompt.md',
26
+ * };
27
+ * ```
28
+ */
29
+ export interface RuntimeAdapterConfig {
30
+ /** Unique name for the PTY session */
31
+ sessionName: string;
32
+ /** Working directory for the agent */
33
+ projectPath: string;
34
+ /** Optional CLI flags injected before --dangerously-skip-permissions */
35
+ runtimeFlags?: string[];
36
+ /** Optional path to a system prompt file */
37
+ promptFilePath?: string;
38
+ /** Optional environment variables to set in the session shell */
39
+ env?: Record<string, string>;
40
+ }
41
+ /**
42
+ * Unified interface for AI runtime adapters.
43
+ *
44
+ * Each implementation wraps a specific runtime CLI (Claude Code, Gemini CLI, Codex)
45
+ * and provides a consistent API for managing agent sessions. Adapters handle the
46
+ * full lifecycle: session creation, runtime initialization, I/O, and teardown.
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const adapter = getRuntimeAdapter('claude-code');
51
+ *
52
+ * await adapter.start({ sessionName: 'agent-1', projectPath: '/project' });
53
+ * await adapter.write('agent-1', 'Hello, build a REST API');
54
+ * const output = await adapter.getOutput('agent-1');
55
+ * await adapter.stop('agent-1');
56
+ * ```
57
+ */
58
+ export interface RuntimeAdapter {
59
+ /** The runtime type this adapter handles */
60
+ readonly runtimeType: RuntimeType;
61
+ /** Human-readable display name for this runtime */
62
+ readonly displayName: string;
63
+ /**
64
+ * Start a new agent session.
65
+ *
66
+ * Creates a PTY session, sets environment variables, and launches the
67
+ * runtime CLI with the specified configuration.
68
+ *
69
+ * @param config - Session configuration
70
+ * @throws Error if session creation or runtime initialization fails
71
+ */
72
+ start(config: RuntimeAdapterConfig): Promise<void>;
73
+ /**
74
+ * Stop an agent session and clean up resources.
75
+ *
76
+ * @param sessionName - Name of the session to stop
77
+ * @throws Error if session does not exist
78
+ */
79
+ stop(sessionName: string): Promise<void>;
80
+ /**
81
+ * Write data to an agent session's stdin.
82
+ *
83
+ * @param sessionName - Name of the target session
84
+ * @param data - Data to write (sent via the session's shell)
85
+ * @throws Error if session does not exist
86
+ */
87
+ write(sessionName: string, data: string): Promise<void>;
88
+ /**
89
+ * Get recent output from an agent session.
90
+ *
91
+ * @param sessionName - Name of the target session
92
+ * @param lines - Number of recent lines to capture (default: 50)
93
+ * @returns Captured terminal output as a string
94
+ * @throws Error if session does not exist
95
+ */
96
+ getOutput(sessionName: string, lines?: number): Promise<string>;
97
+ /**
98
+ * Check if a session is currently running.
99
+ *
100
+ * @param sessionName - Name of the session to check
101
+ * @returns True if the session exists and is active
102
+ */
103
+ isRunning(sessionName: string): boolean;
104
+ /**
105
+ * Wait for the runtime CLI to become ready after initialization.
106
+ *
107
+ * Polls the session output for runtime-specific ready patterns.
108
+ *
109
+ * @param sessionName - Name of the session to monitor
110
+ * @param timeout - Maximum wait time in milliseconds (default: 60000)
111
+ * @returns True if runtime became ready within timeout, false otherwise
112
+ */
113
+ waitForReady(sessionName: string, timeout?: number): Promise<boolean>;
114
+ /**
115
+ * Detect if the runtime CLI is currently active in a session.
116
+ *
117
+ * Uses runtime-specific detection strategies (e.g., sending '/' to trigger
118
+ * a command palette and checking for output changes).
119
+ *
120
+ * @param sessionName - Name of the session to check
121
+ * @returns True if the runtime is detected as running
122
+ */
123
+ detectRuntime(sessionName: string): Promise<boolean>;
124
+ }
125
+ /**
126
+ * Base adapter that delegates to the existing RuntimeAgentService and ISessionBackend.
127
+ *
128
+ * Concrete adapters extend this class and provide their runtime type.
129
+ * The base handles all common operations — subclasses only need to override
130
+ * behavior that differs from the default.
131
+ */
132
+ declare abstract class BaseRuntimeAdapter implements RuntimeAdapter {
133
+ abstract readonly runtimeType: RuntimeType;
134
+ abstract readonly displayName: string;
135
+ protected sessionBackend: ISessionBackend;
136
+ protected sessionHelper: SessionCommandHelper;
137
+ protected runtimeService: RuntimeAgentService;
138
+ constructor(sessionBackend: ISessionBackend, sessionHelper: SessionCommandHelper, runtimeService: RuntimeAgentService);
139
+ /**
140
+ * Start a new agent session with the runtime CLI.
141
+ *
142
+ * Creates a PTY shell, sets environment variables, and executes the
143
+ * runtime initialization script.
144
+ *
145
+ * @param config - Session start configuration
146
+ */
147
+ start(config: RuntimeAdapterConfig): Promise<void>;
148
+ /** @inheritdoc */
149
+ stop(sessionName: string): Promise<void>;
150
+ /** @inheritdoc */
151
+ write(sessionName: string, data: string): Promise<void>;
152
+ /** @inheritdoc */
153
+ getOutput(sessionName: string, lines?: number): Promise<string>;
154
+ /** @inheritdoc */
155
+ isRunning(sessionName: string): boolean;
156
+ /** @inheritdoc */
157
+ waitForReady(sessionName: string, timeout?: number): Promise<boolean>;
158
+ /** @inheritdoc */
159
+ detectRuntime(sessionName: string): Promise<boolean>;
160
+ }
161
+ /**
162
+ * Adapter for Anthropic's Claude Code CLI.
163
+ *
164
+ * Full implementation — Claude Code is the default runtime.
165
+ * Handles Claude-specific initialization, detection (slash command palette),
166
+ * and MCP configuration.
167
+ */
168
+ export declare class ClaudeCodeAdapter extends BaseRuntimeAdapter {
169
+ readonly runtimeType: "claude-code";
170
+ readonly displayName = "Claude Code";
171
+ /**
172
+ * Start a Claude Code session.
173
+ *
174
+ * Extends the base start with Claude-specific post-initialization
175
+ * (MCP server configuration).
176
+ *
177
+ * @param config - Session start configuration
178
+ */
179
+ start(config: RuntimeAdapterConfig): Promise<void>;
180
+ }
181
+ /**
182
+ * Adapter for Google's Gemini CLI.
183
+ *
184
+ * Stub implementation — basic structure in place for future development.
185
+ * Uses the base adapter behavior which delegates to GeminiRuntimeService.
186
+ */
187
+ export declare class GeminiCliAdapter extends BaseRuntimeAdapter {
188
+ readonly runtimeType: "gemini-cli";
189
+ readonly displayName = "Gemini CLI";
190
+ }
191
+ /**
192
+ * Adapter for OpenAI's Codex CLI.
193
+ *
194
+ * Stub implementation — basic structure in place for future development.
195
+ * Uses the base adapter behavior which delegates to CodexRuntimeService.
196
+ */
197
+ export declare class CodexAdapter extends BaseRuntimeAdapter {
198
+ readonly runtimeType: "codex-cli";
199
+ readonly displayName = "OpenAI Codex";
200
+ }
201
+ /**
202
+ * Creates a RuntimeAdapter for the specified runtime type.
203
+ *
204
+ * Uses the existing RuntimeServiceFactory and session backend to construct
205
+ * the appropriate adapter. Requires the session backend to be initialized
206
+ * first (via createSessionBackend()).
207
+ *
208
+ * @param runtimeType - The runtime type ('claude-code', 'gemini-cli', 'codex-cli')
209
+ * @param projectRoot - The project root directory (for runtime config resolution)
210
+ * @returns A RuntimeAdapter instance for the specified runtime
211
+ * @throws Error if session backend is not initialized or runtime type is unknown
212
+ *
213
+ * @example
214
+ * ```typescript
215
+ * const adapter = getRuntimeAdapter('claude-code', '/home/user/project');
216
+ * await adapter.start({ sessionName: 'agent-1', projectPath: '/project' });
217
+ * ```
218
+ */
219
+ export declare function getRuntimeAdapter(runtimeType: RuntimeType, projectRoot: string): RuntimeAdapter;
220
+ /**
221
+ * Returns the list of all supported runtime types.
222
+ *
223
+ * @returns Array of RuntimeType values
224
+ */
225
+ export declare function getSupportedRuntimeTypes(): RuntimeType[];
226
+ /**
227
+ * Checks whether a given string is a supported runtime type.
228
+ *
229
+ * @param value - The string to check
230
+ * @returns True if the value is a valid RuntimeType
231
+ */
232
+ export declare function isSupportedRuntime(value: string): value is RuntimeType;
233
+ export {};
234
+ //# sourceMappingURL=runtime-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter.d.ts","sourceRoot":"","sources":["../../../../../backend/src/services/runtime-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAEhF,OAAO,EACN,KAAK,eAAe,EAGpB,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,CAAC;AAI5B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,oBAAoB;IACpC,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,cAAc;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAElC,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnD;;;;;OAKG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;;;;;;OAOG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEhE;;;;;OAKG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAExC;;;;;;;;OAQG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtE;;;;;;;;OAQG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD;AAID;;;;;;GAMG;AACH,uBAAe,kBAAmB,YAAW,cAAc;IAC1D,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEtC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAC1C,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAC9C,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC;gBAG7C,cAAc,EAAE,eAAe,EAC/B,aAAa,EAAE,oBAAoB,EACnC,cAAc,EAAE,mBAAmB;IAOpC;;;;;;;OAOG;IACG,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxD,kBAAkB;IACZ,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,kBAAkB;IACZ,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,kBAAkB;IACZ,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE,kBAAkB;IAClB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIvC,kBAAkB;IACZ,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlF,kBAAkB;IACZ,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG1D;AAID;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB;IACxD,QAAQ,CAAC,WAAW,gBAA6B;IACjD,QAAQ,CAAC,WAAW,iBAAiB;IAErC;;;;;;;OAOG;IACG,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAIxD;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,kBAAkB;IACvD,QAAQ,CAAC,WAAW,eAA4B;IAChD,QAAQ,CAAC,WAAW,gBAAgB;CACpC;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,kBAAkB;IACnD,QAAQ,CAAC,WAAW,cAA2B;IAC/C,QAAQ,CAAC,WAAW,kBAAkB;CACtC;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAChC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,GACjB,cAAc,CAmChB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,WAAW,EAAE,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEtE"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Runtime Adapter Layer
3
+ *
4
+ * Provides a unified, pluggable interface for managing AI runtime sessions.
5
+ * Each adapter encapsulates the full lifecycle of a specific runtime (Claude Code,
6
+ * Gemini CLI, Codex): starting a session, writing input, reading output, and stopping.
7
+ *
8
+ * This replaces the need to coordinate between ISessionBackend, SessionCommandHelper,
9
+ * and RuntimeAgentService manually — the adapter handles it all.
10
+ *
11
+ * @module services/runtime-adapter
12
+ */
13
+ import { RUNTIME_TYPES } from '../constants.js';
14
+ import { RuntimeServiceFactory } from './agent/runtime-service.factory.js';
15
+ import { getSessionBackendSync, createSessionCommandHelper, } from './session/index.js';
16
+ // ========================= Base Adapter =========================
17
+ /**
18
+ * Base adapter that delegates to the existing RuntimeAgentService and ISessionBackend.
19
+ *
20
+ * Concrete adapters extend this class and provide their runtime type.
21
+ * The base handles all common operations — subclasses only need to override
22
+ * behavior that differs from the default.
23
+ */
24
+ class BaseRuntimeAdapter {
25
+ sessionBackend;
26
+ sessionHelper;
27
+ runtimeService;
28
+ constructor(sessionBackend, sessionHelper, runtimeService) {
29
+ this.sessionBackend = sessionBackend;
30
+ this.sessionHelper = sessionHelper;
31
+ this.runtimeService = runtimeService;
32
+ }
33
+ /**
34
+ * Start a new agent session with the runtime CLI.
35
+ *
36
+ * Creates a PTY shell, sets environment variables, and executes the
37
+ * runtime initialization script.
38
+ *
39
+ * @param config - Session start configuration
40
+ */
41
+ async start(config) {
42
+ const { sessionName, projectPath, runtimeFlags, promptFilePath, env } = config;
43
+ // Create PTY session
44
+ await this.sessionHelper.createSession(sessionName, projectPath);
45
+ // Set environment variables
46
+ if (env) {
47
+ for (const [key, value] of Object.entries(env)) {
48
+ await this.sessionHelper.setEnvironmentVariable(sessionName, key, value);
49
+ }
50
+ }
51
+ // Execute runtime-specific initialization
52
+ await this.runtimeService.executeRuntimeInitScript(sessionName, projectPath, runtimeFlags, promptFilePath);
53
+ }
54
+ /** @inheritdoc */
55
+ async stop(sessionName) {
56
+ await this.sessionBackend.killSession(sessionName);
57
+ }
58
+ /** @inheritdoc */
59
+ async write(sessionName, data) {
60
+ await this.sessionHelper.sendMessage(sessionName, data);
61
+ }
62
+ /** @inheritdoc */
63
+ async getOutput(sessionName, lines) {
64
+ return this.sessionHelper.capturePane(sessionName, lines);
65
+ }
66
+ /** @inheritdoc */
67
+ isRunning(sessionName) {
68
+ return this.sessionBackend.sessionExists(sessionName);
69
+ }
70
+ /** @inheritdoc */
71
+ async waitForReady(sessionName, timeout = 60000) {
72
+ return this.runtimeService.waitForRuntimeReady(sessionName, timeout);
73
+ }
74
+ /** @inheritdoc */
75
+ async detectRuntime(sessionName) {
76
+ return this.runtimeService.detectRuntimeWithCommand(sessionName, true);
77
+ }
78
+ }
79
+ // ========================= Concrete Adapters =========================
80
+ /**
81
+ * Adapter for Anthropic's Claude Code CLI.
82
+ *
83
+ * Full implementation — Claude Code is the default runtime.
84
+ * Handles Claude-specific initialization, detection (slash command palette),
85
+ * and MCP configuration.
86
+ */
87
+ export class ClaudeCodeAdapter extends BaseRuntimeAdapter {
88
+ runtimeType = RUNTIME_TYPES.CLAUDE_CODE;
89
+ displayName = 'Claude Code';
90
+ /**
91
+ * Start a Claude Code session.
92
+ *
93
+ * Extends the base start with Claude-specific post-initialization
94
+ * (MCP server configuration).
95
+ *
96
+ * @param config - Session start configuration
97
+ */
98
+ async start(config) {
99
+ await super.start(config);
100
+ await this.runtimeService.postInitialize(config.sessionName, config.projectPath);
101
+ }
102
+ }
103
+ /**
104
+ * Adapter for Google's Gemini CLI.
105
+ *
106
+ * Stub implementation — basic structure in place for future development.
107
+ * Uses the base adapter behavior which delegates to GeminiRuntimeService.
108
+ */
109
+ export class GeminiCliAdapter extends BaseRuntimeAdapter {
110
+ runtimeType = RUNTIME_TYPES.GEMINI_CLI;
111
+ displayName = 'Gemini CLI';
112
+ }
113
+ /**
114
+ * Adapter for OpenAI's Codex CLI.
115
+ *
116
+ * Stub implementation — basic structure in place for future development.
117
+ * Uses the base adapter behavior which delegates to CodexRuntimeService.
118
+ */
119
+ export class CodexAdapter extends BaseRuntimeAdapter {
120
+ runtimeType = RUNTIME_TYPES.CODEX_CLI;
121
+ displayName = 'OpenAI Codex';
122
+ }
123
+ // ========================= Factory =========================
124
+ /**
125
+ * Creates a RuntimeAdapter for the specified runtime type.
126
+ *
127
+ * Uses the existing RuntimeServiceFactory and session backend to construct
128
+ * the appropriate adapter. Requires the session backend to be initialized
129
+ * first (via createSessionBackend()).
130
+ *
131
+ * @param runtimeType - The runtime type ('claude-code', 'gemini-cli', 'codex-cli')
132
+ * @param projectRoot - The project root directory (for runtime config resolution)
133
+ * @returns A RuntimeAdapter instance for the specified runtime
134
+ * @throws Error if session backend is not initialized or runtime type is unknown
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const adapter = getRuntimeAdapter('claude-code', '/home/user/project');
139
+ * await adapter.start({ sessionName: 'agent-1', projectPath: '/project' });
140
+ * ```
141
+ */
142
+ export function getRuntimeAdapter(runtimeType, projectRoot) {
143
+ const backend = getSessionBackendSync();
144
+ if (!backend) {
145
+ throw new Error('Session backend not initialized. Call createSessionBackend() before getRuntimeAdapter().');
146
+ }
147
+ const sessionHelper = createSessionCommandHelper(backend);
148
+ const runtimeService = RuntimeServiceFactory.createWithHelper(runtimeType, sessionHelper, projectRoot);
149
+ switch (runtimeType) {
150
+ case RUNTIME_TYPES.CLAUDE_CODE:
151
+ return new ClaudeCodeAdapter(backend, sessionHelper, runtimeService);
152
+ case RUNTIME_TYPES.GEMINI_CLI:
153
+ return new GeminiCliAdapter(backend, sessionHelper, runtimeService);
154
+ case RUNTIME_TYPES.CODEX_CLI:
155
+ return new CodexAdapter(backend, sessionHelper, runtimeService);
156
+ default: {
157
+ // Fallback to Claude Code for unrecognized types
158
+ const fallbackService = RuntimeServiceFactory.createWithHelper(RUNTIME_TYPES.CLAUDE_CODE, sessionHelper, projectRoot);
159
+ return new ClaudeCodeAdapter(backend, sessionHelper, fallbackService);
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * Returns the list of all supported runtime types.
165
+ *
166
+ * @returns Array of RuntimeType values
167
+ */
168
+ export function getSupportedRuntimeTypes() {
169
+ return RuntimeServiceFactory.getAvailableRuntimeTypes();
170
+ }
171
+ /**
172
+ * Checks whether a given string is a supported runtime type.
173
+ *
174
+ * @param value - The string to check
175
+ * @returns True if the value is a valid RuntimeType
176
+ */
177
+ export function isSupportedRuntime(value) {
178
+ return RuntimeServiceFactory.isRuntimeTypeSupported(value);
179
+ }
180
+ //# sourceMappingURL=runtime-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter.js","sourceRoot":"","sources":["../../../../../backend/src/services/runtime-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Slack Credentials Persistence Service
3
+ *
4
+ * Persists Slack tokens to ~/.crewly/slack-credentials.json so that
5
+ * tokens configured via the /settings UI survive server restarts.
6
+ * The file is written with 0600 permissions to protect secrets.
7
+ *
8
+ * @module services/slack/slack-credentials
9
+ */
10
+ import { SlackConfig } from '../../types/slack.types.js';
11
+ /**
12
+ * Save Slack credentials to disk with restricted file permissions (0600).
13
+ *
14
+ * @param config - The SlackConfig to persist.
15
+ */
16
+ export declare function saveSlackCredentials(config: SlackConfig): Promise<void>;
17
+ /**
18
+ * Load saved Slack credentials from disk.
19
+ *
20
+ * @returns SlackConfig if credentials file exists and is valid, null otherwise.
21
+ */
22
+ export declare function loadSlackCredentials(): Promise<SlackConfig | null>;
23
+ /**
24
+ * Delete saved Slack credentials from disk.
25
+ */
26
+ export declare function deleteSlackCredentials(): Promise<void>;
27
+ /**
28
+ * Check if saved Slack credentials exist on disk.
29
+ *
30
+ * @returns True if the credentials file exists.
31
+ */
32
+ export declare function hasSavedCredentials(): Promise<boolean>;
33
+ //# sourceMappingURL=slack-credentials.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-credentials.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-credentials.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AA6BzD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7E;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBxE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAa5D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Slack Credentials Persistence Service
3
+ *
4
+ * Persists Slack tokens to ~/.crewly/slack-credentials.json so that
5
+ * tokens configured via the /settings UI survive server restarts.
6
+ * The file is written with 0600 permissions to protect secrets.
7
+ *
8
+ * @module services/slack/slack-credentials
9
+ */
10
+ import * as path from 'path';
11
+ import * as fs from 'fs/promises';
12
+ import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
13
+ import { LoggerService } from '../core/logger.service.js';
14
+ const logger = LoggerService.getInstance().createComponentLogger('SlackCredentials');
15
+ const CREDENTIALS_FILE = 'slack-credentials.json';
16
+ /**
17
+ * Get the path to the Slack credentials file.
18
+ *
19
+ * @returns Absolute path to ~/.crewly/slack-credentials.json
20
+ */
21
+ function getCredentialsPath() {
22
+ const crewlyHome = path.join(process.env.HOME || '~', '.crewly');
23
+ return path.join(crewlyHome, CREDENTIALS_FILE);
24
+ }
25
+ /**
26
+ * Save Slack credentials to disk with restricted file permissions (0600).
27
+ *
28
+ * @param config - The SlackConfig to persist.
29
+ */
30
+ export async function saveSlackCredentials(config) {
31
+ const filePath = getCredentialsPath();
32
+ const credentials = {
33
+ botToken: config.botToken,
34
+ appToken: config.appToken,
35
+ signingSecret: config.signingSecret,
36
+ defaultChannelId: config.defaultChannelId,
37
+ allowedUserIds: config.allowedUserIds,
38
+ };
39
+ await atomicWriteJson(filePath, credentials);
40
+ // Restrict permissions to owner-only (0600)
41
+ try {
42
+ await fs.chmod(filePath, 0o600);
43
+ }
44
+ catch (error) {
45
+ logger.warn('Failed to set credentials file permissions', {
46
+ error: error instanceof Error ? error.message : String(error),
47
+ });
48
+ }
49
+ logger.info('Slack credentials saved to disk');
50
+ }
51
+ /**
52
+ * Load saved Slack credentials from disk.
53
+ *
54
+ * @returns SlackConfig if credentials file exists and is valid, null otherwise.
55
+ */
56
+ export async function loadSlackCredentials() {
57
+ const filePath = getCredentialsPath();
58
+ const credentials = await safeReadJson(filePath, null, logger);
59
+ if (!credentials || !credentials.botToken || !credentials.appToken || !credentials.signingSecret) {
60
+ return null;
61
+ }
62
+ return {
63
+ botToken: credentials.botToken,
64
+ appToken: credentials.appToken,
65
+ signingSecret: credentials.signingSecret,
66
+ defaultChannelId: credentials.defaultChannelId,
67
+ allowedUserIds: credentials.allowedUserIds,
68
+ socketMode: true,
69
+ };
70
+ }
71
+ /**
72
+ * Delete saved Slack credentials from disk.
73
+ */
74
+ export async function deleteSlackCredentials() {
75
+ const filePath = getCredentialsPath();
76
+ try {
77
+ await fs.unlink(filePath);
78
+ logger.info('Slack credentials removed from disk');
79
+ }
80
+ catch (error) {
81
+ if (error.code !== 'ENOENT') {
82
+ logger.warn('Failed to delete credentials file', {
83
+ error: error instanceof Error ? error.message : String(error),
84
+ });
85
+ }
86
+ }
87
+ }
88
+ /**
89
+ * Check if saved Slack credentials exist on disk.
90
+ *
91
+ * @returns True if the credentials file exists.
92
+ */
93
+ export async function hasSavedCredentials() {
94
+ const filePath = getCredentialsPath();
95
+ try {
96
+ await fs.access(filePath);
97
+ return true;
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ //# sourceMappingURL=slack-credentials.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-credentials.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-credentials.service.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,13 @@ export declare function isSlackConfigured(): boolean;
31
31
  * @returns SlackConfig object or null if not configured
32
32
  */
33
33
  export declare function getSlackConfigFromEnv(): SlackConfig | null;
34
+ /**
35
+ * Get Slack configuration from environment variables or saved credentials.
36
+ * Environment variables take priority over saved credentials.
37
+ *
38
+ * @returns SlackConfig object or null if not configured
39
+ */
40
+ export declare function getSlackConfig(): Promise<SlackConfig | null>;
34
41
  /**
35
42
  * Options for Slack initialization
36
43
  */
@@ -39,7 +46,8 @@ export interface SlackInitOptions {
39
46
  messageQueueService?: MessageQueueService;
40
47
  }
41
48
  /**
42
- * Initialize Slack integration if environment variables are set
49
+ * Initialize Slack integration if configured via environment variables
50
+ * or saved credentials.
43
51
  *
44
52
  * This function is designed to be called during application startup.
45
53
  * It safely handles cases where Slack is not configured.
@@ -1 +1 @@
1
- {"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA4B1B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
1
+ {"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA4B1B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { getSlackService } from './slack.service.js';
10
10
  import { getSlackOrchestratorBridge } from './slack-orchestrator-bridge.js';
11
+ import { loadSlackCredentials } from './slack-credentials.service.js';
11
12
  import { LoggerService } from '../core/logger.service.js';
12
13
  const logger = LoggerService.getInstance().createComponentLogger('SlackInitializer');
13
14
  /**
@@ -42,7 +43,35 @@ export function getSlackConfigFromEnv() {
42
43
  };
43
44
  }
44
45
  /**
45
- * Initialize Slack integration if environment variables are set
46
+ * Get Slack configuration from environment variables or saved credentials.
47
+ * Environment variables take priority over saved credentials.
48
+ *
49
+ * @returns SlackConfig object or null if not configured
50
+ */
51
+ export async function getSlackConfig() {
52
+ // Env vars take priority
53
+ const envConfig = getSlackConfigFromEnv();
54
+ if (envConfig) {
55
+ return envConfig;
56
+ }
57
+ // Fall back to saved credentials
58
+ try {
59
+ const savedConfig = await loadSlackCredentials();
60
+ if (savedConfig) {
61
+ logger.info('Loaded Slack credentials from saved config');
62
+ return savedConfig;
63
+ }
64
+ }
65
+ catch (error) {
66
+ logger.warn('Failed to load saved Slack credentials', {
67
+ error: error instanceof Error ? error.message : String(error),
68
+ });
69
+ }
70
+ return null;
71
+ }
72
+ /**
73
+ * Initialize Slack integration if configured via environment variables
74
+ * or saved credentials.
46
75
  *
47
76
  * This function is designed to be called during application startup.
48
77
  * It safely handles cases where Slack is not configured.
@@ -65,7 +94,7 @@ export function getSlackConfigFromEnv() {
65
94
  * ```
66
95
  */
67
96
  export async function initializeSlackIfConfigured(options) {
68
- const config = getSlackConfigFromEnv();
97
+ const config = await getSlackConfig();
69
98
  if (!config) {
70
99
  logger.info('Not configured - skipping initialization');
71
100
  return { attempted: false, success: false };