crewly 1.13.1 → 1.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/config/constants.ts +8 -0
  2. package/config/roles/orchestrator/prompt.md +23 -0
  3. package/config/skills/agent/core/reply-channel/SKILL.md +6 -0
  4. package/config/skills/agent/core/reply-channel/execute.sh +14 -2
  5. package/config/skills/agent/core/slack-post/SKILL.md +126 -0
  6. package/config/skills/agent/core/slack-post/execute.sh +127 -0
  7. package/config/skills/agent/remote-browser/SKILL.md +178 -0
  8. package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +46 -22
  9. package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +82 -214
  10. package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +3 -3
  11. package/config/skills/orchestrator/get-team-status/SKILL.md +5 -1
  12. package/config/skills/orchestrator/get-team-status/execute.sh +28 -2
  13. package/config/slack-app-manifest.json +7 -1
  14. package/dist/backend/backend/src/config/oauth.config.d.ts +93 -19
  15. package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -1
  16. package/dist/backend/backend/src/config/oauth.config.js +121 -19
  17. package/dist/backend/backend/src/config/oauth.config.js.map +1 -1
  18. package/dist/backend/backend/src/constants.d.ts +60 -0
  19. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  20. package/dist/backend/backend/src/constants.js +74 -0
  21. package/dist/backend/backend/src/constants.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/chat/chat.controller.js +33 -4
  24. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +27 -9
  27. package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  29. package/dist/backend/backend/src/controllers/slack/slack.controller.js +342 -0
  30. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  31. package/dist/backend/backend/src/index.d.ts.map +1 -1
  32. package/dist/backend/backend/src/index.js +31 -7
  33. package/dist/backend/backend/src/index.js.map +1 -1
  34. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +10 -0
  35. package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/agent/idle-detection.service.js +37 -0
  37. package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
  39. package/dist/backend/backend/src/services/browser/browser-bridge.service.js +13 -11
  40. package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
  41. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +14 -0
  42. package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +56 -0
  44. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts +63 -0
  46. package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/browser/browser-services.registry.js +74 -0
  48. package/dist/backend/backend/src/services/browser/browser-services.registry.js.map +1 -0
  49. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +25 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -7
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +66 -0
  54. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +121 -1
  56. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +35 -0
  58. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +63 -0
  60. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  61. package/dist/backend/backend/src/services/core/storage.service.d.ts +6 -0
  62. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/core/storage.service.js +1 -1
  64. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
  67. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  68. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +14 -0
  70. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
  72. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
  74. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +34 -0
  76. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +99 -10
  78. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  79. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
  80. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +416 -0
  82. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
  83. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +124 -0
  84. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -0
  85. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +243 -0
  86. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -0
  87. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +11 -0
  88. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-initializer.js +56 -0
  90. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  91. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
  92. package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
  93. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +197 -0
  94. package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
  95. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
  97. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
  99. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
  100. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +821 -0
  101. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
  102. package/dist/backend/backend/src/services/slack/slack.service.d.ts +116 -1
  103. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/slack/slack.service.js +297 -3
  105. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  106. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +22 -0
  107. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  108. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +71 -0
  109. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  110. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +20 -2
  111. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
  112. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +27 -2
  113. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
  114. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +36 -2
  115. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +86 -10
  117. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
  118. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +37 -0
  119. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +74 -8
  121. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  122. package/dist/backend/backend/src/types/slack.types.d.ts +87 -0
  123. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  124. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  125. package/dist/backend/build-info.json +2 -2
  126. package/dist/backend/config/constants.d.ts +8 -0
  127. package/dist/backend/config/constants.d.ts.map +1 -1
  128. package/dist/backend/config/constants.js +8 -0
  129. package/dist/backend/config/constants.js.map +1 -1
  130. package/dist/cli/backend/src/config/oauth.config.d.ts +93 -19
  131. package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -1
  132. package/dist/cli/backend/src/config/oauth.config.js +121 -19
  133. package/dist/cli/backend/src/config/oauth.config.js.map +1 -1
  134. package/dist/cli/backend/src/constants.d.ts +60 -0
  135. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  136. package/dist/cli/backend/src/constants.js +74 -0
  137. package/dist/cli/backend/src/constants.js.map +1 -1
  138. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +292 -0
  139. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
  140. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +420 -0
  141. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
  142. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
  143. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
  144. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
  145. package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
  146. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +66 -0
  147. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  148. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +121 -1
  149. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  150. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +35 -0
  151. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  152. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +63 -0
  153. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  154. package/dist/cli/backend/src/services/core/storage.service.d.ts +6 -0
  155. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  156. package/dist/cli/backend/src/services/core/storage.service.js +1 -1
  157. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  158. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
  159. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
  160. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
  161. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
  162. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  163. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
  164. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  165. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
  166. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
  167. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +416 -0
  168. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
  169. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
  170. package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
  171. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +197 -0
  172. package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
  173. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  174. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
  175. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  176. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
  177. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
  178. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +821 -0
  179. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
  180. package/dist/cli/backend/src/services/slack/slack.service.d.ts +116 -1
  181. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  182. package/dist/cli/backend/src/services/slack/slack.service.js +297 -3
  183. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  184. package/dist/cli/backend/src/types/slack.types.d.ts +87 -0
  185. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  186. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  187. package/dist/cli/backend/src/utils/team.utils.d.ts +40 -0
  188. package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -0
  189. package/dist/cli/backend/src/utils/team.utils.js +66 -0
  190. package/dist/cli/backend/src/utils/team.utils.js.map +1 -0
  191. package/dist/cli/cli/src/index.js +0 -0
  192. package/dist/cli/config/constants.d.ts +8 -0
  193. package/dist/cli/config/constants.d.ts.map +1 -1
  194. package/dist/cli/config/constants.js +8 -0
  195. package/dist/cli/config/constants.js.map +1 -1
  196. package/frontend/dist/assets/{index-890d3f9d.js → index-190a957f.js} +294 -294
  197. package/frontend/dist/assets/{index-8205ea5e.css → index-88feb412.css} +1 -1
  198. package/frontend/dist/index.html +2 -2
  199. package/package.json +1 -1
  200. package/config/constants.d.ts.map +0 -1
  201. package/config/index.d.ts.map +0 -1
  202. package/dist/backend/backend/src/controllers/knowledge/index.d.ts +0 -7
  203. package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +0 -1
  204. package/dist/backend/backend/src/controllers/knowledge/index.js +0 -7
  205. package/dist/backend/backend/src/controllers/knowledge/index.js.map +0 -1
  206. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +0 -71
  207. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +0 -1
  208. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +0 -237
  209. package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +0 -1
  210. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +0 -24
  211. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +0 -1
  212. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +0 -34
  213. package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +0 -1
  214. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts +0 -91
  215. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts.map +0 -1
  216. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js +0 -290
  217. package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js.map +0 -1
  218. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
  219. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
  220. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
  221. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
  222. package/dist/backend/backend/src/index.js.orc-bak-20260529 +0 -3130
  223. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts +0 -27
  224. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts.map +0 -1
  225. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js +0 -40
  226. package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js.map +0 -1
  227. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
  228. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
  229. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
  230. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
  231. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
  232. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
  233. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
  234. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
  235. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
  236. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
  237. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
  238. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
  239. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
  240. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
  241. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
  242. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
  243. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
  244. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
  245. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
  246. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
  247. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
  248. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
  249. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
  250. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
  251. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
  252. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
  253. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
  254. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
  255. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
  256. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
  257. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
  258. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
  259. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
  260. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
  261. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
  262. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
  263. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
  264. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
  265. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
  266. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
  267. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
  268. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
  269. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
  270. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
  271. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
  272. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
  273. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
  274. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
  275. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
  276. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
  277. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
  278. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
  279. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
  280. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
  281. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
  282. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
  283. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
  284. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
  285. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
  286. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
  287. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
  288. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
  289. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
  290. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
  291. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
  292. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
  293. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
  294. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
  295. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
  296. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
  297. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
  298. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
  299. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
  300. package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
  301. package/dist/backend/backend/src/services/knowledge/embedding-provider.js +0 -179
  302. package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +0 -1
  303. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
  304. package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
  305. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +0 -241
  306. package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
  307. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
  308. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
  309. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
  310. package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
  311. package/dist/backend/backend/src/services/knowledge/index.d.ts +0 -8
  312. package/dist/backend/backend/src/services/knowledge/index.d.ts.map +0 -1
  313. package/dist/backend/backend/src/services/knowledge/index.js +0 -8
  314. package/dist/backend/backend/src/services/knowledge/index.js.map +0 -1
  315. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
  316. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
  317. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +0 -590
  318. package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
  319. package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
  320. package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
  321. package/dist/backend/backend/src/services/knowledge/knowledge.service.js +0 -409
  322. package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +0 -1
  323. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
  324. package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
  325. package/dist/backend/backend/src/services/knowledge/vector-store.service.js +0 -830
  326. package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +0 -1
  327. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  328. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  329. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  330. package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  331. package/dist/backend/backend/src/services/memory/embedding-provider.d.ts +0 -78
  332. package/dist/backend/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  333. package/dist/backend/backend/src/services/memory/embedding-provider.js +0 -185
  334. package/dist/backend/backend/src/services/memory/embedding-provider.js.map +0 -1
  335. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts +0 -331
  336. package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  337. package/dist/backend/backend/src/services/memory/vector-store.service.js +0 -825
  338. package/dist/backend/backend/src/services/memory/vector-store.service.js.map +0 -1
  339. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
  340. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  341. package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
  342. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
  343. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
  344. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
  345. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
  346. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
  347. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
  348. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
  349. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
  350. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
  351. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts +0 -234
  352. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts.map +0 -1
  353. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js +0 -636
  354. package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js.map +0 -1
  355. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts +0 -156
  356. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts.map +0 -1
  357. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js +0 -81
  358. package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js.map +0 -1
  359. package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
  360. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
  361. package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
  362. package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
  363. package/dist/backend/backend/src/types/knowledge.types.d.ts +0 -195
  364. package/dist/backend/backend/src/types/knowledge.types.d.ts.map +0 -1
  365. package/dist/backend/backend/src/types/knowledge.types.js +0 -38
  366. package/dist/backend/backend/src/types/knowledge.types.js.map +0 -1
  367. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
  368. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
  369. package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
  370. package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
  371. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
  372. package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
  373. package/dist/cli/backend/src/services/knowledge/embedding-provider.js +0 -179
  374. package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +0 -1
  375. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
  376. package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
  377. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +0 -241
  378. package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
  379. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
  380. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
  381. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
  382. package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
  383. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
  384. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
  385. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
  386. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
  387. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
  388. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
  389. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +0 -590
  390. package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
  391. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
  392. package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
  393. package/dist/cli/backend/src/services/knowledge/knowledge.service.js +0 -409
  394. package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +0 -1
  395. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
  396. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
  397. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
  398. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
  399. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
  400. package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
  401. package/dist/cli/backend/src/services/knowledge/vector-store.service.js +0 -830
  402. package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +0 -1
  403. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
  404. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
  405. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
  406. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
  407. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
  408. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
  409. package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
  410. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
  411. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
  412. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
  413. package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
  414. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
  415. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
  416. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
  417. package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
  418. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
  419. package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
  420. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
  421. package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
  422. package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
  423. package/dist/cli/backend/src/types/knowledge.types.d.ts +0 -195
  424. package/dist/cli/backend/src/types/knowledge.types.d.ts.map +0 -1
  425. package/dist/cli/backend/src/types/knowledge.types.js +0 -38
  426. package/dist/cli/backend/src/types/knowledge.types.js.map +0 -1
@@ -873,6 +873,14 @@ export const AGENT_SUSPEND_CONSTANTS = {
873
873
  ALWAYS_ON_ROLES: ['orchestrator', 'auditor'] as const,
874
874
  /** Idle timeout in ms before a worker agent is stopped (default 30 min) */
875
875
  AGENT_IDLE_STOP_TIMEOUT_MS: 1_800_000,
876
+ /**
877
+ * Do not idle-stop an agent whose next cron run is due within this many
878
+ * minutes. Killing it only to respawn it for the cron costs a cold start
879
+ * (init prompt + registration + recall, ~0.5-1M input tokens on Codex)
880
+ * every single run — a 15-minute cron under a 10-minute idle timeout
881
+ * paid that 50 times a day on steamfun-ops (2026-09-16).
882
+ */
883
+ CRON_KEEPALIVE_WINDOW_MINUTES: 30,
876
884
  } as const;
877
885
 
878
886
  // ========================= SERVER PROCESS CONSTANTS =========================
@@ -618,6 +618,29 @@ After queueing, continue the turn normally. A separate `wiki-process-queue` run
618
618
 
619
619
  The trigger debounces — replying does not cause re-fire. Ignoring it means the next fire arrives 4h later and the counter shows zero queue-adds, which Steve will notice during audits.
620
620
 
621
+ ## Context Hygiene — keep tool output small (2026-09-16) — MANDATORY
622
+
623
+ Every byte a command prints stays in your context for the rest of the
624
+ session and is re-sent to the model on every subsequent call. On a
625
+ long-running box the cost of the session is dominated by this, not by
626
+ the work itself. Rules:
627
+
628
+ 1. **Never dump raw output.** No bare `cat` of a file, no raw `curl`/API
629
+ JSON, no `rg` across a tree. Pipe through `jq '<selector>'`,
630
+ `head -n 40`, `grep`, or `wc -l` and ask for exactly the field you need.
631
+ 2. **`get-team-status` is compact by default.** Only pass `--full` when a
632
+ specific field is missing from the compact view.
633
+ 3. **Bridge-auto wiki WIs: one pass, then stop.** If `wiki-migrate --apply`
634
+ reports `applied: 0`, there is nothing left to migrate right now — say so
635
+ in `complete-task` and move on. Do not re-run scan + apply in the same
636
+ turn, and do not re-check "just in case"; the bridge backs off on its
637
+ own when nothing changed.
638
+ 4. **One reminder covers all queued WorkItems.** A `[CREWLY-DISPATCH]` that
639
+ lists several WIs means: process all of them in this turn. Do not wait
640
+ for a separate message per item.
641
+ 5. **Reflect / bookkeep messages list every vault at once.** Handle the
642
+ whole list in one sweep and reply once.
643
+
621
644
  ## Turn-end "idle-drain" checklist (2026-05-26) — MANDATORY
622
645
 
623
646
  Before yielding the turn, run this 5-step check. **Task work always wins** — only drain wiki when you're genuinely idle, never block a chat reply or active WI on wiki maintenance.
@@ -36,9 +36,15 @@ user's chat UI sees it.
36
36
  bash config/skills/agent/core/reply-channel/execute.sh \
37
37
  --channel <channelId> \
38
38
  --content "your reply text" \
39
+ [--thread <messageId>] \
39
40
  [--cmid <clientMessageId>]
40
41
  ```
41
42
 
43
+ `--thread` replies inside an existing thread. When the prompt you received
44
+ came from a **Slack team channel** it names the thread id
45
+ (`--thread <id>`); pass it through so your reply shows up in the same Slack
46
+ thread, under your own name.
47
+
42
48
  Or with JSON:
43
49
 
44
50
  ```bash
@@ -15,7 +15,7 @@ print_usage() {
15
15
  cat <<'EOF_USAGE'
16
16
  Usage:
17
17
  # CLI flags (preferred)
18
- bash execute.sh --channel <channelId> --content "reply text" [--cmid <clientMessageId>]
18
+ bash execute.sh --channel <channelId> --content "reply text" [--thread <messageId>] [--cmid <clientMessageId>]
19
19
 
20
20
  # Content from stdin
21
21
  echo "multi-line reply" | bash execute.sh --channel chan-1
@@ -27,6 +27,8 @@ Options:
27
27
  --channel | -c Target channel id (required)
28
28
  --content | -m Reply text (required unless piped via stdin)
29
29
  --content-file Read reply text from a file path
30
+ --thread | -t Thread root message id — reply inside that thread
31
+ (Slack team channels: keeps the reply in the same Slack thread)
30
32
  --cmid Optional client-message-id for idempotency
31
33
  --json | -j Raw JSON payload
32
34
  --help | -h Show this help
@@ -37,6 +39,7 @@ INPUT_JSON=""
37
39
  CHANNEL_ID=""
38
40
  CONTENT=""
39
41
  CMID=""
42
+ THREAD_ID=""
40
43
 
41
44
  # Detect legacy JSON argument as $1
42
45
  if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
@@ -62,6 +65,10 @@ while [[ $# -gt 0 ]]; do
62
65
  CMID="$2"
63
66
  shift 2
64
67
  ;;
68
+ --thread|-t)
69
+ THREAD_ID="$2"
70
+ shift 2
71
+ ;;
65
72
  --json|-j)
66
73
  INPUT_JSON="$2"
67
74
  shift 2
@@ -95,6 +102,7 @@ except Exception as e:
95
102
  sys.exit(0)
96
103
  print('CHANNEL=' + str(d.get('channelId', '')))
97
104
  print('CMID=' + str(d.get('clientMessageId', '')))
105
+ print('THREAD=' + str(d.get('threadId', '')))
98
106
  # content is multi-line safe — use base64
99
107
  import base64
100
108
  c = d.get('content', '')
@@ -109,6 +117,7 @@ PY
109
117
  case "$line" in
110
118
  CHANNEL=*) [ -z "$CHANNEL_ID" ] && CHANNEL_ID="${line#CHANNEL=}";;
111
119
  CMID=*) [ -z "$CMID" ] && CMID="${line#CMID=}";;
120
+ THREAD=*) [ -z "$THREAD_ID" ] && THREAD_ID="${line#THREAD=}";;
112
121
  CONTENT_B64=*) [ -z "$CONTENT" ] && CONTENT="$(echo "${line#CONTENT_B64=}" | base64 -d 2>/dev/null)";;
113
122
  esac
114
123
  done <<< "$EXTRACTED"
@@ -131,12 +140,15 @@ fi
131
140
  # Build JSON body. Export CONTENT/CMID so python can read them safely without
132
141
  # quoting the values through the shell (avoids escaping hell for multi-line
133
142
  # content with quotes, backslashes, backticks, etc.).
134
- BODY=$(CONTENT="$CONTENT" CMID="$CMID" python3 -c '
143
+ BODY=$(CONTENT="$CONTENT" CMID="$CMID" THREAD_ID="$THREAD_ID" python3 -c '
135
144
  import os, json
136
145
  p = {"content": os.environ["CONTENT"], "contentType": "markdown"}
137
146
  cmid = os.environ.get("CMID", "")
138
147
  if cmid:
139
148
  p["clientMessageId"] = cmid
149
+ thread = os.environ.get("THREAD_ID", "")
150
+ if thread:
151
+ p["threadId"] = thread
140
152
  print(json.dumps(p))
141
153
  ')
142
154
 
@@ -0,0 +1,126 @@
1
+ ---
2
+ name: slack-post
3
+ description: Start a Slack conversation yourself — post to a channel or DM a person, under your own Slack identity. Use it to raise something proactively, not to answer a message you were already sent (that is reply-channel).
4
+ version: 1.0.0
5
+ category: communication
6
+ skillType: claude-skill
7
+ assignableRoles:
8
+ - team-leader
9
+ - tpm
10
+ - developer
11
+ - frontend-developer
12
+ - backend-developer
13
+ - fullstack-dev
14
+ - qa
15
+ - qa-engineer
16
+ - designer
17
+ - product-manager
18
+ - architect
19
+ - generalist
20
+ - sales
21
+ - support
22
+ - marketing
23
+ triggers:
24
+ - slack post
25
+ - message slack
26
+ - dm on slack
27
+ - tell the team on slack
28
+ tags:
29
+ - communication
30
+ - slack
31
+ - proactive
32
+ execution:
33
+ type: script
34
+ script:
35
+ file: execute.sh
36
+ interpreter: bash
37
+ timeoutMs: 20000
38
+ ---
39
+
40
+ # slack-post
41
+
42
+ Send a Slack message on your own initiative. If you have a Slack identity of
43
+ your own, the message comes from your bot user, so a DM is a real conversation
44
+ between that person and you. Otherwise it goes out through the shared Crewly
45
+ bot carrying your name and icon.
46
+
47
+ ## When to use
48
+
49
+ - Something you found needs a human's attention now, and nobody asked you.
50
+ - You finished long-running work and the person who wanted it is not in the
51
+ thread any more.
52
+ - You need one specific person, so a DM beats the team channel.
53
+
54
+ **Do not use it to answer a message you were handed.** A prompt that starts
55
+ with `[CHAT:<channelId>]` is answered with `reply-channel`, which keeps your
56
+ reply in the same Slack thread.
57
+
58
+ ## Invocation
59
+
60
+ ```bash
61
+ bash config/skills/agent/core/slack-post/execute.sh \
62
+ --target "#general" \
63
+ --text "Deploy finished, staging is on 1.4.2."
64
+ ```
65
+
66
+ ```bash
67
+ # DM a person by handle
68
+ bash config/skills/agent/core/slack-post/execute.sh --target "@steve" --text "..."
69
+
70
+ # Reply inside an existing Slack thread
71
+ bash config/skills/agent/core/slack-post/execute.sh --target C0123ABCD --thread 1712345678.000100 --text "..."
72
+
73
+ # Long text from a file, or piped
74
+ bash .../execute.sh --target "#general" --text-file /tmp/report.md
75
+ echo "..." | bash .../execute.sh --target "@steve"
76
+ ```
77
+
78
+ ## Target syntax
79
+
80
+ | Target | Goes to |
81
+ |---|---|
82
+ | `#general` or `general` | that channel |
83
+ | `C0123ABCD` | that channel by id |
84
+ | `D0123ABCD` | an already-open DM |
85
+ | `@steve` | a DM with that person |
86
+ | `U0123ABCD` | a DM with that user id |
87
+
88
+ Slack ids are upper-case and channel names are lower-case, which is how the
89
+ two are told apart. Write ids exactly as Slack shows them.
90
+
91
+ ## Options
92
+
93
+ | Flag | Short | Description |
94
+ |---|---|---|
95
+ | `--target` | `-c` | Channel or person (required) |
96
+ | `--text` | `-m` | Message text (required unless piped or `--text-file`) |
97
+ | `--text-file` | | Read the text from a file |
98
+ | `--thread` | `-t` | Slack thread timestamp to reply inside |
99
+ | `--json` | `-j` | Raw JSON payload |
100
+
101
+ ## Environment
102
+
103
+ - `CREWLY_SESSION_NAME` — your agent session, attached automatically. The post
104
+ is sent under that agent's identity, so this must be set.
105
+ - `CREWLY_API_URL` — defaults to `http://localhost:8787`.
106
+
107
+ ## Output
108
+
109
+ On success, JSON on stdout:
110
+
111
+ ```json
112
+ {"success":true,"channelId":"C-GEN","messageTs":"1712345678.000200","kind":"channel","postedAs":"agent"}
113
+ ```
114
+
115
+ `postedAs` is `agent` when your own Slack bot sent it, `crewly` when the shared
116
+ bot did.
117
+
118
+ ## Failures worth knowing
119
+
120
+ | Message contains | What to do |
121
+ |---|---|
122
+ | `No Slack channel named` | check the name, or the bot cannot see it (private channel needs an invite) |
123
+ | `No Slack user matches` | the handle is wrong; ask for the exact Slack handle |
124
+ | `invite ... into the channel` | a private channel the bot is not in; ask a human to invite it |
125
+ | `reinstall the app` | the Slack app is missing a scope; tell the owner |
126
+ | `Slack is not connected` | Slack is not configured on this install; stop, do not retry |
@@ -0,0 +1,127 @@
1
+ #!/bin/bash
2
+ # slack-post — send a Slack message on the agent's own initiative.
3
+ #
4
+ # Posts to a channel or opens a DM, under the calling agent's Slack identity
5
+ # (its own bot user when it has one). The shared `api_call` helper attaches
6
+ # `X-Agent-Session: $CREWLY_SESSION_NAME`, which the backend uses to pick that
7
+ # identity — without it the request is refused.
8
+ set -euo pipefail
9
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
10
+ source "${SCRIPT_DIR}/../../_common/lib.sh"
11
+
12
+ print_usage() {
13
+ cat <<'EOF_USAGE'
14
+ Usage:
15
+ bash execute.sh --target <#channel|@user|C…|D…|U…> --text "message" [--thread <ts>]
16
+
17
+ echo "message" | bash execute.sh --target "#general"
18
+ bash execute.sh --target "@steve" --text-file /tmp/report.md
19
+ bash execute.sh '{"target":"#general","text":"hi","threadTs":"100.1"}'
20
+
21
+ Options:
22
+ --target | -c Channel or person (required)
23
+ --text | -m Message text (required unless piped or --text-file)
24
+ --text-file Read the message text from a file
25
+ --thread | -t Slack thread timestamp to reply inside
26
+ --json | -j Raw JSON payload
27
+ --help | -h Show this help
28
+ EOF_USAGE
29
+ }
30
+
31
+ INPUT_JSON=""
32
+ TARGET=""
33
+ TEXT=""
34
+ THREAD_TS=""
35
+
36
+ # Legacy JSON as the first positional argument
37
+ if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
38
+ INPUT_JSON="$1"
39
+ shift || true
40
+ fi
41
+
42
+ while [[ $# -gt 0 ]]; do
43
+ case "$1" in
44
+ --target|-c) TARGET="$2"; shift 2 ;;
45
+ --text|-m) TEXT="$2"; shift 2 ;;
46
+ --text-file) TEXT="$(cat "$2")"; shift 2 ;;
47
+ --thread|-t) THREAD_TS="$2"; shift 2 ;;
48
+ --json|-j) INPUT_JSON="$2"; shift 2 ;;
49
+ --help|-h) print_usage; exit 0 ;;
50
+ *) echo "Unknown argument: $1" >&2; print_usage >&2; exit 2 ;;
51
+ esac
52
+ done
53
+
54
+ # Fall back to stdin for the body
55
+ if [ -z "$TEXT" ] && [ -z "$INPUT_JSON" ] && [ ! -t 0 ]; then
56
+ TEXT="$(cat)"
57
+ fi
58
+
59
+ if [ -n "$INPUT_JSON" ]; then
60
+ EXTRACTED=$(INPUT_JSON="$INPUT_JSON" python3 -c '
61
+ import base64, json, os, sys
62
+ try:
63
+ d = json.loads(os.environ["INPUT_JSON"])
64
+ except Exception as e:
65
+ print("PARSE_ERROR:" + str(e)); sys.exit(0)
66
+ print("TARGET=" + str(d.get("target", "")))
67
+ print("THREAD=" + str(d.get("threadTs", d.get("thread", ""))))
68
+ print("TEXT_B64=" + base64.b64encode(str(d.get("text", "")).encode("utf-8")).decode("ascii"))
69
+ ')
70
+ if echo "$EXTRACTED" | grep -q '^PARSE_ERROR'; then
71
+ echo '{"success":false,"error":"invalid JSON payload"}' >&2
72
+ exit 2
73
+ fi
74
+ while IFS= read -r line; do
75
+ case "$line" in
76
+ TARGET=*) [ -z "$TARGET" ] && TARGET="${line#TARGET=}" ;;
77
+ THREAD=*) [ -z "$THREAD_TS" ] && THREAD_TS="${line#THREAD=}" ;;
78
+ TEXT_B64=*) [ -z "$TEXT" ] && TEXT="$(echo "${line#TEXT_B64=}" | base64 -d 2>/dev/null)" ;;
79
+ esac
80
+ done <<< "$EXTRACTED"
81
+ fi
82
+
83
+ if [ -z "$TARGET" ]; then
84
+ echo '{"success":false,"error":"--target is required (#channel, @user, or a Slack id)"}' >&2
85
+ exit 2
86
+ fi
87
+ if [ -z "$TEXT" ]; then
88
+ echo '{"success":false,"error":"--text is required (or pipe it via stdin)"}' >&2
89
+ exit 2
90
+ fi
91
+ if [ -z "${CREWLY_SESSION_NAME:-}" ]; then
92
+ echo '{"success":false,"error":"CREWLY_SESSION_NAME is unset — the post needs an agent identity"}' >&2
93
+ exit 2
94
+ fi
95
+
96
+ # Convert literal \n to real newlines, matching the other comm skills
97
+ _NL=$'\n'; TEXT="${TEXT//\\n/$_NL}"
98
+
99
+ BODY=$(TARGET="$TARGET" TEXT="$TEXT" THREAD_TS="$THREAD_TS" python3 -c '
100
+ import json, os
101
+ p = {"target": os.environ["TARGET"], "text": os.environ["TEXT"]}
102
+ ts = os.environ.get("THREAD_TS", "")
103
+ if ts:
104
+ p["threadTs"] = ts
105
+ print(json.dumps(p))
106
+ ')
107
+
108
+ if RESPONSE=$(api_call POST "/slack/post" "$BODY" 2>&1); then
109
+ echo "$RESPONSE" | python3 -c '
110
+ import json, sys
111
+ try:
112
+ d = json.load(sys.stdin).get("data") or {}
113
+ except Exception:
114
+ print("{\"success\":true}"); raise SystemExit(0)
115
+ print(json.dumps({
116
+ "success": True,
117
+ "channelId": d.get("channelId", ""),
118
+ "messageTs": d.get("messageTs", ""),
119
+ "kind": d.get("kind", ""),
120
+ "postedAs": d.get("postedAs", ""),
121
+ }))
122
+ '
123
+ exit 0
124
+ else
125
+ echo "{\"success\":false,\"error\":$(echo "$RESPONSE" | python3 -c 'import json,sys;print(json.dumps(sys.stdin.read()))')}"
126
+ exit 1
127
+ fi
@@ -0,0 +1,178 @@
1
+ ---
2
+ name: Remote Browser
3
+ description: "Drive the user's real Chrome browser through the Crewly Chrome Extension. Navigate, click, fill forms, screenshot, read text, run JS, inspect cookies/console. Each agent gets its own bound tab, so concurrent agents never fight over the active tab. Plain HTTP + bash — usable by any agent runtime, not just Claude."
4
+ version: 1.0.0
5
+ category: browser
6
+ skillType: claude-skill
7
+ assignableRoles:
8
+ - developer
9
+ - qa
10
+ - researcher
11
+ - marketing
12
+ triggers:
13
+ - remote browser
14
+ - drive chrome
15
+ - control my browser
16
+ - use my chrome
17
+ - browser automation
18
+ - fill the form
19
+ - take a screenshot of the page
20
+ - scrape the page
21
+ tags:
22
+ - browser
23
+ - chrome
24
+ - extension
25
+ - automation
26
+ - scraping
27
+ ---
28
+
29
+ # Remote Browser
30
+
31
+ Control the user's **real, logged-in Chrome** — their sessions, their cookies,
32
+ their extensions — through the Crewly Chrome Extension.
33
+
34
+ ```
35
+ agent → bash execute.sh → POST /api/browser/* → WebSocket → Chrome Extension → real tab
36
+ ```
37
+
38
+ The transport is plain HTTP from a bash script, so **any agent runtime can use
39
+ it** (Claude Code, Codex, Gemini CLI, a cron job). There is no MCP dependency
40
+ and nothing model-specific.
41
+
42
+ ## Why this and not a headless browser
43
+
44
+ Use this when the task needs the user's **actual logged-in state** — an account
45
+ only they are signed into, a site behind SSO, a page whose content differs for
46
+ an authenticated user. For anything that works logged-out, a headless browser is
47
+ cheaper and will not disturb the user's window.
48
+
49
+ ## Usage
50
+
51
+ Two equivalent calling conventions:
52
+
53
+ ```bash
54
+ # JSON argument
55
+ bash execute.sh '{"action":"navigate","url":"https://example.com"}'
56
+
57
+ # Flags
58
+ bash execute.sh --action navigate --url https://example.com
59
+ bash execute.sh -a click -s "#submit"
60
+ ```
61
+
62
+ `bash execute.sh --help` prints the action list.
63
+
64
+ ## Actions
65
+
66
+ ### Page control
67
+ | Action | Required | Optional |
68
+ |---|---|---|
69
+ | `navigate` | `--url` | |
70
+ | `screenshot` | | |
71
+ | `full-page-screenshot` | | scrolls and stitches the whole page |
72
+ | `read-text` | | `--selector` (defaults to whole page) |
73
+ | `scroll` | | `--params` e.g. `'{"direction":"down","amount":3}'` |
74
+ | `scroll-in-element` | | `--params` with a selector + direction |
75
+
76
+ ### Interaction
77
+ | Action | Required | Optional |
78
+ |---|---|---|
79
+ | `click` | `--selector` | or `--params` for coordinate clicks |
80
+ | `fill` | `--selector` `--value` | replaces the field's contents |
81
+ | `type` | `--selector` `--text` | types keystroke by keystroke |
82
+ | `hover` | `--selector` | |
83
+ | `press-key` | `--params` e.g. `'{"key":"Enter"}'` | |
84
+ | `select-option` | `--selector` + one of `--value` / `--params` with `label` or `index` | resolution order: value → label → index |
85
+ | `set-file-input` | `--params` with selector + file path | |
86
+
87
+ ### Reading the page
88
+ | Action | Required | Optional |
89
+ |---|---|---|
90
+ | `get-element` | `--selector` | |
91
+ | `get-interactive-elements` | | `--params` — buttons/links/inputs with refs |
92
+ | `search-text` | `--text` | locate text on the page |
93
+ | `list-options` | `--selector` | enumerate a `<select>` |
94
+ | `wait-for-selector` | `--selector` | blocks until it appears |
95
+ | `execute-js` | `--code` | alias: `execute`. Raw JS in page context |
96
+
97
+ ### Browser state
98
+ | Action | Notes |
99
+ |---|---|
100
+ | `tabs` | list open tabs |
101
+ | `cookies` | optional `?domain=` on the endpoint |
102
+ | `console` | recent console messages; optional `?clear=true` |
103
+ | `local-storage` | `--params` to scope the read |
104
+ | `status` | extension connection status |
105
+ | `instances` | connected browser instances |
106
+ | `proxy-connect` | manually connect the proxy to Cloud Relay |
107
+
108
+ ### Tab binding
109
+ | Action | Notes |
110
+ |---|---|
111
+ | `bind-tab` | bind a tab to this agent; `--active` foregrounds it (default: background) |
112
+ | `unbind-tab` | release the tab and close it |
113
+
114
+ ## Per-agent tab binding
115
+
116
+ This is what makes the skill safe to run from several agents at once.
117
+
118
+ When `CREWLY_SESSION_NAME` is set in the agent's environment it is forwarded as
119
+ the `X-Agent-Session` header, and the backend dispatches each command to **that
120
+ agent's own tab** instead of whatever tab the user is looking at.
121
+
122
+ - The first command from a fresh agent auto-binds a new background tab.
123
+ - The resulting id is cached at
124
+ `~/.crewly/runtime/<agentSession>/browser-tab-id`, so later calls skip the
125
+ bind round-trip.
126
+ - Concurrent agents therefore never steal each other's page — and never yank
127
+ the user's foreground tab out from under them.
128
+
129
+ Escape hatches:
130
+
131
+ | Flag | Effect |
132
+ |---|---|
133
+ | `--tab-id <n>` | pin one call to a specific tab (tests, debugging) |
134
+ | `--no-bind` | drop the session header and use the legacy active-tab path |
135
+ | `--active` | with `bind-tab`, open the tab in the foreground |
136
+
137
+ With `CREWLY_SESSION_NAME` unset, behaviour falls back to the legacy active-tab
138
+ path, so scripts written before per-tab dispatch keep working unchanged.
139
+
140
+ ## Examples
141
+
142
+ ```bash
143
+ # Read a page that requires the user's login
144
+ bash execute.sh -a navigate -u "https://app.example.com/reports"
145
+ bash execute.sh -a wait-for-selector -s ".report-table"
146
+ bash execute.sh -a read-text -s ".report-table"
147
+
148
+ # Fill and submit a form
149
+ bash execute.sh -a fill -s "#email" -v "someone@example.com"
150
+ bash execute.sh -a type -s "#note" -t "Following up on the quote"
151
+ bash execute.sh -a click -s "button[type=submit]"
152
+
153
+ # Pull structured data out of the DOM
154
+ bash execute.sh -a execute-js -c '[...document.querySelectorAll(".row")].map(r=>r.innerText)'
155
+
156
+ # Explicit lifecycle when doing a long multi-step job
157
+ bash execute.sh -a bind-tab
158
+ # ... many commands ...
159
+ bash execute.sh -a unbind-tab
160
+ ```
161
+
162
+ ## Prerequisites
163
+
164
+ - Crewly backend running, with the Chrome Extension connected
165
+ (`bash execute.sh -a status` to confirm)
166
+ - `curl` and `jq` in PATH
167
+
168
+ ## Cautions
169
+
170
+ - **This is the user's real browser.** Actions have real effects under their
171
+ real identity: a click can send a message, place an order, or delete
172
+ something. Confirm before anything irreversible or outward-facing.
173
+ - Never enter passwords, card numbers, or other credentials — ask the user to
174
+ do it themselves in their own window.
175
+ - Avoid clicking elements that raise native `alert()` / `confirm()` dialogs:
176
+ they block the extension until dismissed by hand.
177
+ - Always `unbind-tab` when a job is done, or abandoned tabs accumulate in the
178
+ user's window.
@@ -1,29 +1,37 @@
1
1
  ---
2
2
  name: xiaoyuzhoufm-transcript
3
- description: Extract and transcribe 小宇宙 (Xiaoyuzhou FM) podcast episodes. Downloads audio from episode URL and uses Gemini Audio API for transcription with speaker identification and timestamps.
3
+ description: Extract and transcribe 小宇宙 (Xiaoyuzhou FM) podcast episodes. Resolves an episode URL to its audio, then transcribes with Whisper via the transcribe-audio skill — local whisper.cpp by default (free, offline), OpenAI Whisper API as fallback. Segment-level timestamps.
4
4
  category: content
5
5
  assignableRoles:
6
6
  - "*"
7
- version: "1.0.0"
7
+ version: "2.0.0"
8
8
  tags:
9
9
  - podcast
10
10
  - transcript
11
11
  - audio
12
- - gemini
12
+ - whisper
13
13
  - xiaoyuzhou
14
14
  - chinese
15
15
  ---
16
16
 
17
17
  # 小宇宙 Podcast Transcript
18
18
 
19
- Extract and transcribe podcast episodes from 小宇宙 (Xiaoyuzhou FM) using Gemini Audio API.
19
+ Turn a 小宇宙 episode URL into a timestamped transcript.
20
20
 
21
21
  ## Pipeline
22
22
 
23
23
  ```
24
- Episode URL → Fetch HTML → Extract audio URL → Download m4a → Upload to Gemini → Transcribe → Output
24
+ Episode URL → Fetch HTML → Extract audio URL → Download m4a
25
+ ↓
26
+ transcribe-audio (Whisper) → Markdown + JSON
25
27
  ```
26
28
 
29
+ This skill owns the 小宇宙 half — resolving an episode page to its audio and
30
+ labelling the result. Transcription is delegated to the `transcribe-audio`
31
+ skill, so there is one Whisper integration in the repo rather than two, and
32
+ this skill inherits its engine selection, normalization and long-file handling
33
+ for free.
34
+
27
35
  ## Usage
28
36
 
29
37
  ```bash
@@ -36,8 +44,12 @@ bash execute.sh '{"url":"https://www.xiaoyuzhoufm.com/episode/...","outputFile":
36
44
  # Transcribe a local audio file (skip download)
37
45
  bash execute.sh '{"audioFile":"/path/to/podcast.m4a"}'
38
46
 
39
- # Specify language hint
40
- bash execute.sh '{"url":"...","language":"Chinese"}'
47
+ # Language hint (ISO-639-1) — helps on mixed Chinese/English episodes
48
+ bash execute.sh '{"url":"...","language":"zh"}'
49
+
50
+ # Force an engine
51
+ bash execute.sh '{"url":"...","engine":"local"}'
52
+ bash execute.sh '{"url":"...","engine":"openai"}'
41
53
  ```
42
54
 
43
55
  ## Parameters
@@ -47,7 +59,8 @@ bash execute.sh '{"url":"...","language":"Chinese"}'
47
59
  | `url` | Yes* | 小宇宙 episode URL |
48
60
  | `audioFile` | Yes* | Path to local audio file (alternative to url) |
49
61
  | `outputFile` | No | Save transcript as markdown to this path |
50
- | `language` | No | Language hint for Gemini (default: auto-detect) |
62
+ | `language` | No | Language hint, ISO-639-1 (`zh`, `en`, `ja`…). Default: auto-detect |
63
+ | `engine` | No | `auto` (default), `local`, or `openai` — passed to `transcribe-audio` |
51
64
 
52
65
  *Either `url` or `audioFile` is required.
53
66
 
@@ -58,28 +71,39 @@ bash execute.sh '{"url":"...","language":"Chinese"}'
58
71
  "success": true,
59
72
  "title": "Episode Title",
60
73
  "url": "https://www.xiaoyuzhoufm.com/episode/...",
61
- "audioUrl": "https://media.xyzcdn.net/.../audio.m4a",
62
- "model": "gemini-2.5-flash-preview-05-20",
63
- "transcriptLength": 12345,
64
- "transcript": "**Speaker 1:** [00:00:00] Welcome to the show..."
74
+ "audioUrl": "https://media.xyzcdn.net/...",
75
+ "engine": "whisper.cpp",
76
+ "language": "zh",
77
+ "duration": 4437,
78
+ "transcriptLength": 41234,
79
+ "transcript": "[00:00:00] ...\n[00:00:07] ..."
65
80
  }
66
81
  ```
67
82
 
68
83
  ## Transcript Format
69
84
 
70
- - Speaker turns identified with `**Speaker Name:** text`
71
- - Timestamps at segment/topic changes: `[HH:MM:SS]`
72
- - Preserves original language (Chinese/English/mixed)
85
+ - One line per segment, prefixed `[HH:MM:SS]`
86
+ - Original language preserved (Chinese / English / mixed)
73
87
 
74
88
  ## Prerequisites
75
89
 
76
- - `GEMINI_API_KEY` environment variable or configured in Settings > API Keys
77
- - `curl` and `jq` available in PATH
78
- - Internet access to xiaoyuzhoufm.com and Gemini API
90
+ - `curl` and `jq` in PATH
91
+ - Whatever `transcribe-audio` needs: `ffmpeg`, plus either a local whisper.cpp
92
+ install (`whisper-cli` + a `ggml-*` model) or `OPENAI_API_KEY` for the fallback
93
+ - Internet access to xiaoyuzhoufm.com (and to the OpenAI API only if the local
94
+ engine is unavailable)
95
+
96
+ **No Gemini key is required.** On the default local path the transcription runs
97
+ entirely offline at zero per-use cost.
79
98
 
80
99
  ## Notes
81
100
 
82
- - Audio files are typically 30-90 minutes (20-80 MB)
83
- - Gemini processing takes 30-120 seconds depending on audio length
84
- - Maximum wait time: 5 minutes for Gemini processing
85
- - Temp files are auto-cleaned on exit
101
+ - Episodes are typically 30–90 minutes (20–80 MB)
102
+ - Local whisper.cpp roughly tracks real time on Apple Silicon; a 75-minute
103
+ episode takes on the order of ten minutes
104
+ - Temp files (page HTML, downloaded audio) are auto-cleaned on exit — including
105
+ on interrupt, so a killed run leaves nothing behind and also keeps nothing
106
+ to resume from
107
+ - **No speaker identification.** The previous Gemini-based version labelled
108
+ speaker turns; Whisper does not do diarization, so output is timestamped
109
+ segments only