openryoko 2026.6.9 → 2026.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -1
- package/dist/src/cli/migrate.d.ts.map +1 -1
- package/dist/src/cli/migrate.js +58 -2
- package/dist/src/cli/migrate.js.map +1 -1
- package/dist/src/cli/setup.js +1 -1
- package/dist/src/connectors/slack/__tests__/active-threads.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.js +57 -0
- package/dist/src/connectors/slack/__tests__/active-threads.test.js.map +1 -0
- package/dist/src/connectors/slack/__tests__/dm-equivalent.test.d.ts +2 -0
- package/dist/src/connectors/slack/__tests__/dm-equivalent.test.d.ts.map +1 -0
- package/dist/src/connectors/slack/__tests__/dm-equivalent.test.js +72 -0
- package/dist/src/connectors/slack/__tests__/dm-equivalent.test.js.map +1 -0
- package/dist/src/connectors/slack/active-threads.d.ts +39 -0
- package/dist/src/connectors/slack/active-threads.d.ts.map +1 -0
- package/dist/src/connectors/slack/active-threads.js +71 -0
- package/dist/src/connectors/slack/active-threads.js.map +1 -0
- package/dist/src/connectors/slack/dm-equivalent.d.ts +44 -0
- package/dist/src/connectors/slack/dm-equivalent.d.ts.map +1 -0
- package/dist/src/connectors/slack/dm-equivalent.js +69 -0
- package/dist/src/connectors/slack/dm-equivalent.js.map +1 -0
- package/dist/src/connectors/slack/index.d.ts +7 -0
- package/dist/src/connectors/slack/index.d.ts.map +1 -1
- package/dist/src/connectors/slack/index.js +30 -14
- package/dist/src/connectors/slack/index.js.map +1 -1
- package/dist/src/engines/claude-interactive.d.ts.map +1 -1
- package/dist/src/engines/claude-interactive.js +23 -1
- package/dist/src/engines/claude-interactive.js.map +1 -1
- package/dist/src/sessions/__tests__/reply-disposition.test.d.ts +2 -0
- package/dist/src/sessions/__tests__/reply-disposition.test.d.ts.map +1 -0
- package/dist/src/sessions/__tests__/reply-disposition.test.js +149 -0
- package/dist/src/sessions/__tests__/reply-disposition.test.js.map +1 -0
- package/dist/src/sessions/context.js +7 -2
- package/dist/src/sessions/context.js.map +1 -1
- package/dist/src/sessions/manager.d.ts +9 -0
- package/dist/src/sessions/manager.d.ts.map +1 -1
- package/dist/src/sessions/manager.js +51 -14
- package/dist/src/sessions/manager.js.map +1 -1
- package/dist/src/sessions/reply-disposition.d.ts +97 -0
- package/dist/src/sessions/reply-disposition.d.ts.map +1 -0
- package/dist/src/sessions/reply-disposition.js +160 -0
- package/dist/src/sessions/reply-disposition.js.map +1 -0
- package/dist/src/shared/__tests__/configPatch.test.d.ts +2 -0
- package/dist/src/shared/__tests__/configPatch.test.d.ts.map +1 -0
- package/dist/src/shared/__tests__/configPatch.test.js +110 -0
- package/dist/src/shared/__tests__/configPatch.test.js.map +1 -0
- package/dist/src/shared/__tests__/effort.test.js +6 -3
- package/dist/src/shared/__tests__/effort.test.js.map +1 -1
- package/dist/src/shared/__tests__/models.test.js +17 -2
- package/dist/src/shared/__tests__/models.test.js.map +1 -1
- package/dist/src/shared/__tests__/shippedConfigPatches.test.d.ts +2 -0
- package/dist/src/shared/__tests__/shippedConfigPatches.test.d.ts.map +1 -0
- package/dist/src/shared/__tests__/shippedConfigPatches.test.js +38 -0
- package/dist/src/shared/__tests__/shippedConfigPatches.test.js.map +1 -0
- package/dist/src/shared/configPatch.d.ts +56 -0
- package/dist/src/shared/configPatch.d.ts.map +1 -0
- package/dist/src/shared/configPatch.js +124 -0
- package/dist/src/shared/configPatch.js.map +1 -0
- package/dist/src/shared/models.d.ts.map +1 -1
- package/dist/src/shared/models.js +57 -6
- package/dist/src/shared/models.js.map +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/__next.__PAGE__.txt +1 -1
- package/dist/web/__next._full.txt +1 -1
- package/dist/web/__next._head.txt +1 -1
- package/dist/web/__next._index.txt +1 -1
- package/dist/web/__next._tree.txt +1 -1
- package/dist/web/_next/static/chunks/0ye0gt~bwlgy~.js +1 -0
- package/dist/web/_not-found/__next._full.txt +1 -1
- package/dist/web/_not-found/__next._head.txt +1 -1
- package/dist/web/_not-found/__next._index.txt +1 -1
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/web/_not-found/__next._not-found.txt +1 -1
- package/dist/web/_not-found/__next._tree.txt +1 -1
- package/dist/web/_not-found.html +1 -1
- package/dist/web/_not-found.txt +1 -1
- package/dist/web/chat/__next._full.txt +1 -1
- package/dist/web/chat/__next._head.txt +1 -1
- package/dist/web/chat/__next._index.txt +1 -1
- package/dist/web/chat/__next._tree.txt +1 -1
- package/dist/web/chat/__next.chat.__PAGE__.txt +1 -1
- package/dist/web/chat/__next.chat.txt +1 -1
- package/dist/web/chat.html +1 -1
- package/dist/web/chat.txt +1 -1
- package/dist/web/cron/__next._full.txt +1 -1
- package/dist/web/cron/__next._head.txt +1 -1
- package/dist/web/cron/__next._index.txt +1 -1
- package/dist/web/cron/__next._tree.txt +1 -1
- package/dist/web/cron/__next.cron.__PAGE__.txt +1 -1
- package/dist/web/cron/__next.cron.txt +1 -1
- package/dist/web/cron.html +1 -1
- package/dist/web/cron.txt +1 -1
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +1 -1
- package/dist/web/kanban/__next._full.txt +1 -1
- package/dist/web/kanban/__next._head.txt +1 -1
- package/dist/web/kanban/__next._index.txt +1 -1
- package/dist/web/kanban/__next._tree.txt +1 -1
- package/dist/web/kanban/__next.kanban.__PAGE__.txt +1 -1
- package/dist/web/kanban/__next.kanban.txt +1 -1
- package/dist/web/kanban.html +1 -1
- package/dist/web/kanban.txt +1 -1
- package/dist/web/logs/__next._full.txt +1 -1
- package/dist/web/logs/__next._head.txt +1 -1
- package/dist/web/logs/__next._index.txt +1 -1
- package/dist/web/logs/__next._tree.txt +1 -1
- package/dist/web/logs/__next.logs.__PAGE__.txt +1 -1
- package/dist/web/logs/__next.logs.txt +1 -1
- package/dist/web/logs.html +1 -1
- package/dist/web/logs.txt +1 -1
- package/dist/web/org/__next._full.txt +1 -1
- package/dist/web/org/__next._head.txt +1 -1
- package/dist/web/org/__next._index.txt +1 -1
- package/dist/web/org/__next._tree.txt +1 -1
- package/dist/web/org/__next.org.__PAGE__.txt +1 -1
- package/dist/web/org/__next.org.txt +1 -1
- package/dist/web/org.html +1 -1
- package/dist/web/org.txt +1 -1
- package/dist/web/sessions/__next._full.txt +1 -1
- package/dist/web/sessions/__next._head.txt +1 -1
- package/dist/web/sessions/__next._index.txt +1 -1
- package/dist/web/sessions/__next._tree.txt +1 -1
- package/dist/web/sessions/__next.sessions.__PAGE__.txt +1 -1
- package/dist/web/sessions/__next.sessions.txt +1 -1
- package/dist/web/sessions.html +1 -1
- package/dist/web/sessions.txt +1 -1
- package/dist/web/settings/__next._full.txt +2 -2
- package/dist/web/settings/__next._head.txt +1 -1
- package/dist/web/settings/__next._index.txt +1 -1
- package/dist/web/settings/__next._tree.txt +1 -1
- package/dist/web/settings/__next.settings.__PAGE__.txt +2 -2
- package/dist/web/settings/__next.settings.txt +1 -1
- package/dist/web/settings.html +1 -1
- package/dist/web/settings.txt +2 -2
- package/dist/web/skills/__next._full.txt +1 -1
- package/dist/web/skills/__next._head.txt +1 -1
- package/dist/web/skills/__next._index.txt +1 -1
- package/dist/web/skills/__next._tree.txt +1 -1
- package/dist/web/skills/__next.skills.__PAGE__.txt +1 -1
- package/dist/web/skills/__next.skills.txt +1 -1
- package/dist/web/skills.html +1 -1
- package/dist/web/skills.txt +1 -1
- package/package.json +1 -1
- package/template/config.default.yaml +1 -1
- package/template/migrations/2026.7.1/MIGRATION.md +73 -0
- package/template/migrations/2026.7.1/config-patch.json +7 -0
- package/dist/web/_next/static/chunks/0hc3tk2~3ec6_.js +0 -1
- /package/dist/web/_next/static/{SG5Zxvi2pEkXcfCbjqsD_ → jsJO_tAphtOhs2xGLy0QA}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{SG5Zxvi2pEkXcfCbjqsD_ → jsJO_tAphtOhs2xGLy0QA}/_clientMiddlewareManifest.js +0 -0
- /package/dist/web/_next/static/{SG5Zxvi2pEkXcfCbjqsD_ → jsJO_tAphtOhs2xGLy0QA}/_ssgManifest.js +0 -0
package/dist/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/migrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/migrate.ts"],"names":[],"mappings":"AAwJA,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GzF"}
|
package/dist/src/cli/migrate.js
CHANGED
|
@@ -6,6 +6,7 @@ import { JINN_HOME, CONFIG_PATH, MIGRATIONS_DIR, TEMPLATE_DIR, SKILLS_DIR, CLAUD
|
|
|
6
6
|
import { loadConfig } from "../shared/config.js";
|
|
7
7
|
import { compareSemver, getPackageVersion, getInstanceVersion, getPendingMigrations, } from "../shared/version.js";
|
|
8
8
|
import { applyTemplateReplacements, isTemplateFile, readPortalName, buildTemplateReplacements, } from "../shared/templateReplacements.js";
|
|
9
|
+
import { parseConfigPatch, applyPatchOps } from "../shared/configPatch.js";
|
|
9
10
|
const GREEN = "\x1b[32m";
|
|
10
11
|
const YELLOW = "\x1b[33m";
|
|
11
12
|
const RED = "\x1b[31m";
|
|
@@ -57,6 +58,58 @@ function stampVersion(version) {
|
|
|
57
58
|
config.jinn.version = version;
|
|
58
59
|
fs.writeFileSync(CONFIG_PATH, yaml.dump(config, { lineWidth: -1 }), "utf-8");
|
|
59
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Apply any `config-patch.json` shipped with the pending migrations to the
|
|
63
|
+
* instance config.yaml. Deterministic and idempotent — evolves shipped default
|
|
64
|
+
* values without clobbering values the user has customized (see configPatch.ts).
|
|
65
|
+
* Returns the number of keys actually changed. Logs each outcome.
|
|
66
|
+
*/
|
|
67
|
+
function applyConfigPatches(pending) {
|
|
68
|
+
const patchFiles = pending
|
|
69
|
+
.map((version) => ({ version, file: path.join(MIGRATIONS_DIR, version, "config-patch.json") }))
|
|
70
|
+
.filter(({ file }) => fs.existsSync(file));
|
|
71
|
+
if (patchFiles.length === 0 || !fs.existsSync(CONFIG_PATH))
|
|
72
|
+
return 0;
|
|
73
|
+
let working;
|
|
74
|
+
try {
|
|
75
|
+
working = yaml.load(fs.readFileSync(CONFIG_PATH, "utf-8"));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.log(` ${RED}[config-patch: could not read config.yaml: ${err?.message ?? err}]${RESET}`);
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
const allOutcomes = [];
|
|
82
|
+
for (const { version, file } of patchFiles) {
|
|
83
|
+
let ops;
|
|
84
|
+
try {
|
|
85
|
+
ops = parseConfigPatch(fs.readFileSync(file, "utf-8"));
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
console.log(` ${RED}[config-patch ${version}: ${err?.message ?? err}]${RESET}`);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const { config: nextConfig, outcomes } = applyPatchOps(working, ops);
|
|
92
|
+
working = nextConfig;
|
|
93
|
+
allOutcomes.push(...outcomes);
|
|
94
|
+
}
|
|
95
|
+
const changed = allOutcomes.filter((o) => o.action === "set" || o.action === "insert").length;
|
|
96
|
+
if (changed > 0) {
|
|
97
|
+
fs.writeFileSync(CONFIG_PATH, yaml.dump(working, { lineWidth: -1 }), "utf-8");
|
|
98
|
+
}
|
|
99
|
+
for (const o of allOutcomes) {
|
|
100
|
+
if (o.action === "set") {
|
|
101
|
+
console.log(` ${GREEN}[config]${RESET} ${o.path}: ${JSON.stringify(o.from)} → ${JSON.stringify(o.to)}`);
|
|
102
|
+
}
|
|
103
|
+
else if (o.action === "insert") {
|
|
104
|
+
console.log(` ${GREEN}[config]${RESET} ${o.path}: (added) ${JSON.stringify(o.to)}`);
|
|
105
|
+
}
|
|
106
|
+
else if (o.action === "skip" && o.reason === "customized") {
|
|
107
|
+
console.log(` ${YELLOW}[config skip]${RESET} ${o.path} (customized: ${JSON.stringify(o.current)})`);
|
|
108
|
+
}
|
|
109
|
+
// reason "already" → silent no-op
|
|
110
|
+
}
|
|
111
|
+
return changed;
|
|
112
|
+
}
|
|
60
113
|
/**
|
|
61
114
|
* Build engine-specific CLI args for running a one-shot migration prompt.
|
|
62
115
|
* Each engine CLI uses different flags for prompt input.
|
|
@@ -221,15 +274,18 @@ async function applyAutoMigrations(pending, instanceVersion, packageVersion) {
|
|
|
221
274
|
}
|
|
222
275
|
}
|
|
223
276
|
}
|
|
277
|
+
// Deterministic config.yaml value updates (respects user customizations).
|
|
278
|
+
// Idempotent, so it is safe to run even when files are skipped below.
|
|
279
|
+
const configChanges = applyConfigPatches(pending);
|
|
224
280
|
if (skippedExisting > 0) {
|
|
225
|
-
console.log(`\n${YELLOW}Auto-migration partially applied.${RESET} ${applied} file(s) added, ${skippedExisting} existing file(s) need AI merge.`);
|
|
281
|
+
console.log(`\n${YELLOW}Auto-migration partially applied.${RESET} ${applied} file(s) added, ${configChanges} config value(s) updated, ${skippedExisting} existing file(s) need AI merge.`);
|
|
226
282
|
console.log(`${YELLOW}Version was not updated.${RESET} Run ${RESET}ryoko migrate${YELLOW} (without --auto) to merge the skipped files and complete the migration.${RESET}`);
|
|
227
283
|
console.log(`${DIM}Staged migration files remain in ${MIGRATIONS_DIR}.${RESET}\n`);
|
|
228
284
|
return;
|
|
229
285
|
}
|
|
230
286
|
stampVersion(packageVersion);
|
|
231
287
|
console.log(`\n ${GREEN}[version]${RESET} ${instanceVersion} → ${packageVersion}`);
|
|
232
|
-
console.log(`\n${GREEN}Auto-migration complete.${RESET} ${applied} file(s) added.`);
|
|
288
|
+
console.log(`\n${GREEN}Auto-migration complete.${RESET} ${applied} file(s) added, ${configChanges} config value(s) updated.`);
|
|
233
289
|
fs.rmSync(MIGRATIONS_DIR, { recursive: true, force: true });
|
|
234
290
|
}
|
|
235
291
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/migrate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/migrate.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/setup.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-threads.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/active-threads.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { ActiveThreadTracker } from "../active-threads.js";
|
|
3
|
+
describe("ActiveThreadTracker", () => {
|
|
4
|
+
it("reports a freshly-touched thread as active", () => {
|
|
5
|
+
const t = new ActiveThreadTracker(60_000);
|
|
6
|
+
t.touch("C1", "1234.5678", 1_000_000);
|
|
7
|
+
expect(t.isActive("C1", "1234.5678", 1_000_000)).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
it("considers a thread inactive once TTL expires", () => {
|
|
10
|
+
const t = new ActiveThreadTracker(60_000);
|
|
11
|
+
t.touch("C1", "1234.5678", 1_000_000);
|
|
12
|
+
// 61s later
|
|
13
|
+
expect(t.isActive("C1", "1234.5678", 1_061_000)).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
it("does not leak state between channels", () => {
|
|
16
|
+
const t = new ActiveThreadTracker(60_000);
|
|
17
|
+
t.touch("C1", "1234.5678", 1_000_000);
|
|
18
|
+
expect(t.isActive("C2", "1234.5678", 1_000_000)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it("does not leak state between thread keys", () => {
|
|
21
|
+
const t = new ActiveThreadTracker(60_000);
|
|
22
|
+
t.touch("C1", "1234.5678", 1_000_000);
|
|
23
|
+
expect(t.isActive("C1", "9999.9999", 1_000_000)).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it("safely no-ops when channel or threadKey is missing", () => {
|
|
26
|
+
const t = new ActiveThreadTracker(60_000);
|
|
27
|
+
t.touch("", "1234.5678");
|
|
28
|
+
t.touch("C1", undefined);
|
|
29
|
+
expect(t.isActive("", "1234.5678")).toBe(false);
|
|
30
|
+
expect(t.isActive("C1", undefined)).toBe(false);
|
|
31
|
+
expect(t.size()).toBe(0);
|
|
32
|
+
});
|
|
33
|
+
it("refreshes the timestamp when a thread is touched again", () => {
|
|
34
|
+
const t = new ActiveThreadTracker(60_000);
|
|
35
|
+
t.touch("C1", "1234.5678", 1_000_000);
|
|
36
|
+
t.touch("C1", "1234.5678", 1_050_000);
|
|
37
|
+
// original TTL from first touch would have expired at 1_060_000,
|
|
38
|
+
// but second touch resets it, so at 1_100_000 it should still be active
|
|
39
|
+
expect(t.isActive("C1", "1234.5678", 1_100_000)).toBe(true);
|
|
40
|
+
// and expire at 1_050_000 + 60_000 = 1_110_000
|
|
41
|
+
expect(t.isActive("C1", "1234.5678", 1_111_000)).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
it("prunes expired entries when size exceeds internal threshold", () => {
|
|
44
|
+
// Drive an intentional growth past PRUNE_AT_SIZE (1000) and confirm
|
|
45
|
+
// the map never explodes unbounded.
|
|
46
|
+
const t = new ActiveThreadTracker(1); // 1ms TTL
|
|
47
|
+
for (let i = 0; i < 1500; i++) {
|
|
48
|
+
t.touch("C1", `ts-${i}`, 0);
|
|
49
|
+
}
|
|
50
|
+
// At touch #1001 the internal prune runs and wipes everything (TTL=1ms, now=0
|
|
51
|
+
// means first entry is technically not expired, but subsequent touches at now=0
|
|
52
|
+
// stay fresh. Simulate expiry via manual prune at a later timestamp.
|
|
53
|
+
t.prune(1_000_000);
|
|
54
|
+
expect(t.size()).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=active-threads.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-threads.test.js","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/active-threads.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,YAAY;QACZ,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,iEAAiE;QACjE,wEAAwE;QACxE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,+CAA+C;QAC/C,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,oEAAoE;QACpE,oCAAoC;QACpC,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QACD,8EAA8E;QAC9E,gFAAgF;QAChF,qEAAqE;QACrE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm-equivalent.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/dm-equivalent.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { DmEquivalentDetector } from "../dm-equivalent.js";
|
|
3
|
+
function makeClient(responses) {
|
|
4
|
+
let i = 0;
|
|
5
|
+
const info = vi.fn().mockImplementation(async (_args) => {
|
|
6
|
+
const next = responses[i++] ?? responses[responses.length - 1];
|
|
7
|
+
if (next instanceof Error)
|
|
8
|
+
throw next;
|
|
9
|
+
return { ok: true, channel: next };
|
|
10
|
+
});
|
|
11
|
+
return { info };
|
|
12
|
+
}
|
|
13
|
+
describe("DmEquivalentDetector", () => {
|
|
14
|
+
it("returns true when the channel has exactly 2 members", async () => {
|
|
15
|
+
const client = makeClient([{ num_members: 2 }]);
|
|
16
|
+
const det = new DmEquivalentDetector(client);
|
|
17
|
+
expect(await det.isTwoMember("C123")).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("returns false when the channel has more than 2 members", async () => {
|
|
20
|
+
const client = makeClient([{ num_members: 5 }]);
|
|
21
|
+
const det = new DmEquivalentDetector(client);
|
|
22
|
+
expect(await det.isTwoMember("C123")).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
it("returns null on Slack API failure (caller should treat as 'unknown')", async () => {
|
|
25
|
+
const client = makeClient([new Error("not_in_channel")]);
|
|
26
|
+
const det = new DmEquivalentDetector(client);
|
|
27
|
+
expect(await det.isTwoMember("C123")).toBeNull();
|
|
28
|
+
});
|
|
29
|
+
it("returns null when num_members is missing from the response", async () => {
|
|
30
|
+
const client = makeClient([{}]);
|
|
31
|
+
const det = new DmEquivalentDetector(client);
|
|
32
|
+
expect(await det.isTwoMember("C123")).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
it("caches results across calls within the TTL window", async () => {
|
|
35
|
+
const client = makeClient([{ num_members: 2 }]);
|
|
36
|
+
const det = new DmEquivalentDetector(client, 60_000);
|
|
37
|
+
await det.isTwoMember("C123");
|
|
38
|
+
await det.isTwoMember("C123");
|
|
39
|
+
await det.isTwoMember("C123");
|
|
40
|
+
expect(client.info).toHaveBeenCalledTimes(1);
|
|
41
|
+
});
|
|
42
|
+
it("re-fetches once the TTL expires", async () => {
|
|
43
|
+
const client = makeClient([{ num_members: 2 }, { num_members: 5 }]);
|
|
44
|
+
const det = new DmEquivalentDetector(client, 1_000);
|
|
45
|
+
const start = 1_000_000_000;
|
|
46
|
+
expect(await det.isTwoMember("C123", start)).toBe(true);
|
|
47
|
+
expect(await det.isTwoMember("C123", start + 1_500)).toBe(false);
|
|
48
|
+
expect(client.info).toHaveBeenCalledTimes(2);
|
|
49
|
+
});
|
|
50
|
+
it("does not cache failures (so transient errors recover on the next message)", async () => {
|
|
51
|
+
const client = makeClient([new Error("rate_limited"), { num_members: 2 }]);
|
|
52
|
+
const det = new DmEquivalentDetector(client);
|
|
53
|
+
expect(await det.isTwoMember("C123")).toBeNull();
|
|
54
|
+
expect(await det.isTwoMember("C123")).toBe(true);
|
|
55
|
+
expect(client.info).toHaveBeenCalledTimes(2);
|
|
56
|
+
});
|
|
57
|
+
it("invalidate() drops the cached entry", async () => {
|
|
58
|
+
const client = makeClient([{ num_members: 2 }, { num_members: 3 }]);
|
|
59
|
+
const det = new DmEquivalentDetector(client);
|
|
60
|
+
expect(await det.isTwoMember("C123")).toBe(true);
|
|
61
|
+
det.invalidate("C123");
|
|
62
|
+
expect(await det.isTwoMember("C123")).toBe(false);
|
|
63
|
+
expect(client.info).toHaveBeenCalledTimes(2);
|
|
64
|
+
});
|
|
65
|
+
it("returns null for empty channel id without calling the API", async () => {
|
|
66
|
+
const client = makeClient([{ num_members: 2 }]);
|
|
67
|
+
const det = new DmEquivalentDetector(client);
|
|
68
|
+
expect(await det.isTwoMember("")).toBeNull();
|
|
69
|
+
expect(client.info).not.toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=dm-equivalent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm-equivalent.test.js","sourceRoot":"","sources":["../../../../../src/connectors/slack/__tests__/dm-equivalent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks which Slack threads the bot has recently participated in,
|
|
3
|
+
* so the triage layer can skip air-reading for threads that are
|
|
4
|
+
* already mid-conversation (e.g. a skill is in progress, or the user
|
|
5
|
+
* is following up on a prior reply).
|
|
6
|
+
*
|
|
7
|
+
* Keyed by `${channelId}:${threadTs}`. `threadTs` is the root ts of
|
|
8
|
+
* a Slack thread — for a bot reply, it's whatever we passed as
|
|
9
|
+
* `thread_ts` in `chat.postMessage`; for a bot's root message, it's
|
|
10
|
+
* the ts of that message (since future replies will use it as
|
|
11
|
+
* thread_ts).
|
|
12
|
+
*/
|
|
13
|
+
export declare class ActiveThreadTracker {
|
|
14
|
+
private readonly entries;
|
|
15
|
+
private readonly ttlMs;
|
|
16
|
+
/**
|
|
17
|
+
* Prune when the map grows past this size. Cheap defense against
|
|
18
|
+
* unbounded growth in long-running daemons.
|
|
19
|
+
*/
|
|
20
|
+
private static readonly PRUNE_AT_SIZE;
|
|
21
|
+
constructor(ttlMs?: number);
|
|
22
|
+
private makeKey;
|
|
23
|
+
/**
|
|
24
|
+
* Record that the bot just did something in this thread (reply, react, etc.).
|
|
25
|
+
* `threadKey` should be the thread_ts the bot used, or the ts of a new
|
|
26
|
+
* root message the bot posted (so future replies that use it as thread_ts
|
|
27
|
+
* will match).
|
|
28
|
+
*/
|
|
29
|
+
touch(channel: string, threadKey: string | undefined, now?: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Is this thread currently considered active (bot participated within TTL)?
|
|
32
|
+
*/
|
|
33
|
+
isActive(channel: string, threadKey: string | undefined, now?: number): boolean;
|
|
34
|
+
/** Remove entries older than TTL. */
|
|
35
|
+
prune(now?: number): void;
|
|
36
|
+
/** For tests / debugging. */
|
|
37
|
+
size(): number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=active-threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-threads.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/active-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAQ;gBAEjC,KAAK,GAAE,MAAuB;IAI1C,OAAO,CAAC,OAAO;IAIf;;;;;OAKG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI;IAQrF;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO;IAY3F,qCAAqC;IACrC,KAAK,CAAC,GAAG,GAAE,MAAmB,GAAG,IAAI;IAQrC,6BAA6B;IAC7B,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks which Slack threads the bot has recently participated in,
|
|
3
|
+
* so the triage layer can skip air-reading for threads that are
|
|
4
|
+
* already mid-conversation (e.g. a skill is in progress, or the user
|
|
5
|
+
* is following up on a prior reply).
|
|
6
|
+
*
|
|
7
|
+
* Keyed by `${channelId}:${threadTs}`. `threadTs` is the root ts of
|
|
8
|
+
* a Slack thread — for a bot reply, it's whatever we passed as
|
|
9
|
+
* `thread_ts` in `chat.postMessage`; for a bot's root message, it's
|
|
10
|
+
* the ts of that message (since future replies will use it as
|
|
11
|
+
* thread_ts).
|
|
12
|
+
*/
|
|
13
|
+
const DEFAULT_TTL_MS = 600_000; // 10 minutes
|
|
14
|
+
export class ActiveThreadTracker {
|
|
15
|
+
entries = new Map();
|
|
16
|
+
ttlMs;
|
|
17
|
+
/**
|
|
18
|
+
* Prune when the map grows past this size. Cheap defense against
|
|
19
|
+
* unbounded growth in long-running daemons.
|
|
20
|
+
*/
|
|
21
|
+
static PRUNE_AT_SIZE = 1000;
|
|
22
|
+
constructor(ttlMs = DEFAULT_TTL_MS) {
|
|
23
|
+
this.ttlMs = ttlMs;
|
|
24
|
+
}
|
|
25
|
+
makeKey(channel, threadKey) {
|
|
26
|
+
return `${channel}:${threadKey}`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Record that the bot just did something in this thread (reply, react, etc.).
|
|
30
|
+
* `threadKey` should be the thread_ts the bot used, or the ts of a new
|
|
31
|
+
* root message the bot posted (so future replies that use it as thread_ts
|
|
32
|
+
* will match).
|
|
33
|
+
*/
|
|
34
|
+
touch(channel, threadKey, now = Date.now()) {
|
|
35
|
+
if (!channel || !threadKey)
|
|
36
|
+
return;
|
|
37
|
+
this.entries.set(this.makeKey(channel, threadKey), now);
|
|
38
|
+
if (this.entries.size > ActiveThreadTracker.PRUNE_AT_SIZE) {
|
|
39
|
+
this.prune(now);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Is this thread currently considered active (bot participated within TTL)?
|
|
44
|
+
*/
|
|
45
|
+
isActive(channel, threadKey, now = Date.now()) {
|
|
46
|
+
if (!channel || !threadKey)
|
|
47
|
+
return false;
|
|
48
|
+
const lastSeen = this.entries.get(this.makeKey(channel, threadKey));
|
|
49
|
+
if (lastSeen === undefined)
|
|
50
|
+
return false;
|
|
51
|
+
if (now - lastSeen > this.ttlMs) {
|
|
52
|
+
// lazy cleanup of this specific entry
|
|
53
|
+
this.entries.delete(this.makeKey(channel, threadKey));
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
/** Remove entries older than TTL. */
|
|
59
|
+
prune(now = Date.now()) {
|
|
60
|
+
for (const [key, ts] of this.entries) {
|
|
61
|
+
if (now - ts > this.ttlMs) {
|
|
62
|
+
this.entries.delete(key);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** For tests / debugging. */
|
|
67
|
+
size() {
|
|
68
|
+
return this.entries.size;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=active-threads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-threads.js","sourceRoot":"","sources":["../../../../src/connectors/slack/active-threads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,aAAa;AAE7C,MAAM,OAAO,mBAAmB;IACb,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,KAAK,CAAS;IAC/B;;;OAGG;IACK,MAAM,CAAU,aAAa,GAAG,IAAI,CAAC;IAE7C,YAAY,QAAgB,cAAc;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,OAAO,CAAC,OAAe,EAAE,SAAiB;QAChD,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAe,EAAE,SAA6B,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QAC5E,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE,OAAO;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,mBAAmB,CAAC,aAAa,EAAE,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAe,EAAE,SAA6B,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QAC/E,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACzC,IAAI,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,sCAAsC;YACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DM-equivalent channel detector.
|
|
3
|
+
*
|
|
4
|
+
* Slack's `im` channel type only covers 1:1 native DMs. Operators commonly
|
|
5
|
+
* create a *private channel* with just themselves and the bot — visually
|
|
6
|
+
* identical to a DM, but classified as `channel` by the Slack API. Such
|
|
7
|
+
* channels should bypass air-reading triage for the same reason real DMs do:
|
|
8
|
+
* every message is implicitly addressed to the bot.
|
|
9
|
+
*
|
|
10
|
+
* This module wraps `conversations.info` with a small TTL cache so we can
|
|
11
|
+
* answer "does this channel have exactly the bot + one other member?"
|
|
12
|
+
* cheaply on the hot path.
|
|
13
|
+
*/
|
|
14
|
+
interface SlackConversationsInfoClient {
|
|
15
|
+
info(args: {
|
|
16
|
+
channel: string;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
ok?: boolean;
|
|
19
|
+
channel?: {
|
|
20
|
+
num_members?: number;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export declare class DmEquivalentDetector {
|
|
25
|
+
private readonly client;
|
|
26
|
+
private readonly cache;
|
|
27
|
+
private readonly ttlMs;
|
|
28
|
+
constructor(client: SlackConversationsInfoClient, ttlMs?: number);
|
|
29
|
+
/**
|
|
30
|
+
* Resolve whether the channel has exactly 2 members (the bot + one other).
|
|
31
|
+
* Returns `true` / `false` on success, or `null` when membership couldn't
|
|
32
|
+
* be determined — callers should treat `null` as "unknown, fall through to
|
|
33
|
+
* regular triage" rather than as a skip signal.
|
|
34
|
+
*/
|
|
35
|
+
isTwoMember(channel: string, now?: number): Promise<boolean | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Drop the cache entry for a channel — useful when a join/leave event
|
|
38
|
+
* tells us the membership just changed.
|
|
39
|
+
*/
|
|
40
|
+
invalidate(channel: string): void;
|
|
41
|
+
private prune;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=dm-equivalent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm-equivalent.d.ts","sourceRoot":"","sources":["../../../../src/connectors/slack/dm-equivalent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,UAAU,4BAA4B;IACpC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QACvC,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,OAAO,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACpC,CAAC,CAAC;CACJ;AAOD,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAGZ,MAAM,EAAE,4BAA4B,EACrD,KAAK,GAAE,MAAuB;IAKhC;;;;;OAKG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAyBrF;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,KAAK;CAKd"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DM-equivalent channel detector.
|
|
3
|
+
*
|
|
4
|
+
* Slack's `im` channel type only covers 1:1 native DMs. Operators commonly
|
|
5
|
+
* create a *private channel* with just themselves and the bot — visually
|
|
6
|
+
* identical to a DM, but classified as `channel` by the Slack API. Such
|
|
7
|
+
* channels should bypass air-reading triage for the same reason real DMs do:
|
|
8
|
+
* every message is implicitly addressed to the bot.
|
|
9
|
+
*
|
|
10
|
+
* This module wraps `conversations.info` with a small TTL cache so we can
|
|
11
|
+
* answer "does this channel have exactly the bot + one other member?"
|
|
12
|
+
* cheaply on the hot path.
|
|
13
|
+
*/
|
|
14
|
+
import { logger } from "../../shared/logger.js";
|
|
15
|
+
const DEFAULT_TTL_MS = 600_000; // 10 minutes — channel membership is stable
|
|
16
|
+
const PRUNE_AT_SIZE = 500;
|
|
17
|
+
export class DmEquivalentDetector {
|
|
18
|
+
client;
|
|
19
|
+
cache = new Map();
|
|
20
|
+
ttlMs;
|
|
21
|
+
constructor(client, ttlMs = DEFAULT_TTL_MS) {
|
|
22
|
+
this.client = client;
|
|
23
|
+
this.ttlMs = ttlMs;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolve whether the channel has exactly 2 members (the bot + one other).
|
|
27
|
+
* Returns `true` / `false` on success, or `null` when membership couldn't
|
|
28
|
+
* be determined — callers should treat `null` as "unknown, fall through to
|
|
29
|
+
* regular triage" rather than as a skip signal.
|
|
30
|
+
*/
|
|
31
|
+
async isTwoMember(channel, now = Date.now()) {
|
|
32
|
+
if (!channel)
|
|
33
|
+
return null;
|
|
34
|
+
const cached = this.cache.get(channel);
|
|
35
|
+
if (cached && cached.expiresAt > now) {
|
|
36
|
+
return cached.numMembers === 2;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const result = await this.client.info({ channel });
|
|
40
|
+
const numMembers = result?.channel?.num_members;
|
|
41
|
+
if (typeof numMembers !== "number") {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
this.cache.set(channel, { numMembers, expiresAt: now + this.ttlMs });
|
|
45
|
+
if (this.cache.size > PRUNE_AT_SIZE) {
|
|
46
|
+
this.prune(now);
|
|
47
|
+
}
|
|
48
|
+
return numMembers === 2;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
logger.debug(`[slack] dm-equivalent lookup failed for ${channel}: ${err}`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Drop the cache entry for a channel — useful when a join/leave event
|
|
57
|
+
* tells us the membership just changed.
|
|
58
|
+
*/
|
|
59
|
+
invalidate(channel) {
|
|
60
|
+
this.cache.delete(channel);
|
|
61
|
+
}
|
|
62
|
+
prune(now) {
|
|
63
|
+
for (const [key, entry] of this.cache) {
|
|
64
|
+
if (entry.expiresAt <= now)
|
|
65
|
+
this.cache.delete(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=dm-equivalent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm-equivalent.js","sourceRoot":"","sources":["../../../../src/connectors/slack/dm-equivalent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,4CAA4C;AAC5E,MAAM,aAAa,GAAG,GAAG,CAAC;AAc1B,MAAM,OAAO,oBAAoB;IAKZ;IAJF,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,KAAK,CAAS;IAE/B,YACmB,MAAoC,EACrD,QAAgB,cAAc;QADb,WAAM,GAAN,MAAM,CAA8B;QAGrD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACzD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,UAAU,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;YAChD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,UAAU,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,2CAA2C,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -42,6 +42,13 @@ export declare class SlackConnector implements Connector {
|
|
|
42
42
|
private speakerTransportFields;
|
|
43
43
|
private runSlackTriage;
|
|
44
44
|
private fetchRecentThreadForTriage;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve channel name and external-shared status in one cached call.
|
|
47
|
+
* `isExtShared` is true for Slack Connect (externally/org shared) channels —
|
|
48
|
+
* the delivery layer treats these (and unknowns) as "external" so the model's
|
|
49
|
+
* operator-facing notes are never posted there. See reply-disposition.ts.
|
|
50
|
+
*/
|
|
51
|
+
private resolveChannelInfo;
|
|
45
52
|
private resolveChannelName;
|
|
46
53
|
start(): Promise<void>;
|
|
47
54
|
stop(): Promise<void>;
|
|
@@ -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;AAa/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,
|
|
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;AAa/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;YAwDd,0BAA0B;IA0CxC;;;;;OAKG;YACW,kBAAkB;YAmBlB,kBAAkB;IAI1B,KAAK;IA2WL,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"}
|