crewly 1.20.154 → 1.20.156

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 (152) hide show
  1. package/config/skills/agent/core/attach-file/SKILL.md +1 -1
  2. package/config/skills/agent/core/attach-file/execute.sh +1 -1
  3. package/config/skills/agent/core/reply-channel/SKILL.md +4 -1
  4. package/config/skills/agent/core/reply-chat/SKILL.md +17 -0
  5. package/config/skills/agent/core/reply-chat/execute.sh +6 -1
  6. package/config/skills/agent/core/slack-post/SKILL.md +1 -1
  7. package/config/skills/team-leader/delegate-task/execute.sh +17 -4
  8. package/dist/backend/backend/src/constants.d.ts +138 -0
  9. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  10. package/dist/backend/backend/src/constants.js +149 -0
  11. package/dist/backend/backend/src/constants.js.map +1 -1
  12. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +18 -0
  13. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  14. package/dist/backend/backend/src/controllers/chat/chat.controller.js +42 -6
  15. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts +32 -0
  17. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +122 -8
  19. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/slack/slack.controller.js +6 -1
  22. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  23. package/dist/backend/backend/src/index.d.ts.map +1 -1
  24. package/dist/backend/backend/src/index.js +20 -0
  25. package/dist/backend/backend/src/index.js.map +1 -1
  26. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +16 -0
  27. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  28. package/dist/backend/backend/src/services/agent/agent-registration.service.js +54 -4
  29. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  30. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts +153 -1
  31. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -1
  32. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js +371 -22
  33. package/dist/backend/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -1
  34. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts +13 -0
  35. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +16 -0
  37. package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  38. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -1
  39. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +46 -3
  41. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  42. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +17 -4
  44. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +6 -0
  47. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  48. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +93 -6
  49. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +169 -15
  51. package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +2 -2
  53. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +15 -2
  55. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  56. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/slack/slack-initializer.js +7 -1
  58. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  59. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +40 -0
  60. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +86 -9
  62. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  63. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +1 -1
  64. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +33 -4
  66. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  67. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts +227 -0
  68. package/dist/backend/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -0
  69. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js +455 -0
  70. package/dist/backend/backend/src/services/slack/slack-thread-context.service.js.map +1 -0
  71. package/dist/backend/backend/src/services/slack/slack-thread-key.d.ts +66 -0
  72. package/dist/backend/backend/src/services/slack/slack-thread-key.d.ts.map +1 -0
  73. package/dist/backend/backend/src/services/slack/slack-thread-key.js +109 -0
  74. package/dist/backend/backend/src/services/slack/slack-thread-key.js.map +1 -0
  75. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +89 -13
  76. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +224 -50
  78. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +2 -0
  81. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  82. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +47 -0
  83. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +118 -3
  85. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  86. package/dist/backend/backend/src/types/event-bus.types.d.ts +5 -0
  87. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  88. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  89. package/dist/backend/backend/src/types/slack.types.d.ts +43 -0
  90. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  91. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  92. package/dist/backend/build-info.json +2 -2
  93. package/dist/cli/backend/src/constants.d.ts +138 -0
  94. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  95. package/dist/cli/backend/src/constants.js +149 -0
  96. package/dist/cli/backend/src/constants.js.map +1 -1
  97. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +16 -0
  98. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  99. package/dist/cli/backend/src/services/agent/agent-registration.service.js +54 -4
  100. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  101. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts +409 -0
  102. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.d.ts.map +1 -0
  103. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js +961 -0
  104. package/dist/cli/backend/src/services/agent/fresh-task-conversation.service.js.map +1 -0
  105. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts +13 -0
  106. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
  107. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +16 -0
  108. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
  109. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -1
  110. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  111. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +46 -3
  112. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  113. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  114. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +17 -4
  115. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  116. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  117. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +6 -0
  118. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  119. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +93 -6
  120. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
  121. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +169 -15
  122. package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
  123. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +40 -0
  124. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  125. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +86 -9
  126. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  127. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +1 -1
  128. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  129. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +33 -4
  130. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  131. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts +227 -0
  132. package/dist/cli/backend/src/services/slack/slack-thread-context.service.d.ts.map +1 -0
  133. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js +455 -0
  134. package/dist/cli/backend/src/services/slack/slack-thread-context.service.js.map +1 -0
  135. package/dist/cli/backend/src/services/slack/slack-thread-key.d.ts +66 -0
  136. package/dist/cli/backend/src/services/slack/slack-thread-key.d.ts.map +1 -0
  137. package/dist/cli/backend/src/services/slack/slack-thread-key.js +109 -0
  138. package/dist/cli/backend/src/services/slack/slack-thread-key.js.map +1 -0
  139. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +89 -13
  140. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  141. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +224 -50
  142. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  143. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  144. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +2 -0
  145. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  146. package/dist/cli/backend/src/types/event-bus.types.d.ts +5 -0
  147. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  148. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  149. package/dist/cli/backend/src/types/slack.types.d.ts +43 -0
  150. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  151. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  152. package/package.json +1 -1
@@ -11,7 +11,8 @@ import { RuntimeServiceFactory } from './runtime-service.factory.js';
11
11
  import { OrcReplyRouteService } from '../orc/orc-reply-route.service.js';
12
12
  import { registerInProcessRuntime, unregisterInProcessRuntime, } from './crewly-agent/in-process-runtime-registry.js';
13
13
  import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
14
- import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, SESSION_RECREATION_CONSTANTS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, GEMINI_STUCK_CONNECTIVITY_PATTERN, GEMINI_ERROR_STATE_CONSTANTS, REGISTRATION_DELIVERY_CONSTANTS, ORC_CONVERSATION_CONSTANTS, } from '../../constants.js';
14
+ import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, SESSION_RECREATION_CONSTANTS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, GEMINI_STUCK_CONNECTIVITY_PATTERN, GEMINI_ERROR_STATE_CONSTANTS, REGISTRATION_DELIVERY_CONSTANTS, ORC_CONVERSATION_CONSTANTS, SLACK_THREAD_KEY_CONSTANTS, } from '../../constants.js';
15
+ import { extractSlackThreadKeys, formatSlackThreadKey } from '../slack/slack-thread-key.js';
15
16
  import { delay } from '../../utils/async.utils.js';
16
17
  import { buildRuntimeModelFlags } from '../../utils/runtime-model-flags.utils.js';
17
18
  import { effectiveMemberModelId } from '../../utils/member-default-model.utils.js';
@@ -26,6 +27,7 @@ import { ContextWindowMonitorService } from './context-window-monitor.service.js
26
27
  import { OAuthReloginMonitorService } from './oauth-relogin-monitor.service.js';
27
28
  import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.service.js';
28
29
  import { InFlightTurnTracker } from '../restart/in-flight-turn-tracker.service.js';
30
+ import { FreshTaskConversationService } from './fresh-task-conversation.service.js';
29
31
  import { RestartDrainService } from '../restart/restart-drain.service.js';
30
32
  import { AgentSuspendService } from './agent-suspend.service.js';
31
33
  import { PromptBuilderService, buildModuleConfigFromTeamMember, memberSkillsJson, } from '../ai/prompt-builder.service.js';
@@ -348,8 +350,9 @@ export class AgentRegistrationService {
348
350
  * @param sessionName - Agent session that produced the response
349
351
  * @param text - Response text from the agent
350
352
  * @param conversationId - Chat conversation to route the response to
353
+ * @param slackThreadKey - Slack thread the delivered message came from, when it named exactly one
351
354
  */
352
- routeInProcessResponseToChat(sessionName, text, conversationId) {
355
+ routeInProcessResponseToChat(sessionName, text, conversationId, slackThreadKey) {
353
356
  // LEGACY PATH — chatGateway.processNotifyMessage → ChatService
354
357
  // (JSON files in ~/.crewly/chat/). Kept until Phase 5 data
355
358
  // migration retires the JSON store; until then the legacy file
@@ -370,7 +373,7 @@ export class AgentRegistrationService {
370
373
  // then failed enum validation, so every in-process reply to a web
371
374
  // conversation was rejected with "unknown metadata.source" and
372
375
  // silently dropped after the agent had already done the work.
373
- return chatGateway.processNotifyMessage(sessionName, text, conversationId);
376
+ return chatGateway.processNotifyMessage(sessionName, text, conversationId, slackThreadKey ? { [SLACK_THREAD_KEY_CONSTANTS.METADATA_KEY]: slackThreadKey } : undefined);
374
377
  })
375
378
  .then((chatMessage) => {
376
379
  if (chatMessage) {
@@ -3635,6 +3638,9 @@ Loop until done, blocked, or explicitly reassigned:
3635
3638
  let releaseMutex;
3636
3639
  const currentDelivery = new Promise((r) => { releaseMutex = r; });
3637
3640
  this.sessionDeliveryMutex.set(sessionName, currentDelivery);
3641
+ // No fresh-conversation / context-cap `/clear` may start while this
3642
+ // message is on its way in (it would be wiped before it is read).
3643
+ const endFreshDelivery = this.beginFreshDelivery(sessionName);
3638
3644
  if (previousDelivery) {
3639
3645
  this.logger.info('Waiting for in-flight delivery to complete before sending', {
3640
3646
  sessionName,
@@ -3643,6 +3649,8 @@ Loop until done, blocked, or explicitly reassigned:
3643
3649
  await previousDelivery.catch(() => { });
3644
3650
  }
3645
3651
  try {
3652
+ // A clear that was already running when this started finishes first.
3653
+ await this.waitIfFreshClearing(sessionName);
3646
3654
  if (!message || typeof message !== 'string') {
3647
3655
  return {
3648
3656
  success: false,
@@ -3693,6 +3701,13 @@ Loop until done, blocked, or explicitly reassigned:
3693
3701
  // Extract conversationId from [CHAT:xxx] or [GCHAT:xxx ...] prefix for response routing
3694
3702
  const chatPrefixMatch = message.match(/^\[(?:G?CHAT):([^\]\s]+)[^\]]*\]\s*/);
3695
3703
  const incomingConversationId = chatPrefixMatch?.[1];
3704
+ // The Slack thread this delivery came from ([SLACK-THREAD:<key>]).
3705
+ // The turn's text answers that thread, so the DM bridge posts it
3706
+ // there rather than in whichever thread was written in last.
3707
+ const incomingThreadKeys = extractSlackThreadKeys(message);
3708
+ const incomingThreadKey = incomingThreadKeys.length === 1
3709
+ ? formatSlackThreadKey(incomingThreadKeys[0].slackChannelId, incomingThreadKeys[0].threadTs)
3710
+ : undefined;
3696
3711
  // Extract Slack context from [SLACK:channelId:threadTs] marker if present (Bug 5).
3697
3712
  // This allows crewly-agent to auto-fill reply_slack with the correct thread.
3698
3713
  let slackMetadata;
@@ -3783,7 +3798,12 @@ Loop until done, blocked, or explicitly reassigned:
3783
3798
  });
3784
3799
  }
3785
3800
  if (replyText && incomingConversationId && !agentAlreadyReplied) {
3786
- this.routeInProcessResponseToChat(sessionName, replyText, incomingConversationId);
3801
+ if (incomingThreadKey) {
3802
+ this.routeInProcessResponseToChat(sessionName, replyText, incomingConversationId, incomingThreadKey);
3803
+ }
3804
+ else {
3805
+ this.routeInProcessResponseToChat(sessionName, replyText, incomingConversationId);
3806
+ }
3787
3807
  }
3788
3808
  else if (agentAlreadyReplied) {
3789
3809
  this.logger.debug('Skipping chat routing — agent already replied via reply_slack', {
@@ -3947,12 +3967,42 @@ Loop until done, blocked, or explicitly reassigned:
3947
3967
  };
3948
3968
  }
3949
3969
  finally {
3970
+ endFreshDelivery();
3950
3971
  releaseMutex();
3951
3972
  if (this.sessionDeliveryMutex.get(sessionName) === currentDelivery) {
3952
3973
  this.sessionDeliveryMutex.delete(sessionName);
3953
3974
  }
3954
3975
  }
3955
3976
  }
3977
+ /**
3978
+ * Mark a delivery to a session with the fresh-conversation service so no
3979
+ * `/clear` starts during it. Never throws.
3980
+ *
3981
+ * @param sessionName - Session being written to
3982
+ * @returns Function ending the mark
3983
+ */
3984
+ beginFreshDelivery(sessionName) {
3985
+ try {
3986
+ return FreshTaskConversationService.getInstance().beginDelivery(sessionName);
3987
+ }
3988
+ catch {
3989
+ return () => undefined;
3990
+ }
3991
+ }
3992
+ /**
3993
+ * Wait (bounded) for a running fresh-conversation / context-cap clear of
3994
+ * the session. Never throws.
3995
+ *
3996
+ * @param sessionName - Session about to be written to
3997
+ */
3998
+ async waitIfFreshClearing(sessionName) {
3999
+ try {
4000
+ await FreshTaskConversationService.getInstance().waitIfClearing(sessionName);
4001
+ }
4002
+ catch {
4003
+ // Best-effort: delivery proceeds regardless.
4004
+ }
4005
+ }
3956
4006
  /**
3957
4007
  * Wait for an agent session to be at a ready prompt before sending messages.
3958
4008
  *