crewly 1.20.192 → 1.20.193

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 (458) hide show
  1. package/config/constants.ts +11 -0
  2. package/config/hooks/subagent-guard/subagent.sh +113 -0
  3. package/config/roles/architect/prompt.md +1 -1
  4. package/config/roles/auditor/prompt.md +1 -1
  5. package/config/roles/backend-developer/prompt.md +1 -1
  6. package/config/roles/content-strategist/prompt.md +2 -2
  7. package/config/roles/designer/prompt.md +1 -1
  8. package/config/roles/developer/prompt.md +2 -2
  9. package/config/roles/frontend-developer/prompt.md +1 -1
  10. package/config/roles/fullstack-dev/prompt.md +1 -1
  11. package/config/roles/generalist/prompt.md +1 -1
  12. package/config/roles/ops/prompt.md +1 -1
  13. package/config/roles/orchestrator/prompt.md +2 -2
  14. package/config/roles/product-manager/prompt.md +1 -1
  15. package/config/roles/qa/prompt.md +1 -1
  16. package/config/roles/qa-engineer/prompt.md +1 -1
  17. package/config/roles/researcher/prompt.md +1 -1
  18. package/config/roles/sales/prompt.md +1 -1
  19. package/config/roles/support/prompt.md +1 -1
  20. package/config/roles/team-leader/prompt.md +1 -1
  21. package/config/roles/tpm/prompt.md +1 -1
  22. package/config/roles/ux-designer/prompt.md +1 -1
  23. package/config/skills/_common/complete-body-shape.test.sh +17 -0
  24. package/config/skills/agent/core/complete-task/SKILL.md +27 -4
  25. package/config/skills/agent/core/complete-task/execute.sh +23 -3
  26. package/config/skills/agent/core/complete-task/execute.test.sh +34 -0
  27. package/config/skills/agent/core/handoff-task/execute.sh +1 -1
  28. package/config/skills/agent/core/report-status/SKILL.md +27 -4
  29. package/config/skills/agent/core/report-status/execute.sh +104 -4
  30. package/config/skills/agent/core/todo-add/SKILL.md +16 -2
  31. package/config/skills/agent/core/todo-add/execute.sh +21 -5
  32. package/config/skills/agent/core/todo-add/execute.test.sh +14 -0
  33. package/config/skills/agent/core/todo-tasks/SKILL.md +4 -3
  34. package/config/skills/agent/core/todo-update/SKILL.md +13 -2
  35. package/config/skills/agent/core/todo-update/execute.sh +41 -3
  36. package/config/skills/agent/core/todo-update/execute.test.sh +7 -0
  37. package/config/skills/marketplace-registry.ts +4 -4
  38. package/config/skills/orchestrator/complete-task/SKILL.md +13 -6
  39. package/config/skills/orchestrator/complete-task/execute.sh +22 -3
  40. package/config/skills/orchestrator/delegate-task/execute.sh +2 -2
  41. package/config/skills/orchestrator/harness-login/SKILL.md +9 -1
  42. package/config/skills/orchestrator/harness-login/execute.sh +12 -4
  43. package/config/skills/orchestrator/harness-login/execute.test.sh +7 -0
  44. package/config/skills/team-leader/delegate-task/execute.sh +1 -1
  45. package/config/skills/team-leader/verify-output/SKILL.md +18 -1
  46. package/config/skills/team-leader/verify-output/execute.sh +28 -0
  47. package/config/skills/team-leader/verify-output/execute.test.sh +27 -0
  48. package/dist/backend/backend/src/constants.d.ts +135 -2
  49. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  50. package/dist/backend/backend/src/constants.js +136 -1
  51. package/dist/backend/backend/src/constants.js.map +1 -1
  52. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts +6 -0
  53. package/dist/backend/backend/src/controllers/canva/canva.controller.d.ts.map +1 -1
  54. package/dist/backend/backend/src/controllers/canva/canva.controller.js +13 -2
  55. package/dist/backend/backend/src/controllers/canva/canva.controller.js.map +1 -1
  56. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  57. package/dist/backend/backend/src/controllers/canva/canva.routes.js +3 -1
  58. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  59. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  60. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +4 -1
  61. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  62. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -0
  63. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/connector/connector.controller.js +32 -3
  65. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts +41 -0
  67. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -0
  68. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +75 -0
  69. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -0
  70. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +6 -0
  71. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  72. package/dist/backend/backend/src/controllers/google/google.controller.js +19 -0
  73. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  74. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  75. package/dist/backend/backend/src/controllers/google/google.routes.js +3 -1
  76. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  77. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts.map +1 -1
  78. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +22 -3
  79. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js.map +1 -1
  80. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +19 -2
  81. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -1
  82. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +37 -4
  83. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -1
  84. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  85. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +3 -1
  86. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  87. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +9 -0
  88. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  89. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +26 -0
  90. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  91. package/dist/backend/backend/src/controllers/people/people.routes.d.ts +25 -0
  92. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -0
  93. package/dist/backend/backend/src/controllers/people/people.routes.js +90 -0
  94. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -0
  95. package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
  96. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  97. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts +22 -1
  98. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  99. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +143 -3
  100. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  101. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +25 -3
  102. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  103. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +125 -19
  104. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  105. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  106. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -0
  107. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  108. package/dist/backend/backend/src/index.d.ts.map +1 -1
  109. package/dist/backend/backend/src/index.js +44 -1
  110. package/dist/backend/backend/src/index.js.map +1 -1
  111. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  112. package/dist/backend/backend/src/routes/api.routes.js +3 -0
  113. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  114. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  115. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/agent/agent-registration.service.js +28 -3
  117. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  118. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  119. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +14 -3
  121. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  122. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  123. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  125. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/agent/idle-detection.service.js +1 -1
  127. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  128. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  129. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  131. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  132. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  133. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  135. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  137. package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  138. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +49 -5
  139. package/dist/backend/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  140. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  142. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  143. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  144. package/dist/backend/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  145. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts +17 -4
  146. package/dist/backend/backend/src/services/canva/canva-token.service.d.ts.map +1 -1
  147. package/dist/backend/backend/src/services/canva/canva-token.service.js +49 -17
  148. package/dist/backend/backend/src/services/canva/canva-token.service.js.map +1 -1
  149. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +24 -0
  150. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  151. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +52 -0
  152. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  153. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts +17 -2
  154. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.d.ts.map +1 -1
  155. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +30 -6
  156. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
  157. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +38 -2
  158. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
  159. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +63 -1
  160. package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
  161. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  162. package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  163. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +204 -56
  164. package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  165. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  166. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  167. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  168. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  169. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +3 -0
  170. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  171. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +25 -2
  172. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -1
  173. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +48 -7
  174. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -1
  175. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +207 -0
  176. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/harness/claude-accounts.js +306 -0
  178. package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -0
  179. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  180. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +48 -0
  182. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  183. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  184. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +156 -19
  186. package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  187. package/dist/backend/backend/src/services/harness/harness.types.d.ts +2 -0
  188. package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
  190. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +19 -4
  191. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/harness/login-broker.service.js +46 -7
  193. package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
  194. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts +18 -2
  195. package/dist/backend/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/harness/owner-login-request.js +31 -7
  197. package/dist/backend/backend/src/services/harness/owner-login-request.js.map +1 -1
  198. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  199. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  201. package/dist/backend/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
  203. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  204. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +29 -0
  205. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  206. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  207. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  208. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  209. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  210. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +87 -5
  211. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +151 -12
  213. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -1
  214. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +17 -4
  215. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -1
  216. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +45 -17
  217. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -1
  218. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts +53 -7
  219. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -1
  220. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js +77 -14
  221. package/dist/backend/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -1
  222. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +53 -1
  223. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  224. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +130 -29
  225. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  226. package/dist/backend/backend/src/services/people/acting-for.service.d.ts +151 -0
  227. package/dist/backend/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  228. package/dist/backend/backend/src/services/people/acting-for.service.js +224 -0
  229. package/dist/backend/backend/src/services/people/acting-for.service.js.map +1 -0
  230. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts +89 -0
  231. package/dist/backend/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  232. package/dist/backend/backend/src/services/people/dedicated-agent.js +113 -0
  233. package/dist/backend/backend/src/services/people/dedicated-agent.js.map +1 -0
  234. package/dist/backend/backend/src/services/people/grant-sharing.d.ts +79 -0
  235. package/dist/backend/backend/src/services/people/grant-sharing.d.ts.map +1 -0
  236. package/dist/backend/backend/src/services/people/grant-sharing.js +135 -0
  237. package/dist/backend/backend/src/services/people/grant-sharing.js.map +1 -0
  238. package/dist/backend/backend/src/services/people/people-directory.service.d.ts +181 -0
  239. package/dist/backend/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  240. package/dist/backend/backend/src/services/people/people-directory.service.js +317 -0
  241. package/dist/backend/backend/src/services/people/people-directory.service.js.map +1 -0
  242. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  243. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  244. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  245. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  246. package/dist/backend/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  247. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -1
  248. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
  249. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +16 -2
  250. package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
  251. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +60 -1
  252. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  253. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +140 -8
  254. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  255. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js +1 -1
  256. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.store.js.map +1 -1
  257. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  258. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  259. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  260. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  261. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  262. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +12 -2
  263. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  264. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts +7 -1
  265. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.d.ts.map +1 -1
  266. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js +18 -3
  267. package/dist/backend/backend/src/services/runtime-fallback/runtime-usage-probe.js.map +1 -1
  268. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  269. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  270. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  271. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  272. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  273. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
  274. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  275. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  276. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  277. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +46 -0
  278. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  279. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts +105 -0
  280. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.d.ts.map +1 -0
  281. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js +238 -0
  282. package/dist/backend/backend/src/services/task-pool/completion-evidence.service.js.map +1 -0
  283. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  284. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +4 -0
  285. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  286. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +39 -12
  287. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -1
  288. package/dist/backend/backend/src/services/usage/usage-stats.service.js +61 -20
  289. package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -1
  290. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts +2 -0
  291. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +9 -0
  293. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  294. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +10 -0
  295. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  296. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +45 -2
  297. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  298. package/dist/backend/backend/src/types/index.d.ts +12 -1
  299. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  300. package/dist/backend/backend/src/types/index.js.map +1 -1
  301. package/dist/backend/backend/src/types/messaging.types.d.ts +5 -0
  302. package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
  303. package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
  304. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts +77 -0
  305. package/dist/backend/backend/src/types/v2/completion-evidence.types.d.ts.map +1 -0
  306. package/dist/backend/backend/src/types/v2/completion-evidence.types.js +119 -0
  307. package/dist/backend/backend/src/types/v2/completion-evidence.types.js.map +1 -0
  308. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +13 -0
  309. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  310. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  311. package/dist/backend/build-info.json +2 -2
  312. package/dist/backend/config/constants.d.ts +11 -0
  313. package/dist/backend/config/constants.d.ts.map +1 -1
  314. package/dist/backend/config/constants.js +11 -0
  315. package/dist/backend/config/constants.js.map +1 -1
  316. package/dist/cli/backend/src/constants.d.ts +135 -2
  317. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  318. package/dist/cli/backend/src/constants.js +136 -1
  319. package/dist/cli/backend/src/constants.js.map +1 -1
  320. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +13 -0
  321. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  322. package/dist/cli/backend/src/services/agent/agent-registration.service.js +28 -3
  323. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  324. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +3 -2
  325. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  326. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +14 -3
  327. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  328. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +28 -1
  329. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  330. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +48 -4
  331. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  332. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +2 -1
  333. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  334. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +17 -4
  335. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  336. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +14 -0
  337. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  338. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +38 -0
  339. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  340. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +34 -0
  341. package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
  342. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +49 -5
  343. package/dist/cli/backend/src/services/agent/runtime-session-recovery.js.map +1 -1
  344. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  345. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +8 -1
  346. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  347. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +1 -1
  348. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -1
  349. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +24 -0
  350. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  351. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +52 -0
  352. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  353. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts +74 -4
  354. package/dist/cli/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -1
  355. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js +204 -56
  356. package/dist/cli/backend/src/services/cloud/cloud-sync.service.js.map +1 -1
  357. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +19 -0
  358. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  359. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  360. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +207 -0
  361. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -0
  362. package/dist/cli/backend/src/services/harness/claude-accounts.js +306 -0
  363. package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -0
  364. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +35 -0
  365. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  366. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +48 -0
  367. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  368. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +70 -1
  369. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -1
  370. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +156 -19
  371. package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -1
  372. package/dist/cli/backend/src/services/harness/harness.types.d.ts +2 -0
  373. package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
  374. package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
  375. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +19 -4
  376. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  377. package/dist/cli/backend/src/services/harness/login-broker.service.js +46 -7
  378. package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
  379. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts +18 -2
  380. package/dist/cli/backend/src/services/harness/owner-login-request.d.ts.map +1 -1
  381. package/dist/cli/backend/src/services/harness/owner-login-request.js +31 -7
  382. package/dist/cli/backend/src/services/harness/owner-login-request.js.map +1 -1
  383. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +21 -0
  384. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -1
  385. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +39 -1
  386. package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -1
  387. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +11 -0
  388. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  389. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +29 -0
  390. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  391. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +5 -0
  392. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  393. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +13 -0
  394. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  395. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts +197 -0
  396. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.d.ts.map +1 -0
  397. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js +455 -0
  398. package/dist/cli/backend/src/services/monitoring/claude-session-tokens.service.js.map +1 -0
  399. package/dist/cli/backend/src/services/people/acting-for.service.d.ts +151 -0
  400. package/dist/cli/backend/src/services/people/acting-for.service.d.ts.map +1 -0
  401. package/dist/cli/backend/src/services/people/acting-for.service.js +224 -0
  402. package/dist/cli/backend/src/services/people/acting-for.service.js.map +1 -0
  403. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts +89 -0
  404. package/dist/cli/backend/src/services/people/dedicated-agent.d.ts.map +1 -0
  405. package/dist/cli/backend/src/services/people/dedicated-agent.js +113 -0
  406. package/dist/cli/backend/src/services/people/dedicated-agent.js.map +1 -0
  407. package/dist/cli/backend/src/services/people/people-directory.service.d.ts +181 -0
  408. package/dist/cli/backend/src/services/people/people-directory.service.d.ts.map +1 -0
  409. package/dist/cli/backend/src/services/people/people-directory.service.js +317 -0
  410. package/dist/cli/backend/src/services/people/people-directory.service.js.map +1 -0
  411. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts +29 -1
  412. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.d.ts.map +1 -1
  413. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js +40 -0
  414. package/dist/cli/backend/src/services/runtime-fallback/effective-runtime.js.map +1 -1
  415. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +20 -7
  416. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
  417. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +24 -7
  418. package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
  419. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  420. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +3 -0
  421. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  422. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  423. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  424. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +51 -0
  425. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  426. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  427. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  428. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +46 -0
  429. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  430. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  431. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +4 -0
  432. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  433. package/dist/cli/backend/src/types/index.d.ts +12 -1
  434. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  435. package/dist/cli/backend/src/types/index.js.map +1 -1
  436. package/dist/cli/backend/src/types/messaging.types.d.ts +5 -0
  437. package/dist/cli/backend/src/types/messaging.types.d.ts.map +1 -1
  438. package/dist/cli/backend/src/types/messaging.types.js.map +1 -1
  439. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +13 -0
  440. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  441. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  442. package/dist/cli/cli/src/utils/marketplace.d.ts +21 -0
  443. package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
  444. package/dist/cli/cli/src/utils/marketplace.js +35 -1
  445. package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
  446. package/dist/cli/config/constants.d.ts +11 -0
  447. package/dist/cli/config/constants.d.ts.map +1 -1
  448. package/dist/cli/config/constants.js +11 -0
  449. package/dist/cli/config/constants.js.map +1 -1
  450. package/dist/cli/config/skills/marketplace-registry.d.ts +4 -4
  451. package/dist/cli/config/skills/marketplace-registry.js +4 -4
  452. package/frontend/dist/assets/{index-5b7af029.js → index-465d1f8f.js} +293 -293
  453. package/frontend/dist/assets/{index-fc715ec3.css → index-5e967795.css} +1 -1
  454. package/frontend/dist/index.html +2 -2
  455. package/package.json +1 -1
  456. package/packages/crewly-agent/src/runtime/tool-registry.test.ts +45 -0
  457. package/packages/crewly-agent/src/runtime/tool-registry.ts +40 -5
  458. package/packages/crewly-agent/src/test/isolated-home.test.ts +24 -0
@@ -0,0 +1,181 @@
1
+ /**
2
+ * People directory — the humans who use this Crewly instance, keyed by their
3
+ * Slack user id, with a role (issue #968).
4
+ *
5
+ * - **owner**: the instance owner (the Slack user who installed Crewly's
6
+ * Slack app). Always shown, always `owner`, never removable. When their
7
+ * Slack id is not known the owner is the id `owner` (dashboard, terminal).
8
+ * - **member**: a person in the workspace. A Slack user who messages an agent
9
+ * is added as a member automatically.
10
+ * - **guest**: someone the owner marked as a guest. Guests are not included
11
+ * when a connector is shared with "all members".
12
+ *
13
+ * Stored in `<CREWLY_HOME>/people.json`. Writes are atomic.
14
+ *
15
+ * specs/per-person-access.md
16
+ *
17
+ * @module services/people/people-directory.service
18
+ */
19
+ /** A person's role on this instance. */
20
+ export type PersonRole = 'owner' | 'member' | 'guest';
21
+ /** One person. */
22
+ export interface Person {
23
+ /** Slack user id (`U0123…`), or `owner` for an owner whose Slack id is unknown */
24
+ id: string;
25
+ /** Display name */
26
+ name?: string;
27
+ role: PersonRole;
28
+ /** `auto`: added when they first messaged an agent; `owner`: added or edited by the owner */
29
+ source: 'auto' | 'owner';
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ }
33
+ /** An invalid edit. */
34
+ export declare class PeopleDirectoryError extends Error {
35
+ }
36
+ /** Injectable dependencies. */
37
+ export interface PeopleDirectoryDeps {
38
+ /** Store file (default `<CREWLY_HOME>/people.json`) */
39
+ filePath?: string;
40
+ /** The instance owner's Slack user id, when known */
41
+ getOwnerSlackUserId?: () => string | null | undefined;
42
+ now?: () => number;
43
+ }
44
+ /**
45
+ * Whether a value is a valid role.
46
+ *
47
+ * @param value - Candidate
48
+ * @returns True for owner / member / guest
49
+ */
50
+ export declare function isPersonRole(value: unknown): value is PersonRole;
51
+ /**
52
+ * Whether a value is a person id this directory accepts: a Slack user id, or
53
+ * the owner placeholder.
54
+ *
55
+ * @param value - Candidate
56
+ * @returns True when valid
57
+ */
58
+ export declare function isPersonId(value: unknown): value is string;
59
+ /** The people directory. */
60
+ export declare class PeopleDirectoryService {
61
+ private readonly filePathOverride?;
62
+ private readonly ownerSlackUserId;
63
+ private readonly now;
64
+ /**
65
+ * @param deps - Store path, owner lookup, clock
66
+ */
67
+ constructor(deps?: PeopleDirectoryDeps);
68
+ /** @returns Store path (resolved per call so CREWLY_HOME changes apply) */
69
+ private filePath;
70
+ /**
71
+ * The owner's person id: their Slack user id when known, else `owner`.
72
+ *
73
+ * @returns Person id
74
+ */
75
+ ownerId(): string;
76
+ /**
77
+ * Whether a person id is the instance owner.
78
+ *
79
+ * @param id - Person id
80
+ * @returns True for the owner's Slack id or the `owner` placeholder
81
+ */
82
+ isOwner(id: string | null | undefined): boolean;
83
+ /**
84
+ * Everyone, owner first, then by name.
85
+ *
86
+ * @returns People (copies)
87
+ */
88
+ list(): Person[];
89
+ /**
90
+ * One person.
91
+ *
92
+ * @param id - Person id
93
+ * @returns The person, or null when unknown
94
+ */
95
+ get(id: string): Person | null;
96
+ /**
97
+ * A person's role. Unknown people are members (the default for a Slack
98
+ * user in the workspace).
99
+ *
100
+ * @param id - Person id
101
+ * @returns Role
102
+ */
103
+ roleOf(id: string): PersonRole;
104
+ /**
105
+ * How to name a person to others.
106
+ *
107
+ * @param id - Person id
108
+ * @returns Their name, "the owner" for an owner without one, else the id
109
+ */
110
+ displayName(id: string): string;
111
+ /**
112
+ * Record a Slack user who messaged an agent (added as a member the first
113
+ * time; a missing name is filled in). Never changes a role.
114
+ *
115
+ * @param id - Slack user id
116
+ * @param name - Their display name, when known
117
+ */
118
+ noteSeen(id: string, name?: string): void;
119
+ /**
120
+ * Add or edit a person (owner action).
121
+ *
122
+ * @param id - Slack user id
123
+ * @param patch - Name and/or role
124
+ * @returns The person
125
+ * @throws PeopleDirectoryError on an invalid id or role, or when changing the owner's role
126
+ */
127
+ upsert(id: string, patch: {
128
+ name?: unknown;
129
+ role?: unknown;
130
+ }): Person;
131
+ /**
132
+ * Remove a person (they come back as a member if they message an agent again).
133
+ *
134
+ * @param id - Person id
135
+ * @returns True when removed
136
+ * @throws PeopleDirectoryError for the owner
137
+ */
138
+ remove(id: string): boolean;
139
+ /** @returns The stored file (empty when missing or unreadable) */
140
+ private read;
141
+ /**
142
+ * Write atomically.
143
+ *
144
+ * @param file - Contents
145
+ */
146
+ private write;
147
+ }
148
+ /**
149
+ * Trim and bound a display name.
150
+ *
151
+ * @param name - Raw name
152
+ * @returns Clean name, or undefined when empty
153
+ */
154
+ export declare function cleanPersonName(name: string | null | undefined): string | undefined;
155
+ /**
156
+ * Record a Slack user who messaged an agent, with their name (best effort,
157
+ * never throws).
158
+ *
159
+ * @param slackUserId - Slack user id
160
+ * @param name - Display name, when known
161
+ */
162
+ export declare function notePerson(slackUserId: string, name?: string | null): void;
163
+ /**
164
+ * Tell the directory how to find the owner's Slack id (wired once Slack is up).
165
+ *
166
+ * @param lookup - Lookup, or null
167
+ */
168
+ export declare function setPeopleOwnerLookup(lookup: (() => string | null | undefined) | null): void;
169
+ /**
170
+ * The backend's people directory.
171
+ *
172
+ * @returns Singleton
173
+ */
174
+ export declare function getPeopleDirectory(): PeopleDirectoryService;
175
+ /**
176
+ * Replace the singleton (tests).
177
+ *
178
+ * @param service - Instance, or null to reset
179
+ */
180
+ export declare function setPeopleDirectoryForTesting(service: PeopleDirectoryService | null): void;
181
+ //# sourceMappingURL=people-directory.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people-directory.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/people/people-directory.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,317 @@
1
+ /**
2
+ * People directory — the humans who use this Crewly instance, keyed by their
3
+ * Slack user id, with a role (issue #968).
4
+ *
5
+ * - **owner**: the instance owner (the Slack user who installed Crewly's
6
+ * Slack app). Always shown, always `owner`, never removable. When their
7
+ * Slack id is not known the owner is the id `owner` (dashboard, terminal).
8
+ * - **member**: a person in the workspace. A Slack user who messages an agent
9
+ * is added as a member automatically.
10
+ * - **guest**: someone the owner marked as a guest. Guests are not included
11
+ * when a connector is shared with "all members".
12
+ *
13
+ * Stored in `<CREWLY_HOME>/people.json`. Writes are atomic.
14
+ *
15
+ * specs/per-person-access.md
16
+ *
17
+ * @module services/people/people-directory.service
18
+ */
19
+ import * as fs from 'fs';
20
+ import * as path from 'path';
21
+ import { PEOPLE_CONSTANTS } from '../../constants.js';
22
+ import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
23
+ /** An invalid edit. */
24
+ export class PeopleDirectoryError extends Error {
25
+ }
26
+ /**
27
+ * Whether a value is a valid role.
28
+ *
29
+ * @param value - Candidate
30
+ * @returns True for owner / member / guest
31
+ */
32
+ export function isPersonRole(value) {
33
+ return typeof value === 'string' && PEOPLE_CONSTANTS.ROLES.includes(value);
34
+ }
35
+ /**
36
+ * Whether a value is a person id this directory accepts: a Slack user id, or
37
+ * the owner placeholder.
38
+ *
39
+ * @param value - Candidate
40
+ * @returns True when valid
41
+ */
42
+ export function isPersonId(value) {
43
+ return typeof value === 'string' && (value === PEOPLE_CONSTANTS.OWNER_ID || PEOPLE_CONSTANTS.SLACK_USER_ID_PATTERN.test(value));
44
+ }
45
+ /** The people directory. */
46
+ export class PeopleDirectoryService {
47
+ filePathOverride;
48
+ ownerSlackUserId;
49
+ now;
50
+ /**
51
+ * @param deps - Store path, owner lookup, clock
52
+ */
53
+ constructor(deps = {}) {
54
+ this.filePathOverride = deps.filePath;
55
+ this.ownerSlackUserId = () => {
56
+ try {
57
+ const id = deps.getOwnerSlackUserId?.();
58
+ return typeof id === 'string' && id.trim() ? id.trim() : null;
59
+ }
60
+ catch {
61
+ return null;
62
+ }
63
+ };
64
+ this.now = deps.now ?? (() => Date.now());
65
+ }
66
+ /** @returns Store path (resolved per call so CREWLY_HOME changes apply) */
67
+ filePath() {
68
+ return this.filePathOverride ?? path.join(getCrewlyHomePath(), PEOPLE_CONSTANTS.STORE_FILE);
69
+ }
70
+ /**
71
+ * The owner's person id: their Slack user id when known, else `owner`.
72
+ *
73
+ * @returns Person id
74
+ */
75
+ ownerId() {
76
+ return this.ownerSlackUserId() ?? PEOPLE_CONSTANTS.OWNER_ID;
77
+ }
78
+ /**
79
+ * Whether a person id is the instance owner.
80
+ *
81
+ * @param id - Person id
82
+ * @returns True for the owner's Slack id or the `owner` placeholder
83
+ */
84
+ isOwner(id) {
85
+ if (!id)
86
+ return false;
87
+ return id === PEOPLE_CONSTANTS.OWNER_ID || id === this.ownerSlackUserId();
88
+ }
89
+ /**
90
+ * Everyone, owner first, then by name.
91
+ *
92
+ * @returns People (copies)
93
+ */
94
+ list() {
95
+ const stored = this.read().people;
96
+ const ownerId = this.ownerId();
97
+ const iso = new Date(this.now()).toISOString();
98
+ const owner = stored.find((p) => p.id === ownerId) ?? stored.find((p) => p.id === PEOPLE_CONSTANTS.OWNER_ID);
99
+ const out = [{ ...(owner ?? { source: 'owner', createdAt: iso, updatedAt: iso }), id: ownerId, role: 'owner' }];
100
+ const others = stored
101
+ .filter((p) => p.id !== ownerId && p.id !== PEOPLE_CONSTANTS.OWNER_ID)
102
+ .map((p) => ({ ...p, role: p.role === 'owner' ? 'member' : p.role }))
103
+ .sort((a, b) => (a.name ?? a.id).localeCompare(b.name ?? b.id));
104
+ return [...out, ...others];
105
+ }
106
+ /**
107
+ * One person.
108
+ *
109
+ * @param id - Person id
110
+ * @returns The person, or null when unknown
111
+ */
112
+ get(id) {
113
+ const ownerId = this.ownerId();
114
+ const key = id === PEOPLE_CONSTANTS.OWNER_ID ? ownerId : id;
115
+ return this.list().find((p) => p.id === key) ?? null;
116
+ }
117
+ /**
118
+ * A person's role. Unknown people are members (the default for a Slack
119
+ * user in the workspace).
120
+ *
121
+ * @param id - Person id
122
+ * @returns Role
123
+ */
124
+ roleOf(id) {
125
+ if (this.isOwner(id))
126
+ return 'owner';
127
+ const found = this.read().people.find((p) => p.id === id);
128
+ if (!found)
129
+ return PEOPLE_CONSTANTS.DEFAULT_ROLE;
130
+ return found.role === 'owner' ? 'member' : found.role;
131
+ }
132
+ /**
133
+ * How to name a person to others.
134
+ *
135
+ * @param id - Person id
136
+ * @returns Their name, "the owner" for an owner without one, else the id
137
+ */
138
+ displayName(id) {
139
+ const person = this.get(id);
140
+ if (person?.name)
141
+ return person.name;
142
+ return this.isOwner(id) ? 'the owner' : id;
143
+ }
144
+ /**
145
+ * Record a Slack user who messaged an agent (added as a member the first
146
+ * time; a missing name is filled in). Never changes a role.
147
+ *
148
+ * @param id - Slack user id
149
+ * @param name - Their display name, when known
150
+ */
151
+ noteSeen(id, name) {
152
+ if (!PEOPLE_CONSTANTS.SLACK_USER_ID_PATTERN.test(id))
153
+ return;
154
+ const file = this.read();
155
+ const existing = file.people.find((p) => p.id === id);
156
+ const cleanName = cleanPersonName(name);
157
+ if (existing) {
158
+ if (cleanName && !existing.name) {
159
+ existing.name = cleanName;
160
+ existing.updatedAt = new Date(this.now()).toISOString();
161
+ this.write(file);
162
+ }
163
+ return;
164
+ }
165
+ const iso = new Date(this.now()).toISOString();
166
+ file.people.push({
167
+ id,
168
+ ...(cleanName ? { name: cleanName } : {}),
169
+ role: this.isOwner(id) ? 'owner' : PEOPLE_CONSTANTS.DEFAULT_ROLE,
170
+ source: 'auto',
171
+ createdAt: iso,
172
+ updatedAt: iso,
173
+ });
174
+ this.write(file);
175
+ }
176
+ /**
177
+ * Add or edit a person (owner action).
178
+ *
179
+ * @param id - Slack user id
180
+ * @param patch - Name and/or role
181
+ * @returns The person
182
+ * @throws PeopleDirectoryError on an invalid id or role, or when changing the owner's role
183
+ */
184
+ upsert(id, patch) {
185
+ if (!isPersonId(id))
186
+ throw new PeopleDirectoryError('A person is a Slack user id like U0123ABCD');
187
+ if (patch.role !== undefined && !isPersonRole(patch.role))
188
+ throw new PeopleDirectoryError('role must be owner, member or guest');
189
+ const owner = this.isOwner(id);
190
+ if (owner && patch.role !== undefined && patch.role !== 'owner')
191
+ throw new PeopleDirectoryError("The instance owner's role can't be changed");
192
+ if (!owner && patch.role === 'owner')
193
+ throw new PeopleDirectoryError('There is one owner: the person who installed Crewly in Slack');
194
+ if (patch.name !== undefined && patch.name !== null && typeof patch.name !== 'string')
195
+ throw new PeopleDirectoryError('name must be text');
196
+ const file = this.read();
197
+ const key = owner ? this.ownerId() : id;
198
+ const iso = new Date(this.now()).toISOString();
199
+ let person = file.people.find((p) => p.id === key);
200
+ if (!person) {
201
+ person = { id: key, role: owner ? 'owner' : PEOPLE_CONSTANTS.DEFAULT_ROLE, source: 'owner', createdAt: iso, updatedAt: iso };
202
+ file.people.push(person);
203
+ }
204
+ if (patch.name !== undefined) {
205
+ const name = cleanPersonName(patch.name);
206
+ if (name)
207
+ person.name = name;
208
+ else
209
+ delete person.name;
210
+ }
211
+ if (patch.role !== undefined)
212
+ person.role = patch.role;
213
+ person.source = 'owner';
214
+ person.updatedAt = iso;
215
+ this.write(file);
216
+ return this.get(key);
217
+ }
218
+ /**
219
+ * Remove a person (they come back as a member if they message an agent again).
220
+ *
221
+ * @param id - Person id
222
+ * @returns True when removed
223
+ * @throws PeopleDirectoryError for the owner
224
+ */
225
+ remove(id) {
226
+ if (this.isOwner(id))
227
+ throw new PeopleDirectoryError("The instance owner can't be removed");
228
+ const file = this.read();
229
+ const before = file.people.length;
230
+ file.people = file.people.filter((p) => p.id !== id);
231
+ if (file.people.length === before)
232
+ return false;
233
+ this.write(file);
234
+ return true;
235
+ }
236
+ /** @returns The stored file (empty when missing or unreadable) */
237
+ read() {
238
+ try {
239
+ const raw = JSON.parse(fs.readFileSync(this.filePath(), 'utf-8'));
240
+ const people = raw && typeof raw === 'object' && Array.isArray(raw.people) ? raw.people : [];
241
+ return {
242
+ version: 1,
243
+ people: people.filter((p) => !!p && isPersonId(p.id) && isPersonRole(p.role)),
244
+ };
245
+ }
246
+ catch {
247
+ return { version: 1, people: [] };
248
+ }
249
+ }
250
+ /**
251
+ * Write atomically.
252
+ *
253
+ * @param file - Contents
254
+ */
255
+ write(file) {
256
+ const target = this.filePath();
257
+ fs.mkdirSync(path.dirname(target), { recursive: true });
258
+ const tmp = `${target}.${process.pid}.tmp`;
259
+ fs.writeFileSync(tmp, `${JSON.stringify(file, null, 2)}\n`, 'utf-8');
260
+ fs.renameSync(tmp, target);
261
+ }
262
+ }
263
+ /**
264
+ * Trim and bound a display name.
265
+ *
266
+ * @param name - Raw name
267
+ * @returns Clean name, or undefined when empty
268
+ */
269
+ export function cleanPersonName(name) {
270
+ if (typeof name !== 'string')
271
+ return undefined;
272
+ const trimmed = name.replace(/\s+/g, ' ').trim().slice(0, PEOPLE_CONSTANTS.MAX_NAME_LENGTH);
273
+ return trimmed || undefined;
274
+ }
275
+ /**
276
+ * Record a Slack user who messaged an agent, with their name (best effort,
277
+ * never throws).
278
+ *
279
+ * @param slackUserId - Slack user id
280
+ * @param name - Display name, when known
281
+ */
282
+ export function notePerson(slackUserId, name) {
283
+ try {
284
+ getPeopleDirectory().noteSeen(slackUserId, name ?? undefined);
285
+ }
286
+ catch {
287
+ // the directory is a convenience here
288
+ }
289
+ }
290
+ let instance = null;
291
+ let ownerLookup = null;
292
+ /**
293
+ * Tell the directory how to find the owner's Slack id (wired once Slack is up).
294
+ *
295
+ * @param lookup - Lookup, or null
296
+ */
297
+ export function setPeopleOwnerLookup(lookup) {
298
+ ownerLookup = lookup;
299
+ }
300
+ /**
301
+ * The backend's people directory.
302
+ *
303
+ * @returns Singleton
304
+ */
305
+ export function getPeopleDirectory() {
306
+ instance ??= new PeopleDirectoryService({ getOwnerSlackUserId: () => ownerLookup?.() ?? null });
307
+ return instance;
308
+ }
309
+ /**
310
+ * Replace the singleton (tests).
311
+ *
312
+ * @param service - Instance, or null to reset
313
+ */
314
+ export function setPeopleDirectoryForTesting(service) {
315
+ instance = service;
316
+ }
317
+ //# sourceMappingURL=people-directory.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people-directory.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/people/people-directory.service.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,8 @@ export interface LaunchRuntimeDecision {
23
23
  overridden: boolean;
24
24
  /** Model to run when the fallback is the Crewly Agent (provider/model) */
25
25
  crewlyAgentModel?: string;
26
+ /** One of the owner's other Claude Code accounts to run on (issue #942) */
27
+ claudeAccount?: string;
26
28
  }
27
29
  /** Input of a launch decision. */
28
30
  export interface LaunchRuntimeInput {
@@ -35,8 +37,12 @@ export interface LaunchRuntimeInput {
35
37
  }
36
38
  /** Hooks the RuntimeFallbackService provides. */
37
39
  export interface RuntimeFallbackHooks {
38
- /** Runtime a session runs on instead of its configured one, or null */
40
+ /** Runtime a session runs on instead of its configured one, or null (never carries an account) */
39
41
  overrideFor(sessionName: string): string | null;
42
+ /** The owner's other Claude Code account a session runs on, or null (its runtime's default login) */
43
+ accountFor(sessionName: string): string | null;
44
+ /** A session's login expired: true when the fallback owns it (the session runs on another account) */
45
+ reportLoginExpiry(sessionName: string): boolean;
40
46
  /** Runtime to launch a session on (may start a fallback for an exhausted runtime) */
41
47
  resolveLaunch(input: LaunchRuntimeInput): Promise<LaunchRuntimeDecision>;
42
48
  /** Before a message is written into a session: deliver now, or queue it (a switch is running / needed) */
@@ -65,6 +71,28 @@ export declare function setRuntimeFallbackHooks(next: RuntimeFallbackHooks | nul
65
71
  * ```
66
72
  */
67
73
  export declare function effectiveRuntimeType<T extends string>(sessionName: string | undefined | null, configured: T): T;
74
+ /**
75
+ * The owner's other Claude Code account a session runs on (issue #942).
76
+ *
77
+ * @param sessionName - Session name
78
+ * @returns Account name, or null when it runs on its runtime's default login
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const account = effectiveClaudeAccount(sessionName); // 'work' while on claude-code@work
83
+ * ```
84
+ */
85
+ export declare function effectiveClaudeAccount(sessionName: string | undefined | null): string | null;
86
+ /**
87
+ * Report an expired login of a session. A session on one of the owner's
88
+ * other Claude Code accounts is the fallback's: that account is marked
89
+ * signed out and the agent moves on along its chain; the default login's
90
+ * expiry stays with the re-login flow.
91
+ *
92
+ * @param sessionName - Session whose output showed the expiry
93
+ * @returns True when the fallback handled it (the caller must not start a re-login)
94
+ */
95
+ export declare function reportRuntimeLoginExpiry(sessionName: string | undefined | null): boolean;
68
96
  /**
69
97
  * Decide the runtime to launch a session on.
70
98
  *
@@ -1 +1 @@
1
- {"version":3,"file":"effective-runtime.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/effective-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4CAA4C;AAC5C,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACrC,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACpC,uEAAuE;IACvE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChD,qFAAqF;IACrF,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACzE,0GAA0G;IAC1G,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1E,0EAA0E;IAC1E,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACvG,8EAA8E;IAC9E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACpD;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAE/E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAO/G;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAOpG;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOvG;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAO5H;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO/E"}
1
+ {"version":3,"file":"effective-runtime.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/effective-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,4CAA4C;AAC5C,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhE,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACrC,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACpC,kGAAkG;IAClG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAChD,qGAAqG;IACrG,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/C,sGAAsG;IACtG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAChD,qFAAqF;IACrF,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACzE,0GAA0G;IAC1G,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1E,0EAA0E;IAC1E,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC;IACvG,8EAA8E;IAC9E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACpD;AAID;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAE/E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAO/G;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAO5F;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAOxF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAOpG;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAOvG;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAO5H;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO/E"}
@@ -44,6 +44,46 @@ export function effectiveRuntimeType(sessionName, configured) {
44
44
  return configured;
45
45
  }
46
46
  }
47
+ /**
48
+ * The owner's other Claude Code account a session runs on (issue #942).
49
+ *
50
+ * @param sessionName - Session name
51
+ * @returns Account name, or null when it runs on its runtime's default login
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const account = effectiveClaudeAccount(sessionName); // 'work' while on claude-code@work
56
+ * ```
57
+ */
58
+ export function effectiveClaudeAccount(sessionName) {
59
+ if (!hooks || !sessionName)
60
+ return null;
61
+ try {
62
+ return hooks.accountFor(sessionName);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ /**
69
+ * Report an expired login of a session. A session on one of the owner's
70
+ * other Claude Code accounts is the fallback's: that account is marked
71
+ * signed out and the agent moves on along its chain; the default login's
72
+ * expiry stays with the re-login flow.
73
+ *
74
+ * @param sessionName - Session whose output showed the expiry
75
+ * @returns True when the fallback handled it (the caller must not start a re-login)
76
+ */
77
+ export function reportRuntimeLoginExpiry(sessionName) {
78
+ if (!hooks || !sessionName)
79
+ return false;
80
+ try {
81
+ return hooks.reportLoginExpiry(sessionName);
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
47
87
  /**
48
88
  * Decide the runtime to launch a session on.
49
89
  *
@@ -1 +1 @@
1
- {"version":3,"file":"effective-runtime.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/effective-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAuCH,IAAI,KAAK,GAAgC,IAAI,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAiC;IACxE,KAAK,GAAG,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAmB,WAAsC,EAAE,UAAa;IAC3G,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,UAAU,CAAC;IAC9C,IAAI,CAAC;QACJ,OAAQ,KAAK,CAAC,WAAW,CAAC,WAAW,CAAc,IAAI,UAAU,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,UAAU,CAAC;IACnB,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAyB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,CAAC;QACJ,OAAO,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACzD,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAmB,EAAE,OAAe;IACjF,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAe,EAAE,IAAY,EAAE,MAA2B;IAClH,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAmB;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"effective-runtime.js","sourceRoot":"","sources":["../../../../../../backend/src/services/runtime-fallback/effective-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA6CH,IAAI,KAAK,GAAgC,IAAI,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAiC;IACxE,KAAK,GAAG,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAmB,WAAsC,EAAE,UAAa;IAC3G,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,UAAU,CAAC;IAC9C,IAAI,CAAC;QACJ,OAAQ,KAAK,CAAC,WAAW,CAAC,WAAW,CAAc,IAAI,UAAU,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,UAAU,CAAC;IACnB,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAsC;IAC5E,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAsC;IAC9E,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAyB;IACnE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,CAAC;QACJ,OAAO,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACzD,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAmB,EAAE,OAAe;IACjF,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAAe,EAAE,IAAY,EAAE,MAA2B;IAClH,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAmB;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,CAAC;QACJ,OAAO,KAAK,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC"}