@agentworkforce/delivery 4.1.16 → 4.1.18

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.
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAErB,KAAK,kBAAkB,EAKxB,MAAM,YAAY,CAAC;AAKpB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,YAAY,EACjB,UAAU,CAAC,EAAE,kBAAkB;AAC/B,wEAAwE;AACxE,WAAW,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAC5C,cAAc,CA2ChB"}
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAErB,KAAK,kBAAkB,EAKxB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,YAAY,EACjB,UAAU,CAAC,EAAE,kBAAkB;AAC/B,wEAAwE;AACxE,WAAW,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAC5C,cAAc,CA2ChB"}
package/dist/delivery.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { slackClient, telegramClient } from '@relayfile/relay-helpers';
2
2
  import { resolveDeliveryTargets, slackChannel, telegramChat } from './types.js';
3
3
  import { defaultRelaycastSender } from './relaycast.js';
4
+ import { requireSlackReceipt } from './slack.js';
4
5
  const WRITEBACK_TIMEOUT_MS = 45_000;
5
6
  /**
6
7
  * Create a delivery client that auto-discovers configured transports from
@@ -140,8 +141,8 @@ class DeliveryClientImpl {
140
141
  : await client.post(channel, text);
141
142
  if (!result.ts) {
142
143
  this.ctx.log?.('warn', 'delivery.slack.no-receipt', { channel });
143
- return null;
144
144
  }
145
+ requireSlackReceipt(result);
145
146
  return {
146
147
  provider: 'slack',
147
148
  channel: result.channel,
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createDelivery } from './delivery.js';
2
2
  export { resolveDeliveryTargets, slackChannel, telegramChat, type DeliveryClient, type DeliveryOptions, type DeliveryProvider, type DeliveryResult, type DeliveryTransports, type MessageRef, type RelaycastRef, type RelaycastSender, type RelaycastTarget, type SlackRef, type TelegramRef } from './types.js';
3
3
  export { DEFAULT_RELAYCAST_URL, resolveRelaycastUrl, defaultRelaycastSender } from './relaycast.js';
4
+ export { buildSlackMentionIndex, formatSlackRoster, isSlackChannelId, linkSlackMentions, loadSlackUsers, requireSlackReceipt, resolveSlackUserId, type SlackMentionIndex, type SlackUser, type SlackUsersOptions, type SlackUsersWarning } from './slack.js';
4
5
  export { input, list, withTimeout, fetchWithTimeout } from './helpers.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { createDelivery } from './delivery.js';
2
2
  export { resolveDeliveryTargets, slackChannel, telegramChat } from './types.js';
3
3
  export { DEFAULT_RELAYCAST_URL, resolveRelaycastUrl, defaultRelaycastSender } from './relaycast.js';
4
+ export { buildSlackMentionIndex, formatSlackRoster, isSlackChannelId, linkSlackMentions, loadSlackUsers, requireSlackReceipt, resolveSlackUserId } from './slack.js';
4
5
  export { input, list, withTimeout, fetchWithTimeout } from './helpers.js';
5
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EAYb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EAYb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAKnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { type IntegrationClientOptions } from '@agentworkforce/runtime';
2
+ export interface SlackUser {
3
+ id: string;
4
+ handle: string;
5
+ displayName: string;
6
+ }
7
+ export interface SlackMentionIndex {
8
+ exactToId: Map<string, string>;
9
+ firstNameToIds: Map<string, Set<string>>;
10
+ }
11
+ export interface SlackUsersWarning {
12
+ code: 'users_directory_unavailable';
13
+ path: string;
14
+ error: string;
15
+ }
16
+ export interface SlackUsersOptions extends IntegrationClientOptions {
17
+ onWarning?: (warning: SlackUsersWarning) => void;
18
+ }
19
+ /**
20
+ * Load the human Slack roster from a Relayfile mount.
21
+ *
22
+ * The compact `_index.json` is preferred. When it is missing, malformed, or
23
+ * contains no usable humans, this falls back to the per-member
24
+ * `<id>__<handle>/meta.json` directories. Bots and Slackbot are excluded.
25
+ */
26
+ export declare function loadSlackUsers(opts: SlackUsersOptions): Promise<SlackUser[]>;
27
+ /** Build exact and unambiguous-first-name lookups over a Slack roster. */
28
+ export declare function buildSlackMentionIndex(users: readonly SlackUser[]): SlackMentionIndex;
29
+ /** Resolve a human-supplied Slack handle/display name to a member id. */
30
+ export declare function resolveSlackUserId(name: string, index: SlackMentionIndex): string | null;
31
+ /**
32
+ * Rewrite plain `@handle` tokens as real Slack `<@ID>` mentions.
33
+ *
34
+ * Existing `<@ID>` mentions and email-address `@` signs are left alone;
35
+ * unresolved handles remain verbatim and are returned for caller logging.
36
+ */
37
+ export declare function linkSlackMentions(text: string, index: SlackMentionIndex): {
38
+ text: string;
39
+ unresolved: string[];
40
+ };
41
+ /** Format a sorted compact roster for prompts: `@handle — Display Name`. */
42
+ export declare function formatSlackRoster(users: readonly SlackUser[]): string;
43
+ /** Return whether a value is an exact Slack channel/conversation id. */
44
+ export declare function isSlackChannelId(value: string): boolean;
45
+ /** Require a delivered Slack timestamp instead of accepting a silent drop. */
46
+ export declare function requireSlackReceipt<T extends {
47
+ channel: string;
48
+ ts: string;
49
+ }>(result: T): T;
50
+ //# sourceMappingURL=slack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,6BAA6B,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAClD;AAiBD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA8ElF;AAED,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,iBAAiB,CAqBrF;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAYxF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,iBAAiB,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAYxC;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAQrE;AAED,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAO3F"}
package/dist/slack.js ADDED
@@ -0,0 +1,169 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { resolveMountRoot } from '@agentworkforce/runtime';
4
+ /**
5
+ * Load the human Slack roster from a Relayfile mount.
6
+ *
7
+ * The compact `_index.json` is preferred. When it is missing, malformed, or
8
+ * contains no usable humans, this falls back to the per-member
9
+ * `<id>__<handle>/meta.json` directories. Bots and Slackbot are excluded.
10
+ */
11
+ export async function loadSlackUsers(opts) {
12
+ const usersPath = path.join(resolveMountRoot(opts), 'slack', 'users');
13
+ try {
14
+ const rows = JSON.parse(await readFile(path.join(usersPath, '_index.json'), 'utf8'));
15
+ if (Array.isArray(rows)) {
16
+ const users = rows
17
+ .filter(isSlackUserIndexRow)
18
+ .filter((row) => row.is_bot !== true && !isSlackbot(row.id, row.name))
19
+ .map((row) => ({
20
+ id: row.id,
21
+ handle: typeof row.name === 'string' ? row.name : '',
22
+ displayName: typeof row.title === 'string' ? row.title : ''
23
+ }))
24
+ .filter((user) => user.handle.length > 0 || user.displayName.length > 0);
25
+ if (users.length > 0)
26
+ return users;
27
+ }
28
+ }
29
+ catch {
30
+ // Fall through to the per-member directory walk.
31
+ }
32
+ let entries;
33
+ try {
34
+ entries = await readdir(usersPath);
35
+ }
36
+ catch (error) {
37
+ opts.onWarning?.({
38
+ code: 'users_directory_unavailable',
39
+ path: usersPath,
40
+ error: error instanceof Error ? error.message : String(error)
41
+ });
42
+ return [];
43
+ }
44
+ const users = [];
45
+ for (const entry of entries) {
46
+ if (entry.startsWith('_') ||
47
+ entry.startsWith('.') ||
48
+ entry === 'bots' ||
49
+ entry === 'by-name') {
50
+ continue;
51
+ }
52
+ let record;
53
+ try {
54
+ record = JSON.parse(await readFile(path.join(usersPath, entry, 'meta.json'), 'utf8'));
55
+ }
56
+ catch {
57
+ continue;
58
+ }
59
+ if (!isRecord(record))
60
+ continue;
61
+ const user = record;
62
+ if (typeof user.id !== 'string' ||
63
+ user.id.length === 0 ||
64
+ user.is_bot === true ||
65
+ isSlackbot(user.id, user.name)) {
66
+ continue;
67
+ }
68
+ users.push({
69
+ id: user.id,
70
+ handle: typeof user.name === 'string' ? user.name : '',
71
+ displayName: typeof user.display_name === 'string' && user.display_name
72
+ ? user.display_name
73
+ : typeof user.real_name === 'string'
74
+ ? user.real_name
75
+ : ''
76
+ });
77
+ }
78
+ return users;
79
+ }
80
+ /** Build exact and unambiguous-first-name lookups over a Slack roster. */
81
+ export function buildSlackMentionIndex(users) {
82
+ const exactToId = new Map();
83
+ const firstNameToIds = new Map();
84
+ for (const user of users) {
85
+ for (const field of [user.displayName, user.handle]) {
86
+ if (!field)
87
+ continue;
88
+ const normalized = normalizeSlackMentionName(field);
89
+ if (!normalized)
90
+ continue;
91
+ if (!exactToId.has(normalized))
92
+ exactToId.set(normalized, user.id);
93
+ const firstToken = normalized.split(/\s+/)[0];
94
+ if (firstToken && firstToken !== normalized) {
95
+ const ids = firstNameToIds.get(firstToken) ?? new Set();
96
+ ids.add(user.id);
97
+ firstNameToIds.set(firstToken, ids);
98
+ }
99
+ }
100
+ }
101
+ return { exactToId, firstNameToIds };
102
+ }
103
+ /** Resolve a human-supplied Slack handle/display name to a member id. */
104
+ export function resolveSlackUserId(name, index) {
105
+ const normalized = normalizeSlackMentionName(name);
106
+ if (!normalized)
107
+ return null;
108
+ const exact = index.exactToId.get(normalized);
109
+ if (exact)
110
+ return exact;
111
+ const firstNameIds = index.firstNameToIds.get(normalized);
112
+ if (firstNameIds?.size === 1) {
113
+ return firstNameIds.values().next().value ?? null;
114
+ }
115
+ return null;
116
+ }
117
+ /**
118
+ * Rewrite plain `@handle` tokens as real Slack `<@ID>` mentions.
119
+ *
120
+ * Existing `<@ID>` mentions and email-address `@` signs are left alone;
121
+ * unresolved handles remain verbatim and are returned for caller logging.
122
+ */
123
+ export function linkSlackMentions(text, index) {
124
+ const unresolved = [];
125
+ const linked = text.replace(/(?<![<\w])@([A-Za-z][A-Za-z0-9._-]*)/g, (full, handle) => {
126
+ const id = resolveSlackUserId(handle, index);
127
+ if (id)
128
+ return `<@${id}>`;
129
+ unresolved.push(handle);
130
+ return full;
131
+ });
132
+ return { text: linked, unresolved };
133
+ }
134
+ /** Format a sorted compact roster for prompts: `@handle — Display Name`. */
135
+ export function formatSlackRoster(users) {
136
+ return users
137
+ .filter((user) => user.handle.length > 0)
138
+ .map((user) => user.displayName ? `@${user.handle} — ${user.displayName}` : `@${user.handle}`)
139
+ .sort((a, b) => a.localeCompare(b))
140
+ .join('\n');
141
+ }
142
+ /** Return whether a value is an exact Slack channel/conversation id. */
143
+ export function isSlackChannelId(value) {
144
+ return /^[CDG][A-Z0-9]{8,}$/.test(value);
145
+ }
146
+ /** Require a delivered Slack timestamp instead of accepting a silent drop. */
147
+ export function requireSlackReceipt(result) {
148
+ if (!result.ts) {
149
+ throw new Error(`Slack post to ${result.channel} got no writeback receipt (silent drop)`);
150
+ }
151
+ return result;
152
+ }
153
+ function isSlackUserIndexRow(value) {
154
+ if (!isRecord(value))
155
+ return false;
156
+ return typeof value.id === 'string' && value.id.length > 0;
157
+ }
158
+ function isSlackbot(id, handle) {
159
+ if (typeof id === 'string' && id.toUpperCase() === 'USLACKBOT')
160
+ return true;
161
+ return typeof handle === 'string' && handle.trim().toLowerCase() === 'slackbot';
162
+ }
163
+ function normalizeSlackMentionName(name) {
164
+ return name.trim().replace(/^@/, '').toLowerCase();
165
+ }
166
+ function isRecord(value) {
167
+ return typeof value === 'object' && value !== null;
168
+ }
169
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=slack.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.test.d.ts","sourceRoot":"","sources":["../src/slack.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import test from 'node:test';
6
+ import { createDelivery } from './delivery.js';
7
+ import { buildSlackMentionIndex, formatSlackRoster, isSlackChannelId, linkSlackMentions, loadSlackUsers, requireSlackReceipt, resolveSlackUserId } from './slack.js';
8
+ test('loadSlackUsers prefers the compact index and excludes bots and Slackbot', async (t) => {
9
+ const root = await tempMount(t);
10
+ const usersDir = path.join(root, 'slack', 'users');
11
+ await mkdir(usersDir, { recursive: true });
12
+ await writeJson(path.join(usersDir, '_index.json'), [
13
+ { id: 'U1', name: 'will', title: 'Will Washburn' },
14
+ { id: 'U2', name: 'buildbot', title: 'Build Bot', is_bot: true },
15
+ { id: 'USLACKBOT', name: 'slackbot', title: 'Slackbot' },
16
+ { id: 'U3', name: '', title: '' }
17
+ ]);
18
+ // If the index is usable, the directory fallback must not add this user.
19
+ await writeJson(path.join(usersDir, 'U4__fallback', 'meta.json'), {
20
+ id: 'U4',
21
+ name: 'fallback',
22
+ real_name: 'Fallback User'
23
+ });
24
+ assert.deepEqual(await loadSlackUsers({ relayfileMountRoot: root }), [
25
+ { id: 'U1', handle: 'will', displayName: 'Will Washburn' }
26
+ ]);
27
+ });
28
+ test('loadSlackUsers falls back to member meta records and preserves display-name priority', async (t) => {
29
+ const root = await tempMount(t);
30
+ const usersDir = path.join(root, 'slack', 'users');
31
+ await writeFile(path.join(root, 'placeholder'), '');
32
+ await writeJson(path.join(usersDir, 'U1__khaliq', 'meta.json'), {
33
+ id: 'U1',
34
+ name: 'khaliq',
35
+ display_name: 'Khaliq Gant',
36
+ real_name: 'Ignored Real Name'
37
+ });
38
+ await writeJson(path.join(usersDir, 'U2__will', 'meta.json'), {
39
+ id: 'U2',
40
+ name: 'will',
41
+ display_name: '',
42
+ real_name: 'Will Washburn'
43
+ });
44
+ await writeJson(path.join(usersDir, 'U3__bot', 'meta.json'), {
45
+ id: 'U3',
46
+ name: 'bot',
47
+ is_bot: true
48
+ });
49
+ await writeJson(path.join(usersDir, 'USLACKBOT__slackbot', 'meta.json'), {
50
+ id: 'USLACKBOT',
51
+ name: 'slackbot'
52
+ });
53
+ await mkdir(path.join(usersDir, 'bots'), { recursive: true });
54
+ await mkdir(path.join(usersDir, 'by-name'), { recursive: true });
55
+ assert.deepEqual(await loadSlackUsers({ relayfileMountRoot: root }), [
56
+ { id: 'U1', handle: 'khaliq', displayName: 'Khaliq Gant' },
57
+ { id: 'U2', handle: 'will', displayName: 'Will Washburn' }
58
+ ]);
59
+ });
60
+ test('loadSlackUsers reports an unavailable users directory without throwing', async (t) => {
61
+ const root = await tempMount(t);
62
+ const warnings = [];
63
+ assert.deepEqual(await loadSlackUsers({ relayfileMountRoot: root, onWarning: (warning) => warnings.push(warning) }), []);
64
+ assert.equal(warnings.length, 1);
65
+ const warning = warnings[0];
66
+ assert.equal(warning.code, 'users_directory_unavailable');
67
+ assert.equal(warning.path, path.join(root, 'slack', 'users'));
68
+ assert.match(warning.error, /slack\/users/);
69
+ });
70
+ test('mention index resolves exact names and only unambiguous first names', () => {
71
+ const users = [
72
+ { id: 'U1', handle: 'will', displayName: 'Will Washburn' },
73
+ { id: 'U2', handle: 'khaliq', displayName: 'Khaliq Gant' },
74
+ { id: 'U3', handle: 'willow', displayName: 'Will Example' }
75
+ ];
76
+ const index = buildSlackMentionIndex(users);
77
+ assert.equal(resolveSlackUserId('@WILL', index), 'U1');
78
+ assert.equal(resolveSlackUserId('Khaliq Gant', index), 'U2');
79
+ assert.equal(resolveSlackUserId('khaliq', index), 'U2');
80
+ // Two display names start with Will, so the first-name fallback is ambiguous.
81
+ const noExactWill = buildSlackMentionIndex(users.map((user) => (user.id === 'U1' ? { ...user, handle: 'wwashburn' } : user)));
82
+ assert.equal(resolveSlackUserId('will', noExactWill), null);
83
+ assert.equal(resolveSlackUserId('missing', index), null);
84
+ });
85
+ test('linkSlackMentions preserves emails and existing links while reporting unresolved tokens', () => {
86
+ const index = buildSlackMentionIndex([
87
+ { id: 'U1', handle: 'will', displayName: 'Will Washburn' }
88
+ ]);
89
+ assert.deepEqual(linkSlackMentions('Ping @will, keep <@U1>, mail a@b.com, and ask @missing, please.', index), {
90
+ text: 'Ping <@U1>, keep <@U1>, mail a@b.com, and ask @missing, please.',
91
+ unresolved: ['missing']
92
+ });
93
+ });
94
+ test('formatSlackRoster returns sorted handle lines and skips users without handles', () => {
95
+ assert.equal(formatSlackRoster([
96
+ { id: 'U2', handle: 'will', displayName: 'Will Washburn' },
97
+ { id: 'U1', handle: 'khaliq', displayName: 'Khaliq Gant' },
98
+ { id: 'U3', handle: 'ada', displayName: '' },
99
+ { id: 'U4', handle: '', displayName: 'No Handle' }
100
+ ]), '@ada\n@khaliq — Khaliq Gant\n@will — Will Washburn');
101
+ });
102
+ test('isSlackChannelId enforces exact Slack conversation ids', () => {
103
+ assert.equal(isSlackChannelId('C0B991XH3L5'), true);
104
+ assert.equal(isSlackChannelId('D12345678'), true);
105
+ assert.equal(isSlackChannelId('G12345678'), true);
106
+ assert.equal(isSlackChannelId('#general'), false);
107
+ assert.equal(isSlackChannelId('C123'), false);
108
+ assert.equal(isSlackChannelId(' c0b991xh3l5 '), false);
109
+ });
110
+ test('requireSlackReceipt returns delivered results and rejects empty timestamps', () => {
111
+ const delivered = { channel: 'C12345678', ts: '1750000000.000100', ref: '/draft' };
112
+ assert.equal(requireSlackReceipt(delivered), delivered);
113
+ assert.throws(() => requireSlackReceipt({ channel: 'C12345678', ts: '' }), /Slack post to C12345678 got no writeback receipt \(silent drop\)/);
114
+ });
115
+ test('createDelivery uses the strict Slack receipt boundary in blocking mode', async () => {
116
+ const slack = {
117
+ async post(channel) {
118
+ return { channel, ts: '', ref: '/slack/draft' };
119
+ }
120
+ };
121
+ const ctx = {
122
+ persona: { inputs: { SLACK_CHANNEL: 'C12345678' }, inputSpecs: {} },
123
+ log: () => { }
124
+ };
125
+ const delivery = createDelivery(ctx, { slack });
126
+ await assert.rejects(() => delivery.send('hello'), /Slack post to C12345678 got no writeback receipt \(silent drop\)/);
127
+ });
128
+ async function tempMount(t) {
129
+ const root = await mkdtemp(path.join(os.tmpdir(), 'workforce-delivery-slack-'));
130
+ t.after(() => rm(root, { recursive: true, force: true }));
131
+ return root;
132
+ }
133
+ async function writeJson(file, value) {
134
+ await mkdir(path.dirname(file), { recursive: true });
135
+ await writeFile(file, JSON.stringify(value));
136
+ }
137
+ //# sourceMappingURL=slack.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.test.js","sourceRoot":"","sources":["../src/slack.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAA0B,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAGpB,IAAI,CAAC,yEAAyE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1F,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE;QAClD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE;QAClD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;QAChE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;QACxD,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;KAClC,CAAC,CAAC;IACH,yEAAyE;IACzE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE;QAChE,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE;QACnE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE;KAC3D,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sFAAsF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACvG,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE;QAC9D,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,aAAa;QAC3B,SAAS,EAAE,mBAAmB;KAC/B,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE;QAC5D,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,eAAe;KAC3B,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE;QAC3D,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,EAAE,WAAW,CAAC,EAAE;QACvE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,UAAU;KACjB,CAAC,CAAC;IACH,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,MAAM,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE;QACnE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;QAC1D,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE;KAC3D,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACzF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,MAAM,CAAC,SAAS,CACd,MAAM,cAAc,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAClG,EAAE,CACH,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAkD,CAAC;IAC7E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAC/E,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE;QAC1D,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;QAC1D,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;KAC5D,CAAC;IACF,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,8EAA8E;IAC9E,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC7D,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3D,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yFAAyF,EAAE,GAAG,EAAE;IACnG,MAAM,KAAK,GAAG,sBAAsB,CAAC;QACnC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE;KAC3D,CAAC,CAAC;IAEH,MAAM,CAAC,SAAS,CACd,iBAAiB,CAAC,iEAAiE,EAAE,KAAK,CAAC,EAC3F;QACE,IAAI,EAAE,iEAAiE;QACvE,UAAU,EAAE,CAAC,SAAS,CAAC;KACxB,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+EAA+E,EAAE,GAAG,EAAE;IACzF,MAAM,CAAC,KAAK,CACV,iBAAiB,CAAC;QAChB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE;QAC1D,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;QAC1D,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5C,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;KACnD,CAAC,EACF,oDAAoD,CACrD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,GAAG,EAAE;IACtF,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACnF,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAC3D,kEAAkE,CACnE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACxF,MAAM,KAAK,GAAG;QACZ,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;QAClD,CAAC;KACwB,CAAC;IAC5B,MAAM,GAAG,GAAG;QACV,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACnE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;KACa,CAAC;IAE7B,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,MAAM,MAAM,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAC5B,kEAAkE,CACnE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,SAAS,CAAC,CAAc;IACrC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,KAAc;IACnD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentworkforce/delivery",
3
- "version": "4.1.16",
3
+ "version": "4.1.18",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@relayfile/relay-helpers": "^0.4.2",
29
- "@agentworkforce/runtime": "4.1.16"
29
+ "@agentworkforce/runtime": "4.1.18"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc -p tsconfig.json",