crewly 1.20.105 → 1.20.107

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 (580) hide show
  1. package/README.md +22 -12
  2. package/config/constants.ts +43 -0
  3. package/config/index.ts +2 -0
  4. package/config/skills/_common/lib.sh +55 -2
  5. package/config/skills/_common/lib.test.sh +58 -1
  6. package/config/skills/_common/task-pool-body-shape.test.sh +60 -0
  7. package/config/skills/agent/core/cancel-followup/execute.sh +18 -3
  8. package/config/skills/agent/core/cancel-followup/execute.test.sh +73 -0
  9. package/config/skills/agent/core/complete-task/execute.sh +1 -1
  10. package/config/skills/agent/core/create-intent-tasks/execute.sh +1 -1
  11. package/config/skills/agent/core/create-task/SKILL.md +1 -0
  12. package/config/skills/agent/core/create-task/execute.sh +10 -0
  13. package/config/skills/agent/core/decompose-intent/execute.sh +1 -1
  14. package/config/skills/agent/core/handoff-task/execute.sh +1 -1
  15. package/config/skills/agent/core/list-my-followups/SKILL.md +1 -1
  16. package/config/skills/agent/core/list-my-followups/execute.sh +25 -3
  17. package/config/skills/agent/core/list-my-followups/execute.test.sh +72 -0
  18. package/config/skills/agent/core/poll-tasks/execute.sh +3 -3
  19. package/config/skills/agent/core/reply-channel/SKILL.md +1 -1
  20. package/config/skills/agent/core/report-progress/execute.sh +1 -1
  21. package/config/skills/agent/core/report-status/execute.sh +1 -1
  22. package/config/skills/agent/core/slack-post/SKILL.md +1 -1
  23. package/config/skills/agent/core/todo-add/SKILL.md +64 -0
  24. package/config/skills/agent/core/todo-add/execute.sh +84 -0
  25. package/config/skills/agent/core/todo-add/execute.test.sh +76 -0
  26. package/config/skills/agent/core/todo-lists/SKILL.md +58 -0
  27. package/config/skills/agent/core/todo-lists/execute.sh +70 -0
  28. package/config/skills/agent/core/todo-lists/execute.test.sh +77 -0
  29. package/config/skills/agent/core/todo-tasks/SKILL.md +59 -0
  30. package/config/skills/agent/core/todo-tasks/execute.sh +78 -0
  31. package/config/skills/agent/core/todo-tasks/execute.test.sh +74 -0
  32. package/config/skills/agent/core/todo-update/SKILL.md +63 -0
  33. package/config/skills/agent/core/todo-update/execute.sh +115 -0
  34. package/config/skills/agent/core/todo-update/execute.test.sh +82 -0
  35. package/config/skills/agent/core/update-intent-task/execute.sh +1 -1
  36. package/config/skills/agent/marketing/brand-onboarding/execute.sh +1 -1
  37. package/config/skills/agent/marketing/submit-for-approval/execute.sh +1 -1
  38. package/config/skills/agent/remote-browser/SOP-google-flow-video.md +1 -1
  39. package/config/skills/agent/remote-browser/execute.sh +33 -1
  40. package/config/skills/agent/remote-browser/execute.test.sh +62 -0
  41. package/config/skills/agent/screenshot-compare/execute.sh +1 -1
  42. package/config/skills/agent/transcribe-audio/SKILL.md +1 -1
  43. package/config/skills/agent/transcribe-audio/execute.sh +1 -1
  44. package/config/skills/agent/transcribe-audio/instructions.md +1 -1
  45. package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
  46. package/config/skills/orchestrator/get-tasks/SKILL.md +7 -1
  47. package/config/skills/orchestrator/get-tasks/execute.sh +51 -28
  48. package/config/skills/orchestrator/get-tasks/execute.test.sh +67 -0
  49. package/config/skills/orchestrator/heartbeat/execute.sh +2 -2
  50. package/config/skills/orchestrator/list-missions/execute.sh +1 -1
  51. package/config/skills/orchestrator/list-missions/execute.test.sh +38 -11
  52. package/config/skills/team-leader/decompose-goal/SKILL.md +1 -0
  53. package/config/skills/team-leader/decompose-goal/execute.sh +17 -2
  54. package/config/skills/team-leader/delegate-task/SKILL.md +1 -0
  55. package/config/skills/team-leader/delegate-task/execute.sh +6 -2
  56. package/dist/backend/backend/src/constants.d.ts +264 -2
  57. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  58. package/dist/backend/backend/src/constants.js +255 -3
  59. package/dist/backend/backend/src/constants.js.map +1 -1
  60. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +33 -0
  61. package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
  62. package/dist/backend/backend/src/controllers/browser/browser.controller.js +176 -9
  63. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  64. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  65. package/dist/backend/backend/src/controllers/chat/chat.controller.js +38 -35
  66. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  67. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +10 -45
  68. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  69. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +40 -89
  70. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  71. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +51 -0
  72. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -0
  73. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +223 -0
  74. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -0
  75. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts +25 -0
  76. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -0
  77. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +42 -0
  78. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -0
  79. package/dist/backend/backend/src/controllers/session/session.controller.d.ts +2 -1
  80. package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
  81. package/dist/backend/backend/src/controllers/session/session.controller.js +21 -0
  82. package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
  83. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  84. package/dist/backend/backend/src/controllers/slack/slack.controller.js +51 -3
  85. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  86. package/dist/backend/backend/src/controllers/system/restart-readiness.controller.d.ts +23 -0
  87. package/dist/backend/backend/src/controllers/system/restart-readiness.controller.d.ts.map +1 -0
  88. package/dist/backend/backend/src/controllers/system/restart-readiness.controller.js +35 -0
  89. package/dist/backend/backend/src/controllers/system/restart-readiness.controller.js.map +1 -0
  90. package/dist/backend/backend/src/controllers/system/system.controller.d.ts +5 -3
  91. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  92. package/dist/backend/backend/src/controllers/system/system.controller.js +27 -6
  93. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  94. package/dist/backend/backend/src/controllers/system/system.routes.d.ts.map +1 -1
  95. package/dist/backend/backend/src/controllers/system/system.routes.js +3 -0
  96. package/dist/backend/backend/src/controllers/system/system.routes.js.map +1 -1
  97. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  98. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +29 -1
  99. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  100. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  101. package/dist/backend/backend/src/controllers/team/team.controller.js +86 -6
  102. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  103. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts +41 -0
  104. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -0
  105. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +135 -0
  106. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -0
  107. package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts +18 -0
  108. package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts.map +1 -0
  109. package/dist/backend/backend/src/controllers/tickets/tickets.routes.js +25 -0
  110. package/dist/backend/backend/src/controllers/tickets/tickets.routes.js.map +1 -0
  111. package/dist/backend/backend/src/index.d.ts +70 -1
  112. package/dist/backend/backend/src/index.d.ts.map +1 -1
  113. package/dist/backend/backend/src/index.js +352 -71
  114. package/dist/backend/backend/src/index.js.map +1 -1
  115. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  116. package/dist/backend/backend/src/routes/api.routes.js +6 -0
  117. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  118. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts +128 -0
  119. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts.map +1 -0
  120. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js +200 -0
  121. package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js.map +1 -0
  122. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +2 -2
  123. package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
  124. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +3 -1
  125. package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
  126. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +4 -0
  127. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/agent/agent-registration.service.js +61 -4
  129. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  130. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +30 -0
  131. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  132. package/dist/backend/backend/src/services/agent/claude-runtime.service.js +62 -1
  133. package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  134. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  135. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +2 -1
  136. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  137. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +0 -2
  138. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  139. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +0 -2
  140. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  141. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +65 -1
  142. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  143. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +113 -10
  144. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  145. package/dist/backend/backend/src/services/agent/restore-filter.d.ts +12 -0
  146. package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
  147. package/dist/backend/backend/src/services/agent/restore-filter.js +19 -0
  148. package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
  149. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  150. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +3 -2
  151. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  152. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts +28 -0
  153. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -0
  154. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js +34 -0
  155. package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -0
  156. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +57 -5
  157. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  158. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +98 -18
  159. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  160. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +12 -1
  161. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  162. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +25 -4
  163. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  164. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +2 -1
  165. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
  166. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +5 -1
  167. package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
  168. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +38 -0
  169. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
  170. package/dist/backend/backend/src/services/browser/browser-session.service.js +34 -0
  171. package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
  172. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +6 -0
  173. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +5 -0
  175. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  176. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.d.ts.map +1 -1
  177. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js +7 -2
  178. package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js.map +1 -1
  179. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -1
  180. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +58 -1
  182. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  183. package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.d.ts +63 -0
  184. package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.js +72 -0
  186. package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.js.map +1 -0
  187. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  188. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +15 -0
  190. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  191. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +6 -1
  193. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  194. package/dist/backend/backend/src/services/connector/connector-access.service.d.ts +2 -2
  195. package/dist/backend/backend/src/services/connector/connector-access.service.d.ts.map +1 -1
  196. package/dist/backend/backend/src/services/connector/connector-access.service.js +2 -2
  197. package/dist/backend/backend/src/services/connector/connector-access.service.js.map +1 -1
  198. package/dist/backend/backend/src/services/core/retry.util.d.ts +5 -0
  199. package/dist/backend/backend/src/services/core/retry.util.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/core/retry.util.js +2 -2
  201. package/dist/backend/backend/src/services/core/retry.util.js.map +1 -1
  202. package/dist/backend/backend/src/services/factory.service.js +3 -3
  203. package/dist/backend/backend/src/services/factory.service.js.map +1 -1
  204. package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -1
  205. package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +24 -1
  206. package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -1
  207. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +9 -0
  208. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  209. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +55 -0
  210. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  211. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +7 -0
  212. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  213. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +12 -0
  214. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  215. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +36 -1
  216. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  217. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +90 -2
  218. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  219. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +250 -0
  220. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -0
  221. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +367 -0
  222. package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -0
  223. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +116 -0
  224. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -0
  225. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +220 -0
  226. package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -0
  227. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
  228. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js +22 -16
  229. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
  230. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +11 -1
  231. package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js.map +1 -1
  232. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  233. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +9 -9
  234. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  235. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +189 -0
  236. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -0
  237. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +246 -0
  238. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -0
  239. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +153 -0
  240. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -0
  241. package/dist/backend/backend/src/services/restart/interrupted-turns.js +279 -0
  242. package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -0
  243. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +176 -0
  244. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -0
  245. package/dist/backend/backend/src/services/restart/restart-drain.service.js +298 -0
  246. package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -0
  247. package/dist/backend/backend/src/services/restart/turn-probe.d.ts +52 -0
  248. package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -0
  249. package/dist/backend/backend/src/services/restart/turn-probe.js +61 -0
  250. package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -0
  251. package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.d.ts +70 -0
  252. package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.d.ts.map +1 -0
  253. package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.js +105 -0
  254. package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.js.map +1 -0
  255. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +2 -0
  256. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  257. package/dist/backend/backend/src/services/session/pty/pty-session.js +53 -1
  258. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  259. package/dist/backend/backend/src/services/session/session-binding.d.ts +125 -0
  260. package/dist/backend/backend/src/services/session/session-binding.d.ts.map +1 -0
  261. package/dist/backend/backend/src/services/session/session-binding.js +183 -0
  262. package/dist/backend/backend/src/services/session/session-binding.js.map +1 -0
  263. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  264. package/dist/backend/backend/src/services/session/session-handoff.service.js +19 -0
  265. package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
  266. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +10 -0
  267. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  268. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +37 -1
  269. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  270. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +4 -3
  271. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -1
  272. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +4 -3
  273. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -1
  274. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +72 -7
  275. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  276. package/dist/backend/backend/src/services/slack/slack-initializer.js +185 -23
  277. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  278. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +4 -45
  279. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  280. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +57 -190
  281. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  282. package/dist/backend/backend/src/services/slack/slack-source-preference.service.d.ts +59 -0
  283. package/dist/backend/backend/src/services/slack/slack-source-preference.service.d.ts.map +1 -0
  284. package/dist/backend/backend/src/services/slack/slack-source-preference.service.js +69 -0
  285. package/dist/backend/backend/src/services/slack/slack-source-preference.service.js.map +1 -0
  286. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +18 -0
  287. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  288. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +64 -3
  289. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  290. package/dist/backend/backend/src/services/slack/slack.service.d.ts +33 -1
  291. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/slack/slack.service.js +129 -4
  293. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  294. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts +108 -0
  295. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts.map +1 -0
  296. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js +193 -0
  297. package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js.map +1 -0
  298. package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts +15 -0
  299. package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  300. package/dist/backend/backend/src/services/task-pool/pool-storage.js +30 -0
  301. package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
  302. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +41 -1
  303. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  304. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +55 -1
  305. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  306. package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.d.ts +7 -0
  307. package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.d.ts.map +1 -1
  308. package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.js +32 -1
  309. package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.js.map +1 -1
  310. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  311. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +4 -3
  312. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  313. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
  314. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +12 -0
  315. package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
  316. package/dist/backend/backend/src/services/v3/request.service.d.ts +7 -0
  317. package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
  318. package/dist/backend/backend/src/services/v3/request.service.js +17 -0
  319. package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
  320. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +279 -0
  321. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -0
  322. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +458 -0
  323. package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -0
  324. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +376 -0
  325. package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -0
  326. package/dist/backend/backend/src/services/v3/ticket-intake.service.js +566 -0
  327. package/dist/backend/backend/src/services/v3/ticket-intake.service.js.map +1 -0
  328. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
  329. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +3 -3
  330. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
  331. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +28 -4
  332. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  333. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +40 -10
  334. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  335. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +1 -0
  336. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  337. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +3 -3
  338. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  339. package/dist/backend/backend/src/types/slack.types.d.ts +29 -0
  340. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  341. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  342. package/dist/backend/backend/src/types/thread-status.types.d.ts +26 -0
  343. package/dist/backend/backend/src/types/thread-status.types.d.ts.map +1 -1
  344. package/dist/backend/backend/src/types/thread-status.types.js +17 -0
  345. package/dist/backend/backend/src/types/thread-status.types.js.map +1 -1
  346. package/dist/backend/backend/src/types/v2/index.d.ts +3 -2
  347. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  348. package/dist/backend/backend/src/types/v2/index.js +1 -1
  349. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  350. package/dist/backend/backend/src/types/v2/request.types.d.ts +39 -3
  351. package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
  352. package/dist/backend/backend/src/types/v2/request.types.js +11 -2
  353. package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
  354. package/dist/backend/backend/src/types/v2/ticket.types.d.ts +173 -0
  355. package/dist/backend/backend/src/types/v2/ticket.types.d.ts.map +1 -0
  356. package/dist/backend/backend/src/types/v2/ticket.types.js +203 -0
  357. package/dist/backend/backend/src/types/v2/ticket.types.js.map +1 -0
  358. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +26 -0
  359. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
  360. package/dist/backend/backend/src/utils/agent-caller.utils.js +40 -3
  361. package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
  362. package/dist/backend/backend/src/utils/gemini-auth-settings.d.ts +62 -0
  363. package/dist/backend/backend/src/utils/gemini-auth-settings.d.ts.map +1 -0
  364. package/dist/backend/backend/src/utils/gemini-auth-settings.js +104 -0
  365. package/dist/backend/backend/src/utils/gemini-auth-settings.js.map +1 -0
  366. package/dist/backend/backend/src/utils/local-api-url.utils.d.ts +56 -0
  367. package/dist/backend/backend/src/utils/local-api-url.utils.d.ts.map +1 -0
  368. package/dist/backend/backend/src/utils/local-api-url.utils.js +80 -0
  369. package/dist/backend/backend/src/utils/local-api-url.utils.js.map +1 -0
  370. package/dist/backend/build-info.json +2 -2
  371. package/dist/backend/config/constants.d.ts +40 -0
  372. package/dist/backend/config/constants.d.ts.map +1 -1
  373. package/dist/backend/config/constants.js +41 -0
  374. package/dist/backend/config/constants.js.map +1 -1
  375. package/dist/backend/config/index.d.ts +4 -2
  376. package/dist/backend/config/index.d.ts.map +1 -1
  377. package/dist/backend/config/index.js +2 -2
  378. package/dist/backend/config/index.js.map +1 -1
  379. package/dist/cli/backend/src/constants.d.ts +264 -2
  380. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  381. package/dist/cli/backend/src/constants.js +255 -3
  382. package/dist/cli/backend/src/constants.js.map +1 -1
  383. package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +2 -2
  384. package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
  385. package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +3 -1
  386. package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
  387. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +4 -0
  388. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  389. package/dist/cli/backend/src/services/agent/agent-registration.service.js +61 -4
  390. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  391. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +30 -0
  392. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  393. package/dist/cli/backend/src/services/agent/claude-runtime.service.js +62 -1
  394. package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  395. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  396. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +2 -1
  397. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  398. package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts +0 -2
  399. package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  400. package/dist/cli/backend/src/services/agent/crewly-agent/types.js +0 -2
  401. package/dist/cli/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  402. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +65 -1
  403. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  404. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +113 -10
  405. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  406. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  407. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +3 -2
  408. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  409. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts +28 -0
  410. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -0
  411. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js +34 -0
  412. package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -0
  413. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +6 -0
  414. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  415. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +5 -0
  416. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  417. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -1
  418. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  419. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +58 -1
  420. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  421. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
  422. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  423. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +15 -0
  424. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  425. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +7 -0
  426. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  427. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +12 -0
  428. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  429. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +36 -1
  430. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  431. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +90 -2
  432. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  433. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +189 -0
  434. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -0
  435. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +246 -0
  436. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -0
  437. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +176 -0
  438. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -0
  439. package/dist/cli/backend/src/services/restart/restart-drain.service.js +298 -0
  440. package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -0
  441. package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.d.ts +70 -0
  442. package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.d.ts.map +1 -0
  443. package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.js +105 -0
  444. package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.js.map +1 -0
  445. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +2 -0
  446. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  447. package/dist/cli/backend/src/services/session/pty/pty-session.js +53 -1
  448. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  449. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  450. package/dist/cli/backend/src/services/session/session-handoff.service.js +19 -0
  451. package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
  452. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +10 -0
  453. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  454. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +37 -1
  455. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  456. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +4 -45
  457. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  458. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +57 -190
  459. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  460. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +18 -0
  461. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  462. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +64 -3
  463. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  464. package/dist/cli/backend/src/services/slack/slack.service.d.ts +33 -1
  465. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  466. package/dist/cli/backend/src/services/slack/slack.service.js +129 -4
  467. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  468. package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts +15 -0
  469. package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
  470. package/dist/cli/backend/src/services/task-pool/pool-storage.js +30 -0
  471. package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
  472. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +41 -1
  473. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  474. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +55 -1
  475. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  476. package/dist/cli/backend/src/services/v3/request.service.d.ts +7 -0
  477. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
  478. package/dist/cli/backend/src/services/v3/request.service.js +17 -0
  479. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
  480. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +279 -0
  481. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -0
  482. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +458 -0
  483. package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -0
  484. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +376 -0
  485. package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -0
  486. package/dist/cli/backend/src/services/v3/ticket-intake.service.js +566 -0
  487. package/dist/cli/backend/src/services/v3/ticket-intake.service.js.map +1 -0
  488. package/dist/cli/backend/src/types/slack.types.d.ts +29 -0
  489. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  490. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  491. package/dist/cli/backend/src/types/thread-status.types.d.ts +26 -0
  492. package/dist/cli/backend/src/types/thread-status.types.d.ts.map +1 -1
  493. package/dist/cli/backend/src/types/thread-status.types.js +17 -0
  494. package/dist/cli/backend/src/types/thread-status.types.js.map +1 -1
  495. package/dist/cli/backend/src/types/v2/index.d.ts +3 -2
  496. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  497. package/dist/cli/backend/src/types/v2/index.js +1 -1
  498. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  499. package/dist/cli/backend/src/types/v2/request.types.d.ts +39 -3
  500. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
  501. package/dist/cli/backend/src/types/v2/request.types.js +11 -2
  502. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
  503. package/dist/cli/backend/src/types/v2/ticket.types.d.ts +173 -0
  504. package/dist/cli/backend/src/types/v2/ticket.types.d.ts.map +1 -0
  505. package/dist/cli/backend/src/types/v2/ticket.types.js +203 -0
  506. package/dist/cli/backend/src/types/v2/ticket.types.js.map +1 -0
  507. package/dist/cli/backend/src/utils/gemini-auth-settings.d.ts +62 -0
  508. package/dist/cli/backend/src/utils/gemini-auth-settings.d.ts.map +1 -0
  509. package/dist/cli/backend/src/utils/gemini-auth-settings.js +104 -0
  510. package/dist/cli/backend/src/utils/gemini-auth-settings.js.map +1 -0
  511. package/dist/cli/backend/src/utils/local-api-url.utils.d.ts +56 -0
  512. package/dist/cli/backend/src/utils/local-api-url.utils.d.ts.map +1 -0
  513. package/dist/cli/backend/src/utils/local-api-url.utils.js +80 -0
  514. package/dist/cli/backend/src/utils/local-api-url.utils.js.map +1 -0
  515. package/dist/cli/cli/src/commands/doctor.d.ts +73 -2
  516. package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
  517. package/dist/cli/cli/src/commands/doctor.js +250 -8
  518. package/dist/cli/cli/src/commands/doctor.js.map +1 -1
  519. package/dist/cli/cli/src/commands/install.js +2 -0
  520. package/dist/cli/cli/src/commands/install.js.map +1 -1
  521. package/dist/cli/cli/src/commands/onboard.d.ts +68 -0
  522. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  523. package/dist/cli/cli/src/commands/onboard.js +149 -18
  524. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  525. package/dist/cli/cli/src/commands/service.d.ts +6 -0
  526. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  527. package/dist/cli/cli/src/commands/service.js +152 -50
  528. package/dist/cli/cli/src/commands/service.js.map +1 -1
  529. package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
  530. package/dist/cli/cli/src/commands/start.js +25 -80
  531. package/dist/cli/cli/src/commands/start.js.map +1 -1
  532. package/dist/cli/cli/src/commands/status.d.ts +17 -1
  533. package/dist/cli/cli/src/commands/status.d.ts.map +1 -1
  534. package/dist/cli/cli/src/commands/status.js +133 -68
  535. package/dist/cli/cli/src/commands/status.js.map +1 -1
  536. package/dist/cli/cli/src/commands/stop.d.ts +28 -1
  537. package/dist/cli/cli/src/commands/stop.d.ts.map +1 -1
  538. package/dist/cli/cli/src/commands/stop.js +260 -100
  539. package/dist/cli/cli/src/commands/stop.js.map +1 -1
  540. package/dist/cli/cli/src/index.js +3 -2
  541. package/dist/cli/cli/src/index.js.map +1 -1
  542. package/dist/cli/cli/src/scripts/ensure-node-pty.d.ts +68 -0
  543. package/dist/cli/cli/src/scripts/ensure-node-pty.d.ts.map +1 -0
  544. package/dist/cli/cli/src/scripts/ensure-node-pty.js +167 -0
  545. package/dist/cli/cli/src/scripts/ensure-node-pty.js.map +1 -0
  546. package/dist/cli/cli/src/utils/backend-status.d.ts +175 -0
  547. package/dist/cli/cli/src/utils/backend-status.d.ts.map +1 -0
  548. package/dist/cli/cli/src/utils/backend-status.js +322 -0
  549. package/dist/cli/cli/src/utils/backend-status.js.map +1 -0
  550. package/dist/cli/cli/src/utils/marketplace.d.ts +31 -2
  551. package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
  552. package/dist/cli/cli/src/utils/marketplace.js +78 -20
  553. package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
  554. package/dist/cli/cli/src/utils/native-toolchain.d.ts +53 -8
  555. package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -1
  556. package/dist/cli/cli/src/utils/native-toolchain.js +107 -15
  557. package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -1
  558. package/dist/cli/cli/src/utils/process-cleanup.d.ts +38 -6
  559. package/dist/cli/cli/src/utils/process-cleanup.d.ts.map +1 -1
  560. package/dist/cli/cli/src/utils/process-cleanup.js +83 -53
  561. package/dist/cli/cli/src/utils/process-cleanup.js.map +1 -1
  562. package/dist/cli/cli/src/utils/runtime-auth.d.ts +130 -0
  563. package/dist/cli/cli/src/utils/runtime-auth.d.ts.map +1 -0
  564. package/dist/cli/cli/src/utils/runtime-auth.js +248 -0
  565. package/dist/cli/cli/src/utils/runtime-auth.js.map +1 -0
  566. package/dist/cli/cli/src/utils/safe-shutdown.d.ts +137 -0
  567. package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -0
  568. package/dist/cli/cli/src/utils/safe-shutdown.js +236 -0
  569. package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -0
  570. package/dist/cli/config/constants.d.ts +40 -0
  571. package/dist/cli/config/constants.d.ts.map +1 -1
  572. package/dist/cli/config/constants.js +41 -0
  573. package/dist/cli/config/constants.js.map +1 -1
  574. package/dist/cli/config/index.d.ts +4 -2
  575. package/dist/cli/config/index.d.ts.map +1 -1
  576. package/dist/cli/config/index.js +2 -2
  577. package/dist/cli/config/index.js.map +1 -1
  578. package/frontend/dist/assets/{index-1fd45a2a.js → index-f7b99e81.js} +262 -262
  579. package/frontend/dist/index.html +1 -1
  580. package/package.json +4 -4
package/README.md CHANGED
@@ -22,14 +22,8 @@ Crewly is an open-source multi-agent orchestration platform that coordinates AI
22
22
  ## Quick Start
23
23
 
24
24
  ```bash
25
- # Initialize Crewly in your project (no global install needed)
26
- npx crewly init
27
-
28
- # Or install globally first
29
25
  npm install -g crewly
30
26
  crewly init
31
-
32
- # Start the platform
33
27
  crewly start
34
28
  ```
35
29
 
@@ -39,10 +33,19 @@ The `init` command walks you through provider selection, installs agent skills,
39
33
  2. Assign the team to a **project** (any local code directory)
40
34
  3. Watch agents work in real time through live terminal streams
41
35
 
42
- ## Prerequisites
36
+ ## Requirements
37
+
38
+ - **Node.js 22 or later** (with npm). Node 20 is end-of-life and its `better-sqlite3` has no prebuilt binary.
39
+ - **No C/C++ toolchain on macOS (x64/arm64) or glibc Linux (x64/arm64).** The native modules install from prebuilt binaries there. You do need `python3`, `make` and `g++` (Xcode Command Line Tools on macOS) in these cases:
40
+ - Alpine/musl, glibc older than 2.28, or other architectures, where `node-pty` compiles from source
41
+
42
+ On Debian/Ubuntu, install the toolchain with `sudo apt-get install -y python3 make g++`. `crewly doctor` tells you whether you need it.
43
+ - **jq** (`brew install jq` on macOS, `sudo apt-get install -y jq` on Debian/Ubuntu). Agent skills use it, and `crewly init` stops if it is missing.
44
+ - **curl**
45
+ - **One AI coding CLI, installed and logged in**: Claude Code (`claude`), Gemini CLI (`gemini`) or Codex (`codex`). OpenCode also works.
46
+ - **A normal user account, not root.** Run Crewly as a normal user, not with `sudo` or as root. Claude Code refuses to start its agents under root.
43
47
 
44
- - **Node.js** v20+ and **npm** v9+
45
- - **At least one** AI coding CLI installed:
48
+ tmux is not required.
46
49
 
47
50
  | Runtime | Install | Verify |
48
51
  |---------|---------|--------|
@@ -51,7 +54,7 @@ The `init` command walks you through provider selection, installs agent skills,
51
54
  | **Codex (OpenAI)** | `npm install -g @openai/codex` | `codex --version` |
52
55
  | **OpenCode** | `npm install -g opencode-ai` | `opencode --version` |
53
56
 
54
- **API keys:** Gemini CLI requires `GEMINI_API_KEY`. Codex requires an OpenAI API key. Claude Code authenticates through its own login flow. OpenCode uses whichever provider you connect via `opencode auth login` (or the `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` env vars Crewly already exports to agent sessions).
57
+ **API keys:** Gemini CLI requires `GEMINI_API_KEY`. On a Gemini agent's first run, answer its two terminal prompts: authentication (**Use Gemini API Key**) and folder trust (**Yes**). Codex requires an OpenAI API key. Claude Code: run `claude` once in a terminal, finish its first-run setup (choose a theme) **and** log in before you start a team. A Claude agent cannot get past those screens on its own. OpenCode uses whichever provider you connect via `opencode auth login` (or the `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` env vars Crewly already exports to agent sessions).
55
58
 
56
59
  ## Architecture
57
60
 
@@ -128,7 +131,7 @@ GEMINI_API_KEY=your_key_here # Required for Gemini CLI runtime
128
131
  SLACK_BOT_TOKEN=xoxb-... # Optional: self-hosted Slack app (see "Slack" below)
129
132
  SLACK_APP_TOKEN=xapp-...
130
133
  SLACK_SIGNING_SECRET=...
131
- CREWLY_SLACK_SOURCE=cloud # Optional: env | cloud (unset = Cloud wins when both exist)
134
+ CREWLY_SLACK_SOURCE=cloud # Optional: env | cloud (unset = last connected source, else self-hosted, when both exist)
132
135
  CREWLY_SLACK_PRIMARY=1 # Optional: this instance handles DMs / unmapped channels
133
136
 
134
137
  LOG_LEVEL=info # debug, info, warn, error
@@ -165,7 +168,14 @@ instance — the Settings toggle, or `CREWLY_SLACK_PRIMARY=1`.
165
168
  `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` / `SLACK_SIGNING_SECRET` or the form under
166
169
  Settings → Slack → Advanced) still works. `CREWLY_SLACK_SOURCE` picks the source:
167
170
  `cloud` uses only the Cloud workspace, `env` uses only local tokens and never
168
- asks Cloud, unset prefers Cloud when both exist (logged once at boot).
171
+ asks Cloud. Unset, when both exist, a restart keeps the app that was last
172
+ connected (with none recorded, the self-hosted app) and logs a warning — the
173
+ two are different bot users, so switching silently would break every channel of
174
+ the other one. The other app is used only if the chosen one cannot connect.
175
+ Switch explicitly with `PUT /api/slack/source {"source":"env"|"cloud"}`.
176
+ `GET /api/slack/status` reports the connected `source` and turns `degraded`
177
+ (with `degradedReason`) when posts keep failing with `channel_not_found` /
178
+ `not_in_channel`.
169
179
 
170
180
  ### Securing a server install
171
181
 
@@ -188,6 +188,32 @@ export const PROCESS_EXIT_CODES = {
188
188
  RESTART_REQUESTED: 120,
189
189
  } as const;
190
190
 
191
+ // ========================= SAFE RESTART CONSTANTS =========================
192
+
193
+ /**
194
+ * Safe-restart budget shared by the backend (which drains in-flight agent
195
+ * turns on SIGTERM/SIGINT) and every supervisor that stops it (CLI `start`
196
+ * parent, `crewly stop`, `crewly service`, the systemd unit). A supervisor
197
+ * that escalates to SIGKILL sooner than the drain plus a margin would cut
198
+ * off the very turns the drain is waiting for.
199
+ */
200
+ export const SAFE_RESTART_CONSTANTS = {
201
+ /** Default time the backend waits for agents to finish their current turn (ms) */
202
+ DRAIN_TIMEOUT_MS: 120_000,
203
+ /** Env var overriding DRAIN_TIMEOUT_MS; `0` disables the wait */
204
+ DRAIN_ENV_VAR: 'CREWLY_RESTART_DRAIN_MS',
205
+ /**
206
+ * Time allowed after the drain for the rest of the shutdown (session state
207
+ * save, PTY teardown, queue flush) before a supervisor may SIGKILL (ms).
208
+ * Must exceed the backend's own post-drain force-exit timer (10s).
209
+ */
210
+ SHUTDOWN_MARGIN_MS: 30_000,
211
+ /** Two signals closer together than this count as one (tty process-group delivery) */
212
+ SIGNAL_DEDUP_WINDOW_MS: 1_000,
213
+ /** REST path an operator (or the CLI) polls before restarting */
214
+ READINESS_ENDPOINT: '/api/system/restart-readiness',
215
+ } as const;
216
+
191
217
  // ========================= WEB SERVER CONSTANTS =========================
192
218
 
193
219
  /**
@@ -220,6 +246,10 @@ export const WEB_CONSTANTS = {
220
246
  ORCHESTRATOR: '/api/orchestrator',
221
247
  /** Terminal operations endpoints */
222
248
  TERMINAL: '/api/terminal',
249
+ /** Live agent sessions (PTY): name, pid, cwd */
250
+ SESSIONS: '/api/sessions',
251
+ /** Live terminal sessions including in-process (no PTY) agents */
252
+ TERMINAL_SESSIONS: '/api/terminal/sessions',
223
253
  /** Task management endpoints */
224
254
  TASKS: '/api/tasks',
225
255
  /** Factory SSE endpoint */
@@ -295,6 +325,19 @@ export const API_SECURITY_CONSTANTS = {
295
325
  },
296
326
  /** Actor recorded on approvals performed with the owner token */
297
327
  OWNER_ACTOR: 'owner',
328
+ /**
329
+ * Header the dashboard sets on owner-initiated actions (e.g. the per-member
330
+ * Start button). Paired with the ABSENCE of `X-Agent-Session`, it marks a
331
+ * request as a human action rather than an agent skill or an internal
332
+ * server-to-server call, which send neither (issue #775).
333
+ */
334
+ CALLER_HEADER: 'x-crewly-caller',
335
+ /** Value of {@link CALLER_HEADER} sent by the dashboard. */
336
+ DASHBOARD_CALLER: 'dashboard',
337
+ /** Header skills send to identify the calling agent session. */
338
+ AGENT_SESSION_HEADER: 'x-agent-session',
339
+ /** Legacy alias of {@link AGENT_SESSION_HEADER} still accepted by the backend. */
340
+ AGENT_SESSION_HEADER_LEGACY: 'x-crewly-agent-session',
298
341
  /** Hint appended to 401 responses */
299
342
  UNAUTHORIZED_HINT:
300
343
  'Non-loopback callers must send the API token: `Authorization: Bearer <token>`, `X-Crewly-Token: <token>` or a `crewly_token` cookie. Run `crewly token` on the server to print it.',
package/config/index.ts CHANGED
@@ -36,6 +36,7 @@ import {
36
36
  MARKETPLACE_CONSTANTS,
37
37
  TEMPLATE_MARKETPLACE_CONSTANTS,
38
38
  PROCESS_EXIT_CODES,
39
+ SAFE_RESTART_CONSTANTS,
39
40
  SERVER_CONSTANTS,
40
41
  API_SECURITY_CONSTANTS,
41
42
  EVENT_DEBOUNCE_MS,
@@ -64,6 +65,7 @@ export {
64
65
  MARKETPLACE_CONSTANTS,
65
66
  TEMPLATE_MARKETPLACE_CONSTANTS,
66
67
  PROCESS_EXIT_CODES,
68
+ SAFE_RESTART_CONSTANTS,
67
69
  SERVER_CONSTANTS,
68
70
  API_SECURITY_CONSTANTS,
69
71
  EVENT_DEBOUNCE_MS,
@@ -4,8 +4,10 @@
4
4
  # Provides common utilities for all bash skills (agent and orchestrator).
5
5
  # =============================================================================
6
6
 
7
- # Base URL for the Crewly backend API
8
- CREWLY_API_URL="${CREWLY_API_URL:-http://localhost:8787}"
7
+ # Base URL for the Crewly backend API. The backend sets CREWLY_API_URL on
8
+ # every agent to the port it actually runs on (#777); without it, fall back to
9
+ # the WEB_PORT the server was started with, then the default port.
10
+ CREWLY_API_URL="${CREWLY_API_URL:-http://localhost:${WEB_PORT:-8787}}"
9
11
 
10
12
  # -----------------------------------------------------------------------------
11
13
  # Skill output cap (context-cost control)
@@ -249,6 +251,14 @@ api_call() {
249
251
  if [ -n "${CREWLY_GOOGLE_ACCOUNT:-}" ]; then
250
252
  args+=(-H "X-Google-Account: $CREWLY_GOOGLE_ACCOUNT")
251
253
  fi
254
+ # What the agent is trying to accomplish, shown in the owner's Chrome
255
+ # takeover banner and the live browser view. Callers export
256
+ # CREWLY_AGENT_GOAL, or pass remote-browser's --goal. Base64 for the same
257
+ # reason as the authorization above: goals are often not ASCII, and a raw
258
+ # newline would end the header.
259
+ if [ -n "${CREWLY_AGENT_GOAL:-}" ]; then
260
+ args+=(-H "X-Agent-Goal: b64:$(printf '%s' "$CREWLY_AGENT_GOAL" | base64 | tr -d '\n')")
261
+ fi
252
262
  [ -n "$body" ] && args+=(-d "$body")
253
263
 
254
264
  local response
@@ -273,6 +283,49 @@ api_call() {
273
283
  fi
274
284
  }
275
285
 
286
+ # -----------------------------------------------------------------------------
287
+ # api_call_full METHOD endpoint [json_body]
288
+ #
289
+ # api_call for skills that reduce the response THEMSELVES — filter a list to
290
+ # the caller's team, count rows, pick one id — and therefore must see all of
291
+ # it. The output cap in api_call replaces any body over
292
+ # CREWLY_SKILL_MAX_OUTPUT_BYTES with a {"truncated":true,...} envelope, and a
293
+ # skill that runs `.data // []` over that envelope reports an EMPTY list with
294
+ # success:true (2026-09-21: list-my-followups and cancel-followup saw 0 of
295
+ # 335 triggers because GET /triggers was 233 KB). This helper:
296
+ # 1. bypasses the cap for this one call;
297
+ # 2. if an envelope still comes back (api_call swapped for a test double,
298
+ # or a future cap path), reads the parked file it points at;
299
+ # 3. otherwise prints an error object on stderr and returns 1 — never a
300
+ # body the caller could mistake for "no rows".
301
+ #
302
+ # The full body must not reach the LLM: callers reduce it before printing.
303
+ # Do not use this from a skill that echoes the response verbatim — that is
304
+ # exactly what the cap exists to prevent.
305
+ #
306
+ # Usage:
307
+ # if ! RESP=$(api_call_full GET "/triggers"); then error_exit "..."; fi
308
+ # -----------------------------------------------------------------------------
309
+ api_call_full() {
310
+ local body
311
+ if ! body=$(CREWLY_SKILL_FULL_OUTPUT=1 api_call "$@"); then
312
+ return 1
313
+ fi
314
+ if printf '%s' "$body" | jq -e 'if type == "object" then .truncated == true else false end' >/dev/null 2>&1; then
315
+ local file
316
+ file=$(printf '%s' "$body" | jq -r '.file // empty')
317
+ if [ -n "$file" ] && [ -r "$file" ]; then
318
+ cat "$file"
319
+ echo
320
+ return 0
321
+ fi
322
+ jq -nc --arg m "$1" --arg e "$2" --arg f "$file" \
323
+ '{error: true, truncated: true, details: ("api_call_full \($m) \($e): the response was replaced by a truncated envelope and its parked file (" + $f + ") is unreadable; refusing to return a body that would parse as an empty list")}' >&2
324
+ return 1
325
+ fi
326
+ printf '%s\n' "$body"
327
+ }
328
+
276
329
  # -----------------------------------------------------------------------------
277
330
  # error_exit message
278
331
  # Prints a JSON error to stderr and exits with code 1.
@@ -2,7 +2,8 @@
2
2
  # =============================================================================
3
3
  # Tests for lib.sh — shared skills library
4
4
  # Covers: --file preprocessor, read_json_input, require_param, error_exit,
5
- # api_call output cap (CREWLY_SKILL_MAX_OUTPUT_BYTES)
5
+ # api_call output cap (CREWLY_SKILL_MAX_OUTPUT_BYTES),
6
+ # CREWLY_API_URL default (#777)
6
7
  # =============================================================================
7
8
  set -euo pipefail
8
9
 
@@ -252,12 +253,68 @@ assert_eq "api_call: prune runs even when the body is small" '{"ok":true}' "$RES
252
253
  assert_eq "api_call: stale parked output is deleted" "missing" "$([ -f "$CAP_DIR/old-skill-stale.json" ] && echo present || echo missing)"
253
254
  assert_eq "api_call: fresh parked output is kept" "present" "$([ -f "$CAP_DIR/fresh-skill-recent.json" ] && echo present || echo missing)"
254
255
 
256
+ # =============================================================================
257
+ # api_call_full — callers that reduce the body themselves must see all of it
258
+ # (2026-09-21: list-my-followups saw 0 of 335 triggers via the envelope).
259
+ # =============================================================================
260
+ mkdir -p "$TEMP_DIR/skills/fake-full"
261
+ cat > "$TEMP_DIR/skills/fake-full/execute.sh" << 'SKILL_EOF'
262
+ #!/bin/bash
263
+ set -euo pipefail
264
+ source "$LIB_PATH"
265
+ curl() {
266
+ printf '%s\n%s' "$MOCK_BODY" "${MOCK_CODE:-200}"
267
+ }
268
+ # MOCK_ENVELOPE, when set, swaps api_call for a double that always hands back a
269
+ # truncated envelope pointing at that path — what an api_call that ignored the
270
+ # bypass (or a future cap path) would do.
271
+ if [ -n "${MOCK_ENVELOPE:-}" ]; then
272
+ api_call() { printf '{"truncated":true,"bytes":9,"file":"%s","head":"","hint":"x"}' "$MOCK_ENVELOPE"; }
273
+ fi
274
+ api_call_full GET "/anything"
275
+ SKILL_EOF
276
+ chmod +x "$TEMP_DIR/skills/fake-full/execute.sh"
277
+
278
+ # ---- Test 24: an oversized body comes back whole, and nothing is parked ----
279
+ export MOCK_BODY="$BIG"; unset MOCK_ENVELOPE MOCK_CODE
280
+ RESULT=$(CREWLY_SKILL_MAX_OUTPUT_BYTES=1000 bash "$TEMP_DIR/skills/fake-full/execute.sh")
281
+ assert_eq "api_call_full: oversized body returned whole" "$BIG" "$RESULT"
282
+ assert_eq "api_call_full: nothing parked on disk" "0" "$(find "$CAP_DIR" -name 'fake-full-*' 2>/dev/null | wc -l | tr -d ' ')"
283
+
284
+ # ---- Test 25: an envelope that still arrives is resolved from its parked file ----
285
+ printf '%s' '{"data":[1,2,3]}' > "$TEMP_DIR/parked.json"
286
+ RESULT=$(MOCK_ENVELOPE="$TEMP_DIR/parked.json" bash "$TEMP_DIR/skills/fake-full/execute.sh")
287
+ assert_eq "api_call_full: envelope resolved from its parked file" '{"data":[1,2,3]}' "$RESULT"
288
+
289
+ # ---- Test 26: an envelope whose parked file is unreadable fails loudly ----
290
+ FULL_CODE=0
291
+ RESULT=$(MOCK_ENVELOPE="$TEMP_DIR/missing.json" bash "$TEMP_DIR/skills/fake-full/execute.sh" 2>&1) || FULL_CODE=$?
292
+ assert_eq "api_call_full: unreadable parked file -> exit 1" "1" "$FULL_CODE"
293
+ assert_contains "api_call_full: the error names the truncation" '"truncated":true' "$RESULT"
294
+ assert_eq "api_call_full: no body on stdout for the caller to mistake for empty" "" \
295
+ "$(MOCK_ENVELOPE="$TEMP_DIR/missing.json" bash "$TEMP_DIR/skills/fake-full/execute.sh" 2>/dev/null || true)"
296
+
297
+ # ---- Test 27: HTTP errors still propagate as a non-zero return ----
298
+ export MOCK_BODY='{"error":"nope"}' MOCK_CODE=500; unset MOCK_ENVELOPE
299
+ FULL_CODE=0
300
+ bash "$TEMP_DIR/skills/fake-full/execute.sh" >/dev/null 2>&1 || FULL_CODE=$?
301
+ assert_eq "api_call_full: non-2xx returns 1" "1" "$FULL_CODE"
302
+ unset MOCK_BODY MOCK_CODE
303
+
255
304
  # ---- Test 23: error responses are untouched by the cap ----
256
305
  export MOCK_BODY='{"error":"nope"}' MOCK_CODE=500
257
306
  RESULT=$(CREWLY_SKILL_MAX_OUTPUT_BYTES=5 bash "$TEMP_DIR/skills/fake-skill/execute.sh" 2>&1 || true)
258
307
  assert_contains "api_call: non-2xx still reports the error object" '"status":500' "$RESULT"
259
308
  unset MOCK_BODY MOCK_CODE CREWLY_HOME
260
309
 
310
+ # ---- Test 24: CREWLY_API_URL default follows the instance's port (#777) ----
311
+ RESULT=$(env -u CREWLY_API_URL WEB_PORT=8797 bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
312
+ assert_eq "lib.sh: default API URL uses WEB_PORT" "http://localhost:8797" "$RESULT"
313
+ RESULT=$(env -u CREWLY_API_URL -u WEB_PORT bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
314
+ assert_eq "lib.sh: default API URL without WEB_PORT is 8787" "http://localhost:8787" "$RESULT"
315
+ RESULT=$(CREWLY_API_URL=http://localhost:9001 WEB_PORT=8797 bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
316
+ assert_eq "lib.sh: CREWLY_API_URL set by the backend wins" "http://localhost:9001" "$RESULT"
317
+
261
318
  echo ""
262
319
  echo "=== Results: $PASS/$TOTAL passed, $FAIL failed ==="
263
320
 
@@ -465,6 +465,66 @@ else
465
465
  PASS=$((PASS + 1)); echo " ✓ no /block POST emitted"
466
466
  fi
467
467
 
468
+ # ---------------------------------------------------------------------------
469
+ # Scenario 12 — ticket loop: every WorkItem-creating skill forwards
470
+ # --request-id as the top-level `requestId` (specs/ticket-loop.md §3), and
471
+ # omits it entirely when not given.
472
+ # ---------------------------------------------------------------------------
473
+ echo ""
474
+ echo "--- Scenario 12: --request-id reaches /add as requestId ---"
475
+ : > "$LOG"
476
+ bash "${REPO_ROOT}/config/skills/agent/core/create-task/execute.sh" \
477
+ --project-path /tmp/proj-foo --task "Ticketed task" --request-id TKT-042 >/dev/null 2>&1 || true
478
+ BODY=$(capture "/api/task-pool/add")
479
+ if [ -z "$BODY" ]; then
480
+ FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for create-task --request-id"
481
+ else
482
+ assert_add_contract "create-task(ticket)" "$BODY"
483
+ assert_jq "create-task: --request-id forwarded as requestId" '.requestId == "TKT-042"' "$BODY"
484
+ fi
485
+
486
+ : > "$LOG"
487
+ bash "${REPO_ROOT}/config/skills/agent/core/create-task/execute.sh" \
488
+ --project-path /tmp/proj-foo --task "Unticketed task" >/dev/null 2>&1 || true
489
+ BODY=$(capture "/api/task-pool/add")
490
+ if [ -n "$BODY" ]; then
491
+ assert_jq "create-task: omits requestId when not given" 'has("requestId") == false' "$BODY"
492
+ fi
493
+
494
+ : > "$LOG"
495
+ bash "${REPO_ROOT}/config/skills/team-leader/delegate-task/execute.sh" \
496
+ --to quinn-target --task "Ticketed delegation" --request-id req-ticket-7 >/dev/null 2>&1 || true
497
+ BODY=$(capture "/api/task-pool/add")
498
+ if [ -z "$BODY" ]; then
499
+ FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for tl-delegate-task --request-id"
500
+ else
501
+ assert_add_contract "tl-delegate-task(ticket)" "$BODY"
502
+ assert_jq "tl-delegate-task: --request-id forwarded as requestId" '.requestId == "req-ticket-7"' "$BODY"
503
+ fi
504
+
505
+ : > "$LOG"
506
+ bash "${REPO_ROOT}/config/skills/team-leader/decompose-goal/execute.sh" \
507
+ '{"objective":"Ticketed objective","projectPath":"/tmp/proj-foo","tasks":[{"title":"Sub","description":"d"}]}' \
508
+ --request-id req-ticket-9 >/dev/null 2>&1 || true
509
+ BODY=$(capture "/api/task-pool/add")
510
+ if [ -z "$BODY" ]; then
511
+ FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for decompose-goal --request-id"
512
+ else
513
+ assert_add_contract "decompose-goal(ticket)" "$BODY"
514
+ assert_jq "decompose-goal: --request-id forwarded as requestId" '.requestId == "req-ticket-9"' "$BODY"
515
+ fi
516
+
517
+ : > "$LOG"
518
+ bash "${REPO_ROOT}/config/skills/team-leader/decompose-goal/execute.sh" \
519
+ '{"objective":"JSON ticket","projectPath":"/tmp/proj-foo","requestId":"req-json-3","tasks":[{"title":"Sub","description":"d"}]}' \
520
+ >/dev/null 2>&1 || true
521
+ BODY=$(capture "/api/task-pool/add")
522
+ if [ -n "$BODY" ]; then
523
+ assert_jq "decompose-goal: JSON requestId forwarded" '.requestId == "req-json-3"' "$BODY"
524
+ else
525
+ FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for decompose-goal JSON requestId"
526
+ fi
527
+
468
528
  echo ""
469
529
  echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
470
530
  [ "$FAIL" -eq 0 ] || exit 1
@@ -73,7 +73,22 @@ if [ -z "$TRIGGER_ID" ]; then
73
73
  TEAM_ID=$(resolve_team_id || true)
74
74
  [ -z "$TEAM_ID" ] && { echo '{"error":"Cannot resolve owning team — cannot scope name lookup"}' >&2; exit 1; }
75
75
 
76
- LIST_RESP=$(api_call GET "/triggers" "" 2>/dev/null || echo '{"data":[]}')
76
+ # The whole trigger table is needed to resolve a name (335 rows / 233 KB on
77
+ # 2026-09-21 — over the skill-output cap). Plain api_call would return a
78
+ # {"truncated":true} envelope and every name lookup would miss. A truncated
79
+ # or non-array body must fail loudly, or "not found" is reported for a
80
+ # trigger that exists.
81
+ if ! LIST_RESP=$(api_call_full GET "/triggers" ""); then
82
+ jq -n --arg n "$TRIGGER_NAME" \
83
+ '{success:false, name:$n, error:"GET /triggers failed or came back as a truncated envelope; cannot resolve the trigger by name (it may well exist)"}'
84
+ exit 1
85
+ fi
86
+ EXAMINED=$(printf '%s' "$LIST_RESP" | jq -r 'if type == "object" then (if (.data | type) == "array" then (.data | length) else "not-an-array" end) else "not-an-object" end' 2>/dev/null || echo "unparseable")
87
+ if ! [ "$EXAMINED" -ge 0 ] 2>/dev/null; then
88
+ jq -n --arg n "$TRIGGER_NAME" --arg why "$EXAMINED" \
89
+ '{success:false, name:$n, error:("GET /triggers returned a body whose .data is " + $why + "; cannot resolve the trigger by name")}'
90
+ exit 1
91
+ fi
77
92
  TRIGGER_ID=$(printf '%s' "$LIST_RESP" | jq -r \
78
93
  --arg team "$TEAM_ID" \
79
94
  --arg name "$TRIGGER_NAME" \
@@ -82,8 +97,8 @@ if [ -z "$TRIGGER_ID" ]; then
82
97
  | .id) // empty' | head -1)
83
98
 
84
99
  if [ -z "$TRIGGER_ID" ]; then
85
- echo "$(jq -n --arg n "$TRIGGER_NAME" --arg team "$TEAM_ID" \
86
- '{success:false, error:"No active trigger found with name", name:$n, teamId:$team}')"
100
+ jq -n --arg n "$TRIGGER_NAME" --arg team "$TEAM_ID" --arg e "$EXAMINED" \
101
+ '{success:false, error:"No active trigger found with name", name:$n, teamId:$team, examined:($e|tonumber)}'
87
102
  exit 0
88
103
  fi
89
104
  fi
@@ -37,6 +37,79 @@ OUTPUT=$(bash "$SCRIPT_DIR/execute.sh" --help 2>&1) || true
37
37
  assert_contains "Help lists --id" -- "--id" "$OUTPUT"
38
38
  assert_contains "Help lists --name" -- "--name" "$OUTPUT"
39
39
 
40
+ assert_eq() {
41
+ local test_name="$1" expected="$2" actual="$3"
42
+ if [ "$expected" = "$actual" ]; then
43
+ PASS=$((PASS + 1))
44
+ echo " ✓ ${test_name}"
45
+ else
46
+ FAIL=$((FAIL + 1))
47
+ echo " ✗ ${test_name}"
48
+ echo " expected: ${expected}"
49
+ echo " got: ${actual}"
50
+ fi
51
+ }
52
+
53
+ echo ""
54
+ echo "--- Name lookup: a truncated list must not read as 'not found' ---"
55
+
56
+ # Real skill + real lib.sh, with api_call swapped for a double: GET /triggers
57
+ # returns $MOCK_RESPONSE, POST .../cancel is logged and acknowledged.
58
+ REAL_LIB="$(cd "$SCRIPT_DIR/../../../_common" && pwd)/lib.sh"
59
+ TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
60
+ mkdir -p "$TMP/skills/agent/core/cancel-followup" "$TMP/skills/agent/_common"
61
+ cp "$SCRIPT_DIR/execute.sh" "$TMP/skills/agent/core/cancel-followup/execute.sh"
62
+ cat > "$TMP/skills/agent/_common/lib.sh" <<'STUB_EOF'
63
+ source "$REAL_LIB"
64
+ resolve_team_id() { echo "team-a"; }
65
+ api_call() {
66
+ echo "$1 $2" >> "$API_LOG"
67
+ case "$1 $2" in
68
+ "GET /triggers") printf '%s' "$MOCK_RESPONSE" ;;
69
+ POST\ /triggers/*/cancel) printf '{"success":true,"data":{"status":"cancelled"}}' ;;
70
+ *) printf '{"success":true}' ;;
71
+ esac
72
+ }
73
+ STUB_EOF
74
+
75
+ run() {
76
+ local mock="$1"; shift
77
+ CODE=0
78
+ : > "$TMP/api.log"
79
+ OUTPUT=$(env -u CREWLY_SESSION_NAME REAL_LIB="$REAL_LIB" API_LOG="$TMP/api.log" MOCK_RESPONSE="$mock" \
80
+ bash "$TMP/skills/agent/core/cancel-followup/execute.sh" "$@" 2>/dev/null) || CODE=$?
81
+ }
82
+
83
+ ENVELOPE='{"truncated":true,"bytes":233481,"file":"'"$TMP"'/nonexistent.json","head":"{\"success\":true,\"data\":[{","hint":"pass --full or read the file"}'
84
+ ROWS='{"success":true,"data":[
85
+ {"id":"t-1","teamId":"team-a","name":"followup:abc","status":"active"},
86
+ {"id":"t-2","teamId":"team-b","name":"followup:zzz","status":"active"},
87
+ {"id":"t-3","teamId":"team-a","name":"followup:old","status":"cancelled"}]}'
88
+
89
+ run "$ENVELOPE" --name followup:abc
90
+ assert_eq "Envelope -> non-zero exit" "1" "$CODE"
91
+ assert_contains "Envelope -> success:false" '"success":false' "$(printf '%s' "$OUTPUT" | jq -c .)"
92
+ assert_contains "Envelope -> explicit error, not 'not found'" 'truncated envelope' "$OUTPUT"
93
+ assert_eq "Envelope -> nothing cancelled" "" "$(grep POST "$TMP/api.log" || true)"
94
+
95
+ run "$ROWS" --name followup:abc
96
+ assert_eq "Match -> exit 0" "0" "$CODE"
97
+ assert_eq "Match -> cancels the team's trigger by id" "POST /triggers/t-1/cancel" "$(grep POST "$TMP/api.log")"
98
+ assert_eq "Match -> success:true" "true" "$(printf '%s' "$OUTPUT" | jq -r '.success')"
99
+
100
+ run "$ROWS" --name followup:zzz
101
+ assert_eq "Other team's name -> not found (team-scoped), exit 0" "0" "$CODE"
102
+ assert_contains "Other team's name -> not-found message" 'No active trigger found' "$OUTPUT"
103
+ assert_eq "Not found -> reports how many rows were examined" "3" "$(printf '%s' "$OUTPUT" | jq -r '.examined')"
104
+ assert_eq "Not found -> nothing cancelled" "" "$(grep POST "$TMP/api.log" || true)"
105
+
106
+ run "$ROWS" --name followup:old
107
+ assert_contains "Cancelled trigger -> not found (only active are cancellable)" 'No active trigger found' "$OUTPUT"
108
+
109
+ run '{"success":true,"data":"nope"}' --name followup:abc
110
+ assert_eq "Non-array .data -> non-zero exit" "1" "$CODE"
111
+ assert_contains "Non-array .data -> error says why" 'not-an-array' "$OUTPUT"
112
+
40
113
  echo ""
41
114
  echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
42
115
  [ $FAIL -eq 0 ]
@@ -101,7 +101,7 @@ fi
101
101
  # WORK_ITEM_ID was read from the input up top alongside the other params,
102
102
  # so the identifier is known before any of the legacy path handling runs.
103
103
  if [ -z "$WORK_ITEM_ID" ]; then
104
- POOL_RESP=$(api_call GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
104
+ POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
105
105
  WORK_ITEM_ID=$(echo "$POOL_RESP" | jq -r '.workItems[0].id // .data[0].id // empty' 2>/dev/null || true)
106
106
  fi
107
107
 
@@ -67,7 +67,7 @@ BODY=$(jq -n \
67
67
  # ---------------------------------------------------------------------------
68
68
  # Call backend API
69
69
  # ---------------------------------------------------------------------------
70
- CREWLY_PORT="${CREWLY_PORT:-8787}"
70
+ CREWLY_PORT="${CREWLY_PORT:-${WEB_PORT:-8787}}"
71
71
  API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
72
72
 
73
73
  RESPONSE=$(curl -s -w "\n%{http_code}" \
@@ -52,6 +52,7 @@ Create a new task via the `/api/task-management/create` endpoint. This allows te
52
52
  | `--owner` | `owner` | No | Responsible role: `orchestrator`, `team_lead`, `agent` (default), `system`. A role, not a session name — use `--session` for the session |
53
53
  | `--description` / `-d` | `description` | No | Short summary of the task |
54
54
  | `--brief` | `briefMarkdown` | No | Long-form brief in markdown. Inline text, or `@/path/to/file.md`. Max 16384 bytes |
55
+ | `--request-id` / `-R` | `requestId` | No | Ticket this work is for: the id (or `TKT-123`) from the `[TICKET:TKT-123 <id>]` line of the message you are acting on. Omit it and the task is still linked when your current turn has exactly one ticket |
55
56
 
56
57
  ### Always attach a brief
57
58
 
@@ -30,6 +30,8 @@ Options:
30
30
  --description | -d Short summary of the task (optional)
31
31
  --brief Long-form brief in markdown: inline text, or @/path/to/file.md
32
32
  Should carry Goal + Expected Outcome + Eval Criteria. Max 16384 bytes.
33
+ --request-id | -R Ticket this task is for: the id (or TKT-123) from the
34
+ [TICKET:TKT-123 <id>] line of the message you are working on
33
35
  --json | -j Raw JSON payload (same as legacy)
34
36
  --help | -h Show this help
35
37
  EOF_USAGE
@@ -45,6 +47,7 @@ OUTPUT_SCHEMA=""
45
47
  OWNER=""
46
48
  DESCRIPTION=""
47
49
  BRIEF=""
50
+ REQUEST_ID=""
48
51
 
49
52
  # Detect legacy JSON argument
50
53
  if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
@@ -90,6 +93,10 @@ while [[ $# -gt 0 ]]; do
90
93
  BRIEF="$2"
91
94
  shift 2
92
95
  ;;
96
+ --request-id|-R)
97
+ REQUEST_ID="$2"
98
+ shift 2
99
+ ;;
93
100
  --json|-j)
94
101
  INPUT_JSON="$2"
95
102
  shift 2
@@ -133,6 +140,7 @@ if [ -n "$INPUT_JSON" ]; then
133
140
  [ -z "$OWNER" ] && OWNER=$(printf '%s' "$INPUT" | jq -r '.owner // empty')
134
141
  [ -z "$DESCRIPTION" ] && DESCRIPTION=$(printf '%s' "$INPUT" | jq -r '.description // empty')
135
142
  [ -z "$BRIEF" ] && BRIEF=$(printf '%s' "$INPUT" | jq -r '.briefMarkdown // .brief // empty')
143
+ [ -z "$REQUEST_ID" ] && REQUEST_ID=$(printf '%s' "$INPUT" | jq -r '.requestId // empty')
136
144
  fi
137
145
 
138
146
  # Apply defaults
@@ -203,6 +211,7 @@ WORK_ITEM=$(jq -n \
203
211
  --arg priority "$PRIORITY" \
204
212
  --arg description "$DESCRIPTION" \
205
213
  --arg briefMarkdown "$BRIEF" \
214
+ --arg requestId "$REQUEST_ID" \
206
215
  '{
207
216
  title: $title,
208
217
  type: "delegate",
@@ -212,6 +221,7 @@ WORK_ITEM=$(jq -n \
212
221
  }
213
222
  + (if $description != "" then {description: $description} else {} end)
214
223
  + (if $briefMarkdown != "" then {briefMarkdown: $briefMarkdown} else {} end)
224
+ + (if $requestId != "" then {requestId: $requestId} else {} end)
215
225
  | with_entries(select(.value != null))')
216
226
 
217
227
  if [ -n "$OUTPUT_SCHEMA" ] && [ "$OUTPUT_SCHEMA" != "" ]; then
@@ -82,7 +82,7 @@ fi
82
82
  # ---------------------------------------------------------------------------
83
83
  # Call backend API
84
84
  # ---------------------------------------------------------------------------
85
- CREWLY_PORT="${CREWLY_PORT:-8787}"
85
+ CREWLY_PORT="${CREWLY_PORT:-${WEB_PORT:-8787}}"
86
86
  API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
87
87
 
88
88
  RESPONSE=$(curl -s -w "\n%{http_code}" \
@@ -56,7 +56,7 @@ TIMESTAMP="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
56
56
  # --- Step 0: Resolve target WorkItem if not supplied ---
57
57
  # Resolve order: explicit workItemId > the agent's currently-running claim.
58
58
  if [ -z "$WORK_ITEM_ID" ]; then
59
- POOL_RESP=$(api_call GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
59
+ POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
60
60
  WORK_ITEM_ID=$(echo "$POOL_RESP" | jq -r '.workItems[0].id // .data[0].id // empty' 2>/dev/null || true)
61
61
  fi
62
62
 
@@ -37,7 +37,7 @@ bash execute.sh --name-prefix watch:
37
37
 
38
38
  ## What you see
39
39
 
40
- Returns `{ success, count, data: [Trigger, ...] }`. Each `Trigger` includes:
40
+ Returns `{ success, examined, count, data: [Trigger, ...] }` — `examined` is the number of triggers fetched before the team filter, `count` the number left after all filters. A truncated or malformed backend response exits 1 with `success:false` and an `error`; it is never reported as `count: 0`. Each `Trigger` includes:
41
41
  - `id`, `name`, `status`
42
42
  - `config` (cron expression / fireAt / event type)
43
43
  - `action` (what it creates when it fires)