crewly 1.20.365 → 1.20.367

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 (141) hide show
  1. package/config/skills/agent/core/attach-file/SKILL.md +7 -0
  2. package/config/skills/agent/core/attach-file/execute.sh +8 -3
  3. package/config/skills/agent/core/complete-task/SKILL.md +4 -2
  4. package/config/skills/agent/core/complete-task/execute.sh +9 -1
  5. package/config/skills/agent/core/complete-task/explicit-id.test.sh +13 -2
  6. package/config/skills/agent/core/create-task/SKILL.md +2 -0
  7. package/config/skills/agent/core/create-task/execute.sh +27 -1
  8. package/config/skills/agent/core/create-task/execute.test.sh +67 -0
  9. package/config/skills/agent/core/handoff-task/execute.sh +12 -5
  10. package/config/skills/agent/core/handoff-task/explicit-id.test.sh +70 -0
  11. package/config/skills/agent/core/reply/SKILL.md +3 -0
  12. package/config/skills/agent/core/reply-channel/SKILL.md +12 -5
  13. package/config/skills/agent/core/reply-channel/execute.sh +17 -2
  14. package/config/skills/agent/core/reply-channel/execute.test.sh +15 -2
  15. package/config/skills/agent/core/slack-post/SKILL.md +3 -3
  16. package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
  17. package/config/skills/orchestrator/reply-slack/execute.sh +6 -2
  18. package/config/skills/orchestrator/send-pdf-to-slack/SKILL.md +2 -1
  19. package/config/skills/orchestrator/send-pdf-to-slack/execute.sh +10 -2
  20. package/config/skills/registry.json +6 -6
  21. package/config/skills/team-leader/delegate-task/SKILL.md +1 -1
  22. package/config/skills/team-leader/delegate-task/execute.sh +6 -0
  23. package/dist/backend/backend/src/constants.d.ts +32 -0
  24. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  25. package/dist/backend/backend/src/constants.js +33 -1
  26. package/dist/backend/backend/src/constants.js.map +1 -1
  27. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  28. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +7 -3
  29. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  30. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +15 -0
  31. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  32. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +33 -3
  33. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  34. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +12 -0
  35. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/chat/chat.controller.js +56 -7
  37. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +9 -0
  39. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  40. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +111 -11
  41. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  42. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +52 -4
  44. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/slack/slack.controller.js +58 -4
  47. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  48. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  49. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +36 -2
  50. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +16 -10
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -11
  54. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  55. package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts +8 -0
  56. package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/messaging/agent-message-envelope.js +10 -1
  58. package/dist/backend/backend/src/services/messaging/agent-message-envelope.js.map +1 -1
  59. package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts +62 -20
  60. package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/messaging/owner-hook-message.js +178 -39
  62. package/dist/backend/backend/src/services/messaging/owner-hook-message.js.map +1 -1
  63. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts +8 -5
  64. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js +13 -10
  66. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js.map +1 -1
  67. package/dist/backend/backend/src/services/orc/message-route.d.ts +129 -0
  68. package/dist/backend/backend/src/services/orc/message-route.d.ts.map +1 -0
  69. package/dist/backend/backend/src/services/orc/message-route.js +197 -0
  70. package/dist/backend/backend/src/services/orc/message-route.js.map +1 -0
  71. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +49 -6
  72. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +284 -69
  74. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
  75. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +64 -8
  76. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +215 -100
  78. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  79. package/dist/backend/backend/src/services/orc/triggered-by.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/orc/triggered-by.js +9 -0
  81. package/dist/backend/backend/src/services/orc/triggered-by.js.map +1 -1
  82. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +2 -1
  83. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/orc/work-item-destination.js +1 -1
  85. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
  86. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +10 -1
  87. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +25 -4
  89. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
  90. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +1 -0
  91. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +1 -1
  93. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +20 -13
  95. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack.service.d.ts +20 -1
  97. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/slack/slack.service.js +58 -3
  99. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +31 -0
  101. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +62 -5
  103. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  104. package/dist/backend/backend/src/services/trace/turn-trigger.d.ts +34 -1
  105. package/dist/backend/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/trace/turn-trigger.js +74 -9
  107. package/dist/backend/backend/src/services/trace/turn-trigger.js.map +1 -1
  108. package/dist/backend/build-info.json +2 -2
  109. package/dist/cli/backend/src/constants.d.ts +32 -0
  110. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  111. package/dist/cli/backend/src/constants.js +33 -1
  112. package/dist/cli/backend/src/constants.js.map +1 -1
  113. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +16 -10
  114. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  115. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -11
  116. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  117. package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts +8 -0
  118. package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -1
  119. package/dist/cli/backend/src/services/messaging/agent-message-envelope.js +10 -1
  120. package/dist/cli/backend/src/services/messaging/agent-message-envelope.js.map +1 -1
  121. package/dist/cli/backend/src/services/orc/message-route.d.ts +129 -0
  122. package/dist/cli/backend/src/services/orc/message-route.d.ts.map +1 -0
  123. package/dist/cli/backend/src/services/orc/message-route.js +197 -0
  124. package/dist/cli/backend/src/services/orc/message-route.js.map +1 -0
  125. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +2 -1
  126. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  127. package/dist/cli/backend/src/services/orc/work-item-destination.js +1 -1
  128. package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
  129. package/dist/cli/backend/src/services/slack/slack.service.d.ts +20 -1
  130. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  131. package/dist/cli/backend/src/services/slack/slack.service.js +58 -3
  132. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  133. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +31 -0
  134. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  135. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +62 -5
  136. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  137. package/dist/cli/backend/src/services/trace/turn-trigger.d.ts +34 -1
  138. package/dist/cli/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
  139. package/dist/cli/backend/src/services/trace/turn-trigger.js +74 -9
  140. package/dist/cli/backend/src/services/trace/turn-trigger.js.map +1 -1
  141. package/package.json +1 -1
@@ -8,13 +8,16 @@
8
8
  * a cost/timing report about another project, in the middle of the owner's
9
9
  * conversation.
10
10
  *
11
- * Conservative by construction — the post is refused only when ALL hold:
12
- * - the poster's latest input is another agent's message (its turn was not
13
- * prompted by this conversation);
11
+ * R6 of the message-routing audit (2026-10-18): agents never converse
12
+ * inside an owner thread, whatever prompted the post. The post is taken out
13
+ * of the thread (and delivered privately to the agents it addresses) when
14
+ * BOTH hold:
14
15
  * - the owner wrote to the poster in this conversation recently (it is an
15
16
  * owner thread, not an agents' room);
16
17
  * - the text @-mentions someone, and every @-mention is a known agent (an
17
18
  * unknown name or the owner keeps the post).
19
+ * Only the final consolidated answer, written to the owner, goes in the
20
+ * owner's thread.
18
21
  *
19
22
  * Pure decision; the lookups are injected.
20
23
  *
@@ -51,10 +54,9 @@ export function mentionedNames(text) {
51
54
  */
52
55
  export function misdirectedAgentMention(input) {
53
56
  const { latest } = input;
54
- if (latest?.kind !== 'agent' || !latest.sender || latest.sender === input.session)
55
- return null;
56
57
  if (!input.ownerAskedHere)
57
58
  return null;
59
+ const sender = latest?.kind === 'agent' && latest.sender && latest.sender !== input.session ? latest.sender : undefined;
58
60
  const names = mentionedNames(input.content);
59
61
  if (names.length === 0)
60
62
  return null;
@@ -66,13 +68,14 @@ export function misdirectedAgentMention(input) {
66
68
  if (!mentioned.includes(agent))
67
69
  mentioned.push(agent);
68
70
  }
69
- const to = mentioned.includes(latest.sender) ? latest.sender : mentioned[0];
71
+ const to = sender && mentioned.includes(sender) ? sender : mentioned[0];
72
+ const from = sender ? `, your latest message came from ${sender} (another agent),` : '';
70
73
  return {
71
- sender: latest.sender,
74
+ ...(sender ? { sender } : {}),
72
75
  mentioned,
73
- message: `Not posted: this is the owner's thread, your latest message came from ${latest.sender} (another agent), ` +
74
- `and your post only @-mentions agents. Send it to the agent instead: send-message --to ${to} "<your message>". ` +
75
- 'If the owner should read it, post it without the @-mention.',
76
+ message: `Not posted: this is the owner's thread${from} and your post only @-mentions agents. Agents do not talk to each other in the owner's thread. ` +
77
+ `Send it to the agent instead: send-message --to ${to} "<your message>". ` +
78
+ 'Post in this thread only the final answer to the owner, without the @-mention.',
76
79
  };
77
80
  }
78
81
  //# sourceMappingURL=agent-mention-post-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-mention-post-guard.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/agent-mention-post-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,mFAAmF;AACnF,MAAM,OAAO,GAAG,qCAAqC,CAAC;AA0BtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,IAAI,MAAM,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/F,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS;QACT,OAAO,EACL,yEAAyE,MAAM,CAAC,MAAM,oBAAoB;YAC1G,yFAAyF,EAAE,qBAAqB;YAChH,6DAA6D;KAChE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"agent-mention-post-guard.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/agent-mention-post-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,mFAAmF;AACnF,MAAM,OAAO,GAAG,qCAAqC,CAAC;AA0BtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxH,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,mCAAmC,MAAM,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,SAAS;QACT,OAAO,EACL,yCAAyC,IAAI,iGAAiG;YAC9I,mDAAmD,EAAE,qBAAqB;YAC1E,gFAAgF;KACnF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * The destination a message carries: where the answer to it goes
3
+ * (message-routing audit 2026-10-18, invariant).
4
+ *
5
+ * Every input an agent answers names its route: an owner message (its
6
+ * conversation and thread), a work item, or another agent. The route of the
7
+ * input an agent is working from is copied onto everything it sends on:
8
+ * the `[MESSAGE from …]` header of `send-message`, the `parentRoute` of a
9
+ * work item it delegates, and the `[RESULT]` relay its delegate's answer
10
+ * comes back with. So the owner's thread travels across every agent hop,
11
+ * and the final answer lands where the owner asked, without the harness
12
+ * guessing "the newest owner turn" or "the newest work item".
13
+ *
14
+ * Pure helpers: the text token, parsing it back, and the reply command that
15
+ * answers a route.
16
+ *
17
+ * @module services/orc/message-route
18
+ */
19
+ import type { TurnTrigger } from '../trace/turn-trigger.js';
20
+ import type { TurnOrigin } from './orc-reply-route.service.js';
21
+ /** Where the answer to a message goes. */
22
+ export type MessageRoute =
23
+ /** A work item: its origin decides (owner thread, ticket thread, delegator, …) */
24
+ {
25
+ kind: 'work-item';
26
+ workItemId: string;
27
+ }
28
+ /** An owner message: its conversation and thread (Slack thread key or chat-v2 thread root) */
29
+ | {
30
+ kind: 'owner';
31
+ conversationId: string;
32
+ thread?: string;
33
+ };
34
+ /**
35
+ * Shape check.
36
+ *
37
+ * @param value - Anything
38
+ * @returns True for a {@link MessageRoute}
39
+ */
40
+ export declare function isMessageRoute(value: unknown): value is MessageRoute;
41
+ /**
42
+ * The text token for a route, e.g. `{route: owner room-1 thread C0A:1.2}`.
43
+ * Text survives every queue a message may wait in, and the harness reads
44
+ * it back with {@link parseRouteToken}.
45
+ *
46
+ * @param route - The route
47
+ * @returns The token
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * formatRouteToken({ kind: 'work-item', workItemId: 'wi-1' }); // '{route: work-item wi-1}'
52
+ * ```
53
+ */
54
+ export declare function formatRouteToken(route: MessageRoute): string;
55
+ /**
56
+ * The route a text carries (the first token in it).
57
+ *
58
+ * @param text - Delivered text
59
+ * @returns The route, or null when the text carries none
60
+ */
61
+ export declare function parseRouteToken(text: string): MessageRoute | null;
62
+ /**
63
+ * The reply command that answers a route.
64
+ *
65
+ * @param route - The route
66
+ * @returns An English command line
67
+ */
68
+ export declare function replyCommandFor(route: MessageRoute): string;
69
+ /**
70
+ * A route in words, for notes to agents.
71
+ *
72
+ * @param route - The route
73
+ * @returns E.g. `work item wi-1` / `the owner's thread C0A:1.2 in conversation room-1`
74
+ */
75
+ export declare function describeRoute(route: MessageRoute): string;
76
+ /**
77
+ * Whether two routes name the same place.
78
+ *
79
+ * @param a - Route
80
+ * @param b - Route
81
+ * @returns True when equal
82
+ */
83
+ export declare function sameRoute(a: MessageRoute | null | undefined, b: MessageRoute | null | undefined): boolean;
84
+ /** A place a post landed in (or is expected in). */
85
+ export interface PostPlace {
86
+ /** chat-v2 conversation */
87
+ conversationId?: string;
88
+ /** Thread in it: Slack thread key or chat-v2 thread root id */
89
+ thread?: string;
90
+ /** Slack channel */
91
+ slackChannelId?: string;
92
+ /** Slack thread ts (undefined: top level) */
93
+ threadTs?: string;
94
+ }
95
+ /** Outcome of {@link comparePostPlace}. */
96
+ export type RouteCheckOutcome = 'match' | 'mismatch' | 'unknown';
97
+ /**
98
+ * Compare where a post landed with where the request it answers came from
99
+ * (the regression check of the routing invariant). Places are compared on
100
+ * the Slack thread when both know one, else on the chat conversation and
101
+ * thread; anything the two do not both know is `unknown`, never a mismatch.
102
+ *
103
+ * @param expected - The originating request's place
104
+ * @param landed - Where the post landed
105
+ * @returns The outcome
106
+ */
107
+ export declare function comparePostPlace(expected: PostPlace | null | undefined, landed: PostPlace | null | undefined): RouteCheckOutcome;
108
+ /**
109
+ * The place an owner route names.
110
+ *
111
+ * @param route - An owner route
112
+ * @returns Its place
113
+ */
114
+ export declare function placeOfOwnerRoute(route: Extract<MessageRoute, {
115
+ kind: 'owner';
116
+ }>): PostPlace;
117
+ /**
118
+ * The route of what an agent is answering, from its latest routed trigger
119
+ * (turn-trigger.ts `routedTrigger`): the owner message (with the thread its
120
+ * turn origin knows), the route an agent message or result carries, or the
121
+ * work item a dispatch handed over. This is what the agent's own messages
122
+ * carry onward.
123
+ *
124
+ * @param trigger - The agent's latest routed trigger, or null
125
+ * @param origin - Its turn origin (the thread of the owner message), if any
126
+ * @returns The route, or null when the input names none
127
+ */
128
+ export declare function routeOfTrigger(trigger: TurnTrigger | null, origin?: TurnOrigin): MessageRoute | null;
129
+ //# sourceMappingURL=message-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-route.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/message-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,0CAA0C;AAC1C,MAAM,MAAM,YAAY;AACtB,kFAAkF;AAChF;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC3C,8FAA8F;GAC5F;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAK/D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAQpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAI5D;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKjE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAG3D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAGzD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAKzG;AAED,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjE;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAoBhI;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,SAAS,CAO5F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAmBpG"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * The destination a message carries: where the answer to it goes
3
+ * (message-routing audit 2026-10-18, invariant).
4
+ *
5
+ * Every input an agent answers names its route: an owner message (its
6
+ * conversation and thread), a work item, or another agent. The route of the
7
+ * input an agent is working from is copied onto everything it sends on:
8
+ * the `[MESSAGE from …]` header of `send-message`, the `parentRoute` of a
9
+ * work item it delegates, and the `[RESULT]` relay its delegate's answer
10
+ * comes back with. So the owner's thread travels across every agent hop,
11
+ * and the final answer lands where the owner asked, without the harness
12
+ * guessing "the newest owner turn" or "the newest work item".
13
+ *
14
+ * Pure helpers: the text token, parsing it back, and the reply command that
15
+ * answers a route.
16
+ *
17
+ * @module services/orc/message-route
18
+ */
19
+ import { MESSAGE_ROUTE_CONSTANTS } from '../../constants.js';
20
+ import { formatSlackThreadKey, parseSlackThreadKey } from '../slack/slack-thread-key.js';
21
+ /** An id the token may carry: no whitespace, no closing brace. */
22
+ const ID = /^[^\s{}]+$/;
23
+ /**
24
+ * Shape check.
25
+ *
26
+ * @param value - Anything
27
+ * @returns True for a {@link MessageRoute}
28
+ */
29
+ export function isMessageRoute(value) {
30
+ if (!value || typeof value !== 'object')
31
+ return false;
32
+ const v = value;
33
+ if (v.kind === 'work-item')
34
+ return typeof v.workItemId === 'string' && ID.test(v.workItemId);
35
+ if (v.kind === 'owner') {
36
+ return typeof v.conversationId === 'string' && ID.test(v.conversationId) && (v.thread === undefined || (typeof v.thread === 'string' && ID.test(v.thread)));
37
+ }
38
+ return false;
39
+ }
40
+ /**
41
+ * The text token for a route, e.g. `{route: owner room-1 thread C0A:1.2}`.
42
+ * Text survives every queue a message may wait in, and the harness reads
43
+ * it back with {@link parseRouteToken}.
44
+ *
45
+ * @param route - The route
46
+ * @returns The token
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * formatRouteToken({ kind: 'work-item', workItemId: 'wi-1' }); // '{route: work-item wi-1}'
51
+ * ```
52
+ */
53
+ export function formatRouteToken(route) {
54
+ const open = MESSAGE_ROUTE_CONSTANTS.TOKEN_OPEN;
55
+ if (route.kind === 'work-item')
56
+ return `${open}work-item ${route.workItemId}}`;
57
+ return `${open}owner ${route.conversationId}${route.thread ? ` thread ${route.thread}` : ''}}`;
58
+ }
59
+ /** `{route: work-item <id>}` / `{route: owner <conversation>[ thread <thread>]}` */
60
+ const TOKEN_RE = /\{route: (?:work-item ([^\s{}]+)|owner ([^\s{}]+)(?: thread ([^\s{}]+))?)\}/;
61
+ /**
62
+ * The route a text carries (the first token in it).
63
+ *
64
+ * @param text - Delivered text
65
+ * @returns The route, or null when the text carries none
66
+ */
67
+ export function parseRouteToken(text) {
68
+ const m = TOKEN_RE.exec(typeof text === 'string' ? text : '');
69
+ if (!m)
70
+ return null;
71
+ if (m[1])
72
+ return { kind: 'work-item', workItemId: m[1] };
73
+ return { kind: 'owner', conversationId: m[2], ...(m[3] ? { thread: m[3] } : {}) };
74
+ }
75
+ /**
76
+ * The reply command that answers a route.
77
+ *
78
+ * @param route - The route
79
+ * @returns An English command line
80
+ */
81
+ export function replyCommandFor(route) {
82
+ if (route.kind === 'work-item')
83
+ return `reply --work-item ${route.workItemId} "<message>"`;
84
+ return `reply --conversation ${route.conversationId}${route.thread ? ` --thread ${route.thread}` : ''} "<message>"`;
85
+ }
86
+ /**
87
+ * A route in words, for notes to agents.
88
+ *
89
+ * @param route - The route
90
+ * @returns E.g. `work item wi-1` / `the owner's thread C0A:1.2 in conversation room-1`
91
+ */
92
+ export function describeRoute(route) {
93
+ if (route.kind === 'work-item')
94
+ return `work item ${route.workItemId}`;
95
+ return route.thread ? `the owner's thread ${route.thread} in conversation ${route.conversationId}` : `the owner's conversation ${route.conversationId}`;
96
+ }
97
+ /**
98
+ * Whether two routes name the same place.
99
+ *
100
+ * @param a - Route
101
+ * @param b - Route
102
+ * @returns True when equal
103
+ */
104
+ export function sameRoute(a, b) {
105
+ if (!a || !b || a.kind !== b.kind)
106
+ return false;
107
+ if (a.kind === 'work-item' && b.kind === 'work-item')
108
+ return a.workItemId === b.workItemId;
109
+ if (a.kind === 'owner' && b.kind === 'owner')
110
+ return a.conversationId === b.conversationId && (a.thread ?? '') === (b.thread ?? '');
111
+ return false;
112
+ }
113
+ /**
114
+ * Compare where a post landed with where the request it answers came from
115
+ * (the regression check of the routing invariant). Places are compared on
116
+ * the Slack thread when both know one, else on the chat conversation and
117
+ * thread; anything the two do not both know is `unknown`, never a mismatch.
118
+ *
119
+ * @param expected - The originating request's place
120
+ * @param landed - Where the post landed
121
+ * @returns The outcome
122
+ */
123
+ export function comparePostPlace(expected, landed) {
124
+ if (!expected || !landed)
125
+ return 'unknown';
126
+ const slackOf = (p) => {
127
+ const key = parseSlackThreadKey(p.thread);
128
+ if (key)
129
+ return { ch: key.slackChannelId, ts: key.threadTs };
130
+ return p.slackChannelId ? { ch: p.slackChannelId, ...(p.threadTs ? { ts: p.threadTs } : {}) } : null;
131
+ };
132
+ const e = slackOf(expected);
133
+ const l = slackOf(landed);
134
+ if (e && l)
135
+ return e.ch === l.ch && (e.ts ?? '') === (l.ts ?? '') ? 'match' : 'mismatch';
136
+ if (expected.conversationId && landed.conversationId) {
137
+ if (expected.conversationId !== landed.conversationId)
138
+ return 'mismatch';
139
+ // Same conversation: the thread decides when both name one in the same form.
140
+ const et = expected.thread && !parseSlackThreadKey(expected.thread) ? expected.thread : undefined;
141
+ const lt = landed.thread && !parseSlackThreadKey(landed.thread) ? landed.thread : undefined;
142
+ if (et && lt)
143
+ return et === lt ? 'match' : 'mismatch';
144
+ if (!expected.thread && !landed.thread)
145
+ return 'match';
146
+ return 'unknown';
147
+ }
148
+ return 'unknown';
149
+ }
150
+ /**
151
+ * The place an owner route names.
152
+ *
153
+ * @param route - An owner route
154
+ * @returns Its place
155
+ */
156
+ export function placeOfOwnerRoute(route) {
157
+ const key = parseSlackThreadKey(route.thread);
158
+ return {
159
+ conversationId: route.conversationId,
160
+ ...(route.thread ? { thread: key ? formatSlackThreadKey(key.slackChannelId, key.threadTs) : route.thread } : {}),
161
+ ...(key ? { slackChannelId: key.slackChannelId, threadTs: key.threadTs } : {}),
162
+ };
163
+ }
164
+ /**
165
+ * The route of what an agent is answering, from its latest routed trigger
166
+ * (turn-trigger.ts `routedTrigger`): the owner message (with the thread its
167
+ * turn origin knows), the route an agent message or result carries, or the
168
+ * work item a dispatch handed over. This is what the agent's own messages
169
+ * carry onward.
170
+ *
171
+ * @param trigger - The agent's latest routed trigger, or null
172
+ * @param origin - Its turn origin (the thread of the owner message), if any
173
+ * @returns The route, or null when the input names none
174
+ */
175
+ export function routeOfTrigger(trigger, origin) {
176
+ if (!trigger)
177
+ return null;
178
+ switch (trigger.triggerKind) {
179
+ case 'owner_message': {
180
+ const conversationId = trigger.conversationId ?? origin?.conversationId;
181
+ if (!conversationId)
182
+ return null;
183
+ const sameAsOrigin = origin?.conversationId === conversationId;
184
+ const thread = trigger.thread ?? (sameAsOrigin ? origin?.slackThreadKey ?? origin?.chatThreadId : undefined);
185
+ return { kind: 'owner', conversationId, ...(thread ? { thread } : {}) };
186
+ }
187
+ case 'agent_message':
188
+ case 'delegated_result':
189
+ return trigger.route ?? null;
190
+ case 'dispatch':
191
+ case 'scheduled':
192
+ return trigger.workItemId ? { kind: 'work-item', workItemId: trigger.workItemId } : null;
193
+ default:
194
+ return null;
195
+ }
196
+ }
197
+ //# sourceMappingURL=message-route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-route.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/message-route.ts"],"names":[],"mappings":"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"}
@@ -19,9 +19,16 @@
19
19
  * agent's message (crewly#1375) — never the owner's last thread;
20
20
  * 6. the reference the harness last prompted the agent about, when newer
21
21
  * than its last owner turn;
22
- * 7. the agent's turn origin / current work — the owner's turn origin only
23
- * while no newer dispatch came in (crewly#1375);
24
- * 8. the agent's owner DM.
22
+ * 7. the route of the input the agent is answering (message-route.ts): the
23
+ * owner message it was given last (its turn origin), the route a
24
+ * delegated result carries back, or the work item a dispatch handed
25
+ * over; with no such input, the agent's one live work item.
26
+ *
27
+ * Nothing else. There is no guess (message-routing audit 2026-10-18, R2):
28
+ * not the newest owner turn when the input was something else, not the
29
+ * newest of several work items, not the owner DM, not a channel's top
30
+ * level. When nothing names the destination the reply is refused with the
31
+ * ids that would work.
25
32
  *
26
33
  * Pure decision logic; collaborators are injected
27
34
  * (`reply-destination.wiring.ts` wires the real ones).
@@ -33,6 +40,7 @@ import type { TurnOrigin } from './orc-reply-route.service.js';
33
40
  import type { TurnTrigger } from '../trace/turn-trigger.js';
34
41
  import { type PromptReference, type ReplyReference } from './agent-prompt-reference.service.js';
35
42
  import { type WorkDestination } from './work-item-destination.js';
43
+ import { type MessageRoute } from './message-route.js';
36
44
  export type { ReplyReference } from './agent-prompt-reference.service.js';
37
45
  /** Agent-supplied ids: hints only. */
38
46
  export interface ReplyHints {
@@ -44,7 +52,7 @@ export interface ReplyHints {
44
52
  slackChannelId?: string;
45
53
  }
46
54
  /** Which step decided. */
47
- export type ReplyDestinationSource = 'message' | 'ticket' | 'decision' | 'work-item' | 'hint' | 'prompt' | 'agent-message' | 'turn-origin' | 'current-work' | 'owner-dm';
55
+ export type ReplyDestinationSource = 'message' | 'ticket' | 'decision' | 'work-item' | 'hint' | 'prompt' | 'agent-message' | 'turn-origin' | 'current-work' | 'route' | 'owner-dm';
48
56
  /** Where the message goes. */
49
57
  export type ReplyDestination =
50
58
  /** A chat-v2 conversation the agent belongs to (DM / room / huddle), in `thread` (Slack key or chat-v2 root id) */
@@ -115,11 +123,19 @@ export interface ResolverDecision {
115
123
  * agent (with its session), a harness dispatch of work, or anything else.
116
124
  */
117
125
  export interface LatestInput {
118
- kind: 'owner' | 'agent' | 'dispatch' | 'other';
119
- /** Sending agent, for `agent` */
126
+ kind: 'owner' | 'agent' | 'dispatch' | 'result' | 'other';
127
+ /** Sending agent, for `agent` and `result` */
120
128
  sender?: string;
121
129
  /** When it was delivered (epoch ms) */
122
130
  at: number;
131
+ /** Conversation of an owner message */
132
+ conversationId?: string;
133
+ /** Slack thread key of an owner message, when it named one */
134
+ thread?: string;
135
+ /** The work item a dispatch hands over, or a result is about */
136
+ workItemId?: string;
137
+ /** The route an agent message or a result carries (what the chain answers) */
138
+ route?: MessageRoute;
123
139
  }
124
140
  /**
125
141
  * What the resolver needs to know about an agent's latest input, from its
@@ -256,4 +272,31 @@ export declare function promptIsCurrent(session: string, prompt: PromptReference
256
272
  * @returns The destination and the hints that were ignored
257
273
  */
258
274
  export declare function resolveReplyDestination(input: ReplyResolveInput, deps: ReplyResolverDeps): Promise<ReplyResolution>;
275
+ /**
276
+ * The owner's turn origin, when the owner message behind it is the latest
277
+ * input that names what the agent answers. Otherwise the origin is just
278
+ * "the agent's last owner thread", which says nothing about this reply.
279
+ *
280
+ * @param origin - The agent's turn origin
281
+ * @param latest - Its latest routed input
282
+ * @returns The origin, or undefined
283
+ */
284
+ export declare function answeredOwnerOrigin(origin: TurnOrigin | undefined, latest: LatestInput | null): TurnOrigin | undefined;
285
+ /**
286
+ * The agent's live work items (running / accepted), oldest first.
287
+ *
288
+ * @param items - Pool items
289
+ * @param session - Agent
290
+ * @returns Its live items
291
+ */
292
+ export declare function liveItemsOf(items: readonly WorkItem[], session: string): WorkItem[];
293
+ /**
294
+ * Where a route goes.
295
+ *
296
+ * @param session - Replying agent
297
+ * @param route - The route
298
+ * @param deps - Collaborators
299
+ * @returns The destination (source `route`), or `unresolved`
300
+ */
301
+ export declare function resolveRoute(session: string, route: MessageRoute, deps: ReplyResolverDeps): Promise<ReplyDestination>;
259
302
  //# sourceMappingURL=reply-destination-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reply-destination-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-destination-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC9G,OAAO,EAA0E,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE1I,YAAY,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAE1E,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,0BAA0B;AAC1B,MAAM,MAAM,sBAAsB,GAC9B,SAAS,GACT,QAAQ,GACR,UAAU,GACV,WAAW,GACX,MAAM,GACN,QAAQ,GACR,eAAe,GACf,aAAa,GACb,cAAc,GACd,UAAU,CAAC;AAEf,8BAA8B;AAC9B,MAAM,MAAM,gBAAgB;AAC1B,mHAAmH;AACjH;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACnH,+GAA+G;GAC7G;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC,eAAe,EAAE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACnI,mFAAmF;GACjF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,qDAAqD;AACrD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,uCAAuC;AACvC,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IAC/C,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAc7E;AAED,qBAAqB;AACrB,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAC;IACnD,qFAAqF;IACrF,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5E,gGAAgG;IAChG,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClE,kFAAkF;IAClF,yBAAyB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9H,iCAAiC;IACjC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;IAC3E,sDAAsD;IACtD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC7I,uBAAuB;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACvD,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC/C,qDAAqD;IACrD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjC,yCAAyC;IACzC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACpD,qDAAqD;IACrD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAC9D;;;;OAIG;IACH,eAAe,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9F,0EAA0E;IAC1E,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,sDAAsD;IACtD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnD,2DAA2D;IAC3D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD;;;;OAIG;IACH,0BAA0B,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvD;;;;OAIG;IACH,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAClD,uBAAuB;IACvB,GAAG,IAAI,MAAM,CAAC;CACf;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAO/F;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAM1D;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAmGlC;AAsBD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC;IAAE,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAgE3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,eAAe,CAAC,GAAG,OAAO,CAI/I;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkEzH"}
1
+ {"version":3,"file":"reply-destination-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-destination-resolver.ts"],"names":[],"mappings":"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"}