crewly 1.20.366 → 1.20.368

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 (34) hide show
  1. package/config/skills/agent/core/reply/SKILL.md +3 -0
  2. package/dist/backend/backend/src/constants.d.ts +13 -0
  3. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  4. package/dist/backend/backend/src/constants.js +14 -1
  5. package/dist/backend/backend/src/constants.js.map +1 -1
  6. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +15 -0
  7. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  8. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +33 -3
  9. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  10. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +44 -0
  12. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  13. package/dist/backend/backend/src/services/slack/room-responder.d.ts +7 -0
  14. package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -1
  15. package/dist/backend/backend/src/services/slack/room-responder.js +16 -0
  16. package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -1
  17. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +15 -0
  18. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  19. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +37 -1
  20. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  21. package/dist/backend/build-info.json +2 -2
  22. package/dist/cli/backend/src/constants.d.ts +13 -0
  23. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  24. package/dist/cli/backend/src/constants.js +14 -1
  25. package/dist/cli/backend/src/constants.js.map +1 -1
  26. package/dist/cli/backend/src/services/slack/room-responder.d.ts +7 -0
  27. package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -1
  28. package/dist/cli/backend/src/services/slack/room-responder.js +16 -0
  29. package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -1
  30. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +15 -0
  31. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  32. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +37 -1
  33. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  34. package/package.json +1 -1
@@ -42,7 +42,7 @@ import { describeSlackError } from './slack.service.js';
42
42
  import { isSilentByDefault, } from '../chat-v2/chat-v2.dispatcher.service.js';
43
43
  import { ROOM_RESPONDER_CONSTANTS } from '../../constants.js';
44
44
  import { isDriveModeRow } from '../drive/drive-row.utils.js';
45
- import { buildRoomAgentDirectory, findPriorRoomAnswer, threadOwnerFromSlack, } from './room-responder.js';
45
+ import { buildRoomAgentDirectory, findPriorRoomAnswer, lastOwnerMessageAt, threadOwnerFromSlack, } from './room-responder.js';
46
46
  import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
47
47
  import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
48
48
  import { getOwnerMessageWatchdog } from '../messaging/owner-message-watchdog.service.js';
@@ -2329,6 +2329,42 @@ export class SlackTeamChannelService {
2329
2329
  .map((m) => ({ session: m.agentSession, name: m.displayName }));
2330
2330
  return { readable: true, owner: threadOwnerFromSlack(ctx, buildRoomAgentDirectory({ local, remote })) };
2331
2331
  }
2332
+ /**
2333
+ * The owner thread an agent is about to post into has gone quiet: the
2334
+ * owner last wrote in it longer ago than STALE_OWNER_THREAD_MS. A post
2335
+ * there reads with no context (2026-10-19, Ella's Reddit summary).
2336
+ *
2337
+ * @param input - Conversation and the thread the agent named (message id or Slack thread key)
2338
+ * @param now - Current time (epoch ms)
2339
+ * @returns When the owner last wrote there, or null when the thread is fresh, not a room thread, or the owner never wrote in it
2340
+ */
2341
+ async staleOwnerThread(input, now = Date.now()) {
2342
+ try {
2343
+ await this.load();
2344
+ const mapping = (this.store?.mappings ?? []).find((m) => m.chatChannelId === input.conversationId);
2345
+ const raw = input.thread?.trim();
2346
+ if (!mapping || !raw || !this.deps.chat.listThreadForBridge)
2347
+ return null;
2348
+ let rootId;
2349
+ const named = this.deps.chat.getMessageForBridge(raw);
2350
+ if (named && named.channelId === input.conversationId)
2351
+ rootId = named.threadId ?? named.id;
2352
+ const key = parseSlackThreadKey(raw);
2353
+ if (!rootId && key && key.slackChannelId === mapping.slackChannelId) {
2354
+ rootId = this.deps.chat.findSlackThreadRoot(input.conversationId, key.threadTs)?.id;
2355
+ }
2356
+ if (!rootId)
2357
+ return null;
2358
+ const lastOwnerAt = lastOwnerMessageAt(this.deps.chat.listThreadForBridge(input.conversationId, rootId));
2359
+ if (lastOwnerAt === null || now - lastOwnerAt <= ROOM_RESPONDER_CONSTANTS.STALE_OWNER_THREAD_MS)
2360
+ return null;
2361
+ return { lastOwnerAt };
2362
+ }
2363
+ catch {
2364
+ // A backstop: never block a post because the lookup failed.
2365
+ return null;
2366
+ }
2367
+ }
2332
2368
  /**
2333
2369
  * The reply gate (specs/2026-10-03-one-responder-per-message.md §2): an
2334
2370
  * agent is about to post in a room thread where a different agent already