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.
- package/config/skills/agent/core/reply/SKILL.md +3 -0
- package/dist/backend/backend/src/constants.d.ts +13 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +14 -1
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +15 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +33 -3
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +44 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.d.ts +7 -0
- package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.js +16 -0
- package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +15 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +37 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +13 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +14 -1
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/slack/room-responder.d.ts +7 -0
- package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/room-responder.js +16 -0
- package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +15 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +37 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- 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
|