openryoko 2026.7.4 → 2026.7.10

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 (131) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/cli/setup.js +1 -1
  3. package/dist/src/connectors/slack/__tests__/conversation-tracker.test.js +27 -0
  4. package/dist/src/connectors/slack/__tests__/conversation-tracker.test.js.map +1 -1
  5. package/dist/src/connectors/slack/__tests__/respond-policy.test.d.ts +2 -0
  6. package/dist/src/connectors/slack/__tests__/respond-policy.test.d.ts.map +1 -0
  7. package/dist/src/connectors/slack/__tests__/respond-policy.test.js +137 -0
  8. package/dist/src/connectors/slack/__tests__/respond-policy.test.js.map +1 -0
  9. package/dist/src/connectors/slack/conversation-tracker.d.ts +7 -0
  10. package/dist/src/connectors/slack/conversation-tracker.d.ts.map +1 -1
  11. package/dist/src/connectors/slack/conversation-tracker.js +11 -0
  12. package/dist/src/connectors/slack/conversation-tracker.js.map +1 -1
  13. package/dist/src/connectors/slack/index.d.ts +11 -0
  14. package/dist/src/connectors/slack/index.d.ts.map +1 -1
  15. package/dist/src/connectors/slack/index.js +80 -46
  16. package/dist/src/connectors/slack/index.js.map +1 -1
  17. package/dist/src/connectors/slack/respond-policy.d.ts +44 -0
  18. package/dist/src/connectors/slack/respond-policy.d.ts.map +1 -0
  19. package/dist/src/connectors/slack/respond-policy.js +44 -0
  20. package/dist/src/connectors/slack/respond-policy.js.map +1 -0
  21. package/dist/src/gateway/server.d.ts.map +1 -1
  22. package/dist/src/gateway/server.js +3 -0
  23. package/dist/src/gateway/server.js.map +1 -1
  24. package/dist/src/sessions/context.d.ts.map +1 -1
  25. package/dist/src/sessions/context.js +11 -8
  26. package/dist/src/sessions/context.js.map +1 -1
  27. package/dist/src/sessions/manager.d.ts.map +1 -1
  28. package/dist/src/sessions/manager.js +27 -0
  29. package/dist/src/sessions/manager.js.map +1 -1
  30. package/dist/src/shared/__tests__/operator-match.test.d.ts +2 -0
  31. package/dist/src/shared/__tests__/operator-match.test.d.ts.map +1 -0
  32. package/dist/src/shared/__tests__/operator-match.test.js +37 -0
  33. package/dist/src/shared/__tests__/operator-match.test.js.map +1 -0
  34. package/dist/src/shared/models.js +1 -1
  35. package/dist/src/shared/models.js.map +1 -1
  36. package/dist/src/shared/operator-match.d.ts +26 -0
  37. package/dist/src/shared/operator-match.d.ts.map +1 -0
  38. package/dist/src/shared/operator-match.js +49 -0
  39. package/dist/src/shared/operator-match.js.map +1 -0
  40. package/dist/src/shared/types.d.ts +29 -0
  41. package/dist/src/shared/types.d.ts.map +1 -1
  42. package/dist/web/404.html +1 -1
  43. package/dist/web/__next.__PAGE__.txt +1 -1
  44. package/dist/web/__next._full.txt +1 -1
  45. package/dist/web/__next._head.txt +1 -1
  46. package/dist/web/__next._index.txt +1 -1
  47. package/dist/web/__next._tree.txt +1 -1
  48. package/dist/web/_next/static/chunks/04wkiqo1hhxd0.js +1 -0
  49. package/dist/web/_not-found/__next._full.txt +1 -1
  50. package/dist/web/_not-found/__next._head.txt +1 -1
  51. package/dist/web/_not-found/__next._index.txt +1 -1
  52. package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
  53. package/dist/web/_not-found/__next._not-found.txt +1 -1
  54. package/dist/web/_not-found/__next._tree.txt +1 -1
  55. package/dist/web/_not-found.html +1 -1
  56. package/dist/web/_not-found.txt +1 -1
  57. package/dist/web/chat/__next._full.txt +1 -1
  58. package/dist/web/chat/__next._head.txt +1 -1
  59. package/dist/web/chat/__next._index.txt +1 -1
  60. package/dist/web/chat/__next._tree.txt +1 -1
  61. package/dist/web/chat/__next.chat.__PAGE__.txt +1 -1
  62. package/dist/web/chat/__next.chat.txt +1 -1
  63. package/dist/web/chat.html +1 -1
  64. package/dist/web/chat.txt +1 -1
  65. package/dist/web/cron/__next._full.txt +1 -1
  66. package/dist/web/cron/__next._head.txt +1 -1
  67. package/dist/web/cron/__next._index.txt +1 -1
  68. package/dist/web/cron/__next._tree.txt +1 -1
  69. package/dist/web/cron/__next.cron.__PAGE__.txt +1 -1
  70. package/dist/web/cron/__next.cron.txt +1 -1
  71. package/dist/web/cron.html +1 -1
  72. package/dist/web/cron.txt +1 -1
  73. package/dist/web/index.html +1 -1
  74. package/dist/web/index.txt +1 -1
  75. package/dist/web/kanban/__next._full.txt +1 -1
  76. package/dist/web/kanban/__next._head.txt +1 -1
  77. package/dist/web/kanban/__next._index.txt +1 -1
  78. package/dist/web/kanban/__next._tree.txt +1 -1
  79. package/dist/web/kanban/__next.kanban.__PAGE__.txt +1 -1
  80. package/dist/web/kanban/__next.kanban.txt +1 -1
  81. package/dist/web/kanban.html +1 -1
  82. package/dist/web/kanban.txt +1 -1
  83. package/dist/web/logs/__next._full.txt +1 -1
  84. package/dist/web/logs/__next._head.txt +1 -1
  85. package/dist/web/logs/__next._index.txt +1 -1
  86. package/dist/web/logs/__next._tree.txt +1 -1
  87. package/dist/web/logs/__next.logs.__PAGE__.txt +1 -1
  88. package/dist/web/logs/__next.logs.txt +1 -1
  89. package/dist/web/logs.html +1 -1
  90. package/dist/web/logs.txt +1 -1
  91. package/dist/web/org/__next._full.txt +1 -1
  92. package/dist/web/org/__next._head.txt +1 -1
  93. package/dist/web/org/__next._index.txt +1 -1
  94. package/dist/web/org/__next._tree.txt +1 -1
  95. package/dist/web/org/__next.org.__PAGE__.txt +1 -1
  96. package/dist/web/org/__next.org.txt +1 -1
  97. package/dist/web/org.html +1 -1
  98. package/dist/web/org.txt +1 -1
  99. package/dist/web/sessions/__next._full.txt +1 -1
  100. package/dist/web/sessions/__next._head.txt +1 -1
  101. package/dist/web/sessions/__next._index.txt +1 -1
  102. package/dist/web/sessions/__next._tree.txt +1 -1
  103. package/dist/web/sessions/__next.sessions.__PAGE__.txt +1 -1
  104. package/dist/web/sessions/__next.sessions.txt +1 -1
  105. package/dist/web/sessions.html +1 -1
  106. package/dist/web/sessions.txt +1 -1
  107. package/dist/web/settings/__next._full.txt +2 -2
  108. package/dist/web/settings/__next._head.txt +1 -1
  109. package/dist/web/settings/__next._index.txt +1 -1
  110. package/dist/web/settings/__next._tree.txt +1 -1
  111. package/dist/web/settings/__next.settings.__PAGE__.txt +2 -2
  112. package/dist/web/settings/__next.settings.txt +1 -1
  113. package/dist/web/settings.html +1 -1
  114. package/dist/web/settings.txt +2 -2
  115. package/dist/web/skills/__next._full.txt +1 -1
  116. package/dist/web/skills/__next._head.txt +1 -1
  117. package/dist/web/skills/__next._index.txt +1 -1
  118. package/dist/web/skills/__next._tree.txt +1 -1
  119. package/dist/web/skills/__next.skills.__PAGE__.txt +1 -1
  120. package/dist/web/skills/__next.skills.txt +1 -1
  121. package/dist/web/skills.html +1 -1
  122. package/dist/web/skills.txt +1 -1
  123. package/package.json +1 -1
  124. package/template/config.default.yaml +4 -2
  125. package/template/docs/connectors.md +30 -0
  126. package/template/migrations/2026.7.10/MIGRATION.md +65 -0
  127. package/template/migrations/2026.7.10/config-patch.json +3 -0
  128. package/dist/web/_next/static/chunks/0ye0gt~bwlgy~.js +0 -1
  129. /package/dist/web/_next/static/{jsJO_tAphtOhs2xGLy0QA → hhYAL7ZMLLlvTxKXXOGJ6}/_buildManifest.js +0 -0
  130. /package/dist/web/_next/static/{jsJO_tAphtOhs2xGLy0QA → hhYAL7ZMLLlvTxKXXOGJ6}/_clientMiddlewareManifest.js +0 -0
  131. /package/dist/web/_next/static/{jsJO_tAphtOhs2xGLy0QA → hhYAL7ZMLLlvTxKXXOGJ6}/_ssgManifest.js +0 -0
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openryoko",
3
- "version": "2026.7.4",
3
+ "version": "2026.7.10",
4
4
  "description": "OpenRyoko — Slackで空気を読んで働くAIアシスタント・ゲートウェイ(Jinnベース、Claude Code/Codex/Gemini CLI対応)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -219,7 +219,7 @@ engines:
219
219
  effortLevel: xhigh
220
220
  codex:
221
221
  bin: codex
222
- model: gpt-5.5
222
+ model: gpt-5.6-sol
223
223
  connectors: {}
224
224
  portal: {}
225
225
  logging:
@@ -129,4 +129,31 @@ describe("ConversationTracker — robustness", () => {
129
129
  expect(t.isDmEquivalent({ channel: "C1", ts: "T3", userId: "U1" })).toBe(false);
130
130
  });
131
131
  });
132
+ describe("ConversationTracker.isBotEngagedThread", () => {
133
+ it("is true after the bot replies in the thread (recordBotInitiatedThread)", () => {
134
+ const t = new ConversationTracker();
135
+ t.recordBotInitiatedThread("C1", "T1");
136
+ expect(t.isBotEngagedThread("C1", "T1")).toBe(true);
137
+ });
138
+ it("is true after recordBotEngaged on a threaded message", () => {
139
+ const t = new ConversationTracker();
140
+ t.recordBotEngaged({ channel: "C1", threadTs: "T1", ts: "T2", userId: "U1" });
141
+ expect(t.isBotEngagedThread("C1", "T1")).toBe(true);
142
+ });
143
+ it("is false for threads the bot never engaged", () => {
144
+ const t = new ConversationTracker();
145
+ t.recordHumanMessage({ channel: "C1", threadTs: "T1", ts: "T2", userId: "U1" });
146
+ expect(t.isBotEngagedThread("C1", "T1")).toBe(false);
147
+ });
148
+ it("is false for user-key engagement (top-level messages, no thread)", () => {
149
+ const t = new ConversationTracker();
150
+ t.recordBotEngaged({ channel: "C1", ts: "T1", userId: "U1" });
151
+ expect(t.isBotEngagedThread("C1", "T1")).toBe(false);
152
+ });
153
+ it("tolerates missing fields", () => {
154
+ const t = new ConversationTracker();
155
+ expect(t.isBotEngagedThread("", "T1")).toBe(false);
156
+ expect(t.isBotEngagedThread("C1", "")).toBe(false);
157
+ });
158
+ });
132
159
  //# sourceMappingURL=conversation-tracker.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-tracker.test.js","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/conversation-tracker.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation-tracker.test.js","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/conversation-tracker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=respond-policy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond-policy.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/respond-policy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { scopeForChannelType, resolveRespondMode, evaluateRespondPolicy, hasMentionScope, respondPolicyNeedsTracking, } from "../respond-policy.js";
3
+ describe("scopeForChannelType", () => {
4
+ it("maps im to im", () => {
5
+ expect(scopeForChannelType("im")).toBe("im");
6
+ });
7
+ it("maps mpim to mpim", () => {
8
+ expect(scopeForChannelType("mpim")).toBe("mpim");
9
+ });
10
+ it("maps channel to channel", () => {
11
+ expect(scopeForChannelType("channel")).toBe("channel");
12
+ });
13
+ it("maps legacy private-channel type 'group' to channel", () => {
14
+ expect(scopeForChannelType("group")).toBe("channel");
15
+ });
16
+ it("maps unknown/undefined to channel (safe default)", () => {
17
+ expect(scopeForChannelType(undefined)).toBe("channel");
18
+ expect(scopeForChannelType("something-new")).toBe("channel");
19
+ });
20
+ });
21
+ describe("resolveRespondMode", () => {
22
+ it("defaults every scope to always when config is absent", () => {
23
+ expect(resolveRespondMode(undefined, "im")).toBe("always");
24
+ expect(resolveRespondMode(undefined, "mpim")).toBe("always");
25
+ expect(resolveRespondMode(undefined, "channel")).toBe("always");
26
+ });
27
+ it("defaults unset scopes to always when config is partial", () => {
28
+ const config = { channel: "mention" };
29
+ expect(resolveRespondMode(config, "im")).toBe("always");
30
+ expect(resolveRespondMode(config, "mpim")).toBe("always");
31
+ expect(resolveRespondMode(config, "channel")).toBe("mention");
32
+ });
33
+ it("treats invalid values as always (config files are untyped YAML)", () => {
34
+ const config = { channel: "sometimes" };
35
+ expect(resolveRespondMode(config, "channel")).toBe("always");
36
+ });
37
+ });
38
+ describe("evaluateRespondPolicy", () => {
39
+ const mentionOnly = {
40
+ im: "always",
41
+ mpim: "mention",
42
+ channel: "mention",
43
+ };
44
+ it("allows everything when config is absent (legacy behavior)", () => {
45
+ expect(evaluateRespondPolicy({
46
+ config: undefined,
47
+ channelType: "channel",
48
+ wasMentioned: false,
49
+ isEngagedThread: false,
50
+ }).allow).toBe(true);
51
+ });
52
+ it("allows DMs without a mention under the mention-only config", () => {
53
+ expect(evaluateRespondPolicy({
54
+ config: mentionOnly,
55
+ channelType: "im",
56
+ wasMentioned: false,
57
+ isEngagedThread: false,
58
+ }).allow).toBe(true);
59
+ });
60
+ it("drops un-mentioned channel messages", () => {
61
+ const decision = evaluateRespondPolicy({
62
+ config: mentionOnly,
63
+ channelType: "channel",
64
+ wasMentioned: false,
65
+ isEngagedThread: false,
66
+ });
67
+ expect(decision.allow).toBe(false);
68
+ if (!decision.allow)
69
+ expect(decision.reason).toContain("channel=mention");
70
+ });
71
+ it("drops un-mentioned group-DM (mpim) messages", () => {
72
+ expect(evaluateRespondPolicy({
73
+ config: mentionOnly,
74
+ channelType: "mpim",
75
+ wasMentioned: false,
76
+ isEngagedThread: false,
77
+ }).allow).toBe(false);
78
+ });
79
+ it("allows @-mentioned channel messages", () => {
80
+ expect(evaluateRespondPolicy({
81
+ config: mentionOnly,
82
+ channelType: "channel",
83
+ wasMentioned: true,
84
+ isEngagedThread: false,
85
+ }).allow).toBe(true);
86
+ });
87
+ it("allows un-mentioned follow-ups inside a bot-engaged thread by default", () => {
88
+ expect(evaluateRespondPolicy({
89
+ config: mentionOnly,
90
+ channelType: "channel",
91
+ wasMentioned: false,
92
+ isEngagedThread: true,
93
+ }).allow).toBe(true);
94
+ });
95
+ it("drops engaged-thread follow-ups when engagedThreads is false", () => {
96
+ expect(evaluateRespondPolicy({
97
+ config: { ...mentionOnly, engagedThreads: false },
98
+ channelType: "channel",
99
+ wasMentioned: false,
100
+ isEngagedThread: true,
101
+ }).allow).toBe(false);
102
+ });
103
+ it("treats legacy private-channel type 'group' under the channel scope", () => {
104
+ expect(evaluateRespondPolicy({
105
+ config: mentionOnly,
106
+ channelType: "group",
107
+ wasMentioned: false,
108
+ isEngagedThread: false,
109
+ }).allow).toBe(false);
110
+ });
111
+ it("drops everything in a never scope, even mentions", () => {
112
+ expect(evaluateRespondPolicy({
113
+ config: { channel: "never" },
114
+ channelType: "channel",
115
+ wasMentioned: true,
116
+ isEngagedThread: true,
117
+ }).allow).toBe(false);
118
+ });
119
+ });
120
+ describe("hasMentionScope / respondPolicyNeedsTracking", () => {
121
+ it("is false when config is absent", () => {
122
+ expect(hasMentionScope(undefined)).toBe(false);
123
+ expect(respondPolicyNeedsTracking(undefined)).toBe(false);
124
+ });
125
+ it("is false when no scope uses mention", () => {
126
+ expect(hasMentionScope({ im: "always", channel: "never" })).toBe(false);
127
+ });
128
+ it("is true when any scope uses mention", () => {
129
+ expect(hasMentionScope({ channel: "mention" })).toBe(true);
130
+ expect(hasMentionScope({ mpim: "mention" })).toBe(true);
131
+ });
132
+ it("needs tracking only when engaged-thread continuation is on", () => {
133
+ expect(respondPolicyNeedsTracking({ channel: "mention" })).toBe(true);
134
+ expect(respondPolicyNeedsTracking({ channel: "mention", engagedThreads: false })).toBe(false);
135
+ });
136
+ });
137
+ //# sourceMappingURL=respond-policy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"respond-policy.test.js","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/respond-policy.test.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,13 @@ export declare class ConversationTracker {
42
42
  * this conversation.
43
43
  */
44
44
  isDmEquivalent(input: ConversationKeyInput): boolean;
45
+ /**
46
+ * True when the bot has engaged (replied, reacted, or posted the root)
47
+ * in the given thread. Used by the deterministic respondTo gate to keep
48
+ * replying inside threads the bot is already part of without requiring a
49
+ * re-mention on every message.
50
+ */
51
+ isBotEngagedThread(channel: string, threadTs: string): boolean;
45
52
  /** For tests / debugging. */
46
53
  size(): number;
47
54
  /** Remove a key (e.g. on member_left_channel). */
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-tracker.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/conversation-tracker.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AASD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI;IAQzD;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAMrD;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAOnD;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQjE;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO;IAQpD,6BAA6B;IAC7B,IAAI,IAAI,MAAM;IAId,kDAAkD;IAClD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,KAAK;IAOb;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;CAS9B"}
1
+ {"version":3,"file":"conversation-tracker.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/conversation-tracker.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AASD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAEhE;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI;IAQzD;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAMrD;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAOnD;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQjE;;;;OAIG;IACH,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO;IAQpD;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAK9D,6BAA6B;IAC7B,IAAI,IAAI,MAAM;IAId,kDAAkD;IAClD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,KAAK;IAOb;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;CAS9B"}
@@ -92,6 +92,17 @@ export class ConversationTracker {
92
92
  return false;
93
93
  return state.botEngaged && state.humanSpeakers.size === 1;
94
94
  }
95
+ /**
96
+ * True when the bot has engaged (replied, reacted, or posted the root)
97
+ * in the given thread. Used by the deterministic respondTo gate to keep
98
+ * replying inside threads the bot is already part of without requiring a
99
+ * re-mention on every message.
100
+ */
101
+ isBotEngagedThread(channel, threadTs) {
102
+ if (!channel || !threadTs)
103
+ return false;
104
+ return this.entries.get(`${channel}:thread:${threadTs}`)?.botEngaged === true;
105
+ }
95
106
  /** For tests / debugging. */
96
107
  size() {
97
108
  return this.entries.size;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-tracker.js","sourceRoot":"","sources":["../../../../src/connectors/slack/conversation-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAchD,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,OAAO,mBAAmB;IACb,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEhE;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,KAA2B;QACvC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACjD,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YAClD,OAAO,GAAG,KAAK,CAAC,OAAO,WAAW,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,KAA2B;QAC5C,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,KAA2B;QAC1C,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO;QAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CAAC,OAAe,EAAE,QAAgB;QACxD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,OAAO;QAClC,MAAM,GAAG,GAAG,GAAG,OAAO,WAAW,QAAQ,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACvF,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,KAA2B;QACxC,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,OAAO,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,6BAA6B;IAC7B,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,kDAAkD;IAClD,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEO,UAAU,CAAC,GAAW,EAAE,MAAc;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBAC7D,MAAM,CAAC,KAAK,CAAC,wBAAwB,GAAG,+CAA+C,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAsB,EAAE,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACzF,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAEO,WAAW,CAAC,GAAW,EAAE,MAAe;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACvF,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;QACxB,IAAI,MAAM;YAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,GAAW,EAAE,KAAwB;QACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,qBAAqB,CAAC,OAAe;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,GAAG,KAAK,OAAO;gBAAE,SAAS;YAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"conversation-tracker.js","sourceRoot":"","sources":["../../../../src/connectors/slack/conversation-tracker.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ export interface SlackConnectorContext {
4
4
  portalName?: string;
5
5
  /** Configured operator name — used to identify operator vs third party */
6
6
  operatorName?: string;
7
+ /** Additional operator names/handles (portal.operatorAliases) — see operator-match.ts. */
8
+ operatorAliases?: string[];
7
9
  /** Whether this connector's routed sessions can consume Claude-only /goal prompts. */
8
10
  goalInjectionEnabled?: boolean;
9
11
  }
@@ -21,9 +23,11 @@ export declare class SlackConnector implements Connector {
21
23
  private botUserId;
22
24
  private typingIntervals;
23
25
  private readonly triageConfig;
26
+ private readonly respondTo;
24
27
  private readonly goalExtractionConfig;
25
28
  private readonly portalName;
26
29
  private readonly operatorName;
30
+ private readonly operatorAliases;
27
31
  private readonly goalInjectionEnabled;
28
32
  private readonly conversations;
29
33
  private readonly agentsCanvas;
@@ -38,6 +42,13 @@ export declare class SlackConnector implements Connector {
38
42
  */
39
43
  setTypingStatus(channelId: string, threadTs: string | undefined, status: string): Promise<void>;
40
44
  constructor(config: SlackConnectorConfig, context?: SlackConnectorContext);
45
+ /**
46
+ * Conversation tracking feeds two consumers: triage DM-equivalence and the
47
+ * respondTo engaged-thread exception. When neither is active, tracking is
48
+ * skipped entirely — engaged entries can't be evicted, so tracking in the
49
+ * default configuration would just leak memory.
50
+ */
51
+ private conversationTrackingEnabled;
41
52
  private resolveSpeakerInfo;
42
53
  private speakerTransportFields;
43
54
  private runSlackTriage;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,MAAM,EAEP,MAAM,uBAAuB,CAAC;AAc/B,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,qBAAa,cAAe,YAAW,SAAS;IAC9C,IAAI,SAAW;IACf,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,gBAAgB,CAAgF;IACxG,OAAO,CAAC,aAAa,CAA8D;IACnF,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgC;IAC7D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwC;IAC7E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAY;IAC/C,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAY;IAE5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAK3B;IAEF,OAAO,CAAC,gBAAgB;YAUV,gBAAgB;IAkB9B;;;OAGG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAoBzF,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,qBAA0B;YAwB/D,kBAAkB;IAiBhC,OAAO,CAAC,sBAAsB;YAYhB,cAAc;YA4Dd,0BAA0B;IA0CxC;;;;;OAKG;YACW,kBAAkB;YAmBlB,kBAAkB;IAI1B,KAAK;IA8XL,IAAI;IAWV,eAAe,IAAI,qBAAqB;IAIxC,SAAS,IAAI,eAAe;IAQ5B;;;;;;;OAOG;IACG,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAgCzG,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM;IAS/C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAoBtE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAuBvE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAoBzC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAa5C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAU9C,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI;CAGlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/index.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ import { formatResponse, downloadAttachment } from "./format.js";
4
4
  import { normalizeSpeakerInfo } from "./speaker.js";
5
5
  import { runTriage } from "./triage.js";
6
6
  import { isShortAckCandidate } from "./triage-prompt.js";
7
+ import { evaluateRespondPolicy, hasMentionScope, respondPolicyNeedsTracking, } from "./respond-policy.js";
8
+ import { isOperatorSpeaker } from "../../shared/operator-match.js";
7
9
  import { ConversationTracker } from "./conversation-tracker.js";
8
10
  import { AgentsCanvasUpdater } from "./agents-canvas.js";
9
11
  import { extractGoalCondition, shouldExtractGoal } from "./goal-extractor.js";
@@ -24,9 +26,11 @@ export class SlackConnector {
24
26
  botUserId = null;
25
27
  typingIntervals = new Map();
26
28
  triageConfig;
29
+ respondTo;
27
30
  goalExtractionConfig;
28
31
  portalName;
29
32
  operatorName;
33
+ operatorAliases;
30
34
  goalInjectionEnabled;
31
35
  conversations;
32
36
  agentsCanvas;
@@ -103,15 +107,26 @@ export class SlackConnector {
103
107
  : [];
104
108
  this.allowedUsers = allowFrom.length > 0 ? new Set(allowFrom) : null;
105
109
  this.triageConfig = config.triage;
110
+ this.respondTo = config.respondTo;
106
111
  this.goalExtractionConfig = config.goalExtraction;
107
112
  this.portalName = context.portalName;
108
113
  this.operatorName = context.operatorName;
114
+ this.operatorAliases = context.operatorAliases;
109
115
  this.goalInjectionEnabled = context.goalInjectionEnabled === true;
110
116
  this.conversations = new ConversationTracker();
111
117
  this.agentsCanvas = config.agentsCanvas?.enabled
112
118
  ? new AgentsCanvasUpdater(this.app, config.agentsCanvas)
113
119
  : null;
114
120
  }
121
+ /**
122
+ * Conversation tracking feeds two consumers: triage DM-equivalence and the
123
+ * respondTo engaged-thread exception. When neither is active, tracking is
124
+ * skipped entirely — engaged entries can't be evicted, so tracking in the
125
+ * default configuration would just leak memory.
126
+ */
127
+ conversationTrackingEnabled() {
128
+ return this.triageConfig?.enabled === true || respondPolicyNeedsTracking(this.respondTo);
129
+ }
115
130
  async resolveSpeakerInfo(userId) {
116
131
  if (!userId)
117
132
  return null;
@@ -145,12 +160,10 @@ export class SlackConnector {
145
160
  const threadLimit = this.triageConfig?.threadContextLimit ?? 10;
146
161
  const recentThread = await this.fetchRecentThreadForTriage(event.channel, event.thread_ts, event.ts, threadLimit);
147
162
  const speakerName = ctx.speaker?.name ?? "unknown";
148
- const speakerIsOperator = !!this.operatorName && !!ctx.speaker && [
149
- ctx.speaker.name,
150
- ctx.speaker.realName,
151
- ctx.speaker.displayName,
152
- ctx.speaker.handle,
153
- ].filter((v) => !!v).includes(this.operatorName);
163
+ // Shared normalized matcher — the old exact `includes(operatorName)` never
164
+ // matched a nickname operatorName against profile names, so triage saw the
165
+ // operator as a third party (see operator-match.ts).
166
+ const speakerIsOperator = !!ctx.speaker && isOperatorSpeaker([ctx.speaker.name, ctx.speaker.realName, ctx.speaker.displayName, ctx.speaker.handle], this.operatorName, this.operatorAliases);
154
167
  const channelDescription = ctx.channelName ? `#${ctx.channelName}` : event.channel;
155
168
  return runTriage({
156
169
  botName: this.portalName || "Ryoko",
@@ -269,11 +282,56 @@ export class SlackConnector {
269
282
  logger.debug(`Ignoring Slack message from unauthorized user ${event.user}`);
270
283
  return;
271
284
  }
285
+ const slackUserId = event.user;
286
+ const rawText = (event.text || "");
287
+ const channelType = event.channel_type || "channel";
288
+ const threadTs = event.thread_ts;
289
+ const wasMentioned = !!this.botUserId && rawText.includes(`<@${this.botUserId}>`);
290
+ const triageEnabled = this.triageConfig?.enabled === true;
291
+ const conversationKey = {
292
+ channel: event.channel,
293
+ threadTs,
294
+ ts: event.ts,
295
+ userId: slackUserId,
296
+ };
297
+ // Record the human speaker even for messages the gates below drop:
298
+ // a third human joining a thread must invalidate DM-equivalence
299
+ // whether or not we end up responding to their message.
300
+ if (this.conversationTrackingEnabled()) {
301
+ this.conversations.recordHumanMessage(conversationKey);
302
+ }
303
+ // Deterministic respondTo gate — evaluated before any network fetches
304
+ // and before LLM triage, so gated scopes cost nothing for dropped
305
+ // messages. "mention" scopes drop un-mentioned messages outright,
306
+ // except inside threads the bot has already engaged.
307
+ const respondDecision = evaluateRespondPolicy({
308
+ config: this.respondTo,
309
+ channelType,
310
+ wasMentioned,
311
+ isEngagedThread: !!threadTs &&
312
+ this.conversations.isBotEngagedThread(event.channel, threadTs),
313
+ });
314
+ if (!respondDecision.allow) {
315
+ logger.info(`[slack] respondTo gate → silent (${respondDecision.reason}) for ts=${event.ts}`);
316
+ return;
317
+ }
318
+ // Early silent for cross-bot / cross-user traffic in shared channels.
319
+ // If the message @-mentions specific user(s), none of whom are us, and
320
+ // it isn't a DM, stay silent — regardless of whether the thread was
321
+ // previously marked "active" by an earlier reply. The activeThread
322
+ // TTL exists for mid-conversation follow-ups, not for sibling mentions
323
+ // directed at another bot or human in the same channel.
324
+ if (!wasMentioned && this.botUserId && channelType !== "im") {
325
+ const mentionedUsers = Array.from(rawText.matchAll(/<@([UW][A-Z0-9]+)>/g), (m) => m[1]);
326
+ if (mentionedUsers.length > 0 && !mentionedUsers.includes(this.botUserId)) {
327
+ logger.info(`[slack] message @-mentions ${mentionedUsers.join(",")} (not us) — staying silent for ts=${event.ts}`);
328
+ return;
329
+ }
330
+ }
272
331
  const sessionKey = deriveSessionKey(event);
273
332
  const replyContext = buildReplyContext(event);
274
333
  // Fetch parent message for thread replies so the session has full context
275
334
  let parentContext = "";
276
- const threadTs = event.thread_ts;
277
335
  if (threadTs && threadTs !== event.ts) {
278
336
  try {
279
337
  const parentResult = await this.app.client.conversations.replies({
@@ -309,30 +367,13 @@ export class SlackConnector {
309
367
  }
310
368
  }
311
369
  }
312
- const slackUserId = event.user;
313
370
  const [channelInfo, speaker] = await Promise.all([
314
371
  this.resolveChannelInfo(event.channel),
315
372
  this.resolveSpeakerInfo(slackUserId),
316
373
  ]);
317
374
  const channelName = channelInfo.name;
318
- const channelType = event.channel_type || "channel";
319
375
  // DM is never "external"; otherwise trust the Slack Connect flag.
320
376
  const channelExternal = channelType !== "im" && channelInfo.isExtShared;
321
- const rawText = (event.text || "");
322
- const wasMentioned = !!this.botUserId && rawText.includes(`<@${this.botUserId}>`);
323
- // Early silent for cross-bot / cross-user traffic in shared channels.
324
- // If the message @-mentions specific user(s), none of whom are us, and
325
- // it isn't a DM, stay silent — regardless of whether the thread was
326
- // previously marked "active" by an earlier reply. The activeThread
327
- // TTL exists for mid-conversation follow-ups, not for sibling mentions
328
- // directed at another bot or human in the same channel.
329
- if (!wasMentioned && this.botUserId && channelType !== "im") {
330
- const mentionedUsers = Array.from(rawText.matchAll(/<@([UW][A-Z0-9]+)>/g), (m) => m[1]);
331
- if (mentionedUsers.length > 0 && !mentionedUsers.includes(this.botUserId)) {
332
- logger.info(`[slack] message @-mentions ${mentionedUsers.join(",")} (not us) — staying silent for ts=${event.ts}`);
333
- return;
334
- }
335
- }
336
377
  // Slash commands (/new, /status, …) are control directives the session
337
378
  // manager parses by exact string match. Wrapping them in the
338
379
  // "[Thread context — …]" preamble below silently breaks that parsing,
@@ -368,20 +409,6 @@ export class SlackConnector {
368
409
  // - DM-equivalent conversation: bot has engaged AND only this user has
369
410
  // spoken in the conversation (thread or channel-user scope). Permanent
370
411
  // until a third human joins.
371
- const triageEnabled = this.triageConfig?.enabled === true;
372
- const conversationKey = {
373
- channel: event.channel,
374
- threadTs: event.thread_ts,
375
- ts: event.ts,
376
- userId: slackUserId,
377
- };
378
- // Skip conversation tracking entirely when triage is disabled — it
379
- // serves no purpose (skipTriage is unconditionally true) and engaged
380
- // entries can't be evicted, so doing it would leak memory in the
381
- // default no-triage configuration.
382
- if (triageEnabled) {
383
- this.conversations.recordHumanMessage(conversationKey);
384
- }
385
412
  const isDmEquivalent = triageEnabled && channelType !== "im" && !wasMentioned
386
413
  ? this.conversations.isDmEquivalent(conversationKey)
387
414
  : false;
@@ -441,7 +468,7 @@ export class SlackConnector {
441
468
  }
442
469
  logger.info(`[slack] triage → reply (${decision.reason ?? "no reason"}) for ts=${event.ts}`);
443
470
  }
444
- if (triageEnabled) {
471
+ if (this.conversationTrackingEnabled()) {
445
472
  this.conversations.recordBotEngaged(conversationKey);
446
473
  }
447
474
  // Natural-language `/goal` injection.
@@ -483,6 +510,13 @@ export class SlackConnector {
483
510
  catch (err) {
484
511
  logger.warn(`[slack] Failed to get bot user ID: ${err}`);
485
512
  }
513
+ // Fail closed: without our own user ID, mention detection is impossible,
514
+ // so mention-gated scopes will drop everything (except engaged threads).
515
+ // That honors "never barge in un-mentioned" at the cost of missed
516
+ // mentions until the next successful start — surface it loudly.
517
+ if (!this.botUserId && hasMentionScope(this.respondTo)) {
518
+ logger.warn("[slack] respondTo mention gate is configured but the bot user ID could not be resolved — un-mentioned messages in mention scopes will be dropped");
519
+ }
486
520
  this.app.event("reaction_added", async ({ event }) => {
487
521
  // Only handle reactions on messages (not files, etc.)
488
522
  if (event.item.type !== "message")
@@ -676,8 +710,8 @@ export class SlackConnector {
676
710
  lastTs = res.ts;
677
711
  }
678
712
  // A newly-posted root message will be the thread_ts for any follow-up replies,
679
- // so mark its future thread as bot-engaged. Only relevant when triage is on.
680
- if (lastTs && this.triageConfig?.enabled === true) {
713
+ // so mark its future thread as bot-engaged. Only relevant when tracking is on.
714
+ if (lastTs && this.conversationTrackingEnabled()) {
681
715
  this.conversations.recordBotInitiatedThread(target.channel, lastTs);
682
716
  }
683
717
  return lastTs;
@@ -699,9 +733,9 @@ export class SlackConnector {
699
733
  lastTs = res.ts;
700
734
  }
701
735
  // Record the thread the bot just replied in. Subsequent user replies in
702
- // this same thread will carry thread_ts === threadTs and bypass triage.
703
- // Only relevant when triage is on.
704
- if (threadTs && this.triageConfig?.enabled === true) {
736
+ // this same thread will carry thread_ts === threadTs and bypass triage
737
+ // and the respondTo mention gate. Only relevant when tracking is on.
738
+ if (threadTs && this.conversationTrackingEnabled()) {
705
739
  this.conversations.recordBotInitiatedThread(target.channel, threadTs);
706
740
  }
707
741
  return lastTs;
@@ -721,9 +755,9 @@ export class SlackConnector {
721
755
  }
722
756
  // A reaction on a message also counts as engagement; mark the target's
723
757
  // thread anchor so follow-ups in that thread are treated as bot-engaged.
724
- // Only relevant when triage is on.
758
+ // Only relevant when tracking is on.
725
759
  const anchor = target.thread || target.messageTs;
726
- if (anchor && this.triageConfig?.enabled === true) {
760
+ if (anchor && this.conversationTrackingEnabled()) {
727
761
  this.conversations.recordBotInitiatedThread(target.channel, anchor);
728
762
  }
729
763
  }