crewly 1.20.469 → 1.20.471

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 (26) hide show
  1. package/config/skills/agent/core/block-task/SKILL.md +4 -0
  2. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  3. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +12 -1
  4. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  5. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts.map +1 -1
  6. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js +21 -2
  7. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js.map +1 -1
  8. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  9. package/dist/backend/backend/src/services/orc/work-item-destination.js +8 -1
  10. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
  11. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  12. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  13. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +31 -0
  14. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  15. package/dist/backend/build-info.json +2 -2
  16. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  17. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +12 -1
  18. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  19. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  20. package/dist/cli/backend/src/services/orc/work-item-destination.js +8 -1
  21. package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
  22. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +9 -0
  23. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  24. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +31 -0
  25. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  26. package/package.json +1 -1
@@ -3534,6 +3534,10 @@ export class SlackTeamChannelService {
3534
3534
  slackChannel: mapping.slackChannelName ?? message.channelId,
3535
3535
  agents: absent,
3536
3536
  });
3537
+ // In an ad-hoc room a bot that was never invited is invited now, so
3538
+ // the agent's reply can post. One the owner removed stays out.
3539
+ if (isAdhocMapping(mapping))
3540
+ await this.inviteUninvitedBots(mapping, absent);
3537
3541
  }
3538
3542
  if (seen > 0)
3539
3543
  return;
@@ -3646,8 +3650,35 @@ export class SlackTeamChannelService {
3646
3650
  huddle: huddle.id,
3647
3651
  agents: sessions,
3648
3652
  });
3653
+ // An @'d agent's bot is usually not in a channel the owner just made.
3654
+ // Private channel: its first post gets `channel_not_found` and the
3655
+ // owner's question goes unanswered (Atlas in #normandy, 2026-10-28). The
3656
+ // team-channel path invites every member's bot; do the same here. The
3657
+ // agent whose own app delivered this copy is a member already.
3658
+ await this.inviteUninvitedBots(mapping, sessions.filter((s) => s !== receiving));
3649
3659
  return mapping;
3650
3660
  }
3661
+ /**
3662
+ * Invite the installed bots of `sessions` into a room's Slack channel,
3663
+ * skipping any already invited there. A bot the owner later removed is
3664
+ * not re-invited: the invite is remembered on the identity record.
3665
+ *
3666
+ * @param mapping - The room
3667
+ * @param sessions - Agents whose bots should be in the channel
3668
+ */
3669
+ async inviteUninvitedBots(mapping, sessions) {
3670
+ const identities = this.deps.identities;
3671
+ if (!identities || sessions.length === 0)
3672
+ return;
3673
+ for (const session of sessions) {
3674
+ const record = identities.get(session);
3675
+ if (record?.status !== 'installed' || !record.botUserId)
3676
+ continue;
3677
+ if (record.invitedTo.includes(mapping.slackChannelId))
3678
+ continue;
3679
+ await this.inviteBot(mapping, session, record.botUserId);
3680
+ }
3681
+ }
3651
3682
  // -------------------------------------------------------------------------
3652
3683
  // Outbound (huddle → Slack)
3653
3684
  // -------------------------------------------------------------------------